@font-face {
  font-family: Instrument Serif;
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src:
    url(../fonts/instrument-serif-latin-ext-400-normal.C2je3j2s.woff2)
    format("woff2"),
    url(../fonts/instrument-serif-latin-ext-400-normal.CFCUzsTy.woff)
    format("woff");
  unicode-range:
    U+100-2BA, U+2BD-2C5, U+2C7-2CC, U+2CE-2D7, U+2DD-2FF, U+304, U+308, U+329, U+1D00-1DBF,
    U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: Instrument Serif;
  font-style: normal;
  font-display: swap;
  font-weight: 400;
  src:
    url(../fonts/instrument-serif-latin-400-normal.DnYpCC2O.woff2)
    format("woff2"),
    url(../fonts/instrument-serif-latin-400-normal.BVbkICAY.woff) format("woff");
  unicode-range:
    U+??, U+131, U+152-153, U+2BB-2BC, U+2C6, U+2DA, U+2DC, U+304, U+308, U+329, U+2000-206F,
    U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: Instrument Serif;
  font-style: italic;
  font-display: swap;
  font-weight: 400;
  src:
    url(../fonts/instrument-serif-latin-ext-400-italic.C9HzH3YL.woff2)
    format("woff2"),
    url(../fonts/instrument-serif-latin-ext-400-italic.D7-lnxEk.woff)
    format("woff");
  unicode-range:
    U+100-2BA, U+2BD-2C5, U+2C7-2CC, U+2CE-2D7, U+2DD-2FF, U+304, U+308, U+329, U+1D00-1DBF,
    U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: Instrument Serif;
  font-style: italic;
  font-display: swap;
  font-weight: 400;
  src:
    url(../fonts/instrument-serif-latin-400-italic.DKMiL14s.woff2)
    format("woff2"),
    url(../fonts/instrument-serif-latin-400-italic.u__WvvIK.woff) format("woff");
  unicode-range:
    U+??, U+131, U+152-153, U+2BB-2BC, U+2C6, U+2DA, U+2DC, U+304, U+308, U+329, U+2000-206F,
    U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
@font-face {
  font-family: Archivo Variable;
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  font-stretch: 62% 125%;
  src: url(../fonts/archivo-vietnamese-wdth-normal.rJmnGBSt.woff2)
    format("woff2-variations");
  unicode-range:
    U+102-103, U+110-111, U+128-129, U+168-169, U+1A0-1A1, U+1AF-1B0, U+300-301, U+303-304,
    U+308-309, U+323, U+329, U+1EA0-1EF9, U+20AB;
}
@font-face {
  font-family: Archivo Variable;
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  font-stretch: 62% 125%;
  src: url(../fonts/archivo-latin-ext-wdth-normal.7khWdh9v.woff2)
    format("woff2-variations");
  unicode-range:
    U+100-2BA, U+2BD-2C5, U+2C7-2CC, U+2CE-2D7, U+2DD-2FF, U+304, U+308, U+329, U+1D00-1DBF,
    U+1E00-1E9F, U+1EF2-1EFF, U+2020, U+20A0-20AB, U+20AD-20C0, U+2113, U+2C60-2C7F, U+A720-A7FF;
}
@font-face {
  font-family: Archivo Variable;
  font-style: normal;
  font-display: swap;
  font-weight: 100 900;
  font-stretch: 62% 125%;
  src: url(../fonts/archivo-latin-wdth-normal.DY7AcnAa.woff2)
    format("woff2-variations");
  unicode-range:
    U+??, U+131, U+152-153, U+2BB-2BC, U+2C6, U+2DA, U+2DC, U+304, U+308, U+329, U+2000-206F,
    U+20AC, U+2122, U+2191, U+2193, U+2212, U+2215, U+FEFF, U+FFFD;
}
:root {
  --font-sans:
    "Geist", ui-sans-serif, system-ui, -apple-system, "Segoe UI", sans-serif;
  --font-mono: "Geist Mono", ui-monospace, SFMono-Regular, Menlo, monospace;
  --font-editorial: "Instrument Serif", "Times New Roman", serif;
  --font-geo: "Archivo Variable", "Archivo", "Arial Black", sans-serif;
  --fs-hero-editorial: 5rem;
  --fs-hero-geo: 3.625rem;
  --fs-h2: 2.5rem;
  --fs-h2-editorial: 3.375rem;
  --fs-display-editorial-xl: 4.5rem;
  --fs-h3: 1.75rem;
  --fs-body: 1rem;
  --fs-lede: 1rem;
  --fs-small: 0.875rem;
  --fs-label: 0.75rem;
  --fs-micro: 0.6875rem;
  --track-mono: 0.09em;
  --max: 1280px;
  --band-narrow: 760px;
  --band: 1000px;
  --band-wide: 1140px;
  --lede-max: 650px;
  --gutter: 24px;
  --frame-inset: 24px;
  --space-section: 96px;
  --space-block: 56px;
  --space-hero-top: 64px;
  --gap-command: 64px;
  --gap-commands: 128px;
  --r-1: 2px;
  --r-2: 4px;
  --r-pill: 999px;
  --control-h: 50px;
  --control-h-nav: 38px;
  --header-h: 96px;
  --header-h-stuck: 62px;
  --ticker-h: 28px;
  --ease-out: cubic-bezier(0.22, 1, 0.36, 1);
}
@media (width <= 980px) {
  :root {
    --gutter: 20px;
  }
}
@media (width <= 879px) {
  :root {
    --fs-hero-editorial: 2.6875rem;
    --fs-hero-geo: 2.5rem;
    --fs-h2: 1.75rem;
    --fs-h2-editorial: 2.5rem;
    --fs-display-editorial-xl: 2.625rem;
    --fs-h3: 1.375rem;
    --space-section: 64px;
    --space-block: 40px;
    --space-hero-top: 44px;
    --gap-command: 24px;
    --gap-commands: 72px;
    --header-h: 56px;
    --header-h-stuck: 56px;
    --ticker-h: 32px;
  }
}
:root,
[data-theme="paper"] {
  --canvas: #0c0808;
  --canvas-deep: #0e0909;
  --panel: #1a1210b8;
  --panel-soft: #1a121080;
  --ink: #f6efea;
  --ink-soft: #e8ded6;
  --muted: #b8aca6;
  --dim: #8a7f79;
  --accent: #36ffab;
  --accent-bright: #36ffab;
  --accent-ink: #01231e;
  --execution: #ff8a3d;
  --heat: #ff4d5e;
  --warning: #ffc44d;
  --rule: #f6efea1f;
  --rule-strong: #f6efea42;
  --rule-warm: #d2865447;
  --rule-warm-soft: #d286541a;
  --btn-primary-bg: #36ffab;
  --btn-primary-ink: #01231e;
  --btn-tick: #36ffab;
  --checker-color: #f6efea0b;
  --header-veil: #0c0808d1;
}
[data-theme="terminal"] {
  --canvas: #0c0808;
  --canvas-deep: #0e0909;
  --panel: #1a1210b8;
  --panel-soft: #1a121080;
  --ink: #f6efea;
  --ink-soft: #e8ded6;
  --muted: #b8aca6;
  --dim: #8a7f79;
  --accent: #36ffab;
  --accent-bright: #36ffab;
  --accent-ink: #01231e;
  --execution: #ff8a3d;
  --heat: #ff4d5e;
  --warning: #ffc44d;
  --rule: #f6efea1f;
  --rule-strong: #f6efea42;
  --rule-warm: #d2865447;
  --rule-warm-soft: #d286541a;
  --btn-primary-bg: #36ffab;
  --btn-primary-ink: #01231e;
  --btn-tick: #36ffab;
  --checker-color: #f6efea0b;
  --header-veil: #0c0808d1;
}
@font-face {
  font-family: Geist;
  src: url(../fonts/Geist-Variable.woff2) format("woff2");
  font-weight: 100 900;
  font-display: swap;
}
@font-face {
  font-family: Geist Mono;
  src: url(../fonts/GeistMono-Variable.woff2) format("woff2");
  font-weight: 100 900;
  font-display: swap;
}
*,
:before,
:after {
  box-sizing: border-box;
}
html {
  /* The framed area is the only scroll container: body is fixed to the
     page-frame inset below, so nothing can render or scroll outside the
     frame hairlines. */
  height: 100%;
  overflow: hidden;
  background: var(--canvas);
  scroll-behavior: smooth;
}
.page-grid {
  /* Page-wide seamless hairline grid (Figma 1553:219): 54px pitch
     (halved from the source tile's 108 after feedback the cells read too
     large), one 1px line per cell edge, 8% ink — subliminal texture under
     the content, never graph paper. Carrier and paint technique are both
     load-bearing decisions earned the hard way in this Chromium build:
     - A REAL DIV (.page-grid, first child of body), not a pseudo-element:
     pseudo carriers proved unreliable here (body::before rendered zero
     pixels; a main::before rule lost its inset and silently collapsed to a
     0×0 box — computed-style readbacks kept looking "correct" while
     nothing painted). Real fixed elements rasterize reliably everywhere.
     - An SVG data-URI tile, not CSS gradients: body's own background
     dropped the middle vertical lines of a 54px repeating-linear-gradient
     (and again with explicit background-size tiles) through the scroller
     rasterization path. SVG image tiling never drops a line — the
     .page-gutter dither has painted on every page since launch.
     - z-index:-1 + body's isolation:isolate keeps the grid above body's
       canvas fill but below all in-flow content, so opaque clean zones
       (footer, [data-theme] regions, home FAQ/platform bands) paint over it
       by normal flow order.
     - inset matches the page-frame border so the lattice origin sits on the
       frame hairline (24px desktop / 8px ≤768px) and nothing paints in the
       outer gutters.
     - Tile color note: the ink alpha is baked into the URI (data URIs
       cannot reference vars); keep in sync with --ink if it ever changes. */
  position: fixed;
  inset: 24px;
  z-index: -1;
  pointer-events: none;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='54' height='54'><rect width='1' height='54' fill='%23f6efea' fill-opacity='0.08'/><rect width='54' height='1' fill='%23f6efea' fill-opacity='0.08'/></svg>");
  background-size: 54px 54px;
}

/* Hex-inspired background hierarchy for pages that opt into .texture-mix.
   The existing .page-grid remains untouched everywhere else. On Home and
   Enterprise it becomes the always-on, lowest paper-grain layer; the dot
   field and Cartesian grid are separate real elements so either can end
   without also removing the paper texture beneath it. */
body.texture-mix {
  --site-grain-tile: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='180' height='180' viewBox='0 0 180 180'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='.76' numOctaves='4' stitchTiles='stitch'/%3E%3CfeColorMatrix type='saturate' values='0'/%3E%3C/filter%3E%3Crect width='180' height='180' filter='url(%23n)' opacity='.075'/%3E%3C/svg%3E");
  --site-dot-tile: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6' viewBox='0 0 6 6'%3E%3Ccircle cx='3' cy='3' r='.52' fill='%23e8dde3' fill-opacity='.3'/%3E%3C/svg%3E");
  --site-grid-tile: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48'%3E%3Crect width='1' height='48' fill='%23f6efea' fill-opacity='.045'/%3E%3Crect width='48' height='1' fill='%23f6efea' fill-opacity='.045'/%3E%3C/svg%3E");
  --dot-focus-mask: radial-gradient(
    ellipse 46% 42% at 50% 48%,
    transparent 0%,
    rgba(0, 0, 0, 0.12) 38%,
    rgba(0, 0, 0, 0.55) 62%,
    #000 88%
  );
}

html[data-theme="daylight"] body.texture-mix {
  --site-dot-tile: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='6' height='6' viewBox='0 0 6 6'%3E%3Ccircle cx='3' cy='3' r='.5' fill='%237b7084' fill-opacity='.48'/%3E%3C/svg%3E");
  --site-grid-tile: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='48' height='48'%3E%3Crect width='1' height='48' fill='%2317120e' fill-opacity='.075'/%3E%3Crect width='48' height='1' fill='%2317120e' fill-opacity='.075'/%3E%3C/svg%3E");
}

.texture-mix .page-grid {
  z-index: -3;
  background-image: var(--site-grain-tile);
  background-size: 180px 180px;
  opacity: 1;
}

.page-dots,
.page-grid-region {
  display: none;
}

.texture-mix .page-dots,
.texture-mix .page-grid-region {
  display: block;
  position: absolute;
  pointer-events: none;
  background-repeat: repeat;
}

.texture-mix .page-dots {
  inset: 0 0 auto;
  z-index: -1;
  height: 760px;
  background-image: var(--site-dot-tile);
  background-size: 6px 6px;
  opacity: 0.46;
  -webkit-mask-image:
    linear-gradient(
      to bottom,
      #000 0%,
      #000 34%,
      rgba(0, 0, 0, 0.72) 48%,
      rgba(0, 0, 0, 0.28) 64%,
      transparent 78%
    ),
    var(--dot-focus-mask);
  -webkit-mask-composite: source-in;
  mask-image:
    linear-gradient(
      to bottom,
      #000 0%,
      #000 34%,
      rgba(0, 0, 0, 0.72) 48%,
      rgba(0, 0, 0, 0.28) 64%,
      transparent 78%
    ),
    var(--dot-focus-mask);
  mask-composite: intersect;
}

.texture-mix .page-grid-region {
  top: clamp(430px, 52vh, 560px);
  left: 0;
  right: 0;
  z-index: -2;
  width: auto;
  height: 900px;
  background-image: var(--site-grid-tile);
  background-size: 48px 48px;
  opacity: 0.34;
  -webkit-mask-image: linear-gradient(
    to bottom,
    transparent 0%,
    rgba(0, 0, 0, 0.22) 16%,
    rgba(0, 0, 0, 0.65) 32%,
    #000 48%,
    #000 72%,
    rgba(0, 0, 0, 0.45) 86%,
    transparent 100%
  );
  mask-image: linear-gradient(
    to bottom,
    transparent 0%,
    rgba(0, 0, 0, 0.22) 16%,
    rgba(0, 0, 0, 0.65) 32%,
    #000 48%,
    #000 72%,
    rgba(0, 0, 0, 0.45) 86%,
    transparent 100%
  );
}

.texture-mix--enterprise .page-dots,
.texture-mix--left .page-dots {
  --dot-focus-mask: radial-gradient(
    ellipse 56% 44% at 40% 46%,
    transparent 0%,
    rgba(0, 0, 0, 0.12) 38%,
    rgba(0, 0, 0, 0.55) 62%,
    #000 88%
  );
  height: 720px;
  opacity: 0.52;
}

.texture-mix--enterprise .page-grid-region,
.texture-mix--left .page-grid-region {
  top: 420px;
  height: 840px;
  opacity: 0.5;
}
body {
  background-color: var(--canvas);
  /* Contain the z-index:-1 grid layer (.page-grid) within body's stacking
     context: without an explicit context (this Chrome build doesn't give
     position:fixed an implicit one under software compositing), the -1 layer
     escapes behind body's own opaque canvas fill and vanishes. */
  isolation: isolate;
  color: var(--ink);
  font-family: var(--font-sans);
  font-size: var(--fs-body);
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizelegibility;
  margin: 0;
  line-height: 1.6;
  overflow-x: hidden;
  /* Body IS the framed scroll pane: clipped to the page-frame inset so
     scrolling happens inside the border and no content leaks past it. */
  position: fixed;
  inset: var(--frame-inset);
  overflow-y: auto;
  overscroll-behavior-y: contain;
  scroll-behavior: smooth;
  scrollbar-gutter: stable;
  scrollbar-width: thin;
  scrollbar-color: var(--rule-strong) transparent;
}
body::-webkit-scrollbar {
  width: 10px;
}
body::-webkit-scrollbar-thumb {
  background: var(--rule-strong);
  border: 4px solid transparent;
  background-clip: content-box;
}
body::-webkit-scrollbar-thumb:hover {
  background-color: var(--muted);
}
@media print {
  html {
    overflow: visible;
  }
  body {
    position: static;
    inset: auto;
    overflow: visible;
  }
}
img,
svg,
video {
  max-width: 100%;
  display: block;
}
a {
  color: inherit;
  text-decoration: none;
}
button {
  font: inherit;
  color: inherit;
  cursor: pointer;
  background: 0 0;
  border: 0;
  padding: 0;
}
h1,
h2,
h3,
h4,
p {
  margin: 0;
}
ul,
ol {
  margin: 0;
  padding: 0;
  list-style: none;
}
::selection {
  background: var(--accent);
  color: var(--accent-ink);
}
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
  body {
    scroll-behavior: auto;
  }
  *,
  :before,
  :after {
    transition-duration: 0.01ms !important;
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
  }
}
[data-theme] {
  background: var(--canvas);
  color: var(--ink);
}
/* Full-width terminal bands are the page canvas already — the fill above
   would only blank the body's page-wide grid across them. Drop the fill,
   keep the token swap, so the grid runs through the band like everywhere
   else. Component-level themed panels keep their opaque fill on purpose:
   they read as objects sitting on the grid, not holes in it. */
