/* ============================================================
   OMNIPHEX - site stylesheet
   Identity system v2 (graphite · steel · electric blue).
   Sections:
     01 fonts          02 tokens         03 reset/base
     04 type           05 layout         06 nav
     07 buttons        08 hero           09 (retired 2026-09-26)
     10 sections/head  11 panels/cards   12 (retired 2026-09-26)
     13 loop/steps     14 (retired 2026-09-26)  15 console mock
     16 facts strip    17 lists/tags     18 forms
     19 footer         20 motion         21 utilities
     22 responsive     23 reduced motion / print
     24 page components (rules two or more pages share)
     25 motion + interaction   26 motion layer II
     27 fifth pass: reach, legibility, figures, console screens
   RULES (identity §04): blue is never a background, never a
   panel, never body text. It marks computation in progress and
   the computed side of the mark. Count every blue on a page.
   ============================================================ */

/* ---------- 01 fonts (self-hosted, SIL OFL - see assets/fonts/) ---------- */
@font-face{font-family:"Sora";font-style:normal;font-weight:100 800;font-display:swap;
  src:url("../fonts/sora-latin-wght-normal.woff2") format("woff2-variations");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Sora";font-style:normal;font-weight:100 800;font-display:swap;
  src:url("../fonts/sora-latin-ext-wght-normal.woff2") format("woff2-variations");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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:"JetBrains Mono";font-style:normal;font-weight:100 800;font-display:swap;
  src:url("../fonts/jetbrains-mono-latin-wght-normal.woff2") format("woff2-variations");
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"JetBrains Mono";font-style:normal;font-weight:100 800;font-display:swap;
  src:url("../fonts/jetbrains-mono-latin-ext-wght-normal.woff2") format("woff2-variations");
  unicode-range:U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,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}
/* metric-matched local fallbacks (2026-09-26): while the woff2 files load, text sets in a local face scaled to
   Sora / JetBrains Mono metrics, so headlines do not reflow when the real fonts swap in. local() only: no request.
   Line lengths below are in em, not ch: ch is the width of "0" in whichever font is showing (27% narrower in Arial). */
@font-face{font-family:"Sora Fallback";font-weight:100 500;src:local("Arial"),local("ArialMT"),local("Helvetica"),local("Roboto");
  size-adjust:112.8%;ascent-override:86%;descent-override:25.7%;line-gap-override:0%;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"Sora Fallback";font-weight:600 800;src:local("Arial Bold"),local("Arial-BoldMT"),local("Helvetica Bold"),local("Roboto Bold");
  size-adjust:106%;ascent-override:91.5%;descent-override:27.4%;line-gap-override:0%;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}
@font-face{font-family:"JetBrains Mono Fallback";src:local("Courier New"),local("CourierNewPSMT"),local("Courier");
  size-adjust:100%;ascent-override:102%;descent-override:30%;line-gap-override:0%;
  unicode-range:U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD}

/* ---------- 02 tokens ---------- */
:root{
  /* palette - identity §04 */
  --graphite:#0B0F14;
  --bg:#0B0F14;
  --bg-2:#0E1319;          /* alternate section ground */
  --panel:#141A21;
  --panel-2:#10161C;
  --line:#1C242C;
  --line-2:#2A333C;
  --line-3:#636B74;         /* form control border - 3.2:1 or better on every ground (WCAG 1.4.11) */
  --fg:#FFFFFF;
  --mist:#C9CED6;          /* text on dark */
  --dim:#838C96;           /* secondary text on dark - 5.1:1 on --panel, 5.6:1 on --bg (#79828C was 4.49:1 on --panel) */
  --steel:#5A6169;         /* rules, borders, decoration - NOT small text: 3.06:1 on graphite fails AA; text uses --dim */
  --ac:#00B4FF;            /* electric blue - computation only */
  --ghost:rgba(255,255,255,.16);
  --ghost-2:rgba(255,255,255,.07);
  --ok:#3DDC97;            /* pass marks (not brand; console semantics) */
  --warn:#E8B04B;          /* STALLED / partial */
  --fail:#F0455F;          /* fail marks - never the brand colour */
  /* facets - identity dark theme */
  --fc0:#00B4FF; --fc1:#0296DD; --fc2:#0A6392;
  --fc3:#4B535B; --fc4:#B9C1CA; --fc5:#FFFFFF;
  /* motion - toolkit §primitives */
  --beat:120ms;
  --lock:cubic-bezier(.2,0,0,1);
  --settle:cubic-bezier(.33,0,.1,1);
  --release:cubic-bezier(.6,0,.9,.2);
  --compute:linear;
  /* type */
  --sans:"Sora","Sora Fallback",ui-sans-serif,-apple-system,"Segoe UI","Helvetica Neue",Arial,sans-serif;
  --mono:"JetBrains Mono","JetBrains Mono Fallback",ui-monospace,"Cascadia Mono",Consolas,"Liberation Mono",monospace;
  /* measure */
  --sheet:1180px;
  --gutter:32px;
  --radius:4px;            /* controls only; panels are square */
  color-scheme:dark;        /* native controls, autofill and scrollbars in the dark scheme */
}

/* ---------- 03 reset / base ---------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth;scroll-padding-top:84px}
body{margin:0;background:var(--bg);color:var(--mist);font-family:var(--sans);
  font-size:15.5px;line-height:1.6;letter-spacing:-.006em;
  -webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;
  overflow-x:hidden;position:relative}
/* anodised grain - page-level texture, never on the mark */
body::before{content:"";position:fixed;inset:0;pointer-events:none;z-index:0;opacity:.045;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='160' height='160'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.9' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1 0 0 0 0 1 0 0 0 0 1 0 0 0 .6 0'/></filter><rect width='160' height='160' filter='url(%23n)'/></svg>");
  background-size:160px 160px;mix-blend-mode:overlay}
svg{display:block}
img{max-width:100%;height:auto;display:block}
a{color:inherit;text-decoration:none}
a:hover{color:var(--fg)}
p a,li a,.prose a{text-decoration:underline;text-decoration-color:var(--dim);text-underline-offset:3px}
p a:hover,li a:hover,.prose a:hover{text-decoration-color:var(--fg)}
/* nav and footer links are navigation, not prose: never underlined (Patrick, 2026-09-25) */
.nav-links a,.foot-col a{text-decoration:none}
::selection{background:var(--mist);color:var(--graphite)}
:focus-visible{outline:2px solid var(--fg);outline-offset:3px}
hr{border:0;border-top:1px solid var(--line);margin:0}
.vh{position:absolute!important;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap}
.skip{position:absolute;left:-999px;top:8px;background:var(--fg);color:var(--graphite);padding:8px 12px;z-index:100}
.skip:focus{left:8px}

/* ---------- 04 type ---------- */
h1,h2,h3,h4{color:var(--fg);font-weight:600;margin:0;letter-spacing:-.02em;line-height:1.1}
h1{font-size:clamp(2.35rem,5.4vw,4.6rem);letter-spacing:-.035em;line-height:1.02;font-weight:600}
h2{font-size:clamp(1.7rem,3.2vw,2.5rem);letter-spacing:-.028em;line-height:1.08}
h3{font-size:1.125rem;letter-spacing:-.012em;line-height:1.3}
h4{font-size:.95rem;letter-spacing:-.008em}
p{margin:0 0 1em}
p:last-child{margin-bottom:0}
strong,b{color:var(--fg);font-weight:600}
em{font-style:italic}
small,.small{font-size:13px}
.lede{font-size:clamp(1.05rem,1.5vw,1.25rem);line-height:1.55;color:var(--mist);max-width:41.6em}
.eyebrow{font-family:var(--mono);font-size:11.5px;font-weight:500;letter-spacing:.18em;
  text-transform:uppercase;color:var(--dim);margin:0 0 14px}
