:root{
  /* pulled from static/css/loft.css so this matches the app */
  --ink:#14141f;
  --ink-2:#1e1e2c;
  --band:#26266b;
  --band-2:#1f1f59;
  --card:#1c1c50;
  --accent:#5b5bd6;
  --accent-600:#4a4ac4;
  --peri:#c9c9fb;
  --cream:#efe3b0;
  --amber:#dd9a2f;

  --w:rgba(255,255,255,.92);
  --w-70:rgba(255,255,255,.68);
  --w-45:rgba(255,255,255,.45);
  --w-12:rgba(255,255,255,.12);
  --w-07:rgba(255,255,255,.07);

  --display:"Archivo",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  --body:"Inter",-apple-system,BlinkMacSystemFont,"Segoe UI",sans-serif;
  --mono:"JetBrains Mono",ui-monospace,SFMono-Regular,Menlo,monospace;

  --max:1180px;
  --pad:clamp(20px,5vw,40px);
  --sect:clamp(72px,9vw,124px);
  --r:12px;
}

*{margin:0;padding:0;box-sizing:border-box}
html{scroll-behavior:smooth}
body{
  font-family:var(--body);
  background:var(--ink);
  color:var(--w-70);
  font-size:16px;
  line-height:1.65;
  -webkit-font-smoothing:antialiased;
  /* clip, not hidden. Overflow set on <body> propagates to the viewport, and `hidden`
     would turn the viewport into a scroll container, which breaks position:sticky on
     the nav. This is only a backstop — the real mobile overflow sources (nav row, the
     comparison table) are fixed at their origin in the media queries below. */
  overflow-x:clip;
}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
:focus-visible{outline:2px solid var(--cream);outline-offset:3px;border-radius:4px}

.wrap{max-width:var(--max);margin:0 auto;padding-inline:var(--pad)}
.sect{padding-block:var(--sect)}