.terminal-band {
  position: relative;
  background: transparent;
}
.container {
  width: 100%;
  max-width: var(--max);
  /* Inset the content column from the viewport edges so bands read centered
     rather than running edge-to-edge; never below the page gutter. */
  padding-inline: clamp(var(--gutter), 7vw, 110px);
  margin-inline: auto;
}
.band-narrow {
  max-width: var(--band-narrow);
  margin-inline: auto;
}
.band {
  max-width: var(--band);
  margin-inline: auto;
}
.band-wide {
  max-width: var(--band-wide);
  margin-inline: auto;
}
.section {
  padding-block: var(--space-section);
  position: relative;
}
[id] {
  scroll-margin-top: 96px;
}
.section-tight {
  padding-block: var(--space-block);
  position: relative;
}
.page-frame {
  inset: var(--frame-inset);
  border: 1px solid var(--rule);
  pointer-events: none;
  z-index: 90;
  position: fixed;
}
.page-frame:before {
  content: "";
  background:
    linear-gradient(var(--rule-strong), var(--rule-strong)) left 0 top 0 / 7px
    1px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) left 0 top 0 / 1px
    7px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) right 0 top 0 / 7px
    1px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) right 0 top 0 / 1px
    7px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) left 0 bottom 0 /
    7px 1px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) left 0 bottom 0 /
    1px 7px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) right 0 bottom 0 /
    7px 1px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) right 0 bottom 0 /
    1px 7px;
  background-repeat: no-repeat;
  position: absolute;
  inset: -1px;
}
.page-gutter {
  mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
  mask-position:
    0 0,
    var(--frame-inset) var(--frame-inset);
  mask-size:
    100% 100%,
    calc(100% - 2 * var(--frame-inset)) calc(100% - 2 * var(--frame-inset));
  -webkit-mask-image: linear-gradient(#000 0 0), linear-gradient(#000 0 0);
  mask-repeat: no-repeat;
  mask-composite: exclude;
  -webkit-mask-position:
    0 0,
    var(--frame-inset) var(--frame-inset);
  -webkit-mask-size:
    100% 100%,
    calc(100% - 2 * var(--frame-inset)) calc(100% - 2 * var(--frame-inset));
  -webkit-mask-composite: xor;
  pointer-events: none;
  z-index: 89;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4'><rect width='2' height='2' fill='%230c0808' fill-opacity='0.09'/><rect x='2' y='2' width='2' height='2' fill='%230c0808' fill-opacity='0.09'/></svg>");
  background-size: 4px 4px;
  position: fixed;
  inset: 0;
  -webkit-mask-repeat: no-repeat;
}
@media (width <= 768px) {
  .page-frame,
  body,
  .page-grid {
    inset: 8px;
  }
  .page-gutter {
    display: none;
  }
  .texture-mix .page-dots {
    height: 640px;
    opacity: 0.38;
    --dot-focus-mask: radial-gradient(
      ellipse 84% 46% at 50% 44%,
      transparent 0%,
      rgba(0, 0, 0, 0.12) 38%,
      rgba(0, 0, 0, 0.55) 62%,
      #000 92%
    );
  }
  .texture-mix .page-grid-region,
  .texture-mix--enterprise .page-grid-region,
.texture-mix--left .page-grid-region {
    top: 520px;
    width: 100%;
    height: 760px;
    opacity: 0.32;
  }
  .texture-mix--enterprise .page-dots,
.texture-mix--left .page-dots {
    opacity: 0.48;
  }
  .texture-mix--enterprise .page-grid-region,
.texture-mix--left .page-grid-region {
    opacity: 0.46;
  }
}
.tex {
  position: relative;
}
.tex > * {
  z-index: 1;
  position: relative;
}
/* All texture layers (grid, checker, glow, film-grain noise) removed by
   design decision — .tex sections now sit on the flat canvas, so the top
   band and the stuck header match the page tone exactly. */
[data-theme="terminal"] .h-editorial,
[data-theme="terminal"] .h-editorial-xl {
  background: linear-gradient(55deg, #f6efea 30%, #36ffab9e 130%);
  color: #0000;
  background-clip: text;
}
.copy-wash {
  position: relative;
}
.copy-wash:before {
  content: "";
  z-index: -1;
  pointer-events: none;
  background: radial-gradient(
    58% 62% at 50% 42%,
    var(--canvas) 12%,
    color-mix(in srgb, var(--canvas) 62%, transparent) 58%,
    transparent 80%
  );
  position: absolute;
  inset: -80px -140px;
}
.texture-mix .copy-wash:before {
  display: none;
}
.display-editorial {
  font-family: var(--font-editorial);
  font-style: italic;
  font-weight: 400;
  font-size: var(--fs-hero-editorial);
  letter-spacing: normal;
  line-height: 1.15;
}
.display-geo {
  font-family: var(--font-geo);
  font-weight: 640;
  font-stretch: 125%;
  font-size: var(--fs-hero-geo);
  letter-spacing: -0.031em;
  line-height: 1.1;
}
.h-editorial {
  font-family: var(--font-editorial);
  font-style: italic;
  font-weight: 400;
  font-size: var(--fs-h2-editorial);
  letter-spacing: normal;
  line-height: 1.12;
}
.h-editorial-xl {
  font-family: var(--font-editorial);
  font-style: italic;
  font-weight: 400;
  font-size: var(--fs-display-editorial-xl);
  letter-spacing: normal;
  line-height: 1.15;
}
.h-section {
  font-family: var(--font-geo);
  font-weight: 600;
  font-stretch: 118%;
  font-size: var(--fs-h2);
  letter-spacing: -0.025em;
  line-height: 1.3;
}
.h-card {
  font-family: var(--font-geo);
  font-weight: 600;
  font-stretch: 112%;
  font-size: var(--fs-h3);
  letter-spacing: -0.015em;
  line-height: 1.3;
}
.eyebrow {
  font-family: var(--font-mono);
  font-size: var(--fs-label);
  letter-spacing: var(--track-mono);
  text-transform: uppercase;
  color: var(--muted);
  font-weight: 400;
}
/* Eyebrow label icons — a small Material Symbols Sharp glyph per label's
   meaning (inline <svg><use> against the #ic-* sprite in the page markup).
   They inherit the eyebrow's muted tone via currentColor so each label
   stays one voice. */
.eyebrow .eb-ic {
  width: 14px;
  height: 14px;
  fill: currentColor;
  vertical-align: -2px;
  margin-right: 7px;
}
/* Icon eyebrows: a flex row puts the glyph beside its label, optically
   centered — without this, the global img/svg block reset stacks the icon
   on its own line above the text. :has() leaves text-only eyebrows in
   normal inline flow. Flex itemization strips the spaces between label
   words, so column-gap restores them: 0.6em ≈ a mono word space at this
   size and the established 7px icon-to-label gap in one value. In
   browsers without :has(), the label keeps its pre-flex inline layout
   (the margin-right fallback above) instead of breaking. */
.eyebrow:has(.eb-ic) {
  display: inline-flex;
  align-items: center;
  column-gap: 0.6em;
}
.eyebrow:has(.eb-ic) .eb-ic {
  margin-right: 0;
}
.mono {
  font-family: var(--font-mono);
}
.lede {
  font-size: var(--fs-lede);
  max-width: var(--lede-max);
  color: var(--muted);
  line-height: 1.63;
}
.small {
  font-size: var(--fs-small);
}
.btn {
  height: var(--control-h);
  font-family: var(--font-sans);
  letter-spacing: normal;
  border-radius: var(--r-1);
  white-space: nowrap;
  transition:
    background-color 0.18s var(--ease-out),
    border-color 0.18s var(--ease-out),
    color 0.18s var(--ease-out),
    transform 0.18s var(--ease-out);
  justify-content: center;
  align-items: center;
  gap: 10px;
  padding-inline: 26px;
  font-size: 0.875rem;
  font-weight: 400;
  display: inline-flex;
}
.btn:active {
  transform: translateY(1px);
}
.btn-primary {
  background: var(--btn-primary-bg);
  color: var(--btn-primary-ink);
  position: relative;
}
.btn-primary:before {
  content: "";
  pointer-events: none;
  transition: inset 0.18s var(--ease-out);
  background:
    linear-gradient(var(--btn-tick), var(--btn-tick)) left 0 top 0 / 8px 1px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) left 0 top 0 / 1px 8px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) right 0 top 0 / 8px 1px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) right 0 top 0 / 1px 8px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) left 0 bottom 0 / 8px 1px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) left 0 bottom 0 / 1px 8px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) right 0 bottom 0 / 8px 1px,
    linear-gradient(var(--btn-tick), var(--btn-tick)) right 0 bottom 0 / 1px 8px;
  background-repeat: no-repeat;
  position: absolute;
  inset: -5px;
}
.btn-primary:hover:before {
  inset: -8px;
}
.btn-primary:not(.btn-nav) {
  min-width: 170px;
}
.btn-quiet {
  border: 1px solid var(--rule-strong);
  color: var(--ink);
  background: 0 0;
}
.btn-quiet:hover {
  border-color: var(--ink);
  background: color-mix(in srgb, var(--ink) 5%, transparent);
}
.btn-quiet {
  min-width: 148px;
}
.btn-nav {
  height: var(--control-h-nav);
  padding-inline: 18px;
  font-size: 0.875rem;
}
.link-arrow {
  font-family: var(--font-mono);
  font-size: var(--fs-small);
  letter-spacing: 0.04em;
  color: var(--ink);
  align-items: center;
  gap: 8px;
  display: inline-flex;
}
.mono-label {
  font-family: var(--font-mono);
  letter-spacing: var(--track-mono);
  text-transform: uppercase;
}
.link-arrow:after {
  /* Material Symbols Sharp `arrow_right_alt` (fill) as a mask so the
     accent stays token-driven. */
  content: "";
  background: var(--accent);
  width: 15px;
  height: 10px;
  -webkit-mask:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3E%3Cpath d='m560-240-56-58 142-142H160v-80h486L504-662l56-58 240 240-240 240Z'/%3E%3C/svg%3E")
    center / contain no-repeat;
  mask:
    url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 -960 960 960'%3E%3Cpath d='m560-240-56-58 142-142H160v-80h486L504-662l56-58 240 240-240 240Z'/%3E%3C/svg%3E")
    center / contain no-repeat;
  transition: transform 0.18s var(--ease-out);
}
.link-arrow:hover:after {
  transform: translate(4px);
}
.rule-card {
  border: 1px solid var(--rule);
  border-radius: var(--r-1);
  background: var(--panel-soft);
  transition:
    border-color 0.18s var(--ease-out),
    background-color 0.18s var(--ease-out);
  padding: 28px;
  position: relative;
}
.rule-card:hover {
  border-color: var(--rule-strong);
  background: color-mix(in srgb, var(--accent) 4%, var(--panel-soft));
}
.rule-card .card-copy {
  font-size: 0.875rem;
}
.rule-card > .corner {
  opacity: 0;
  width: 7px;
  height: 7px;
  transition: opacity 0.18s var(--ease-out);
  position: absolute;
}
.rule-card > .corner.tl {
  border-top: 1px solid var(--btn-tick);
  border-left: 1px solid var(--btn-tick);
  top: -1px;
  left: -1px;
}
.rule-card > .corner.br {
  border-bottom: 1px solid var(--btn-tick);
  border-right: 1px solid var(--btn-tick);
  bottom: -1px;
  right: -1px;
}
.rule-card:hover > .corner {
  opacity: 1;
}
.section-head {
  margin-bottom: var(--space-block);
  gap: 18px;
  display: grid;
}
.section-head.center {
  text-align: center;
  justify-items: center;
}
.reveal {
  opacity: 0;
  transition:
    opacity 0.7s var(--ease-out),
    transform 0.7s var(--ease-out);
  transform: translateY(18px);
}
.reveal.in {
  opacity: 1;
  transform: none;
}
/* Cards that both reveal and hover: .reveal's transition declaration
   (later at equal specificity) would otherwise replace .rule-card's, so
   entrance and hover transitions are merged here for combined elements. */
