/* ============================================================
   Termdeck — home.css  (V2 marketing homepage, agent-ai theme)
   Self-contained. Geist + DM Mono, midnight surfaces, hairline rails,
   ambient top-glow. Isolated from the shared homepage.css (which still
   styles /vs/* and /blog). Do not link both on one page.
   ============================================================ */
.skip-link{position:absolute;left:-9999px;top:0;z-index:200;background:var(--primary);color:var(--primary-fg);padding:8px 14px;border-radius:0 0 var(--r-md) 0;font-size:13px}
.skip-link:focus{left:0}

/* ============ FONTS (Geist + DM Mono, embedded) ============ */
/* Geist is `optional`, not `swap`, and that is a CLS fix rather than a taste
   change (the freeze allows the former). The hero's lede stopped fading in with
   the reveal, so it now paints at first contentful paint instead of after it,
   which is the whole point of that change. But it paints in whatever face is
   ready, and the system fallback runs about 11% wider than Geist: measured
   2026-09-07 on the live page, the hero was 43px taller at 412px wide and 95px
   taller at 1280px until the real face arrived, and everything below it moved
   when it did. CLS went 0.042 -> 0.132.
   `swap` guarantees that reflow happens; `optional` forbids it. The face gets a
   ~100ms block period and then either it is ready and is used, or the fallback
   is kept for the whole pageview with no swap at any later point. Geist is
   preloaded above and is 57 KB, so on a warm cache or an ordinary connection it
   wins that race and the reader sees Geist at first paint. On a cold, slow one
   they get the system sans for that pageview, which is the price of the
   guarantee, and the cheaper half of the trade against a moving page.
   A metric-matched @font-face fallback was tried first and abandoned: swept
   across size-adjust from 85% to 100%, the residual shift never reached zero at
   all four breakpoints at once, because the error is a whole-line-count jump
   rather than a smooth width error. */
@font-face{font-family:'Geist';src:url('../fonts/geist-variable.woff2') format('woff2');font-weight:100 900;font-style:normal;font-display:optional}
@font-face{font-family:'Geist Mono';src:url('../fonts/geist-mono-variable.woff2') format('woff2');font-weight:100 900;font-style:normal;font-display:swap}
/* DM Mono is the mono face here. Only the 400 and 500 cuts are embedded:
   this page asks for mono at 400/500/600/700, and DM Mono has no cut above
   500, so 600/700 synthesize from 500 rather than pulling another file. */
@font-face{font-family:'DM Mono';src:url('../fonts/dm-mono-400-normal-latin-ext.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;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:'DM Mono';src:url('../fonts/dm-mono-400-normal-latin.woff2') format('woff2');font-weight:400;font-style:normal;font-display:swap;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:'DM Mono';src:url('../fonts/dm-mono-500-normal-latin-ext.woff2') format('woff2');font-weight:500;font-style:normal;font-display:swap;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:'DM Mono';src:url('../fonts/dm-mono-500-normal-latin.woff2') format('woff2');font-weight:500;font-style:normal;font-display:swap;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}

/* ============ TOKENS ============
   THE PALETTE IS THE APP'S, BY REFERENCE AND NOT BY COPY.
   These names all resolve to --workspace-* from tokens/colors.css, which every
   marketing page already links. That file owns Termdeck's cool midnight spine;
   this sheet used to carry a SECOND, older palette (#0a0a0a
   canvas, #131315 cards, #a1a1a1 body copy) that predated the swap and was
   never moved with it, so the public site and the product were two different
   greys. The worst of it was body copy: --muted at #a1a1a1 against the app's
   #bdc7d2, 47 eight-bit steps dim and with none of the blue cast the rest of
   the palette has.

   var(), not the hex, on purpose. A copied value is a value that goes stale the
   next time colors.css moves, which is exactly how this file got here. The
   local names stay because ~600 declarations spell them, and renaming those is
   not what a palette swap is. */
:root{
  --bg:var(--workspace-bg);                       /* #0c1117  midnight canvas */
  --bg-2:var(--workspace-nav-hover);              /* #10171f  deep chrome */
  --card:var(--workspace-surface);                /* #161e27  card rung */
  --card-2:var(--workspace-surface);              /* flat cards: same rung, see --panel */
  --raised:var(--workspace-surface-raised);       /* #1d2834 */
  --muted-surface:var(--workspace-surface-hover); /* #263443 */
  --text:var(--workspace-text);                   /* #f4f7fa */
  --muted:var(--workspace-muted);                 /* #bdc7d2 */
  --faint:var(--workspace-faint);                 /* #8c9aaa */
  --primary:var(--workspace-accent);              /* #a3e9bd */
  --primary-fg:var(--workspace-primary-fg);       /* #0c1117 */
  --border:var(--workspace-border);               /* cool translucent hairline */
  --border-soft:var(--workspace-nav-border);      /* #263443 */
  --rail:var(--workspace-nav-border);             /* lit column edges */
  /* --input is the BRIGHTENED edge: a card on hover, the "after" compare column,
     or a focused control. The grouping hairline cannot carry a control that is
     identified by its boundary alone, so text fields take the measured
     --workspace-control-border directly and brighten to --muted on focus.
     Everything else uses this, the app's strong hairline. */
  --input:var(--workspace-border-strong);         /* #354657 */
  --ring:var(--workspace-accent);                 /* mint, same ring as the app */
  /* ---- surfaces: one elevation language for every component on the page ----
     desk   = the page behind the column        panel  = a card you read as a component
     sunken = a chip nested inside a card       well   = media / live data surface
     edge + lift are the only two shadows on the page, so every raised thing is lit
     from the same angle by the same amount. */
  --desk:var(--workspace-nav-bg);   /* blue-black page behind the column */
  --grid:rgba(163,233,189,.032);
  /* THE CARD IS LINEAR'S CARD NOW: a FLAT fill, a hairline, and nothing else.
     --panel was a linear-gradient(180deg, #171717, #131315) and the reference is
     explicit that a card is a solid #0f1011-class surface with an inset hairline,
     "no outer shadow, no glow". Both tokens keep their names so the ~20 rules
     that spell them do not move; they simply resolve to a colour instead of a
     gradient. */
  --panel:var(--card);
  --panel-2:var(--raised);
  --sunken:var(--workspace-surface-raised); /* a chip nested inside a card */
  --well:var(--workspace-overlay-bg);       /* media / live data surface */
  /* Both resting shadows are off. Linear's don'ts: "Do not use shadows to
     separate cards from the canvas, use hairline borders and inner inset shadows
     instead." The lift here is the surface step (#0c1117 -> #161e27, 20 eight-bit
     steps) plus the hairline, which is the same argument tokens/colors.css makes
     for the app: on a near-black canvas a cast shadow has nowhere to go.

     0 0 #0000 and NOT none, because every consumer writes
     `box-shadow:var(--edge),var(--lift)` and `box-shadow:<x>,none` is invalid,
     which would drop the whole declaration. Same trap tokens/controls.css
     documents for --btn-bezel-none.

     --lift-2 survives as a real shadow because it is the HOVER state, and an
     interaction affordance is not resting elevation. It is Linear's --shadow-sm. */
  --edge:0 0 #0000;
  --lift:0 0 #0000;
  --lift-2:0 2px 4px rgba(0,0,0,.4);
  --grid-cols:repeating-linear-gradient(90deg,transparent 0 calc(12.5% - 1px),var(--grid) calc(12.5% - 1px) 12.5%);
  --link-rule:rgba(88,220,142,.7); /* = --brand-green-400 at 70%, literal so the rule survives without color-mix */
  --link-rule:color-mix(in srgb,var(--brand-green-400) 70%,transparent); /* 55% read as grey at 1x; a 1px rule needs the alpha */
  --danger:#ff6b7a; --live:#42d187; --busy:#f2bd4f; /* state trio from the workspace palette */
  /* ---- info: "here is a fact you did not ask for and cannot act on" ----
     The marketing-local mirror of the app's --workspace-info (tokens/colors.css).
     Same hue, declared here because home.css is self-contained by design.
     The one thing that spends it — .price-tag — sits ON the flipped featured card and
     straddles its top edge, so the soft pair is BAKED OPAQUE rather than left as a tint:
     a translucent 14% would show near-black through the badge's top half and near-white
     through its bottom, and read as a two-tone chip.
       --info-soft = app info blue at 14% over #ededed   --info-line = the same at 36%
     --info-ink is the app's soft-badge glyph run in reverse. On a DARK tint the label has
     to lift (the app's --workspace-info-text); on a light tint it has to sink, so it deepens to
     4.88:1. Same rule (measure against the tint you just painted), opposite direction. */
  --info-soft:#d4dfee; --info-line:#aec8f1; --info-ink:#275bae;
  --cat-purple:#c49cff; --cat-orange:#ff9b61; --cat-emerald:#56d9a0; --cat-blue:#68b7ff; --cat-pink:#f47daf;
  /* The page's one light source blends the product mint with the tool blue.
     Both hues already carry meaning in the app; here they act as brand identity
     and keep the marketing surface related to the workspace. */
  --glow:radial-gradient(100% 80% at 42% 0%, rgba(66,209,135,.11), transparent 58%),
    radial-gradient(70% 65% at 72% 4%, rgba(79,145,247,.08), transparent 55%);
  /* Radii - Linear's five, and exactly its five: 2 / 4 / 6 / 12 / pill, with a
     hard cap of 12 on cards and panels. The old family (8/10/14/20) shared no
     value with the reference at all, and 12 hand-written literals sat off even
     that: 9px eight times, 15px five, plus 5, 7 and 11. See tokens/spacing.css,
     which took the same five values for the app family on the same pass.
     --r-xl is deliberately the same 12 as --r-lg: the name survives for the big
     frames that spell it, the value is capped where Linear caps it. */
  --r-xs:2px; --r-sm:4px; --r-md:6px; --r-lg:12px; --r-xl:12px; --pill:999px;
  --shell:1280px;
  --sans:'Geist',-apple-system,system-ui,sans-serif;
  --mono:'DM Mono',ui-monospace,'SF Mono',Menlo,monospace;
  --step:clamp(2.2rem,5.2vw,3.9rem);
  --ease:cubic-bezier(.22,.61,.36,1);
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;scroll-padding-top:80px} /* clears the 64px sticky .nav on in-page anchors */
body{background:var(--desk);color:var(--text);font-family:var(--sans);font-size:15px;line-height:1.55;-webkit-font-smoothing:antialiased;letter-spacing:-.01em}
a{color:inherit;text-decoration:none}
h1,h2,h3{font-weight:600;letter-spacing:-.028em;line-height:1.03;text-wrap:balance}
::selection{background:rgba(255,255,255,.16)}
:focus-visible{outline:none;box-shadow:0 0 0 2px var(--bg),0 0 0 4px var(--ring);border-radius:var(--r-md)}

/* ============ LAB CHROME ============ */

.demo-wrap{max-width:var(--shell);margin:0 auto;padding:0 32px}

/* ============ PRIMITIVES ============ */
.eyebrow{display:inline-flex;font-family:var(--mono);font-size:11.5px;letter-spacing:.14em;text-transform:uppercase;color:var(--faint)}
.kicker{font-family:var(--mono);font-size:12px;letter-spacing:.02em;color:var(--muted)}
.btn{display:inline-flex;align-items:center;gap:8px;height:40px;padding:0 17px;border-radius:var(--r-md);font-family:var(--sans);font-size:14px;font-weight:500;border:1px solid transparent;cursor:pointer;transition:background .16s,border-color .16s,transform .16s,color .16s;white-space:nowrap}
.btn svg{width:15px;height:15px}
.btn-primary{background:var(--primary);color:var(--primary-fg)}
.btn-primary:hover{background:#fff}

.btn-ghost{background:transparent;color:var(--text);border-color:var(--border)}
.btn-ghost:hover{background:rgba(255,255,255,.05);border-color:var(--input)}
/* Nav sign-up. Linear's one shaped exception: a white PILL against the dark bar,
   "the second highest-contrast element after the acid-lime CTA". Pure #ffffff and
   not --primary (#a3e9bd) on purpose, because the whole point of the variant is
   that it out-contrasts every other control in the chrome; --primary is the fill
   for a control that must not out-shout the sentence beside it.
   The weight is .btn's own 500 and is deliberately NOT overridden. Linear specifies
   510, which is ten units away and not a difference anyone can see at 13px; it is
   also not a rung of this project's weight scale, and tests/sans-weight-scale.mjs
   fails any weight that is not one. A shape swap does not get to add a type rung.
   16px of side padding over .btn-sm's 32px height is their 8/16. */
/* .btn prefixed so the 16px survives .btn-sm's `padding:0 12px`, which is declared
   after this and would otherwise win on source order at equal specificity. */
.btn.btn-signup{background:#fff;color:var(--primary-fg);border-radius:var(--pill);padding:0 16px}
.btn.btn-signup:hover{background:var(--primary)}

.btn-sm{height:32px;font-size:13px;padding:0 12px}
.btn .arrow{transition:transform .18s var(--ease)}
.btn:hover .arrow{transform:translateX(3px)}
.dot{width:6px;height:6px;border-radius:50%;background:var(--live);box-shadow:0 0 0 3px rgba(66, 209, 135,.18)}

.cat{display:inline-flex;align-items:center;gap:7px;padding:5px 11px 5px 9px;border-radius:var(--r-md);font-size:12.5px;font-weight:500;font-family:var(--mono);letter-spacing:.01em;border:1px solid}
.cat i{width:14px;height:14px;display:inline-flex}
.cat i svg{width:100%;height:100%} /* the vendor marks carry only a viewBox */
.cat.purple{color:var(--cat-purple);background:rgba(196, 156, 255,.10);border-color:rgba(196, 156, 255,.22)}
.cat.orange{color:var(--cat-orange);background:rgba(251,146,60,.10);border-color:rgba(251,146,60,.22)}
.cat.emerald{color:var(--cat-emerald);background:rgba(52,211,153,.10);border-color:rgba(52,211,153,.22)}
.cat.blue{color:var(--cat-blue);background:rgba(104, 183, 255,.10);border-color:rgba(104, 183, 255,.22)}

.pill{display:inline-flex;align-items:center;gap:6px;height:24px;padding:0 10px;border-radius:var(--pill);font-family:var(--mono);font-size:11px;letter-spacing:.02em;border:1px solid var(--border);color:var(--muted);text-transform:uppercase}
.pill.live{color:var(--live);border-color:rgba(66, 209, 135,.3)}
.pill.live::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--live);box-shadow:0 0 8px var(--live)}
.pill.busy{color:var(--busy);border-color:rgba(242, 189, 79,.3)}
.pill.busy::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--busy)}
.pill.need{color:var(--danger);border-color:rgba(255, 107, 122,.3)}
.pill.need::before{content:"";width:6px;height:6px;border-radius:50%;background:var(--danger)}

.swatch{display:flex;flex-direction:column;gap:8px}
.swatch .chip{height:60px;border-radius:var(--r-md);border:1px solid var(--border)}
.swatch b{font-size:12px;font-weight:500}
.swatch code{font-family:var(--mono);font-size:11px;color:var(--faint)}

/* ============ CANVAS: lit column on a dark desk (signature) ============
   Every section is a full-bleed .hsec (its top hairline runs edge to edge)
   wrapping a .rail, the 1280 column that carries the page surface, the two
   signature hairline rails, and a vertical column grid. The grid is drawn per
   section but reads as one continuous field: vertical lines have no vertical
   phase, so a section boundary cannot break their alignment. The warm glow is
   the page's single light source and now fires once, on the hero, instead of
   restarting at the top of all thirteen sections. */
.rail{max-width:var(--shell);margin:0 auto;background:var(--bg);border-left:1px solid var(--rail);border-right:1px solid var(--rail);position:relative}
.rail::before{content:"";position:absolute;inset:0;pointer-events:none;background-image:var(--grid-cols);
  background-size:calc(100% + 1px) 100%} /* +1px pushes the 8th line past the right rail so the grid never doubles it */
#top .rail::before{background-image:var(--glow),var(--grid-cols);background-size:100% 100%,calc(100% + 1px) 100%}
.rail>*{position:relative}

/* ============ SURFACES ============
   Raised for components, sunken for what sits inside them, well for media.
   Nested surfaces never repeat the raised recipe — that is what keeps the page
   from reading as cards inside cards. */
.frame,.bento .cell,.compare .col,.price,.cta,.sess,.composer,.auth-card{
  background:var(--panel);border:1px solid var(--border);box-shadow:var(--edge),var(--lift)}
/* .price.feat used to sit here too. It doesn't any more: the featured tier is a polarity
   flip, not a lighter grey — see PRICING below. */
.compare .col.after{background:var(--panel-2);border-color:var(--input)}

.frame-inner,.usage-panel,.diff .dh{background:var(--well)}
/* only the panels that are links move on hover; static cards stay put */
a.frame,a.cell{transition:border-color .18s var(--ease),box-shadow .18s var(--ease),transform .18s var(--ease)}
a.frame:hover,a.cell:hover{border-color:var(--input);box-shadow:var(--edge),var(--lift-2);transform:translateY(-2px)}

/* ============ NAV ============ */
/* the bar is full-bleed, its contents are not: the padding resolves to the
   column edge + the 40px section gutter, so the brand sits on the same vertical
   as the hero headline on any screen wider than the shell */
.nav{position:sticky;top:0;z-index:100;display:flex;align-items:center;gap:26px;height:64px;padding:0 max(26px,calc((100% - var(--shell))/2 + 40px));border-bottom:1px solid var(--border-soft);background:var(--bg);
  transition:background-color .3s var(--ease),border-color .3s var(--ease)}
@supports (backdrop-filter:blur(1px)) or (-webkit-backdrop-filter:blur(1px)){
  .nav{background:rgba(10,10,10,.82);-webkit-backdrop-filter:blur(14px);backdrop-filter:blur(14px)} /* opaque --bg stays the fallback so scrolled content never bleeds through */
}
/* Over the hero the bar carries nothing, so the band reads to the top of the
   window; it takes its surface as you scroll off. Set by /js/nav-chrome.js and
   ONLY on pages that open with a full-bleed hero — the default state in the
   stylesheet is the opaque bar, so no JS means no transparent header over
   ordinary content. Higher specificity than the @supports rule above, so the
   blur goes with it whichever order they land in. */
.nav.is-top{background:transparent;border-bottom-color:transparent;
  -webkit-backdrop-filter:none;backdrop-filter:none}
.brand{display:flex;align-items:center;gap:9px;font-weight:600;font-size:15px;letter-spacing:-.02em}
/* The app's own mark (icons/icon.svg), not a mono "›_" set in a green box: the
   marketing site and the dashboard were shipping two different logos for one
   product, and only the box was ever the brand colour. The tile is full-bleed,
   so the radius here is what makes it read as an app icon.
   The rim is a box-shadow, never a border: the tile is a fixed 26px under
   box-sizing:border-box, so a border would eat 2px of the artwork and thin the
   green bar. The mark's screen bottoms out at #0d1210 against the bar's --bg,
   so without the rim it has no left, right or bottom edge — only the green title
   bar read. Lit from the same angle and by the same amount as --edge/--lift, so
   it sits on the bar like every other raised thing on the page. Its twin is
   .brand-logo in style.css; the two chromes already shipped different marks once. */
.brand .mk{width:26px;height:26px;border-radius:var(--r-md);display:block;flex:none;
  box-shadow:0 0 0 1px rgba(255,255,255,.24),0 1px 2px rgba(0,0,0,.6)}
.nav-links{display:flex;gap:4px;margin:0 auto}
.nav-links a{position:relative;font-size:13.5px;color:var(--muted);padding:7px 11px;border-radius:var(--r-md);
  transition:color .2s var(--ease)}
.nav-links a:hover{color:var(--text);background:var(--muted-surface)}
/* Where you are. Green is this system's selection colour, and a marker under
   the label is the one that survives the header going transparent — a filled
   chip would need a surface the bar does not have over the hero. Driven by
   aria-current from /js/nav-chrome.js, so the semantics and the styling are
   the same fact rather than a class repeating one. */
.nav-links a[aria-current]{color:var(--text)}
.nav-links a[aria-current]::after{content:"";position:absolute;left:11px;right:11px;bottom:1px;
  height:2px;border-radius:var(--r-xs);background:var(--link-rule)}
.nav-actions{display:flex;align-items:center;gap:12px}
.nav-actions .login{font-size:13.5px;color:var(--muted)}
.nav-actions .login:hover{color:var(--text)}
/* The phone menu. Below 900px the nine links used to be display:none with
   nothing in their place, and below 600px Log in and Start free went with
   them (the 2026-08-24 audit's P2-08): a phone got the brand and one button.
   One Menu control opens the same .nav-links as a panel under the bar (the
   links stay ONE set, tests/nav-squeeze.spec.js counts them), with the two
   auth links repeated inside it only where the bar has folded them. Driven
   by /js/nav-chrome.js (aria-expanded, Escape, focus); with no JS the button
   is inert and the links are reachable in the footer as before. */
