/* ============================================================
   "Burned by AI Chatbot" VSL squeeze page
   Dark / gritty aesthetic in the Sell-Like-Crazy template language.
   ============================================================ */

:root {
  --bg-1: #000000;
  --bg-2: #000000;
  --ink: #ffffff;
  --muted: #e0e0e0;
  --muted-2: #8a8a8a;
  --accent: #1ea2ff;
  --accent-2: #4db6ff;
  --card: #0d0d0d;
  --card-line: rgba(255, 255, 255, 0.1);
  --display: "Montserrat", system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
  --sans: "Montserrat", system-ui, -apple-system, Segoe UI, Roboto, sans-serif;
}

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

html { scroll-behavior: smooth; overflow-x: hidden; }

body {
  font-family: var(--sans);
  color: var(--ink);
  background: #000000;
  min-height: 100vh;
  width: 100%;
  overflow-x: hidden; /* never allow a sideways scroll on any screen */
  -webkit-font-smoothing: antialiased;
  text-rendering: optimizeLegibility;
  /* kill the iOS double-tap-to-zoom gesture (and the legacy 300ms tap delay)
     while leaving normal scrolling intact. Paired with the viewport meta
     (maximum-scale=1, user-scalable=no) this stops accidental zoom on phones. */
  touch-action: manipulation;
}

/* subtle blue glow behind the hero */
body::before {
  content: "";
  position: fixed;
  inset: 0;
  pointer-events: none;
  background:
    radial-gradient(70% 45% at 50% 0%, rgba(30,162,255,0.16) 0%, transparent 60%);
  z-index: 0;
}

/* ---------- LAYOUT ---------- */
.page {
  position: relative;
  z-index: 1;
  max-width: 1340px;
  margin: 0 auto;
  padding: 22px 20px 70px;
  text-align: center;
  zoom: 0.9; /* scale the whole composition down ~10% */
  transition: opacity 0.12s ease; /* smooth reveal after the A/B cloak lifts */
}

/* A/B cloak: an inline <head> script adds .exp-cloak to <html> to hide the page
   until experiments.js has swapped in the variant copy; experiments.js removes
   it in reveal(). The same inline script carries a 1200ms failsafe removal, so
   a JS error can never leave the page permanently hidden. */
html.exp-cloak .page { opacity: 0; }

/* ---------- 2. ATTENTION ---------- */
.attention {
  color: var(--muted);
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  margin-bottom: 12px;
}

/* ---------- 3. HEADLINE ---------- */
.headline {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: -0.01em;
  line-height: 1.12;
  font-size: clamp(26px, 4.5vw, 56px);
  /* wide so the headline fills the screen instead of squeezing into a narrow
     center column; 96vw keeps edge padding and lets it wrap on smaller screens. */
  max-width: min(1320px, 96vw);
  margin: 0 auto 20px;
  text-shadow: 0 2px 18px rgba(0,0,0,0.5);
}
.headline .hl { color: var(--accent); }

/* ---------- SUBHEAD ---------- */
.subhead {
  color: var(--muted);
  font-size: clamp(16px, 2.15vw, 21px);
  line-height: 1.5;
  max-width: 820px; /* wide enough to hold a longer subhead on one line (wraps on mobile) */
  margin: 0 auto 24px;
}

/* ---------- 4. HERO ROW ---------- */
.hero {
  display: grid;
  grid-template-columns: 90px minmax(0, 1fr) 90px;
  align-items: center;
  gap: 0;
  margin-bottom: 18px;
}

/* collages: peek out from the sides, tucked just slightly BEHIND the video.
   Only a small inward nudge so the photos are clearly visible, not buried. */
.collage {
  display: flex;
  flex-direction: column;
  gap: 22px;
  align-items: center;
  position: relative;
  z-index: 1;
}
.collage--left { transform: translateX(8px); }
.collage--right { transform: translateX(-8px); }

.snap {
  width: 100%;
  max-width: 150px;
  background: #f3f3f3;
  padding: 6px 6px 7px;
  border-radius: 3px;
  box-shadow: 0 14px 30px rgba(0,0,0,0.6);
  cursor: pointer;
  transition: box-shadow 0.2s ease, filter 0.2s ease;
}
.snap:hover {
  box-shadow: 0 18px 38px rgba(30,162,255,0.45);
  filter: brightness(1.05);
}
.snap:nth-child(1) { transform: rotate(-5deg); }
.snap:nth-child(2) { transform: rotate(4deg); }
.collage--right .snap:nth-child(1) { transform: rotate(5deg); }
.collage--right .snap:nth-child(2) { transform: rotate(-4deg); }

.snap__img {
  display: block;
  width: 100%;
  aspect-ratio: 4 / 5;
  object-fit: cover;
  border-radius: 2px;
  background: linear-gradient(135deg, #3a3a3a, #2a2a2a);
}
/* placeholder fallback when no real photo */
.snap__ph {
  display: flex;
  align-items: center;
  justify-content: center;
  width: 100%;
  aspect-ratio: 4 / 5;
  border-radius: 2px;
  background: linear-gradient(135deg, #3d3d3d, #242424);
  color: #cfcfcf;
  font-family: var(--display);
  font-size: 40px;
}
.snap__cap {
  display: block;
  margin-top: 6px;
  color: #1c1c1c;
  font-weight: 700;
  font-size: 12px;
  letter-spacing: 0.02em;
}

/* center VSL (sits in FRONT of the flanking photos) */
.vsl { width: 100%; position: relative; z-index: 2; }
.vsl-embed {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  border-radius: 6px;
  overflow: hidden;
  background: #0d0d0d;
  box-shadow: 0 22px 55px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.06);
}
.vsl-embed iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}
.vsl-poster {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  border: 0;
  padding: 0;
  cursor: pointer;
  border-radius: 6px;
  overflow: hidden;
  background: #0d0d0d;
  box-shadow: 0 22px 55px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.06);
}
.vsl-poster__img {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  object-fit: cover;
}
.vsl-poster__overlay {
  position: absolute;
  inset: 0;
  background: transparent;
}
.vsl-poster__play {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 86px; height: 86px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 10px 30px rgba(30,162,255,0.5);
  transition: transform .15s ease, background .15s ease;
}
.vsl-poster__play::after {
  content: "";
  position: absolute;
  top: 50%; left: 53%;
  transform: translate(-50%, -50%);
  border-style: solid;
  border-width: 17px 0 17px 28px;
  border-color: transparent transparent transparent #fff;
}
.vsl-poster:hover .vsl-poster__play { transform: translate(-50%,-50%) scale(1.06); background: var(--accent-2); }
.vsl-poster__label {
  position: absolute;
  left: 0; right: 0; bottom: 14px;
  color: #fff;
  font-weight: 600;
  font-size: 14px;
  letter-spacing: 0.04em;
  text-transform: uppercase;
  text-shadow: 0 1px 8px rgba(0,0,0,0.8);
}

.vsl-poster__lock {
  position: absolute;
  top: 12px; right: 12px;
  display: inline-flex;
  align-items: center;
  gap: 5px;
  background: rgba(0,0,0,0.62);
  border: 1px solid rgba(255,255,255,0.16);
  color: #fff;
  font-size: 12px;
  font-weight: 600;
  letter-spacing: 0.04em;
  padding: 5px 11px;
  border-radius: 999px;
}

/* unlocked state: lead opted in -> reveal "playing" treatment + drop the lock.
   When a real <video>/iframe is dropped in, this just gets out of the way. */