.rule-card.reveal {
  transition:
    opacity 0.7s var(--ease-out),
    transform 0.7s var(--ease-out),
    border-color 0.18s var(--ease-out),
    background-color 0.18s var(--ease-out);
}
@media (prefers-reduced-motion: reduce) {
  .reveal {
    opacity: 1;
    transform: none;
  }
}
:focus-visible {
  outline: 1px solid var(--accent);
  outline-offset: 2px;
}
.btn-primary:focus-visible {
  outline-offset: 4px;
}
.btn-primary:focus-visible:before {
  inset: -8px;
}
.rule-card:focus-within > .corner {
  opacity: 1;
}
.rule-card:focus-within {
  border-color: var(--rule-strong);
}
.hr {
  border: 0;
  border-top: 1px solid var(--rule);
  margin: 0;
}
.hidden {
  display: none !important;
}
.ticker[data-astro-cid-tlvwqjqj] {
  z-index: 80;
  height: var(--ticker-h);
  /* No top/inline margin: the body scroll pane is already clipped to the
     page-frame inset, so the ticker's top rule coincides with the fixed
     page-frame hairline instead of doubling it. */
  margin: 0;
  border-top: 1px solid var(--rule);
  border-bottom: 1px solid var(--rule);
  background: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='4' height='4'><rect width='2' height='2' fill='%230c0808' fill-opacity='0.03'/><rect x='2' y='2' width='2' height='2' fill='%230c0808' fill-opacity='0.03'/></svg>")
    var(--canvas);
  position: relative;
  overflow: hidden;
}
.ticker-track[data-astro-cid-tlvwqjqj] {
  width: max-content;
  height: 100%;
  animation: 46s linear infinite ticker-scroll;
  display: flex;
}
.ticker[data-astro-cid-tlvwqjqj]:hover .ticker-track[data-astro-cid-tlvwqjqj],
.ticker[data-astro-cid-tlvwqjqj]:focus-within
  .ticker-track[data-astro-cid-tlvwqjqj],