.eyebrow .idx{color:var(--dim);margin-right:10px}
.dim{color:var(--dim)}
.fg{color:var(--fg)}
.prose{max-width:49.04em}
.prose h3{margin:2.2em 0 .6em}
.prose h3:first-child{margin-top:0}
.prose ul,.prose ol{padding-left:1.25em;margin:0 0 1em}
.prose li{margin:.35em 0}
.prose li::marker{color:var(--dim)}
.prose blockquote{margin:1.2em 0;padding:.4em 0 .4em 1.1em;border-left:2px solid var(--line-2);color:var(--mist)}
/* no one-word last lines (2026-09-26) */
h1,h2,h3,.quote{text-wrap:balance}
p,.lede,.sub,.checks li,.step .out{text-wrap:pretty}

/* ---------- 05 layout ---------- */
.sheet{max-width:var(--sheet);margin:0 auto;padding:0 var(--gutter);position:relative;z-index:1}
.grid{display:grid;gap:16px}
.g2{grid-template-columns:repeat(2,1fr)}
.g3{grid-template-columns:repeat(3,1fr)}
.g4{grid-template-columns:repeat(4,1fr)}
.g5{grid-template-columns:repeat(5,1fr)}
.split{display:grid;grid-template-columns:minmax(0,5fr) minmax(0,7fr);gap:56px;align-items:start}
.stack{display:flex;flex-direction:column;gap:14px}
main{position:relative;z-index:1}
/* grid/flex items default to min-width:auto, so a <pre> or a long token would
   widen its column to the longest line and push the page past the viewport.
   Every layout child shrinks; wide content scrolls inside its own box. */
.grid>*,.split>*,.stack>*,.steps>*,.facts>*,.hero .sheet>*,.foot-top>*,.app>*,.app-main>*{min-width:0}

/* ---------- 06 nav ---------- */
.nav{position:sticky;top:0;z-index:50;background:rgba(11,15,20,.82);
  -webkit-backdrop-filter:saturate(1.2) blur(12px);backdrop-filter:saturate(1.2) blur(12px);
  border-bottom:1px solid var(--line)}
.nav .sheet{display:flex;align-items:center;justify-content:space-between;gap:24px;height:64px}
.brand{display:flex;align-items:center;gap:11px;color:var(--fg)}
.brand .mk{width:32px;height:32px}   /* the faceted cut never below 32 px (identity §12) */
.brand .wm{height:12.5px;width:auto;color:var(--fg)}
.nav-links{display:flex;align-items:center;gap:2px;list-style:none;margin:0;padding:0}
.nav-links a{display:block;padding:8px 12px;font-size:13.5px;font-weight:500;color:var(--dim);
  border-radius:var(--radius);transition:color .18s var(--settle),background .18s var(--settle)}
.nav-links a:hover{color:var(--fg);background:var(--ghost-2)}
.nav-cta{display:flex;align-items:center;gap:10px}
/* active page - set by <body data-page>, nav markup stays identical on every page */
body[data-page="platform"]  .nav-links a[href="platform"],
body[data-page="how"]       .nav-links a[href="how-it-works"],
body[data-page="console"]   .nav-links a[href="console"],
body[data-page="pricing"]   .nav-links a[href="pricing"],
body[data-page="company"]   .nav-links a[href="company"]{color:var(--fg);position:relative}
.nav-toggle{display:none;background:none;border:1px solid var(--line);color:var(--mist);
  width:44px;height:44px;border-radius:var(--radius);cursor:pointer;font:inherit;align-items:center;justify-content:center}
.nav-toggle svg{width:18px;height:18px}
.nav-links .nav-req{display:none}   /* the menu's own Request access item: shown only below 360 px, where the header button cannot fit */

/* ---------- 07 buttons ---------- */
.btn{display:inline-flex;align-items:center;justify-content:center;gap:9px;font:inherit;
  font-size:13.5px;font-weight:600;letter-spacing:-.005em;padding:11px 18px;border-radius:var(--radius);
  border:1px solid var(--fg);background:var(--fg);color:var(--graphite);cursor:pointer;white-space:nowrap;
  transition:background .18s var(--settle),color .18s var(--settle),border-color .18s var(--settle),transform .18s var(--lock)}
.btn:hover{background:var(--mist);border-color:var(--mist);color:var(--graphite)}
.btn:active{transform:translateY(1px)}
.btn.ghost{background:transparent;color:var(--fg);border-color:var(--line-2)}
.btn.ghost:hover{border-color:var(--fg);background:var(--ghost-2);color:var(--fg)}
.btn.sm{padding:8px 13px;font-size:12.5px}
.btn.lg{padding:14px 24px;font-size:15px}
.btn svg{width:14px;height:14px}
.btn .arr{transition:transform .2s var(--lock)}
.btn:hover .arr{transform:translateX(3px)}
.btn-row{display:flex;gap:12px;flex-wrap:wrap;align-items:center}
.link{color:var(--fg);font-weight:500;display:inline-flex;align-items:center;gap:6px;border-bottom:1px solid var(--line-2);padding-bottom:1px;text-decoration:none;position:relative}
.link::after{content:"";position:absolute;left:0;right:0;top:-9px;bottom:-9px}   /* a 44 px tap target, same look */
.link:hover{border-color:var(--fg)}
.link .arr{transition:transform .2s var(--lock)}
.link:hover .arr{transform:translateX(3px)}

/* ---------- 08 hero ---------- */
.hero{position:relative;overflow:hidden;border-bottom:1px solid var(--line);
  background:
    radial-gradient(1200px 600px at 12% -10%,rgba(255,255,255,.045),transparent 60%),
    var(--bg)}
