/* =========================================================
   LFSolid launch page — rail layout system
   Three layers: .sheet → .sec/.sec-inner → .cells/.cell
   ========================================================= */

/* ---------- TOKENS — the only place numbers live ---------- */
:root {
  /* widths */
  --col-max: 1240px;                      /* the railed content column (one pair of rails) */
  --gutter-base: clamp(12px, 3vw, 112px); /* column inset from sheet edge */
  --gutter: var(--gutter-base);
  --panel-inset: clamp(8px, 2vw, 24px);   /* inset of full-width panels inside the sheet */
  --pad-y: clamp(48px, 7vw, 96px);        /* standard section vertical padding */
  --pad-x: clamp(20px, 4vw, 48px);        /* standard section horizontal padding */
  --nav-clear: 100px;                     /* fixed navbar: 24px top + ~68px pill + breathing room */

  /* color — light, cool grey, indigo (Website-O). Every color is
     light-dark(light, dark). Dark is the default — the OS is not consulted —
     and data-theme="light" is the only thing that turns it light. */
  color-scheme: dark;
  --bg:         light-dark(#F9F9F9, #15181B);   /* page ground — same as the sheet */
  --surface:    light-dark(#F9F9F9, #15181B);   /* the sheet (unified with --bg) */
  --card:       light-dark(#FFFFFF, #1F2428);
  --card-tray:  light-dark(#F0F1F2, #1A1E22);
  --fg:         light-dark(#343A40, #F2F4F6);
  --muted:      light-dark(#8290A1, #98A2AE);
  --accent: #4867FF;
  --accent-ink: #FFFFFF;
  --accent-text: light-dark(#4867FF, #8DA1FF); /* accent as text on the surface */
  --ok-text:     light-dark(#2F9E6C, #5BC48F);

  /* lines */
  --line:       light-dark(#E2E5E9, #22272C);   /* every hairline: h-lines, rails, seams */
  /* card / chip / tile / panel edges. Deliberately SOFTER than --line: those are
     structural hairlines you should read, these only need to seat a surface — a
     card that is visibly outlined reads as a box rather than a raised surface. */
  --line-frame: light-dark(#E7EAED, #282E33);
  --band:       light-dark(#F1F2F4, #1A1E22);   /* separation strips: one step off the page ground */
  --dot:        light-dark(#FFFFFF, #15181B);   /* node at every line intersection */
  --dot-ring:   light-dark(#DADEE2, #3E454C);
  --dot-size: 6px;                            /* node at intersections; 5px on mobile */

  --radius: 16px;
  --radius-sm: 10px;
  --font: "Rethink Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif;
  --mono: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
}
/* dark is the ground state; only an explicit light choice overrides it */
:root[data-theme="light"] { color-scheme: light; }
:root[data-theme="dark"]  { color-scheme: dark; }

/* dark surface (footer panel): dark in both themes, deeper in dark mode */
.is-dark {
  --surface:    light-dark(#1F2327, #0F1214);
  --card:       light-dark(#262B30, #171B1F);
  --card-tray:  light-dark(#1A1E22, #121518);
  --band:       light-dark(#262B30, #171B1F);
  --fg: #F2F4F6;
  --muted:      light-dark(#9AA3AE, #98A2AE);
  --line:       light-dark(#30363B, #23292E);
  --line-frame: light-dark(#30363B, #23292E);
  --dot:        light-dark(#1F2327, #0F1214);
  --dot-ring:   light-dark(#4A5158, #3A4148);
}

/* ---------- BASE ---------- */
* { box-sizing: border-box; }
html { -webkit-text-size-adjust: 100%; }
body {
  margin: 0;
  background: var(--bg);
  color: var(--fg);
  font: 400 1rem/1.6 var(--font);
  -webkit-font-smoothing: antialiased;
}
h1, h2, h3, p { margin: 0; }
h1, h2, h3 { text-wrap: balance; letter-spacing: -0.02em; font-weight: 600; line-height: 1.1; }
h1 { font-size: clamp(2.25rem, 5.2vw, 3.75rem); }
h2 { font-size: clamp(1.625rem, 3vw, 2.375rem); }
h3 { font-size: 1.0625rem; letter-spacing: -0.01em; line-height: 1.35; }
p  { color: var(--muted); }
a  { color: inherit; text-decoration: none; }
:focus-visible { outline: 2px solid var(--accent); outline-offset: 3px; border-radius: 4px; }
code, pre { font-family: var(--mono); }
ul { margin: 0; padding: 0; list-style: none; }

/* ---------- LAYER 1 — SHEET ----------
   Full-viewport ground, centered sheet. Horizontal lines run
   sheet-edge to sheet-edge. */
.sheet {
  width: 100%;                 /* full-bleed ground: h-lines and gap strips run edge to edge */
  background: var(--surface);
  min-height: 100vh;
}

/* ---------- LAYER 2 — SECTION ----------
   <section class="sec"><div class="sec-inner">…</div></section>
   .sec       = full sheet width, draws the horizontal line on top
   .sec-inner = the railed column, draws both rails + corner dots */
.sec { position: relative; border-top: 1px solid var(--line); }
.sec:first-child { border-top: 0; }

.sec-inner {
  position: relative;
  width: min(var(--col-max), 100% - 2 * var(--gutter));
  margin-inline: auto;
  border-inline: 1px solid var(--line);
}
/* corner dots: exactly where the rail meets the horizontal line */
.sec-inner::before, .sec-inner::after {
  content: "";
  position: absolute;
  top: -0.5px;
  width: var(--dot-size); height: var(--dot-size);
  border-radius: 50%;
  background: var(--dot);
  box-shadow: 0 0 0 1px var(--dot-ring);
  z-index: 2;
  pointer-events: none;
}
.sec-inner::before { left: -0.5px;  translate: -50% -50%; }
.sec-inner::after  { right: -0.5px; translate:  50% -50%; }
.sec:first-child > .sec-inner::before,
.sec:first-child > .sec-inner::after { display: none; } /* no line above = no dot */

/* opt-in: center axis — connectors from the h-line to the content and
   from the content to the next h-line, plus a center dot */
.sec--axis::before, .sec--axis::after {
  content: "";
  position: absolute;
  left: 50%; translate: -50% 0;
  width: var(--dot-size);
  pointer-events: none;
}
.sec--axis::before {
  top: calc(-1 * var(--dot-size) / 2 - 0.5px);
  height: calc(var(--pad-y) + var(--dot-size) / 2);
  background:
    radial-gradient(circle at 50% calc(var(--dot-size) / 2),
      var(--dot) calc(var(--dot-size) / 2 - 0.5px),
      var(--dot-ring) calc(var(--dot-size) / 2 + 0.5px),
      transparent calc(var(--dot-size) / 2 + 1.5px)) no-repeat,
    linear-gradient(var(--line), var(--line)) 50% 0 / 1px 100% no-repeat;
  z-index: 2;
}
.sec--axis::after {
  bottom: 0;
  height: var(--pad-y);
  background: linear-gradient(var(--line), var(--line)) 50% 0 / 1px 100% no-repeat;
}
.sec:first-child.sec--axis::before { display: none; }

/* opt-in: a section without rails (for full-width panels) */
.sec--wide > .sec-inner { width: auto; border: 0; }
.sec--wide > .sec-inner::before, .sec--wide > .sec-inner::after { display: none; }

/* ---------- LAYER 3 — CELLS ----------
   A grid whose seams are hairlines. Columns auto-fit from --cell-min;
   cells draw only top+left borders with -1px margins and the wrapper
   clips, so outer borders never fight the rails and lines never double. */
.cells {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(min(var(--cell-min, 280px), 100%), 1fr));
  overflow: clip;
}
.cell {
  min-width: 0;
  padding: clamp(28px, 4vw, 44px) var(--pad-x);
  border-left: 1px solid var(--line);
  border-top: 1px solid var(--line);
  margin-left: -1px;
  margin-top: -1px;
}
.cell > * { min-width: 0; max-width: 100%; } /* long code/images scroll inside, never widen the cell */
.cells--tight .cell { padding: clamp(20px, 3vw, 32px) var(--pad-x); }

/* ---------- CONTENT PRIMITIVES ---------- */
.pad   { padding: var(--pad-y) var(--pad-x); }
.stack { display: grid; gap: 14px; }
.center { text-align: center; justify-items: center; }
.measure { max-width: 60ch; }
.row { display: flex; align-items: center; gap: 12px; flex-wrap: wrap; }

.btn {
  display: inline-flex; align-items: center; gap: 10px;
  padding: 12px 20px; border-radius: 999px;
  background: var(--accent); color: var(--accent-ink);
  font-weight: 500; font-size: 0.9375rem; line-height: 1;
  border: 1px solid transparent;
  white-space: nowrap;
}
.btn .arrow {
  width: 22px; height: 22px; border-radius: 50%;
  background: rgba(255,255,255,.18);
  display: inline-grid; place-items: center; font-size: 12px;
}
.btn--ghost { background: var(--card); color: var(--fg); border-color: var(--line-frame); }

.badge {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 6px 12px 6px 8px; border-radius: 999px;
  background: var(--card); border: 1px solid var(--line-frame);
  font-size: 0.8125rem; color: var(--muted);
}
.badge b { color: var(--fg); font-weight: 600; }
.badge i {
  width: 6px; height: 6px; border-radius: 50%; background: var(--accent);
  box-shadow: 0 0 0 3px color-mix(in srgb, var(--accent) 18%, transparent);
}

/* ---------- PILLS (peec.ai recipe) ----------
   A 1px gradient ring drawn with two backgrounds (padding-box card colour
   under a border-box gradient), one soft drop shadow. Two shapes share it:
   .urlpill (hero, round) and .eyebrow (section label, 6px). */
.pill {
  --ring-a: light-dark(rgba(157,157,157,.12), rgba(255,255,255,.14));
  --ring-b: light-dark(rgba(0,0,0,.12),       rgba(255,255,255,.04));
  border: 1px solid transparent;
  background:
    linear-gradient(var(--card), var(--card)) padding-box,
    linear-gradient(var(--ring-a), var(--ring-b)) border-box;
  box-shadow: 0 4px 4px light-dark(rgba(23,23,23,.06), rgba(0,0,0,.35));
  color: var(--fg);
}

/* hero: copyable MCP URL */
.urlpill {
  appearance: none; cursor: pointer; font: inherit;
  display: inline-grid; grid-template-columns: auto auto; align-items: center; gap: 7px;
  height: 38px; padding: 0 12px 0 14px; border-radius: 100px;
  transition: box-shadow .15s ease;
}
.urlpill:hover { box-shadow: 0 4px 6px light-dark(rgba(23,23,23,.1), rgba(0,0,0,.45)); }
.urlpill__url, .urlpill__done { grid-area: 1 / 1; font: 500 .8125rem/16px var(--mono); letter-spacing: -0.04em; white-space: nowrap; opacity: .8; }
.urlpill__done { grid-area: 1 / 1 / 2 / 3; justify-self: center; display: inline-flex; align-items: center; gap: 8px; opacity: 0; transform: translateY(4px); transition: opacity .18s ease, transform .18s ease; }
.urlpill__done i { font-style: normal; }
.urlpill__url  { transition: opacity .18s ease, transform .18s ease; }
.urlpill__icon { grid-area: 1 / 2; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; opacity: .8; transition: opacity .18s ease; }
.urlpill.is-copied .urlpill__url  { opacity: 0; transform: translateY(-4px); }
.urlpill.is-copied .urlpill__done { opacity: .8; transform: none; }
.urlpill.is-copied .urlpill__icon { opacity: 0; }
@media (max-width: 420px) { .urlpill__url, .urlpill__done { font-size: .75rem; } }

/* section eyebrow: icon + short label above the h2 */
.eyebrow {
  display: inline-flex; align-items: center; gap: 6px;
  padding: 6px 12px 6px 9px; border-radius: 7px;
  font-size: .875rem; line-height: 16px; font-weight: 500; letter-spacing: -0.2px;
  justify-self: start; margin-bottom: 6px;
}
.center .eyebrow, .center > .eyebrow { justify-self: center; }
.eyebrow svg { width: 16px; height: 16px; fill: none; stroke: var(--muted); stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; opacity: .8; }

.card {
  background: var(--card);
  border: 1px solid var(--line);
  border-radius: var(--radius);
  box-shadow: 0 1px 2px rgba(20,30,40,.04), 0 12px 32px -18px rgba(20,30,40,.14);
}
.tray { background: var(--card-tray); border-radius: calc(var(--radius) + 6px); padding: 6px; }

.tag {
  font: 500 0.75rem/1 var(--mono);
  color: var(--muted);
  background: var(--card-tray);
  border: 1px solid var(--line);
  padding: 5px 8px; border-radius: 6px;
}

.code {
  margin: 0; padding: 20px 22px;
  font-size: 0.8125rem; line-height: 1.7;
  color: var(--fg);
  overflow-x: auto;
  tab-size: 2;
}
.code .t { color: var(--muted); }
.code .a { color: var(--accent-text); }
.code .v { color: var(--ok-text); }

.panel {
  margin: 0 var(--panel-inset);
  /* rails inside the panel line up with the sheet's rails */
  --gutter: calc(var(--gutter-base) - var(--panel-inset) - 1px);
  border-radius: 24px 24px 0 0;
  background: var(--surface);
  color: var(--fg);
  position: relative;
  overflow: clip;
  border: 1px solid var(--line-frame);
  border-bottom: 0;
}

/* ---------- MOBILE: collapse the layers ----------
   Below 768px the sheet inset and panel inset carry no information and
   just stack lines next to each other. Sheet and panel go full-bleed with
   no side borders; the two rails are the only vertical lines left. */
@media (max-width: 767px) {
  :root {
    --gutter-base: 16px;
    --panel-inset: 0px;
    --dot-size: 5px;
  }
  .panel {
    border-inline: 0;
    border-radius: 20px 20px 0 0;
    --gutter: var(--gutter-base); /* no panel border → rails align 1:1 with the sheet's */
  }
}

/* hero clears the fixed navbar pill */
.hero { padding-top: calc(var(--nav-clear) + var(--pad-y) * .9); }

/* ---------- FOOTER (links from the Website-O footer, rail style) ---------- */
.foot-brand { display: grid; gap: 14px; align-content: start; }
.foot-brand__logo { display: block; width: 132px; height: 34px; }
.foot-brand p { font-size: 0.9375rem; max-width: 34ch; }

.foot-col h3 { font-size: 0.875rem; font-weight: 600; letter-spacing: 0; margin-bottom: 14px; }
.foot-col ul { display: grid; gap: 10px; }
.foot-col a { font-size: 0.9375rem; color: var(--muted); transition: color .15s ease; }
.foot-col a:hover { color: var(--fg); }

.foot-bottom {
  display: flex; align-items: center; justify-content: space-between; gap: 14px 22px; flex-wrap: wrap;
  padding: 20px clamp(20px, 3vw, 32px);
  font-size: 0.8125rem; color: var(--muted);
}
.foot-legal { display: flex; gap: 18px; flex-wrap: wrap; }
.foot-legal a:hover { color: var(--fg); }
.foot-social { display: flex; gap: 6px; }
.foot-social a {
  display: grid; place-items: center; width: 34px; height: 34px; border-radius: 8px;
  opacity: .7; transition: opacity .15s ease, background-color .15s ease;
}
.foot-social a:hover { opacity: 1; background: rgba(255,255,255,.06); }
.foot-social img { width: 18px; height: 18px; display: block; }
.foot-social .is-fb { width: 10px; }

/* links with no destination on lightfunnels.com yet */
.is-disabled { opacity: .45; pointer-events: none; cursor: default; }

/* ---------- THEME CONTROLS ---------- */
/* icon toggle in the navbar pill (desktop) */
.lf-theme {
  display: inline-flex; align-items: center; justify-content: center;
  width: 42px; height: 42px; padding: 0; border: 0; border-radius: 999px;
  background: var(--neutral-900, #343a40); color: #fff; cursor: pointer;
  transition: background-color .18s ease;
}
.lf-theme:hover { background: #3d444b; }
.lf-theme svg { width: 18px; height: 18px; display: block; }
.lf-theme .i-sun { display: none; }
:root:not([data-theme="light"]) .lf-theme .i-sun { display: block; }
:root:not([data-theme="light"]) .lf-theme .i-moon { display: none; }
@media (max-width: 1023px) { .lf-actions .lf-theme { display: none; } }

/* segmented Light / Dark (footer + mobile panel) */
.seg {
  display: inline-flex; padding: 3px; border-radius: 999px;
  background: var(--card-tray); border: 1px solid var(--line);
}
.seg button {
  appearance: none; border: 0; background: transparent; color: var(--muted);
  font: 500 0.8125rem/1 var(--font); padding: 7px 12px; border-radius: 999px; cursor: pointer;
  transition: background-color .15s ease, color .15s ease;
}
.seg button:hover { color: var(--fg); }
/* the language row carries seven options — a single pill row would overflow the
   burger panel, so this variant wraps and squares off its corners */
.seg--wrap { flex-wrap: wrap; border-radius: 14px; justify-content: flex-end; gap: 2px; }
.seg--wrap button { padding: 6px 10px; font-size: 0.78125rem; }
.seg button[aria-pressed="true"] { background: var(--card); color: var(--fg); box-shadow: 0 1px 2px rgba(0,0,0,.12); }
.lf-mobile .seg-row {
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  padding: 10px 16px 6px; color: var(--neutral-300, #dce3e9); font-size: 15px;
}
.lf-mobile .seg { --card-tray: rgba(255,255,255,.06); --line: rgba(255,255,255,.08); --card: rgba(255,255,255,.14); --fg: #fff; --muted: rgba(255,255,255,.62); }

/* navbar pill needs an edge on dark surfaces */
.lf-navbar { border: 1px solid light-dark(transparent, rgba(255,255,255,.07)); }
.lf-menu__panel { border-color: light-dark(#2a2b30, #383c42); }

/* ---------- V2 CONTENT COMPONENTS ---------- */
/* empty slot: reserved space for a visual, nothing invented */
.slot {
  display: flex; align-items: center; justify-content: center; gap: 4px; text-align: center;
  border: 1px dashed var(--line-frame); border-radius: var(--radius);
  color: var(--muted); font-size: .8125rem;
  background: color-mix(in srgb, var(--card) 45%, transparent);
  min-height: 120px;
}
.slot--logo { width: 56px; height: 56px; min-height: 0; border-radius: 14px; font-size: .6875rem; }
/* real brand marks, reusing the sprite defined at the top of the document */
.brandtile {
  width: 56px; height: 56px; border-radius: 15px; display: grid; place-items: center;
  background: var(--tile, #111);
  box-shadow: 0 2px 8px rgba(15,20,28,.14), inset 0 1px 0 rgba(255,255,255,.16);
}
.brandtile svg { width: 60%; height: 60%; display: block; }
.brandtile--codex { background: var(--card); border: 1px solid var(--line-frame); }
.brandtile--codex svg { width: 62%; height: 62%; }
.brandtile--cc { background: var(--card); border: 1px solid var(--line-frame); color: #D97757; }
.brandtile--cc svg { fill: currentColor; }
/* "works with": the three clients share one card (same skin as .tile), split by hairlines */
.clients-wrap { position: relative; overflow: hidden; border-top: 1px solid var(--line); padding: clamp(28px, 4vw, 48px) var(--pad-x); background: var(--band); }   /* the fire lives here, behind the card, on the same ground as the separation strips */
.clients {
  position: relative; z-index: 1; width: min(100%, 1040px); margin-inline: auto;
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr));
  border-radius: var(--radius); overflow: hidden;
  background: var(--card);                                  /* opaque: it floats over the fire */
  border: 1px solid light-dark(var(--line-frame), var(--line));
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.04), rgba(0,0,0,.3)), 0 24px 48px -24px light-dark(rgba(20,30,40,.22), rgba(0,0,0,.7));
}
.clients__item {
  position: relative; color: inherit; text-decoration: none;
  display: grid; justify-items: center; align-content: start; gap: 10px; text-align: center;
  padding: clamp(32px, 4vw, 48px) clamp(16px, 2.5vw, 28px);
  border-inline-start: 1px solid light-dark(var(--line), #343B42);   /* dark: --line is too faint here */
  transition: background .2s ease;
}
.clients__item:hover { background: light-dark(#FAFAFB, rgba(255,255,255,.03)); }
.clients__item:focus-visible { outline: 2px solid var(--accent); outline-offset: -2px; }
.clients__item .brandtile { transition: transform .25s cubic-bezier(.2,.7,.2,1); }
.clients__item:hover .brandtile { transform: translateY(-2px); }
/* the corner arrow: quiet until you hover the card */
.clients__go {
  position: absolute; top: 12px; inset-inline-end: 12px; width: 28px; height: 28px; border-radius: 50%;
  display: grid; place-items: center; color: var(--muted);
  background: var(--card-tray); border: 1px solid var(--line);
  opacity: .7; transition: opacity .2s ease, background .2s ease, color .2s ease, transform .25s cubic-bezier(.2,.7,.2,1);
}
.clients__go svg { width: 14px; height: 14px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.clients__item:hover .clients__go { opacity: 1; background: var(--accent); border-color: var(--accent); color: #fff; transform: translate(1px, -1px); }
.clients__item:first-child { border-inline-start: 0; }
.clients__item h3 { margin-top: 6px; }
.clients__item p { color: var(--muted); font-size: .9375rem; }
@media (max-width: 900px) {
  .clients { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .clients__item:nth-child(3) { border-inline-start: 0; }
  .clients__item:nth-child(n+3) { border-top: 1px solid light-dark(var(--line), #343B42); }
}
@media (max-width: 480px) {
  .clients { grid-template-columns: 1fr; }
  .clients__item { border-inline-start: 0; border-top: 1px solid light-dark(var(--line), #343B42); padding: 28px var(--pad-x); }
  .clients__item:first-child { border-top: 0; }
}

/* hero rotating prompt */
.prompt-line { font-size: .9375rem; color: var(--muted); min-height: 1.6em; }
.prompt-line b { color: var(--fg); font-weight: 500; }
.caret { display: inline-block; width: 1px; height: 1em; background: var(--fg); vertical-align: -0.15em; margin-left: 1px; animation: blink 1s steps(1) infinite; }
@keyframes blink { 50% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) { .caret { animation: none; } }

/* how it works — peec-style feature cards + stage
   left: stacked cards, the selected one is "ink" (white, shadow, accent bar);
   right: the visual for that step, framed by the rails' hairlines. */
.feat { display: grid; grid-template-columns: minmax(0, 5fr) minmax(0, 7fr); border-top: 1px solid var(--line); }
.feat__cards { --dur: 7s;   /* time each card holds the stage */
  display: grid; grid-auto-rows: 1fr; gap: 10px; padding: 10px; }
.fcard {
  appearance: none; text-align: start; font: inherit; color: inherit; cursor: pointer;
  display: grid; align-content: center;
  padding: 28px 24px;
  border: 1px solid transparent; border-radius: var(--radius);
  background: var(--card-tray);                       /* light: flat grey, no border */
  transition: background-color .25s ease, box-shadow .25s ease, border-color .25s ease;
}
.fcard:hover { background: color-mix(in srgb, var(--card-tray) 60%, var(--card)); }
/* dark mode keeps the outlined look */
:root:not([data-theme="light"]) .fcard { border-color: var(--line); background: color-mix(in srgb, var(--card) 35%, transparent); }
:root:not([data-theme="light"]) .fcard:hover { background: color-mix(in srgb, var(--card) 70%, transparent); }
.fcard[aria-selected="true"] {
  background: var(--card); border-color: var(--line-frame);
  box-shadow: 0 1px 2px rgba(20,30,40,.04), 0 12px 32px -18px rgba(20,30,40,.18);
}
/* the rule on the left is a progress bar: the dim track shows how much is
   left, the accent ::before fills top-down and its animationend advances
   the stage (app.js). Hover or scrolling away pauses it. */
.fcard__in { position: relative; display: grid; gap: 12px; padding-inline-start: 24px; border-inline-start: 2px solid var(--line-frame); transition: border-color .25s ease; }
.fcard[aria-selected="true"] .fcard__in { border-inline-start-color: color-mix(in srgb, var(--accent) 28%, transparent); }
.fcard__in::before {
  content: ""; position: absolute; inset-inline-start: -2px; top: 0; width: 2px; height: 100%;
  background: var(--accent); transform: scaleY(0); transform-origin: 50% 0;
}
.fcard[aria-selected="true"] .fcard__in::before { animation: fcard-fill var(--dur, 7s) linear forwards; }
.feat__cards:hover .fcard__in::before,
.feat.is-paused .fcard__in::before { animation-play-state: paused; }
@keyframes fcard-fill { to { transform: scaleY(1); } }
@media (prefers-reduced-motion: reduce) {
  .fcard[aria-selected="true"] .fcard__in { border-inline-start-color: var(--accent); }
  .fcard[aria-selected="true"] .fcard__in::before { animation: none; }
}
.fcard__t { display: flex; align-items: center; gap: 10px; font-weight: 600; font-size: 1.1875rem; letter-spacing: -0.01em; color: var(--muted); transition: color .25s ease; }
.fcard__t svg { width: 20px; height: 20px; fill: none; stroke: currentColor; stroke-width: 1.75; stroke-linecap: round; stroke-linejoin: round; }
.fcard__d { color: var(--muted); font-size: .9375rem; line-height: 1.55; max-width: 34ch; opacity: .8; transition: opacity .25s ease; }
.fcard[aria-selected="true"] .fcard__t { color: var(--fg); }
.fcard[aria-selected="true"] .fcard__d { opacity: 1; }

.feat__stage {
  position: relative; border-inline-start: 1px solid var(--line);
  --stage-pad: clamp(24px, 4vw, 56px);
  --stage-h: 440px;
  padding: var(--stage-pad); display: grid; align-content: center;
}
/* Desktop only: every stage is exactly --stage-h, so switching tabs never
   resizes the block. Stacked (mobile) the stage is full width and there is
   nothing to line up with, so each one just fits its content. */
@media (min-width: 861px) {
  .feat__panel { height: var(--stage-h); }
  .askui { height: var(--stage-h); }
  .feat__panel--builder { align-content: start; }
  .b3d { height: calc(var(--stage-h) + var(--stage-pad)); }       /* bleeds into the stage's bottom padding */
  /* bottom-anchored: the asset's cards are cut at its own bottom edge, so
     pinning that edge to the box bottom leaves no strip at any width */
  .b3d .b3d__img { position: absolute; left: 0; right: 0; bottom: -2px; margin-inline: auto; }
}
@media (min-width: 861px) and (max-width: 1260px) {
  .feat__stage { --stage-h: 400px; }        /* narrower column: same composition, slightly smaller */
}
.feat__panel { display: grid; align-content: center; animation: blk-in .35s ease both; }
.feat__panel[hidden] { display: none; }
.feat__panel--video { animation-name: fade-in; }   /* no translate: a transformed panel would trap the video's inset:0 */
@keyframes fade-in { from { opacity: 0; } to { opacity: 1; } }
@media (prefers-reduced-motion: reduce) { .feat__panel { animation: none; } }
@media (max-width: 860px) {
  .feat { grid-template-columns: 1fr; }
  .feat__stage { border-inline-start: 0; border-top: 1px solid var(--line); }
  /* compact chip tabs: stacked full cards pushed the panel below the fold,
     so titles-only chips sit in one slim row and the stage shows right under.
     Hiding the progress rail also stops the auto-advance — on a phone the
     reader flips steps themselves. */
  .feat__cards { grid-auto-rows: auto; grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 8px; }
  .fcard { padding: 12px 8px 11px; border-radius: 14px; }
  .fcard__in { padding-inline-start: 0; border-inline-start: 0; gap: 0; justify-items: center; }
  .fcard__in::before { display: none; }
  .fcard__t { flex-direction: column; gap: 7px; font-size: .8125rem; letter-spacing: 0; text-align: center; line-height: 1.25; }
  .fcard__t svg { width: 18px; height: 18px; }
  .fcard__d { display: none; }
  .fcard[aria-selected="true"] .fcard__t { color: var(--accent-text); }
}

/* stage mocks: reuse the page's own chat / builder components */
.gchat.gchat--static { opacity: 1; transform: none; min-height: 0; }
/* step 1 stage: the clients, the one link, the payoff — on a looping
   horizon video that fills the whole stage cell (the panel isn't positioned,
   so inset:0 resolves against .feat__stage) */
.feat__bg {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 60%;
  pointer-events: none; z-index: 0;
}
.feat__panel--video .connect { position: relative; z-index: 1; }
/* the text sits on the planet's bright rim, so it's navy in both themes (the video doesn't change with the theme) */
.feat__panel--video .connect__cap { color: rgba(12,40,88,.82); text-shadow: 0 1px 0 rgba(255,255,255,.25); }
.feat__panel--video .link-arrow { color: #0B2A5C; }
/* step 2 stage: the chat floats over the warm (orange) planet. The bar alone
   shows first; once it's sent, a card fades in around the conversation so the
   text never sits directly on the video (see .askui::before). */
.feat__panel--warm .askui { position: relative; z-index: 1; }
.feat__panel--warm .askui__bar { box-shadow: 0 1px 2px rgba(80,40,0,.12), 0 12px 32px -14px rgba(80,40,0,.45); }
.feat__panel--video .connect__logo { box-shadow: 0 8px 24px -8px rgba(10,40,90,.35), 0 1px 2px rgba(10,40,90,.15); }
.feat__panel--video .urlpill--wide { box-shadow: 0 8px 24px -8px rgba(10,40,90,.35), 0 1px 2px rgba(10,40,90,.15); }
.connect { display: grid; justify-items: center; gap: 18px; text-align: center; }
.connect__logos { display: flex; flex-wrap: wrap; justify-content: center; gap: 10px; }
.connect__logo {
  position: relative; width: 48px; height: 48px; border-radius: 12px; display: grid; place-items: center;
  background: var(--card); border: 1px solid var(--line-frame);
  box-shadow: 0 1px 2px light-dark(rgba(23,23,23,.04), rgba(0,0,0,.3));
  cursor: default; outline-offset: 3px;
}
.connect__logo svg { width: 24px; height: 24px; display: block; fill: var(--fg); }
.connect__logo[data-client="claude"] svg { fill: #D97757; }
.connect__logo[data-client="codex"] svg { width: 26px; height: 26px; }            /* brings its own gradient */
.connect__logo[data-client="claudecode"] { color: #D97757; }                       /* Claude Code's mark is Claude-orange */
.connect__logo[data-client="claudecode"] svg { width: 26px; height: 26px; fill: currentColor; }
/* tooltip: the AI's name, above the tile */
.connect__logo::after {
  content: attr(data-tip); position: absolute; left: 50%; bottom: calc(100% + 8px); translate: -50% 4px;
  padding: 5px 9px; border-radius: 7px; white-space: nowrap;
  font: 500 .75rem/1.2 var(--font); color: var(--surface); background: var(--fg);
  opacity: 0; pointer-events: none; transition: opacity .15s ease, translate .15s ease;
}
.connect__logo:hover::after, .connect__logo:focus-visible::after { opacity: 1; translate: -50% 0; }
.urlpill--wide { height: 42px; padding: 0 14px 0 16px; }
.urlpill--wide .urlpill__url b { font-weight: 600; color: var(--accent-text); margin-inline-end: 8px; }
.connect__cap { font-size: .875rem; line-height: 1.6; color: var(--muted); }
/* tertiary: text link with an arrow that nudges on hover */
.link-arrow { display: inline-flex; align-items: center; gap: 6px; font-size: .9375rem; font-weight: 500; color: var(--fg); }
.link-arrow span { transition: translate .15s ease; }
.link-arrow:hover span { translate: 3px 0; }
.link-arrow:hover { text-decoration: underline; text-underline-offset: 3px; }
@media (max-width: 560px) { .urlpill--wide .urlpill__url { font-size: .6875rem; } .connect__cap br { display: none; } }

/* ---------- STEP 3: the page, open in the builder ----------
   A fixed 1120×600 scene (page replica + style panel), scaled to the stage
   width by app.js (--s) and tilted as one plane; the bottom fades out. */
/* top-aligned and one padding taller than the panel, so its bottom lands exactly
   on the stage's bottom edge — the cards run into the video, no strip left over */
.feat__panel--builder { align-content: start; }
/* The scene: one pre-composed tilted image (shadows baked in). Full width; on
   desktop the box clips it at the stage's bottom edge. Entrance animates
   `translate`, hover transitions `transform` — independent, so they compose. */
.b3d { position: relative; overflow: hidden; z-index: 1; }
.b3d__img { display: block; width: 100%; transition: transform .35s cubic-bezier(.2,.7,.2,1); }
.b3d__img:hover { transform: translateY(-6px); }
@media (prefers-reduced-motion: no-preference) {
  .feat__panel--builder .b3d__img { animation: b3d-rise .7s cubic-bezier(.2,.7,.2,1) both; }
}
@keyframes b3d-rise { from { opacity: 0; translate: 0 46px; } to { opacity: 1; translate: 0 0; } }

/* prompt builder — the prompt is a sentence; the highlighted words are
   selectors that open a small menu. One centred card that stands out. */
.madlib-wrap { position: relative; overflow: hidden; border-top: 1px solid var(--line); padding: clamp(64px, 8vw, 120px) var(--pad-x); display: grid; justify-items: center; }
/* the arc ripples behind the chat: fill colour follows the theme, lines are the accent */
.wave-arcs { position: absolute; inset: 0; width: 100%; height: 100%; display: block; color: var(--accent); pointer-events: none; }
.madlib-wrap .madlib { position: relative; z-index: 1; }
.madlib { position: relative; width: min(100%, 720px); border-radius: 20px; padding: 6px; }
.madlib__head { display: flex; align-items: center; gap: 10px; padding: 10px 14px 6px; font-size: .8125rem; color: var(--muted); }
/* the connected clients, stacked like avatars */
.avstack { display: flex; }
.avstack .askui__av { box-shadow: 0 0 0 2px var(--card); }
.avstack .askui__av + .askui__av { margin-inline-start: -9px; }
.avstack__gpt svg { fill: var(--fg); }
.avstack__codex svg { fill: none; width: 17px; height: 17px; }
.avstack__cc { color: #D97757; }
.avstack__cc svg { fill: currentColor; }
/* the rolling word inside a selector: old word slides up and out, next slides in */
.sel { transition: background-color .15s ease, border-color .15s ease, width .45s cubic-bezier(.2,.7,.2,1); white-space: nowrap; }
.sel__view { display: inline-grid; overflow: hidden; vertical-align: baseline; }
.sel__word { grid-area: 1 / 1; white-space: nowrap; transition: translate .45s cubic-bezier(.2,.7,.2,1), opacity .4s ease; }
.madlib__text { padding: 12px 20px 8px; color: var(--fg); font-size: clamp(1.125rem, 1.6vw, 1.375rem); line-height: 1.7; letter-spacing: -0.005em; text-wrap: pretty; }
.sel {
  appearance: none; font: inherit; cursor: pointer; color: var(--fg);
  display: inline-block; padding: 1px 6px 2px 8px; margin: 0 1px; border-radius: 8px;
  background: color-mix(in srgb, var(--accent) 10%, transparent);
  border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
  border-bottom-color: color-mix(in srgb, var(--accent) 45%, transparent);
  line-height: 1.35; transition: background-color .15s ease, border-color .15s ease;
}
.sel::after { content: ""; display: inline-block; width: 6px; height: 6px; margin-block: 0 3px; margin-inline: 6px 1px; border-right: 1.5px solid currentColor; border-bottom: 1.5px solid currentColor; rotate: 45deg; opacity: .55; }
.sel:hover, .sel[aria-expanded="true"] { background: color-mix(in srgb, var(--accent) 16%, transparent); border-color: color-mix(in srgb, var(--accent) 45%, transparent); }
.madlib__bar { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 10px 12px 10px 20px; border-top: 1px solid var(--line); margin-top: 6px; }
.madlib__hint { font-size: .8125rem; color: var(--muted); }
.sel-menu {
  position: absolute; z-index: 5; min-width: 180px; padding: 5px; margin: 0; list-style: none;
  border-radius: 12px; background: var(--card); border: 1px solid var(--line-frame);
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.05), rgba(0,0,0,.4)), 0 16px 40px -18px light-dark(rgba(20,30,40,.3), rgba(0,0,0,.7));
  animation: blk-in .18s ease both;
}
.sel-menu[hidden] { display: none; }
.sel-menu li { padding: 8px 12px; border-radius: 8px; font-size: .9375rem; color: var(--fg); cursor: pointer; }
.sel-menu li:hover, .sel-menu li[aria-selected="true"] { background: var(--card-tray); }
.sel-menu li[aria-selected="true"]::after { content: "✓"; float: right; color: var(--accent-text); font-size: .8125rem; }
.btn--sm { padding: 8px 14px; font-size: .8125rem; }
@media (max-width: 480px) { .madlib__text { padding: 10px 14px 6px; } .madlib__bar { padding-inline-start: 14px; } }

/* tiles — icon, title, one line. Light: white card + shadow (same as the
   selected step card). Dark: outlined, translucent (Attio-style). */
.tiles { display: grid; grid-template-columns: repeat(auto-fit, minmax(min(220px, 100%), 1fr)); gap: 12px; padding: 12px; border-top: 1px solid var(--line); }
.tiles--3 { grid-template-columns: repeat(auto-fit, minmax(min(260px, 100%), 1fr)); }
.tile {
  display: grid; gap: 6px; align-content: start; padding: 24px 24px 26px;
  border-radius: var(--radius);
  background: light-dark(var(--card), color-mix(in srgb, var(--card) 35%, transparent));
  border: 1px solid light-dark(var(--line-frame), var(--line));
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.04), transparent), 0 12px 32px -18px light-dark(rgba(20,30,40,.18), transparent);
}
/* icon tile — sequencehq recipe: 32px, soft gradient, 1px edge, 2px ring, layered shadow;
   the glyph inside is duotone (ic-a dark / ic-b light) with a hairline edge and a 1px drop */
.tile__ic {
  width: 32px; height: 32px; border-radius: 8px; display: grid; place-items: center; margin-bottom: 12px;
  background: linear-gradient(180deg, light-dark(#F7F7F7, #2A3036) 0%, light-dark(#FFFFFF, #22272C) 100%);
  border: 1px solid light-dark(#E5E7EA, #343B42);
  box-shadow:
    0 0 0 2px light-dark(#EFEFEF, rgba(255,255,255,.04)),
    0 22px 9px light-dark(rgba(0,0,0,.01), transparent),
    0 12px 7px light-dark(rgba(0,0,0,.04), rgba(0,0,0,.2)),
    0 5px 5px  light-dark(rgba(0,0,0,.06), rgba(0,0,0,.25)),
    0 1px 3px  light-dark(rgba(0,0,0,.07), rgba(0,0,0,.3));
}
.tile__ic svg { width: 20px; height: 20px; display: block; overflow: visible; }
.ic-a { fill: light-dark(#5E5E6B, #D5D9DF); stroke: light-dark(rgba(0,0,0,.1), rgba(255,255,255,.06)); stroke-width: 1; }
.ic-b { fill: light-dark(#B9BAC0, #6E7680); stroke: light-dark(rgba(0,0,0,.1), rgba(255,255,255,.06)); stroke-width: 1; }
.ic-s { fill: none; stroke: light-dark(#5E5E6B, #E5E8EC); stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.tile b { font-weight: 600; font-size: 1.0625rem; letter-spacing: -0.01em; }
.tile span { color: var(--muted); font-size: .9375rem; line-height: 1.55; }

/* faq */
.faq details { border-top: 1px solid var(--line); }
.faq details:first-child { border-top: 0; }
.faq summary {
  list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 16px 0; font-weight: 600; font-size: 1rem;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary i { width: 10px; height: 10px; flex-shrink: 0; position: relative; }
.faq summary i::before, .faq summary i::after { content: ""; position: absolute; inset: 0; margin: auto; background: var(--muted); transition: transform .2s ease; }
.faq summary i::before { width: 10px; height: 1.5px; }
.faq summary i::after { width: 1.5px; height: 10px; }
.faq details[open] summary i::after { transform: rotate(90deg); }
.faq details p { padding: 0 0 18px; max-width: 56ch; }

/* ---------- LIVE DEMO ---------- */
.demo { display: grid; grid-template-columns: minmax(0, 1.15fr) minmax(0, 1fr); gap: 16px; align-items: stretch; }
@media (max-width: 860px) { .demo { grid-template-columns: 1fr; } .demo .chat { order: -1; } }

/* preview (left) */
.pv { display: grid; grid-template-rows: auto 1fr; grid-template-columns: minmax(0, 1fr); border: 1px solid var(--line-frame); border-radius: var(--radius); background: var(--card-tray); overflow: hidden; min-height: 460px; }
.pv__bar { display: flex; align-items: center; gap: 6px; padding: 10px 14px; border-bottom: 1px solid var(--line); font-size: .75rem; color: var(--muted); }
.pv__bar i { width: 9px; height: 9px; border-radius: 50%; background: var(--line-frame); }
.pv__url { margin-left: 8px; font-family: var(--mono); flex: 1; min-width: 0; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.pv__badge { margin-left: 8px; white-space: nowrap; padding: 3px 8px; border-radius: 999px; background: color-mix(in srgb, var(--accent) 14%, transparent); color: var(--accent-text); font-weight: 500; }
.pv__badge[hidden] { display: none; }
.pv__page { position: relative; padding: 18px; display: grid; gap: 10px; align-content: start; }
.pv__empty { position: absolute; inset: 0; display: grid; place-items: center; color: var(--muted); font-size: .875rem; }
.pv__empty[hidden] { display: none; }
/* wireframe blocks */
.blk { position: relative; min-width: 0; background: var(--card); border: 1px solid var(--line); border-radius: 10px; padding: 12px 14px; display: grid; gap: 8px; animation: blk-in .35s ease both; }
@keyframes blk-in { from { opacity: 0; translate: 0 6px; } to { opacity: 1; translate: 0 0; } }
@media (prefers-reduced-motion: reduce) { .blk { animation: none; } }
.blk::after { content: attr(data-bind); position: absolute; top: 6px; right: 6px; padding: 2px 6px; border-radius: 5px; font: 500 .625rem/1.4 var(--mono); background: var(--fg); color: var(--surface); opacity: 0; transition: opacity .15s ease; pointer-events: none; }
.blk:hover::after { opacity: 1; }
.blk__t { font-weight: 600; font-size: 1rem; }
.blk__img { height: 88px; border-radius: 8px; background: repeating-linear-gradient(135deg, var(--card-tray) 0 6px, transparent 6px 12px); border: 1px dashed var(--line-frame); }
.blk__price { display: flex; gap: 8px; align-items: baseline; font-size: .9375rem; }
.blk__price s { color: var(--muted); }
.blk__pills { display: flex; gap: 6px; flex-wrap: wrap; }
.blk__pills span { padding: 4px 9px; border-radius: 999px; border: 1px solid var(--line-frame); font-size: .75rem; }
.blk__pills span.on { background: var(--fg); color: var(--surface); border-color: var(--fg); }
.blk__grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 6px; }
.blk__grid div { border: 1px solid var(--line-frame); border-radius: 8px; padding: 8px; font-size: .75rem; text-align: center; display: grid; gap: 2px; }
.blk__grid div.on { border-color: var(--accent); box-shadow: inset 0 0 0 1px var(--accent); }
.blk__grid b { font-size: .8125rem; }
.blk__lines { display: grid; gap: 6px; }
.blk__lines span { height: 8px; border-radius: 4px; background: var(--card-tray); }
.blk__lines span:nth-child(2) { width: 82%; } .blk__lines span:nth-child(3) { width: 64%; }
.blk__row { display: flex; justify-content: space-between; font-size: .8125rem; padding: 6px 0; border-top: 1px solid var(--line); }
.blk__row:first-of-type { border-top: 0; }
.blk__stars { color: #E5A400; font-size: .75rem; letter-spacing: 1px; }
.blk__btn { justify-self: start; padding: 9px 16px; border-radius: 999px; background: var(--accent); color: #fff; font-size: .8125rem; font-weight: 500; }
.blk--label { font-size: .6875rem; color: var(--muted); text-transform: uppercase; letter-spacing: .06em; font-weight: 600; }

/* chat (right) — dark surface via .is-dark tokens */
.chat { display: grid; grid-template-rows: auto 1fr auto auto; grid-template-columns: minmax(0, 1fr); border-radius: var(--radius); background: var(--surface); color: var(--fg); border: 1px solid var(--line-frame); overflow: hidden; min-height: 460px; }
.chat__head { display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 12px 14px; border-bottom: 1px solid var(--line); flex-wrap: wrap; }
.chat__tabs { display: inline-flex; padding: 3px; border-radius: 999px; background: var(--card-tray); border: 1px solid var(--line); }
.chat__tab { appearance: none; border: 0; background: transparent; color: var(--muted); font: 500 .8125rem/1 var(--font); padding: 7px 12px; border-radius: 999px; cursor: pointer; }
.chat__tab[aria-selected="true"] { background: var(--card); color: var(--fg); }
.chat__meta { font-size: .75rem; color: var(--muted); } .chat__meta b { color: var(--fg); font-weight: 600; }
.chat__log { padding: 16px 16px 8px; display: grid; gap: 12px; align-content: start; font-size: .875rem; overflow: auto; min-height: 0; }
.msg { color: var(--fg); font-size: .9375rem; line-height: 1.5; padding: 10px 12px; border-radius: 12px 12px 12px 4px; background: var(--card); justify-self: start; max-width: 92%; }
.tool { display: grid; grid-template-columns: 10px 1fr; column-gap: 8px; animation: blk-in .3s ease both; }
.tool > i { width: 7px; height: 7px; border-radius: 50%; background: var(--ok-text); margin-top: 7px; }
.tool > i.wait { background: var(--muted); animation: blink 1s steps(1) infinite; }
.tool__t { color: var(--fg); font-family: var(--mono); font-size: .8125rem; }
.tool__t b { font-weight: 600; }
.tool__sub { color: var(--muted); font-size: .8125rem; padding-inline-start: 12px; position: relative; }
.tool__sub::before { content: "└"; position: absolute; inset-inline-start: 0; color: var(--line-frame); }
.done { color: var(--fg); font-weight: 500; }
.chat__prompts { padding: 10px 16px; border-top: 1px solid var(--line); display: grid; gap: 8px; }
.chat__label { font-size: .75rem; color: var(--muted); }
.chips--dark .chip { background: var(--card); color: var(--fg); border-color: var(--line-frame); }
.chips--dark .chip[aria-pressed="true"] { background: var(--fg); color: var(--surface); border-color: var(--fg); }
.chat__foot { display: flex; gap: 8px; justify-content: space-between; align-items: center; padding: 12px 16px; border-top: 1px solid var(--line); flex-wrap: wrap; }
.chat .btn--ghost { background: var(--card); color: var(--fg); border-color: var(--line-frame); }

/* ---------- ASK UI (step 2 stage): a light chat that types itself ----------
   States on .askui: is-idle (bar centred, log hidden) → is-live (bar at the
   bottom, log visible). Everything else is text filled in by askui.js. */
.askui {
  position: relative; height: var(--stage-h);   /* no overflow clip here — the card's shadow needs room */
  font-size: .9375rem; line-height: 1.55;
}
/* the card: invisible while only the bar is showing, fades + settles in when the prompt is sent */
.askui::before {
  content: ""; position: absolute; inset: 0; border-radius: 20px;
  background: var(--card); border: 1px solid var(--line-frame);
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.05), rgba(0,0,0,.3)), 0 24px 48px -24px light-dark(rgba(20,30,40,.3), rgba(0,0,0,.6));
  opacity: 0; transform: scale(.94);
  transition: opacity .5s ease, transform .7s cubic-bezier(.4, 0, .2, 1);
}
.askui.is-live::before { opacity: 1; transform: none; }
.askui__log { position: absolute; inset: 18px 20px 84px; overflow: hidden; display: grid; gap: 14px; align-content: start; opacity: 0; transition: opacity .35s ease .45s; }
.askui.is-live .askui__log { opacity: 1; }
.askui__user { justify-self: end; max-width: 78%; padding: 9px 14px; border-radius: 18px 18px 4px 18px; background: var(--card-tray); color: var(--fg); opacity: 0; transform: translateY(6px); transition: opacity .3s ease, transform .3s ease; }
.askui__user.is-on { opacity: 1; transform: none; }
.askui__ai { display: grid; grid-template-columns: 30px 1fr; gap: 12px; align-items: start; opacity: 0; transition: opacity .3s ease; }
.askui__ai.is-on { opacity: 1; }
.askui__av { width: 30px; height: 30px; border-radius: 50%; display: grid; place-items: center; background: var(--card); border: 1px solid var(--line-frame); box-shadow: 0 1px 2px rgba(20,30,40,.06); }
.askui__av svg { width: 15px; height: 15px; fill: #D97757; }
.askui__body { display: grid; gap: 10px; min-width: 0; padding-top: 4px; }
.askui__text { color: var(--fg); min-height: 1.55em; }
.askui__text b { font-weight: 600; }
.askui__text:empty { display: none; }
.askui__tools { display: grid; gap: 8px; }
.askui__tools .tool { animation: none; opacity: 0; transform: translateY(4px); transition: opacity .3s ease, transform .3s ease; }
.askui__tools .tool.is-on { opacity: 1; transform: none; }
.askui__tools .tool__t { font-size: .8125rem; }
.askui__acts { display: flex; gap: 12px; opacity: 0; transition: opacity .3s ease; }
.askui__acts.is-on { opacity: 1; }
.askui__acts svg { width: 16px; height: 16px; fill: none; stroke: var(--muted); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; }

.askui__bar {
  position: absolute; left: 12px; right: 12px; bottom: 12px;
  display: flex; align-items: center; gap: 10px;
  padding: 8px 8px 8px 18px; border-radius: 999px;
  background: var(--card); border: 1px solid var(--line-frame);
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.05), rgba(0,0,0,.3)), 0 10px 28px -16px light-dark(rgba(20,30,40,.25), rgba(0,0,0,.6));
  transform: translateY(calc(-1 * var(--lift, 0px)));
  transition: transform .6s cubic-bezier(.4, 0, .2, 1);
}
.askui.is-live .askui__bar { transform: none; }
.askui__input { position: relative; flex: 1; min-width: 0; height: 24px; line-height: 24px; white-space: nowrap; overflow: hidden; color: var(--fg); }
.askui__ph { position: absolute; inset: 0; color: var(--muted); transition: opacity .2s ease; }
.askui.is-typing .askui__ph { opacity: 0; }
.askui__caret { display: none; width: 1px; height: 1em; background: var(--fg); vertical-align: -0.15em; margin-left: 1px; animation: blink 1s steps(1) infinite; }
.askui.is-typing .askui__caret { display: inline-block; }
.askui__mic { width: 18px; height: 18px; fill: none; stroke: var(--muted); stroke-width: 1.6; stroke-linecap: round; stroke-linejoin: round; flex-shrink: 0; }
.askui__send { width: 34px; height: 34px; border-radius: 50%; display: grid; place-items: center; background: var(--fg); color: var(--surface); flex-shrink: 0; transition: transform .12s ease, opacity .2s ease; opacity: .45; }
.askui__send svg { width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; }
.askui.is-typing .askui__send { opacity: 1; }
.askui__send.is-click { animation: askui-click .28s ease; }
@keyframes askui-click { 40% { transform: scale(.82); } 100% { transform: scale(1); } }
@media (max-width: 860px) { .askui { height: 460px; } }
@media (max-width: 600px) { .askui { height: 520px; } .askui__user { max-width: 92%; } }
@media (max-width: 420px) { .askui { height: 580px; } }
@media (prefers-reduced-motion: reduce) { .askui::before { transition: none; } }
@media (prefers-reduced-motion: reduce) { .askui__bar, .askui__log, .askui__user, .askui__ai, .askui__tools .tool, .askui__acts { transition: none; } .askui__send.is-click { animation: none; } }

/* CTA strip: closes a section before the dotted gap — one line, one button */
.cta-strip {
  border-top: 1px solid var(--line);
  padding: clamp(32px, 4vw, 44px) var(--pad-x);
  display: flex; align-items: center; justify-content: center;
}

/* ---------- PROMPT WALL (setup.html · looping rows of starter prompts) ----------
   Three rows roll in alternating directions. Each track holds one authored set of
   cards; app.js clones the set once and adds .is-looping, so the -50% keyframe lands
   exactly on the start of the copy. The gap lives on the card's margin-right rather
   than the flex gap — a track `gap` would leave the loop half a gap short and jump. */
.pw {
  --pw-gap: clamp(10px, 1.1vw, 14px);
  --pw-radius: 16px;
  position: relative;
  border-top: 1px solid var(--line);
  padding: clamp(40px, 5vw, 64px) 0;
  display: grid;
  gap: var(--pw-gap);
}
/* Rows bleed to the rails and fade out at both ends. The `overflow: hidden` that
   keeps the track from spilling sideways also clips vertically, and the cards fill
   the row exactly — so a hovered card's 2px lift and its drop shadow would be
   shaved off flat at the top. The padding buys clip-free headroom; the matching
   negative margin keeps the rows sitting exactly where they did without it. */
.pw__row {
  overflow: hidden;
  padding-block: 20px;
  margin-block: -20px;
  -webkit-mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
          mask-image: linear-gradient(90deg, transparent, #000 8%, #000 92%, transparent);
}
/* the row holding the lifted card paints above its neighbours' padding */
.pw__row:has(.pw-chip:hover) { z-index: 2; }
.pw__track { display: flex; align-items: stretch; width: max-content; will-change: transform; }
.pw__track.is-looping { animation: pw-roll var(--pw-dur, 60s) linear infinite; }
.pw__row:nth-of-type(even) .pw__track.is-looping { animation-direction: reverse; }
@keyframes pw-roll { from { transform: translate3d(0, 0, 0); } to { transform: translate3d(-50%, 0, 0); } }
/* the roll stops only for a card under the pointer — not for the wrapper's dead space */
.pw:has(.pw-chip:hover) .pw__track,
.pw:focus-within .pw__track { animation-play-state: paused; }
.pw:has(.pw-chip:hover) .pw-chip:not(:hover) { opacity: .5; }

.pw-chip {
  flex: none;
  width: clamp(290px, 29vw, 420px);
  margin-right: var(--pw-gap);
  position: relative;
  display: flex;
  align-items: flex-start;
  gap: 11px;
  padding: 14px 16px;
  border: 1px solid var(--line-frame);
  border-radius: var(--pw-radius);
  background: var(--card);
  color: var(--fg);
  font: 500 .875rem/1.5 var(--font);
  text-align: start;
  cursor: pointer;
  transition: border-color .16s ease, box-shadow .16s ease, transform .16s ease, opacity .16s ease;
}
.pw-chip__sr { position: absolute; width: 1px; height: 1px; overflow: hidden; clip-path: inset(50%); white-space: nowrap; }
/* bare brand glyphs, no plate — they read on the card in both themes */
.pw-chip__mark {
  flex: none; width: 21px; height: 21px; margin-top: 1px;
  display: inline-grid; place-items: center;
  color: #D97757;                                    /* Claude + Claude Code */
}
.pw-chip__mark svg { width: 100%; height: 100%; fill: currentColor; display: block; }
.pw-chip__mark[data-client="chatgpt"] { color: light-dark(#0A0A0A, #ECEFF2); }
.pw-chip__mark[data-client="mcp"]     { color: var(--accent-text); }
/* Codex carries its own gradient fill from the sprite */
/* the prompt wraps, up to three lines — nothing is clipped mid-word at rest */
.pw-chip__text {
  min-width: 0;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 3;
  line-clamp: 3;
  overflow: hidden;
}

/* the copy affordance floats centered over the card; a frosted veil softens the
   prompt underneath it. The blur sits on this overlay rather than on the text —
   filtering the line-clamped text directly would clip its halo flat at the clamp box. */
.pw-chip::after {
  content: "";
  position: absolute; inset: 0;
  border-radius: inherit;
  -webkit-backdrop-filter: blur(2.5px);
          backdrop-filter: blur(2.5px);
  background: color-mix(in srgb, var(--card) 55%, transparent);
  opacity: 0; transition: opacity .16s ease;
  pointer-events: none;
}
.pw-chip__do {
  position: absolute; left: 50%; top: 50%;
  display: inline-grid; place-items: center;
  padding: 7px 15px; border-radius: 999px;
  background: var(--accent); color: var(--accent-ink);
  font-size: .8125rem; font-weight: 600; white-space: nowrap;
  opacity: 0; translate: -50% -50%; scale: .94;
  transition: opacity .16s ease, scale .16s ease;
  pointer-events: none;
  z-index: 1;
}
.pw-chip__lbl, .pw-chip__ok { grid-area: 1 / 1; transition: opacity .14s ease; }
.pw-chip__ok { opacity: 0; }
.pw-chip:hover, .pw-chip:focus-visible {
  border-color: var(--accent);
  box-shadow: 0 8px 24px rgba(20, 30, 40, .12);
  transform: translateY(-2px);
  outline: 0;
}
.pw-chip:hover::after, .pw-chip:focus-visible::after, .pw-chip.is-copied::after { opacity: 1; }
.pw-chip:hover .pw-chip__do, .pw-chip:focus-visible .pw-chip__do, .pw-chip.is-copied .pw-chip__do { opacity: 1; scale: 1; }
.pw-chip.is-copied .pw-chip__lbl { opacity: 0; }
.pw-chip.is-copied .pw-chip__ok  { opacity: 1; }

@media (max-width: 640px) {
  .pw-chip { width: min(82vw, 320px); font-size: .8125rem; padding: 12px 14px; }
  .pw-chip__mark { width: 19px; height: 19px; }
}
@media (prefers-reduced-motion: reduce) {
  .pw__track.is-looping { animation: none; }
  .pw__row { overflow-x: auto; scrollbar-width: none; }
  .pw__row::-webkit-scrollbar { display: none; }
  .pw-chip, .pw-chip__do { transition: none; }
  .pw-chip::after { transition: none; }
  .pw:has(.pw-chip:hover) .pw-chip:not(:hover) { opacity: 1; }
}

/* ---------- GAP STRIPS (animated dot shader between sections) ----------
   The band keeps the standard railed column, so the dot field stops at the
   content width and the rails close it left + right. It also keeps its own
   corner dots, which is what puts a dot on the *end* of the section line
   above it — otherwise a section that runs into a gap ends bare. */
/* no overflow clip here — it would cut the corner dots, which straddle the rail */
.sec--gap > .sec-inner { height: clamp(56px, 7vw, 88px); background: var(--band); }
/* …and it closes its own bottom corners, so a divider reads the same whether the
   section under it carries rails (dots coincide exactly) or is a rail-less
   .sec--wide panel. Mirrors the .sec-inner corner dots, on the far edge. */
.sec--gap::before, .sec--gap::after {
  content: "";
  position: absolute;
  bottom: -0.5px;
  width: var(--dot-size); height: var(--dot-size);
  border-radius: 50%;
  background: var(--dot);
  box-shadow: 0 0 0 1px var(--dot-ring);
  z-index: 2;
  pointer-events: none;
}
.sec--gap::before { left:  calc(50% - min(var(--col-max), 100% - 2 * var(--gutter)) / 2 + 0.5px); translate: -50% 50%; }
.sec--gap::after  { right: calc(50% - min(var(--col-max), 100% - 2 * var(--gutter)) / 2 + 0.5px); translate:  50% 50%; }
.shader { display: block; width: 100%; height: 100%; }

/* ---------- HERO GRAPH: hub -> wires -> client cards (hero-graph.js) ----------
   Everything is sized in cqw (1cqw = 1% of the visual's width) so the whole
   composition scales as one picture. Positions are authored against a
   1200 x 675 design space: 1cqw = 12 design px. */
/* the visual bleeds to the rails and the next h-line: no gutter, no radius */
.hero-visual { justify-self: stretch; width: auto; max-width: none; margin: 28px calc(-1 * var(--pad-x)) calc(-1 * var(--pad-y)); }
.hg {
  position: relative; container-type: inline-size;
  aspect-ratio: 1200 / 620;
  max-height: 470px;
  border-radius: 0; overflow: hidden;
  border-top: 1px solid light-dark(#1B2331, #232A33);
  background: radial-gradient(95% 130% at 50% 78%, #0E1E3E 0%, #0A1324 58%, #070B14 100%);
  font-family: var(--font);
  /* the stage is dark in both themes and the cards are glass, so the content
     tokens flip to light regardless of the page theme */
  --card: rgba(255,255,255,.10);
  --fg: #FFFFFF;
  --muted: rgba(255,255,255,.68);
  --line-frame: rgba(255,255,255,.16);
  --accent-text: #CBD7FF;
}
/* the border beam needs a registered property to be animatable */
@property --beam { syntax: "<angle>"; inherits: false; initial-value: 0deg; }
/* The panel bleeds full width, but its height is capped. Content is authored in
   cqw, so on a wide screen a width-driven cqw would keep growing while the
   height stayed pinned - icons would outgrow their cards. The stage fixes that:
   it takes the capped height and derives its own width from the design ratio,
   so it is the container all cqw resolve against and the whole cluster scales
   as one picture, centred, while the tunnel behind it still bleeds edge to edge. */
.hg__stage {
  position: absolute; inset: 0; margin: auto;
  height: 100%; aspect-ratio: 1200 / 620;
  container-type: inline-size;
}
/* the WebGL tunnel sits behind everything (light-tunnel.js) */
.hg__bg { position: absolute; inset: 0; z-index: 0; pointer-events: none; }
.hg__bg canvas { display: block; width: 100%; height: 100%; }
/* the cables are busiest exactly where the cards sit, so damp that side down */
.hg__bg::after {
  content: ""; position: absolute; inset: 0; z-index: 2;   /* stays above the ascii layer below */
  background:
    linear-gradient(to right, rgba(6,9,16,.42) 0%, rgba(6,9,16,.24) 30%, rgba(6,9,16,.06) 55%, transparent 72%),
    radial-gradient(70% 100% at 50% 50%, transparent 60%, rgba(6,9,16,.42) 100%);
}
/* "beam" background: an indigo field lit from a ring just above the top edge —
   a bright arc, soft rays fanning down, film grain. Pure CSS, no canvas. */
.hg__bg--beam {
  background:
    radial-gradient(64% 64% at 50% -36%, transparent 56%, rgba(190,235,255,1) 61%, rgba(150,200,255,.75) 66%, rgba(100,120,255,.28) 76%, transparent 90%),
    radial-gradient(70% 55% at 50% 10%, rgba(16,8,110,.6) 0%, rgba(16,8,110,.28) 45%, transparent 72%),
    linear-gradient(180deg, #2A1FCB 0%, #3426DA 45%, #3B2FE6 100%);
}
/* rays: two offset conic fans, blurred, clipped to below the arc */
.hg__bg--beam::before {
  content: ""; position: absolute; inset: -40px;
  background:
    repeating-conic-gradient(from 152deg at 50% -36%, rgba(255,255,255,0) 0deg, rgba(255,255,255,.10) 3deg, rgba(255,255,255,0) 7deg, rgba(255,255,255,.04) 12deg, rgba(255,255,255,0) 17.5deg),
    repeating-conic-gradient(from 157deg at 50% -36%, rgba(255,255,255,0) 0deg, rgba(255,255,255,.06) 1.2deg, rgba(255,255,255,0) 2.8deg, rgba(255,255,255,0) 11deg);
  filter: blur(7px);
  -webkit-mask-image: radial-gradient(80% 120% at 50% -30%, transparent 54%, #000 66%, #000 100%);
  mask-image: radial-gradient(80% 120% at 50% -30%, transparent 54%, #000 66%, #000 100%);
}
.hg__bg--beam::after {          /* grain + a gentle vignette instead of the cable-damping wash */
  background:
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.95' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  0 0 0 .75 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>"),
    radial-gradient(80% 90% at 50% 40%, transparent 55%, rgba(10,6,70,.45) 100%);
  background-size: 220px 220px, auto;
  mix-blend-mode: overlay; opacity: .7;
}
.hg__bg--beam canvas { display: none; }

/* WebGL light bloom (light-bloom.js): indigo light rising from the bottom,
   with drifting shafts. The canvas paints everything, so the shared .hg__bg
   wash is switched off here. */
.hg__bg--bloom { background: radial-gradient(120% 90% at 50% 120%, #EAF1FF 0%, #4867FF 22%, #060C24 70%, #000 100%); }
.hg__bg--bloom { overflow: hidden; }
.hg__bg--bloom .bloom { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
/* ASCII blended into the bloom. ascii-fire.js inserts the <pre> as the host's
   first child, so it would paint under the WebGL canvas — z-index lifts it over.
   .hg__bg is a stacking context (position + z-index), so the blend resolves
   against the canvas and never reaches the page behind it. Soft-light keeps the
   glyphs as a texture in the light rather than a second subject competing with
   the wires; the ramp is blues so it reads as light, not soot. */
.hg__bg--bloom .fire {
  z-index: 1;
  mix-blend-mode: soft-light;
  opacity: .75;
  --fire-0: #6E86FF; --fire-1: #7E94FF; --fire-2: #8FA3FF; --fire-3: #A3B4FF;
  --fire-4: #B9C6FF; --fire-5: #D2DBFF; --fire-6: #EAF0FF; --fire-spark: #FFFFFF;
}
.hg__bg--bloom::after { background: none; }

/* video background: the same horizon loop as the "Connect once" stage */
.hg__bg--video video {
  position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; object-position: 50% 42%;
  filter: brightness(.72) saturate(1.15);      /* the glass cards carry white text — the raw frame is too bright for it */
}
/* scrim: heaviest at the top, where the planet's bright rim runs behind the card row */
.hg__bg--video::before {
  content: ""; position: absolute; inset: 0;
  background: linear-gradient(180deg, rgba(5,10,38,.62) 0%, rgba(5,10,38,.34) 30%, rgba(5,10,38,.18) 55%, rgba(5,10,38,.34) 100%);
}
.hg__bg--video::after {          /* grain over the compression, plus a vignette so the glass cards keep their edge */
  background:
    url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='220' height='220'><filter id='n'><feTurbulence type='fractalNoise' baseFrequency='.95' numOctaves='2' stitchTiles='stitch'/><feColorMatrix values='0 0 0 0 1  0 0 0 0 1  0 0 0 0 1  0 0 0 .6 0'/></filter><rect width='100%' height='100%' filter='url(%23n)'/></svg>"),
    radial-gradient(85% 95% at 50% 45%, transparent 50%, rgba(6,16,60,.45) 100%);
  background-size: 220px 220px, auto;
  mix-blend-mode: overlay; opacity: .6;
}

/* wires (drawn by hero-graph.js) */
.hg__wires {
  position: absolute; inset: 0; z-index: 1; width: 100%; height: 100%; overflow: visible;
  filter: drop-shadow(0 0.07cqw 0.28cqw rgba(6,16,50,.45));
}
.hg__wire      { fill: none; stroke: rgba(226,235,255,.92); stroke-width: 0.182cqw; stroke-linecap: round; transition: stroke .25s; }
.hg__wire-glow { fill: none; stroke: var(--accent); stroke-width: 0.63cqw; stroke-linecap: round; opacity: .18; }
.hg__wire-pulse{ fill: none; stroke: var(--accent); stroke-width: 0.21cqw; stroke-linecap: round; }
.hg__wire-glow, .hg__wire-pulse { stroke-dasharray: 90 1000; stroke-dashoffset: 90; }
.hg--live .hg__wire-glow, .hg--live .hg__wire-pulse { animation: hg-pulse 4.4s cubic-bezier(.4,0,.35,1) infinite; animation-delay: var(--delay, 0s); }
@keyframes hg-pulse { 0% { stroke-dashoffset: 90; } 48%, 100% { stroke-dashoffset: -1000; } }
/* draw-in on load */
.hg--in .hg__wire { stroke-dasharray: 1000; stroke-dashoffset: 1000; animation: hg-draw 1.1s cubic-bezier(.3,0,.2,1) forwards; animation-delay: calc(.25s + var(--delay, 0s) * .35); }
@keyframes hg-draw { to { stroke-dashoffset: 0; } }
/* hover: light the wire that belongs to the hovered card */
.hg:has(.hg__card:nth-child(1):hover) .hg__wire[data-i="0"],
.hg:has(.hg__card:nth-child(2):hover) .hg__wire[data-i="1"],
.hg:has(.hg__card:nth-child(3):hover) .hg__wire[data-i="2"] { stroke: var(--accent); }

/* ports: little hollow nodes where a wire meets a surface */
.hg__port {
  position: absolute; width: 0.735cqw; height: 0.735cqw; border-radius: 50%;
  background: #EAF0FF; border: 0.154cqw solid #6D8CFF;
  /* glow only - a dark ring here read as a smudge against the fluid */
  box-shadow: 0 0 0.65cqw rgba(160,190,255,.95), 0 0 1.8cqw rgba(72,103,255,.5);
  z-index: 2;
}

/* hub: the mark alone, on the right */
.hg__hub {
  position: absolute; z-index: 2; left: 50%; right: auto; top: auto; bottom: 6.4cqw; translate: -50% 0;
  width: 15cqw; height: 15cqw; border-radius: 50%;
  background: linear-gradient(150deg, rgba(255,255,255,.98), rgba(233,240,255,.90));
  border: 1px solid rgba(255,255,255,.55);
  box-shadow:
    0 0.5cqw 1.6cqw rgba(6,16,50,.24),
    0 0 3.2cqw rgba(120,155,255,.22),
    inset 0 0.084cqw 0 rgba(255,255,255,.95);
  backdrop-filter: blur(0.7cqw); -webkit-backdrop-filter: blur(0.7cqw);
  display: grid; place-items: center;
}
.hg__mark { width: 5.6cqw; height: auto; }
/* hub ports sit on the rim: --a is measured from the 3 o'clock point, so the
   left-facing ports that meet the cards live around 180deg. */
.hg__hub .hg__port { left: 50%; top: 50%; margin: -0.3675cqw; transform: rotate(var(--a)) translateX(7.5cqw) rotate(calc(-1 * var(--a))); }

/* cards */
.hg__cards {
  position: absolute; z-index: 2; left: 5cqw; right: 5cqw; top: 6.4cqw; bottom: auto;
  height: auto;                       /* the card's own padding sets the height, so all four sides match */
  display: flex; flex-direction: row; justify-content: space-between; gap: 1.6cqw;
}
.hg__card {
  position: relative; flex: 1 1 0; min-height: 0; min-width: 0;
  display: flex; align-items: center; gap: 0.95cqw;
  padding: 1.15cqw;
  border-radius: 999px;
  background: linear-gradient(135deg, rgba(255,255,255,.17), rgba(255,255,255,.06) 60%, rgba(255,255,255,.10));
  backdrop-filter: blur(1.12cqw) saturate(150%);
  -webkit-backdrop-filter: blur(1.12cqw) saturate(150%);
  border: 1px solid rgba(255,255,255,.16);
  box-shadow:
    0 0.35cqw 1.05cqw rgba(6,16,50,.20),
    inset 0 0.077cqw 0 rgba(255,255,255,.28);
  color: var(--fg);
  transition: translate .3s cubic-bezier(.2,.7,.2,1), box-shadow .3s, background .3s;
  cursor: default;
}
.hg__card:hover {
  translate: 0 -0.6cqw;
  background: linear-gradient(135deg, rgba(255,255,255,.24), rgba(255,255,255,.10) 60%, rgba(255,255,255,.14));
  box-shadow: 0 0.6cqw 1.6cqw rgba(6,16,50,.26), inset 0 0.077cqw 0 rgba(255,255,255,.4);
}
/* white light running around the rim: a conic sweep clipped to a 1px ring by
   masking the content box out of the padding box */
.hg__card::before {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  padding: 0.154cqw; pointer-events: none;
  background: conic-gradient(from var(--beam),
    transparent 0deg, transparent 188deg,
    rgba(255,255,255,.16) 234deg,
    rgba(255,255,255,.92) 270deg,
    #FFFFFF 280deg,
    rgba(255,255,255,.92) 290deg,
    rgba(255,255,255,.16) 326deg,
    transparent 360deg);
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
          mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
          mask-composite: exclude;
  filter: drop-shadow(0 0 0.21cqw rgba(235,244,255,.7));
}
.hg__card .hg__port { left: 50%; right: auto; top: auto; bottom: 0; translate: -50% 50%; }
.hg__icon {
  flex: none; width: 5.8cqw; height: 5.8cqw; border-radius: 50%;
  background: var(--tile, #111); display: grid; place-items: center;
}
.hg__icon svg { width: 62%; height: 62%; display: block; }
.hg__text { display: grid; gap: 0.5cqw; justify-items: start; min-width: 0; }
.hg__name { font-size: 1.9cqw; font-weight: 600; letter-spacing: -.015em; line-height: 1; }
.hg__badge {
  font-size: 0.76cqw; font-weight: 700; letter-spacing: .08em; text-transform: uppercase;
  padding: 0.3cqw 0.52cqw; border-radius: 0.4cqw;
  color: var(--accent-text); background: rgba(255,255,255,.13);
  border: 1px solid rgba(255,255,255,.10);
  line-height: 1;
}
.hg__chev { margin-inline-start: auto; width: 1.3cqw; height: 1.3cqw; color: var(--muted); }

/* entrance + float.
   `translate`, `scale` and `transform` are independent properties that compose,
   so each effect gets its own channel: entrance animates opacity+scale, the
   float animates transform, and the hover nudge keeps `translate` to itself.
   (Animating translate in the entrance would win the cascade over :hover.) */
.hg--in .hg__hub {
  animation: hg-pop .8s cubic-bezier(.2,.8,.2,1) both, hg-drift 11s ease-in-out infinite;
  animation-delay: 0s, -2s;
}
.hg--in .hg__card {
  animation: hg-rise .7s cubic-bezier(.2,.8,.2,1) both, hg-float 7s ease-in-out infinite;
  animation-delay: calc(.35s + var(--i, 0) * .09s), calc(var(--i, 0) * -2.3s);
}
.hg--in .hg__card::before { animation: hg-beam 5.5s linear infinite; animation-delay: calc(var(--i, 0) * -1.75s); }
@keyframes hg-pop   { from { opacity: 0; scale: .92; } to { opacity: 1; scale: 1; } }
@keyframes hg-rise  { from { opacity: 0; scale: .965; } to { opacity: 1; scale: 1; } }
@keyframes hg-float { 0%, 100% { transform: translateY(0.385cqw); } 50% { transform: translateY(-0.665cqw); } }
@keyframes hg-drift { 0%, 100% { transform: translateY(-0.35cqw); } 50% { transform: translateY(0.35cqw); } }
@keyframes hg-beam  { to { --beam: 360deg; } }
@media (prefers-reduced-motion: reduce) {
  .hg--in .hg__hub, .hg--in .hg__card, .hg--in .hg__card::before,
  .hg--in .hg__wire, .hg--live .hg__wire-glow, .hg--live .hg__wire-pulse { animation: none; }
  .hg__card::before { opacity: .5; }
  .hg--in .hg__wire { stroke-dashoffset: 0; }
  .hg__wire-glow, .hg__wire-pulse { display: none; }
}

/* ---------- ASK: prompts fly into the chat on scroll (genie.js) ----------
   Layout is plain flow: a viewport-tall headline row, then the chat window.
   The prompt cards live in an absolute field over the headline row; genie.js
   moves them (transform only) from their rest spot to the chat's user bubble
   as the section scrolls, so nothing here ever changes layout. */
.genie { position: relative; overflow: clip; }
.genie__hero {
  position: relative;
  min-height: clamp(480px, 76svh, 720px);
  display: grid; place-items: center;
  padding: calc(var(--pad-y) * 1.5) var(--pad-x) var(--pad-y);
}
.genie__hero .stack { position: relative; z-index: 4; }   /* text over cards, cards over chat */
.genie__hero h2 { font-size: clamp(2rem, 3.9vw, 3.1rem); font-weight: 700; letter-spacing: -0.025em; }
.genie__field { position: absolute; inset: 0; z-index: 3; pointer-events: none; }
.genie__chat {
  position: relative; z-index: 1;
  padding: clamp(24px, 6vh, 64px) var(--pad-x) var(--pad-y);
  display: grid; justify-items: center;
}

/* prompt card — a message about to be sent */
.pcard {
  position: absolute; left: var(--x); top: var(--y);
  translate: -50% -50%;
  width: clamp(168px, 22vw, 232px);
  will-change: transform, opacity;
  transform-origin: 50% 50%;
}
.pcard__in {
  display: grid; gap: 8px;
  padding: 10px 12px 10px;
  background: var(--card); border: 1px solid var(--line-frame); border-radius: 14px;
  box-shadow: 0 1px 2px rgba(20,30,40,.05), 0 18px 40px -22px rgba(20,30,40,.25);
  animation: pcard-float 7s ease-in-out infinite alternate;
  animation-delay: var(--fd, 0s);
}
.pcard--far .pcard__in { filter: blur(1.1px); }
.pcard__who { display: flex; align-items: center; gap: 7px; font-size: .6875rem; color: var(--muted); font-weight: 500; }
.pcard__mark {
  width: 18px; height: 18px; border-radius: 5px; display: inline-grid; place-items: center;
  background: #D97757; color: #fff;                                   /* claude */
}
.pcard__mark svg { width: 12px; height: 12px; fill: currentColor; display: block; }
.pcard__mark[data-client="chatgpt"] { background: var(--card); color: var(--fg); border: 1px solid var(--line-frame); }
.pcard__mark[data-client="claudecode"] { background: var(--card); color: #D97757; border: 1px solid var(--line-frame); }
.pcard__mark[data-client="claudecode"] svg { width: 13px; height: 13px; }
.pcard p { color: var(--fg); font-size: .8125rem; line-height: 1.4; }
.pcard__send {
  justify-self: end; width: 20px; height: 20px; border-radius: 50%;
  background: var(--accent); color: #fff; display: grid; place-items: center; font-size: 11px; line-height: 1;
}
@keyframes pcard-float { from { transform: translateY(-4px); } to { transform: translateY(4px); } }
@media (prefers-reduced-motion: reduce) { .pcard__in { animation: none; } }
@media (max-width: 719px) { .pcard--x { display: none; } .pcard { width: clamp(150px, 42vw, 190px); } }

/* the receiving chat window */
.gchat {
  width: min(100%, 560px);
  display: grid; grid-template-rows: auto 1fr auto;
  border: 1px solid var(--line-frame); border-radius: var(--radius);
  background: var(--surface); color: var(--fg);
  position: relative; min-height: 400px;      /* no overflow clip: the neon glow lives just outside the box */
  opacity: 0; transform: translateY(36px);   /* genie.js drives these */
}
.gchat__head { display: flex; align-items: center; gap: 10px; padding: 12px 14px; border-bottom: 1px solid var(--line); font-size: .75rem; color: var(--muted); }
.gchat__head b { color: var(--fg); font-weight: 600; }
.gchat__dots { display: inline-flex; gap: 5px; margin-inline-end: 4px; }
.gchat__dots i { width: 8px; height: 8px; border-radius: 50%; background: var(--line-frame); }
.gchat__on { width: 6px; height: 6px; border-radius: 50%; background: var(--ok-text); margin-inline-start: auto; box-shadow: 0 0 0 3px color-mix(in srgb, var(--ok-text) 20%, transparent); }
.gchat__log { padding: 18px 16px 8px; display: grid; gap: 14px; align-content: start; }
.gchat__user {
  justify-self: end; max-width: 86%;
  padding: 10px 14px; border-radius: 16px 16px 4px 16px;
  background: var(--accent); color: #fff; font-size: .9375rem; line-height: 1.5;
  opacity: 0; transform: translateY(6px) scale(.96); transition: opacity .3s ease, transform .3s ease;
}
.gchat__user.is-on { opacity: 1; transform: none; }
.gchat__steps { display: grid; gap: 10px; }
.gchat .tool { animation: none; }
.gchat__steps > * { opacity: 0; transform: translateY(4px); transition: opacity .3s ease, transform .3s ease; }
.gchat__steps > .is-on { opacity: 1; transform: none; }
.gchat__input { margin: 8px 12px 12px; padding: 10px 10px 10px 14px; border: 1px solid var(--line-frame); border-radius: 999px; background: var(--card); display: flex; align-items: center; justify-content: space-between; gap: 10px; font-size: .875rem; color: var(--muted); }
.gchat__input b { width: 26px; height: 26px; border-radius: 50%; background: var(--fg); color: var(--surface); display: grid; place-items: center; font-size: 13px; }

/* ---------- ASCII FIRE (ascii-fire.js) — glyph flames behind the clients card ----------
   Heat → --fire-0 (coolest) … --fire-6 (hottest), in the brand blue by default;
   hovering a tool card re-tints the whole fire in that tool's colour (below). */
.fire {
  position: absolute; inset: auto 0 0; margin: 0; overflow: hidden; z-index: 0;   /* bottom-anchored: whole rows only, so the fuel row meets the edge */
  pointer-events: none; user-select: none;
  font: 10px/1.05 ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, monospace;
  font-variant-ligatures: none; white-space: pre; text-rendering: optimizeSpeed;
}
/* fire palette: registered so a hover can fade from one colour to the next */
@property --fire-0 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-1 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-2 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-3 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-4 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-5 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-6 { syntax: "<color>"; inherits: true; initial-value: #000; }
@property --fire-spark { syntax: "<color>"; inherits: true; initial-value: #000; }
.fire { transition: --fire-0 .5s ease, --fire-1 .5s ease, --fire-2 .5s ease, --fire-3 .5s ease, --fire-4 .5s ease, --fire-5 .5s ease, --fire-6 .5s ease, --fire-spark .5s ease; }
/* Neutral by default — grey on light, muted white on dark — shared with the
   separation strips, which sit on the same --band ground. Hovering a tool card
   tints the whole fire in that tool's colour (the :has rules below outrank this). */
.sec--gap .fire, .clients-wrap .fire {
  /* coolest stop tracks --band: it must sit just *inside* the strip's ground,
     never lighter than it, or the faintest glyphs read as light speckle */
  --fire-0: light-dark(#EEEFF1, #1D2126);
  --fire-1: light-dark(#ECEDEF, #1E2226);
  --fire-2: light-dark(#DFE1E4, #2A2F34);
  --fire-3: light-dark(#CDD1D5, #3B4248);
  --fire-4: light-dark(#B4BAC1, #545D66);
  --fire-5: light-dark(#98A0A9, #7E8892);
  --fire-6: light-dark(#7A828C, #AEB7C0);
  --fire-spark: light-dark(#6B7280, #C6CDD4);
}
.clients-wrap:has(.clients__item[data-client="claude"]:hover) .fire {
  --fire-0: light-dark(#FCF4F2, #301A13);
  --fire-1: light-dark(#F7E4DD, #573023);
  --fire-2: light-dark(#F1CEC3, #874A36);
  --fire-3: light-dark(#EAB4A3, #B8654A);
  --fire-4: light-dark(#E1957C, #D97757);
  --fire-5: light-dark(#D97757, #EAB4A3);
  --fire-6: light-dark(#A95D44, #F8E7E1);
  --fire-spark: light-dark(#C36B4E, #E6A792);
}
.clients-wrap:has(.clients__item[data-client="chatgpt"]:hover) .fire {
  --fire-0: light-dark(#F3F4F5, #18191C);
  --fire-1: light-dark(#E1E3E6, #2B2E33);
  --fire-2: light-dark(#CACCD1, #42474F);
  --fire-3: light-dark(#AEB1B9, #5B616D);
  --fire-4: light-dark(#8C919C, #6B7280);
  --fire-5: light-dark(#6B7280, #AEB1B9);
  --fire-6: light-dark(#535964, #E4E6E8);
  --fire-spark: light-dark(#606773, #9FA3AC);
}
.clients-wrap:has(.clients__item[data-client="codex"]:hover) .fire {
  --fire-0: light-dark(#F3F6FF, #171F38);
  --fire-1: light-dark(#E1E8FF, #2A3866);
  --fire-2: light-dark(#C9D6FF, #42579E);
  --fire-3: light-dark(#ADC0FF, #5A77D9);
  --fire-4: light-dark(#8BA5FF, #6A8CFF);
  --fire-5: light-dark(#6A8CFF, #ADC0FF);
  --fire-6: light-dark(#536DC7, #E4EAFF);
  --fire-spark: light-dark(#5F7EE6, #9EB4FF);
}
.clients-wrap:has(.clients__item[data-client="claudecode"]:hover) .fire {
  --fire-0: light-dark(#FCF4F2, #301A13);
  --fire-1: light-dark(#F7E4DD, #573023);
  --fire-2: light-dark(#F1CEC3, #874A36);
  --fire-3: light-dark(#EAB4A3, #B8654A);
  --fire-4: light-dark(#E1957C, #D97757);
  --fire-5: light-dark(#D97757, #EAB4A3);
  --fire-6: light-dark(#A95D44, #F8E7E1);
  --fire-spark: light-dark(#C36B4E, #E6A792);
}


/* gap strips: the same ASCII flames, slow (12 fps, gentle wind). Palette comes
   from the shared neutral ramp above. Swap the markup back to
   <canvas data-shader> to return to the dots. */
.sec--gap > .sec-inner { position: relative; }

/* ---------- NEON BORDER (neon-border.js) — arcs glide around the edge ----------
   Every layer is a ring: two stacked masks, content-box XOR border-box, so only
   the padding area paints. Glow rings are blurred copies pushed further out. */
.neon { position: absolute; inset: 0; pointer-events: none; z-index: 0; border-radius: inherit; }
.neon__group { position: absolute; inset: 0; overflow: visible; }
.neon__glow, .neon__edge, .neon__band { position: absolute; box-sizing: border-box; }
.neon__edge { inset: 0; }
.neon__band { background: var(--arc); }
.neon__glow, .neon__band {
  -webkit-mask-image: linear-gradient(#fff 0 0), linear-gradient(#fff 0 0);
  -webkit-mask-clip: content-box, border-box; -webkit-mask-composite: xor;
  mask-image: linear-gradient(#fff 0 0), linear-gradient(#fff 0 0);
  mask-clip: content-box, border-box; mask-composite: exclude;
}
/* additive on dark ground (neon), plain on light ground where plus-lighter would wash to white */
.neon__glow, .neon__edge { mix-blend-mode: normal; }
.neon__edge { opacity: .8; }
:root:not([data-theme="light"]) .neon__glow, :root:not([data-theme="light"]) .neon__edge { mix-blend-mode: plus-lighter; opacity: 1; }

/* ---------- SPLIT TEXT (split-text.js) — headline letters rise in ---------- */
.split { overflow: hidden; padding-bottom: .12em; margin-bottom: -.12em; } /* room for descenders under the clip */
.split .sw { display: inline-block; white-space: nowrap; }
.split .sc {
  display: inline-block;
  opacity: 0; transform: translateY(40px);
  will-change: transform, opacity;
}
.split.is-in .sc {
  opacity: 1; transform: none;
  transition: opacity .7s cubic-bezier(.215, .61, .355, 1), transform .7s cubic-bezier(.215, .61, .355, 1);
  transition-delay: calc(var(--i) * var(--stagger, 50ms));
}

/* ======================================================================
   CONNECT PAGE (setup.html) — the docs-style setup guide
   ====================================================================== */
.hero--docs {
  display: grid; grid-template-columns: minmax(0, 7fr) minmax(0, 5fr);
  align-items: center; gap: clamp(28px, 5vw, 72px);
  padding-top: calc(var(--nav-clear) + var(--pad-y) * .9);
  padding-bottom: calc(var(--pad-y) * .8);
}
.hero__copy { display: grid; gap: 14px; justify-items: start; text-align: start; }
.hero__copy h1 { max-width: 14ch; }
/* the client tiles, scattered on a checker grid (empty tiles keep the rhythm) */
.checker {
  --t: clamp(52px, 6.2vw, 80px);
  display: grid; grid-template-columns: repeat(5, var(--t)); grid-auto-rows: var(--t);
  gap: clamp(2px, .3vw, 4px); justify-content: center; align-content: center;
}
.checker i {
  border-radius: 18%;
  background: var(--card); border: 1px solid light-dark(var(--line-frame), var(--line));
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.05), rgba(0,0,0,.25)), 0 12px 28px -18px light-dark(rgba(20,30,40,.25), rgba(0,0,0,.55));
  display: grid; place-items: center;
  transition: transform .35s cubic-bezier(.215,.61,.355,1), box-shadow .35s ease;
  animation: ck-in .6s cubic-bezier(.215,.61,.355,1) both, ck-float 5s ease-in-out infinite;
  animation-delay: calc(var(--i, 0) * 55ms), calc(var(--i, 0) * -1.15s);   /* stagger the entrance, desync the float */
  will-change: translate;
}
.checker i:nth-child(1) { --i: 1 } .checker i:nth-child(2) { --i: 2 } .checker i:nth-child(3) { --i: 3 }
.checker i:nth-child(4) { --i: 4 } .checker i:nth-child(5) { --i: 5 } .checker i:nth-child(6) { --i: 6 }
.checker i:nth-child(7) { --i: 7 } .checker i:nth-child(8) { --i: 8 } .checker i:nth-child(9) { --i: 9 }
.checker i:nth-child(10) { --i: 10 } .checker i:nth-child(11) { --i: 11 } .checker i:nth-child(12) { --i: 12 }
@keyframes ck-in { from { opacity: 0; scale: .55; } }
@keyframes ck-float { 0%, 100% { translate: 0 0; rotate: 0deg; } 50% { translate: 0 -8px; rotate: var(--rr, 1.6deg); } }
.checker i:nth-child(even) { --rr: -1.6deg; }   /* neighbours wobble opposite ways */
/* empty tiles: quiet greys (a few shades so they don't read as copies), pressed in */
.checker i.is-dim {
  background: light-dark(#EFF1F4, #17191D); border-color: light-dark(#E4E7EB, #23262B);
  box-shadow: inset 0 1px 3px light-dark(rgba(20,30,40,.07), rgba(0,0,0,.45)), inset 0 -1px 0 light-dark(rgba(255,255,255,.8), rgba(255,255,255,.02));
}
.checker i.is-dim:nth-child(3n)   { background: light-dark(#E8EBEE, #141619); border-color: light-dark(#DDE0E5, #202329); }
.checker i.is-dim:nth-child(3n+1) { background: light-dark(#F6F7F8, #1B1E23); border-color: light-dark(#ECEEF0, #262A30); }
.checker i:hover { transform: translateY(-5px); }
.checker i:not(.is-dim):hover {
  transform: translateY(-8px);
  box-shadow: 0 2px 4px light-dark(rgba(20,30,40,.06), rgba(0,0,0,.3)), 0 18px 34px -16px light-dark(rgba(20,30,40,.3), rgba(0,0,0,.6));
}
.checker svg, .checker img { width: 46%; height: 46%; display: block; transition: scale .35s cubic-bezier(.215,.61,.355,1); }
.checker i:hover svg, .checker i:hover img { scale: 1.18; }
@media (prefers-reduced-motion: reduce) { .checker i { animation: none; } }
.ck-claude svg { fill: #D97757; }
.ck-gpt svg { fill: var(--fg); }
.ck-codex svg { fill: none; width: 52%; height: 52%; }
.ck-cc { color: #D97757; } .ck-cc svg { fill: currentColor; }
@media (max-width: 860px) {
  .hero--docs { grid-template-columns: 1fr; }
  .checker { justify-content: start; }
}

/* the guide: AI list on the left (sticky), steps on the right */
.guide { display: grid; grid-template-columns: minmax(0, 4fr) minmax(0, 8fr); border-top: 1px solid var(--line); }
.guide__nav { border-inline-end: 1px solid var(--line); padding: clamp(16px, 2.5vw, 28px) var(--pad-x) clamp(16px, 2.5vw, 28px) var(--pad-x); }
.guide__nav .ctabs-stick { position: sticky; top: calc(var(--nav-clear, 96px) + 12px); }
.ctabs__label {
  font-size: .6875rem; font-weight: 650; letter-spacing: .09em; text-transform: uppercase;
  color: var(--muted); margin: 2px 0 10px 4px;
}
.guide__main { padding: clamp(24px, 4vw, 48px) var(--pad-x); min-width: 0; }
.guide__panel { animation: blk-in .3s ease both; max-width: 62ch; }
.guide__panel[hidden] { display: none; }
.guide__where { color: var(--muted); font-size: .9375rem; line-height: 1.6; padding-bottom: 18px; margin-bottom: 6px; border-bottom: 1px solid var(--line); }

/* two little app tiles lean into each other above each panel */
.pair { display: flex; align-items: flex-start; margin-bottom: 18px; }
.pair__t {
  --pt: clamp(42px, 4vw, 50px);
  width: var(--pt); height: var(--pt); border-radius: 22%;
  background: var(--card); border: 1px solid light-dark(var(--line-frame), var(--line));
  box-shadow: 0 1px 2px light-dark(rgba(20,30,40,.06), rgba(0,0,0,.3)), 0 10px 22px -12px light-dark(rgba(20,30,40,.3), rgba(0,0,0,.6));
  display: grid; place-items: center;
  rotate: -8deg;
  animation: pair-in .5s cubic-bezier(.215,.61,.355,1) both;
  transition: rotate .35s cubic-bezier(.215,.61,.355,1), translate .35s cubic-bezier(.215,.61,.355,1);
}
.pair__t + .pair__t { rotate: 7deg; margin-inline-start: -8px; translate: 0 5px; animation-delay: .08s; position: relative; }
.pair__t svg, .pair__t img { width: 50%; height: 50%; display: block; }
.pair:hover .pair__t { rotate: -3deg; }
.pair:hover .pair__t + .pair__t { rotate: 3deg; translate: 0 2px; }
@keyframes pair-in { from { opacity: 0; translate: 0 10px; rotate: 0deg; } }

/* client list: one card per AI, the selected one lifts like a tile */
.ctabs { display: grid; gap: 8px; }
.ctab {
  appearance: none; font: inherit; cursor: pointer; text-align: start; width: 100%;
  display: flex; align-items: center; gap: 12px;
  padding: 12px 14px; border-radius: 14px;
  border: 1px solid transparent; background: var(--card-tray); color: var(--muted);
  transition: background .2s ease, color .2s ease, box-shadow .2s ease, border-color .2s ease;
}
:root:not([data-theme="light"]) .ctab { border-color: var(--line); background: color-mix(in srgb, var(--card) 35%, transparent); }
.ctab:hover { color: var(--fg); }
.ctab[aria-selected="true"] { background: var(--card); color: var(--fg); border-color: var(--line-frame); box-shadow: 0 1px 2px rgba(20,30,40,.04), 0 12px 32px -18px rgba(20,30,40,.25); }
/* dark: the selected card steps up a shade, with a light catch along its top edge */
:root:not([data-theme="light"]) .ctab[aria-selected="true"] {
  background: color-mix(in srgb, #fff 7%, var(--card));
  border-color: color-mix(in srgb, #fff 12%, var(--line-frame));
  box-shadow: inset 0 1px 0 rgba(255,255,255,.09), 0 1px 2px rgba(0,0,0,.35), 0 14px 30px -18px rgba(0,0,0,.75);
}
.ctab:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.ctab__t { display: grid; gap: 2px; min-width: 0; }
.ctab__t b { font-weight: 600; font-size: 1rem; letter-spacing: -.005em; }
.ctab__t small { font-size: .8125rem; color: var(--muted); }
.ctab__mark { flex: none; width: 34px; height: 34px; border-radius: 10px; display: inline-grid; place-items: center; background: #D97757; color: #fff; }
.ctab__mark svg { width: 18px; height: 18px; fill: currentColor; display: block; }
.ctab__mark[data-client="chatgpt"] { background: #0A0A0A; color: #fff; }
.ctab__mark[data-client="codex"] { background: var(--card); border: 1px solid var(--line-frame); }
.ctab__mark[data-client="codex"] svg { width: 20px; height: 20px; }
.ctab__mark[data-client="claudecode"] { background: var(--card); color: #D97757; border: 1px solid var(--line-frame); }
.ctab__mark[data-client="claudecode"] svg { width: 20px; height: 20px; }
@media (max-width: 860px) {
  .guide { grid-template-columns: 1fr; }
  .guide__nav { border-right: 0; border-bottom: 1px solid var(--line); padding: 12px var(--pad-x); }
  .guide__nav .ctabs-stick { position: static; }
  .guide__nav .ctabs { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .ctab { padding: 10px 12px; border-radius: 12px; }
  .ctab__t small { display: none; }
}

/* "more" disclosures: the optional detail, folded away */
.more { margin-top: 10px; border-top: 1px solid var(--line); }
.more summary { list-style: none; cursor: pointer; display: flex; align-items: center; justify-content: space-between; gap: 12px; padding: 14px 0; font-weight: 600; font-size: .9375rem; color: var(--fg); }
.more summary::-webkit-details-marker { display: none; }
.more summary i { width: 10px; height: 10px; flex-shrink: 0; position: relative; }
.more summary i::before, .more summary i::after { content: ""; position: absolute; inset: 0; margin: auto; background: var(--muted); transition: transform .2s ease; }
.more summary i::before { width: 10px; height: 1.5px; }
.more summary i::after { width: 1.5px; height: 10px; }
.more[open] summary i::after { transform: rotate(90deg); }
.more__body { display: grid; gap: 10px; padding: 0 0 18px; color: var(--muted); font-size: .9375rem; line-height: 1.6; }
.more__body p { color: var(--muted); }
.more__body code { font-family: var(--mono); font-size: .8em; padding: 1px 6px; border-radius: 5px; background: var(--card-tray); border: 1px solid var(--line); }

/* numbered steps */
.steps-list { list-style: none; margin: 0; padding: 0; display: grid; gap: 0; }
.step { position: relative; display: grid; grid-template-columns: 40px 1fr; gap: 16px; padding: 18px 0 20px; }
.step + .step { border-top: 1px solid var(--line); }
.step__n {
  width: 32px; height: 32px; border-radius: 10px; display: grid; place-items: center;
  font-weight: 700; font-size: .9375rem; color: var(--accent-text);
  background: color-mix(in srgb, var(--accent) 12%, transparent); border: 1px solid color-mix(in srgb, var(--accent) 22%, transparent);
}
.step__body { min-width: 0; display: grid; gap: 8px; }
.step__body h3 { font-size: 1.125rem; font-weight: 600; letter-spacing: -.01em; margin: 4px 0 0; }
.step__body p { color: var(--fg); font-size: 1rem; line-height: 1.6; }
.step__body p.fine { color: var(--muted); font-size: .875rem; }
.step__body code, .note code, .faq code { font-family: var(--mono); font-size: .8em; padding: 1px 6px; border-radius: 5px; background: var(--card-tray); border: 1px solid var(--line); }
.step__body a { color: var(--accent-text); text-decoration: underline; text-underline-offset: 2px; }
.step__body .urlpill { justify-self: start; margin: 2px 0; }

/* menu paths as keycaps: Settings → Connectors → Add custom connector */
.kpath { display: inline-flex; flex-wrap: wrap; align-items: center; gap: 4px; vertical-align: baseline; }
.kpath kbd {
  font: 500 .8125rem/1 var(--font); color: var(--fg);
  padding: 5px 8px 6px; border-radius: 7px;
  background: var(--card); border: 1px solid var(--line-frame);
  box-shadow: 0 1px 0 light-dark(rgba(20,30,40,.08), rgba(0,0,0,.5)), inset 0 -1px 0 light-dark(rgba(20,30,40,.04), rgba(255,255,255,.03));
}
.kpath i { font-style: normal; color: var(--muted); font-size: .8125rem; padding: 0 1px; }

/* code blocks: same recipe as the MCP url pill — card ground, gradient ring, soft shadow */
.code {
  position: relative; border-radius: 16px;
  --ring-a: light-dark(rgba(157,157,157,.12), rgba(255,255,255,.14));
  --ring-b: light-dark(rgba(0,0,0,.12),       rgba(255,255,255,.04));
  border: 1px solid transparent;
  background:
    linear-gradient(var(--card), var(--card)) padding-box,
    linear-gradient(var(--ring-a), var(--ring-b)) border-box;
  box-shadow: 0 4px 4px light-dark(rgba(23,23,23,.06), rgba(0,0,0,.35));
  color: var(--fg);
}
.code pre { margin: 0; padding: 13px 52px 13px 16px; font: 500 .8125rem/1.6 var(--mono); letter-spacing: -.02em; opacity: .85; white-space: pre-wrap; overflow-wrap: anywhere; }
.copybtn {
  position: absolute; top: 50%; inset-inline-end: 7px; translate: 0 -50%;
  appearance: none; cursor: pointer; border: 0; background: transparent; color: var(--fg);
  width: 32px; height: 32px; border-radius: 9px; display: inline-grid; place-items: center;
  transition: background .15s ease;
}
.copybtn:hover { background: var(--card-tray); }
.copybtn svg { grid-area: 1 / 1; width: 16px; height: 16px; fill: none; stroke: currentColor; stroke-width: 2; stroke-linecap: round; stroke-linejoin: round; display: block; transition: opacity .18s ease; }
.copybtn__icon { opacity: .8; }
.copybtn__ok { opacity: 0; stroke: var(--accent-text); }
.copybtn.is-copied .copybtn__icon { opacity: 0; }
.copybtn.is-copied .copybtn__ok { opacity: 1; }

/* callouts */
.note { margin-top: 18px; padding: 12px 14px; border-radius: 12px; font-size: .875rem; line-height: 1.55; color: var(--fg); background: var(--card-tray); border: 1px solid var(--line); }
.note b { font-weight: 600; }
.note--tip { margin: 0 0 6px; background: color-mix(in srgb, var(--accent) 8%, transparent); border-color: color-mix(in srgb, var(--accent) 22%, transparent); }



/* ======================================================================
   I18N — RTL fixes, Arabic type, and the navbar language pill (i18n.js)
   ====================================================================== */
/* directional glyphs mirror; URLs, commands and tool lines stay LTR islands */
[dir="rtl"] .kpath i, [dir="rtl"] .arrow, [dir="rtl"] .link-arrow span,
[dir="rtl"] .clients__go svg { scale: -1 1; }
/* hero graph: keep the canvas LTR so the wires curve like the English layout
   (hub port angles are tuned for that order); Arabic text inside still reads RTL */
[dir="rtl"] .hg__stage { direction: ltr; }
[dir="rtl"] .urlpill__url, [dir="rtl"] .code pre { direction: ltr; unicode-bidi: isolate; }
[dir="rtl"] .tool__t { unicode-bidi: plaintext; }
/* the prompt-wall marquee keeps its LTR mechanics; each chip reads RTL inside */
[dir="rtl"] .pw__row, [dir="rtl"] .pw__track { direction: ltr; }
[dir="rtl"] .pw-chip { direction: rtl; }

/* Arabic: its own face, no Latin tracking, looser headings, roomier split clip */
html[lang="ar"] { --font: "IBM Plex Sans Arabic", "Rethink Sans", ui-sans-serif, system-ui, -apple-system, "Segoe UI", Roboto, sans-serif; }
html[lang="ar"] * { letter-spacing: 0 !important; }
html[lang="ar"] h1, html[lang="ar"] h2 { line-height: 1.35; }
html[lang="ar"] .split { padding-bottom: .22em; margin-bottom: -.22em; padding-top: .08em; margin-top: -.08em; }

/* language pill: matches the theme toggle chip in the navbar */
.lf-lang { position: relative; }
.lf-lang__btn {
  display: inline-flex; align-items: center; gap: 6px;
  height: 42px; padding: 0 14px; border: 0; border-radius: 999px;
  background: var(--neutral-900, #343a40); color: #fff; cursor: pointer;
  font: 600 .75rem/1 var(--font); letter-spacing: .04em;
  transition: background-color .18s ease;
}
.lf-lang__btn:hover { background: #3d444b; }
.lf-lang__btn svg { width: 16px; height: 16px; display: block; opacity: .85; }
.lf-lang__menu {
  position: absolute; inset-inline-end: 0; top: calc(100% + 8px); z-index: 60;
  min-width: 150px; padding: 6px; border-radius: 14px;
  background: var(--card); border: 1px solid var(--line-frame);
  box-shadow: 0 8px 16px rgba(10,15,25,.10), 0 24px 48px -12px rgba(10,15,25,.22);
  display: grid; gap: 2px;
}
.lf-lang__menu button {
  appearance: none; border: 0; background: transparent; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  font: 500 .875rem/1 var(--font); color: var(--fg); text-align: start;
  padding: 9px 10px; border-radius: 9px;
}
.lf-lang__menu[hidden] { display: none; }
/* two-level menu: Arabic swaps the panel in place rather than opening a flyout,
   which at this width would run off the edge of the viewport. 21 languages also
   means the list scrolls — cap it against the viewport, not a fixed height. */
.lf-lang__menu { max-height: min(62vh, 440px); overflow-y: auto; overscroll-behavior: contain; }
.lf-lang__panel { display: grid; gap: 2px; }
.lf-lang__panel[hidden] { display: none; }
.lf-lang__drill,
.lf-lang__back {
  appearance: none; border: 0; background: transparent; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between; gap: 12px;
  font: 500 .875rem/1 var(--font); color: var(--fg); text-align: start;
  padding: 9px 10px; border-radius: 9px; width: 100%;
}
.lf-lang__drill:hover, .lf-lang__back:hover { background: var(--card-tray); }
.lf-lang__drill svg, .lf-lang__back svg { width: 15px; height: 15px; flex: none; opacity: .55; }
.lf-lang__drill i { font-style: normal; color: var(--accent-text); }
/* the back row reads as a header for the panel it returns from */
.lf-lang__back {
  justify-content: flex-start; color: var(--muted); font-weight: 600;
  margin-bottom: 2px; border-bottom: 1px solid var(--line); border-radius: 9px 9px 0 0;
}
/* RTL: the chevrons point the other way */
[dir="rtl"] .lf-lang__drill svg, [dir="rtl"] .lf-lang__back svg { transform: scaleX(-1); }

/* mobile language picker — native select, so scrolling, type-ahead and the
   Arabic optgroup come for free where a 21-button pill row would not fit */
.lf-lang__select {
  appearance: none; -webkit-appearance: none;
  font: 500 .8125rem/1 var(--font); color: #fff;
  background: rgba(255,255,255,.10); border: 1px solid rgba(255,255,255,.14);
  border-radius: 999px; padding: 8px 30px 8px 12px; max-width: 62%;
  background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%23ffffff' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
  background-repeat: no-repeat; background-position: right 10px center; background-size: 14px;
}
[dir="rtl"] .lf-lang__select { padding: 8px 12px 8px 30px; background-position: left 10px center; }
/* the picker itself is drawn by the OS — give it readable colours in both themes */
.lf-lang__select option, .lf-lang__select optgroup { color: var(--fg); background: var(--card); }
.lf-lang__menu button:hover { background: var(--card-tray); }
.lf-lang__menu button i { font-style: normal; color: var(--accent-text); }
.lf-lang__menu button[aria-selected="true"] { color: var(--accent-text); font-weight: 600; }
/* mobile navbar: keep the language pill, win the space back by tightening
   everything a notch — logo, paddings, CTA, burger, globe-only lang chip */
@media (max-width: 1023px) {
  .lf-navbar { gap: 8px; padding: 8px 8px 8px 14px; }
  .lf-logo__img { width: 104px; height: 27px; }
  .lf-actions { gap: 6px; }
  .lf-actions .lf-btn--primary { padding: 9px 14px; font-size: 13px; line-height: 20px; }
  .lf-burger { width: 36px; height: 36px; }
  .lf-lang__btn { height: 36px; width: 36px; padding: 0; justify-content: center; }
  .lf-lang__btn span { display: none; }
  .lf-lang__btn svg { width: 15px; height: 15px; }
}
@media (max-width: 400px) {
  .lf-logo__img { width: 96px; height: 25px; }
  .lf-actions .lf-btn--primary { padding: 8px 12px; font-size: 12.5px; }
}
/* tight phones: the CTA drops its qualifier so the burger always fits */
.lf-cta-short { display: none; }
@media (max-width: 480px) {
  .lf-cta-long { display: none; }
  .lf-cta-short { display: inline; }
}
