/* ============================================================
   NOX // chatapp — landing page
   Design language: cyberpunk technical brutalism
   Inspired by Cyberpunk 2077 UI / Edgerunners / vintage VHS HUDs
   ============================================================ */

/* -------- Tokens -------- */
:root {
  /* surfaces */
  --bg:         #050510;
  --bg-elev:   #0a0a18;
  --panel:      #0e0e22;
  --panel-hi:  #161635;
  --border:    #1f1f3a;
  --border-hi: #303060;

  /* text — nudged brighter 2026-06-02 for legibility. The mono labels
     and lead paragraphs were riding too dark against the near-black bg
     (muted #5a5a7a failed WCAG AA on body text); these still read as
     "dim / muted" but are comfortably readable. */
  --text:        #eef1ff;
  --text-dim:   #a6a6cc;
  --text-muted: #76768f;

  /* accents — cyan + orange is the cinematic complementary pair (CP2077 chrome HUDs) */
  --cyan:   #00e5ff;
  --orange: #ff6600;           /* pure pumpkin orange — zero pink, unambiguous */
  --yellow: #fcee0a;           /* the Cyberpunk 2077 yellow */
  --danger: #ff3864;
  --green:  #3ff971;

  /* Readable-on-dark accent for TEXT (links, headings, hover states).
     Pure --cyan #00e5ff is the right neon for borders/backgrounds/glows
     but reads as eye-straining electric blue when used as text — users
     complained they couldn't read it. This mint-cyan sits in the same
     family (keeps the brand identity) but desaturated enough to avoid
     the fatigue. Keep --cyan for surfaces/borders, use --accent-text
     anywhere the cyan lands on background as a character. */
  --accent-text: #a6ffe8;

  /* glows */
  --glow-cyan:   0 0 12px rgba(0, 229, 255, 0.45), 0 0 32px rgba(0, 229, 255, 0.15);
  --glow-yellow: 0 0 12px rgba(252, 238, 10, 0.45), 0 0 32px rgba(252, 238, 10, 0.15);
  --glow-orange: 0 0 12px rgba(255, 102, 0, 0.55), 0 0 32px rgba(255, 102, 0, 0.18);

  /* radii / spacing */
  --r-sm: 2px;
  --r-md: 4px;

  /* clip-path for the signature angular corner cut */
  --clip-corner: polygon(
    0 0,
    calc(100% - 14px) 0,
    100% 14px,
    100% 100%,
    14px 100%,
    0 calc(100% - 14px)
  );
}

* { box-sizing: border-box; }
html, body { margin: 0; padding: 0; }
/* Anchor jumps glide instead of teleporting. Browsers respect the
   reduced-motion preference automatically when this is set. */
/* overflow-x: clip on the ROOT, not just body. `body { overflow-x: hidden }`
   alone doesn't contain horizontal overflow when <html> is the scroll
   container — so decorative orbs / the wide compare table still pushed the
   page to ~627px at mobile widths. In LTR that just added a stray
   horizontal scroll; in RTL the scroll origin anchors to the right edge,
   which shoved the centered hero off-screen (Arabic hero looked cut off).
   `clip` stops the page scroll without creating a scroll container (so it
   won't break position:sticky), and the compare table keeps its OWN
   .compare-wrap overflow-x:auto, so nothing becomes unreachable. */
html { scroll-behavior: smooth; overflow-x: clip; }
@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
}
/* Anchor offset so #compare / #faq / #download / #roadmap targets land
   BELOW the sticky nav (44px tall + breathing room) instead of getting
   clipped under it. Applied broadly so any in-page anchor benefits. */
section[id], h2[id], h3[id] {
  scroll-margin-top: 64px;
}

/* Visible focus ring for keyboard users. Default browser focus rings
   are nearly invisible against the neon palette on a near-black bg —
   keyboard-nav users couldn't see where they were on the page. Using
   :focus-visible (NOT :focus) means mouse clicks don't show the ring,
   only keyboard navigation does — matches user expectation and avoids
   adding visual noise for pointer users. WCAG 2.4.7 Focus Visible. */
a:focus-visible,
button:focus-visible,
[role="button"]:focus-visible,
[role="option"]:focus-visible,
input:focus-visible,
textarea:focus-visible,
select:focus-visible,
summary:focus-visible,
details:focus-visible {
  outline: 2px solid var(--cyan);
  outline-offset: 2px;
  box-shadow: var(--glow-cyan);
}

/* Self-hosted webfonts (woff2 only). Was a Google Fonts @import — that
 * cost a third-party DNS lookup, third-party TLS handshake, and a
 * render-blocking CSS request before any glyph painted, plus leaked
 * the visitor's IP to Google on every page load. NOX's own privacy
 * promise demanded self-hosting.
 *
 * Files copied from @fontsource/* node_modules into packages/site/fonts/
 * at build time. Only the weights actually used in styles are bundled
 * (Orbitron 500/700/900, Rajdhani 400-700, JetBrains Mono 400/500/700,
 * Cairo 400/500/700/900 in Arabic subset).
 *
 * font-display: swap — text paints with the system fallback while the
 * woff2 downloads, then re-renders. No FOIT.  */
@font-face { font-family: 'Orbitron'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('fonts/orbitron-latin-500-normal.woff2') format('woff2'); }
@font-face { font-family: 'Orbitron'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('fonts/orbitron-latin-700-normal.woff2') format('woff2'); }
@font-face { font-family: 'Orbitron'; font-weight: 900; font-style: normal; font-display: swap;
  src: url('fonts/orbitron-latin-900-normal.woff2') format('woff2'); }
@font-face { font-family: 'Rajdhani'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('fonts/rajdhani-latin-400-normal.woff2') format('woff2'); }
@font-face { font-family: 'Rajdhani'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('fonts/rajdhani-latin-500-normal.woff2') format('woff2'); }
@font-face { font-family: 'Rajdhani'; font-weight: 600; font-style: normal; font-display: swap;
  src: url('fonts/rajdhani-latin-600-normal.woff2') format('woff2'); }
@font-face { font-family: 'Rajdhani'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('fonts/rajdhani-latin-700-normal.woff2') format('woff2'); }
@font-face { font-family: 'JetBrains Mono'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('fonts/jetbrains-mono-latin-400-normal.woff2') format('woff2'); }
@font-face { font-family: 'JetBrains Mono'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('fonts/jetbrains-mono-latin-500-normal.woff2') format('woff2'); }
@font-face { font-family: 'JetBrains Mono'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('fonts/jetbrains-mono-latin-700-normal.woff2') format('woff2'); }
@font-face { font-family: 'Cairo'; font-weight: 400; font-style: normal; font-display: swap;
  src: url('fonts/cairo-arabic-400-normal.woff2') format('woff2'); unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; }
@font-face { font-family: 'Cairo'; font-weight: 500; font-style: normal; font-display: swap;
  src: url('fonts/cairo-arabic-500-normal.woff2') format('woff2'); unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; }
@font-face { font-family: 'Cairo'; font-weight: 700; font-style: normal; font-display: swap;
  src: url('fonts/cairo-arabic-700-normal.woff2') format('woff2'); unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; }
@font-face { font-family: 'Cairo'; font-weight: 900; font-style: normal; font-display: swap;
  src: url('fonts/cairo-arabic-900-normal.woff2') format('woff2'); unicode-range: U+0600-06FF, U+0750-077F, U+08A0-08FF, U+FB50-FDFF, U+FE70-FEFF; }

body {
  background: var(--bg);
  color: var(--text);
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-weight: 500;
  /* Bumped from 17px → 19px for a 10% UI-scale pass alongside the app
   * (packages/web reads its own font-size via html { font-size: 110% }).
   * Most marketing-site headings use absolute px so they don't cascade,
   * but every paragraph + nav link inherits this — the legibility win
   * is concentrated where the text density is highest. */
  font-size: 19px;
  line-height: 1.55;
  text-rendering: optimizeLegibility;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  min-height: 100vh;
  overflow-x: hidden;
}

::selection { background: var(--yellow); color: var(--bg); }

/* Cursor spotlight removed 2026-04-26 (operator request). The cyan
 * radial-gradient dot tracking the mouse via mix-blend-mode: screen
 * was washing out body text on lighter sections of the page.
 * Companion JS handler (setupMouseSpotlight) and --mx / --my root
 * variables removed too — no orphaned wiring. */

/* -------- Background ambience -------- */
/* Static base wash + slow-drifting color orbs (the Linear/Stripe trick) */
body::before {
  content: '';
  position: fixed;
  inset: 0;
  z-index: -2;
  background:
    radial-gradient(circle at center, rgba(252, 238, 10, 0.022), transparent 60%);
  pointer-events: none;
}
.ambient-orb {
  position: fixed;
  border-radius: 50%;
  filter: blur(110px);
  pointer-events: none;
  z-index: -2;
  /* Same scroll-dim as .mouse-glow — the orbs sit behind body content,
   * and their soft halos still reduce contrast even at z-index -2 because
   * everything painted on top inherits a hint of their colour. Dimming
   * them past the hero gives body paragraphs flat dark backdrop to read
   * against. */
  opacity: var(--scroll-dim, 1);
  will-change: transform, opacity;
}
.ambient-orb.cyan {
  width: 540px;
  height: 540px;
  background: rgba(0, 229, 255, 0.13);
  top: -120px;
  left: -160px;
  animation: orbDriftA 38s ease-in-out infinite;
}
.ambient-orb.orange {
  width: 460px;
  height: 460px;
  background: rgba(255, 122, 26, 0.10);
  bottom: -140px;
  right: -120px;
  animation: orbDriftB 44s ease-in-out infinite;
}
.ambient-orb.violet {
  width: 380px;
  height: 380px;
  background: rgba(0, 229, 255, 0.07);
  top: 35%;
  right: 15%;
  animation: orbDriftC 52s ease-in-out infinite;
}
/* -------- Gutter chrome (≥1280px viewports only) -------- */
/* Two decorative wordmark stencils run floor-to-ceiling in the left and
   right gutters, plus a sticky telemetry HUD on the right. Below 1280px
   the central column eats the gutter and these are hidden completely.
   Everything fades out via --scroll-dim to match the orbs/spotlight, so
   they never compete with body text once you're reading. */
/* Gutter wordmark stencils removed 2026-04-26 (designer review).
 * They were decorative-only and ate prime gutter real estate without
 * communicating anything functional. The right-gutter telemetry HUD
 * stays; that one shows real data + a roadmap shortcut. */
.telemetry {
  display: none; /* default hidden — enabled in the @media below */
}

/* -------- Telemetry HUD (right gutter, ≥1440px) -------- */
/* Raised from min-width: 1280px to 1440px — at 1280-1380px viewports
 * the HUD (right:96px, width:220px starts at ~964px) overlapped the
 * hero tagline (max-width:820px ending ~1050px). 1440px gives the
 * hero clear room AND the gutter to host the HUD comfortably. */
