/* ==========================================================================
   NxtDue — website styles

   Palette, shadow recipes and type are lifted value-for-value from
   `Project Files/nxtdue-screens.html` — the same source that
   `mobile/components/clay/tokens.ts` reads. No colour here is invented, so
   the site and the app cannot drift apart.

   Claymorphism is four stacked shadows: an outer dark bottom-right, an outer
   light top-left, and two inner highlights that mould the surface edge.
   Depth carries meaning, exactly as it does in the app: raised = safe,
   flush = soon, pressed-in = expired.

   Motion lives at the bottom of this file, under MOTION. Every animated
   element must be legible with the animation removed — `prefers-reduced-motion`
   and a missing `/assets/site.js` both leave the page fully readable.
   ========================================================================== */

:root {
  --bg: #e7e3f7;
  --surface: #f0edfb;
  --sunk: #e2ddf2;
  --ink: #2c2748;
  --ink2: #6e6795;
  --ink3: #948db8;
  --violet: #6c4ef6;
  --violet-2: #8c74ff;
  --violet-soft: #cfc4ff;
  --mint: #12be92;
  --mint-soft: #b7eedf;
  --amber: #ef9a1e;
  --amber-soft: #ffe0b0;
  --coral: #f4536b;
  --coral-soft: #ffc9d1;
  --sky: #31aee0;
  --sky-soft: #bfe7f7;
  --peach: #ffd3be;
  --slate: #9a94bc;

  /* The app mark's own ground, so an icon tile sits on its own colour. */
  --mark-1: #3a3f7a;
  --mark-2: #171a33;

  --shd: rgba(88, 78, 140, 0.22);
  --shl: rgba(255, 255, 255, 0.92);

  --up:
    9px 9px 20px var(--shd), -7px -7px 16px var(--shl),
    inset -4px -4px 9px rgba(88, 78, 140, 0.09),
    inset 4px 4px 9px rgba(255, 255, 255, 0.72);
  --up-sm:
    5px 5px 12px var(--shd), -4px -4px 10px var(--shl),
    inset -2px -2px 5px rgba(88, 78, 140, 0.08),
    inset 2px 2px 5px rgba(255, 255, 255, 0.7);
  --up-lg:
    16px 20px 38px rgba(76, 66, 124, 0.24),
    -10px -12px 28px rgba(255, 255, 255, 0.8),
    inset -4px -4px 10px rgba(88, 78, 140, 0.09),
    inset 4px 4px 10px rgba(255, 255, 255, 0.7);
  --up-xl:
    24px 30px 60px rgba(76, 66, 124, 0.3),
    -14px -16px 38px rgba(255, 255, 255, 0.85),
    inset -5px -5px 12px rgba(88, 78, 140, 0.1),
    inset 5px 5px 12px rgba(255, 255, 255, 0.72);
  --in:
    inset 6px 6px 13px rgba(88, 78, 140, 0.19),
    inset -6px -6px 13px rgba(255, 255, 255, 0.9);
  --in-sm:
    inset 4px 4px 8px rgba(88, 78, 140, 0.16),
    inset -3px -3px 7px rgba(255, 255, 255, 0.85);
  --violet-up:
    9px 11px 22px rgba(108, 78, 246, 0.38),
    -6px -6px 15px rgba(255, 255, 255, 0.6),
    inset -4px -4px 9px rgba(58, 28, 150, 0.34),
    inset 4px 4px 9px rgba(255, 255, 255, 0.42);
  --violet-up-sm:
    6px 7px 14px rgba(108, 78, 246, 0.34),
    -3px -3px 9px rgba(255, 255, 255, 0.5),
    inset -2px -2px 6px rgba(58, 28, 150, 0.3),
    inset 2px 2px 6px rgba(255, 255, 255, 0.35);

  /* Wide by design: the page fills the browser rather than sitting in a
     column down the middle. Only prose is held back, by `.narrow`, because
     a 1700px measure is unreadable. */
  --page: 1720px;
  --gutter: clamp(18px, 3.4vw, 60px);
  --ease: cubic-bezier(0.22, 0.61, 0.36, 1);
  --spring: cubic-bezier(0.34, 1.56, 0.64, 1);
}

* { box-sizing: border-box; margin: 0; padding: 0; }

html { scroll-behavior: smooth; }

