/* Weft landing — "Midnight" design system.
   Its own identity (near-black canvas, violet glow, big type), but reuses the app's fonts
   (Hanken Grotesk / Newsreader / JetBrains Mono) and violet accent family so it reads as kin
   to the product. Self-contained; no framework. */

/* Fonts are self-hosted in assets/fonts.css, linked from each page's <head> rather than @import-ed
   here. Two reasons. A page arguing that your data stays on your machine should not tell Google
   every time someone opens it. And a CSS @import is discovered only after this file has parsed, so
   it serialised two extra round trips in front of first paint. */

:root {
  --bg: #0a0a0e;
  --bg-2: #0e0e14;
  --surface: #14141c;
  --surface-2: #1a1a24;
  --border: rgba(255, 255, 255, 0.08);
  --border-2: rgba(255, 255, 255, 0.13);

  --text: #f5f3ef;
  --text-2: #cdc8d6;
  --muted: #9a94a8;
  --muted-2: #6e6a7c;

  --accent: #8e93e8;
  --accent-2: #9d86ff;
  --accent-bright: #b3a4ff;
  --lilac: #8e86d6;
  --success: #7fb98d;

  --grad: linear-gradient(135deg, #8e93e8 0%, #9d86ff 55%, #b3a4ff 100%);
  --grad-soft: linear-gradient(135deg, rgba(142, 147, 232, 0.18), rgba(157, 134, 255, 0.14));

  --font: "Hanken Grotesk", system-ui, -apple-system, sans-serif;
  --serif: "Newsreader", Georgia, serif;
  --mono: "JetBrains Mono", ui-monospace, monospace;

  --maxw: 1180px;
  --radius: 16px;
}

* { box-sizing: border-box; }

/* This page is deliberately dark in both schemes: "Midnight" is the brand, and a light variant of
   a canvas built on a near-black base with a violet glow would be a different design, not a
   recolour. Declaring it means the browser paints form controls, scrollbars and the pre-paint
   canvas dark to match, instead of flashing white on a light-mode machine.

   The APP does respect prefers-color-scheme properly: its theme has a "system" mode that follows
   the OS both ways (frontend/src/lib/themeMode.ts). Try the demo at /demo/ with your OS in light
   mode to see it. */
html { color-scheme: dark; }

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

body {
  margin: 0;
  font-family: var(--font);
  background: var(--bg);
  color: var(--text);
  font-size: 17px;
  line-height: 1.6;
  letter-spacing: -0.006em;
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  overflow-x: hidden;
}

/* Ambient background: faint grid + a couple of violet glows fixed to the page top. */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -2;
  background:
    radial-gradient(900px 600px at 78% -8%, rgba(157, 134, 255, 0.16), transparent 60%),
    radial-gradient(700px 500px at 8% 4%, rgba(142, 147, 232, 0.10), transparent 55%);
  pointer-events: none;
}
body::after {
  content: "";
  position: fixed;
  inset: 0;
  z-index: -2;
  background-image:
    linear-gradient(rgba(255, 255, 255, 0.022) 1px, transparent 1px),
    linear-gradient(90deg, rgba(255, 255, 255, 0.022) 1px, transparent 1px);
  background-size: 56px 56px;
  mask-image: radial-gradient(ellipse 100% 60% at 50% 0%, #000 20%, transparent 75%);
  pointer-events: none;
}

a { color: inherit; text-decoration: none; }
img { max-width: 100%; height: auto; display: block; }

.container {
  width: 100%;
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 0 24px;
}

/* keep anchored section headings clear of the fixed nav */
[id] { scroll-margin-top: 84px; }

.eyebrow {
  font-family: var(--mono);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.18em;
  color: var(--accent);
  display: inline-flex;
  align-items: center;
  gap: 9px;
  margin: 0 0 18px;
}
.eyebrow::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: var(--lilac);
  box-shadow: 0 0 10px rgba(142, 134, 214, 0.9);
}

