/* ============================================================================
   NextDose.AI - marketing site. Original build. Premium, airy, teal-tinted.
   Structure/motion modeled on a modern app landing page; all content + code original.
   Token-driven: edit the :root block to restyle. Light palette only (no dark-mode block yet).
   ============================================================================ */
:root{
  --teal:#00B487; --teal-2:#00A079; --teal-ink:#053a2c; --teal-soft:rgba(0,180,135,.10);
  --blue:#4C8DFF; --violet:#8B7BFF; --pink:#FF8FB3;
  --ink:#0A0A0A; --ink-2:#48566B; --ink-3:#5C6880; --ink-4:#AEB6C4;
  --bg:#FFFFFF; --card:#FFFFFF; --card-2:#FBFCFE;
  --line:rgba(12,16,23,.08); --line-2:rgba(12,16,23,.14);
  --ok:#12B76A; --no:#D0D5DD; --warn:#F79009;
  --r-lg:30px; --r:22px; --r-sm:14px; --pill:999px;
  --shadow-sm:0 4px 18px rgba(24,38,66,.06);
  --shadow:0 22px 60px rgba(24,38,66,.10);
  --shadow-lg:0 40px 90px rgba(24,38,66,.16);
  --sans:'Inter',-apple-system,BlinkMacSystemFont,system-ui,'Segoe UI',Roboto,sans-serif;
  --mono:'SF Mono',ui-monospace,Menlo,Consolas,monospace;
  --ease:cubic-bezier(.22,.61,.36,1);
  --maxw:1120px;
  /* the reference's dark band, resolved from its lab() value: neutral #0F0F0F,
     no blue cast. #closer and #compare are adjacent, so both read from this. */
  --band-dark:#0F0F0F;
}
*{box-sizing:border-box;margin:0;padding:0}
html{scroll-behavior:smooth;-webkit-text-size-adjust:100%}
body{
  font-family:var(--sans);color:var(--ink);background:var(--bg);line-height:1.55;
  -webkit-font-smoothing:antialiased;letter-spacing:-.011em;overflow-x:hidden;
}
/* atmospheric pastel mesh, teal-leaning (NextDose) */
body::before{
  content:"";position:fixed;inset:0;z-index:-1;pointer-events:none;
  background:
    radial-gradient(circle at 0% 0%,   rgba(104,229,243,.42) 3%, rgba(0,0,0,0) 40%),
    radial-gradient(circle at 20% 0%,  rgba(92,196,245,.42) 3%, rgba(0,0,0,0) 40%),
    radial-gradient(circle at 40% 0%,  rgba(100,164,247,.42) 3%, rgba(0,0,0,0) 40%),
    radial-gradient(circle at 60% 0%,  rgba(122,139,245,.40) 3%, rgba(0,0,0,0) 40%),
    radial-gradient(circle at 80% 0%,  rgba(157,136,242,.38) 3%, rgba(0,0,0,0) 40%),
    radial-gradient(circle at 100% 0%, rgba(214,142,224,.36) 3%, rgba(0,0,0,0) 40%),
    #FFFFFF;
}
a{color:inherit;text-decoration:none}
img{max-width:100%;display:block}
button{font:inherit;cursor:pointer;border:0;background:none;color:inherit}
.wrap{max-width:var(--maxw);margin:0 auto;padding:0 24px}
.mono{font-family:var(--mono);font-variant-numeric:tabular-nums}
.kicker{font-family:var(--sans);text-transform:uppercase;letter-spacing:.14em;font-size:14px;font-weight:500;line-height:1.43;color:#0a7259}
.teal{color:var(--teal-2)}
.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);white-space:nowrap;border:0}
.skip{position:fixed;left:-9999px;top:8px;z-index:100;background:#0a0e14;color:#fff;padding:11px 18px;border-radius:10px;font-weight:650}
.skip:focus{left:16px}
a:focus-visible,button:focus-visible,.nav-link:focus-visible,.nav-cta:focus-visible,.badge:focus-visible,.cn-btn:focus-visible,.faq-q:focus-visible,.replay:focus-visible,[tabindex]:focus-visible{outline:2px solid var(--teal-2);outline-offset:3px;border-radius:8px}
.faq-q:focus-visible{outline-offset:-3px}
h1,h2,h3{letter-spacing:-.035em;line-height:1.05;font-weight:600;color:#0A0A0A}
section{position:relative}
/* .feature-hand deliberately bleeds past its column; clip at the section so the
   bleed never becomes a page-level horizontal scrollbar. */
.sec-pad{padding:104px 0;overflow-x:clip}
/* 56, not 72. A boundary costs BOTH sides, so 72 made every seam 144px of nothing on
   a screen 844px tall, and seven consecutive sections sit on the same white mesh with
   no rule and no colour change between them. That is a large part of why the page
   reads as a failed load. pep pays 64px a side but draws a border-t on nearly every
   section; nachoz pays on one side only. We were paying double for an invisible seam. */
@media(max-width:720px){
  .sec-pad{padding:56px 0}
  .sec-pad + .sec-pad{border-top:1px solid var(--line)}
  #closer{border-top:0}                                /* dark band: the colour change is the seam */
  #compare{border-top:1px solid rgba(255,255,255,.08)} /* closer and compare are both black */
  /* head margins that were never given a mobile value and ran their desktop number */
  #compare .compare-head{margin-bottom:32px}
  .privacy-head{margin-bottom:30px}
  .faq-head{margin-bottom:26px}
  .cta-box p{margin:12px auto 22px}
}

/* ---------- Mobile section menu ----------
   Below 720px .nav-links is hidden, which left the four section links with no
   route on a phone. The burger reveals them in a panel under the pill. */
.nav-burger{display:none}
.nav-menu{display:none}
@media(max-width:900px){
  .nav-burger{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:4px;
    width:34px;height:34px;border-radius:10px;flex:0 0 auto;padding:0;cursor:pointer;margin-left:5px;
    background:linear-gradient(180deg,#141b24,#0b0f15);border:1px solid transparent;
    box-shadow:0 3px 9px rgba(10,14,20,.24)}
  .nav-burger span{display:block;width:15px;height:1.6px;border-radius:2px;background:#fff;
    transition:transform .2s var(--ease)}
  .nav-burger[aria-expanded="true"] span:first-child{transform:translateY(2.8px) rotate(45deg)}
  .nav-burger[aria-expanded="true"] span:last-child{transform:translateY(-2.8px) rotate(-45deg)}
  /* A measured step away from the wordmark, NOT margin-left:auto - auto dumps
     every spare pixel of a fixed-width pill into this one gap. */
  .nav-ig{margin-left:6px}
  .nav-menu{display:grid;gap:2px;pointer-events:auto;margin-top:8px;padding:8px;
    width:min(calc(100vw - 24px),420px);border-radius:22px;
    background:rgba(255,255,255,.92);border:1px solid var(--line);box-shadow:var(--shadow);
    backdrop-filter:blur(16px) saturate(1.4);animation:navMenuIn .18s var(--ease) both}
  .nav-menu[hidden]{display:none}
  .nav-menu a{display:block;padding:12px 14px;border-radius:13px;font-size:15px;font-weight:600;color:var(--ink)}
  .nav-menu a:hover,.nav-menu a:active{background:rgba(12,16,23,.05)}
}
@keyframes navMenuIn{from{opacity:0;transform:translateY(-6px)}to{opacity:1;transform:none}}
@media(prefers-reduced-motion:reduce){.nav-menu{animation:none}}

/* ---------- Nav (floating pill) ---------- */
.nav{position:fixed;top:16px;left:0;right:0;z-index:50;display:flex;flex-direction:column;align-items:center;justify-content:flex-start;pointer-events:none}
.nav-inner{pointer-events:auto;display:flex;align-items:center;gap:8px;padding:8px 8px 8px 16px;border-radius:var(--pill);
  background:rgba(255,255,255,.72);border:1px solid var(--line);box-shadow:var(--shadow-sm);backdrop-filter:blur(16px) saturate(1.4);
  transition:box-shadow .3s var(--ease),background .3s}
.nav.scrolled .nav-inner{box-shadow:var(--shadow);background:rgba(255,255,255,.86)}
.nav-logo{display:flex;align-items:center;gap:9px;font-weight:800;letter-spacing:-.02em;font-size:15px;padding-right:8px}
.nav-logo .wm{white-space:nowrap}
.nav-logo .wm .teal{margin-left:0}
.nav-logo .mark{width:30px;height:30px;border-radius:8px;overflow:hidden;flex-shrink:0;box-shadow:0 3px 10px rgba(0,0,0,.22)}
.logo-img{display:block;width:100%;height:100%;object-fit:cover}
.nav-links{display:flex;gap:2px}
.nav-link{padding:9px 14px;border-radius:var(--pill);font-size:14px;font-weight:550;color:var(--ink-2);transition:.16s}
.nav-link:hover{color:var(--ink);background:rgba(12,16,23,.05)}
/* Instagram carries its own brand gradient rather than a flat icon; the
   magenta-to-violet run picks up the page's pastel mesh.
   SIZE CONTRACT: this matches .nav-logo .mark exactly - 30px box, 8px radius
   (28px / 7px below 720px, see the media query). Those three squares must stay
   in lockstep. They deliberately do NOT match .nav-cta, which is a taller
   36.9px pill on a 999px radius. */
.nav-ig{display:grid;place-items:center;width:30px;height:30px;border-radius:8px;flex:0 0 auto;
  color:#fff;
  background:radial-gradient(circle at 30% 107%,
    #FDF497 0%, #FDF497 5%, #FD5949 45%, #D6249F 60%, #285AEB 90%);
  box-shadow:0 3px 9px rgba(190,42,140,.26);
  transition:transform .16s var(--ease),box-shadow .16s var(--ease)}
.nav-ig svg{width:16px;height:16px;display:block}
.nav-ig:hover{transform:translateY(-1px);box-shadow:0 6px 14px rgba(190,42,140,.36)}
.nav-ig:focus-visible{outline:2px solid var(--teal-2);outline-offset:3px}
/* TikTok: same 30px / 8px box as .nav-ig and .nav-logo .mark above,
   carrying its own black-with-chromatic-offset brand mark. */
.nav-tt{display:grid;place-items:center;width:30px;height:30px;border-radius:8px;flex:0 0 auto;
  background:#010101;box-shadow:0 3px 9px rgba(10,14,20,.24);
  transition:transform .16s var(--ease),box-shadow .16s var(--ease)}
.nav-tt svg{width:15px;height:15px;display:block;overflow:visible}
.nav-tt:hover{transform:translateY(-1px);box-shadow:0 6px 14px rgba(254,44,85,.30)}
.nav-tt:focus-visible{outline:2px solid var(--teal-2);outline-offset:3px}
.nav-cta{padding:8px 16px;border-radius:var(--pill);font-size:13.5px;font-weight:600;color:#fff;
  background:linear-gradient(180deg,#141b24,#0b0f15);box-shadow:0 4px 12px rgba(10,14,20,.24);transition:transform .16s var(--ease)}
.nav-cta:hover{transform:translateY(-1px)}
@media(max-width:360px){.nav-logo .wm{display:none}}
@media(max-width:900px){
  .nav-links{display:none}
  .nav-inner{gap:5px;padding:7px 9px 7px 12px}
  .nav-logo{gap:7px;font-size:13.5px;padding-right:0}
  .nav-logo .mark{width:28px;height:28px;border-radius:8px}
  .nav-ig,.nav-tt{width:28px;height:28px;border-radius:8px}
  .nav-ig svg{width:15px;height:15px} .nav-tt svg{width:14px;height:14px}
  .nav-cta{padding:7px 11px;font-size:13px;white-space:nowrap}
}

/* ---------- Hero ---------- */
.hero{padding:150px 0 40px;text-align:center;position:relative;overflow-x:clip}
.hero-icon{width:96px;height:96px;margin:0 auto 30px;border-radius:24px;overflow:hidden;position:relative;
  box-shadow:0 20px 44px rgba(6,20,16,.34), inset 0 1px 0 rgba(255,255,255,.06)}
.hero-icon::after{content:"";position:absolute;inset:0;border-radius:24px;box-shadow:inset 0 0 0 1px rgba(255,255,255,.06)}
.hero-title{font-size:clamp(36px,7.4vw,64px);font-weight:600;letter-spacing:-.035em;color:#0A0A0A}
.hero-title .w{display:inline-block}
.hero-title .w:nth-child(1){color:var(--ink)}
.hero-title .w:nth-child(2){color:#0A0A0A}
.hero-title .w:nth-child(3){color:var(--ink)}
.hero-sub{max-width:560px;margin:22px auto 0;font-size:clamp(16px,2.4vw,19px);color:var(--ink-2);font-weight:450}
.hero-actions{display:flex;flex-direction:column;align-items:center;gap:10px}
.badge{display:inline-flex;align-items:center;gap:11px;padding:12px 20px;border-radius:16px;color:#fff;
  background:linear-gradient(180deg,#141b24,#0b0f15);box-shadow:0 12px 30px rgba(10,14,20,.3);transition:transform .18s var(--ease)}
.badge:hover{transform:translateY(-2px)}
.badge .ap{width:26px;height:26px}
.badge .bx{display:flex;flex-direction:column;line-height:1.1;text-align:left}
.badge .bx small{font-size:10px;opacity:.8;letter-spacing:.02em}
.badge .bx b{font-size:17px;font-weight:650;letter-spacing:-.01em}
.hero-phone{margin:50px auto 0;position:relative;width:min(320px,78vw);animation:floaty 6s ease-in-out infinite}
.hero-phone .phone{position:relative;z-index:1}
@keyframes floaty{0%,100%{transform:translateY(0)}50%{transform:translateY(-12px)}}
.oneliner{max-width:640px;margin:44px auto 0;text-align:center;font-size:clamp(19px,3vw,25px);font-weight:650;letter-spacing:-.02em;color:var(--ink)}
.oneliner span{color:var(--ink-3)}

/* ---------- CSS iPhone frame + screenshot placeholder ---------- */
.phone{position:relative;aspect-ratio:9/19.3;border-radius:44px;padding:11px;
  background:linear-gradient(160deg,#1b2029,#0c0f14);box-shadow:var(--shadow-lg), inset 0 0 0 2px rgba(255,255,255,.05);}
.phone::before{content:"";position:absolute;top:16px;left:50%;transform:translateX(-50%);width:34%;height:22px;border-radius:99px;background:#05070a;z-index:3}
/* A real screenshot already contains the Dynamic Island, so drop the drawn one. */
.phone.has-shot::before{display:none}
.phone-screen{position:relative;width:100%;height:100%;border-radius:34px;overflow:hidden;background:#0A0E14}
.screen-ph{position:absolute;inset:0;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:10px;
  background:
    radial-gradient(70% 40% at 50% 0%, rgba(0,229,160,.14), transparent 60%),
    linear-gradient(180deg,#0d141d,#0A0E14);color:#5f6b7a;text-align:center;padding:24px}
.screen-ph .ico{width:38px;height:38px;opacity:.5}
.screen-ph b{font-size:13px;color:#8b97a7;font-weight:600}
.screen-ph small{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:#556}
.screen-ph img{position:absolute;inset:0;width:100%;height:100%;object-fit:cover}

/* ---------- Trust strip ---------- */
.trust{padding-top:22px;padding-bottom:8px}
.trust .kicker{text-align:center;display:block;margin-bottom:20px;color:var(--ink-2)}
.trust-row{display:grid;grid-template-columns:repeat(3,1fr);gap:14px}
.trust-badge{display:flex;flex-direction:column;align-items:center;justify-content:flex-end;text-align:center;gap:13px;
  padding:22px 14px 20px;border-radius:var(--r);
  background:rgba(255,255,255,.6);border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.trust-badge .tb-badge{display:flex;align-items:center;justify-content:center;height:78px;line-height:0}
.trust-badge .tb-badge img{max-height:100%;max-width:100%;width:auto;height:auto;display:block}
/* a round seal reads smaller than a wide lockup at equal height, so give it more */
.trust-badge.is-round .tb-badge img{max-height:78px}
.trust-badge:not(.is-round) .tb-badge img{max-height:56px}
.trust-badge span{font-size:12px;color:var(--ink-2)}
@media(max-width:720px){
  .trust-row{grid-template-columns:1fr;gap:10px}
  .trust-badge{flex-direction:row;justify-content:flex-start;gap:14px;text-align:left;padding:14px 16px}
  .trust-badge .tb-badge{height:46px;flex:0 0 auto}
  .trust-badge.is-round .tb-badge img{max-height:46px}
  .trust-badge:not(.is-round) .tb-badge img{max-height:38px}
}

/* ---------- Feature section (text + phone) ---------- */
.feature{display:grid;grid-template-columns:1.05fr .95fr;gap:56px;align-items:center}
.feature.rev{direction:rtl}.feature.rev>*{direction:ltr}
.feature-title{font-size:clamp(32px,5vw,64px);letter-spacing:-.035em;line-height:1.05;margin:18px 0 20px}
.feature-body{color:var(--ink-2);font-size:18px;line-height:1.625;letter-spacing:normal;max-width:490px}
.feature-list{margin-top:26px;display:grid;grid-template-columns:1fr 1fr;gap:12px}
.feature-list li{list-style:none;display:flex;align-items:center;gap:10px;font-size:14.5px;font-weight:550;color:var(--ink)}
.feature-list li::before{content:"";width:20px;height:20px;flex-shrink:0;border-radius:7px;background:var(--teal-soft);
  background-image:url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 24 24' fill='none' stroke='%2300A079' stroke-width='3' stroke-linecap='round' stroke-linejoin='round'><path d='M20 6L9 17l-5-5'/></svg>");background-size:13px;background-repeat:no-repeat;background-position:center}
.feature-media{display:flex;justify-content:center}
.feature-media .phone{width:min(300px,72vw)}
@media(max-width:860px){.feature{grid-template-columns:1fr;gap:36px}.feature.rev{direction:ltr}.feature-list{max-width:460px}}
@media(max-width:520px){.feature-list{grid-template-columns:1fr}}

/* ---------- Closer look carousel ----------
   Matched to the reference's dark band: near-black section, cards at
   rgba(255,255,255,.06) / 32px radius holding title -> phone + replay ->
   caption, and circular arrows floated over the rail edges. */
#closer{--c-ink:#fff; --c-ink-2:rgba(255,255,255,.55); --c-teal:#00E5A0;
  background:var(--band-dark);color:var(--c-ink);padding:56px 0 96px;isolation:isolate}
#closer .kicker{color:var(--c-teal)}
.closer-head{text-align:center;max-width:760px;margin:0 auto 52px}
.closer-head h2{font-size:clamp(38px,6.2vw,74px);line-height:1.05;letter-spacing:-.035em;
  font-weight:600;color:var(--c-ink);margin:20px 0 22px;text-wrap:balance}
.closer-head p{color:rgba(255,255,255,.6);font-size:clamp(17px,1.6vw,20px);line-height:1.625;
  letter-spacing:normal;max-width:600px;margin:0 auto}
.carousel{display:flex;gap:22px;overflow-x:auto;scroll-snap-type:x mandatory;padding:6px clamp(24px,10vw,150px) 16px;
  margin:0;max-width:100%;-webkit-overflow-scrolling:touch;scrollbar-width:none;overscroll-behavior-x:contain}
.carousel::-webkit-scrollbar{display:none}
.slide{scroll-snap-align:center;flex:0 0 auto;width:448px;margin:0;padding:20px;
  display:flex;flex-direction:column;align-items:center;text-align:center;
  border-radius:32px;background:rgba(255,255,255,.06)}
.slide-title{font-size:24px;font-weight:600;letter-spacing:-.025em;line-height:1.2;
  color:#fff;padding:12px 12px 20px;margin:0}
.slide-media{display:flex;flex-direction:column;align-items:center;gap:18px;width:100%}
.slide .phone{width:250px}
.slide-cap{padding:20px 12px 8px;margin:0}
.slide-cap p{font-size:16px;line-height:1.625;color:var(--c-ink-2);margin:0}
.replay{display:inline-flex;align-items:center;gap:7px;padding:8px 16px;border-radius:var(--pill);
  font-size:12px;font-weight:500;color:#fff;background:rgba(255,255,255,.1);
  border:1px solid rgba(255,255,255,.15);transition:background .16s var(--ease)}
.replay:hover{background:rgba(255,255,255,.18)}
.replay svg{width:13px;height:13px}
.carousel-wrap{position:relative}
.cn-btn{position:absolute;top:50%;transform:translateY(-50%);z-index:3;
  width:52px;height:52px;border-radius:50%;display:grid;place-items:center;
  background:rgba(26,26,26,.8);border:1px solid rgba(255,255,255,.14);color:#fff;
  backdrop-filter:blur(10px);transition:background .16s var(--ease),border-color .16s var(--ease)}
.cn-prev{left:24px} .cn-next{right:24px}
.cn-btn:hover{background:rgba(46,46,46,.92);border-color:var(--c-teal)}
@media(max-width:720px){
  #closer{padding:40px 0 36px}
  .closer-head{margin-bottom:28px}
  .carousel{gap:14px;padding:6px 16px 14px}
  .slide{width:min(320px,86vw);padding:16px}
  .slide-title{font-size:20px;padding:8px 8px 16px}
  .slide .phone{width:200px}
  .slide-cap{padding:16px 6px 4px}
  .slide-cap p{font-size:14.5px}
  .cn-btn{width:44px;height:44px}
  .cn-prev{left:6px} .cn-next{right:6px}
}
.cn-btn svg{width:18px;height:18px}
.slide.pulse .phone{animation:pulse .6s var(--ease)}
@keyframes pulse{0%{transform:scale(1)}40%{transform:scale(1.03)}100%{transform:scale(1)}}

/* ---------- Comparison matrix ---------- */
.compare-head{text-align:center;max-width:640px;margin:0 auto 40px}
.compare-head h2{font-size:clamp(30px,5vw,50px);margin:12px 0 14px}
.compare-head p{color:var(--ink-2);font-size:17px}
/* overflow-x:auto silently computes overflow-y to auto as well, which raised a
   phantom vertical scrollbar next to the sticky thead. Only the horizontal axis
   ever scrolls here, so pin the block axis shut. */
.ctable-wrap{overflow-x:auto;overflow-y:hidden;border-radius:var(--r-lg);border:1px solid var(--line);background:var(--card);box-shadow:var(--shadow);margin:0 -4px}
/* 560, down from 680. That floor was sized for four columns; with three it just
   forced a wider sideways drag on phones than the table actually needs. */
.ctable{width:100%;border-collapse:collapse;min-width:560px}
.ctable thead th{position:sticky;top:0;background:var(--card);z-index:2}
.ctable th,.ctable td{padding:16px 18px;text-align:center;border-bottom:1px solid var(--line);font-size:14px}
.ctable th:first-child,.ctable td:first-child{text-align:left;font-weight:600;color:var(--ink);width:34%;min-width:220px}
.ctable thead th{padding:22px 18px 20px;font-weight:700;letter-spacing:-.01em;color:var(--ink-2);font-size:14px;vertical-align:bottom}
.ctable .col-hl{color:var(--ink)}
.ctable thead .col-hl{position:relative}
.ctable .hl-brand{display:inline-flex;flex-direction:column;align-items:center;gap:9px;
  padding:13px 20px 12px;border-radius:20px;
  background:linear-gradient(180deg,#0f1620,#0a0e14);color:#fff;box-shadow:0 8px 20px rgba(10,14,20,.3)}
.ctable .hl-brand .hl-logo{width:38px;height:38px;border-radius:9px;display:block;flex:0 0 auto}
.ctable .hl-brand .hl-word{font-size:13px;font-weight:700;letter-spacing:-.01em;line-height:1;white-space:nowrap}
.ctable td.col-hl{background:linear-gradient(180deg, rgba(0,180,135,.06), rgba(0,180,135,.03))}
.ctable tbody tr:last-child td{border-bottom:0}
.ctable tbody tr:hover td{background:rgba(12,16,23,.02)}
.ctable tbody tr:hover td.col-hl{background:rgba(0,180,135,.09)}
.ck{display:inline-grid;place-items:center;width:24px;height:24px;border-radius:8px;font-weight:800;font-size:14px;line-height:1}
.ck.yes{color:#fff;background:#0E9D5A}
.ck.yes::after{content:"✓"}
.ck.partial{color:#B45309;background:rgba(247,144,9,.18)}
.ck.partial::after{content:"–";font-size:17px}
.ck.no{color:#6B7480}
.ck.no::after{content:"×";font-size:16px}
.price-line{display:flex;align-items:center;gap:20px;flex-wrap:wrap;justify-content:center;margin-top:26px;padding:22px 26px;border-radius:var(--r);background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.pl-main{display:flex;align-items:baseline;gap:4px}
.pl-amt{font-size:30px;font-weight:800;letter-spacing:-.03em}
.pl-per{color:var(--ink-3);font-weight:600}
.pl-alt{color:var(--ink-2);font-size:14px}
.pl-cta{margin-left:auto;padding:12px 22px;border-radius:var(--pill);color:#fff;font-weight:650;background:linear-gradient(180deg,#141b24,#0b0f15);box-shadow:0 8px 20px rgba(10,14,20,.25);transition:transform .16s var(--ease)}
.pl-cta:hover{transform:translateY(-1px)}
@media(max-width:560px){.price-line{justify-content:center;text-align:center}.pl-cta{margin-left:0;width:100%;text-align:center}}
.compare-foot{text-align:center;margin-top:18px;font-size:13px;color:var(--ink-2)}
.compare-foot a{color:#0a7259;font-weight:600}

/* ---------- Comparison matrix: dark treatment (matches the reference's dark band) ---------- */
/* --teal (#00B487) is tuned for the light sections. On dark, use the app's own
   accent so this band matches nextdose.ai and the iOS app exactly. */
#compare{--d-ink:#fff; --d-ink-2:rgba(255,255,255,.60); --d-ink-3:rgba(255,255,255,.42);
  --d-line:rgba(255,255,255,.085); --d-surface:rgba(255,255,255,.055); --d-teal:#00E5A0;
  background:var(--band-dark);color:var(--d-ink);padding:128px 0 108px;position:relative;isolation:isolate}
/* Typography matched to the reference band: Inter 14/500 at .14em for the kicker
   (the site default is SF Mono 12/600), 600 weight + -.035em + 1.05 for the
   headline, and 20px/1.625 with NO negative tracking for the deck. Scoped to
   #compare so the other sections keep the site's existing mono kicker. */
#compare .kicker{color:var(--d-teal)}
#compare .compare-head{max-width:760px;margin:0 auto 46px}
#compare .compare-head h2{font-size:clamp(38px,6.2vw,74px);line-height:1.05;letter-spacing:-.035em;
  font-weight:600;color:var(--d-ink);margin:20px 0 22px;text-wrap:balance}
#compare .compare-head p{color:var(--d-ink-2);font-size:clamp(17px,1.6vw,20px);line-height:1.625;
  letter-spacing:normal;max-width:620px;margin:0 auto}

#compare .ctable-wrap{background:var(--d-surface);border:1px solid var(--d-line);border-radius:32px;
  box-shadow:0 40px 90px rgba(0,0,0,.45)}
#compare .ctable thead th{background:#12181F;color:var(--d-ink-2)}
#compare .ctable th,#compare .ctable td{border-bottom:1px solid var(--d-line)}
#compare .ctable th:first-child,#compare .ctable td:first-child{color:var(--d-ink)}
#compare .ctable .col-hl{color:var(--d-ink)}
#compare .ctable .hl-brand{background:rgba(255,255,255,.085);border:1px solid rgba(0,229,160,.34);
  color:#fff;box-shadow:0 0 26px rgba(0,229,160,.16)}
#compare .ctable .hl-brand .hl-logo{box-shadow:0 0 0 1px rgba(255,255,255,.16)}
#compare .ctable thead .col-hl{vertical-align:middle;padding-top:18px;padding-bottom:16px}
#compare .ctable td.col-hl{background:linear-gradient(180deg, rgba(0,229,160,.12), rgba(0,229,160,.05))}
#compare .ctable tbody tr:hover td{background:rgba(255,255,255,.035)}
#compare .ctable tbody tr:hover td.col-hl{background:rgba(0,229,160,.17)}
#compare .ck.yes{background:#00C88B;color:#06231A}
#compare .ck.partial{color:#FFC98A;background:rgba(247,144,9,.22)}
#compare .ck.no{color:rgba(255,255,255,.34)}

/* ---------- Plan cards (design lifted from the live nextdose.ai pricing block
   so the two sites read as one product: same #161B22/.6 glass, 24px radius,
   teal #00E5A0 ring on the featured card, gradient CTA) ---------- */
/* Two equal columns, centred content, equal height. The earlier flex version
   let the annual card grow wider than its content, which left a large dead
   zone on its right and made the pair read as unbalanced. Everything else on
   this page is centre-aligned, so the cards are too. */
.plan-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px;max-width:700px;margin:52px auto 0}
.plan{position:relative;display:flex;flex-direction:column;align-items:center;justify-content:center;
  text-align:center;padding:34px 26px;border-radius:26px;
  background:rgba(255,255,255,.035);border:1px solid rgba(255,255,255,.07);
  box-shadow:0 10px 34px rgba(0,0,0,.24)}

/* --- Monthly: same footprint, deliberately quieter --- */
.plan:not(.is-best) h3{color:var(--d-ink-2)}
.plan:not(.is-best) .plan-amt{color:var(--d-ink-2)}

/* --- Annual: tinted, ringed, with a soft breathing halo (no hard neon ring) --- */
.plan.is-best{background:rgba(0,229,160,.045);border-color:rgba(0,229,160,.5)}
/* The halo lives on a pseudo-element: .plan already carries the scroll-driven
   reveal animation, and a second `animation` on the element itself would
   clobber its animation-name and timeline. */
.plan.is-best::before{content:"";position:absolute;inset:0;border-radius:inherit;pointer-events:none;
  animation:planHalo 4s ease-in-out infinite}
@keyframes planHalo{
  0%,100%{box-shadow:0 0 26px rgba(0,229,160,.10)}
  50%    {box-shadow:0 0 54px rgba(0,229,160,.22)}
}
.plan-badge{position:absolute;top:-10px;left:50%;transform:translateX(-50%);
  padding:5px 14px;border-radius:var(--pill);white-space:nowrap;
  background:linear-gradient(135deg,#00E5A0,#00C488);color:#062A1F;
  font-size:9.5px;font-weight:800;letter-spacing:.11em;text-transform:uppercase;
  box-shadow:0 5px 14px rgba(0,229,160,.28)}
.plan h3{font-size:20px;font-weight:800;letter-spacing:-.015em;color:#F0F6FC;margin:0 0 4px}
.plan-sub,.plan-compare{font-size:13.5px;color:var(--d-ink-2);margin:0}
/* the paywall strikes this through in red, but red appears nowhere else on this
   site; muted grey reads as "not the price you pay" without breaking the palette */
.plan-compare s{color:var(--d-ink-3);text-decoration-color:rgba(255,255,255,.4);font-weight:600;margin-right:2px}
.plan-amt{margin-top:16px;font-size:42px;font-weight:800;letter-spacing:-.04em;line-height:1;color:#F0F6FC}
.plan-amt span{font-size:15px;font-weight:500;letter-spacing:normal;color:#8B949E}
.plan-amt.is-hero{color:var(--d-teal)}
.plan-amt.is-hero span{color:rgba(0,229,160,.75)}
.plan-note{font-size:13px;color:#8B949E;margin:10px 0 0}
.plan-note.is-bright{color:#C9D1D9}
.plan-free{display:inline-block;margin-top:16px;padding:6px 15px;border-radius:var(--pill);
  border:1px solid rgba(0,229,160,.35);background:rgba(0,229,160,.09);
  color:var(--d-teal);font-size:12.5px;font-weight:700;white-space:nowrap}
.plan-cta{max-width:700px;margin:20px auto 0}
.plan-btn{display:block;width:100%;padding:16px;border-radius:12px;text-align:center;
  background:linear-gradient(135deg,#00E5A0,#00C488);color:#0D1117;font-size:16px;font-weight:800;
  box-shadow:0 6px 24px rgba(0,229,160,.2);transition:transform .16s var(--ease),box-shadow .16s var(--ease)}
.plan-btn:hover{transform:translateY(-2px);box-shadow:0 10px 30px rgba(0,229,160,.3)}
.plan-fine{text-align:center;font-size:12.5px;color:#8B949E;margin-top:11px}
@media(max-width:640px){
  /* annual first on mobile: it is the offer we lead with */
  .plan-grid{grid-template-columns:1fr;gap:22px;margin-top:44px}
  .plan.is-best{order:-1}
  .plan{padding:30px 22px}
  .plan-amt{font-size:38px}
}
#compare .compare-foot{color:var(--d-ink-3);margin-top:22px}
#compare .compare-foot a{color:var(--d-teal)}
#compare .ctable-wrap:focus-visible{outline-color:var(--d-teal)}
@media(max-width:720px){
  #compare{padding:40px 0 56px}
  #compare .ctable th:first-child,#compare .ctable td:first-child{background:#12181F;box-shadow:1px 0 0 var(--d-line)}
}

/* ---------- Home screen section ---------- */
.home-grid{display:grid;grid-template-columns:1fr 1fr;gap:56px;align-items:center}
.home-text h2{font-size:clamp(32px,5vw,64px);letter-spacing:-.035em;line-height:1.05;margin:18px 0 20px}
.home-text p{color:var(--ink-2);font-size:18px;line-height:1.7;letter-spacing:normal;max-width:470px;margin-bottom:14px}
.home-lede{font-weight:600;color:var(--ink)}
.home-list{margin-top:22px;display:grid;grid-template-columns:1fr;gap:11px}
/* ---- Home-screen trio: three real screenshots, fanned like the reference's
   phone pairs (flex row, ~20px gap, the lead phone larger and forward).
   Each drifts at its own rate on a view() timeline, with the ranges staggered
   the way the reference staggers its word reveals. ---- */
.hs-phones{display:flex;align-items:center;justify-content:center;gap:0;
  /* the trio bleeds right past its column; the vw term is the real room between
     the group's left edge (~50vw) and the viewport, so nothing gets cut */
  width:min(766px,152%,calc(50vw - 28px));max-width:none;margin-left:-6%}
.hs-phone{flex:0 0 auto;position:relative}
.hs-phone img{width:100%;height:auto;display:block}
.hs-side{width:34%;z-index:1;filter:drop-shadow(0 22px 34px rgba(23,26,58,.20))}
.hs-side:first-child{margin-right:-4%}
.hs-side:last-child{margin-left:-4%}
.hs-lead{width:40%;z-index:2;filter:drop-shadow(0 34px 52px rgba(23,26,58,.28))}

/* No per-phone animation. Animating transform:scale() on these forces the
   browser to re-rasterise each screenshot at fractional sizes every frame,
   which visibly softens the fine UI text inside them. Section-level reveals
   elsewhere are fine; these render sharp and static. */
/* Below 860 the fan becomes one phone at a time in a snap scroller, which is pep's
   own mobile pattern: a fixed "aspect-[1/2] w-[260px]" card in a rail, never three
   desktop-proportioned phones shrunk to fit.
   The fan sized itself from calc(50vw - 28px), the room beside a centred desktop
   column, which means nothing once .home-grid collapses to one column. It rendered
   the flagship blood-level chart 145px wide from a 900px file, a 6.2x downscale,
   with every label inside it 3 to 5px tall.
   justify-content:flex-start is load-bearing. The centre inherited from the base rule
   puts half the overflow LEFT of the scroll origin where no gesture reaches it. */
@media(max-width:860px){
  .hs-phones{display:flex;justify-content:flex-start;align-items:flex-start;
    width:auto;max-width:none;margin:0 calc(50% - 50vw);
    overflow-x:auto;overscroll-behavior-x:contain;scroll-snap-type:x mandatory;
    scroll-padding-inline-start:24px;scrollbar-width:none;
    gap:14px;padding:6px 24px 10px}
  .hs-phones::-webkit-scrollbar{display:none}
  .hs-phone{flex:0 0 auto;width:250px;scroll-snap-align:start}
  /* the -4% overlaps that make the fan read as a fan are (0,2,0), so they have to be
     named by hand to be cleared */
  .hs-side,.hs-lead,.hs-side:first-child,.hs-side:last-child{width:250px;margin:0}
}
.widget{border-radius:22px;background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow);padding:18px;align-self:center;width:210px}
.widget .wk{font-family:var(--mono);font-size:10px;letter-spacing:.1em;text-transform:uppercase;color:var(--ink-3)}
.widget .wv{font-size:22px;font-weight:800;letter-spacing:-.03em;margin-top:8px}
.widget .wsub{font-size:12.5px;color:var(--ink-2);margin-top:4px}
.widget .bar{height:8px;border-radius:99px;background:var(--teal-soft);margin-top:14px;overflow:hidden}
.widget .bar>i{display:block;height:100%;background:linear-gradient(90deg,var(--teal-2),var(--teal));border-radius:99px}
@media(max-width:860px){.home-grid{grid-template-columns:1fr;gap:34px}.home-media{flex-direction:column;align-items:center}}

/* ---------- Privacy ---------- */
.privacy-head{text-align:center;max-width:600px;margin:0 auto 44px}
.privacy-head h2{font-size:clamp(30px,5vw,50px);margin:12px 0 14px}
.privacy-head p{color:var(--ink-2);font-size:17px}
.privacy-cards{display:grid;grid-template-columns:repeat(3,1fr);gap:18px}
.pcard{border-radius:var(--r);background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-sm);padding:26px}
.pcard .pc-ic{width:44px;height:44px;border-radius:13px;display:grid;place-items:center;background:var(--teal-soft);color:var(--teal-2);margin-bottom:18px}
.pcard .pc-ic svg{width:22px;height:22px}
.pcard .kicker{font-size:11px;margin-bottom:8px}
.pcard h3{font-size:19px;font-weight:750;letter-spacing:-.02em;margin-bottom:8px}
.pcard p{font-size:14px;color:var(--ink-2)}
@media(max-width:860px){.privacy-cards{grid-template-columns:1fr}}

/* ---------- CTA ---------- */
.cta{text-align:center}
.cta-box{border-radius:var(--r-lg);padding:64px 32px;position:relative;overflow:hidden;
  background:linear-gradient(160deg,#0f1620,#0a0e14);box-shadow:var(--shadow-lg)}
.cta-box::before{content:"";position:absolute;inset:0;pointer-events:none;
  background:radial-gradient(60% 60% at 20% 0%, rgba(0,229,160,.20), transparent 60%),radial-gradient(50% 60% at 100% 100%, rgba(76,141,255,.16), transparent 60%)}
.cta-box h2{position:relative;font-size:clamp(30px,5vw,52px);color:#fff}
.cta-box p{position:relative;color:rgba(255,255,255,.72);font-size:17px;margin:16px auto 30px;max-width:460px}
.cta-box .badge{position:relative}

/* ---------- FAQ ---------- */
.faq-head{text-align:center;margin:0 auto 40px}
.faq-head h2{font-size:clamp(30px,5vw,50px);margin-top:12px}
.faq-list{max-width:760px;margin:0 auto;display:flex;flex-direction:column;gap:12px}
.faq-item{border-radius:var(--r);background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-sm);overflow:hidden}
.faq-q{width:100%;display:flex;align-items:center;justify-content:space-between;gap:16px;padding:20px 22px;text-align:left;font-size:16.5px;font-weight:650;letter-spacing:-.01em}
.faq-q .pm{flex-shrink:0;width:26px;height:26px;border-radius:8px;display:grid;place-items:center;background:var(--teal-soft);color:var(--teal-2);transition:transform .28s var(--ease);font-size:18px;font-weight:400}
.faq-item.open .faq-q .pm{transform:rotate(45deg)}
.faq-a{max-height:0;overflow:hidden;visibility:hidden;transition:max-height .34s var(--ease),visibility 0s linear .34s}
.faq-item.open .faq-a{visibility:visible;transition:max-height .34s var(--ease),visibility 0s}
.faq-a p{padding:0 22px 22px;color:var(--ink-2);font-size:15px}
main:focus{outline:none}
.slide{scroll-margin-top:88px}
.ctable-wrap:focus-visible{outline:2px solid var(--teal-2);outline-offset:2px}



/* ---------- Reviews marquee ----------
   Deliberately has NO background: body::before is a fixed pastel mesh, so an
   unpainted section shows the same gradient as the hero. That keeps the page to
   one light run and one dark run instead of alternating slabs.
   Cards reuse the light card recipe (--card / --line / --shadow-sm) so they read
   as the same family as .faq-item and .trust-badge. */
#reviews{padding:96px 0 88px;overflow-x:clip}
/* .closer-head is a DARK-band component - its <p> is white and its font-size is
   clamped for that band. Reusing the layout here is fine, but the colours have to
   be re-stated for a light background, and they must win on specificity. Scoped
   to #reviews so the dark sections that depend on the shared rule are untouched. */
#reviews .closer-head p{color:var(--ink-2)}
#reviews .closer-head .rv-proof{margin-top:20px;font-size:15px;color:var(--ink-2)}
#reviews .closer-head .rv-proof b{color:var(--ink);font-weight:650}
.rv-marquee{margin-top:8px}
/* Finger-driven, not a marquee. Both references hand their mobile card rail to the
   thumb and neither animates one. pepaiapp.com: "flex snap-x snap-mandatory gap-5
   overflow-x-auto" around "w-[240px] shrink-0 snap-start". nachoz.app: "snap-x
   snap-mandatory ... overflow-x-auto px-5" around "w-[78vw] max-w-sm shrink-0
   snap-center".

   The old rail was a CSS marquee inside overflow:hidden. Measured at 390px: 2636px
   of track in a 390px window, so 2246px of it could not be reached by any gesture,
   drifting at 27.5px/s, which left a whole card on screen for only 78px of every
   332px of travel while the longest quote runs 304 characters. A quote sliced at
   both edges that you cannot grab, stop or scroll back to is what "reviews are not
   loading properly" actually looks like. */
.rv-row{overflow-x:auto;overscroll-behavior-x:contain;-webkit-overflow-scrolling:touch;
  scroll-snap-type:x mandatory;scroll-padding-inline-start:24px;scrollbar-width:none}
.rv-row::-webkit-scrollbar{display:none}
/* The 24px inline gutter lives on the TRACK, not the scrollport, and width:max-content
   makes it part of the scrollable width, so the last card keeps a real end gutter.
   24px is .wrap's own padding, so card one lines up with the heading above it.
   align-items:flex-start stops a short quote being stretched to the tallest card. */
.rv-track{display:flex;gap:16px;width:max-content;align-items:flex-start;
  padding:4px 24px 18px}
/* 78vw is nachoz's own mobile card width. 390 x .78 = 304px, so the next card peeks
   46px past it and the swipe is self-evident. The 320px cap keeps that peek on a
   430px phone. */
.rv-slide{flex:0 0 auto;width:78vw;max-width:320px;margin:0;scroll-snap-align:start;
  display:flex;flex-direction:column;gap:11px;padding:22px 24px 20px;
  border-radius:var(--r);background:var(--card);border:1px solid var(--line);
  box-shadow:var(--shadow-sm)}
.rv-stars{color:var(--teal-2);font-size:14px;letter-spacing:.15em;line-height:1}
.rv-head{font-size:16px;font-weight:650;letter-spacing:-.015em;color:var(--ink);margin:0}
.rv-quote{margin:0;font-size:15px;line-height:1.6;color:var(--ink-2);letter-spacing:normal}
.rv-who{display:flex;align-items:center;gap:11px;margin-top:auto;padding-top:6px}
.rv-av{flex:0 0 auto;width:34px;height:34px;border-radius:50%;display:grid;place-items:center;
  background:var(--teal-soft);color:var(--teal-2);font-size:14px;font-weight:700}
.rv-meta{display:flex;flex-direction:column;gap:1px;min-width:0}
.rv-meta b{font-size:14px;font-weight:600;color:var(--ink);letter-spacing:-.01em}
.rv-meta small{font-size:12.5px;color:var(--ink-3,var(--ink-2))}
@media(max-width:720px){
  /* 44 at the bottom, not 60: .rv-track already carries 18px of its own, so 62px
     sits under the last card. */
  #reviews{padding:56px 0 44px}
  .rv-slide{padding:20px 20px 18px}
}

/* ---------- Footer ---------- */
/* footer styles live in the Legal/Footer block at the end of this file */

/* ---------- mobile refinements ---------- */
@media(max-width:720px){
  .hero{padding-top:122px}
  /* comparison: keep the feature column pinned while the 4 columns scroll horizontally */
  .ctable th:first-child,.ctable td:first-child{position:sticky;left:0;z-index:1;background:var(--card);min-width:152px;width:auto;box-shadow:1px 0 0 var(--line)}
  .ctable thead th:first-child{z-index:3}
  .ctable th,.ctable td{padding:14px 12px}
  .cta-box{padding:48px 22px}
}

/* ---------- Scroll reveal ---------- */
/* ---------- scroll-reveal system (fade-up, 3D tilt, scale, slide) ---------- */
.reveal,.rv-tilt,.rv-scale,.rv-left,.rv-right,.rv-pop{
  transition:opacity .85s var(--ease), transform .85s var(--ease);
  transition-delay:var(--d,0ms); will-change:transform,opacity}
.reveal{opacity:0;transform:translateY(26px)}
.reveal.in{opacity:1;transform:none}
/* images tilt up into place, like the reference */
.rv-tilt{opacity:0;transform:perspective(1400px) rotateX(26deg) translateY(46px) scale(.97);transform-origin:50% 100%}
.rv-tilt.in{opacity:1;transform:perspective(1400px) rotateX(0deg) translateY(0) scale(1)}
.rv-scale{opacity:0;transform:scale(.88)}
.rv-scale.in{opacity:1;transform:none}
.rv-pop{opacity:0;transform:scale(1.16)}
.rv-pop.in{opacity:1;transform:none}
.rv-left{opacity:0;transform:translateX(-52px) scale(.96)}
.rv-right{opacity:0;transform:translateX(52px) scale(.96)}
.rv-left.in,.rv-right.in{opacity:1;transform:none}
@media(max-width:720px){
  .rv-left,.rv-right{transform:translateY(26px) scale(.98)}
  .rv-tilt{transform:perspective(1200px) rotateX(18deg) translateY(30px)}
}

/* ---------- scroll-DRIVEN mode ----------
   The class-gated fallback above fires once and latches. When the browser has
   scroll-driven animations, `html.sdrive` swaps every reveal onto a view()
   timeline instead: progress is bound to the element's position in the
   viewport, so it tracks the scrollbar in both directions and never latches.
   Staggering moves from transition-delay (ignored by scroll timelines) to a
   per-item shift of the animation range via --rs. */
html.sdrive .reveal:not(.no-sd),
html.sdrive .rv-tilt:not(.no-sd),
html.sdrive .rv-scale:not(.no-sd),
html.sdrive .rv-left:not(.no-sd),
html.sdrive .rv-right:not(.no-sd),
html.sdrive .rv-pop:not(.no-sd){
  transition:none;
  animation-duration:1ms;             /* required for the range to resolve; timeline drives it */
  animation-timing-function:var(--ease);
  animation-fill-mode:both;
  animation-timeline:view();
  /* `cover` (not `entry`) so the travel scales with the VIEWPORT, not the
     element. Entry ranges make a 60px card finish in ~35px of scroll, which
     reads as a pop; cover gives every element the same unhurried distance. */
  animation-range:cover calc(2% + var(--rs,0%)) cover calc(34% + var(--rs,0%));
}
html.sdrive .reveal:not(.no-sd)  {animation-name:rvUp}
html.sdrive .rv-tilt:not(.no-sd) {animation-name:rvTilt}
html.sdrive .rv-scale:not(.no-sd){animation-name:rvScale}
html.sdrive .rv-pop:not(.no-sd)  {animation-name:rvPop}
html.sdrive .rv-left:not(.no-sd) {animation-name:rvLeft}
html.sdrive .rv-right:not(.no-sd){animation-name:rvRight}
/* a full-screen block's cover phase is long, so tighten it or it lags the scroll */
html.sdrive .rv-tall{animation-range:cover 1% cover 20%}

@keyframes rvUp   {from{opacity:0;transform:translateY(26px)}                to{opacity:1;transform:none}}
@keyframes rvScale{from{opacity:0;transform:scale(.88)}                     to{opacity:1;transform:none}}
@keyframes rvPop  {from{opacity:0;transform:scale(1.16)}                    to{opacity:1;transform:none}}
@keyframes rvLeft {from{opacity:0;transform:translateX(-52px) scale(.96)}   to{opacity:1;transform:none}}
@keyframes rvRight{from{opacity:0;transform:translateX(52px) scale(.96)}    to{opacity:1;transform:none}}
@keyframes rvTilt {
  from{opacity:0;transform:perspective(1400px) rotateX(26deg) translateY(46px) scale(.97)}
  to  {opacity:1;transform:perspective(1400px) rotateX(0deg)  translateY(0)    scale(1)}
}
@media(max-width:720px){
  @keyframes rvLeft {from{opacity:0;transform:translateY(26px) scale(.98)} to{opacity:1;transform:none}}
  @keyframes rvRight{from{opacity:0;transform:translateY(26px) scale(.98)} to{opacity:1;transform:none}}
  @keyframes rvTilt {
    from{opacity:0;transform:perspective(1200px) rotateX(18deg) translateY(30px)}
    to  {opacity:1;transform:perspective(1200px) rotateX(0deg)  translateY(0)}
  }
}

@media(prefers-reduced-motion:reduce){
  html{scroll-behavior:auto}
  .reveal,.rv-tilt,.rv-scale,.rv-left,.rv-right,.rv-pop{opacity:1!important;transform:none!important;transition:none!important;animation:none!important}
  .hero-phone{animation:none}
  .slide.pulse .phone{animation:none}
  /* keep the annual card's ring, drop its pulse */
  .plan.is-best::before{animation:none;box-shadow:0 0 30px rgba(0,229,160,.14)}
}

/* ---------- Hero hands image ---------- */
.hero-hands{margin:44px auto 0;width:min(430px,86vw);position:relative}
.hero-hands img{width:100%;height:auto;border-radius:20px;display:block;
  filter:drop-shadow(0 34px 60px rgba(20,30,50,.20))}
@media(max-width:720px){.hero-hands{margin-top:34px;width:min(340px,84vw)}}

/* ---------- Hero: licensed hand + phone, app screen baked in (pixel-aligned) ---------- */
/* Composite is cropped symmetrically about the phone, so centring the image
   centres the PHONE (not the hand) under the App Store button. Uses flex rather
   than margin:auto, which collapses to zero once the image is wider than the
   column, and left the phone off-centre on phones. */
.hero-hand{width:100%;margin:30px 0 0;display:flex;justify-content:center}
.hero-hand>picture{width:min(700px,132vw);max-width:none;flex:0 0 auto}
.hero-hand img{width:100%;height:auto;display:block;filter:drop-shadow(0 34px 46px rgba(23,26,58,.18))}
@media(max-width:720px){.hero-hand{margin-top:22px}}

/* ---------- Feature section: licensed angled-hand mockup ---------- */
.feature{align-items:center}
.feature-media{position:relative;overflow:visible}
.feature-media picture{display:block}
/* The composite is ~2:1, so it needs more width than the old 1.68:1 one to
   carry the same visual weight. It bleeds right past its column on purpose;
   the vw cap stops that bleed reaching the viewport edge on narrow desktops,
   and .sec-pad's overflow-x:clip catches whatever is left. */
.feature-media .feature-hand{display:block;height:auto;
  /* calc(50vw - 100px) is the exact room between the image's left edge and the
     viewport: the wrap is centred and capped at 1120, so the media column always
     starts at about 50vw + 59px. This lets the image bleed right as far as it
     can without any of the hand actually being cut off. */
  width:min(880px,178%,calc(50vw - 68px));max-width:none;margin-left:-3%;
  filter:drop-shadow(0 34px 50px rgba(23,26,58,.20))}
/* Mobile scales the product shot UP, the way both references do. nachoz.app runs its
   equivalent in-hand shot at "w-[160%] max-w-none object-contain object-right-bottom
   sm:w-[130%] lg:w-full", biggest on the phone. We had it backwards: 178% on desktop,
   134% on tablet, then 100vw on a phone, so the 2280x1137 composite landed 382x190
   and neither the dose slider nor the injection site its own alt text promises was
   legible.
   124vw puts the phone itself at 94.2vw, and pinning the image 8px inside the left
   edge runs the hand off the right where sec-pad's overflow-x:clip catches it.
   Height goes 190px to 241px.
   filter:none because a 50px-blur drop-shadow on a 484x241 CSS surface is a 1452x723
   offscreen buffer on a 3x iPhone. nachoz uses zero drop-shadows, pep uses one, we
   use six and they sit on our biggest bitmaps. */
@media(max-width:860px){
  .feature-media .feature-hand{width:124vw;max-width:none;
    margin-left:calc(50% - 50vw + 8px);margin-right:0;filter:none}
}

/* images delivered as <picture> (webp with png fallback) */
.feature-media picture{display:block;width:100%}
.hero-hand picture{display:block}
.hero-hand picture img{width:100%;height:auto;display:block;filter:drop-shadow(0 34px 46px rgba(23,26,58,.18))}

/* ============================================================================
   Legal pages (privacy.html / terms.html)
   Type scale measured off the reference's own policy page, not eyeballed:
     column 704 · h1 60/600/-.035em · kicker 12/600/.2em · section h2 18/600/-.025em
     section number 14/500 · body 14/400/1.625 · back + meta 12
   The prose itself is the live nextdose.ai text, moved across verbatim.
   ============================================================================ */
body.legal-page::before{background:#FCFCFD}     /* drop the mesh; long-form reads better on flat */
.legal-wrap{max-width:704px;margin:0 auto;padding:56px 24px 40px;outline:none}
.lg-home{display:inline-flex;align-items:center;gap:9px;font-weight:800;letter-spacing:-.02em;
  font-size:15px;color:var(--ink);margin-bottom:30px}
.lg-home .mark{width:27px;height:27px;border-radius:8px;overflow:hidden;flex-shrink:0;
  box-shadow:0 3px 10px rgba(0,0,0,.22)}
.lg-home .wm{white-space:nowrap}
.lg-back{display:block;font-size:12px;font-weight:500;color:var(--ink-2);margin-bottom:34px;
  transition:color .16s var(--ease)}
.lg-back:hover{color:var(--ink)}
.lg-kicker{display:block;font-family:var(--sans);font-size:12px;font-weight:600;letter-spacing:.2em;line-height:1.34;
  color:var(--teal-2);text-transform:uppercase;margin-bottom:16px}
.lg-title{font-size:clamp(36px,3.4vw,60px);line-height:1.05;letter-spacing:-.035em;font-weight:600;
  color:var(--ink);margin:0 0 24px;text-wrap:balance}
.lg-lede p{font-size:16px;line-height:1.625;letter-spacing:normal;color:var(--ink-2);margin:0 0 13px}
.lg-lede strong{color:var(--ink);font-weight:600}
.lg-meta{font-size:12px;color:var(--ink-3);margin:20px 0 0}
.lg-rule{border:0;border-top:1px solid var(--line);margin:36px 0 4px}

.lg-sec{padding:40px 0 0}
.lg-h2{display:flex;align-items:baseline;gap:14px;font-size:18px;font-weight:600;
  letter-spacing:-.025em;line-height:1.55;color:var(--ink);margin:0 0 14px;scroll-margin-top:24px}
.lg-num{flex:0 0 auto;font-size:14px;font-weight:500;letter-spacing:-.032em;line-height:1.43;color:var(--teal-2);
  font-variant-numeric:tabular-nums}
.lg-name{flex:1 1 auto}
.lg-sec h3{font-size:15px;font-weight:600;letter-spacing:-.015em;color:var(--ink);margin:22px 0 8px}
.lg-sec p{font-size:14px;line-height:1.625;letter-spacing:normal;color:var(--ink-2);margin:0 0 13px}
.lg-sec strong{color:var(--ink);font-weight:600}
.lg-sec ul{margin:0 0 14px;padding-left:20px}
.lg-sec li{font-size:14px;line-height:1.625;letter-spacing:normal;color:var(--ink-2);margin-bottom:7px}
.lg-sec li::marker{color:var(--ink-4)}
.lg-sec a{font-weight:500;color:var(--ink);text-decoration:underline;text-underline-offset:2px}
.lg-sec a:hover{color:var(--teal-2)}
.lg-sec hr{border:0;border-top:1px solid var(--line);margin:30px 0}
.legal-page .footer{margin-top:56px}

@media(max-width:640px){
  .legal-wrap{padding:40px 20px 32px}
  .lg-back{margin-bottom:26px}
  .lg-sec{padding-top:32px}
  .lg-h2{gap:11px;font-size:17px}
}

/* ---------- Footer: centred stack on a light band, like the reference ---------- */
.footer{padding:40px 0 44px;border-top:1px solid #E5E5E5;background:#F4F4F5;margin-top:40px;text-align:center}
.footer .wrap{display:flex;flex-direction:column;align-items:center;gap:0}
/* Footer lockup keeps its own scale - no social buttons sit beside it. */
.footer .f-logo .mark{width:27px;height:27px;border-radius:8px}
/* .f-logo also carries .nav-logo, whose padding-right:8px is nav-only spacing.
   Left in place it shifts the lockup 4px left of the centred footer column. */
.footer .f-logo{padding-right:0;display:inline-flex;align-items:center;gap:9px;font-size:16px;font-weight:800;
  letter-spacing:-.02em;color:var(--ink)}
.footer .f-tag{color:var(--ink-3);font-size:13px;margin:10px 0 0;max-width:420px}
.footer .f-links{display:flex;flex-wrap:wrap;justify-content:center;gap:24px;margin-top:22px;
  font-size:13.5px;color:var(--ink-2)}
.footer .f-links a:hover{color:var(--ink)}
/* the CTA -> FAQ seam stacked 104px + 104px; trim both sides */
.sec-pad.cta{padding-bottom:64px}
#faq{padding-top:48px}
@media(max-width:720px){.sec-pad.cta{padding-bottom:48px}#faq{padding-top:36px}}
.f-legal{display:flex;flex-wrap:wrap;justify-content:center;gap:24px;margin-top:14px;
  font-size:12px;color:var(--ink-2)}
.f-legal a{transition:color .16s var(--ease)}
.f-legal a:hover{color:var(--ink)}
.foot-legal{max-width:760px;margin:20px auto 0;font-size:12px;line-height:1.6;color:var(--ink-4);text-align:center}
@media(max-width:640px){
  .footer .f-links{gap:18px}
  .f-legal{gap:18px}
}

/* The pill is fixed, so anchored sections need room above them. */
#features,#closer,#reviews,#compare,#faq{scroll-margin-top:96px}
/* Pricing jumps to the plan cards, not the top of the comparison table. */
#pricing{scroll-margin-top:112px}

/* ---------- Support page ----------
   NOTE: this block must stay AFTER the legal-page rules. .lg-sec p/h3/a/li
   share specificity with these selectors, so source order decides the winner.
   Sits on the same .legal-wrap shell as privacy/terms. Cards reuse the light
   card recipe (--card / --line / --shadow-sm) so they read as the same family
   as .faq-item and .trust-badge on the home page. The FAQ is <details> rather
   than the JS accordion, so this page needs no script of its own. */
.sup-contact{display:flex;flex-wrap:wrap;align-items:flex-end;justify-content:space-between;gap:20px;
  padding:22px 24px;border-radius:var(--r);background:var(--card);
  border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.sup-contact dl{margin:0;display:grid;gap:12px}
.sup-contact dl>div{display:flex;flex-wrap:wrap;gap:4px 10px;align-items:baseline}
.sup-contact dt{min-width:118px;font-size:12px;font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-3,var(--ink-2))}
.sup-contact dd{margin:0;font-size:14px;line-height:1.625;letter-spacing:normal;color:var(--ink)}
.sup-contact dd a{font-weight:500;color:var(--ink);text-decoration:underline;text-underline-offset:2px}
.sup-contact dd a:hover{color:var(--teal-2)}
/* .lg-sec a is (0,1,1) and beats a bare .sup-btn (0,1,0) whatever the source
   order, so it was painting this pill's label ink-dark and underlining it.
   Qualify the selector to outrank it. */
.lg-sec a.sup-btn,.sup-btn{display:inline-flex;align-items:center;justify-content:center;padding:11px 20px;
  border-radius:var(--pill);font-size:14px;font-weight:600;color:#fff;white-space:nowrap;text-decoration:none;
  background:linear-gradient(180deg,#141b24,#0b0f15);box-shadow:0 4px 12px rgba(10,14,20,.24);
  transition:transform .16s var(--ease),box-shadow .16s var(--ease)}
.sup-btn:hover{transform:translateY(-1px);box-shadow:0 8px 18px rgba(10,14,20,.28)}

.sup-grid{display:grid;grid-template-columns:1fr 1fr;gap:12px}
.sup-card{padding:18px 20px;border-radius:var(--r);background:var(--card);
  border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.sup-card h3{margin:0 0 6px;font-size:15px;font-weight:600;letter-spacing:-.015em;color:var(--ink)}
.sup-card p{margin:0;font-size:14px;line-height:1.625;letter-spacing:normal;color:var(--ink-2)}

.sup-faqs{display:grid;gap:10px}
.sup-faq{border-radius:var(--r);background:var(--card);border:1px solid var(--line);
  box-shadow:var(--shadow-sm);overflow:hidden}
.sup-q{display:flex;align-items:center;justify-content:space-between;gap:16px;
  padding:20px 22px;cursor:pointer;list-style:none;
  font-size:16.5px;font-weight:650;letter-spacing:-.01em;color:var(--ink)}
.sup-q::-webkit-details-marker{display:none}
.sup-q .pm{flex-shrink:0;width:26px;height:26px;border-radius:8px;display:grid;place-items:center;
  background:var(--teal-soft);color:var(--teal-2);font-size:18px;font-weight:400;
  transition:transform .28s var(--ease)}
.sup-faq[open] .sup-q .pm{transform:rotate(45deg)}
.sup-q:focus-visible{outline:2px solid var(--teal-2);outline-offset:-3px;border-radius:8px}
.sup-a p{margin:0;padding:0 22px 22px;font-size:15px;line-height:1.625;color:var(--ink-2)}
.sup-a strong{color:var(--ink);font-weight:600}
@media(max-width:640px){
  .sup-grid{grid-template-columns:1fr}
  .sup-contact{flex-direction:column;align-items:stretch}
  .sup-btn{width:100%}
}

/* ---- Category picker (deflection layer) ----
   Tiles are real <button>s in a tablist, so keyboard and screen readers get the
   same behaviour as the mouse. Panels are hidden with the `hidden` attribute
   rather than display:none in CSS, so the page still works if the script fails
   to run: every panel renders, just all at once. */
.sup-cats{display:grid;grid-template-columns:repeat(auto-fit,minmax(224px,1fr));gap:10px;margin:4px 0 26px}
.sup-cat{
  display:block;text-align:left;padding:15px 17px;border-radius:var(--r);
  background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-sm);
  transition:border-color .16s var(--ease),box-shadow .16s var(--ease),transform .16s var(--ease)}
.sup-cat b{display:block;font-size:15px;font-weight:600;letter-spacing:-.015em;color:var(--ink);margin-bottom:3px}
.sup-cat span{display:block;font-size:13px;line-height:1.5;color:var(--ink-3,var(--ink-2))}
.sup-cat:hover{border-color:var(--line-2,var(--line));transform:translateY(-1px);
  box-shadow:0 6px 16px rgba(10,14,20,.08)}
.sup-cat.is-on{border-color:var(--teal-2);box-shadow:0 0 0 1px var(--teal-2) inset}
.sup-cat.is-on b{color:var(--teal-2)}
.sup-cat:focus-visible{outline:2px solid var(--teal-2);outline-offset:2px}

.sup-panel[hidden]{display:none}
.sup-still{
  display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;gap:14px;
  margin-top:18px;padding:16px 20px;border-radius:var(--r);
  background:var(--card-2,var(--card));border:1px solid var(--line)}
.sup-still p{margin:0;font-size:14px;line-height:1.55;color:var(--ink-2)}
.sup-note{margin-top:12px;font-size:13px;color:var(--ink-3,var(--ink-2))}
@media(max-width:640px){
  .sup-cats{grid-template-columns:1fr}
  .sup-still{flex-direction:column;align-items:stretch}
  .sup-still .sup-btn{width:100%}
}

/* ---- Ticket form ----
   Same light card family as the rest of the page. Submit stays disabled until
   every requirement is met, so nobody fills the thing in, hits send, and gets
   bounced back with a list of what they got wrong. */
.sup-form{display:grid;gap:18px}
.sf-row{display:grid;gap:7px}
.sf-grid{display:grid;grid-template-columns:1fr 1fr;gap:18px}
.sf-row label,.sf-fieldset legend{
  font-size:13px;font-weight:600;letter-spacing:-.005em;color:var(--ink);padding:0}
.sf-req{font-family:var(--mono,inherit);font-size:10px;font-weight:600;letter-spacing:.08em;
  text-transform:uppercase;color:var(--ink-3,var(--ink-2));margin-left:6px}
.sf-opt{font-size:10px;font-weight:600;letter-spacing:.08em;text-transform:uppercase;
  color:var(--ink-3,var(--ink-2));margin-left:6px}
.sup-form input[type="text"],.sup-form input[type="email"],.sup-form input[type="tel"],
.sup-form select,.sup-form textarea{
  width:100%;font:inherit;font-size:14.5px;color:var(--ink);
  background:var(--card);border:1px solid var(--line);border-radius:11px;
  padding:11px 13px;transition:border-color .16s var(--ease),box-shadow .16s var(--ease)}
.sup-form textarea{resize:vertical;line-height:1.6;min-height:150px}
.sup-form input:focus,.sup-form select:focus,.sup-form textarea:focus{
  outline:none;border-color:var(--teal-2);box-shadow:0 0 0 3px var(--teal-soft)}
.sf-fieldset{border:0;margin:0;padding:0}
.sf-choice{display:flex;gap:20px;padding-top:2px}
.sf-choice label{display:flex;align-items:center;gap:7px;font-weight:500;font-size:14.5px;color:var(--ink-2);cursor:pointer}
.sf-choice input{accent-color:var(--teal-2);width:16px;height:16px}
.sf-hint{margin-top:2px}
.sf-hint summary{font-size:13px;color:var(--teal-2);cursor:pointer;width:fit-content}
.sf-hint p{margin:8px 0 0;font-size:13.5px;line-height:1.6;color:var(--ink-2)}
.sf-count{margin:0;font-size:12.5px;font-variant-numeric:tabular-nums;color:var(--ink-3,var(--ink-2))}
.sf-count.is-ok{color:var(--teal-2)}
/* Off-screen, not display:none: some bots skip hidden fields entirely. */
.sf-hp{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}
.sf-turnstile:empty{display:none}
.sf-actions{display:flex;flex-wrap:wrap;align-items:center;gap:14px}
.sup-form button[disabled]{opacity:.45;cursor:not-allowed;transform:none;box-shadow:none}
.sf-status{margin:0;font-size:13.5px;line-height:1.5;color:var(--ink-2)}
.sf-status.is-bad{color:#B4451F}
.sup-done{padding:26px 24px;border-radius:var(--r);background:var(--card);
  border:1px solid var(--teal-2);box-shadow:var(--shadow-sm);text-align:center}
.sf-ref{font-family:var(--mono,ui-monospace,monospace);font-size:22px;font-weight:600;
  letter-spacing:.06em;color:var(--teal-2);margin-bottom:10px}
.sup-done p{margin:0 0 6px;font-size:14.5px;line-height:1.6;color:var(--ink)}
.sup-done .sf-fine{font-size:13px;color:var(--ink-2);margin:0}
@media(max-width:640px){
  .sf-grid{grid-template-columns:1fr}
  .sf-actions{flex-direction:column;align-items:stretch}
  .sf-actions .sup-btn{width:100%}
}

/* THE BUG THIS FIXES: .sf-row sets display:grid, and an author display value
   beats the UA stylesheet's [hidden]{display:none}. So setting .hidden = true on
   the Member ID row did nothing and non-members were still shown a field marked
   Required. Any hidden row inside the form must collapse, whatever it is. */
.sup-form [hidden],
.sf-row[hidden]{display:none}

/* Response times, as two facts rather than a sentence to parse. */
.sup-sla{display:grid;grid-template-columns:repeat(auto-fit,minmax(210px,1fr));
  gap:10px;list-style:none;margin:0 0 26px;padding:0}
.sup-sla li{padding:13px 16px;border-radius:var(--r);background:var(--card);
  border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.sup-sla b{display:block;font-size:14.5px;font-weight:650;letter-spacing:-.015em;
  color:var(--teal-2);margin-bottom:2px}
.sup-sla span{display:block;font-size:13px;line-height:1.5;color:var(--ink-2)}

/* ---------- Hero floating reviews ----------
   Card structure mirrors the reference: title and a verified badge on one row,
   then stars beside the handle, then the quote. Excerpts are length-matched so
   the four cards sit at comparable heights instead of one towering over another.
   pointer-events:none throughout, so a card drifting over the App Store button
   can never eat the click that matters most on this page. .hero sets
   overflow-x:clip, so a card reaching past the viewport is trimmed rather than
   creating a horizontal scrollbar.

   The card's own styling sits OUTSIDE any media query on purpose. It used to live
   inside the 1200px block, which is why narrowing the window made the reviews
   vanish instead of adapt. Only visibility, width and offsets change per tier now.

   Measured across 861 to 1200, the hero does not reflow at all in that range: the
   headline stays 653px, the subhead 559px, the badge 380px, and the hero stays
   1620px tall. Only the hand photo scales, 1055px wide at 1200 down to 785px at
   861. So the binding constraint is NOT the headline, which sits well above the
   cards. It is the 380px badge at x -190..+190 from centre, y 480..571. Below the
   button, y 641..932 is empty across the full width, which is where the narrow
   tiers put their cards. */
.hf{
  position:absolute;pointer-events:none;
  animation:hfDrift 9s ease-in-out infinite;
  display:flex;flex-direction:column;gap:7px;
  padding:16px 18px 17px;border-radius:18px;
  background:rgba(255,255,255,.9);border:1px solid var(--line);
  box-shadow:0 16px 38px rgba(23,26,58,.11), 0 2px 6px rgba(23,26,58,.05);
  backdrop-filter:blur(10px) saturate(1.2)}
.hf-top{display:flex;align-items:flex-start;justify-content:space-between;gap:12px}
.hf-top b{font-size:14px;font-weight:700;letter-spacing:-.015em;color:var(--ink);line-height:1.3}
.hf-badge{flex:0 0 auto;display:inline-flex;align-items:center;gap:4px;
  font-size:11px;font-weight:500;color:var(--ink-3,var(--ink-2));white-space:nowrap;padding-top:1px}
.hf-badge svg{width:12px;height:12px;flex:0 0 auto}
.hf-meta{display:flex;align-items:center;gap:9px}
.hf-stars{color:#F2A93B;font-size:12px;letter-spacing:.11em;line-height:1}
.hf-who{font-size:12px;font-weight:500;color:var(--ink-2)}
.hf p{margin:1px 0 0;font-size:13px;line-height:1.55;color:var(--ink);letter-spacing:normal}

/* 880 is the single floor for both float sets. Below it the hero moves toward
   phone proportions and the feature grid stacks, and the Reviews carousel further
   down carries the same quotes properly, so nothing is lost by dropping them.

   Every tier below is min-width ONLY, deliberately. Closed ranges written as
   max-width:999px against min-width:1000px leave a gap: a viewport at 999.5px,
   which is routine under browser zoom or a scaled display, matches neither and
   falls through to the bare .hf recipe. Because the container gate has no
   max-width the cards still paint, but with left and top auto, which for an
   absolutely positioned element is the static position, so all four stack at the
   container origin on top of the nav. Ascending min-width tiers cannot gap: a
   fractional width simply lands in the highest tier it clears. */
/* Floats are a DESKTOP device and start at 880. This matches both references:
   pepaiapp.com renders its floating review cards as "absolute hidden lg:block", so
   they simply do not exist on a phone, and mobile gets the reviews as a proper
   section instead.

   We tried the opposite and it was wrong. Floating a card on a 390px screen means
   putting it on the product shot, and the only way to avoid that was 275px of
   bottom margin on the photo to open a band for it. The result was a phone user
   scrolling past a large empty gap with one orphaned card in it, which reads as a
   failed load rather than a design. The Reviews section now carries mobile, which
   is what the references do and what that section is for. */
/* Floats at EVERY width, on Naveed's explicit call. I had them desktop only, matching
   pepaiapp.com's "absolute hidden lg:block"; he overruled that and wants the same
   arrangement on iPhone and iPad. Every iPad in portrait was getting nothing, because
   744, 810, 820 and 834 all fall under the old 880 gate.

   Measured, x from centre against documentElement.clientWidth/2:
     vw    half   heroH   badge    photo      photo y        tagline y
     390    195    1402    +-150    +-171      651..1230       1303
     744    372    1597    +-190    +-348      656..1444       1518
     834    410    1618    +-190    +-385      668..1456       1530
    1180    583    1620    +-190    +-536      671..1459       1533

   Two things follow. Below 1000 the photo is nearly edge to edge, so a float there has
   to sit ON it. That is not a compromise, it is what desktop already does: its lower
   pair sits over the photo's outer edges too. And at 390 the half width is 195, so a
   left and a right card at the same height would each be under 185px, below the point
   where a 13px quote stays readable. So phones alternate one left, one right down the
   photo instead of pairing them, which keeps the desktop left/right rhythm. */
.hero-floats{display:block;position:absolute;inset:0;pointer-events:none;z-index:1;text-align:left}
/* 64vw capped at 252, down from 72vw capped at 290. At 375 the two cards were covering
   55 percent of the product shot and at 430 they covered 49, against 33 on an iPad.
   Width alone is a weak lever because a narrower card simply wraps to a taller one, so
   the short quote below does most of the work. Padding drops with it. */
.hf{position:absolute;width:min(64vw,252px);min-height:0;
  padding:14px 16px 15px;
  animation:hfDrift 9s ease-in-out infinite}
/* Phones get the short quote, everything from 744 up gets the full one. */
.hf-long{display:none}
.hf-short{display:block}
/* Phone-width hero: the hand photo runs roughly 55%-90% of the hero box and the
   cards are 150-169px tall, so there was no percentage that kept them off the
   phone - the hero's height moves with how the headline wraps, so a top:% that
   cleared the photo at 375 sat on it at 430. Below 744 the cards therefore drop
   out of absolute positioning and stack under the photo in normal flow, which
   cannot overlap it at any width. Size, rotation and drift are unchanged. */
.hero-floats{position:static;inset:auto;display:flex;flex-direction:column;
  align-items:center;gap:24px;margin:62px auto 0}
.hf{position:relative;left:auto;right:auto;top:auto;bottom:auto}
.hf-1{transform:rotate(-2.2deg);animation-delay:0s}
.hf-3{transform:rotate(1.8deg);animation-delay:1.2s}
.hero-floats .hf-2,.hero-floats .hf-4{display:none}

/* From 744, iPad portrait. Half is 372 at 744, so a 220px card at 12px from the edge
   spans -360 to -140, sitting on the photo's outer edge (+-348) exactly as the desktop
   lower pair does. All four appear again, two a side, staggered. The whole set lives
   inside the photo band, y 656..1444 of a 1597 hero, which is 41% to 90%, so nothing
   can reach the headline, subhead, badge, button or tagline. */
@media(min-width:744px){
  .hero-floats{position:absolute;inset:0;display:block;margin:0}
  .hf{position:absolute;width:220px;padding:16px 18px 17px}
  .hf-long{display:block}
  .hf-short{display:none}
  .hero-floats .hf-2,.hero-floats .hf-4{display:flex}
  .hf-1{left:12px;right:auto;top:45%;transform:rotate(-2.2deg);animation-delay:0s}
  .hf-2{left:40px;right:auto;top:63%;transform:rotate(1.6deg);animation-delay:1.6s}
  .hf-3{left:auto;right:12px;top:52%;transform:rotate(2deg);animation-delay:.8s}
  .hf-4{left:auto;right:40px;top:71%;transform:rotate(-1.5deg);animation-delay:2.4s}
}

/* From 880: two cards in the empty band below the button. */
/* 880 keeps all four and just grows them. The old tier here dropped back to two, which
   was built for a world where phones had none, and would now remove cards as the screen
   got wider. */
@media(min-width:880px){
  .hero-floats{z-index:0}
  .hf{width:236px;min-height:132px}
}
/* From 1000: all four, anchored to the viewport edges rather than the centre,
   because a centre offset that fits at 1200 runs off screen as it narrows. The top
   pair still has to clear the badge: at 1000 the half width is 500, so a card at
   18px ends 234px left of centre and the badge starts at 190. 44px of clearance.
   hf-3 sits at 32%, not the 28% used wider up, because as the cards move inward
   the right one reaches back under the subhead, which ends at y 454 of the 1620px
   hero. 28% put its top at 448 and clipped the subhead's corner by 6px. */
@media(min-width:1000px){
  .hf{width:248px;min-height:138px}
  .hero-floats .hf-2,.hero-floats .hf-4{display:flex}
  .hf-1{left:18px;right:auto;top:31%;transform:rotate(-2.2deg);animation-delay:0s}
  .hf-2{left:44px;right:auto;top:47%;transform:rotate(1.6deg);animation-delay:1.6s}
  .hf-3{left:auto;right:18px;top:32%;transform:rotate(2deg);animation-delay:.8s}
  .hf-4{left:auto;right:44px;top:45%;transform:rotate(-1.5deg);animation-delay:2.4s}
}
/* From 1200: back to centre offsets. right is reset to auto so the edge anchoring
   from the tier below cannot linger. The right pair is clamped, the left pair is
   not, because a card grows rightward from its left edge: the left cards only need
   offset <= half, the right cards need offset + width <= half. At 1200 the
   unclamped +356 put the fourth card 24px off screen, which predates this ladder.
   100% is container relative so it already excludes the scrollbar, which a bare
   50% does not: a media query fires on the viewport width INCLUDING the scrollbar,
   but 50% resolves against the content box, 1185 rather than 1200. */
@media(min-width:1200px){
  .hf{width:268px;min-height:142px}
  .hf-1{left:calc(50% - 566px);right:auto;top:31%}
  .hf-2{left:calc(50% - 526px);right:auto;top:47%}
  .hf-3{left:min(calc(50% + 322px), calc(100% - 302px));right:auto;top:28%}
  .hf-4{left:min(calc(50% + 356px), calc(100% - 284px));right:auto;top:45%}
}
/* From 1520: the widest arrangement, four cards flanking badge and button. */
@media(min-width:1520px){
  .hf{width:322px;min-height:150px}
  .hf-1{left:calc(50% - 690px)}
  .hf-2{left:calc(50% - 640px)}
  .hf-3{left:min(calc(50% + 372px), calc(100% - 354px))}
  .hf-4{left:min(calc(50% + 418px), calc(100% - 338px))}
}
@keyframes hfDrift{0%,100%{translate:0 0}50%{translate:0 -10px}}


/* ---------- Rating badge ----------
   Naveed's own artwork, exported at exact render sizes with a premultiplied
   downscale so the thin laurel leaves do not fringe against the pastel hero.
   The wording lives inside the PNG, so the alt text carries it for screen
   readers and for anything that cannot load the image. */
.award{display:flex;justify-content:center;margin:26px auto 0}
.award img{display:block;width:380px;height:auto;max-width:86vw}
.hero-actions{margin-top:16px}
@media(max-width:720px){
  .award{margin-top:20px}
  .award img{width:300px}
  .hero-actions{margin-top:13px}
}

/* ---------- Half-life pages ----------
   Reference pages built from the compounds table. Same light card family and
   type scale as the legal pages, so the cluster reads as part of the site rather
   than an SEO annex bolted on the side. */
.hl-wrap{max-width:760px}
.hl-hero{display:flex;flex-wrap:wrap;align-items:flex-start;gap:22px;margin:6px 0 4px}
.hl-figure{flex:0 0 auto;display:flex;flex-direction:column;align-items:center;justify-content:center;
  min-width:168px;padding:20px 24px;border-radius:var(--r);
  background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-sm)}
.hl-value{font-size:26px;font-weight:700;letter-spacing:-.03em;color:var(--teal-2);line-height:1.1;text-align:center}
.hl-label{margin-top:5px;font-size:11px;font-weight:600;letter-spacing:.13em;
  text-transform:uppercase;color:var(--ink-3,var(--ink-2))}
.hl-lede{flex:1 1 300px;margin:0;font-size:16px;line-height:1.625;color:var(--ink-2);letter-spacing:normal}
.hl-flag{margin:18px 0 0;padding:14px 16px;border-radius:var(--r);font-size:14px;line-height:1.6;
  color:var(--ink-2);background:var(--card);border:1px solid var(--line);border-left:3px solid #C58A2E}
.hl-flag strong{color:var(--ink)}
.hl-tw table{min-width:420px}
.hl-tw td.hl-n{font-variant-numeric:tabular-nums;color:var(--ink);font-weight:600;width:96px}
.hl-tw td.hl-pct{text-align:right;font-variant-numeric:tabular-nums;color:var(--ink);font-weight:600}
.hl-note{font-size:13.5px;color:var(--ink-3,var(--ink-2))}

.hl-related{list-style:none;margin:0 0 14px;padding:0;display:grid;gap:8px}
.hl-related.hl-grid{grid-template-columns:repeat(auto-fit,minmax(232px,1fr))}
.hl-related li{display:flex;align-items:baseline;justify-content:space-between;gap:12px;
  padding:11px 15px;border-radius:12px;background:var(--card);border:1px solid var(--line)}
.hl-related a{font-size:14.5px;font-weight:600;color:var(--ink);text-decoration:none}
.hl-related a:hover{color:var(--teal-2)}
.hl-related span{flex:0 0 auto;font-size:12.5px;color:var(--ink-3,var(--ink-2));font-variant-numeric:tabular-nums}

.hl-cta{margin:44px 0 8px;padding:28px 26px;border-radius:var(--r);text-align:center;
  background:var(--card);border:1px solid var(--teal-2);box-shadow:var(--shadow-sm)}
.hl-cta h2{margin:0 0 8px;font-size:21px;font-weight:650;letter-spacing:-.025em;color:var(--ink)}
.hl-cta p{margin:0 auto 18px;max-width:52ch;font-size:14.5px;line-height:1.6;color:var(--ink-2)}

.footer .f-fine{max-width:64ch;margin:18px auto 0;font-size:12px;line-height:1.6;
  color:var(--ink-3,var(--ink-2))}
@media(max-width:640px){
  .hl-hero{gap:16px}
  .hl-figure{min-width:0;width:100%;padding:18px}
  .hl-related.hl-grid{grid-template-columns:1fr}
}

/* ---- Section floats (TRACK) ----
   These float around the hand rather than sitting in a band underneath, so the
   section gains no height at all.

   Measured in section coordinates, x from the horizontal centre and y from the
   section top:

     vw    half   section h   copy ends   hand bottom
     1200   600      660        -65          458
     1024   512      671        -67          442
      940   470      662        -68          427
      861   430      706        -69          440

   The hand shrinks and rises as the viewport narrows, so the clear space under it
   grows rather than shrinks. That is why the cards can keep hugging its lower edge
   all the way down instead of being dropped.

   Right-hand limit: at the 1520px boundary the half width is 760, so a 322px card
   must start at x <= +438 or sec-pad's overflow-x:clip cuts it. Decorative bleed is
   fine, a half-cut review is not. Card widths come from the .hf tiers above, so the
   offsets here are chosen against those widths, not independently. */
/* Same idea as the hero: below 880 this sits in the normal flow at the end of the
   section rather than vanishing. One card, because the section is already tall on
   a phone once the grid stacks. */
#features{position:relative}
/* Same call as the hero: visible at every width. Measured in section coordinates,
   x from centre, y from section top:
     vw     secH    photo x        photo y      bullets
     390     940    -168..+168     672..908     y 437..628, full width
     744    1070    -282..+386     515..956     y 374..462
     834    1130    -318..+422     521..1016    y 379..467
    1180     658    +115..+578     204..454     y 458..545, left column only

   Below 860 the .feature grid stacks, so the photo goes centred and full width and the
   bullets sit above it rather than beside it. That means the photo band is the only
   clear region, and it is a big one: 236px tall at 390 and 495px at 834. Cards go on
   the photo's outer edges there, which is the same relationship they have to the photo
   on desktop. */
.sec-floats{display:block;position:absolute;inset:0;pointer-events:none;z-index:2;text-align:left}
.sec-floats .hf{animation-duration:10s}
/* One card on phones, hanging off the photo's lower edge rather than sitting in the
   middle of it. The TRACK photo is short and wide, 474x236 at 390, so a card that
   covers half its height covers far more of it than the same card does in the hero
   where the photo is 579 tall. At 74% it took 44 percent of the photo against the
   hero's 32. 81% drops the card so only its top third lands on the image, and it
   still ends inside the section. */
/* Narrower than the hero cards, and only here. Lowering it did nothing, because at
   81% the card runs 758..908 against a photo of 672..908, so it sits entirely inside
   the image and there is only 32px of section left below to hang it off. Vertical was
   the wrong lever. Horizontal is the one that works: 215 against a 474 wide photo is
   45 percent of its width rather than 54, which brings coverage from 44 to about 29,
   in line with the hero's 32. */
/* Track card width lives on .sec-floats .hf, per tier, NOT on .sf-1. A width on
   .sf-1 is (0,1,0), the same as the .hf tier rules, and this block sits after them in
   the file, so it won last at EVERY width above its own breakpoint. That is what
   condensed the saad card to 220px on desktop when it should have been 322. Driving it
   from a (0,2,0) selector that is restated in each tier makes that impossible. */
.sec-floats .hf{width:min(56vw,215px)}
.sf-1{left:10px;right:auto;top:81%;transform:rotate(-1.6deg);animation-delay:.4s}
.sec-floats .sf-2{display:none}

/* From 744 both cards return, on the photo's opposite edges. The band is 515..956 of a
   1070 section, which is 48% to 89%, so 52 and 70 keep both inside it. */
@media(min-width:744px){
  .sec-floats .sf-2{display:flex}
  .sec-floats .hf{width:220px}
  .sf-1{left:12px;right:auto;top:52%;transform:rotate(-1.6deg);animation-delay:.4s}
  .sf-2{left:auto;right:12px;top:70%;transform:rotate(1.6deg);animation-delay:1.9s}
}

/* Ascending min-width tiers only, for the same reason as the hero above: a closed
   range leaves a fractional gap where the cards fall back to the bare recipe and
   pile up at the container origin. */

/* From 880: one card. Two cards plus a gap need more width than the space right of
   the copy column offers here, and one readable card beats two cramped ones. It
   tucks under the hand's lower left, where space opens up as the hand shrinks. */
/* 861, not 880. .feature stacks at max-width:860, so 861 is the exact width where the
   grid returns to two columns, the photo moves to the right half and the copy column
   takes the left. The edge anchored placement above is built for a centred full width
   photo and puts a card straight onto the bullet list once that stops being true.
   sf-2 is hidden again through this band for the reason it always was: the space right
   of the copy column cannot hold two cards plus a gap until 1000. It must be hidden
   explicitly, because the 744 tier turned it on and min-width tiers only accumulate. */
@media(min-width:861px){
  .sec-floats .hf{width:236px}
  .sf-1{left:calc(50% - 30px);right:auto;top:436px}
  .sec-floats .sf-2{display:none}
}
/* From 1000, cards are 248 wide. At 1000 the half width is 500, so the right card
   has to start by +236 to keep a 16px margin. That leaves a 28px gap between the
   two, and the left card clears the copy column, which ends at -67. */
@media(min-width:1000px){
  .sec-floats .hf{width:248px}
  .sec-floats .sf-2{display:flex}
  .sf-2{right:auto}
  .sf-1{left:calc(50% - 40px);top:430px;transform:rotate(-1.8deg)}
  .sf-2{left:min(calc(50% + 236px), calc(100% - 264px));top:20px;transform:rotate(1.6deg);animation-delay:1.9s}
}
@media(min-width:1200px){
  .sec-floats .hf{width:268px}
  .sf-1{left:calc(50% + 2px);top:458px}
  .sf-2{left:min(calc(50% + 326px), calc(100% - 284px));top:20px}
}
@media(min-width:1520px){
  .sec-floats .hf{width:322px}
  .sf-1{left:calc(50% + 18px);top:462px}
  /* Above the thumb. Two levers, position only, no size change.
     The vertical one alone is not enough: the thumb's topmost pixels sit at about
     10 percent of the image height, so at 1918 that is y 163 while a 159px card
     starting at 20 ends at 179.
     The horizontal one closes it. The skin starts progressively LOWER toward the
     right of the photo, 18 percent of image height at 80 percent across and 26 at
     90. And at 1918 this card is nowhere near its clamp: 50% + 392 is 1343 while
     the clamp only bites at 1565, so there are 233px of unused room. Pushing the
     centre offset to 470 slides it right into the lower part of the thumb line at
     wide viewports while changing nothing at 1520, where the clamp still wins. */
  .sf-2{left:min(calc(50% + 530px), calc(100% - 338px));top:20px}
}
/* Matches .sec-floats .hf at (0,2,0) as well, so the kill switch actually reaches
   the track cards rather than losing the cascade to them. */
@media(prefers-reduced-motion:reduce){.hf,.sec-floats .hf{animation:none}}

/* ---- Reviews section OFF ----
   Turned off 2026-09-02 at Naveed's request, now that real review cards float in
   the hero and in the TRACK section on every width. Nothing was deleted: the
   markup, the marquee and the review data are all still in place.

   TO TURN IT BACK ON: delete this one block. The section, the desktop nav link and
   the mobile menu link all come back together. Both nav links are hidden here on
   purpose, because leaving them would give the nav two entries that scroll nowhere.
   The marquee is a CSS animation on .rv-track, so a hidden section costs nothing at
   runtime. */
#reviews,
.nav-links a[href="#reviews"],
#navMenu a[href="#reviews"]{display:none}

/* ============================================================================
   Half-life cluster: page treatment            (gate: body class .hl-page)
   ----------------------------------------------------------------------------
   WHAT THIS IS. The 83 generated half-life pages (82 compounds + the hub) move
   from flat white long-form onto the neutral dark language #closer and #compare
   already ship. Structure and glass treatment are taken from the reference
   Naveed sent: a pinned bar, sectioned panels, hairline rules, micro-caps table
   headers. Its slate-blue hue and cyan accent are NOT taken. Our dark is
   #0F0F0F, deliberately neutral, and the accent is var(--teal-2).

   HOW privacy.html AND terms.html ARE GUARANTEED UNTOUCHED. Every selector in
   this block starts with the string "body.hl-page". That class is added by
   build_halflife.py's head() and by nothing else. privacy.html, terms.html and
   support.html are hand-maintained files that ship <body class="legal-page">
   with no second class, so not one rule below can match them, at any
   specificity, in any source order. The check is mechanical:
       grep -c "^body\.hl-page" produces the same count as the rule count.
   The light .legal-page / .legal-wrap block earlier in this file is not edited,
   and stays the only thing painting those three pages.

   PLACEMENT. Append at the end of style.css. Source order is not load bearing
   here, every override outranks its light counterpart on specificity, but the
   end is where the other page-specific blocks live.
   ============================================================================ */

/* ---- Tokens ----
   The same six values #compare already declares, re-declared at page scope
   because these pages are dark end to end rather than one band inside a light
   document. Nothing new is invented except --hl-ink-quiet, and that exists for
   a contrast reason: --d-ink-3 at .42 white composites over #0F0F0F to
   15 + .42*240 = 116, which is 4.09:1 and fails AA's 4.5 for the 13.5px note
   under the table and for the figures in the compound tiles. .52 composites to
   15 + .52*240 = 140 and measures 5.68:1. It is a step on the same white ramp,
   not a second grey. --d-ink-3 stays for decoration that carries no meaning,
   which on these pages is the footer's legal fine print and nothing else. */
body.hl-page{
  --d-ink:var(--ink);
  --d-ink-2:var(--ink-2);
  --d-ink-3:var(--ink-3,var(--ink-2));
  --d-line:var(--line);
  --d-line-2:var(--line);
  --d-surface:var(--card);
  --d-surface-2:var(--card-2);
  --d-teal:var(--teal-2);
  --hl-ink-quiet:var(--ink-2);
  /* One number for the bar. The jump-rail anchors offset by it, so it cannot
     live in two places. 56 = the 30px logo tile + 13px of air above and below. */
  --hl-nav-h:56px;
  color:var(--d-ink);
  color-scheme:light;
  /* body's background is what the browser propagates to the canvas, so it is
     what an iOS rubber-band bounce exposes past the ends of the page. The fixed
     ::before layer below covers the viewport but not that overscroll gutter, so
     this has to match the page rather than being left at the default. #FCFCFD is
     the same paper privacy and terms already sit on. */
  background:#FCFCFD;
  /* Seatbelt for the sticky bar. The base rule sets body{overflow-x:hidden},
     which normally propagates to the viewport and leaves body itself visible,
     so sticky works. clip is the value that can never create a scroll container
     even if a UA declines to propagate it. A browser without clip drops this
     line and inherits hidden, which is today's behaviour. */
  overflow-x:clip;
}
/* (0,2,2) so it beats body.legal-page::before at (0,1,2) whatever the order.
   ::before is the site's fixed pastel mesh and .legal-page already flattens it
   to #FCFCFD. Flatten it again to the band colour rather than painting some
   other element, so one fixed layer stays the single owner of the page ground. */
body.legal-page.hl-page::before{background:#FCFCFD}

/* One atmospheric wash, anchored to the top of the DOCUMENT, not the viewport.
   It cannot go on ::before, which is position:fixed, because a glow on a fixed
   layer never scrolls away and would still be sitting behind the clearance
   table and the footer. position:absolute resolves against the initial
   containing block, which gives a full bleed with no 100vw, and 100vw would
   count a desktop scrollbar the centred column does not.
   480px is just past the hero panel at desktop widths, and both gradients have
   faded to zero by 74% of that, so the cut-off edge is never drawn. */
body.hl-page::after{
  content:"";position:absolute;z-index:-1;pointer-events:none;
  top:0;left:0;right:0;height:480px;
  background:
    radial-gradient(78% 100% at 50% 0%, rgba(0,160,121,.055), rgba(0,0,0,0) 68%),
    linear-gradient(180deg, rgba(0,180,135,.020), rgba(255,255,255,0) 74%);
}
body.hl-page ::selection{background:rgba(0,160,121,.26);color:#fff}
/* The global ring is --teal-2 (#00A079), 5.75:1 on #0F0F0F. --d-teal is 11.6:1
   and is already the accent on both dark bands. */
body.hl-page a:focus-visible,
body.hl-page button:focus-visible,
body.hl-page [tabindex]:focus-visible{outline:2px solid var(--d-teal);outline-offset:3px}
/* .skip is #F7F8FA on #fff, which is near-black on near-black here. */
body.hl-page .skip{background:#fff;color:var(--band-dark)}


/* ============================================================================
   1. STICKY BAR
   The reference pins a glass bar for the whole scroll and that is most of what
   stops its long-form page reading as a loose document. Ours does the same, and
   it carries the CTA, for a measured reason: on the generated Vitamin B12 page
   the .hl-cta block sits about 1640px into a 2653px document, the fifth screen
   of six on desktop and further down on a phone. A search visitor who lands for
   one number, reads it in the first screen and leaves never sees it. The bar is
   the only surface that reaches that reader.
   Sticky, not fixed: sticky stays in normal flow, so it is laid out in the same
   containing block as <main> and its 760px inner column lines up with the h1
   exactly, scrollbar included, with no padding reserve to keep in sync.
   ============================================================================ */
body.hl-page .hl-nav{
  position:sticky;top:0;z-index:60;
  /* Opaque fallback first. Without a blur behind it, a .86 alpha bar lets body
     copy read through at 14%, which smears. The blur version is gated below. */
  background:var(--card-2);
  border-bottom:1px solid var(--d-line);
}
@supports (backdrop-filter:blur(4px)) or (-webkit-backdrop-filter:blur(4px)){
  body.hl-page .hl-nav{
    /* The bar sits on the same #0F0F0F as the page, so at rest it would be
       invisible. The 8-point lift at its top edge (23,23,23 falling to
       15,15,15) plus the bottom hairline is what draws it, with no hue shift. */
    background:linear-gradient(180deg,rgba(255,255,255,.92),rgba(255,255,255,.82));
    -webkit-backdrop-filter:blur(18px) saturate(1.35);
    backdrop-filter:blur(18px) saturate(1.35);
  }
}
/* 760 and 24 are .hl-wrap's max-width and .legal-wrap's padding, so the bar's
   logo sits on the same left edge as the h1 and the page reads off one column. */
body.hl-page .hl-nav-in{
  max-width:760px;margin:0 auto;padding:0 24px;
  height:var(--hl-nav-h);display:flex;align-items:center;gap:12px;
}
body.hl-page .hl-nav-logo{
  display:flex;align-items:center;gap:9px;flex:0 0 auto;
  font-weight:800;letter-spacing:-.02em;font-size:15px;color:var(--d-ink);
}
/* There is no bare .mark rule in this sheet, only .nav-logo .mark and
   .lg-home .mark, so the tile has to be given its whole box here. The 1px rim
   matters on black and not on white: the logo artwork is dark itself, so with
   only a drop shadow it dissolves into the bar. */
body.hl-page .hl-nav-logo .mark{
  width:30px;height:30px;border-radius:8px;overflow:hidden;flex-shrink:0;
  box-shadow:0 3px 10px rgba(24,38,66,.12),0 0 0 1px rgba(12,16,23,.05);
}
body.hl-page .hl-nav-logo .wm{white-space:nowrap}
body.hl-page .teal{color:var(--d-teal)}   /* .teal is #00A079, 5.75:1 here, muddy */

body.hl-page .hl-nav-links{display:flex;align-items:center;gap:20px;margin-left:auto}
body.hl-page .hl-nav-links a{
  position:relative;display:inline-flex;align-items:center;padding:6px 0;
  font-size:11px;font-weight:600;letter-spacing:.14em;text-transform:uppercase;
  white-space:nowrap;
  /* --d-ink-2 (7.24:1), not --d-ink-3 (4.09:1, under AA at this size). House
     rule on dark: separate resting from active by weight and by the underline,
     never by dropping opacity below .60. */
  color:var(--d-ink-2);transition:color .16s var(--ease);
}
body.hl-page .hl-nav-links a:hover{color:var(--d-ink)}
body.hl-page .hl-nav-links a[aria-current="page"]{color:var(--d-teal)}
body.hl-page .hl-nav-links a[aria-current="page"]::after{
  content:"";position:absolute;left:0;right:0;bottom:0;height:2px;
  border-radius:2px;background:var(--d-teal);
}
/* The persistent conversion, and the brightest thing in the bar on purpose.
   var(--teal-2) is 11.6:1 on the page and the #fff label is 10.1:1 on the teal, so
   it is also the most legible element here. Flat shadow: the in-body CTA gets
   the glow, and the two must not compete for the same rank. */
body.hl-page .hl-nav-cta{
  flex:0 0 auto;margin-left:12px;padding:9px 15px;border-radius:var(--pill);
  font-size:13px;font-weight:700;letter-spacing:-.005em;white-space:nowrap;
  color:#fff;background:linear-gradient(135deg,var(--teal-2),var(--teal));
  box-shadow:0 4px 14px rgba(0,160,121,.20);
  transition:transform .16s var(--ease),box-shadow .16s var(--ease);
}
body.hl-page .hl-nav-cta:hover{transform:translateY(-1px);box-shadow:0 8px 20px rgba(0,160,121,.30)}

/* Reading progress, pure CSS, which matters because these 83 pages load no JS
   at all. animation-duration:1ms looks wrong but is required for the range to
   resolve even though the timeline drives it. Unsupported browsers render
   nothing, which is the correct fallback for a decoration. */
@supports (animation-timeline: scroll()){
  body.hl-page .hl-nav::after{
    content:"";position:absolute;left:0;bottom:-1px;height:2px;width:100%;
    transform:scaleX(0);transform-origin:0 50%;
    background:linear-gradient(90deg,rgba(0,160,121,.30),var(--d-teal));
    animation:hlProgress linear both;animation-duration:1ms;
    animation-timeline:scroll(root block);
  }
}
@keyframes hlProgress{to{transform:scaleX(1)}}

/* Back to the hub, or to the home page from the hub. It was a 12px grey line
   directly under a 58px headline: on white that still reads as a link, at .60
   white on black it reads as stray caption text, so it becomes a pressable
   chip. .lg-back is display:block in the light sheet, hence the reset. */
body.hl-page .lg-back{
  display:inline-flex;align-items:center;gap:7px;
  margin:0 0 30px;padding:7px 14px 7px 12px;border-radius:var(--pill);
  font-size:12.5px;font-weight:600;color:var(--d-ink-2);
  background:var(--d-surface-2);border:1px solid var(--d-line-2);
  transition:color .16s var(--ease),background .16s var(--ease),border-color .16s var(--ease);
}
body.hl-page .lg-back:hover{color:var(--d-ink);background:var(--d-surface);border-color:rgba(0,160,121,.38)}


/* ============================================================================
   2. HERO
   ============================================================================ */
body.hl-page .lg-kicker{color:var(--d-teal);margin-bottom:15px}

/* Weight, tracking and leading are the dark band's headline. The SIZE is not.
   The band tops out at 74px in a 1120px centred column; this is a 712px reading
   column (760 wrap minus 24px of padding a side), and the longest title,
   "Testosterone Propionate half-life" at 33 characters, is roughly 1220px of
   type at 74px, so every long compound would break to three lines. 58 holds the
   worst case at two. */
body.hl-page .lg-title{
  font-size:clamp(38px,5.2vw,58px);line-height:1.05;letter-spacing:-.035em;
  font-weight:600;color:var(--d-ink);margin:0 0 26px;text-wrap:balance;
}
/* Hub only: it has no stat panel, its deck is .lg-lede and a .lg-rule follows. */
body.hl-page .lg-lede p{
  font-size:clamp(17px,1.5vw,18.5px);line-height:1.625;letter-spacing:normal;
  color:var(--d-ink-2);margin:0 0 13px;
}
body.hl-page .lg-rule{border-top-color:var(--d-line)}

/* The stat panel is the page. This number is the only reason anyone opens the
   URL, so it stops being a 168px pale box beside the text and becomes the hero:
   one dark-glass panel at full column width, number first, explainer under a
   hairline inside the same panel. Glass recipe is the band's card unchanged,
   .055 white on a .085 hairline, 32px radius, 0 40px 90px rgba(24,38,66,.10). The
   teal wash is 7%, enough to give the corner depth without becoming a second
   accent. */
body.hl-page .hl-hero{
  display:block;margin:2px 0 0;padding:34px 36px 32px;border-radius:32px;
  background:
    radial-gradient(120% 150% at 0% 0%, rgba(0,160,121,.07), rgba(0,0,0,0) 58%),
    var(--d-surface);
  border:1px solid var(--d-line);
  box-shadow:0 40px 90px rgba(24,38,66,.10);
}
/* strip the light card off .hl-figure, the panel above is the card now */
body.hl-page .hl-figure{
  display:block;min-width:0;padding:0 0 22px;text-align:left;
  background:none;border:0;border-radius:0;box-shadow:none;
  border-bottom:1px solid var(--d-line);
}
/* Fluid because the 117 values are not uniform strings. Shortest is "9 hrs";
   longest is "40 min (IR), ~4 hrs (sustained-release)" at 39 characters, which
   at 44px is about 860px of type and wraps to two lines in the 640px inner
   column. Anything larger pushes those outliers to three. */
body.hl-page .hl-value{
  display:block;text-align:left;
  font-size:clamp(30px,4.6vw,44px);line-height:1.06;letter-spacing:-.035em;
  font-weight:600;color:var(--d-teal);text-wrap:balance;
}
/* Six compounds have no single figure to state. The slot still carries the same
   HALF-LIFE caption, so the phrase is set in ink rather than the accent teal and a
   step smaller: it reads as a statement about the data, not as a value. */
body.hl-page .hl-figure-none .hl-value{
  font-size:clamp(24px,3.4vw,34px);color:var(--d-ink);font-weight:600;
}
/* --d-ink-2 (7.24:1) not --d-ink-3 (4.09:1), even though this is small quiet
   type. The number beside it is already the accent, the caption need not be. */
body.hl-page .hl-label{
  display:block;margin-top:11px;
  font-size:11px;font-weight:600;letter-spacing:.16em;text-transform:uppercase;
  color:var(--d-ink-2);
}
/* Deck spec from the dark band: 1.625 leading, no negative tracking. Capped at
   18.5 rather than the band's 20 because these run long, a median of 264
   characters and 607 at the worst, which is about 8 lines in this column. */
body.hl-page .hl-lede{
  margin:22px 0 0;
  font-size:clamp(17px,1.5vw,18.5px);line-height:1.625;letter-spacing:normal;
  color:var(--d-ink-2);
}

/* The variant caveat renders immediately under the hero panel, so a light card
   here is the loudest thing on the page. The light rail is #C58A2E, a dark-on-
   white amber that goes muddy on near-black. #8A5A12 is the amber this sheet
   already ships in #compare .ck.partial, reused rather than re-picked.
   Contrast measured against the composited callout ground #FFFBF3, not
   against #0F0F0F, because the tint shifts the base: body text lands at 6.93:1
   and the #8A5A12 lead-in at 12.0:1. */
body.hl-page .hl-flag{
  margin:18px 0 0;padding:16px 20px;border-radius:18px;
  font-size:15px;line-height:1.65;color:var(--d-ink-2);
  background:rgba(247,144,9,.10);
  border:1px solid rgba(247,144,9,.12);
  border-left:3px solid #8A5A12;
}
body.hl-page .hl-flag strong{color:#8A5A12;font-weight:600}


/* ============================================================================
   3. SECTIONS AND RUNNING PROSE
   The reference wraps every deep section in its own bordered panel rather than
   separating them with whitespace alone. On a page that is one flat dark field
   top to bottom, whitespace gives the eye nothing to hold, so the panels do
   real work here they would not do on white.
   This is the QUIETER card recipe (.035 / .07 / 26px), not the 32px glass. The
   32px glass belongs to the three things that should sit forward: the hero, the
   clearance table and the CTA. Eight identical heavy panels down one page
   flattens the hierarchy back out.
   ============================================================================ */
body.hl-page .lg-sec{
  margin:18px 0 0;padding:28px 30px;
  background:var(--d-surface-2);
  border:1px solid var(--d-line-2);
  border-radius:26px;
}
body.hl-page .lg-sec>*:last-child{margin-bottom:0}   /* no dead strip at the card foot */
body.hl-page .lg-h2{
  display:block;                                     /* the light rule is a flex row for .lg-num, which these pages never emit */
  font-size:20px;font-weight:600;letter-spacing:-.025em;line-height:1.25;
  color:var(--d-ink);margin:0 0 16px;
}

/* Colour is --d-ink-2, the token the dark band already uses for its decks. It
   composites over #0F0F0F to 15 + .60*240 = 159 and measures 7.24:1, clearing
   WCAG AAA for normal text (7:1) with room rather than sitting on the line.
   Pure white was the alternative and is wrong: #fff is 19.1:1, and a full page
   of running text at that separation blooms and tires the eye. --d-ink-3 was
   the other and is 4.09:1, under AA.
   16px, up from the legal pages' 14px, and 1.7 leading rather than the deck's
   1.625: light-on-dark type needs both to survive halation, and these pages are
   read rather than skimmed for a clause.
   36em caps the measure at about 72 characters. The card interior is 652px
   (760 wrap - 48 wrap padding - 60 card padding), which at 16px Inter runs
   about 78 characters, past where the eye starts losing the return sweep. */
body.hl-page .lg-sec p{
  font-size:16px;line-height:1.7;letter-spacing:normal;
  color:var(--d-ink-2);max-width:36em;margin:0 0 16px;
}
/* Every half-life figure in the prose is wrapped in <strong>. White at 19.1:1
   is right for a two-word number the reader is scanning for, and the glare
   argument above does not apply to four characters. */
body.hl-page .lg-sec strong{color:var(--d-ink);font-weight:600}
/* Prose links only. .hl-related a is (0,1,1), so a blanket body.hl-page .lg-sec a
   at (0,2,1) would reach into the tiles and underline all 82 of them. The child
   combinator keeps it to the running text and to the "See all N compounds"
   line, which is a direct <p> child. */
body.hl-page .lg-sec>p a{
  color:var(--d-ink);font-weight:500;
  text-decoration:underline;text-underline-offset:3px;
  text-decoration-color:rgba(0,160,121,.45);
  transition:color .16s var(--ease),text-decoration-color .16s var(--ease);
}
body.hl-page .lg-sec>p a:hover{color:var(--d-teal);text-decoration-color:var(--d-teal)}


/* ============================================================================
   4. CLEARANCE TABLE
   .tw carries no rule anywhere in this sheet (grep returns nothing) and the
   class appears on the 82 half-life pages and nowhere else, so this table has
   been rendering at browser defaults: no cell padding, no rules, no alignment,
   and no scroller under a 420px min-width table on a 360px phone. This is the
   first time it is actually styled. The recipe is #compare's .ctable moved onto
   a neutral ground, not a second table language.
   ============================================================================ */
/* The wrap sits FORWARD of its section card, not recessed: .055 white over the
   card's .035 composites to 23.4 + .055*231.6 = 36 against the card's 23, a
   13-point lift that reads immediately. This is the second reason people open
   the page, so it earns the brighter surface.
   18px radius against the card's 26px. A nested panel needs a visibly smaller
   radius or the two curves fight. */
body.hl-page .hl-tw{
  overflow-x:auto;overflow-y:hidden;   /* overflow-x:auto computes y to auto too, so pin it */
  -webkit-overflow-scrolling:touch;
  margin:0 0 18px;
  background:var(--d-surface);
  border:1px solid var(--d-line);
  border-radius:18px;
  box-shadow:0 18px 40px rgba(24,38,66,.08);
}
body.hl-page .hl-tw:focus-visible{outline:2px solid var(--d-teal);outline-offset:2px}
body.hl-page .hl-tw table{
  width:100%;border-collapse:collapse;min-width:340px;
  font-variant-numeric:tabular-nums;   /* all three columns carry digits, so the whole grid aligns */
}
/* Micro-caps header, the same 11px/600/uppercase already used by .hl-label in
   the hero. Opaque var(--card-2) rather than a tint: the header must read as a solid
   band, and an alpha layer over an alpha wrap over an alpha card stacks to a
   muddy in-between value. Darker than the wrap for the same reason #compare's
   thead is darker than its own wrap. The third th carries an inline
   text-align:right in the generated markup and keeps it, which is correct: the
   percentage column is numeric and right-aligned. */
body.hl-page .hl-tw thead th{
  background:var(--card-2);color:var(--d-ink-2);
  font-size:11px;font-weight:600;letter-spacing:.13em;text-transform:uppercase;
  text-align:left;vertical-align:bottom;padding:16px 18px 13px;line-height:1.3;
  border-bottom:1px solid var(--d-line);
}
body.hl-page .hl-tw tbody td{
  padding:15px 18px;font-size:15px;line-height:1.45;
  color:var(--d-ink-2);border-bottom:1px solid var(--d-line);
}
body.hl-page .hl-tw tbody tr:last-child td{border-bottom:0}
body.hl-page .hl-tw tbody tr:hover td{background:var(--card-2)}
/* 68px, not the light sheet's 96px. The column holds a single digit, 1 to 5, so
   96 was buying nothing and spending 28px the narrow layout needs. The
   "Half-lives" header wraps to two lines at this width, and vertical-align:
   bottom above is what keeps the other two headers on the same baseline as
   "LIVES" instead of floating in the middle of a taller row. */
body.hl-page .hl-tw td.hl-n{width:68px;color:var(--d-ink);font-weight:600}
/* The decay percentage is the answer the page exists to give, so it takes the
   accent, the way #compare tints its own column. 11.6:1 on this ground. To pull
   it back to plain white, delete the color declaration. */
body.hl-page .hl-tw td.hl-pct{text-align:right;color:var(--d-teal);font-weight:600}
/* 5.68:1 at 13.5px, see --hl-ink-quiet. This is a real caveat about what the
   table does and does not mean, so it has to stay legible. */
body.hl-page .hl-note{
  font-size:13.5px;line-height:1.6;color:var(--hl-ink-quiet);max-width:40em;margin:0;
}


/* ============================================================================
   5. CONVERSION BLOCK
   No second sticky bar at the bottom. The reference needs one because its top
   nav is category links only and carries no CTA at all. Ours carries the CTA,
   so a bottom bar would spend another 56px, about 7 percent of an 812pt phone
   viewport, repeating a button already on screen, on a page whose job is to
   stay readable. One persistent CTA and one in-body CTA.
   ============================================================================ */
body.hl-page .hl-cta{
  margin:44px 0 8px;padding:34px 30px 30px;border-radius:32px;text-align:center;
  /* The band's glass card plus a teal wash from the top left, so it lifts off
     the ground without a ring. The light version used a 1px solid teal border,
     which on dark reads as neon and pulls harder than its own button. */
  background:
    radial-gradient(120% 100% at 0% 0%, rgba(0,160,121,.11), rgba(0,0,0,0) 62%),
    var(--d-surface);
  border:1px solid var(--d-line);
  box-shadow:0 40px 90px rgba(24,38,66,.10);
}
body.hl-page .hl-cta h2{
  margin:0 0 10px;font-size:clamp(22px,3.4vw,27px);
  font-weight:600;letter-spacing:-.03em;line-height:1.15;color:var(--d-ink);
}
body.hl-page .hl-cta p{
  margin:0 auto 22px;max-width:52ch;
  font-size:15px;line-height:1.625;letter-spacing:normal;color:var(--d-ink-2);
}
/* Stock .sup-btn is a #F7F8FA to #FBFCFE navy gradient: on a #0F0F0F ground
   that is a button you have to hunt for. (0,3,0) beats the existing
   .lg-sec a.sup-btn at (0,2,1) on class count, so this wins on specificity
   rather than on source order. */
body.hl-page .hl-cta .sup-btn{
  padding:14px 26px;font-size:15.5px;font-weight:700;
  color:#fff;background:linear-gradient(135deg,var(--teal-2),var(--teal));
  box-shadow:0 8px 26px rgba(0,160,121,.26);
}
body.hl-page .hl-cta .sup-btn:hover{transform:translateY(-2px);box-shadow:0 12px 34px rgba(0,160,121,.34)}


/* ============================================================================
   6. COMPOUND TILES  (the compound page's 6 related, and the hub's 82)
   ============================================================================ */
/* Jump rail, hub only. It wraps rather than scrolls: 7 pills at about 92px land
   in 2 rows in the 712px column and 3 rows at 375. Every group visible beats
   every group swipeable, and a wrapped rail cannot hide a category past an edge. */
body.hl-page .hl-cats{display:flex;flex-wrap:wrap;gap:8px;margin:22px 0 4px;padding:0}
body.hl-page .hl-cats a{
  display:inline-flex;align-items:center;gap:8px;
  padding:8px 14px;border-radius:var(--pill);
  font-size:12.5px;font-weight:600;letter-spacing:-.005em;color:var(--d-ink-2);
  background:var(--d-surface-2);border:1px solid var(--d-line-2);
  transition:color .16s var(--ease),background .16s var(--ease),border-color .16s var(--ease);
}
body.hl-page .hl-cats a:hover{color:var(--d-ink);background:var(--d-surface);border-color:rgba(0,160,121,.38)}
body.hl-page .hl-cats a b{font-weight:700;font-size:11px;color:var(--d-teal);font-variant-numeric:tabular-nums}
/* A jumped-to group has to land under the bar, not 28px behind it: bar height
   plus the card's own 28px top padding. */
body.hl-page .hl-cat{scroll-margin-top:calc(var(--hl-nav-h) + 28px)}

body.hl-page .lg-sec ul.hl-related{
  list-style:none;margin:0 0 16px;
  /* .lg-sec ul is (0,1,1) and outranks .hl-related at (0,1,0) whatever the
     source order, so padding-left:20px has been indenting this grid on every
     live page. getComputedStyle on the current light b12 page returns 20px. */
  padding-left:0;
  display:grid;gap:9px;max-width:none;
  /* Two columns on the compound page as well as on the hub. Six single-column
     tiles across a 652px card leaves a dead 300px channel between each name and
     its figure. 240 gives the same count as 232 or 260 here, floor(661/249)=2,
     so one value serves both pages. */
  grid-template-columns:repeat(auto-fit,minmax(240px,1fr));
}
body.hl-page .hl-related li{
  position:relative;
  /* flex-wrap, with the span below allowed to shrink, is the fix for a real
     overflow the light sheet still has. At a 320px viewport the tile interior is
     191px and the longest value, "~2-3 days (prop), ~10 days (enan)", is 240px
     of type against flex:0 0 auto, so it pushed the document 40px wide and no
     gesture could reach it. Wrapped, the value drops to its own line and its
     text wraps inside the tile. On every wider screen both still sit on one
     line, so nothing above 400px changes. */
  display:flex;flex-wrap:wrap;align-items:baseline;justify-content:space-between;gap:12px;
  padding:13px 16px;border-radius:14px;
  /* .035 white over the card's .035 stacks to 23.4 + .035*231.6 = 31 against
     the card's 23. Alpha compounds, so one token both makes the card and
     separates the tiles inside it, with no second value. */
  background:var(--d-surface-2);
  border:1px solid var(--d-line);
  transition:background .16s var(--ease),border-color .16s var(--ease);
}
body.hl-page .hl-related a{font-size:14.5px;font-weight:600;color:var(--d-ink);text-decoration:none}
/* tabular-nums so the values line up down the column and two compounds can be
   compared without reading either name. */
body.hl-page .hl-related span{
  flex:0 1 auto;   /* shrinkable, so a long value wraps instead of overflowing the tile */
  font-size:12.5px;color:var(--hl-ink-quiet);font-variant-numeric:tabular-nums;
}
/* The whole tile becomes the target. The link text alone is about 62 by 18,
   under the 24 by 24 minimum, and on an 82-row index every visit is a tap.
   Stated tradeoff: the half-life value stops being selectable, because the
   overlay paints above it. Worth it on an index of links. */
@supports selector(:has(*)){
  body.hl-page .hl-related a::after{content:"";position:absolute;inset:0;border-radius:inherit}
  body.hl-page .hl-related a:focus-visible{outline:none}   /* the overlay swallows the link's own ring */
  body.hl-page .hl-related li:has(a:focus-visible){outline:2px solid var(--d-teal);outline-offset:2px}
}
body.hl-page .hl-related li:hover,
body.hl-page .hl-related li:focus-within{background:rgba(12,16,23,.030);border-color:rgba(0,160,121,.34)}
body.hl-page .hl-related li:hover a,
body.hl-page .hl-related li:focus-within a{color:var(--d-teal)}


/* ============================================================================
   7. FOOTER
   Shared markup, and an #F4F4F5 band. Left alone it lands as a white slab under
   a black page: the loudest thing on screen and the least important. It also
   carries the only route to Features, Pricing and Support on a phone, so it has
   to survive rather than be hidden. #F4F4F5 is 4 points under the page's
   15,15,15, so the seam is the hairline and not a colour change.
   ============================================================================ */
body.hl-page .footer{background:#F4F4F5;border-top:1px solid var(--d-line);color:var(--d-ink-2)}
body.hl-page .footer .f-logo{color:var(--d-ink)}
body.hl-page .footer .f-logo .mark{box-shadow:0 3px 10px rgba(24,38,66,.12),0 0 0 1px rgba(12,16,23,.05)}
body.hl-page .footer .f-tag,
body.hl-page .footer .f-links,
body.hl-page .footer .f-legal{color:var(--d-ink-2)}
body.hl-page .footer .f-links a:hover,
body.hl-page .footer .f-legal a:hover{color:var(--d-teal)}
/* The one place --d-ink-3 is right: a legal footnote that must be present and
   must not compete. It is 4.09:1, under AA, so if this line ever has to clear
   AA, move it to --d-ink-2. */
body.hl-page .footer .f-fine{color:var(--d-ink-3)}


/* ============================================================================
   8. NARROW
   ============================================================================ */
/* 720 is where the three secondary nav links stop fitting and the footer takes
   over as their route. Measured at these styles the parts are: logo lockup 116,
   LIBRARY 57, CTA 96, two 10px gaps. With the 24px gutter that is
   48+116+10+57+10+96 = 337 inside 720, and with the 20px gutter below 640 it is
   40+116+10+57+10+96 = 329, which fits 375 with 46 spare and 360 with 31.
   All four links do not fit at any of these widths. */
@media(max-width:720px){
  body.hl-page{--hl-nav-h:52px}                    /* 26px tile + 13 above and below */
  body.hl-page .hl-nav-in{gap:10px}   /* gutter stays 24 here: .legal-wrap does not drop to 20 until 640, and the two have to agree */
  body.hl-page .hl-nav-logo{font-size:13.5px;gap:8px}
  body.hl-page .hl-nav-logo .mark{width:26px;height:26px}
  body.hl-page .hl-nav-links{gap:0}
  /* Qualified, not bare. body.hl-page .hl-nav-links a is (0,3,1) and outranks a
     lone .hl-nav-wide at (0,1,0) whatever the media query says, so the bare
     version of this line leaves all four links on screen and overflows the bar. */
  body.hl-page .hl-nav-links a.hl-nav-wide{display:none}
  body.hl-page .hl-nav-cta{margin-left:10px;padding:8px 13px;font-size:12.5px}
}
/* The row above needs 329 and a 320 viewport gives 320, so it overflows by 9px.
   Dropping the wordmark takes the lockup from 116 to 26 and the row to 239.
   360, not 329, because 360 is the threshold .nav-logo .wm already uses. */
@media(max-width:360px){body.hl-page .hl-nav-logo .wm{display:none}}

@media(max-width:640px){
  /* .legal-wrap drops to 20px of padding here, so the bar's gutter follows it
     or the wordmark stops lining up with the h1. */
  body.hl-page .hl-nav-in{padding:0 20px}
  body.hl-page .lg-back{margin-bottom:24px}
  body.hl-page .lg-title{margin-bottom:22px}
  /* keep the 32px radius at full width and trim the padding instead */
  body.hl-page .hl-hero{padding:24px 22px 22px}
  body.hl-page .hl-figure{padding-bottom:18px}
  body.hl-page .hl-lede{margin-top:18px}
  body.hl-page .hl-flag{padding:14px 16px;font-size:14.5px;border-radius:16px}
  body.hl-page .lg-sec{margin-top:14px;padding:22px 20px;border-radius:22px}
  body.hl-page .lg-h2{font-size:18px;margin-bottom:14px}
  body.hl-page .lg-sec p{font-size:15.5px;line-height:1.68}
  body.hl-page .hl-cat{scroll-margin-top:calc(var(--hl-nav-h) + 22px)}
  /* The table bleeds to the card edges rather than shrinking further. At a
     375px viewport the wrap is 375 - 40 = 335, minus 2px of card border = 333,
     minus 40 of card padding = 293 of interior. The -20/-20 bleed hands that 40
     back and the table gets the full 333. Square edges are safe because the
     table never sits at a card corner: an h2 is always above it and the note
     always below. */
  body.hl-page .hl-tw{
    margin-left:-20px;margin-right:-20px;
    border-radius:0;border-left-width:0;border-right-width:0;box-shadow:none;
  }
  /* 300, down from the 340 floor. 340 against the 333 measured above forces 7px
     of sideways drag on a table that does not need it: at 300 the columns lay
     out 68 + 140 + 125 = 333 and scrollWidth equals clientWidth, so nothing
     moves. The floor still catches a 320px screen, where the table scrolls 22px
     inside its own container rather than crushing the answer column. */
  body.hl-page .hl-tw table{min-width:300px}
  body.hl-page .hl-tw thead th{padding:12px 14px;letter-spacing:.10em}
  body.hl-page .hl-tw tbody td{padding:13px 14px;font-size:14.5px}
  body.hl-page .hl-tw td.hl-n{width:56px}
  body.hl-page .hl-cta{margin-top:38px;padding:26px 20px 24px;border-radius:26px}
  body.hl-page .hl-cta .sup-btn{width:100%;padding:15px 20px}
  body.hl-page .lg-sec ul.hl-related{grid-template-columns:1fr}
  body.hl-page .hl-cats{gap:7px;margin-top:18px}
  body.hl-page .hl-cats a{padding:7px 12px;font-size:12px}
  body.hl-page::after{height:380px}
}
@media(prefers-reduced-motion:reduce){
  body.hl-page .lg-back,
  body.hl-page .hl-nav-cta,
  body.hl-page .hl-cta .sup-btn{transition:none}
  body.hl-page .hl-nav-cta:hover,
  body.hl-page .hl-cta .sup-btn:hover{transform:none}
}

/* Research list. Same tile shell as .hl-related, but a citation is a line of prose
   and a compound name is a label, so this one stacks title over meta and lets the
   title wrap instead of holding one line. */
body.hl-page .hl-src li{flex-direction:column;align-items:flex-start;gap:5px}
/* "250 mcg" was wrapping to two lines in a 79px column. The cell holds either a
   single digit or a short dose, so it never needs to wrap. */
body.hl-page .hl-tw td.hl-n{white-space:nowrap}
body.hl-page .hl-src a{font-size:14.5px;font-weight:600;line-height:1.45;color:var(--ink)}
body.hl-page .hl-src a:hover{color:var(--teal-2)}
body.hl-page .hl-src span{font-size:12.5px;color:var(--ink-3,var(--ink-2));font-variant-numeric:normal}

/* ============================================================================
   Half-life pages: two column shell
   ----------------------------------------------------------------------------
   Measured against the reference before changing anything. On a 1903px screen our
   page used 760px, 40 percent, with 572px of dead gutter on each side. The
   reference fills the width: its prose sits at x268 to x1036, 768px wide, which is
   almost exactly our 712, but a sticky sidebar occupies the left and its tables run
   642 to 1474, wider than the prose.

   So the fix is NOT a wider paragraph. 712 and 768 are both correct measures for
   reading. The fix is putting something in the gutter and letting the data blocks
   break out past the text column.
   ============================================================================ */
body.hl-page .hl-wrap{max-width:1240px}
body.hl-page .hl-shell{
  display:grid;
  /* 260 sidebar + 40 gap + 900 content = 1200, inside the 1240 wrap less its
     24px gutters. The content column is 900 rather than 712 so tables and tiles
     can use it while prose stays capped below. */
  grid-template-columns:260px minmax(0,1fr);
  gap:40px;align-items:start;
}
/* Prose stays at a readable measure even though its column is wider. 68ch at
   16px Inter is about 700px, which is the width the page had before and close to
   the reference's 768. Tables, tiles and the CTA are deliberately NOT capped, so
   they fill the 900 and the page stops looking half empty. */
body.hl-page .hl-main .lg-sec p,
body.hl-page .hl-main .hl-lede,
body.hl-page .hl-main .hl-note{max-width:68ch}

/* Sticky sidebar. top is the bar height plus the same 28px of air the cards use. */
body.hl-page .hl-side{position:sticky;top:calc(var(--hl-nav-h) + 28px);display:grid;gap:14px}
body.hl-page .hl-toc{
  padding:18px 18px 16px;border-radius:20px;
  background:var(--card);border:1px solid var(--line);box-shadow:var(--shadow-sm);
}
body.hl-page .hl-toc-h{
  display:block;font-family:var(--mono);font-size:11px;font-weight:600;
  letter-spacing:.13em;text-transform:uppercase;color:var(--ink-3,var(--ink-2));margin-bottom:10px;
}
body.hl-page .hl-toc ul{list-style:none;margin:0;padding:0;display:grid;gap:2px}
body.hl-page .hl-toc a{
  display:block;padding:7px 10px;border-radius:10px;
  font-size:13.5px;font-weight:550;line-height:1.35;color:var(--ink-2);
  text-decoration:none;transition:color .16s var(--ease),background .16s var(--ease);
}
body.hl-page .hl-toc a:hover{color:var(--ink);background:rgba(12,16,23,.045)}
body.hl-page .hl-side-cta{
  padding:18px;border-radius:20px;
  background:var(--teal-soft);border:1px solid rgba(0,180,135,.22);
}
body.hl-page .hl-side-cta strong{display:block;font-size:14.5px;letter-spacing:-.015em;color:var(--ink)}
body.hl-page .hl-side-cta p{margin:6px 0 12px;font-size:13px;line-height:1.55;color:var(--ink-2)}
body.hl-page .hl-side-cta .sup-btn{width:100%;justify-content:center;padding:11px 14px;font-size:13.5px}
/* A jumped-to section lands under the bar, not behind it. */
body.hl-page .lg-sec[id]{scroll-margin-top:calc(var(--hl-nav-h) + 20px)}

/* Below 1080 there is no room for a sidebar beside a 900px column, so the TOC
   becomes a horizontal chip rail above the content and the grid collapses. */
@media(max-width:1080px){
  body.hl-page .hl-wrap{max-width:860px}
  body.hl-page .hl-shell{grid-template-columns:minmax(0,1fr);gap:0}
  /* min-width:0 on both. A grid item defaults to min-width:auto, so the TOC's
     max-content column row below refuses to shrink and pushes the page wider than
     the viewport. Measured before this line: 123px of overflow at 1080 and 267px
     at 834, with the page scrolling sideways on every half-life page. */
  body.hl-page .hl-side{position:static;grid-template-columns:minmax(0,1fr);margin-bottom:4px;min-width:0}
  body.hl-page .hl-toc{padding:14px 16px;min-width:0}
  body.hl-page .hl-toc ul{grid-auto-flow:column;grid-auto-columns:max-content;
    gap:6px;overflow-x:auto;scrollbar-width:none;padding-bottom:2px}
  body.hl-page .hl-toc ul::-webkit-scrollbar{display:none}
  body.hl-page .hl-toc a{white-space:nowrap;background:var(--card-2);border:1px solid var(--line)}
  /* The sidebar CTA duplicates the in-body one once they are stacked. */
  body.hl-page .hl-side-cta{display:none}
}