.ticker[data-astro-cid-tlvwqjqj]:focus .ticker-track[data-astro-cid-tlvwqjqj] {
  animation-play-state: paused;
}
.ticker-list[data-astro-cid-tlvwqjqj] {
  flex: none;
  align-items: center;
  height: 100%;
  display: flex;
}
.ticker-list[data-astro-cid-tlvwqjqj] li[data-astro-cid-tlvwqjqj] {
  padding-inline: 11px 0;
  font-family: var(--font-mono);
  font-size: var(--fs-label);
  letter-spacing: var(--track-mono);
  color: var(--muted);
  white-space: nowrap;
  align-items: center;
  gap: 22px;
  padding-left: 22px;
  display: inline-flex;
}
.tick-sep[data-astro-cid-tlvwqjqj] {
  color: var(--accent);
  font-size: 8px;
}
@media (width <= 879px) {
  .ticker[data-astro-cid-tlvwqjqj] {
    border-top: 0;
    margin-inline: 0;
  }
  .ticker-list[data-astro-cid-tlvwqjqj] li[data-astro-cid-tlvwqjqj] {
    color: var(--ink-soft);
    font-size: 0.75rem;
  }
}
@keyframes ticker-scroll {
  0% {
    transform: translate(0);
  }
  to {
    transform: translate(-50%);
  }
}
@media (prefers-reduced-motion: reduce) {
  .ticker[data-astro-cid-tlvwqjqj] {
    height: auto;
  }
  .ticker-track[data-astro-cid-tlvwqjqj] {
    flex-wrap: wrap;
    width: auto;
    animation: none;
  }
  .ticker-list[data-astro-cid-tlvwqjqj] {
    flex-wrap: wrap;
    height: auto;
  }
  .ticker-list[data-astro-cid-tlvwqjqj][aria-hidden="true"] {
    display: none;
  }
}
.site-header[data-astro-cid-fzpbxy5g] {
  z-index: 85;
  background: 0 0;
  transition: background-color 0.2s var(--ease-out);
  position: sticky;
  top: 0;
  /* The header keeps its full-height slot in the document even when the
     stuck bar shrinks, so the page never jumps as it toggles; only the
     bar inside changes height. The empty band below the shrunken bar
     lets clicks through to the page. */
  height: var(--header-h);
  pointer-events: none;
}
.site-header[data-astro-cid-fzpbxy5g] > * { pointer-events: auto; }
.header-shell[data-astro-cid-fzpbxy5g] {
  transition: margin 0.2s var(--ease-out);
  position: relative;
}
/* Stuck-bar paint — SINGLE source of truth. Body is the framed scroll
   pane and reserves a scrollbar gutter on its inline end; scroll
   content — including this shell — stops short of that gutter on
   classic-scrollbar systems, so no paint issued from inside the pane
   can ever reach the right frame hairline. The shell therefore paints
   NOTHING: every stuck-bar pixel — canvas fill, hairlines, corner
   ticks — comes from this viewport-fixed layer. It spans
   hairline-to-hairline (100vw is clean because html, not body, is the
   scroll root), is never clipped by the pane's scrollbar gutter, and
   reproduces the original bordered shell's exact paint box
   (bar height + 1px rule on each side). No in-flow edge, no second
   line. Fades in over 0.2s with the sticky transition. */
