/* ==========================================================================
   HumanSide — Shared Design System
   thehumansideof.us | Foundations + Leading With Purpose landing pages
   One stylesheet. Mobile-first (designed at 375px). No framework.

   FONTS: the page <head> must include (see CSS-CONTRACT.md):
   <link rel="preconnect" href="https://fonts.googleapis.com">
   <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
   <link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Fraunces:ital,opsz,wght@1,9..144,400..600&family=Poppins:wght@400;500;600;700&display=swap">
   --font-display uses Fraunces ITALIC, high optical size (high-contrast),
   weight 500 — the PP Eiko Medium Italic stand-in.
   ========================================================================== */

/* --------------------------------------------------------------------------
   1. TOKENS
   -------------------------------------------------------------------------- */
:root{
  /* color — aligned to HumanSide official brand deck (CLIENT-BRAND.md §1) */
  --cobalt:#1059E5; --cobalt-700:#0A3FA8; --cobalt-100:#D9ECFE;
  --cream:#FDF8F1; --cream-100:#FEFBF7; --cream-200:#F8F0E0;
  --dark:#272727; --teal:#00BDC9; --yellow:#FFDC22; --orange:#FA6A3A; --black:#000000;
  --green:#1F9D55; --red:#D44438; --logo-grey:#888888;
  /* text-safe (WCAG 1.4.3) ink variants for TEXT on light/cream surfaces.
     Keep the base tokens above for non-text accents (borders, dividers, icons).
       --teal-ink      #0B6A73 : 5.91:1 on --cream, 6.17:1 on --cream-100
       --logo-grey-ink #666666 : 5.37:1 on --cream, 5.61:1 on --cream-100, 4.83:1 on --cream-200
       --red-ink       #B42318 : 6.42:1 on --cream-100, 6.15:1 on --cream */
  --teal-ink:#0B6A73; --logo-grey-ink:#666666; --red-ink:#B42318;

  /* type */
  --font-body:'Poppins',-apple-system,'Segoe UI',Roboto,sans-serif;
  --font-display:'Playfair Display','Georgia',serif; /* HumanSide brand accent — use ITALIC + medium weight only */

  /* spacing — 8pt grid */
  --s1:4px; --s2:8px; --s3:16px; --s4:24px; --s5:32px; --s6:48px;
  --s8:64px; --s10:80px; --s12:96px; --s16:128px;

  /* radius */
  --r-card:16px; --r-pill:9999px; --r-input:8px; --r-modal:24px;

  /* motion */
  --m-fast:150ms ease-out; --m-default:250ms ease-in-out;
  --m-slow:400ms cubic-bezier(.4,0,.2,1);

  /* containers */
  --c-narrow:720px; --c-default:1080px; --c-wide:1280px;

  /* derived */
  --shadow-card:0 1px 2px rgba(39,39,39,.04), 0 4px 16px rgba(39,39,39,.06);
  --shadow-hover:0 4px 8px rgba(39,39,39,.06), 0 12px 32px rgba(39,39,39,.12);
  --shadow-nav:0 1px 0 rgba(39,39,39,.06), 0 2px 12px rgba(39,39,39,.05);
  --ring-cobalt:0 0 0 2px var(--cream), 0 0 0 4px var(--cobalt);
  --nav-h:64px;
  --sticky-bar-h:44px; /* mobile sticky CTA height: 44px clears the WCAG 2.5.5 touch-target floor (was 40px) */
}

/* --------------------------------------------------------------------------
   2. RESET / BASE
   -------------------------------------------------------------------------- */
*,*::before,*::after{box-sizing:border-box}
html{-webkit-text-size-adjust:100%;scroll-behavior:smooth}
@media (prefers-reduced-motion:reduce){html{scroll-behavior:auto}}
body{
  margin:0;
  font-family:var(--font-body);
  font-weight:400;
  font-size:16px;
  line-height:1.6;
  color:var(--dark);
  background:var(--cream);
  -webkit-font-smoothing:antialiased;
  -moz-osx-font-smoothing:grayscale;
}
img,svg,video{max-width:100%;height:auto;display:block}
a{color:var(--cobalt);text-decoration:none}
a:hover{text-decoration:underline}
button{font-family:inherit;cursor:pointer}
ul,ol{margin:0;padding:0;list-style:none}
h1,h2,h3,h4,h5,h6,p{margin:0}
:focus-visible{outline:2px solid var(--cobalt);outline-offset:2px}

/* skip link — first focusable element */
.skip-link{
  position:absolute;left:var(--s3);top:-100px;z-index:1000;
  background:var(--cobalt);color:var(--cream-100);
  padding:var(--s2) var(--s4);border-radius:var(--r-input);
  font-weight:600;transition:top var(--m-fast);
}
.skip-link:focus{top:var(--s3);text-decoration:none}

/* --------------------------------------------------------------------------
   3. TYPE SCALE  (mobile-first; @768 upscale)
   Families: --font-display = Fraunces italic 500 (always italic, never bold).
             Poppins = everything else.
   -------------------------------------------------------------------------- */
.display-xl,.display-l,.display-m,.display-s{
  color:var(--dark);
  letter-spacing:-0.02em;
}
.display-xl{ /* H1 hero only */
  font-family:var(--font-body);
  font-weight:700;
  font-size:40px;
  line-height:1.1;
}
.display-l{ /* section H2 */
  font-family:var(--font-body);
  font-weight:700;
  font-size:32px;
  line-height:1.1;
}
.display-m{ /* H3 */
  font-family:var(--font-body);
  font-weight:700;
  font-size:24px;
  line-height:1.1;
}
.display-s{ /* card title, FAQ Q */
  font-family:var(--font-body);
  font-weight:700;
  font-size:20px;
  line-height:1.2;
  letter-spacing:normal;
}
.body-l{font-size:18px;line-height:1.6;font-weight:400}
.body-m{font-size:16px;line-height:1.6;font-weight:400}
.body-s{font-size:14px;line-height:1.6;font-weight:400}
/* Muted ink: #5b5b5b was ~4.3:1 on --cream-200 #F2EBDB (borderline fail).
   #565656 clears 4.5:1 on --cream, --cream-100 and --cream-200 while still
   reading as muted against the body ink. */
