/* ===== PinDrift website - BRT02-A "Refined Black Brutalist" ===========
   Pure-monochrome chrome, 1.5px hard borders, hard offset shadows
   (no blur), 4px corner radius for buttons/inputs, 6px for cards.
   No glass, no backdrop-blur, no transparency, no colored text,
   no translate-on-hover, no em-dashes in body copy.
   ===================================================================== */

:root {
  /* ---- BRT02-A LIGHT TOKENS ------------------------------------- */
  --bg:              #FFFFFF;
  --bg-soft:         #FAFAFA;
  --bg-subtle:       #F4F4F4;
  --bg-muted:        #EFEFEF;
  --bg-hover:        #EFEFEF;
  --text:            #000000;
  --text-secondary:  #5C5C5C;
  --text-muted:      #5C5C5C;
  --text-faint:      #8A8A8A;
  --ink:             #000000;
  /* Borders are HARD black (or white in dark mode). 1.5px is the
     BRT02-A canonical thickness. --border-soft is for the rare
     case we need a subtler hairline. */
  --border:          #000000;
  --border-strong:   #000000;
  --border-soft:     rgba(0, 0, 0, 0.16);
  --shadow-color:    #000000;
  /* Hard offset shadows. No blur, no spread. The shadow IS a
     translation of the silhouette in pure black/white. */
  --shadow-sm:       2px 2px 0 var(--shadow-color);
  --shadow-md:       3px 3px 0 var(--shadow-color);
  --shadow-lg:       4px 4px 0 var(--shadow-color);
  --shadow-xl:       6px 6px 0 var(--shadow-color);
  /* "Accent" in BRT02-A is just the foreground (black/white).
     Colored accents are not allowed for text anywhere. Reserved
     palette: blue for button background only, green for toggle-on
     only, red for danger only. */
  --accent:          #000000;
  --accent-hover:    #1A1A1A;
  --accent-on:       #FFFFFF;
  --danger:          #DC2626;
  --success:         #16A34A;
  /* Corner radius. BRT02-A is conservative: 4px buttons / inputs,
     6px cards / modals / sheets. */
  --radius:          4px;
  --radius-lg:       6px;
  --radius-xl:       6px;
  --container:       1200px;
  --container-narrow: 1040px;

  color-scheme: light dark;
}

/* Dark tokens are applied when:
   (a) the OS theme is dark AND the user hasn't picked light, OR
   (b) the user has explicitly chosen dark via the nav theme toggle
       (which writes [data-pindrift-theme="dark"] on <html>).
   The `:not([data-pindrift-theme="light"])` qualifier in the @media
   rule lets a "force light" choice beat the OS setting. */
/* Dark-mode tokens have been softened so neither the bg nor the ink
   hits the eyes. Backgrounds lifted ~6-12 levels off near-black, ink
   muted from #EAEAEA to #D6D6DA so borders and offset shadows don't
   read as blinding-white strokes. Contrast ratio of ink (#D6D6DA) on
   bg (#1C1C1F) is ~11.5:1 — still well above WCAG AAA (7:1) for body
   text, just no longer maxing out. */
@media (prefers-color-scheme: dark) {
  html:not([data-pindrift-theme="light"]) {
    --bg:              #1C1C1F;
    --bg-soft:         #26262A;
    --bg-subtle:       #2D2D32;
    --bg-muted:        #36363B;
    --bg-hover:        #36363B;
    --text:            #D6D6DA;
    --text-secondary:  #9E9EA6;
    --text-muted:      #9E9EA6;
    --text-faint:      #72727A;
    --ink:             #D6D6DA;
    --border:          #D6D6DA;
    --border-strong:   #D6D6DA;
    --border-soft:     rgba(214, 214, 218, 0.14);
    --shadow-color:    #D6D6DA;
    --accent:          #D6D6DA;
    --accent-hover:    #BEBEC4;
    --accent-on:       #1C1C1F;
    --danger:          #F87171;
    --success:         #4ADE80;
  }
}
/* Manual override: user picked dark in the nav toggle. Applies
   regardless of OS theme. */
html[data-pindrift-theme="dark"] {
  --bg:              #1C1C1F;
  --bg-soft:         #26262A;
  --bg-subtle:       #2D2D32;
  --bg-muted:        #36363B;
  --bg-hover:        #36363B;
  --text:            #D6D6DA;
  --text-secondary:  #9E9EA6;
  --text-muted:      #9E9EA6;
  --text-faint:      #72727A;
  --ink:             #D6D6DA;
  --border:          #D6D6DA;
  --border-strong:   #D6D6DA;
  --border-soft:     rgba(214, 214, 218, 0.14);
  --shadow-color:    #D6D6DA;
  --accent:          #D6D6DA;
  --accent-hover:    #BEBEC4;
  --accent-on:       #1C1C1F;
  --danger:          #F87171;
  --success:         #4ADE80;
  color-scheme: dark;
}
html[data-pindrift-theme="light"] {
  /* Force light - tells the UA + image filters to draw light-mode
     widgets even when the OS is dark. CSS vars at :root are already
     the light defaults; just need to declare color-scheme. */
  color-scheme: light;
}

* { box-sizing: border-box; margin: 0; padding: 0; }

html { scroll-behavior: smooth; }

body {
  font-family: "Inter", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;
  font-size: 16px;
  line-height: 1.55;
  letter-spacing: -0.005em;
  color: var(--text);
  background: var(--bg);
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-rendering: optimizeLegibility;
  font-feature-settings: "ss01", "cv11";
  animation: pageFadeIn 0.55s ease-out;
}

@keyframes pageFadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

/* ===== SCROLLBAR HIDDEN =====
   The scrollbar is intentionally hidden site-wide. Scrolling still
   works via wheel, trackpad, touch, keyboard, and programmatic APIs;
   we just don't render the rail. */
html {
  scrollbar-width: none;          /* Firefox */
  -ms-overflow-style: none;       /* Legacy Edge / IE */
}
::-webkit-scrollbar { display: none; }   /* WebKit / Blink */

/* Links are monochrome with a hard underline. BRT02-A forbids colored
   text, so accent blue is not used for links anywhere. */
a {
  color: var(--text);
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 3px;
  transition: opacity 0.15s ease;
}
a:hover { opacity: 0.65; }

img, svg { display: block; max-width: 100%; }

.container { max-width: var(--container); margin: 0 auto; padding: 0 28px; }
.container-narrow { max-width: var(--container-narrow); margin: 0 auto; padding: 0 28px; }

.muted { color: var(--text-muted); }
.small { font-size: 13px; }

/* ===== HEADER / FLOATING LIQUID-GLASS PILLS ===== */
.site-header {
  position: fixed;
  top: 14px;
  left: 0;
  right: 0;
  z-index: 100;
  background: transparent;
  border: none;
  padding: 0;
  pointer-events: none;
  animation: navIn 0.55s cubic-bezier(0.2, 0.9, 0.3, 1.05);
}

@keyframes navIn {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* When the user has scrolled past the hero, the header gets a slightly
   stronger backdrop so it reads cleanly over arbitrary section content.
   The .scrolled class is applied by nav.js based on window.scrollY. */
/* Scrolled state intensifies only the nav-pill backdrop. The .brand is
   intentionally left transparent at every scroll position. */
.site-header.scrolled .nav-pill {
  background: var(--bg);
  border: 1.5px solid var(--border);
  box-shadow: var(--shadow-md);
}

/* Full-width backdrop bar behind the floating header pills. Hidden by
   default (transparent), fades in once nav.js applies .scrolled. The bar
   sits inside the header's stacking context but earlier in document order
   than the brand/pill/CTA, so those paint on top of it. */
.site-header::before {
  content: "";
  position: fixed;
  top: 0;
  left: 0;
  right: 0;
  height: 72px;
  background: var(--bg);
  border-bottom: 1.5px solid var(--border);
  box-shadow: 0 1px 0 var(--shadow-color);
  opacity: 0;
  transition: opacity 0.18s ease;
  pointer-events: none;
}
.site-header.scrolled::before {
  opacity: 1;
}

.site-header .container { pointer-events: none; }

/* 3-column grid centers the pill geometrically, regardless of brand/CTA widths */
.nav {
  display: grid;
  grid-template-columns: 1fr auto 1fr;
  align-items: center;
  gap: 12px;
  height: auto;
  padding: 0;
}
.nav .brand { justify-self: start; grid-column: 1; }
.nav .nav-pill { justify-self: center; grid-column: 2; }
.nav .nav-cta { justify-self: end; grid-column: 3; }
/* Right-side cluster: holds the theme toggle + nav-cta side-by-side.
   Injected at runtime by nav.js (it wraps the CTA so the toggle can
   share the same grid cell). Occupies column 3 in place of the bare
   .nav-cta so the 3-col grid math stays intact. */
.nav .nav-right-cluster {
  justify-self: end;
  grid-column: 3;
  display: inline-flex;
  align-items: center;
  gap: 8px;
}
/* When the CTA is inside the cluster, drop its own grid placement so
   it doesn't fight the cluster's. */
.nav .nav-right-cluster .nav-cta {
  justify-self: auto;
  grid-column: auto;
}

.nav > * { pointer-events: auto; }

/* BRT02-A floating chrome: solid, 1.5px hard borders, no transparency
   anywhere. Transitions are color/border-color only (no transform). */
.nav-pill, .nav-cta, .brand {
  position: relative;
  border-radius: var(--radius-lg);
  transition: background 0.15s ease, color 0.15s ease, border-color 0.15s ease;
}

/* BRT02-A nav-pill: solid background, 1.5px hard border, 3px offset
   shadow. No blur, no transparency. */
.nav-pill {
  background: var(--bg);
  border: 1.5px solid var(--border);
  border-radius: var(--radius-lg);
  box-shadow: var(--shadow-md);
}
.brand {
  background: transparent;
  backdrop-filter: none;
  -webkit-backdrop-filter: none;
  border: none;
  box-shadow: none;
}

/* Brand sits left, logo + wordmark, slightly tighter padding than the nav-pill */
.brand {
  display: inline-flex;
  align-items: center;
  gap: 10px;
  padding: 5px 14px 5px 5px;
  font-weight: 600;
  font-size: 15.5px;
  letter-spacing: -0.015em;
  color: var(--ink);
  flex-shrink: 0;
  isolation: isolate;
}

/* BRT02-A: no transform on hover anywhere. Brand opacity dims slightly. */
.brand:hover {
  color: var(--ink);
  opacity: 0.7;
}

/* Flat monochrome brand mark: black square in light mode, white in
   dark mode, with a small inverted dot inside. No gradients, no glow. */
.brand-logo {
  width: 26px;
  height: 26px;
  border-radius: 4px;
  background: var(--ink);
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}

.brand-logo::after {
  content: "";
  width: 7px;
  height: 7px;
  border-radius: 50%;
  background: var(--bg);
}

/* The center pill containing nav links */
.nav-pill {
  position: relative; /* makes itself the offsetParent / containing block for the sliding indicator inside */
  display: inline-flex;
  align-items: center;
  padding: 4px;
  gap: 0;
}

/* BRT02-A sliding indicator: a 3px solid bar that lives at the bottom
   of the active tab, not a pill behind it. Same nav.js code sets its
   transform/width on hover and on the active link. */
.nav-pill-indicator {
  position: absolute;
  bottom: 0;
  left: 0;
  width: 0;
  height: 3px;
  background: var(--ink);
  transition:
    transform 0.42s cubic-bezier(0.32, 1.28, 0.40, 1.00),
    width     0.42s cubic-bezier(0.32, 1.28, 0.40, 1.00),
    opacity   0.18s ease;
  pointer-events: none;
  z-index: 0;
  opacity: 0;
}

.nav-pill a {
  position: relative;
  padding: 10px 14px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text);
  opacity: 0.40;
  text-decoration: none;
  white-space: nowrap;
  transition: opacity 0.15s ease;
  z-index: 1;
}

.nav-pill a:hover {
  opacity: 0.75;
}

.nav-pill a.active {
  opacity: 1;
}

/* ===== Nav CTA + .btn-download, shared "Get PinDrift" CTA look =====
   Simple solid dark pill with a download arrow. No glow ring, no
   multi-layer blue ambient shadow, no fancy gradient. Used on:
     - .nav-cta (small, in the header)
     - .btn.btn-download (large, in hero / final-CTA placements)
   Both share the same visual language; the difference is just padding
   and font-size, which come from the host class. */
/* BRT02-A primary CTA. Solid fg-on-bg, 1.5px border, 4px radius, no
   translate-on-hover, brightness filter for hover state. */
.nav-cta, .btn-download {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  background: var(--ink);
  border: 1.5px solid var(--ink);
  color: var(--bg);
  font-weight: 700;
  letter-spacing: -0.005em;
  text-decoration: none;
  border-radius: var(--radius);
  box-shadow: var(--shadow-md);
  transition: filter 0.15s ease, background 0.15s ease;
}
.nav-cta { padding: 8px 10px; font-size: 12px; flex-shrink: 0; }

.nav-cta:hover, .btn-download:hover {
  color: var(--bg);
  filter: brightness(0.85);
}

/* Download arrow icon rendered via mask-image so it inherits color.
   The small header CTA always carries an ::after pseudo, but it's
   collapsed (width 0, opacity 0, negative margin to cancel the parent
   flex gap) when the button is in Log In state. When .is-download is
   applied, the arrow expands and fades in alongside the label slide. */
.nav-cta::after, .btn-download .btn-download-icon {
  content: '';
  display: inline-block;
  height: 12px;
  flex-shrink: 0;
  background: currentColor;
  -webkit-mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3v13'/><path d='M6 11l6 6 6-6'/><path d='M5 21h14'/></svg>") center/contain no-repeat;
          mask: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.4' stroke-linecap='round' stroke-linejoin='round'><path d='M12 3v13'/><path d='M6 11l6 6 6-6'/><path d='M5 21h14'/></svg>") center/contain no-repeat;
}
.nav-cta::after {
  width: 0;
  margin-left: -8px;        /* cancel the parent's gap so Log In has no trailing space */
  opacity: 0;
  transform: translateX(-4px);
  transition: width 0.32s cubic-bezier(0.4, 0, 0.2, 1),
              margin-left 0.32s cubic-bezier(0.4, 0, 0.2, 1),
              opacity 0.22s ease 0.06s,
              transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);
}
.nav-cta.is-download::after {
  width: 12px;
  margin-left: 0;
  opacity: 1;
  transform: translateX(0);
}

/* ===== NAV THEME TOGGLE =====
   Square BRT02-A button injected by nav.js immediately LEFT of the
   .nav-cta. Same hard-border / offset-shadow / 4px-radius vocabulary
   as the nearby CTA, but smaller and using outline (not fill) styling
   so it doesn't compete for primary attention. */
.nav-theme-toggle {
  flex-shrink: 0;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px;
  height: 32px;
  padding: 0;
  /* Inter-item spacing comes from .nav-right-cluster's `gap: 8px`. */
  border: 1.5px solid var(--ink);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--ink);
  cursor: pointer;
  box-shadow: var(--shadow-sm);
  /* position: relative + z-index lift this above .site-header::before,
     which fades in as a full-width backdrop in the .scrolled state. The
     existing .nav-pill / .nav-cta / .brand rule on line 259 does the
     same thing — without it, static-flow descendants paint behind the
     positioned ::before backdrop and disappear on scroll. */
  position: relative;
  z-index: 1;
  transition: filter 0.15s ease, background 0.15s ease, color 0.15s ease,
              transform 0.08s ease, box-shadow 0.08s ease;
}
.nav-theme-toggle:hover {
  background: var(--ink);
  color: var(--bg);
}
.nav-theme-toggle:active {
  transform: translate(1px, 1px);
  box-shadow: 1px 1px 0 var(--shadow-color);
}
.nav-theme-toggle:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 2px;
}
.nav-theme-toggle svg {
  width: 16px;
  height: 16px;
  display: block;
}
.btn-download .btn-download-icon { width: 14px; height: 14px; }

/* Nav Discord button.
   Injected by nav.js between the theme toggle and the .nav-cta.
   Two-segment chip — [ Discord glyph ][ inverted 25% OFF promo ] — at
   the same 32px height as the theme toggle so the cluster reads as a
   single horizontal bar. Hidden in the mobile drawer breakpoint since
   space is precious there; the hero already has its own Discord chip. */
.nav-discord-cta {
  flex-shrink: 0;
  display: inline-flex;
  align-items: stretch;
  height: 32px;
  border: 1.5px solid var(--ink);
  border-radius: var(--radius);
  background: var(--bg);
  color: var(--ink);
  text-decoration: none;
  font-weight: 700;
  box-shadow: var(--shadow-sm);
  overflow: hidden;
  /* position: relative + z-index lift this above .site-header::before,
     the full-width backdrop bar that fades in on scroll. Without it
     the chip sits at the static-descendants layer and the scrolled
     backdrop paints right over the top of it. */
  position: relative;
  z-index: 1;
  transition: transform 0.08s ease, box-shadow 0.08s ease;
}
.nav-discord-cta:hover {
  transform: translate(-1px, -1px);
  box-shadow: 3px 3px 0 var(--shadow-color);
  color: var(--ink);
}
.nav-discord-cta:active {
  transform: translate(1px, 1px);
  box-shadow: 1px 1px 0 var(--shadow-color);
}
.nav-discord-cta:focus-visible {
  outline: 2px solid var(--ink);
  outline-offset: 2px;
}
.nav-discord-cta-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 30px;
  background: var(--bg);
  border-right: 1.5px solid var(--ink);
  color: var(--ink);
}
.nav-discord-cta-icon svg {
  width: 16px;
  height: 16px;
  fill: currentColor;
  display: block;
}
.nav-discord-cta-promo {
  display: inline-flex;
  align-items: center;
  gap: 7px;
  padding: 0 10px;
  background: var(--ink);
  color: var(--bg);
  /* Font intentionally matches the .nav-cta-state ("Log In" / "Download")
     typography so the chip and the CTA read as the same family of chrome:
     Inter, 12px, 700 weight, slight negative tracking, no uppercasing. */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: -0.005em;
  white-space: nowrap;
  line-height: 1;
  /* Sheen sweep — mirrors the hero Discord chip. Soft diagonal highlight
     strip travels across the inverted-ink panel every 3.4s. Pure CSS via
     ::before linear-gradient inside a clipped container. */
  position: relative;
  overflow: hidden;
  isolation: isolate;
}
.nav-discord-cta-promo::before {
  content: "";
  position: absolute;
  top: 0;
  bottom: 0;
  left: -60%;
  width: 45%;
  background: linear-gradient(
    100deg,
    rgba(255, 255, 255, 0.00) 0%,
    rgba(255, 255, 255, 0.00) 35%,
    rgba(255, 255, 255, 0.45) 50%,
    rgba(255, 255, 255, 0.00) 65%,
    rgba(255, 255, 255, 0.00) 100%
  );
  transform: skewX(-18deg);
  animation: nav-discord-sheen 3.4s ease-in-out infinite;
  pointer-events: none;
  z-index: 0;
}
@keyframes nav-discord-sheen {
  0%   { left: -60%; opacity: 0; }
  12%  { opacity: 1; }
  70%  { opacity: 1; }
  100% { left: 130%; opacity: 0; }
}
@media (prefers-reduced-motion: reduce) {
  .nav-discord-cta-promo::before { animation: none; opacity: 0; }
}
.nav-discord-cta-promo-main,
.nav-discord-cta-promo-sep,
.nav-discord-cta-promo-sub  {
  /* Lift the label glyphs above the sheen layer so the highlight passes
     BEHIND the text, not over it. */
  position: relative;
  z-index: 1;
}
.nav-discord-cta-promo-main,
.nav-discord-cta-promo-sub  {
  /* Both halves use the same Inter / 12px / 700 styling so they read
     as one continuous label; only the middle-dot is visually softer. */
  font-size: 12px;
  font-weight: 700;
  letter-spacing: -0.005em;
}
.nav-discord-cta-promo-sep  { opacity: 0.45; font-weight: 700; }
/* The mobile drawer hides the desktop right-cluster chrome anyway,
   but we explicitly hide the chip too so it never leaks into a hamburger
   layout halfway down a resize. */
@media (max-width: 880px) {
  .nav-discord-cta { display: none; }
}

/* Two-state vertical slider for the Log In <-> Download swap.
   .nav-cta-slider is a 1-line-tall viewport with overflow: hidden.
   The .nav-cta-track inside holds both labels stacked vertically;
   translating the TRACK (not the slider) by -1.2em rolls Log In out
   of view and Download into view. The cubic-bezier matches the
   arrow's curve so the whole CTA shape-shifts in lockstep.

   WIDTH: the slider's width tracks each state's natural text width
   via two JS-measured CSS vars (--nav-cta-w-login / -download). Set
   in nav.js using the Range API (which returns text-box geometry,
   not the parent's layout box - critical because both states inside
   an inline-block parent are otherwise stretched to the max-width).
   Falls back to `max-content` for the brief moment before JS runs.
   Without this fix, "Log In" displayed in a slider sized for the
   wider "Download" label, leaving a visible gap. */
.nav-cta-slider {
  display: inline-block;
  overflow: hidden;
  height: 1.2em;
  line-height: 1.2;
  vertical-align: middle;
  width: var(--nav-cta-w-login, max-content);
}
.nav-cta.is-download .nav-cta-slider {
  width: var(--nav-cta-w-download, max-content);
}
/* Width transition is gated on .is-measured (set by nav.js after the
   initial measurement) so the first paint snaps into the correct width
   without animating from the fallback. */
.nav-cta.is-measured .nav-cta-slider {
  transition: width 0.32s cubic-bezier(0.4, 0, 0.2, 1);
}
.nav-cta-track {
  display: block;
  transition: transform 0.32s cubic-bezier(0.4, 0, 0.2, 1);
  transform: translateY(0);
  will-change: transform;
}
.nav-cta-state {
  display: block;
  height: 1.2em;
  line-height: 1.2;
  white-space: nowrap;
}
.nav-cta.is-download .nav-cta-track {
  transform: translateY(-1.2em);
}

.nav-cta:active, .btn-download:active {
  box-shadow: 1px 1px 0 var(--shadow-color);
}

.nav-cta:focus-visible, .btn-download:focus-visible {
  outline: 1.5px solid var(--ink);
  outline-offset: 3px;
}

/* Floating header doesn't take layout space; pages need top padding so content doesn't go under it */
body { padding-top: 0; }