.grad-text {
  background: var(--grad);
  -webkit-background-clip: text;
  background-clip: text;
  color: transparent;
  /* background-clip:text hugs the glyph box, so with a tight heading line-height the fill can shave
     ascenders/descenders. A little vertical paint room (harmless for an inline span) plus clone
     keeps wrapped gradient text from being clipped. */
  padding-block: 0.05em;
  -webkit-box-decoration-break: clone;
  box-decoration-break: clone;
}

/* ---------- buttons ---------- */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: var(--font);
  font-size: 0.98rem;
  font-weight: 600;
  padding: 13px 22px;
  border-radius: 999px;
  border: 1px solid transparent;
  cursor: pointer;
  transition: transform 0.16s ease, box-shadow 0.16s ease, background 0.16s ease, border-color 0.16s ease;
  white-space: nowrap;
}
.btn-primary {
  background: var(--grad);
  color: #14121c;
  box-shadow: 0 8px 30px rgba(157, 134, 255, 0.28);
}
.btn-primary:hover { transform: translateY(-2px); box-shadow: 0 12px 40px rgba(157, 134, 255, 0.4); }
.btn-ghost {
  background: rgba(255, 255, 255, 0.04);
  border-color: var(--border-2);
  color: var(--text);
}
.btn-ghost:hover { background: rgba(255, 255, 255, 0.08); transform: translateY(-2px); }

/* ---------- nav ---------- */
.nav {
  position: fixed;
  top: 0; left: 0; right: 0;
  z-index: 50;
  transition: background 0.25s ease, border-color 0.25s ease, backdrop-filter 0.25s ease;
  border-bottom: 1px solid transparent;
}
.nav.scrolled {
  background: rgba(10, 10, 14, 0.72);
  backdrop-filter: blur(16px) saturate(1.2);
  -webkit-backdrop-filter: blur(16px) saturate(1.2);
  border-bottom-color: var(--border);
}
.nav-inner {
  max-width: var(--maxw);
  margin: 0 auto;
  padding: 15px 24px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 20px;
}
.brand { display: inline-flex; align-items: center; gap: 11px; font-weight: 600; font-size: 1.12rem; letter-spacing: -0.01em; }
.brand .mark {
  width: 30px; height: 30px;
  border-radius: 9px;
  background: var(--grad);
  display: grid; place-items: center;
  font-family: var(--serif);
  font-weight: 600;
  font-size: 1.1rem;
  color: #14121c;
  box-shadow: 0 4px 16px rgba(157, 134, 255, 0.35);
}
.nav-links { display: flex; align-items: center; gap: 30px; }
.nav-links a { color: var(--muted); font-size: 0.95rem; font-weight: 500; transition: color 0.15s ease; }
.nav-links a:hover { color: var(--text); }
.nav-cta { display: flex; align-items: center; gap: 14px; }
.nav-cta .btn { padding: 9px 18px; font-size: 0.9rem; }

.menu-toggle {
  display: none;
  background: none; border: 0; cursor: pointer; padding: 8px;
  color: var(--text);
}
.menu-toggle svg { width: 24px; height: 24px; }