.header-shell[data-astro-cid-fzpbxy5g]:before {
  content: "";
  position: fixed;
  top: var(--frame-inset);
  left: var(--frame-inset);
  width: calc(100vw - 2 * var(--frame-inset));
  height: calc(var(--header-h-stuck) + 2px);
  background:
    linear-gradient(var(--rule-strong), var(--rule-strong)) left 0 top 0 /
      7px 1px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) left 0 top 0 /
      1px 7px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) right 0 bottom
      0 / 7px 1px,
    linear-gradient(var(--rule-strong), var(--rule-strong)) right 0 bottom
      0 / 1px 7px,
    var(--canvas);
  background-repeat: no-repeat;
  border: 1px solid var(--rule);
  opacity: 0;
  transition: opacity 0.2s var(--ease-out);
  pointer-events: none;
  z-index: -1;
}
@media (width <= 768px) {
  .header-shell[data-astro-cid-fzpbxy5g]:before {
    /* The framed pane's inset drops to a literal 8px below 768px. */
    top: 8px;
    left: 8px;
    width: calc(100vw - 16px);
  }
}
@media print {
  .header-shell[data-astro-cid-fzpbxy5g]:before {
    display: none;
  }
}
.header-bar[data-astro-cid-fzpbxy5g] {
  height: var(--header-h);
  transition: height 0.2s var(--ease-out);
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  display: grid;
}
.nav-left[data-astro-cid-fzpbxy5g] {
  justify-self: end;
}
.nav-right[data-astro-cid-fzpbxy5g] {
  justify-self: start;
}
.site-header.is-stuck .header-shell[data-astro-cid-fzpbxy5g] {
  /* Pane already provides the frame inset. The shell paints NOTHING
     when stuck — no background, no border — so the pane's scrollbar
     gutter can never cut a second edge into the bar. All paint comes
     from the fixed :before layer; this element is layout only. */
  margin-inline: 0;
}
.site-header.is-stuck .header-shell[data-astro-cid-fzpbxy5g]:before {
  opacity: 1;
}
/* Stuck header rises above the fixed page-frame overlay (z-index 90) so
   the stuck bar's fixed paint layer and its mega menus stay above every
   page layer. All bar paint lives on the viewport-fixed :before layer —
   spanning hairline-to-hairline, never clipped by the pane — while the
   header element itself stays transparent until the page scrolls.
   Still below the mobile drawer (z-index 100). */