@media (min-width: 1440px) {
  .telemetry {
    display: flex;
    flex-direction: column;
    gap: 14px;
    position: fixed;
    top: 62%;
    right: 96px;
    transform: translateY(-50%);
    width: 220px;
    /* Inner clickable elements (the roadmap phase links) opt back in via
     * pointer-events: auto on .tel-phase. The wrapper itself stays
     * pass-through so cursor effects still work over the gutter. */
    pointer-events: none;
    z-index: 0;
    font-family: 'JetBrains Mono', ui-monospace, monospace;
    font-size: 11px;
    line-height: 1.55;
    opacity: calc(0.95 * var(--scroll-dim, 1));
    transition: opacity 240ms;
  }
  .tel-block {
    background: rgba(7, 7, 16, 0.55);
    border: 1px solid var(--border);
    border-left: 2px solid var(--cyan);
    padding: 12px 14px;
    backdrop-filter: blur(6px);
    -webkit-backdrop-filter: blur(6px);
  }
  .tel-row {
    display: flex;
    justify-content: space-between;
    color: var(--text-dim);
    letter-spacing: 0.06em;
  }
  .tel-row.tel-head {
    color: var(--cyan);
    text-shadow: 0 0 6px rgba(0, 229, 255, 0.45);
    font-weight: 700;
    margin-bottom: 6px;
    letter-spacing: 0.15em;
  }
  .tel-row .tel-key {
    color: var(--text-muted);
    text-transform: uppercase;
  }
  .tel-row .tel-val {
    color: var(--text);
    font-variant-numeric: tabular-nums;
  }
  .tel-head .tel-dot {
    display: inline-block;
    width: 7px;
    height: 7px;
    border-radius: 50%;
    background: var(--green);
    margin-right: 8px;
    box-shadow: 0 0 8px var(--green);
    animation: telPulse 2s ease-in-out infinite;
    vertical-align: middle;
  }
  @keyframes telPulse {
    0%, 100% { opacity: 1; }
    50%      { opacity: 0.4; }
  }
  /* Roadmap timeline inside the bottom HUD panel — vertical phase track
   * connecting filled/half/hollow phase markers. The track is a left
   * border on the second-and-third entries; the marker sits on top of
   * the seam so it reads as a unified line. Each phase is an <a> so
   * users can click through to roadmap.html anchors. */
  .tel-roadmap {
    padding-top: 10px;
  }
  .tel-roadmap .tel-head {
    margin-bottom: 10px;
  }
  .tel-phase {
    display: flex;
    align-items: flex-start;
    gap: 10px;
    padding: 4px 0;
    text-decoration: none;
    color: inherit;
    pointer-events: auto;
    position: relative;
    transition: transform 160ms ease, color 160ms ease;
  }
  .tel-phase + .tel-phase {
    margin-top: 2px;
  }
  /* Vertical track between markers — drawn as a 1px line behind each
   * non-first marker. Stops at the marker's top so the dot sits on it. */
  .tel-phase + .tel-phase::before {
    content: '';
    position: absolute;
    left: 5px;
    top: -6px;
    width: 1px;
    height: 10px;
    background: var(--border-hi);
  }
  .tel-phase:hover {
    transform: translateX(2px);
  }
  .tel-mark {
    flex-shrink: 0;
    width: 11px;
    text-align: center;
    line-height: 1.4;
    font-size: 13px;
    margin-top: 0;
  }
  .tel-phase-body {
    flex: 1;
    min-width: 0;
  }
  .tel-name {
    color: var(--text);
    font-weight: 700;
    font-size: 10px;
    letter-spacing: 0.1em;
    line-height: 1.3;
  }
  .tel-when {
    color: var(--text-muted);
    font-size: 10px;
    letter-spacing: 0.04em;
    margin-top: 1px;
  }
  /* Phase status colors — done/active/future. */
  .tel-phase.tel-done .tel-mark    { color: var(--green); text-shadow: 0 0 6px rgba(63, 249, 113, 0.55); }
  .tel-phase.tel-active .tel-mark  { color: var(--cyan);  text-shadow: 0 0 6px rgba(0, 229, 255, 0.55); }
  .tel-phase.tel-future .tel-mark  { color: var(--text-muted); }
  .tel-phase.tel-active .tel-name  { color: var(--cyan); }
  .tel-phase.tel-future .tel-name  { color: var(--text-dim); }
  .tel-phase:hover .tel-name { text-decoration: underline; }
}

/* Below 1280px we LOSE the gutter chrome cleanly — nothing reflows in
   the main column because both elements were position:fixed. */
@media (max-width: 1279px) {
  .telemetry { display: none !important; }
}

@media (prefers-reduced-motion: reduce) {
  .tel-head .tel-dot { animation: none; }
  .tel-feed li {
    animation: none;
    opacity: 1;
    transform: none;
  }
}

@keyframes orbDriftA {
  0%, 100% { transform: translate(0, 0); }
  50%      { transform: translate(28vw, 22vh); }
}
@keyframes orbDriftB {
  0%, 100% { transform: translate(0, 0); }
  50%      { transform: translate(-22vw, -28vh); }
}
@keyframes orbDriftC {
  0%, 100% { transform: translate(0, 0); }
  50%      { transform: translate(-15vw, 18vh); }
}
body::after {
  content: '';
  position: fixed;
  inset: 0;
  z-index: -1;
  background-image:
    linear-gradient(to right, rgba(255, 255, 255, 0.022) 1px, transparent 1px),
    linear-gradient(to bottom, rgba(255, 255, 255, 0.022) 1px, transparent 1px);
  background-size: 48px 48px;
  pointer-events: none;
  mask-image: radial-gradient(ellipse at center, black 30%, transparent 80%);
}

/* Scanlines + vignette overlay.
   Dialled way back 2026-06-02 — the old 0.4-opacity scanlines + 0.55
   vignette read as a heavy "CRT filter" gimmick and hurt text contrast.
   Now they're a faint atmospheric texture: scanlines barely perceptible
   over the wider 4px pitch, vignette a soft edge-darken rather than a
   tunnel. The cyberpunk mood survives; the cheapness doesn't. */
html::after {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  background: repeating-linear-gradient(
    to bottom,
    transparent 0,
    transparent 3px,
    rgba(0, 0, 0, 0.12) 3px,
    rgba(0, 0, 0, 0.12) 4px
  );
  z-index: 9999;
  mix-blend-mode: multiply;
  opacity: 0.16;
}
html::before {
  content: '';
  position: fixed;
  inset: 0;
  pointer-events: none;
  background: radial-gradient(ellipse at center, transparent 50%, rgba(0, 0, 0, 0.4) 100%);
  z-index: 9998;
}

/* -------- NAV -------- */
nav.top {
  position: sticky;
  top: 0;
  z-index: 100;
  display: flex;
  align-items: center;
  gap: 32px;
  padding: 18px 40px;
  background: rgba(5, 5, 16, 0.78);
  backdrop-filter: blur(14px);
  -webkit-backdrop-filter: blur(14px);
  border-bottom: 1px solid var(--border);
  position: relative;
}
/* Yellow accent line under nav */
nav.top::after {
  content: '';
  position: absolute;
  left: 0;
  bottom: -1px;
  height: 1px;
  width: 80px;
  background: var(--yellow);
  box-shadow: var(--glow-yellow);
}

nav.top .brand {
  display: flex;
  align-items: center;
  gap: 12px;
  text-decoration: none;
  position: relative;
}
nav.top .brand .logo {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 900;
  font-size: 28px;
  letter-spacing: 0.14em;
  color: var(--text);
  text-shadow: 0 0 10px rgba(0, 229, 255, 0.5);
  line-height: 1;
}
nav.top .brand .sub {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.32em;
  color: var(--yellow);
  text-transform: uppercase;
  padding: 3px 8px;
  border: 1px solid var(--yellow);
  line-height: 1;
}

nav.top .links {
  margin-inline-start: auto;
  display: flex;
  gap: 28px;
  align-items: center;
}
nav.top .links a {
  color: var(--text-dim);
  text-decoration: none;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  font-weight: 500;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  transition: color 180ms, text-shadow 180ms;
  position: relative;
  padding: 4px 0;
}
nav.top .links a:hover {
  color: var(--accent-text);
  text-shadow: 0 0 12px rgba(166, 255, 232, 0.55);
}
nav.top .links a::before {
  content: '';
  position: absolute;
  left: 0;
  bottom: -2px;
  width: 0;
  height: 1px;
  background: var(--cyan);
  transition: width 220ms ease-out;
  box-shadow: var(--glow-cyan);
}
nav.top .links a:hover::before { width: 100%; }

/* Nav CTA — the one nav link that's a visible boxed button (Downloads).
   Filled orange with a persistent glow so it reads as the primary action
   in the nav. Scoped strong enough to override the shared underline-hover
   styles above so the underline doesn't render inside the box. */
nav.top .links a.nav-cta {
  color: var(--bg);
  background: var(--orange);
  border: 1px solid var(--orange);
  padding: 11px 22px;
  font-weight: 900;
  font-size: 13px;
  letter-spacing: 0.22em;
  clip-path: var(--clip-corner);
  transition: all 200ms;
  margin-inline-start: 8px;
  box-shadow: var(--glow-orange);
  text-shadow: none;
}
nav.top .links a.nav-cta:hover {
  background: var(--yellow);
  border-color: var(--yellow);
  color: var(--bg);
  box-shadow: 0 0 24px rgba(255, 205, 90, 0.7), 0 0 8px rgba(255, 205, 90, 0.9);
  transform: translateY(-1px);
}
/* Kill the generic link underline on the CTA box — it lives inside the border. */
nav.top .links a.nav-cta::before { display: none; }

/* Android-beta status chip. Third iteration — the gradient-text
   pill was correct in concept but the gradient was washing out at
   nav-bar size, the borders felt too thin, and there were too many
   effects competing (pulse + gradient + glow + corner-clip).
   Stripped down: white-on-dark mono caps, sharp cyan accent edge,
   subtle frosted backdrop, single ambient halo. The pulsing green
   "live" dot stays — it's the load-bearing signal that the beta
   is actively recruiting. Hover layers a brighter cyan glow and a
   left-anchored sweep highlight that runs once. */