.vsl.is-unlocked .vsl-poster__lock { display: none; }
.vsl.is-unlocked .vsl-poster__overlay { background: #000; }
.vsl.is-unlocked .vsl-poster__play { background: #2c2c2c; box-shadow: none; }
.vsl.is-unlocked .vsl-poster__label::after {
  content: ": now playing";
  color: var(--accent-2);
}

/* ---------- 5. CTA ---------- */
.cta-wrap { margin: 32px auto 54px; }
.cta-wrap--repeat { margin: 40px auto 32px; }
.cta-note { color: var(--muted-2); font-size: 13px; margin-top: 12px; }
/* Optional postscript line above the repeat CTA. Hidden when empty so pages
   that don't set it (e.g. the funnel) show no gap. */
.cta-ps { color: var(--muted); font-style: italic; font-size: clamp(14px, 1.8vw, 17px); line-height: 1.5; max-width: 560px; margin: 0 auto 16px; }
.cta-ps:empty { display: none; }
.cta {
  display: inline-block;
  border: 0;
  cursor: pointer;
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  font-size: clamp(19px, 3vw, 28px);
  color: #fff;
  background: linear-gradient(180deg, var(--accent-2), var(--accent));
  padding: 20px 54px;
  border-radius: 5px;
  box-shadow: 0 14px 34px rgba(30,162,255,0.45), inset 0 1px 0 rgba(255,255,255,0.25);
  transition: transform .12s ease, box-shadow .12s ease;
  animation: pulse 2.4s ease-in-out infinite;
}
.cta:hover { transform: translateY(-2px); box-shadow: 0 20px 44px rgba(30,162,255,0.6); }
.cta:active { transform: translateY(0); }
@keyframes pulse {
  0%, 100% { box-shadow: 0 14px 34px rgba(30,162,255,0.45), inset 0 1px 0 rgba(255,255,255,0.25); }
  50% { box-shadow: 0 14px 44px rgba(30,162,255,0.75), inset 0 1px 0 rgba(255,255,255,0.25); }
}
/* Stronger, on-demand attention pulse fired when a coach card is tapped
   (script.js adds .cta--nudge, then removes it on animationend). Overrides the
   idle pulse with a brief scale + glow so the lead's eye lands on the CTA. */
.cta--nudge { animation: ctaNudge 0.9s ease-in-out 2; }
@keyframes ctaNudge {
  0%, 100% { transform: scale(1);    box-shadow: 0 14px 34px rgba(30,162,255,0.45), inset 0 1px 0 rgba(255,255,255,0.25); }
  50%      { transform: scale(1.06); box-shadow: 0 0 0 6px rgba(30,162,255,0.25), 0 18px 50px rgba(30,162,255,0.85); }
}

/* ---------- REFRAME BLOCK (visual 3-step flow) ---------- */
.reframe {
  max-width: 980px;
  margin: 64px auto 0;
}
.reframe__title {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  font-size: clamp(20px, 3.6vw, 30px);
  letter-spacing: 0.01em;
  margin-bottom: 26px;
}
.reframe__flow {
  display: flex;
  align-items: stretch;
  justify-content: center;
  gap: 10px;
  flex-wrap: nowrap;
}
.rstep {
  flex: 1 1 0;
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 14px;
  padding: 22px 18px;
  text-align: center;
  display: flex;
  flex-direction: column;
  align-items: center;
  gap: 8px;
}
.rstep--bad { border-color: rgba(224,71,58,0.4); }
.rstep--good { border-color: rgba(30,162,255,0.5); background: linear-gradient(180deg, rgba(30,162,255,0.08), var(--card)); }
.rstep__icon { font-size: 34px; line-height: 1; }
.rstep__head {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(15px, 2vw, 18px);
  color: #fff;
}
.rstep--good .rstep__head { color: var(--accent-2); }
.rstep__body {
  font-size: clamp(13px, 1.7vw, 15px);
  line-height: 1.5;
  color: var(--muted);
}
.rstep__arrow {
  align-self: center;
  color: var(--muted-2);
  font-size: 26px;
  font-weight: 700;
  flex: 0 0 auto;
}
.reframe__punch {
  margin-top: 24px;
  font-size: clamp(16px, 2.3vw, 20px);
  font-weight: 700;
  color: #fff;
}

/* ---------- WHAT YOU'LL SEE INSIDE ---------- */
.inside { max-width: min(1000px, 100%); margin: 52px auto 0; text-align: left; }
.inside__title {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  font-size: clamp(20px, 3.6vw, 30px);
  letter-spacing: 0.01em;
  text-align: center;
  margin-bottom: 28px;
}
/* Bullet takeaways as raised gradient cards. One column on mobile, two on
   desktop with the last (risk-reversal) card spanning the full width. */
.inside__list { list-style: none; display: grid; grid-template-columns: 1fr; gap: 16px; }
.inside__item {
  display: flex;
  align-items: center;
  gap: 14px;
  padding: 18px 22px;
  font-size: clamp(15px, 1.7vw, 17px);
  line-height: 1.5;
  color: #efefef;
  background: linear-gradient(158deg, rgba(30,162,255,0.12), rgba(255,255,255,0.02) 55%, rgba(0,0,0,0.18));
  border: 1px solid rgba(30,162,255,0.20);
  border-radius: 16px;
  box-shadow: 0 12px 30px rgba(0,0,0,0.40), inset 0 1px 0 rgba(255,255,255,0.06);
  transition: transform .18s ease, box-shadow .18s ease, border-color .18s ease;
}
.inside__item:hover {
  transform: translateY(-4px);
  border-color: rgba(30,162,255,0.55);
  box-shadow: 0 22px 46px rgba(30,162,255,0.22), inset 0 1px 0 rgba(255,255,255,0.12);
}
/* Check chip: a flex item so it stays vertically centered against the whole
   text block (including two-line cards), instead of pinned to the top corner. */
.inside__item::before {
  content: "\2713";
  flex: 0 0 auto;
  width: 22px; height: 22px;
  display: grid; place-items: center;
  line-height: 1;
  font-family: var(--sans);
  font-size: 13px; font-weight: 800; color: #fff;
  border-radius: 7px;
  background: linear-gradient(180deg, var(--accent-2), var(--accent));
  box-shadow: 0 3px 10px rgba(30,162,255,0.5), inset 0 1px 0 rgba(255,255,255,0.45);
}
.inside__item strong { color: var(--accent-2); font-weight: 700; }
@media (min-width: 760px) {
  .inside__list { grid-template-columns: 1fr 1fr; }
}
/* Center the CTA + reassurance note under the takeaway cards (the .inside
   container is left-aligned for the cards, so the CTA needs its own centering). */
.inside__cta { text-align: center; margin: 36px auto 0; }

/* ---------- PROOF STRIP ---------- */
.proof { margin: 60px auto 0; }

/* ---------- 3D COACH WHEEL ---------- */
.wheel-sec { margin: 64px auto 0; }
.wheel-sec__title {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  font-size: clamp(20px, 3.6vw, 30px);
  letter-spacing: 0.01em;
  margin-bottom: 6px;
}
.wheel-sec__sub {
  color: var(--muted);
  font-size: clamp(13px, 1.8vw, 16px);
  margin-bottom: 26px;
}

/* the 3D stage. --radius is set per-viewport by script.js */
.wheel {
  --radius: 360px;
  position: relative;
  width: 100%;
  height: 320px;
  margin: 0 auto;
  perspective: 1200px;
  /* let vertical page scroll pass through, but reserve horizontal gestures for
     our swipe-to-rotate handler (script.js). */
  touch-action: pan-y;
  cursor: grab;
  user-select: none;
  -webkit-user-select: none;
}
.wheel:active { cursor: grabbing; }
.wheel__ring {
  position: absolute;
  width: 220px;
  height: 280px;
  top: 14px;
  left: 50%;
  margin-left: -110px; /* half the card width */
  transform-style: preserve-3d;
  transition: transform .7s cubic-bezier(.22,.61,.36,1);
}

/* each coach card sits on the face of the cylinder */
.wcard {
  position: absolute;
  inset: 0;
  width: 220px;
  height: 280px;
  border: 0;
  cursor: pointer;
  border-radius: 16px;
  overflow: hidden;
  background: var(--card);
  box-shadow: 0 18px 40px rgba(0,0,0,0.55);
  transition: opacity .4s ease, box-shadow .2s ease;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  text-align: left;
  padding: 0;
  /* flex column so the photo always stretches to meet the meta block:
     no blank strips above or below regardless of the meta's height */
  display: flex;
  flex-direction: column;
  /* Every card facing the viewer is clickable so any coach opens its link,
     no matter where it sits in the wheel. Back-facing cards are excluded from
     hit-testing by `backface-visibility: hidden` above, and preserve-3d depth
     gives the front-center card priority where cards overlap. */
  pointer-events: auto;
}
.wcard.is-active {
  box-shadow: 0 22px 55px rgba(0,0,0,0.65), 0 0 0 2px var(--accent);
}
.wcard__img {
  display: block;
  width: 100%;
  height: 200px;      /* base size; flex stretches it to fill the card */
  flex: 1 1 auto;
  min-height: 0;
  object-fit: cover;
  background: linear-gradient(135deg, #2a2a2a, #161616);
}
.wcard__meta { flex: 0 0 auto; }
.wcard__img--ph {
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--display);
  font-weight: 800;
  font-size: 54px;
  color: #d0d0d0;
}
.wcard__meta {
  display: flex;
  flex-direction: column;
  gap: 3px;
  padding: 12px 14px 14px;
}
.wcard__name { font-family: var(--display); font-weight: 800; font-size: 17px; color: #fff; }
/* the coach's role, between the name and the follower count. Grey so the two
   coloured elements on the card (name white, followers accent) stay dominant. */
.wcard__niche { font-size: 12px; font-weight: 600; color: var(--muted); }
.wcard__result { font-size: 12.5px; font-weight: 600; color: var(--accent-2); }
.wcard__cue {
  margin-top: 4px;
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--muted-2);
}
.wcard.is-active .wcard__cue { color: var(--accent); }

/* nav arrows flank the wheel on its left and right */
.wheel-stage { position: relative; }
.wheel__nav {
  position: absolute;
  top: 50%;
  transform: translateY(-50%);
  z-index: 5;
  width: 52px; height: 52px;
  border-radius: 50%;
  border: 1px solid var(--card-line);
  background: rgba(13,13,13,0.85);
  backdrop-filter: blur(4px);
  color: #fff;
  font-size: 26px;
  line-height: 1;
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease, transform .12s ease;
}
/* sit on the outer edge of the visible card fan */
.wheel__nav--prev { left: calc(50% - 330px); }
.wheel__nav--next { right: calc(50% - 330px); }
.wheel__nav:hover { border-color: var(--accent); background: #141414; }
.wheel__nav--prev:hover { transform: translateY(-50%) translateX(-2px); }
.wheel__nav--next:hover { transform: translateY(-50%) translateX(2px); }

/* ---------- CREDIBILITY (stat row inside the proof strip) ---------- */
.credibility {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px 26px;
  padding: 22px 16px;
  margin: 0 auto;
  border-top: 1px solid var(--card-line);
  border-bottom: 1px solid var(--card-line);
  max-width: 920px;
}
.credibility__stat { display: flex; flex-direction: column; align-items: center; gap: 2px; }
.credibility__stat strong {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(22px, 3.4vw, 32px);
  color: #fff;
  line-height: 1;
}
.credibility__stat span {
  color: var(--muted);
  font-size: 11px;
  letter-spacing: 0.1em;
  text-transform: uppercase;
}
.credibility__div { width: 1px; height: 34px; background: var(--card-line); }

/* ---------- FOOTER ---------- */
.footer {
  margin: 88px auto 0;
  padding-top: 34px;
  border-top: 1px solid var(--card-line);
  max-width: 660px;
  text-align: center;
}
.footer__social {
  display: flex;
  align-items: center;
  justify-content: center;
  gap: 26px;
  margin-bottom: 24px;
}
.footer__social a {
  color: var(--muted);
  line-height: 0;
  transition: color .15s ease, transform .15s ease;
}
.footer__social a svg { width: 36px; height: 36px; }
.footer__social a:hover { color: var(--accent); transform: translateY(-2px); }
.footer__links {
  display: flex;
  align-items: center;
  justify-content: center;
  flex-wrap: wrap;
  gap: 8px 14px;
  font-size: 13px;
  font-weight: 500;
  margin-bottom: 28px;
}
.footer__links a {
  color: var(--muted);
  text-decoration: none;
  transition: color .15s ease;
}
.footer__links a:hover { color: var(--accent); }
.footer__links span { color: #3a3a3a; }

/* disclaimers: present but visually quiet, with room to breathe */
.footer__disclaimer {
  color: #6f6f6f;
  font-size: 11px;
  line-height: 1.7;
  margin: 0 auto 14px;
  max-width: 540px;
}
.footer__copy {
  color: var(--muted-2);
  font-size: 12px;
  margin-top: 24px;
  padding-top: 20px;
  border-top: 1px solid var(--card-line);
}

/* ============================================================
   RESPONSIVE
   ============================================================ */
@media (max-width: 760px) {
  .hero {
    grid-template-columns: 1fr;
    gap: 22px;
  }
  /* hide the flanking coach photos on phone; the video stands alone */
  .vsl { order: -1; }
  .collage { display: none; }
  .credibility__div { display: none; }
  .credibility { gap: 16px 22px; }
  /* keep the wheel arrows on-screen: the desktop calc() offsets go negative on
     phones and would push the next arrow past the right edge (horizontal scroll) */
  .wheel__nav--prev { left: 6px; }
  .wheel__nav--next { right: 6px; }
}

@media (max-width: 420px) {
  .wheel { height: 300px; }
}

/* ============================================================
   OPT-IN MODAL
   ============================================================ */
.modal {
  position: fixed;
  inset: 0;
  z-index: 50;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 24px 18px;
  overflow-y: auto; /* short / landscape phones: dialog stays reachable */
}
/* respect notched phones so the dialog never sits under the rounded edges */
@supports (padding: max(0px)) {
  .modal {
    padding-left: max(18px, env(safe-area-inset-left));
    padding-right: max(18px, env(safe-area-inset-right));
  }
}
.modal.is-open { display: flex; }
.modal__overlay {
  position: absolute;
  inset: 0;
  background: rgba(0,0,0,0.78);
  backdrop-filter: blur(3px);
}
.modal__dialog {
  position: relative;
  z-index: 1;
  width: 100%;
  max-width: 430px;
  background: linear-gradient(180deg, #262626, #1d1d1d);
  border: 1px solid rgba(255,255,255,0.1);
  border-radius: 14px;
  padding: 30px 28px 26px;
  text-align: center;
  box-shadow: 0 30px 80px rgba(0,0,0,0.65);
  animation: modalIn .22s ease;
}
@keyframes modalIn {
  from { opacity: 0; transform: translateY(14px) scale(0.98); }
  to { opacity: 1; transform: none; }
}
.modal__close {
  position: absolute;
  top: 12px; right: 14px;
  border: 0;
  background: none;
  color: var(--muted);
  font-size: 26px;
  line-height: 1;
  cursor: pointer;
  transition: color .15s ease;
}
.modal__close:hover { color: #fff; }
.modal__eyebrow {
  color: var(--accent-2);
  font-size: 11px;
  font-weight: 700;
  letter-spacing: 0.18em;
  text-transform: uppercase;
  margin-bottom: 8px;
}
.modal__title {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(19px, 5vw, 24px);
  line-height: 1.18;
  margin-bottom: 8px;
}
.modal__title .hl { color: var(--accent); }
.modal__sub {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.5;
  margin-bottom: 20px;
}

.optin { display: flex; flex-direction: column; gap: 12px; text-align: left; }
.optin__field { display: flex; flex-direction: column; gap: 5px; }
.optin__field span {
  font-size: 11px;
  font-weight: 600;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--muted);
}
.optin__field input {
  width: 100%;
  font-family: var(--sans);
  font-size: 15px;
  color: #fff;
  background: #141414;
  border: 1px solid rgba(255,255,255,0.12);
  border-radius: 8px;
  padding: 12px 14px;
  transition: border-color .15s ease;
}
.optin__field input::placeholder { color: #5f5f5f; }
.optin__field input:focus { outline: none; border-color: var(--accent); }
.optin__field input.is-invalid { border-color: #e0473a; }

.optin__error {
  color: #ff7c70;
  font-size: 13px;
  font-weight: 600;
  margin: 2px 0 0;
}
.optin__submit {
  margin-top: 6px;
  width: 100%;
  animation: none;
  padding: 16px 20px;
}
.optin__consent {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 11px;
  line-height: 1.45;
  color: var(--muted-2);
  text-align: left;
}
.optin__consent input[type="checkbox"] {
  flex: 0 0 auto;
  width: 16px;
  height: 16px;
  margin-top: 2px;
  accent-color: var(--accent);
  cursor: pointer;
}
.optin__consent a { color: var(--accent); text-decoration: underline; }
.optin__fine {
  color: var(--muted-2);
  font-size: 11px;
  text-align: center;
  margin-top: 4px;
}

/* phones: keep clear of both edges and tighten the dialog so it never
   crowds the screen horizontally */
@media (max-width: 480px) {
  .modal { padding: 20px 16px; }
  .modal__dialog {
    max-width: 360px;
    padding: 24px 18px 22px;
    border-radius: 12px;
  }
  .modal__title { font-size: clamp(17px, 4.6vw, 20px); }
  .optin__field input { font-size: 14px; padding: 11px 12px; }
  .optin__submit { padding: 14px 16px; }
}

/* ---------- TESTIMONIAL (LOOM) MODAL ---------- */
.tmodal__dialog {
  max-width: 760px;
  text-align: center;
}
.tmodal__video {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  margin-top: 16px;
  border-radius: 10px;
  overflow: hidden;
  background: #000;
}
.tmodal__video iframe {
  position: absolute;
  inset: 0;
  width: 100%;
  height: 100%;
  border: 0;
}

/* ============================================================
   LEGAL PAGES (privacy.html, terms.html)
   ============================================================ */
.legal {
  position: relative;
  z-index: 1;
  max-width: 820px;
  margin: 0 auto;
  padding: 28px 22px 90px;
}
.legal__nav {
  display: flex;
  justify-content: space-between;
  align-items: center;
  padding: 16px 0 28px;
  border-bottom: 1px solid var(--card-line);
  margin-bottom: 34px;
}
.legal__home {
  font-family: var(--display);
  font-weight: 800;
  font-size: 15px;
  letter-spacing: 0.02em;
  color: #fff;
  text-decoration: none;
}
.legal__home .hl { color: var(--accent); }
.legal__back {
  color: var(--muted-2);
  font-size: 13px;
  text-decoration: none;
  transition: color .15s ease;
}
.legal__back:hover { color: #fff; }

.legal h1 {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(26px, 5vw, 38px);
  text-transform: uppercase;
  letter-spacing: -0.01em;
  margin-bottom: 6px;
}
.legal__updated {
  color: var(--muted-2);
  font-size: 13px;
  margin-bottom: 26px;
}
.legal h2 {
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(17px, 2.6vw, 21px);
  margin: 34px 0 10px;
  color: #fff;
}
.legal h3 {
  font-weight: 700;
  font-size: 15px;
  margin: 20px 0 6px;
  color: #fff;
}
.legal p,
.legal li {
  color: #cccccc;
  font-size: 15px;
  line-height: 1.7;
}
.legal p { margin-bottom: 14px; }
.legal ul {
  margin: 0 0 16px;
  padding-left: 22px;
}
.legal li { margin-bottom: 8px; }
.legal a { color: var(--accent); text-decoration: none; }
.legal a:hover { text-decoration: underline; }
.legal strong { color: #fff; }
.legal .legal__caps {
  font-size: 13px;
  color: var(--muted);
  letter-spacing: 0.01em;
}

.legal__disclaimer {
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 10px;
  padding: 16px 18px;
  margin-bottom: 30px;
}
.legal__disclaimer p {
  color: var(--muted);
  font-size: 13px;
  line-height: 1.6;
  margin: 0;
}

.legal__foot {
  margin-top: 46px;
  padding-top: 22px;
  border-top: 1px solid var(--card-line);
  display: flex;
  gap: 14px;
  justify-content: center;
  font-size: 13px;
}
.legal__foot a { color: var(--muted-2); text-decoration: none; }
.legal__foot a:hover { color: #fff; }

/* ============================================================
   BLOG (blog/index.html hub + blog/<slug>.html posts)
   Long-form prose, modeled on the .legal styles above.
   ============================================================ */
.article {
  position: relative;
  z-index: 1;
  max-width: 760px;
  margin: 0 auto;
  padding: 8px 22px 90px;
  text-align: left; /* override the funnel's centered .page for long-form prose */
}
.article__head { padding: 18px 0 26px; text-align: center; }
.article__eyebrow {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.14em;
  font-size: 12px;
  color: var(--accent);
  margin-bottom: 12px;
}
.article h1 {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(28px, 5vw, 44px);
  line-height: 1.12;
  letter-spacing: -0.01em;
  margin-bottom: 14px;
}
.article__meta { color: var(--muted-2); font-size: 14px; }
.article__meta a { color: var(--muted-2); }

/* cover image (condensed YouTube thumbnail) at the top of a post */
.article__cover {
  display: block;
  width: 100%;
  height: auto;
  aspect-ratio: 16 / 9;
  object-fit: cover;
  margin: 6px 0 26px;
  border-radius: 12px;
  border: 1px solid var(--card-line);
}

/* key-takeaways box (snippet-friendly summary at the top of a post) */
.article__tldr {
  margin: 4px 0 28px;
  padding: 20px 24px;
  background: linear-gradient(180deg, rgba(30, 162, 255, 0.10), rgba(30, 162, 255, 0.03));
  border: 1px solid rgba(30, 162, 255, 0.35);
  border-radius: 12px;
}
.article__tldr h2 {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 13px;
  color: var(--accent);
  margin: 0 0 10px;
}
.article__tldr ul { margin: 0; padding-left: 20px; }
.article__tldr li { color: #e6e6e6; font-size: 15px; line-height: 1.6; margin-bottom: 6px; }
.article__tldr li:last-child { margin-bottom: 0; }

/* responsive 16:9 video embed */
.article__video {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
  margin: 6px 0 12px;
  border-radius: 12px;
  overflow: hidden;
  border: 1px solid var(--card-line);
  background: var(--card);
}
.article__video iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
.article__videolink { font-size: 13px; color: var(--muted-2); margin-bottom: 30px; }
.article__videolink a { color: var(--accent); text-decoration: none; }
.article__videolink a:hover { text-decoration: underline; }

/* prose */
.article__body h2 {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(20px, 3vw, 27px);
  margin: 40px 0 12px;
  color: #fff;
}
.article__body h3 {
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(17px, 2.4vw, 20px);
  margin: 26px 0 8px;
  color: #fff;
}
.article__body p,
.article__body li {
  color: #cccccc;
  font-size: 16px;
  line-height: 1.75;
}
.article__body p { margin-bottom: 16px; }
.article__body ul,
.article__body ol { margin: 0 0 18px; padding-left: 22px; }
.article__body li { margin-bottom: 8px; }
.article__body a { color: var(--accent); text-decoration: none; }
.article__body a:hover { text-decoration: underline; }
.article__body strong { color: #fff; }
.article__body blockquote {
  margin: 0 0 18px;
  padding: 4px 0 4px 18px;
  border-left: 3px solid var(--accent);
  color: var(--muted);
  font-style: italic;
}
.article__body hr { border: 0; border-top: 1px solid var(--card-line); margin: 30px 0; }
.article__body code {
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 5px;
  padding: 1px 6px;
  font-size: 0.9em;
}

/* FAQ */
.article__faq { margin: 44px 0 10px; }
.article__faq > h2 {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(20px, 3vw, 27px);
  margin-bottom: 14px;
}
.faq-item {
  border-top: 1px solid var(--card-line);
  padding: 16px 0;
}
.faq-item h3 { font-weight: 700; font-size: 17px; color: #fff; margin-bottom: 6px; }
.faq-item p { color: #cccccc; font-size: 15px; line-height: 1.7; margin: 0; }

/* in-article CTA */
.article__cta {
  margin: 46px 0;
  padding: 30px 26px;
  text-align: center;
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 14px;
}
.article__cta h2 {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(20px, 3vw, 26px);
  margin-bottom: 10px;
}
.article__cta p { color: var(--muted); font-size: 15px; line-height: 1.6; margin-bottom: 20px; }

/* related */
.article__related { margin: 40px 0; }
.article__related h2 {
  font-family: var(--display);
  font-weight: 800;
  font-size: 20px;
  margin-bottom: 12px;
}
.article__related ul { list-style: none; padding: 0; margin: 0; }
.article__related li { margin-bottom: 8px; }
.article__related a { color: var(--accent); text-decoration: none; font-size: 16px; }
.article__related a:hover { text-decoration: underline; }

.article__foot {
  margin-top: 46px;
  padding-top: 22px;
  border-top: 1px solid var(--card-line);
  display: flex;
  gap: 18px;
  justify-content: center;
  font-size: 13px;
}
.article__foot a { color: var(--muted-2); text-decoration: none; }
.article__foot a:hover { color: #fff; }

/* hub listing: wide card grid on desktop, single column on phones.
   Thumbnail shows FULLY (width:100% + height:auto, no cropping). */
.article--wide { max-width: 1220px; }

.bloglist {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  margin: 18px 0 20px;
}
.blogcard {
  display: flex;
  flex-direction: column;
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 12px;
  overflow: hidden;
  text-decoration: none;
  transition: border-color .15s ease, transform .15s ease;
}
.blogcard:hover { border-color: var(--accent); transform: translateY(-3px); }
.blogcard__thumb {
  display: block;
  width: 100%;
  height: auto;            /* keep the thumbnail's true 16:9 dimensions, no crop */
  border-bottom: 1px solid var(--card-line);
}
.blogcard__body { display: flex; flex-direction: column; padding: 16px 18px 20px; }
.blogcard__title {
  display: block;
  font-family: var(--display);
  font-weight: 700;
  font-size: 17px;
  line-height: 1.3;
  color: #fff;
  margin-bottom: 8px;
}
.blogcard__desc { display: block; color: var(--muted); font-size: 14px; line-height: 1.6; }

/* tablet: 2 across; phone: single vertical column */
@media (max-width: 920px) { .bloglist { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 600px) { .bloglist { grid-template-columns: 1fr; gap: 18px; } }

/* ============================================================
   FREE COURSE (course.html + course/<slug>.html)
   Reuses .article, .article__*, .cta, .bloglist/.blogcard, .optin*.
   Net-new: the opt-in gate card, code blocks, and resource rows.
   ============================================================ */

/* opt-in gate: stacked (heading -> big thumbnails + titles -> form) */
.course-gate .article__head { text-align: center; }

/* what's inside: big course thumbnails + titles, in a row */
.course-preview__row {
  display: grid;
  grid-template-columns: repeat(3, 1fr);
  gap: 24px;
  max-width: 1120px;
  margin: 26px auto 34px;
}
.cpreview {
  display: flex;
  flex-direction: column;
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 14px;
  overflow: hidden;
  cursor: pointer;
  transition: border-color .15s ease, transform .15s ease;
}
.cpreview:hover { border-color: var(--accent); transform: translateY(-2px); }
.cpreview:focus-visible { outline: 2px solid var(--accent); outline-offset: 2px; }
.cpreview__thumb {
  position: relative;
  display: block;
  aspect-ratio: 16 / 9;
  border-bottom: 1px solid var(--card-line);
}
/* fill the 16:9 frame with no letterbox/black space */
.cpreview__thumb img { width: 100%; height: 100%; object-fit: cover; display: block; }
.cpreview__lock {
  position: absolute;
  top: 10px;
  right: 10px;
  width: 32px;
  height: 32px;
  display: grid;
  place-items: center;
  font-size: 15px;
  background: rgba(0, 0, 0, 0.72);
  border: 1px solid rgba(255, 255, 255, 0.22);
  border-radius: 50%;
}
.cpreview__title {
  display: block;
  font-family: var(--display);
  font-weight: 700;
  font-size: 18px;
  line-height: 1.32;
  color: #fff;
  text-align: center;
  padding: 15px 18px 18px;
}

/* clicking a locked thumbnail scrolls to the form and pulses it (course.js) */
@keyframes courseFormPulse {
  0%   { box-shadow: 0 0 0 0 rgba(30, 162, 255, 0.5); }
  70%  { box-shadow: 0 0 0 16px rgba(30, 162, 255, 0); }
  100% { box-shadow: 0 0 0 0 rgba(30, 162, 255, 0); }
}
.course-gate__card.is-pulsing { border-color: var(--accent); animation: courseFormPulse 1s ease-out 3; }
@media (prefers-reduced-motion: reduce) { .course-gate__card.is-pulsing { animation: none; } }

/* the opt-in form card, centered right below the thumbnails */
.course-gate__card {
  max-width: 560px;
  margin: 0 auto;
  padding: 26px 26px 24px;
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 14px;
}
.course-gate__title {
  font-family: var(--display);
  font-weight: 800;
  font-size: 20px;
  text-align: center;
  margin-bottom: 16px;
}
.course-gate .optin__submit { margin-top: 4px; }

/* tablet: 2 across; phone: single column */
@media (max-width: 860px) { .course-preview__row { grid-template-columns: repeat(2, 1fr); } }
@media (max-width: 560px) { .course-preview__row { grid-template-columns: 1fr; gap: 18px; } }

/* --- unlocked hub: per-card "watch course" CTA --- */

/* the hub cards need the body to stretch so the watch button sits at the bottom */
.course-card .blogcard__body { flex: 1 1 auto; }
.course-card__watch {
  margin-top: 16px;
  align-self: flex-start;
  display: inline-flex;
  align-items: center;
  gap: 8px;
  padding: 10px 18px;
  border-radius: 6px;
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  font-size: 13px;
  color: #fff;
  background: linear-gradient(180deg, var(--accent-2), var(--accent));
  box-shadow: 0 8px 20px rgba(30, 162, 255, 0.32);
  transition: transform .12s ease, box-shadow .12s ease;
}
.course-card:hover .course-card__watch { transform: translateY(-1px); box-shadow: 0 12px 26px rgba(30, 162, 255, 0.5); }

/* hub card: lesson number chip above the title */
.course-card__num {
  display: inline-block;
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.08em;
  font-size: 11px;
  color: var(--accent);
  margin-bottom: 6px;
}

/* code blocks (scripts, prompts, JSON) inside a lesson body */
.course-code {
  margin: 0 0 18px;
  padding: 16px 18px;
  background: #0a0a0a;
  border: 1px solid var(--card-line);
  border-radius: 10px;
  overflow-x: auto;
}
.course-code code {
  display: block;
  background: none;
  border: 0;
  padding: 0;
  color: #d6d6d6;
  font-family: "SFMono-Regular", ui-monospace, Menlo, Consolas, monospace;
  font-size: 13px;
  line-height: 1.6;
  white-space: pre;
}

/* resources + downloads list */
.course-resources { margin: 4px 0 30px; }
.course-resources > h2 {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.06em;
  font-size: 13px;
  color: var(--accent);
  margin-bottom: 12px;
}
.course-resources ul { list-style: none; margin: 0; padding: 0; }
.course-resource { margin-bottom: 8px; }
.course-resource a {
  display: flex;
  align-items: center;
  justify-content: space-between;
  gap: 14px;
  padding: 13px 16px;
  background: var(--card);
  border: 1px solid var(--card-line);
  border-radius: 10px;
  text-decoration: none;
  transition: border-color .15s ease, transform .15s ease;
}
.course-resource a:hover { border-color: var(--accent); transform: translateY(-1px); }
.course-resource__label { color: #eaeaea; font-size: 15px; font-weight: 600; }
.course-resource__go {
  flex: 0 0 auto;
  font-family: var(--display);
  font-weight: 700;
  font-size: 12px;
  text-transform: uppercase;
  letter-spacing: 0.05em;
  color: var(--accent);
}
.course-resource--download a { border-color: rgba(30, 162, 255, 0.4); }

/* ============================================================
   VIDEO PAGE (video.html)
   Net-new components only; everything else reuses the tokens and
   classes above (.page, .cta, .inside, .modal/.tmodal, .footer).
   ============================================================ */

/* CTA used as a link (the booking buttons are <a>, not <button>) */
a.cta { text-decoration: none; }

/* confirmation banner */
.confirm {
  display: flex;
  align-items: center;
  gap: 14px;
  max-width: 720px;
  margin: 0 auto 30px;
  padding: 16px 20px;
  text-align: left;
  background: linear-gradient(180deg, rgba(30,162,255,0.10), var(--card));
  border: 1px solid rgba(30,162,255,0.5);
  border-radius: 12px;
}
.confirm__check {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px; height: 34px;
  border-radius: 50%;
  background: var(--accent);
  color: #fff;
  font-size: 17px;
  font-weight: 800;
}
.confirm__head {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  font-size: clamp(15px, 2.4vw, 19px);
  letter-spacing: 0.01em;
  line-height: 1.2;
  color: #fff;
}
.confirm__sub { color: var(--muted); font-size: 13px; margin-top: 3px; }

/* walkthrough hero (full width, no flanking collages) */
.walkthrough { max-width: 880px; margin: 0 auto; }
/* booked.html stacks two video sections; breathe between them */
.walkthrough + .walkthrough { margin-top: 48px; }

/* booked.html hero: the confirmation as a real page heading */
.booked-hero { max-width: 780px; margin: 6px auto 0; }
.booked-hero__check {
  width: 46px; height: 46px;
  font-size: 23px;
  margin: 0 auto 18px;
}
.booked-hero__title {
  font-family: var(--display);
  font-weight: 900;
  text-transform: uppercase;
  font-size: clamp(26px, 5.2vw, 46px);
  letter-spacing: 0.01em;
  line-height: 1.1;
  color: #fff;
}
.booked-hero__sub {
  color: var(--muted);
  font-size: clamp(15px, 2.3vw, 19px);
  margin-top: 14px;
}

/* booked.html big step sections: accent eyebrow + display subheading */
.bstep { max-width: 720px; margin: 64px auto 0; }
.bstep--tight { margin-top: 0; margin-bottom: 26px; }
.bstep__eyebrow {
  color: var(--accent);
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  /* just under the step subheading's size so STEP N reads as part of it */
  font-size: clamp(19px, 3vw, 29px);
  margin-bottom: 6px;
}
.bstep__title {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  font-size: clamp(24px, 4.2vw, 36px);
  letter-spacing: 0.01em;
  line-height: 1.15;
  color: #fff;
}
/* long titles scale down a notch so they hold one line on desktop */
.bstep__title--long { font-size: clamp(21px, 3.6vw, 30px); }
/* H3 subtitle line under a step title */
.bstep__subtitle {
  font-family: var(--display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  font-size: clamp(16px, 2.2vw, 22px);
  color: var(--muted);
  margin-top: 10px;
}
.bstep__body {
  color: var(--muted);
  font-size: clamp(17px, 2.2vw, 19px);
  line-height: 1.7;
  margin-top: 14px;
}
/* bold lead lines sit on their own line, description below them */
.bstep__body strong { color: #fff; display: block; margin-bottom: 4px; }
.bstep__body a { color: var(--accent); font-weight: 600; text-decoration: none; }
.bstep__body a:hover { text-decoration: underline; }
.bstep__video { margin-top: 26px; }

/* step checklist: numbered cards, one item per row (booked.html step 3) */
.bstep__list {
  list-style: none;
  margin: 20px 0 0;
  padding: 0;
  display: grid;
  gap: 12px;
  text-align: left;
}
.bstep__item {
  display: flex;
  align-items: flex-start;
  gap: 14px;
  padding: 16px 18px;
  background: linear-gradient(180deg, rgba(30,162,255,0.07), var(--card));
  border: 1px solid var(--card-line);
  border-radius: 12px;
}
.bstep__item-num {
  flex: 0 0 auto;
  display: inline-flex;
  align-items: center;
  justify-content: center;
  width: 34px; height: 34px;
  border-radius: 50%;
  background: var(--accent);
  color: #fff;
  font-family: var(--display);
  font-weight: 800;
  font-size: 16px;
}
.bstep__item-text {
  color: var(--muted);
  font-size: clamp(16px, 2vw, 18px);
  line-height: 1.6;
}
.bstep__item-text strong {
  display: block;
  color: #fff;
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.02em;
  font-size: clamp(15px, 1.9vw, 17px);
  margin-bottom: 3px;
}

/* booked.html: the big bold materials inbox under the step-3 cards */
.bstep__email-label {
  font-family: var(--display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.03em;
  color: #fff;
  font-size: clamp(15px, 2vw, 19px);
  margin-top: 28px;
}
.bstep__email {
  display: inline-block;
  margin-top: 6px;
  color: var(--accent);
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(20px, 3vw, 30px);
  letter-spacing: 0.01em;
  text-decoration: none;
  word-break: break-all;
}
.bstep__email:hover { text-decoration: underline; }

/* booked.html: copy-paste email template card (step 3) */
.copybox {
  max-width: 720px;
  margin: 34px auto 0;
  text-align: left;
}
.copybox__how {
  display: flex;
  flex-wrap: wrap;
  justify-content: center;
  gap: 8px 26px;
  font-family: var(--display);
  font-weight: 700;
  text-transform: uppercase;
  letter-spacing: 0.04em;
  font-size: clamp(13px, 1.6vw, 15px);
  color: var(--muted);
  margin-bottom: 14px;
}
.copybox__how b, .copybox__how em { color: var(--accent); font-style: normal; }
.copybox__mail {
  background: linear-gradient(180deg, rgba(30,162,255,0.06), var(--card));
  border: 1px solid var(--card-line);
  border-radius: 14px;
  padding: 22px 24px;
  font-size: clamp(15px, 1.9vw, 17px);
  line-height: 1.7;
  color: var(--muted);
}
.copybox__mail p { margin: 0 0 12px; }
.copybox__mail p:last-child { margin-bottom: 0; }
.copybox__subject {
  color: #fff;
  border-bottom: 1px solid var(--card-line);
  padding-bottom: 10px;
}
.copybox__var { color: var(--accent); font-weight: 700; }
.copybox__actions { text-align: center; margin-top: 18px; }
.copybox__btn { font-size: 16px; padding: 14px 30px; }
.copybox__btn--done { background: #17b26a; box-shadow: none; }
.copybox__mailto {
  display: block;
  margin-top: 12px;
  color: var(--muted);
  font-size: 14.5px;
  text-decoration: underline;
}
.copybox__mailto:hover { color: var(--accent); }

/* booked.html closing CTA: send them to the YouTube channel */
.yt-cta { max-width: 640px; margin: 70px auto 0; }
.yt-cta__sub { color: var(--muted); font-size: clamp(17px, 2.2vw, 19px); line-height: 1.7; margin: -8px 0 24px; }

/* booked.html: the single questions line above the footer */
.booked-questions {
  max-width: 720px;
  margin: 56px auto 0;
  color: var(--muted);
  font-size: clamp(17px, 2.2vw, 19px);
  line-height: 1.7;
}
.booked-questions a { color: var(--accent); font-weight: 700; text-decoration: none; }
.booked-questions a:hover { text-decoration: underline; }

/* ============================================================
   WIDE-SCREEN LAYOUT (.page--wide, booked.html)
   Desktop uses the horizontal space WITHOUT changing the reading
   order: headings stay on top with the regular text below them,
   but sections widen to ~1080px, the step-3 cards sit 3-up side
   by side, and the testimonial reels go 3-up. Below 900px nothing
   here applies, so the page falls back to the stacked mobile
   layout untouched.
   ============================================================ */
@media (min-width: 900px) {
  .page--wide .booked-hero { max-width: 960px; }

  .page--wide .bstep { max-width: 1240px; }
  .page--wide .bstep__title { font-size: clamp(28px, 3vw, 38px); }
  .page--wide .bstep__title--long { font-size: clamp(24px, 2.3vw, 31px); }
  /* body copy sits below the heading, on a wider measure */
  .page--wide .bstep__body {
    max-width: 900px;
    margin-left: auto;
    margin-right: auto;
  }

  /* step 3's share-cards: side by side AND wide, number beside the text so
     each card reads horizontally instead of as a tall narrow stack. The row
     breaks out wider than the section so each card's text runs ~2 lines,
     not 4 (owner rule: expand horizontally, not vertically). */
  .page--wide .bstep__list {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 20px;
    margin-top: 26px;
    width: min(1520px, 94vw);
    margin-left: 50%;
    transform: translateX(-50%);
  }
  .page--wide .bstep__item {
    align-items: flex-start;
    gap: 16px;
    padding: 22px 24px;
  }
  .page--wide .bstep__list + .bstep__body { margin-top: 24px; }

  /* the step-2 video keeps the wider stage */
  .page--wide .bstep__video { max-width: 1080px; }

  /* step 4: the reels go 3-up across the width */
  .page--wide .proof-stack { max-width: 1080px; }
  .page--wide .pstack__row--reels {
    grid-template-columns: repeat(3, minmax(0, 1fr));
    gap: 28px 24px;
  }

  /* proof reminder + closing CTA breathe wider too */
  .page--wide .proof-reminder { max-width: 1080px; margin-left: auto; margin-right: auto; }
  .page--wide .yt-cta { max-width: 820px; }
}

/* bridge line */
.bridge {
  max-width: 720px;
  margin: 44px auto 0;
  font-size: clamp(16px, 2.3vw, 20px);
  font-weight: 700;
  line-height: 1.5;
  color: #fff;
}
.bridge strong { color: var(--accent-2); }

/* proof stack: vertical (reel) testimonials, 2 next to each other */
.proof-stack { margin: 60px auto 0; max-width: 640px; }
.pstack__title {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  font-size: clamp(20px, 3.6vw, 30px);
  letter-spacing: 0.01em;
  margin-bottom: 22px;
}
.pstack__row--reels {
  display: grid;
  grid-template-columns: repeat(2, minmax(0, 1fr));
  gap: 34px 24px; /* row gap, column gap */
}

/* testimonial card: a bare 9:16 reel, no captions */
.tcard {
  position: relative;
  border: 1px solid var(--card-line);
  border-radius: 14px;
  overflow: hidden;
  background: var(--card);
  transition: transform .12s ease, border-color .15s ease, box-shadow .15s ease;
}
.tcard:hover { transform: translateY(-3px); border-color: rgba(30,162,255,0.5); box-shadow: 0 18px 40px rgba(0,0,0,0.5); }
/* the media area is the clickable play button (facade), in reel aspect */
.tcard__media {
  position: relative;
  display: block;
  width: 100%;
  aspect-ratio: 9 / 16;
  background: #161616;
  border: 0;
  padding: 0;
  cursor: pointer;
}
/* once clicked, the facade is replaced by this iframe wrapper, playing inline */
.tcard__media--playing { cursor: default; }
.tcard__media--playing iframe { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; }
/* prewarmed Loom player: boots invisibly behind the thumbnail, revealed on click */
.tcard__warm { position: absolute; inset: 0; width: 100%; height: 100%; border: 0; opacity: 0; pointer-events: none; }
.tcard__media--playing .tcard__warm { opacity: 1; pointer-events: auto; }
.tcard__img { position: absolute; inset: 0; width: 100%; height: 100%; object-fit: cover; }
.tcard__img--ph {
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--display);
  font-weight: 800;
  font-size: 54px;
  color: #d0d0d0;
  background: linear-gradient(135deg, #2a2a2a, #161616);
}
.tcard__badge {
  position: absolute;
  top: 50%; left: 50%;
  transform: translate(-50%, -50%);
  width: 54px; height: 54px;
  display: flex;
  align-items: center;
  justify-content: center;
  border-radius: 50%;
  background: rgba(30,162,255,0.92);
  color: #fff;
  font-size: 19px;
  box-shadow: 0 8px 22px rgba(30,162,255,0.5);
  transition: transform .15s ease;
}
.tcard:hover .tcard__badge { transform: translate(-50%,-50%) scale(1.08); }
.tcard__name {
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(14px, 1.8vw, 16px);
  color: #fff;
  text-align: center;
  padding: 11px 10px 13px;
}

/* objections (native <details> accordion) */
.objections { max-width: 720px; margin: 64px auto 0; text-align: left; }
.objections .inside__title { text-align: center; }
.obj { border-bottom: 1px solid var(--card-line); }
.obj:first-of-type { border-top: 1px solid var(--card-line); }
.obj__q {
  list-style: none;
  cursor: pointer;
  position: relative;
  padding: 18px 42px 18px 4px;
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(15px, 2.1vw, 18px);
  color: #fff;
}
.obj__q::-webkit-details-marker { display: none; }
.obj__q::after {
  content: "+";
  position: absolute;
  right: 8px; top: 50%;
  transform: translateY(-50%);
  color: var(--accent);
  font-size: 24px;
  font-weight: 700;
  line-height: 1;
}
.obj[open] .obj__q::after { content: "\2013"; } /* en dash as a minus glyph */
.obj__a {
  padding: 0 4px 20px;
  color: var(--muted);
  font-size: clamp(14px, 1.9vw, 16px);
  line-height: 1.65;
}
.obj__a a { color: var(--accent); text-decoration: none; cursor: pointer; }
.obj__a a:hover { text-decoration: underline; }

/* capacity + final CTA */
.capacity { margin-top: 64px; }
.capacity__note {
  display: block;
  font-size: 13px;
  font-weight: 700;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent-2);
  margin-bottom: 2px;
}

/* reels stay 2-up at every width; just tighten the gap on small screens */
@media (max-width: 480px) {
  .pstack__row--reels { gap: 22px 12px; }
}

/* ---------- CAL.COM INLINE EMBED ---------- */
/* the Cal inline div uses height:100%, so it needs a sized ancestor or it
   collapses before the calendar script loads. Generous top margin so the
   calendar has room to breathe under the heading. */
.cal-embed {
  max-width: 1000px;
  min-height: 640px;
  margin: 48px auto 0;
  border: 1px solid var(--card-line);
  border-radius: 14px;
  background: var(--card);
  overflow: hidden;
}

/* ---------- THIN PROOF REMINDER (faces + stats, no replays) ---------- */
/* the full coach roster as a wrapping gallery of circular avatars */
.proof-reminder { margin: 56px auto 0; }
.proof-faces {
  display: flex;
  flex-wrap: wrap;
  align-items: center;
  justify-content: center;
  gap: 0;
  max-width: 760px;
  margin: 0 auto 26px;
}
.proof-face__img {
  width: 58px; height: 58px;
  border-radius: 50%;
  object-fit: cover;
  border: 2px solid var(--card-line);
  background: linear-gradient(135deg, #2a2a2a, #161616);
  /* overlap each face into the previous one so they merge into one cluster;
     the dark box-shadow ring keeps the circles cleanly separated where they meet */
  margin-left: -16px;
  box-shadow: 0 0 0 3px var(--bg-1);
}
.proof-face__img:first-child { margin-left: 0; }
.proof-face__img--ph {
  display: flex;
  align-items: center;
  justify-content: center;
  font-family: var(--display);
  font-weight: 800;
  font-size: 22px;
  color: #d0d0d0;
}
/* trailing badge that signals the roster keeps going past the faces shown */
.proof-face__more {
  display: inline-flex;
  align-items: center;
  white-space: nowrap;
  margin-left: 14px;
  font-family: var(--display);
  font-weight: 800;
  font-size: 15px;
  letter-spacing: 0.3px;
  color: var(--accent);
}

@media (max-width: 480px) {
  .cal-embed { min-height: 560px; }
  .proof-face__img { width: 50px; height: 50px; }
}

/* ============================================================
   VARIANT B (vsl_inline): inline VSL + qualification + booking
   ============================================================ */

/* inline VSL player in place of the gated thumbnail */
.vsl-video {
  display: block;
  width: 100%;
  aspect-ratio: 16 / 9;
  border: 0;
  border-radius: 6px;
  background: #0d0d0d;
  box-shadow: 0 22px 55px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.06);
}

/* the multi-step qualification card (lives at the bottom of the inline page) */
.qualify {
  max-width: 720px;
  margin-left: auto;
  margin-right: auto;
  background: linear-gradient(180deg, rgba(30,162,255,0.07), var(--card) 130px);
  border: 1px solid rgba(30,162,255,0.34);
  border-radius: 20px;
  padding: 50px 46px;
  text-align: center;
  /* subtle pulsing glow so it reads as an interactive form, drawing the lead in */
  animation: qpulse 2.6s ease-in-out infinite;
}
/* base + peak of the pulse (keeps the depth shadow constant, breathes the glow) */
@keyframes qpulse {
  0%, 100% { box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 1px rgba(30,162,255,0.12), 0 0 46px rgba(30,162,255,0.12); }
  50%      { box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 1px rgba(30,162,255,0.30), 0 0 84px rgba(30,162,255,0.30); }
}
@media (prefers-reduced-motion: reduce) {
  .qualify { animation: none; box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 1px rgba(30,162,255,0.14); }
}
/* One-shot attention pulse fired by focusForm() when a CTA scrolls the lead to
   the form. Stronger than the idle qpulse; JS removes the class after it plays so
   the idle glow resumes. Suppressed under reduced-motion (idle pulse is off too). */
@media (prefers-reduced-motion: no-preference) {
  .qualify--focus { animation: qfocus 1.5s ease-out 1; }
}
@keyframes qfocus {
  0%   { box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 2px rgba(30,162,255,0.40), 0 0 70px rgba(30,162,255,0.40); }
  28%  { box-shadow: 0 26px 80px rgba(0,0,0,0.5), 0 0 0 5px rgba(30,162,255,0.60), 0 0 120px rgba(30,162,255,0.70); }
  100% { box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 1px rgba(30,162,255,0.12), 0 0 46px rgba(30,162,255,0.12); }
}
.qstep { display: none; }
.qstep.is-active { display: block; animation: modalIn .22s ease; }
.qstep__q {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(22px, 4vw, 30px);
  line-height: 1.16;
  margin: 0 0 24px;
}
.qstep__sub { color: var(--muted); font-size: 15px; line-height: 1.5; margin: -10px 0 22px; }
.qback {
  -webkit-appearance: none; appearance: none;
  background: none; border: 0; color: var(--muted-2); font: inherit; font-size: 14px;
  cursor: pointer; padding: 0; margin: 0 0 14px; display: inline-flex; align-items: center; gap: 6px;
}
.qback:hover { color: var(--muted); }
.qform--single { max-width: 420px; margin: 0 auto; }
/* the "something else" free-text form, revealed under a choice step's buttons.
   The [hidden] rule is REQUIRED, not defensive: .qform sets display:flex, which
   beats the UA stylesheet's [hidden]{display:none} on specificity, so without
   this the input is permanently visible instead of waiting for the click. */
.qform--other { margin-top: 16px; }
.qform--other[hidden] { display: none; }
/* 3 choices stack rather than squeezing into a 3-col row on phones */
.qchoices--3 { grid-template-columns: 1fr; }

/* choice cards (yes/no + revenue buckets) */
.qchoices { display: grid; gap: 14px; }
.qchoices--2 { grid-template-columns: 1fr 1fr; }
.qchoices--4 { grid-template-columns: repeat(2, 1fr); }
/* Stacked lists: options that are sentences rather than short labels, and the
   5-band revenue step. Left-aligned and shorter, because a full-width button with
   centered text reads as a banner, and five at the 28px padding above runs past
   the fold. */
.qchoices--1, .qchoices--5 { grid-template-columns: 1fr; }
.qchoices--1 .qchoice, .qchoices--5 .qchoice { padding: 18px 20px; text-align: left; }
.qchoice {
  font-family: var(--display);
  font-weight: 700;
  font-size: 18px;
  color: #fff;
  background: #141414;
  border: 1.5px solid rgba(30,162,255,0.22);
  border-radius: 14px;
  padding: 28px 16px;
  cursor: pointer;
  transition: border-color .15s ease, background .15s ease, transform .12s ease, box-shadow .15s ease;
}
.qchoice:hover {
  border-color: var(--accent);
  background: linear-gradient(180deg, rgba(30,162,255,0.16), #141414);
  box-shadow: 0 0 0 3px rgba(30,162,255,0.18);
  transform: translateY(-2px);
}
.qchoice:active { transform: translateY(0); }
.qchoice--no { color: var(--muted-2); border-color: var(--card-line); }
.qchoice--no:hover { border-color: var(--card-line); background: #141414; color: var(--muted); box-shadow: none; transform: none; }

/* the "Yes" on step 1: a solid blue, 3D-ish primary button that pulls the click
   so leads commit and continue into the form. */
.qchoice--yes {
  color: #fff;
  font-weight: 800;
  border-color: var(--accent);
  background: linear-gradient(180deg, var(--accent-2), var(--accent));
  box-shadow: 0 12px 26px rgba(30,162,255,0.5), inset 0 1px 0 rgba(255,255,255,0.28);
  animation: yesPulse 2.2s ease-in-out infinite;
}
.qchoice--yes:hover {
  border-color: var(--accent-2);
  background: linear-gradient(180deg, #6cc4ff, var(--accent-2));
  box-shadow: 0 16px 34px rgba(30,162,255,0.62), inset 0 1px 0 rgba(255,255,255,0.34);
  transform: translateY(-3px);
}
@keyframes yesPulse {
  0%, 100% { box-shadow: 0 12px 26px rgba(30,162,255,0.45), inset 0 1px 0 rgba(255,255,255,0.28); }
  50%      { box-shadow: 0 16px 34px rgba(30,162,255,0.7), inset 0 1px 0 rgba(255,255,255,0.34); }
}
@media (prefers-reduced-motion: reduce) { .qchoice--yes { animation: none; } }

/* contact form (mirrors the opt-in field styling) */
.qform { display: flex; flex-direction: column; gap: 15px; text-align: left; }
.qfield { display: flex; flex-direction: column; gap: 6px; }
.qfield span {
  font-size: 12px;
  font-weight: 700;
  letter-spacing: 0.08em;
  text-transform: uppercase;
  color: var(--accent-2);
}
.qfield input {
  width: 100%;
  font-family: var(--sans);
  font-size: 16px;
  color: #fff;
  background: #141414;
  border: 1.5px solid rgba(30,162,255,0.22);
  border-radius: 10px;
  padding: 15px 16px;
  transition: border-color .15s ease, box-shadow .15s ease;
}
.qfield input::placeholder { color: #5f5f5f; }
.qfield input:focus { outline: none; border-color: var(--accent); box-shadow: 0 0 0 3px rgba(30,162,255,0.18); }
.qfield input.is-invalid { border-color: #e0473a; }
.qform__error { color: #ff7c70; font-size: 13px; font-weight: 600; margin: 2px 0 0; }
.qform__consent {
  display: flex;
  align-items: flex-start;
  gap: 8px;
  font-size: 11px;
  line-height: 1.45;
  color: var(--muted-2);
  text-align: left;
}
.qform__consent input[type="checkbox"] {
  flex: 0 0 auto;
  width: 16px; height: 16px;
  margin-top: 2px;
  accent-color: var(--accent);
  cursor: pointer;
}
.qform__consent a { color: var(--accent); text-decoration: underline; }
.qform__submit { margin-top: 8px; width: 100%; animation: none; padding: 18px 22px; font-size: 17px; }
/* The combined contact step (name + email + phone on one page). Same column flow
   as .qform, just a slightly wider card than the single-question form: three
   inputs at 420px read as a cramped stack. Each field's error <p> is display:none
   while hidden, so the flex gap does not leave a hole above a valid field. */
.qform--stack { max-width: 470px; margin: 0 auto; gap: 13px; }
.qform--stack .qform__error { margin: -6px 0 0; }

/* qualified -> inline booking calendar */
.qbook {
  margin-top: 8px;
  min-height: 640px;
  border: 1px solid var(--card-line);
  border-radius: 12px;
  background: var(--card);
  overflow: hidden;
}
.qbook > * { width: 100%; height: 100%; min-height: 640px; }

/* disqualified -> soft decline + resource */
.qnofit__cta { display: inline-block; margin-top: 6px; text-decoration: none; animation: none; }

/* booking-recovery popup: wider dialog to hold the calendar */
.booknudge__dialog { max-width: 680px; }
.booknudge__sub { color: var(--muted); font-size: 14px; line-height: 1.5; margin: 4px 0 18px; }
.booknudge__mount {
  min-height: 560px;
  border: 1px solid var(--card-line);
  border-radius: 12px;
  background: var(--card);
  overflow: hidden;
}
.booknudge__mount > * { width: 100%; height: 100%; min-height: 560px; }

@media (max-width: 480px) {
  .qualify { padding: 26px 18px; border-radius: 16px; }
  .qchoice { padding: 20px 12px; font-size: 15px; }
  .qfield input { font-size: 15px; padding: 13px 14px; }
  .qbook, .qbook > * { min-height: 560px; }
}

/* ============================================================
   APPLY PAGE (apply.html, served at /apply)
   Long-form proof page. Everything here is scoped to #applyPage or
   .modal--apply so it can never leak onto the funnel, video.html or
   /booked. Uses only the :root tokens at the top of this file: the
   accent is var(--accent), never a literal blue.
   ============================================================ */

/* ---------- shared section rhythm ---------- */
.app-sec { margin-top: 88px; }
.app-cta { margin: 34px auto 0; }

/* ---------- hero ---------- */
/* Darkened crowd photo behind the whole hero block, the way the reference page
   does it: the image never competes with the copy because it sits under a heavy
   vignette and fades to pure black before the fold ends. Pinned behind .page
   content via a negative z-index, so nothing needs a stacking context.
   SWAP POINT: assets/apply/hero-bg.jpg (a wide group shot). With no file the
   gradients alone render, which still reads as an intentional dark hero. */
.app-hero-bg {
  position: absolute;
  top: 0; left: 0;
  width: 100%;
  height: 900px;
  z-index: 0;   /* .page is z-index: 1, so the copy always sits on top */
  pointer-events: none;
  /* NOTE: this wash exists to darken the hero PHOTO for legibility. It used to
     run 0.72 -> 0.86 -> solid black, which also crushed the .app-bg gradient
     underneath and made the page look flat black above the fold. Lightened so
     the fixed background reads through. If you drop in a busy hero-bg.jpg and
     the headline gets hard to read, raise these two alphas, not the third.

     The last stop stays a near-black ALPHA and never reaches solid #000. An
     opaque bottom edge is what produced the visible seam: this layer is 900px
     tall and simply stops, so the page went from "opaque black hiding .app-bg"
     to "blue radials" in one pixel row, which landed 14px above the case-study
     H2 and read as two different backgrounds meeting. */
  background-image:
    linear-gradient(180deg, rgba(0,0,0,0.42) 0%, rgba(0,0,0,0.62) 45%, rgba(0,0,0,0.93) 86%, rgba(0,0,0,0.96) 100%),
    radial-gradient(ellipse 70% 60% at 50% 18%, rgba(30,162,255,0.14), transparent 70%),
    url("assets/apply/hero-bg.jpg");
  background-size: cover, cover, cover;
  background-position: center, center, center top;
  background-repeat: no-repeat;
  /* Fade the WHOLE layer (photo and wash together) out to real transparency
     before the bottom edge, so it dissolves into the fixed .app-bg instead of
     ending on a hard line. A mask is used rather than another black gradient
     for the same reason .qwheel uses one: painting black over .app-bg smears
     the blue radials into a dull band, a mask lets what is behind stay correct.
     The ramp is ~340px, long enough that there is no detectable edge at any
     scroll position. Photo and wash fade in step, so the photo can never
     re-emerge as the darkening lifts. */
  -webkit-mask-image: linear-gradient(180deg, #000 0%, #000 62%, rgba(0,0,0,0) 100%);
  mask-image: linear-gradient(180deg, #000 0%, #000 62%, rgba(0,0,0,0) 100%);
}

/* wordmark, with the accent bar the reference page puts under its logo.
   width: fit-content + auto margins rather than display:inline-block, so it
   centers on its OWN line instead of sharing one with the pill below it. */
.app-brand {
  width: fit-content;
  font-family: var(--display);
  font-weight: 900;
  font-size: 17px;
  letter-spacing: 0.02em;
  color: #fff;
  margin: 0 auto 26px;
}
.app-brand__bar {
  display: block;
  height: 3px;
  margin-top: 4px;
  border-radius: 2px;
  background: linear-gradient(90deg, var(--accent), var(--accent-2), #9ad7ff);
}

/* glowing pill eyebrow */
.app-pill {
  width: fit-content;
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(14px, 1.9vw, 18px);
  color: #fff;
  padding: 15px 34px;
  margin: 0 auto 26px;
  border-radius: 999px;
  background: linear-gradient(180deg, rgba(30,162,255,0.20), rgba(10,10,10,0.85));
  border: 1px solid rgba(30,162,255,0.55);
  /* The glow sits INSIDE the pill: inset shadows only, so the light pools
     within the border instead of bleeding onto the page behind it. */
  box-shadow: inset 0 0 22px rgba(30,162,255,0.45), inset 0 1px 0 rgba(255,255,255,0.16);
  animation: appPillGlow 3s ease-in-out infinite;
}
@keyframes appPillGlow {
  0%, 100% { box-shadow: inset 0 0 18px rgba(30,162,255,0.32), inset 0 1px 0 rgba(255,255,255,0.16); }
  50%      { box-shadow: inset 0 0 34px rgba(30,162,255,0.75), inset 0 1px 0 rgba(255,255,255,0.16); }
}
@media (prefers-reduced-motion: reduce) { .app-pill { animation: none; } }

/* Headline: lighter and smaller than the funnel default (which is 800 weight,
   uppercase, up to 56px). Title case + 600 matches the reference page, and lets
   the coloured and underlined emphasis carry the hierarchy instead of sheer
   weight. The continuation clause is a separate, smaller line. */
#applyPage .headline {
  font-weight: 600;
  text-transform: none;
  font-size: clamp(25px, 3.7vw, 46px);
  line-height: 1.18;
}
#applyPage .headline .hl { font-weight: 700; }

/* underlined headline phrases (the reference page mixes coloured + underlined
   emphasis in the same headline; .hl stays the coloured one) */
#applyPage .headline u {
  text-decoration: none;
  border-bottom: 2px solid currentColor;
  padding-bottom: 2px;
}

/* the big glowing pill CTA */
.cta--glow {
  border-radius: 999px;
  padding: 24px 68px;
  box-shadow: 0 0 0 1px rgba(255,255,255,0.10), 0 16px 46px rgba(30,162,255,0.55),
              0 0 70px rgba(30,162,255,0.34), inset 0 1px 0 rgba(255,255,255,0.3);
  animation: ctaGlow 2.6s ease-in-out infinite;
}
.cta--glow:hover {
  box-shadow: 0 0 0 1px rgba(255,255,255,0.14), 0 22px 58px rgba(30,162,255,0.7),
              0 0 96px rgba(30,162,255,0.5), inset 0 1px 0 rgba(255,255,255,0.36);
}
@keyframes ctaGlow {
  0%, 100% { box-shadow: 0 0 0 1px rgba(255,255,255,0.10), 0 16px 46px rgba(30,162,255,0.5),
                         0 0 60px rgba(30,162,255,0.28), inset 0 1px 0 rgba(255,255,255,0.3); }
  50%      { box-shadow: 0 0 0 1px rgba(255,255,255,0.14), 0 20px 56px rgba(30,162,255,0.75),
                         0 0 100px rgba(30,162,255,0.5), inset 0 1px 0 rgba(255,255,255,0.3); }
}
@media (prefers-reduced-motion: reduce) { .cta--glow { animation: none; } }

/* hero VSL (VTurb smart player). The player renders its own 16:9 box, so this
   only constrains the width and supplies the frame the rest of the site uses. */
.app-vsl {
  max-width: 900px;
  margin: 8px auto 0;
  border-radius: 10px;
  overflow: hidden;
  background: #000;
  box-shadow: 0 22px 55px rgba(0,0,0,0.6), 0 0 0 1px rgba(255,255,255,0.08);
}
#applyPage .cta-note { margin-top: 12px; }

/* full-width band used for the transition, sign-up and final CTA sections */
.app-band {
  margin: 88px auto 0;
  max-width: 1080px;
  padding: 48px 26px;
  border: 1px solid rgba(30,162,255,0.28);
  border-radius: 22px;
  background: linear-gradient(180deg, rgba(30,162,255,0.09), var(--card) 200px);
}
.app-band--final { border-color: rgba(30,162,255,0.5); }
.app-band .bstep__body { margin-left: auto; margin-right: auto; }

/* CLAUDE.md body-text rule: lead-facing copy is clamp(17px, 2.2vw, 19px)/1.7.
   The reusable .obj accordion ships at 14-16px for the video page, so it is
   bumped here rather than changed globally. */
#applyPage .obj__q { font-size: clamp(18px, 2.4vw, 21px); }
#applyPage .obj__a { font-size: clamp(17px, 2.2vw, 19px); line-height: 1.7; }
.appcard__body,
.app-criteria .appcard__body,
.appcase__body {
  color: var(--muted);
  font-size: clamp(17px, 2.2vw, 19px);
  line-height: 1.7;
  margin: 0;
}

/* ---------- grids (mobile stacks, desktop goes wide, CLAUDE.md layout rule) ---------- */
.app-grid { display: grid; gap: 20px; margin-top: 30px; text-align: left; }
.app-grid--2, .app-grid--3 { grid-template-columns: minmax(0, 1fr); }

/* ---------- generic card ---------- */
.appcard {
  border: 1px solid var(--card-line);
  border-radius: 16px;
  background: var(--card);
  padding: 26px 24px;
  transition: border-color .15s ease, transform .12s ease, box-shadow .15s ease;
}
.appcard:hover {
  border-color: rgba(30,162,255,0.45);
  transform: translateY(-3px);
  box-shadow: 0 18px 40px rgba(0,0,0,0.5);
}
.appcard__title {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(19px, 2.6vw, 23px);
  line-height: 1.25;
  color: #fff;
  margin: 0 0 12px;
}
.appcard__num {
  font-family: var(--display);
  font-weight: 900;
  font-size: 34px;
  line-height: 1;
  color: var(--accent);
  margin: 0 0 10px;
}
.appcard__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 12px;
}
.appcard__list li {
  position: relative;
  padding-left: 26px;
  color: var(--muted);
  font-size: clamp(17px, 2.2vw, 19px);
  line-height: 1.55;
}
.appcard__list li::before {
  content: "\2713";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--accent);
  font-weight: 800;
}

/* ---------- the six situation icons (animated line art) ---------- */
.appcard__icon {
  width: 88px;
  height: 88px;
  margin-bottom: 18px;
  color: var(--accent); /* the SVG strokes are currentColor, so they follow the token */
}
.appcard__icon svg { width: 100%; height: 100%; display: block; overflow: visible; }
.appcard__icon svg > * {
  fill: none;
  stroke: currentColor;
  stroke-width: 5;
  stroke-linecap: round;
  stroke-linejoin: round;
}

@media (prefers-reduced-motion: no-preference) {
  /* draw-in: the stroke is hidden behind its own dash offset until the card
     scrolls into view, when revealApplyIcons() adds .is-drawn. */
  .appcard__icon svg > * {
    stroke-dasharray: 400;
    stroke-dashoffset: 400;
  }
  .appcard__icon.is-drawn svg > * {
    animation: appDraw 1.1s ease forwards, appGlow 3.2s ease-in-out 1.1s infinite;
  }
  /* stagger the sub-paths so each icon assembles instead of appearing at once */
  .appcard__icon.is-drawn svg > *:nth-child(2) { animation-delay: .16s, 1.26s; }
  .appcard__icon.is-drawn svg > *:nth-child(3) { animation-delay: .32s, 1.42s; }
  .appcard__icon.is-drawn svg > *:nth-child(4) { animation-delay: .48s, 1.58s; }
}
@keyframes appDraw {
  from { stroke-dashoffset: 400; opacity: .25; }
  to   { stroke-dashoffset: 0;   opacity: 1; }
}
@keyframes appGlow {
  0%, 100% { filter: drop-shadow(0 0 2px rgba(30,162,255,0.35)); }
  50%      { filter: drop-shadow(0 0 10px rgba(30,162,255,0.75)); }
}
/* reduced motion: no draw-in, no pulse, just the finished icon */
@media (prefers-reduced-motion: reduce) {
  .appcard__icon svg > * { stroke-dasharray: none; stroke-dashoffset: 0; animation: none; }
}

/* ---------- case studies ---------- */
.appcase {
  border: 1px solid var(--card-line);
  border-radius: 16px;
  background: var(--card);
  padding: 20px 20px 24px;
  transition: border-color .15s ease, transform .12s ease, box-shadow .15s ease;
}
.appcase:hover {
  border-color: rgba(30,162,255,0.45);
  transform: translateY(-3px);
  box-shadow: 0 18px 40px rgba(0,0,0,0.5);
}
.appcase__label {
  font-family: var(--display);
  font-weight: 800;
  font-size: 12px;
  letter-spacing: 0.14em;
  text-transform: uppercase;
  color: var(--accent);
  margin: 0 0 12px;
}
/* the screenshot slot keeps its box when empty, so an unfilled SWAP POINT reads
   as "screenshot goes here" rather than as a broken layout */
.appcase__shot {
  position: relative;
  aspect-ratio: 16 / 10;
  border-radius: 10px;
  overflow: hidden;
  background: linear-gradient(135deg, #1c1c1c, #0f0f0f);
  border: 1px solid var(--card-line);
  margin-bottom: 16px;
}
.appcase__shot img { width: 100%; height: 100%; object-fit: cover; display: block; }
.appcase__stat {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(19px, 2.6vw, 23px);
  line-height: 1.25;
  color: #fff;
  margin: 0 0 10px;
}

/* ---------- criteria checklist ---------- */
.app-criteria { list-style: none; margin: 30px 0 0; padding: 0; display: grid; gap: 16px; text-align: left; }
.app-criteria__item {
  display: flex;
  gap: 16px;
  align-items: flex-start;
  border: 1px solid var(--card-line);
  border-radius: 14px;
  background: var(--card);
  padding: 22px 24px;
}
.app-criteria__tick {
  flex: 0 0 auto;
  width: 30px; height: 30px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 50%;
  background: rgba(30,162,255,0.14);
  color: var(--accent);
  font-size: 15px;
  font-weight: 800;
}
.app-criteria__q {
  font-family: var(--display);
  font-weight: 700;
  font-size: clamp(18px, 2.4vw, 21px);
  line-height: 1.3;
  color: #fff;
  margin: 0 0 8px;
}
/* the disqualifying list: same shape, muted so it reads as the counterweight to
   the criteria above rather than as a second set of benefits. Form-error red is
   the one palette exception and is reserved for functional errors, so this uses
   a neutral grey tick instead. */
.app-criteria--no .app-criteria__item { border-color: rgba(255,255,255,0.07); background: #0a0a0a; }
.app-criteria--no .app-criteria__tick {
  background: rgba(255,255,255,0.06);
  color: var(--muted-2);
  font-size: 19px;
}
.app-criteria--no .app-criteria__q { color: var(--muted); }

/* ---------- DM team structure tier list ---------- */
.app-tier { list-style: none; margin: 30px 0 0; padding: 0; display: grid; gap: 14px; text-align: left; }
.app-tier__row {
  display: flex;
  gap: 18px;
  align-items: flex-start;
  border: 1px solid var(--card-line);
  border-radius: 14px;
  background: var(--card);
  padding: 22px 24px;
}
.app-tier__grade {
  flex: 0 0 auto;
  width: 48px; height: 48px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 12px;
  font-family: var(--display);
  font-weight: 900;
  font-size: 24px;
  color: var(--muted);
  background: rgba(255,255,255,0.05);
  border: 1px solid var(--card-line);
}
/* S is the recommendation, so it gets the accent. D is the trap, so it recedes. */
.app-tier__row--s {
  border-color: rgba(30,162,255,0.5);
  background: linear-gradient(180deg, rgba(30,162,255,0.09), var(--card) 120px);
}
.app-tier__row--s .app-tier__grade {
  color: #fff;
  background: linear-gradient(180deg, var(--accent-2), var(--accent));
  border-color: var(--accent);
  box-shadow: 0 8px 20px rgba(30,162,255,0.42);
}
.app-tier__row--d { opacity: 0.72; }
.app-tier__name {
  font-family: var(--display);
  font-weight: 800;
  font-size: clamp(18px, 2.4vw, 22px);
  line-height: 1.3;
  color: #fff;
  margin: 0 0 8px;
}

/* ---------- guarantee line ---------- */
.app-guarantee {
  max-width: 760px;
  margin: 22px auto 0;
  padding: 16px 20px;
  border: 1px solid rgba(30,162,255,0.34);
  border-radius: 12px;
  background: rgba(30,162,255,0.06);
  color: #fff;
  font-weight: 600;
  font-size: clamp(17px, 2.2vw, 19px);
  line-height: 1.6;
}

/* ---------- founder block ---------- */
.app-founder { margin-top: 30px; text-align: left; }
.app-founder__photo {
  width: 190px;
  aspect-ratio: 1;
  margin: 0 auto 24px;
  border-radius: 50%;
  overflow: hidden;
  border: 2px solid rgba(30,162,255,0.4);
  background: linear-gradient(135deg, #2a2a2a, #161616);
}
.app-founder__photo img { width: 100%; height: 100%; object-fit: cover; display: block; }
.app-founder .bstep__body + .bstep__body { margin-top: 16px; }
/* the "(We stopped counting a while back)" beat: a quieter aside tucked under
   the stat line it qualifies, not a paragraph in its own right */
.app-founder__aside { color: var(--muted-2); margin-top: 4px !important; }

/* ---------- slack / proof screenshots ---------- */
.app-shot {
  margin: 0;
  border: 1px solid var(--card-line);
  border-radius: 12px;
  overflow: hidden;
  background: linear-gradient(135deg, #1c1c1c, #0f0f0f);
  min-height: 150px;
}
.app-shot img { width: 100%; height: auto; display: block; }

/* ---------- testimonials ---------- */
.app-hero-proof { margin-top: 46px; max-width: 520px; }
/* .pstack__title carries a 22px bottom margin meant for a title sitting straight
   on the grid; pull the split subtitle back up under it. */
.app-sub--tight { margin-top: -14px; margin-bottom: 18px; }
.app-contact-note { max-width: 760px; margin: 0 auto 26px; }
.tcard__company {
  font-size: 13px;
  font-weight: 600;
  letter-spacing: 0.06em;
  text-transform: uppercase;
  color: var(--accent-2);
  text-align: center;
  margin: -6px 0 0;
  padding: 0 12px;
}
.tcard__quote {
  margin: 12px 0 0;
  padding: 0 18px 20px;
  color: var(--muted);
  font-size: clamp(17px, 2.2vw, 19px);
  line-height: 1.7;
  text-align: center;
}
/* On apply.html the quote and the win bullets now render together on the same
   card. Without this their two paddings stack into a 24px trench between them. */
.tcard__quote + .tcard__wins { padding-top: 0; }
/* the two win bullets under a case-study video: money saved, then the lift in
   conversions. Left aligned so the numbers line up down the row of cards. */
.tcard__wins {
  list-style: none;
  margin: 0;
  padding: 4px 18px 20px;
  display: grid;
  gap: 10px;
  text-align: left;
}
.tcard__wins li {
  position: relative;
  padding-left: 24px;
  color: var(--muted);
  font-size: clamp(15px, 1.9vw, 17px);
  line-height: 1.5;
}
.tcard__wins li::before {
  content: "\2713";
  position: absolute;
  left: 0;
  top: 0;
  color: var(--accent);
  font-weight: 800;
}

/* ---------- quote wheel (apply.html, built by renderQuoteWheel) ----------
   Reuses .wheel / .wheel__ring from the coach wheel for the 3D stage, and
   overrides only the card size and face. No cursor:grab and no nav buttons:
   the visitor does not drive this one, it turns on its own and pauses on
   hover. Text and transforms only, so it costs no extra download. */
.qwheel-sec { margin: 60px auto 0; text-align: center; }
.qwheel {
  height: 400px;
  cursor: default;      /* nothing to grab: this wheel is not user-driven */
  touch-action: auto;   /* so a vertical swipe over it still scrolls the page */

  /* Fade both edges so cards dissolve out instead of being chopped off by the
     viewport, which is what sells it as a wheel that keeps turning.
     A MASK is used rather than gradient overlays painted in the page colour:
     /apply sits on .app-bg (blue radials over black), so a hard black gradient
     would smear over the radials and show as a dull band. A mask fades to real
     transparency, so whatever is behind stays correct.
     Applied here and not to an ancestor: .wheel only carries `perspective`, and
     the preserve-3d lives on .wheel__ring below it, so the 3D context survives.
     Stops match the coach marquee's fade (.cmq) so the two edge treatments on
     this page read as one decision rather than two near-misses. */
  -webkit-mask-image: linear-gradient(90deg,
    transparent 0%, #000 18%, #000 82%, transparent 100%);
  mask-image: linear-gradient(90deg,
    transparent 0%, #000 18%, #000 82%, transparent 100%);
}
.qwheel__ring {
  width: 270px;
  height: 340px;
  margin-left: -135px;  /* half the card width */

  /* Continuous turn, not a card-by-card flip.
     Driven by a CSS animation rather than a JS timer so the browser runs it on
     the compositor: it stays smooth, costs no main-thread work per frame, and
     keeps turning even while the page is busy. --spin is set from JS off the
     card count so the pace per card stays the same if quotes are added.
     The coach wheel's .wheel__ring transition would fight the animation, so it
     is cleared here. */
  transition: none;
  animation: qwspin var(--spin, 80s) linear infinite;
}
/* Hover is the brake, in pure CSS so it works regardless of any JS state. */
.qwheel:hover .qwheel__ring,
.qwheel__ring.is-paused {
  animation-play-state: paused;
}
@keyframes qwspin {
  from { transform: translateZ(calc(var(--radius) * -1)) rotateY(0deg); }
  to   { transform: translateZ(calc(var(--radius) * -1)) rotateY(-360deg); }
}
.qwcard {
  position: absolute;
  inset: 0;
  width: 270px;
  height: 340px;
  margin: 0;
  padding: 26px 22px 20px;
  border-radius: 16px;
  background: var(--card);
  border: 1px solid var(--card-line);
  box-shadow: 0 18px 40px rgba(0, 0, 0, 0.55);
  display: flex;
  flex-direction: column;
  justify-content: space-between;
  text-align: center;
  backface-visibility: hidden;
  -webkit-backface-visibility: hidden;
  transition: opacity .4s ease, box-shadow .2s ease;
}
/* The blue outline is driven by HOVER, not by a JS "active index".
   The coach wheel highlights whichever card its index says is front, which only
   works because that wheel sits at fixed positions. This one turns
   continuously, so an index-driven highlight would jump between cards
   mid-rotation. Tying it to hover instead means the ring stops and the card the
   visitor is actually reading is the one that lights up, which is the same
   moment the CSS hover brake pauses the rotation.
   Back-facing cards are excluded from hit-testing by backface-visibility:
   hidden on .qwcard, so only cards facing the viewer can take the outline. */
.qwcard:hover {
  box-shadow: 0 22px 55px rgba(0, 0, 0, 0.65), 0 0 0 2px var(--accent);
}
.qwcard__quote {
  margin: 0;
  flex: 1;
  display: flex;
  align-items: center;
  justify-content: center;
  color: var(--ink);
  font-size: 16.5px;
  line-height: 1.55;
  font-weight: 600;
}
/* the longest quotes step down one size so they still fit the card face */
.qwcard__quote--sm { font-size: 14px; line-height: 1.5; }
.qwcard__who {
  padding-top: 13px;
  border-top: 1px solid var(--card-line);
}
.qwcard__name {
  display: block;
  font-size: 14.5px;
  font-weight: 700;
  color: var(--ink);
}
.qwcard__role {
  display: block;
  margin-top: 2px;
  font-size: 13px;
  color: var(--muted-2);
}
/* with no name, the role carries the weight the name usually would */
.qwcard__role--lead { font-size: 14.5px; font-weight: 700; color: var(--ink); }

@media (prefers-reduced-motion: reduce) {
  .qwheel__ring { transition: none; }
}

/* ============================================================
   APPLY PAGE, DESKTOP (CLAUDE.md: use the horizontal space at >=900px,
   keep the reading order top-down. Headings stay above their text.)
   ============================================================ */
@media (min-width: 900px) {
  #applyPage .bstep { max-width: 1080px; }
  #applyPage .objections { max-width: 1080px; }
  #applyPage .proof-stack { max-width: 1080px; }
  #applyPage .qwheel-sec { max-width: 1080px; }
  .app-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
  .app-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; }
  .app-criteria { max-width: 1080px; margin-left: auto; margin-right: auto; }
  .app-tier { max-width: 1080px; margin-left: auto; margin-right: auto; }
  .app-hero-proof { max-width: 620px; }

  /* founder photo beside the copy, heading still on top of both */
  .app-founder { display: grid; grid-template-columns: 230px minmax(0, 1fr); gap: 36px; align-items: start; }
  .app-founder__photo { margin: 0; width: 230px; }
}

/* ============================================================
   APPLY MODAL
   Hosts the shared intake wizard. .qualify brings its own 720px card,
   heavy padding and pulsing glow (built for the open page); inside a
   dialog that reads as a glow inside a glow, so it is flattened here.
   ============================================================ */
.modal--apply .modal__dialog {
  max-width: 680px;
  padding: 26px 22px 22px;
  margin: auto; /* still centers when the dialog is shorter than the viewport */
}
/* .modal is a centered flex container. A dialog taller than the viewport in a
   centered flex box overflows in BOTH directions and its top becomes
   unreachable, which is exactly what happens once the 560px calendar mounts. */
.modal--apply { align-items: flex-start; }
.modal--apply .qualify {
  max-width: none;
  margin: 0;
  padding: 6px 0 0;
  background: none;
  border: 0;
  border-radius: 0;
  animation: none;
  box-shadow: none;
}
/* The Cal embed sizes its own iframe. The shared .qbook rules force a fixed
   min-height plus a bordered dark panel, which left black bands above and below
   the calendar whenever Cal rendered shorter than the box. Inside this modal the
   frame is dropped entirely and the height is left to Cal, so the calendar sits
   flush on the modal's own background. The small min-height is only a floor
   while the iframe is still loading, so the modal does not collapse. */
.modal--apply .qbook {
  min-height: 420px;
  margin-top: 0;
  border: 0;
  border-radius: 0;
  background: none;
  overflow: visible;
}
.modal--apply .qbook > * {
  height: auto;
  min-height: 0;
}

@media (max-width: 760px) {
  .app-sec { margin-top: 60px; }
  .app-band { margin-top: 60px; padding: 34px 20px; border-radius: 16px; }
  .app-founder__photo { width: 150px; }
  .modal--apply .modal__dialog { padding: 22px 16px 18px; }
  .app-tier__row { gap: 14px; padding: 18px 16px; }
  .app-tier__grade { width: 40px; height: 40px; font-size: 20px; }
}

/* ============================================================
   APPLY PAGE, REFERENCE SPEC PORT
   ------------------------------------------------------------
   Sizes, frames and effects lifted from the reference funnel's own
   computed styles (measured live, not eyeballed), then re-skinned to
   our tokens. Their values, our blue + Montserrat:

     container      1170px, 15px side padding
     h1             48px / 700 / 1.2 / capitalize
     section h2     35px  (2.19rem) / 700
     section sub    18.7px (1.17rem) / 400
     body copy      19.2px / 400 / 1.4
     card frame     1px solid rgba(255,255,255,0.08), radius 16px, no fill
     divider        rgb(77,77,77)
     button         radius 16px, 20px vertical padding, 34px / 700 / uppercase,
                    45deg 3-stop gradient, 1px light-tint border
     breakpoint     770px

   This block sits last so it wins over the earlier APPLY rules. NOTE: it
   overrides the CLAUDE.md default body size (clamp(17px,2.2vw,19px)/1.7) on
   THIS PAGE ONLY, at the owner's request, to match the reference exactly.
   ============================================================ */
#applyPage {
  --app-w: 1170px;
  --app-line: rgba(255, 255, 255, 0.08);
  --app-divider: rgb(77, 77, 77);
  --app-radius: 16px;
}

/* ---------- containers: one width everywhere ---------- */
#applyPage .bstep,
#applyPage .objections,
#applyPage .proof-stack,
#applyPage .app-band,
#applyPage .app-criteria,
#applyPage .app-tier,
#applyPage .app-grid,
#applyPage .app-founder,
#applyPage .app-vsl {
  width: 100%;
  max-width: var(--app-w);
  margin-left: auto;
  margin-right: auto;
}
#applyPage .headline { max-width: 1306px; }
#applyPage .app-sec { margin-top: 70px; padding-bottom: 10px; }

/* ---------- type scale ---------- */
#applyPage .headline {
  font-size: clamp(28px, 3.4vw, 48px);
  font-weight: 700;
  line-height: 1.2;
  text-transform: capitalize;
  letter-spacing: normal;
}
#applyPage .headline .hl { font-weight: 700; }
#applyPage .headline u { border-bottom-width: 3px; }

#applyPage .subhead {
  font-size: clamp(16px, 2vw, 19.2px);
  font-weight: 400;
  line-height: 1.4;
  /* Sized to sit inside the video frame below it (1053px) with an inset each
     side. This is now the ONLY rule setting the subhead's width: it used to
     also appear in the shared container group above, and the two fought, which
     made the rendered width jump between viewports. */
  max-width: 1000px;
}

/* section headings: 2.19rem / 700, sub 1.17rem / 400 */
#applyPage .bstep__title,
#applyPage .pstack__title {
  font-size: clamp(24px, 3vw, 35px);
  font-weight: 700;
  line-height: 1.2;
  text-transform: capitalize;
  letter-spacing: normal;
}
#applyPage .bstep__title--long { font-size: clamp(22px, 2.6vw, 32px); }
#applyPage .bstep__subtitle {
  font-size: clamp(15px, 1.8vw, 18.7px);
  font-weight: 400;
  line-height: 1.4;
  text-transform: none;
  letter-spacing: normal;
  color: var(--muted);
  margin-top: 10px;
}

/* body copy: 19.2px / 1.4 */
#applyPage .bstep__body,
#applyPage .appcard__body,
#applyPage .appcase__body,
#applyPage .obj__a,
#applyPage .appcard__list li,
#applyPage .app-guarantee {
  font-size: clamp(16px, 2vw, 19.2px);
  line-height: 1.4;
}
#applyPage .obj__q,
#applyPage .appcard__title,
#applyPage .app-criteria__q,
#applyPage .app-tier__name,
#applyPage .appcase__stat {
  font-size: clamp(17px, 2.1vw, 21px);
  font-weight: 700;
  line-height: 1.3;
  text-transform: none;
}
#applyPage .tcard__wins li { font-size: clamp(15px, 1.8vw, 17px); line-height: 1.4; }
#applyPage .tcard__name { font-size: 19.2px; font-weight: 700; }

/* ---------- frames: one card treatment everywhere ---------- */
#applyPage .appcard,
#applyPage .appcase,
#applyPage .app-criteria__item,
#applyPage .app-tier__row,
#applyPage .tcard,
#applyPage .app-shot {
  border: 1px solid var(--app-line);
  border-radius: var(--app-radius);
  background: transparent;
}
#applyPage .appcard:hover,
#applyPage .appcase:hover,
#applyPage .tcard:hover {
  border-color: rgba(30, 162, 255, 0.5);
  transform: translateY(-3px);
  box-shadow: 0 18px 40px rgba(0, 0, 0, 0.5);
}
/* the S tier and the stats keep the accent fill, everything else is a frame */
#applyPage .app-tier__row--s {
  border-color: rgba(30, 162, 255, 0.5);
  background: linear-gradient(180deg, rgba(30, 162, 255, 0.09), transparent 120px);
}
#applyPage .app-band {
  border: 1px solid rgba(30, 162, 255, 0.28);
  border-radius: var(--app-radius);
  background: linear-gradient(180deg, rgba(30, 162, 255, 0.09), transparent 200px);
  padding: 50px 25px 40px;
  margin-top: 70px;
}
#applyPage .app-band--final { border-color: rgba(30, 162, 255, 0.5); }
#applyPage .obj { border-bottom: 1px solid var(--app-divider); }
#applyPage .obj:first-of-type { border-top: 1px solid var(--app-divider); }
#applyPage .app-vsl,
#applyPage .appcase__shot { border-radius: var(--app-radius); }
#applyPage .app-founder__photo { border-radius: 400px; }

/* ---------- button: their frame, our gradient ----------
   PAGE CTAs only. The wizard's own "Continue" button is also a .cta but lives
   inside a 420px form step, where a 34px uppercase button is absurd, so
   .qform__submit is explicitly excluded. */
#applyPage .cta:not(.qform__submit) {
  width: 100%;
  max-width: 599px;
  padding: 20px 24px;
  border-radius: var(--app-radius);
  border: 1px solid #a5dbff;
  font-size: clamp(20px, 3vw, 34px);
  font-weight: 700;
  line-height: 1.05;
  text-transform: uppercase;
  letter-spacing: normal;
  background: linear-gradient(45deg, #0f7fd4 0%, #6cc4ff 49%, #0f7fd4 100%);
}
#applyPage .cta--glow {
  box-shadow: 0 0 0 1px rgba(255, 255, 255, 0.08), 0 16px 46px rgba(30, 162, 255, 0.45),
              0 0 70px rgba(30, 162, 255, 0.28), inset 0 1px 0 rgba(255, 255, 255, 0.28);
}

/* ---------- pill eyebrow: their 400px-family radius ---------- */
#applyPage .app-pill {
  font-size: clamp(14px, 1.7vw, 16px);
  font-weight: 600;
  border-radius: 400px;
  padding: 14px 32px;
}

/* ---------- grids on the reference's 770px breakpoint ---------- */
@media (min-width: 771px) {
  #applyPage .app-grid--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); gap: 24px; }
  #applyPage .app-grid--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 24px; }
  #applyPage .pstack__row--reels { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px 24px; }
  #applyPage .app-founder { display: grid; grid-template-columns: 230px minmax(0, 1fr); gap: 36px; align-items: start; }
}
@media (max-width: 770px) {
  #applyPage .app-sec { margin-top: 48px; }
  #applyPage .app-band { margin-top: 48px; padding: 32px 18px 28px; }
  #applyPage .app-founder__photo { width: 150px; margin: 0 auto 24px; }
}

/* ============================================================
   APPLY MODAL, TYPEFORM-STYLE LAYOUT
   ------------------------------------------------------------
   The reference funnel's popup is a Typeform embed: a wide, airy panel with one
   question at a time, big question type, and a lot of empty space around it.
   This gives our own wizard the same proportions. Desktop goes wide and
   horizontal (options side by side, input and Continue on one row); phones fall
   back to the stacked layout with comfortable padding.
   ============================================================ */
.modal--apply .modal__dialog {
  max-width: 1040px;
  padding: 34px 26px 30px;
}
.modal--apply .modal__eyebrow { margin-bottom: 4px; }

@media (min-width: 771px) {
  .modal--apply .modal__dialog { padding: 76px 80px 60px; }

  /* the question: a notch smaller than before, with real air above it (from the
     eyebrow) and below it (before the options) so nothing crowds. */
  .modal--apply .qstep__q {
    font-size: clamp(26px, 2.5vw, 32px);
    line-height: 1.22;
    margin: 0 0 38px;
  }
  .modal--apply .qstep__sub {
    font-size: 19.2px;
    line-height: 1.4;
    margin: 0 0 40px;
  }
  .modal--apply .qback { margin-bottom: 22px; }

  /* options side by side instead of stacked */
  .modal--apply .qchoices { gap: 18px; }
  .modal--apply .qchoices--2 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
  .modal--apply .qchoices--3 { grid-template-columns: repeat(3, minmax(0, 1fr)); }
  .modal--apply .qchoice { padding: 34px 18px; font-size: 19.2px; }
  /* Stacked lists stay stacked here, and must claw back the padding above: the
     rule is written after the base .qchoices--1 one and would otherwise win on
     equal specificity, making a 5-band step ~450px of buttons inside the modal. */
  .modal--apply .qchoices--1,
  .modal--apply .qchoices--5 { grid-template-columns: 1fr; }
  .modal--apply .qchoices--1 .qchoice,
  .modal--apply .qchoices--5 .qchoice { padding: 20px 24px; text-align: left; }

  /* the combined contact step: wider to match the panel, but still one column
     (it deliberately does not carry --single, whose field/submit grid below
     would put a lone input beside the button and orphan the other two) */
  .modal--apply .qform--stack { max-width: 560px; }

  /* text/number steps: input and Continue on one row, wide */
  .modal--apply .qform--single {
    max-width: 720px;
    display: grid;
    grid-template-columns: minmax(0, 1fr) auto;
    grid-template-areas: "field submit" "error error";
    align-items: start;
    gap: 14px;
  }
  .modal--apply .qform--single .qfield { grid-area: field; }
  .modal--apply .qform--single .qform__submit {
    grid-area: submit;
    width: auto;
    margin-top: 0;
    padding: 18px 40px;
    white-space: nowrap;
  }
  .modal--apply .qform--single .qform__error { grid-area: error; }
  .modal--apply .qfield input { font-size: 19.2px; padding: 19px 20px; }

  /* the "something else" row sits under its options with the same rhythm */
  .modal--apply .qform--other { margin-top: 22px; }

  /* the calendar step gets the full width of the wider panel */
  .modal--apply .qbook,
  .modal--apply .qbook > * { min-height: 0; }
}

@media (max-width: 770px) {
  .modal--apply .modal__dialog { padding: 38px 20px 30px; }
  .modal--apply .modal__eyebrow { margin-bottom: 22px; }
  .modal--apply .qstep__q { font-size: clamp(21px, 5.4vw, 26px); margin-bottom: 26px; }
  .modal--apply .qstep__sub { font-size: 16px; margin-bottom: 26px; }
  .modal--apply .qchoice { padding: 24px 14px; font-size: 17px; }
  .modal--apply .qchoices--1 .qchoice,
  .modal--apply .qchoices--5 .qchoice { padding: 16px 16px; text-align: left; }
  .modal--apply .qfield input { font-size: 16px; padding: 16px 16px; }
}

/* ---------- apply page buttons: 3D + gradient, no glow ----------
   Owner call: the coloured glow was too much. Keep the gradient and the 3D
   depth (a neutral drop shadow plus the inset top highlight), drop every
   accent-coloured halo, and kill the idle pulse. Hover keeps the identical
   treatment, so nothing lights up on approach. */
#applyPage .cta,
#applyPage .cta--glow,
.modal--apply .cta {
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.28);
  animation: none;
}
#applyPage .cta:hover,
#applyPage .cta--glow:hover,
.modal--apply .cta:hover {
  box-shadow: 0 10px 24px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.28);
  transform: translateY(-2px);
}
#applyPage .cta:active,
.modal--apply .cta:active { transform: translateY(0); }

/* ---------- "something else" stays hidden until it is chosen ----------
   This has to be the LAST word on the matter. The form carries both
   .qform--other and .qform--single, and the Typeform block above sets
   .modal--apply .qform--single { display: grid } at equal specificity to a
   plain .qform--other[hidden], so source order alone would reveal the input on
   every business-type step. The descendant selector below outranks it. */
.qform--other[hidden],
.modal--apply .qform--other[hidden] { display: none; }

/* the apply modal's eyebrow is the panel's label and the only branding inside
   the form, so it is sized up well past the small caption .modal__eyebrow is
   elsewhere on the site */
.modal--apply .modal__eyebrow {
  font-size: clamp(16px, 2vw, 22px);
  letter-spacing: 0.1em;
  line-height: 1.25;
  margin-bottom: 30px;
}

/* ============================================================
   APPLY PAGE, LATE ADDITIONS (2026-07-26)
   ============================================================ */

/* ---------- the 4-step install roadmap ---------- */
.app-road {
  list-style: none;
  margin: 34px auto 0;
  padding: 0;
  display: grid;
  gap: 18px;
  text-align: left;
  counter-reset: road;
}
.app-road__step {
  position: relative;
  display: flex;
  gap: 20px;
  align-items: flex-start;
  border: 1px solid var(--app-line, rgba(255,255,255,0.08));
  border-radius: 16px;
  background: transparent;
  padding: 26px 26px 24px;
}
.app-road__num {
  flex: 0 0 auto;
  width: 54px; height: 54px;
  display: flex; align-items: center; justify-content: center;
  border-radius: 14px;
  font-family: var(--display);
  font-weight: 900;
  font-size: 21px;
  color: #fff;
  background: linear-gradient(180deg, var(--accent-2), var(--accent));
  box-shadow: inset 0 1px 0 rgba(255,255,255,0.28);
}
.app-road__body { min-width: 0; }
.app-road__body .appcard__title { margin-bottom: 8px; }
.app-road__body .appcard__body { margin-bottom: 16px; }
.app-road__list {
  list-style: none;
  margin: 0;
  padding: 0;
  display: grid;
  gap: 10px 22px;
}
.app-road__list li {
  position: relative;
  padding-left: 26px;
  color: var(--muted);
  font-size: clamp(15px, 1.8vw, 17px);
  line-height: 1.4;
}
.app-road__list li::before {
  content: "";
  position: absolute;
  left: 2px; top: 0.5em;
  width: 8px; height: 8px;
  border-radius: 50%;
  background: var(--accent);
  box-shadow: 0 0 0 3px rgba(30,162,255,0.16);
}

/* ---------- tier list: spell out "Tier" under the letter ---------- */
.app-tier__grade { flex-direction: column; gap: 1px; width: 58px; height: 58px; line-height: 1; }
.app-tier__word {
  font-size: 9px;
  font-weight: 700;
  letter-spacing: 0.12em;
  text-transform: uppercase;
  opacity: 0.75;
}

/* ---------- guarantee as two bullets ---------- */
.app-guarantee { text-align: left; padding: 22px 26px; }
.app-guarantee__title {
  font-family: var(--display);
  font-weight: 800;
  text-transform: uppercase;
  letter-spacing: 0.1em;
  font-size: 14px;
  color: var(--accent);
  margin: 0 0 12px;
}
.app-guarantee__list { list-style: none; margin: 0; padding: 0; display: grid; gap: 10px; }
.app-guarantee__list li {
  position: relative;
  padding-left: 28px;
  font-weight: 600;
  line-height: 1.45;
}
.app-guarantee__list li::before {
  content: "\2713";
  position: absolute; left: 0; top: 0;
  color: var(--accent);
  font-weight: 800;
}

/* ---------- fine print was too small to read ---------- */
#applyPage .cta-note {
  font-size: clamp(15px, 1.8vw, 17px);
  line-height: 1.45;
  color: var(--muted);
  max-width: 620px;
  margin-left: auto;
  margin-right: auto;
}
#applyPage .footer__disclaimer {
  font-size: clamp(14px, 1.7vw, 16px);
  line-height: 1.6;
  max-width: 900px;
  margin-left: auto;
  margin-right: auto;
}
#applyPage .footer__links { font-size: clamp(15px, 1.8vw, 17px); }
#applyPage .footer__copy { font-size: clamp(14px, 1.7vw, 16px); }

@media (min-width: 771px) {
  .app-road { max-width: var(--app-w, 1170px); }
  /* two columns of items so a long audit list reads wide, not tall */
  .app-road__list { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}
@media (max-width: 770px) {
  .app-road__step { flex-direction: column; gap: 14px; padding: 22px 18px; }
  .app-road__num { width: 46px; height: 46px; font-size: 18px; }
}

/* revenue buckets: 4 options read better 2x2 than squeezed 4 across */
@media (min-width: 771px) {
  .modal--apply .qchoices--4 { grid-template-columns: repeat(2, minmax(0, 1fr)); }
}

/* ---------- coach handle marquee (under the hero CTA) ----------
   Matches the reference component: rounded rectangle cards, avatar in a ring,
   handle + niche + follower count. Two differences on purpose: no "verified"
   badge (we cannot assert that about someone's account) and the ring uses our
   accent instead of Instagram's gradient, per the fixed palette.

   The strip is CENTRED and capped near half the viewport, with both ends masked,
   so cards fade in and out around the middle of the screen rather than sweeping
   the full width. The track holds the roster twice and translates -50%, which is
   what makes the loop seamless. */
.cmq {
  position: relative;
  width: min(1080px, 94vw);
  max-width: min(1080px, 94vw);
  margin: 46px auto 0;   /* clears the CTA note above it */
  overflow: hidden;
  padding: 10px 0 4px;
  -webkit-mask-image: linear-gradient(90deg, transparent 0%, #000 18%, #000 82%, transparent 100%);
  mask-image: linear-gradient(90deg, transparent 0%, #000 18%, #000 82%, transparent 100%);
}
.cmq__track {
  display: flex;
  width: max-content;
  gap: 14px;
  animation: cmqScroll 48s linear infinite;
}
.cmq:hover .cmq__track { animation-play-state: paused; }
@keyframes cmqScroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
/* reduced motion: hold it still and let the strip scroll by hand instead */
@media (prefers-reduced-motion: reduce) {
  .cmq { overflow-x: auto; }
  .cmq__track { animation: none; }
}

/* rounded RECTANGLE cards, not pills */
.cmq__card {
  flex: 0 0 auto;
  display: flex;
  align-items: center;
  gap: 12px;
  padding: 12px 20px 12px 12px;
  border: 1px solid var(--card-line);
  border-radius: 16px;
  background: var(--card);
  transition: border-color .15s ease, box-shadow .15s ease, transform .12s ease;
}
/* hover a single card: accent outline, so the roster feels browsable rather
   than decorative. The track already pauses on hover, so the card the cursor
   is over holds still long enough to read. */
.cmq__card:hover {
  border-color: var(--accent);
  box-shadow: 0 0 0 1px var(--accent), 0 10px 26px rgba(0, 0, 0, 0.5);
  transform: translateY(-2px);
}
.cmq__ring {
  flex: 0 0 auto;
  display: block;
  width: 52px; height: 52px;
  border-radius: 50%;
  padding: 2px;
  background: linear-gradient(135deg, var(--accent), #7cc9ff 50%, var(--accent));
}
.cmq__ring-in {
  display: block;
  width: 100%; height: 100%;
  border-radius: 50%;
  padding: 2px;
  background: var(--card);
}
.cmq__ring-in img {
  width: 100%; height: 100%;
  border-radius: 50%;
  object-fit: cover;
  display: block;
}
.cmq__info { display: flex; flex-direction: column; gap: 2px; min-width: 0; }
.cmq__handle {
  font-family: var(--display);
  font-weight: 700;
  font-size: 15px;
  color: #fff;
  white-space: nowrap;
}
.cmq__niche { font-size: 13px; color: var(--muted); white-space: nowrap; }
.cmq__followers { font-size: 12px; color: var(--muted-2); white-space: nowrap; }

@media (max-width: 770px) {
  .cmq { width: 100vw; max-width: 100vw; margin: 34px 0 0; margin-left: 50%; transform: translateX(-50%); }
  .cmq__card { padding: 10px 16px 10px 10px; gap: 10px; border-radius: 14px; }
  .cmq__ring { width: 44px; height: 44px; }
  .cmq__handle { font-size: 14px; }
  .cmq__niche { font-size: 12px; }
  .cmq__followers { font-size: 11px; }
}

/* ---------- travelling ray around the CTA outline ----------
   A conic gradient is rotated behind the button and then masked to the border
   only, so a white highlight sweeps around the edge. The mask is a two-layer
   xor: one layer covers the content box, one covers the whole box, and
   excluding the first from the second leaves exactly the padding ring. That is
   what keeps the button's own gradient and its label untouched, with no extra
   markup and no element sitting over the text.

   The angle is animated through a registered custom property, because a raw
   conic-gradient angle is not interpolatable. Where @property is unsupported
   the ray simply sits still as a static arc instead of disappearing.
   Excluded: .qform__submit, the wizard's inline Continue button. */
@property --ray-angle {
  syntax: "<angle>";
  initial-value: 0deg;
  inherits: false;
}

/* the ray IS the button's edge, so the static light-blue border is dropped:
   otherwise a 1px near-white border sits on top of the ring and hides it */
#applyPage .cta:not(.qform__submit) {
  position: relative;
  border-color: transparent;
}
#applyPage .cta:not(.qform__submit)::before {
  content: "";
  position: absolute;
  inset: -1px;                  /* cover the border box, not just the padding box */
  border-radius: inherit;
  padding: 3px;                 /* ring thickness */
  background: conic-gradient(
    from var(--ray-angle),
    rgba(255, 255, 255, 0.16) 0turn,
    rgba(255, 255, 255, 0.16) 0.58turn,
    rgba(255, 255, 255, 0.75) 0.72turn,
    #fff 0.79turn,
    rgba(255, 255, 255, 0.75) 0.86turn,
    rgba(255, 255, 255, 0.16) 0.96turn,
    rgba(255, 255, 255, 0.16) 1turn
  );
  -webkit-mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  -webkit-mask-composite: xor;
  mask: linear-gradient(#000 0 0) content-box, linear-gradient(#000 0 0);
  mask-composite: exclude;
  animation: ctaRay 3.2s linear infinite;
  pointer-events: none;
}
@keyframes ctaRay { to { --ray-angle: 360deg; } }

/* holding still under reduced motion would leave a lopsided bright arc, so the
   ring is dropped to an even hairline instead */
@media (prefers-reduced-motion: reduce) {
  #applyPage .cta:not(.qform__submit)::before {
    animation: none;
    background: rgba(255, 255, 255, 0.28);
  }
}

/* ---------- perpetual page background ----------
   Three stacked radial gradients over pure black, position:fixed so the wash
   stays put while the page scrolls past it. Same construction as the reference
   page, re-tinted: it used navy + blue + purple on a #060B18 base, ours is a
   single accent on true black, because the palette is fixed to white / grey /
   blue / black. Alphas run a little higher than the reference since pure black
   gives the tint nothing to build on.

   z-index 0 puts it under .page (z-index 1) and under .app-hero-bg, which comes
   later in the DOM at the same level, so the hero photo still paints on top. */
.app-bg {
  position: fixed;
  inset: 0;
  z-index: 0;
  pointer-events: none;
  background-color: #000;
  background-image:
    radial-gradient(85% 55% at 15% 6%,  rgba(30, 162, 255, 0.20) 0%, rgba(0, 0, 0, 0) 62%),
    radial-gradient(65% 50% at 85% 28%, rgba(30, 162, 255, 0.15) 0%, rgba(0, 0, 0, 0) 58%),
    radial-gradient(75% 45% at 45% 66%, rgba(30, 162, 255, 0.11) 0%, rgba(0, 0, 0, 0) 58%),
    radial-gradient(70% 45% at 55% 96%, rgba(30, 162, 255, 0.10) 0%, rgba(0, 0, 0, 0) 58%);
  animation: appBgDrift 34s ease-in-out infinite alternate;
}
/* a very slow breathe, just enough to keep the page from feeling like a static
   image. Scale only, so nothing reflows and it stays cheap to composite. */
@keyframes appBgDrift {
  from { transform: scale(1);    opacity: 1; }
  to   { transform: scale(1.08); opacity: 0.86; }
}
@media (prefers-reduced-motion: reduce) {
  .app-bg { animation: none; }
}

/* faces strip, sitting alone between the situations H2 and the six cards */
.app-faces { margin: 22px auto 0; justify-content: center; }

/* ---------------------------------------------------------------------------
   PROOF GALLERY (apply.html, section 6c)

   Mixed aspect ratios by nature: phone captures are tall portrait, Slack cards
   are wide landscape. CSS columns (not grid) so each tile keeps its own height
   and nothing gets cropped or letterboxed. Grid would force a row height and
   crop the phone screenshots to nothing.

   Built by renderProofGallery() from the PROOF array in script.js. */
.pgal-sec { margin: 60px auto 0; text-align: center; }

/* Columns are built and filled by renderProofGallery() in script.js, which
   drops each tile into the shortest column. CSS `columns` was tried first and
   abandoned: its balancer left a large dead gap under the last tile in a
   column, because the tiles vary from 1200x296 to 702x1600. */
.pgal {
  margin: 28px auto 0;
  max-width: 560px;
  text-align: left;
}

.pgal__cols { display: flex; align-items: flex-start; gap: 18px; }
.pgal__col { flex: 1 1 0; min-width: 0; display: flex; flex-direction: column; gap: 18px; }

/* Full-width row under the columns, for captures too wide to sit in one. */
.pgal__wide { display: flex; flex-direction: column; gap: 18px; margin-top: 18px; }

.pgal__item {
  margin: 0;
  padding: 0;
  position: relative;
  background: #0b0b0b;
  border: 1px solid #1c1c1c;
  border-radius: 14px;
  overflow: hidden;
  cursor: zoom-in;
  transition: border-color .18s ease, transform .18s ease;
}
.pgal__item:hover,
.pgal__item:focus-visible {
  border-color: rgba(30, 162, 255, .55);
  transform: translateY(-2px);
  outline: none;
}

/* width/height on the <img> gives the intrinsic ratio, so the column does not
   reflow as lazy images arrive */
.pgal__img { display: block; width: 100%; height: auto; }


.pgal__cap {
  padding: 12px 14px 14px;
  border-top: 1px solid #161616;
  display: flex;
  flex-direction: column;
  gap: 2px;
}
.pgal__who { font: 800 14px/1.3 var(--display); color: #fff; }
.pgal__txt { font: 400 13.5px/1.45 var(--sans); color: #9a9a9a; }

/* ---------- lightbox ---------- */
.plight {
  position: fixed;
  inset: 0;
  z-index: 999;
  display: none;
  align-items: center;
  justify-content: center;
  padding: 28px 18px;
  background: rgba(0, 0, 0, .92);
  backdrop-filter: blur(4px);
}
.plight.is-open { display: flex; }
.plight__fig { margin: 0; max-width: 100%; max-height: 100%; display: flex;
               flex-direction: column; align-items: center; gap: 12px; }
.plight__img {
  max-width: 100%;
  /* leave room for the caption under it */
  max-height: calc(100vh - 110px);
  width: auto; height: auto;
  border-radius: 12px;
  border: 1px solid #222;
}
.plight__cap { font: 500 14px/1.5 var(--sans); color: #b6b6b6; text-align: center; }
.plight__x {
  position: absolute;
  top: 14px; right: 18px;
  width: 42px; height: 42px;
  border-radius: 50%;
  border: 1px solid #2a2a2a;
  background: rgba(20, 20, 20, .9);
  color: #fff;
  font-size: 26px;
  line-height: 1;
  cursor: pointer;
}
.plight__x:hover { border-color: var(--accent); }

@media (min-width: 700px) {
  .pgal { max-width: 780px; }
}

/* CLAUDE.md: use the horizontal space at >=900px. Three columns, and the
   gallery widens to the same 1080px the rest of the apply page uses. */
@media (min-width: 900px) {
  .pgal { max-width: 1080px; }
}

@media (prefers-reduced-motion: reduce) {
  .pgal__item { transition: none; }
  .pgal__item:hover, .pgal__item:focus-visible { transform: none; }
}

/* Tall phone captures are clipped in the tile (see SHOT_CAP in
   renderProofGallery). object-position: top keeps the message visible and drops
   the keyboard / nav chrome at the bottom. The fade signals there is more to
   see, which the click-to-enlarge then delivers. The file itself is untouched,
   so the lightbox always shows the whole screenshot. */
.pgal__item.is-clipped .pgal__img { object-fit: cover; object-position: top; }
.pgal__item.is-clipped { position: relative; }
.pgal__item.is-clipped::after {
  content: "";
  position: absolute;
  left: 0; right: 0;
  /* sits just above the caption */
  bottom: 66px;
  height: 90px;
  pointer-events: none;
  background: linear-gradient(to bottom, rgba(11, 11, 11, 0), rgba(11, 11, 11, .92));
}

/* faces strip closing the final CTA band */
.app-faces--cta { margin-top: 30px; }

/* ---------- typewriter headline (hero split test, variant B) ----------
   The phrase cycles, so the line has to hold a fixed height or the whole page
   shifts up and down as short and long phrases swap in. min-height reserves two
   lines at the headline's own line-height. */
#applyPage .headline--type { min-height: 2.44em; }  /* two lines at 1.2 */
.typeline { display: inline; }
.typecaret {
  display: inline-block;
  width: 3px;
  height: 0.86em;
  margin-left: 6px;
  vertical-align: -0.08em;
  background: var(--accent);
  animation: typeBlink 1s steps(1) infinite;
}
@keyframes typeBlink { 0%, 49% { opacity: 1; } 50%, 100% { opacity: 0; } }
@media (prefers-reduced-motion: reduce) {
  .typecaret { display: none; }
}

/* ============================================================
   BOOK A CALL PAGE (book-a-call.html, served at /book-a-call)
   The intake wizard and its calendar picker, nothing else. Everything
   is scoped to #bookPage so it can never leak onto the funnel, /apply
   or /booked. The wizard itself is the shared .qualify / .qstep /
   .qchoice / .qform / .qbook family above, unchanged: this block only
   provides the page shell around it.

   NOTE #bookPage is NOT .page, so it does not inherit that rule's
   zoom: 0.9 (which would shrink the Cal iframe with it). That means it
   also does not inherit .page's z-index, hence the explicit one here to
   sit above the fixed .app-bg.
   ============================================================ */
/* Two widths on purpose. The page is as wide as the proof needs (the gallery
   packs 3 columns at >=900px and the reels run 3-up), while .bk-top keeps the
   wizard at the same reading width it has everywhere else. One shared width
   would either squeeze the gallery into a single column or stretch the form. */
#bookPage {
  position: relative;
  z-index: 1;
  max-width: 1170px;
  margin: 0 auto;
  padding: 44px 20px 60px;
}
#bookPage .bk-top { max-width: 820px; margin: 0 auto; }

#bookPage .bk-head { text-align: center; margin-bottom: 26px; }

/* Two hand-set lines: "Book Your Free" then "DM Funnel Breakdown Call". NOT given
   data-fit, which would shrink all 39 characters onto ONE line and leave it tiny.
   The vw term is what keeps line 2 on a single line: it is the longest string on the
   page and `white-space: nowrap` below forbids it from breaking, so the type has to
   scale with the viewport or it would overflow and force a horizontal scrollbar.
   Measured across 320 to 1440px; do not raise the vw factor without re-measuring. */
#bookPage .bk-title {
  font-family: var(--display);
  font-weight: 900;
  font-size: clamp(18px, 5.4vw, 40px);
  line-height: 1.18;
  color: #fff;
  margin: 0;
}
#bookPage .bk-title__line { display: block; white-space: nowrap; }
/* Same accent emphasis the funnel headlines use (.headline .hl), scoped the same way. */
#bookPage .bk-title .hl { color: var(--accent); }

/* The idle qpulse glow is there to pull a scrolling visitor's eye down to the
   form. On this page the form IS the page and is already under the cursor, so
   the animation is just noise. The border and depth shadow stay. */
#bookPage .qualify {
  animation: none;
  box-shadow: 0 26px 70px rgba(0,0,0,0.5), 0 0 0 1px rgba(30,162,255,0.14);
}

/* ---------- proof sections ----------
   The components themselves (.tcard, .pgal*, .qwheel*, .wheel-sec__*) are the
   global ones /ai-dfy-offer uses, unchanged. Only spacing and the grid count are
   set here, so a change to a proof component still lands on both pages. */
#bookPage .bk-sec { margin-top: 76px; text-align: center; }
/* .qwheel-sec / .pgal-sec carry their own top margin, so zero it and let
   .bk-sec be the single source of vertical rhythm down the page. */
#bookPage .qwheel-sec, #bookPage .pgal-sec { margin-top: 76px; }

#bookPage .wheel-sec__sub { max-width: 640px; margin-left: auto; margin-right: auto; }

/* Reels are 2-up by default; there is room for 3 once the proof column is wide.
   Mirrors the #applyPage rule rather than changing the shared default. */
@media (min-width: 900px) {
  #bookPage .pstack__row--reels { grid-template-columns: repeat(3, minmax(0, 1fr)); gap: 28px 24px; }
}

#bookPage .bk-back__btn { display: inline-block; margin-top: 6px; }

#bookPage .bk-foot {
  margin-top: 56px;
  text-align: center;
  font-size: 14px;
  line-height: 1.6;
  color: var(--muted);
}
#bookPage .bk-foot a { color: var(--accent); text-decoration: none; }
#bookPage .bk-foot a:hover { text-decoration: underline; }

@media (max-width: 480px) {
  #bookPage { padding: 28px 14px 44px; }
  #bookPage .bk-head { margin-bottom: 18px; }
  #bookPage .bk-sec,
  #bookPage .qwheel-sec,
  #bookPage .pgal-sec { margin-top: 54px; }
}