.site-header.is-stuck[data-astro-cid-fzpbxy5g] {
  z-index: 95;
}
.site-header.is-stuck .header-bar[data-astro-cid-fzpbxy5g] {
  height: var(--header-h-stuck);
}
.nav-group[data-astro-cid-fzpbxy5g] {
  align-items: center;
  gap: 16px;
  display: flex;
}
.nav-link[data-astro-cid-fzpbxy5g] {
  border-radius: var(--r-1);
  color: var(--ink);
  transition:
    background-color 0.15s var(--ease-out),
    color 0.15s var(--ease-out),
    border-color 0.15s var(--ease-out);
  border: 1px solid #0000;
  align-items: center;
  gap: 7px;
  padding: 9px 13px;
  font-size: 0.875rem;
  font-weight: 480;
  display: inline-flex;
}
.nav-link[data-astro-cid-fzpbxy5g]:hover {
  background: color-mix(in srgb, var(--ink) 6%, transparent);
}
.nav-link[data-astro-cid-fzpbxy5g].quiet {
  color: var(--muted);
}
.nav-link[data-astro-cid-fzpbxy5g].quiet:hover {
  color: var(--ink);
}
.nav-trigger[data-astro-cid-fzpbxy5g][aria-expanded="true"] {
  border: 1px dotted var(--rule-strong);
  background: color-mix(in srgb, var(--ink) 6%, transparent);
}
.chev[data-astro-cid-fzpbxy5g] {
  color: var(--muted);
  transition: transform 0.15s var(--ease-out);
  display: inline-flex;
}
.nav-trigger[data-astro-cid-fzpbxy5g][aria-expanded="true"]
  .chev[data-astro-cid-fzpbxy5g] {
  transform: rotate(180deg);
}
.nav-right[data-astro-cid-fzpbxy5g] .btn[data-astro-cid-fzpbxy5g] {
  margin-left: 8px;
}
.wordmark[data-astro-cid-fzpbxy5g] {
  width: 138px;
  height: 32px;
  color: var(--ink);
  margin-inline: 24px;
  display: block;
}
.wordmark[data-astro-cid-fzpbxy5g] svg {
  --fill-0: currentColor;
  width: 100%;
  height: 100%;
}
.mega[data-astro-cid-fzpbxy5g] {
  width: max-content;
  max-width: calc(100vw - 2 * var(--frame-inset));
  background: var(--canvas);
  border: 1px solid var(--rule);
  position: absolute;
  top: 100%;
  left: 50%;
  transform: translate(-50%);
  box-shadow: 0 12px 24px -20px #0c08082e;
}
.mega-groups[data-astro-cid-fzpbxy5g] {
  gap: 44px;
  padding: 26px 30px 28px;
  display: flex;
}
.mega-group[data-astro-cid-fzpbxy5g] {
  align-content: start;
  gap: 14px;
  display: grid;
}
.mega-list[data-astro-cid-fzpbxy5g] {
  gap: 2px;
  min-width: 250px;
  display: grid;
}
.mega-item[data-astro-cid-fzpbxy5g] {
  border-radius: var(--r-1);
  transition:
    border-color 0.15s var(--ease-out),
    background-color 0.15s var(--ease-out);
  border: 1px solid #0000;
  gap: 3px;
  padding: 10px 12px;
  display: grid;
}
.mega-item[data-astro-cid-fzpbxy5g]:hover {
  border-color: var(--rule);
  background: color-mix(in srgb, var(--ink) 3%, transparent);
}
.mega-name[data-astro-cid-fzpbxy5g] {
  align-items: baseline;
  gap: 8px;
  font-size: 0.9375rem;
  font-weight: 560;
  display: inline-flex;
}
.mega-desc[data-astro-cid-fzpbxy5g] {
  color: var(--muted);
  font-size: 0.8125rem;
  line-height: 1.45;
}
.mega-promo[data-astro-cid-fzpbxy5g] {
  border: 1px dashed var(--rule-strong);
  border-radius: var(--r-1);
  transition:
    border-color 0.15s var(--ease-out),
    background-color 0.15s var(--ease-out);
  gap: 4px;
  margin: 0 30px 24px;
  padding: 16px 18px;
  display: grid;
}
.mega-promo[data-astro-cid-fzpbxy5g]:hover {
  border-color: var(--accent);
  background: color-mix(in srgb, var(--ink) 3%, transparent);
}
.mega-promo[data-astro-cid-fzpbxy5g] .eyebrow[data-astro-cid-fzpbxy5g] {
  margin: 0;
}
.promo-title[data-astro-cid-fzpbxy5g] {
  font-size: 0.9375rem;
  font-weight: 600;
}
.soon[data-astro-cid-fzpbxy5g] {
  font-family: var(--font-mono);
  letter-spacing: var(--track-mono);
  text-transform: uppercase;
  color: var(--dim);
  border: 1px solid var(--rule);
  border-radius: var(--r-pill);
  padding: 2px 6px;
  font-size: 0.62rem;
}
.hamburger[data-astro-cid-fzpbxy5g] {
  border: 1px solid var(--rule-strong);
  border-radius: var(--r-pill);
  align-content: center;
  place-items: center;
  gap: 5px;
  width: 40px;
  height: 40px;
  display: none;
}
.hamburger[data-astro-cid-fzpbxy5g] span[data-astro-cid-fzpbxy5g] {
  background: var(--ink);
  width: 15px;
  height: 1.5px;
  display: block;
}
.drawer[data-astro-cid-fzpbxy5g] {
  z-index: 100;
  background: var(--canvas);
  position: fixed;
  inset: 0;
  overflow-y: auto;
}
.drawer-head[data-astro-cid-fzpbxy5g] {
  height: 56px;
  padding-inline: var(--gutter);
  border-bottom: 1px solid var(--rule);
  justify-content: space-between;
  align-items: center;
  display: flex;
}
.drawer-close[data-astro-cid-fzpbxy5g] {
  border: 1px solid var(--rule-strong);
  border-radius: var(--r-pill);
  width: 40px;
  height: 40px;
  font-size: 14px;
}
.drawer-body[data-astro-cid-fzpbxy5g] {
  padding: 24px var(--gutter) 48px;
  gap: 28px;
  display: grid;
}
.drawer-group[data-astro-cid-fzpbxy5g] {
  border-bottom: 1px dashed var(--rule-strong);
  gap: 8px;
  padding-bottom: 20px;
  display: grid;
}
.drawer-group[data-astro-cid-fzpbxy5g]:last-of-type {
  border-bottom: 0;
}
.drawer-group[data-astro-cid-fzpbxy5g] ul[data-astro-cid-fzpbxy5g] {
  display: grid;
}
.drawer-group[data-astro-cid-fzpbxy5g] a[data-astro-cid-fzpbxy5g] {
  border-bottom: 1px solid color-mix(in srgb, var(--ink) 6%, transparent);
  justify-content: space-between;
  align-items: center;
  padding: 11px 2px;
  font-size: 0.9375rem;
  font-weight: 500;
  display: flex;
}
.drawer-group[data-astro-cid-fzpbxy5g]
  li[data-astro-cid-fzpbxy5g]:last-child
  a[data-astro-cid-fzpbxy5g] {
  border-bottom: 0;
}
.drawer-name[data-astro-cid-fzpbxy5g] {
  align-items: center;
  gap: 12px;
  display: inline-flex;
}
.drawer-ico[data-astro-cid-fzpbxy5g] {
  width: 20px;
  height: 20px;
  color: var(--muted);
  display: inline-flex;
}
.drawer-ico[data-astro-cid-fzpbxy5g] svg {
  width: 100%;
  height: 100%;
}
.drawer-chev[data-astro-cid-fzpbxy5g] {
  color: var(--muted);
  font-family: var(--font-mono);
  font-size: 1.1rem;
}
.drawer-group[data-astro-cid-fzpbxy5g]
  a[data-astro-cid-fzpbxy5g]:active
  .drawer-chev[data-astro-cid-fzpbxy5g] {
  color: var(--accent);
}
.drawer-ctas[data-astro-cid-fzpbxy5g] {
  gap: 10px;
  display: grid;
}
.drawer-ctas[data-astro-cid-fzpbxy5g] .btn[data-astro-cid-fzpbxy5g] {
  width: 100%;
}
@media (width <= 1023px) {
  .nav-group[data-astro-cid-fzpbxy5g] {
    display: none;
  }
  .hamburger[data-astro-cid-fzpbxy5g] {
    display: grid;
  }
  .header-bar[data-astro-cid-fzpbxy5g] {
    height: 56px;
    padding-inline: var(--gutter);
    justify-content: space-between;
  }
  .header-shell[data-astro-cid-fzpbxy5g]:before {
    /* Mirrors the ≤1023 stuck bar: the height is forced to 56px and
       only the bottom hairline remains. */
    height: calc(56px + 1px);
    border-inline: 0;
    border-top: 0;
  }
  .site-header.is-stuck .header-bar[data-astro-cid-fzpbxy5g] {
    height: 56px;
  }
  .wordmark[data-astro-cid-fzpbxy5g] {
    width: 120px;
    height: 28px;
    margin-inline: 0;
  }
  .mega[data-astro-cid-fzpbxy5g] {
    display: none;
  }
}
.footer[data-astro-cid-nns7i3if] {
  padding-top: 72px;
  position: relative;
  overflow: hidden;
}
.footer[data-astro-cid-nns7i3if]:before {
  content: "";
  top: 0;
  left: 0;
  right: 0;
  border-top: 1px solid var(--rule);
  position: absolute;
}
.footer-grid[data-astro-cid-nns7i3if] {
  grid-template-columns: 1.3fr repeat(4, 1fr);
  gap: 32px;
  padding-bottom: 48px;
  display: grid;
}
.footer-brand[data-astro-cid-nns7i3if] {
  align-content: start;
  gap: 16px;
  display: grid;
}
.footer-lockup[data-astro-cid-nns7i3if] {
  width: 112px;
  height: 26px;
  color: var(--ink);
  display: block;
}
.footer-lockup[data-astro-cid-nns7i3if] svg {
  --fill-0: currentColor;
  width: 100%;
  height: 100%;
}
.brand-tag[data-astro-cid-nns7i3if] {
  font-size: var(--fs-micro);
  letter-spacing: var(--track-mono);
  text-transform: uppercase;
  color: var(--muted);
  line-height: 1.7;
}
.brand-contact[data-astro-cid-nns7i3if] {
  font-size: var(--fs-micro);
  letter-spacing: var(--track-mono);
  color: var(--dim);
}
.brand-contact[data-astro-cid-nns7i3if] a[data-astro-cid-nns7i3if] {
  color: var(--muted);
}
.brand-contact[data-astro-cid-nns7i3if] a[data-astro-cid-nns7i3if]:hover {
  color: var(--ink);
}
.brand-utc[data-astro-cid-nns7i3if] {
  font-size: var(--fs-micro);
  letter-spacing: var(--track-mono);
  color: var(--dim);
  border: 1px dashed var(--rule-strong);
  border-radius: var(--r-1);
  width: fit-content;
  padding: 4px 8px;
}
.footer-col[data-astro-cid-nns7i3if] {
  align-content: start;
  gap: 14px;
  display: grid;
}
.footer-col[data-astro-cid-nns7i3if] ul[data-astro-cid-nns7i3if] {
  gap: 10px;
  display: grid;
}
.footer-col[data-astro-cid-nns7i3if] a[data-astro-cid-nns7i3if] {
  color: var(--muted);
  transition: color 0.15s var(--ease-out);
  font-size: 0.875rem;
}
.footer-col[data-astro-cid-nns7i3if] a[data-astro-cid-nns7i3if]:hover {
  color: var(--ink);
}
/* Two-piece footer, bottom piece: the legal strip sits outside the
   container as a direct footer child, so its hairline and tonal ground run
   edge-to-edge with no container insets; only the meta text keeps the
   site's minimum gutter (--gutter) so it never touches the pixel edge. */