.beta-chip {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 8px 14px 8px 12px;
  margin-inline-start: 4px;
  /* Frosted dark background that lets a hint of the ambient orbs
     show through. Backdrop-filter is widely supported now (incl.
     iOS 15+); the fallback (without blur) still looks fine. */
  background: rgba(8, 10, 24, 0.7);
  -webkit-backdrop-filter: blur(8px);
          backdrop-filter: blur(8px);
  color: #fff;
  border: 1px solid rgba(0, 229, 255, 0.55);
  /* Inset shadow draws an inner 1px line — gives the chip a subtle
     "double frame" depth without a second DOM node. */
  box-shadow:
    inset 0 0 0 1px rgba(0, 229, 255, 0.08),
    0 0 14px rgba(0, 229, 255, 0.18);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.2em;
  text-transform: uppercase;
  cursor: pointer;
  overflow: hidden;
  clip-path: var(--clip-corner);
  transition:
    color 180ms,
    border-color 220ms,
    box-shadow 240ms,
    background 220ms,
    transform 160ms;
}
.beta-chip:hover {
  border-color: var(--cyan);
  background: rgba(0, 229, 255, 0.06);
  box-shadow:
    inset 0 0 0 1px rgba(0, 229, 255, 0.25),
    0 0 22px rgba(0, 229, 255, 0.45),
    0 0 36px rgba(0, 229, 255, 0.15);
  transform: translateY(-1px);
}
.beta-chip:focus-visible {
  outline: none;
  border-color: var(--cyan);
  box-shadow:
    inset 0 0 0 1px rgba(0, 229, 255, 0.3),
    0 0 0 2px rgba(0, 229, 255, 0.55),
    0 0 16px rgba(0, 229, 255, 0.45);
}
.beta-chip:active {
  transform: translateY(0);
}

/* Sweep highlight. A vertical cyan sheen rides across the chip
   left-to-right on a slow 6s loop — premium "this is alive" cue
   that doesn't compete with the green dot. Lives in ::before with
   skew so the sheen reads as a slash. Hidden when reduced motion. */
.beta-chip::before {
  content: '';
  position: absolute;
  top: 0;
  bottom: 0;
  left: -40%;
  width: 30%;
  background: linear-gradient(
    100deg,
    transparent 0%,
    rgba(0, 229, 255, 0.18) 50%,
    transparent 100%
  );
  transform: skewX(-18deg);
  pointer-events: none;
  animation: beta-chip-sweep 6s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
  .beta-chip::before { animation: none; opacity: 0; }
}
@keyframes beta-chip-sweep {
  /* Park the sheen off-canvas for most of the cycle so the chip
     reads as static, then make one swift pass — the "rhythm" is
     what makes it feel premium rather than gimmicky. */
  0%, 70%, 100% { left: -40%; opacity: 0; }
  75%           { opacity: 1; }
  100%          { left: 130%; opacity: 0; }
}

/* "Live / accepting" green indicator. Solid core with a small halo
   pulse so the chip visibly signals the beta is open right now. */
.beta-chip-dot {
  position: relative;
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: #5dffba;
  flex-shrink: 0;
  box-shadow:
    0 0 6px rgba(93, 255, 186, 0.9),
    0 0 12px rgba(93, 255, 186, 0.4);
  animation: beta-chip-pulse 1.6s ease-in-out infinite;
}
.beta-chip-label {
  position: relative;
  display: inline-flex;
  align-items: center;
  gap: 6px;
  /* Solid white — drops the previous gradient. At 11px the gradient
     was reading as fuzzy anti-aliasing rather than a colour treatment. */
  color: #fff;
  text-shadow: 0 0 12px rgba(0, 229, 255, 0.35);
}
.beta-chip-sep {
  opacity: 0.5;
  margin: 0 2px;
  color: var(--cyan);
}

@keyframes beta-chip-pulse {
  0%, 100% {
    box-shadow:
      0 0 6px rgba(93, 255, 186, 0.85),
      0 0 12px rgba(93, 255, 186, 0.4);
    transform: scale(1);
  }
  50% {
    box-shadow:
      0 0 10px rgba(93, 255, 186, 1),
      0 0 22px rgba(93, 255, 186, 0.65);
    transform: scale(1.18);
  }
}
@media (prefers-reduced-motion: reduce) {
  .beta-chip-dot { animation: none; }
}

/* Sticky-nav variant — only dot + "BETA" so the compact bar doesn't
   get crowded next to "Launch app →". Same visual treatment, smaller
   footprint. Hidden below 520px (the main top-nav chip still covers
   that case). */
.beta-chip.beta-chip--sticky {
  padding: 5px 10px 5px 9px;
  margin-inline-end: 8px;
  margin-inline-start: 0;
  font-size: 10px;
  letter-spacing: 0.22em;
  gap: 7px;
}
.beta-chip.beta-chip--sticky .beta-chip-dot {
  width: 7px;
  height: 7px;
}
@media (max-width: 520px) {
  .beta-chip.beta-chip--sticky { display: none; }
}

/* Language switcher — dropdown.
 * Was a 3-button row when only EN/FR/AR existed. Switched to a dropdown
 * 2026-05-07 once 5 more languages landed (es/pt/de/it/ru) — a row of
 * eight chips would have wrapped or pushed the brand off-screen.
 */
.lang-switcher {
  position: relative;
  margin-inline-start: 24px;
}
.lang-switcher .lang-toggle {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.2em;
  padding: 8px 14px;
  background: rgba(255, 255, 255, 0.02);
  border: 1px solid var(--border);
  color: var(--text-dim);
  cursor: pointer;
  transition: all 180ms;
  text-transform: uppercase;
  line-height: 1;
  min-width: 64px;
}
.lang-switcher .lang-toggle:hover,
.lang-switcher .lang-toggle[aria-expanded="true"] {
  color: var(--text);
  background: rgba(0, 229, 255, 0.08);
  border-color: var(--cyan, #00e5ff);
}
.lang-switcher .lang-caret {
  font-size: 10px;
  opacity: 0.7;
  transition: transform 180ms;
}
.lang-switcher .lang-toggle[aria-expanded="true"] .lang-caret {
  transform: rotate(180deg);
}
.lang-switcher .lang-menu {
  position: absolute;
  top: calc(100% + 6px);
  inset-inline-end: 0;
  margin: 0;
  padding: 4px;
  list-style: none;
  background: var(--bg, #050510);
  border: 1px solid var(--border);
  box-shadow: 0 12px 32px rgba(0, 0, 0, 0.6), 0 0 0 1px rgba(0, 229, 255, 0.05);
  z-index: 1000;
  min-width: 180px;
}
.lang-switcher .lang-menu[hidden] {
  display: none;
}
.lang-switcher .lang-menu li {
  margin: 0;
  padding: 0;
}
.lang-switcher .lang-menu button {
  display: block;
  width: 100%;
  text-align: start;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.05em;
  padding: 10px 14px;
  background: transparent;
  border: 1px solid transparent;
  color: var(--text-dim);
  cursor: pointer;
  transition: all 140ms;
  line-height: 1.2;
}
.lang-switcher .lang-menu button:hover {
  color: var(--text);
  background: rgba(0, 229, 255, 0.08);
}
.lang-switcher .lang-menu button.active {
  color: var(--bg);
  background: var(--yellow);
  border-color: var(--yellow);
  box-shadow: var(--glow-yellow);
}
[dir="rtl"] .lang-switcher .lang-menu {
  inset-inline-end: auto;
  inset-inline-start: 0;
}

/* -------- HERO -------- */
.hero {
  padding: 96px 24px 80px;
  text-align: center;
  position: relative;
  overflow: hidden;
  /* Scroll-out variables, written by effects.js setupHeroScroll(). Defaults
   * here so the hero renders correctly even with JS disabled / before the
   * first rAF fires. */
  --hero-y: 0px;
  --hero-opacity: 1;
  --hero-scale: 1;
  --hero-blur: 0px;
  --hero-letter-spread: 0em;
  transform: translateY(var(--hero-y)) scale(var(--hero-scale));
  opacity: var(--hero-opacity);
  filter: blur(var(--hero-blur));
  /* Hint the compositor — these props all change together every frame
   * during the scroll-out, so we want the hero on its own GPU layer. */
  will-change: transform, opacity, filter;
  /* No CSS transition — we drive every frame from rAF, and a transition
   * would introduce a tracking lag between scroll position and visual. */
}
.hero h1 {
  letter-spacing: var(--hero-letter-spread);
  /* Subtle; only kicks in once scroll passes 0. */
  transition: none;
}
@media (prefers-reduced-motion: reduce) {
  .hero,
  .hero h1 {
    transform: none;
    opacity: 1;
    filter: none;
    letter-spacing: normal;
  }
}
/* Slow-traveling cyan scan line down the hero */
.hero .scanline {
  position: absolute;
  left: 0;
  right: 0;
  height: 2px;
  background: linear-gradient(to right, transparent 0%, rgba(0, 229, 255, 0.6) 50%, transparent 100%);
  filter: drop-shadow(0 0 8px rgba(0, 229, 255, 0.5));
  pointer-events: none;
  animation: scanlineDown 7s linear infinite;
}
@keyframes scanlineDown {
  0%   { top: -4px;  opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 1; }
  100% { top: 100%;  opacity: 0; }
}
.hero::before {
  content: '';
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 60% 50% at 25% 35%, rgba(0, 229, 255, 0.12), transparent 70%),
    radial-gradient(ellipse 60% 50% at 75% 65%, rgba(255, 102, 0, 0.10), transparent 70%),
    radial-gradient(ellipse 100% 50% at 50% 100%, rgba(252, 238, 10, 0.07), transparent 70%);
  z-index: -1;
}

/* Crosshair / reticle decorations */
.hero-corner {
  position: absolute;
  width: 24px;
  height: 24px;
  border: 1px solid var(--cyan);
  opacity: 0.5;
}
.hero-corner.tl { top: 24px; left: 24px; border-right: none; border-bottom: none; }
.hero-corner.tr { top: 24px; right: 24px; border-left: none; border-bottom: none; }
.hero-corner.bl { bottom: 24px; left: 24px; border-right: none; border-top: none; }
.hero-corner.br { bottom: 24px; right: 24px; border-left: none; border-top: none; }

/* Top meta strip */
.hero-meta {
  display: inline-flex;
  align-items: center;
  gap: 16px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.32em;
  text-transform: uppercase;
  color: var(--text-muted);
  margin-bottom: 36px;
  padding: 6px 14px;
  border: 1px solid var(--border);
  background: rgba(5, 5, 16, 0.6);
}
.hero-meta .dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--green);
  box-shadow: 0 0 8px var(--green);
  animation: pulseDot 1.6s ease-in-out infinite;
}
.hero-meta .divider {
  width: 1px;
  height: 12px;
  background: var(--border-hi);
}
.hero-meta .yellow { color: var(--yellow); }

@keyframes pulseDot {
  0%, 100% { opacity: 1; box-shadow: 0 0 8px var(--green); }
  50% { opacity: 0.6; box-shadow: 0 0 14px var(--green); }
}