.nav-menu-btn{display:none;align-items:center;justify-content:center;height:44px;min-width:44px;padding:0 12px;border:1px solid var(--border-soft);border-radius:var(--r-md);background:transparent;color:var(--text);font:inherit;font-size:13.5px;line-height:1;cursor:pointer}
.nav-menu-btn:hover{background:var(--muted-surface)}
.nav-menu-btn[aria-expanded="true"]{background:var(--muted-surface);color:var(--text)}
.nav-links .nav-menu-only{display:none}
/* Secondary pages: in the Menu panel, never on the bar. The bar holds the four
   a visitor is deciding with (Features, Pricing, Docs, Blog); the rest are in
   the panel and the footer. One rule for every page, so the header a visitor
   sees on /blog is the one they saw on /. */
.nav-links .nav-more{display:none}

/* ============ HERO ============
   Centred type over the warp canvas, then the marquee, then the run diagram —
   one section, three bands, all of it edge to edge.
   The hero is the ONE full-bleed band on this page. Everywhere else the lit
   column earns its keep by framing a measure of text; here it would be cutting
   its own hairlines and 12.5% grid straight through a diagram whose panels
   carry their own borders, which is why the column resumes at #compare and not
   before. The rail stays in the markup to keep the type and the marquee on the
   page's measure — it just paints nothing. */
.hsec-hero{background:var(--bg);overflow:hidden}
.hsec-hero .rail{background:transparent;border-left:0;border-right:0}
.hsec-hero .rail::before{content:none}
.hero{padding:84px 40px 40px;max-width:820px;margin:0 auto;text-align:center;display:flex;flex-direction:column;align-items:center}
.hero h1{font-size:clamp(2.6rem,5.6vw,4.25rem);letter-spacing:-.035em}
.hero h1 em{font-style:normal;color:var(--text);text-decoration:underline;text-decoration-color:rgba(255,255,255,.30);text-decoration-thickness:.055em;text-underline-offset:.14em} /* emphasis = full white + hairline rule, no hue */
.hero .lede{margin-top:20px;font-size:16.5px;color:var(--muted);max-width:60ch;line-height:1.5}
.hero .actions{margin-top:30px;display:flex;gap:12px;flex-wrap:wrap;justify-content:center}
.hero .note{margin-top:14px;font-family:var(--mono);font-size:11.5px;color:var(--faint)}
/* the down-arrow twin of .btn .arrow: nudges toward the demo it points at */

/* the rule under "One console." fades in once the words have landed.
   text-decoration-color, not a pseudo — the em wraps on phones. */
@keyframes heroRule{from{text-decoration-color:transparent}}
.rv-on .hero h1 em{animation:heroRule 1.1s var(--ease) .95s both}
/* …then a console cursor takes over from the rule: a block caret blinks three
   times after "One console." and leaves. A ::after with content:'' so the
   headline text — the LCP candidate — is never hidden or retyped, and the
   caret sits outside the em, so it never joins the underline. Base opacity 0
   and no fill mode: invisible before its delay and after its last blink. The
   global reduced-motion kill at the foot of this sheet matches elements, not
   pseudo-elements, so this one carries its own motion guard. */
.hero h1 em::after{content:'';display:inline-block;width:.22em;height:.72em;
  margin-left:.14em;vertical-align:-.04em;background:var(--text);opacity:0}
@keyframes heroCaret{0%,15.9%{opacity:1}16%,32.9%{opacity:0}33%,48.9%{opacity:1}
  49%,65.9%{opacity:0}66%,82.9%{opacity:1}83%,100%{opacity:0}}
@media (prefers-reduced-motion:no-preference){
  .rv-on .hero h1 em::after{animation:heroCaret 2.6s linear 1.9s}
}

/* ---- the warp canvas ----
   Decorative depth behind the type: /js/hero-warp.js paints it, 'lighten' so it
   can only ever add light to the near-black column, never darken a glyph.
   TWO masks, intersected, and they are the whole reason it stays a background:
   one fades it out before it reaches the marquee, the other holds a corridor
   down the middle where the headline and lede sit. The script thins the centre
   too, but only per strip — a wide one near the camera can still straddle the
   middle, and a mask cannot miss it. */