.footer-meta[data-astro-cid-nns7i3if] {
  border-top: 1px solid var(--rule);
  background: color-mix(in srgb, var(--ink) 3%, var(--canvas));
  padding-inline: var(--gutter);
  flex-wrap: wrap;
  justify-content: space-between;
  gap: 16px;
  padding-block: 20px;
  display: flex;
}
.meta-line[data-astro-cid-nns7i3if] {
  font-size: var(--fs-micro);
  letter-spacing: var(--track-mono);
  color: var(--dim);
}
/* Footer logo band — the "bottomLogo" treatment from the V2 visuals file:
   a wide, short wordmark band cropped by the SVG viewBox exactly as the
   Figma frame clips it. The band spans the content container and sits
   directly on the meta plate below — the crop line lands on the plate's
   hairline, so the ghost letters read as guillotined by the seam, and the
   meta copy closes the page at the screen's bottom edge. */
.footer-wordmark[data-astro-cid-nns7i3if] {
  display: block;
  transform: none;
  user-select: none;
  max-width: var(--max);
  margin-inline: auto;
  padding-inline: clamp(var(--gutter), 7vw, 110px);
}
.footer-wordmark[data-astro-cid-nns7i3if] svg {
  display: block;
  width: 100%;
  height: auto;
}
@media (width <= 900px) {
  .footer-grid[data-astro-cid-nns7i3if] {
    grid-template-columns: repeat(2, 1fr);
  }
  .footer-brand[data-astro-cid-nns7i3if] {
    grid-column: 1 / -1;
  }
}