.hero h1 {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 900;
  /* Scaled down 2026-06-02: was clamp(96px, 18vw, 220px), which hit the
     220px cap on essentially every desktop and made the wordmark span
     edge-to-edge — the whole hero read as "zoomed in" and crowded the
     SECURE-COMMS sub-label. This keeps NOX a bold brand statement while
     leaving breathing room around it. */
  font-size: clamp(72px, 12vw, 168px);
  margin: 0 auto;
  letter-spacing: 0.08em;
  line-height: 0.85;
  position: relative;
  /* Block-level + fit-content so the wordmark sits on its OWN centred
     line. It used to be inline-block, which made it share an inline run
     with the inline-flex .hero-meta / .hero-sub siblings; that run
     wrapped as a group and each wrapped line centred independently,
     pushing NOX hundreds of px off-axis once it no longer filled the
     row. fit-content keeps the box tight to the glyphs so the glitch
     ::before/::after layers still register. */
  display: block;
  width: fit-content;
  max-width: 100%;
  text-shadow: 0 0 22px rgba(0, 229, 255, 0.42);
}
.hero h1::before, .hero h1::after {
  content: 'NOX';
  position: absolute;
  inset: 0;
  pointer-events: none;
  overflow: hidden;
}
/* Chromatic-split layers. Softened 2026-06-02: the resting RGB offset
   dropped from 3px → 1.5px and the periodic "jump" magnitudes were
   halved, so the wordmark reads as a crisp NOX with a faint neon edge
   and an occasional subtle flicker — premium, not "broken signal". */
.hero h1::before {
  color: var(--orange);
  clip-path: polygon(0 0, 100% 0, 100% 45%, 0 45%);
  transform: translate(-1.5px, 0);
  text-shadow: 1px 0 var(--orange);
  mix-blend-mode: screen;
  opacity: 0.85;
  animation: glitchA 7s infinite steps(1);
}
.hero h1::after {
  color: var(--cyan);
  clip-path: polygon(0 55%, 100% 55%, 100% 100%, 0 100%);
  transform: translate(1.5px, 0);
  text-shadow: -1px 0 var(--cyan);
  mix-blend-mode: screen;
  opacity: 0.85;
  animation: glitchB 7s infinite steps(1);
}
@keyframes glitchA {
  0%, 94%, 100% { transform: translate(-1.5px, 0); }
  95% { transform: translate(-4px, 0); }
  97% { transform: translate(1px, -1px); }
}
@keyframes glitchB {
  0%, 93%, 100% { transform: translate(1.5px, 0); }
  94% { transform: translate(4px, 1px); }
  96% { transform: translate(-1px, 0); }
}

.hero-sub {
  display: inline-flex;
  align-items: center;
  gap: 14px;
  margin-top: 14px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  letter-spacing: 0.4em;
  text-transform: uppercase;
  color: var(--text-dim);
}
.hero-sub .bracket {
  color: var(--yellow);
  font-weight: 700;
  font-size: 18px;
}

.hero p.tagline {
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-weight: 500;
  font-size: clamp(20px, 2.2vw, 26px);
  color: var(--text);
  max-width: 760px;
  margin: 36px auto 0;
  line-height: 1.5;
}

/* Sharper hero copy: a one-line headline (the .tagline) + a smaller
 * sub-line of feature pillars (.tagline-sub). The sharp headline gets
 * a touch more weight so it punches over the ambient background. */
.hero p.tagline-sharp {
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-weight: 700;
  font-size: clamp(24px, 2.6vw, 32px);
  line-height: 1.25;
  letter-spacing: -0.005em;
  margin-top: 32px;
  max-width: 820px;
}
.hero .tagline-sub {
  display: block;
  margin-top: 16px;
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-weight: 500;
  font-size: clamp(15px, 1.4vw, 18px);
  letter-spacing: 0.02em;
  color: var(--text-dim);
  line-height: 1.55;
}

/* Single primary CTA — bright cyan-filled button — flanked by quieter
 * inline links. Replaces the previous 3-equal-buttons layout that split
 * attention. The primary button now feels like THE action; downloads
 * + comparison are secondary text links so the eye lands on Launch. */
.hero .cta {
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 18px;
  margin-top: 36px;
}
.btn-hero-primary {
  font-size: 15px;
  padding: 18px 36px;
  letter-spacing: 0.22em;
  /* Bigger and louder than the regular .btn-primary so it reads as the
   * one action that matters above the fold. */
}
.cta-secondary {
  display: flex;
  gap: 14px;
  align-items: center;
  flex-wrap: wrap;
  justify-content: center;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  letter-spacing: 0.04em;
}
.cta-link {
  color: var(--text-dim);
  text-decoration: none;
  border-bottom: 1px dashed transparent;
  padding-bottom: 1px;
  transition: color 200ms, border-color 200ms;
}
.cta-link:hover {
  color: var(--cyan);
  border-bottom-color: var(--cyan);
}
.cta-divider {
  color: var(--text-muted);
  user-select: none;
}
@media (max-width: 600px) {
  .cta-secondary { flex-direction: column; gap: 8px; }
  .cta-divider { display: none; }
}

/* -------- BUTTONS -------- */
.btn {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  font-size: 14px;
  padding: 16px 28px;
  border: 1px solid;
  background: transparent;
  cursor: pointer;
  text-decoration: none;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  transition: all 180ms;
  position: relative;
  min-height: 50px;
  clip-path: var(--clip-corner);
}
.btn::after {
  content: '›';
  font-size: 18px;
  font-weight: 900;
  transition: transform 200ms;
}
.btn:hover::after { transform: translateX(4px); }
html[dir='rtl'] .btn::after { content: '‹'; }
html[dir='rtl'] .btn:hover::after { transform: translateX(-4px); }

.btn-primary {
  border-color: var(--yellow);
  color: var(--bg);
  background: var(--yellow);
  font-weight: 900;
}
.btn-primary:hover {
  background: var(--cyan);
  border-color: var(--cyan);
  box-shadow: var(--glow-cyan);
}

.btn-cyan {
  border-color: var(--cyan);
  color: var(--accent-text);
}
.btn-cyan:hover {
  background: var(--cyan);
  color: var(--bg);
  box-shadow: var(--glow-cyan);
}

.btn-orange {
  border-color: var(--orange);
  color: var(--orange);
}
.btn-orange:hover {
  background: var(--orange);
  color: var(--bg);
  box-shadow: var(--glow-orange);
}

.btn-ghost {
  border-color: var(--border-hi);
  color: var(--text-dim);
}
.btn-ghost:hover {
  border-color: var(--cyan);
  color: var(--text);
}

/* -------- THESIS BAND (replaces 0/0/1/6 specs strip 2026-04-26) --------
 * One thesis sentence + a quiet line of pillar facts. Designer review
 * called the previous strip "clever but cryptic — takes a beat to
 * parse." This pass leads with a sentence anyone reads in 1s, follows
 * with the four privacy numbers as a lower-key reinforcement. */
.thesis {
  max-width: 1180px;
  margin: 0 auto;
  padding: 16px 24px 0;
}
.thesis-inner {
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
  padding: 56px 24px;
  text-align: center;
  position: relative;
}
.thesis-inner::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 50%;
  transform: translateX(-50%);
  width: 80px;
  height: 1px;
  background: var(--orange);
  box-shadow: var(--glow-orange);
}
.thesis-line {
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-weight: 700;
  font-size: clamp(28px, 4.2vw, 48px);
  line-height: 1.15;
  letter-spacing: -0.01em;
  color: var(--text);
  margin: 0 auto;
  max-width: 920px;
}
.thesis-line em {
  font-style: normal;
  color: var(--cyan);
  text-shadow: 0 0 16px rgba(0, 229, 255, 0.4);
}
.thesis-pillars {
  margin: 28px auto 0;
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  align-items: baseline;
  gap: 14px 18px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  letter-spacing: 0.1em;
  color: var(--text-dim);
  text-transform: uppercase;
}
.thesis-pillars b {
  color: var(--yellow);
  font-weight: 700;
  font-family: 'Orbitron', system-ui, sans-serif;
  font-size: 15px;
  margin-right: 4px;
  /* tabular-nums so the digits don't shift width when telemetry
     numbers update or the i18n layer swaps strings. */
  font-variant-numeric: tabular-nums;
}
.thesis-dot {
  color: var(--text-muted);
}
@media (max-width: 600px) {
  .thesis-inner { padding: 40px 16px; }
  .thesis-pillars { font-size: 11px; gap: 8px 12px; }
  .thesis-pillars b { font-size: 13px; }
  .thesis-dot { display: none; }
}

/* -------- SHOWCASE (product screenshots, between specs + SEC.01) --------
 * Wide bleed treatment so the screenshots have real estate. Two figures
 * tilt at small reciprocal angles to read as a stacked pair instead of
 * two thumbnails on a wall. Hover lifts both flat so a curious visitor
 * can study them. Cyan glow + corner brackets reinforce the cyberpunk
 * frame language without obscuring the actual UI. */
.showcase {
  padding: 80px 24px 40px;
  text-align: center;
  position: relative;
}
.showcase-inner {
  max-width: 1180px;
  margin: 0 auto;
}
.showcase-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.28em;
  color: var(--cyan);
  text-transform: uppercase;
  border: 1px solid var(--border-hi);
  padding: 6px 14px;
  margin-bottom: 22px;
}
.showcase-dot {
  width: 6px;
  height: 6px;
  border-radius: 50%;
  background: var(--green);
  box-shadow: 0 0 6px var(--green);
}
.showcase-h2 {
  font-family: 'Orbitron', monospace;
  font-weight: 900;
  font-size: clamp(34px, 5vw, 52px);
  letter-spacing: -0.01em;
  margin: 0 0 14px;
  color: var(--text);
}
.showcase-lead {
  max-width: 640px;
  margin: 0 auto 48px;
  font-size: clamp(15px, 1.4vw, 17px);
  color: var(--text-dim);
  line-height: 1.6;
}
.showcase-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 32px;
  align-items: start;
}
.shot {
  margin: 0;
  /* Reciprocal tilt — left leans slightly counter-clockwise, right
   * clockwise — so the pair reads as overlapping despite being
   * grid-laid out. Hover removes the tilt for a closer look. */
  transform: rotate(var(--shot-tilt, 0deg)) translateY(0);
  transition: transform 360ms cubic-bezier(0.22, 0.61, 0.36, 1);
  will-change: transform;
}
.shot-left  { --shot-tilt: -1.5deg; transform-origin: bottom right; }
.shot-right { --shot-tilt:  1.5deg; transform-origin: bottom left;  }
.shot:hover {
  transform: rotate(0deg) translateY(-6px);
}
.shot-frame {
  position: relative;
  border: 1px solid var(--border-hi);
  background: var(--panel);
  padding: 8px;
  /* Cyan glow that strengthens on hover. The neon halo is what makes
   * the screenshot feel like part of the cyberpunk site instead of a
   * pasted-in PNG. */
  box-shadow:
    0 0 0 1px rgba(0, 229, 255, 0.18),
    0 8px 32px rgba(0, 0, 0, 0.5),
    0 0 30px rgba(0, 229, 255, 0.06);
  transition: box-shadow 360ms;
}
.shot:hover .shot-frame {
  box-shadow:
    0 0 0 1px var(--cyan),
    0 12px 48px rgba(0, 0, 0, 0.6),
    0 0 60px rgba(0, 229, 255, 0.18);
}
.shot-frame::before,
.shot-frame::after {
  content: '';
  position: absolute;
  width: 16px;
  height: 16px;
  border: 1px solid var(--cyan);
  pointer-events: none;
}
.shot-frame::before { top: -1px; left: -1px;  border-right: none; border-bottom: none; }
.shot-frame::after  { bottom: -1px; right: -1px; border-left: none; border-top: none; }
.shot-frame img {
  display: block;
  width: 100%;
  height: auto;
  /* Match the dark panel beneath if image has any transparency. */
  background: #07070c;
}
.shot figcaption {
  margin-top: 14px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--text-muted);
  text-transform: uppercase;
}