/* ---------- hero ---------- */
.hero { padding: 168px 0 90px; position: relative; }
.hero-badge {
  display: inline-flex; align-items: center; gap: 8px;
  font-family: var(--mono);
  font-size: 0.74rem;
  letter-spacing: 0.04em;
  color: var(--text-2);
  background: rgba(255, 255, 255, 0.04);
  border: 1px solid var(--border);
  border-radius: 999px;
  padding: 6px 14px 6px 10px;
  margin-bottom: 26px;
}
.hero-badge .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--success); box-shadow: 0 0 8px var(--success); }
.hero h1 {
  font-size: clamp(2.7rem, 6.4vw, 5rem);
  line-height: 1.02;
  letter-spacing: -0.035em;
  font-weight: 600;
  margin: 0 0 24px;
  max-width: 15ch;
}
.hero .sub {
  font-size: clamp(1.08rem, 1.6vw, 1.3rem);
  color: var(--muted);
  max-width: 40ch;
  margin: 0 0 34px;
  line-height: 1.55;
}
.hero .sub strong { color: var(--text-2); font-weight: 500; }
.hero-cta { display: flex; flex-wrap: wrap; gap: 14px; align-items: center; }
.trust {
  display: flex; flex-wrap: wrap; gap: 10px 22px;
  margin-top: 34px;
  font-size: 0.9rem;
  color: var(--muted);
}
.trust span { display: inline-flex; align-items: center; gap: 8px; }
.trust svg { width: 15px; height: 15px; color: var(--success); flex: none; }