body {
  background:
    radial-gradient(900px 600px at 12% -5%, #f3e9ff 0%, transparent 60%),
    radial-gradient(800px 700px at 95% 8%, #ddf1fa 0%, transparent 55%),
    #dcd6f1;
  background-attachment: fixed;
  font-family: "Plus Jakarta Sans", system-ui, -apple-system, sans-serif;
  color: var(--ink);
  -webkit-font-smoothing: antialiased;
  line-height: 1.6;
  min-height: 100vh;
  display: flex;
  flex-direction: column;
  overflow-x: hidden;
}

img, svg { max-width: 100%; }
a { color: var(--violet); text-decoration: none; }
a:hover { text-decoration: underline; }

:focus-visible {
  outline: 3px solid var(--violet);
  outline-offset: 3px;
  border-radius: 6px;
}

.wrap { width: 100%; max-width: var(--page); margin: 0 auto; padding: 0 var(--gutter); }
/* Reading widths. `.narrow` is the legal/prose measure; `.mid` is for
   centred marketing copy that should not run the full 1720px either. */
.narrow { max-width: 980px; }
.mid { max-width: 1240px; }

/* Clipped rather than pushed off-canvas: a negative offset is a real overflow box,
   and on a narrow viewport that is a horizontal scrollbar nobody asked for. */
.skip {
  position: absolute; left: 24px; top: 12px; z-index: 100;
  background: var(--violet); color: #fff; padding: 12px 18px;
  border-radius: 14px; font-weight: 700;
  clip-path: inset(50%); width: 1px; height: 1px; overflow: hidden; white-space: nowrap;
}
.skip:focus {
  clip-path: none; width: auto; height: auto; overflow: visible;
}

/* ---------- type ---------- */
h1, h2, h3, h4, .display {
  font-family: Fredoka, "Plus Jakarta Sans", sans-serif;
  font-weight: 500;
  letter-spacing: -0.015em;
  line-height: 1.12;
}
h1 { font-size: clamp(34px, 4.6vw, 62px); font-weight: 600; line-height: 1.04; letter-spacing: -0.022em; }
h2 { font-size: clamp(25px, 3vw, 38px); }
h3 { font-size: clamp(19px, 2.2vw, 23px); }
h4 { font-size: 17px; font-weight: 600; }
/* z-index:0 makes the word its own stacking context, so the underline drawn by
   ::after sits behind the letters and not behind the card it is printed on. */
em.hl { font-style: normal; color: var(--violet); position: relative; z-index: 0; white-space: nowrap; }

.eyebrow {
  font-size: 11px; letter-spacing: 0.22em; text-transform: uppercase;
  color: var(--violet); font-weight: 800; margin-bottom: 14px;
}
.lede { font-size: clamp(15px, 1.4vw, 18px); line-height: 1.7; color: var(--ink2); }
.muted { color: var(--ink2); }
.tiny { font-size: 12.5px; color: var(--ink3); line-height: 1.6; }
.money { font-family: Fredoka, sans-serif; font-weight: 600; }
.center { text-align: center; }

/* ---------- clay primitives ---------- */
.card {
  background: var(--surface);
  border-radius: 28px;
  box-shadow: var(--up);
  padding: 28px;
}
.card.lg { border-radius: 34px; padding: clamp(26px, 2.6vw, 44px); box-shadow: var(--up-lg); }
.sunk { background: var(--sunk); border-radius: 22px; box-shadow: var(--in); }

.btn {
  display: inline-flex; align-items: center; justify-content: center; gap: 10px;
  height: 56px; padding: 0 26px; border-radius: 20px;
  font: inherit; font-weight: 700; font-size: 15px;
  background: var(--surface); color: var(--ink);
  box-shadow: var(--up); border: 0; cursor: pointer;
  transition: transform 0.18s var(--ease), box-shadow 0.18s var(--ease);
  text-decoration: none;
}
.btn:hover { text-decoration: none; transform: translateY(-2px); }
.btn:active { transform: translateY(1px); box-shadow: var(--in-sm); }
.btn.primary {
  background: linear-gradient(158deg, var(--violet-2), var(--violet));
  color: #fff; box-shadow: var(--violet-up);
}
.btn.sm { height: 46px; padding: 0 18px; border-radius: 16px; font-size: 13.5px; }
/* A surface-coloured button sitting on a surface-coloured card haloes at full depth.
   Inside a card, drop to the small recipe — same material, less lift. */
.card .btn:not(.primary) { box-shadow: var(--up-sm); }
.card .btn:not(.primary):active { box-shadow: var(--in-sm); }
.btn.wide { width: 100%; }
.btn.ghost { background: transparent; box-shadow: none; color: var(--ink2); font-weight: 600; }
.btn.ghost:hover { box-shadow: var(--up-sm); background: var(--surface); }
.btn[aria-disabled="true"] { cursor: default; }
.btn[aria-disabled="true"]:hover { transform: none; }

.chip {
  display: inline-flex; align-items: center; gap: 8px;
  padding: 9px 15px; border-radius: 15px;
  background: var(--surface); box-shadow: var(--up-sm);
  font-size: 13px; font-weight: 600; color: var(--ink2);
}
.pill {
  display: inline-block;
  font-size: 10px; font-weight: 800; letter-spacing: 0.07em;
  text-transform: uppercase; padding: 5px 10px; border-radius: 9px;
}
.pill.ok   { background: var(--mint-soft);   color: #0a7059; }
.pill.soon { background: var(--amber-soft);  color: #93590a; }
.pill.dead { background: var(--coral-soft);  color: #b02039; }
.pill.new  { background: var(--violet-soft); color: #4527be; }

.tile {
  width: 54px; height: 54px; border-radius: 19px; flex: none;
  display: grid; place-items: center;
  box-shadow:
    6px 6px 13px rgba(88, 78, 140, 0.22),
    -4px -4px 10px rgba(255, 255, 255, 0.72),
    inset -3px -3px 7px rgba(0, 0, 0, 0.1),
    inset 3px 3px 7px rgba(255, 255, 255, 0.55);
}
.t-bell { background: var(--violet-soft); color: #4b2fc4; }
.t-doc  { background: var(--sky-soft);    color: #1b7ca3; }
.t-mail { background: var(--mint-soft);   color: #0a7d61; }
.t-fam  { background: #f6d6f0;            color: #9c2c86; }
.t-lock { background: var(--amber-soft);  color: #a2650a; }
.t-off  { background: var(--peach);       color: #b65a2e; }
.t-warn { background: var(--coral-soft);  color: #c42744; }
.t-wa   { background: #c8f0d2;            color: #16794a; }

svg.ic {
  width: 22px; height: 22px; stroke: currentColor; stroke-width: 1.9;
  fill: none; stroke-linecap: round; stroke-linejoin: round;
}
svg.ic.sm { width: 17px; height: 17px; stroke-width: 2.1; }
svg.ic.lg { width: 26px; height: 26px; stroke-width: 1.8; }
svg.ic.fill { fill: currentColor; stroke: none; }

/* ---------- logo ----------
   The mark is the app's own icon (assets/icon.png, cut from the same
   master-icon-1024.png the launcher icons come from). It is an <img> rather
   than a lettermark, so the site cannot drift from what is on the phone. */
.logo {
  width: 44px; height: 44px; border-radius: 14px; flex: none;
  display: grid; place-items: center; overflow: hidden;
  background: linear-gradient(158deg, var(--mark-1), var(--mark-2));
  box-shadow:
    7px 8px 16px rgba(37, 34, 78, 0.34),
    -4px -4px 10px rgba(255, 255, 255, 0.6),
    inset -2px -2px 6px rgba(0, 0, 0, 0.28),
    inset 2px 2px 6px rgba(255, 255, 255, 0.18);
}
.logo img { width: 100%; height: 100%; display: block; object-fit: cover; }
.logo.big { width: 84px; height: 84px; border-radius: 26px; }
.logo.huge { width: clamp(96px, 9vw, 132px); height: clamp(96px, 9vw, 132px); border-radius: 30px; }
/* The text fallback, still used by the 404 badge. */
.logo > span {
  font-family: Fredoka, sans-serif; font-weight: 600; font-size: 21px;
  line-height: 1; color: #fff;
}
.logo.big > span { font-size: 30px; }

.brand { display: flex; align-items: center; gap: 12px; }
.brand:hover { text-decoration: none; }
.brand b {
  font-family: Fredoka, sans-serif; font-weight: 600; font-size: 21px;
  color: var(--ink); letter-spacing: -0.01em;
}

/* ---------- nav ---------- */
.nav { padding: 22px 0 6px; position: sticky; top: 0; z-index: 60; }
.nav .bar {
  display: flex; align-items: center; gap: 10px;
  background: var(--surface); border-radius: 24px; box-shadow: var(--up-sm);
  padding: 11px 14px 11px 16px;
  transition: box-shadow 0.3s var(--ease), padding 0.3s var(--ease),
              background-color 0.3s var(--ease);
}
.nav.stuck { padding-top: 12px; }
.nav.stuck .bar {
  box-shadow: var(--up-lg);
  padding-top: 8px; padding-bottom: 8px;
  background: rgba(244, 242, 253, 0.94);
  backdrop-filter: blur(14px);
}
.nav ul { list-style: none; display: flex; gap: 4px; margin-left: auto; align-items: center; }
.nav ul a {
  display: block; padding: 9px 14px; border-radius: 14px;
  font-size: 13.5px; font-weight: 600; color: var(--ink2);
  transition: color 0.2s var(--ease), background-color 0.2s var(--ease);
}
.nav ul a:hover { text-decoration: none; color: var(--ink); background: rgba(255, 255, 255, 0.55); }
.nav ul a[aria-current="page"] {
  color: var(--violet); background: var(--sunk); box-shadow: var(--in-sm);
}
.nav .cta { margin-left: 8px; }
.navtoggle { display: none; }

@media (max-width: 860px) {
  .nav .bar { flex-wrap: wrap; }
  .nav ul {
    order: 3; width: 100%; margin: 4px 0 0; flex-wrap: wrap; gap: 2px;
    justify-content: flex-start;
  }
  .nav .cta { margin-left: auto; }
}

/* Reading progress, on the long legal pages. Sits on the nav's own edge. */
.progress {
  position: fixed; inset: 0 auto auto 0; height: 3px; width: 100%;
  transform: scaleX(0); transform-origin: 0 50%;
  background: linear-gradient(90deg, var(--violet), var(--sky));
  z-index: 90; will-change: transform;
}

/* ---------- layout blocks ---------- */
main { flex: 1; }
section { padding: clamp(44px, 5vw, 76px) 0; }
section.tight { padding: clamp(28px, 3vw, 42px) 0; }
.sechead { max-width: 680px; margin-bottom: 34px; }
.sechead.center { margin-inline: auto; }
.sechead p { margin-top: 12px; color: var(--ink2); font-size: 15.5px; }

.grid { display: grid; gap: 22px; }
.g2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.g3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
.g4 { grid-template-columns: repeat(4, minmax(0, 1fr)); }
.g5 { grid-template-columns: repeat(5, minmax(0, 1fr)); }
@media (max-width: 1420px) { .g5 { grid-template-columns: repeat(3, minmax(0, 1fr)); } }
@media (max-width: 940px)  { .g5 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px)  { .g5 { grid-template-columns: minmax(0, 1fr); } }
@media (max-width: 1100px) { .g4 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 940px) { .g3 { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 620px) { .g2, .g3, .g4 { grid-template-columns: minmax(0, 1fr); } }

/* ---------- hero ---------- */
.hero { padding: clamp(30px, 4vw, 60px) 0 clamp(26px, 3vw, 44px); position: relative; }
.hero .inner {
  display: grid; grid-template-columns: minmax(0, 1.05fr) minmax(0, 0.95fr);
  gap: clamp(36px, 5vw, 80px); align-items: center;
}
.hero h1 { margin-bottom: 18px; }
.hero .lede { max-width: 720px; }
.herobtns { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 30px; }
.trust { display: flex; flex-wrap: wrap; gap: 10px; margin-top: 26px; }
@media (max-width: 1000px) {
  .hero .inner { grid-template-columns: minmax(0, 1fr); gap: 40px; }
  .hero .mock { justify-self: center; }
}

/* Two slow-drifting colour fields behind the hero. Pure decoration, and the
   only thing on the page that moves without being asked. */
.aurora {
  position: absolute; inset: -20% -10% auto -10%; height: 130%;
  pointer-events: none; z-index: -1; overflow: hidden;
}
.aurora i {
  position: absolute; display: block; border-radius: 50%;
  filter: blur(70px); opacity: 0.5;
}
.aurora i:nth-child(1) {
  width: 46vw; height: 46vw; left: -6vw; top: -8vw;
  background: radial-gradient(circle, #b9a3ff 0%, transparent 70%);
  animation: drift-a 26s var(--ease) infinite alternate;
}
.aurora i:nth-child(2) {
  width: 40vw; height: 40vw; right: -4vw; top: 4vw;
  background: radial-gradient(circle, #9fe0f5 0%, transparent 70%);
  animation: drift-b 32s var(--ease) infinite alternate;
}
.aurora i:nth-child(3) {
  width: 30vw; height: 30vw; left: 38vw; bottom: -10vw;
  background: radial-gradient(circle, #ffd0b8 0%, transparent 70%);
  animation: drift-c 38s var(--ease) infinite alternate;
}

/* store buttons */
.store {
  position: relative; overflow: hidden;
  display: inline-flex; align-items: center; gap: 12px;
  height: 60px; padding: 0 22px; border-radius: 20px;
  background: linear-gradient(158deg, var(--violet-2), var(--violet));
  color: #fff; box-shadow: var(--violet-up);
  transition: transform 0.24s var(--spring), box-shadow 0.24s var(--ease);
}
.store:hover { text-decoration: none; transform: translateY(-3px) scale(1.015); }
.store:active { transform: translateY(0) scale(0.99); }
.store.alt {
  background: var(--surface); color: var(--ink); box-shadow: var(--up);
}
.store svg { width: 26px; height: 26px; fill: currentColor; stroke: none; flex: none; }
.store .txt { display: flex; flex-direction: column; line-height: 1.15; text-align: left; }
.store .txt s { text-decoration: none; font-size: 10px; letter-spacing: 0.09em; text-transform: uppercase; opacity: 0.82; font-weight: 700; }
.store .txt b { font-family: Fredoka, sans-serif; font-weight: 500; font-size: 17px; }
/* A light sweeps across the face on hover. */
.store::after {
  content: ""; position: absolute; top: 0; bottom: 0; width: 55%;
  left: -70%; pointer-events: none;
  background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.42), transparent);
  transform: skewX(-18deg);
}
.store:hover::after { animation: sweep 0.75s var(--ease); }
.store.alt::after { background: linear-gradient(100deg, transparent, rgba(255, 255, 255, 0.9), transparent); }

/* ---------- phone mock ---------- */
.mock {
  width: clamp(300px, 26vw, 360px); border-radius: 42px; padding: 16px 14px 20px;
  background: var(--bg);
  box-shadow:
    20px 24px 44px rgba(76, 66, 124, 0.28),
    -10px -12px 30px rgba(255, 255, 255, 0.75),
    inset -3px -3px 8px rgba(88, 78, 140, 0.1),
    inset 3px 3px 8px rgba(255, 255, 255, 0.6);
  transform-style: preserve-3d;
  will-change: transform;
}
.mock .top {
  display: flex; align-items: center; gap: 10px; padding: 4px 8px 16px;
}
.mock .top .t { flex: 1; }
.mock .top .t b { display: block; font-family: Fredoka, sans-serif; font-weight: 500; font-size: 18px; }
.mock .top .t span { font-size: 11px; color: var(--ink3); }
.rrow {
  display: flex; align-items: center; gap: 12px;
  background: var(--surface); border-radius: 22px; box-shadow: var(--up-sm);
  padding: 11px 13px; margin-bottom: 11px;
}
.rrow .tt { flex: 1; min-width: 0; }
/* One line each, ellipsised — the deck's rule, so a long name cannot reflow the row. */
.rrow .tt b,
.rrow .tt span { display: block; white-space: nowrap; overflow: hidden; text-overflow: ellipsis; }
.rrow .tt b { font-size: 13.5px; font-weight: 700; letter-spacing: -0.01em; }
.rrow .tt span { font-size: 11px; color: var(--ink3); margin-top: 2px; }
.days {
  width: 54px; flex: none; text-align: center; border-radius: 18px;
  padding: 9px 0 8px; background: var(--surface); box-shadow: var(--up-sm);
  position: relative;
}
.days b { display: block; font-family: Fredoka, sans-serif; font-weight: 600; font-size: 19px; line-height: 1; color: var(--mint); }
.days s { display: block; text-decoration: none; font-size: 8.5px; letter-spacing: 0.1em; text-transform: uppercase; color: var(--ink3); margin-top: 3px; font-weight: 700; }
.days.soon {
  box-shadow:
    3px 3px 8px rgba(88, 78, 140, 0.16), -2px -2px 6px rgba(255, 255, 255, 0.8),
    inset -2px -2px 6px rgba(88, 78, 140, 0.1), inset 2px 2px 6px rgba(255, 255, 255, 0.6);
}
.days.soon b { color: var(--amber); }
.days.dead { background: var(--sunk); box-shadow: var(--in-sm); }
.days.dead b { color: var(--coral); font-size: 17px; }
.days.dead s { color: var(--coral); opacity: 0.75; }
/* The amber badge keeps a slow halo — the one row that is about to matter. */
.days.soon::after {
  content: ""; position: absolute; inset: 0; border-radius: inherit;
  box-shadow: 0 0 0 0 rgba(239, 154, 30, 0.5);
  animation: halo 3.6s ease-out infinite;
}

/* ---------- feature cards ---------- */
.feat { display: flex; flex-direction: column; gap: 14px; }
.feat h3 { font-size: 20px; }
.feat p { font-size: 14.5px; color: var(--ink2); line-height: 1.65; }
.card.feat { transition: transform 0.3s var(--ease), box-shadow 0.3s var(--ease); }
.card.feat:hover { transform: translateY(-6px); box-shadow: var(--up-lg); }
.card.feat .tile { transition: transform 0.45s var(--spring); }
.card.feat:hover .tile { transform: rotate(-7deg) scale(1.06); }

/* ---------- pricing ---------- */
.plans {
  display: grid; grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: clamp(20px, 2vw, 30px); align-items: stretch;
  max-width: 1020px; margin-inline: auto;
}
@media (max-width: 860px) { .plans { grid-template-columns: minmax(0, 1fr); max-width: 480px; } }
.plan { position: relative; display: flex; flex-direction: column; height: 100%; }
.plan.featured { box-shadow: var(--up-lg); }
.plan .tag { position: absolute; top: 18px; right: 18px; }
.plan .name { font-family: Fredoka, sans-serif; font-weight: 500; font-size: 23px; }
.plan .price { display: flex; align-items: baseline; gap: 7px; margin: 14px 0 4px; flex-wrap: wrap; }
.plan .price b { font-family: Fredoka, sans-serif; font-weight: 600; font-size: clamp(38px, 3.6vw, 48px); line-height: 1; }
.plan .price span { font-size: 13.5px; color: var(--ink3); font-weight: 600; }
.plan .sub { font-size: 13.5px; color: var(--ink2); min-height: 40px; }
.plan ul { list-style: none; margin: 22px 0 26px; display: flex; flex-direction: column; gap: 12px; }
.plan li { display: flex; gap: 11px; font-size: 14.5px; line-height: 1.5; align-items: flex-start; }
.plan li svg { flex: none; margin-top: 2px; color: var(--mint); }
.plan li.no { color: var(--ink3); }
.plan li.no svg { color: var(--ink3); }
.plan li.hi { font-weight: 700; color: var(--ink); }
.plan .foot { margin-top: auto; }
.plan .save {
  display: inline-block; font-size: 11px; font-weight: 800; letter-spacing: 0.05em;
  text-transform: uppercase; color: #0a7059; background: var(--mint-soft);
  border-radius: 8px; padding: 4px 8px; margin-left: 2px;
}

/* Period / currency switches. Real radios, so the page works with no
   JavaScript at all; `:has()` does the showing and hiding. */
.switches { display: flex; flex-wrap: wrap; gap: 14px; justify-content: center; margin-bottom: 34px; }
.seg {
  position: relative;   /* the radios are absolutely positioned inside it */
  display: inline-flex; gap: 4px; padding: 5px;
  background: var(--sunk); border-radius: 18px; box-shadow: var(--in-sm);
}
.seg input { position: absolute; opacity: 0; pointer-events: none; }
.seg label {
  display: inline-flex; align-items: center; gap: 7px; cursor: pointer;
  white-space: nowrap;
  padding: 10px 18px; border-radius: 14px;
  font-size: 13.5px; font-weight: 700; color: var(--ink2);
  transition: color 0.25s var(--ease), box-shadow 0.25s var(--ease),
              background-color 0.25s var(--ease), transform 0.25s var(--spring);
}
.seg label:hover { color: var(--ink); }
.seg input:checked + label {
  background: var(--surface); color: var(--violet); box-shadow: var(--up-sm);
  transform: translateY(-1px);
}
.seg input:focus-visible + label { outline: 3px solid var(--violet); outline-offset: 2px; }
.seg .off {
  font-size: 10px; font-weight: 800; letter-spacing: 0.04em;
  background: var(--mint-soft); color: #0a7059; border-radius: 7px; padding: 3px 6px;
}

/* One price is shown; the rest are held out of the accessibility tree too.
   The second axis is the *store*, not the country — Google Play and the App
   Store carry different prices, and each one is the same in every country. */
.pricebox:has(#per-y:checked) [data-per="m"],
.pricebox:not(:has(#per-y:checked)) [data-per="y"],
.pricebox:has(#store-ios:checked) [data-store="play"],
.pricebox:not(:has(#store-ios:checked)) [data-store="ios"] { display: none; }

/* ---------- comparison table ---------- */
.cmp { width: 100%; border-collapse: collapse; font-size: 15px; }
.cmp th, .cmp td { padding: 15px 16px; border-bottom: 1px solid rgba(88, 78, 140, 0.14); text-align: left; }
.cmp thead th { font-family: Fredoka, sans-serif; font-weight: 500; font-size: 18px; color: var(--ink); }
.cmp tbody th { font-weight: 700; color: var(--ink); font-size: 14.5px; }
.cmp td { color: var(--ink2); }
.cmp td.y { color: var(--mint); font-weight: 700; }
.cmp td.n { color: var(--ink3); }
.cmp tr:last-child td, .cmp tr:last-child th { border-bottom: 0; }
.cmp tbody tr { transition: background-color 0.2s var(--ease); }
.cmp tbody tr:hover { background: rgba(255, 255, 255, 0.5); }
.cmp .col-hi { background: rgba(207, 196, 255, 0.22); }

/* ---------- prose (legal pages) ---------- */
.prose { font-size: 15.5px; line-height: 1.75; color: var(--ink2); }
.prose > * + * { margin-top: 16px; }
.prose h2 {
  font-size: 24px; color: var(--ink); margin-top: 42px;
  padding-top: 26px; border-top: 1px solid rgba(88, 78, 140, 0.14);
  scroll-margin-top: 110px;
}
.prose h2:first-child { margin-top: 0; padding-top: 0; border-top: 0; }
.prose h3 { font-size: 17.5px; color: var(--ink); margin-top: 28px; font-weight: 600; }
.prose strong, .prose b { color: var(--ink); font-weight: 700; }
.prose ul, .prose ol { padding-left: 22px; display: flex; flex-direction: column; gap: 9px; }
.prose li::marker { color: var(--violet); }
.prose code {
  font-family: ui-monospace, SFMono-Regular, Menlo, monospace; font-size: 0.88em;
  background: var(--sunk); box-shadow: var(--in-sm);
  border-radius: 7px; padding: 2px 7px; color: var(--ink);
}
.prose table { width: 100%; border-collapse: collapse; font-size: 14.5px; }
.prose .tablewrap { overflow-x: auto; }
.prose th, .prose td { text-align: left; padding: 12px 14px; border-bottom: 1px solid rgba(88, 78, 140, 0.14); vertical-align: top; }
.prose th { color: var(--ink); font-weight: 700; font-size: 12.5px; letter-spacing: 0.05em; text-transform: uppercase; }
.prose tr:last-child td { border-bottom: 0; }

.callout {
  display: flex; gap: 16px; align-items: flex-start;
  background: var(--sunk); border-radius: 22px; box-shadow: var(--in-sm);
  padding: 20px 22px; font-size: 14.5px; line-height: 1.65;
}
.callout .tile { width: 42px; height: 42px; border-radius: 15px; }
.callout b { color: var(--ink); }

.updated {
  display: inline-flex; align-items: center; gap: 9px;
  font-size: 12.5px; font-weight: 700; color: var(--ink2);
  background: var(--surface); box-shadow: var(--up-sm);
  border-radius: 14px; padding: 8px 14px; margin-top: 18px;
}

/* table of contents */
.toc { margin-bottom: 34px; }
.toc ol { list-style: none; counter-reset: t; display: grid; grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 6px 20px; }
@media (max-width: 620px) { .toc ol { grid-template-columns: minmax(0, 1fr); } }
.toc li { counter-increment: t; }
.toc a {
  display: flex; gap: 10px; padding: 7px 10px; font-size: 14px; font-weight: 600;
  color: var(--ink2); border-radius: 11px;
  transition: color 0.2s var(--ease), background-color 0.2s var(--ease);
}
.toc a::before { content: counter(t); color: var(--violet); font-family: Fredoka, sans-serif; min-width: 18px; }
.toc a:hover { color: var(--violet); text-decoration: none; background: rgba(255, 255, 255, 0.55); }
.toc a.here { color: var(--violet); background: var(--surface); box-shadow: var(--up-sm); }

/* ---------- forms ---------- */
.field {
  background: var(--sunk); border-radius: 18px; box-shadow: var(--in-sm);
  padding: 4px 16px; display: flex; align-items: center; gap: 11px;
  transition: box-shadow 0.25s var(--ease);
}
.field input, .field textarea, .field select {
  all: unset; flex: 1; font: inherit; font-size: 15px; color: var(--ink);
  padding: 14px 0; width: 100%; box-sizing: border-box;
}
.field textarea { min-height: 120px; resize: vertical; line-height: 1.6; }
.field:focus-within { box-shadow: var(--in-sm), 0 0 0 2px var(--violet-soft); }
.flab {
  display: block; font-size: 11.5px; font-weight: 700; letter-spacing: 0.08em;
  text-transform: uppercase; color: var(--ink3); margin: 0 0 8px 5px;
}
.fgroup + .fgroup { margin-top: 20px; }

/* The one address on the site, with a copy button beside it. */
.mailrow { display: flex; flex-wrap: wrap; gap: 12px; align-items: center; }
.copied {
  font-size: 12.5px; font-weight: 700; color: #0a7059;
  background: var(--mint-soft); border-radius: 10px; padding: 6px 11px;
}

/* ---------- footer ---------- */
footer {
  margin-top: 40px; padding: 46px 0 40px;
  border-top: 1px solid rgba(88, 78, 140, 0.14);
}
footer .cols {
  display: grid; grid-template-columns: minmax(0, 1.4fr) repeat(3, minmax(0, 1fr));
  gap: 34px;
}
@media (max-width: 860px) { footer .cols { grid-template-columns: repeat(2, minmax(0, 1fr)); } }
@media (max-width: 520px) { footer .cols { grid-template-columns: minmax(0, 1fr); } }
footer h5 {
  font-size: 11.5px; letter-spacing: 0.14em; text-transform: uppercase;
  color: var(--ink3); font-weight: 800; margin-bottom: 14px;
}
footer ul { list-style: none; display: flex; flex-direction: column; gap: 10px; }
footer ul a {
  font-size: 14px; color: var(--ink2); font-weight: 600;
  transition: color 0.2s var(--ease), transform 0.2s var(--ease);
  display: inline-block;
}
footer ul a:hover { color: var(--violet); transform: translateX(3px); }
footer .about p { font-size: 13.5px; color: var(--ink2); margin-top: 14px; max-width: 340px; line-height: 1.65; }
.legalbar {
  margin-top: 38px; padding-top: 22px;
  border-top: 1px solid rgba(88, 78, 140, 0.14);
  display: flex; flex-wrap: wrap; gap: 12px 22px; align-items: center;
  font-size: 12.5px; color: var(--ink3);
}
.legalbar .ml { margin-left: auto; }

/* ==========================================================================
   MOTION
   Everything below is progressive. `.js` is set by assets/site.js before the
   body parses; without it nothing here hides anything, so a blocked or failed
   script leaves a complete page.
   ========================================================================== */

@keyframes rise-in {
  from { opacity: 0; transform: translate3d(0, 26px, 0); }
  to   { opacity: 1; transform: none; }
}
@keyframes sweep {
  from { left: -70%; }
  to   { left: 130%; }
}
@keyframes halo {
  0%       { box-shadow: 0 0 0 0 rgba(239, 154, 30, 0.5); }
  70%, 100% { box-shadow: 0 0 0 12px rgba(239, 154, 30, 0); }
}
@keyframes float-y {
  from { transform: translateY(-8px); }
  to   { transform: translateY(8px); }
}
@keyframes drift-a {
  from { transform: translate3d(0, 0, 0) scale(1); }
  to   { transform: translate3d(6vw, 4vw, 0) scale(1.15); }
}
@keyframes drift-b {
  from { transform: translate3d(0, 0, 0) scale(1.1); }
  to   { transform: translate3d(-7vw, 5vw, 0) scale(0.95); }
}
@keyframes drift-c {
  from { transform: translate3d(0, 0, 0) scale(0.9); }
  to   { transform: translate3d(-5vw, -4vw, 0) scale(1.2); }
}
@keyframes underline-in {
  from { transform: scaleX(0); }
  to   { transform: scaleX(1); }
}
@keyframes pop-in {
  0%   { opacity: 0; transform: scale(0.86); }
  100% { opacity: 1; transform: scale(1); }
}
@keyframes wobble {
  0%, 100% { transform: rotate(0deg); }
  25%      { transform: rotate(-5deg); }
  75%      { transform: rotate(5deg); }
}
@keyframes roll-in {
  from { opacity: 0; transform: translateY(0.4em); }
  to   { opacity: 1; transform: none; }
}

/* Scroll reveal. `--d` staggers siblings; site.js sets it where a group needs it. */
.js [data-rise] { opacity: 0; }
.js [data-rise].in {
  /* `opacity: 1` is load-bearing, not belt-and-braces. Without it the only thing
     holding a revealed element visible is the animation's `both` fill mode — so
     anything that later sets `animation: none` on it (the mock does, to hand the
     transform over to the pointer tilt) drops it straight back to opacity 0 and
     the element disappears. */
  opacity: 1;
  animation: rise-in 0.72s var(--ease) both;
  animation-delay: var(--d, 0s);
}
.js [data-rise="pop"].in { animation-name: pop-in; animation-duration: 0.55s; animation-timing-function: var(--spring); }

/* The highlighted word in a headline underlines itself once, on reveal. */
em.hl::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -0.06em; height: 0.11em;
  border-radius: 99px; background: var(--violet-soft);
  transform: scaleX(0); transform-origin: 0 50%; z-index: -1;
}
.js em.hl::after { animation: underline-in 0.85s var(--ease) 0.5s both; }

/* Idle float on the hero mock — suspended while the pointer is tilting it. */
.js .mock { animation: float-y 6s ease-in-out infinite alternate; }
.js .mock.tilting { animation: none; transition: transform 0.12s linear; }
.js .mock.resetting { animation: none; transition: transform 0.6s var(--ease); }

/* Feature icons draw themselves in.
   The icons are <use> references into a <symbol>, so their paths live in a
   shadow tree that script cannot measure. stroke-dasharray and
   stroke-dashoffset are *inherited* presentation properties, though, so
   setting them on the <svg> reaches the paths inside. 210 is longer than any
   path in the sprite, which is all the trick needs: offset 210 lands the whole
   stroke in the gap, and animating it to 0 walks the ink back on. */
.js .drawn { stroke-dasharray: 210; stroke-dashoffset: 210; }
.js .drawn.in { stroke-dashoffset: 0; transition: stroke-dashoffset 1s var(--ease) 0.15s; }

/* Primary calls to action lean very slightly toward the pointer.
   site.js writes --mx/--my rather than `transform`, so the hover lift below
   can compose with the drift instead of being clobbered by an inline style. */
.magnet { --mx: 0px; --my: 0px; transform: translate(var(--mx), var(--my)); }
.store.magnet { transition: transform 0.32s var(--spring), box-shadow 0.24s var(--ease); }
.store.magnet:hover { transform: translate(var(--mx), var(--my)) translateY(-3px) scale(1.015); }
.store.magnet:active { transform: translate(var(--mx), var(--my)) scale(0.99); }
.btn.magnet { transition: transform 0.32s var(--spring), box-shadow 0.18s var(--ease); }
.btn.magnet:hover { transform: translate(var(--mx), var(--my)) translateY(-2px); }
.btn.magnet:active { transform: translate(var(--mx), var(--my)) translateY(1px); }

/* A price that has just changed rolls into place. */
.rolling { animation: roll-in 0.4s var(--ease) both; }

.wobbling { animation: wobble 0.7s var(--ease) both; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
    scroll-behavior: auto !important;
  }
  html { scroll-behavior: auto; }
  .js [data-rise], .js [data-rise].in { opacity: 1 !important; transform: none !important; }
  .js .drawn { stroke-dashoffset: 0 !important; }
  em.hl::after { transform: scaleX(1); }
  .aurora { display: none; }
}