.text-muted{color:#565656}
.lead{font-size:18px;line-height:1.6;color:#3a3a3a}

@media (min-width:768px){
  .display-xl{font-size:72px}
  .display-l{font-size:56px}
  .display-m{font-size:36px}
  .display-s{font-size:24px}
  .body-l,.lead{font-size:20px}
}

/* --- MIXED-HEADLINE HELPERS (signature move) ---------------------------- */
/* .h-em  = Fraunces italic 500 emphasis phrase (always italic, never bold) */
/* .h-caps = Poppins Bold ALL CAPS phrase                                   */
.h-em{
  font-family:var(--font-display);
  font-style:italic;
  font-weight:500;
  letter-spacing:0; /* serif italic reads tighter; reset the -0.02 inheritance */
}
.h-caps{
  font-family:var(--font-body);
  font-weight:700;
  text-transform:uppercase;
  font-style:normal;
  letter-spacing:0.01em; /* subtle tracking for ALL-CAPS legibility */
}

/* --------------------------------------------------------------------------
   4. LAYOUT — containers, section padding, backgrounds
   -------------------------------------------------------------------------- */
.container-narrow,.container-default,.container-wide{
  width:100%;margin-inline:auto;padding-inline:var(--s4);
}
.container-narrow{max-width:calc(var(--c-narrow) + (2 * var(--s4)))}
.container-default{max-width:calc(var(--c-default) + (2 * var(--s4)))}
.container-wide{max-width:calc(var(--c-wide) + (2 * var(--s4)))}
@media (min-width:768px){
  .container-narrow,.container-default,.container-wide{padding-inline:var(--s6)}
}

/* Section padding (kills dead space): mobile 64 / tablet 80 / desktop 96 */
.section{padding-block:var(--s8)}
@media (min-width:768px){.section{padding-block:var(--s10)}}
@media (min-width:1024px){.section{padding-block:var(--s12)}}
.section--hero{padding-block:var(--s10)} /* 1.5x rhythm */
@media (min-width:768px){.section--hero{padding-block:var(--s12)}}
@media (min-width:1024px){.section--hero{padding-block:var(--s16)}}
.section--footer{padding-block:var(--s8)} /* 1.25x rhythm vs base */
@media (min-width:768px){.section--footer{padding-block:var(--s10)}}

/* Anchor jump targets must clear the 64px sticky nav (and the mobile sticky bar
   when present). Without this, in-page #anchors land hidden behind the header. */
.section[id],
[id]{scroll-margin-top:calc(var(--nav-h, 64px) + var(--s4))}
/* extra offset on mobile when the urgency bar pushes the nav down */
body.has-sticky-bar [id]{
  scroll-margin-top:calc(var(--nav-h, 64px) + var(--sticky-bar-h, 44px) + var(--s4));
}
@media (min-width:768px){
  body.has-sticky-bar [id]{scroll-margin-top:calc(var(--nav-h, 64px) + var(--s4))}
}

/* Cream tone section backgrounds (alternate for adjacent sections) */
.bg-cream{background:var(--cream)}
.bg-cream-100{background:var(--cream-100)}
.bg-cream-200{background:var(--cream-200)}

/* Full-bleed cobalt section (framework + mid-page band) */
.bg-cobalt{
  background:var(--cobalt);
  color:var(--cream-100);
}
.bg-cobalt .display-xl,.bg-cobalt .display-l,
.bg-cobalt .display-m,.bg-cobalt .display-s{color:var(--cream-100)}
.bg-cobalt .h-em{color:#fff}
.bg-cobalt .eyebrow{color:var(--cream-100)}
.bg-cobalt a{color:#fff}

/* Dark footer */
.bg-dark{
  background:var(--dark);
  color:#d6d6d6;
}
.bg-dark .display-xl,.bg-dark .display-l,
.bg-dark .display-m,.bg-dark .display-s{color:var(--cream-100)}
.bg-dark a{color:#d6d6d6}
.bg-dark a:hover{color:var(--cream-100)}

/* simple stack/flow + grid helpers (so page HTML stays lean) */
.stack > * + *{margin-top:var(--s4)}
.stack-sm > * + *{margin-top:var(--s2)}
.stack-lg > * + *{margin-top:var(--s6)}
.center-text{text-align:center}
.measure{max-width:62ch}
.measure-narrow{max-width:48ch}
.grid{display:grid;gap:var(--s4)}
@media (min-width:768px){
  .grid-2{grid-template-columns:repeat(2,1fr)}
  /* grid-3 runs on a 6-track grid (each card spans 2) so a final partial row
     can be centered. Full rows (3 cards = 6 tracks) are unaffected. */
  .grid-3{grid-template-columns:repeat(6,1fr)}
  .grid-3 > *{grid-column:span 2}
  /* 1 trailing card (total 3n+1): center it (start at track 3). */
  .grid-3 > :last-child:nth-child(3n+1){grid-column:3 / span 2}
  /* 2 trailing cards (total 3n+2): center the pair (tracks 2-3 and 4-5). */
  .grid-3 > :last-child:nth-child(3n+2){grid-column:4 / span 2}
  .grid-3 > :nth-last-child(2):nth-child(3n+1){grid-column:2 / span 2}
  /* .arc-path's absolute .arc-path__line span is out of grid flow but still
     counts for :nth-child, shifting the orphan math by one and exiling the
     3rd session card to a centered second row. A 3-card journey row is a
     full row; never orphan-center its last card. */
  .grid-3.arc-path > :last-child:nth-child(3n+1){grid-column:span 2}
  .grid-4{grid-template-columns:repeat(2,1fr)}
}
@media (min-width:1024px){
  .grid-4{grid-template-columns:repeat(4,1fr)}
}

/* --------------------------------------------------------------------------
   5. BUTTONS  (pill, Poppins Bold ALL CAPS, touch target >=44px)
   -------------------------------------------------------------------------- */
.btn-primary,.btn-secondary,.btn-tertiary{
  display:inline-flex;align-items:center;justify-content:center;gap:var(--s2);
  font-family:var(--font-body);font-weight:700;
  font-size:14px;line-height:1;letter-spacing:0.05em;text-transform:uppercase;
  min-height:44px;padding:14px var(--s5);
  border-radius:var(--r-pill);border:2px solid transparent;
  text-decoration:none;text-align:center;
  transition:background-color var(--m-fast), color var(--m-fast),
             transform var(--m-fast), border-color var(--m-fast);
}
@media (min-width:768px){
  .btn-primary,.btn-secondary,.btn-tertiary{font-size:16px}
}
.btn-primary:hover,.btn-secondary:hover,.btn-tertiary:hover{text-decoration:none}

.btn-primary{background:var(--cobalt);color:var(--cream-100);border-color:var(--cobalt)}
.btn-primary:hover{background:var(--cobalt-700);border-color:var(--cobalt-700);transform:scale(1.02)}
.btn-primary:active{transform:scale(.99)}
.btn-primary:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}

.btn-secondary{background:transparent;color:var(--cobalt);border-color:var(--cobalt)}
.btn-secondary:hover{background:var(--cobalt-100)}
.btn-secondary:active{background:var(--cobalt-100);transform:scale(.99)}
.btn-secondary:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}

.btn-tertiary{
  background:transparent;color:var(--cobalt);border-color:transparent;
  padding-inline:var(--s2);min-height:44px;
}
.btn-tertiary .icon{transition:transform var(--m-fast)}
.btn-tertiary:hover{text-decoration:underline}
.btn-tertiary:hover .icon{transform:translateX(4px)}
.btn-tertiary:focus-visible{outline:none;box-shadow:var(--ring-cobalt);border-radius:var(--r-input)}

/* on-cobalt / on-dark button color flips */
.bg-cobalt .btn-primary,.bg-dark .btn-primary{background:var(--cream-100);color:var(--cobalt);border-color:var(--cream-100)}
.bg-cobalt .btn-primary:hover,.bg-dark .btn-primary:hover{background:#fff;border-color:#fff}
.bg-cobalt .btn-primary:focus-visible,.bg-dark .btn-primary:focus-visible{box-shadow:0 0 0 2px var(--cobalt),0 0 0 4px var(--cream-100)}
.bg-cobalt .btn-secondary{color:var(--cream-100);border-color:var(--cream-100)}
.bg-cobalt .btn-secondary:hover{background:rgba(255,255,255,.12)}
.bg-cobalt .btn-tertiary{color:var(--cream-100)}

.btn-block{display:flex;width:100%}
.btn-group{display:flex;flex-wrap:wrap;gap:var(--s3)}

/* icon sizing inside buttons / inline */
.icon{width:24px;height:24px;flex:none;stroke-width:1.5}
.icon-sm{width:20px;height:20px}

/* --------------------------------------------------------------------------
   6. EYEBROW
   teal on breathing sections, cobalt on dense/hero — set per spec via modifier
   -------------------------------------------------------------------------- */
.eyebrow{
  display:inline-block;
  font-family:var(--font-body);font-weight:600;
  font-size:12px;line-height:1.2;letter-spacing:0.1em;text-transform:uppercase;
  color:var(--teal-ink); /* text-safe teal (1.4.3); base --teal stays for accents */
  margin-bottom:var(--s3);
}
@media (min-width:768px){.eyebrow{font-size:14px}}
.eyebrow--cobalt{color:var(--cobalt)}
.eyebrow--teal{color:var(--teal-ink)} /* WCAG 1.4.3: 5.91:1 on cream vs 2.18:1 for raw --teal */
/* On cobalt/dark bands the eyebrow already inverts to cream via §4 rules. */

/* --------------------------------------------------------------------------
   7. TRUST ROW
   -------------------------------------------------------------------------- */
.trust-row{text-align:center}
.trust-row__label{
  font-family:var(--font-body);font-weight:600;
  font-size:12px;letter-spacing:0.1em;text-transform:uppercase;
  color:var(--logo-grey-ink);margin-bottom:var(--s3); /* WCAG 1.4.3: text ink, 5.37:1 on cream */
}
.trust-row__logos{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:center;
  gap:var(--s6);
}
@media (min-width:768px){.trust-row__logos{gap:var(--s10)}}
.trust-row__logo{
  color:var(--logo-grey);
  font-weight:700;font-size:22px;letter-spacing:0.01em;
  opacity:.85;
}
.trust-row__logo svg{height:32px;width:auto;fill:var(--logo-grey)}
@media (min-width:768px){
  .trust-row__logo{font-size:28px}
  .trust-row__logo svg{height:40px}
}

/* Real logo STRIP image (single bitmap of all wordmarks, e.g.
   assets/img/real/logo-strip-trustedby.png). Renders 32px tall on mobile,
   40px tall on >=768px, width auto. Greyscale-by-default so a mixed-color
   logo sheet reads as one calm trust row; `.trust-row__strip--color` opts
   out of the greyscale treatment. Always give the <img> real alt text. */
.trust-row__strip{
  height:32px;width:auto;max-width:100%;
  display:block;margin-inline:auto;
  filter:grayscale(1);opacity:.85;
}
@media (min-width:768px){.trust-row__strip{height:40px}}
.trust-row__strip--color{filter:none;opacity:1}

/* Text roster line beneath the strip (authority list, e.g.
   "Trusted by teams at Google, Nike, WHOOP, Disney, ... and more"). */
.trust-row__roster{
  margin-top:var(--s3);
  font-size:14px;font-weight:500;line-height:1.5;
  color:var(--logo-grey-ink); /* WCAG 1.4.3 text ink, 5.37:1 on cream */
  max-width:56ch;margin-inline:auto;
}

/* small inline proof chips (awards / years) */
.proof-chips{display:flex;flex-wrap:wrap;gap:var(--s2);justify-content:center}
.proof-chip{
  display:inline-flex;align-items:center;gap:var(--s2);
  background:var(--cream-200);color:var(--dark);
  border-radius:var(--r-pill);padding:var(--s2) var(--s3);
  font-size:14px;font-weight:600;
}
/* On a cobalt section a translucent-white chip needs pure white text to
   clear WCAG 1.4.3 (cream-100 over white .14/cobalt is only 4.48:1;
   #fff lifts it to 4.58:1). */
.bg-cobalt .proof-chip{color:#fff}

/* Risk-reversal one-liner under a primary CTA (refund / no-commitment copy).
   Quiet, reassuring, optional leading shield/check .icon inside. */
.risk-reversal{
  display:flex;align-items:flex-start;gap:var(--s2);
  margin-top:var(--s3);max-width:52ch;
  font-size:14px;line-height:1.5;color:var(--logo-grey-ink); /* WCAG ink */
}
.risk-reversal svg{
  flex:0 0 auto;width:18px;height:18px;margin-top:2px;
  color:var(--teal-ink);stroke-width:1.5;
}
.center-text .risk-reversal,.risk-reversal--center{margin-inline:auto;justify-content:center;text-align:left}

/* Tax note: lower-page CPA-safe block ("A note for your CFO or tax advisor").
   Calm bordered card with a clear disclaimer slot. Not a warning color. */
.tax-note{
  border:1px solid var(--cream-200);
  background:var(--cream-100);
  border-left:3px solid var(--cobalt);
  border-radius:var(--r-input);
  padding:var(--s4);max-width:62ch;
}
.tax-note__title{font-weight:700;font-size:16px;margin-bottom:var(--s2);color:var(--dark)}
.tax-note__body{font-size:14px;line-height:1.6;color:var(--dark)}
.tax-note__disclaimer{
  margin-top:var(--s3);font-size:13px;line-height:1.5;font-style:italic;
  color:var(--logo-grey-ink); /* WCAG ink, 5.61:1 on cream-100 */
}

/* --------------------------------------------------------------------------
   8. CARD
   -------------------------------------------------------------------------- */
.card{
  background:var(--cream-100);
  border:1px solid var(--hairline);
  border-radius:var(--r-card);
  padding:var(--s4);
  box-shadow:var(--shadow-card);
}
@media (min-width:768px){.card{padding:var(--s5)}}
.card__icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:48px;height:48px;border-radius:var(--r-input);
  background:var(--cobalt-100);color:var(--cobalt);
  margin-bottom:var(--s3);
}
.card__icon svg{width:24px;height:24px;stroke-width:1.5}
.card__title{margin-bottom:var(--s2)}
/* interactive variant only */
.card--hover{transition:box-shadow var(--m-default), transform var(--m-default)}
.card--hover:hover{box-shadow:var(--shadow-hover);transform:translateY(-2px)}
.card--cobalt{background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.18)}
.card--feature{border-color:var(--cobalt);box-shadow:var(--shadow-hover)}

/* stat block (e.g. 7 / 30 / 5 / Live) */
.stat{text-align:center}
.stat__num{
  font-family:var(--font-display);font-style:italic;font-weight:500;
  font-size:48px;line-height:1;color:var(--cobalt);
}
@media (min-width:768px){.stat__num{font-size:64px}}
.stat__label{
  font-weight:600;font-size:14px;letter-spacing:0.04em;text-transform:uppercase;
  color:var(--dark);margin-top:var(--s2);
}
.bg-cobalt .stat__num{color:#fff}

/* Cited-stat attribution: small, muted source tag that follows a proof stat
   (e.g. "(BCG, 2025)" / "(BCG, 10-20-70 principle)"). Inline by default so it
   can sit at the end of the stat sentence; add it as a block for its own line.
   Uses the WCAG-safe grey ink so it stays legible on cream surfaces. */
.stat-cite{
  font-size:13px;font-weight:500;line-height:1.4;
  color:var(--logo-grey-ink); /* 5.37:1 on cream */
  font-style:normal;
}
@media (min-width:768px){.stat-cite{font-size:14px}}
.bg-cobalt .stat-cite,.bg-dark .stat-cite{color:var(--cream-100)}

/* --------------------------------------------------------------------------
   8b. TESTIMONIAL (quote card with optional real headshot)
   A .card that carries a circular avatar headshot above/beside the
   attribution. Drop a real <img class="testimonial__avatar"> in for a named
   reviewer (e.g. Kelsey Kates / Google); omit it for text-only quotes.
   -------------------------------------------------------------------------- */
.testimonial__quote{
  font-size:18px;line-height:1.6;color:var(--dark);
}
@media (min-width:768px){.testimonial__quote{font-size:20px}}
/* attribution row: avatar + name/title, vertically centered */
.testimonial__cite{
  display:flex;align-items:center;gap:var(--s3);
  margin-top:var(--s4);
  font-style:normal; /* override blockquote/cite italics */
}
.testimonial__avatar{
  flex:0 0 auto;
  width:48px;height:48px;border-radius:var(--r-pill);
  object-fit:cover;display:block;
  border:2px solid var(--cream-200);
  background:var(--cream-200); /* graceful tint before the image paints */
}
@media (min-width:768px){.testimonial__avatar{width:56px;height:56px}}
.testimonial__name{font-weight:700;font-size:15px;color:var(--dark);line-height:1.3}
.testimonial__role{font-size:14px;color:var(--logo-grey-ink);line-height:1.4} /* WCAG ink */
.bg-cobalt .testimonial__quote,.bg-cobalt .testimonial__name{color:var(--cream-100)}
.bg-cobalt .testimonial__role{color:var(--cream-100)}
.bg-cobalt .testimonial__avatar{border-color:rgba(255,255,255,.28);background:rgba(255,255,255,.14)}

/* --------------------------------------------------------------------------
   9. BADGES
   -------------------------------------------------------------------------- */
.badge-yellow{
  display:inline-flex;align-items:center;gap:var(--s2);
  background:var(--yellow);color:var(--dark);
  border-radius:var(--r-pill);padding:var(--s2) var(--s4);
  font-family:var(--font-body);font-weight:600;
  font-size:12px;letter-spacing:0.1em;text-transform:uppercase;line-height:1.2;
}
@media (min-width:768px){.badge-yellow{font-size:14px}}
.badge-tm{ /* small trademark badge for framework names */
  display:inline-flex;align-items:center;gap:var(--s2);
  background:var(--cobalt-100);color:var(--cobalt-700);
  border-radius:var(--r-pill);padding:var(--s1) var(--s3);
  font-weight:600;font-size:13px;
}

/* --------------------------------------------------------------------------
   10. FORM FIELDS
   -------------------------------------------------------------------------- */
.field{margin-bottom:var(--s4)}
.field__label{
  display:block;font-weight:600;font-size:14px;
  color:var(--dark);margin-bottom:var(--s2);
}
.field__label .req{color:var(--red);margin-left:2px}
.field__hint{font-size:14px;color:#5b5b5b;margin-top:var(--s1)}
.field__control,
.field input[type=text],
.field input[type=email],
.field input[type=tel],
.field select,
.field textarea{
  width:100%;
  font-family:var(--font-body);font-size:16px;line-height:1.4;color:var(--dark);
  background:var(--cream-100);
  border:1px solid var(--cream-200);
  border-radius:var(--r-input);
  padding:14px var(--s3);
  min-height:48px;
  transition:border-color var(--m-fast), box-shadow var(--m-fast);
  -webkit-appearance:none;appearance:none;
}
.field textarea{min-height:96px;resize:vertical;padding-top:var(--s3)}
.field select{
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='20' height='20' viewBox='0 0 24 24' fill='none' stroke='%23272727' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'%3E%3Cpath d='m6 9 6 6 6-6'/%3E%3C/svg%3E");
  background-repeat:no-repeat;background-position:right var(--s3) center;
  padding-right:var(--s8);
}
.field__control:focus,
.field input:focus,.field select:focus,.field textarea:focus{
  outline:none;
  border-color:var(--cobalt);
  box-shadow:0 0 0 3px var(--cobalt-100);
}
/* error state */
.field.is-error .field__control,
.field.is-error input,.field.is-error select,.field.is-error textarea{
  border-color:var(--red);
}
.field.is-error .field__control:focus,
.field.is-error input:focus,.field.is-error select:focus,.field.is-error textarea:focus{
  box-shadow:0 0 0 3px rgba(212,68,56,.18);
}
.field__error{
  display:none;font-size:14px;line-height:1.5;color:var(--red-ink); /* WCAG 1.4.3: 6.42:1 on cream-100 */
  margin-top:var(--s2);
}
.field.is-error .field__error{display:block}
.form-row{display:grid;gap:0}
@media (min-width:560px){.form-row{grid-template-columns:1fr 1fr;gap:var(--s4)}}
.form-consent{font-size:14px;color:#5b5b5b}

/* form success (replaces form) */
.form-success{
  display:none;text-align:center;padding:var(--s4) 0;
}
.form-success.is-active{display:block}
.form-success__icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:56px;height:56px;border-radius:var(--r-pill);
  background:rgba(31,157,85,.12);color:var(--green);margin-bottom:var(--s3);
}
/* generic form-level error */
.form-error{
  display:none;background:rgba(212,68,56,.08);border:1px solid var(--red);
  color:var(--red-ink);border-radius:var(--r-input);padding:var(--s3); /* text ink (1.4.3): 5.76:1 on tint */
  font-size:14px;margin-bottom:var(--s4);
}
.form-error.is-active{display:block}

/* --------------------------------------------------------------------------
   11. MODAL / POPUP
   -------------------------------------------------------------------------- */
.modal{
  position:fixed;inset:0;z-index:900;
  display:none;align-items:center;justify-content:center;
  padding:var(--s4);
}
.modal.is-open{display:flex}
.modal__backdrop{
  position:absolute;inset:0;
  background:rgba(39,39,39,.6);
  opacity:0;transition:opacity 200ms ease;
}
.modal.is-open .modal__backdrop{opacity:1}
.modal__panel{
  position:relative;z-index:1;
  width:100%;max-width:480px;max-height:calc(100dvh - var(--s8));
  overflow-y:auto;-webkit-overflow-scrolling:touch;
  background:var(--cream-100);
  border-radius:var(--r-modal);
  padding:var(--s6) var(--s5);
  box-shadow:0 24px 64px rgba(39,39,39,.28);
  transform:scale(.95);opacity:0;
  transition:transform 200ms ease, opacity 200ms ease;
}
@media (min-width:768px){.modal__panel{padding:var(--s6)}}
.modal.is-open .modal__panel{transform:scale(1);opacity:1}
.modal__close{
  position:absolute;top:var(--s3);right:var(--s3);z-index:2;
  display:inline-flex;align-items:center;justify-content:center;
  width:44px;height:44px;border-radius:var(--r-pill);
  background:transparent;border:none;color:var(--dark);
  transition:background-color var(--m-fast);
}
.modal__close:hover{background:var(--cream-200)}
.modal__close:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}
.modal__close svg{width:24px;height:24px;stroke-width:1.5}
.modal__title{margin-bottom:var(--s2);padding-right:var(--s8)}
.modal__intro{color:#3a3a3a;margin-bottom:var(--s4)}

/* mobile = full-screen overlay */
@media (max-width:559px){
  .modal{padding:0}
  .modal__panel{
    max-width:none;min-height:100dvh;max-height:none;
    border-radius:0;padding:var(--s8) var(--s4) var(--s6);
  }
}

/* body scroll-lock helper (set by JS) */
body.is-locked{overflow:hidden}

/* --------------------------------------------------------------------------
   12. ACCORDION (single-open)
   -------------------------------------------------------------------------- */
.accordion{border-top:1px solid var(--cream-200)}
.accordion__item{border-bottom:1px solid var(--cream-200)}
.accordion__trigger{
  display:flex;align-items:center;justify-content:space-between;gap:var(--s3);
  width:100%;text-align:left;
  background:transparent;border:none;
  padding:var(--s4) 0;min-height:44px;color:var(--dark);
}
.accordion__trigger:hover .accordion__q{color:var(--cobalt)}
.accordion__trigger:focus-visible{outline:none;box-shadow:var(--ring-cobalt);border-radius:var(--r-input)}
.accordion__q{
  font-family:var(--font-body);font-weight:700;font-size:20px;line-height:1.2;
}
@media (min-width:768px){.accordion__q{font-size:24px}}
.accordion__chevron{
  flex:none;width:24px;height:24px;color:var(--cobalt);
  transition:transform var(--m-fast);
}
.accordion__trigger[aria-expanded="true"] .accordion__chevron{transform:rotate(180deg)}
/* .js-scoped so no-JS visitors get readable, expanded answers (JS adds [hidden]
   + collapse behavior at init; without JS neither exists). */
.js .accordion__panel{
  overflow:hidden;height:0;
  opacity:0;
  transition:height var(--m-default), opacity var(--m-default);
}
/* R-053 note: closed panels use the global [hidden]{display:none!important}
   rule (see §"hidden" utility). The old .accordion__panel[hidden]{display:block}
   override here was dead (lost to !important) and its "keep measurable" comment
   was wrong; JS open() removes [hidden] first, forces layout at height:0 via a
   scrollHeight read, then animates, so no measurable-while-hidden rule is needed. */
.accordion__trigger[aria-expanded="true"] + .accordion__panel{opacity:1}
.accordion__answer{padding:0 0 var(--s4);color:#3a3a3a;max-width:68ch}

/* --------------------------------------------------------------------------
   13. STEPPER + live total
   -------------------------------------------------------------------------- */
.stepper{display:inline-flex;align-items:center;gap:var(--s3)}
.stepper__btn{
  display:inline-flex;align-items:center;justify-content:center;
  width:44px;height:44px;border-radius:var(--r-pill);
  background:var(--cobalt);color:var(--cream-100);border:none;
  transition:background-color var(--m-fast), transform var(--m-fast), opacity var(--m-fast);
}
.stepper__btn:hover{background:var(--cobalt-700)}
.stepper__btn:active{transform:scale(.95)}
.stepper__btn:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}
.stepper__btn:disabled{background:var(--cream-200);color:var(--logo-grey);cursor:not-allowed}
.stepper__btn svg{width:20px;height:20px;stroke-width:2}
.stepper__value{
  min-width:2ch;text-align:center;
  font-family:var(--font-body);font-weight:700;font-size:24px;color:var(--dark);
}
.price-total{
  font-family:var(--font-body);font-weight:700;letter-spacing:-0.02em;
  font-size:40px;line-height:1.1;color:var(--cobalt);
  transition:opacity var(--m-fast);
}
@media (min-width:768px){.price-total{font-size:52px}}
.price-total.is-updating{opacity:0} /* fade-update only, no number tween */
.price-unit{font-size:16px;color:#5b5b5b;font-style:normal;font-family:var(--font-body)}

/* --------------------------------------------------------------------------
   14. COUNTDOWN
   DD : HH : MM (no seconds)
   -------------------------------------------------------------------------- */
.countdown{display:inline-flex;align-items:center;gap:var(--s2)}
.countdown__cell{
  display:flex;flex-direction:column;align-items:center;
  background:var(--cobalt-100);border-radius:var(--r-input);
  padding:var(--s2) var(--s3);min-width:56px;
}
.countdown__num{
  font-family:var(--font-body);font-weight:700;
  font-size:28px;line-height:1;color:var(--cobalt);
  font-variant-numeric:tabular-nums;
}
@media (min-width:768px){.countdown__num{font-size:36px}}
.countdown__unit{
  font-size:11px;font-weight:600;letter-spacing:0.08em;text-transform:uppercase;
  color:var(--cobalt-700);margin-top:var(--s1);
}
.countdown__sep{
  font-family:var(--font-body);font-weight:700;font-size:28px;color:var(--teal);
  align-self:flex-start;line-height:1;padding-top:var(--s2);
}
@media (min-width:768px){.countdown__sep{font-size:36px}}
/* on cobalt band, invert cells to readable contrast */
.bg-cobalt .countdown__cell{background:rgba(255,255,255,.14)}
.bg-cobalt .countdown__num{color:#fff}
.bg-cobalt .countdown__unit{color:#fff}
.bg-cobalt .countdown__sep{color:var(--yellow)}

/* EXPIRED state: JS sets data-expired on the .countdown when the target passes.
   Hide the 00:00:00 cells/separators and show the data-expired-text message
   instead, so an elapsed cohort never reads as a live "all zeros" timer. */
.countdown[data-expired] .countdown__cell,
.countdown[data-expired] .countdown__sep{display:none}
.countdown[data-expired]{
  flex-wrap:wrap;
  background:var(--cobalt-100);border-radius:var(--r-input);
  padding:var(--s2) var(--s4);
}
.countdown[data-expired]::after{
  content:attr(data-expired-text);
  font-family:var(--font-body);font-weight:600;font-size:15px;line-height:1.4;
  color:var(--cobalt-700);
}
.bg-cobalt .countdown[data-expired]{background:rgba(255,255,255,.14)}
.bg-cobalt .countdown[data-expired]::after{color:var(--cream-100)}

/* PENDING (pre-JS / no-JS) default. Author ships the .countdown WITH
   data-countdown-pending set in the static markup so the timer never
   flashes a bare "00:00:00" before JS runs (or at all when JS is off).
   While pending, hide the cells/separators and show data-pending-text
   ("Counting down to August 13"). JS removes data-countdown-pending the
   moment it writes the first real values, revealing the live cells.
   Same visual treatment as the expired message so the two states match. */
.countdown[data-countdown-pending] .countdown__cell,
.countdown[data-countdown-pending] .countdown__sep{display:none}
.countdown[data-countdown-pending]{
  flex-wrap:wrap;
  background:var(--cobalt-100);border-radius:var(--r-input);
  padding:var(--s2) var(--s4);
}
.countdown[data-countdown-pending]::after{
  content:attr(data-pending-text);
  font-family:var(--font-body);font-weight:600;font-size:15px;line-height:1.4;
  color:var(--cobalt-700);
}
.bg-cobalt .countdown[data-countdown-pending]{background:rgba(255,255,255,.14)}
.bg-cobalt .countdown[data-countdown-pending]::after{color:var(--cream-100)}

/* --------------------------------------------------------------------------
   15. SEATS LINE (honest capacity)
   -------------------------------------------------------------------------- */
.seats{
  display:inline-flex;align-items:center;gap:var(--s2);
  font-weight:600;font-size:16px;color:var(--dark);
}
.seats svg{width:20px;height:20px;color:var(--cobalt);stroke-width:1.5}
.seats__remaining{color:var(--cobalt-700)} /* only used when data-seats-remaining fed */

/* --------------------------------------------------------------------------
   16. STICKY MOBILE BAR: mobile only, fixed ABOVE nav. No pulse/animation.
   Foundations: single-text urgency bar ("COHORT 1 STARTS AUGUST 13").
   LWP: label + APPLY action ("Leading With Purpose" -> application modal).
   The LWP AI-assessment sidebar pill is fixed to the BOTTOM, so it never
   overlaps this top bar.
   -------------------------------------------------------------------------- */
.sticky-bar{
  display:flex;align-items:center;justify-content:center;gap:var(--s2);
  position:fixed;top:0;left:0;right:0;z-index:850;
  height:var(--sticky-bar-h);
  background:var(--yellow);color:var(--dark);
  font-weight:700;font-size:13px;letter-spacing:0.04em;text-transform:uppercase;
  text-align:center;padding-inline:var(--s3);
  border:none;width:100%;
}
.sticky-bar:hover{text-decoration:none}
/* LWP label + action variant: space the program name and the APPLY pill apart.
   min-width:0 lets the label actually shrink + ellipsize inside the flex row
   (without it, a flex item refuses to go below its content width and would
   shove the price pill / action off-screen at 360-390px). The price pill and
   action are flex:none so they stay fully visible while the label clips. */
.sticky-bar__label{
  flex:1 1 auto;min-width:0;
  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;
  text-align:left;
}
.sticky-bar:has(.sticky-bar__action){justify-content:space-between}
.sticky-bar__action{
  display:inline-flex;align-items:center;gap:var(--s1);
  flex:0 0 auto;
  background:var(--dark);color:var(--yellow);
  border-radius:var(--r-pill);padding:4px var(--s3);
  font-size:13px;letter-spacing:0.06em;
}
.sticky-bar__action svg{width:16px;height:16px}
/* Price pill that sits beside the label (LWP) stays fully visible, never clipped. */
.sticky-bar__price{
  flex:0 0 auto;
  display:inline-block;padding:1px 8px;border-radius:9999px;
  background:var(--cobalt);color:var(--cream-100);
  font-weight:700;font-size:12px;letter-spacing:0;
}
/* At very narrow widths trim gap/padding so the label keeps maximum room. */
@media (max-width:400px){
  .sticky-bar{gap:var(--s1);padding-inline:var(--s2);font-size:12px}
  .sticky-bar__action{padding:4px var(--s2);font-size:12px}
}
@media (min-width:768px){.sticky-bar{display:none}}
/* when sticky bar present, nudge nav + body down on mobile */
body.has-sticky-bar .site-nav{top:var(--sticky-bar-h)}
@media (min-width:768px){body.has-sticky-bar .site-nav{top:0}}

/* --------------------------------------------------------------------------
   17. SITE NAV + mobile drawer
   -------------------------------------------------------------------------- */
.site-nav{
  position:sticky;top:0;z-index:800;
  background:var(--cream-100);
  box-shadow:var(--shadow-nav);
}
.site-nav__inner{
  display:flex;align-items:center;justify-content:space-between;gap:var(--s4);
  min-height:var(--nav-h);
}
.site-nav__logo{display:inline-flex;align-items:center;color:var(--dark)}
.site-nav__logo svg{height:28px;width:auto}
.site-nav__links{display:none;align-items:center;gap:var(--s5)}
.site-nav__link{
  font-weight:600;font-size:15px;color:var(--dark);
}
.site-nav__link:hover{color:var(--cobalt);text-decoration:none}
.site-nav__cta{display:none}
@media (min-width:900px){
  .site-nav__links{display:flex}
  .site-nav__cta{display:inline-flex}
  .site-nav__toggle{display:none}
}
.site-nav__toggle{
  display:inline-flex;align-items:center;justify-content:center;
  width:44px;height:44px;border:none;background:transparent;color:var(--dark);
  border-radius:var(--r-input);
}
.site-nav__toggle:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}
.site-nav__toggle svg{width:28px;height:28px;stroke-width:1.5}

/* mobile drawer */
.nav-drawer{
  position:fixed;inset:0;z-index:870;display:none;
}
.nav-drawer.is-open{display:block}
.nav-drawer__backdrop{
  position:absolute;inset:0;background:rgba(39,39,39,.5);
  opacity:0;transition:opacity var(--m-default);
}
.nav-drawer.is-open .nav-drawer__backdrop{opacity:1}
.nav-drawer__panel{
  position:absolute;top:0;right:0;height:100dvh;width:min(82vw,360px);
  background:var(--cream-100);
  padding:var(--s6) var(--s4);
  box-shadow:-8px 0 32px rgba(39,39,39,.18);
  transform:translateX(100%);transition:transform var(--m-default);
  display:flex;flex-direction:column;gap:var(--s4);overflow-y:auto;
}
.nav-drawer.is-open .nav-drawer__panel{transform:translateX(0)}
.nav-drawer__close{
  align-self:flex-end;
  width:44px;height:44px;border:none;background:transparent;color:var(--dark);
  border-radius:var(--r-pill);display:inline-flex;align-items:center;justify-content:center;
}
.nav-drawer__close:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}
.nav-drawer__link{
  font-weight:600;font-size:20px;color:var(--dark);padding:var(--s2) 0;
}
.nav-drawer__link:hover{color:var(--cobalt);text-decoration:none}
@media (prefers-reduced-motion:reduce){
  .nav-drawer__panel{transition:none}
  .nav-drawer__backdrop{transition:none}
}

/* --------------------------------------------------------------------------
   19. CALENDAR EMBED placeholder
   -------------------------------------------------------------------------- */
.calendar-embed{
  border:1px dashed var(--cobalt);
  background:linear-gradient(135deg,var(--cream-100),var(--cobalt-100));
  border-radius:var(--r-card);
  padding:var(--s6) var(--s4);
  text-align:center;
}
.calendar-embed__icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:56px;height:56px;border-radius:var(--r-pill);
  background:var(--cobalt-100);color:var(--cobalt);margin-bottom:var(--s3);
}
.calendar-embed__icon svg{width:28px;height:28px;stroke-width:1.5}
.calendar-embed__title{font-weight:700;font-size:18px;margin-bottom:var(--s2)}
.calendar-embed__note{color:#5b5b5b;font-size:14px;margin-bottom:var(--s4);max-width:42ch;margin-inline:auto}

/* --------------------------------------------------------------------------
   20. EDITORIAL PLACEHOLDER (image slots)
   warm cream-cast gradient + soft grain + tiny italic caption.
   Use: <figure class="ph ph-3-2" data-image-slot="hero"> ...caption... </figure>
   -------------------------------------------------------------------------- */
.ph{
  position:relative;overflow:hidden;
  border-radius:var(--r-card);
  background:
    radial-gradient(120% 120% at 18% 12%, var(--cream-100) 0%, rgba(255,252,246,0) 55%),
    radial-gradient(120% 120% at 88% 90%, var(--cobalt-100) 0%, rgba(229,237,252,0) 60%),
    linear-gradient(135deg, var(--cream-200) 0%, var(--cream) 48%, var(--cream-100) 100%);
  border:1px solid var(--cream-200);
  display:flex;align-items:flex-end;
  isolation:isolate;
}
/* soft grain/texture via inline SVG noise (data URI) */
.ph::before{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  opacity:.5;mix-blend-mode:multiply;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='160' height='160'%3E%3Cfilter id='n'%3E%3CfeTurbulence type='fractalNoise' baseFrequency='0.9' numOctaves='2' stitchTiles='stitch'/%3E%3C/filter%3E%3Crect width='100%25' height='100%25' filter='url(%23n)' opacity='0.06'/%3E%3C/svg%3E");
}
/* faint editorial mark (crossed corner lines) so it reads "intentional" not "broken" */
.ph::after{
  content:"";position:absolute;inset:0;z-index:0;pointer-events:none;
  background-image:url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='100%25' height='100%25' viewBox='0 0 100 100' preserveAspectRatio='none'%3E%3Cg stroke='%230F58E5' stroke-width='0.4' opacity='0.10'%3E%3Cpath d='M0 0 L100 100'/%3E%3Cpath d='M100 0 L0 100'/%3E%3C/g%3E%3C/svg%3E");
}
.ph__caption{
  position:relative;z-index:1;
  width:100%;
  font-family:var(--font-display);font-style:italic;font-weight:500;
  font-size:13px;color:#7a715c;
  padding:var(--s3);
  background:linear-gradient(to top, rgba(251,247,239,.85), rgba(251,247,239,0));
}
/* aspect ratios */
.ph-3-2{aspect-ratio:3 / 2}
.ph-1-1{aspect-ratio:1 / 1}
.ph-16-9{aspect-ratio:16 / 9}
.ph-4-5{aspect-ratio:4 / 5}
/* portrait avatar variant */
.ph--portrait{max-width:320px}

/* --------------------------------------------------------------------------
   21. SCROLL REVEAL (one-shot via IntersectionObserver)
   -------------------------------------------------------------------------- */
/* NO-JS GUARD: the hidden start state is scoped to .js (added by the head hook
   before paint). If JS fails or is disabled, .reveal content is fully visible
   instead of being permanently stuck at opacity:0. */
.js .reveal{
  opacity:0;transform:translateY(16px);
  transition:opacity var(--m-slow), transform var(--m-slow);
  will-change:opacity, transform;
}
.js .reveal.is-visible{opacity:1;transform:translateY(0)}
/* stagger hooks (JS sets --reveal-delay; class kept for non-JS authoring) */
.js .reveal[style*="--reveal-delay"]{transition-delay:var(--reveal-delay)}

/* --------------------------------------------------------------------------
   22. FOOTER bits
   -------------------------------------------------------------------------- */
.footer-grid{display:grid;gap:var(--s6)}
@media (min-width:768px){.footer-grid{grid-template-columns:1.4fr 1fr 1fr 1.4fr}}
.footer-heading{
  font-weight:600;font-size:13px;letter-spacing:0.08em;text-transform:uppercase;
  color:var(--logo-grey-ink);margin-bottom:var(--s3); /* text ink (1.4.3) for light-surface footers */
}
/* On the dark footer the ink is too low-contrast; raise it to a readable grey.
   #ababab on --dark (#272727) = 6.51:1 (raw --logo-grey was only 4.21:1). */
.bg-dark .footer-heading,
.bg-dark .trust-row__label{color:#ababab}
.footer-links li + li{margin-top:var(--s2)}
.social-row{display:flex;gap:var(--s3)}
.social-row a{
  display:inline-flex;align-items:center;justify-content:center;
  width:44px;height:44px;border-radius:var(--r-pill);
  background:rgba(255,255,255,.06);color:#d6d6d6;
}
.social-row a:hover{background:rgba(255,255,255,.12);color:#fff;text-decoration:none}
.social-row svg{width:20px;height:20px}
.footer-legal{
  margin-top:var(--s6);padding-top:var(--s4);
  border-top:1px solid rgba(255,255,255,.12);
  font-size:13px;color:#9a9a9a;
}

/* --------------------------------------------------------------------------
   23. UTILITY
   -------------------------------------------------------------------------- */
.visually-hidden{
  position:absolute!important;width:1px;height:1px;
  padding:0;margin:-1px;overflow:hidden;clip:rect(0 0 0 0);
  white-space:nowrap;border:0;
}
.tm{font-size:0.7em;vertical-align:super;line-height:0}
.mt-0{margin-top:0}.mt-4{margin-top:var(--s4)}.mt-6{margin-top:var(--s6)}
.mb-0{margin-bottom:0}.mb-3{margin-bottom:var(--s3)}.mb-4{margin-bottom:var(--s4)}
.flow-tight{line-height:1.5}
.divider{height:1px;background:var(--cream-200);border:0;margin-block:var(--s6)}
.bg-cobalt .divider,.bg-dark .divider{background:rgba(255,255,255,.14)}
[hidden]{display:none!important}

/* --------------------------------------------------------------------------
   24. INDEX / CHOOSER page
   -------------------------------------------------------------------------- */
.chooser{min-height:100dvh;display:flex;flex-direction:column;justify-content:center}
.chooser__cards{display:grid;gap:var(--s4)}
@media (min-width:768px){.chooser__cards{grid-template-columns:1fr 1fr}}
.chooser__card{
  display:block;background:var(--cream-100);
  border:1px solid var(--cream-200);border-radius:var(--r-card);
  padding:var(--s6);box-shadow:var(--shadow-card);
  transition:box-shadow var(--m-default), transform var(--m-default);
  color:var(--dark);
}
.chooser__card:hover{box-shadow:var(--shadow-hover);transform:translateY(-2px);text-decoration:none}

/* --------------------------------------------------------------------------
   25. REDUCED MOTION — disable ALL motion
   -------------------------------------------------------------------------- */
@media (prefers-reduced-motion:reduce){
  *,*::before,*::after{
    animation-duration:0.001ms!important;
    animation-iteration-count:1!important;
    transition-duration:0.001ms!important;
    scroll-behavior:auto!important;
  }
  .reveal{opacity:1!important;transform:none!important}
  .btn-primary:hover,.card--hover:hover{transform:none}
}

/* ==========================================================================
   26. V2 UPGRADE COMPONENTS  (animated hero + trust band + monogram avatars)
   Appended for the v2 redesign (REDESIGN-BRIEF.md). Self-contained; does not
   restyle any existing class. Every animation is transform/opacity only and
   honors prefers-reduced-motion (the global block in §25 already neutralizes
   transition/animation durations; the explicit guards below disable the
   non-essential motion outright).
   ========================================================================== */

/* --- 26a-split. CLEAN SPLIT HERO: text panel | contained team-photo card ---
   A true two-column split: the copy sits on solid cream (always 100% legible,
   NEVER over the photo), beside a contained, rounded media card holding the
   authentic team photo. Because the card is contained (~600px wide), the source
   image renders at high effective pixel density = crisp, with none of the
   full-bleed upscaling softness that made the edge-to-edge version look soft.
   The card holds a still <img> by default; an autoplay, muted, looping <video>
   cinemagraph swaps in (poster-backed, zero CLS) when one is present. */
.section--hero-split{position:relative}
.hero-split__grid{display:grid;gap:var(--s6);align-items:center}
@media (min-width:900px){
  /* media column is top-aligned with the headline and sticks while the long copy
     scrolls past, so the team stays visible and there is no empty top-right void. */
  .hero-split__grid{grid-template-columns:1.05fr .95fr;gap:var(--s8);align-items:start}
  .hero-split__media{position:sticky;top:calc(var(--s8) + 64px)}
}
.hero-split__media{
  position:relative;margin:0;
  border-radius:var(--r-card);overflow:hidden;
  background:var(--cream-200);            /* graceful tint before paint = zero CLS */
  aspect-ratio:1 / 1;                      /* substantial square card balances the big headline */
  box-shadow:var(--shadow-hover);
}
.hero-split__media > img,
.hero-split__media > video,
.hero-split__media > video > img{       /* the deep fallback <img> inside <video> */
  position:absolute;inset:0;display:block;
  width:100%;height:100%;object-fit:cover;
  object-position:50% 42%;                 /* keep the team's faces (upper-middle band) in frame */
}
@media (max-width:899px){
  /* TEXT-FIRST on mobile: the headline + CTA lead (document order), and the real-team
     image band follows just below (order:-1 removed 2026-06-30). Capped height so the
     headline and primary CTA reach the first short scroll. */
  .hero-split__media{aspect-ratio:16 / 10;max-height:46vh}
}
/* Gentle ken-burns pan on the STILL image (the no-video baseline): a slow,
   reduced-motion-respecting horizontal drift that reveals more of the wide team
   panorama over time. Applies ONLY when the card has a bare <img> (img:only-child);
   when a <video> cinemagraph is present, the video carries the motion instead. */
@media (prefers-reduced-motion:no-preference){
  .hero-split__media > img:only-child{
    animation:hero-pan 30s ease-in-out infinite alternate;
    will-change:object-position;
  }
}
@keyframes hero-pan{
  from{object-position:30% 42%}
  to{object-position:70% 42%}
}

/* --- 26a-band. MID-PAGE FULL-BLEED TEAM BAND (team-candid) -----------------
   Edge-to-edge cinematic breather between sections: the real team mid-session.
   width:100% + height:auto = overflow-safe at every width; max-height only
   clamps on ultra-wide screens (object-fit:cover recenters the crop). */
.media-band{width:100%;overflow:hidden;line-height:0;background:var(--cobalt)}
.media-band img,.media-band video{display:block;width:100%;height:auto;max-height:60vh;object-fit:cover;object-position:50% 40%}

/* --- 26b. CREDENTIALS BAND (count-up showcase on a brand band) ---
   Big Fraunces numerals + Poppins labels on a cobalt/dark band carrying the
   ribbon motif. Responsive auto-fit grid. */
.credentials-band{
  position:relative;
  overflow:hidden; /* clip the ribbon accents to the band */
}
/* WCAG AA: the 14-15px white .credential__label on plain --cobalt #0F58E5 is
   only ~3.9:1 (fails 4.5:1). Darken the band to --cobalt-700 #0A3FA8 so white
   #FFFCF6 labels clear 4.5:1. The compound .credentials-band.bg-cobalt form
   (and the later source order vs .bg-cobalt above) reliably wins the cascade. */
.credentials-band,
.credentials-band.bg-cobalt{background:var(--cobalt-700)}
/* subtle ribbon motif: two soft brand-color bands drifting behind the stats.
   Decorative only (aria-hidden in markup); pointer-events off. */
.credentials-band__ribbon{
  position:absolute;inset:0;
  pointer-events:none;
  opacity:.5;
  background:
    radial-gradient(60% 120% at 8% 0%, rgba(0,188,200,.22), transparent 60%),
    radial-gradient(50% 120% at 92% 100%, rgba(245,208,0,.18), transparent 60%);
}
.credentials-grid{
  position:relative;
  display:grid;
  grid-template-columns:repeat(2, minmax(0, 1fr));
  gap:var(--s5) var(--s4);
  text-align:center;
}
@media (min-width:768px){
  .credentials-grid{grid-template-columns:repeat(4, minmax(0, 1fr));gap:var(--s6)}
}
.credential{display:flex;flex-direction:column;align-items:center;gap:var(--s2)}
.credential__num{
  font-family:var(--font-display);font-style:italic;font-weight:600;
  font-size:52px;line-height:1;color:#fff;
  font-variant-numeric:tabular-nums; /* steady width while the count-up ticks */
}
@media (min-width:768px){.credential__num{font-size:68px}}
/* the count-up node may carry a prefix/suffix span (e.g. "+", "-year") that
   should sit tight to the numeral but render in the same display face */
.credential__num .countup__affix{font-size:.62em;font-weight:500}
.credential__label{
  font-family:var(--font-body);font-weight:500;
  font-size:14px;line-height:1.4;color:var(--cream-100);
  max-width:18ch;
}
@media (min-width:768px){.credential__label{font-size:15px}}
/* On the dark brand variant keep numerals white and labels cream */
.credentials-band.bg-dark .credential__num,
.credentials-band.bg-cobalt .credential__num{color:#fff}

/* count-up entry: numerals rise+fade once on view (JS toggles .is-counting).
   transform/opacity only. */
.js .countup{opacity:0;transform:translateY(8px);transition:opacity var(--m-slow), transform var(--m-slow)}
.js .countup.is-counting,
.js .countup.is-done{opacity:1;transform:translateY(0)}
@media (prefers-reduced-motion:reduce){
  .js .countup{opacity:1!important;transform:none!important}
}

/* --- 26c. LOGO WALL (prominent trusted-by band) ---
   Centered "Trusted by teams at" header, the real logo strip presented LARGE
   on a clean white card with generous padding, grayscale by default and full
   color on hover at >=768px, plus a named-roster chip row below. */
.logo-wall{text-align:center}
.logo-wall__title{
  font-family:var(--font-body);font-weight:600;
  font-size:13px;letter-spacing:0.12em;text-transform:uppercase;
  color:var(--logo-grey-ink);margin-bottom:var(--s4);
}
@media (min-width:768px){.logo-wall__title{font-size:14px}}
.logo-wall__card{
  background:#fff;
  border:1px solid var(--cream-200);
  border-radius:var(--r-card);
  box-shadow:var(--shadow-card);
  padding:var(--s6) var(--s5);
  max-width:980px;margin-inline:auto;
}
@media (min-width:768px){.logo-wall__card{padding:var(--s8) var(--s10)}}
.logo-wall__strip{
  display:block;width:auto;max-width:100%;height:48px;
  margin-inline:auto;
  filter:grayscale(1);opacity:.78;
  transition:filter var(--m-default), opacity var(--m-default);
}
@media (min-width:768px){.logo-wall__strip{height:64px}}
/* full color on hover, desktop only (pointer/hover capable) */
@media (min-width:768px) and (hover:hover){
  .logo-wall__card:hover .logo-wall__strip{filter:grayscale(0);opacity:1}
}
@media (prefers-reduced-motion:reduce){
  .logo-wall__strip{transition:none}
}
/* named roster as styled brand chips below the card */
.logo-wall__roster{
  display:flex;flex-wrap:wrap;justify-content:center;align-items:center;
  gap:var(--s2);
  margin-top:var(--s5);
}
.logo-wall__chip{
  display:inline-flex;align-items:center;
  background:var(--cream-200);color:var(--dark);
  border-radius:var(--r-pill);
  padding:var(--s2) var(--s4);
  font-family:var(--font-body);font-weight:600;font-size:14px;line-height:1.2;
}
.bg-cobalt .logo-wall__title{color:var(--cream-100)}
.bg-cobalt .logo-wall__chip{background:rgba(255,255,255,.14);color:#fff}

/* --- 26c-2. TRUST BAND (full-color logo cards + award seals) ---
   ADDITIVE successor to .logo-wall (kept above for leading-with-purpose.html).
   Foundations uses full-color individual logos on white cards over cream, with
   optical normalization so wide wordmarks and compact marks read as equal weight
   (Pagedone "logos in card" pattern). Award seals cluster co-located below. */
.trust-band .logowall__eyebrow{
  text-align:center;
  font-family:var(--font-body);font-weight:600;
  font-size:13px;letter-spacing:0.12em;text-transform:uppercase;
  color:var(--logo-grey-ink);margin:0 0 var(--s5);
}
@media (min-width:768px){.trust-band .logowall__eyebrow{font-size:14px}}
.logowall__grid{
  list-style:none;margin:0 auto;padding:0;
  max-width:1100px;
  display:grid;grid-template-columns:repeat(2,1fr);gap:20px;
}
@media (min-width:640px){.logowall__grid{grid-template-columns:repeat(3,1fr);gap:24px}}
@media (min-width:980px){.logowall__grid{grid-template-columns:repeat(4,1fr);gap:28px}}
.logowall__card{
  background:#fff;
  border:1px solid #E5E7EB;
  border-radius:16px;
  box-shadow:0 1px 3px rgba(0,0,0,.06);
  height:96px;
  display:flex;align-items:center;justify-content:center;
  padding:16px 20px;
  transition:transform var(--m-default), box-shadow var(--m-default);
}
@media (min-width:768px) and (hover:hover){
  .logowall__card:hover{transform:translateY(-2px);box-shadow:0 6px 18px rgba(39,39,39,.10)}
}
@media (prefers-reduced-motion:reduce){
  .logowall__card{transition:none}
}
/* Optical normalization: base wordmarks ~32px; wide wordmarks slightly smaller,
   compact marks slightly larger, so the row reads as one designed system. */
.logowall__logo{
  display:block;width:auto;max-width:100%;
  max-height:32px;object-fit:contain;
}
.logowall__logo--wide{max-height:28px}
.logowall__logo--mark{max-height:40px}
@media (min-width:768px){
  .logowall__logo{max-height:36px}
  .logowall__logo--wide{max-height:30px}
  .logowall__logo--mark{max-height:42px}
}
.logowall__roster{
  display:flex;flex-wrap:wrap;justify-content:center;align-items:center;
  gap:var(--s2);margin-top:var(--s5);
}
.logowall__chip{
  display:inline-flex;align-items:center;
  background:var(--cream-200);color:var(--dark);
  border-radius:var(--r-pill);
  padding:var(--s2) var(--s4);
  font-family:var(--font-body);font-weight:600;font-size:14px;line-height:1.2;
}

/* Award seals cluster: large Fraunces "11" + label + the two real Gold seals,
   full-color over cream. Seals share a uniform bounding box (object-fit:contain). */
.awards{
  display:flex;flex-direction:column;align-items:center;gap:var(--s5);
  text-align:center;margin-top:var(--s8);
}
@media (min-width:768px){
  .awards{flex-direction:row;justify-content:center;gap:var(--s8);text-align:left}
}
.awards__head{
  display:flex;align-items:center;gap:var(--s3);justify-content:center;
}
.awards__count{
  font-family:var(--font-display);font-style:italic;font-weight:500;
  font-size:56px;line-height:1;color:var(--cobalt-700);
}
@media (min-width:768px){.awards__count{font-size:72px}}
.awards__label{
  font-family:var(--font-body);font-weight:600;
  font-size:18px;line-height:1.25;color:var(--dark);max-width:14ch;
}
@media (min-width:768px){.awards__label{font-size:20px}}
.awards__seals{
  display:flex;align-items:center;justify-content:center;gap:var(--s6);
}
.awards__seal{
  display:block;width:80px;height:80px;object-fit:contain;
}
@media (min-width:768px){.awards__seal{width:96px;height:96px}}

/* --- 26c-3. FEATURED PULL-QUOTE (oversized lead testimonial) ---
   Elevates the single strongest named testimonial above the 3-card grid:
   oversized Fraunces quote, real photo, name/title/company. */
.featured-quote{
  margin:0 auto var(--s8);max-width:880px;text-align:center;
}
.featured-quote__text{
  font-family:var(--font-display);font-style:italic;font-weight:500;
  font-size:26px;line-height:1.4;color:var(--cobalt-700);margin:0;
}
@media (min-width:768px){.featured-quote__text{font-size:34px;line-height:1.35}}
.featured-quote__cite{
  display:flex;align-items:center;justify-content:center;gap:var(--s3);
  margin-top:var(--s5);
}
.featured-quote__avatar{
  flex:0 0 auto;width:72px;height:72px;border-radius:var(--r-pill);
  object-fit:cover;display:block;
}
.featured-quote__person{
  display:flex;flex-direction:column;text-align:left;
}
.featured-quote__name{
  font-family:var(--font-body);font-weight:700;font-size:16px;color:var(--dark);line-height:1.2;
}
.featured-quote__role{
  font-family:var(--font-body);font-weight:400;font-size:14px;color:var(--logo-grey-ink);line-height:1.3;
}

/* --- 26d. AVATAR MONOGRAM (initials in a brand-color circle) ---
   For real named testimonials with NO real photo. Drop-in alongside
   .testimonial__cite in place of the <img class="testimonial__avatar">.
   Same 48/56px footprint so the attribution row aligns with photo avatars. */
.avatar-monogram{
  flex:0 0 auto;
  width:48px;height:48px;border-radius:var(--r-pill);
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--cobalt);color:#fff;
  font-family:var(--font-body);font-weight:700;font-size:16px;line-height:1;
  letter-spacing:0.02em;
  border:2px solid var(--cream-200);
  user-select:none;
}
@media (min-width:768px){.avatar-monogram{width:56px;height:56px;font-size:18px}}
/* rotating brand-color accents so a row of monograms is not monotone */
.avatar-monogram--teal{background:var(--teal-ink)}
.avatar-monogram--cobalt{background:var(--cobalt)}
.avatar-monogram--dark{background:var(--dark)}
.bg-cobalt .avatar-monogram{border-color:rgba(255,255,255,.28)}

/* --- 26e. MOBILE AUDIT FIXES (folded in per optimization-pass/*.md) --- */
/* [mobile HIGH] 320px overflow: the cohort accent border added 4px of layout
   width that tipped .fnd-cohort--1 past the 320 gutter. Convert it to an inset
   box-shadow (paints inside the box, adds zero layout width) and cap card width.
   This neutralizes the foundations.html inline `.fnd-cohort--1{border-left:4px}`. */
.card.fnd-cohort--1{
  border-left:0;
  box-shadow:var(--shadow-card), inset 4px 0 0 0 var(--cobalt);
  max-width:100%;
}
/* [mobile LOW] tighten container gutter under ~360px so feature cards keep a
   safe right edge at the 320px breakpoint (belt-and-suspenders with the border
   fix above). */
@media (max-width:360px){
  .container-default,.container-narrow,.container-wide{padding-inline:var(--s3)}
}
/* [mobile LOW] raise the 14px refund/application fine-print tier to 16px on
   small phones so policy copy clears the mobile body-text floor. Scoped to the
   risk-reversal / application-note lines, NOT eyebrows/citations/badges. */
@media (max-width:480px){
  .risk-reversal,.risk-reversal.body-s,
  .application-note,.fine-print{font-size:16px;line-height:1.55}
}
/* [mobile LOW] give in-content jump-links and footer policy links a >=44px tap
   area without changing their inline visual rhythm. */
.tap-link{display:inline-block;padding-block:12px;min-height:44px}
.footer-links a{display:inline-block;padding-block:12px}

/* --------------------------------------------------------------------------
   27. CLARITY-PASS COMPONENTS (shared, used by foundations + LWP)
   Big-statement typography, big proof numerals, the service-path connector,
   and the unified brand-icon chip. All transform/opacity-safe, reduced-motion
   honored, no CLS. Authored once here; both pages reuse them.
   -------------------------------------------------------------------------- */

/* --- 27z. HERO DESCRIPTOR (plain "what this is" lead line) ---------------
   The first subhead under the H1: a crisp, plain-language descriptor of the
   product. Slightly larger than body, medium weight, so it reads as the lead
   line above the supporting punch line. Cobalt-tinted ink for a touch of lift,
   still high-contrast on cream. Shared by foundations + LWP heroes. */
.hero-descriptor{
  font-size:20px;line-height:1.4;font-weight:500;color:var(--cobalt-700);
  margin-bottom:var(--s3);
}
@media (min-width:768px){.hero-descriptor{font-size:24px}}
.bg-cobalt .hero-descriptor,.bg-dark .hero-descriptor{color:var(--cream-100)}

/* --- 27a. GAP STATEMENT (large Fraunces display moment) ------------------
   A breathing-room band that renders the approved gap sentence as a big
   Fraunces italic statement rather than body copy. The de-emphasized clause
   ("not access to AI") drops in opacity; the emphasized clause ("the judgment,
   wisdom, and skill to use it well") lifts to cobalt/teal-ink for contrast. */
.gap-statement{
  font-family:var(--font-display);font-style:italic;font-weight:500;
  font-size:30px;line-height:1.22;letter-spacing:0;
  color:var(--dark);
  max-width:20ch;margin-inline:auto;text-align:center;
  padding-block:var(--s6);
}
@media (min-width:768px){.gap-statement{font-size:48px;max-width:22ch;padding-block:var(--s10)}}
@media (min-width:1024px){.gap-statement{font-size:56px}}
/* the muted first clause: de-emphasis via a neutral grey that still clears WCAG
   (opacity .42 computed ~2.4:1 and failed even large-text 3:1; #5f5f5f = ~5.8:1) */
.gap-statement__muted{color:#5f5f5f}
/* the emphasized second clause (brand-ink lift) */
.gap-statement__key{color:var(--cobalt-700)}
/* on the cobalt/dark brand surfaces, keep the statement legible and lift the
   key clause to teal so it reads against a dark field */
.bg-cobalt .gap-statement,.bg-dark .gap-statement{color:var(--cream-100)}
.bg-cobalt .gap-statement__muted,.bg-dark .gap-statement__muted{color:var(--cream-100);opacity:.55}
.bg-cobalt .gap-statement__key,.bg-dark .gap-statement__key{color:var(--teal)}

/* --- 27b. STAT-BIG (large Fraunces proof numeral + small cite) ----------
   For the BCG proof stats. A big italic numeral (same display face as the
   credentials band) sits above its sentence context, with the small source
   cite beneath. Pairs with [data-countup] so the numeral counts up on view;
   the count-up engine wraps any prefix/suffix in .countup__affix, sized down. */
.stat-big{
  font-family:var(--font-display);font-style:italic;font-weight:600;
  font-size:64px;line-height:1;color:var(--cobalt-700);
  letter-spacing:0;margin-bottom:var(--s2);
  font-variant-numeric:tabular-nums; /* steady width while the count-up ticks */
}
@media (min-width:768px){.stat-big{font-size:88px}}
.stat-big .countup__affix{font-size:.5em;font-weight:500}
/* the two-part split numeral (e.g. 70% / 10%) keeps the slash readable */
.stat-big__split{
  display:inline-flex;align-items:baseline;gap:.18em;
  font-family:var(--font-display);font-style:italic;
  margin-bottom:var(--s2);
}
.stat-big__split .stat-big{margin-bottom:0}
.stat-big__slash{font-size:.6em;font-weight:500;opacity:.55;color:var(--cobalt-700)}
.bg-cobalt .stat-big__slash,.bg-dark .stat-big__slash{color:var(--teal)}
.bg-cobalt .stat-big,.bg-dark .stat-big{color:var(--teal)}

/* --- 27c. ARC PATH (numbered service journey: 1 -> 2 -> 3) ---------------
   Modifier on a .grid-3 (or any flex/grid row of cards). The connecting line is
   now a REAL child element (.arc-path__line, styled in §28d) so it can scroll-
   draw via .is-drawn — the prior ::before pseudo could not take a class. Each
   card still carries a .arc-path__node numeral; cards get position:relative so
   the node anchors to them. .arc-path base lives in §28d. */
/* numbered node: a Fraunces numeral in a brand chip, sitting on the connector */
.arc-path__node{
  display:inline-flex;align-items:center;justify-content:center;
  width:44px;height:44px;border-radius:var(--r-pill);
  background:var(--teal);color:var(--cobalt-700);
  font-family:var(--font-display);font-style:italic;font-weight:600;
  font-size:22px;line-height:1;
  box-shadow:0 2px 8px rgba(39,39,39,.18);
  margin-bottom:var(--s3);
  position:relative;z-index:2; /* sits above the connector line */
}
/* The connector line itself (mobile vertical / desktop horizontal) is the real
   .arc-path__line element, styled + scroll-drawn in §28d. */
@media (min-width:768px){
  .arc-path__node{margin-inline:auto;margin-bottom:var(--s4)}
}
@media (prefers-reduced-motion:reduce){
  .arc-path__node{box-shadow:0 2px 8px rgba(39,39,39,.18)} /* static; no motion to disable */
}

/* --- 27d. CARD-ICON (unified inline-SVG brand-icon chip) -----------------
   One cohesive line-icon system: rounded line icons, ~1.75 stroke,
   stroke="currentColor", ~30px, inside a soft brand-tinted rounded chip.
   Author the chip styling ONCE; each card supplies its own simple glyph.
   Lives alongside (does not replace) the legacy .card__icon. */
.card-icon{
  display:inline-flex;align-items:center;justify-content:center;
  width:52px;height:52px;border-radius:14px;
  background:var(--cobalt-100);color:var(--cobalt);
  margin-bottom:var(--s3);
  flex:0 0 auto;
}
.card-icon svg{width:30px;height:30px;stroke-width:1.75;fill:none}
/* teal variant for journey/persona accent rows so a grid is not monotone */
.card-icon--teal{background:rgba(0,188,200,.14);color:var(--teal-ink)}
/* on cobalt/dark surfaces, tint the chip translucent-white and stroke teal */
.bg-cobalt .card-icon,.bg-dark .card-icon{background:rgba(255,255,255,.12);color:var(--teal)}

/* ==========================================================================
   28. IMAGERY + MOTION PASS  (IMAGERY-MOTION-BRIEF.md)
   Reusable image-with-ribbon treatment, card hover-lift, and a GPU-safe
   scroll-draw system (transform/opacity only). Self-contained; restyles no
   existing class. The global reduced-motion block in §25 already zeroes
   transition durations; the explicit guards below also pin the END state so a
   scroll-draw line / lifted card shows fully (never stuck at scale 0).
   ========================================================================== */

/* --- 28a. IMAGE FIGURE (warm photo + subtle brand-ribbon corner accent) ----
   A rounded, clipped figure with an aspect-ratio box so the photo reserves its
   exact space (zero CLS). The <picture>/<img> fills the box via object-fit. The
   ribbon SVG bleeds off the bottom-left corner as the hero's signature accent,
   sized ~50% of the figure width so it reads as a tasteful brand cue, never a
   busy full overlay. Decorative (aria-hidden in markup) + pointer-events:none. */
.img-figure{
  position:relative;
  margin:0;
  border-radius:var(--r-card);
  overflow:hidden;
  background:var(--cream-200); /* graceful tint before the photo paints */
  aspect-ratio:3 / 2;          /* matches the 1200x800 supporting photos: no CLS */
  isolation:isolate;
}
.img-figure > picture,
.img-figure > img:not(.img-figure__ribbon),
.img-figure__img{
  position:absolute;inset:0;z-index:0;
  width:100%;height:100%;
  object-fit:cover;
  display:block;
}
.img-figure > picture > img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}
/* the ribbon accent: bottom-left corner bleed, ~52% of the figure width.
   slice + bottom-left anchoring keeps the flowing bands hugging the corner. */
.img-figure__ribbon{
  position:absolute;z-index:1;
  left:0;bottom:0;
  width:58%;max-width:360px;height:auto;
  pointer-events:none;
  opacity:.92;
  /* official brand squiggle: BIG, swept across the bottom-left corner with its
     ends bleeding off-canvas (figure overflow:hidden clips them) — the brand's
     "squiggles big, ends running off the page / behind the photo" rule. */
  transform:translate(-14%, 14%);
}
@media (min-width:768px){
  .img-figure__ribbon{width:50%;max-width:340px}
}

/* paired image+copy block: image and text sit side by side on desktop, stack on
   mobile (image first or last per the markup order). Vertically centered so a
   shorter copy column does not leave the photo floating. */
.media-pair{
  display:grid;gap:var(--s5);
  align-items:center;
}
@media (min-width:768px){
  .media-pair{grid-template-columns:1fr 1fr;gap:var(--s6)}
  /* optional: let the copy column breathe a touch wider than the image */
  .media-pair--copy-wide{grid-template-columns:1.1fr 1fr}
}

/* --- 28b. CARD HOVER-LIFT (subtle affordance, transform/opacity only) ------
   Opt-in lift for interactive card grids (build / outcomes / persona / leader).
   Gated to real hover (pointer) devices so touch never sticks a hover state.
   Reduced-motion: the §25 block zeroes the transition; the guard below also
   removes the lift transform so nothing shifts. */
@media (hover:hover){
  .card-lift{transition:transform .2s ease, box-shadow .2s ease}
  .card-lift:hover{transform:translateY(-4px);box-shadow:var(--shadow-hover)}
  /* beat the reveal-settle rule (.js .reveal.is-visible{transform:translateY(0)}, 0,3,0) */
  .js .card-lift.is-visible:hover{transform:translateY(-4px);box-shadow:var(--shadow-hover)}
}
@media (prefers-reduced-motion:reduce){
  .card-lift{transition:none}
  .card-lift:hover{transform:none;box-shadow:var(--shadow-card)}
}

/* --- 28c. SCROLL-DRAW ([data-draw] -> .is-drawn one-shot on view) ----------
   Generic, GPU-safe reveal driven by the shared JS IntersectionObserver. The
   default hidden start state is scoped to .js (added before paint) so a no-JS
   render shows everything. transform/opacity only. Author the per-element
   START transform with a more specific rule (e.g. the arc connector below);
   this base just supplies the fade + a gentle rise and the .is-drawn settle. */
.js [data-draw]{
  opacity:0;transform:translateY(12px);
  transition:opacity var(--m-slow), transform var(--m-slow);
  will-change:opacity, transform;
}
.js [data-draw].is-drawn{opacity:1;transform:none}
@media (prefers-reduced-motion:reduce){
  .js [data-draw]{opacity:1!important;transform:none!important;transition:none}
}

/* --- 28d. ARC CONNECTOR DRAW (the #framework journey line draws itself) -----
   The journey line is now a real child element (.arc-path__line) instead of a
   ::before pseudo, so it can take .is-drawn. It scales from 0 along its main
   axis as the section enters view: scaleX on desktop (horizontal line),
   scaleY on mobile (vertical line). transform-origin pins the growth to the
   start of the journey (left on desktop, top on mobile). The dashed brand
   gradient + positioning (formerly on the now-removed §27c .arc-path::before
   pseudo) are re-expressed here directly on the real .arc-path__line element. */
.arc-path{position:relative}
.arc-path > *{position:relative}
.arc-path__line{
  content:"";position:absolute;z-index:0;pointer-events:none;
  /* MOBILE default: vertical dashed rule down the node column */
  left:calc(var(--s4) + 21px);top:var(--s5);bottom:var(--s5);width:2px;
  background:repeating-linear-gradient(
    to bottom, var(--teal) 0 8px, transparent 8px 16px);
  opacity:.55;
}
/* scroll-draw start/settle: grow from the top on mobile (scaleY) */
.js .arc-path__line[data-draw]{
  opacity:.55;                 /* override the generic [data-draw] fade-in */
  transform:scaleY(0);transform-origin:top center;
  transition:transform var(--m-slow);
  will-change:transform;
}
.js .arc-path__line[data-draw].is-drawn{transform:scaleY(1)}
@media (min-width:768px){
  /* DESKTOP: horizontal dashed rule centered on the node row across the cards */
  .arc-path__line{
    left:16.66%;right:16.66%;top:calc(var(--s5) + 22px);bottom:auto;
    width:auto;height:2px;
    background:repeating-linear-gradient(
      to right, var(--teal) 0 8px, transparent 8px 16px);
  }
  .js .arc-path__line[data-draw]{
    transform:scaleX(0);transform-origin:left center;
  }
  .js .arc-path__line[data-draw].is-drawn{transform:scaleX(1)}
}
@media (prefers-reduced-motion:reduce){
  /* full line shown instantly; no growth */
  .js .arc-path__line[data-draw]{transform:none!important;transition:none}
}

/* --------------------------------------------------------------------------
   21. SECTION-NUM : numbered journey eyebrow
   Reuses the .eyebrow look; just prefixes a zero-padded brand-color number so
   the long page reads as a guided "01 / The problem -> 05 / Enroll" journey.
   Applied to the MAJOR narrative sections only (problem, what-you-build, the
   arc, proof, enroll). Subtle, consistent, label-only (no reordering).
   -------------------------------------------------------------------------- */
.section-num__n{
  font-weight:700;
  letter-spacing:0.12em; /* a touch wider than the eyebrow body for the figures */
  color:var(--cobalt); /* brand color; inverts to cream on cobalt/dark bands below */
}
.section-num__sep{
  opacity:.5;
  margin:0 0.35em;
  font-weight:600;
}
/* On cobalt/dark bands the parent .eyebrow already inverts to cream (§4);
   keep the number and separator in step so the whole label reads as one unit. */
.bg-cobalt .section-num__n,
.bg-dark .section-num__n{color:var(--cream-100)}


/* ===== PROOF + CREDENTIALS SECTION (redesign 2026-06-29) ===== */
/* ==========================================================================
   PROOF + CREDENTIALS SECTION  (append to assets/css/humanside.css)
   Hybrid: editorial header + dense logo wall + unified cobalt credential bar.
   Replaces the old .trust-band / .logowall / .awards / .credentials-band block.

   All classes are namespaced "proof-" to avoid collision. NOTE: humanside.css
   already defines .proof-chip / .proof-chips (unrelated pricing chips). None
   of the selectors below touch those.

   Uses the live design-system tokens already declared in :root
   (--cobalt-700, --cream, --cream-100, --cream-200, --teal, --yellow, --dark,
   --font-display, --font-body). Two local hairline tokens are added inline.

   REVEAL: the base state here is FULLY VISIBLE. Scroll-reveal is layered on by
   the existing "html.js .reveal { opacity:0 }" rule + JS IntersectionObserver,
   exactly like the rest of humanside.css. Do NOT add opacity:0 here.
   ========================================================================== */

.proof-section{
  /* local hairline tokens (cobalt on cream / white on cobalt) */
  --proof-hair:rgba(10,63,168,.16);
  --proof-hair-dark:rgba(255,255,255,.20);
}

.proof-inner{
  max-width:1180px;
  margin:0 auto;
  padding-inline:20px;
}

/* ---------- 1. EDITORIAL HEADER ---------- */
.proof-head{
  max-width:760px;
  margin:0 0 clamp(34px,4vw,52px);
}
.proof-eyebrow{
  font-family:var(--font-body);
  font-weight:600;
  font-size:12px;
  letter-spacing:.22em;
  text-transform:uppercase;
  color:var(--cobalt-700);
  margin:0 0 20px;
  display:flex;
  align-items:center;
  gap:12px;
}
.proof-eyebrow::before{
  content:"";
  width:30px;height:2px;
  background:var(--cobalt);
  display:inline-block;
  border-radius:2px;
}
/* signature mixed headline: Fraunces italic + ALL-CAPS Poppins */
.proof-headline{
  margin:0 0 22px;
  letter-spacing:-.01em;
}
.proof-headline .proof-headline__em{
  display:block;
  font-family:var(--font-display);
  font-style:italic;
  font-weight:500;
  font-size:clamp(40px,6.4vw,74px);
  color:var(--cobalt-700);
  line-height:.96;
}
.proof-headline .proof-headline__caps{
  display:block;
  font-family:var(--font-body);
  font-weight:700;
  text-transform:uppercase;
  letter-spacing:-.005em;
  font-size:clamp(40px,6.6vw,76px);
  color:var(--dark);
  line-height:.9;
  margin-top:.04em;
}
.proof-lede{
  max-width:60ch;
  font-size:clamp(15px,1.6vw,17px);
  color:#4A463E;
  margin:0;
}
.proof-lede strong{color:var(--dark);font-weight:600}

/* ---------- 2. LOGO WALL (dense, bare, optically normalized) ---------- */
.proof-logowall{
  margin:0 0 clamp(28px,3.4vw,40px);
}
.proof-logowall__eyebrow{
  font-family:var(--font-body);
  font-weight:600;
  font-size:12px;
  letter-spacing:.2em;
  text-transform:uppercase;
  color:var(--cobalt-700);
  margin:0 0 14px;
}
/* 3 across -> clean 3x3 wall for 9 logos (bigger, bolder cards). Flex-wrap +
   justify-content:center so any final short row auto-centers (never a
   left-aligned orphan) at every breakpoint. 9 logos = 3+3+3 desktop, no orphan. */
.proof-logogrid{
  list-style:none;
  margin:0;
  padding:0;
  display:flex;
  flex-wrap:wrap;
  justify-content:center;
  gap:14px;
}
.proof-logo{
  flex:0 1 calc((100% - 28px) / 3);   /* 3 per row minus 2 gaps of 14px */
  max-width:calc((100% - 28px) / 3);
  display:flex;
  align-items:center;
  justify-content:center;
  padding:30px 26px;
  min-height:118px;
  background:var(--cream-100);
  border:1px solid var(--proof-hair);
  border-radius:14px;
  box-shadow:0 1px 2px rgba(39,39,39,.04);
  transition:background var(--m-default,.25s ease),
             box-shadow var(--m-default,.25s ease),
             transform var(--m-slow,.4s cubic-bezier(.16,1,.3,1));
}
.proof-logo:hover{
  background:#fff;
  box-shadow:0 10px 26px -14px rgba(39,39,39,.28);
}
.proof-logo img{
  width:auto;
  max-width:100%;
  /* max-height (not height) so a wide mark shrinks to fit a narrow cell
     instead of blowing the row out. */
  height:auto;
  max-height:54px;
  object-fit:contain;
  transition:transform var(--m-slow,.4s cubic-bezier(.16,1,.3,1));
}
.proof-logo:hover img{transform:translateY(-2px) scale(1.04)}
/* per-logo optical normalization (intrinsic-ratio tuned), so each reads
   roughly equal visual weight. compact marks larger, wide marks pulled in. */
.proof-logo--google img{max-height:46px}
.proof-logo--nike img{max-height:54px}
.proof-logo--unitednations img{                 /* VERY wide ~5:1, constrain hard */
  max-height:40px;
  max-width:78%;
}
.proof-logo--applause img{max-height:40px}
.proof-logo--gctherapeutics img{max-height:42px}
.proof-logo--whoop img{max-height:40px}
.proof-logo--hubspot img{max-height:44px}

/* ---------- 3. CREDENTIAL BAR (cobalt-700 authority anchor) ---------- */
.proof-credbar{
  background:var(--cobalt-700);
  border-radius:24px;
  padding:36px 44px;
  display:grid;
  /* hero + seals size to content; stats take the remaining track. Stat values
     use white-space:nowrap; minmax(0,1fr) lets the track shrink so the bar
     never overflows the container. */
  grid-template-columns:auto auto minmax(0,1fr);
  align-items:center;
  gap:30px;
  box-shadow:0 24px 64px -30px rgba(10,63,168,.6);
  position:relative;
  overflow:hidden;
}
/* faint brand-ribbon arc motif (kept low so text stays AA) */
.proof-credbar::after{
  content:"";
  position:absolute;
  right:-130px;
  top:-150px;
  width:380px;
  height:380px;
  border-radius:50%;
  border:38px solid rgba(0,188,200,.12);
  border-right-color:rgba(245,208,0,.12);
  pointer-events:none;
}
/* the big number block */
.proof-credbar__hero{
  display:flex;
  align-items:center;
  gap:18px;
  position:relative;
  z-index:1;
}
.proof-credbar__num{
  font-family:var(--font-display);
  font-style:italic;
  font-weight:600;
  font-size:clamp(86px,9.5vw,108px);
  line-height:.82;
  color:#fff;
  letter-spacing:-.02em;
}
.proof-credbar__numlabel{max-width:172px}
.proof-credbar__numlabel .proof-credbar__k{
  display:block;
  font-family:var(--font-body);
  font-weight:700;
  font-size:18px;
  line-height:1.18;
  color:#fff;
}
.proof-credbar__numlabel .proof-credbar__sub{
  display:block;
  margin-top:7px;
  font-family:var(--font-body);
  font-weight:500;
  font-size:12px;
  letter-spacing:.14em;
  text-transform:uppercase;
  color:var(--yellow);
}
/* the two real Gold seals, popped on white */
.proof-credbar__seals{
  display:flex;
  gap:14px;
  padding:0 30px;
  position:relative;
  z-index:1;
}
.proof-credbar__seals::before,
.proof-credbar__seals::after{
  content:"";
  position:absolute;
  top:8%;
  height:84%;
  width:1px;
  background:var(--proof-hair-dark);
}
.proof-credbar__seals::before{left:0}
.proof-credbar__seals::after{right:0}
.proof-seal{
  background:#fff;
  border-radius:14px;
  padding:12px;
  box-shadow:0 12px 28px -14px rgba(0,0,0,.5);
  display:flex;
  align-items:center;
  justify-content:center;
}
.proof-seal img{height:80px;width:auto}
/* the three supporting stat units, divided by hairlines */
.proof-credbar__stats{
  display:flex;
  align-items:stretch;
  position:relative;
  z-index:1;
}
.proof-stat{
  flex:1;
  padding:2px 18px;
  position:relative;
}
.proof-stat:first-child{padding-left:0}
.proof-stat:last-child{padding-right:0}
.proof-stat + .proof-stat::before{
  content:"";
  position:absolute;
  left:0;
  top:12%;
  height:76%;
  width:1px;
  background:var(--proof-hair-dark);
}
.proof-stat .proof-stat__v{
  display:block;
  font-family:var(--font-display);
  font-style:italic;
  font-weight:600;
  font-size:clamp(25px,2.7vw,31px);
  line-height:1;
  color:#fff;
  white-space:nowrap;
}
.proof-stat .proof-stat__v .proof-stat__accent{color:var(--yellow)}
.proof-stat .proof-stat__l{
  display:block;
  margin-top:9px;
  font-family:var(--font-body);
  font-weight:500;
  font-size:12.5px;
  line-height:1.34;
  color:rgba(255,255,255,.84);
}

/* =========================================================================
   TABLET
   ========================================================================= */
@media (max-width:1080px){
  .proof-credbar{
    grid-template-columns:1fr;
    gap:28px;
    padding:34px 32px;
  }
  .proof-credbar__hero{justify-content:flex-start;gap:20px}
  .proof-credbar__seals{
    justify-content:center;
    padding:24px 0;
    border-top:1px solid var(--proof-hair-dark);
    border-bottom:1px solid var(--proof-hair-dark);
  }
  .proof-credbar__seals::before,
  .proof-credbar__seals::after{display:none}
  .proof-credbar__stats{justify-content:flex-start}
}

/* logo wall stays 3-across while comfortable, then 2-across. flex-wrap +
   justify-content:center keeps the final row centered (the 9th logo centers
   on its own row at 2-across instead of sitting as a left-aligned orphan). */
@media (max-width:880px){
  .proof-logo{min-height:108px;padding:26px 18px}
}
@media (max-width:620px){
  .proof-logo{
    flex:0 1 calc((100% - 14px) / 2);   /* 2 per row minus 1 gap of 14px */
    max-width:calc((100% - 14px) / 2);
  }
}

/* =========================================================================
   MOBILE  (flawless at 390 and 320)
   ========================================================================= */
@media (max-width:560px){
  .proof-inner{padding-inline:16px}
  .proof-head{margin-bottom:30px}
  .proof-headline .proof-headline__em{font-size:clamp(34px,10.5vw,52px)}
  .proof-headline .proof-headline__caps{font-size:clamp(34px,10.7vw,54px);overflow-wrap:break-word}

  .proof-logo{
    flex:0 1 calc((100% - 12px) / 2);
    max-width:calc((100% - 12px) / 2);
    min-height:92px;
    padding:20px 14px;
  }
  .proof-logogrid{gap:12px}
  .proof-logo img{max-height:42px}
  /* mobile per-logo nudge so they stay crisp and large */
  .proof-logo--google img{max-height:36px}
  .proof-logo--nike img{max-height:42px}
  .proof-logo--unitednations img{max-height:32px;max-width:88%}
  .proof-logo--applause img{max-height:32px}
  .proof-logo--gctherapeutics img{max-height:34px}
  .proof-logo--whoop img{max-height:32px}
  .proof-logo--hubspot img{max-height:36px}

  .proof-credbar{
    border-radius:20px;
    padding:28px 20px;
    gap:24px;
  }
  .proof-credbar__hero{gap:16px}
  .proof-credbar__num{font-size:80px}
  .proof-credbar__numlabel{max-width:168px}
  .proof-credbar__numlabel .proof-credbar__k{font-size:16px}

  .proof-credbar__seals{gap:12px;padding:20px 0}
  .proof-seal{padding:10px;border-radius:12px}
  .proof-seal img{height:80px}

  .proof-credbar__stats{flex-direction:column;gap:0}
  .proof-stat{flex:0 0 100%;padding:14px 2px}
  .proof-stat:first-child{padding-top:0}
  .proof-stat + .proof-stat::before{
    left:0;
    top:0;
    height:1px;
    width:60%;
  }
  .proof-stat .proof-stat__v{font-size:26px}
}

@media (max-width:360px){
  .proof-inner{padding-inline:13px}
  .proof-logo{padding:16px 10px;min-height:84px}
  .proof-credbar__num{font-size:70px}
  .proof-seal img{height:70px}
  .proof-credbar{padding:24px 16px}
}

@media (prefers-reduced-motion:reduce){
  .proof-logo,.proof-logo img{transition:none}
  .proof-logo:hover img{transform:none}
}

/* ==========================================================================
   §30  MOTION REDESIGN ADD-ONS (2026-06-30) — clarity-first, additive.
   Extends the existing .reveal engine (§ JS initReveal/initParallax).
   Everything below is gated by .js + no-preference; the reduced-motion
   block at the end neutralizes all of it. Authentic imagery only.
   ========================================================================== */

/* directional + scale reveal variants (reuse the .reveal .is-visible settle) */
.js .reveal--left{transform:translateX(-28px)}
.js .reveal--right{transform:translateX(28px)}
.js .reveal--scale{transform:scale(.94)}
.js .reveal--left.is-visible,
.js .reveal--right.is-visible{transform:translateX(0)}
.js .reveal--scale.is-visible{transform:scale(1)}

/* clarity-figure: an authentic photo/cinemagraph that NAMES the service or
   problem it depicts. The media's aspect-ratio reserves space => zero CLS. */
.clarity-figure{
  position:relative;margin:0;border-radius:var(--radius-lg,20px);overflow:hidden;
  background:var(--cream-200,#f1ead9);
  box-shadow:var(--shadow,0 12px 40px rgba(16,24,40,.10));
}
.clarity-figure__media{display:block;width:100%;height:auto;aspect-ratio:16/10;object-fit:cover}
.clarity-figure video.clarity-figure__media{object-position:50% 42%}
.clarity-figure__cap{
  position:absolute;left:0;right:0;bottom:0;margin:0;padding:18px 20px;
  font-size:15px;line-height:1.4;color:#fff;font-weight:500;
  background:linear-gradient(to top,rgba(8,15,30,.82),rgba(8,15,30,.10) 70%,rgba(8,15,30,0));
}
.clarity-figure__cap strong{font-weight:600}
.clarity-figure__ribbon{
  position:absolute;top:-10px;right:-10px;width:96px;height:auto;opacity:.9;
  pointer-events:none;z-index:2;
}
@media (max-width:600px){
  .clarity-figure__media{aspect-ratio:4/3}
  .clarity-figure__cap{font-size:14px;padding:14px 16px}
}

/* clarity-pair: authentic image + the words that explain it (2-col -> 1-col) */
.clarity-pair{display:grid;grid-template-columns:1.05fr 1fr;gap:clamp(20px,4vw,48px);align-items:center}
.clarity-pair--reverse .clarity-figure{order:2}
@media (max-width:820px){
  .clarity-pair,.clarity-pair--reverse{grid-template-columns:1fr}
  .clarity-pair--reverse .clarity-figure{order:0}
}

/* subtle parallax target (JS drives transform; base keeps a GPU layer) */
[data-parallax]{transform:translate3d(0,0,0)}

/* enrolling-now badge: ONE gentle attention pulse, never infinite */
.js .badge-pulse{animation:hs-badge-pulse 2.6s ease-out 1 .4s both}
@keyframes hs-badge-pulse{
  0%{box-shadow:0 0 0 0 rgba(245,196,0,.55)}
  60%{box-shadow:0 0 0 10px rgba(245,196,0,0)}
  100%{box-shadow:0 0 0 0 rgba(245,196,0,0)}
}

@media (prefers-reduced-motion:reduce){
  .js .reveal--left,.js .reveal--right,.js .reveal--scale{transform:none}
  [data-parallax]{transform:none!important}
  .js .badge-pulse{animation:none}
}

/* ==========================================================================
   §31  TASTE PASS (2026-06-30) — static depth + lighting + surface polish.
   Grounded in external taste input (Refero design rules + Godly 2026 motion
   restraint + Aceternity effects reimplemented in vanilla). Additive only.
   Everything is absolute / pseudo-element => zero CLS. The single interactive
   piece (.glow-card) is hover-gated + rAF-throttled in JS and killed under
   reduced-motion below. Single-cobalt action color preserved throughout.
   ========================================================================== */

/* surface tokens: a defined warm hairline + one larger "feature" radius for
   the most important surfaces (Refero: elevation from hairline, not shadow). */
:root{
  --hairline:#E7DEC9;
  --r-feature:24px;
}
/* The warm hairline now lives on the base .card rule itself (line ~407), so the
   .card--cobalt / .card--feature modifiers keep their own intended borders.
   Only the feature radius is applied here. */
.feature-radius{border-radius:var(--r-feature)}

/* S1 — dot-grid texture: faint, edge-masked dot field for quiet premium depth
   (Aceternity "Grid and Dot Backgrounds"). Static paint, no motion, no JS. */
.bg-dotgrid{position:relative}
.bg-dotgrid > *{position:relative;z-index:1}
.bg-dotgrid::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background-image:radial-gradient(rgba(16,89,229,.06) 1px,transparent 1px);
  background-size:24px 24px;
  -webkit-mask-image:radial-gradient(ellipse at center,#000 35%,transparent 82%);
          mask-image:radial-gradient(ellipse at center,#000 35%,transparent 82%);
}
/* on cobalt panels the dots invert to a faint light tone */
.bg-cobalt.bg-dotgrid::before{
  background-image:radial-gradient(rgba(255,255,255,.06) 1px,transparent 1px);
}

/* S2 — spotlight: one soft off-axis radial light wash that draws the eye to a
   focal block (Aceternity "Spotlight"). Full-cover positioned radial so it is
   clipped to the section box WITHOUT overflow:clip — which would break the
   hero's position:sticky media. Pure CSS, static, zero layout cost. */
.spotlight{position:relative}
.spotlight > *{position:relative;z-index:1}
.spotlight::before{
  content:"";position:absolute;inset:0;pointer-events:none;z-index:0;
  background:radial-gradient(58% 78% at 14% 16%,rgba(16,89,229,.10),transparent 70%);
}
/* lift a cobalt panel instead of tinting it */
.bg-cobalt.spotlight::before{
  background:radial-gradient(58% 78% at 14% 16%,rgba(255,255,255,.10),transparent 70%);
}

/* S5 — card-spotlight glow: a soft cobalt radial that tracks the cursor inside
   a decision card and fades its glow up (Aceternity "Card Spotlight"). The
   pointer listener is hover-gated + rAF-throttled in JS — no idle work. */
.glow-card{position:relative}
.glow-card::before{
  content:"";position:absolute;inset:0;border-radius:inherit;opacity:0;
  transition:opacity .3s ease;pointer-events:none;z-index:0;
  background:radial-gradient(220px circle at var(--mx,50%) var(--my,50%),rgba(16,89,229,.16),transparent 60%);
}
.glow-card > *{position:relative;z-index:1}
.glow-card.is-glowing::before{opacity:1}

@media (prefers-reduced-motion:reduce){
  .glow-card::before{display:none}
}
/* touch / no-hover devices never get the glow (also belt-and-suspenders to JS) */
@media (hover:none){
  .glow-card::before{display:none}
}

/* ==========================================================================
   §32  CRO REDESIGN COMPONENTS (2026-06-30) — additive, both pages.
   Shared building blocks for the conversion redesign: one confident price
   anchor, an "every seat includes" value stack, the award-seal authority
   lockup, a guarantee chip, an objection band, a why-not-free comparison
   table, a "what a session feels like" beat, a compact instructor block, and
   an on-brand popup (branded header + mobile bottom-sheet). All namespaced,
   token-driven, WCAG-checked, reduced-motion honored, zero CLS.
   ========================================================================== */

/* --- 32a. PRICE ANCHOR (one confident bold Poppins price — BOTH pages) -----
   Replaces the weak Playfair-italic $3,750 on LWP and unifies with FND. The
   number is Poppins 700 (a solid, trustworthy price), the unit is muted. */
.price-anchor{
  display:flex;flex-wrap:wrap;align-items:baseline;justify-content:center;
  gap:var(--s2);
}
.price-anchor__num{
  font-family:var(--font-body);font-weight:700;
  font-size:52px;line-height:1;color:var(--dark);letter-spacing:-0.02em;
}
@media (min-width:768px){.price-anchor__num{font-size:64px}}
.price-anchor__unit{font-size:16px;font-weight:500;color:#565656}
.bg-cobalt .price-anchor__num,.bg-dark .price-anchor__num{color:#fff}
.bg-cobalt .price-anchor__unit,.bg-dark .price-anchor__unit{color:var(--cream-100)}

/* --- 32b. VALUE STACK ("Every seat includes" — teal checklist) -------------
   Sits above the seat stepper in each price card. Left-aligned rows, a teal
   check glyph, so the buyer sees exactly what the price buys before the ask. */
.value-stack{
  display:grid;gap:var(--s3);
  text-align:left;max-width:34ch;margin-inline:auto;
}
.value-stack__item{
  display:grid;grid-template-columns:22px 1fr;align-items:start;gap:var(--s3);
  font-size:15px;line-height:1.45;color:var(--dark);
}
@media (min-width:768px){.value-stack__item{font-size:16px}}
.value-stack__check{
  flex:0 0 auto;width:22px;height:22px;margin-top:1px;
  color:var(--teal-ink);stroke-width:2;
}
.value-stack__item strong{font-weight:600}
.bg-cobalt .value-stack__item{color:var(--cream-100)}
.bg-cobalt .value-stack__check{color:var(--teal)}

/* --- 32c. SEAL LOCKUP (award authority anchor above the CTA + in modals) ---
   The two real Gold seals beside a one-line proof sentence. Compact enough to
   sit directly above the price-card button and inside the lead-capture modals.
   `--sm` is the modal-scale variant. */
.seal-lockup{
  display:flex;align-items:center;justify-content:center;gap:var(--s3);
  flex-wrap:wrap;text-align:left;
  padding:var(--s3) var(--s4);
  border:1px solid var(--hairline);border-radius:var(--r-card);
  background:var(--cream-100);max-width:44ch;margin-inline:auto;
}
.seal-lockup__seals{display:flex;align-items:center;gap:var(--s2);flex:0 0 auto}
.seal-lockup__seals img{height:44px;width:auto;display:block}
.seal-lockup__text{
  font-size:13.5px;line-height:1.4;color:var(--dark);font-weight:500;
}
.seal-lockup__text strong{font-weight:700}
.seal-lockup--sm{padding:var(--s2) var(--s3);gap:var(--s2)}
.seal-lockup--sm .seal-lockup__seals img{height:34px}
.seal-lockup--sm .seal-lockup__text{font-size:12.5px}
.bg-cobalt .seal-lockup,.bg-dark .seal-lockup{
  background:rgba(255,255,255,.08);border-color:rgba(255,255,255,.18);
}
.bg-cobalt .seal-lockup__text,.bg-dark .seal-lockup__text{color:var(--cream-100)}

/* --- 32d. GUARANTEE CHIP (shield + risk-reversal, directly under the CTA) ---
   Turns the refund line into a formal, bordered reassurance chip. */
.guarantee-chip{
  display:inline-flex;align-items:center;gap:var(--s2);
  padding:var(--s2) var(--s4);
  border:1px solid var(--teal-ink);border-radius:var(--r-pill);
  background:rgba(0,188,200,.08);
  font-size:14px;font-weight:600;line-height:1.3;color:var(--teal-ink);
  max-width:100%;
}
.guarantee-chip svg{flex:0 0 auto;width:18px;height:18px;stroke-width:1.75}
.bg-cobalt .guarantee-chip,.bg-dark .guarantee-chip{
  border-color:var(--teal);background:rgba(0,188,200,.16);color:var(--cream-100);
}

/* --- 32e. OBJECTION BAND ("Three things you're probably thinking") ---------
   Three cards, each naming a real hesitation as a quoted thought, then
   answering it. Placed right before pricing to clear final resistance. */
.objection{
  display:flex;flex-direction:column;gap:var(--s3);height:100%;
}
.objection__q{
  display:flex;align-items:flex-start;gap:var(--s2);
  font-family:var(--font-display);font-style:italic;font-weight:500;
  font-size:19px;line-height:1.3;color:var(--cobalt-700);
}
@media (min-width:768px){.objection__q{font-size:21px}}
.objection__q::before{content:"\201C";font-size:1.1em;line-height:1;color:var(--teal-ink)}
.objection__a{font-size:15px;line-height:1.55;color:var(--dark)}
@media (min-width:768px){.objection__a{font-size:16px}}

/* --- 32f. COMPARE (why pay vs. free courses — three cards, one highlighted) --
   Three provider cards side by side on desktop, stacked on mobile (the SAME
   markup at every width — no dual-markup fragility). The HumanSide card is
   highlighted as the recommended choice. Each row is an icon + line so the
   contrast reads at a glance. */
.compare{display:grid;gap:var(--s4);grid-template-columns:1fr;max-width:1000px;margin-inline:auto}
/* Two columns since 2026-07: the middle (paid self-serve) column was removed at
   client direction, so the pair renders centered instead of leaving a dead
   third track at 1440px. */
@media (min-width:900px){.compare{grid-template-columns:repeat(2,1fr);align-items:stretch;max-width:760px}}
.compare-card{
  position:relative;height:100%;
  border:1px solid var(--hairline);border-radius:var(--r-feature);
  background:var(--cream-100);padding:var(--s5);box-shadow:var(--shadow-card);
}
.compare-card--us{border:2px solid var(--cobalt);box-shadow:var(--shadow-hover)}
.compare-card__tag{
  position:absolute;top:-12px;left:50%;transform:translateX(-50%);
  background:var(--cobalt);color:var(--cream-100);
  border-radius:var(--r-pill);padding:4px var(--s3);
  font-family:var(--font-body);font-weight:700;font-size:11px;
  letter-spacing:0.08em;text-transform:uppercase;white-space:nowrap;
}
.compare-card__title{font-family:var(--font-body);font-weight:700;font-size:18px;line-height:1.2;color:var(--dark)}
.compare-card--us .compare-card__title{color:var(--cobalt)}
.compare-card__sub{font-size:13px;color:#565656;margin-top:2px}
.compare-card__list{display:grid;gap:var(--s3);margin-top:var(--s4)}
.compare-card__li{display:grid;grid-template-columns:20px 1fr;gap:var(--s2);align-items:start;font-size:15px;line-height:1.45;color:var(--dark)}
@media (min-width:768px){.compare-card__li{font-size:16px}}
.compare-card__li svg{width:20px;height:20px;flex:0 0 auto;margin-top:1px;stroke-width:2}
.compare-card__li--no{color:#565656}
.compare-card__li--no svg{color:#b0b0b0}
.compare-card__li--yes svg{color:var(--teal-ink)}

/* --- 32g. FEELS ("What a session actually feels like" — moment timeline) ----
   A vertical, numbered "here's the hour" beat that lets the buyer picture the
   room. Left rail with brand nodes, so it reads as a guided walkthrough. */
.feels{display:grid;gap:0;max-width:640px;margin-inline:auto}
.feels__item{
  display:grid;grid-template-columns:auto 1fr;gap:var(--s4);
  padding-bottom:var(--s5);position:relative;
}
.feels__item:last-child{padding-bottom:0}
.feels__rail{display:flex;flex-direction:column;align-items:center;gap:0}
.feels__node{
  flex:0 0 auto;width:40px;height:40px;border-radius:var(--r-pill);
  display:inline-flex;align-items:center;justify-content:center;
  background:var(--teal);color:var(--cobalt-700);
  font-family:var(--font-display);font-style:italic;font-weight:600;font-size:18px;
  box-shadow:0 2px 8px rgba(39,39,39,.14);z-index:1;
}
.feels__line{flex:1 1 auto;width:2px;margin-top:6px;
  background:repeating-linear-gradient(to bottom,var(--teal) 0 6px,transparent 6px 12px);
  opacity:.5;
}
.feels__item:last-child .feels__line{display:none}
.feels__body{padding-top:6px}
.feels__h{font-family:var(--font-body);font-weight:700;font-size:17px;line-height:1.3;color:var(--dark);margin-bottom:var(--s2)}
@media (min-width:768px){.feels__h{font-size:19px}}
.feels__p{font-size:15px;line-height:1.55;color:var(--dark)}
@media (min-width:768px){.feels__p{font-size:16px}}
.bg-cobalt .feels__h,.bg-cobalt .feels__p{color:var(--cream-100)}

/* --- 32h. INSTRUCTOR MINI (compact "who teaches this", above pricing) -------
   A small portrait + name + one-line credibility + "teaches every session
   personally" reassurance. Full bio stays lower on the page. */
.instructor-mini{
  display:grid;gap:var(--s4);align-items:center;
  max-width:760px;margin-inline:auto;
  grid-template-columns:1fr;text-align:center;
}
@media (min-width:640px){
  .instructor-mini{grid-template-columns:120px 1fr;text-align:left;gap:var(--s5)}
}
.instructor-mini__photo{
  width:120px;height:120px;border-radius:var(--r-pill);object-fit:cover;
  margin-inline:auto;border:3px solid var(--cream-200);
  box-shadow:var(--shadow-card);
}
.instructor-mini__name{font-family:var(--font-body);font-weight:700;font-size:20px;color:var(--dark);line-height:1.2}
.instructor-mini__name .tm{font-weight:400}
.instructor-mini__role{font-size:15px;color:#565656;margin-top:2px}
.instructor-mini__bio{font-size:15px;line-height:1.55;color:var(--dark);margin-top:var(--s3)}
@media (min-width:768px){.instructor-mini__bio{font-size:16px}}
.instructor-mini__note{
  display:inline-flex;align-items:center;gap:var(--s2);margin-top:var(--s3);
  font-size:14px;font-weight:600;color:var(--teal-ink);
}
.instructor-mini__note svg{width:18px;height:18px;stroke-width:1.75;flex:0 0 auto}

/* --- 32i. BEFORE / AFTER (walk-in vs walk-out transformation beat) ----------
   Two columns: the state they arrive in, and the state they leave in. The
   "after" column is lifted with the brand color so the transformation reads. */
.beforeafter{
  display:grid;gap:var(--s4);max-width:900px;margin-inline:auto;
  grid-template-columns:1fr;
}
@media (min-width:768px){.beforeafter{grid-template-columns:1fr auto 1fr;align-items:center;gap:var(--s5)}}
.ba-col{
  border:1px solid var(--hairline);border-radius:var(--r-feature);
  padding:var(--s5);background:var(--cream-100);height:100%;
}
.ba-col--after{border-color:var(--cobalt);background:var(--cobalt-100);box-shadow:var(--shadow-hover)}
.ba-col__label{
  font-family:var(--font-body);font-weight:600;font-size:12px;letter-spacing:0.1em;
  text-transform:uppercase;color:#565656;margin-bottom:var(--s3);
}
.ba-col--after .ba-col__label{color:var(--cobalt-700)}
.ba-col__list{display:grid;gap:var(--s3)}
.ba-col__li{display:grid;grid-template-columns:20px 1fr;gap:var(--s2);align-items:start;font-size:15px;line-height:1.5;color:var(--dark)}
@media (min-width:768px){.ba-col__li{font-size:16px}}
.ba-col__li svg{width:20px;height:20px;flex:0 0 auto;margin-top:1px;stroke-width:2}
.ba-col--before .ba-col__li svg{color:#9a9a9a}
.ba-col--after .ba-col__li svg{color:var(--teal-ink)}
.ba-arrow{
  display:none;align-self:center;justify-self:center;
  color:var(--cobalt);
}
@media (min-width:768px){.ba-arrow{display:inline-flex}}
.ba-arrow svg{width:36px;height:36px;stroke-width:1.5}

/* --- 32j. POPUP POLISH (branded header + mobile bottom-sheet) ---------------
   Applied to lead-capture popups (assessment / exit / playbook). Adds a small
   teal eyebrow + brand accent to the modal head, and turns the mobile
   presentation into a rounded bottom-sheet instead of a jarring full-screen
   takeover. Long form modals (registration / enterprise) keep the full panel. */
.modal__eyebrow{
  display:inline-flex;align-items:center;gap:var(--s2);
  font-family:var(--font-body);font-weight:600;font-size:12px;
  letter-spacing:0.1em;text-transform:uppercase;color:var(--teal-ink);
  margin-bottom:var(--s2);
}
.modal__eyebrow::before{content:"";width:22px;height:2px;background:var(--teal);border-radius:2px}
/* mobile bottom-sheet variant (overrides §11 full-screen for popup modals) */
@media (max-width:559px){
  .modal--sheet{padding:0;align-items:flex-end}
  .modal--sheet .modal__panel{
    max-width:none;width:100%;min-height:0;max-height:90dvh;
    border-radius:var(--r-modal) var(--r-modal) 0 0;
    padding:var(--s6) var(--s4) calc(var(--s6) + env(safe-area-inset-bottom,0px));
    transform:translateY(100%);
  }
  .modal--sheet.is-open .modal__panel{transform:translateY(0)}
  /* grab-handle affordance */
  .modal--sheet .modal__panel::before{
    content:"";position:absolute;top:8px;left:50%;transform:translateX(-50%);
    width:38px;height:4px;border-radius:var(--r-pill);background:var(--cream-200);
  }
}
@media (prefers-reduced-motion:reduce){
  .modal--sheet .modal__panel{transition:opacity 200ms ease}
}

/* --- 32k. HERO MEDIA ACCENTS (squiggle bleed + floating proof badge) --------
   The hero photo card gets Katie's brand squiggle bleeding off one corner and
   one floating proof pill, so the hero graphic reads as designed and carries a
   single above-fold proof beat without cluttering the copy column. */
.hero-split__media{isolation:isolate}
/* Squiggle overlay on a hero PHOTO (e.g. Katie speaking). Higher specificity than the
   base `.hero-split__media > img` cover rule so it is NOT stretched to fill: it stays a
   contained ribbon bleeding off the bottom-left corner as the brand photo-treatment. */
.hero-split__media > .hero-split__squiggle{
  position:absolute;z-index:2;pointer-events:none;
  inset:auto auto -6px -6px;              /* bottom-left bleed; override the base inset:0 */
  width:66%;max-width:340px;height:auto;
  object-fit:contain;                      /* override the base object-fit:cover */
  opacity:.95;
}
.hero-split__badge{
  position:absolute;z-index:3;left:var(--s3);bottom:var(--s3);
  display:inline-flex;align-items:center;gap:var(--s2);
  background:var(--cream-100);color:var(--dark);
  border-radius:var(--r-pill);padding:var(--s2) var(--s3);
  box-shadow:var(--shadow-hover);
  font-family:var(--font-body);font-weight:600;font-size:13px;line-height:1.2;
  max-width:calc(100% - (2 * var(--s3)));
}
.hero-split__badge svg{flex:0 0 auto;width:18px;height:18px;color:var(--cobalt);stroke-width:1.75}
@media (min-width:768px){.hero-split__badge{font-size:14px}}

/* name-binding utility: keep a proper name from splitting across lines */
.nowrap{white-space:nowrap}

/* ==================================================================
   §34  TEAM / IN-HOUSE BOOK-TIME BOX (2026-07-02) - additive, both pages.
   A DIFFERENTIATED secondary box that sits next to every primary CTA.
   Deliberately NOT cobalt-filled so the single dominant CTA still wins.
   Opens the book-time calendar modal (Ileana pref = book time, not a form).
   ================================================================== */
.team-cta{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;
  gap:var(--s3) var(--s4);
  margin-top:var(--s4);
  padding:var(--s4) var(--s5);
  background:var(--cream-100);
  border:1px solid rgba(16,89,229,.16);   /* cobalt-tinted hairline, subtle */
  border-radius:var(--r-card);
  text-align:left;
}
.team-cta__text{min-width:0}
.team-cta__lead{font-weight:700;font-size:16px;line-height:1.3;margin:0;color:var(--dark)}
.team-cta__sub{font-size:14px;line-height:1.4;margin:2px 0 0;color:#5b5b5b}
.team-cta__btn{
  flex:0 0 auto;
  display:inline-flex;align-items:center;justify-content:center;gap:8px;
  padding:11px 22px;border-radius:var(--r-pill);
  background:transparent;color:var(--cobalt);border:1.5px solid var(--cobalt);
  font-family:inherit;font-weight:600;font-size:15px;line-height:1;cursor:pointer;
  transition:background 160ms ease, transform 120ms ease;
}
.team-cta__btn:hover{background:var(--cobalt-100);text-decoration:none}
.team-cta__btn:active{transform:scale(.99)}
.team-cta__btn:focus-visible{outline:none;box-shadow:var(--ring-cobalt)}
@media (max-width:560px){
  .team-cta{flex-direction:column;align-items:stretch;gap:var(--s3)}
  .team-cta__btn{width:100%}
}
/* Dark-section variant (e.g. footer band) */
.bg-dark .team-cta{background:rgba(255,255,255,.05);border-color:rgba(255,255,255,.14)}
.bg-dark .team-cta__lead{color:var(--cream-100)}
.bg-dark .team-cta__sub{color:#bdbdbd}
.bg-dark .team-cta__btn{color:var(--cream-100);border-color:var(--cream-100)}
.bg-dark .team-cta__btn:hover{background:rgba(255,255,255,.12)}
@media (prefers-reduced-motion:reduce){
  .team-cta__btn{transition:none}
  .team-cta__btn:active{transform:none}
}
/* Inline text-link button (enterprise pointers inside forms) */
.link-btn{background:none;border:0;padding:0;margin:0;font:inherit;color:var(--cobalt);font-weight:600;text-decoration:underline;cursor:pointer}
.link-btn:hover{text-decoration:none}
.link-btn:focus-visible{outline:none;box-shadow:var(--ring-cobalt);border-radius:4px}