@media (max-width: 860px) {
  .showcase { padding: 56px 20px 32px; }
  .showcase-grid { grid-template-columns: 1fr; gap: 24px; }
  .shot, .shot-left, .shot-right { transform: none !important; }
  .shot:hover { transform: translateY(-4px) !important; }
}

@media (prefers-reduced-motion: reduce) {
  .shot, .shot-left, .shot-right { transform: none !important; transition: none; }
  .shot:hover { transform: none !important; }
  .shot-frame { transition: none; }
}

/* -------- MAIN / SECTIONS -------- */
main { max-width: 1180px; margin: 0 auto; padding: 0 24px; }

section.block {
  padding: 100px 0 80px;
  position: relative;
}
section.block + .block::before {
  content: '';
  position: absolute;
  top: 0;
  left: 0;
  right: 0;
  height: 1px;
  background: linear-gradient(to right, transparent, var(--border-hi), transparent);
}

.section-header {
  display: flex;
  align-items: center;
  gap: 14px;
  margin-bottom: 16px;
}
.section-header .index {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.32em;
  color: var(--bg);
  background: var(--yellow);
  padding: 4px 10px;
  font-weight: 700;
  line-height: 1;
}
.section-header .label {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  letter-spacing: 0.36em;
  text-transform: uppercase;
  color: var(--text-dim);
}
.section-header .line {
  flex: 1;
  height: 1px;
  background: linear-gradient(to right, var(--border-hi), transparent);
}
html[dir='rtl'] .section-header .line {
  background: linear-gradient(to left, var(--border-hi), transparent);
}

section.block h2 {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 700;
  font-size: clamp(36px, 4.2vw, 56px);
  letter-spacing: 0.04em;
  margin: 0 0 20px;
  color: var(--text);
  line-height: 1.05;
  max-width: 900px;
}

section.block .lead {
  color: var(--text-dim);
  font-size: 19px;
  font-weight: 400;
  max-width: 760px;
  line-height: 1.65;
}

/* -------- FEATURE CARDS -------- */
.feature-grid {
  display: grid;
  grid-template-columns: repeat(auto-fill, minmax(300px, 1fr));
  gap: 18px;
  margin-top: 40px;
}
.feature {
  position: relative;
  background:
    linear-gradient(180deg, rgba(15, 15, 36, 0.95) 0%, rgba(8, 8, 22, 0.95) 100%);
  border: 1px solid var(--border);
  padding: 28px 24px 26px;
  transition: border-color 220ms, box-shadow 220ms, transform 280ms ease-out;
  clip-path: var(--clip-corner);
  overflow: hidden;
  transform-style: preserve-3d;
  transform: perspective(900px) rotateX(var(--ry, 0deg)) rotateY(var(--rx, 0deg)) translateY(var(--lift, 0));
}
.feature::before {
  content: attr(data-num);
  position: absolute;
  top: 14px;
  inset-inline-end: 18px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px;
  letter-spacing: 0.3em;
  color: var(--text-muted);
  font-weight: 700;
}
.feature::after {
  content: '';
  position: absolute;
  left: 0;
  right: 0;
  bottom: 0;
  height: 2px;
  background: linear-gradient(to right, var(--cyan), var(--orange));
  opacity: 0;
  transition: opacity 220ms;
}
.feature:hover {
  border-color: var(--cyan);
  --lift: -3px;
  box-shadow: 0 8px 30px rgba(0, 229, 255, 0.12);
}
.feature:hover::after { opacity: 1; }

.feature h3 {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 700;
  font-size: 16px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  margin: 0 0 12px;
  color: var(--accent-text);
  line-height: 1.3;
}
.feature p {
  margin: 0;
  color: var(--text-dim);
  font-size: 15.5px;
  line-height: 1.65;
  font-weight: 400;
}

/* -------- INSTALL CARDS (slightly different feel) -------- */
.install-grid .feature h3 { color: var(--yellow); }
.install-grid .feature .platform-meta {
  margin-top: 16px;
  padding-top: 14px;
  border-top: 1px dashed var(--border-hi);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--text-muted);
  text-transform: uppercase;
}
/* Default anchors inside the meta row (e.g. "all downloads") used to
   fall through to the browser's blue. Route them through --accent-text
   so they match every other link surface on the site. */
.install-grid .feature .platform-meta a {
  color: var(--accent-text);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
}
.install-grid .feature .platform-meta a:hover {
  color: var(--yellow);
}
/* The "how to continue past the warning" link is the most important
   thing a first-time Windows user reads here — bump it up and colour it
   danger-red so it pops against the muted meta row. */
.install-grid .feature .platform-meta a.warn-link {
  color: var(--danger);
  font-size: 13px;
  font-weight: 600;
}
.install-grid .feature .platform-meta a.warn-link:hover {
  color: #ff6384;
}
.install-grid .feature .download-row {
  margin-top: 18px;
}
.install-grid .feature .download-row a.btn,
.install-grid .feature .download-row button.btn {
  width: 100%;
  justify-content: center;
  /* Buttons inherit the .btn base styles but without the anchor's
     default text-decoration / colour cascade — restate so a <button>
     reads identically to an <a class="btn">. */
  appearance: none;
  -webkit-appearance: none;
  border-radius: 0;
  font: inherit;
  cursor: pointer;
}

/* Download-card button variant for the Android closed-beta CTA.
   Same .btn-ghost frame as the other download cards but prefixed
   with a green "live / accepting" dot so the row reads as an
   active beta-recruiting state, not a static "download now". */
.btn-with-dot {
  display: inline-flex;
  align-items: center;
  gap: 10px;
}
.btn-live-dot {
  width: 9px;
  height: 9px;
  border-radius: 50%;
  background: #5dffba;
  flex-shrink: 0;
  box-shadow:
    0 0 6px rgba(93, 255, 186, 0.85),
    0 0 12px rgba(93, 255, 186, 0.4);
  animation: beta-chip-pulse 1.6s ease-in-out infinite;
}
@media (prefers-reduced-motion: reduce) {
  .btn-live-dot { animation: none; }
}

/* -------- ROADMAP PLACEHOLDER -------- */
.roadmap-placeholder {
  margin-top: 40px;
  padding: 72px 32px;
  border: 1px dashed var(--border-hi);
  background:
    linear-gradient(180deg, rgba(15, 15, 36, 0.6) 0%, rgba(8, 8, 22, 0.8) 100%);
  clip-path: var(--clip-corner);
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 16px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 15px;
  letter-spacing: 0.36em;
  text-transform: uppercase;
  color: var(--text-dim);
}
.roadmap-dot {
  width: 10px;
  height: 10px;
  border-radius: 50%;
  background: var(--yellow);
  box-shadow: 0 0 14px var(--yellow);
  animation: roadmapPulse 1.8s ease-in-out infinite;
}
@keyframes roadmapPulse {
  0%, 100% { opacity: 0.45; transform: scale(1); }
  50% { opacity: 1; transform: scale(1.25); }
}

/* -------- HOST SECTION CODE BLOCK -------- */
.terminal {
  background: var(--bg-elev);
  border: 1px solid var(--border);
  margin-top: 32px;
  max-width: 720px;
  clip-path: var(--clip-corner);
}
.terminal .terminal-header {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  background: var(--panel);
  border-bottom: 1px solid var(--border);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.24em;
  text-transform: uppercase;
  color: var(--text-dim);
}
.terminal .terminal-header .dots {
  display: flex;
  gap: 6px;
  margin-inline-end: 4px;
}
.terminal .terminal-header .dots span {
  width: 8px;
  height: 8px;
  border-radius: 50%;
  background: var(--border-hi);
}
.terminal .terminal-header .dots span:nth-child(1) { background: var(--danger); }
.terminal .terminal-header .dots span:nth-child(2) { background: var(--yellow); }
.terminal .terminal-header .dots span:nth-child(3) { background: var(--green); }
.terminal pre {
  margin: 0;
  padding: 18px 20px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  line-height: 1.7;
  color: var(--green);
  overflow-x: auto;
  direction: ltr;
  text-align: start;
}

/* -------- DOC PAGES (kept for privacy/terms/recovery) -------- */
article.doc {
  max-width: 800px;
  margin: 0 auto;
  padding: 64px 24px 96px;
}
article.doc h1 {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 700;
  font-size: 40px;
  letter-spacing: 0.06em;
  margin: 0 0 8px;
}
article.doc h1 + .label {
  color: var(--orange);
  margin-bottom: 28px;
  display: block;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.3em;
  text-transform: uppercase;
}
article.doc h2 {
  font-family: 'Orbitron', system-ui, sans-serif;
  font-weight: 700;
  font-size: 20px;
  letter-spacing: 0.1em;
  margin: 36px 0 10px;
  color: var(--accent-text);
}
article.doc p, article.doc li {
  font-size: 17px;
  line-height: 1.75;
  color: var(--text);
}
article.doc ul, article.doc ol { padding-inline-start: 24px; }
article.doc strong { color: var(--yellow); }
/* Inline links inside doc bodies. Without this rule they fell through to
   the browser default (#0000ee) which is unreadable on the dark background
   — user reported it as "horrible" on install-windows.html. Keep the
   underline so affordance is obvious; mint tone matches the h2 colour. */