/* hero product shot in a browser frame */
.hero-shot { margin-top: 66px; position: relative; }
.hero-shot::before {
  content: "";
  position: absolute;
  inset: -12% -6% -20% -6%;
  background: radial-gradient(60% 60% at 50% 30%, rgba(157, 134, 255, 0.34), transparent 70%);
  filter: blur(30px);
  z-index: -1;
}
.frame {
  border-radius: 14px;
  border: 1px solid var(--border-2);
  background: #1a1a22;
  box-shadow: 0 40px 120px -30px rgba(0, 0, 0, 0.85), 0 0 0 1px rgba(255, 255, 255, 0.03);
  overflow: hidden;
}
.frame-bar {
  display: flex; align-items: center; gap: 7px;
  padding: 11px 15px;
  background: #16161d;
  border-bottom: 1px solid var(--border);
}
.frame-bar i { width: 11px; height: 11px; border-radius: 50%; background: #3a3a46; display: block; }
.frame-bar i:nth-child(1) { background: #e26d5c; opacity: 0.85; }
.frame-bar i:nth-child(2) { background: #e0b653; opacity: 0.85; }
.frame-bar i:nth-child(3) { background: #63b47a; opacity: 0.85; }
.frame-bar .url {
  margin-left: 14px;
  font-family: var(--mono);
  font-size: 0.74rem;
  color: var(--muted-2);
  background: rgba(0, 0, 0, 0.25);
  padding: 4px 12px;
  border-radius: 6px;
  flex: 1;
  max-width: 340px;
}
.frame img { width: 100%; height: auto; display: block; }

/* ---------- source strip ---------- */
.sources {
  padding: 46px 0;
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  margin-top: 90px;
}
.sources .label {
  text-align: center;
  font-family: var(--mono);
  font-size: 0.72rem;
  text-transform: uppercase;
  letter-spacing: 0.16em;
  color: var(--muted-2);
  margin-bottom: 26px;
}
.source-row {
  display: flex; flex-wrap: wrap;
  justify-content: center;
  align-items: center;
  gap: 16px 40px;
}
.source-row .s {
  display: inline-flex; align-items: center; gap: 10px;
  color: var(--text-2);
  font-weight: 600;
  font-size: 1.02rem;
  opacity: 0.86;
  transition: opacity 0.15s ease;
}
.source-row .s:hover { opacity: 1; }
.source-row .s .ico { width: 22px; height: 22px; display: grid; place-items: center; }
.source-row .s .ico svg { width: 22px; height: 22px; }

/* ---------- section scaffolding ---------- */
.section { padding: 112px 0; }
.section-head { max-width: 46ch; margin-bottom: 22px; }
.section-head.center { margin: 0 auto 60px; text-align: center; }
.section h2 {
  font-size: clamp(2rem, 3.6vw, 3rem);
  /* 1.08 was tight enough to clip the top of ascenders on the first line (and the gradient span).
     1.14 gives the glyphs room without loosening the display heading noticeably. */
  line-height: 1.14;
  letter-spacing: -0.03em;
  font-weight: 600;
  margin: 0 0 18px;
}
.section .lede { color: var(--muted); font-size: 1.12rem; margin: 0; }

/* alternating feature row */
.feature { display: grid; grid-template-columns: 1fr 1fr; gap: 64px; align-items: center; }
.feature + .feature { margin-top: 118px; }
.feature.reverse .feature-media { order: -1; }
.feature h3 {
  font-size: clamp(1.7rem, 2.6vw, 2.3rem);
  line-height: 1.12;
  letter-spacing: -0.025em;
  font-weight: 600;
  margin: 0 0 16px;
}
.feature p { color: var(--muted); margin: 0 0 22px; font-size: 1.06rem; }
.feature p strong { color: var(--text-2); font-weight: 600; }
.flist { list-style: none; margin: 0; padding: 0; display: grid; gap: 13px; }
.flist li { display: flex; gap: 12px; color: var(--text-2); font-size: 1rem; align-items: flex-start; }
.flist li svg { width: 18px; height: 18px; color: var(--accent); flex: none; margin-top: 3px; }

/* pin an inner card/term to the bottom so two-up columns align at the base */
.feature-copy.pin { display: flex; flex-direction: column; }
.feature-copy.pin > .card, .feature-copy.pin > .term { margin-top: auto; }

.feature-media { position: relative; }
.feature-media .glow {
  position: absolute; inset: -14%;
  background: radial-gradient(50% 50% at 50% 45%, rgba(157, 134, 255, 0.22), transparent 70%);
  filter: blur(24px); z-index: -1;
}
.feature-media img { border-radius: 12px; }

/* ---------- crafted mini-UI accents (styled for midnight, not the app) ---------- */
.card {
  background: linear-gradient(180deg, var(--surface), var(--bg-2));
  border: 1px solid var(--border);
  border-radius: var(--radius);
  padding: 22px;
}

.ui-answer .who {
  font-family: var(--mono); font-size: 0.68rem; letter-spacing: 0.12em; text-transform: uppercase;
  color: var(--accent); display: flex; align-items: center; gap: 8px; margin-bottom: 12px;
}
.ui-answer .who .d { width: 6px; height: 6px; border-radius: 50%; background: var(--lilac); }
.ui-answer p { margin: 0 0 14px; color: var(--text-2); font-size: 0.98rem; line-height: 1.6; }
.cite {
  display: inline-grid; place-items: center;
  min-width: 18px; height: 18px; padding: 0 5px;
  border-radius: 5px; background: rgba(157, 134, 255, 0.16);
  color: var(--accent-bright); font-size: 0.72rem; font-weight: 600;
  font-family: var(--mono); vertical-align: 1px; margin: 0 2px;
}
.ui-sources { border-top: 1px solid var(--border); margin-top: 6px; padding-top: 14px; display: grid; gap: 9px; }
.ui-src { display: flex; align-items: center; gap: 10px; font-size: 0.86rem; color: var(--muted); }
.ui-src .n { font-family: var(--mono); color: var(--accent-bright); font-size: 0.74rem; }
.ui-src .pill { margin-left: auto; font-family: var(--mono); font-size: 0.68rem; color: var(--muted-2); }

.chips { display: flex; flex-wrap: wrap; gap: 10px; }
.chip {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 15px; border-radius: 999px;
  border: 1px solid var(--border-2);
  background: rgba(255, 255, 255, 0.03);
  color: var(--text-2); font-size: 0.92rem; font-weight: 500;
  /* Chips are real <button> tabs now (they switch the mockup), so reset native button chrome and
     make the interactivity legible. */
  appearance: none; -webkit-appearance: none; font-family: inherit; line-height: 1.1;
  cursor: pointer; transition: background 0.18s ease, color 0.18s ease, border-color 0.18s ease;
}
.chip:hover { border-color: var(--border); color: var(--text); }
.chip:focus-visible { outline: 2px solid var(--accent-bright); outline-offset: 2px; }
.chip.on { background: var(--grad); color: #14121c; border-color: transparent; }
.chip.on:hover { color: #14121c; }
.chip .d { width: 6px; height: 6px; border-radius: 50%; background: var(--accent); }
.chip.on .d { background: rgba(20,18,28,0.6); }

/* MCP tool-call block */
.term {
  font-family: var(--mono); font-size: 0.86rem; line-height: 1.7;
  background: #0c0c12; border: 1px solid var(--border); border-radius: 12px;
  padding: 18px 20px; color: var(--text-2); overflow-x: auto;
}
.term .prompt { color: var(--accent); }
.term .tool { color: var(--accent-bright); }
.term .str { color: #9fd3a6; }
.term .muted { color: var(--muted-2); }
.term .out { color: var(--muted); display: block; padding-left: 2px; }
.term .row { white-space: nowrap; }

/* resurface card */
.resurf .kick { font-family: var(--mono); font-size: 0.66rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--accent); margin-bottom: 10px; }
.resurf .t { color: var(--text); font-size: 1rem; line-height: 1.5; margin-bottom: 14px; }
.resurf .meta { display: flex; align-items: center; gap: 8px; font-size: 0.82rem; color: var(--muted-2); }
.resurf .meta .src { color: var(--text-2); font-weight: 600; }

/* extension popup frame */
.ext-pop { position: relative; max-width: 320px; margin: 0 auto; filter: drop-shadow(0 30px 60px rgba(0, 0, 0, 0.7)); }
.ext-cap {
  display: flex; align-items: center; gap: 9px;
  padding: 11px 15px; background: #13131a;
  border: 1px solid var(--border-2); border-bottom: 0; border-radius: 16px 16px 0 0;
  font-family: var(--mono); font-size: 0.72rem; color: var(--muted);
}
.ext-cap svg { width: 15px; height: 15px; color: var(--accent); flex: none; }
.ext-pop img { width: 100%; display: block; border: 1px solid var(--border-2); border-top: 0; border-radius: 0 0 16px 16px; }
.ext-tip {
  position: absolute; top: -7px; right: 30px; width: 14px; height: 14px;
  background: #13131a; border-left: 1px solid var(--border-2); border-top: 1px solid var(--border-2);
  transform: rotate(45deg);
}

/* capture data-flow */
.flow-track { display: flex; align-items: stretch; gap: 10px; }
.flow .node { flex: 1; background: rgba(255, 255, 255, 0.02); border: 1px solid var(--border); border-radius: 12px; padding: 14px 16px; }
.flow .node b { display: block; font-size: 0.92rem; color: var(--text); margin-bottom: 4px; font-weight: 600; letter-spacing: -0.01em; }
.flow .node span { font-family: var(--mono); font-size: 0.71rem; color: var(--muted-2); line-height: 1.45; }
.flow .node.accent { border-color: rgba(157, 134, 255, 0.4); background: rgba(157, 134, 255, 0.06); }
.flow .node.accent b { color: var(--accent-bright); }
.flow .arrow { width: 20px; height: 20px; color: var(--muted-2); align-self: center; flex: none; }
@media (max-width: 760px) {
  .flow-track { flex-direction: column; }
  .flow .arrow { transform: rotate(90deg); margin: 0 auto; }
}

/* ---------- privacy band ---------- */
.privacy {
  background:
    radial-gradient(70% 120% at 50% 0%, rgba(142, 147, 232, 0.10), transparent 60%),
    linear-gradient(180deg, #0d0d14, #0a0a0e);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}
.privacy .container { max-width: 900px; text-align: center; }
.privacy .quote {
  font-family: var(--serif);
  font-size: clamp(1.5rem, 3vw, 2.35rem);
  line-height: 1.28;
  letter-spacing: -0.01em;
  color: var(--text);
  font-weight: 500;
  margin: 22px 0 40px;
}
.privacy .quote em { font-style: italic; color: var(--accent-bright); }
.privacy-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 22px; text-align: left; }
.privacy-grid .p {
  border-top: 1px solid var(--border-2);
  padding-top: 16px;
}
.privacy-grid .p h4 { margin: 0 0 6px; font-size: 1rem; font-weight: 600; color: var(--text); }
.privacy-grid .p p { margin: 0; color: var(--muted); font-size: 0.92rem; }

/* ---------- how it works ---------- */
.steps { display: grid; grid-template-columns: repeat(3, 1fr); gap: 26px; }
.step { position: relative; padding-top: 8px; }
.step .num {
  font-family: var(--mono); font-size: 0.8rem; color: var(--accent);
  border: 1px solid var(--border-2); border-radius: 8px;
  width: 34px; height: 34px; display: grid; place-items: center; margin-bottom: 18px;
  background: rgba(157, 134, 255, 0.06);
}
.step h4 { margin: 0 0 8px; font-size: 1.18rem; font-weight: 600; letter-spacing: -0.02em; }
.step p { margin: 0; color: var(--muted); font-size: 0.98rem; }

/* ---------- final CTA ---------- */
.cta-final { text-align: center; padding: 120px 0; }
.cta-final h2 { font-size: clamp(2.2rem, 4.4vw, 3.4rem); letter-spacing: -0.03em; margin: 0 0 16px; }
.cta-final p { color: var(--muted); font-size: 1.12rem; margin: 0 auto 34px; max-width: 44ch; }
.install {
  display: inline-flex; align-items: center; gap: 14px;
  font-family: var(--mono); font-size: 0.98rem;
  background: #0c0c12; border: 1px solid var(--border-2); border-radius: 12px;
  padding: 15px 20px; color: var(--text); margin-bottom: 30px;
}
.install .dollar { color: var(--accent); }
.install .copy { color: var(--muted-2); font-size: 0.78rem; border-left: 1px solid var(--border); padding-left: 14px; }
.cta-final .row { display: flex; gap: 14px; justify-content: center; flex-wrap: wrap; }

/* hero concrete example */
.hero-eg {
  margin-top: 30px;
  display: inline-flex; align-items: center; gap: 12px; flex-wrap: wrap;
  font-size: 0.98rem;
  background: rgba(255, 255, 255, 0.03); border: 1px solid var(--border);
  border-radius: 12px; padding: 12px 16px;
}
.hero-eg .lbl { font-family: var(--mono); font-size: 0.64rem; letter-spacing: 0.12em; text-transform: uppercase; color: var(--muted-2); }
.hero-eg .q { color: var(--text); font-weight: 500; }
.hero-eg .a { color: var(--muted); }
.hero-eg .a b { color: var(--accent-bright); font-weight: 600; }

/* FAQ accordion */
.faq { max-width: 780px; margin: 0 auto; }
.faq details {
  border-bottom: 1px solid var(--border);
  padding: 4px 0;
}
.faq summary {
  list-style: none; cursor: pointer;
  display: flex; align-items: center; justify-content: space-between; gap: 16px;
  padding: 20px 4px;
  font-size: 1.12rem; font-weight: 600; letter-spacing: -0.01em; color: var(--text);
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary .plus { flex: none; width: 20px; height: 20px; position: relative; color: var(--accent); transition: transform 0.2s ease; }
.faq summary .plus::before, .faq summary .plus::after { content: ""; position: absolute; background: currentColor; border-radius: 2px; }
.faq summary .plus::before { top: 9px; left: 2px; right: 2px; height: 2px; }
.faq summary .plus::after { left: 9px; top: 2px; bottom: 2px; width: 2px; transition: opacity 0.2s ease; }
.faq details[open] summary .plus::after { opacity: 0; }  /* + becomes − when open */
.faq details > p { margin: 0 4px 22px; color: var(--muted); font-size: 1.02rem; line-height: 1.6; max-width: 68ch; }
.faq details > p a { color: var(--accent); }

/* ---------- footer ---------- */
.footer { border-top: 1px solid var(--border); padding: 56px 0 46px; }
.footer-inner { display: flex; justify-content: space-between; gap: 40px; flex-wrap: wrap; }
.footer .brand { margin-bottom: 14px; }
.footer .tag { color: var(--muted); font-size: 0.95rem; max-width: 34ch; }
.footer-cols { display: flex; gap: 64px; flex-wrap: wrap; }
.footer-col h5 { font-family: var(--mono); font-size: 0.68rem; letter-spacing: 0.14em; text-transform: uppercase; color: var(--muted-2); margin: 0 0 14px; }
.footer-col a { display: block; color: var(--muted); font-size: 0.95rem; margin-bottom: 10px; transition: color 0.15s ease; }
.footer-col a:hover { color: var(--text); }
.footer-base {
  margin-top: 46px; padding-top: 22px; border-top: 1px solid var(--border);
  display: flex; justify-content: space-between; gap: 16px; flex-wrap: wrap;
  color: var(--muted-2); font-size: 0.85rem;
}
.footer-base .local { display: inline-flex; align-items: center; gap: 8px; }
.footer-base .local .dot { width: 7px; height: 7px; border-radius: 50%; background: var(--success); box-shadow: 0 0 8px var(--success); }

/* ---------- scroll reveal ---------- */
.reveal { opacity: 0; transform: translateY(18px); transition: opacity 0.6s ease, transform 0.6s ease; }
.reveal.in { opacity: 1; transform: none; }
@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}

/* skip link */
.skip { position: absolute; left: -999px; top: 8px; background: var(--surface); color: var(--text); padding: 10px 16px; border-radius: 8px; z-index: 100; }
.skip:focus { left: 12px; }

:focus-visible { outline: 2px solid var(--accent-bright); outline-offset: 3px; border-radius: 4px; }

/* ---------- responsive ---------- */
@media (max-width: 900px) {
  .nav-links, .nav-cta .btn-ghost { display: none; }
  .menu-toggle { display: inline-flex; }
  .nav.open .nav-links {
    display: flex; flex-direction: column; align-items: flex-start;
    position: absolute; top: 100%; left: 0; right: 0;
    background: rgba(12, 12, 18, 0.96); backdrop-filter: blur(16px);
    padding: 20px 24px; gap: 18px; border-bottom: 1px solid var(--border);
  }
  .feature { grid-template-columns: 1fr; gap: 34px; }
  .feature.reverse .feature-media { order: 0; }
  .feature + .feature { margin-top: 80px; }
  .privacy-grid, .steps { grid-template-columns: 1fr; }
  .section { padding: 84px 0; }
  .hero { padding: 132px 0 60px; }
}
@media (max-width: 560px) {
  body { font-size: 16px; }
  .hero-cta { flex-direction: column; align-items: stretch; }
  .hero-cta .btn { justify-content: center; }
  .frame-bar .url { display: none; }
}

/* --- Extension download (capture section) -------------------------------------------------
   Shaped like the store install buttons people already recognise (mark on the left, label and a
   quiet second line on the right) because the action is the same even though the source is not
   the Web Store. The honest caveat lives beside it rather than inside the button: putting
   "installs unpacked" on the CTA itself makes the primary action read as a warning. */
/* Stacked, not two columns: this sits inside a half-width feature column, so a side-by-side
   button + prose split gives the prose ~28ch and it wraps into a ragged tower. */
.ext-get { margin-top: 30px; }
.btn-ext {
  display: inline-flex; align-items: center; gap: 13px;
  padding: 13px 22px 13px 16px; border-radius: 12px;
  background: var(--grad); color: #14121c; text-decoration: none;
  box-shadow: 0 10px 30px rgba(157,134,255,.22);
  transition: transform .16s ease, box-shadow .16s ease;
}
.btn-ext:hover { transform: translateY(-1px); box-shadow: 0 14px 38px rgba(157,134,255,.32); }
.ext-chrome {
  width: 30px; height: 30px; border-radius: 50%; background: #fff;
  display: flex; align-items: center; justify-content: center; flex: 0 0 auto;
}
.ext-chrome svg { width: 24px; height: 24px; }
.ext-label { display: flex; flex-direction: column; line-height: 1.25; }
.ext-label b { font-size: 1rem; font-weight: 600; letter-spacing: -.01em; }
.ext-label i { font-style: normal; font-size: .72rem; opacity: .62; margin-top: 2px; }

.ext-side { margin-top: 16px; }
.ext-how summary {
  cursor: pointer; list-style: none; font-size: .84rem; color: var(--text-2);
  display: inline-flex; align-items: center; gap: 7px;
}
/* Both, deliberately: Chrome moved summary from ::-webkit-details-marker to ::marker, and the
   older selector alone leaves a stray triangle in current Chrome. */
.ext-how summary::-webkit-details-marker { display: none; }
.ext-how summary::marker { content: ""; }
.ext-how summary::before { content: "+"; font-family: var(--mono); color: var(--accent); }
.ext-how[open] summary::before { content: "\2013"; }
.ext-how ol {
  margin: 11px 0 0; padding-left: 18px; font-size: .84rem; color: var(--muted); line-height: 1.8;
}
.ext-how code {
  font-family: var(--mono); font-size: .88em; color: var(--text-2);
  background: rgba(255,255,255,.05); padding: 1px 6px; border-radius: 5px;
}
.ext-note { margin: 10px 0 0; max-width: 54ch; font-size: .78rem; color: var(--muted-2); line-height: 1.6; }
.ext-note a { color: var(--muted); text-decoration: underline; text-underline-offset: 2px; }
.ext-note a:hover { color: var(--accent-bright); }

@media (max-width: 560px) {
  .btn-ext { width: 100%; justify-content: center; }
}

/* --- Long-form prose (privacy, and any future legal//docs page) ---------------------------- */
.prose { margin-top: 42px; }
.prose h2 {
  font-size: 1.12rem; font-weight: 600; letter-spacing: -.01em;
  color: var(--text); margin: 42px 0 12px;
}
.prose h2:first-child { margin-top: 0; }
.prose p { color: var(--muted); line-height: 1.75; margin: 0 0 14px; max-width: 66ch; }
.prose ul { margin: 0 0 14px; padding-left: 20px; max-width: 66ch; }
.prose li { color: var(--muted); line-height: 1.75; margin-bottom: 9px; }
.prose code {
  font-family: var(--mono); font-size: .88em; color: var(--text-2);
  background: rgba(255,255,255,.05); padding: 1px 6px; border-radius: 5px;
}
.prose a { color: var(--accent-bright); text-decoration: underline; text-underline-offset: 2px; }

/* Code blocks in long-form prose (support page setup steps). */
.prose pre {
  margin: 0 0 14px; padding: 14px 16px; border-radius: 10px;
  background: rgba(255,255,255,.04); border: 1px solid var(--line, rgba(255,255,255,.08));
  overflow-x: auto; max-width: 66ch;
}
.prose pre code {
  background: none; padding: 0; font-size: .82rem; color: var(--text-2); line-height: 1.7;
}

/* Shown on /support while the repository is private: the install steps cannot work yet, so the
   page says so rather than printing a clone command against a 404. */
.note-soon {
  margin: 0 0 14px; padding: 12px 14px; border-radius: 10px; max-width: 66ch;
  background: rgba(157,134,255,.09); border: 1px solid rgba(157,134,255,.22);
  font-size: .88rem; line-height: 1.65; color: var(--text-2);
}