.hero{padding:0}   /* the sheet carries the hero's spacing; the generic section padding doubled it (2026-09-26) */
.hero::before{content:"";position:absolute;inset:0;pointer-events:none;opacity:.55;
  /* pointy-top hex lattice, 56px cell - the mark's own geometry as ground */
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='56' height='97' viewBox='0 0 56 97'><g fill='none' stroke='rgba(255,255,255,.055)' stroke-width='1'><path d='M28 1 L55 16.5 L55 48 L28 63.5 L1 48 L1 16.5 Z'/><path d='M28 63.5 L28 96'/><path d='M55 48 L56 48.5'/><path d='M1 48 L0 48.5'/></g></svg>");
  background-size:56px 97px;
  -webkit-mask-image:radial-gradient(900px 520px at 70% 45%,#000 20%,transparent 70%);
  mask-image:radial-gradient(900px 520px at 70% 45%,#000 20%,transparent 70%)}
.hero .sheet{display:grid;grid-template-columns:minmax(0,6.2fr) minmax(0,5.8fr);gap:40px;
  align-items:center;min-height:calc(100vh - 64px);padding-top:56px;padding-bottom:48px}
.hero-copy{position:relative;z-index:2}
/* 2026-09-25: "Create anything. Your agent engineers it." sets as three lines at desktop widths; at the
   global 4.6rem ceiling "Create anything." overflowed the 556 px column and broke into four */
.hero-copy h1{max-width:9.07em;margin:18px 0 26px;font-size:clamp(2.35rem,5.4vw,4.3rem)}
.hero-copy .lede{margin-bottom:34px}
.hero-visual{position:relative;z-index:1;min-height:420px;align-self:stretch;display:flex;flex-direction:column;justify-content:center}
.hero-canvas{width:100%;aspect-ratio:1.15;display:block}
.hero-proof{display:flex;gap:26px;flex-wrap:wrap;margin-top:40px;padding-top:22px;border-top:1px solid var(--line)}
.hero-proof div{min-width:120px}
.hero-proof b{display:block;font-family:var(--mono);font-size:22px;font-weight:600;color:var(--fg);letter-spacing:-.02em;font-variant-numeric:tabular-nums}
.hero-proof span{display:block;font-size:12px;color:var(--dim);margin-top:2px}
.hero-proof .stamp{align-self:end;font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.06em;margin-left:auto}
/* four proof words in one row at every desktop width; the stamp takes its own right-aligned row */
.hero-proof{display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:18px 20px}
.hero-proof div{min-width:0}
.hero-proof .stamp{grid-column:1/-1;justify-self:end}

/* ---------- 10 sections / heads ---------- */
section{padding:96px 0;border-top:1px solid var(--line);position:relative}
section.alt{background:var(--bg-2)}
section.tight{padding:64px 0}
section.flush{border-top:0}
.head{display:flex;gap:32px;align-items:flex-end;justify-content:space-between;margin-bottom:44px;flex-wrap:wrap}
.head > div{max-width:47.55em}
.head h2{margin:0 0 14px}
.head .sub{font-size:1.02rem;color:var(--dim);margin:0;max-width:44.58em}
.head .idx{font-family:var(--mono);font-size:12px;color:var(--dim);font-variant-numeric:tabular-nums;
  letter-spacing:.1em;padding-bottom:6px;flex-shrink:0}

/* ---------- 11 panels / cards ---------- */
.panel{background:var(--panel);border:1px solid var(--line);padding:26px;display:flex;flex-direction:column;gap:14px;
  transition:border-color .2s var(--settle)}
.panel.pad-lg{padding:32px}
.panel:hover{border-color:var(--line-2)}
.panel h3{margin:0}
.panel p{color:var(--dim);font-size:14.5px}
.card-k{font-family:var(--mono);font-size:11px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
.callout{border-left:2px solid var(--line-2);padding:4px 0 4px 18px;color:var(--mist)}
.callout b{color:var(--fg)}
.quote{font-size:clamp(1.25rem,2.2vw,1.7rem);line-height:1.35;letter-spacing:-.02em;color:var(--fg);font-weight:500;max-width:22.5em}
.quote cite{display:block;font-style:normal;font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--dim);margin-top:18px}

/* ---------- 13 loop / steps ---------- */
.steps{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:var(--line);border:1px solid var(--line);counter-reset:step}
.step{background:var(--bg);padding:22px 20px;display:flex;flex-direction:column;gap:12px;position:relative;min-height:230px}
.step::before{counter-increment:step;content:"0" counter(step);font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.12em}
.step h3{font-size:1rem}
.step .out{font-size:14px;line-height:1.55;color:var(--mist)}   /* sentences in the body sans; the counter and the .t label stay mono */
.step .out b{color:var(--fg);font-weight:600}
.step .t{margin-top:auto;font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.08em}

/* ---------- 15 console mock ---------- */
.app{background:var(--graphite);border:1px solid var(--line);color:var(--fg);display:grid;grid-template-columns:172px 1fr;min-height:440px;overflow:hidden;font-size:12.5px}
.app-side{border-right:1px solid var(--line);padding:16px 14px;display:flex;flex-direction:column;gap:20px;background:var(--panel-2)}
.app-brand{display:flex;align-items:center;gap:9px;padding:2px 6px}
.app-brand .mk{width:20px;height:20px}
.app-brand .nm{font-size:11.5px;font-weight:600;letter-spacing:.12em;color:var(--fg)}
.app-nav{display:flex;flex-direction:column;gap:2px}
.app-nav .app-tab{font:inherit;font-family:var(--mono);font-size:11px;letter-spacing:.1em;color:var(--dim);padding:8px 10px;border-radius:3px;
  display:flex;align-items:center;gap:10px;background:none;border:0;cursor:pointer;text-align:left}
.app-nav .app-tab:hover{color:var(--mist)}
.app-nav .app-tab.on{background:var(--panel);color:var(--fg)}
.app-nav .app-tab::before{content:"";flex:none;width:6px;height:7px;background:currentColor;opacity:.7;
  clip-path:polygon(evenodd,50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%,50% 0,50% 16.5%,16.7% 33.2%,16.7% 66.8%,50% 83.5%,83.3% 66.8%,83.3% 33.2%,50% 16.5%)}   /* closed hex outline, as .checks */
.app-main{display:flex;flex-direction:column;min-width:0}
.app-bar{border-bottom:1px solid var(--line);padding:10px 16px;display:flex;justify-content:space-between;align-items:center;gap:16px;
  font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.04em;flex-wrap:wrap}
.app-bar b{color:var(--fg);font-weight:500}
.app-view{flex:1;padding:22px 24px;display:flex;flex-direction:column;gap:16px;
  background:linear-gradient(rgba(255,255,255,.03) 1px,transparent 1px) 0 0/28px 28px,
             linear-gradient(90deg,rgba(255,255,255,.03) 1px,transparent 1px) 0 0/28px 28px,var(--graphite)}
.app-view .app-h{font-size:15px;color:var(--fg);margin:0}
.app-view p{font-size:12.5px;color:var(--dim);max-width:44.58em;margin:0}
.app-sec{border-top:1px solid var(--line);padding-top:12px;display:flex;justify-content:space-between;align-items:center;
  font-family:var(--mono);font-size:11px;letter-spacing:.12em;color:var(--mist)}
.app-sec i{font-style:normal;color:var(--dim)}
.app-sec .state{color:var(--dim)}
.app-choice{display:grid;grid-template-columns:repeat(4,1fr);gap:8px}
.app-choice div{border:1px solid var(--line);padding:10px 12px;background:var(--panel-2)}
.app-choice div.on{border-color:var(--mist)}
.app-choice b{display:block;font-size:13px;color:var(--fg);font-weight:600}
.app-choice span{font-family:var(--mono);font-size:10.5px;color:var(--dim);letter-spacing:.06em}
.app-choice .bar{height:2px;background:var(--line-2);margin-top:8px;position:relative}
.app-choice .bar::after{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--w,50%);background:var(--mist)}
.app-progress{display:flex;flex-direction:column;gap:9px;font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.04em}
.app-progress div{display:flex;flex-direction:column;gap:5px}
.app-progress .bar{height:2px;background:var(--line-2);position:relative;overflow:hidden}
.app-progress .bar::after{content:"";position:absolute;left:0;top:0;bottom:0;width:var(--w,40%);background:var(--ac)}  /* computing */
.app-feed{border-top:1px solid var(--line);padding:10px 16px;font-family:var(--mono);font-size:11px;color:var(--dim);display:grid;grid-template-columns:auto auto 1fr auto;gap:6px 14px;align-items:baseline}
.app-feed .who{color:var(--dim)}
.app-feed .msg{color:var(--mist)}
.app-feed .ms{color:var(--dim);text-align:right}
.app-disc{font-family:var(--sans);font-size:11.5px;color:var(--dim);border-top:1px solid var(--line);padding:8px 16px;letter-spacing:.02em}

/* ---------- 16 facts strip ---------- */
.facts{display:grid;grid-template-columns:repeat(5,1fr);gap:1px;background:var(--line);border:1px solid var(--line)}
.fact{background:var(--bg);padding:22px 22px 20px}
.fact b{display:block;font-family:var(--mono);font-size:30px;font-weight:600;color:var(--fg);letter-spacing:-.03em;line-height:1;font-variant-numeric:tabular-nums}
.fact span{display:block;font-size:13px;color:var(--dim);margin-top:8px}
.fact small{display:block;font-family:var(--mono);font-size:11.5px;color:var(--dim);margin-top:10px;letter-spacing:.06em}
.stamp{font-family:var(--mono);font-size:11px;color:var(--dim);letter-spacing:.08em;white-space:nowrap}

/* ---------- 17 lists / tags ---------- */
.deflist{display:grid;grid-template-columns:auto 1fr;gap:10px 28px;margin:0}
.deflist dt{font-family:var(--mono);font-size:12px;color:var(--fg);letter-spacing:.04em;padding-top:2px;white-space:nowrap}
.deflist dd{margin:0;color:var(--dim);font-size:14px}
.checks{list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:10px}
.checks li{display:flex;gap:12px;align-items:flex-start;font-size:14.5px;color:var(--mist)}
.checks li::before{content:"";flex:none;width:9px;height:10px;margin-top:6px;background:var(--mist);
  clip-path:polygon(evenodd,50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%,50% 0,50% 11%,11% 30.5%,11% 69.5%,50% 89%,89% 69.5%,89% 30.5%,50% 11%)}   /* a closed 1 px hex outline: the inner hex is cut out of the outer (a clipped border drew as two bars) */
.checks li.no::before{background:var(--dim);opacity:.6}
.checks li.no{color:var(--dim)}
.tags{display:flex;flex-wrap:wrap;gap:6px}
.tag{font-family:var(--mono);font-size:11px;letter-spacing:.06em;color:var(--mist);border:1px solid var(--line-2);padding:3px 8px;border-radius:3px}

/* ---------- 18 forms ---------- */
.form{display:grid;grid-template-columns:1fr 1fr;gap:14px 16px}
.form .full{grid-column:1/-1}
.field{display:flex;flex-direction:column;gap:6px}
.field label{font-family:var(--mono);font-size:12px;letter-spacing:.14em;text-transform:uppercase;color:var(--mist)}
.field input,.field select,.field textarea{font:inherit;font-size:16px;color:var(--fg);background:var(--panel-2);
  border:1px solid var(--line-3);padding:11px 13px;border-radius:var(--radius);width:100%;
  transition:border-color .18s var(--settle)}
.field input:focus,.field select:focus,.field textarea:focus{outline:none;border-color:var(--fg);box-shadow:0 0 0 1px var(--fg)}
.field textarea{min-height:120px;resize:vertical}
.field select{appearance:none;-webkit-appearance:none;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'><path d='M1 1l5 5 5-5' fill='none' stroke='%23C9CED6' stroke-width='1.5'/></svg>");
  background-repeat:no-repeat;background-position:right 13px center;padding-right:36px}
.field .hint{font-size:12px;color:var(--dim)}
.form-note{font-size:12.5px;color:var(--dim);border-left:2px solid var(--line-2);padding-left:14px}

/* ---------- 19 footer ---------- */
footer{border-top:1px solid var(--line);background:var(--bg);position:relative;z-index:1}
.foot-top{display:grid;grid-template-columns:2fr 1fr 1fr 1fr;gap:40px;padding:64px 0 48px}
.foot-brand .lock{width:200px;height:auto;color:var(--fg)}
.foot-brand p{font-size:13px;color:var(--dim);max-width:25.26em;margin-top:18px}
.foot-brand .foot-tag{margin:10px 0 0;font-family:var(--mono);font-size:11px;letter-spacing:.24em;text-transform:uppercase;color:var(--dim)}   /* the lockup's descriptor as real text (it drew at 4.5 px inside the SVG) */
.foot-col h2{font-family:var(--mono);font-size:11.5px;line-height:1.3;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);font-weight:500;margin:0 0 16px}
.foot-col ul{list-style:none;margin:0;padding:0;display:flex;flex-direction:column;gap:9px}
.foot-col a{font-size:13.5px;color:var(--dim)}
.foot-col a:hover{color:var(--fg)}
.foot-bot{border-top:1px solid var(--line);padding:22px 0 30px;display:flex;justify-content:space-between;gap:18px;flex-wrap:wrap;
  font-size:12px;color:var(--dim)}
.foot-bot .disc{font-family:var(--mono);font-size:12px;letter-spacing:.04em;text-transform:uppercase;color:var(--dim);max-width:100%}

/* ---------- 20 motion ---------- */
@keyframes acPulse{0%,100%{opacity:.4}50%{opacity:1}}
@keyframes foldin{from{transform:rotate(-38deg) scale(.62)}to{transform:rotate(0) scale(1)}}
@keyframes weight{from{opacity:.14}to{opacity:1}}
@keyframes rise{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
/* the nav mark assembles once on load - facets fold in one beat apart, blue side first */
.fc{transform-box:view-box;transform-origin:50px 50px}
.m-assemble .fc{animation:foldin .36s var(--lock) both,weight .36s var(--lock) both}
.m-assemble .f0{animation-delay:0s,0s}     .m-assemble .f1{animation-delay:.12s,.12s}
.m-assemble .f2{animation-delay:.24s,.24s} .m-assemble .f3{animation-delay:.36s,.36s}
.m-assemble .f4{animation-delay:.48s,.48s} .m-assemble .f5{animation-delay:.6s,.6s}
/* scroll reveal - 120 ms beats via --d */
.rv{opacity:0;transform:translateY(10px);transition:opacity .48s var(--lock),transform .48s var(--lock);transition-delay:var(--d,0ms)}
.rv.in{opacity:1;transform:none}
/* page heads rise on first paint, like the hero, instead of waiting for the script and the observer (2026-09-26) */
.hero .rv,.pg-head .rv{animation:rise .6s var(--lock) both;animation-delay:var(--d,0ms);opacity:1;transform:none;transition:none}

/* ---------- 21 utilities ---------- */
.mt-1{margin-top:12px}.mt-2{margin-top:24px}.mt-3{margin-top:40px}
.center{text-align:center}
.cta-band{padding:110px 0;text-align:center;border-top:1px solid var(--line);position:relative;overflow:hidden}
.cta-band h2{max-width:15.12em;margin:0 auto 18px}
.cta-band .lede{margin:0 auto 32px;text-align:center}
.cta-band .btn-row{justify-content:center}
.pg-head{padding:88px 0 56px;border-bottom:1px solid var(--line);position:relative;overflow:hidden}
.pg-head h1{font-size:clamp(2.1rem,4.4vw,3.6rem);max-width:12.1em;margin:16px 0 20px}
.pg-head .lede{max-width:44.58em}
.pg-head::before{content:"";position:absolute;right:-8%;top:-30%;width:520px;height:520px;pointer-events:none;opacity:.5;
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='56' height='97' viewBox='0 0 56 97'><g fill='none' stroke='rgba(255,255,255,.05)' stroke-width='1'><path d='M28 1 L55 16.5 L55 48 L28 63.5 L1 48 L1 16.5 Z'/><path d='M28 63.5 L28 96'/></g></svg>");
  background-size:56px 97px;-webkit-mask-image:radial-gradient(closest-side,#000,transparent);mask-image:radial-gradient(closest-side,#000,transparent)}

/* ---------- 22 responsive ---------- */
@media (max-width:1100px){
  .facts{grid-template-columns:repeat(3,1fr)}
  .steps{grid-template-columns:repeat(3,1fr)}
  .g5{grid-template-columns:repeat(3,1fr)}
  .g4{grid-template-columns:repeat(2,1fr)}   /* eight home cards: 2 x 4, not 3+3+2 */
}
@media (max-width:900px){
  .hero .sheet{grid-template-columns:1fr;min-height:0;padding-top:48px;gap:24px}
  .hero-visual{min-height:0;order:-1}
  .hero-canvas{aspect-ratio:auto;height:220px;max-height:none}
  .hero-copy h1{max-width:none}
  .split{grid-template-columns:1fr;gap:32px}
  .g3,.g4,.g5{grid-template-columns:repeat(2,1fr)}
  .g3>:nth-child(3):last-child{grid-column:span 2}   /* three cards at two columns: the third takes the row */
  .foot-top{grid-template-columns:1fr 1fr;gap:32px}
  .app{grid-template-columns:1fr}
  .app-side{border-right:0;border-bottom:1px solid var(--line);flex-direction:row;align-items:center;justify-content:space-between}
  .app-nav{flex-direction:row;gap:4px;flex-wrap:wrap}
  .app-choice{grid-template-columns:repeat(2,1fr)}
  .nav-links{display:none;background:var(--bg);border-bottom:1px solid var(--line);flex-direction:column;align-items:stretch;padding:8px var(--gutter) 16px;gap:0}
  .nav-links.open{display:flex}
  .nav-links a{padding:12px 8px;font-size:15px;border-bottom:1px solid var(--line)}
  .nav-toggle{display:inline-flex}
  section{padding:72px 0}
}
@media (max-width:620px){
  :root{--gutter:18px}
  body{font-size:15px}
  .facts{grid-template-columns:repeat(2,1fr)}
  .steps,.g2,.g3,.g4,.g5,.form{grid-template-columns:1fr}
  .form .full{grid-column:auto}
  .foot-top{grid-template-columns:1fr 1fr;gap:28px 16px;padding:48px 0 36px}
  .head{margin-bottom:32px}
  .deflist{grid-template-columns:1fr;gap:4px 0}
  .deflist dd{margin-bottom:10px}
  .hero-proof{gap:18px;grid-template-columns:repeat(2,minmax(0,1fr))}
  .app-choice{grid-template-columns:1fr 1fr}
  section{padding:56px 0}
  .cta-band{padding:72px 0}
  .pg-head{padding:56px 0 40px}
}

/* ---------- 23 reduced motion / print ---------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{animation:none!important;transition:none!important;scroll-behavior:auto!important}
  .rv{opacity:1!important;transform:none!important}
  .m-assemble .fc{opacity:1!important;transform:none!important}
}
@media print{
  /* paper: the tokens flip to ink on white, every reveal shows, chrome and illustrations stay off; counsel's footer line prints */
  :root{--fg:#0B0F14;--mist:#2A333C;--dim:#4B535B;--steel:#79828C;--line:#DFE3E8;--line-2:#C9CED6;--line-3:#C9CED6;
    --bg:#fff;--bg-2:#fff;--panel:#fff;--panel-2:#fff;--graphite:#fff}
  body{background:#fff;color:#0B0F14}
  body::before,.nav,.hero-visual,.hero::before,.pg-head::before,footer .foot-top,.btn,.progress,.marquee,.cta-band,.skip,
  .fig,.head-fig,.app-fig,.rv.wipe::after{display:none!important}
  .rv,.h1w .w>span,.app-feed.typed>span{opacity:1!important;transform:none!important;animation:none!important;transition:none!important}
  .seq-art{aspect-ratio:auto}
  .hero .sheet{min-height:0;padding:24px 0}
  .pg-head{padding:24px 0}
  section{padding:28px 0}
  .panel,.step,.fact,.checks li,.app,.callout,.seq-f{break-inside:avoid}
  h2,h3{break-after:avoid}
}

/* ---------- 24 page components ---------- */
/* rules two or more pages need; tokens only. Page-local <style> is for genuine one-offs. */
/* a tool call whose child process is running right now - the one blue in a feed (index, console) */
.app-feed .computing{color:var(--ac)}
/* a four-step row - the shared .steps grid is sized for five (pricing ladder, access) */
.steps.s4{grid-template-columns:repeat(4,1fr)}
@media (max-width:1100px){
  .facts .fact:nth-child(5):last-child{grid-column:span 2}   /* five facts: no orphan cell at 3- or 2-column widths */
  /* the same for five panels (.g5: 3+2 at this width, 2+2+1 below 900) and five steps (3+2) */
  .g5>:nth-child(5):last-child,.steps:not(.s4)>.step:nth-child(5):last-child{grid-column:span 2}
  .steps.s4{grid-template-columns:repeat(2,1fr)}
}
@media (max-width:620px){
  .steps.s4{grid-template-columns:1fr}
  /* one column: a span-2 item would open an implicit second column */
  .g3>:nth-child(3):last-child,.g5>:nth-child(5):last-child,.steps:not(.s4)>.step:nth-child(5):last-child{grid-column:auto}
}

/* ---------- 25 motion + interaction (2026-09-12) ---------- */
/* ambient generative loop behind a CTA band - toolkit §03: texture at small scale, structure at full bleed */
.cta-loop{position:absolute;inset:0;width:100%;height:100%;opacity:.26;pointer-events:none;
  -webkit-mask-image:radial-gradient(55% 95% at 50% 50%,#000 25%,transparent 100%);
  mask-image:radial-gradient(55% 95% at 50% 50%,#000 25%,transparent 100%)}
.cta-band .sheet{position:relative;z-index:1}
/* console mock: a live progress row - the bar is the only blue in the mock, and it pulses rather than pretends a percentage */
.app-progress-row{padding:8px 16px 10px;border-top:1px solid var(--line)}
.app-progress .bar.live::after{animation:acPulse 1.44s var(--settle) infinite}

/* ---------- 26 motion layer II (2026-09-23) ---------- */
/* cross-document view transitions: the old page releases, the new one locks in, the brand holds still */
@view-transition{navigation:auto}
.nav .brand{view-transition-name:brand}
::view-transition-old(root){animation:vt-out .16s var(--release) both}
::view-transition-new(root){animation:vt-in .32s var(--lock) both}
@keyframes vt-out{to{opacity:0}}
@keyframes vt-in{from{opacity:0;transform:translateY(8px)}}
/* scroll progress: a hairline in mist, never blue */
.progress{position:fixed;left:0;top:0;height:1px;width:100%;background:var(--mist);transform-origin:0 50%;transform:scaleX(0);z-index:60;pointer-events:none;opacity:.7}
/* the nav compacts once the page is scrolled */
.nav .sheet{transition:height .24s var(--settle)}
body.scrolled .nav .sheet{height:56px}
/* hero headline: words rise one beat apart behind a mask (site.js splits the h1) */
.h1w .w{display:inline-block;overflow:hidden;vertical-align:bottom;padding-bottom:.08em;margin-bottom:-.08em}
.h1w .w>span{display:inline-block;transform:translateY(110%);animation:wordUp .56s var(--lock) forwards;animation-delay:var(--wd,0ms)}
@keyframes wordUp{to{transform:none}}
/* seam wipe reveal (toolkit primitive): a cover in the section's ground slides off the box, left to
   right. NOT clip-path on the box itself: Chromium's IntersectionObserver treats clip-path as
   clipping, so a box clipped to zero never intersects and a reveal keyed on it never fires. */
.rv.wipe{transform:none;opacity:1;position:relative}
.rv.wipe::after{content:"";position:absolute;inset:-1px;background:var(--wipe-bg,var(--bg));z-index:5;pointer-events:none;
  transform-origin:100% 50%;transform:scaleX(1);transition:transform .72s var(--lock);transition-delay:var(--d,0ms)}
.rv.wipe.in::after{transform:scaleX(0)}
.alt .rv.wipe::after{background:var(--bg-2)}
[data-count]{font-variant-numeric:tabular-nums}
/* ideas ticker: things to make, as a mechanical ticker; pauses under the pointer or on its Pause button */
.marquee{overflow:hidden;border-top:1px solid var(--line);border-bottom:1px solid var(--line);background:var(--bg-2);position:relative}
.marquee::before,.marquee::after{content:"";position:absolute;top:0;bottom:0;width:120px;z-index:1;pointer-events:none}
.marquee::before{left:0;background:linear-gradient(90deg,var(--bg-2),transparent)}
.marquee::after{right:0;background:linear-gradient(270deg,var(--bg-2),transparent)}
.marquee-track{display:flex;width:max-content;animation:marquee 70s linear infinite}
.marquee:hover .marquee-track{animation-play-state:paused}
.marquee-track ul{display:flex;list-style:none;margin:0;padding:14px 0}
.marquee-track li{font-family:var(--mono);font-size:11px;letter-spacing:.16em;text-transform:uppercase;color:var(--dim);display:flex;align-items:center;gap:22px;padding-right:22px;white-space:nowrap}
.marquee-track li::after{content:"";flex:none;width:7px;height:8px;background:var(--line-2);
  clip-path:polygon(evenodd,50% 0,100% 25%,100% 75%,50% 100%,0 75%,0 25%,50% 0,50% 14.4%,14.3% 32.3%,14.3% 67.7%,50% 85.6%,85.7% 67.7%,85.7% 32.3%,50% 14.4%)}   /* closed hex outline, as .checks */
.marquee-track li b{color:var(--mist);font-weight:500}
@keyframes marquee{to{transform:translateX(-50%)}}
/* console mock: a pointer tilt on desktop, and feed rows that arrive one beat apart */
.tilt-wrap{perspective:1400px}
.tilt{transform-style:preserve-3d;will-change:transform;transition:opacity .48s var(--lock),transform .5s var(--settle),clip-path .72s var(--lock)}
.app-feed.typed>span{opacity:0;transform:translateY(4px);transition:opacity .36s var(--lock),transform .36s var(--lock)}
.app-feed.typed>span.on{opacity:1;transform:none}
@media (max-width:620px){.marquee::before,.marquee::after{width:40px}}
@media (prefers-reduced-motion:reduce){
  ::view-transition-group(*),::view-transition-old(*),::view-transition-new(*){animation:none!important}
  .h1w .w>span{transform:none;animation:none}
  .rv.wipe::after{display:none}
  .marquee-track{animation:none;width:auto}.marquee-track ul{flex-wrap:wrap;justify-content:center;row-gap:4px;padding:14px var(--gutter);width:100%}.marquee-track ul[aria-hidden]{display:none}.marquee::before,.marquee::after,.marquee-toggle{display:none}
  .app-feed.typed>span{opacity:1;transform:none}
  .progress{display:none}
}

/* ---------- 27 fifth pass (2026-09-26): reach, legibility, figures, console screens ---------- */
/* no script: every reveal shows and the ticker control hides (the request form posts on its own) */
@media (scripting:none){
  .rv{opacity:1;transform:none}
  .rv.wipe::after{display:none}
  .marquee-toggle{display:none}
}
/* the closing band's label sits over the ring: mist keeps it 5.4:1 or better over every facet */
.cta-band .eyebrow{color:var(--mist)}
/* request form: placeholders at AA; a status line that shows only when it has words */
.field input::placeholder,.field textarea::placeholder{color:var(--dim);opacity:1}
.form-status{font-size:13.5px;color:var(--mist);margin:0}
/* empty: out of sight but still in the accessibility tree, so the live region exists before it speaks */
.form-status:empty{position:absolute;width:1px;height:1px;overflow:hidden;clip:rect(0 0 0 0);margin:0;padding:0;border:0}
.form-status:focus{outline:none}
/* request form results (2026-09-28): the script writes .form-status; with no script the endpoint
   redirects to #sent or #not-sent and :target shows that line. .bad marks a failure. */
.form-status:not(:empty){color:var(--fg);border-left:2px solid var(--ok);padding-left:14px}
.form-status.bad,.form-done.fail{color:var(--fg);border-left:2px solid var(--fail);padding-left:14px}
.form-done{display:none;font-size:13.5px;color:var(--fg);margin:0;border-left:2px solid var(--ok);padding-left:14px}
.form-done:target{display:block;scroll-margin-top:40vh}
.form .btn[disabled],.form .btn[aria-disabled="true"]{opacity:.55;cursor:default}
.form .btn[disabled]{pointer-events:none}
/* on-page index links (platform, legal) */
a.tag:hover{color:var(--fg);border-color:var(--steel)}
/* idea cards: a line icon in the mark's hexagon, and a link on the card's floor */
.card-ic{width:40px;height:40px;color:var(--mist);flex:none;margin-bottom:2px}
.panel .link{margin-top:auto;align-self:flex-start;font-size:14px}
/* ideas ticker: a pause control (WCAG 2.2.2) */
.marquee-toggle{position:absolute;right:10px;top:50%;transform:translateY(-50%);z-index:2;font:500 11px/1 var(--mono);letter-spacing:.14em;
  text-transform:uppercase;color:var(--mist);background:var(--bg-2);border:1px solid var(--line-2);border-radius:var(--radius);padding:6px 9px;cursor:pointer}
.marquee-toggle:hover{border-color:var(--mist);color:var(--fg)}
.marquee.paused .marquee-track{animation-play-state:paused}
/* figures: one illustration family, graphite through white, never blue */
.fig{width:100%;height:auto;display:block;overflow:visible}
.seq{display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:1px;background:var(--line);border:1px solid var(--line)}
.seq-f{margin:0;background:var(--bg-2);padding:26px 22px 24px;display:flex;flex-direction:column;gap:18px}
.seq-art{aspect-ratio:16/10;display:flex;align-items:center;justify-content:center}
.seq-f figcaption b{display:block;color:var(--fg);font-size:1.02rem;font-weight:600;letter-spacing:-.012em}
.seq-f figcaption span{display:block;color:var(--dim);font-size:14px;margin-top:4px;line-height:1.5}
.seq-q{margin:0;background:var(--panel);border:1px solid var(--line-2);border-radius:10px 10px 10px 2px;padding:14px 16px;
  color:var(--fg);font-size:14.5px;line-height:1.5;letter-spacing:-.006em;max-width:19.3em}
.seq-q,.seq-f figcaption span{text-wrap:pretty}
.seq-foot{margin-top:18px}
.seq-foot p{margin:0;color:var(--dim);font-size:14px;max-width:52em}
.seq-foot p b{color:var(--mist);font-weight:600}
.head.has-fig{display:grid;grid-template-columns:minmax(0,1fr) minmax(0,440px);gap:48px;align-items:center}
.head-fig{margin:0;background:var(--panel-2);border:1px solid var(--line);padding:18px 22px}
.head-fig .fig{max-height:230px}
/* console preview: five screens as buttons and the views they switch */
.app-view[hidden]{display:none}
/* the preview keeps one height on every screen: the five views share one grid cell sized by the tallest;
   a hidden view keeps its box but stays out of sight, the accessibility tree and the tab order */
.app-main{display:grid;grid-template-columns:minmax(0,1fr);grid-template-rows:auto 1fr auto auto auto}
.app-main>.app-view{grid-row:2;grid-column:1}
.app-main>.app-view[hidden]{display:flex;visibility:hidden}
.app-fig{border:1px solid var(--line);background:var(--panel-2);padding:14px 16px}
.app-fig .fig{max-height:210px}
.app-fig-row{display:grid;grid-template-columns:minmax(0,1fr) 150px;gap:20px;align-items:center}
.app-legend{display:flex;flex-direction:column;gap:8px;font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;color:var(--dim)}
.app-legend b{color:var(--mist);font-weight:500}
.app-legend .ramp{display:block;height:6px;background:linear-gradient(90deg,var(--line-2),var(--dim),var(--fg))}
.app-legend .ends{display:flex;justify-content:space-between}
.app-chips{display:flex;flex-wrap:wrap;gap:6px}
.app-chips span{font-family:var(--mono);font-size:10.5px;letter-spacing:.1em;color:var(--dim);border:1px solid var(--line);padding:4px 8px}
.app-chips span.on{color:var(--mist);border-color:var(--mist)}
@media (max-width:900px){
  .head.has-fig{grid-template-columns:1fr;gap:24px}
  .head-fig{max-width:520px}
  /* nav: the menu hangs from the bar at any bar height; brand left, Request access and the toggle right */
  .nav .sheet>nav{position:absolute;left:0;right:0;top:calc(100% + 1px)}
  .nav .brand{margin-right:auto}
  .nav-toggle{order:3}
}
@media (max-width:620px){
  .hero .sheet{padding-top:28px;gap:16px}
  .hero-canvas{height:150px}
  .hero-copy h1{margin:12px 0 18px}
  .hero-copy .lede{margin-bottom:26px}
  .nav .sheet{gap:12px}
  .nav-cta{gap:8px}
  .nav-cta .btn.sm{padding:8px 11px;font-size:12px}
  .step{min-height:0;gap:10px}
  .foot-brand{grid-column:1/-1}
  .foot-col ul{gap:0}
  .foot-col a{display:flex;align-items:center;min-height:44px}
  .foot-col h2{margin-bottom:4px}
  /* idea cards: a swipe row, the next card peeking in */
  .grid.swipe{display:flex;gap:12px;overflow-x:auto;scroll-snap-type:x mandatory;overscroll-behavior-x:contain;
    margin:0 calc(-1*var(--gutter));padding:0 var(--gutter) 6px;scroll-padding:0 var(--gutter);scrollbar-width:none}
  .grid.swipe::-webkit-scrollbar{display:none}
  .grid.swipe>*{flex:0 0 82%;scroll-snap-align:start}
  .grid.swipe>.rv{opacity:1;transform:none}
  .grid.swipe:focus-visible{outline-offset:-2px}
  /* long capability grids read as a divided list */
  .grid.lst{gap:0;border-top:1px solid var(--line)}
  .grid.lst>.panel{background:none;border:0;border-bottom:1px solid var(--line);padding:20px 0;gap:8px}
  .head-fig{padding:18px 16px}
  .head-fig .fig text{font-size:11.5px;letter-spacing:1px}   /* overrides the SVG attribute: labels stay near 10 px as the figure scales down */
  .seq{grid-template-columns:1fr}
  .seq-art{aspect-ratio:auto;max-height:180px}
  .seq-art .fig{max-height:180px}
  .app-fig-row{grid-template-columns:1fr}
  .app-side{flex-direction:column;align-items:stretch;gap:10px;padding:12px 12px 10px}
  .app-nav{flex-wrap:nowrap;justify-content:space-between;gap:2px}
  .app-nav .app-tab{padding:6px 5px;font-size:10px;letter-spacing:.06em}
  .app-nav .app-tab::before{display:none}
  .app-bar{padding:8px 12px}
  .app-view{padding:16px 14px}
  .app-feed{padding:10px 12px;gap:4px 8px;grid-template-columns:auto 1fr auto}
  .app-feed>span:nth-child(4n+1){display:none}
}
@media (max-width:359px){
  .nav-cta .btn{display:none}
  .nav-links .nav-req{display:block}
  .nav-links .nav-req a{color:var(--fg);font-weight:600}
}

/* ---------- 28 computed figures (2026-09-26) ---------- */
/* Every figure is a raster computed with a real method (topology optimization, a stress solve, a toolpath, a
   rendered mesh), shown as an <img>. Its words live in .viz-ov above it, never in the pixels, so they stay
   crisp: positions are fractions of the picture (left/top in %), leader lines are an SVG in the same box
   (viewBox 0 0 100 100, stretched to the picture, strokes kept at 1 px), labels keep one size on every screen. */
.viz{position:relative;margin:0;width:100%}
.viz>img{display:block;width:100%;height:auto}
.viz>canvas{position:absolute;left:0;top:0;width:100%;height:100%;opacity:0;pointer-events:none}
/* the growth replay (site.js): the final <img> is the default; the canvas takes over only while it plays */
.viz.grow-armed>img{opacity:0}
.viz.grow-armed>canvas{opacity:1}
.viz.grow-done>img{opacity:1;transition:opacity .52s var(--settle)}
.viz.grow-done>canvas{opacity:0;transition:opacity .52s var(--settle)}
.viz-ov{position:absolute;inset:0;pointer-events:none;font-family:var(--mono);font-size:10.5px;font-weight:500;line-height:1;
  letter-spacing:.14em;text-transform:uppercase;color:var(--dim)}
.viz-ov svg{position:absolute;inset:0;width:100%;height:100%;overflow:visible}
.viz-ov{transition:opacity .36s var(--settle)}
.viz.viz-wait>.viz-ov{opacity:0}   /* site.js: until the picture has loaded */
.viz-ov path{fill:none;stroke:var(--steel);stroke-width:1;vector-effect:non-scaling-stroke}
.viz-ov path.ld-a{stroke:var(--mist);stroke-width:1.25}
.viz-ov .lb{position:absolute;white-space:nowrap;transform:translate(0,-50%);padding-left:7px}
.viz-ov .lb.l{transform:translate(-100%,-50%);padding:0 7px 0 0;margin-right:-.14em}
.viz-ov .lb.c{transform:translate(-50%,-50%);padding:0}
.viz-ov .lb.t{transform:translate(0,-100%);padding:0 0 6px}
.viz-ov .lb.tl{transform:translate(-100%,-100%);padding:0 0 6px;margin-right:-.14em}
/* the end dot: mist with a graphite ring, so it reads on a dark ground and on a white surface alike */
.viz-ov .dt{position:absolute;width:5px;height:5px;margin:-2.5px 0 0 -2.5px;border-radius:50%;background:var(--mist);box-shadow:0 0 0 1.5px rgba(11,15,20,.75)}
/* a load arrow's head, pointing down; its tip sits on the point */
.viz-ov .ah{position:absolute;width:8px;height:7px;margin:-7px 0 0 -4px;background:var(--mist);clip-path:polygon(0 0,100% 0,50% 100%)}
/* a lighter second load pointing along +x (the braking case the mount was also grown for): turned about its own tip */
.viz-ov .ah.h{transform:rotate(-90deg);transform-origin:50% 100%;opacity:.6}
.viz-ov path.ld-a.lt{opacity:.6}
.viz-ov .bx{position:absolute;border:1px dashed rgba(131,140,150,.42)}
.viz-ov .rp{position:absolute;display:flex;align-items:center;gap:7px;transform:translate(-100%,-50%)}
.viz-ov .rp i{display:block;width:46px;height:4px;background:linear-gradient(90deg,#1B2229,#4D555E,#828A93,#C3C8CF,#FBF8F1)}
/* home sequence: frames 2 to 4 are pictures; the art box follows the picture, not a fixed ratio */
.seq-art.has-viz{display:block;aspect-ratio:auto}
/* chapter heads give the picture room to read at its quality: a studio ground, a hairline frame */
@media (min-width:901px){.head.has-fig{grid-template-columns:minmax(0,1fr) minmax(0,1.1fr)}}   /* one column below, as section 27 sets */
.head-fig{padding:14px 16px;background:radial-gradient(75% 70% at 50% 42%,rgba(255,255,255,.035),transparent 72%),var(--panel-2)}
.head-fig .viz{max-width:calc(340px * var(--ar,1.6));margin:0 auto}
/* a wide figure: the home "Inside the part" band and the Platform lattice figure */
.viz-wide{margin:0;position:relative;padding:18px 0;
  background:radial-gradient(60% 72% at 50% 46%,rgba(255,255,255,.04),transparent 70%)}
.viz-wide::before,.viz-wide::after{content:"";position:absolute;width:18px;height:18px;pointer-events:none;border:0 solid var(--line-2)}
.viz-wide::before{left:0;top:0;border-width:1px 0 0 1px}
.viz-wide::after{right:0;bottom:0;border-width:0 1px 1px 0}
.viz-wide.narrow{max-width:940px;margin:40px auto 0}
.viz-wide .viz-ov{font-size:11px}
.alt .viz-wide{background:radial-gradient(58% 64% at 50% 55%,var(--graphite) 45%,transparent 100%)}   /* on the lighter ground, the render's soft shadow sits on graphite */
.viz-wide .viz{max-width:1180px;margin:0 auto}
/* console preview: a picture in the screen's figure box */
.app-fig .viz{max-width:calc(320px * var(--ar,1.6));margin:0 auto;overflow:hidden}
.app-fig .viz.zoom>img{transform:scale(1.16)}   /* the pictures carry a margin for their page labels; the screen shows the part closer */
.app-legend .ramp{background:linear-gradient(90deg,#1B2229,#4D555E,#828A93,#C3C8CF,#FBF8F1)}
/* labels a small screen cannot fit where a wide one can: .dsk shows above 620 px, .mob at or below */
.viz-ov .mob{display:none}
@media (max-width:620px){
  .viz-ov .dsk{display:none}
  .viz-ov .mob{display:block}
  .viz-ov svg .mob{display:inline}
  .viz-ov .lb.wrap{white-space:normal;width:max-content;max-width:14.5em;line-height:1.35}
  .viz-ov .lb.wrap.nw{max-width:8.5em}   /* a long label near the right edge wraps into a narrow column */
  .head-fig{padding:12px 10px}
  .viz-wide{padding:12px 0;margin-left:calc(-1*var(--gutter));margin-right:calc(-1*var(--gutter))}   /* the render takes the full screen width */
  .viz-wide.narrow{margin:32px calc(-1*var(--gutter)) 0}
  .viz-wide::before{left:var(--gutter)}.viz-wide::after{right:var(--gutter)}   /* the frame ticks sit inside the gutter, not on the screen edge */
}
@media print{.viz,.viz-wide{display:none!important}}

/* ---------- 29 computed figures, round 2 (2026-09-27) ---------- */
/* home sequence: a 2 x 2 board above a phone, the quote card one cell and the three computed figures the other three,
   so each picture reads at about twice the width the old strip of three gave it. A picture carries its own margin for
   its labels, so it runs to the cell's edges; the quote cell's art box runs out the same way, so the four art boxes
   match and the captions line up across a row */
.seq-art.has-viz,.seq-f:first-child .seq-art{margin:0 -22px}
.seq-q{font-size:clamp(15px,1.45vw,21px);max-width:17em;padding:18px 20px}
@media (max-width:620px){
  .seq-art.has-viz{max-height:none}   /* the picture sets its own height; the 180 px cap is for the quote card */
  .seq-q{font-size:14.5px;padding:14px 16px}
}
/* a label that wraps to the room between its leader and the picture's edge: its max-width is set inline as a share of
   the figure, so it is one line on a wide screen and folds to two or three on a narrow one, never past the picture */
.viz-ov .lb.fit{white-space:normal;width:max-content;line-height:1.35;text-wrap:balance}
.viz-ov .lb.l.fit{text-align:right}   /* a label hung left of its leader folds against the leader, not away from it */

/* ---------- 30 computed figures, round 3 (2026-09-27) ---------- */
/* Platform chapter heads: the figure runs under the words at up to 420 px tall (670 to 840 px wide) instead of a
   525 px thumbnail beside the heading; the <img> sizes attributes say the same widths, so a 2x screen takes the
   full-size source */
.head.has-fig{grid-template-columns:minmax(0,1fr);gap:28px;align-items:start}
@media (min-width:901px){.head.has-fig{grid-template-columns:minmax(0,1fr)}}
.head-fig{max-width:none;padding:22px 24px}
.head-fig .viz{max-width:calc(420px * var(--ar,1.6))}
@media (min-width:901px){#optimize .head-fig .viz{max-width:900px}}   /* the bracket render carries wide margins; at 672 px the part read at a third of its panel (2026-09-27) */
/* a close-up that runs off its own frame (the Platform print layers): the picture fills its panel edge to edge, so
   the panel's border is where the picture is cropped */
.head-fig.bleed{padding:0;max-width:840px;margin:0 auto;overflow:hidden;background:var(--panel-2)}
.head-fig.bleed .viz{max-width:none}
/* its labels can fall on the soft, bright out-of-focus part: a graphite halo keeps each word legible */
.head-fig.bleed .viz-ov .lb{text-shadow:0 0 2px rgba(11,15,20,.95),0 0 7px rgba(11,15,20,.9)}
/* home sequence: the quote card fills most of its cell, level with the figure beside it */
@media (min-width:621px){.seq-f:first-child .seq-art{justify-content:center}.seq-q{width:80%;max-width:none;font-size:clamp(16px,1.75vw,25px);padding:22px 26px}}
@media (max-width:620px){
  /* the lattice close-up runs the full screen width (section 28), so its corner marks sit on its own edges */
  .viz-wide.narrow::before{left:0}.viz-wide.narrow::after{right:0}
  .head-fig{padding:14px 10px}
  .head-fig.bleed{padding:0}
  /* the Optimize bracket: on a phone the part sat small in a picture whose right fifth is empty ground, so the picture
     runs a little past its panel, which crops it; the overlay is inset:0 on .viz, so every dot, leader and label
     scales with the picture and stays on its anchor (the img sizes attribute says 110vw for the same reason) */
  #optimize .head-fig{overflow:hidden}
  #optimize .head-fig .viz{width:128%;max-width:none;margin-left:-4%}
}
/* two callouts side by side, each as tall as its own text, so a short one's rule ends where its words end */
.grid.al-start{align-items:start}