@media (max-width: 880px) {
  .nav-pill { display: none; }

  /* The desktop nav is a 3-column grid (brand | pill | cta). With the pill
     hidden, we still want the CTA flush-right next to the hamburger button,
     so we switch the row to: brand | hamburger | cta. The pill is still
     display:none in the DOM at grid-column: 2, but the auto-placement was
     spilling the toggle to a phantom row 2; pin it to row 1 explicitly. */
  .nav {
    grid-template-columns: auto 1fr auto;
    grid-template-rows: auto;
    grid-auto-rows: 0; /* defensive: any phantom row collapses to 0 */
  }
  .nav .brand   { grid-column: 1; grid-row: 1; justify-self: start; }
  .nav .nav-toggle { grid-column: 2; grid-row: 1; justify-self: end; margin-right: 6px; }
  .nav .nav-cta { grid-column: 3; grid-row: 1; justify-self: end; }
}

/* ===== HAMBURGER BUTTON =====
   Always present in the DOM (injected by nav.js); hidden on desktop. The
   three <span>s morph into an X when .nav-drawer-open is on <html>. */
.nav-toggle {
  display: none;          /* shown via the @media block above */
  width: 40px;
  height: 40px;
  padding: 0;
  border: 1px solid rgba(15, 23, 42, 0.08);
  border-radius: 12px;
  background: rgba(255, 255, 255, 0.85);
  backdrop-filter: blur(22px) saturate(180%);
  -webkit-backdrop-filter: blur(22px) saturate(180%);
  box-shadow:
    0 1px 2px rgba(15, 23, 42, 0.04),
    0 8px 24px rgba(15, 23, 42, 0.06);
  cursor: pointer;
  position: relative;
  flex-shrink: 0;
}
.nav-toggle span {
  position: absolute;
  left: 10px;
  width: 20px;
  height: 2px;
  background: var(--ink);
  border-radius: 2px;
  transition: transform 0.22s ease, top 0.18s ease 0.04s, opacity 0.16s ease;
}
.nav-toggle span:nth-child(1) { top: 14px; }
.nav-toggle span:nth-child(2) { top: 19px; }
.nav-toggle span:nth-child(3) { top: 24px; }
.nav-drawer-open .nav-toggle span:nth-child(1) {
  top: 19px;
  transform: rotate(45deg);
  transition: top 0.18s ease, transform 0.22s ease 0.04s;
}
.nav-drawer-open .nav-toggle span:nth-child(2) { opacity: 0; }
.nav-drawer-open .nav-toggle span:nth-child(3) {
  top: 19px;
  transform: rotate(-45deg);
  transition: top 0.18s ease, transform 0.22s ease 0.04s;
}
@media (max-width: 880px) {
  .nav-toggle { display: inline-block; }
}

/* ===== MOBILE DRAWER =====
   Slides down from the top under the floating header. Backdrop dims the
   page and traps the tap so the page can't be interacted with behind it. */
.nav-drawer-backdrop {
  position: fixed;
  inset: 0;
  background: rgba(15, 23, 42, 0.35);
  backdrop-filter: blur(2px);
  -webkit-backdrop-filter: blur(2px);
  z-index: 90;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.22s ease;
}
.nav-drawer {
  position: fixed;
  top: 76px;
  left: 12px;
  right: 12px;
  z-index: 95;
  background: rgba(255, 255, 255, 0.96);
  backdrop-filter: blur(22px) saturate(180%);
  -webkit-backdrop-filter: blur(22px) saturate(180%);
  border: 1px solid rgba(15, 23, 42, 0.08);
  border-radius: 18px;
  box-shadow:
    0 1px 2px rgba(15, 23, 42, 0.06),
    0 18px 48px rgba(15, 23, 42, 0.18);
  padding: 8px;
  display: flex;
  flex-direction: column;
  gap: 2px;
  transform: translateY(-12px) scale(0.98);
  transform-origin: top center;
  opacity: 0;
  pointer-events: none;
  transition: transform 0.22s cubic-bezier(0.2, 0.9, 0.3, 1.05), opacity 0.22s ease;
}
.nav-drawer a {
  display: block;
  padding: 13px 16px;
  font-size: 15.5px;
  font-weight: 500;
  color: var(--text-soft);
  text-decoration: none;
  border-radius: 12px;
  transition: background 0.14s ease, color 0.14s ease;
}
.nav-drawer a.active.nav-drawer a:hover {
  background: rgba(15, 23, 42, 0.05);
  color: var(--ink);
}
.nav-drawer .nav-drawer-cta {
  margin-top: 6px;
  background: var(--ink);
  color: var(--bg);
  text-align: center;
  font-weight: 600;
  letter-spacing: 0.005em;
}
.nav-drawer .nav-drawer-cta:hover { filter: brightness(0.85); background: var(--ink); color: var(--bg); }

/* Lock page scroll while the drawer is open so background doesn't jitter. */
.nav-drawer-open { overflow: hidden; }
.nav-drawer-open body { overflow: hidden; }
.nav-drawer-open .nav-drawer-backdrop { opacity: 1; pointer-events: auto; }
.nav-drawer-open .nav-drawer {
  opacity: 1;
  transform: translateY(0) scale(1);
  pointer-events: auto;
}
@media (min-width: 881px) {
  /* Belt and suspenders: never show the drawer on desktop even if the class
     somehow ends up on <html> (e.g. resize race condition). */
  .nav-drawer.nav-drawer-backdrop { display: none !important; }
}

/* ===== BUTTONS - BRT02-A =================================
   All flat, 1.5px hard border, 4px radius, hard offset shadow,
   no translate-on-hover. Hover state uses a brightness filter
   (for filled buttons) or a hover-bg (for ghost / outline). */
.btn {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  border-radius: var(--radius);
  font-size: 13px;
  font-weight: 700;
  letter-spacing: -0.005em;
  border: 1.5px solid var(--ink);
  background: var(--bg);
  color: var(--ink);
  box-shadow: var(--shadow-md);
  cursor: pointer;
  transition: background 0.15s ease, color 0.15s ease, filter 0.15s ease, box-shadow 0.15s ease;
  text-decoration: none;
  white-space: nowrap;
}

.btn:hover {
  text-decoration: none;
  background: var(--bg-hover);
}

.btn:active {
  box-shadow: 1px 1px 0 var(--shadow-color);
}

/* Filled / primary. The hard fg-on-bg block; matches .nav-cta. */
.btn-dark { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.btn-dark:hover { background: var(--ink); color: var(--bg); filter: brightness(0.85); }

.btn-primary { background: var(--ink); color: var(--bg); border-color: var(--ink); }
.btn-primary:hover { filter: brightness(0.85); }

/* Outline / ghost: clear bg, fg-color border, hover fills bg-hover. */
.btn-outline {
  background: var(--bg);
  color: var(--ink);
  border-color: var(--ink);
}
.btn-outline:hover { background: var(--bg-hover); color: var(--ink); }

.btn-large { padding: 14px 22px; font-size: 14px; box-shadow: var(--shadow-lg); }

/* Re-assert .btn-download fill: appears AFTER .btn{} so it wins on
   same-specificity tie. Without this, the base .btn rule's white bg
   leaks through and the hero CTA reads as white-on-white in light mode. */
.btn.btn-download.btn-download {
  background: var(--ink);
  color: var(--bg);
  border: 1.5px solid var(--ink);
}
.btn.btn-download:hover.btn-download:hover {
  background: var(--ink);
  color: var(--bg);
  filter: brightness(0.85);
}

.btn-disabled {
  background: var(--bg-subtle);
  color: var(--text-muted);
  cursor: not-allowed;
  border: 1.5px solid var(--border-soft);
  box-shadow: none;
}
.btn-disabled:hover { background: var(--bg-subtle); color: var(--text-muted); filter: none; }

/* ===== HERO - BRT02-A: pure bg, no aurora orbs, no soft tint =====
   The animated blur orbs and the radial accent tint violated
   noBackdropBlur, noTransparency, and noColoredText. Hero is now a
   solid page with the title block centered. */
.hero {
  position: relative;
  padding: 24px 0 100px;
  margin-top: -68px;
  overflow: hidden;
  background: var(--bg);
}

/* Hero orbs are kept in the DOM but rendered invisible so the HTML
   doesn't have to change on every page. Animations are off too. */
.hero-orb { display: none; }

/* ===== Hero title word stagger =====
   Each <span class="hero-word"> in the title fades up + de-blurs with
   a small delay between words. Total runtime ~700ms so it lands well
   before the visitor's eye has settled on the page.

   Why blur-in instead of just opacity: the blur-clearing gives a sense
   of focusing that a pure fade doesn't. Subtle but distinctive. */
.hero-word {
  display: inline-block;
  opacity: 0;
  filter: blur(8px);
  transform: translateY(12px);
  animation: heroWordIn 0.7s cubic-bezier(0.2, 0.9, 0.3, 1.05) forwards;
}
.hero-word:nth-child(1) { animation-delay: 0.05s; }
.hero-word:nth-child(2) { animation-delay: 0.15s; }
.hero-word:nth-child(3) { animation-delay: 0.25s; }
.hero-word:nth-child(4) { animation-delay: 0.35s; }
.hero-word:nth-child(5) { animation-delay: 0.45s; }
.hero-word:nth-child(6) { animation-delay: 0.55s; }

@keyframes heroWordIn {
  to { opacity: 1; filter: blur(0); transform: translateY(0); }
}

@media (prefers-reduced-motion: reduce) {
  .hero-word { animation: none; opacity: 1; filter: none; transform: none; }
}

/* Hero noise overlay removed: there is no gradient to band against. */

.hero .container { position: relative; z-index: 1; }
.hero .hero-content { padding-top: 168px; }

.hero .container { position: relative; }

.hero-content { text-align: center; max-width: 820px; margin: 0 auto; animation: heroIn 0.6s 0.05s cubic-bezier(0.2, 0.9, 0.3, 1.05) backwards; }

@keyframes heroIn {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* BRT02-A eyebrow: solid bg, 1.5px border, uppercase tracking. */
.hero-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 10.5px;
  font-weight: 800;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--text);
  background: var(--bg);
  border: 1.5px solid var(--border);
  padding: 6px 12px;
  border-radius: var(--radius);
  margin-bottom: 28px;
}

.hero-eyebrow .dot {
  display: inline-block;
  width: 6px;
  height: 6px;
  background: var(--ink);
  vertical-align: middle;
}

h1.hero-title {
  font-size: clamp(44px, 8vw, 92px);
  font-weight: 800;
  letter-spacing: -0.04em;
  line-height: 1.0;
  margin-bottom: 28px;
  color: var(--ink);
}

/* Old .gradient span is now monochrome. The HTML still has the class
   to avoid mass HTML edits; CSS just renders it as plain text. */
h1.hero-title .gradient {
  background: none;
  -webkit-background-clip: initial;
  background-clip: initial;
  color: var(--ink);
}

/* Rotating city in the hero. The .hero-rotating span is an inline-block
   with overflow:hidden so chars sliding in/out get clipped to the city
   line height. Black underline marks it as the "value that changes".
   The width is sized via inline style by JS to the widest city so the
   rest of the headline doesn't reflow on each rotation. */
.hero-rotating {
  display: inline-block;
  position: relative;
  vertical-align: top;
  overflow: hidden;
  /* Heavy underline that doubles as a visual anchor for the
     value-that-rotates. Matches the BRT02-A hard-1.5px aesthetic
     but scaled up to the hero typography. */
  text-decoration: underline;
  text-decoration-thickness: 4px;
  text-underline-offset: 0.18em;
  /* Reserve enough height for the line so clipped chars don't get
     cropped above/below the baseline. */
  padding-bottom: 0.04em;
}
.hero-rotating-slot {
  display: inline-block;
  white-space: nowrap;
}
/* anime.js splitText wraps each char in <span class="char">; this
   gives each one its own transform context. */
.hero-rotating .char,
.hero-rotating-slot .char,
.hero-rotating-slot > span {
  display: inline-block;
  will-change: transform, opacity;
}

.hero-sub {
  font-size: clamp(17px, 1.6vw, 21px);
  color: var(--text-secondary);
  max-width: 580px;
  margin: 0 auto 28px;
  line-height: 1.5;
}

/* Flight-path visual. Thin dashed arc from a Pi-style origin dot
   (left) to a destination dot (right), with a solid black traveler
   dot that travels along the arc on a 6s loop, pausing 1.2s at each
   endpoint. Monochrome BRT02-A. */
.hero-flight-path {
  display: block;
  width: 100%;
  max-width: 480px;
  height: 60px;
  margin: 0 auto 32px;
  color: var(--ink);
}
.hero-flight-path .hfp-arc {
  stroke: currentColor;
  stroke-width: 1.5;
  stroke-dasharray: 4 5;
  stroke-linecap: round;
  opacity: 0.6;
}
.hero-flight-path .hfp-pin {
  fill: currentColor;
}
.hero-flight-path .hfp-traveler {
  fill: currentColor;
}
@media (prefers-reduced-motion: reduce) {
  .hero-flight-path .hfp-traveler { display: none; }
}

.hero-ctas {
  display: flex;
  gap: 12px;
  justify-content: center;
  flex-wrap: wrap;
  margin-bottom: 24px;
}

.hero-meta {
  font-size: 13px;
  color: var(--text-muted);
  letter-spacing: -0.005em;
}

/* ===== APP MOCKUP (matches the real PinDrift UI) ===== */
.hero-visual {
  margin-top: 64px;
  position: relative;
  max-width: 1080px;
  margin-left: auto;
  margin-right: auto;
  animation: heroIn 0.7s 0.2s cubic-bezier(0.2, 0.9, 0.3, 1.05) backwards;
}

.app-frame {
  background: var(--ink);
  border-radius: var(--radius-xl);
  padding: 8px;
  box-shadow: var(--shadow-xl);
  position: relative;
}

.app-frame::after {
  content: "";
  position: absolute;
  inset: -40px -80px;
  background: radial-gradient(ellipse 60% 50% at 50% 100%, rgba(59, 130, 246, 0.25) 0%, transparent 70%);
  z-index: -1;
}

.app-frame-bar {
  display: flex;
  align-items: center;
  gap: 6px;
  padding: 10px 14px 6px;
}

.app-frame-bar span {
  width: 10px; height: 10px; border-radius: 50%;
  background: rgba(255, 255, 255, 0.18);
}

.app-frame-screen {
  background: #ffffff;
  border-radius: 16px;
  display: grid;
  grid-template-columns: 240px 1fr;
  height: 480px;
  overflow: hidden;
  border: 1px solid rgba(255,255,255,0.06);
}

/* ===== Sidebar: matches real app, --bg-subtle background, light borders ===== */
.app-sidebar {
  background: #fafaf9;
  border-right: 1px solid #ebebea;
  display: flex;
  flex-direction: column;
  overflow: hidden;
}

/* Title bar with logo + connection pill (matches real app titlebar) */
.app-titlebar {
  display: flex;
  align-items: center;
  justify-content: space-between;
  padding: 10px 12px;
  background: #fafaf9;
  border-bottom: 1px solid #ebebea;
  font-size: 12px;
  flex-shrink: 0;
}
.app-titlebar-left {
  display: flex;
  align-items: center;
  gap: 8px;
  font-weight: 600;
  color: #2d2d2a;
  font-size: 13px;
  letter-spacing: -0.01em;
}
.app-titlebar-left .brand-logo {
  width: 22px; height: 22px;
  border-radius: 6px;
  box-shadow: 0 2px 6px rgba(59, 130, 246, 0.3);
}
.app-titlebar-left .brand-logo::after { width: 6px; height: 6px; box-shadow: none; }
.app-conn-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 3px 10px;
  background: #ecfdf5;
  color: #10b981;
  border-radius: 100px;
  font-size: 11px;
  font-weight: 500;
}
.app-conn-pill::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: #10b981;
  animation: appPulse 2s infinite;
}
@keyframes appPulse {
  0%, 100% { opacity: 1; }
  50% { opacity: 0.5; }
}