/* Skip link — keyboard bypass to main content (WCAG 2.4.1). Sits
   off-canvas until focused, then appears inside the page frame. */
.skip-link {
  position: fixed;
  /* Sit inside the page frame, not in the clipped-away mat outside it. */
  top: calc(var(--frame-inset) + 8px);
  left: calc(var(--frame-inset) + 8px);
  z-index: 200;
  background: var(--canvas);
  color: var(--ink);
  border: 1px solid var(--accent);
  border-radius: var(--r-1);
  padding: 10px 16px;
  font-size: 0.875rem;
  transform: translateY(-200%);
  transition: transform 0.15s var(--ease-out);
}
.skip-link:focus-visible {
  transform: none;
}
#main:focus {
  outline: none;
}

/* Footer wordmark, ASCII: the ghost SVG stays as the no-JS fallback; once
   the script has rasterised it into a character grid the canvas takes over. */
.footer-wordmark[data-astro-cid-nns7i3if] .wm-stack { position: relative; }
.footer-wordmark[data-astro-cid-nns7i3if] .wm-stack svg { display: block; width: 100%; height: auto; }
.footer-wordmark[data-astro-cid-nns7i3if] .wm-stack svg g,
.footer-wordmark[data-astro-cid-nns7i3if] .wm-stack svg path { fill: currentColor; }
.footer-wordmark[data-astro-cid-nns7i3if] .wm-base { color: var(--ink); opacity: 0.08; transition: opacity 0.35s var(--ease-out); }
.footer-wordmark[data-astro-cid-nns7i3if].is-live .wm-base { opacity: 0.02; }
.footer-wordmark[data-astro-cid-nns7i3if] .wm-ascii { position: absolute; inset: 0; width: 100%; height: 100%; display: block; opacity: 0; transition: opacity 0.35s var(--ease-out);
  -webkit-mask-image: radial-gradient(ellipse 70% 140% at 50% 50%, #000 40%, rgba(0,0,0,0.6) 70%, transparent 98%);
  mask-image: radial-gradient(ellipse 70% 140% at 50% 50%, #000 40%, rgba(0,0,0,0.6) 70%, transparent 98%); }
.footer-wordmark[data-astro-cid-nns7i3if].is-live .wm-ascii { opacity: 1; }


/* Compact footer for focused pages (waitlist, demo): one row, no columns */
.footer-mini { border-top: 1px solid var(--rule); padding: 22px 0 28px; background: var(--paper); color: var(--ink); }
.footer-mini-in { display: flex; flex-wrap: wrap; align-items: center; justify-content: space-between; gap: 12px 24px; }
.footer-mini-brand { font-family: var(--font-geo); font-weight: 700; font-size: 1.05rem; letter-spacing: -0.01em; color: var(--ink); text-decoration: none; }
.footer-mini-links { display: flex; flex-wrap: wrap; gap: 6px 22px; font-size: var(--fs-micro); letter-spacing: var(--track-mono); text-transform: uppercase; }
.footer-mini-links a { color: var(--muted); text-decoration: none; transition: color 0.2s var(--ease-out); }
.footer-mini-links a:hover { color: var(--ink); }
.footer-mini-copy { font-size: var(--fs-micro); letter-spacing: var(--track-mono); text-transform: uppercase; color: var(--dim); }
@media (width <= 560px) { .footer-mini-in { justify-content: flex-start; } }