h1,h2,h3{font-family:var(--display);color:#fff;line-height:1.1;letter-spacing:-.02em;font-weight:600}
h1{font-size:clamp(2.3rem,5.2vw,3.9rem);letter-spacing:-.03em}
h2{font-size:clamp(1.8rem,3.4vw,2.7rem)}
h3{font-size:1.16rem;line-height:1.35;letter-spacing:-.01em}

.eyebrow{
  font-family:var(--mono);font-size:.72rem;font-weight:500;
  letter-spacing:.16em;text-transform:uppercase;color:var(--peri);
  display:block;margin-bottom:16px;
}

/* ---------- promo bar ---------- */
.promo{
  background:var(--band);border-bottom:1px solid var(--w-12);
  font-size:.85rem;color:var(--w);
}
.promo .wrap{display:flex;align-items:center;justify-content:center;gap:12px;padding-block:11px;text-align:center}
.promo a{color:var(--cream);text-decoration:underline;text-underline-offset:3px;white-space:nowrap}
.promo button{
  background:none;border:0;color:var(--w-45);cursor:pointer;
  font-size:1.15rem;line-height:1;padding:2px 4px;margin-left:auto;flex-shrink:0;
}
.promo button:hover{color:#fff}

/* ---------- nav ---------- */
.nav{
  position:sticky;top:0;z-index:60;
  background:rgba(20,20,31,.82);backdrop-filter:blur(14px);
  border-bottom:1px solid var(--w-07);
}
.nav .wrap{display:flex;align-items:center;gap:36px;height:66px}
.logo{
  font-family:var(--display);font-weight:700;font-size:1.24rem;
  color:#fff;letter-spacing:-.03em;display:flex;align-items:center;gap:10px;
}
.brand-mark{height:36px;width:auto;flex-shrink:0;display:block}
.brand-word{font-weight:700;letter-spacing:-.02em;line-height:1}
.brand-word span{font-weight:500;color:#8f8fec}
.ft-grid .brand-mark{height:31px}
.nav-links{display:flex;gap:30px;font-size:.92rem;margin-left:8px}
.nav-links a{color:var(--w-70);transition:color .18s}
.nav-links a:hover{color:#fff}
.nav-cta{margin-left:auto;display:flex;align-items:center;gap:20px}
.nav-signin{color:var(--w-70);font-size:.9rem;transition:color .18s;white-space:nowrap}
.nav-signin:hover{color:#fff}

.btn{
  display:inline-flex;align-items:center;gap:9px;
  font-family:var(--body);font-weight:600;font-size:.93rem;
  padding:12px 22px;border-radius:8px;border:1px solid transparent;
  cursor:pointer;transition:transform .16s,background .18s,border-color .18s;
  /* a button label that breaks across two lines reads as broken, not as wrapped */
  white-space:nowrap;
}
.btn:hover{transform:translateY(-1px)}
.btn-primary{background:var(--accent);color:#fff}
.btn-primary:hover{background:var(--accent-600)}
.btn-ghost{border-color:var(--w-12);color:var(--w);background:transparent}
.btn-ghost:hover{border-color:var(--peri);color:#fff}
.btn-cream{background:var(--cream);color:var(--ink)}
.btn-cream:hover{background:#f6efc9}
.btn .arw{transition:transform .18s}
.btn:hover .arw{transform:translateX(3px)}
.btn-lg{padding:17px 34px;font-size:1.05rem;border-radius:9px;gap:11px}

/* ---------- hero ---------- */
.hero{position:relative;overflow:hidden;padding-block:clamp(56px,7vw,92px) var(--sect)}
.hero::before{
  content:"";position:absolute;inset:0;pointer-events:none;
  background:
    radial-gradient(760px 460px at 78% 8%,rgba(91,91,214,.30),transparent 62%),
    radial-gradient(560px 380px at 6% 92%,rgba(38,38,107,.42),transparent 66%);
}
.hero .wrap{position:relative;display:grid;grid-template-columns:1.02fr .98fr;gap:clamp(36px,5vw,68px);align-items:center}
.hero h1 .h1-verbs{color:var(--peri)}
.hero h1 .accent{
  color:var(--cream);
  /* subtle hand-drawn underline so the promise reads as the thesis */
  background-image:linear-gradient(var(--cream),var(--cream));
  background-size:100% 2px;background-repeat:no-repeat;background-position:0 100%;
  padding-bottom:2px;
}
.hero p.lede{font-size:1.09rem;margin-top:22px;max-width:52ch;color:var(--w-70)}
.hero-cta{display:flex;flex-wrap:wrap;gap:14px;margin-top:32px}
.certline{
  margin-top:30px;padding-top:22px;border-top:1px solid var(--w-07);
  font-family:var(--mono);font-size:.76rem;color:var(--w-45);letter-spacing:.02em;
}

/* ---------- signature: the cadence card ---------- */
.cadence{
  background:linear-gradient(168deg,var(--band) 0%,var(--band-2) 100%);
  border:1px solid var(--w-12);border-radius:16px;
  padding:26px 24px 24px;box-shadow:0 30px 80px rgba(10,10,30,.55);
}
.cadence-hd{
  display:flex;align-items:center;justify-content:space-between;
  padding-bottom:18px;margin-bottom:6px;border-bottom:1px solid var(--w-12);
}
.cadence-hd span{font-family:var(--mono);font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--peri)}
.pill{
  font-family:var(--mono);font-size:.68rem;letter-spacing:.08em;
  background:rgba(239,227,176,.14);color:var(--cream);
  padding:5px 10px;border-radius:99px;border:1px solid rgba(239,227,176,.22);
}
/* `.cadence-hd span` above is one specificity point heavier than `.pill`, so without
   this the pill silently rendered at .72rem/.14em in periwinkle instead of its own
   cream. That extra tracking is also ~25px of width, which is what pushed the header
   row past the card on narrow screens. Do not fold this back into .pill. */
.cadence-hd .pill{font-size:.68rem;letter-spacing:.08em;color:var(--cream)}
/* Gutter maths, kept in sync deliberately: the day label must END before the rail
   line begins, or the step dot renders on top of the text. With padding-left 92 the
   label spans 0-48px, the line sits at 62px, and the 9px dot (left:-34px) spans
   58-67px so it stays centred on the line. Change one, recheck all four. */
.rail{position:relative;padding-left:92px;padding-top:22px}
.rail::before{
  content:"";position:absolute;left:62px;top:34px;bottom:14px;width:1px;
  background:linear-gradient(var(--w-12),rgba(255,255,255,.02));
}
.step{position:relative;margin-bottom:14px}
.step:last-child{margin-bottom:0}
.day{
  position:absolute;left:-92px;top:12px;width:48px;text-align:right;
  font-family:var(--mono);font-size:.7rem;color:var(--w-45);letter-spacing:.05em;
}
.step::before{
  content:"";position:absolute;left:-34px;top:17px;
  width:9px;height:9px;border-radius:50%;background:var(--peri);
  box-shadow:0 0 0 4px var(--band-2);
}
.step.live::before{background:var(--cream)}
.mail{
  background:var(--card);border:1px solid var(--w-12);
  border-radius:10px;padding:14px 16px;
}
.mail .subj{color:#fff;font-weight:600;font-size:.91rem;margin-bottom:7px;letter-spacing:-.005em}
.mail .bd{font-size:.85rem;line-height:1.55;color:var(--w-70)}
.mail mark{background:rgba(239,227,176,.17);color:var(--cream);padding:1px 4px;border-radius:3px}
.mail .meta{
  display:flex;gap:14px;margin-top:11px;padding-top:10px;border-top:1px solid var(--w-07);
  font-family:var(--mono);font-size:.68rem;color:var(--w-45);
}
.cadence-ft{
  margin-top:20px;padding-top:16px;border-top:1px solid var(--w-12);
  font-family:var(--mono);font-size:.7rem;color:var(--w-45);
  display:flex;justify-content:space-between;flex-wrap:wrap;gap:8px;
}
.cadence-ft b{color:var(--peri);font-weight:500}

/* ---------- cadence: staged reveal ----------
   Each step rises in, its subject wipes across in discrete jumps (steps() is what
   makes it read as typing rather than a fade), then the body and meta appear.
   Delays are hand-sequenced rather than derived from nth-child arithmetic so the
   rhythm can be tuned per step. Every property zeroed here is forced back to its
   visible state in the reduced-motion block at the foot of this file. Miss that
   and the whole card renders blank for anyone who has motion turned down. */
.cadence .step{opacity:0;animation:stepIn .5s cubic-bezier(.33,.6,.3,1) both}
.cadence .step:nth-child(1){animation-delay:.40s}
.cadence .step:nth-child(2){animation-delay:1.75s}
.cadence .step:nth-child(3){animation-delay:3.10s}

.cadence .subj{clip-path:inset(0 100% 0 0);animation:typeIn .8s steps(26,end) both}
.cadence .step:nth-child(1) .subj{animation-delay:.70s}
.cadence .step:nth-child(2) .subj{animation-delay:2.05s}
.cadence .step:nth-child(3) .subj{animation-delay:3.40s}

.cadence .bd,.cadence .meta{opacity:0;animation:softIn .45s ease both}
.cadence .step:nth-child(1) .bd{animation-delay:1.50s}
.cadence .step:nth-child(1) .meta{animation-delay:1.65s}
.cadence .step:nth-child(2) .bd{animation-delay:2.85s}
.cadence .step:nth-child(2) .meta{animation-delay:3.00s}
.cadence .step:nth-child(3) .bd{animation-delay:4.20s}
.cadence .step:nth-child(3) .meta{animation-delay:4.35s}

@keyframes stepIn{from{opacity:0;transform:translateY(10px)}to{opacity:1;transform:none}}
@keyframes typeIn{to{clip-path:inset(0 0 0 0)}}
@keyframes softIn{to{opacity:1}}

/* ---------- logo marquee ---------- */
.logos{border-block:1px solid var(--w-07);padding-block:44px;background:rgba(255,255,255,.014)}
.logos p{
  text-align:center;font-family:var(--mono);font-size:.73rem;
  letter-spacing:.15em;text-transform:uppercase;color:var(--w-45);margin-bottom:30px;
}
/* One period of the animation must equal exactly one group's width, so each group
   carries its own trailing gap as padding rather than relying on a gap between the
   two groups — otherwise translateX(-50%) lands half a gap short and the strip
   visibly jumps on every loop. */
/* The -webkit- prefix is not redundant: iOS Safari below 15.4 ignores the unprefixed
   property entirely and the strip renders with hard cut edges.
   The compositing hints on the track are load-bearing on iOS. Safari rasterises a
   masked subtree once and then reuses that bitmap, so the marquee painted at its start
   offset and never appeared to move even though the animation was technically running.
   Promoting the track to its own layer (translate3d + will-change) forces the transform
   onto the compositor, where the mask cannot flatten it. landing.js samples the matrix
   after first paint and drives the strip from rAF if it is somehow still stuck. */
.marquee{
  overflow:hidden;
  -webkit-mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
  mask-image:linear-gradient(90deg,transparent,#000 12%,#000 88%,transparent);
}
.marquee-track{
  display:flex;width:max-content;
  animation:slide 46s linear infinite;
  will-change:transform;
  transform:translate3d(0,0,0);
  -webkit-backface-visibility:hidden;backface-visibility:hidden;
}
.marquee-group{display:flex;gap:60px;padding-right:60px;flex:0 0 auto}
@keyframes slide{from{transform:translate3d(0,0,0)}to{transform:translate3d(-50%,0,0)}}
.marquee-track span{
  font-family:var(--display);font-weight:600;font-size:1.16rem;
  color:var(--w-45);white-space:nowrap;letter-spacing:-.01em;
}

/* ---------- problem ---------- */
.problem{background:var(--ink-2)}
.problem h2{max-width:19ch}
.pain-grid{display:grid;grid-template-columns:repeat(2,1fr);gap:2px;margin-top:52px;background:var(--w-07);border:1px solid var(--w-07);border-radius:var(--r);overflow:hidden}
.pain{background:var(--ink-2);padding:30px 28px}
.pain h3{margin-bottom:11px;color:var(--peri)}
.pain p{font-size:.95rem}
.result{
  margin-top:34px;padding:24px 28px;border-left:3px solid var(--cream);
  background:rgba(239,227,176,.05);border-radius:0 var(--r) var(--r) 0;
}
.result strong{color:var(--cream);font-weight:600}
.result p{color:var(--w);font-size:1.03rem}

/* ---------- features ---------- */
.feat{display:grid;grid-template-columns:1fr 1fr;gap:clamp(36px,6vw,80px);align-items:center;margin-bottom:var(--sect)}
.feat:last-child{margin-bottom:0}
.feat.flip .feat-txt{order:2}
.feat h2{font-size:clamp(1.55rem,2.7vw,2.15rem);max-width:17ch}
.feat p.sub{margin-top:18px;font-size:1rem}
.feat ul{list-style:none;margin-top:26px;display:grid;gap:13px}
.feat li{position:relative;padding-left:28px;font-size:.95rem}
.feat li::before{
  content:"";position:absolute;left:0;top:.55em;
  width:7px;height:7px;border-radius:2px;background:var(--accent);
  transform:rotate(45deg);
}
.shot{
  background:linear-gradient(158deg,var(--band) 0%,var(--band-2) 100%);
  border:1px solid var(--w-12);border-radius:14px;
  aspect-ratio:4/3;display:grid;place-items:center;padding:18px;
  box-shadow:0 22px 60px rgba(10,10,30,.4);
}
.shot svg{width:100%;height:auto;display:block}

/* ---------- inline SVG product graphics ----------
   Styling lives here rather than in a <style> block inside each <svg>: the app's CSP
   has no style-src 'unsafe-inline', so inline SVG stylesheets would be dropped.
   Presentation attributes are avoided for the same reason of keeping colour in one
   place — every fill below resolves to a token from :root. */
.g-panel{fill:rgba(15,15,42,.62);stroke:var(--w-12);stroke-width:1}
.g-card{fill:var(--card);stroke:var(--w-12);stroke-width:1}
.g-line{stroke:var(--w-12);stroke-width:1}
.g-grid{stroke:var(--w-07);stroke-width:1}
.g-mono{font-family:var(--mono);font-size:10px;font-weight:500;letter-spacing:1.7px}
.g-sm{font-family:var(--mono);font-size:8.5px;font-weight:500;letter-spacing:1.1px}
.g-txt{font-family:var(--body);font-size:10.5px;font-weight:500}
.g-peri{fill:var(--peri)}
.g-cream{fill:var(--cream)}
.g-amber{fill:var(--amber)}
.g-white{fill:#fff}
.g-dim{fill:var(--w-45)}
.g-ink{fill:var(--ink)}
.g-accent{fill:var(--accent)}
.g-avatar{fill:rgba(201,201,251,.22);stroke:rgba(201,201,251,.35);stroke-width:1}
.g-bar{fill:rgba(255,255,255,.16)}
.g-bar-hi{fill:rgba(255,255,255,.4)}
.g-chip{fill:rgba(201,201,251,.12);stroke:rgba(201,201,251,.26);stroke-width:1}
.g-chip-c{fill:rgba(239,227,176,.14);stroke:rgba(239,227,176,.26);stroke-width:1}
.g-track{fill:rgba(255,255,255,.09)}
.g-fill{fill:var(--peri)}
.g-fill-warn{fill:var(--amber)}
.g-dot-ok{fill:var(--cream)}
.g-dot-warn{fill:var(--amber)}
.g-col{fill:rgba(201,201,251,.34)}
.g-row{fill:rgba(255,255,255,.035);stroke:var(--w-07);stroke-width:1}
.g-row-on{fill:rgba(239,227,176,.08);stroke:rgba(239,227,176,.22);stroke-width:1}
.g-col-hi{fill:var(--cream)}
.g-cream-sq{fill:var(--cream)}
.g-bubble-me{fill:var(--accent);stroke:rgba(255,255,255,.14);stroke-width:1}
.g-confirm{fill:rgba(239,227,176,.07);stroke:rgba(239,227,176,.24);stroke-width:1}
.g-confirm-edge{fill:var(--cream)}
.g-btn-go{fill:var(--cream)}
.g-btn-no{fill:rgba(255,255,255,.08);stroke:var(--w-12);stroke-width:1}
.g-input{fill:rgba(255,255,255,.05);stroke:var(--w-12);stroke-width:1}

/* ---------- comparison ---------- */
/* ---------- assistant ---------- */
/* Deliberately not ink-2: the sections either side of it use that, so the accent
   wash is what makes this read as a highlight rather than another content band. */
.assistant{
  position:relative;border-block:1px solid var(--w-07);
  background:
    radial-gradient(680px 380px at 82% 18%,rgba(91,91,214,.22),transparent 64%),
    radial-gradient(520px 340px at 4% 90%,rgba(38,38,107,.34),transparent 68%),
    var(--ink);
}
.assistant .feat{margin-bottom:0}

/* ---------- comparison ---------- */
.compare{background:var(--ink-2)}
.compare .intro{max-width:64ch;margin-top:22px}
.compare .intro p+p{margin-top:16px}
/* The thesis line. Highlighter treatment, deliberately NOT a chip: the border, the 9px
   radius and the 11px/20px padding it used to carry made it read as a call to action
   and people tried to tap it. Same visual language as `.mail mark` in the cadence card.
   The highlight lives on the inner span because a background on the block would run the
   full column width; box-decoration-break keeps the mark tight to each line when the
   sentence wraps on narrow screens. */
.compare .intro p.claim{margin-top:26px}
.compare .intro p.claim span{
  font-family:var(--display);font-weight:600;
  font-size:clamp(1.15rem,2.2vw,1.5rem);line-height:1.75;letter-spacing:-.015em;
  color:var(--cream);background:rgba(239,227,176,.15);
  padding:.1em .28em;border-radius:3px;
  -webkit-box-decoration-break:clone;box-decoration-break:clone;
}
.tbl-scroll{
  overflow-x:auto;margin-top:46px;border:1px solid var(--w-12);border-radius:var(--r);
  -webkit-overflow-scrolling:touch;
  /* stops a swipe that runs off the end of the table from triggering the browser's
     back-navigation gesture on iOS */
  overscroll-behavior-x:contain;
}
/* Surfaced only under 720px, where the table has to be swiped to be read at all. */
.tbl-hint{display:none}
table{width:100%;border-collapse:collapse;min-width:760px;font-size:.9rem}
th,td{padding:16px 18px;text-align:left;border-bottom:1px solid var(--w-07)}
thead th{
  background:var(--band-2);color:#fff;font-family:var(--display);
  font-weight:600;font-size:.88rem;letter-spacing:-.005em;
  position:sticky;top:0;
}
thead th:first-child{width:34%}
thead th.us{background:var(--band);color:var(--cream)}
tbody tr:last-child td{border-bottom:0}
tbody tr:hover{background:var(--w-07)}
td.us{background:rgba(239,227,176,.045);color:var(--w)}
.mk{font-weight:600;font-family:var(--mono);font-size:.95rem}
.mk.y{color:var(--cream)}
.mk.n{color:rgba(255,255,255,.3)}
.mk.p{color:var(--amber)}
/* Colour is reserved for the SalesWind column. Every other column — header cells and
   the Capability labels included — reads as one flat grey, so the eye lands on ours
   instead of bouncing between amber and cream across the row.
   Specificity does the work: td:not(.us) .mk is (0,2,1), which beats .mk.y/.mk.n/.mk.p
   (all 0,2,0) without !important and without editing those three rules. Likewise
   thead th:not(.us) is (0,1,2), beating thead th (0,0,2).
   Worth knowing: every .us cell currently uses .mk.y, so the .n and .p rules above are
   now inert in this table. They stay because they still apply if a .us cell ever needs
   them — don't delete them as dead code. */
td:not(.us) .mk{color:var(--w-70)}
thead th:not(.us){color:var(--w-70)}
td small{display:block;font-size:.78rem;color:var(--w-45);margin-top:2px;font-family:var(--body)}
.tbl-asof{margin-top:16px;font-size:.8rem;color:var(--w-45);max-width:70ch}

/* ---------- testimonial ---------- */
.quote{
  border-left:3px solid var(--cream);padding:6px 0 6px 32px;margin-top:56px;max-width:76ch;
}
.quote p{
  font-family:var(--display);font-size:clamp(1.15rem,2.2vw,1.5rem);
  line-height:1.45;color:#fff;font-weight:500;letter-spacing:-.015em;
}
.quote footer{margin-top:20px;font-size:.9rem;color:var(--w-45)}
.quote footer b{color:var(--peri);font-weight:600}

/* ---------- faq ---------- */
.faq-list{margin-top:44px;border-top:1px solid var(--w-12)}
details{border-bottom:1px solid var(--w-12)}
summary{
  list-style:none;cursor:pointer;padding:22px 46px 22px 0;position:relative;
  font-family:var(--display);font-weight:500;font-size:1.06rem;color:#fff;
  letter-spacing:-.01em;line-height:1.4;transition:color .18s;
}
summary::-webkit-details-marker{display:none}
summary:hover{color:var(--peri)}
summary::after{
  content:"";position:absolute;right:8px;top:50%;
  width:9px;height:9px;margin-top:-6px;
  border-right:1.5px solid var(--peri);border-bottom:1.5px solid var(--peri);
  transform:rotate(45deg);transition:transform .22s;
}
details[open] summary::after{transform:rotate(-135deg);margin-top:-2px}
details p{padding:0 40px 24px 0;font-size:.95rem;max-width:78ch}

/* ---------- close ---------- */
.close{background:linear-gradient(168deg,var(--band) 0%,var(--band-2) 100%);text-align:center}
.close h2{max-width:20ch;margin-inline:auto}
.close p.lede{max-width:60ch;margin:22px auto 0;color:var(--w)}
.close .hero-cta{justify-content:center}
.close .fine{margin-top:26px;font-family:var(--mono);font-size:.76rem;color:var(--w-45)}

/* ---------- team pricing ---------- */
.teams{
  margin:52px auto 0;max-width:720px;text-align:left;
  display:flex;align-items:center;justify-content:space-between;gap:28px;flex-wrap:wrap;
  padding:24px 28px;border:1px solid var(--w-12);border-radius:var(--r);
  background:rgba(255,255,255,.045);
}
.teams-txt{flex:1 1 320px}
.teams h3{color:#fff;margin-bottom:8px}
.teams p{font-size:.92rem;color:var(--w-70);margin:0}
.teams .btn{flex-shrink:0}
@media(max-width:720px){
  .teams{text-align:center;justify-content:center}
  .teams-txt{flex-basis:auto}
}

/* ---------- footer ---------- */
footer.ft{border-top:1px solid var(--w-07);padding-block:56px 34px;font-size:.89rem}
.ft-grid{display:grid;grid-template-columns:1.5fr repeat(3,1fr);gap:40px}
.ft-grid h4{
  font-family:var(--mono);font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;
  color:var(--w-45);margin-bottom:16px;font-weight:500;
}
.ft-grid ul{list-style:none;display:grid;gap:10px}
.ft-grid a:hover{color:#fff}
.ft-blurb{max-width:34ch;margin-top:16px;font-size:.88rem;color:var(--w-45)}
.ft-btm{
  margin-top:48px;padding-top:24px;border-top:1px solid var(--w-07);
  display:flex;justify-content:space-between;gap:16px;flex-wrap:wrap;
  font-size:.82rem;color:var(--w-45);
}
.ft-btm div{display:flex;gap:22px;flex-wrap:wrap}

/* ---------- motion ---------- */
/* Slow and low-amplitude on purpose: the reveal should register as the page
   settling, not as an effect. Runs in both directions (see landing.js). */
.rv{opacity:0;transform:translateY(9px);transition:opacity 1.5s cubic-bezier(.33,.6,.3,1),transform 1.5s cubic-bezier(.33,.6,.3,1)}
.rv.in{opacity:1;transform:none}
.hero .rv{transition-delay:var(--d,0ms)}

/* ---------- document pages (terms / privacy / about) ---------- */
.doc{padding-block:clamp(56px,7vw,88px) var(--sect)}
.doc-head{max-width:74ch;margin-bottom:44px;padding-bottom:32px;border-bottom:1px solid var(--w-12)}
.doc-head h1{font-size:clamp(2rem,4vw,3rem)}
.doc-head .updated{margin-top:16px;font-family:var(--mono);font-size:.78rem;color:var(--w-45);letter-spacing:.04em}
.doc-head .muted{margin-top:16px;font-family:var(--mono);font-size:.78rem;color:var(--w-45);letter-spacing:.04em}
.doc-body{max-width:74ch;overflow-wrap:break-word}
.doc-body h2{font-size:clamp(1.3rem,2.2vw,1.65rem);margin-top:48px;margin-bottom:14px}
.doc-body h3{margin-top:30px;margin-bottom:10px;color:var(--peri)}
.doc-body p{margin-bottom:16px}
.doc-body ul,.doc-body ol{margin:0 0 18px 22px;display:grid;gap:9px}
.doc-body li{padding-left:4px}
.doc-body li::marker{color:var(--accent)}
.doc-body a{color:var(--peri);text-decoration:underline;text-underline-offset:3px}
.doc-body a:hover{color:var(--cream)}
.doc-body strong{color:#fff;font-weight:600}
.doc-body table{min-width:0;width:100%;margin-bottom:20px}
.doc-toc{
  background:rgba(255,255,255,.03);border:1px solid var(--w-12);
  border-radius:var(--r);padding:22px 26px;margin-bottom:44px;
}
.doc-toc h4{font-family:var(--mono);font-size:.72rem;letter-spacing:.14em;text-transform:uppercase;color:var(--w-45);margin-bottom:14px;font-weight:500}
.doc-toc ol{margin:0 0 0 20px;display:grid;gap:8px;font-size:.92rem}
.doc-toc a{color:var(--w-70);text-decoration:none}
.doc-toc a:hover{color:#fff;text-decoration:underline;text-underline-offset:3px}
.doc-note{
  margin-top:16px;padding:20px 24px;border-left:3px solid var(--peri);
  background:rgba(201,201,251,.06);border-radius:0 var(--r) var(--r) 0;font-size:.94rem;
}

/* ---------- about ---------- */
.about-lede{font-size:1.14rem;color:var(--w);max-width:60ch;margin-top:22px}
.value-grid{display:grid;grid-template-columns:repeat(3,1fr);gap:2px;margin-top:52px;
  background:var(--w-07);border:1px solid var(--w-07);border-radius:var(--r);overflow:hidden}
.value{background:var(--ink-2);padding:30px 28px}
.value h3{margin-bottom:11px;color:var(--peri)}
.value p{font-size:.94rem}
@media(max-width:860px){.value-grid{grid-template-columns:1fr}}

/* ---------- responsive ---------- */
@media(max-width:1000px){
  .hero .wrap,.feat{grid-template-columns:1fr}
  .feat.flip .feat-txt{order:0}
  .feat h2,.hero p.lede{max-width:none}
  .ft-grid{grid-template-columns:1fr 1fr}
}
/* The nav row needs ~900px before logo + five links + "Sign in" + CTA fit on one line.
   This used to live in the 720px block, which left the 721-899px band (iPad portrait,
   phone landscape) overflowing the viewport by up to 42px with the CTA pushed clean
   off-screen and both labels broken onto two lines. Do not lower this back to 720
   without re-measuring the row — there is no slack in it at 721px. */
@media(max-width:900px){
  .nav-links{display:none}
}
@media(max-width:720px){
  /* Section rhythm tuned for phones. The base clamp bottoms out at 72px, which reads as
     dead space once the columns have collapsed to one. */
  :root{--sect:clamp(58px,11vw,76px)}

  /* PROMO. The old rule let .wrap flex-wrap, which dropped the dismiss button onto a
     row of its own and turned a one-line announcement into a ~95px band sitting above
     everything else. Text flexes, the button stays pinned on the same row. */
  .promo{font-size:.79rem}
  .promo .wrap{flex-wrap:nowrap;justify-content:flex-start;text-align:left;gap:10px;padding-block:9px}
  .promo .wrap>span{flex:1 1 auto;line-height:1.45}
  /* The dismiss control measured 16x40 and sits immediately beside the "Claim it" link,
     so a fat-fingered tap killed the offer instead of taking it. 40x40 is the smallest
     comfortable target; it fits inside the ~54px two-line row, so it costs no height.
     The negative margin keeps the glyph optically at the edge despite the wider box. */
  .promo button{
    margin-left:0;margin-right:-10px;font-size:1.25rem;padding:0;align-self:center;
    display:flex;align-items:center;justify-content:center;width:40px;height:40px;
  }
  /* Vertical padding on an INLINE element grows the hit box without touching the line
     box, so the promo does not get taller. Do not blockify this. */
  .promo a{padding-block:8px}

  /* NAV. At 390px the row measured ~411px against a 350px content box, so the CTA ran
     off-screen and both labels broke across two lines. Everything below is sized to
     land under ~300px. nowrap on the labels is what stops "Get started" splitting.
     .nav-cta .btn outranks the full-width .btn rule below on specificity, not order. */
  .nav .wrap{gap:12px;height:58px}
  .logo{font-size:1.06rem;gap:8px}
  .brand-mark{height:29px}
  .nav-cta{gap:14px}
  /* .nav-signin is a flex item, so it blockifies and this padding really does make the
     hit box 40px tall (it was 22). Vertical only — horizontal padding would widen the
     row, which has no slack at 320px. */
  .nav-signin{font-size:.86rem;white-space:nowrap;padding-block:9px}
  .nav-cta .btn{width:auto;padding:10px 15px;font-size:.86rem}

  /* HERO */
  .eyebrow{font-size:.66rem;letter-spacing:.11em;margin-bottom:12px}
  h1{font-size:clamp(1.95rem,8.2vw,2.45rem)}
  .hero{padding-block:34px var(--sect)}
  .hero p.lede{font-size:1rem;margin-top:18px}
  .hero-cta{margin-top:26px}
  .certline{margin-top:24px;padding-top:18px}
  .btn{width:100%;justify-content:center;white-space:nowrap}
  .btn-lg{padding:15px 26px;font-size:1rem}

  /* CADENCE CARD */
  .cadence{padding:20px 16px 18px;border-radius:14px}
  .cadence-hd{flex-wrap:wrap;gap:8px}
  .rail{padding-left:0;padding-top:18px}
  .rail::before,.day{display:none}
  .step::before{display:none}
  .step{padding-left:0}
  .mail{padding:12px 13px}
  .mail .subj::before{
    content:attr(data-day);display:block;font-family:var(--mono);
    font-size:.68rem;color:var(--w-45);margin-bottom:5px;letter-spacing:.08em;
  }

  /* MARQUEE. 60px gaps waste most of a phone's width between words. */
  .logos{padding-block:34px}
  .logos p{margin-bottom:22px}
  .marquee-group{gap:38px;padding-right:38px}

  /* PROBLEM */
  .pain-grid{grid-template-columns:1fr;margin-top:36px}
  .pain{padding:24px 20px}
  .result{margin-top:26px;padding:20px}

  /* FEATURES. aspect-ratio:4/3 plus 18px of padding cropped the 400x300 artwork once
     the column went full-width; letting the box take its height from the SVG fixes it. */
  .feat p.sub{margin-top:14px}
  .feat ul{margin-top:20px}
  .shot{aspect-ratio:auto;padding:12px;border-radius:12px}

  /* COMPARE. 760px of table on a 335px screen is four screens of swiping, so the
     columns tighten and a hint tells people the row scrolls at all. */
  .compare .intro{margin-top:18px}
  .tbl-hint{
    display:block;margin-top:26px;
    font-family:var(--mono);font-size:.68rem;letter-spacing:.08em;
    text-transform:uppercase;color:var(--w-45);
  }
  /* Scoped to .compare on purpose. The DPA's subprocessor table reuses .tbl-scroll but
     has no hint line above it, so an unscoped 10px would jam it into the paragraph. */
  .compare .tbl-scroll{margin-top:10px}
  table{min-width:640px;font-size:.84rem}
  th,td{padding:13px}
  thead th:first-child{width:38%}
  td small{font-size:.74rem}
  .mk{font-size:.88rem}
  .quote{margin-top:38px;padding-left:20px}

  /* FAQ. The 46px right gutter reserved for the chevron ate a third of the line. */
  .faq-list{margin-top:30px}
  summary{padding:18px 34px 18px 0;font-size:1rem}
  summary::after{right:4px}
  details p{padding:0 4px 20px 0}

  .ft-grid{grid-template-columns:1fr;gap:30px}
  /* Footer links were 16px tall on a 26px pitch — too tight to hit cleanly in a stacked
     single-column footer. Blockifying the anchor is what makes the padding count. */
  .ft-grid ul{gap:14px}
  .ft-grid li a{display:block;padding-block:5px}
  .ft-btm div a{padding-block:6px}
  footer.ft{padding-block:44px 30px}
}
@media(max-width:420px){
  :root{--pad:18px}
  .nav .wrap{gap:10px}
  .logo{font-size:1rem}
  .brand-mark{height:26px}
  .nav-cta{gap:11px}
  .nav-signin{font-size:.82rem}
  .nav-cta .btn{padding:9px 12px;font-size:.82rem}
  .promo{font-size:.75rem}
  .eyebrow{font-size:.63rem;letter-spacing:.09em}
  .cadence-hd span{font-size:.67rem}
  .cadence-hd .pill{font-size:.61rem;letter-spacing:.05em;padding:4px 9px}
  .marquee-track span{font-size:1.05rem}
}
@media(prefers-reduced-motion:reduce){
  *{animation:none!important;transition:none!important}
  .rv{opacity:1;transform:none}
  .cadence .step,.cadence .bd,.cadence .meta{opacity:1;transform:none}
  .cadence .subj{clip-path:none}
  html{scroll-behavior:auto}
}