/* Tabs: pill-style segmented (matches real app .tabs) */
.app-tabs {
  display: flex;
  padding: 6px;
  gap: 2px;
  border-bottom: 1px solid #ebebea;
  background: #fafaf9;
  flex-shrink: 0;
}
.app-tab {
  flex: 1;
  padding: 6px 6px;
  font-size: 12px;
  font-weight: 500;
  color: #6b6b68;
  border-radius: 6px;
  text-align: center;
  white-space: nowrap;
  transition: background 0.15s, color 0.15s;
}
.app-tab.active {
  background: #ffffff;
  color: #2d2d2a;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

.app-section {
  padding: 12px 14px;
  background: #fafaf9;
}
.app-section + .app-section { padding-top: 2px; }

.app-section-label {
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: #9c9c99;
  margin-bottom: 8px;
}

/* Mode segmented control */
.app-segmented {
  display: flex;
  background: #f4f4f2;
  border-radius: 6px;
  padding: 3px;
  gap: 2px;
}
.app-segmented div {
  flex: 1;
  text-align: center;
  font-size: 12px;
  font-weight: 500;
  padding: 5px 8px;
  color: #6b6b68;
  border-radius: 4px;
}
.app-segmented div.active {
  background: #ffffff;
  color: #2d2d2a;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

/* Waypoint rows: small tinted chip + name + mono coords, white card */
.app-waypoint-list { display: flex; flex-direction: column; gap: 4px; }
.app-waypoint {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 8px 10px;
  border-radius: 6px;
  background: #ffffff;
  border: 1px solid #ebebea;
}
/* Sidebar waypoint markers: small solid colored dots with a thin white ring,
   matching the visual language of the on-map pins. No letter, no chip. */
.app-waypoint-marker {
  width: 12px; height: 12px;
  border-radius: 50%;
  flex-shrink: 0;
  border: 2px solid #ffffff;
  box-shadow:
    0 0 0 1px rgba(15, 23, 42, 0.06),
    0 1px 2px rgba(15, 23, 42, 0.10);
}
.app-waypoint-marker.start { background: #10b981; }
.app-waypoint-marker.mid   { background: #3b82f6; }
.app-waypoint-marker.end   { background: #ef4444; }
.app-waypoint-text { flex: 1; min-width: 0; }
.app-waypoint-name {
  font-weight: 500;
  color: #2d2d2a;
  font-size: 12.5px;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.app-waypoint-coords {
  font-size: 11px;
  color: #9c9c99;
  font-family: ui-monospace, "SF Mono", "Consolas", monospace;
}

/* Route stats: single bordered box with vertical separators */
.app-stat-row {
  display: flex;
  justify-content: space-between;
  padding: 9px 10px;
  background: #ffffff;
  border: 1px solid #ebebea;
  border-radius: 6px;
  margin-bottom: 8px;
}
.app-stat { flex: 1; text-align: center; }
.app-stat + .app-stat { border-left: 1px solid #ebebea; }
.app-stat-value {
  font-size: 13.5px;
  font-weight: 600;
  color: #2d2d2a;
  line-height: 1.2;
}
.app-stat-label {
  font-size: 10px;
  color: #9c9c99;
  margin-top: 1px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}

/* Route controls: primary blue Start + outlined End. Tight, no divider needed. */
.app-route-controls {
  display: flex;
  gap: 6px;
  margin-top: 10px;
}
.app-route-btn {
  flex: 2;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 6px;
  background: #3b82f6;
  color: white;
  font-size: 13px;
  font-weight: 500;
  padding: 7px 14px;
  border-radius: 6px;
  text-align: center;
  box-shadow: 0 1px 2px rgba(59, 130, 246, 0.2);
}
.app-route-btn.secondary {
  flex: 1;
  background: #ffffff;
  color: #2d2d2a;
  border: 1px solid #ebebea;
  box-shadow: none;
}

/* Map mock - light, OSM-tile-like (matches real app's Leaflet view) */
.app-map-rich {
  background:
    /* parks (soft green washes) */
    radial-gradient(ellipse 26% 18% at 22% 32%, rgba(187, 222, 170, 0.55) 0%, transparent 70%),
    radial-gradient(ellipse 18% 14% at 78% 70%, rgba(187, 222, 170, 0.45) 0%, transparent 70%),
    /* water (soft blue wash) */
    radial-gradient(ellipse 34% 22% at 70% 22%, rgba(186, 215, 235, 0.55) 0%, transparent 75%),
    /* base map color (OSM-like beige/cream) */
    #f1ede4;
  position: relative;
  overflow: hidden;
}

/* Subtle road grid */
.app-map-rich::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    repeating-linear-gradient(38deg,  transparent 0 70px, rgba(255, 255, 255, 0.7) 70px 72px, transparent 72px 74px),
    repeating-linear-gradient(128deg, transparent 0 90px, rgba(255, 255, 255, 0.55) 90px 91px),
    repeating-linear-gradient(-12deg, transparent 0 130px, rgba(255, 255, 255, 0.45) 130px 131px);
  opacity: 0.85;
}

.app-route-line {
  position: absolute;
  inset: 0;
  z-index: 2;
}

/* Default: a one-shot draw-in animation. The path appears to be drawn from
   start to end on first paint, then stays solid. Used by the hero map. */
.app-route-line path {
  stroke-dasharray: 1000;
  stroke-dashoffset: 1000;
  animation: drawRoute 2.5s 0.6s ease-out forwards;
}

@keyframes drawRoute {
  to { stroke-dashoffset: 0; }
}

/* .flow modifier: for maps that want a continuously animated route, like
   the Routes feature mockup. The HALO path stays as a static glow; the
   FOREGROUND blue path becomes a flowing-dash line that loops forever
   (the dashes literally march forward along the route, conveying active
   navigation without needing a marker dot). */
.app-route-line.flow path {
  /* override the default draw-in animation */
  animation: none;
}
.app-route-line.flow path:last-child {
  stroke-dasharray: 14 9;
  stroke-dashoffset: 0;
  animation: routeFlow 1.2s linear infinite;
}

@keyframes routeFlow {
  from { stroke-dashoffset: 0; }
  to   { stroke-dashoffset: -23; }   /* 14 dash + 9 gap = one full cycle */
}

/* Map waypoint pin: solid colored disk with a thick white ring and a soft
   drop shadow. No label content. The colored fill IS the marker.
   (Flex centering is kept so the static-spoof pulsing-pin variant, which
    overlays a white dot via ::after, still positions cleanly.) */
.app-route-pin {
  position: absolute;
  width: 22px; height: 22px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  border: 3px solid white;
  box-shadow:
    0 0 0 1px rgba(15, 23, 42, 0.10),
    0 4px 12px rgba(0, 0, 0, 0.30);
  z-index: 3;
  transform: translate(-50%, -50%);
  opacity: 0;
  animation: pinIn 0.4s ease-out forwards;
}
.app-route-pin.start { background: #10b981; animation-delay: 0.4s; }
.app-route-pin.mid   { background: #3b82f6; animation-delay: 1.4s; }
.app-route-pin.end   { background: #ef4444; animation-delay: 2.4s; }

@keyframes pinIn {
  from { opacity: 0; transform: translate(-50%, -50%) scale(0.5); }
  to   { opacity: 1; transform: translate(-50%, -50%) scale(1); }
}

/* Map overlay: bottom-left card matching real app .map-overlay */
.app-bottom-card {
  position: absolute;
  bottom: 16px;
  left: 16px;
  background: rgba(255, 255, 255, 0.98);
  backdrop-filter: blur(12px);
  -webkit-backdrop-filter: blur(12px);
  border: 1px solid #ebebea;
  border-radius: 10px;
  padding: 14px 16px;
  min-width: 260px;
  max-width: 320px;
  box-shadow: 0 12px 32px rgba(15, 23, 42, 0.18);
  z-index: 4;
  animation: cardIn 0.5s 1.2s cubic-bezier(0.2, 0.9, 0.3, 1.05) backwards;
}
@keyframes cardIn {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: translateY(0); }
}

.app-bottom-card-label {
  font-size: 11px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: #9c9c99;
  margin-bottom: 6px;
}
.app-bottom-card-coords {
  font-size: 15px;
  font-weight: 600;
  color: #2d2d2a;
  font-family: ui-monospace, "SF Mono", "Consolas", monospace;
  margin-bottom: 2px;
}
.app-bottom-card-place {
  font-size: 12.5px;
  color: #6b6b68;
  margin-bottom: 12px;
  line-height: 1.45;
}
.app-bottom-card-buttons { display: flex; gap: 6px; }
.app-bottom-card-btn {
  flex: 1;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  font-size: 13px;
  font-weight: 500;
  padding: 7px 14px;
  border-radius: 6px;
  text-align: center;
}
.app-bottom-card-btn.outline { background: #ffffff; color: #2d2d2a; border: 1px solid #ebebea; }
.app-bottom-card-btn.primary {
  background: #3b82f6;
  color: white;
  box-shadow: 0 1px 2px rgba(59, 130, 246, 0.2);
}

/* SPOOFING banner: bottom-center red gradient pill (matches real app .spoof-banner) */
.app-spoof-banner {
  position: absolute;
  bottom: 18px;
  left: 50%;
  transform: translateX(-50%);
  z-index: 5;
  display: inline-flex;
  align-items: center;
  gap: 12px;
  padding: 9px 18px 9px 14px;
  background: linear-gradient(135deg, #ef4444 0%, #dc2626 100%);
  color: #fff;
  border-radius: 100px;
  box-shadow:
    0 10px 28px rgba(220, 38, 38, 0.45),
    inset 0 0 0 1px rgba(255, 255, 255, 0.18);
  font-weight: 600;
  letter-spacing: 0.02em;
  white-space: nowrap;
  animation: spoofIn 0.5s 1.5s cubic-bezier(0.2, 0.9, 0.3, 1.1) backwards;
}
@keyframes spoofIn {
  from { opacity: 0; transform: translateX(-50%) translateY(12px) scale(0.95); }
  to   { opacity: 1; transform: translateX(-50%) translateY(0) scale(1); }
}
.app-spoof-banner-icon {
  position: relative;
  width: 18px; height: 18px;
  display: flex;
  align-items: center;
  justify-content: center;
  flex-shrink: 0;
}
.app-spoof-banner-icon::before {
  content: "";
  width: 8px; height: 8px;
  border-radius: 50%;
  background: #fff;
  box-shadow: 0 0 0 2px rgba(255, 255, 255, 0.25);
}
.app-spoof-banner-icon::after {
  content: "";
  position: absolute;
  inset: 0;
  border-radius: 50%;
  border: 2px solid rgba(255, 255, 255, 0.55);
  animation: spoofRing 1.8s cubic-bezier(0.2, 0.7, 0.3, 1) infinite;
}
@keyframes spoofRing {
  0%   { transform: scale(0.5);  opacity: 0.85; }
  100% { transform: scale(1.7);  opacity: 0; }
}
.app-spoof-banner-text {
  display: flex;
  flex-direction: column;
  line-height: 1.2;
}
.app-spoof-banner-title {
  font-size: 10px;
  font-weight: 700;
  letter-spacing: 0.1em;
  text-transform: uppercase;
  opacity: 0.9;
}
.app-spoof-banner-subtitle {
  font-size: 12.5px;
  font-weight: 600;
}

/* Locate button: matches real app .map-locate-btn (crosshair icon) */
.app-locate-btn {
  position: absolute;
  top: 12px; right: 12px;
  width: 36px; height: 36px;
  border-radius: 8px;
  background: #ffffff;
  border: 1px solid #d8d8d6;
  display: flex; align-items: center; justify-content: center;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
  z-index: 4;
}
.app-locate-btn::after {
  content: "";
  width: 18px; height: 18px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%232d2d2a' stroke-width='2' stroke-linecap='round' stroke-linejoin='round'><circle cx='12' cy='12' r='9'/><line x1='12' y1='2' x2='12' y2='5'/><line x1='12' y1='19' x2='12' y2='22'/><line x1='2' y1='12' x2='5' y2='12'/><line x1='19' y1='12' x2='22' y2='12'/><circle cx='12' cy='12' r='2.5' fill='%232d2d2a'/></svg>");
  background-repeat: no-repeat;
  background-position: center;
}

/* ===== COMPATIBILITY STRIP - solid white ===== */
.compat {
  padding: 64px 0 48px;
  text-align: center;
  background: var(--bg);
}

.compat-eyebrow {
  font-size: 12px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.12em;
  color: var(--text-muted);
  margin-bottom: 28px;
}

.compat-row {
  display: flex;
  justify-content: center;
  gap: 56px;
  flex-wrap: wrap;
  align-items: center;
  font-size: 14px;
  font-weight: 500;
  color: var(--text-secondary);
}

.compat-row span {
  display: inline-flex;
  align-items: center;
  gap: 8px;
}

.compat-row svg {
  width: 18px; height: 18px;
  color: var(--text-muted);
}

/* ===== FEATURE ROWS - solid white background, gentle off-screen tint ===== */
.feature-row {
  position: relative;
  padding: 100px 0;
  overflow: hidden;
  background: var(--bg);
}

.feature-row::before {
  content: "";
  position: absolute;
  inset: -20% -10%;
  z-index: 0;
  pointer-events: none;
  filter: blur(60px);
  opacity: 0.6;
}

.feature-row[data-tone="cyan"]::before {
  background:
    radial-gradient(ellipse 40% 50% at 90% 30%, rgba(20, 184, 166, 0.20) 0%, transparent 60%);
}

.feature-row[data-tone="sapphire"]::before {
  background:
    radial-gradient(ellipse 40% 50% at 10% 50%, rgba(59, 130, 246, 0.22) 0%, transparent 60%);
}

.feature-row[data-tone="orange"]::before {
  background:
    radial-gradient(ellipse 40% 50% at 90% 40%, rgba(249, 115, 22, 0.20) 0%, transparent 60%);
}

.feature-row[data-tone="pink"]::before {
  background:
    radial-gradient(ellipse 40% 50% at 10% 50%, rgba(236, 72, 153, 0.22) 0%, transparent 60%);
}

.feature-row[data-tone="violet"]::before {
  background:
    radial-gradient(ellipse 40% 50% at 90% 50%, rgba(139, 92, 246, 0.20) 0%, transparent 60%);
}

.feature-grid-2 {
  position: relative;
  z-index: 1;
  display: grid;
  grid-template-columns: 1fr 1fr;
  align-items: center;
  gap: 64px;
}

.feature-row.reverse .feature-text { order: 2; }
.feature-row.reverse .feature-visual { order: 1; }

@media (max-width: 880px) {
  .feature-grid-2 { grid-template-columns: 1fr; gap: 40px; }
  .feature-row.reverse .feature-text.feature-row.reverse .feature-visual { order: initial; }
}

.feature-text .eyebrow {
  display: inline-block;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--accent-hover);
  margin-bottom: 14px;
}

.feature-text h2 {
  font-size: clamp(28px, 3.6vw, 42px);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.1;
  margin-bottom: 18px;
  color: var(--ink);
}

.feature-text p {
  font-size: 17px;
  line-height: 1.6;
  color: var(--text-secondary);
  margin-bottom: 16px;
  max-width: 480px;
}

.feature-bullets {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 10px;
  margin: 18px 0 24px;
}

.feature-bullets li {
  position: relative;
  padding-left: 26px;
  font-size: 15px;
  color: var(--text-secondary);
  line-height: 1.5;
}

.feature-bullets li::before {
  content: "";
  position: absolute;
  left: 0; top: 8px;
  width: 14px; height: 14px;
  border-radius: 50%;
  background: var(--accent);
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' width='10' height='10' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='4' stroke-linecap='round' stroke-linejoin='round'><polyline points='20 6 9 17 4 12'/></svg>");
  background-size: 9px;
  background-position: center;
  background-repeat: no-repeat;
}

.feature-link {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 15px;
  font-weight: 600;
  color: var(--accent);
}

.feature-link::after {
  content: "→";
  transition: transform 0.15s;
}

.feature-link:hover::after { transform: translateX(3px); }

.feature-visual { position: relative; }

/* ===== STATIC SPOOF MOCKUP: search bar + pulsing pin ===== */
.app-search-bar {
  position: absolute;
  top: 12px;
  left: 12px;
  right: 60px;
  display: flex;
  align-items: center;
  gap: 8px;
  padding: 8px 12px;
  background: #ffffff;
  border: 1px solid #d8d8d6;
  border-radius: 8px;
  font-size: 12.5px;
  color: #2d2d2a;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
  z-index: 4;
}
.app-search-bar svg { flex-shrink: 0; }

.app-pin-pulse {
  position: absolute;
  width: 0; height: 0;
  z-index: 3;
}
.app-pin-pulse .app-route-pin {
  position: relative;
  transform: translate(-50%, -50%);
  width: 32px; height: 32px;
  font-size: 0;
  background: #ef4444;
  border: 4px solid #ffffff;
  box-shadow: 0 4px 14px rgba(239, 68, 68, 0.4);
  animation: none;
  opacity: 1;
}
.app-pin-pulse .app-route-pin::after {
  content: "";
  width: 8px; height: 8px;
  border-radius: 50%;
  background: #ffffff;
}
.app-pin-pulse-ring {
  position: absolute;
  top: 0; left: 0;
  width: 32px; height: 32px;
  border-radius: 50%;
  border: 2px solid rgba(239, 68, 68, 0.55);
  transform: translate(-50%, -50%);
  animation: pinPulse 2s cubic-bezier(0.2, 0.7, 0.3, 1) infinite;
  pointer-events: none;
}
.app-pin-pulse-ring:nth-child(2) { animation-delay: 1s; }
@keyframes pinPulse {
  0%   { opacity: 0.85; transform: translate(-50%, -50%) scale(0.6); }
  100% { opacity: 0;    transform: translate(-50%, -50%) scale(2.6); }
}

/* ===== MULTI-DEVICE MOCKUP ===== */
.mockup-multi-panel {
  background: #ffffff;
  padding: 22px 22px 18px;
  display: flex;
  flex-direction: column;
  height: 100%;
}
.mockup-multi-header {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 16px;
}
.mockup-multi-title {
  font-size: 14px;
  font-weight: 700;
  color: #1a1a17;
  letter-spacing: -0.01em;
}
.mockup-multi-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 11px;
  padding: 3px 10px 3px 8px;
  background: #ecfdf5;
  color: #047857;
  border-radius: 999px;
  font-weight: 600;
}
.mockup-multi-pill-dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  background: #10b981;
  animation: liveDot 2s infinite;
}
@keyframes liveDot {
  0%, 100% { opacity: 1; box-shadow: 0 0 0 0 rgba(16, 185, 129, 0.55); }
  60%      { opacity: 0.6; box-shadow: 0 0 0 4px rgba(16, 185, 129, 0); }
}

.mockup-devices {
  display: flex;
  flex-direction: column;
  gap: 8px;
  flex: 1;
}
.mockup-device {
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 11px 14px;
  background: #ffffff;
  border-radius: 10px;
  border: 1px solid #ebebea;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

/* iPhone-shaped device icon: matches real app .device-icon */
.mockup-device-iphone {
  width: 30px; height: 44px;
  border-radius: 6px;
  background: linear-gradient(135deg, #1f2937, #374151);
  position: relative;
  flex-shrink: 0;
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.05),
    0 4px 10px rgba(0, 0, 0, 0.15);
}
.mockup-device-iphone::before {
  content: "";
  position: absolute;
  top: 3px; left: 2.5px; right: 2.5px; bottom: 3px;
  border-radius: 3.5px;
  opacity: 0.9;
}
.mockup-device-iphone::after {
  content: "";
  position: absolute;
  top: 1.5px; left: 50%;
  width: 9px; height: 2.5px;
  border-radius: 2px;
  background: #000;
  transform: translateX(-50%);
}
.mockup-device-iphone.tone-blue::before  { background: linear-gradient(160deg, #3b82f6 0%, #1d4ed8 100%); }
.mockup-device-iphone.tone-pink::before  { background: linear-gradient(160deg, #f472b6 0%, #db2777 100%); }
.mockup-device-iphone.tone-green::before { background: linear-gradient(160deg, #34d399 0%, #059669 100%); }

/* Samsung Galaxy-shaped device icon: rounded body, centered punch-hole camera */
.mockup-device-android {
  width: 30px; height: 44px;
  border-radius: 7px;
  background: linear-gradient(135deg, #1a1a1c, #2a2a2c);
  position: relative;
  flex-shrink: 0;
  box-shadow:
    inset 0 0 0 1px rgba(255, 255, 255, 0.06),
    0 4px 10px rgba(0, 0, 0, 0.18);
}
.mockup-device-android::before {
  content: "";
  position: absolute;
  top: 2.5px; left: 2px; right: 2px; bottom: 2.5px;
  border-radius: 4.5px;
  opacity: 0.92;
}
.mockup-device-android::after {
  /* Punch-hole camera (centered top dot) */
  content: "";
  position: absolute;
  top: 4.5px; left: 50%;
  width: 3px; height: 3px;
  border-radius: 50%;
  background: #000;
  transform: translateX(-50%);
  box-shadow: 0 0 0 0.5px rgba(255, 255, 255, 0.05);
}
.mockup-device-android.tone-graphite::before {
  background: linear-gradient(160deg, #4b5563 0%, #1f2937 100%);
}
.mockup-device-android.tone-violet::before {
  background: linear-gradient(160deg, #8b5cf6 0%, #5b21b6 100%);
}
.mockup-device-android.tone-amber::before {
  background: linear-gradient(160deg, #fbbf24 0%, #d97706 100%);
}

/* Platform tag chip next to a device name */
.mockup-platform-tag {
  display: inline-block;
  margin-left: 6px;
  padding: 1px 7px;
  background: #f4f4f2;
  color: #6b6b68;
  border: 1px solid #e6e6e4;
  border-radius: 999px;
  font-size: 9.5px;
  font-weight: 600;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  vertical-align: middle;
}

.mockup-device-text { flex: 1; min-width: 0; }
.mockup-device-name {
  font-size: 13px;
  font-weight: 600;
  color: #1a1a17;
  white-space: nowrap;
  overflow: hidden;
  text-overflow: ellipsis;
}
.mockup-device-meta {
  font-size: 11px;
  color: #6b6b68;
  margin-top: 1px;
}

.mockup-loc-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  padding: 4px 10px;
  background: #f4f4f2;
  border-radius: 999px;
  font-size: 11px;
  color: #2d2d2a;
  font-weight: 500;
  white-space: nowrap;
  flex-shrink: 0;
}
.mockup-loc-pill .dot {
  width: 6px; height: 6px;
  border-radius: 50%;
  flex-shrink: 0;
}
.mockup-loc-pill .dot.red   { background: #ef4444; }
.mockup-loc-pill .dot.blue  { background: #3b82f6; }
.mockup-loc-pill .dot.green { background: #10b981; }

.mockup-live-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  background: #10b981;
  flex-shrink: 0;
  animation: liveDot 2s infinite;
}
.mockup-device:nth-child(2) .mockup-live-dot { animation-delay: 0.4s; }
.mockup-device:nth-child(3) .mockup-live-dot { animation-delay: 0.8s; }

.mockup-multi-footer {
  margin-top: 14px;
  padding-top: 14px;
  border-top: 1px solid #ebebea;
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 12px;
  color: #6b6b68;
}
.mockup-multi-footer strong { color: #1a1a17; font-weight: 700; }
.mockup-multi-badge {
  display: inline-flex;
  align-items: center;
  padding: 3px 10px;
  background: linear-gradient(135deg, #fef3c7 0%, #fde68a 100%);
  color: #92400e;
  border-radius: 999px;
  font-size: 10.5px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
}

/* ===== PINDRIFTBOX MOCKUP: animated Pi to iPhone with flowing dots ===== */
.mockup-box-panel {
  background: #ffffff;
  padding: 22px 22px 18px;
  display: flex;
  flex-direction: column;
  height: 100%;
}

.mockup-box {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 22px 8px;
  flex: 1;
  justify-content: center;
}

/* The Pi unit */
.mockup-pi {
  width: 88px; height: 110px;
  border-radius: 14px;
  background: linear-gradient(160deg, #1f2937 0%, #111827 100%);
  position: relative;
  flex-shrink: 0;
  box-shadow: 0 14px 30px rgba(0, 0, 0, 0.22);
}
.mockup-pi::before {
  content: "";
  position: absolute;
  inset: 10px 14px;
  border-radius: 7px;
  background: linear-gradient(135deg, #064e3b 0%, #022c22 100%);
  box-shadow: inset 0 0 0 1px rgba(255, 255, 255, 0.04);
}
.mockup-pi::after {
  content: "Pi";
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: rgba(255, 255, 255, 0.62);
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
}
/* Status LED on the Pi */
.mockup-pi-led {
  position: absolute;
  top: 14px; right: 22px;
  width: 6px; height: 6px;
  border-radius: 50%;
  background: #10b981;
  box-shadow: 0 0 6px rgba(16, 185, 129, 0.8);
  animation: liveDot 2s infinite;
  z-index: 2;
}

/* Wireless waves emanating to the right of the Pi */
.mockup-wifi {
  position: absolute;
  top: 50%; right: -8px;
  width: 22px; height: 22px;
  border-radius: 50%;
  border: 2px solid rgba(59, 130, 246, 0.6);
  border-color: transparent rgba(59, 130, 246, 0.55) transparent transparent;
  transform: translateY(-50%) scale(0.6);
  opacity: 0;
  animation: wifiWave 1.8s ease-out infinite;
  pointer-events: none;
}
.mockup-wifi-2 { animation-delay: 0.6s; }
.mockup-wifi-3 { animation-delay: 1.2s; }
@keyframes wifiWave {
  0%   { opacity: 0;    transform: translateY(-50%) scale(0.4); }
  20%  { opacity: 0.85; }
  100% { opacity: 0;    transform: translateY(-50%) scale(2.6); }
}

/* The flow channel between Pi and iPhone: track + animated dots */
.mockup-flow {
  position: relative;
  flex: 1;
  height: 32px;
  display: flex;
  align-items: center;
  min-width: 60px;
}
.mockup-flow-track {
  position: absolute;
  left: 0; right: 0; top: 50%;
  height: 2px;
  background: linear-gradient(90deg,
    rgba(59, 130, 246, 0.2) 0%,
    rgba(59, 130, 246, 0.5) 50%,
    rgba(59, 130, 246, 0.2) 100%);
  transform: translateY(-50%);
  border-radius: 2px;
}
.mockup-flow-dot {
  position: absolute;
  top: 50%;
  width: 8px; height: 8px;
  border-radius: 50%;
  background: #3b82f6;
  box-shadow: 0 0 10px rgba(59, 130, 246, 0.6);
  transform: translate(-50%, -50%);
  animation: flowDot 1.5s linear infinite;
}
@keyframes flowDot {
  0%   { left: 0%;    opacity: 0; }
  10%  { opacity: 1; }
  90%  { opacity: 1; }
  100% { left: 100%;  opacity: 0; }
}

/* The iPhone receiving the spoof */
.mockup-iphone {
  width: 60px; height: 110px;
  border-radius: 14px;
  background: linear-gradient(160deg, #1f2937 0%, #0f172a 100%);
  position: relative;
  flex-shrink: 0;
  box-shadow: 0 14px 30px rgba(0, 0, 0, 0.22);
}
.mockup-iphone::before {
  content: "";
  position: absolute;
  inset: 7px;
  border-radius: 8px;
  background:
    radial-gradient(circle at 50% 38%, rgba(239, 68, 68, 0.25) 0%, transparent 55%),
    linear-gradient(180deg, #fafaf9 0%, #f4f4f2 100%);
}
.mockup-iphone::after {
  content: "";
  position: absolute;
  top: 42%; left: 50%;
  width: 10px; height: 10px;
  border-radius: 50%;
  background: #ef4444;
  transform: translate(-50%, -50%);
  box-shadow:
    0 0 0 2.5px #ffffff,
    0 0 0 5px rgba(239, 68, 68, 0.35),
    0 2px 8px rgba(239, 68, 68, 0.45);
  animation: phonePinPulse 1.8s ease-out infinite;
}
@keyframes phonePinPulse {
  0%, 100% {
    box-shadow:
      0 0 0 2.5px #ffffff,
      0 0 0 5px rgba(239, 68, 68, 0.35),
      0 2px 8px rgba(239, 68, 68, 0.45);
  }
  50% {
    box-shadow:
      0 0 0 2.5px #ffffff,
      0 0 0 14px rgba(239, 68, 68, 0),
      0 2px 8px rgba(239, 68, 68, 0.45);
  }
}

.mockup-box-stats {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 8px;
  margin-top: 4px;
  border-top: 1px solid #ebebea;
  padding-top: 14px;
}
.mockup-box-stat .lbl {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: #9c9c99;
  font-weight: 600;
  margin-bottom: 3px;
}
.mockup-box-stat .val {
  font-size: 12.5px;
  font-weight: 600;
  color: #1a1a17;
}

/* ===== HOW WE WORK / COMMITMENTS ===== */
.honest {
  padding: 120px 0;
  background: var(--bg);
}

.commitments-grid {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  max-width: 1080px;
  margin: 48px auto 0;
}

@media (max-width: 880px) {
  .commitments-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 600px) {
  .commitments-grid { grid-template-columns: 1fr; }
}

/* BRT02-A commitment cards: solid bg, 1.5px hard border, 3px offset
   shadow, no translate-on-hover, no gradients. Hover swells the
   hard offset shadow from 3 -> 6 px and darkens the border to ink
   (classic neo-brutalist "lift toward shadow" effect). Click
   collapses the shadow to 1 px for a pressed-into-surface
   feedback. The interior icon's shadow swells in lockstep with
   the parent card. */
.commitment-card {
  position: relative;
  padding: 28px 26px;
  background: var(--bg);
  border-radius: var(--radius-lg);
  border: 1.5px solid var(--border);
  box-shadow: var(--shadow-md);
  transition:
    box-shadow 0.22s cubic-bezier(0.32, 1.28, 0.40, 1.00),
    border-color 0.18s ease,
    filter 0.18s ease;
  cursor: default;
}

.commitment-card:hover {
  border-color: var(--ink);
  box-shadow: 6px 6px 0 var(--shadow-color);
  filter: brightness(0.985);
}

.commitment-card:active {
  box-shadow: 1px 1px 0 var(--shadow-color);
  transition:
    box-shadow 0.08s ease,
    border-color 0.08s ease;
}

/* Icon: solid ink slab, white glyph. Matches the brand-logo
   square, OS-button, and other monochrome chip patterns. Hover
   on the parent card grows the icon shadow from 2 -> 4 px so
   the icon visually "lifts" alongside the card. */
.commitment-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px;
  height: 44px;
  border-radius: var(--radius);
  margin-bottom: 18px;
  color: var(--bg);
  background: var(--ink);
  border: 1.5px solid var(--ink);
  box-shadow: var(--shadow-sm);
  transition: box-shadow 0.22s cubic-bezier(0.32, 1.28, 0.40, 1.00);
}

.commitment-card:hover .commitment-icon {
  box-shadow: var(--shadow-lg);
}

.commitment-card:active .commitment-icon {
  box-shadow: 0 0 0 var(--shadow-color);
  transition: box-shadow 0.08s ease;
}

/* Heading slides over to the right slightly on hover - micro-cue
   that pairs with the shadow swell. Using margin-left (not
   transform) keeps the no-translate-on-hover BRT02-A rule intact. */
.commitment-card h3 {
  transition: margin-left 0.22s cubic-bezier(0.32, 1.28, 0.40, 1.00);
}
.commitment-card:hover h3 {
  margin-left: 4px;
}

.commitment-card h3 {
  font-size: 16.5px;
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -0.01em;
  margin-bottom: 8px;
}

.commitment-card p {
  font-size: 14px;
  color: var(--text-secondary);
  line-height: 1.6;
  margin: 0;
}

/* ===== DEV NOTE CALLOUT (PinDriftBox page) ===== */
.dev-note {
  max-width: 760px;
  margin: 0 auto;
  padding: 24px 28px;
  background: linear-gradient(180deg, #fafaf9 0%, #ffffff 100%);
  border: 1px solid var(--border);
  border-left: 3px solid #FF6B35;
  border-radius: 12px;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}
.dev-note-eyebrow {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--ink);
  margin-bottom: 10px;
}
.dev-note-eyebrow::before {
  content: "";
  width: 14px; height: 14px;
  border-radius: 4px;
  background: linear-gradient(135deg, #2d2d2a, #0f0f0e);
  box-shadow: 0 1px 3px rgba(15, 23, 42, 0.35);
}
.dev-note h3 {
  font-size: 17px;
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -0.01em;
  margin-bottom: 8px;
}
.dev-note p {
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--text-muted);
  margin-bottom: 8px;
}
.dev-note p:last-child { margin-bottom: 0; }
.dev-note p strong { color: var(--ink); font-weight: 600; }
/* Sincerely / Dev sign-off. Italic + slightly muted, top hairline so
   it reads as a signature block separate from the body paragraphs. */
.dev-note p.dev-note-sign {
  margin-top: 18px;
  padding-top: 14px;
  border-top: 1.5px solid var(--border);
  font-style: italic;
  color: var(--text);
  font-size: 14px;
  line-height: 1.6;
}
.dev-note p code {
  font-family: ui-monospace, "SF Mono", "Consolas", monospace;
  font-size: 13px;
  padding: 2px 6px;
  background: rgba(15, 23, 42, 0.05);
  border: 1px solid rgba(15, 23, 42, 0.12);
  border-radius: 4px;
  color: var(--ink);
}
.dev-note .signoff {
  font-size: 13px;
  color: #6b6b68;
  margin-top: 12px;
  font-style: italic;
}

/* ===== .dev-note-tech modifier =====
   Strips down the dev-note's text formatting so the body reads like a
   raw engineering note. Monospace, no muted color, no inline-code pills,
   no <strong> tints. The card chrome (border, eyebrow, heading) stays so
   the section still anchors visually. */
.dev-note.dev-note-tech p {
  font-family: ui-monospace, "SF Mono", "Consolas", monospace;
  font-size: 13px;
  line-height: 1.65;
  color: var(--ink);
  margin: 0 0 12px;
}
.dev-note.dev-note-tech p:last-child { margin-bottom: 0; }
.dev-note.dev-note-tech p strong.dev-note.dev-note-tech p code {
  font-weight: inherit;
  font-family: inherit;
  background: none;
  border: 0;
  padding: 0;
  color: inherit;
}

/* ===== SECTION HEADERS ===== */
.section-header {
  text-align: center;
  max-width: 720px;
  margin: 0 auto 56px;
}

.section-eyebrow {
  display: inline-block;
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--accent-hover);
  margin-bottom: 14px;
}

.section-title {
  font-size: clamp(30px, 4.4vw, 44px);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.1;
  margin-bottom: 16px;
  color: var(--ink);
}

.section-sub {
  font-size: 18px;
  color: var(--text-secondary);
  line-height: 1.55;
}

/* ===== PRICING - solid white. The dark zone handles its own fade. ===== */
.pricing-section {
  padding: 120px 0 140px;
  background: var(--bg);
}

/* ===== TRIAL STRIP: sits above the main pricing cards ===== */
.trial-strip {
  display: flex;
  align-items: center;
  gap: 24px;
  padding: 22px 28px;
  margin: 0 auto 28px;
  max-width: 760px;
  background: linear-gradient(135deg,
    rgba(59, 130, 246, 0.05) 0%,
    rgba(99, 102, 241, 0.05) 100%);
  border: 1px solid rgba(59, 130, 246, 0.22);
  border-radius: 14px;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

.trial-strip-content { flex: 1; min-width: 0; }

.trial-strip-eyebrow {
  display: inline-block;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: #4338ca;
  background: rgba(67, 56, 202, 0.10);
  padding: 3px 10px;
  border-radius: 999px;
  margin-bottom: 8px;
}

.trial-strip-title {
  font-size: 17px;
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -0.01em;
  margin-bottom: 4px;
}

.trial-strip-sub {
  font-size: 13.5px;
  color: var(--text-muted);
  line-height: 1.5;
}

.trial-strip-cta {
  flex-shrink: 0;
  white-space: nowrap;
}

@media (max-width: 720px) {
  .trial-strip {
    flex-direction: column;
    align-items: flex-start;
    gap: 14px;
    padding: 20px 22px;
  }
  .trial-strip-cta { width: 100%; text-align: center; justify-content: center; }
}

.pricing-cards {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
  gap: 22px;
  max-width: 1080px;
  margin: 0 auto;
}

.price-card {
  padding: 32px 28px;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  background: var(--bg);
  display: flex;
  flex-direction: column;
  position: relative;
  transition: border-color 0.15s, box-shadow 0.15s, transform 0.15s;
}

.price-card:hover {
  border-color: var(--border-strong);
  box-shadow: var(--shadow-md);
  transform: translateY(-2px);
}

.price-card.featured {
  border-color: var(--ink);
  border-width: 2px;
  background: linear-gradient(180deg, #fafafa 0%, white 50%);
}

.price-card .badge {
  position: absolute;
  top: -12px;
  left: 50%;
  transform: translateX(-50%);
  background: var(--ink);
  color: var(--bg);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  padding: 4px 12px;
  border-radius: 999px;
  text-transform: uppercase;
}

.price-name { font-size: 14px; font-weight: 700; color: var(--text-secondary); margin-bottom: 14px; }
.price-amount { font-size: 42px; font-weight: 800; letter-spacing: -0.03em; line-height: 1; margin-bottom: 6px; color: var(--ink); }
.price-amount .per { font-size: 16px; font-weight: 500; color: var(--text-muted); }
.price-amount .strike { font-size: 18px; font-weight: 500; color: var(--text-faint); text-decoration: line-through; margin-left: 8px; }
/* Cadence suffix next to a price ("/month", "/once") - smaller, lighter,
   sits on the baseline of the big number so the eye reads "$4" before
   "/month". Used on the Monthly / Lifetime / PinDriftBox cards. */
.price-amount .price-cadence {
  font-size: 15px;
  font-weight: 500;
  color: var(--text-muted);
  letter-spacing: 0;
  margin-left: 4px;
}

/* 3-column variant of .pricing-cards. Default .pricing-cards auto-fits
   to whatever space is available; .pricing-cards-3 just gives it a wider
   max-width and pins gap so three cards line up cleanly on desktop and
   stack neatly under 880px. */
.pricing-cards-3 {
  grid-template-columns: repeat(3, minmax(0, 1fr));
  gap: 18px;
}
@media (max-width: 880px) {
  .pricing-cards-3 { grid-template-columns: 1fr; gap: 16px; }
}
/* 4-column variant: Free Trial + Monthly + Yearly + Lifetime.
   Tighter gap than the 3-col variant so 4 cards breathe in ~1240px.
   Stacks to single-column under 1024px (two-up would crowd the
   labels on tablet portrait). */
.pricing-cards-4 {
  grid-template-columns: repeat(4, minmax(0, 1fr));
  gap: 16px;
}
@media (max-width: 1024px) {
  .pricing-cards-4 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 14px; }
}
@media (max-width: 640px) {
  .pricing-cards-4 { grid-template-columns: 1fr; gap: 14px; }
}
.price-tagline { font-size: 14px; color: var(--text-muted); margin-bottom: 12px; line-height: 1.5; }
/* Founder note on the Monthly card. Sits between tagline and features
   with a hard 1.5px top + bottom rule to mark it as an aside, not a
   feature. Italic so it reads as a voice annotation, not boilerplate. */
.price-note {
  font-size: 12px;
  font-style: italic;
  color: var(--text-secondary);
  margin: 0 0 20px;
  padding: 10px 0;
  border-top: 1.5px solid var(--border);
  border-bottom: 1.5px solid var(--border);
  line-height: 1.5;
}
.price-note strong {
  font-style: normal;
  font-weight: 700;
  letter-spacing: 0.01em;
  color: var(--text);
}
.price-features { list-style: none; margin-bottom: 28px; flex: 1; display: flex; flex-direction: column; gap: 10px; }
.price-features li { position: relative; padding-left: 24px; font-size: 14px; color: var(--text-secondary); line-height: 1.5; }
.price-features li::before { content: "✓"; position: absolute; left: 0; top: 0; color: var(--accent); font-weight: 700; }
.price-card .btn { width: 100%; justify-content: center; }

/* ===== COMPLIANCE - clean light background, no dark zone ===== */
.compliance {
  padding: 100px 0;
  position: relative;
  background: var(--bg-soft);
  color: var(--ink);
  border-top: 1px solid var(--border);
  border-bottom: 1px solid var(--border);
}

.compliance-inner {
  max-width: 940px;
  margin: 0 auto;
  text-align: center;
}

.compliance-icon {
  display: inline-flex;
  width: 76px;
  height: 76px;
  border-radius: 22px;
  background:
    linear-gradient(135deg, rgba(220, 38, 38, 0.10) 0%, rgba(185, 28, 28, 0.10) 100%);
  border: 1px solid rgba(220, 38, 38, 0.20);
  align-items: center;
  justify-content: center;
  margin-bottom: 26px;
  color: #dc2626;
  box-shadow:
    0 8px 22px rgba(220, 38, 38, 0.10),
    inset 0 1px 0 rgba(255, 255, 255, 0.6);
}

.compliance-eyebrow {
  display: inline-block;
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: #dc2626;
  margin-bottom: 14px;
}

/* Inline header: icon + eyebrow side by side, vertically centered together */
.compliance-header {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  margin-bottom: 18px;
}

.compliance-header .compliance-icon {
  width: 48px;
  height: 48px;
  border-radius: 14px;
  margin-bottom: 0;
  flex-shrink: 0;
}

.compliance-header .compliance-icon svg {
  width: 22px;
  height: 22px;
}

.compliance-header .compliance-eyebrow {
  margin-bottom: 0;
  line-height: 1;
}

.compliance h3 {
  font-size: clamp(28px, 3.6vw, 38px);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.15;
  color: var(--ink);
  margin-bottom: 12px;
}

.compliance > .container > .compliance-inner > p:not(.compliance-footnote) {
  font-size: 16px;
  line-height: 1.6;
  color: var(--text-muted);
  max-width: 640px;
  margin: 0 auto 36px;
}

.compliance-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 18px;
  margin: 36px auto 28px;
  max-width: 880px;
  text-align: left;
}

@media (max-width: 720px) {
  .compliance-grid { grid-template-columns: 1fr; }
}

.compliance-card {
  position: relative;
  background: #ffffff;
  border: 1px solid var(--border);
  border-radius: 18px;
  padding: 28px 30px;
  overflow: hidden;
  box-shadow: 0 4px 14px rgba(15, 23, 42, 0.04);
}

.compliance-card::before {
  content: "";
  position: absolute;
  top: 0; left: 18px; right: 18px;
  height: 2px;
  border-radius: 0 0 4px 4px;
}

.compliance-card.allow {
  border-color: rgba(16, 185, 129, 0.22);
  background: linear-gradient(180deg, rgba(16, 185, 129, 0.04) 0%, #ffffff 100%);
}
.compliance-card.allow::before { background: linear-gradient(90deg, transparent 0%, rgba(16, 185, 129, 0.55) 50%, transparent 100%); }

.compliance-card.deny {
  border-color: rgba(220, 38, 38, 0.24);
  background: linear-gradient(180deg, rgba(220, 38, 38, 0.05) 0%, #ffffff 100%);
}
.compliance-card.deny::before { background: linear-gradient(90deg, transparent 0%, rgba(220, 38, 38, 0.6) 50%, transparent 100%); }

.compliance-card-eyebrow {
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  margin-bottom: 16px;
  display: flex;
  align-items: center;
  gap: 8px;
}

.compliance-card.allow .compliance-card-eyebrow { color: #059669; }
.compliance-card.deny  .compliance-card-eyebrow { color: #dc2626; }

.compliance-card-eyebrow .badge {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 18px; height: 18px;
  border-radius: 50%;
  font-size: 11px;
  font-weight: 700;
}

.compliance-card.allow .badge { background: rgba(16, 185, 129, 0.14); color: #059669; }
.compliance-card.deny  .badge { background: rgba(220, 38, 38, 0.14); color: #dc2626; }

.compliance-card ul {
  list-style: none;
  display: flex;
  flex-direction: column;
  gap: 10px;
}

.compliance-card li {
  position: relative;
  padding-left: 22px;
  font-size: 14px;
  line-height: 1.55;
  color: #3f3f46;
}

.compliance-card.allow li::before {
  content: "✓";
  position: absolute;
  left: 0; top: -1px;
  color: #059669;
  font-weight: 700;
  font-size: 14px;
}

.compliance-card.deny li::before {
  content: "✗";
  position: absolute;
  left: 0; top: -1px;
  color: #dc2626;
  font-weight: 700;
  font-size: 14px;
}

.compliance-footnote {
  margin-top: 32px;
  font-size: 13.5px;
  line-height: 1.55;
  color: var(--text-muted);
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
}

.compliance-footnote a { color: #4f46e5; font-weight: 500; }
.compliance-footnote a:hover { color: #6366f1; }

/* ===== FINAL CTA - clean light background, no dark zone ===== */
.cta-final {
  padding: 100px 0;
  position: relative;
  text-align: center;
  background: var(--bg);
  color: var(--ink);
  border-top: 1px solid var(--border);
}

/* Avoid double-border when cta-final immediately follows compliance */
.compliance + .cta-final { border-top: 0; }

.cta-final h2 {
  font-size: clamp(32px, 4.6vw, 52px);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.1;
  margin-bottom: 20px;
  color: var(--ink);
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
}

.cta-final p {
  font-size: 18px;
  color: var(--text-muted);
  max-width: 580px;
  margin: 0 auto 32px;
}

/* ===== WAITLIST FORM (PinDriftBox CTA) ===== */
.waitlist-form {
  display: flex;
  align-items: stretch;
  gap: 6px;
  max-width: 480px;
  margin: 0 auto 14px;
  padding: 6px;
  background: #ffffff;
  border: 1px solid var(--border);
  border-radius: 100px;
  box-shadow: 0 4px 14px rgba(15, 23, 42, 0.04);
}
.waitlist-input {
  flex: 1;
  min-width: 0;
  border: 0;
  outline: none;
  background: transparent;
  padding: 10px 18px;
  font-family: inherit;
  font-size: 15px;
  color: var(--ink);
  border-radius: 100px;
}
.waitlist-input::placeholder { color: var(--text-muted); }
.waitlist-input[aria-invalid="true"] { box-shadow: inset 0 0 0 2px #fecaca; }
.waitlist-form .btn {
  border-radius: 100px;
  padding: 10px 22px;
  font-size: 14px;
  white-space: nowrap;
}
.waitlist-disclaimer {
  font-size: 13px;
  color: var(--text-muted);
  margin-top: 0;
  margin-bottom: 0;
  max-width: 480px;
}
.waitlist-success {
  max-width: 520px;
  margin: 0 auto;
  padding: 16px 22px;
  background: #ecfdf5;
  color: #047857;
  border: 1px solid rgba(16, 185, 129, 0.28);
  border-radius: 14px;
  font-weight: 500;
  font-size: 15px;
  text-align: center;
}
@media (max-width: 540px) {
  .waitlist-form {
    flex-direction: column;
    border-radius: 18px;
    padding: 10px;
  }
  .waitlist-input { padding: 12px 14px; }
  .waitlist-form .btn { border-radius: 12px; padding: 12px 22px; }
}

/* ===== FAQ ACCORDION - BRT02-A =====================================
   Each .faq-item is a <div> (not <details>) so there's no UA stylesheet
   fighting our CSS. A <button class="faq-summary"> toggles the .is-open
   class on the parent .faq-item; the answer wrap animates via
   grid-template-rows 0fr -> 1fr (animates to actual content height,
   so timing matches any answer length and easing curve feels uniform). */
.faq-list {
  margin-top: 28px;
  border-top: 1.5px solid var(--border);
}
.faq-item {
  border-bottom: 1.5px solid var(--border);
}

.faq-summary {
  width: 100%;
  border: 0;
  background: transparent;
  cursor: pointer;
  padding: 22px 0;
  font-size: 16px;
  font-weight: 700;
  letter-spacing: -0.005em;
  font-family: inherit;
  color: var(--text);
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 16px;
  text-align: left;
  transition: opacity 0.15s ease;
}

/* The plus icon. Drawn as a hard 18x18 SVG that rotates 45deg into
   an X when the item is open. */
.faq-summary::after {
  content: "";
  flex-shrink: 0;
  width: 18px;
  height: 18px;
  background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='black' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='12' y1='5' x2='12' y2='19'/><line x1='5' y1='12' x2='19' y2='12'/></svg>");
  background-repeat: no-repeat;
  background-position: center;
  transition: transform 0.32s cubic-bezier(0.32, 1.28, 0.40, 1.00);
}
@media (prefers-color-scheme: dark) {
  html:not([data-pindrift-theme="light"]) {

  .faq-summary::after {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='12' y1='5' x2='12' y2='19'/><line x1='5' y1='12' x2='19' y2='12'/></svg>");
  }

  }
}

/* Manual dark override (OS may be light) , same patches as the @media block above, scoped to manual choice. */
html[data-pindrift-theme="dark"] {

  .faq-summary::after {
    background-image: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='white' stroke-width='2.5' stroke-linecap='round' stroke-linejoin='round'><line x1='12' y1='5' x2='12' y2='19'/><line x1='5' y1='12' x2='19' y2='12'/></svg>");
  }

}
.faq-item.is-open .faq-summary::after { transform: rotate(45deg); }
.faq-summary:hover { opacity: 0.65; }
.faq-summary:focus-visible {
  outline: 1.5px solid var(--ink);
  outline-offset: 3px;
}

/* The height-animating wrapper.
   Uses CSS grid-template-rows 0fr <-> 1fr so the transition runs against
   the actual rendered content height. With max-height: 0 <-> 800px the
   easing curve was applied across the full 800px range, which made
   shorter answers feel laggy on open and choppy on close. The grid trick
   needs the inner .faq-answer to have min-height: 0 + overflow: hidden so
   the grid cell can actually shrink below the child's intrinsic height. */
.faq-answer-wrap {
  display: grid;
  grid-template-rows: 0fr;
  transition: grid-template-rows 0.34s cubic-bezier(0.22, 0.9, 0.3, 1.02);
}
.faq-item.is-open .faq-answer-wrap {
  grid-template-rows: 1fr;
}

.faq-answer {
  overflow: hidden;
  min-height: 0;
  padding: 0;
  transition: padding-bottom 0.34s cubic-bezier(0.22, 0.9, 0.3, 1.02);
}
.faq-item.is-open .faq-answer {
  padding-bottom: 24px;
}
.faq-answer p {
  font-size: 15px;
  color: var(--text-secondary);
  line-height: 1.65;
  margin-bottom: 10px;
}
.faq-answer p:last-child { margin-bottom: 0; }
.faq-answer a {
  color: var(--text);
  text-decoration: underline;
  text-decoration-thickness: 1.5px;
  text-underline-offset: 3px;
}
.faq-answer a:hover { opacity: 0.65; }

@media (prefers-reduced-motion: reduce) {
  .faq-answer-wrap,
  .faq-answer,
  .faq-summary::after { transition: none; }
}

/* ===== FOOTER ===== */
.site-footer {
  padding: 64px 0 32px;
  border-top: 1px solid var(--border);
  background: var(--bg);
}

.footer-grid {
  display: grid;
  grid-template-columns: 1.6fr 1fr 1fr 1fr;
  gap: 40px;
  margin-bottom: 48px;
}

@media (max-width: 880px) { .footer-grid { grid-template-columns: 1fr 1fr; } }

.footer-col h4 {
  font-size: 12px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  margin-bottom: 16px;
}

.footer-col ul { list-style: none; display: flex; flex-direction: column; gap: 10px; }
.footer-col li { font-size: 14px; }
.footer-col a { color: var(--text-secondary); }
.footer-col a:hover { color: var(--ink); }

.footer-brand p {
  margin-top: 14px;
  font-size: 14px;
  color: var(--text-muted);
  max-width: 280px;
  line-height: 1.5;
}

.country-chip {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  margin-top: 14px;
  padding: 4px 10px;
  background: white;
  border: 1px solid var(--border);
  border-radius: 999px;
  font-size: 12px;
  font-weight: 500;
  color: var(--text-secondary);
}

.country-chip .flag {
  width: 16px; height: 12px;
  border-radius: 2px;
  background:
    linear-gradient(
      to bottom,
      #B22234 0%, #B22234 14.28%,
      #ffffff 14.28%, #ffffff 28.57%,
      #B22234 28.57%, #B22234 42.85%,
      #ffffff 42.85%, #ffffff 57.14%,
      #B22234 57.14%, #B22234 71.42%,
      #ffffff 71.42%, #ffffff 85.71%,
      #B22234 85.71%, #B22234 100%
    );
  display: inline-block;
  flex-shrink: 0;
  position: relative;
  overflow: hidden;
}

.country-chip .flag::before {
  content: "";
  position: absolute;
  top: 0; left: 0;
  width: 7px; height: 6px;
  background: #3C3B6E;
}

.footer-bottom {
  border-top: 1px solid var(--border);
  padding-top: 24px;
  display: flex;
  justify-content: space-between;
  align-items: flex-start;
  flex-wrap: wrap;
  gap: 12px;
  font-size: 13px;
  color: var(--text-muted);
}

/* Inline code blocks inside docs prose. Used by smartscreen.html for the
   PowerShell + sha256sum verification commands. */
.docs-code {
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 14px 16px;
  font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace;
  font-size: 13.5px;
  line-height: 1.5;
  overflow-x: auto;
  color: var(--ink);
  white-space: pre;
  margin: 12px 0;
}

/* Docs landing page overview list - one-line-per-page summary on dev/index.html */
.docs-overview-list {
  list-style: none;
  padding: 0;
  margin: 16px 0 0;
  display: flex;
  flex-direction: column;
  gap: 14px;
}

.docs-overview-list > li {
  padding: 18px 20px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 12px;
  font-size: 15px;
  line-height: 1.55;
  color: var(--text-secondary);
  transition: border-color 120ms ease, background 120ms ease;
}

.docs-overview-list > li:hover {
  border-color: var(--ink);
  background: var(--bg);
}

.docs-overview-list > li a {
  color: var(--ink);
  text-decoration: none;
}

.docs-overview-list > li a:hover {
  text-decoration: underline;
}

/* Left side of the footer-bottom strip: copyright on top, legal links on
   the next line. Stacks vertically with a small gap so the legal links
   read as a secondary row under the © notice. */
.footer-bottom-left {
  display: flex;
  flex-direction: column;
  gap: 6px;
  min-width: 0;
}

.footer-legal-links {
  font-size: 12.5px;
  color: var(--text-muted);
}

.footer-legal-links a {
  color: var(--text-muted);
  text-decoration: none;
  transition: color 120ms ease;
}

.footer-legal-links a:hover {
  color: var(--ink);
  text-decoration: underline;
}

@media (max-width: 720px) {
  .footer-bottom { flex-direction: column; align-items: stretch; }
  .footer-bottom > span[style] { text-align: left !important; }
}

/* ===== INNER PAGE - same solid white treatment ===== */
.page-header {
  padding: 24px 0 80px;
  margin-top: -68px;
  text-align: center;
  position: relative;
  overflow: hidden;
  background: var(--bg);
}

.page-header > .container { padding-top: 160px; position: relative; z-index: 1; }

.page-header::before {
  content: "";
  position: absolute;
  inset: 0;
  background:
    radial-gradient(ellipse 140% 90% at 50% -40%,
      rgba(59, 130, 246, 0.10) 0%,
      rgba(59, 130, 246, 0.04) 30%,
      transparent 70%);
  pointer-events: none;
  z-index: 0;
}

.page-header > * { position: relative; }

.page-header h1 {
  font-size: clamp(36px, 5vw, 56px);
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1.05;
  margin-bottom: 18px;
  color: var(--ink);
}

.page-header p {
  font-size: 18px;
  color: var(--text-secondary);
  max-width: 640px;
  margin: 0 auto;
}

.prose {
  max-width: 720px;
  margin: 0 auto;
  font-size: 16px;
}

.prose h2 {
  font-size: 28px;
  font-weight: 800;
  letter-spacing: -0.02em;
  margin-top: 56px;
  margin-bottom: 16px;
  color: var(--ink);
}

.prose h3 {
  font-size: 19px;
  font-weight: 700;
  margin-top: 32px;
  margin-bottom: 10px;
  color: var(--ink);
}

.prose p { margin-bottom: 16px; color: var(--text-secondary); }
.prose ul.prose ol { margin: 0 0 16px 24px; }
.prose li { margin-bottom: 8px; color: var(--text-secondary); }

.prose code {
  background: var(--bg-subtle);
  padding: 2px 6px;
  border-radius: 4px;
  font-family: ui-monospace, SFMono-Regular, "SF Mono", Consolas, monospace;
  font-size: 13.5px;
}

.prose table {
  width: 100%;
  border-collapse: collapse;
  margin: 16px 0 24px;
  font-size: 14.5px;
}

.prose th.prose td {
  text-align: left;
  padding: 10px 14px;
  border-bottom: 1px solid var(--border);
}

.prose th { font-weight: 600; color: var(--text); background: var(--bg-subtle); font-size: 13.5px; letter-spacing: 0.02em; }
.prose td { color: var(--text-secondary); }

.callout {
  background: rgba(59, 130, 246, 0.08);
  border: 1px solid rgba(59, 130, 246, 0.2);
  padding: 16px 20px;
  border-radius: var(--radius);
  margin: 24px 0;
}

.callout strong { color: var(--accent-hover); }

.callout-warn {
  background: rgba(245, 158, 11, 0.08);
  border-color: rgba(245, 158, 11, 0.4);
}

/* ===== PINDRIFTBOX PAGE - bg flows into the next section ===== */
.box-hero {
  padding: 24px 0 100px;
  margin-top: -68px;
  position: relative;
  overflow: hidden;
  background: var(--bg);
}

/* PinDriftBox hero: single solid color. No overlay SVG, no blur,
   no gradient. Earlier iterations (blurred pink/purple gradient,
   wireframe globe, PCB blueprint) all distracted from the H1, so
   this just lets var(--bg) show through. */

/* PinDriftBox sections: all solid white */
.box-section.box-section.alt {
  background: var(--bg);
}

.box-hero > .container { padding-top: 160px; }

.box-hero .container {
  position: relative;
  display: grid;
  grid-template-columns: 1.1fr 0.9fr;
  align-items: center;
  gap: 64px;
}

@media (max-width: 880px) {
  .box-hero .container { grid-template-columns: 1fr; gap: 48px; }
}

.box-hero h1 {
  font-size: clamp(36px, 5.4vw, 60px);
  font-weight: 800;
  letter-spacing: -0.03em;
  line-height: 1.05;
  margin-bottom: 22px;
  color: var(--ink);
}

/* Orange "Anywhere." on the PinDriftBox hero. One sanctioned color
   accent on the page; everything else stays BRT02-A monochrome. */
.box-hero h1 .accent {
  background: none;
  -webkit-background-clip: initial;
  background-clip: initial;
  color: #FF6B35 !important;
}

.box-hero p.lead {
  font-size: 19px;
  line-height: 1.5;
  color: var(--text-secondary);
  margin-bottom: 28px;
  max-width: 540px;
}

.box-stat-row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 18px;
  max-width: 540px;
  margin-bottom: 32px;
}

.box-stat-card {
  background: white;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 18px 16px;
  text-align: center;
}

.box-stat-card .num {
  font-size: 26px;
  font-weight: 800;
  color: var(--ink);
  letter-spacing: -0.02em;
  line-height: 1;
}

.box-stat-card .lbl {
  font-size: 11px;
  font-weight: 600;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.06em;
  margin-top: 8px;
}

.box-visual {
  position: relative;
}

.box-visual-card {
  background: white;
  border: 1px solid var(--border);
  border-radius: var(--radius-xl);
  padding: 28px;
  box-shadow: var(--shadow-lg);
}

.box-visual-card-status {
  display: flex;
  justify-content: space-between;
  align-items: center;
  margin-bottom: 24px;
}

.box-visual-card-status-name { font-weight: 700; color: var(--ink); }
.box-visual-card-status-pill {
  display: inline-flex;
  align-items: center;
  gap: 6px;
  font-size: 12px;
  font-weight: 600;
  padding: 4px 10px;
  border-radius: 999px;
  background: #ecfdf5;
  color: #047857;
}
.box-visual-card-status-pill::before {
  content: "";
  width: 6px; height: 6px;
  border-radius: 50%;
  background: #10b981;
  animation: pulse-soft 2s infinite;
}
@keyframes pulse-soft {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.5; }
}

.box-visual-card .mockup-box { margin: 8px 0 20px; }

.box-detail-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 12px;
  border-top: 1px solid var(--border);
  padding-top: 18px;
}

.box-detail-cell .lbl {
  font-size: 10px;
  font-weight: 700;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  margin-bottom: 4px;
}

.box-detail-cell .val {
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
}

/* Box section blocks */
.box-section {
  padding: 96px 0;
  position: relative;
}

.box-section.alt { background: var(--bg-soft); }

.box-section-grid {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 48px;
  align-items: center;
}

@media (max-width: 880px) {
  .box-section-grid { grid-template-columns: 1fr; }
}

.box-section-text h2 {
  font-size: clamp(26px, 3.6vw, 38px);
  font-weight: 800;
  letter-spacing: -0.025em;
  line-height: 1.15;
  margin-bottom: 16px;
  color: var(--ink);
}

.box-section-text p {
  font-size: 16.5px;
  line-height: 1.6;
  color: var(--text-secondary);
  margin-bottom: 14px;
}

.box-table-card {
  background: white;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 24px 28px;
  box-shadow: var(--shadow-sm);
}

.box-table-card table {
  width: 100%;
  border-collapse: collapse;
  font-size: 14px;
}

.box-table-card th {
  text-align: left;
  padding: 10px 0 14px;
  font-size: 11px;
  font-weight: 700;
  color: var(--text-muted);
  text-transform: uppercase;
  letter-spacing: 0.08em;
  border-bottom: 1px solid var(--border);
}

.box-table-card td {
  padding: 14px 0;
  border-bottom: 1px solid var(--border);
  color: var(--text-secondary);
  vertical-align: top;
}

.box-table-card tr:last-child td { border-bottom: none; }

.box-table-card td.recommend {
  font-weight: 700;
  color: var(--ink);
}

/* Solution page generic */
.solution-grid {
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(260px, 1fr));
  gap: 24px;
  margin-top: 40px;
}

.solution-card {
  background: white;
  border: 1px solid var(--border);
  border-radius: var(--radius-lg);
  padding: 28px;
}

.solution-card-icon {
  width: 44px; height: 44px;
  border-radius: 11px;
  background: var(--bg-subtle);
  color: var(--accent);
  display: flex; align-items: center; justify-content: center;
  margin-bottom: 16px;
}

.solution-card h3 {
  font-size: 17px;
  font-weight: 700;
  margin-bottom: 10px;
  color: var(--ink);
}

.solution-card p {
  font-size: 14.5px;
  line-height: 1.5;
  color: var(--text-secondary);
}

/* ============================================================== */
/* ===== DOCS LAYOUT ,  sidebar nav + content + tabs + callouts ===== */
/* ============================================================== */

.docs-layout {
  display: grid;
  grid-template-columns: 248px 1fr;
  gap: 56px;
  max-width: 1180px;
  margin: 0 auto;
  /* Default top padding clears the floating nav (top: 14px + ~44px tall + breathing room).
     Sub-pages (getting-started, setup, faq, etc.) jump straight from the nav into
     this layout ,  without this clearance the sidebar's "Start here" label and
     the content's first heading sit under the nav. */
  padding: 110px 28px 80px;
}

/* When a pageheader IS present (only the docs index uses one), it already
   provides top clearance ,  drop the layout's padding-top so we don't stack
   100px on top of 100px. */
.docs-pageheader + .docs-layout {
  padding-top: 24px;
}

@media (max-width: 880px) {
  .docs-layout { grid-template-columns: 1fr; gap: 32px; padding-top: 96px; }
  .docs-pageheader + .docs-layout { padding-top: 24px; }
  .docs-sidebar { position: static !important; }
}

.docs-sidebar {
  position: sticky;
  top: 100px;
  align-self: start;
  max-height: calc(100vh - 130px);
  overflow-y: auto;
  padding-right: 8px;
}

.docs-sidebar-section {
  margin-bottom: 22px;
}

.docs-sidebar-label {
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-faint, #9c9c9c);
  margin-bottom: 8px;
  padding: 0 10px;
}

.docs-sidebar-list {
  list-style: none;
  margin: 0; padding: 0;
  display: flex;
  flex-direction: column;
  gap: 1px;
}

.docs-sidebar-list a {
  display: block;
  padding: 6px 10px;
  font-size: 13.5px;
  font-weight: 500;
  color: var(--text-muted);
  border-radius: 6px;
  text-decoration: none;
  transition: background 0.15s, color 0.15s;
}
.docs-sidebar-list a:hover {
  background: var(--bg-soft);
  color: var(--ink);
}
.docs-sidebar-list a.active {
  background: var(--bg-soft);
  color: var(--accent);
  font-weight: 600;
}

.docs-content { min-width: 0; }
.docs-content > .docs-eyebrow {
  display: inline-block;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--accent);
  margin-bottom: 8px;
}
.docs-content > h1 {
  font-size: 36px;
  font-weight: 800;
  letter-spacing: -0.025em;
  margin: 0 0 14px;
  line-height: 1.1;
}
.docs-content > .docs-lead {
  font-size: 18px;
  line-height: 1.6;
  color: var(--text-secondary);
  margin-bottom: 36px;
  max-width: 720px;
}
.docs-content h2 {
  font-size: 23px;
  font-weight: 700;
  letter-spacing: -0.015em;
  margin: 48px 0 14px;
  line-height: 1.25;
  scroll-margin-top: 100px;
}
.docs-content h3 {
  font-size: 17px;
  font-weight: 600;
  margin: 28px 0 8px;
  line-height: 1.3;
  scroll-margin-top: 100px;
  color: var(--ink);
}
.docs-content h4 {
  font-size: 14.5px;
  font-weight: 600;
  margin: 20px 0 6px;
  color: var(--ink);
}
.docs-content p {
  font-size: 15.5px;
  line-height: 1.65;
  color: var(--text-secondary);
  margin: 0 0 14px;
  max-width: 760px;
}
.docs-content ul.docs-content ol {
  margin: 0 0 18px 22px;
  padding: 0;
  font-size: 15.5px;
  line-height: 1.65;
  color: var(--text-secondary);
  max-width: 760px;
}
.docs-content li { margin-bottom: 6px; }
.docs-content li > strong { color: var(--ink); font-weight: 600; }
.docs-content code {
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 4px;
  padding: 1px 6px;
  font-family: ui-monospace, 'SF Mono', 'Consolas', monospace;
  font-size: 13.5px;
  color: var(--ink);
}
.docs-content kbd {
  display: inline-block;
  padding: 1px 7px;
  background: var(--bg);
  border: 1px solid var(--border-strong);
  border-bottom-width: 2px;
  border-radius: 4px;
  font-family: ui-monospace, 'SF Mono', 'Consolas', monospace;
  font-size: 12px;
  color: var(--text);
  vertical-align: 1px;
}
.docs-content hr {
  border: 0;
  border-top: 1px solid var(--border);
  margin: 36px 0;
}
.docs-content a {
  color: var(--accent);
  text-decoration: none;
  border-bottom: 1px solid transparent;
}
.docs-content a:hover { border-bottom-color: var(--accent); }

/* ===== DOCS CALLOUT BOXES (note / tip / warning) ===== */
.docs-callout {
  display: grid;
  grid-template-columns: 22px 1fr;
  gap: 12px;
  padding: 14px 16px;
  border-radius: 10px;
  border: 1px solid var(--border);
  background: var(--bg-soft);
  margin: 18px 0;
  max-width: 760px;
}
.docs-callout p { margin: 0; font-size: 14.5px; line-height: 1.55; }
.docs-callout p + p { margin-top: 6px; }
.docs-callout-icon {
  width: 22px; height: 22px;
  border-radius: 50%;
  display: flex; align-items: center; justify-content: center;
  font-weight: 700;
  font-size: 13px;
  flex-shrink: 0;
}
.docs-callout-title {
  font-weight: 700;
  color: var(--ink);
  margin-bottom: 4px;
}
.docs-callout.note .docs-callout-icon  { background: rgba(59, 130, 246, 0.14); color: #1d4ed8; }
.docs-callout.note { border-color: rgba(59, 130, 246, 0.22); background: rgba(59, 130, 246, 0.04); }

.docs-callout.tip .docs-callout-icon  { background: rgba(16, 185, 129, 0.14); color: #047857; }
.docs-callout.tip { border-color: rgba(16, 185, 129, 0.22); background: rgba(16, 185, 129, 0.04); }

.docs-callout.warning .docs-callout-icon  { background: rgba(245, 158, 11, 0.18); color: #b45309; }
.docs-callout.warning { border-color: rgba(245, 158, 11, 0.30); background: rgba(245, 158, 11, 0.05); }

.docs-callout.danger .docs-callout-icon  { background: rgba(220, 38, 38, 0.16); color: #b91c1c; }
.docs-callout.danger { border-color: rgba(220, 38, 38, 0.28); background: rgba(220, 38, 38, 0.04); }

/* ===== DOCS TABS ,  JS-driven, accessible ===== */
.docs-tabs {
  margin: 18px 0;
  max-width: 760px;
}
.docs-tab-list {
  display: flex;
  gap: 2px;
  padding: 4px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 10px 10px 0 0;
  border-bottom: 0;
}
.docs-tab-button {
  padding: 8px 16px;
  background: transparent;
  border: 0;
  border-radius: 7px;
  font-size: 13.5px;
  font-weight: 500;
  color: var(--text-muted);
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.docs-tab-button:hover { color: var(--ink); }
.docs-tab-button[aria-selected="true"] {
  background: var(--bg);
  color: var(--ink);
  font-weight: 600;
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.05);
}
.docs-tab-panel {
  padding: 20px 22px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 0 10px 10px 10px;
}
.docs-tab-panel[hidden] { display: none; }
.docs-tab-panel > :first-child { margin-top: 0; }
.docs-tab-panel > :last-child { margin-bottom: 0; }

/* ===== DOCS TABLES (compatibility matrix etc) ===== */
.docs-table {
  width: 100%;
  max-width: 760px;
  margin: 18px 0;
  border-collapse: collapse;
  font-size: 14.5px;
  border: 1px solid var(--border);
  border-radius: 8px;
  overflow: hidden;
}
.docs-table th.docs-table td {
  padding: 9px 14px;
  text-align: left;
  border-bottom: 1px solid var(--border);
  vertical-align: top;
}
.docs-table th {
  background: var(--bg-soft);
  font-weight: 600;
  color: var(--ink);
  font-size: 12.5px;
  text-transform: uppercase;
  letter-spacing: 0.04em;
}
.docs-table tr:last-child td { border-bottom: 0; }
.docs-table tr:hover td { background: var(--bg-soft); }

/* Status pill cells inside table */
.docs-status {
  display: inline-flex;
  align-items: center;
  gap: 4px;
  padding: 2px 9px;
  font-size: 11.5px;
  font-weight: 600;
  border-radius: 999px;
  letter-spacing: 0.02em;
}
.docs-status.ok      { background: rgba(16, 185, 129, 0.12); color: #047857; }
.docs-status.warn    { background: rgba(245, 158, 11, 0.16); color: #b45309; }
.docs-status.no      { background: rgba(220, 38, 38, 0.12); color: #b91c1c; }
.docs-status.partial { background: rgba(99, 102, 241, 0.12); color: #4338ca; }

/* ===== DOCS STEP LIST (numbered cards for setup walkthroughs) ===== */
.docs-steps {
  list-style: none;
  margin: 18px 0;
  padding: 0;
  counter-reset: docs-step;
  max-width: 760px;
}
.docs-steps > li {
  position: relative;
  padding: 14px 18px 14px 56px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 10px;
  margin-bottom: 8px;
  font-size: 15px;
  line-height: 1.55;
  color: var(--text-secondary);
  counter-increment: docs-step;
}
.docs-steps > li::before {
  content: counter(docs-step);
  position: absolute;
  top: 14px; left: 16px;
  width: 26px; height: 26px;
  border-radius: 50%;
  background: var(--accent);
  color: var(--bg);
  display: flex; align-items: center; justify-content: center;
  font-size: 13px;
  font-weight: 700;
}
.docs-steps > li > strong:first-child {
  display: block;
  color: var(--ink);
  margin-bottom: 4px;
  font-weight: 600;
}

/* ===== ON-PAGE TOC (right rail, optional) ===== */
.docs-toc {
  font-size: 12.5px;
  border-left: 2px solid var(--border);
  padding-left: 14px;
  margin: 24px 0;
}
.docs-toc-label {
  font-size: 10.5px;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-weight: 700;
  color: var(--text-faint, #9c9c9c);
  margin-bottom: 6px;
}
.docs-toc a {
  display: block;
  padding: 3px 0;
  color: var(--text-muted);
  text-decoration: none;
}
.docs-toc a:hover { color: var(--accent); }

/* ===== DOCS PAGE HEADER (slim, no hero) ===== */
.docs-pageheader {
  padding: 100px 0 0;
  border-bottom: 1px solid var(--border);
  background: var(--bg);
}
.docs-pageheader .container {
  padding-bottom: 24px;
}

/* =============================================================
   FEEDBACK / CONTACT FORM
   Used on /feedback.html and inside the app's Settings modal.
   One form, four modes (support / issue / suggestion / feature).
   ============================================================= */

.feedback-form {
  display: flex;
  flex-direction: column;
  gap: 22px;
  padding: 28px;
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 16px;
  box-shadow: var(--shadow-sm);
}

/* --- Mode picker (4 cards) --- */
.feedback-type {
  border: 0;
  margin: 0;
  padding: 0;
}
.feedback-type legend {
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  color: var(--text-muted);
  margin-bottom: 10px;
  padding: 0;
}
.feedback-type-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 10px;
}
@media (max-width: 720px) {
  .feedback-type-grid { grid-template-columns: 1fr 1fr; }
}
.feedback-type-card {
  position: relative;
  cursor: pointer;
  border: 1px solid var(--border);
  border-radius: 12px;
  padding: 14px 14px 12px;
  background: var(--bg);
  transition: border-color 0.15s, background 0.15s, box-shadow 0.15s, transform 0.12s;
  display: block;
}
.feedback-type-card:hover {
  border-color: var(--border-strong);
  background: var(--bg-soft);
}
.feedback-type-card input[type="radio"] {
  position: absolute;
  opacity: 0;
  pointer-events: none;
}
.feedback-type-card.selected.feedback-type-card:has(input:checked) {
  border-color: var(--accent);
  background: rgba(37, 99, 235, 0.04);
  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.10);
}
.feedback-type-body {
  display: flex;
  flex-direction: column;
  gap: 4px;
}
.feedback-type-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px; height: 32px;
  border-radius: 8px;
  background: var(--bg-soft);
  color: var(--text-muted);
  margin-bottom: 6px;
  transition: background 0.15s, color 0.15s;
}
.feedback-type-card.selected .feedback-type-icon.feedback-type-card:has(input:checked) .feedback-type-icon {
  background: rgba(37, 99, 235, 0.10);
  color: var(--accent);
}
.feedback-type-name {
  font-size: 13.5px;
  font-weight: 600;
  color: var(--ink);
  letter-spacing: -0.005em;
}
.feedback-type-sub {
  font-size: 11.5px;
  color: var(--text-muted);
  line-height: 1.35;
}

/* --- Generic field layout (BRT02-A: 1.5px hard borders, 4px radius,
   hard offset focus ring instead of blurred shadow, monochrome ink) --- */
.feedback-field {
  display: flex;
  flex-direction: column;
  gap: 8px;
}
.feedback-field label {
  font-size: 12px;
  font-weight: 700;
  color: var(--ink);
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
/* Comma-separated selector list (was previously concatenated as a single
   compound selector, so the rule matched zero elements and inputs fell
   back to the browser's default chrome, that's what made every form
   field on /contact.html look "stock"). */
.feedback-field input[type="text"],
.feedback-field input[type="email"],
.feedback-field input[type="number"],
.feedback-field input[type="tel"],
.feedback-field input[type="url"],
.feedback-field input[type="search"],
.feedback-field input[type="password"],
.feedback-field input[type="date"],
.feedback-field input[type="month"],
.feedback-field input[type="time"],
.feedback-field input[type="datetime-local"],
.feedback-field input:not([type]),
.feedback-field textarea,
.feedback-field select {
  width: 100%;
  padding: 11px 13px;
  font-family: inherit;
  font-size: 14px;
  font-weight: 500;
  color: var(--ink);
  background: var(--bg);
  border: 1.5px solid var(--border-strong);
  border-radius: 4px;
  box-shadow: none;
  transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
  -webkit-appearance: none;
          appearance: none;
}
.feedback-field textarea {
  resize: vertical;
  min-height: 96px;
  line-height: 1.55;
  font-family: inherit;
}
.feedback-field input::placeholder,
.feedback-field textarea::placeholder {
  color: var(--text-faint);
  opacity: 1;
}
/* `type="month"` and `type="date"` get the browser's native picker UI,
   which can render too tall on some platforms. Match the line-height so
   they sit at the same row height as text inputs. */
.feedback-field input[type="month"],
.feedback-field input[type="date"],
.feedback-field input[type="time"],
.feedback-field input[type="datetime-local"] {
  line-height: 1.4;
  min-height: 44px;
}
/* No custom dropdown arrow on <select>. The native chevron is still
   suppressed via appearance: none (set on the shared input/textarea/select
   rule above); we just don't replace it with one of our own. The select
   still opens normally on click - users get the OS picker without any
   chevron decoration. */
.feedback-field select {
  cursor: pointer;
}
.feedback-field input:hover,
.feedback-field textarea:hover,
.feedback-field select:hover {
  border-color: var(--ink);
}
.feedback-field input:focus,
.feedback-field textarea:focus,
.feedback-field select:focus {
  outline: none;
  border-color: var(--ink);
  box-shadow: 3px 3px 0 var(--ink);
  transform: translate(-1px, -1px);
}
.feedback-field input[aria-invalid="true"],
.feedback-field textarea[aria-invalid="true"],
.feedback-field select[aria-invalid="true"] {
  border-color: #dc2626;
}
.feedback-field input[aria-invalid="true"]:focus,
.feedback-field textarea[aria-invalid="true"]:focus,
.feedback-field select[aria-invalid="true"]:focus {
  box-shadow: 3px 3px 0 #dc2626;
}
.feedback-field-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 14px;
}
@media (max-width: 600px) {
  .feedback-field-row { grid-template-columns: 1fr; }
}
.feedback-required { color: #dc2626; font-weight: 700; margin-left: 4px; }
.feedback-optional { color: var(--text-faint); font-weight: 500; font-size: 11px; margin-left: 6px; text-transform: none; letter-spacing: 0; }
.feedback-hint {
  font-size: 12px;
  color: var(--text-muted);
  line-height: 1.5;
}

/* (Dark/light chevron overrides for .feedback-field select removed - no
   custom chevron is drawn anymore, so there's nothing to recolor.) */

/* --- Image drop zone + preview --- */
.feedback-image-drop {
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  gap: 6px;
  padding: 22px 14px;
  border: 2px dashed var(--border-strong);
  border-radius: 10px;
  background: var(--bg-soft);
  color: var(--text-muted);
  font-size: 13px;
  cursor: pointer;
  transition: border-color 0.15s, background 0.15s, color 0.15s;
}
.feedback-image-drop:hover {
  border-color: var(--accent);
  color: var(--accent);
  background: rgba(37, 99, 235, 0.04);
}
.feedback-image-drop.dragover {
  border-color: var(--accent);
  background: rgba(37, 99, 235, 0.06);
  color: var(--accent);
}
.feedback-image-drop.required {
  border-color: rgba(220, 38, 38, 0.35);
}
.feedback-image-drop.required:hover {
  border-color: var(--accent);
}
.feedback-image-hint {
  font-size: 11px;
  color: var(--text-faint);
}

.feedback-image-preview {
  display: flex;
  flex-direction: column;
  gap: 8px;
  padding: 10px;
  border: 1px solid var(--border);
  border-radius: 10px;
  background: var(--bg);
}
.feedback-image-preview img {
  width: 100%;
  max-height: 320px;
  object-fit: contain;
  border-radius: 6px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
}
.feedback-image-meta {
  display: flex;
  justify-content: space-between;
  align-items: center;
  font-size: 12px;
  color: var(--text-muted);
}
.feedback-image-remove {
  background: transparent;
  border: 0;
  color: #dc2626;
  font-size: 12px;
  font-weight: 600;
  cursor: pointer;
  padding: 4px 8px;
  border-radius: 6px;
  transition: background 0.15s;
}
.feedback-image-remove:hover { background: rgba(220, 38, 38, 0.08); }

/* --- Captcha --- */
.feedback-captcha-row {
  display: flex;
  align-items: center;
  gap: 10px;
  flex-wrap: wrap;
}
.feedback-captcha-question {
  font-size: 14px;
  color: var(--ink);
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 8px;
  padding: 8px 14px;
  font-feature-settings: 'tnum';
}
.feedback-captcha-question strong { color: var(--accent); }
.feedback-captcha-row input[type="number"] {
  width: 90px;
  font-feature-settings: 'tnum';
  text-align: center;
}
.feedback-captcha-refresh {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 8px;
  width: 36px; height: 36px;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
  cursor: pointer;
  transition: background 0.15s, color 0.15s;
}
.feedback-captcha-refresh:hover { background: var(--bg-soft); color: var(--ink); }

/* --- Submit row + error + meta --- */
.feedback-actions {
  display: flex;
  align-items: center;
  gap: 16px;
  flex-wrap: wrap;
  margin-top: 4px;
}
.feedback-error {
  font-size: 13px;
  font-weight: 500;
  color: #dc2626;
  background: rgba(220, 38, 38, 0.08);
  border: 1px solid rgba(220, 38, 38, 0.18);
  border-radius: 8px;
  padding: 8px 12px;
}
.feedback-meta {
  font-size: 12px;
  color: var(--text-muted);
  margin-top: -4px;
  line-height: 1.5;
}

/* --- Success banner (after submit redirect) --- */
.feedback-success {
  display: grid;
  grid-template-columns: 44px 1fr;
  gap: 16px;
  padding: 22px 24px;
  background: rgba(16, 185, 129, 0.06);
  border: 1px solid rgba(16, 185, 129, 0.25);
  border-radius: 16px;
  margin-bottom: 24px;
}
.feedback-success-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  border-radius: 12px;
  background: rgba(16, 185, 129, 0.18);
  color: #059669;
}
.feedback-success p {
  font-size: 14px;
  color: var(--text-secondary);
  line-height: 1.55;
  margin: 6px 0 0;
}
.feedback-success a { color: var(--accent); font-weight: 500; }

/* =============================================================
   LEGAL & MEDIA CTA
   Sits at the bottom of /feedback.html as a separate intake doorway.
   ============================================================= */
.legal-media-cta {
  display: grid;
  grid-template-columns: 56px 1fr;
  gap: 18px;
  padding: 24px 26px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 14px;
  align-items: start;
}
.legal-media-cta-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 44px; height: 44px;
  border-radius: 12px;
  background: rgba(99, 102, 241, 0.12);
  color: #4338ca;
  border: 1px solid rgba(99, 102, 241, 0.18);
}
.legal-media-cta-body h3 {
  font-size: 17px;
  font-weight: 700;
  color: var(--ink);
  letter-spacing: -0.01em;
  margin: 0 0 6px;
}
.legal-media-cta-body p {
  font-size: 14px;
  color: var(--text-secondary);
  line-height: 1.55;
  margin: 0 0 14px;
  max-width: 720px;
}
.legal-media-cta-body .btn {
  font-size: 13px;
  padding: 8px 16px;
}

/* feedback-type-grid-4: when only 4 cards are shown (no Legal/Media), use
   4-column layout instead of 5. Falls back to 2 columns on narrow screens. */
.feedback-type-grid-4 {
  grid-template-columns: repeat(4, 1fr);
}
@media (max-width: 720px) {
  .feedback-type-grid-4 { grid-template-columns: 1fr 1fr; }
}

/* =============================================================
   LEGAL & MEDIA FORM
   /legal-media.html , bigger, more fields, statutory attestations.
   ============================================================= */

/* 5-card grid for the legal form's category picker */
.feedback-type-grid-5 {
  grid-template-columns: repeat(5, 1fr);
}
@media (max-width: 880px) {
  .feedback-type-grid-5 { grid-template-columns: repeat(2, 1fr); }
}
@media (max-width: 480px) {
  .feedback-type-grid-5 { grid-template-columns: 1fr; }
}

/* Section dividers between identity / inquiry / attachments. The legal
   form is long; these section headers help the user track where they are. */
.legal-section-h {
  font-size: 13px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  color: var(--text-muted);
  margin: 16px 0 6px;
  padding-top: 14px;
  border-top: 1px solid var(--border);
}
.legal-section-h:first-of-type {
  border-top: 0;
  padding-top: 0;
  margin-top: 4px;
}

/* DMCA attestation checkboxes + confidentiality checkbox */
.legal-checkbox {
  display: grid;
  grid-template-columns: 18px 1fr;
  gap: 10px;
  align-items: start;
  padding: 10px 12px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 8px;
  cursor: pointer;
  font-size: 13px;
  color: var(--text-secondary);
  line-height: 1.5;
  font-weight: normal;
}
.legal-checkbox:hover { background: rgba(99, 102, 241, 0.04); border-color: rgba(99, 102, 241, 0.18); }
.legal-checkbox input[type="checkbox"] {
  margin-top: 2px;
  width: 16px; height: 16px;
  accent-color: var(--accent);
  cursor: pointer;
}

/* Urgency radio group: stacked, distinct visual weight */
.legal-radio-row {
  display: flex;
  flex-direction: column;
  gap: 6px;
}
.legal-radio {
  display: flex;
  align-items: center;
  gap: 10px;
  padding: 10px 14px;
  border: 1px solid var(--border);
  border-radius: 8px;
  cursor: pointer;
  font-size: 13.5px;
  color: var(--text-secondary);
  transition: border-color 0.12s, background 0.12s;
}
.legal-radio:hover { border-color: var(--border-strong); background: var(--bg-soft); }
.legal-radio:has(input:checked) {
  border-color: var(--accent);
  background: rgba(37, 99, 235, 0.06);
  color: var(--ink);
  font-weight: 500;
}
.legal-radio input[type="radio"] {
  width: 16px; height: 16px;
  accent-color: var(--accent);
  cursor: pointer;
  flex-shrink: 0;
}

/* =============================================================
   DISABLED BUTTON STATES
   Used by the contact forms (feedback, legal-media) to grey out
   the submit button until the form is filled out properly.
   ============================================================= */
.btn:disabled.btn[disabled] {
  opacity: 0.45;
  cursor: not-allowed;
  pointer-events: none;
  /* Cancel any hover/active transforms so a disabled button never lifts */
  transform: none !important;
  box-shadow: none !important;
}
.btn-dark:disabled.btn-dark[disabled] {
  background: var(--text-faint);
  color: white;
}
.btn-primary:disabled.btn-primary[disabled] {
  background: var(--text-faint);
  color: white;
}
.btn-outline:disabled.btn-outline[disabled] {
  background: var(--bg-soft);
  color: var(--text-faint);
  border-color: var(--border);
}

/* =============================================================
   EDUCATION PAGE
   /education.html , application form for free Lifetime Pro for
   verified students, faculty, and academic researchers.
   ============================================================= */

/* 3-card grid for the role picker (Undergrad / Grad / Faculty) */
.feedback-type-grid-3 {
  grid-template-columns: repeat(3, 1fr);
}
@media (max-width: 720px) {
  .feedback-type-grid-3 { grid-template-columns: 1fr; }
}

/* "What you get" perks panel above the form */
.edu-perks {
  display: grid;
  grid-template-columns: 1fr 1fr 1fr;
  gap: 14px;
  margin: 16px 0 36px;
}
@media (max-width: 880px) {
  .edu-perks { grid-template-columns: 1fr; }
}
.edu-perk {
  display: grid;
  grid-template-columns: 38px 1fr;
  gap: 12px;
  padding: 16px 18px;
  background: var(--bg-soft);
  border: 1px solid var(--border);
  border-radius: 12px;
  align-items: start;
}
.edu-perk-icon {
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 32px; height: 32px;
  border-radius: 8px;
  background: rgba(37, 99, 235, 0.10);
  color: var(--accent);
  border: 1px solid rgba(37, 99, 235, 0.18);
}
.edu-perk strong {
  display: block;
  font-size: 14px;
  color: var(--ink);
  letter-spacing: -0.005em;
  margin-bottom: 4px;
}
.edu-perk p {
  font-size: 13px;
  color: var(--text-secondary);
  line-height: 1.5;
  margin: 0;
}

/* =============================================================
   ENTERPRISE BAND on the pricing page + docs-callout warning variant
   ============================================================= */

.enterprise-band {
  max-width: 760px;
  margin: 64px auto 0;
  padding: 36px 36px 28px;
  border: 1px solid rgba(15, 23, 42, 0.12);
  border-radius: 16px;
  background: linear-gradient(180deg, var(--bg) 0%, var(--bg-soft) 100%);
  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.04);
}

.enterprise-band-header {
  display: grid;
  grid-template-columns: 1fr auto;
  gap: 24px;
  align-items: end;
  margin-bottom: 28px;
}
@media (max-width: 720px) {
  .enterprise-band-header { grid-template-columns: 1fr; align-items: stretch; }
}

.enterprise-band-eyebrow {
  display: inline-block;
  font-size: 11px;
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  color: var(--accent);
  margin-bottom: 8px;
}
.enterprise-band-title {
  font-size: 30px;
  font-weight: 800;
  letter-spacing: -0.025em;
  color: var(--ink);
  margin: 0 0 10px;
  line-height: 1.1;
}
.enterprise-band-sub {
  font-size: 14.5px;
  line-height: 1.6;
  color: var(--text-secondary);
  margin: 0;
  max-width: 540px;
}

.enterprise-band-cta {
  display: flex;
  flex-direction: column;
  align-items: flex-end;
  gap: 6px;
}
@media (max-width: 720px) {
  .enterprise-band-cta { align-items: stretch; }
}
.enterprise-band-cta .btn { white-space: nowrap; }
.enterprise-band-cta-sub {
  font-size: 11.5px;
  color: var(--text-muted);
  text-align: right;
}
@media (max-width: 720px) {
  .enterprise-band-cta-sub { text-align: center; }
}

.enterprise-band-grid {
  display: grid;
  grid-template-columns: repeat(4, 1fr);
  gap: 14px;
  padding-top: 24px;
  border-top: 1px solid var(--border);
}
@media (max-width: 880px) {
  .enterprise-band-grid { grid-template-columns: 1fr 1fr; }
}
@media (max-width: 480px) {
  .enterprise-band-grid { grid-template-columns: 1fr; }
}

.enterprise-band-feature strong {
  display: block;
  font-size: 13px;
  font-weight: 600;
  color: var(--ink);
  margin-bottom: 4px;
}
.enterprise-band-feature p {
  font-size: 12.5px;
  color: var(--text-muted);
  line-height: 1.5;
  margin: 0;
}

/* Warning variant of docs-callout, used for the commercial-use heads-up */
.docs-callout.warning {
  background: rgba(234, 88, 12, 0.05);
  border-color: rgba(234, 88, 12, 0.22);
}
.docs-callout.warning .docs-callout-icon {
  background: rgba(234, 88, 12, 0.12);
  color: #c2410c;
  border-color: rgba(234, 88, 12, 0.28);
}
.docs-callout.warning .docs-callout-title {
  color: #c2410c;
}

/* Stacked-row variant for short checkbox groups in the sales form */
.legal-checkbox-row {
  display: grid;
  grid-template-columns: 1fr 1fr;
  gap: 8px;
}
@media (max-width: 720px) {
  .legal-checkbox-row { grid-template-columns: 1fr; }
}
.legal-checkbox-row .legal-checkbox {
  padding: 8px 12px;
  font-size: 12.5px;
}

/* select dropdown styling matching the rest of the form inputs.
   No custom chevron image - the native arrow is suppressed via
   appearance: none and we don't draw a replacement. */
.feedback-form select {
  width: 100%;
  padding: 10px 12px;
  font-family: inherit;
  font-size: 14px;
  color: var(--ink);
  background: var(--bg);
  border: 1px solid var(--border-strong);
  border-radius: 8px;
  cursor: pointer;
  transition: border-color 0.15s, box-shadow 0.15s;
  appearance: none;
}
.feedback-form select:focus {
  outline: none;
  border-color: var(--accent);
  box-shadow: 0 0 0 3px rgba(37, 99, 235, 0.12);
}

/* Graduation-date pair (education form): two dropdowns side-by-side that
   feed a hidden YYYY-MM input. */
.grad-date-row {
  display: grid;
  grid-template-columns: 1.4fr 1fr;
  gap: 8px;
}
@media (max-width: 480px) {
  .grad-date-row { grid-template-columns: 1fr 1fr; }
}

/* =====================================================================
   MOBILE LAYOUT (<=720px)
   ---------------------------------------------------------------------
   Tightens padding, stacks side-by-side groups vertically, and makes
   primary CTAs full-width so they're easy to tap with a thumb. Targets
   typical phone widths (320-720px). Tablet portrait (768-820) and up
   keeps the existing desktop layout.
   ===================================================================== */
@media (max-width: 720px) {

  /* Containers: shrink horizontal padding so content uses the screen. */
  .container { padding-left: 18px; padding-right: 18px; }

  /* ----- Page header / nav (the desktop nav-pill is already hidden
       <880px; on mobile we just need the brand + CTA to read well). */
  .nav { gap: 10px; }
  .brand { padding: 4px 12px 4px 4px; font-size: 14px; }
  .nav-cta { padding: 8px 14px; font-size: 12.5px; }
  .nav-cta::after { width: 12px; height: 12px; }

  /* ----- Hero ----- */
  .hero { padding: 16px 0 60px; }
  .hero .hero-content { padding-top: 110px; }
  .hero-title { font-size: clamp(30px, 9vw, 40px) !important; line-height: 1.08; }
  .hero-sub   { font-size: 16px; }

  /* Hero CTAs: stack vertically, full-width so they're a single thumb
     target each. Buttons inside have natural large tap zones already
     from .btn-large padding. */
  .hero-ctas {
    flex-direction: column;
    align-items: stretch;
    gap: 10px;
    width: 100%;
  }
  .hero-ctas .btn { width: 100%; justify-content: center; }
  .hero-meta { font-size: 12px; line-height: 1.5; }

  /* Hide the orbs on mobile - they're decorative and the smaller
     screen size makes them feel cramped. */
  .hero-orb { display: none; }

  /* ----- Section padding ----- */
  .feature-row.feature-row.reverse { padding: 56px 0; }
  .compat { padding: 36px 0 28px; }
  .compat-row { gap: 12px 18px; font-size: 13px; }
  .honest.pricing-section.box-section.box-section.alt { padding: 56px 0; }
  .cta-final { padding: 48px 0 56px; }

  /* ----- Feature rows: stack with visual on top -----
     IMPORTANT: `1fr` is shorthand for `minmax(auto, 1fr)`. The `auto` minimum
     locks the column to the intrinsic min-content of its widest child, which
     for the multi-iPhone mockup is ~420 px, wider than a phone viewport,
     so the row used to spill ~76 px off-screen. `minmax(0, 1fr)` lets the
     column actually shrink, and the `min-width: 0` chain below lets the
     flex children inside cooperate instead of forcing their own width. */
  .feature-grid-2 {
    grid-template-columns: minmax(0, 1fr) !important;
    gap: 28px;
    min-width: 0;
  }
  .feature-text h2 { font-size: clamp(26px, 7vw, 32px) !important; }
  .feature-text p  { font-size: 15.5px; }
  .feature-row.reverse .feature-visual { order: -1; } /* visual on top on mobile */
  .feature-row .feature-visual { order: -1; }
  .feature-visual.feature-text.feature-visual > *.app-frame.app-frame-screen.mockup-multi-panel.mockup-devices.mockup-device.mockup-device-text { min-width: 0; max-width: 100%; }
  .feature-visual { padding: 0; }
  /* Tighten the multi-iPhone mockup padding on phones so device rows
     get the room they need without pushing the card over the edge. */
  .mockup-multi-panel { padding: 16px 14px 14px; }
  .mockup-multi-header { margin-bottom: 12px; }
  .mockup-multi-title { font-size: 13px; }
  .mockup-multi-pill { font-size: 10.5px; }
  .mockup-device { padding: 10px 12px; gap: 10px; }
  .mockup-device-name { font-size: 13.5px; }
  .mockup-device-meta { font-size: 11.5px; }
  /* Long device names + meta strings get ellipsis instead of forcing width. */
  .mockup-device-name.mockup-device-meta { overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }

  /* ----- Section headers ----- */
  .section-header { margin-bottom: 32px; }
  .section-title { font-size: clamp(24px, 7vw, 32px) !important; }
  .section-sub   { font-size: 14.5px; }

  /* ----- Commitments grid (Six commitments) ----- */
  .commitments-grid {
    grid-template-columns: 1fr !important;
    gap: 12px;
  }
  .commitment-card { padding: 20px; }
  .commitment-card h3 { font-size: 16px; }

  /* ----- Pricing cards: stack ----- */
  .pricing-cards.pricing-cards-3 { grid-template-columns: 1fr !important; gap: 14px; max-width: 100% !important; }
  .price-card { padding: 24px 22px; }
  .price-amount { font-size: 38px; }

  /* ----- Enterprise band ----- */
  .enterprise-band { padding: 28px 22px; }
  .enterprise-band-header { grid-template-columns: 1fr !important; gap: 20px; }
  .enterprise-band-grid { grid-template-columns: 1fr !important; }

  /* ----- PinDriftBox hero ----- */
  .box-hero { padding: 60px 0 40px; }
  .box-hero .container { grid-template-columns: 1fr !important; gap: 28px; }
  .box-stat-row { gap: 8px; }
  .box-stat-card { padding: 12px; }
  .box-stat-card .num { font-size: 22px; }

  /* PinDriftBox 'The problem / The fix' two-column section */
  .box-section-grid { grid-template-columns: 1fr !important; gap: 24px; }

  /* Pi-pricing table card */
  .box-table-card table { font-size: 13px; }

  /* ----- PinDriftBox solution cards ----- */
  .solution-grid { grid-template-columns: 1fr !important; gap: 12px; }
  .solution-card { padding: 20px; }

  /* ----- Footer ----- */
  .footer-grid {
    grid-template-columns: 1fr !important;
    gap: 28px;
  }
  .footer-col h4 { margin-bottom: 8px; }
  .footer-bottom { flex-direction: column; gap: 14px; align-items: flex-start; }
  .footer-bottom-left { flex-direction: column; gap: 6px; align-items: flex-start; }

  /* ----- Multi-device mockups (homepage feature row) ----- */
  .app-frame { padding: 4px; }
  .app-frame-screen { grid-template-columns: 1fr !important; min-width: 0; }

  /* ----- Docs layout ----- */
  .docs-layout { grid-template-columns: 1fr !important; }
  .docs-sidebar { display: none; }
  .docs-content { padding: 24px 18px 60px !important; }
  .docs-content h1 { font-size: clamp(28px, 8vw, 36px); }

  /* ----- Tables (.docs-table.vs-table) ----- */
  .docs-table.vs-table { font-size: 12px; }
  .docs-table th.docs-table td.vs-table th.vs-table td { padding: 9px 10px; }

  /* ----- vs.html buyer guide ----- */
  .vs-wrap { border-radius: 10px; }

  /* ----- Pages with sidebars: stack everything ----- */
  .ac-grid.rm-grid { grid-template-columns: 1fr !important; }

  /* ----- Modals / forms ----- */
  .modal-card { padding: 20px !important; max-width: calc(100vw - 24px) !important; }
}

/* ===== Even tighter (<=420px, smaller phones) ===== */
@media (max-width: 420px) {
  .hero-title { font-size: 32px !important; }
  .feature-text h2.section-title { font-size: 26px !important; }
  .price-amount { font-size: 34px; }
}

/* =====================================================================
   PinDriftBox 3D globe section
   ===================================================================== */
.pd-globe-section { padding: 80px 0; }
.pd-globe-wrap {
  position: relative;
  max-width: 720px;
  margin: 32px auto 0;
  aspect-ratio: 1 / 1;
  border-radius: 22px;
  overflow: hidden;
  background: radial-gradient(circle at 50% 45%, rgba(59,130,246,0.08) 0%, transparent 60%), var(--bg-soft);
  border: 1px solid var(--border);
}
#pdGlobe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  display: block;
  cursor: grab;
}
#pdGlobe:active { cursor: grabbing; }
.pd-globe-fallback {
  position: absolute;
  inset: 0;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--text-muted);
  font-size: 14px;
}
.pd-globe-legend {
  position: absolute;
  bottom: 14px;
  left: 14px;
  display: flex;
  gap: 14px;
  padding: 8px 12px;
  background: rgba(255, 255, 255, 0.85);
  border: 1px solid var(--border);
  border-radius: 999px;
  font-size: 11.5px;
  color: var(--text-muted);
  font-weight: 500;
  backdrop-filter: blur(8px);
  z-index: 2;
}
.pd-globe-legend span { display: inline-flex; align-items: center; gap: 6px; }
.pd-globe-dot {
  width: 8px; height: 8px;
  border-radius: 50%;
  box-shadow: 0 0 0 3px rgba(255, 255, 255, 0.4);
}
.pd-globe-dot-blue  { background: #3b82f6; }
.pd-globe-dot-green { background: #10b981; }

@media (max-width: 720px) {
  .pd-globe-section { padding: 56px 0; }
  .pd-globe-wrap { max-width: calc(100vw - 36px); border-radius: 16px; }
  .pd-globe-legend { font-size: 10.5px; padding: 6px 10px; gap: 10px; }
}

@media (prefers-color-scheme: dark) {
  html:not([data-pindrift-theme="light"]) {

  .pd-globe-wrap {
    background: radial-gradient(circle at 50% 45%, rgba(96,165,250,0.10) 0%, transparent 60%), #1A1A1E;
    border-color: rgba(255, 255, 255, 0.06);
  }
  .pd-globe-legend {
    background: rgba(28, 28, 31, 0.85);
    border-color: rgba(255, 255, 255, 0.10);
    color: var(--text-muted);
  }
  .pd-globe-dot { box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.4); }

  }
}

/* Manual dark override (OS may be light) , same patches as the @media block above, scoped to manual choice. */
html[data-pindrift-theme="dark"] {

  .pd-globe-wrap {
    background: radial-gradient(circle at 50% 45%, rgba(96,165,250,0.10) 0%, transparent 60%), #1A1A1E;
    border-color: rgba(255, 255, 255, 0.06);
  }
  .pd-globe-legend {
    background: rgba(28, 28, 31, 0.85);
    border-color: rgba(255, 255, 255, 0.10);
    color: var(--text-muted);
  }
  .pd-globe-dot { box-shadow: 0 0 0 3px rgba(0, 0, 0, 0.4); }

}

/* =====================================================================
   "GET PINDRIFT FOR WINDOWS" CTA - DESKTOP vs MOBILE TEXT SWAP
   ---------------------------------------------------------------------
   The hero CTA shows "Get PinDrift for Windows" on desktop and "Send
   this to me" on mobile (where the user can't actually install the
   Windows app from their phone). The mobile text triggers a modal
   that captures their email so we can send them the download link
   to install when they're back at their PC.
   ===================================================================== */
.cta-text-mobile { display: none; }
@media (max-width: 720px) {
  .cta-text-desktop { display: none; }
  .cta-text-mobile  { display: inline; }
}

/* Email-capture modal triggered by the mobile CTA. */
.send-link-backdrop {
  position: fixed;
  inset: 0;
  z-index: 9000;
  background: rgba(15, 23, 42, 0.55);
  display: flex;
  align-items: center;
  justify-content: center;
  padding: 20px;
  opacity: 0;
  pointer-events: none;
  transition: opacity 0.2s ease;
}
.send-link-backdrop.open {
  opacity: 1;
  pointer-events: auto;
}
.send-link-card {
  background: var(--bg);
  border: 1px solid var(--border);
  border-radius: 16px;
  padding: 26px 24px 22px;
  max-width: 420px;
  width: 100%;
  box-shadow: 0 24px 60px rgba(15, 23, 42, 0.35);
  transform: translateY(10px) scale(0.98);
  transition: transform 0.22s cubic-bezier(0.2, 0.9, 0.3, 1.05);
}
.send-link-backdrop.open .send-link-card { transform: translateY(0) scale(1); }
.send-link-card h3 {
  font-size: 19px;
  font-weight: 800;
  letter-spacing: -0.02em;
  margin: 0 0 6px;
  color: var(--ink);
}
.send-link-card p {
  font-size: 13.5px;
  color: var(--text-muted);
  line-height: 1.5;
  margin: 0 0 16px;
}
.send-link-field { margin-bottom: 16px; }
.send-link-field label {
  display: block;
  font-size: 12px;
  font-weight: 700;
  color: var(--ink);
  margin-bottom: 8px;
  letter-spacing: 0.02em;
  text-transform: uppercase;
}
.send-link-field input {
  width: 100%;
  padding: 12px 14px;
  border: 1.5px solid var(--border-strong);
  border-radius: 4px;
  font-size: 14px;
  font-weight: 500;
  font-family: inherit;
  color: var(--ink);
  background: var(--bg);
  box-sizing: border-box;
  transition: border-color 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
  -webkit-appearance: none;
          appearance: none;
}
.send-link-field input::placeholder { color: var(--text-faint); opacity: 1; }
.send-link-field input:hover { border-color: var(--ink); }
.send-link-field input:focus {
  outline: none;
  border-color: var(--ink);
  box-shadow: 3px 3px 0 var(--ink);
  transform: translate(-1px, -1px);
}
.send-link-actions { display: flex; gap: 10px; }
.send-link-actions button {
  flex: 1;
  padding: 12px 14px;
  border-radius: 4px;
  font-size: 13px;
  font-weight: 700;
  font-family: inherit;
  cursor: pointer;
  border: 1.5px solid var(--border-strong);
  background: var(--bg);
  color: var(--ink);
  letter-spacing: 0.005em;
  transition: background 0.15s ease, box-shadow 0.15s ease, transform 0.15s ease;
}
.send-link-actions button:hover {
  background: var(--bg-soft);
  box-shadow: 3px 3px 0 var(--ink);
  transform: translate(-1px, -1px);
}
.send-link-actions button:active {
  transform: translate(0, 0);
  box-shadow: 0 0 0 var(--ink);
}
.send-link-actions button.primary {
  background: var(--ink);
  color: var(--bg);
  border-color: var(--ink);
}
.send-link-actions button.primary:hover { background: var(--ink); }
.send-link-status {
  margin-top: 10px;
  font-size: 12.5px;
  color: var(--text-muted);
  min-height: 18px;
  line-height: 1.45;
}
.send-link-status.error { color: #b91c1c; }
.send-link-status.success { color: #047857; }

/* =====================================================================
   DARK THEME - PATCH OVERRIDES
   ---------------------------------------------------------------------
   The :root token flip at the top of this file handles ~80% of the
   site automatically. The rules below cover the remaining elements
   that were authored with hardcoded hex values (white nav pill, white
   commitment cards, white app-frame chrome, light dev-note, etc.) and
   the few places where var(--ink) inversion would visually break a
   component (CTAs, accents).

   Strategy: minimal, surgical. Each rule below corresponds to a
   real visual glitch in dark mode, not a stylistic preference.
   ===================================================================== */
@media (prefers-color-scheme: dark) {
  html:not([data-pindrift-theme="light"]) {


  /* ----- HEADER & NAV -----
     The header itself stays transparent in dark mode (no full-width
     dark band across the top of the screen). The visible chrome is
     the three floating pills (brand, nav-pill, nav-cta), each with
     its own translucent dark background. The .scrolled state below
     applies a slightly stronger backdrop only to those pills, not
     the whole header. */
  /* BRT02-A dark-mode chrome: solid bg-soft surface, 1.5px hard white
     border, hard offset shadow. No glass, no blur. */
  .nav-pill {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .nav-pill a { color: var(--text); opacity: 0.40; }
  .nav-pill a:hover { opacity: 0.75; }
  .nav-pill a.active { opacity: 1; }
  .nav-pill-indicator { background: var(--ink); }

  .nav-toggle {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .nav-toggle span { background: var(--ink); }
  .nav-drawer-backdrop { background: rgba(0, 0, 0, 0.55); }
  .nav-drawer {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-lg) !important;
  }
  .nav-drawer a { color: var(--text-secondary); }
  .nav-drawer a:hover.nav-drawer a.active {
    background: var(--bg-hover);
    color: var(--text);
  }
  .nav-drawer .nav-drawer-cta {
    background: var(--ink);
    color: var(--bg);
    border: 1.5px solid var(--ink);
  }
  .nav-drawer .nav-drawer-cta:hover {
    background: var(--ink);
    color: var(--bg);
    filter: brightness(0.85);
  }

  .site-header.scrolled .nav-pill {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }

  /* ----- MAP FLOATING CARDS (hero + routes demos) -----
     The frosted "Current spoofed location" card on the hero map and
     the "Routing" banner on the routes demo. In dark mode they need
     a dark glass treatment so they don't blast a white rectangle
     across the dark page. */
  .hs-spoof-card.rt-banner.mirror-pc-banner.mirror-phone-locname {
    background: rgba(22, 22, 28, 0.94) !important;
    border-color: rgba(255, 255, 255, 0.08) !important;
    box-shadow: 0 14px 36px rgba(0, 0, 0, 0.55), 0 2px 6px rgba(0, 0, 0, 0.30) !important;
  }
  .hs-spoof-label.rt-banner-text span.mirror-phone-locname-eyebrow { color: var(--text-muted) !important; }
  .hs-spoof-coords.hs-spoof-addr.rt-banner-text strong.mirror-phone-locname-title { color: var(--ink) !important; }

  /* CTAs: var(--ink) flips to near-white in dark, which is correct
     for a high-contrast button. Drop the heavy box-shadow that's
     calibrated for a light page. */
  .btn-dark {
    background: var(--ink);
    color: #0a0a09;
    box-shadow: 0 1px 0 rgba(255,255,255,0.06) inset, 0 6px 20px rgba(0,0,0,0.5);
  }
  .btn-dark:hover { background: #ffffff; }
  .btn-outline { border-color: var(--border-strong); }
  .btn-outline:hover { background: var(--bg-subtle); }

  /* BRT02-A dark-mode primary CTA: solid WHITE on dark, with the
     same hard offset shadow. Blue accent removed. */
  .nav-cta, .btn-download {
    background: var(--ink) !important;
    border: 1.5px solid var(--ink) !important;
    color: var(--bg) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .nav-cta:hover, .btn-download:hover {
    background: var(--ink) !important;
    color: var(--bg) !important;
    filter: brightness(0.85);
  }

  /* ----- HERO FRAME (used by feature visuals, NOT the app-shot) ----- */
  .app-frame { background: var(--bg-soft); }
  .app-frame-screen { background: var(--bg); border-color: rgba(255,255,255,0.04); }
  .app-sidebar { background: var(--bg-soft); border-right-color: var(--border); }
  .app-titlebar { background: var(--bg-soft); border-bottom-color: var(--border); }
  .app-titlebar-left { color: var(--ink); }
  .app-conn-pill { background: rgba(16, 185, 129, 0.16); color: #6ee7b7; }

  /* ----- COMMITMENTS GRID (BRT02-A dark) ----- */
  .commitment-card {
    background: var(--bg) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .commitment-card:hover {
    border-color: var(--ink) !important;
    box-shadow: 6px 6px 0 var(--shadow-color) !important;
  }
  .commitment-card:active {
    box-shadow: 1px 1px 0 var(--shadow-color) !important;
  }
  .commitment-icon {
    background: var(--ink) !important;
    color: var(--bg) !important;
    border: 1.5px solid var(--ink) !important;
    box-shadow: var(--shadow-sm) !important;
  }
  .commitment-card:hover .commitment-icon {
    box-shadow: var(--shadow-lg) !important;
  }
  .commitment-card:active .commitment-icon {
    box-shadow: 0 0 0 var(--shadow-color) !important;
  }

  /* ----- DEV NOTE (PinDriftBox page) ----- */
  .dev-note {
    background: linear-gradient(180deg, var(--bg-soft) 0%, var(--bg) 100%);
    border-color: var(--border);
    border-left-color: var(--accent);
  }
  .dev-note h3 { color: var(--ink); }
  .dev-note p { color: var(--text-secondary); }

  /* ----- COMPAT BAND ----- */
  .compat { background: var(--bg-soft); border-top-color: var(--border); border-bottom-color: var(--border); }
  .compat span { color: var(--text-secondary); }

  /* ----- PRICING ----- */
  .price-card { background: var(--bg-soft); border-color: var(--border); }
  .price-card.featured {
    background: linear-gradient(180deg, rgba(96,165,250,0.06) 0%, var(--bg-soft) 100%);
    border-color: var(--accent);
  }

  /* ----- DEVICE / BOX MOCKUPS (homepage feature rows) ----- */
  .mockup-multi-panel.mockup-box-panel { background: var(--bg) !important; }
  .mockup-device {
    background: var(--bg-soft) !important;
    border-color: var(--border);
  }
  .mockup-device-name { color: var(--ink); }
  .mockup-device-meta { color: var(--text-muted); }
  .mockup-multi-header.mockup-box-header { background: var(--bg-soft); border-bottom-color: var(--border); }

  /* ----- SOLUTION CARDS (PinDriftBox page) ----- */
  .solution-card {
    background: var(--bg-soft) !important;
    border-color: var(--border);
  }
  .solution-card h3 { color: var(--ink); }
  .solution-card p { color: var(--text-secondary); }
  .solution-card-icon { background: rgba(96, 165, 250, 0.12); color: var(--accent); }

  /* ----- PINDRIFTBOX HERO STAT CARDS ----- */
  .box-stat-card { background: var(--bg-soft); border-color: var(--border); }
  .box-stat-card .num { color: var(--ink); }
  .box-stat-card .lbl { color: var(--text-muted); }
  .box-visual-card { background: var(--bg-soft); border-color: var(--border); }
  .box-detail-cell { background: var(--bg); border-color: var(--border); }
  .box-detail-cell .lbl { color: var(--text-muted); }
  .box-detail-cell .val { color: var(--ink); }

  /* ----- PI MODEL TABLE ----- */
  .pi-table { background: var(--bg-soft); border-color: var(--border); }
  .pi-table th { background: var(--bg-subtle); color: var(--text-muted); border-bottom-color: var(--border); }
  .pi-table td { border-bottom-color: var(--border); color: var(--text-secondary); }
  .pi-table tr.recommended { background: rgba(96, 165, 250, 0.06); }

  /* ----- SECTIONS WITH ALT BACKGROUND ----- */
  .box-section.alt.pricing-section { background: var(--bg-soft); }
  .honest { background: var(--bg-soft); }

  /* ----- SECTION HEADER & EYEBROWS ----- */
  .section-eyebrow { color: var(--accent); }
  .section-title { color: var(--ink); }
  .section-sub { color: var(--text-muted); }
  .hero-eyebrow { background: var(--bg-soft); border-color: var(--border); color: var(--text-muted); }

  /* ----- FOOTER ----- */
  .site-footer { background: var(--bg-soft); border-top-color: var(--border); }
  .footer-col h4 { color: var(--ink); }
  .footer-col a { color: var(--text-muted); }
  .footer-col a:hover { color: var(--ink); }
  .footer-bottom { border-top-color: var(--border); color: var(--text-muted); }
  .country-chip { background: var(--bg); border-color: var(--border); color: var(--text-muted); }

  /* ----- TABLES (privacy/terms/docs) ----- */
  .prose th.docs-table th { background: var(--bg-subtle); color: var(--ink); border-bottom-color: var(--border); }
  .prose td.docs-table td { border-bottom-color: var(--border); color: var(--text-secondary); }
  .prose tr:hover td.docs-table tr:hover td { background: var(--bg-soft); }

  /* ----- DOCS CALLOUTS ----- */
  .docs-callout.note { background: rgba(96, 165, 250, 0.07); border-color: rgba(96, 165, 250, 0.30); }
  .docs-callout.tip { background: rgba(16, 185, 129, 0.07); border-color: rgba(16, 185, 129, 0.30); }
  .docs-callout.warning { background: rgba(245, 158, 11, 0.07); border-color: rgba(245, 158, 11, 0.35); }
  .docs-callout.danger { background: rgba(239, 68, 68, 0.07); border-color: rgba(239, 68, 68, 0.40); }

  /* ----- TOAST / NOTIFICATION CHIPS ----- */
  .toast { background: var(--ink); color: var(--bg); }

  /* ----- FEEDBACK / FORM INPUTS ----- */
  input[type="text"], input[type="email"], input[type="password"], textarea, select {
    background: var(--bg-soft);
    color: var(--ink);
    border-color: var(--border);
  }
  input::placeholder, textarea::placeholder { color: var(--text-faint); }

  /* ----- LARGE IMAGE/ICON SHADOWS - tone down ----- */
  .feature-visual { filter: brightness(0.95); }

  /* ----- COMPARISON TABLE (vs.html) ----- */
  .vs-wrap { background: var(--bg-soft); border-color: var(--border); box-shadow: 0 1px 3px rgba(0,0,0,0.4); }
  .vs-table thead th { background: var(--bg-subtle); border-bottom-color: var(--border); }
  .vs-table thead th.vs-th-pin { background: var(--ink); color: var(--bg); border-bottom-color: var(--ink); }
  .vs-th-pin .vs-vendor-by { color: var(--bg); opacity: 0.55; }
  .vs-cat { background: var(--bg-subtle); border-right-color: var(--border); }
  .vs-pin { background: var(--bg-soft); border-left-color: var(--ink); border-right-color: var(--ink); color: var(--ink); }
  .vs-table tbody td { border-bottom-color: var(--border); }
  .vs-section td { background: var(--bg-subtle); color: var(--text-muted); border-top-color: var(--border); border-bottom-color: var(--border); }
  .vs-table tbody tr:not(.vs-section):hover td:not(.vs-cat):not(.vs-pin) { background: var(--bg); }


  }
}

/* Manual dark override (OS may be light) , same patches as the @media block above, scoped to manual choice. */
html[data-pindrift-theme="dark"] {


  /* ----- HEADER & NAV -----
     The header itself stays transparent in dark mode (no full-width
     dark band across the top of the screen). The visible chrome is
     the three floating pills (brand, nav-pill, nav-cta), each with
     its own translucent dark background. The .scrolled state below
     applies a slightly stronger backdrop only to those pills, not
     the whole header. */
  /* BRT02-A dark-mode chrome: solid bg-soft surface, 1.5px hard white
     border, hard offset shadow. No glass, no blur. */
  .nav-pill {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .nav-pill a { color: var(--text); opacity: 0.40; }
  .nav-pill a:hover { opacity: 0.75; }
  .nav-pill a.active { opacity: 1; }
  .nav-pill-indicator { background: var(--ink); }

  .nav-toggle {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .nav-toggle span { background: var(--ink); }
  .nav-drawer-backdrop { background: rgba(0, 0, 0, 0.55); }
  .nav-drawer {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-lg) !important;
  }
  .nav-drawer a { color: var(--text-secondary); }
  .nav-drawer a:hover.nav-drawer a.active {
    background: var(--bg-hover);
    color: var(--text);
  }
  .nav-drawer .nav-drawer-cta {
    background: var(--ink);
    color: var(--bg);
    border: 1.5px solid var(--ink);
  }
  .nav-drawer .nav-drawer-cta:hover {
    background: var(--ink);
    color: var(--bg);
    filter: brightness(0.85);
  }

  .site-header.scrolled .nav-pill {
    background: var(--bg-soft) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }

  /* ----- MAP FLOATING CARDS (hero + routes demos) -----
     The frosted "Current spoofed location" card on the hero map and
     the "Routing" banner on the routes demo. In dark mode they need
     a dark glass treatment so they don't blast a white rectangle
     across the dark page. */
  .hs-spoof-card.rt-banner.mirror-pc-banner.mirror-phone-locname {
    background: rgba(22, 22, 28, 0.94) !important;
    border-color: rgba(255, 255, 255, 0.08) !important;
    box-shadow: 0 14px 36px rgba(0, 0, 0, 0.55), 0 2px 6px rgba(0, 0, 0, 0.30) !important;
  }
  .hs-spoof-label.rt-banner-text span.mirror-phone-locname-eyebrow { color: var(--text-muted) !important; }
  .hs-spoof-coords.hs-spoof-addr.rt-banner-text strong.mirror-phone-locname-title { color: var(--ink) !important; }

  /* CTAs: var(--ink) flips to near-white in dark, which is correct
     for a high-contrast button. Drop the heavy box-shadow that's
     calibrated for a light page. */
  .btn-dark {
    background: var(--ink);
    color: #0a0a09;
    box-shadow: 0 1px 0 rgba(255,255,255,0.06) inset, 0 6px 20px rgba(0,0,0,0.5);
  }
  .btn-dark:hover { background: #ffffff; }
  .btn-outline { border-color: var(--border-strong); }
  .btn-outline:hover { background: var(--bg-subtle); }

  /* BRT02-A dark-mode primary CTA: solid WHITE on dark, with the
     same hard offset shadow. Blue accent removed. */
  .nav-cta, .btn-download {
    background: var(--ink) !important;
    border: 1.5px solid var(--ink) !important;
    color: var(--bg) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .nav-cta:hover, .btn-download:hover {
    background: var(--ink) !important;
    color: var(--bg) !important;
    filter: brightness(0.85);
  }

  /* ----- HERO FRAME (used by feature visuals, NOT the app-shot) ----- */
  .app-frame { background: var(--bg-soft); }
  .app-frame-screen { background: var(--bg); border-color: rgba(255,255,255,0.04); }
  .app-sidebar { background: var(--bg-soft); border-right-color: var(--border); }
  .app-titlebar { background: var(--bg-soft); border-bottom-color: var(--border); }
  .app-titlebar-left { color: var(--ink); }
  .app-conn-pill { background: rgba(16, 185, 129, 0.16); color: #6ee7b7; }

  /* ----- COMMITMENTS GRID (BRT02-A dark) ----- */
  .commitment-card {
    background: var(--bg) !important;
    border: 1.5px solid var(--border) !important;
    box-shadow: var(--shadow-md) !important;
  }
  .commitment-card:hover {
    border-color: var(--ink) !important;
    box-shadow: 6px 6px 0 var(--shadow-color) !important;
  }
  .commitment-card:active {
    box-shadow: 1px 1px 0 var(--shadow-color) !important;
  }
  .commitment-icon {
    background: var(--ink) !important;
    color: var(--bg) !important;
    border: 1.5px solid var(--ink) !important;
    box-shadow: var(--shadow-sm) !important;
  }
  .commitment-card:hover .commitment-icon {
    box-shadow: var(--shadow-lg) !important;
  }
  .commitment-card:active .commitment-icon {
    box-shadow: 0 0 0 var(--shadow-color) !important;
  }

  /* ----- DEV NOTE (PinDriftBox page) ----- */
  .dev-note {
    background: linear-gradient(180deg, var(--bg-soft) 0%, var(--bg) 100%);
    border-color: var(--border);
    border-left-color: var(--accent);
  }
  .dev-note h3 { color: var(--ink); }
  .dev-note p { color: var(--text-secondary); }

  /* ----- COMPAT BAND ----- */
  .compat { background: var(--bg-soft); border-top-color: var(--border); border-bottom-color: var(--border); }
  .compat span { color: var(--text-secondary); }

  /* ----- PRICING ----- */
  .price-card { background: var(--bg-soft); border-color: var(--border); }
  .price-card.featured {
    background: linear-gradient(180deg, rgba(96,165,250,0.06) 0%, var(--bg-soft) 100%);
    border-color: var(--accent);
  }

  /* ----- DEVICE / BOX MOCKUPS (homepage feature rows) ----- */
  .mockup-multi-panel.mockup-box-panel { background: var(--bg) !important; }
  .mockup-device {
    background: var(--bg-soft) !important;
    border-color: var(--border);
  }
  .mockup-device-name { color: var(--ink); }
  .mockup-device-meta { color: var(--text-muted); }
  .mockup-multi-header.mockup-box-header { background: var(--bg-soft); border-bottom-color: var(--border); }

  /* ----- SOLUTION CARDS (PinDriftBox page) ----- */
  .solution-card {
    background: var(--bg-soft) !important;
    border-color: var(--border);
  }
  .solution-card h3 { color: var(--ink); }
  .solution-card p { color: var(--text-secondary); }
  .solution-card-icon { background: rgba(96, 165, 250, 0.12); color: var(--accent); }

  /* ----- PINDRIFTBOX HERO STAT CARDS ----- */
  .box-stat-card { background: var(--bg-soft); border-color: var(--border); }
  .box-stat-card .num { color: var(--ink); }
  .box-stat-card .lbl { color: var(--text-muted); }
  .box-visual-card { background: var(--bg-soft); border-color: var(--border); }
  .box-detail-cell { background: var(--bg); border-color: var(--border); }
  .box-detail-cell .lbl { color: var(--text-muted); }
  .box-detail-cell .val { color: var(--ink); }

  /* ----- PI MODEL TABLE ----- */
  .pi-table { background: var(--bg-soft); border-color: var(--border); }
  .pi-table th { background: var(--bg-subtle); color: var(--text-muted); border-bottom-color: var(--border); }
  .pi-table td { border-bottom-color: var(--border); color: var(--text-secondary); }
  .pi-table tr.recommended { background: rgba(96, 165, 250, 0.06); }

  /* ----- SECTIONS WITH ALT BACKGROUND ----- */
  .box-section.alt.pricing-section { background: var(--bg-soft); }
  .honest { background: var(--bg-soft); }

  /* ----- SECTION HEADER & EYEBROWS ----- */
  .section-eyebrow { color: var(--accent); }
  .section-title { color: var(--ink); }
  .section-sub { color: var(--text-muted); }
  .hero-eyebrow { background: var(--bg-soft); border-color: var(--border); color: var(--text-muted); }

  /* ----- FOOTER ----- */
  .site-footer { background: var(--bg-soft); border-top-color: var(--border); }
  .footer-col h4 { color: var(--ink); }
  .footer-col a { color: var(--text-muted); }
  .footer-col a:hover { color: var(--ink); }
  .footer-bottom { border-top-color: var(--border); color: var(--text-muted); }
  .country-chip { background: var(--bg); border-color: var(--border); color: var(--text-muted); }

  /* ----- TABLES (privacy/terms/docs) ----- */
  .prose th.docs-table th { background: var(--bg-subtle); color: var(--ink); border-bottom-color: var(--border); }
  .prose td.docs-table td { border-bottom-color: var(--border); color: var(--text-secondary); }
  .prose tr:hover td.docs-table tr:hover td { background: var(--bg-soft); }

  /* ----- DOCS CALLOUTS ----- */
  .docs-callout.note { background: rgba(96, 165, 250, 0.07); border-color: rgba(96, 165, 250, 0.30); }
  .docs-callout.tip { background: rgba(16, 185, 129, 0.07); border-color: rgba(16, 185, 129, 0.30); }
  .docs-callout.warning { background: rgba(245, 158, 11, 0.07); border-color: rgba(245, 158, 11, 0.35); }
  .docs-callout.danger { background: rgba(239, 68, 68, 0.07); border-color: rgba(239, 68, 68, 0.40); }

  /* ----- TOAST / NOTIFICATION CHIPS ----- */
  .toast { background: var(--ink); color: var(--bg); }

  /* ----- FEEDBACK / FORM INPUTS ----- */
  input[type="text"], input[type="email"], input[type="password"], textarea, select {
    background: var(--bg-soft);
    color: var(--ink);
    border-color: var(--border);
  }
  input::placeholder, textarea::placeholder { color: var(--text-faint); }

  /* ----- LARGE IMAGE/ICON SHADOWS - tone down ----- */
  .feature-visual { filter: brightness(0.95); }

  /* ----- COMPARISON TABLE (vs.html) ----- */
  .vs-wrap { background: var(--bg-soft); border-color: var(--border); box-shadow: 0 1px 3px rgba(0,0,0,0.4); }
  .vs-table thead th { background: var(--bg-subtle); border-bottom-color: var(--border); }
  .vs-table thead th.vs-th-pin { background: var(--ink); color: var(--bg); border-bottom-color: var(--ink); }
  .vs-th-pin .vs-vendor-by { color: var(--bg); opacity: 0.55; }
  .vs-cat { background: var(--bg-subtle); border-right-color: var(--border); }
  .vs-pin { background: var(--bg-soft); border-left-color: var(--ink); border-right-color: var(--ink); color: var(--ink); }
  .vs-table tbody td { border-bottom-color: var(--border); }
  .vs-section td { background: var(--bg-subtle); color: var(--text-muted); border-top-color: var(--border); border-bottom-color: var(--border); }
  .vs-table tbody tr:not(.vs-section):hover td:not(.vs-cat):not(.vs-pin) { background: var(--bg); }


}

/* =====================================================================
   BRT02-A MOTION LAYER

   BRT02-A is a still design system. Things don't drift, glow, or pulse
   on their own. The two pieces of motion that survive:

     1. Hero app-shot panel cross-fade on tab change (320ms opacity).
     2. Reveal-on-scroll: opacity fade-in as sections enter the viewport
        (no transform, since BRT02-A forbids translate-based motion).

   Everything else (gradient drift, CTA shimmer, mouse-parallax tilt,
   compat-row icon pulse, live-chip dot pulse) is removed. The JS that
   wrote those still runs but the visual layer simply doesn't react.
   ===================================================================== */

/* Panel cross-fade on tab activation. Pure opacity, no transform. */
@keyframes heroPanelIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}
.hero-app-shot .hs-panel.active {
  animation: heroPanelIn 0.32s ease both;
}

/* Reveal-on-scroll: opacity-only fade. No translateY (BRT02-A rule). */
.reveal-on-scroll {
  opacity: 0;
  transition: opacity 0.6s ease;
  will-change: opacity;
}
.reveal-on-scroll.is-visible {
  opacity: 1;
}

/* Legacy CTA shimmer rule disabled. The .btn-download.btn-large used
   to grow an isolated stacking context for a sweeping highlight; we
   keep the rules quiet so existing markup doesn't surprise anyone. */
.btn-download.btn-large::after { content: none; }

/* Legacy 3D tilt: tilt vars are still written by ambient-motion JS but
   the perspective + transform is intentionally a no-op now. */
.hero-visual { perspective: none; }
.hero-app-shot { transform: none; transform-style: flat; }

/* Legacy live-chip styling kept inert; the chip is no longer in the
   hero markup, but if some page still emits it, it renders as a small
   bordered pill instead of a soft-glowing colored capsule. */
.hero-meta-row {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 14px;
  flex-wrap: wrap;
  margin-top: 6px;
}
.hero-meta-row .hero-meta { margin: 0; }
.live-chip {
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 4px 10px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  color: var(--text);
  background: var(--bg);
  border: 1.5px solid var(--border);
  border-radius: var(--radius);
}
.live-chip-dot {
  width: 6px; height: 6px;
  background: var(--ink);
  flex-shrink: 0;
}
.live-chip-city {
  display: inline-block;
  font-variant-numeric: tabular-nums;
}

@media (prefers-reduced-motion: reduce) {
  .hero-app-shot .hs-panel.active { animation: none; }
  .reveal-on-scroll               { opacity: 1; transition: none; }
}

/* =====================================================================
   BRT02-A GLOBAL ENFORCEMENT

   Defensive sweep that flattens every remaining decorative gradient,
   backdrop-blur, soft drop shadow, and pill-radius across the site.
   Runs LAST so its rules win against everything above. The earlier
   blocks have been refactored where it was cheap to do so; this layer
   catches everything we didn't unwind by hand.

   Rules enforced:
     - noBackdropBlur     -> backdrop-filter cancelled globally
     - noGlass            -> translucent rgba bg's flattened on chrome
     - noColoredText      -> text/fill colors fall back to var(--text)
     - noGradientText     -> .gradient renders as plain ink
     - buttonsFlat        -> shadows replaced with hard offsets
     - no3DButtons        -> inset shadows cleared

   SVG strokes/fills inside .solution-card-icon.commitment-icon, the
   hero app-shot, and the globe section keep their currentColor / stroke
   colors. Those are intentional and read as black/white in BRT02-A.
   ===================================================================== */

/* 1. Backdrop-filter is forbidden anywhere. */
* {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}

/* 2. The hero title's gradient span is plain ink. */
h1.hero-title .gradient.gradient {
  background: transparent !important;
  -webkit-background-clip: initial !important;
          background-clip: initial !important;
  color: var(--ink) !important;
  background-size: auto !important;
  animation: none !important;
}

/* 3. Pills with translucent / colored backgrounds get flattened. */
.hero-eyebrow.live-chip.compat-row span.country-chip.section-eyebrow {
  background: var(--bg) !important;
  border-color: var(--border) !important;
}

/* 4. Soft glow shadows on the brand logo and other decorative chips. */
.brand-logo {
  box-shadow: none !important;
}

/* 5. Decorative big gradient backgrounds on section eyebrows / banners
      / hero accents get cleared. Cards keep their own borders. */
.compliance-card.allow.compliance-card.deny.cta-final::before.box-hero::before.pricing-section::before { background: var(--bg) !important; }

/* 6. iPhone-mockup device tones used colored linear-gradients. Flatten
      to a solid dark surface so they read as monochrome silhouettes. */
.mockup-device-iphone.mockup-device-iphone.tone-blue::before.mockup-device-iphone.tone-pink::before.mockup-device-iphone.tone-green::before {
  background: var(--ink) !important;
}

/* 7. Hero-app-shot internals: the demo device chrome was tinted blue
      in places. Force to monochrome borders. */
.hero-app-shot.hero-app-shot .hs-titlebar.hero-app-shot .hs-statusbar {
  background: var(--bg) !important;
  border-color: var(--border) !important;
}

/* 8. Box-stat-card / box-table-card / commitment-card / solution-card
      / price-card / feature-row visuals: borders harden, gradients
      flatten, soft drop shadows replaced with offset shadow. */
.box-stat-card.box-table-card.commitment-card.solution-card.price-card.docs-callout.app-frame.box-visual-card.box-section-grid > div.mockup-multi-panel.mockup-device {
  background: var(--bg) !important;
  border: 1.5px solid var(--border) !important;
  border-radius: var(--radius-lg) !important;
  box-shadow: var(--shadow-md) !important;
}

/* 9. Featured price-card: always white surface + black text + black
   border, regardless of light/dark mode. Stays the same in light mode
   (matches the others, heavier shadow distinguishes it); inverts
   against the dark page in dark mode (white card stands out). */
.price-card.featured {
  background: #FFFFFF !important;
  color: #000000 !important;
  border: 1.5px solid #000000 !important;
  box-shadow: 4px 4px 0 #000000 !important;
}
.price-card.featured *,
.price-card.featured h2,
.price-card.featured h3,
.price-card.featured p,
.price-card.featured li,
.price-card.featured strong,
.price-card.featured .price-name,
.price-card.featured .price-amount,
.price-card.featured .price-cadence,
.price-card.featured .price-tagline {
  color: #000000 !important;
}
/* The "Buy Lifetime" button inside the featured card: keep it black
   pill so it still pops against the white card. */
.price-card.featured .btn-dark {
  background: #000000 !important;
  color: #FFFFFF !important;
  border-color: #000000 !important;
}
.price-card.featured .btn-dark:hover {
  filter: brightness(0.85);
}

/* 10. Footer + final CTA: solid block, no soft gradient floor. */
.cta-final.site-footer {
  background: var(--bg) !important;
  border-top: 1.5px solid var(--border) !important;
}

/* 11. Country chip, badge variants etc. */
.country-chip {
  color: var(--text) !important;
  border-radius: var(--radius) !important;
  padding: 4px 10px !important;
  font-size: 11px !important;
  font-weight: 700 !important;
  letter-spacing: 0.04em !important;
  text-transform: uppercase !important;
}

/* 12. Section eyebrow: uppercase 10.5/800 tracked. */
.section-eyebrow {
  display: inline-block;
  font-size: 10.5px !important;
  font-weight: 800 !important;
  letter-spacing: 0.08em !important;
  text-transform: uppercase !important;
  color: var(--text) !important;
  padding: 0 !important;
  margin-bottom: 12px !important;
  border: none !important;
}

/* 13. All borders use the BRT02-A hard 1.5px. Soft 1px borders below
      get bumped up where they appear on chrome elements. */
.app-frame-bar.box-stat-row.feature-bullets.hs-tabs.routes-demo.mirror-demo {
  border-color: var(--border) !important;
}

/* 14. Section bg-soft is allowed but kept extremely subtle. */
.box-section.alt,
section[style*="background: var(--bg-soft)"] {
  background: var(--bg-soft) !important;
}

/* =========================================================================
   PAGE TRANSITIONS , cross-document View Transitions + reduced-motion guard
   -------------------------------------------------------------------------
   How it works:
     1. `@view-transition { navigation: auto }` opts in to native cross-
        document transitions in Chromium browsers (126+). The browser
        snapshots the outgoing DOM, navigates, then crossfades to the new
        DOM with the timing below. No JS, no SPA needed.
     2. The default crossfade is a hard cut. We override ::view-transition-
        old/new(root) to do a 280ms opacity + 6px translateY ease, which
        feels closer to a native-app push transition than a flash.
     3. Browsers WITHOUT View Transitions (Safari pre-18, Firefox) hit
        the @supports fallback: a one-shot fade-in animation on <body>
        runs on every page load. Less smooth than the real thing but
        kills the white flash.
     4. `prefers-reduced-motion` disables both paths so users who turn
        animation off see instant navigation.
   ========================================================================= */
@view-transition {
  navigation: auto;
}

::view-transition-old(root),
::view-transition-new(root) {
  animation-duration: 280ms;
  animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1);
  animation-fill-mode: both;
  mix-blend-mode: normal;
}
::view-transition-old(root) {
  animation-name: pindriftPageOut;
}
::view-transition-new(root) {
  animation-name: pindriftPageIn;
}

@keyframes pindriftPageOut {
  from { opacity: 1; transform: translateY(0); }
  to   { opacity: 0; transform: translateY(-4px); }
}
@keyframes pindriftPageIn {
  from { opacity: 0; transform: translateY(8px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Pin the header + footer so they don't fade with the page body. They
   become their own view-transition groups, which browsers crossfade
   in-place instead of sliding out with the rest of the document. */
.site-header { view-transition-name: site-header; }
.site-footer { view-transition-name: site-footer; }
::view-transition-old(site-header),
::view-transition-new(site-header),
::view-transition-old(site-footer),
::view-transition-new(site-footer) {
  animation-duration: 180ms;
}

/* Fallback for browsers without View Transitions , small fade-in only. */
@supports not (view-transition-name: root) {
  @media (prefers-reduced-motion: no-preference) {
    body {
      animation: pindriftPageFadeIn 280ms cubic-bezier(0.2, 0.9, 0.3, 1) both;
    }
    @keyframes pindriftPageFadeIn {
      from { opacity: 0; transform: translateY(6px); }
      to   { opacity: 1; transform: translateY(0); }
    }
  }
}

/* Reduced motion: skip everything. */
@media (prefers-reduced-motion: reduce) {
  ::view-transition-old(root),
  ::view-transition-new(root),
  ::view-transition-old(site-header),
  ::view-transition-new(site-header),
  ::view-transition-old(site-footer),
  ::view-transition-new(site-footer) {
    animation-duration: 1ms !important;
  }
  body { animation: none !important; }
}