article.doc a {
  color: var(--accent-text);
  text-decoration: underline;
  text-decoration-thickness: 1px;
  text-underline-offset: 3px;
  transition: color 0.12s ease;
}
article.doc a:hover {
  color: var(--yellow);
}
article.doc code {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 13px;
  background: var(--bg-elev);
  border: 1px solid var(--border);
  padding: 2px 6px;
  color: var(--yellow);
}
article.doc .pillar {
  border: 1px solid var(--cyan);
  padding: 18px 22px;
  margin: 28px 0;
  background: rgba(0, 229, 255, 0.04);
  clip-path: var(--clip-corner);
}
article.doc .meta {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--text-muted);
  text-transform: uppercase;
  margin-top: 56px;
  border-top: 1px solid var(--border);
  padding-top: 18px;
}

/* -------- FOOTER -------- */
footer {
  border-top: 1px solid var(--border);
  padding: 40px 24px 48px;
  text-align: center;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.24em;
  color: var(--text-muted);
  text-transform: uppercase;
  margin-top: 60px;
  position: relative;
}
footer::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 50%;
  transform: translateX(-50%);
  width: 120px;
  height: 1px;
  background: var(--yellow);
  box-shadow: var(--glow-yellow);
}
footer p { margin: 6px 0; }
footer a { color: var(--accent-text); text-decoration: none; }
footer a:hover { color: var(--yellow); }
footer .corner { color: var(--orange); margin-top: 14px !important; }

/* -------- ARABIC font swap -------- */
html[lang='ar'] body,
html[lang='ar'] .feature p,
html[lang='ar'] section.block .lead,
html[lang='ar'] .hero p.tagline,
html[lang='ar'] article.doc p,
html[lang='ar'] article.doc li {
  font-family: 'Cairo', 'Tajawal', 'Segoe UI', system-ui, sans-serif;
}
html[lang='ar'] .feature h3,
html[lang='ar'] section.block h2,
html[lang='ar'] article.doc h1,
html[lang='ar'] article.doc h2 {
  font-family: 'Cairo', 'Tajawal', system-ui, sans-serif;
  letter-spacing: 0;
}
/* Latin brand stays Latin in all languages */
html[lang='ar'] nav.top .brand .logo,
html[lang='ar'] .hero h1 {
  font-family: 'Orbitron', system-ui, sans-serif;
}

/* -------- SCROLL-REVEAL (set by effects.js IntersectionObserver) --------
 * Layered animation: opacity + translateY + a small filter:blur so the
 * element appears to "focus" into place. The cubic-bezier curve front-
 * loads the motion (fast at first, gentle settle) — feels expensive
 * without being slow. Per-element delay is driven by --reveal-delay
 * (set on .reveal-stagger > * children below) so groups of cards
 * cascade rather than landing at the same instant.
 */
.reveal {
  opacity: 0;
  transform: translateY(36px);
  filter: blur(6px);
  transition:
    opacity 720ms cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 720ms cubic-bezier(0.22, 0.61, 0.36, 1),
    filter 520ms ease-out;
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform, filter;
}
.reveal.in-view {
  opacity: 1;
  transform: translateY(0);
  filter: blur(0);
}

/* When a .reveal element ALSO carries .reveal-stagger, the children
   handle the translate + blur. Zero out the parent's transform/blur
   so the two don't accumulate (visible jump-of-double on cascade in). */
.reveal.reveal-stagger {
  transform: none;
  filter: none;
}
.reveal.reveal-stagger.in-view {
  transform: none;
  filter: none;
}

/* Stagger cascade — parent gets .reveal-stagger, children animate in
   one-by-one with incremental delays. The previous version set the
   --reveal-delay variable on the children but didn't actually animate
   them, so the whole grid moved as one block instead of cascading.
   Now the children themselves carry the animation rule and each one
   waits its turn via :nth-child delays. */
.reveal-stagger > * {
  opacity: 0;
  transform: translateY(28px) scale(0.97);
  transition:
    opacity 620ms cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 620ms cubic-bezier(0.22, 0.61, 0.36, 1);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: opacity, transform;
}
.reveal-stagger.in-view > * {
  opacity: 1;
  transform: translateY(0) scale(1);
}
.reveal-stagger > *:nth-child(1)  { --reveal-delay:   0ms; }
.reveal-stagger > *:nth-child(2)  { --reveal-delay:  90ms; }
.reveal-stagger > *:nth-child(3)  { --reveal-delay: 180ms; }
.reveal-stagger > *:nth-child(4)  { --reveal-delay: 270ms; }
.reveal-stagger > *:nth-child(5)  { --reveal-delay: 360ms; }
.reveal-stagger > *:nth-child(6)  { --reveal-delay: 450ms; }
.reveal-stagger > *:nth-child(7)  { --reveal-delay: 540ms; }
.reveal-stagger > *:nth-child(8)  { --reveal-delay: 630ms; }
.reveal-stagger > *:nth-child(9)  { --reveal-delay: 720ms; }
.reveal-stagger > *:nth-child(10) { --reveal-delay: 810ms; }
.reveal-stagger > *:nth-child(11) { --reveal-delay: 900ms; }
.reveal-stagger > *:nth-child(12) { --reveal-delay: 990ms; }

/* Doc-page reveal — softer / faster than feature cards because there are
   many more elements (every <h2>/<p>/<ul> on privacy.html etc.) and a
   shorter motion keeps the whole page from feeling slow. */
.reveal-doc {
  opacity: 0;
  transform: translateY(20px);
  transition:
    opacity 540ms cubic-bezier(0.22, 0.61, 0.36, 1),
    transform 540ms cubic-bezier(0.22, 0.61, 0.36, 1);
  will-change: opacity, transform;
}
.reveal-doc.in-view {
  opacity: 1;
  transform: translateY(0);
}

/* Top-of-page scroll progress bar. Width is driven by --scroll-progress
   (set in effects.js), 0%-100% as the user scrolls the page. Sits just
   below the OS frame on every page so it's a consistent system signal. */
.scroll-progress {
  position: fixed;
  top: 0;
  left: 0;
  height: 2px;
  width: var(--scroll-progress, 0%);
  background: linear-gradient(90deg, transparent 0%, var(--cyan) 50%, var(--orange) 100%);
  box-shadow: 0 0 8px rgba(0, 229, 255, 0.6);
  z-index: 100;
  pointer-events: none;
  transition: width 80ms linear, opacity 240ms;
  opacity: var(--scroll-progress-opacity, 0);
}

/* -------- COMPARISON TABLE (SEC.02) --------
 * Side-by-side feature matrix. NOX column gets a cyan top border + brand
 * tint so the eye lands there first. Cells use semantic classes
 * (cell-yes / cell-no / cell-half) for color so the table is scannable
 * at distance — green for "yes good", magenta for "no", yellow for
 * partial / footnote-worthy. */
.compare-wrap {
  margin-top: 32px;
  overflow-x: auto;
  /* Inset cyan corner, matching the .feature card treatment but without
   * the inner padding (the table provides its own). */
  border: 1px solid var(--border);
  background: linear-gradient(180deg, rgba(15, 15, 30, 0.6) 0%, rgba(7, 7, 16, 0.6) 100%);
}
.compare {
  width: 100%;
  border-collapse: collapse;
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-size: 14px;
  min-width: 760px;
}
.compare thead th {
  font-family: 'Orbitron', monospace;
  font-weight: 700;
  font-size: 11px;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  text-align: left;
  padding: 14px 12px;
  background: rgba(7, 7, 16, 0.6);
  border-bottom: 1px solid var(--border-hi);
  color: var(--text-dim);
  position: sticky;
  top: 0;
  z-index: 1;
}
.compare thead th.compare-nox {
  color: var(--cyan);
  text-shadow: 0 0 10px rgba(0, 229, 255, 0.4);
}
.compare thead th.compare-nox span {
  display: inline-block;
  padding: 2px 10px;
  border: 1px solid var(--cyan);
  background: rgba(0, 229, 255, 0.08);
}
.compare th[scope="row"] {
  text-align: left;
  font-weight: 600;
  padding: 12px 14px;
  color: var(--text);
  background: rgba(11, 11, 22, 0.6);
  border-right: 1px solid var(--border);
  white-space: nowrap;
  position: sticky;
  left: 0;
  z-index: 1;
}
.compare tbody tr:nth-child(even) th[scope="row"],
.compare tbody tr:nth-child(even) td {
  background: rgba(15, 15, 30, 0.5);
}
.compare tbody td {
  padding: 12px 12px;
  border-bottom: 1px solid var(--border);
  color: var(--text-dim);
  font-variant-numeric: tabular-nums;
}
.compare tbody td.compare-nox {
  color: var(--text);
  border-left: 1px solid var(--cyan);
  border-right: 1px solid var(--cyan);
  background: rgba(0, 229, 255, 0.04) !important;
  font-weight: 600;
}
/* Cell semantics — colored dot prefix communicates verdict at a glance
   even if the cell text is wordy. */
.compare td.cell-yes,
.compare td.cell-no,
.compare td.cell-half {
  position: relative;
  padding-left: 28px;
}
.compare td.cell-yes::before,
.compare td.cell-no::before,
.compare td.cell-half::before {
  content: '';
  position: absolute;
  left: 12px;
  top: 50%;
  transform: translateY(-50%);
  width: 8px;
  height: 8px;
  border-radius: 50%;
}
.compare td.cell-yes::before  { background: var(--green);  box-shadow: 0 0 6px rgba(63, 249, 113, 0.55); }
.compare td.cell-no::before   { background: var(--danger); box-shadow: 0 0 6px rgba(255, 56, 100, 0.55); }
.compare td.cell-half::before { background: var(--yellow); box-shadow: 0 0 6px rgba(252, 238, 10, 0.45); }
/* In the NOX column flip the verdict color logic — "no" on a privacy
   axis is the WIN (no phone required = good), so it should still read
   positive. The .compare-nox.cell-no override paints the dot green. */
.compare td.compare-nox.cell-no::before { background: var(--green); box-shadow: 0 0 6px rgba(63, 249, 113, 0.55); }
.compare td.compare-nox.cell-yes::before { background: var(--green); box-shadow: 0 0 6px rgba(63, 249, 113, 0.55); }
.compare td.compare-nox.cell-half::before { background: var(--cyan); box-shadow: 0 0 6px rgba(0, 229, 255, 0.55); }

.compare-note {
  margin-top: 18px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  color: var(--text-muted);
  letter-spacing: 0.04em;
  padding: 0 16px 14px;
}
.compare-note a { color: var(--accent-text, var(--cyan)); }

@media (max-width: 720px) {
  .compare-wrap { font-size: 12px; }
  .compare { min-width: 660px; }
  .compare thead th { font-size: 9px; padding: 10px 8px; letter-spacing: 0.12em; }
  .compare th[scope="row"] { padding: 10px 10px; font-size: 12px; }
  .compare tbody td { padding: 10px 8px; font-size: 12px; }
  .compare td.cell-yes,
  .compare td.cell-no,
  .compare td.cell-half { padding-left: 22px; }
  .compare td.cell-yes::before,
  .compare td.cell-no::before,
  .compare td.cell-half::before { left: 8px; width: 6px; height: 6px; }
}