.hero-warp{position:absolute;inset:0 0 auto 0;width:100%;height:min(700px,92%);
  z-index:0;pointer-events:none;mix-blend-mode:lighten;opacity:.85;
  -webkit-mask-image:linear-gradient(180deg,#000 0%,#000 42%,transparent 96%),
    linear-gradient(90deg,#000 0,#000 calc(50% - 680px),rgba(0,0,0,.12) calc(50% - 420px),
      rgba(0,0,0,.12) calc(50% + 420px),#000 calc(50% + 680px),#000 100%);
  mask-image:linear-gradient(180deg,#000 0%,#000 42%,transparent 96%),
    linear-gradient(90deg,#000 0,#000 calc(50% - 680px),rgba(0,0,0,.12) calc(50% - 420px),
      rgba(0,0,0,.12) calc(50% + 420px),#000 calc(50% + 680px),#000 100%);
  -webkit-mask-composite:source-in;mask-composite:intersect}

/* ============ HERO RUN DIAGRAM ============
   A staged Termdeck run, laid out as the architecture it runs on: the engine's
   own transcript on the left, the session in the middle, the permission gate
   and the machine link on the right, the rest of the fleet underneath. The
   panels are placed on a percentage grid (--x is a centre line, --y a top edge)
   so the whole board reflows with the column instead of needing a fixed width.
   /js/hero-orchestrator.js only adds state classes and text — with no JS this
   is a still diagram, which is a perfectly good illustration on its own. */

/* On the page's own column, framed like every section below it — the board's
   own section supplies the rule above it, so nothing here draws one. */
.horc{position:relative;height:620px;padding-top:44px}
/* The gutter lives here, not on .horc: absolute percentages resolve against the
   padding box, so padding on the parent would leave the outer panels flush with
   the rail's hairlines and clip their own borders. 40px is the page's inner
   gutter, so the panels sit on the same margin as every other section's copy. */

/* Opaque, not translucent: the rail's 12.5% column grid runs behind this
   section like every other, and it should show in the gaps BETWEEN panels the
   way it does between cards elsewhere — not through their contents. */

/* A panel that has already had its moment keeps a trace of it rather than
   snapping back to inert — otherwise the board forgets the run as it goes. */

/* the transcript: one row per turn already appended to the jsonl */

.hd-row{display:grid;grid-template-columns:44px 1fr auto;gap:8px;align-items:baseline;
  padding:6px 8px;border:1px solid rgba(255,255,255,.05);font-size:10.5px;
  animation:hdIn .34s var(--ease) both}
@keyframes hdIn{from{opacity:0;transform:translateY(-4px)}}
.hd-kind{color:var(--faint);text-transform:uppercase;letter-spacing:.04em;font-size:9px}
.hd-label{color:var(--muted);overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
.hd-size{color:rgba(255,255,255,.28)}
.hd-row.is-fresh{border-color:rgba(255,255,255,.16)}
.hd-row.is-fresh .hd-label{color:var(--text)}

/* the CTA panel is the one thing in here you can click, so it never dims */

/* the permission gate */

/* Go-Is-Green: while the run is actually parked on this prompt the panel
   depicts the app, where the one filled action is green and it pulses. */

@keyframes hpcWait{50%{box-shadow:0 0 0 4px rgba(66, 209, 135,.16)}}

/* the machine link */

/* the run's settings */

/* ---- the session card ----
   The one thing on the board that is a Termdeck screen rather than a diagram
   of one, so it gets the rounded, lit treatment the rest deliberately lacks.
   --tint is the running engine's mark colour; it is the only hue in here. */

.hcard-item{animation:hciIn .3s var(--ease) both;opacity:.42;transition:opacity .35s var(--ease)}
.hcard-item.is-current{opacity:1}
@keyframes hciIn{from{opacity:0;transform:translateY(9px)}}
.hcard-item.is-user{align-self:flex-end;max-width:86%;padding:10px 14px;border-radius:var(--r-lg);
  background:var(--muted-surface);color:var(--text);font-size:13.5px;line-height:1.5}
.hcard-item.is-assistant{font-size:14px;line-height:1.55;color:var(--text)}
.hci-tool{display:inline-flex;align-items:center;gap:5px;font-family:var(--mono);
  font-size:11.5px;letter-spacing:.02em;color:var(--faint)}
.hci-tool svg{width:11px;height:11px;flex:none}
/* the running tool call gets the sweep the app uses for a live one */
.hcard-item.is-tool.is-current .hci-tool{color:transparent;background-clip:text;-webkit-background-clip:text;
  background-image:linear-gradient(90deg,rgba(255,255,255,.3) 0%,rgba(255,255,255,.75) 42%,#fff 50%,rgba(255,255,255,.75) 58%,rgba(255,255,255,.3) 100%);
  background-size:220% 100%;animation:hciSweep 2s var(--ease) infinite}
.hcard-item.is-tool.is-current .hci-tool svg{color:var(--text)}
@keyframes hciSweep{from{background-position:120% 0}to{background-position:-120% 0}}
.hcard-item.is-thinking{display:flex;gap:5px;align-items:center;opacity:1}
.hcard-item.is-thinking i{width:5px;height:5px;border-radius:50%;background:var(--tint);
  animation:hciDot 1.4s var(--ease) infinite}
.hcard-item.is-thinking i:nth-child(2){animation-delay:.2s}
.hcard-item.is-thinking i:nth-child(3){animation-delay:.4s}
@keyframes hciDot{0%,100%{opacity:.3;transform:scale(.8)}50%{opacity:1;transform:scale(1)}}

/* ---- the wires ----
   Drawn from the end nearest the card outward, which is the direction the work
   actually travels. ::before is the soft halo under the hairline. */

/* ---- the rest of the fleet ---- */

.hfm-bar{margin-top:9px;height:3px;background:rgba(255,255,255,.07);overflow:hidden}
/* --fill is a 0..1 scale, not a width: the fill is a transform so it runs on
   the compositor and never relays out the card it sits in. */
.hfm-bar i{display:block;height:100%;width:100%;background:var(--muted);
  transform:scaleX(var(--fill,0));transform-origin:left;
  transition:transform 1.1s var(--ease)}

/* ---- below the board's width, the same run as a plain column ----
   The absolute grid needs ~1120px. Under that the board stops being a board:
   the card, the permission gate and the machine link stack, and the panels that
   were context (the transcript, the settings, the fleet) drop out. Phones are
   half the point of this product, so the mobile fallback is the session and the
   approval — not a hidden diagram and an apology. */
/* Stacked, the diagram keeps the page's gutter (40px, then 20px at 600px and
   below, like .sec-head and .video-frame): it had its own 20px / 14px, a step
   the film stacked directly above it made plain. */
@media (max-width:1120px){
  .horc{height:auto;width:100%;border-top:0;display:flex;flex-direction:column;gap:12px;
    margin-top:20px;padding:20px 40px 0}
  /* the board stops being a box so its children become .horc's flex items */

}
@media (max-width:640px){
  .hero{padding:56px 20px 32px}
  .horc{padding-top:16px}

}

/* framed screenshot — a raised panel holding a recessed media well */
.frame{display:block;border-radius:var(--r-xl);padding:6px}

/* fake app window for showcases */

/* ============ LOGO STRIP ============
   Static since 2026-08-03 (was a 30s marquee loop): the vendor marks sit still,
   centered, wrapping on narrow screens. The class names stay so the markup and
   the motion-gate history don't churn. */
.marquee{overflow:hidden;padding:26px 0}

.logo{display:flex;align-items:center;gap:11px;white-space:nowrap;color:var(--muted);opacity:.85;transition:opacity .2s,color .2s}
.logo:hover{opacity:1;color:var(--text)}
.logo svg{width:21px;height:21px;flex-shrink:0}
.logo b{font-size:16px;font-weight:600;letter-spacing:-.02em}

/* ============ FEATURE SHOWCASE (sticky list + panel) ============ */

/* ============ BENTO ============ */
.bento{display:grid;grid-template-columns:repeat(2,1fr);gap:16px;padding:48px 40px}
.bento .cell{border-radius:var(--r-lg);padding:24px;min-height:210px;display:flex;flex-direction:column}
.bento .cell.wide{grid-column:span 2}
.bento .idx{font-family:var(--mono);font-size:11px;color:var(--faint);margin-bottom:auto}
.bento h3{font-size:19px;margin:18px 0 8px}
.bento .cell>p{font-size:13.5px;color:var(--muted);max-width:44ch}

/* ---- the live fleet: the page's one authored sequence ----
   The board runs six beats, one state change each, ending on the board it
   started from. States are the app's own signal set: amber working, red waiting
   on you, green attached, grey finished. Nothing here reports progress, because
   a turn has no percentage — working shows as an indeterminate run line, the way
   the terminal shows it. The markup ships the resting board, so a reader with
   reduced motion, a failed script, or no JS sees the same honest state. */

 /* the word that swaps on a beat */

/* .in is set by the observer, so every loop below is dead weight off screen */

@keyframes runline{from{transform:translateX(-100%)}to{transform:translateX(294%)}}
@keyframes needring{0%{box-shadow:0 0 0 0 rgba(255, 107, 122,.45)}70%,100%{box-shadow:0 0 0 5px rgba(255, 107, 122,0)}}

/* ---- bento vignettes, staged like the hero (2026-08-03) ----
   The four small cells act out their claims: a push banner drops in, a diff
   paints its remove-then-add, terminal panes tile in, allowlist rows cascade.
   All one-shot behind .rv-in; the wide cell's fleet board keeps the page's
   only loop. Resting markup is complete for no-JS and reduced motion. */
.bento .bv{margin-top:16px}

.bento .diff .dh{padding:7px 11px;font-size:11px}
.bento .diff pre{padding:9px 11px;font-size:11px;line-height:1.6}
.diff .ctx{display:block}

/* .tpane has always said overflow:hidden, which is a truncation it could not
   actually perform: text-overflow does nothing on a flex container, and the
   bare text node was an anonymous flex item with no box to hang an ellipsis
   on. So the narrowest pane hard-clipped mid-word, which reads as a rendering
   fault rather than a label that ran out of room. min-width:0 lets the span
   shrink past its own min-content; nowrap it inherits from .tpane. */

.rule{display:flex;align-items:center;justify-content:space-between;gap:10px;background:var(--sunken);border:1px solid var(--border-soft);border-radius:var(--r-md);padding:6px 11px}
.rule code{background:none;padding:0;font-size:11.5px;color:var(--muted)}
@media (prefers-reduced-motion:no-preference){

  .rv-on .cell.rv-in .diff .del{animation:vinLine .4s var(--ease) .55s both}
  .rv-on .cell.rv-in .diff .add{animation:vinLine .4s var(--ease) .75s both}

  .rv-on .cell.rv-in .rule{animation:vinLine .45s var(--ease) both}
  .rv-on .cell.rv-in .rule:nth-child(1){animation-delay:.45s}
  .rv-on .cell.rv-in .rule:nth-child(2){animation-delay:.55s}
  .rv-on .cell.rv-in .rule:nth-child(3){animation-delay:.65s}
}
@keyframes pushIn{from{opacity:0;transform:translateY(-10px)}} /* a push arrives from the top, the way a real banner does */
@keyframes vinLine{from{opacity:0;transform:translateY(5px)}}
@keyframes paneIn{from{opacity:0;transform:scale(.96)}}

/* ============ STEPS + STAT ============ */
.steps{display:grid;grid-template-columns:auto repeat(3,1fr);gap:34px;padding:52px 40px;align-items:start}

.step h3{font-size:17px;margin:12px 0 8px}
.step p{font-size:13.5px;color:var(--muted)}
/* ---- how-it-works vignettes, staged like the rest (2026-08-04) ----
   Sunken mono rows in the app's grammar: green dot = online, emerald check =
   signed in, amber = a turn in flight, and the one green fill is the send.
   Rows cascade one-shot after their step lands; nothing loops. */

/* ============ STATS ROW ============ */
/* a recessed readout strip, not a card — data rows and cards read differently */
.stats{display:grid;grid-template-columns:repeat(4,1fr);margin:26px 40px 52px;border:1px solid var(--border-soft);border-radius:var(--r-lg);background:var(--sunken);overflow:hidden}
.stat{padding:30px 24px;border-left:1px solid var(--border-soft)}
.stat:first-child{border-left:0}
.stat .v{font-size:clamp(1.9rem,3.4vw,2.6rem);font-weight:600;letter-spacing:-.03em;font-variant-numeric:tabular-nums}
.stat .l{margin-top:8px;font-size:12.5px;color:var(--muted)}

/* ============ TESTIMONIAL ============ */

/* ============ PRICING ============ */
.pricing-head{text-align:center;padding:56px 40px 14px}
.pricing-head h2{font-size:var(--step);margin:14px 0}
.pricing-head p{color:var(--muted);max-width:52ch;margin:0 auto;font-size:15.5px}
.pricing{display:grid;grid-template-columns:repeat(3,1fr);gap:16px;padding:26px 40px 40px}
.pricing.two{grid-template-columns:repeat(2,minmax(0,1fr));max-width:760px;margin:0 auto;padding:26px 40px 20px}
.price{border-radius:var(--r-lg);padding:24px;display:flex;flex-direction:column}
.price .pn{font-size:16px;font-weight:600}
.price .pd{font-size:13px;color:var(--faint);margin-top:6px;min-height:34px}
.price .amt{font-size:clamp(2.2rem,4vw,3rem);font-weight:600;letter-spacing:-.03em;margin:16px 0 2px}
.price .amt small{font-size:13px;font-weight:400;color:var(--faint);letter-spacing:0}
.price .unit{font-family:var(--mono);font-size:11px;color:var(--faint);margin-bottom:18px}
.price ul{list-style:none;display:flex;flex-direction:column;gap:11px;padding:18px 0;border-top:1px solid var(--border-soft);margin-bottom:20px}
.price li{display:flex;gap:10px;font-size:13.5px;color:var(--muted);align-items:flex-start}
/* the checkmark tile from the hero's proof list — one grammar for "you get this" */
.price li svg{width:20px;height:20px;padding:4px;background:var(--sunken);border:1px solid var(--border-soft);border-radius:var(--r-md);color:var(--cat-emerald);flex-shrink:0;margin-top:0}
.price .btn{margin-top:auto;justify-content:center}

/* ---- the featured tier: THE POLARITY FLIP (DESIGN.md § Pricing tiers) ----
   The reference system marks its featured tier by inverting it — dark fill, light text,
   against a white page. Inverted for a near-black page, that is the opposite move: a
   near-white fill with near-black text. White is already this system's identity accent
   (--primary), so this is the strongest single gesture the palette allows, and exactly
   one tier per table gets it — the same discipline as one filled action per view.
   It replaces `background:var(--panel-2)`, which on a dark page is the same card in a
   slightly different grey and does not read as featured at all.

   The flip is done by REDECLARING this card's surface tokens rather than by restating a
   colour on every child. Everything inside already spends --text, --muted, --faint,
   --border-soft, --sunken, --edge, --primary and --ring, so one local block turns the
   whole subtree over at once and anything added to the card later inherits the flip for
   free. The greys are the dark card's own contrast ladder mirrored, not merely legal
   ones: 17.48 / 7.06 / 5.36 on the dark card's #151516 becomes 15.73 / 6.51 / 5.31 on
   --primary, so the three tiers read at the same three strengths. Those numbers moved
   with the palette swap: the ground was the literal #ededed and is the token now, which
   resolves to #a3e9bd, so every ratio here was remeasured rather than carried over. */
.price.feat{
  /* --workspace-accent and NOT var(--primary), even though :root maps one to the
     other. --primary is REDECLARED five lines down, and custom properties on one
     element resolve against that element's final value for the name, not against
     the declaration order in the block. Pointing --feat-ground at --primary here
     therefore resolved it to --feat-ink and painted the featured card near-black:
     caught by tests/pricing-tiers.spec.js, which pins the ground. */
  --feat-ground:var(--workspace-accent);     /* the identity accent, as a ground */
  --feat-ink:var(--workspace-primary-fg);    /* 15.83:1 on it */
  --text:var(--feat-ink);                    /* .pn, .amt, inherited, so set on the card */
  --muted:#4f4f4f;                           /*  6.51:1, .price li */
  --faint:#5c5c5c;                           /*  5.31:1, .pd, .amt small, .unit */
  --border:rgba(0,0,0,.14);                  /* the card's own edge */
  --border-soft:rgba(0,0,0,.10);             /* the ul rule and the tick tiles — 1.25:1, the dark side's 1.19:1 mirrored */
  --sunken:rgba(0,0,0,.05);                  /* the tick tile ground */
  --primary:var(--feat-ink);                 /* the one filled action inverts WITH its card... */
  --primary-fg:var(--feat-ground);           /* ...so .btn-primary stays 15.8:1 either way */
  --edge:inset 0 1px 0 rgba(255,255,255,.55);/* same light, same angle: on a light ground the top edge is a sheen, not a white line */
  --bg:var(--feat-ground);                   /* :focus-visible is a two-stop ring whose inner stop is the ground it sits on */
  --ring:rgba(0,0,0,.45);                    /* 3.28:1 over the card */
  background:var(--feat-ground);color:var(--text);border-color:var(--border)}
/* The tick keeps its tile and loses its hue: --cat-emerald is 1.9:1 on #ededed, and the
   glyph carries "you get this" by shape, not by colour. Inside a flipped card the ink IS
   the accent. */
.price.feat li svg{color:var(--text)}
/* .btn-primary:hover goes to #fff, which on this card is a button that dissolves. */
.price.feat .btn-primary:hover{background:#000}

/* ---- pricing, staged like the hero (2026-08-03) ----
   Cards land on their rv stagger, each plan's checklist cascades in while the
   card settles, and the featured card's tag drops in last. One-shot only —
   the fleet board keeps the page's single loop. Resting state is complete for
   no-JS and reduced motion: every animation hides nothing until .rv-in lands. */
.price{position:relative}
.price .amt{font-variant-numeric:tabular-nums}
/* "Most popular" is a fact the reader did not ask for and cannot act on, which is exactly
   the soft info badge's job (DESIGN.md § Badges, § Pricing tiers). It used to wear
   --primary / --primary-fg — the near-white identity accent, i.e. the one fill this page
   reserves for its primary action — so a decorative label was dressed as a call to action
   it cannot honour: a Color-Is-Semantic violation. After the flip it would also have been
   #ededed on an #ededed card, and simply disappeared.
   Soft, never filled: filled is for a state someone has to act on.
   Opaque, never a tint: the badge straddles the card's top edge (top:-11px on a 22px box),
   so it is painted on two grounds at once and a translucent 14% would come out two-tone.
   See --info-soft / --info-line / --info-ink for what the bake is and why the ink deepens.
   Radius steps off --pill to --r-sm: a badge is a label, not a control, and a capsule is
   this page's shape for things you press. */
.price-tag{position:absolute;top:-11px;left:50%;transform:translate(-50%,0);display:inline-flex;align-items:center;height:22px;padding:0 11px;border-radius:var(--r-sm);background:var(--info-soft);border:1px solid var(--info-line);color:var(--info-ink);font-family:var(--mono);font-size:10.5px;font-weight:500;letter-spacing:.06em;text-transform:uppercase;white-space:nowrap}
@media (prefers-reduced-motion:no-preference){
  .rv-on .price.rv-in li{animation:planLine .45s var(--ease) both}
  .rv-on .price.rv-in li:nth-child(1){animation-delay:.30s}
  .rv-on .price.rv-in li:nth-child(2){animation-delay:.38s}
  .rv-on .price.rv-in li:nth-child(3){animation-delay:.46s}
  .rv-on .price.rv-in li:nth-child(4){animation-delay:.54s}
  .rv-on .price.rv-in li:nth-child(5){animation-delay:.62s}
  .rv-on .price.feat.rv-in .price-tag{animation:tagIn .5s var(--ease) .8s both}
}
@keyframes planLine{from{opacity:0;transform:translateY(6px)}}
@keyframes tagIn{from{opacity:0;transform:translate(-50%,7px)}}

/* ============ FAQ ============ */
.faq{display:grid;grid-template-columns:.85fr 1.15fr;gap:48px;padding:56px 40px}
 /* same rail as .feat-list, clears the 64px sticky nav */

/* Monthly/annual switch above the pricing cards (MONETIZATION.md Phase 5).
   Deliberately the SAME pill vocabulary as .faq-tab below rather than a new
   control: it is the page's existing "pick one of these" shape, and inventing a
   second one for the pricing section would make the two read as different kinds
   of choice when they are the same kind. Centred, because the cards it governs
   are. Hidden until pricing.js confirms this box can actually sell a year. */
.billing-toggle{display:flex;justify-content:center;gap:8px;margin:0 0 28px}
.billing-opt{height:34px;padding:0 16px;border-radius:var(--pill);border:1px solid var(--border);background:transparent;color:var(--muted);font-family:var(--sans);font-size:13px;cursor:pointer;transition:.16s}
.billing-opt:hover{color:var(--text);background:var(--sunken)}
.billing-opt.on{background:var(--primary);color:var(--primary-fg);border-color:var(--primary)}
.billing-opt [data-save]{opacity:.8}

/* ---- faq, staged like the rest (2026-08-04) ----
   Tabs pop in first, questions cascade after the panel lands. Tab filtering
   toggles display, which replays the cascade for the filtered set — that one
   is user-initiated and still one-shot per click. The accordion's own
   open/close motion above is untouched; nothing loops. */

/* ============ FINAL CTA ============
   The page opens on the hero glow and closes on the same light, this time
   contained by a panel so the last thing you scroll to is a component. */
.cta{position:relative;overflow:hidden;text-align:center;padding:72px 40px;margin:52px 40px;border-radius:var(--r-xl)}
.cta::before{content:"";position:absolute;inset:0;background:var(--glow);pointer-events:none}
.cta>*{position:relative}
.cta h2{font-size:var(--step);margin:14px 0}
.cta p{color:var(--muted);max-width:44ch;margin:0 auto 26px;font-size:16px}
.cta .actions{display:flex;gap:12px;justify-content:center;flex-wrap:wrap}
/* ---- final cta, staged like the rest (2026-08-04) ----
   The page's closing light TURNS ON as the panel lands (still the One-Light
   rule — same lamp, it just arrives), the copy cascades, and a "run finished"
   chip closes the story the hero's approval card opened. All one-shot. */

@media (prefers-reduced-motion:no-preference){
  .rv-on .cta.rv-in::before{animation:lampOn 1.4s var(--ease) both}
  .rv-on .cta.rv-in .kicker{animation:vinLine .5s var(--ease) .15s both}
  .rv-on .cta.rv-in h2{animation:vinLine .5s var(--ease) .25s both}
  .rv-on .cta.rv-in p{animation:vinLine .5s var(--ease) .35s both}
  .rv-on .cta.rv-in .actions{animation:vinLine .5s var(--ease) .45s both}

}
@keyframes lampOn{from{opacity:0}}

/* ============ FOOTER ============ */
.foot{padding:56px 40px 26px}
.foot-grid{display:grid;grid-template-columns:1.4fr repeat(5,1fr);gap:32px}
.foot .fb .brand{margin-bottom:14px}
.foot .fb p{font-size:13px;color:var(--muted);max-width:30ch;margin-bottom:16px}
.foot .socials{display:flex;gap:10px}
.foot .socials a{width:32px;height:32px;border-radius:var(--r-md);border:1px solid var(--border);display:grid;place-items:center;color:var(--muted)}
.foot .socials a:hover{color:var(--text);border-color:var(--input)}
.foot-col :is(h2,h3,h4){font-size:12px;font-family:var(--mono);letter-spacing:.06em;text-transform:uppercase;color:var(--faint);margin-bottom:14px;font-weight:500}
.foot-col a{display:block;font-size:13.5px;color:var(--muted);padding:5px 0}
.foot-col a:hover{color:var(--text)}
.foot-tm{margin-top:38px;padding-top:20px;border-top:1px solid var(--border-soft);font-size:11.5px;line-height:1.6;color:var(--faint);max-width:92ch}
.foot-tm h2{font-size:12px;font-family:var(--mono);text-transform:uppercase;letter-spacing:.06em;color:var(--faint);margin-bottom:8px;font-weight:500}
.foot-base{display:flex;justify-content:space-between;align-items:center;margin-top:20px;padding-top:20px;border-top:1px solid var(--border-soft);font-size:12.5px;color:var(--faint)}
.foot-base .ops{display:flex;align-items:center;gap:7px}
.foot-base .ops::before{content:"";width:7px;height:7px;border-radius:50%;background:var(--live);box-shadow:0 0 8px var(--live)}
.foot-base.in .ops::before{animation:opsBreath 3.4s var(--ease) infinite} /* the page's other live claim, breathing at rest */
@keyframes opsBreath{0%,100%{box-shadow:0 0 6px var(--live);opacity:.82}50%{box-shadow:0 0 13px var(--live);opacity:1}}
/* ---- footer, staged like the rest (2026-08-04) ----
   Brand block and the three columns cascade one-shot after the footer lands,
   with the trademark notice and baseline arriving last. The footer is a
   shared partial and this CSS ships in home.css, so every marketing page
   gets the identical chrome AND the identical entrance. The ops dot keeps
   its sanctioned breath; nothing else loops. */
@media (prefers-reduced-motion:no-preference){
  .rv-on .foot.rv-in .foot-grid>*{animation:vinLine .5s var(--ease) both}
  .rv-on .foot.rv-in .foot-grid>*:nth-child(1){animation-delay:.15s}
  .rv-on .foot.rv-in .foot-grid>*:nth-child(2){animation-delay:.25s}
  .rv-on .foot.rv-in .foot-grid>*:nth-child(3){animation-delay:.35s}
  .rv-on .foot.rv-in .foot-grid>*:nth-child(4){animation-delay:.45s}
  .rv-on .foot.rv-in .foot-grid>*:nth-child(5){animation-delay:.55s} /* the 5th column the grid always had a track for */
  .rv-on .foot.rv-in .foot-tm{animation:vinLine .5s var(--ease) .65s both}
  .rv-on .foot.rv-in .foot-base{animation:vinLine .5s var(--ease) .75s both}
}

/* ============ APP-SURFACE PREVIEW ============ */
.app-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:16px}
.sess{border-radius:var(--r-lg);padding:16px;display:flex;flex-direction:column;gap:11px}
.sess .top{display:flex;align-items:center;gap:8px}
.sess .eng{width:24px;height:24px;border-radius:var(--r-md);display:grid;place-items:center;font-family:var(--mono);font-size:11px;font-weight:500}
.sess .eng.claude,.acct-av.claude{background:#d97757;color:#1a0e08}
.sess .eng.codex,.acct-av.openai{background:var(--primary);color:var(--primary-fg)}
.sess .eng.grok{background:#111;color:#fff;border:1px solid var(--border)}
.sess .title{font-size:14px;font-weight:500}
.sess .path{font-family:var(--mono);font-size:11px;color:var(--faint)}
.sess .foot{display:flex;justify-content:space-between;align-items:center;font-family:var(--mono);font-size:11px;color:var(--faint)}
.composer{border-radius:var(--r-xl);padding:14px 16px;display:flex;flex-direction:column;gap:12px}
.composer .ta{font-family:var(--mono);font-size:13px;color:var(--muted);min-height:44px}

.composer .send{margin-left:auto}
.diff{border:1px solid var(--border);border-radius:var(--r-md);overflow:hidden;font-family:var(--mono);font-size:12px}
.diff .dh{display:flex;justify-content:space-between;padding:9px 12px;border-bottom:1px solid var(--border-soft);color:var(--muted)}
.diff pre{padding:12px;line-height:1.6;color:var(--muted);overflow-x:auto}
.diff .add{color:var(--live);background:rgba(66, 209, 135,.08);display:block}
.diff .del{color:var(--danger);background:rgba(255, 107, 122,.08);display:block}

/* ============ RESPONSIVE ============ */
/* The nav's squeeze band. .nav-links only disappears at 900px, so between there and
   ~1060px the full row — brand + every link + three actions — has to fit on one line,
   and it does not: at 901px the 7-link nav already pushed 10px of horizontal scroll onto
   the whole page, and adding /about took that to 72px. Nothing wraps (the row is flex
   with no wrap), so the overflow is invisible on a wide monitor and shows up only as a
   page that scrolls sideways on a small laptop. Buy the width back from padding and the
   nav's own gap instead of dropping a link. Must precede the 900px block: below 900 the
   links are display:none and these rules are moot, but the narrower query has to win. */
@media(max-width:1060px){
  .nav{gap:16px}
  .nav-links a{padding:7px 7px}
  /* The sign-up pill gives back its 4px of extra side padding here. Linear's
     8/16 is what it wears where there is room; inside the squeeze band it drops
     to .btn-sm's 12 like every other button, because 8px of chrome is 8px the
     nine links do not have. tests/nav-squeeze.spec.js measured the pill spending
     more than the budget had left at 941px. */
  .btn.btn-signup{padding:0 12px}
}
/* The last of that budget, spent by /docs. Nine links no longer clear 901px on
   padding alone (39px short, measured), so the bottom of the band also gives up
   the link gap and 0.5px of tracking. Scoped to 940px so the type stays at its
   designed metrics everywhere it fits, and so the next reader knows the room ran
   out here rather than finding it quietly narrower at 1280. Past this, a tenth
   link means dropping one instead — tests/nav-squeeze.spec.js is the gate. */
@media(max-width:940px){
  .nav{gap:12px}
  .nav-links{gap:0}
  .nav-links a{padding:7px 6px;letter-spacing:-.015em}
}
@media(max-width:900px){
  .hero,.showcase,.faq,.foot-grid{grid-template-columns:1fr}
  .pricing,.stats,.tstis,.steps{grid-template-columns:1fr}
  /* minmax(0,…), not 1fr — same reason .u-metrics gives further down. `1fr` is
     minmax(AUTO,1fr), and that auto floor is the track's min-content, so one
     unbreakable child sets the width of the whole column. The approvals cell
     holds .pushrow, whose notification line is white-space:nowrap with an
     ellipsis ready for exactly this: at 320px its min-content is 273px, the
     track grew to 319 to seat it, and the ellipsis never fired — the page got
     20px of horizontal scroll instead. Flooring the track at 0 hands the row a
     definite width to shrink into, which is the truncation .push-tx already
     asked for with min-width:0. */
  .bento{grid-template-columns:minmax(0,1fr)}
  .bento .cell.wide{grid-column:auto} /* a span-2 child manufactures a 2nd implicit track even at 1fr */
  .stat,.tstis .t{border-left:0;border-top:1px solid var(--border-soft)}
  .stat:first-child,.tstis .t:first-child{border-top:0}
  .pricing.two{grid-template-columns:1fr} /* 0-2-0, must restate or the base rule keeps 2 cols */

  :root{--grid-cols:repeating-linear-gradient(90deg,transparent 0 calc(25% - 1px),var(--grid) calc(25% - 1px) 25%)} /* 8 columns is a mesh on a phone; drop to 4 */
  .nav-links{display:none}
  .nav-actions{margin-left:auto} /* .nav-links carried the auto margin; it is hidden here */
  .nav-menu-btn{display:inline-flex}
  /* Open, the links are a panel under the bar: the bar's own surface (never
     the transparent-over-hero state, which the panel would be unreadable on),
     one link per row at the tap floor. */
  .nav.menu-open .nav-links{display:flex;flex-direction:column;gap:2px;position:absolute;top:100%;left:0;right:0;margin:0;padding:8px 16px 16px;background:var(--bg);border-bottom:1px solid var(--border-soft);box-shadow:0 12px 24px rgba(0,0,0,.35)}
  .nav.menu-open .nav-links a{display:flex;align-items:center;min-height:44px;padding:0 11px;font-size:15px;letter-spacing:0}
  /* The auth duplicates only exist for the band where the bar has folded its
     own (the 600px block below re-shows them there); everywhere else in this
     range the bar still carries Log in and Start free, so the panel must not
     say them twice. Element+classes, to outweigh the row rule above. */
  .nav.menu-open .nav-links a.nav-menu-only{display:none}
  .nav.menu-open .nav-links a.nav-more{display:flex}
  .nav.menu-open .nav-links a[aria-current]::after{display:none} /* the scroll-spy underline is a bar affordance, not a list one */

}
@media(max-width:600px){
  .nav{gap:12px;padding:0 16px}
  .nav-actions{gap:8px}
  /* One nav CTA on a phone. It used to be the sign-up that survived, because the
     sign-up was the filled one; the Linear pass swapped which button carries the
     fill, so it is the sign-up that folds now. Both are still reachable in the
     hero and the footer, and /dashboard has to stay because tests/vs-pages.spec.js
     asserts a phone can reach it from the header. */
  .nav-actions .login,.nav-actions .btn-signup{display:none}
  /* ...and they come back inside the menu, where the bar folded them; the
     button itself goes to its glyph so the bar still fits a 320px screen. */
  .nav.menu-open .nav-links a.nav-menu-only{display:flex;border-top:1px solid var(--border-soft);margin-top:6px;padding-top:6px}
  .nav.menu-open .nav-links a.nav-menu-only + a.nav-menu-only{border-top:0;margin-top:0;padding-top:0}
  .nav-menu-btn{width:44px;padding:0;font-size:0}
  .nav-menu-btn::before{content:"\2630";font-size:18px;line-height:1}
  .btn,.btn-sm{height:auto;min-height:44px;padding-top:6px;padding-bottom:6px}

   /* 3 tracks clip the agent paths below ~600px */
}
/* The 320px floor: brand + Open Termdeck + Menu ran 5px past it at the 600px
   block's metrics. The bar's padding and gaps give the width back; nothing is
   dropped. */
@media(max-width:360px){
  .nav{gap:8px;padding:0 12px}
  .nav-actions{gap:6px}
  .nav-actions .btn-ghost.btn-sm{padding:0 10px}
}
@media(prefers-reduced-motion:reduce){*{animation:none!important;transition:none!important}}

/* ============ USAGE ============ */
.usage{padding:24px;max-width:1400px}
.usage h1{font-size:22px;font-weight:600;letter-spacing:-.03em;margin-bottom:4px}
.usage .lead{color:var(--muted);font-size:13px;margin-bottom:20px;font-family:var(--mono)}
.u-metrics{display:grid;grid-template-columns:repeat(4,1fr);gap:12px;margin-bottom:14px}
 /* the accent border-top per metric is inline in the markup */

/* the bars grow when you arrive at the chart, not four screens earlier. growBar
   was referenced here for weeks without ever being defined, so the entrance has
   never actually run; bars stay at full height when the observer never fires. */

@keyframes growBar{from{transform:scaleY(.04);opacity:.3}to{transform:scaleY(1);opacity:1}}

/* ---- usage showcase, staged like the rest (2026-08-04) ----
   The metric tiles cascade in after the framed panel lands, and the peak bar
   names its number once the bars have grown. The chart and model-mix
   entrances above already run on the .in observer; everything stays one-shot
   and the resting panel is complete for no-JS and reduced motion. */

@keyframes peakTag{from{opacity:0;transform:translate(-50%,4px)}}

/* the model mix arrives with the chart beside it, so the panel reads as one
   readout waking up rather than half a panel moving. scaleX, never width. */

@keyframes sweepIn{from{transform:scaleX(0)}to{transform:scaleX(1)}}

/* ---- homepage structural helpers ---- */
.hsec{position:relative;border-top:1px solid var(--border-soft)}
main>.hsec:first-child{border-top:0} /* :first-of-type also matched the footer, which is the only <footer> */
/* ---- links wear one mark ----
   The rule under a link is brand green, the same green as the ›_ chip, and
   nothing else on this page uses it. That keeps it clear of the status greens:
   --live means a session is running, this means you can act on it. Text stays
   monochrome, so the colour lives entirely in the 1px rule. Thickness is fixed
   rather than auto so the rule stays hairline inside a 19px heading too. */
.engine-link{color:var(--muted);text-decoration:underline;text-decoration-color:var(--link-rule);text-decoration-thickness:1px;text-underline-offset:.16em;text-decoration-skip-ink:auto;transition:color .15s,text-decoration-color .15s}
.engine-link:hover{color:var(--text);text-decoration-color:var(--brand-green-400)}
/* in a heading the heading owns the colour: muted link text inside a white
   headline reads as words that got dimmer, not as links. The rule alone marks
   them, which is the whole point of putting the colour in the rule. */
:is(h1,h2,h3) .engine-link{color:inherit}
:is(h1,h2,h3) .engine-link:hover{color:inherit;text-decoration-color:var(--brand-green-400)}
/* inside a category pill the pill's hue owns the link; a third colour in a chip
   that small reads as a mistake */
.cat .engine-link{color:inherit;text-decoration-color:color-mix(in srgb,currentColor 45%,transparent)}
.cat .engine-link:hover{color:inherit;text-decoration-color:currentColor}
/* footer columns are navigation, not prose: the rule arrives on hover */
.foot-col a{text-decoration:underline;text-decoration-color:transparent;text-decoration-thickness:1px;text-underline-offset:.16em;transition:color .15s,text-decoration-color .15s}
.foot-col a:hover{color:var(--text);text-decoration-color:var(--brand-green-400)}
code{font-family:var(--mono);font-size:.86em;background:var(--muted-surface);padding:1px 5px;border-radius:var(--r-sm)}

.compare{display:grid;grid-template-columns:1fr 1fr;gap:16px;padding:52px 40px;position:relative}
.compare .col{border-radius:var(--r-lg);padding:24px}
.compare .col h3{font-size:14px;font-family:var(--mono);font-weight:500;text-transform:uppercase;letter-spacing:.06em;color:var(--faint);margin-bottom:14px}
.compare .col.after h3{color:var(--text)}
.compare ul{list-style:none;display:flex;flex-direction:column;gap:11px}
.compare li{display:flex;gap:10px;font-size:14px;color:var(--muted);align-items:flex-start}
/* the same sunken icon tiles as the hero and pricing — one "have / lack" grammar */
.compare li svg{width:20px;height:20px;padding:4px;background:var(--sunken);border:1px solid var(--border-soft);border-radius:var(--r-md);flex-shrink:0;margin-top:0}
.compare .before li svg{color:var(--faint)}
.compare .after li svg{color:var(--cat-emerald)}
/* ---- compare, staged like the rest (2026-08-04) ----
   The pains cascade in first, the answers trail on the after column's own rv
   delay, and a VS marker floats on the seam. All one-shot; nothing loops. */
.compare::after{content:"VS";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);width:34px;height:34px;border-radius:50%;background:var(--panel-2);border:1px solid var(--border);display:grid;place-items:center;font-family:var(--mono);font-size:10px;letter-spacing:.08em;color:var(--muted);box-shadow:var(--edge),var(--lift)}
@media(max-width:900px){.compare::after{display:none}} /* stacked columns have no seam */
@media (prefers-reduced-motion:no-preference){
  .rv-on .compare .col.rv-in li{animation:vinLine .45s var(--ease) both}
  .rv-on .compare .col.rv-in li:nth-child(1){animation-delay:.3s}
  .rv-on .compare .col.rv-in li:nth-child(2){animation-delay:.38s}
  .rv-on .compare .col.rv-in li:nth-child(3){animation-delay:.46s}
  .rv-on .compare .col.rv-in li:nth-child(4){animation-delay:.54s}
}

/* A screenshot sits in the same raised-panel-over-media-well seat the film
   uses: same .frame recipe, same --r-md inner radius, so the two pieces of
   media on this page read as one treatment rather than two. The intrinsic
   width/height on the <img> reserve the box, so nothing below it moves when
   the bytes land. */

/* PANNING THE SHOT ON A TOUCH SCREEN
   This one picture is a desktop canvas four windows wide. Fit to a 390px
   viewport it renders at a fifth of capture scale, which is texture, not
   information — you can see that there are four sessions and read nothing in
   any of them. So at touch widths it stops shrinking and starts panning: the
   well scrolls sideways and the image holds a floor of 1000px, about 0.6 of
   capture scale, which is the point where the transcript type comes back.
   1000px, not more: width drives the box and height follows the ratio, so
   every pixel of extra scale is also a taller block on a short screen. At the
   floor the frame is ~595px — most of a phone, which a deliberate media moment
   can spend, and not more than one.
   max(100%, …) rather than a flat width because the floor has to lose to the
   container once the container is wider: a fixed 1000px would leave a strip of
   bare well beside the image between 900px and the breakpoint.
   overflow-y stays hidden, which is what keeps a vertical swipe scrolling the
   page rather than being eaten here, and overscroll-behavior-x:contain stops a
   pan that reaches the end from turning into the browser's back gesture.
   The image's own radius goes with it: .frame-inner already clips to 15px, and
   a rounded corner arriving mid-pan reads as a rendering fault.
   900px is the boundary because it is where the two treatments cross: below
   it, fit-to-width renders smaller than the panned floor does. */
@media(max-width:900px){

  /* An image that overflows its box says "there is more" only if you notice
     the cut. Say it in words too — this is the one place on the page where a
     reader has to do something to see the content. */

}
/* height:auto lets the intrinsic 1920x1080 from the width/height attrs drive
   aspect-ratio, so the player reserves its box before metadata loads (no CLS) */

/* .frame-inner clips its media (overflow:hidden), which also clipped the page's
   4px-outset focus ring, so the player's first Tab stop showed no focus at all.
   Drawn inside the video instead. */

/* Side by side, the diagram's panels already sit 44px plus 7% below .horc's top,
   so the film's usual 52px bottom margin left a 136px hole above them. Stacked
   (1120px and below) the diagram starts flush and the margin is right as it is. */
/* The Bunny Stream iframe has no intrinsic ratio, so the same no-CLS seat is
   declared here; black backfills the box until the lazy player document lands */

/* ---- the long-tail grid (#everything-else). Every value is an existing rung:
   the bento's 16px gap and 40px gutter, the shot-frame caption register one
   size down. Tiles reuse the .frame recipe untouched: one media treatment per
   page. */

@media(max-width:900px){.compare{grid-template-columns:1fr}}
/* phone gutters — same trailing-block rule as below: the section paddings are
   declared at the end of this file, so an earlier media query would lose */
@media(max-width:600px){
  .hero-phone{right:-6px;bottom:-16px;width:206px}
  .hero,.compare,.bento,.steps,.faq,.sec-head,.pricing-head,.pricing,.pricing.two,.usage-wrap,.foot{padding-left:20px;padding-right:20px}

  .horc,.horc-fleet{padding-left:20px;padding-right:20px}
  .stats{margin:22px 20px 36px}
  .cta{margin:36px 20px;padding:56px 20px}
}
/* usage-panel mobile reflow — must sit after the .u-* rules above, media queries add no specificity */
@media(max-width:640px){
  .u-metrics{grid-template-columns:repeat(2,minmax(0,1fr))} /* minmax(0,…) or the long labels blow the track out */

   /* $284.62 at 26px is wider than the half-width tile */
}

/* ============ ACCOUNTS + SAVINGS (homepage sections) ============
   The switcher mock follows the usage panel's grammar: sunken rows inside a
   framed well, meters in the .appwin recipe, status colour only where it is
   semantic — green is the account you are on, red is the meter that ran dry. */

.stats.three{grid-template-columns:repeat(3,1fr)}
.stat .v small{font-size:13px;font-weight:400;color:var(--faint);letter-spacing:0}

@media(max-width:900px){.stats.three{grid-template-columns:1fr}}

/* ============ LOAD-IN REVEAL ============
   The entrance: every .rv rests a step low and slides up to its seat when it
   enters the viewport — hero on load, sections as you reach them, siblings
   staggered by the markup's own --rvd. Gated on .rv-on, which only the head
   script sets, so a no-JS reader (and reduced motion, via this media query)
   gets the resting page with nothing hidden. The hero screenshot is the LCP
   element, so .rv-move slides without fading: an opacity:0 LCP candidate does
   not count as painted until it fades in, and that read as a slow page. */
@media (prefers-reduced-motion:no-preference){
  .rv-on .rv{opacity:0;transform:translateY(24px)}
  .rv-on .rv-move{opacity:1;transform:translateY(44px)}
  .rv-on .rv-fade{transform:none}
  .rv-on .rv.rv-in{opacity:1;transform:none;
    transition:opacity 1s cubic-bezier(.22,1,.36,1) var(--rvd,0s),transform 1s cubic-bezier(.22,1,.36,1) var(--rvd,0s)}
  .rv-on .rv-move.rv-in{transition-duration:1.2s,1.2s}
}

/* ============ SITE + HOMEPAGE: GRAPHITE ============
   Every marketing page on the app's Graphite theme. Rules under .site are the
   shared chrome (tokens, nav, footer, buttons, links) and hold on every page;
   rules under .home-page are the homepage's own sections. The look: a true-neutral canvas, white-alpha
   hairlines, floating cards on Graphite's corners, one white filled action,
   and the New chat page's atmosphere (an engine-tinted glow over a faint dot
   grid) behind the hero and the closing panel. Every value is a --home-* token
   from tokens/marketing.css, which points at tokens/new-chat.css. */
:root.site {
  --bg:var(--home-canvas); --bg-2:var(--home-well); --desk:var(--home-canvas);
  --card:var(--home-surface); --card-2:var(--home-surface); --raised:var(--home-raised);
  --muted-surface:var(--home-raised); --text:var(--home-text); --muted:var(--home-muted);
  --faint:var(--home-faint); --primary:var(--home-accent); --primary-fg:var(--home-accent-ink);
  --border:var(--home-border); --border-soft:var(--home-line); --rail:var(--home-line);
  --input:var(--home-control-border); --ring:var(--home-highlight); --sunken:var(--home-well);
  --well:var(--home-well); --live:var(--home-live); --busy:var(--home-busy);
  --danger:var(--home-danger); --link-rule:var(--home-highlight); --edge:var(--home-edge);
  --lift:var(--home-lift); --glow:none; --grid-cols:none; --shell:1224px;
  scroll-padding-top:84px;
}
.site body {background:var(--bg);color:var(--text);line-height:1.6;}
.site :focus-visible {outline:2px solid var(--ring);outline-offset:4px;box-shadow:none;}
.home-page :is(h1,h2,h3) {font-weight:600;}
.site code {font-family:var(--mono);font-size:.9em;}
.home-page .home-wrap {max-width:var(--shell);margin-inline:auto;padding-inline:24px;}
.home-page .home-label {font-size:11px;color:var(--faint);letter-spacing:.06em;}
.home-page .home-eyebrow {margin-bottom:14px;font-size:13px;font-weight:500;color:var(--faint);letter-spacing:0;}
.home-page .home-text-link {position:relative;display:inline-flex;align-items:center;gap:6px;min-height:44px;font-size:14px;color:var(--muted);font-weight:500;transition:color .16s;}
/* The call-to-action links draw their underline in from the left on hover. */
.home-page .home-text-link::after {content:"";position:absolute;left:0;right:0;bottom:10px;height:1px;background:currentColor;transform:scaleX(0);transform-origin:left;transition:transform .25s var(--ease);}
.home-page .home-text-link:hover::after,.home-page .home-text-link:focus-visible::after {transform:scaleX(1);}
.home-page .home-text-link svg {width:16px;height:16px;flex:none;}
.home-page .home-text-link:hover {color:var(--text);}
.home-page .home-text-link>span {font-size:14px;transition:transform .16s var(--ease);}
.home-page .home-text-link:hover>span {transform:translate(2px,-2px);}
/* Inline links: a soft hairline underline at rest that brightens on hover, so a link
   reads as one without shouting over the sentence it sits in. */
.site .engine-link,.home-page :is(.home-question p a,.pricing-note a,.pricing-head p a) {color:inherit;text-decoration:underline;text-decoration-color:var(--home-line-focus);text-decoration-thickness:1px;text-underline-offset:4px;transition:color .16s,text-decoration-color .16s;}
.site .engine-link:hover,.home-page :is(.home-question p a,.pricing-note a,.pricing-head p a):hover {color:var(--text);text-decoration-color:currentColor;}
.site .foot .engine-link {text-decoration:none;}
.site .foot .engine-link:hover {text-decoration:underline;}
.site .mono-mark {filter:invert(1);}

/* ---- buttons: pills, as the composer's chips and the rail's filter are ---- */
.site .btn {min-height:44px;height:auto;justify-content:center;gap:10px;padding:10px 20px;border-radius:var(--home-radius-chip);font-size:14px;font-weight:500;box-shadow:none;}
.site .btn svg {width:15px;height:15px;}
.site .btn-primary {background:var(--primary);border-color:var(--primary);color:var(--primary-fg);font-weight:600;}
.site .btn-primary:hover {background:var(--home-accent-hover);border-color:var(--home-accent-hover);}
.site .btn-primary svg {transition:transform .18s var(--ease);}
.site .btn-primary:hover svg {transform:translateX(2px);}
.site .btn-ghost {border-color:var(--home-border);color:var(--text);background:var(--home-surface);}
.site .btn-ghost:hover {background:var(--home-hover);border-color:var(--home-line-focus);}
.site .btn .dot {display:none;}

/* ---- nav ---- */
/* Opaque at every scroll position, rule included (tests/nav-chrome.spec.js). */
.site .nav,.site .nav.is-top {height:64px;gap:32px;padding-inline:max(24px,calc((100% - var(--shell))/2 + 24px));background:var(--bg);border-bottom:1px solid var(--border-soft);-webkit-backdrop-filter:none;backdrop-filter:none;}
.site .nav .brand {gap:9px;font-size:17px;font-weight:600;letter-spacing:-.025em;}
.site .nav .mk {width:24px;height:24px;}
.site .nav-links {flex:0 0 auto;justify-content:flex-end;margin-left:auto;margin-right:0;gap:4px;}
.site .nav-links a {font-size:13.5px;border-radius:var(--home-radius-chip);padding:7px 12px;}
.site .nav-links a:hover {background:var(--home-surface);}
.site .nav-actions {gap:16px;}
.site .nav-actions .login {font-size:13.5px;}
.site .nav-actions>.btn-ghost {display:none;}
.site .nav .btn-signup {min-height:34px;padding:6px 15px;border-radius:var(--home-radius-chip);border:1px solid var(--primary);background:var(--primary);color:var(--primary-fg);font-size:13px;font-weight:600;}
.site .nav .btn-signup:hover {background:var(--home-accent-hover);border-color:var(--home-accent-hover);}
.site .nav-menu-btn {border-color:var(--home-border);border-radius:var(--home-radius-chip);}
.site .nav.menu-open .nav-links {box-shadow:none;}

/* ---- hero: the New chat page's glow and dot grid, tinted Claude and Codex ---- */
.home-page .home-intro {position:relative;isolation:isolate;overflow:hidden;background:var(--bg);color:var(--text);}
.home-page .home-intro::before,.home-page .home-intro::after {content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;}
.home-page .home-intro::before {background:
  radial-gradient(38% 46% at 30% 30%,rgba(var(--home-glow-claude),.13),transparent 72%),
  radial-gradient(38% 46% at 70% 34%,rgba(var(--home-glow-codex),.12),transparent 72%);}
.home-page .home-intro::after {background-image:radial-gradient(var(--home-dot) 1px,transparent 1px);background-size:22px 22px;
  -webkit-mask-image:radial-gradient(60% 70% at 50% 40%,#000,transparent 78%);mask-image:radial-gradient(60% 70% at 50% 40%,#000,transparent 78%);}
.home-page .hero {position:relative;display:flex;flex-direction:column;align-items:center;max-width:880px;padding:88px 0 56px;margin:0 auto;text-align:center;}
.home-page .hero-badge {display:inline-flex;align-items:center;gap:10px;min-height:34px;padding:5px 14px 5px 6px;margin-bottom:28px;border:1px solid var(--home-border);border-radius:var(--home-radius-chip);background:var(--home-surface);box-shadow:var(--home-edge);font-size:13px;color:var(--muted);}
.home-page .hero-badge-marks {display:flex;}
.home-page .hero-badge-marks>span {position:relative;flex:none;width:24px;height:24px;overflow:hidden;border-radius:50%;background:var(--home-raised);border:1px solid var(--home-border);}
.home-page .hero-badge-marks>span+span {margin-left:-6px;}
/* Absolutely centred: a mark larger than its circle (the OpenAI SVG carries its own
   padding) would otherwise sit low in a grid cell it overflows. */
.home-page .hero-badge-marks img {position:absolute;inset:0;margin:auto;}
.home-page .hero-badge-marks img[src*="grok"] {transform:translate(.5px,.5px);}
.home-page .hero h1 {font-size:clamp(52px,6vw,80px);line-height:1.02;letter-spacing:-.05em;margin:0;max-width:none;text-wrap:balance;}
.home-page .hero .lede {font-size:18px;line-height:1.6;letter-spacing:-.005em;color:var(--muted);max-width:800px;margin:24px auto 0;}
.home-page .hero .actions {display:flex;flex-wrap:wrap;align-items:center;justify-content:center;gap:12px;margin-top:34px;}
.home-page .hero .btn {min-width:176px;min-height:46px;}
.home-page .hero .note {margin:18px 0 0;font:400 12.5px/1.6 var(--sans);color:var(--faint);letter-spacing:0;}

/* ---- the product: a Graphite card floating on the canvas ---- */

/* ---- the engine band ---- */
.home-page .home-band {padding:56px 0;border-top:1px solid var(--border-soft);}
.home-page .band-layout {display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.2fr);gap:56px;align-items:center;}
.home-page .band-copy h2 {font-size:24px;line-height:1.25;letter-spacing:-.03em;margin-bottom:10px;}
.home-page .band-copy p {font-size:14.5px;line-height:1.65;color:var(--muted);max-width:46ch;}
.home-page .home-engines {display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:12px;}
.home-page .engine-item {display:flex;align-items:center;gap:12px;min-width:0;padding:14px 16px;border:1px solid var(--home-line);border-radius:var(--home-radius-list);background:var(--home-surface);transition:background-color .16s,border-color .16s;}
.home-page .engine-item:hover {background:var(--home-raised);border-color:var(--home-border);}
.home-page .engine-mark {display:grid;place-items:center;flex:none;width:40px;height:40px;overflow:hidden;border-radius:var(--home-radius-row);background:var(--home-raised);border:1px solid var(--home-line);}
.home-page .engine-item img {flex:none;object-fit:contain;}
.home-page .engine-item strong {display:block;font-size:14px;font-weight:500;line-height:1.4;white-space:nowrap;}
.home-page .engine-item code {display:block;font:400 12px/1.4 var(--mono);margin-top:2px;padding:0;border:0;background:none;color:var(--faint);}
.home-page .engine-arrow {margin-left:auto;color:var(--home-glyph);font-size:13px;transition:color .16s;}
.home-page .engine-item:hover .engine-arrow {color:var(--text);}

/* ---- sections ---- */
.home-page .home-section {padding:112px 0;border-top:1px solid var(--border-soft);}
.home-page .home-section-heading h2,.home-page .pricing-head h2 {font-size:48px;line-height:1.06;letter-spacing:-.045em;margin:0 0 18px;max-width:20ch;}
.home-page .home-section-heading>p,.home-page .home-section-heading.is-split p {max-width:58ch;color:var(--muted);font-size:17px;line-height:1.65;}
.home-page .home-section-heading>.home-text-link {margin-top:14px;}
.home-page .home-section-heading.is-center {display:flex;flex-direction:column;align-items:center;text-align:center;margin:0 auto 56px;}
.home-page .home-section-heading.is-split {display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:56px;align-items:end;margin-bottom:56px;}
.home-page .home-section-heading.is-split h2 {margin:0;}
.home-page .home-section-heading.is-split .home-text-link {margin-top:10px;}

/* ---- features: a bento of Graphite cards, each acting out its claim ---- */
.home-page .home-bento {display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;
  grid-template-areas:"approve approve phone" "fleet usage phone" "limits resume resume";}
.home-page .bento-card {position:relative;display:flex;flex-direction:column;gap:28px;min-width:0;padding:28px;overflow:hidden;border:1px solid var(--home-line);border-radius:var(--home-radius-card);background:var(--home-surface);box-shadow:var(--home-edge);}
.home-page .bento-copy h3 {font-size:19px;line-height:1.3;letter-spacing:-.025em;margin-bottom:8px;}
.home-page .bento-copy p {font-size:14px;line-height:1.65;color:var(--muted);max-width:52ch;}
.home-page .bento-copy code {padding:1px 6px;border:1px solid var(--home-line);border-radius:var(--r-md);background:var(--home-raised);color:var(--text);white-space:nowrap;}
.home-page .bento-copy .home-text-link {display:flex;width:fit-content;margin-top:6px;margin-bottom:-12px;font-size:13.5px;}
.home-page .bento-visual {margin-top:auto;}
.home-page .bento-approve {grid-area:approve;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);align-items:center;}
.home-page .bento-phone {grid-area:phone;padding-bottom:0;}
.home-page .bento-fleet {grid-area:fleet;}
.home-page .bento-usage {grid-area:usage;}
.home-page .bento-limits {grid-area:limits;}
.home-page .bento-resume {grid-area:resume;display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1.05fr);align-items:center;}
.home-page .bento-approve::before,.home-page .bento-resume::before {content:"";position:absolute;inset:0;pointer-events:none;background:radial-gradient(50% 70% at 78% 50%,rgba(var(--home-glow-claude),.08),transparent 72%);}
.home-page .bento-resume::before {background:radial-gradient(50% 70% at 78% 50%,rgba(var(--home-glow-codex),.08),transparent 72%);}
.home-page .bento-card>* {position:relative;}

/* the permission prompt and its push, in the app's own vocabulary */
.home-page .vg-approve {display:flex;flex-direction:column;gap:12px;margin:0;}
.home-page .vg-toast {display:flex;align-items:center;gap:12px;align-self:flex-end;width:88%;padding:10px 14px 10px 10px;border:1px solid var(--home-border);border-radius:var(--home-radius-list);background:var(--home-raised);box-shadow:var(--home-menu-shadow);}
.home-page .vg-toast img {flex:none;border-radius:var(--r-md);}
.home-page .vg-toast div {display:flex;flex-direction:column;min-width:0;}
.home-page .vg-toast b {font-size:13px;font-weight:500;}
.home-page .vg-toast span {font-size:12px;color:var(--faint);}
.home-page .vg-toast time {margin-left:auto;align-self:flex-start;font-size:12px;color:var(--faint);}
.home-page .vg-perm {padding:16px;border:1px solid var(--home-border);border-left:2px solid var(--home-busy);border-radius:var(--home-radius-list);background:var(--home-well);}
.home-page .vg-perm-head {display:flex;align-items:center;gap:10px;font-size:13.5px;font-weight:500;}
.home-page .vg-perm-head time {margin-left:auto;font:400 12px var(--mono);color:var(--faint);}
.home-page .vg-tag {padding:1px 8px;border:1px solid var(--home-busy-line);border-radius:var(--r-md);background:var(--home-busy-bg);color:var(--home-busy);font:500 12px/1.6 var(--mono);}
.home-page .vg-cmd {display:block;margin-top:12px;padding:10px 12px;border:1px solid var(--home-line);border-radius:var(--home-radius-row);background:var(--home-surface);font-size:12.5px;color:var(--text);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.home-page .vg-perm-actions {display:grid;grid-template-columns:1fr 1fr;gap:8px;margin-top:12px;}
.home-page .vg-btn {display:grid;place-items:center;min-height:34px;border:1px solid var(--home-border);border-radius:var(--home-radius-chip);background:var(--home-raised);font-size:13px;font-weight:500;color:var(--muted);}
.home-page .vg-btn.is-primary {background:var(--primary);border-color:var(--primary);color:var(--primary-fg);font-weight:600;}

/* fleet rows and value bars */
.home-page .vg-list,.home-page .vg-bars {list-style:none;display:flex;flex-direction:column;gap:8px;}
.home-page .vg-list li {display:flex;align-items:center;gap:10px;min-height:42px;padding:0 14px;border:1px solid var(--home-line);border-radius:var(--home-radius-row);background:var(--home-well);font-size:13px;}
.home-page .vg-list b {font:500 12.5px var(--mono);}
.home-page .vg-list span {color:var(--faint);font-size:12px;}
.home-page .vg-list em {margin-left:auto;font-style:normal;font-size:12px;color:var(--muted);}
.home-page :is(.vg-list,.vg-chip) i {flex:none;width:7px;height:7px;border-radius:50%;background:var(--home-glyph);}
.home-page :is(.vg-list,.vg-chip) i.is-live {background:var(--home-live);box-shadow:0 0 0 3px var(--home-live-ring);}
.home-page :is(.vg-list,.vg-chip) i.is-busy {background:var(--home-busy);}
.home-page :is(.vg-list,.vg-chip) i.is-need {background:var(--home-danger);}
.home-page .vg-list li:has(.is-need) {border-color:var(--home-danger-bg);box-shadow:inset 2px 0 0 var(--home-danger);}
.home-page .vg-list li:has(.is-need) em {color:var(--home-danger);}
.home-page .vg-bars li {display:grid;grid-template-columns:1fr auto;gap:6px 12px;font-size:13px;}
.home-page .vg-bars b {font:500 12.5px var(--mono);color:var(--muted);}
.home-page .vg-meters b {font:500 13px var(--sans);}
.home-page .vg-bars span {font:400 12.5px var(--mono);color:var(--text);font-variant-numeric:tabular-nums;}
.home-page .vg-bars i {grid-column:1/-1;height:6px;border-radius:var(--home-radius-chip);background:var(--home-raised);overflow:hidden;}
.home-page .vg-bars i::before {content:"";display:block;height:100%;width:calc(var(--v) * 100%);border-radius:inherit;background:var(--home-muted);}
.home-page .vg-bars li:nth-child(1) {--v:.92;}
.home-page .vg-bars li:nth-child(2) {--v:.46;}
.home-page .vg-bars li:nth-child(3) {--v:.16;}
.home-page .vg-meters li:nth-child(1) {--v:.38;}
.home-page .vg-meters li:nth-child(2) {--v:.64;}
.home-page .vg-meters li:nth-child(3) {--v:.22;}
.home-page .vg-meters i::before {background:var(--home-text);}

/* the terminal */
.home-page .vg-term {margin:0;border:1px solid var(--home-border);border-radius:var(--home-radius-list);background:var(--home-well);overflow:hidden;box-shadow:var(--home-menu-shadow);}
.home-page .vg-term-bar {display:flex;align-items:center;gap:6px;padding:10px 14px;border-bottom:1px solid var(--home-line);}
.home-page .vg-term-bar i {width:9px;height:9px;border-radius:50%;background:var(--home-hover);}
.home-page .vg-term-bar span {margin-left:8px;font:400 12px var(--mono);color:var(--faint);}
.home-page .vg-term pre {margin:0;padding:14px 16px 16px;font:400 12.5px/1.75 var(--mono);color:var(--muted);white-space:pre;overflow:hidden;}
.home-page .vg-prompt {color:var(--faint);}
.home-page .vg-dim {color:var(--faint);}
.home-page .vg-sel {color:var(--text);}

/* ---- how it works ---- */
.home-page .setup-steps {list-style:none;display:grid;grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;counter-reset:none;}
.home-page .setup-steps li {display:flex;flex-direction:column;padding:28px;border:1px solid var(--home-line);border-radius:var(--home-radius-card);background:var(--home-surface);box-shadow:var(--home-edge);}
.home-page .setup-number {font:500 12.5px var(--mono);color:var(--faint);margin-bottom:28px;}
.home-page .setup-steps h3 {font-size:19px;line-height:1.3;letter-spacing:-.025em;margin-bottom:8px;}
.home-page .setup-steps p {font-size:14px;line-height:1.65;color:var(--muted);}
.home-page .setup-visual {display:flex;flex-wrap:wrap;align-items:center;gap:8px;margin-top:auto;padding-top:28px;min-width:0;}
.home-page .vg-chip {display:inline-flex;align-items:center;gap:8px;min-height:30px;padding:0 12px;border:1px solid var(--home-border);border-radius:var(--home-radius-chip);background:var(--home-raised);font:500 12.5px var(--mono);color:var(--text);}
.home-page .vg-chip.is-word {font-family:var(--sans);font-weight:500;}
.home-page .vg-state {min-width:0;font-size:12.5px;color:var(--faint);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.home-page .setup-trust {display:flex;align-items:center;gap:12px;margin-top:16px;padding:10px 12px 10px 20px;border:1px solid var(--home-line);border-radius:var(--home-radius-list);font-size:14px;color:var(--muted);}
.home-page .setup-trust svg {flex:none;width:18px;height:18px;color:var(--home-live);}
.home-page .setup-trust .home-text-link {margin-left:auto;flex:none;padding-inline:8px;}

/* ---- "Follow one task, hop by hop": the connection map (homepage-tour.js) ----
   Wires are an SVG laid over the stage and recomputed from the real boxes, so
   the map is the same map at every width. Stacking: firewall under the wires
   (they visibly pass through it), every other node over them, packets on top. */
.home-page .tour {border:1px solid var(--home-border);border-radius:var(--home-radius-card);background:var(--home-surface);box-shadow:var(--home-edge);}
.home-page .tour [hidden] {display:none!important;}
.home-page .tour-top {display:flex;align-items:center;justify-content:space-between;flex-wrap:wrap;gap:12px;padding:14px 20px;border-bottom:1px solid var(--home-line);}
.home-page .tour-runs {display:flex;align-items:center;flex-wrap:wrap;gap:6px;}
.home-page .tour-runs-label {margin-right:6px;font:400 11px var(--mono);color:var(--home-faint);}
.home-page .tour-runs button {display:inline-flex;align-items:center;gap:7px;min-height:34px;padding:6px 12px;border:1px solid var(--home-line);border-radius:var(--home-radius-chip);background:transparent;color:var(--home-muted);font:400 12px var(--mono);cursor:pointer;transition:background .2s,border-color .2s,color .2s;}
.home-page .tour-runs button small {font:400 11px var(--sans);color:var(--home-faint);}
.home-page .tour-runs button:hover {background:var(--home-hover);color:var(--home-text);}
.home-page .tour-runs button[aria-pressed="true"] {border-color:var(--home-live);background:var(--home-raised);color:var(--home-text);}
.home-page .tour-controls {display:flex;gap:8px;}
.home-page .tour-controls .btn {min-height:34px;min-width:84px;padding:6px 14px;font-size:12px;}
.home-page .tour-controls .btn:disabled {color:var(--home-faint);cursor:default;}

.home-page .tour-stage {position:relative;display:grid;grid-template-columns:minmax(0,1fr) 84px minmax(0,.92fr) minmax(0,1.22fr);column-gap:40px;padding:28px 32px 32px;background-image:radial-gradient(var(--home-dot) 1px,transparent 1px);background-size:20px 20px;}
.home-page .tour-wires,.home-page .tour-packets {position:absolute;inset:0;width:100%;height:100%;pointer-events:none;overflow:visible;}
.home-page .tour-wires {z-index:1;}
.home-page .tour-packets {z-index:3;}
.home-page .tour-wire {fill:none;stroke:var(--home-line-focus);stroke-width:1;stroke-dasharray:3 5;transition:stroke .3s,opacity .3s;}
.home-page .tour-wire.is-hot {stroke:var(--home-live);stroke-dasharray:none;stroke-width:1.5;}
.home-page .tour-wire.is-probe {stroke:var(--home-danger);opacity:.45;}
.home-page .tour-wire[data-wire-run] {opacity:0;}
.home-page .tour[data-run="laptop"] .tour-wire[data-wire-run="laptop"],.home-page .tour[data-run="vm"] .tour-wire[data-wire-run="vm"],.home-page .tour[data-run="pc"] .tour-wire[data-wire-run="pc"] {opacity:1;}
.home-page .tour-col {position:relative;display:flex;flex-direction:column;gap:18px;min-width:0;}
.home-page .tour-col-label {display:flex;align-items:center;justify-content:space-between;gap:8px;min-height:24px;font:400 10px var(--mono);letter-spacing:.05em;color:var(--home-faint);}
.home-page .tour-chip {flex:none;padding:3px 8px;border:1px solid var(--home-line);border-radius:var(--home-radius-chip);background:var(--home-surface);font:400 10px var(--sans);letter-spacing:0;}
.home-page .tour-node {position:relative;z-index:2;border:1px solid var(--home-line-focus);border-radius:var(--home-radius-list);background:var(--home-well);box-shadow:var(--home-lift);transition:border-color .35s,opacity .35s,transform .35s;}
.home-page .tour-node b {font-size:12px;font-weight:500;}
.home-page .tour-node small {display:block;font-size:10px;line-height:1.5;color:var(--home-faint);}

.home-page .tour-provider {display:flex;align-items:center;gap:10px;padding:10px 12px;}
.home-page .tour-provider-marks {display:flex;gap:6px;flex:none;}
.home-page .tour-provider-marks img {opacity:.25;transition:opacity .3s;}
.home-page .tour[data-run="laptop"] [data-provider="laptop"],.home-page .tour[data-run="vm"] [data-provider="vm"],.home-page .tour[data-run="pc"] [data-provider="pc"] {opacity:1;}
.home-page .tour-machines {display:flex;flex-direction:column;gap:12px;}
.home-page .tour-machine {opacity:.62;}
.home-page .tour-machine header {display:flex;align-items:center;gap:8px;padding:9px 12px;border-bottom:1px solid var(--home-line);}
.home-page .tour-machine header svg {width:18px;height:18px;flex:none;color:var(--home-muted);}
.home-page .tour-machine header b {font:400 12px var(--mono);}
.home-page .tour-machine header small {margin-left:auto;}
.home-page .tour-led {flex:none;width:6px;height:6px;border-radius:50%;background:var(--home-glyph);transition:background .3s,box-shadow .3s;}
.home-page .tour-machine.is-online .tour-led {background:var(--home-live);box-shadow:0 0 0 3px var(--home-live-ring);}
.home-page .tour-term {min-height:52px;padding:8px 12px;font:400 11px/1.6 var(--mono);color:var(--home-muted);}
.home-page .tour-term p {overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
.home-page .tour-term .is-dim {color:var(--home-faint);}
.home-page .tour-term .is-ok {color:var(--home-live);}
.home-page .tour-term .is-warn {color:var(--home-busy);}
.home-page .tour-machine .tour-machine-foot {display:flex;align-items:center;gap:6px;padding:7px 12px;border-top:1px solid var(--home-line);font-size:10px;color:var(--home-faint);}
.home-page .tour-machine .tour-machine-foot svg {width:14px;height:14px;flex:none;}
.home-page .tour-machine .tour-machine-foot code {overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:10px;}
.home-page .tour-machine .tour-machine-foot [data-lines] {flex:none;margin-left:auto;font:400 10px var(--mono);color:var(--home-muted);}
.home-page .tour-machine .tour-machine-foot .is-bump {color:var(--home-live);animation:tour-bump .6s var(--ease);}
.home-page .tour[data-run="laptop"] [data-node="laptop"],.home-page .tour[data-run="vm"] [data-node="vm"],.home-page .tour[data-run="pc"] [data-node="pc"] {opacity:1;border-color:var(--home-live);}

.home-page .tour-col-edge {align-items:center;padding-top:42px;gap:14px;}
.home-page .tour-scan {display:flex;flex-direction:column;align-items:center;gap:4px;padding:8px 6px;width:100%;text-align:center;border-style:dashed;background:var(--home-surface);box-shadow:none;}
.home-page .tour-scan>span {display:grid;place-items:center;width:22px;height:22px;border:1px solid var(--home-danger);border-radius:50%;color:var(--home-danger);font:500 11px var(--mono);}
.home-page .tour-firewall {z-index:0;flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:8px;width:100%;padding:16px 6px;text-align:center;border-style:dashed;background:repeating-linear-gradient(0deg,var(--home-surface) 0 10px,var(--home-well) 10px 20px);box-shadow:none;}
.home-page .tour-firewall svg {width:22px;height:22px;color:var(--home-muted);transition:color .3s;}
.home-page .tour-firewall b {font-size:11px;}
.home-page .tour-firewall strong {display:block;font:400 22px/1.2 var(--mono);color:var(--home-live);}
.home-page .tour-firewall.is-hit {border-color:var(--home-danger);animation:tour-shake .45s ease;}
.home-page .tour-firewall.is-hit svg {color:var(--home-danger);}

.home-page .tour-relay {padding:14px;}
.home-page .tour-relay header {display:flex;align-items:center;gap:10px;}
.home-page .tour-relay header b {display:block;font-size:14px;letter-spacing:-.02em;}
.home-page .tour-relay header img {flex:none;border-radius:var(--home-radius-row);}
.home-page .tour-mini {margin:14px 0 6px;font:400 9px var(--mono);letter-spacing:.06em;color:var(--home-faint);}
.home-page .tour-memory {display:flex;flex-wrap:wrap;align-content:flex-start;gap:4px;min-height:52px;padding:6px;border:1px dashed var(--home-border);border-radius:var(--home-radius-row);background:var(--home-surface);}
.home-page .tour-memory-empty {margin:auto;font-size:10px;color:var(--home-glyph);}
.home-page .tour-memory:has(.tour-memory-chip) .tour-memory-empty {display:none;}
.home-page .tour-memory-chip {padding:2px 7px;border:1px solid currentColor;border-radius:var(--home-radius-chip);font:400 9px/1.5 var(--mono);color:var(--tour-kind,var(--home-muted));animation:tour-evaporate 1.5s ease-in forwards;}
.home-page .tour-meters {display:grid;grid-template-columns:repeat(2,minmax(0,1fr));gap:6px;margin-top:12px;}
.home-page .tour-meters>div {padding:7px 9px;border:1px solid var(--home-line);border-radius:var(--home-radius-row);background:var(--home-surface);}
.home-page .tour-meters dt {font-size:9px;color:var(--home-faint);}
.home-page .tour-meters dd {font:400 17px/1.3 var(--mono);color:var(--home-text);}
.home-page .tour-meters .is-zero {border-color:var(--home-live-ring);}
.home-page .tour-meters .is-zero dd {color:var(--home-live);}
.home-page .tour-keeps {margin-top:10px;font-size:10px;line-height:1.6;color:var(--home-faint);}
.home-page .tour-push {display:flex;align-items:center;gap:10px;padding:10px 12px;}
.home-page .tour-push svg {width:18px;height:18px;flex:none;color:var(--home-muted);}

.home-page .tour-browser {overflow:hidden;}
.home-page .tour-browser-bar {display:flex;align-items:center;justify-content:space-between;gap:8px;padding:8px 12px;border-bottom:1px solid var(--home-line);background:var(--home-raised);font:400 10px var(--mono);color:var(--home-muted);}
.home-page .tour-browser-bar>span:first-child {font-size:7px;letter-spacing:3px;color:var(--home-glyph);}
.home-page .tour-browser-bar>span:nth-child(2) {display:inline-flex;align-items:center;gap:5px;}
.home-page .tour-browser-bar svg {width:12px;height:12px;color:var(--home-live);}
.home-page .tour-browser-bar [data-tour-signed] {color:var(--home-faint);}
.home-page .tour[data-signed] [data-tour-signed] {color:var(--home-live);}
.home-page .tour-chat {min-height:250px;padding:12px 14px;transition:opacity .4s,filter .4s;}
.home-page .tour[data-closed] .tour-chat {opacity:.12;filter:blur(1px);}
.home-page .tour-chat-head {display:flex;align-items:center;justify-content:space-between;gap:8px;font-size:12px;}
.home-page .tour-chat-head b {font-weight:500;}
.home-page .tour-chat-head span {font:400 10px var(--mono);color:var(--home-faint);}
.home-page .tour-bubble {margin:12px 0 10px 28px;padding:8px 10px;border:1px solid var(--home-line);border-radius:var(--home-radius-list);background:var(--home-raised);font-size:11px;opacity:0;transform:translateY(4px);transition:opacity .35s,transform .35s;}
.home-page .tour[data-prompted] .tour-bubble,.home-page .tour:not(.is-enhanced) .tour-bubble {opacity:1;transform:none;}
.home-page .tour-reply {display:flex;align-items:flex-start;gap:8px;min-height:36px;font-size:11px;line-height:1.6;color:var(--home-muted);}
.home-page .tour-reply img {flex:none;margin-top:2px;}
.home-page .tour-tools {display:grid;gap:4px;margin:8px 0 10px 24px;list-style:none;font:400 10px var(--mono);color:var(--home-faint);}
.home-page .tour-tools li {animation:tour-in .35s var(--ease);}
.home-page .tour-tools li::before {content:"↳ ";}
.home-page .tour-tools .is-ok {color:var(--home-live);}
.home-page .tour-ask {padding:9px 11px;border:1px solid var(--home-line);border-radius:var(--home-radius-list);background:var(--home-surface);opacity:.35;transition:opacity .3s,border-color .3s,background .3s;}
.home-page .tour-ask p {display:flex;align-items:center;gap:6px;font-size:10px;color:var(--home-busy);}
.home-page .tour-ask svg {width:14px;height:14px;flex:none;}
.home-page .tour-ask code {display:block;margin:4px 0;font-size:11px;}
.home-page .tour-ask span {font-size:10px;color:var(--home-muted);}
.home-page .tour[data-ask="waiting"] .tour-ask {opacity:1;border-color:var(--home-busy-line);background:var(--home-busy-bg);}
.home-page .tour[data-ask="allowed"] .tour-ask {opacity:1;border-color:var(--home-live);}
.home-page .tour[data-ask="allowed"] .tour-ask span {color:var(--home-live);}
.home-page .tour-browser.is-ping {border-color:var(--home-busy);}
.home-page .tour-phone {align-self:flex-end;width:min(100%,250px);min-height:150px;padding:10px 12px 14px;border-radius:calc(var(--home-radius-card) + 6px);background:var(--home-raised);}
.home-page .tour-phone-notch {width:54px;height:6px;margin:0 auto 6px;border-radius:var(--home-radius-chip);background:var(--home-well);}
.home-page .tour-phone-time {text-align:center;font:400 22px/1.2 var(--mono);color:var(--home-muted);}
.home-page .tour-phone.is-buzz {animation:tour-buzz .5s ease;border-color:var(--home-busy);}
.home-page .tour-toast {display:flex;align-items:flex-start;gap:8px;margin-top:8px;padding:9px;border:1px solid var(--home-border);border-radius:var(--home-radius-list);background:var(--home-surface);opacity:0;transform:translateY(-8px) scale(.97);transition:opacity .35s,transform .35s var(--ease);}
.home-page .tour[data-toast] .tour-toast,.home-page .tour:not(.is-enhanced) .tour-toast {opacity:1;transform:none;}
.home-page .tour-toast>div {flex:1;min-width:0;}
.home-page .tour-toast b {display:flex;justify-content:space-between;font-size:10px;}
.home-page .tour-toast b small {display:inline;}
.home-page .tour-toast strong {display:block;margin-top:2px;font-size:11px;font-weight:500;}
.home-page .tour-toast p {font-size:10px;color:var(--home-muted);}
.home-page .tour-toast-actions {display:flex;gap:6px;margin-top:7px;}
.home-page .tour-toast-actions i {flex:1;padding:4px;border:1px solid var(--home-line);border-radius:var(--home-radius-row);text-align:center;font:500 10px var(--sans);font-style:normal;color:var(--home-muted);transition:background .2s,color .2s;}
.home-page .tour-phone[data-toast-kind="done"] .tour-toast-actions {display:none;}
.home-page .tour-toast-actions .is-tap {background:var(--home-live);color:var(--home-accent-ink);border-color:var(--home-live);}

/* packets: one hue per kind of traffic, reused by the memory chips and the log */
.home-page .tour .is-hello,.home-page .tour .is-stream {--tour-kind:var(--home-live);}
.home-page .tour .is-ui,.home-page .tour .is-prompt {--tour-kind:var(--home-text);}
.home-page .tour .is-api,.home-page .tour .is-read {--tour-kind:var(--home-plan);}
.home-page .tour .is-ask,.home-page .tour .is-push {--tour-kind:var(--home-busy);}
.home-page .tour .is-decide {--tour-kind:var(--home-live);}
.home-page .tour .is-probe {--tour-kind:var(--home-danger);}
.home-page .tour-packet {position:absolute;top:0;left:0;display:flex;align-items:center;gap:6px;will-change:transform;}
.home-page .tour-packet i {flex:none;width:10px;height:10px;margin:-5px 0 0 -5px;border-radius:50%;background:var(--tour-kind);box-shadow:0 0 0 4px var(--home-surface),0 0 14px var(--tour-kind);}
.home-page .tour-packet span {position:absolute;left:10px;top:-24px;padding:2px 8px;border:1px solid var(--tour-kind);border-radius:var(--home-radius-chip);background:var(--home-well);white-space:nowrap;font:400 10px/1.5 var(--mono);color:var(--home-text);}

.home-page .tour-chapters {display:grid;grid-template-columns:repeat(9,minmax(0,1fr));gap:4px;padding:10px 12px;border-top:1px solid var(--home-line);border-bottom:1px solid var(--home-line);}
.home-page .tour-chapters button {position:relative;display:flex;flex-direction:column;align-items:flex-start;gap:2px;min-height:48px;padding:8px 10px 10px;overflow:hidden;border:1px solid transparent;border-radius:var(--home-radius-row);background:transparent;color:var(--home-muted);font:500 12px var(--sans);text-align:left;cursor:pointer;transition:background .2s,color .2s;}
.home-page .tour-chapters button span {font:400 10px var(--mono);color:var(--home-faint);}
.home-page .tour-chapters button i {position:absolute;left:10px;right:10px;bottom:4px;height:2px;border-radius:var(--home-radius-chip);background:linear-gradient(90deg,var(--home-live) calc(var(--p,0)*100%),var(--home-line) 0);}
.home-page .tour-chapters button:hover {background:var(--home-hover);color:var(--home-text);}
.home-page .tour-chapters button[aria-current="step"] {background:var(--home-raised);border-color:var(--home-border);color:var(--home-text);}
.home-page .tour-chapters button.is-past {color:var(--home-text);}

.home-page .tour-story {display:grid;grid-template-columns:minmax(0,1.3fr) minmax(0,1fr);gap:40px;padding:28px 32px 32px;background:var(--home-well);border-radius:0 0 var(--home-radius-card) var(--home-radius-card);}
.home-page .tour:not(.is-enhanced) .tour-story {grid-template-columns:minmax(0,1fr);}
.home-page .tour-texts article+article {margin-top:28px;}
.home-page .is-enhanced .tour-texts article {margin:0;animation:tour-in .4s var(--ease);}
.home-page .tour-kicker {margin-bottom:8px;font:400 10px var(--mono);letter-spacing:.06em;color:var(--home-live);}
.home-page .tour-texts h3 {margin-bottom:10px;font-size:22px;line-height:1.3;letter-spacing:-.03em;}
.home-page .tour-texts article>p:not(.tour-kicker) {font-size:14px;line-height:1.8;color:var(--home-muted);}
.home-page .tour-guards {display:flex;flex-wrap:wrap;gap:6px;margin-top:16px;list-style:none;}
.home-page .tour-guards li {display:inline-flex;align-items:center;gap:6px;padding:4px 10px;border:1px solid var(--home-line);border-radius:var(--home-radius-chip);background:var(--home-surface);font-size:11px;color:var(--home-text);}
.home-page .tour-guards li::before {content:"";width:5px;height:5px;border-radius:50%;background:var(--home-live);}
.home-page .tour-log {align-self:start;display:grid;gap:2px;min-height:196px;padding:10px;border:1px solid var(--home-line);border-radius:var(--home-radius-list);background:var(--home-surface);list-style:none;font:400 10px/1.5 var(--mono);}
.home-page .tour-log::before {content:"CONNECTION LOG";margin-bottom:6px;letter-spacing:.06em;color:var(--home-faint);}
.home-page .tour-log li {display:grid;grid-template-columns:44px minmax(0,1fr) auto;column-gap:8px;padding:4px 6px;border-left:2px solid var(--tour-kind,var(--home-line));animation:tour-in .35s var(--ease);}
.home-page .tour-log time {grid-row:span 2;color:var(--home-faint);}
.home-page .tour-log b {overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-weight:400;color:var(--home-text);}
.home-page .tour-log span {color:var(--home-faint);}
.home-page .tour-log em {grid-column:2/-1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-style:normal;color:var(--home-muted);}
.home-page .tour-announce {position:absolute;width:1px;height:1px;margin:-1px;overflow:hidden;clip-path:inset(50%);white-space:nowrap;}
.home-page .tour[data-motion="paused"] *,.home-page .tour[data-motion="paused"] *::before,.home-page .tour[data-motion="paused"] *::after {animation-play-state:paused!important;}
@keyframes tour-bump {40%{transform:scale(1.25)}}
@keyframes tour-shake {20%,60%{transform:translateX(-3px)}40%,80%{transform:translateX(3px)}}
@keyframes tour-evaporate {0%{opacity:0;transform:translateY(3px)}15%,55%{opacity:1;transform:none}100%{opacity:0;transform:translateY(-4px)}}
@keyframes tour-buzz {20%,60%{transform:translateX(-2px) rotate(-1deg)}40%,80%{transform:translateX(2px) rotate(1deg)}}
@keyframes tour-in {from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:none}}
@media (max-width:1100px) {
  .home-page .tour-stage {grid-template-columns:minmax(0,1fr) 64px minmax(0,1fr);row-gap:40px;column-gap:28px;padding:24px;}
  .home-page .tour-col-you {grid-column:1/-1;display:grid;grid-template-columns:minmax(0,1.4fr) minmax(0,1fr);column-gap:28px;align-items:start;}
  .home-page .tour-col-you>.tour-col-label {grid-column:1/-1;}
  .home-page .tour-chapters {grid-template-columns:repeat(5,minmax(0,1fr));}
}
@media (max-width:760px) {
  .home-page .tour-stage {display:flex;flex-direction:column;gap:34px;padding:20px 28px;}
  .home-page .tour-col-edge {flex-direction:row;padding-top:0;}
  .home-page .tour-scan {width:auto;flex-direction:row;}
  .home-page .tour-firewall {flex-direction:row;padding:10px;background:repeating-linear-gradient(90deg,var(--home-surface) 0 10px,var(--home-well) 10px 20px);}
  .home-page .tour-firewall strong {display:inline;font-size:14px;}
  .home-page .tour-machines {flex-direction:row;flex-wrap:wrap;}
  .home-page .tour-machine {flex:1 1 40%;}
  .home-page .tour-machine :is(.tour-term,.tour-machine-foot) {display:none;}
  .home-page .tour[data-run="laptop"] [data-node="laptop"],.home-page .tour[data-run="vm"] [data-node="vm"],.home-page .tour[data-run="pc"] [data-node="pc"] {flex-basis:100%;order:-1;}
  .home-page .tour[data-run="laptop"] [data-node="laptop"] .tour-term,.home-page .tour[data-run="vm"] [data-node="vm"] .tour-term,.home-page .tour[data-run="pc"] [data-node="pc"] .tour-term {display:block;}
  .home-page .tour[data-run="laptop"] [data-node="laptop"] .tour-machine-foot,.home-page .tour[data-run="vm"] [data-node="vm"] .tour-machine-foot,.home-page .tour[data-run="pc"] [data-node="pc"] .tour-machine-foot {display:flex;}
  .home-page .tour-col-you {display:flex;}
  .home-page .tour-phone {align-self:center;}
  .home-page .tour-chapters {grid-template-columns:repeat(3,minmax(0,1fr));}
  .home-page .tour-story {grid-template-columns:minmax(0,1fr);gap:24px;padding:24px 20px;}
  .home-page .tour-top {padding:12px 16px;}
  .home-page .tour-runs-label {width:100%;}
}
@media (prefers-reduced-motion:reduce) {
  .home-page .tour *,.home-page .tour *::before,.home-page .tour *::after {animation:none!important;transition:none!important;}
}

/* ---- pricing ---- */
.home-page .pricing-head {padding:0;max-width:none;display:flex;flex-direction:column;align-items:center;text-align:center;}
.home-page .pricing-head>p {max-width:66ch;margin:0;color:var(--muted);font-size:16px;line-height:1.7;}
.home-page .pricing {grid-template-columns:repeat(3,minmax(0,1fr));gap:16px;padding:0;margin-top:48px;}
.home-page .pricing.two {grid-template-columns:repeat(2,minmax(0,1fr));max-width:880px;margin-inline:auto;}
.home-page .price {background:var(--home-surface);border:1px solid var(--home-line);border-radius:var(--home-radius-card);box-shadow:var(--home-edge);padding:30px;}
.home-page .price .pn {font-size:17px;font-weight:600;}
.home-page .price .pd {font-size:13.5px;line-height:1.6;min-height:65px;margin-top:8px;color:var(--muted);}
.home-page .price .amt {font-size:46px;line-height:1.1;letter-spacing:-.045em;font-weight:600;margin:22px 0 0;}
.home-page .price .unit {font-family:var(--sans);font-size:12px;line-height:1.7;min-height:41px;margin-top:8px;color:var(--faint);}
.home-page .price ul {border-top:1px solid var(--home-line);padding-top:22px;margin-top:18px;margin-bottom:28px;gap:13px;}
.home-page .price li {font-size:13.5px;line-height:1.55;gap:10px;color:var(--muted);}
.home-page .price li svg {color:var(--home-text);width:15px;height:15px;min-width:15px;flex:none;border:0;background:none;padding:0;margin-top:2px;}
.home-page .price .btn {margin-top:auto;min-height:44px;font-size:13.5px;}
.home-page .price.feat {background:var(--home-raised);border-color:var(--home-border);box-shadow:var(--home-lift);--text:var(--home-text);--muted:var(--home-muted);--faint:var(--home-faint);--border-soft:var(--home-line);--primary:var(--home-accent);--primary-fg:var(--home-accent-ink);--bg:var(--home-raised);--ring:var(--home-highlight);}
.home-page .price.feat::before {content:"";position:absolute;inset:-1px 14% auto;height:1px;background:linear-gradient(90deg,transparent,var(--home-muted),transparent);}
.home-page .price.feat .btn-primary:hover {background:var(--home-accent-hover);}
.home-page .price-tag {left:auto;right:26px;top:28px;transform:none;height:24px;padding:0 10px;border:1px solid var(--home-border);border-radius:var(--home-radius-chip);background:var(--home-hover);font:500 12px/1 var(--sans);text-transform:none;letter-spacing:0;color:var(--home-text);}
.home-page .pricing-note {max-width:88ch;margin:28px auto 0;text-align:center;color:var(--faint);font-size:12.5px;line-height:1.8;}
.home-page .billing-toggle {justify-content:center;padding:0;margin:28px 0 0;}
.home-page .billing-toggle[hidden] {display:none;}
.home-page .price[hidden] {display:none;}
.home-page .billing-opt {border-radius:var(--home-radius-chip);}
.home-page .billing-opt.on {background:var(--home-hover);color:var(--text);border-color:var(--home-border);}

/* ---- faq: one Graphite list ---- */
.home-page .faq-layout {display:grid;grid-template-columns:minmax(0,.8fr) minmax(0,1.4fr);gap:80px;align-items:start;}
.home-page .faq-layout>.home-section-heading {position:sticky;top:104px;}
.home-page .home-questions {border:1px solid var(--home-line);border-radius:var(--home-radius-list);background:var(--home-surface);overflow:hidden;}
.home-page .home-question+.home-question {border-top:1px solid var(--home-line);}
.home-page .home-question summary {display:flex;justify-content:space-between;align-items:center;gap:24px;padding:18px 22px;font-size:14.5px;font-weight:500;line-height:1.5;list-style:none;cursor:pointer;transition:background-color .16s;}
.home-page .home-question summary:hover {background:var(--home-raised);}
.home-page .home-question summary:focus-visible {outline-offset:-2px;}
.home-page .home-question summary::-webkit-details-marker {display:none;}
.home-page .home-question summary>span {display:grid;place-items:center;flex:none;width:24px;height:24px;border:1px solid var(--home-border);border-radius:50%;font:400 16px/1 var(--sans);color:var(--muted);transition:transform .2s var(--ease);}
.home-page .home-question[open] summary>span {transform:rotate(45deg);}
.home-page .home-question p {padding:0 64px 20px 22px;font-size:14px;line-height:1.75;color:var(--muted);}

/* ---- closing panel: the hero's light, contained ---- */
.home-page .home-close {padding:0 0 112px;}
.home-page .close-panel {position:relative;isolation:isolate;overflow:hidden;padding:96px 24px;text-align:center;border:1px solid var(--home-line);border-radius:var(--home-radius-card);background:var(--home-surface);box-shadow:var(--home-edge);}
.home-page .close-panel::before,.home-page .close-panel::after {content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;}
.home-page .close-panel::before {background:
  radial-gradient(40% 70% at 35% 100%,rgba(var(--home-glow-claude),.14),transparent 72%),
  radial-gradient(40% 70% at 65% 100%,rgba(var(--home-glow-codex),.13),transparent 72%);}
.home-page .close-panel::after {background-image:radial-gradient(var(--home-dot) 1px,transparent 1px);background-size:22px 22px;
  -webkit-mask-image:radial-gradient(60% 80% at 50% 60%,#000,transparent 80%);mask-image:radial-gradient(60% 80% at 50% 60%,#000,transparent 80%);}
.home-page .close-panel h2 {font-size:56px;line-height:1.05;letter-spacing:-.05em;margin:0 auto 20px;}
.home-page .close-panel p {font-size:17px;line-height:1.65;color:var(--muted);}
.home-page .close-panel .actions {display:flex;flex-wrap:wrap;justify-content:center;gap:12px;margin-top:32px;}

/* ---- footer ---- */
.site .rail {border:0;background:var(--home-canvas);}
.site .rail::before {content:none;}
.site footer {border-top:1px solid var(--border-soft);}
.site .foot {padding:56px 24px 28px;}
.site .foot-grid {gap:30px;}
.site .foot .brand {font-size:17px;}
.site .foot .fb p {font-size:13px;line-height:1.7;color:var(--muted);}
.site .foot .socials a {border-color:var(--home-line);border-radius:var(--home-radius-row);}
.site .foot-col h2 {color:var(--text);font-size:13px;letter-spacing:0;text-transform:none;font-family:var(--sans);font-weight:500;}
.site .foot-col a {font-size:13px;line-height:1.6;color:var(--faint);}
.site .foot-col a:hover {color:var(--text);}
.site .foot-tm {border-color:var(--border-soft);margin-top:40px;}
.site .foot-tm h2 {font-family:var(--sans);font-size:12px;color:var(--faint);text-transform:none;letter-spacing:0;}
.site .foot-tm p {font-size:12px;color:var(--faint);line-height:1.7;}
.site .foot-base {border-color:var(--border-soft);font-family:var(--sans);font-size:12px;color:var(--faint);}
.site .foot-base .ops {display:none;}

/* ---- the demo film ---- */
.home-page .home-film {position:fixed;inset:0;margin:auto;padding:24px;max-width:min(1000px,calc(100% - 32px));max-height:calc(100dvh - 32px);background:var(--home-surface);color:var(--text);border:1px solid var(--home-border);border-radius:var(--home-radius-card);box-shadow:var(--home-lift);overflow:auto;}
:root.home-page:has(.home-film[open]) {overflow:hidden;}
.home-page .home-film::backdrop {background:color-mix(in srgb,var(--home-shadow) 80%,transparent);}
.home-page .film-head {display:flex;align-items:center;justify-content:space-between;gap:20px;}
.home-page .film-head h2 {font-size:26px;line-height:1.3;letter-spacing:-.035em;margin-top:5px;}
.home-page .film-close {display:flex;align-items:center;gap:10px;min-height:40px;padding:0 14px;border:1px solid var(--home-border);border-radius:var(--home-radius-chip);background:var(--home-raised);color:var(--text);font:500 13px var(--sans);cursor:pointer;}
.home-page .film-close:hover {background:var(--home-hover);}
.home-page .film-close span {font-size:20px;line-height:1;}
.home-page .home-film>p {margin:14px 0 20px;color:var(--muted);font-size:13px;}
.home-page .home-film video {display:block;width:100%;height:auto;max-height:65dvh;border-radius:var(--home-radius-list);background:var(--home-shadow);}
.home-page .home-film video:focus-visible {outline-offset:-4px;}
.home-page .rv {opacity:1!important;transform:none!important;transition:none!important;}

/* ---- the tag, buttons and send key inside the drawn phone ---- */
.home-page .am-tag {padding:0 7px;border:1px solid var(--home-busy-line);border-radius:var(--r-md);background:var(--home-busy-bg);color:var(--home-busy);font:500 11.5px/1.6 var(--mono);}
.home-page .am-btn {display:grid;place-items:center;min-height:30px;border:1px solid var(--home-border);border-radius:var(--home-radius-chip);background:var(--home-raised);font-size:12.5px;font-weight:500;color:var(--muted);transition:transform .15s,background-color .15s;}
.home-page .am-btn.is-primary {background:var(--primary);border-color:var(--primary);color:var(--primary-fg);font-weight:600;}
.home-page .am-send {display:grid;place-items:center;width:28px;height:28px;border-radius:50%;background:var(--primary);color:var(--primary-fg);font-size:14px;font-weight:600;}
.home-page .vg-phone ins {text-decoration:none;color:var(--home-live);}
.home-page .flow img[src*="openai"] {margin:-4px;}
.home-page .vg-phone code {padding:0;border:0;background:none;}

/* ---- the phone, drawn rather than photographed ---- */
.home-page .vg-phone {align-self:center;display:flex;flex-direction:column;gap:10px;width:min(264px,90%);height:440px;margin-bottom:-1px;padding:12px 12px 0;overflow:hidden;border:1px solid var(--home-border);border-bottom:0;border-radius:36px 36px 0 0;background:var(--home-canvas);box-shadow:var(--home-lift),inset 0 0 0 5px var(--home-raised);font-size:12px;line-height:1.45;}
.home-page .ph-status {display:flex;align-items:center;justify-content:space-between;padding:4px 14px 2px;font-size:11.5px;font-weight:600;}
.home-page .ph-island {width:70px;height:20px;border-radius:var(--home-radius-chip);background:var(--home-shadow);border:1px solid var(--home-line);}
.home-page .ph-sig {display:flex;align-items:flex-end;gap:2px;}
.home-page .ph-sig i {width:3px;border-radius:1px;background:var(--home-text);}
.home-page .ph-sig i:nth-child(1) {height:5px;} .home-page .ph-sig i:nth-child(2) {height:7px;} .home-page .ph-sig i:nth-child(3) {height:9px;}
.home-page .ph-push {display:flex;gap:10px;padding:10px;border:1px solid var(--home-border);border-radius:18px;background:color-mix(in srgb,var(--home-hover) 92%,transparent);box-shadow:var(--home-menu-shadow);}
.home-page .ph-push img {flex:none;border-radius:8px;}
.home-page .ph-push p {display:flex;justify-content:space-between;}
.home-page .ph-push b {font-size:12px;font-weight:600;}
.home-page .ph-push time {font-size:11px;color:var(--faint);}
.home-page .ph-push span {display:block;font-size:11.5px;color:var(--muted);}
.home-page .ph-head {display:flex;align-items:center;gap:7px;padding:8px 4px 6px;border-bottom:1px solid var(--home-line);}
.home-page .ph-head b {font-size:12px;font-weight:600;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;}
.home-page .ph-log {display:flex;flex-direction:column;gap:8px;flex:1;min-height:0;}
.home-page .ph-tool {display:flex;gap:7px;min-width:0;font-size:11.5px;}
.home-page .ph-tool code {min-width:0;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--muted);font-size:11px;}
.home-page .ph-tool ins {margin-left:auto;font:500 11px var(--mono);}
.home-page .ph-perm {padding:10px;border:1px solid var(--home-border);border-left:2px solid var(--home-busy);border-radius:14px;background:var(--home-surface);}
.home-page .ph-perm p {display:flex;align-items:center;gap:7px;font-weight:500;}
.home-page .ph-perm code {display:block;margin:8px 0;padding:6px 8px;border-radius:8px;background:var(--home-canvas);border:1px solid var(--home-line);font-size:11px;}
.home-page .ph-perm div {display:grid;grid-template-columns:1fr 1fr;gap:6px;}
.home-page .ph-perm .am-btn {min-height:28px;font-size:11.5px;}
.home-page .ph-composer {display:flex;align-items:center;justify-content:space-between;padding:8px 8px 8px 12px;border:1px solid var(--home-border);border-radius:18px;background:var(--home-surface);color:var(--faint);}
.home-page .ph-composer .am-send {width:24px;height:24px;font-size:12px;}

/* ---- the connection, drawn ---- */
.home-page .flow {display:grid;grid-template-columns:minmax(0,1fr) minmax(90px,.7fr) minmax(0,1fr) minmax(90px,.7fr) minmax(0,1.25fr);align-items:center;margin-bottom:16px;padding:40px 36px;border:1px solid var(--home-line);border-radius:var(--home-radius-card);background:var(--home-surface);box-shadow:var(--home-edge);position:relative;isolation:isolate;overflow:hidden;}
.home-page .flow::before {content:"";position:absolute;inset:0;z-index:-1;background-image:radial-gradient(var(--home-dot) 1px,transparent 1px);background-size:22px 22px;-webkit-mask-image:radial-gradient(70% 90% at 50% 50%,#000,transparent 85%);mask-image:radial-gradient(70% 90% at 50% 50%,#000,transparent 85%);}
.home-page .flow {align-items:start;}
.home-page .flow-machines {align-self:center;}
.home-page .flow-node {display:flex;flex-direction:column;align-items:center;text-align:center;gap:2px;}
.home-page .flow-node b {margin-top:10px;font-size:14px;font-weight:600;}
.home-page .flow-node span:last-child {font-size:12.5px;color:var(--faint);}
.home-page .flow-icon {display:grid;place-items:center;width:52px;height:52px;border:1px solid var(--home-border);border-radius:16px;background:var(--home-raised);color:var(--text);box-shadow:var(--home-edge);}
.home-page .flow-icon svg {width:24px;height:24px;}
.home-page .flow-icon.is-brand {box-shadow:var(--home-edge),0 0 40px -6px rgba(var(--home-glow-codex),.35);}
.home-page .flow-icon img {border-radius:var(--r-md);}
.home-page .flow-link {position:relative;height:1px;margin:26px 10px 0;background:linear-gradient(90deg,var(--home-line),var(--home-border),var(--home-line));}
.home-page .flow-link i {position:absolute;top:-2px;left:0;width:5px;height:5px;border-radius:50%;background:var(--home-text);box-shadow:0 0 10px var(--home-text);opacity:0;animation:flowDot 2.4s linear infinite;}
.home-page .flow-link i:nth-child(2) {animation-delay:.8s;} .home-page .flow-link i:nth-child(3) {animation-delay:1.6s;}
.home-page .flow-link.is-reverse i {animation-name:flowDotBack;}
@keyframes flowDot {0%{left:0;opacity:0}15%,85%{opacity:1}100%{left:calc(100% - 5px);opacity:0}}
@keyframes flowDotV {0%{top:0;opacity:0}15%,85%{opacity:1}100%{top:calc(100% - 5px);opacity:0}}
@keyframes flowDotVBack {0%{top:calc(100% - 5px);opacity:0}15%,85%{opacity:1}100%{top:0;opacity:0}}
@keyframes flowDotBack {0%{left:calc(100% - 5px);opacity:0}15%,85%{opacity:1}100%{left:0;opacity:0}}
.home-page .flow-link small {position:absolute;top:12px;left:50%;transform:translateX(-50%);white-space:nowrap;font-size:11.5px;color:var(--faint);}
.home-page .flow-machines {display:flex;flex-direction:column;gap:8px;}
.home-page .flow-machine {display:flex;align-items:center;justify-content:space-between;gap:10px;padding:9px 12px;border:1px solid var(--home-line);border-radius:var(--home-radius-row);background:var(--home-canvas);}
.home-page .flow-machine p {display:flex;align-items:center;gap:8px;min-width:0;}
.home-page .flow-machine p i {flex:none;width:6px;height:6px;border-radius:50%;background:var(--home-live);box-shadow:0 0 0 3px var(--home-live-ring);}
.home-page .flow-machine b {font:500 12.5px var(--mono);}
.home-page .flow-machine span {font-size:11.5px;color:var(--faint);}
.home-page .flow-machine div {display:flex;align-items:center;gap:4px;}

/* ---- the smaller features ---- */
.home-page .toolkit {margin-top:72px;}
.home-page .toolkit-head {display:flex;align-items:baseline;justify-content:space-between;gap:20px;margin-bottom:20px;}
.home-page .toolkit-head h3 {font-size:24px;letter-spacing:-.03em;}
.home-page .toolkit-grid {list-style:none;display:grid;grid-template-columns:repeat(4,minmax(0,1fr));gap:1px;overflow:hidden;border:1px solid var(--home-line);border-radius:var(--home-radius-card);background:var(--home-line);}
.home-page .toolkit-grid li {display:flex;flex-direction:column;gap:6px;padding:24px;background:var(--home-surface);transition:background-color .2s;}
.home-page .toolkit-grid li:hover {background:var(--home-raised);}
.home-page .toolkit-grid svg {width:20px;height:20px;margin-bottom:10px;color:var(--text);}
.home-page .toolkit-grid :is(b,h3) {margin:0;font-size:14.5px;font-weight:600;letter-spacing:-.01em;line-height:inherit;text-wrap:wrap;}
.home-page .toolkit-grid span {font-size:13.5px;line-height:1.6;color:var(--muted);}

/* ---- cursor spotlight on cards, set by /js/homepage.js ---- */
.home-page :is(.bento-card,.setup-steps li)::after {content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;opacity:0;transition:opacity .3s;
  background:radial-gradient(360px circle at var(--mx,50%) var(--my,0%),rgba(255,255,255,.055),transparent 65%);}
.home-page :is(.bento-card,.setup-steps li):hover::after {opacity:1;}
.home-page .setup-steps li {position:relative;}

/* ---- Terminals: the film and the feature grid ---- */
.home-page .term-film {margin:0;}
.home-page .term-film video {display:block;width:100%;height:auto;border-radius:var(--home-radius-card);background:var(--home-shadow);}
.home-page .term-film video:focus-visible {outline-offset:-4px;}
.home-page .term-film figcaption {display:flex;justify-content:space-between;gap:16px;margin-top:12px;font-size:13px;line-height:1.5;color:var(--faint);}
.home-page .term-grid {margin-top:48px;}
.home-page .term-grid code {font-size:12.5px;color:var(--text);}
@media (max-width:640px) {
  .home-page .term-film figcaption {flex-direction:column;gap:2px;}
}

@media (max-width:1100px) {
  .home-page .flow {padding:36px 24px;}
  .home-page .hero {padding:72px 0 48px;}
  .home-page .hero h1 {font-size:64px;}
  .home-page .band-layout {grid-template-columns:minmax(0,1fr);gap:24px;}
  .home-page .home-section-heading h2,.home-page .pricing-head h2 {font-size:42px;}
  .home-page .home-bento {grid-template-columns:repeat(2,minmax(0,1fr));grid-template-areas:"approve approve" "phone fleet" "phone usage" "limits limits" "resume resume";}
  .home-page .bento-limits {display:grid;grid-template-columns:minmax(0,1fr) minmax(0,1fr);gap:40px;align-items:center;}
  .home-page .bento-limits .bento-visual {margin:0;}
  .home-page .faq-layout {gap:52px;}
  .home-page .price {padding:24px;}
  .home-page .price-tag {right:22px;top:23px;}
}
@media (max-width:900px) {
  .home-page .flow {grid-template-columns:minmax(0,1fr);justify-items:center;padding:32px 20px;}
  .home-page .flow-link {width:1px;height:64px;margin:14px 0;background:linear-gradient(180deg,var(--home-line),var(--home-border),var(--home-line));}
  .home-page .flow-link i {top:0;left:-2px;animation-name:flowDotV;}
  .home-page .flow-link.is-reverse i {animation-name:flowDotVBack;}
  .home-page .flow-link small {top:50%;left:16px;transform:translateY(-50%);}
  .home-page .flow-machines {width:100%;max-width:320px;}
  .home-page .toolkit-grid {grid-template-columns:repeat(2,minmax(0,1fr));}
  .site .nav {gap:20px;}
  .site .nav-actions {margin-left:auto;}
  .site .nav-links a {border-radius:var(--r-md);}
  .home-page .hero h1 {font-size:56px;}
  .home-page .hero .lede {font-size:17px;max-width:590px;}
  .home-page .home-section {padding:80px 0;}
  .home-page .home-section-heading h2,.home-page .pricing-head h2 {font-size:38px;}
  .home-page .home-section-heading>p,.home-page .home-section-heading.is-split p {font-size:16px;}
  .home-page .home-section-heading.is-split {grid-template-columns:minmax(0,1fr);gap:16px;margin-bottom:40px;}
  .home-page .home-section-heading.is-center {margin-bottom:40px;}
  .home-page .home-engines {grid-template-columns:minmax(0,1fr);}
  .home-page .bento-approve,.home-page .bento-resume {grid-template-columns:minmax(0,1fr);}
  .home-page .setup-steps {grid-template-columns:minmax(0,1fr);}
  .home-page .setup-steps li {padding:24px;}
  .home-page .setup-number {margin-bottom:16px;}
  .home-page .setup-visual {padding-top:20px;}
  .home-page .setup-trust {display:grid;grid-template-columns:auto minmax(0,1fr);gap:4px 12px;align-items:start;padding:16px 18px 8px;}
  .home-page .setup-trust svg {margin-top:2px;}
  .home-page .setup-trust .home-text-link {grid-column:2;justify-self:start;margin-left:0;padding:0;}
  .home-page .faq-layout {grid-template-columns:minmax(0,1fr);gap:36px;}
  .home-page .faq-layout>.home-section-heading {position:static;}
  .home-page .price {padding:20px;}
  .home-page .price .amt {font-size:40px;}
  .home-page .price .pd {min-height:86px;}
  .home-page .price .unit {min-height:45px;}
  .home-page .price-tag {display:none;}
  .home-page .price li {font-size:12.5px;}
  .home-page .close-panel h2 {font-size:46px;}
  .site .foot-grid {grid-template-columns:repeat(4,minmax(0,1fr));gap:28px 24px;}
  .site .foot .fb {grid-column:1/-1;max-width:40ch;}
}
@media (max-width:640px) {
  .home-page .toolkit {margin-top:56px;}
  .home-page .toolkit-head {flex-direction:column;gap:4px;}
  .home-page .toolkit-grid {grid-template-columns:minmax(0,1fr);}
  .home-page .toolkit-grid li {display:grid;grid-template-columns:20px minmax(0,1fr);gap:4px 14px;padding:16px 18px;}
  .home-page .toolkit-grid svg {grid-row:span 2;margin:2px 0 0;}
  :root.site {scroll-padding-top:80px;}
  .home-page .home-wrap {padding-inline:20px;}
  .site .nav {padding-inline:20px;gap:12px;}
  .site .nav .brand {font-size:17px;}
  .site .nav-actions {gap:10px;}
  .site .nav-actions .btn-signup {display:inline-flex;min-height:44px;padding:7px 14px;font-size:13px;}
  .home-page .hero {padding:36px 0 40px;}
  .home-page .hero-badge {margin-bottom:20px;font-size:12px;padding-right:12px;gap:8px;}
  .home-page .hero h1 {font-size:clamp(34px,10.6vw,48px);line-height:1.06;letter-spacing:-.045em;}
  .home-page .hero .lede {font-size:16px;line-height:1.6;margin-top:18px;max-width:37ch;}
  .home-page .desktop-break {display:none;}
  .home-page .hero .actions {margin-top:24px;gap:8px;flex-direction:column;align-items:stretch;width:100%;max-width:320px;}
  .home-page .hero .note {margin-top:12px;font-size:12px;}

  .home-page .home-band {padding:44px 0;}
  .home-page .band-copy h2 {font-size:22px;}
  .home-page .home-section {padding:64px 0;}
  .home-page .home-section-heading h2,.home-page .pricing-head h2 {font-size:34px;line-height:1.1;letter-spacing:-.04em;margin-bottom:16px;}
  .home-page .home-section-heading>p,.home-page .home-section-heading.is-split p {font-size:15px;line-height:1.7;}
  /* One card at a time, swiped, with the next one peeking in as the cue. */
  .home-page .home-bento {display:flex;gap:12px;margin-inline:-20px;padding:0 20px 4px;overflow-x:auto;scroll-snap-type:x mandatory;scroll-padding-inline:20px;scrollbar-width:none;overscroll-behavior-x:contain;}
  .home-page .home-bento::-webkit-scrollbar {display:none;}
  .home-page .home-bento>.bento-card {flex:0 0 86%;scroll-snap-align:start;}
  .home-page .vg-phone {height:330px;}
  .home-page .bento-card {padding:22px;gap:24px;}
  .home-page .bento-phone {padding-bottom:0;}
  .home-page .bento-limits {display:flex;gap:24px;align-items:stretch;}
  .home-page .vg-toast {width:100%;}
  .home-page .vg-term pre {font-size:11.5px;}
  .home-page .pricing,.home-page .pricing.two {grid-template-columns:minmax(0,1fr);margin-top:32px;gap:12px;}
  .home-page .price {padding:24px;}
  .home-page .price .pd {min-height:0;}
  .home-page .price .unit {min-height:0;}
  .home-page .price .amt {font-size:44px;margin-top:18px;}
  .home-page .price li {font-size:13.5px;}
  .home-page .price .btn {width:100%;}
  .home-page .pricing-note {font-size:12px;text-align:left;}
  .home-page .home-question summary {font-size:14px;padding:16px 18px;gap:16px;}
  .home-page .home-question p {padding:0 18px 18px;font-size:14px;}
  .home-page .home-close {padding-bottom:64px;}
  .home-page .close-panel {padding:56px 20px;}
  .home-page .close-panel h2 {font-size:36px;}
  .home-page .close-panel p {font-size:15px;}
  .home-page .close-panel .actions {flex-direction:column;align-items:stretch;}
  .site .foot {padding:44px 20px 24px;}
  .site .foot-grid {grid-template-columns:repeat(2,minmax(0,1fr));gap:28px;}
  .site .foot-col a {min-height:32px;}
  .home-page .home-film {padding:16px;}
  .home-page .film-head h2 {font-size:21px;}
  .home-page .film-head .home-label {font-size:10px;}
  .home-page .film-close {padding:0 12px;gap:8px;}
}
@media (prefers-reduced-motion:reduce) {
  .home-page {scroll-behavior:auto;}
  .home-page *, .home-page *::before, .home-page *::after {animation:none!important;transition:none!important;}
}

/* ============ AUTH (/login, /signup): GRAPHITE ============
   The door wears the room it opens onto. login.html carries .home-page, so the
   nav, footer and buttons are the homepage's Graphite, and every value below is
   a --home-* token (tokens/marketing.css -> tokens/new-chat.css). The card is
   one floating Graphite card: a brand pane with the New chat page's engine glow
   over a dot grid, and the form pane. Feedback is drawn, not just written:
   fields name their own problem, the card shakes once on a refusal, the button
   spins while it works, and a wait that outlives a beat moves to the middle of
   the card (.auth-loader, driven by public/js/login.js).
   Placed last so it outranks the .home-page rules above at equal specificity. */
.auth-page .auth-wrap {position:relative;isolation:isolate;display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-height:calc(100vh - 64px);padding:clamp(32px,6vh,72px) 20px clamp(44px,7vh,80px);overflow:hidden;}
.auth-page .auth-wrap::before,.auth-page .auth-wrap::after {content:"";position:absolute;inset:0;z-index:-1;pointer-events:none;}
.auth-page .auth-wrap::before {background:
  radial-gradient(34% 44% at 30% 34%,rgba(var(--home-glow-claude),.12),transparent 72%),
  radial-gradient(34% 44% at 70% 40%,rgba(var(--home-glow-codex),.11),transparent 72%);
  animation:auth-breathe 14s ease-in-out infinite alternate;}
.auth-page .auth-wrap::after {background-image:radial-gradient(var(--home-dot) 1px,transparent 1px);background-size:22px 22px;
  -webkit-mask-image:radial-gradient(58% 64% at 50% 44%,#000,transparent 78%);mask-image:radial-gradient(58% 64% at 50% 44%,#000,transparent 78%);}
@keyframes auth-breathe {from {opacity:.75;transform:scale(1);} to {opacity:1;transform:scale(1.06);}}

.auth-page .auth-shell {width:100%;max-width:960px;display:grid;grid-template-columns:1.05fr 1fr;
  background:var(--home-surface);border:1px solid var(--home-line);border-radius:var(--home-radius-card);
  box-shadow:var(--home-lift);overflow:hidden;animation:auth-rise .6s var(--ease) both;}
@keyframes auth-rise {from {opacity:0;transform:translateY(14px);}}
.auth-page .auth-main.is-shaking>.auth-panel:not([hidden]) .auth-form {animation:auth-shake .42s cubic-bezier(.36,.07,.19,.97) both;}
@keyframes auth-shake {
  15%,85% {transform:translateX(-2px);} 30%,70% {transform:translateX(4px);} 45%,55% {transform:translateX(-6px);} 50% {transform:translateX(6px);}}

/* ---- brand pane ---- */
.auth-page .auth-side {position:relative;display:flex;flex-direction:column;padding:clamp(26px,3.2vw,38px);
  background:var(--home-well);border-right:1px solid var(--home-line);overflow:hidden;}
.auth-page .auth-side::before {content:"";position:absolute;inset:-20% -30% auto auto;width:80%;height:70%;pointer-events:none;
  background:radial-gradient(closest-side,rgba(var(--home-glow-claude),.10),transparent);animation:auth-drift 18s ease-in-out infinite alternate;}
@keyframes auth-drift {to {transform:translate(-18%,22%);}}
.auth-page .auth-side>* {position:relative;}
.auth-page .auth-side-brand {display:inline-flex;align-items:center;gap:9px;align-self:flex-start;font-size:15.5px;font-weight:600;letter-spacing:-.02em;color:var(--text);}
.auth-page .auth-side-brand img {border-radius:var(--home-radius-row);}
.auth-page .auth-side-body {margin:auto 0;padding:30px 0;}
.auth-page .auth-side-body h2 {font-size:clamp(22px,2.4vw,28px);line-height:1.12;letter-spacing:-.035em;max-width:16ch;}
.auth-page .auth-side-body p {margin-top:12px;max-width:36ch;font-size:13.5px;line-height:1.6;color:var(--muted);}
.auth-page .auth-scene {display:flex;flex-direction:column;gap:8px;max-width:340px;margin-top:26px;}
.auth-page .auth-sess {display:flex;align-items:center;gap:10px;padding:10px 12px;background:var(--home-surface);
  border:1px solid var(--home-line);border-radius:var(--home-radius-row);transition:border-color .2s,transform .2s var(--ease);}
.auth-page .auth-sess:hover {border-color:var(--home-border);transform:translateX(2px);}
.auth-page .auth-dot {flex:none;width:7px;height:7px;border-radius:50%;}
.auth-page .auth-dot.busy {background:var(--home-busy);animation:auth-pulse 1.8s ease-in-out infinite;}
.auth-page .auth-dot.live {background:var(--home-live);box-shadow:0 0 0 3px var(--home-live-ring);}
.auth-page .auth-dot.done {background:var(--home-glyph);}
@keyframes auth-pulse {50% {box-shadow:0 0 0 4px var(--home-busy-bg);opacity:.7;}}
.auth-page .auth-sess-text {display:flex;flex-direction:column;gap:1px;min-width:0;}
.auth-page .auth-sess-text b {overflow:hidden;font-size:12.5px;font-weight:500;letter-spacing:-.01em;white-space:nowrap;text-overflow:ellipsis;}
.auth-page .auth-sess-text i {overflow:hidden;font-family:var(--mono);font-size:10.5px;font-style:normal;color:var(--faint);white-space:nowrap;text-overflow:ellipsis;}
.auth-page .auth-chip {flex:none;margin-left:auto;padding:3px 8px;font-family:var(--mono);font-size:10px;letter-spacing:.04em;
  border:1px solid var(--home-line);border-radius:var(--home-radius-chip);color:var(--muted);}
.auth-page .auth-chip.busy {color:var(--home-busy);background:var(--home-busy-bg);border-color:var(--home-busy-line);}
.auth-page .auth-chip.live {color:var(--home-live);border-color:var(--home-live-ring);}
.auth-page .auth-side-body h2 {animation:auth-line .5s var(--ease) .14s both;}
.auth-page .auth-side-body p {animation:auth-line .5s var(--ease) .2s both;}
.auth-page .auth-scene .auth-sess:nth-child(1) {animation:auth-line .5s var(--ease) .3s both;}
.auth-page .auth-scene .auth-sess:nth-child(2) {animation:auth-line .5s var(--ease) .38s both;}
.auth-page .auth-scene .auth-sess:nth-child(3) {animation:auth-line .5s var(--ease) .46s both;}
.auth-page .auth-side>.auth-spec {animation:auth-line .5s var(--ease) .54s both;}
@keyframes auth-line {from {opacity:0;transform:translateY(8px);}}

/* ---- form pane ---- */
/* Positioned so the centre loader can cover exactly this pane. Its height is
   animated by login.js on a panel switch, so the card resizes instead of jumping. */
.auth-page .auth-main {position:relative;display:flex;flex-direction:column;justify-content:center;
  padding:clamp(26px,3.4vw,42px) clamp(22px,3.2vw,40px);transition:height .32s var(--ease);}
.auth-page .auth-card {width:100%;max-width:392px;margin:0 auto;padding:0;background:none;border:none;border-radius:0;box-shadow:none;}
.auth-page .auth-panel[hidden] {display:none;}
/* Switches only: on first paint the card's own rise is the entrance, and a
   sideways slide there would push the panel past a phone's edge mid-flight. */
.auth-page .auth-main.is-switched .auth-panel {animation:auth-panel .36s var(--ease) both;}
.auth-page .auth-main.is-switched .auth-panel.from-left {animation-name:auth-panel-l;}
@keyframes auth-panel {from {opacity:0;transform:translateX(14px);filter:blur(2px);}}
@keyframes auth-panel-l {from {opacity:0;transform:translateX(-14px);filter:blur(2px);}}
.auth-page .auth-card h1 {font-size:24px;font-weight:600;line-height:1.15;letter-spacing:-.03em;}
.auth-page .auth-card .sub {margin-top:8px;font-size:13.5px;line-height:1.5;color:var(--muted);}

.auth-page .auth-oauth {width:100%;margin-top:22px;}
.auth-page .auth-oauth svg {transition:transform .25s var(--ease);}
.auth-page .auth-oauth:hover svg {transform:rotate(-8deg) scale(1.08);}
.auth-page .auth-sep {display:flex;align-items:center;gap:14px;margin:20px 0;font-family:var(--mono);font-size:11px;letter-spacing:.08em;text-transform:uppercase;color:var(--faint);}
.auth-page .auth-sep::before,.auth-page .auth-sep::after {content:"";flex:1;height:1px;background:var(--home-line);}

.auth-page .auth-form {display:flex;flex-direction:column;gap:14px;margin-top:22px;}
.auth-page .field {position:relative;display:flex;flex-direction:column;gap:6px;}
.auth-page .field label {font-size:12.5px;font-weight:500;color:var(--muted);transition:color .16s;}
.auth-page .field:focus-within label {color:var(--text);}
.auth-page .control {position:relative;display:flex;align-items:center;}
/* A text field is identified by its edge alone, so the resting border is the
   3:1 control edge (--home-control-border), never the grouping hairline. */
.auth-page .field input {width:100%;height:44px;padding:0 13px 0 38px;font-family:var(--sans);font-size:14.5px;color:var(--text);
  background:var(--home-well);border:1px solid var(--home-control-border);border-radius:var(--home-radius-row);
  transition:border-color .16s,box-shadow .2s,background .16s;}
.auth-page .field input:hover {border-color:var(--muted);}
.auth-page .field input:focus {outline:none;border-color:var(--text);background:var(--home-canvas);box-shadow:0 0 0 4px var(--home-line);}
.auth-page .field input[aria-invalid="true"] {border-color:var(--home-danger);box-shadow:0 0 0 4px var(--home-danger-bg);}
.auth-page .control:has(.eye) input {padding-right:44px;}
.auth-page .control .lead {position:absolute;left:12px;width:15px;height:15px;color:var(--home-glyph);pointer-events:none;transition:color .16s;}
.auth-page .control:focus-within .lead {color:var(--text);}
.auth-page .field:has([aria-invalid="true"]) .lead {color:var(--home-danger);}
/* A valid address earns a tick at the end of its field, drawn in. */
.auth-page .control .ok-mark {position:absolute;right:13px;width:15px;height:15px;color:var(--home-live);pointer-events:none;
  stroke-dasharray:24;stroke-dashoffset:24;opacity:0;transition:stroke-dashoffset .35s var(--ease),opacity .2s;}
.auth-page .control.is-valid .ok-mark {stroke-dashoffset:0;opacity:1;}
/* A suggested fix outranks the tick: "valid" and "did you mean" never show together. */
.auth-page .field:has(.field-suggest.show) .ok-mark {opacity:0;}
.auth-page .eye {position:absolute;top:50%;right:3px;display:flex;align-items:center;justify-content:center;width:40px;height:38px;
  translate:0 -50%;color:var(--home-glyph);background:none;border:none;border-radius:var(--home-radius-row);cursor:pointer;transition:color .16s,background .16s;}
.auth-page .eye:hover {color:var(--text);background:var(--home-hover);}
.auth-page .eye[aria-pressed="true"] {color:var(--text);}
.auth-page .eye svg {width:16px;height:16px;}
.auth-page .field .hint {font-size:12px;color:var(--faint);transition:color .2s;}
.auth-page .field .hint.good {color:var(--home-live);}
.auth-page .field .forgot {position:absolute;top:0;right:0;font-size:12.5px;color:var(--muted);
  text-decoration:underline;text-decoration-color:var(--home-line-focus);text-decoration-thickness:1px;text-underline-offset:3px;transition:color .16s,text-decoration-color .16s;}
.auth-page .field .forgot:hover {color:var(--text);text-decoration-color:currentColor;}
/* The problem under the field it belongs to, sliding open rather than popping. */
.auth-page .field-err {display:grid;grid-template-rows:0fr;font-size:12.5px;color:var(--home-danger);transition:grid-template-rows .22s var(--ease);}
.auth-page .field-err>span {overflow:hidden;}
.auth-page .field-err.show {grid-template-rows:1fr;}
.auth-page .caps {font-size:12px;color:var(--home-busy);}
/* "Did you mean ...@gmail.com?" One click puts it in the field. */
.auth-page .field-suggest {display:grid;grid-template-rows:0fr;font-size:12.5px;color:var(--muted);transition:grid-template-rows .22s var(--ease);}
.auth-page .field-suggest>span {overflow:hidden;}
.auth-page .field-suggest.show {grid-template-rows:1fr;}
.auth-page .field-suggest.show>span {overflow:visible;}
.auth-page .field-suggest button {padding:0;font:inherit;font-weight:500;color:var(--text);background:none;border:none;cursor:pointer;
  text-decoration:underline;text-decoration-color:var(--home-line-focus);text-underline-offset:3px;transition:text-decoration-color .16s;}
.auth-page .field-suggest button:hover {text-decoration-color:currentColor;}
/* Which door this browser used last time. */
.auth-page .auth-last {display:inline-flex;align-items:center;margin-left:8px;padding:1px 8px;font-size:11px;font-weight:500;line-height:1.6;
  color:var(--muted);background:var(--home-raised);border:1px solid var(--home-line);border-radius:var(--home-radius-chip);
  animation:auth-fade .4s var(--ease) .3s both;}
.auth-page .auth-oauth .auth-last {margin-left:2px;}
/* Counting down a rate limit: the button is visibly parked, not broken. */
.auth-page .auth-submit:disabled {cursor:not-allowed;opacity:.55;}
.auth-page .caps[hidden] {display:none;}

/* Password length meter: four rungs, because length is what counts here. */
.auth-page .pw-meter {display:grid;grid-template-columns:repeat(4,1fr);gap:4px;height:3px;margin-top:2px;}
.auth-page .pw-meter i {border-radius:2px;background:var(--home-line);transition:background .25s,transform .25s var(--ease);transform-origin:left;}
.auth-page .pw-meter[data-level="1"] i:nth-child(-n+1),
.auth-page .pw-meter[data-level="2"] i:nth-child(-n+2) {background:var(--home-busy);}
.auth-page .pw-meter[data-level="3"] i:nth-child(-n+3),
.auth-page .pw-meter[data-level="4"] i {background:var(--home-live);}

.auth-page .captcha {display:flex;justify-content:center;align-items:center;min-height:65px;}
.auth-page .captcha[hidden] {display:none;}
.auth-page .captcha iframe {max-width:100%;}

/* ---- the submit: label, spinner, then a tick when it lands ---- */
.auth-page .auth-submit {position:relative;width:100%;margin-top:4px;overflow:hidden;}
.auth-page .auth-submit .btn-label {transition:opacity .18s,transform .18s var(--ease);}
.auth-page .auth-submit .btn-spin {position:absolute;inset:0;margin:auto;width:18px;height:18px;border:2px solid currentColor;border-right-color:transparent;
  border-radius:50%;opacity:0;transform:scale(.6);transition:opacity .18s,transform .18s var(--ease);}
.auth-page .auth-submit[data-busy="true"] {cursor:progress;}
.auth-page .auth-submit[data-busy="true"] .btn-label {opacity:0;transform:translateY(-6px);}
.auth-page .auth-submit[data-busy="true"] .btn-spin {opacity:1;transform:none;animation:auth-spin .7s linear infinite;}
.auth-page .auth-submit:active:not([data-busy="true"]) {transform:scale(.985);}
@keyframes auth-spin {to {rotate:360deg;}}

/* ---- status ---- */
.auth-page .auth-msg {display:none;margin-top:16px;padding:11px 13px;font-size:13px;line-height:1.5;
  border:1px solid transparent;border-radius:var(--home-radius-row);}
.auth-page .auth-msg.show {display:block;animation:auth-msg .3s var(--ease) both;}
@keyframes auth-msg {from {opacity:0;transform:translateY(-4px);}}
.auth-page .auth-msg.err {color:var(--home-danger);background:var(--home-danger-bg);border-color:color-mix(in srgb,var(--home-danger) 30%,transparent);}
.auth-page .auth-msg.ok {color:var(--home-live);background:color-mix(in srgb,var(--home-live) 8%,transparent);border-color:color-mix(in srgb,var(--home-live) 28%,transparent);}
.auth-page .auth-msg.info {color:var(--muted);background:var(--home-raised);border-color:var(--home-line);}
.auth-page .auth-msg a {color:inherit;text-decoration:underline;text-underline-offset:3px;}

/* ---- the centre loader ---- */
.auth-page .auth-loader {position:absolute;inset:0;z-index:5;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:16px;
  background:color-mix(in srgb,var(--home-surface) 84%,transparent);-webkit-backdrop-filter:blur(6px);backdrop-filter:blur(6px);
  animation:auth-fade .24s var(--ease) both;}
.auth-page .auth-loader[hidden] {display:none;}
@keyframes auth-fade {from {opacity:0;}}
.auth-page .auth-spinner {position:relative;width:48px;height:48px;}
.auth-page .auth-spinner svg {position:absolute;inset:0;width:100%;height:100%;}
.auth-page .auth-spinner circle {fill:none;stroke:var(--text);stroke-width:3;stroke-linecap:round;stroke-dasharray:90 150;transform-origin:center;
  animation:auth-spin 1s linear infinite,auth-arc 1.6s ease-in-out infinite;}
@keyframes auth-arc {0% {stroke-dasharray:4 150;} 50% {stroke-dasharray:90 150;stroke-dashoffset:-20;} 100% {stroke-dasharray:4 150;stroke-dashoffset:-124;}}
.auth-page .auth-tick {padding:12px;opacity:0;}
.auth-page .auth-tick path {fill:none;stroke:var(--home-accent-ink);stroke-width:2.6;stroke-linecap:round;stroke-linejoin:round;stroke-dasharray:24;stroke-dashoffset:24;}
/* Landed: the ring fills white and a tick draws through it before the dashboard loads. */
.auth-page .auth-loader.is-done .auth-spinner {border-radius:50%;background:var(--home-accent);animation:auth-pop .4s var(--ease) both;}
.auth-page .auth-loader.is-done circle {opacity:0;}
.auth-page .auth-loader.is-done .auth-tick {opacity:1;}
.auth-page .auth-loader.is-done .auth-tick path {animation:auth-draw .4s var(--ease) .12s forwards;}
@keyframes auth-pop {from {transform:scale(.6);}}
@keyframes auth-draw {to {stroke-dashoffset:0;}}
.auth-page .auth-loader-text {font-size:13.5px;color:var(--muted);animation:auth-line .3s var(--ease) both;}

/* ---- the fine print ---- */
.auth-page .auth-spec {display:grid;grid-template-columns:1fr 1fr;gap:8px 14px;margin-top:20px;padding-top:18px;
  border-top:1px solid var(--home-line);font-size:12px;color:var(--faint);}
.auth-page .auth-spec-m {display:none;}
.auth-page .auth-spec span {display:inline-flex;align-items:center;gap:6px;}
.auth-page .auth-spec svg {flex:none;width:12px;height:12px;color:var(--home-live);}
.auth-page .auth-alt {margin-top:22px;font-size:13.5px;text-align:center;color:var(--muted);}
.auth-page .auth-alt a {color:var(--text);text-decoration:underline;text-decoration-color:var(--home-line-focus);text-decoration-thickness:1px;text-underline-offset:4px;transition:text-decoration-color .16s;}
.auth-page .auth-alt a:hover {text-decoration-color:currentColor;}
.auth-page .auth-foot {max-width:46ch;margin-top:26px;font-size:12px;line-height:1.6;text-align:center;color:var(--faint);animation:auth-line .5s var(--ease) .5s both;}
.auth-page .auth-foot a {color:var(--muted);text-decoration:underline;text-decoration-color:var(--home-line-focus);text-underline-offset:3px;}

@media (max-width:880px) {
  .auth-page .auth-shell {grid-template-columns:1fr;max-width:452px;}
  .auth-page .auth-side {display:none;}
  .auth-page .auth-spec-m {display:grid;}
}
@media (max-width:600px) {
  /* 44px targets for the two actions that are links, without moving the sentence. */
  .auth-page .auth-alt a,.auth-page .field .forgot,.auth-page .field-suggest button {display:inline-block;padding:14px 8px;margin:-14px -8px;}
  .auth-page .field .forgot {top:-14px;right:-8px;margin:0;}
  .auth-page .eye {width:44px;height:44px;}
}
@media (max-width:560px) {
  .auth-page .auth-wrap {min-height:auto;padding-top:24px;justify-content:flex-start;}
  .auth-page .auth-shell {background:none;border:none;border-radius:0;box-shadow:none;}
  .auth-page .auth-main {padding:4px 0;}
  .auth-page .auth-loader {background:color-mix(in srgb,var(--home-canvas) 84%,transparent);}
}
/* Motion off: the global kill above stops everything; the two spinners are
   progress, not decoration, so they keep turning. */
@media (prefers-reduced-motion:reduce) {
  .site .auth-page .auth-submit[data-busy="true"] .btn-spin,
  .site .auth-page .auth-spinner circle {animation:auth-spin 1s linear infinite!important;}
}

/* Homepage films: quiet chrome, a poster invitation, then the film itself. */
.home-page .film-player {position:relative;isolation:isolate;overflow:hidden;border:1px solid var(--home-line);border-radius:var(--home-radius-card);background:var(--home-shadow);box-shadow:var(--home-lift);}
.home-page .film-player video {display:block;width:100%;border:0;border-radius:0;cursor:pointer;}
.home-page .film-player::after {content:"";position:absolute;inset:0;z-index:1;pointer-events:none;background:linear-gradient(transparent 35%,color-mix(in srgb,var(--home-shadow) 65%,transparent));transition:opacity .25s;}
.home-page .film-player.has-started::after {opacity:0;}
.home-page .film-player [hidden] {display:none;}
.home-page .film-player button {font-family:var(--sans);cursor:pointer;}
.home-page .film-start {position:absolute;z-index:3;inset:0;margin:auto;width:max-content;height:80px;display:flex;align-items:center;gap:16px;padding:12px 24px 12px 12px;border:1px solid var(--home-border);border-radius:var(--home-radius-card);color:var(--home-text);background:color-mix(in srgb,var(--home-surface) 92%,transparent);backdrop-filter:blur(16px);box-shadow:var(--home-lift);transition:transform .2s,background .2s;}
.home-page .film-start:hover {transform:translateY(-2px);background:var(--home-hover);}
.home-page .film-start>svg {width:52px;height:52px;padding:14px;box-sizing:border-box;border-radius:50%;background:var(--home-accent);color:var(--home-accent-ink);}
.home-page .film-start span {text-align:left;font-size:15px;font-weight:500;}
.home-page .film-start small {display:block;margin-top:6px;font:400 12px var(--mono);color:var(--home-muted);}
.home-page .film-controls {position:absolute;z-index:2;inset:auto 0 0;padding:32px 16px 8px;background:linear-gradient(transparent,var(--home-shadow));opacity:0;visibility:hidden;transition:opacity .2s;}
.home-page .film-player.has-started .film-controls {opacity:1;visibility:visible;}
.home-page .film-player.is-playing.is-quiet:not(:has(:focus-visible)) .film-controls {opacity:0;pointer-events:none;}
.home-page .film-player.is-playing.is-quiet {cursor:none;}
.home-page .film-player.is-playing.is-quiet video {cursor:none;}
.home-page .film-control-row {display:flex;align-items:center;gap:8px;}
.home-page .film-control-row button {display:grid;place-items:center;flex-shrink:0;width:44px;height:44px;border:0;border-radius:var(--home-radius-chip);background:transparent;color:var(--home-text);}
.home-page .film-control-row button:hover {background:var(--home-hover);}
.home-page .film-control-row svg {width:20px;height:20px;}
.home-page .film-control-spacer {flex:1;}
.home-page .film-time {font:400 12px var(--mono);color:var(--home-text);white-space:nowrap;font-variant-numeric:tabular-nums;}
.home-page .film-seek {--film-progress:0%;display:block;width:100%;height:24px;margin:0;appearance:none;background:transparent;cursor:pointer;}
.home-page .film-seek::-webkit-slider-runnable-track {height:3px;border-radius:var(--home-radius-chip);background:linear-gradient(to right,var(--home-accent) var(--film-progress),var(--home-control-border) var(--film-progress));}
.home-page .film-seek::-webkit-slider-thumb {appearance:none;width:12px;height:12px;margin-top:-4.5px;border:0;border-radius:50%;background:var(--home-accent);}
.home-page .film-seek::-moz-range-track {height:3px;border-radius:var(--home-radius-chip);background:var(--home-control-border);}
.home-page .film-seek::-moz-range-progress {height:3px;background:var(--home-accent);}
.home-page .film-seek::-moz-range-thumb {width:12px;height:12px;border:0;border-radius:50%;background:var(--home-accent);}
.home-page .film-seek:disabled {cursor:default;opacity:.5;}
.home-page .film-player :focus-visible {outline:2px solid var(--home-line-focus);outline-offset:2px;}
.home-page .film-status {position:absolute;z-index:4;top:16px;left:16px;right:16px;width:fit-content;max-width:calc(100% - 32px);margin:0;padding:8px 12px;border-radius:var(--home-radius-chip);background:var(--home-surface);color:var(--home-text);font-size:13px;}
.home-page .film-player:fullscreen {width:100%;height:100%;border:0;border-radius:0;box-shadow:none;}
.home-page .film-player:fullscreen video {width:100%;height:100%;max-height:none;object-fit:contain;border-radius:0;}
@media (max-width:600px) {
  .home-page .film-start {height:64px;gap:12px;padding:8px 16px 8px 8px;}
  .home-page .film-start>svg {width:44px;height:44px;padding:12px;}
  .home-page .film-start small {font-size:10px;}
  .home-page .film-controls {padding:20px 8px 4px;}
  .home-page .film-control-row {gap:4px;}
}
@media (prefers-reduced-motion:reduce) {
  .home-page .film-player::after,.home-page .film-start,.home-page .film-controls {transition:none;}
}