/* -------- FAQ (SEC.03) --------
 * Native <details> for keyboard + assistive-tech accessibility. Custom
 * marker (chevron rotates on open) + cyan-glow border on the open one
 * to indicate active. */
.faq-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px 20px;
  margin-top: 28px;
}
@media (max-width: 720px) {
  .faq-grid { grid-template-columns: 1fr; }
}
.faq {
  border: 1px solid var(--border);
  background: rgba(15, 15, 30, 0.4);
  padding: 0;
  transition: border-color 200ms, background 200ms;
}
.faq[open] {
  border-color: var(--cyan);
  background: rgba(0, 229, 255, 0.04);
}
.faq summary {
  cursor: pointer;
  list-style: none;
  padding: 14px 18px;
  color: var(--text);
  font-family: 'Rajdhani', system-ui, sans-serif;
  font-weight: 600;
  font-size: 16px;
  letter-spacing: 0.02em;
  display: flex;
  justify-content: space-between;
  align-items: center;
  gap: 12px;
  user-select: none;
}
.faq summary::-webkit-details-marker { display: none; }
.faq summary::after {
  content: '+';
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-weight: 400;
  font-size: 18px;
  color: var(--cyan);
  transition: transform 240ms ease;
  flex-shrink: 0;
}
.faq[open] summary::after {
  content: '−';
  transform: rotate(0);
}
.faq summary:hover { color: var(--cyan); }
.faq p {
  padding: 0 18px 16px;
  margin: 0;
  color: var(--text-dim);
  line-height: 1.65;
  font-size: 14px;
  /* Smooth height grow when opening — overrides the abrupt details
     default. */
  animation: faqOpen 220ms ease-out;
}
.faq p a { color: var(--cyan); }
@keyframes faqOpen {
  from { opacity: 0; transform: translateY(-6px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* -------- DOC PAGE TOC (auto-built from <h2>s by effects.js) --------
 * Sticky left rail on long doc pages (privacy / terms / etc.) so a
 * 17-section policy doesn't have to be scrolled blind. Active section
 * highlights as the reader passes its <h2>. Hidden below 1100px (no
 * room for a rail) and skipped entirely on docs with fewer than 4 h2s. */
.doc-toc {
  position: fixed;
  top: 96px;
  left: 32px;
  width: 220px;
  max-height: calc(100vh - 140px);
  overflow-y: auto;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  line-height: 1.5;
  z-index: 5;
  pointer-events: auto;
}
.doc-toc-head {
  font-weight: 700;
  font-size: 10px;
  letter-spacing: 0.3em;
  color: var(--cyan);
  text-shadow: 0 0 8px rgba(0, 229, 255, 0.4);
  text-transform: uppercase;
  padding-bottom: 12px;
  margin-bottom: 12px;
  border-bottom: 1px solid var(--border-hi);
}
.doc-toc-list {
  list-style: none;
  margin: 0;
  padding: 0;
  counter-reset: toc;
}
.doc-toc-list li {
  position: relative;
  padding: 4px 0 4px 14px;
  border-left: 2px solid transparent;
  transition: border-color 200ms;
}
.doc-toc-list a {
  color: var(--text-dim);
  text-decoration: none;
  display: block;
  letter-spacing: 0.02em;
  transition: color 180ms, transform 180ms;
}
.doc-toc-list a:hover {
  color: var(--cyan);
  transform: translateX(2px);
}
.doc-toc-list a.toc-active {
  color: var(--cyan);
  text-shadow: 0 0 6px rgba(0, 229, 255, 0.3);
}
.doc-toc-list li:has(a.toc-active) {
  border-left-color: var(--cyan);
}
@media (max-width: 1099px) {
  .doc-toc { display: none; }
}
/* Hide TOC on the right when a sticky-nav is showing too — they would
 * stack visually awkwardly. The TOC is far enough left that they don't
 * collide horizontally; this is just a defensive rule. */
.doc-toc::-webkit-scrollbar { width: 4px; }
.doc-toc::-webkit-scrollbar-thumb { background: var(--border-hi); }

/* -------- SITE FOOTER (real one, replaces "// END_OF_TRANSMISSION") --
 * 5-column grid on wide, collapses to 2 then 1 on mobile. Grouped
 * into Product / About / Legal / Contact / Brand-blurb so visitors
 * can find what they need without hunting. */
.site-footer {
  max-width: 1180px;
  margin: 80px auto 0;
  padding: 56px 24px 32px;
  border-top: 1px solid var(--border);
  position: relative;
  font-family: 'Rajdhani', system-ui, sans-serif;
}
.site-footer::before {
  content: '';
  position: absolute;
  top: -1px;
  left: 50%;
  transform: translateX(-50%);
  width: 80px;
  height: 1px;
  background: var(--cyan);
  box-shadow: 0 0 12px rgba(0, 229, 255, 0.4);
}
.footer-grid {
  display: grid;
  grid-template-columns: 1.6fr repeat(4, 1fr);
  gap: 32px;
  margin-bottom: 36px;
}
.footer-col h4 {
  font-family: 'Orbitron', monospace;
  font-weight: 700;
  font-size: 11px;
  letter-spacing: 0.3em;
  text-transform: uppercase;
  color: var(--cyan);
  margin: 0 0 16px;
  text-shadow: 0 0 8px rgba(0, 229, 255, 0.3);
}
.footer-col a {
  display: block;
  color: var(--text-dim);
  text-decoration: none;
  font-size: 14px;
  padding: 4px 0;
  transition: color 180ms;
}
.footer-col a:hover { color: var(--cyan); }
.footer-brand {
  display: flex;
  align-items: baseline;
  gap: 10px;
  margin-bottom: 12px;
}
.footer-brand .logo {
  font-family: 'Orbitron', monospace;
  font-weight: 900;
  font-size: 18px;
  letter-spacing: 0.18em;
  color: var(--text);
}
.footer-sub {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--text-dim);
  text-transform: uppercase;
}
.footer-tag {
  color: var(--text-dim);
  font-size: 14px;
  margin: 0 0 10px;
  max-width: 280px;
  line-height: 1.5;
}
.footer-build {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.18em;
  color: var(--text-muted);
  margin: 0;
}
.footer-build span { color: var(--yellow); }
.footer-bar {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding-top: 24px;
  border-top: 1px solid var(--border);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 11px;
  letter-spacing: 0.16em;
  color: var(--text-muted);
}
.footer-sysline {
  color: var(--cyan);
  text-shadow: 0 0 6px rgba(0, 229, 255, 0.3);
}
@media (max-width: 900px) {
  .footer-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 560px) {
  .footer-grid { grid-template-columns: 1fr; gap: 24px; }
  .footer-bar { flex-direction: column; gap: 8px; text-align: center; }
}

/* Older index footer rules — keep legacy doc-page footers working. */
footer:not(.site-footer) {
  text-align: center;
  padding: 56px 24px 32px;
  color: var(--text-muted);
  font-size: 13px;
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  letter-spacing: 0.06em;
}
footer:not(.site-footer) a {
  color: var(--text-dim);
}
footer:not(.site-footer) a:hover {
  color: var(--cyan);
}

/* -------- STICKY COMPACT NAV --------
 * Hidden by default at top of page; effects.js sets data-visible="true"
 * on the <body> once the user has scrolled past the hero so the bar
 * fades in. Single primary CTA on the right — no menu links so the
 * bar stays small and out of the way. Sits above the scroll-progress
 * bar (z-index 90 vs 100). */
.sticky-nav {
  position: fixed;
  top: 2px; /* clear of the 2px scroll-progress bar */
  left: 0;
  right: 0;
  height: 44px;
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 0 24px;
  background: rgba(7, 7, 16, 0.85);
  border-bottom: 1px solid var(--border-hi);
  backdrop-filter: blur(14px) saturate(140%);
  -webkit-backdrop-filter: blur(14px) saturate(140%);
  z-index: 90;
  /* Hidden state — translated up + invisible. effects.js flips data-
   * sticky-nav="visible" on <body> to slide it in. */
  transform: translateY(-100%);
  opacity: 0;
  pointer-events: none;
  transition: transform 320ms cubic-bezier(0.22, 0.61, 0.36, 1),
              opacity 320ms ease-out;
}
body[data-sticky-nav="visible"] .sticky-nav {
  transform: translateY(0);
  opacity: 1;
  pointer-events: auto;
}
.sticky-nav-brand {
  display: flex;
  align-items: baseline;
  gap: 8px;
  text-decoration: none;
  color: inherit;
}
.sticky-nav-brand .logo {
  font-family: 'Orbitron', monospace;
  font-weight: 900;
  font-size: 14px;
  letter-spacing: 0.22em;
  color: var(--text);
}
.sticky-nav-brand .sub {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px;
  letter-spacing: 0.18em;
  color: var(--text-dim);
  text-transform: uppercase;
}
.sticky-nav-cta {
  font-family: 'Orbitron', monospace;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  text-decoration: none;
  color: var(--bg);
  background: var(--cyan);
  padding: 8px 18px;
  border: 1px solid var(--cyan);
  transition: background 200ms, color 200ms, box-shadow 200ms;
}
.sticky-nav-cta:hover {
  background: transparent;
  color: var(--cyan);
  box-shadow: 0 0 12px rgba(0, 229, 255, 0.55);
}

/* Sticky-nav beta chip lives under .beta-chip.beta-chip--sticky above
   — no extra rules needed here. The compact-bar Launch-app CTA stays
   the primary headline action. */
@media (max-width: 600px) {
  .sticky-nav { padding: 0 16px; height: 40px; }
  .sticky-nav-brand .sub { display: none; }
  .sticky-nav-cta { padding: 6px 12px; font-size: 11px; letter-spacing: 0.16em; }
}

/* -------- REDUCED MOTION (turn off all the fancy stuff) -------- */
@media (prefers-reduced-motion: reduce) {
  .hero .scanline { animation: none; display: none; }
  .ambient-orb { animation: none; }
  .reveal,
  .reveal-doc,
  .reveal-stagger > * { opacity: 1; transform: none; filter: none; transition: none; }
  .scroll-progress { display: none; }
  .feature { transform: none !important; }
  .hero h1::before, .hero h1::after { animation: none; }
  .hero-meta .dot { animation: none; }
  .faq p { animation: none; }
  .faq summary::after { transition: none; }
  .sticky-nav { transition: none; }
}

/* -------- RESPONSIVE -------- */
@media (max-width: 900px) {
  section.block h2 { font-size: clamp(28px, 6vw, 40px); }
  section.block .lead { font-size: 17px; }
}

@media (max-width: 720px) {
  body { font-size: 16px; }

  .specs-grid { grid-template-columns: repeat(2, 1fr); }
  .spec { padding: 18px 12px; border-bottom: 1px solid var(--border); }
  .spec:nth-child(2n) { border-inline-end: none; }
  .spec:nth-child(n+3) { border-bottom: none; }
  .spec .num { font-size: clamp(40px, 11vw, 56px); }

  .ambient-orb { filter: blur(70px); opacity: 0.7; }
  .ambient-orb.cyan { width: 360px; height: 360px; }
  .ambient-orb.orange { width: 320px; height: 320px; }
  .ambient-orb.violet { display: none; }

  nav.top {
    padding: 14px 18px;
    gap: 14px;
    flex-wrap: wrap;
  }
  nav.top .brand .logo { font-size: 22px; }
  nav.top .brand .sub { font-size: 9px; padding: 2px 6px; }
  nav.top .links {
    gap: 16px;
    order: 3;
    flex-basis: 100%;
    margin-inline-start: 0;
    justify-content: flex-start;
    padding-top: 4px;
    border-top: 1px solid var(--border);
  }
  nav.top .links a { font-size: 11px; letter-spacing: 0.18em; }
  nav.top .links a.nav-cta {
    font-size: 12px;
    padding: 8px 14px;
    margin-inline-start: 0;
  }
  /* Match the beta chip to the surrounding nav metrics on mobile so
     the wrapped row reads as one continuous strip. */
  nav.top .links .beta-chip {
    font-size: 10px;
    padding: 6px 10px 6px 9px;
    margin-inline-start: 0;
    gap: 6px;
  }
  nav.top .links .beta-chip-dot {
    width: 7px;
    height: 7px;
  }
  nav.top .lang-switcher {
    margin-inline-start: auto;
  }
  nav.top .lang-switcher .lang-toggle { font-size: 12px; padding: 7px 11px; min-width: 56px; gap: 6px; }
  nav.top .lang-switcher .lang-menu button { font-size: 12px; padding: 9px 12px; }

  .hero { padding: 64px 18px 56px; }
  .hero-corner { width: 16px; height: 16px; }
  .hero-corner.tl, .hero-corner.tr { top: 14px; }
  .hero-corner.bl, .hero-corner.br { bottom: 14px; }
  .hero-corner.tl, .hero-corner.bl { left: 14px; }
  .hero-corner.tr, .hero-corner.br { right: 14px; }
  .hero-meta { font-size: 9.5px; gap: 10px; padding: 5px 10px; margin-bottom: 24px; }
  .hero-sub { font-size: 11px; gap: 10px; }

  section.block { padding: 64px 0 48px; }
  .feature-grid { gap: 14px; margin-top: 28px; }
  .feature { padding: 22px 18px; }
  .terminal pre { font-size: 12px; padding: 14px 16px; }

  .btn { padding: 14px 22px; font-size: 13px; min-height: 46px; }
}

@media (max-width: 460px) {
  nav.top .lang-switcher .lang-toggle { font-size: 11px; padding: 6px 9px; min-width: 50px; }
  nav.top .lang-switcher .lang-menu button { font-size: 11px; padding: 8px 10px; }
}

/* -------- MOBILE AUDIT @ 360–480px -------- *
 * Sweep added 2026-04-26 after a designer-review pass. Tightens the
 * sections that were merely "responsive at 720px" but ugly at 380px:
 *  - hero CTA group + tagline padding,
 *  - thesis pillars (4 spans + 3 dots) wrapping awkwardly,
 *  - showcase tilts removed AND the cyan glow shrunk,
 *  - comparison table left-column scroll-glued correctly,
 *  - FAQ summary text sized for thumb taps,
 *  - footer collapsed to one column with proper spacing.
 */
@media (max-width: 480px) {
  /* Hero — pull the headline tight, drop the secondary CTA divider line */
  .hero { padding: 80px 16px 56px; }
  .hero p.tagline-sharp {
    font-size: clamp(20px, 5.5vw, 24px);
    margin-top: 24px;
  }
  .hero .tagline-sub {
    font-size: 14px;
    margin-top: 12px;
  }
  .btn-hero-primary {
    padding: 14px 24px;
    font-size: 13px;
    letter-spacing: 0.18em;
    width: auto;
  }

  /* Thesis — stack vertically so each pillar is its own line */
  .thesis-line { font-size: clamp(22px, 5.6vw, 28px); }
  .thesis-pillars {
    flex-direction: column;
    gap: 10px;
    text-align: center;
  }
  .thesis-pillars .thesis-dot { display: none; }

  /* Showcase — kill the tilt, reduce padding, tighten captions */
  .showcase { padding: 40px 16px 24px; }
  .showcase-h2 { font-size: clamp(28px, 7vw, 36px); }
  .shot, .shot-left, .shot-right { transform: none !important; }
  .shot-frame { padding: 4px; }
  .shot figcaption { font-size: 10px; letter-spacing: 0.12em; }

  /* Comparison table — first-column min-width so criteria don't
   * truncate, and let it scroll horizontally without the rest of
   * the page widening */
  .compare-wrap { margin-left: -16px; margin-right: -16px; }
  .compare { min-width: 620px; }
  .compare th[scope="row"] { min-width: 180px; }

  /* FAQ — bigger summary text + more padding so it's a comfortable
   * thumb tap target */
  .faq summary { padding: 16px 14px; font-size: 15px; }
  .faq p { padding: 0 14px 14px; font-size: 13px; }

  /* Footer — already collapses to 1 col at 560px; here we tighten
   * the inner padding + bar typography */
  .site-footer { padding: 40px 16px 24px; margin-top: 56px; }
  .footer-col h4 { font-size: 10px; letter-spacing: 0.24em; }
  .footer-col a { font-size: 13px; }
  .footer-bar { font-size: 10px; letter-spacing: 0.12em; }

  /* Telemetry HUD already hidden below 1280px — nothing to tweak */

  /* Section headers — the `SEC.0X` stamp + label was running off the
   * edge of narrow viewports because of fixed letter-spacing. */
  section.block { padding-left: 16px; padding-right: 16px; }
  .section-header .index { font-size: 10px; letter-spacing: 0.2em; }
  .section-header .label { font-size: 10px; letter-spacing: 0.16em; }
  section.block h2 { font-size: clamp(28px, 7vw, 36px); line-height: 1.15; }
}

/* ─── Android-beta sign-up modal ──────────────────────────────────
 * Centred overlay with a corner-clip frame matching the rest of the
 * NOX UI. Form lives inside; effects.js wires open/close/submit.
 * Modal stays out of the document flow when closed via [hidden].
 */
.beta-modal {
  position: fixed;
  inset: 0;
  z-index: 10000;
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 24px;
}
.beta-modal[hidden] {
  display: none;
}
.beta-modal-backdrop {
  position: absolute;
  inset: 0;
  background: rgba(7, 7, 12, 0.85);
  backdrop-filter: blur(6px);
  -webkit-backdrop-filter: blur(6px);
}
.beta-modal-card {
  position: relative;
  width: 100%;
  max-width: 480px;
  max-height: calc(100vh - 48px);
  overflow-y: auto;
  padding: 32px 28px 24px;
  background: var(--panel);
  border: 1px solid var(--cyan);
  clip-path: var(--clip-corner);
  box-shadow: 0 0 36px rgba(0, 240, 255, 0.35);
  display: flex;
  flex-direction: column;
  gap: 12px;
}
.beta-modal-close {
  position: absolute;
  top: 8px;
  inset-inline-end: 12px;
  width: 32px;
  height: 32px;
  background: transparent;
  color: var(--text-dim);
  border: none;
  font-size: 24px;
  line-height: 1;
  cursor: pointer;
  transition: color 150ms;
}
.beta-modal-close:hover {
  color: var(--cyan);
}
.beta-modal-title {
  font-family: 'Orbitron', monospace;
  font-weight: 900;
  font-size: 18px;
  letter-spacing: 0.16em;
  text-transform: uppercase;
  color: var(--cyan);
  margin: 0;
}
.beta-modal-lead {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12.5px;
  line-height: 1.55;
  color: var(--text-dim);
  margin: 0 0 8px;
}
.beta-modal-label {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  color: var(--text-dim);
  margin-top: 4px;
}
.beta-modal-input,
.beta-modal-textarea {
  width: 100%;
  background: var(--bg);
  border: 1px solid var(--border);
  color: var(--text);
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 14px;
  padding: 10px 12px;
  transition: border-color 150ms, box-shadow 150ms;
  /* Override browser defaults that bloat the inputs visually. */
  appearance: none;
  -webkit-appearance: none;
  border-radius: 0;
}
.beta-modal-textarea {
  resize: vertical;
  min-height: 72px;
  line-height: 1.5;
}
.beta-modal-input:focus,
.beta-modal-textarea:focus {
  outline: none;
  border-color: var(--cyan);
  box-shadow: 0 0 12px rgba(0, 240, 255, 0.4);
}
.beta-modal-input::placeholder,
.beta-modal-textarea::placeholder {
  color: rgba(170, 200, 220, 0.35);
}
.beta-modal-status {
  font-family: 'JetBrains Mono', ui-monospace, monospace;
  font-size: 12px;
  min-height: 18px;
  margin-top: 4px;
}
.beta-modal-status[data-state="success"] { color: #5dffba; }
.beta-modal-status[data-state="error"]   { color: #ff7a7a; }
.beta-modal-status[data-state="pending"] { color: var(--text-dim); }
.beta-modal-actions {
  display: flex;
  gap: 12px;
  justify-content: flex-end;
  margin-top: 8px;
}
.beta-modal-btn {
  font-family: 'Orbitron', monospace;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: 0.22em;
  text-transform: uppercase;
  padding: 10px 18px;
  border: 1px solid;
  cursor: pointer;
  transition: all 180ms;
  clip-path: var(--clip-corner);
}
.beta-modal-btn--ghost {
  background: transparent;
  color: var(--text-dim);
  border-color: var(--border);
}
.beta-modal-btn--ghost:hover {
  color: var(--text);
  border-color: var(--text-dim);
}
.beta-modal-btn--primary {
  background: var(--cyan);
  color: var(--bg);
  border-color: var(--cyan);
  box-shadow: 0 0 14px rgba(0, 240, 255, 0.4);
}
.beta-modal-btn--primary:hover {
  filter: brightness(1.1);
  box-shadow: 0 0 20px rgba(0, 240, 255, 0.6);
}
.beta-modal-btn--primary[disabled] {
  opacity: 0.5;
  cursor: not-allowed;
  box-shadow: none;
}
@media (max-width: 520px) {
  .beta-modal { padding: 16px; }
  .beta-modal-card { padding: 28px 18px 18px; }
  .beta-modal-title { font-size: 16px; }
  .beta-modal-actions { flex-direction: column-reverse; }
  .beta-modal-btn { width: 100%; }
}
