/* hand-pain.html only: the whole page's layout, drawings and motion.
   Loaded after site.css. Nothing here is shared with another page. */

/* On the root, because scroll-padding is read from it: a jump to a section,
   and a Tab to anything further up the page, both stop below the sticky
   header and the bar instead of under them. */
:root {
  --hp-nav: 70px;          /* the sticky site header; hand-pain.js keeps it measured */
  --hp-index: 56px;        /* the bar under it */
  scroll-padding-top: calc(var(--hp-nav) + var(--hp-index) + 14px);
}
.hp-page {
  --hp-ease: var(--ease-out-expo);
  --hp-accent: var(--accent-blue);
  --hp-ice: var(--accent-ice);
}
/* Parts waiting to slide in must not make the page scroll sideways. */
.hp-page main { overflow-x: clip; }

/* colors_and_type.css caps every bare <p> at 42rem and underlines every <a>.
   Text here fills the column it sits in, and each link that should be
   underlined says so itself. */
.hp-page main p { max-width: none; }
.hp-page main a:not(.btn) { border-bottom: 0; }

/* A long heading breaks between its halves, never inside one. */
.hp-page main h1 > span, .hp-page main h2 > .h-lead, .hp-page main h2 > em { display: inline-block; }
/* A jump moves focus to the heading it lands on: ringed for a keyboard, quiet for a mouse. */
.hp-page main [tabindex="-1"]:focus { outline: none; }
.hp-page main [tabindex="-1"]:focus-visible { outline: 2px solid var(--hp-accent); outline-offset: 6px; border-radius: 4px; }
.hp-sec--dark [tabindex="-1"]:focus-visible { outline-color: var(--hp-ice); }

.hp-defs { position: absolute; width: 0; height: 0; overflow: hidden; }

/* ---------- the hand's bones (hero, close-ups, treatment drawing) ----------
   Colours come through custom properties, which a <use> passes on to the
   symbol it draws; a rule keyed on the drawing's own class would not. */
.hp-bone path {
  fill: none; stroke: var(--hp-bone-c, var(--ink-muted)); stroke-opacity: var(--hp-bone-o, .32);
  stroke-width: 9; stroke-linecap: round;
}
.hp-carpal circle { fill: var(--hp-bone-c, var(--ink-muted)); fill-opacity: calc(var(--hp-bone-o, .32) / 2); }
.hp-joint circle { fill: var(--hp-joint-fill, #fff); stroke: var(--hp-bone-c, var(--ink-muted)); stroke-opacity: .55; stroke-width: 1.6; }
.hp-zone { fill: var(--hp-accent); fill-opacity: .24; stroke: var(--hp-accent); stroke-width: 2.5; transform-box: fill-box; transform-origin: center; }

/* ---------- sections ---------- */
.hp-sec { padding: clamp(64px, 8.5vw, 124px) 0; }
.hp-sec--wash { background: var(--accent-wash); }
.hp-sec--dark { background: var(--navy-brand); color: #fff; }
.hp-sec--rule { padding-top: 0; }
.hp-sec--after { padding-top: 0; }
.hp-sec--rule > .container::before { content: ""; display: block; height: 1px; background: var(--border); margin-bottom: clamp(56px, 7vw, 96px); }
.hp-h2 {
  font-family: var(--font-display); font-weight: 300;
  font-size: clamp(1.9rem, 3.2vw, 2.9rem); line-height: 1.1; letter-spacing: -.012em;
  color: var(--ink); margin: 0 0 clamp(22px, 2.4vw, 30px);
}
.hp-sec--dark .hp-h2 { color: #fff; }
.hp-lede { font-size: clamp(17px, 1.35vw, 19px); line-height: 1.65; color: var(--ink-soft); margin: 0; }
.hp-sec--dark .hp-lede { color: rgba(255, 255, 255, .78); }

/* ---------- hero ---------- */
.hp-hero { background: #fff; padding: clamp(40px, 6vw, 84px) 0 clamp(32px, 4.5vw, 60px); }
.hp-hero__grid {
  display: grid; grid-template-columns: minmax(0, 1fr) clamp(240px, 27vw, 350px);
  column-gap: clamp(32px, 5vw, 76px);
}
/* The words and the buttons are two rows beside the drawing, which spans
   both: the pair still centres on it as one block. */
.hp-hero__copy { grid-column: 1; grid-row: 1; align-self: end; }
.hp-hero__actions { grid-column: 1; grid-row: 2; align-self: start; display: flex; flex-wrap: wrap; align-items: center; gap: 16px 30px; }
.hp-hero__hand { grid-column: 2; grid-row: 1 / span 2; align-self: center; margin: 0; }
.hp-hero h1 {
  font-family: var(--font-display); font-weight: 300;
  font-size: clamp(2.3rem, 4.15vw, 3.8rem); line-height: 1.04; letter-spacing: -.018em;
  color: var(--ink); margin: 0 0 26px;
}
.hp-hero h1 .h-tail { font-style: italic; font-weight: 400; color: var(--hp-accent); }
.hp-hero__lede { font-size: clamp(17px, 1.4vw, 19px); line-height: 1.65; color: var(--ink-soft); margin: 0 0 32px; }
.hp-page main a.hp-back {
  font-size: 15px; color: var(--ink-soft);
  background: linear-gradient(currentColor, currentColor) 0 100% / 100% 1px no-repeat;
  padding-bottom: 3px; transition: color .25s var(--hp-ease), background-size .4s var(--hp-ease);
}
@media (hover: hover) { .hp-page main a.hp-back:hover { color: var(--hp-accent); background-size: 0 1px; background-position: 100% 100%; } }
.hp-back:focus-visible { outline: 2px solid var(--hp-accent); outline-offset: 4px; border-radius: 3px; }

/* The wrist's name runs past the drawing's right edge, so the drawing leaves it room. */
.hp-hand { display: block; width: calc(100% - 46px); height: auto; overflow: visible; }

/* The three lit joints are links to the matching condition below. */
.hp-spot { cursor: pointer; outline: none; }
.hp-spot__hit { fill: transparent; }
.hp-spot__hit--touch { display: none; }
.hp-spot__dot { fill: var(--hp-accent); }
.hp-spot__name {
  font-family: var(--font-body); font-size: 12.5px; font-weight: 500; fill: var(--ink-soft);
  transition: fill .25s var(--hp-ease);
}
/* Only the hit shapes and the name take the pointer: a ring grows when it beats or is hovered, and must not reach over its neighbour's target. */
.hp-spot__dot, .hp-spot__ring { pointer-events: none; }
.hp-spot__ring {
  fill: var(--hp-accent); fill-opacity: .14; stroke: var(--hp-accent); stroke-opacity: .5; stroke-width: 1.5;
  transform-box: fill-box; transform-origin: center;
  transition: fill-opacity .3s var(--hp-ease), transform .4s var(--hp-ease);
}
/* --hp-fade: the ring is the focus mark, so a beat must not fade it out while a joint has focus. */
.hp-spot:focus-visible .hp-spot__ring { fill-opacity: .3; transform: scale(1.35); stroke-width: 2.5; stroke-opacity: 1; --hp-fade: 1; }
.hp-spot:focus-visible .hp-spot__name { fill: var(--hp-accent); text-decoration: underline; }
/* A press is answered in the joint itself, before the page starts to move. */
.hp-spot:active .hp-spot__ring { fill-opacity: .42; transform: scale(.88); transition-duration: .1s; }
@media (hover: hover) {
  .hp-spot:hover .hp-spot__ring { fill-opacity: .3; transform: scale(1.35); }
  .hp-spot:hover:active .hp-spot__ring { fill-opacity: .42; transform: scale(1.18); }
  .hp-spot:hover .hp-spot__name { fill: var(--hp-accent); text-decoration: underline; }
}

/* ---------- the bar that follows the reader ---------- */
.hp-index {
  position: sticky; top: var(--hp-nav); z-index: 45;
  background: var(--white);
  border-top: 1px solid var(--border); border-bottom: 1px solid var(--border);
  transition: top .45s var(--hp-ease), box-shadow .4s var(--hp-ease), opacity .3s var(--hp-ease), visibility 0s;
}
.hp-index.is-on { box-shadow: 0 10px 24px -18px rgba(11, 29, 58, .35); }
/* It steps aside for the closing call, which has nothing to jump to. */
.hp-index.is-done { opacity: 0; visibility: hidden; transition: top .45s var(--hp-ease), opacity .3s var(--hp-ease), visibility 0s .3s; }
.hp-index::after {
  content: ""; position: absolute; left: 0; right: 0; bottom: -1px; height: 2px;
  background: var(--hp-accent); opacity: .35;
  transform-origin: left; transform: scaleX(var(--hp-read, 0));
}
.hp-index .container { position: relative; }
.hp-index ul {
  /* Links carry 6px of side room for the focus ring; the row steps back by it so the words still align with the page. */
  list-style: none; margin: 0 -6px; padding: 0;
  display: flex; gap: clamp(8px, calc(3.4vw - 12px), 32px);
  overflow-x: auto; scrollbar-width: none; overscroll-behavior-x: contain; scroll-snap-type: x proximity;
}
.hp-index ul::-webkit-scrollbar { display: none; }
.hp-index li { flex: none; scroll-snap-align: start; }
.hp-page .hp-index a {
  position: relative; display: block; padding: 16px 6px 15px;
  font-size: 14.5px; font-weight: 500; color: var(--ink-muted); text-decoration: none; white-space: nowrap;
  transition: color .25s var(--hp-ease);
}
.hp-index a::after {
  content: ""; position: absolute; left: 6px; right: 6px; bottom: 0; height: 2px;
  background: var(--hp-accent); transform: scaleX(0); transform-origin: left;
  transition: transform .4s var(--hp-ease);
}
@media (hover: hover) { .hp-page .hp-index a:hover { color: var(--ink); } .hp-index a:hover::after { transform: scaleX(.35); } }
.hp-page .hp-index a[aria-current="location"] { color: var(--ink); }
.hp-index a[aria-current="location"]::after, .hp-index a:focus-visible::after { transform: scaleX(1); }
/* The row scrolls sideways, so it clips anything drawn outside a link: the focus ring sits inside. */
.hp-index a:focus-visible { outline: 2px solid var(--hp-accent); outline-offset: -2px; border-radius: 4px; }
/* A fade at whichever edge still has links beyond it (hand-pain.js marks the edges). */
.hp-index .container::before, .hp-index .container::after {
  content: ""; position: absolute; top: 0; bottom: 0; width: 40px; z-index: 1;
  pointer-events: none; opacity: 0; transition: opacity .25s var(--hp-ease);
}
.hp-index .container::before { left: 0; background: linear-gradient(90deg, #fff 30%, rgba(255, 255, 255, 0)); }
.hp-index .container::after { right: 0; background: linear-gradient(270deg, #fff 30%, rgba(255, 255, 255, 0)); }
.hp-index.has-left .container::before, .hp-index.has-right .container::after { opacity: 1; }

/* ---------- who qualifies: an essay beside two joints ---------- */
.hp-cand__grid {
  display: grid; grid-template-columns: minmax(0, 1.08fr) minmax(0, 1fr);
  gap: clamp(36px, 6vw, 92px); align-items: start;
}
.hp-cand__text p, .hp-proto__text p { font-size: 16.5px; line-height: 1.75; color: var(--ink-soft); margin: 0 0 20px; }
.hp-cand__text p:last-child, .hp-proto__text p:last-child { margin-bottom: 0; }
.hp-cand__text .hp-lead { font-size: clamp(18px, 1.5vw, 20.5px); line-height: 1.6; color: var(--ink); }
.hp-fit__card {
  display: grid; grid-template-columns: 118px minmax(0, 1fr); gap: clamp(18px, 2.6vw, 36px); align-items: center;
  padding: 26px 0;
}
.hp-fit__card:first-child { padding-top: 4px; }
.hp-fit__card + .hp-fit__card { border-top: 1px solid var(--border); }
.hp-fit__title { font-family: var(--font-display); font-weight: 400; font-size: clamp(1.45rem, 2vw, 1.75rem); line-height: 1.15; color: var(--ink); margin: 0 0 8px; }
.hp-fit__card--yes .hp-fit__title { color: var(--hp-accent); }
.hp-fit__card p { font-size: 15.5px; line-height: 1.65; color: var(--ink-soft); margin: 0; }

/* The base of the thumb, seen close: the thumb's long bone sitting on the
   small wrist bone under it. In the first the two line up with a clear gap
   between them; in the second the long bone has slid off its seat. */
.hp-cmc { width: 118px; height: 130px; overflow: visible; }
.hp-cmc path, .hp-cmc rect { fill: none; stroke-linecap: round; }
.hp-cmc__trap { stroke: var(--ink-muted); stroke-opacity: .3; stroke-width: 34; }
.hp-cmc__shaft { stroke: var(--ink-muted); stroke-opacity: .42; stroke-width: 22; }
.hp-cmc__base { stroke: var(--ink-muted); stroke-opacity: .42; stroke-width: 16; }
.hp-cmc__space { stroke: var(--hp-accent); stroke-width: 3.2; stroke-dasharray: 1; }
.hp-cmc__ghost { stroke: var(--ink-muted); stroke-opacity: .5; stroke-width: 1.4; stroke-dasharray: 3 4; }
.hp-cmc__meta { transform-box: view-box; transform-origin: 60px 70px; }
.hp-fit__card--no .hp-cmc__meta { transform: translate(20px, 4px) rotate(13deg); }

/* ---------- conditions: three rows, each with its part of the hand ---------- */
.hp-conds__head { margin-bottom: clamp(28px, 3.6vw, 48px); }
.hp-cond {
  position: relative;
  display: grid; grid-template-columns: 168px minmax(0, 1fr);
  column-gap: clamp(28px, 3.6vw, 56px); row-gap: 12px;
  padding: 22px 28px; margin: 0 -28px; border-radius: 16px;
  transition: background-color .5s var(--hp-ease), box-shadow .5s var(--hp-ease);
}
.hp-cond + .hp-cond::before {
  content: ""; position: absolute; left: 28px; right: 28px; top: 0; height: 1px; background: var(--border);
  transition: opacity .3s var(--hp-ease);
}
/* Arriving from a hero joint: the row it named lights, and its neighbours' rules step back. */
.hp-cond.is-flash { background: #fff; box-shadow: 0 0 0 2px var(--hp-accent), 0 18px 44px rgba(11, 29, 58, .1); }
.hp-cond.is-flash::before, .hp-cond.is-flash + .hp-cond::before { opacity: 0; }
.hp-cond__fig { grid-row: 1 / span 2; width: 168px; height: 168px; background: #fff; border-radius: 14px; box-shadow: 0 0 0 1px rgba(11, 29, 58, .08); }
.hp-cond__t { font-family: var(--font-display); font-weight: 400; font-size: clamp(1.45rem, 2.1vw, 1.9rem); line-height: 1.14; color: var(--ink); margin: 0; align-self: end; }
.hp-cond p { font-size: 16.5px; line-height: 1.7; color: var(--ink-soft); margin: 0; align-self: start; }

/* ---------- treatment (navy): a drawing of the injection, and the day as a rail ---------- */
.hp-proto__head { margin-bottom: clamp(36px, 4.5vw, 60px); }
.hp-proto {
  display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.08fr);
  gap: clamp(36px, 6vw, 96px); align-items: start;
}
.hp-sec--dark .hp-proto__text p { color: rgba(255, 255, 255, .76); }
.hp-sec--dark .hp-proto__text strong { color: #fff; font-weight: 600; }
.hp-page main .hp-proto__text a {
  color: var(--hp-ice); white-space: nowrap;
  background: linear-gradient(currentColor, currentColor) 0 100% / 100% 1px no-repeat;
  padding-bottom: 2px; transition: color .25s var(--hp-ease);
}
@media (hover: hover) { .hp-page main .hp-proto__text a:hover { color: #fff; } }
.hp-proto__text a:focus-visible { outline: 2px solid var(--hp-ice); outline-offset: 3px; border-radius: 3px; }
@media (min-width: 1025px) and (min-height: 820px) {
  .hp-proto__side { position: sticky; top: calc(var(--hp-nav) + var(--hp-index) + 28px); }
}

/* A hand under an ultrasound probe: the needle comes in from the side, the
   screen beside it shows the same needle reaching the joint, and the cells
   are released only once it is there. */
.hp-us {
  display: block; width: 100%; height: auto; margin: 0 0 clamp(24px, 3vw, 36px);
  --hp-bone-c: #fff; --hp-bone-o: .24; --hp-joint-fill: var(--navy-brand);
}
.hp-us path, .hp-us rect, .hp-us circle { fill: none; stroke-linecap: round; stroke-linejoin: round; }
.hp-us mask rect { fill: url(#hp-us-fade); }
.hp-us__cable { stroke: var(--hp-ice); stroke-opacity: .45; stroke-width: 1.6; }
.hp-us .hp-us__probe path, .hp-us .hp-us__probe rect { fill: var(--navy-mid); stroke: var(--hp-ice); stroke-width: 2; }
.hp-us .hp-us__probe rect { fill: var(--hp-ice); }
.hp-us__hub { stroke: var(--hp-ice); stroke-width: 5; }
.hp-us__needle { stroke: #fff; stroke-width: 1.7; stroke-dasharray: 1; }
.hp-us .hp-us__target { stroke: var(--hp-ice); stroke-width: 1.8; fill: rgba(124, 169, 209, .2); transform-box: fill-box; transform-origin: center; }
.hp-us .hp-us__cells circle { fill: #fff; transform-box: fill-box; transform-origin: center; }
.hp-us .hp-us__screen { fill: rgba(255, 255, 255, .04); stroke: var(--hp-ice); stroke-opacity: .7; stroke-width: 1.6; }
.hp-us__stand { stroke: var(--hp-ice); stroke-opacity: .7; stroke-width: 1.6; }
.hp-us .hp-us__fan { fill: rgba(124, 169, 209, .16); }
.hp-us__echo { stroke: #fff; stroke-opacity: .85; stroke-width: 2.2; }

.hp-steps { list-style: none; margin: 0; padding: 0; }
.hp-step { position: relative; display: grid; grid-template-columns: 18px minmax(0, 1fr); gap: clamp(18px, 2.2vw, 28px); padding-bottom: 34px; }
.hp-step:last-child { padding-bottom: 0; }
/* The rail runs dot to dot, one segment per gap and nothing after the last,
   and each segment fills once the reader reaches the step it leads to. */
.hp-step:not(:last-child)::before, .hp-step:not(:last-child)::after {
  content: ""; position: absolute; left: 8px; top: 17px; bottom: -17px; width: 2px;
}
.hp-step:not(:last-child)::before { background: rgba(255, 255, 255, .16); }
.hp-step:not(:last-child)::after {
  background: var(--hp-ice); transform-origin: top; transform: scaleY(1);
  transition: transform .6s var(--hp-ease);
}
@media screen { .hp-js .hp-step:not(:last-child)::after { transform: scaleY(0); } }
.hp-js .hp-step:has(+ .hp-step.is-lit)::after { transform: scaleY(1); }
.hp-step__dot {
  position: relative; z-index: 1; width: 18px; height: 18px; margin-top: 8px; border-radius: 50%;
  background: var(--navy-brand); border: 2px solid rgba(255, 255, 255, .34);
  transition: border-color .4s var(--hp-ease), background-color .4s var(--hp-ease), box-shadow .4s var(--hp-ease);
}
.hp-step.is-lit .hp-step__dot { border-color: var(--hp-ice); background: var(--hp-ice); box-shadow: 0 0 0 5px rgba(124, 169, 209, .2); }
.hp-step h3 { font-family: var(--font-display); font-weight: 400; font-size: clamp(1.4rem, 2vw, 1.7rem); line-height: 1.2; color: #fff; margin: 0 0 8px; }
.hp-step p { font-size: 16px; line-height: 1.7; color: var(--fg-on-dark-muted); margin: 0; }

/* ---------- timeline: three moments and a span ---------- */
.hp-time__head { margin-bottom: clamp(40px, 5vw, 64px); }
.hp-track {
  list-style: none; margin: 0; padding: 0;
  display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: 28px;
  position: relative;
}
/* The axis runs through the three markers and stops where the last column,
   which is a stretch of months and not a moment, begins. */
.hp-track::before {
  content: ""; position: absolute; left: 7px; right: calc(25% - 14px); top: 8px; height: 2px;
  background: color-mix(in srgb, var(--hp-accent) 45%, transparent);
  transform-origin: left;
}
.hp-track__pt { position: relative; padding-top: 40px; }
.hp-track__pt::before {
  content: ""; position: absolute; left: 0; top: 1px; width: 16px; height: 16px; border-radius: 50%;
  background: #fff; border: 2px solid var(--hp-accent); box-sizing: border-box;
}
.hp-track__pt--span::before {
  width: 100%; height: 8px; top: 5px; border: 0; border-radius: 4px; transform-origin: left;
  background: linear-gradient(90deg, var(--hp-accent), var(--hp-ice) 55%, color-mix(in srgb, var(--hp-ice) 20%, transparent));
}
.hp-track__when { font-family: var(--font-display); font-size: clamp(1.7rem, 2.5vw, 2.2rem); line-height: 1; color: var(--hp-accent); margin-bottom: 12px; }
.hp-track h3 { font-family: var(--font-body); font-size: 16.5px; font-weight: 600; letter-spacing: 0; line-height: 1.3; color: var(--ink); margin: 0 0 8px; }
.hp-track p { font-size: 15.5px; line-height: 1.65; color: var(--ink-soft); margin: 0; }

/* A key and a coffee cup: the two things the sentence beside them names. */
.hp-grip {
  display: grid; grid-template-columns: 150px minmax(0, 1fr); gap: clamp(24px, 3.6vw, 52px); align-items: center;
  margin-top: clamp(44px, 5.5vw, 72px); padding-top: clamp(32px, 4vw, 48px); border-top: 1px solid var(--border);
}
.hp-grip__fig { width: 150px; height: 64px; overflow: visible; }
.hp-grip__fig path, .hp-grip__fig circle { fill: none; stroke: var(--hp-accent); stroke-width: 1.9; stroke-linecap: round; stroke-linejoin: round; stroke-dasharray: 1; }
.hp-grip p { font-family: var(--font-display); font-size: clamp(1.3rem, 1.9vw, 1.6rem); line-height: 1.4; color: var(--ink); margin: 0; }

/* ---------- questions ---------- */
.hub-faq__list { border-bottom: 1px solid var(--border); }
.hub-faq__list details { border-top: 1px solid var(--border); }
.hub-faq__list summary {
  list-style: none; cursor: pointer;
  display: grid; grid-template-columns: minmax(0, 1fr) 32px; gap: 20px; align-items: center;
  padding: 22px 4px; min-height: 44px;
  font-family: var(--font-display); font-size: clamp(1.25rem, 1.8vw, 1.55rem); line-height: 1.25; color: var(--ink);
  transition: color .25s var(--hp-ease);
}
.hub-faq__list summary::-webkit-details-marker { display: none; }
@media (hover: hover) {
  .hub-faq__list summary:hover { color: var(--hp-accent); }
  .hub-faq__list summary:hover .hub-faq__ic { border-color: var(--hp-accent); transform: scale(1.08); }
}
.hub-faq__list summary:focus-visible { outline: 2px solid var(--hp-accent); outline-offset: 2px; border-radius: 4px; }
.hub-faq__a { padding: 0 56px 26px 4px; font-size: 16.5px; line-height: 1.75; color: var(--ink-soft); }
/* The plus folds into a minus (its upright collapses) when the answer opens. */
.hub-faq__ic {
  position: relative; width: 32px; height: 32px; border-radius: 50%;
  border: 1px solid var(--border-strong); color: var(--hp-accent);
  transition: border-color .3s var(--hp-ease), transform .3s var(--hp-ease), background-color .3s var(--hp-ease);
}
.hub-faq__ic::before, .hub-faq__ic::after {
  content: ""; position: absolute; left: 50%; top: 50%; width: 12px; height: 1.6px; margin: -.8px 0 0 -6px;
  background: currentColor; border-radius: 1px;
  transition: transform .35s var(--hp-ease);
}
.hub-faq__ic::after { transform: rotate(90deg); }
details[open] .hub-faq__ic { border-color: var(--hp-accent); }
details[open] .hub-faq__ic::after { transform: rotate(90deg) scaleX(0); }

/* ---------- other joints: three links side by side, ruled apart ---------- */
.hp-rel { display: grid; grid-template-columns: repeat(3, minmax(0, 1fr)); }
/* `a.` so the shared a:hover (which a tap leaves stuck on a phone) cannot recolour the text. */
.hp-page main a.hp-rel__card {
  display: grid; grid-template-columns: 52px minmax(0, 1fr) auto; column-gap: 18px; row-gap: 4px; align-items: start;
  padding: 6px clamp(18px, 2.6vw, 36px); border-left: 1px solid var(--border);
  color: var(--ink); text-decoration: none;
}
.hp-page main a.hp-rel__card:first-child { padding-left: 0; border-left: 0; }
.hp-page main a.hp-rel__card:last-child { padding-right: 0; }
.hp-rel__icon { grid-row: 1 / span 2; width: 52px; height: 52px; fill: none; stroke: var(--hp-accent); stroke-width: 1.15; stroke-linecap: round; stroke-linejoin: round; transition: transform .45s var(--hp-ease); }
.hp-rel__title {
  font-family: var(--font-display); font-size: clamp(1.3rem, 1.8vw, 1.5rem); line-height: 1.2; color: var(--ink); justify-self: start;
  background: linear-gradient(var(--hp-accent), var(--hp-accent)) 0 100% / 0 1px no-repeat;
  transition: background-size .45s var(--hp-ease), color .25s var(--hp-ease);
}
.hp-rel__text { grid-column: 2; font-size: 15px; line-height: 1.6; color: var(--ink-soft); }
.hp-rel__arrow { grid-column: 3; grid-row: 1; font-size: 18px; line-height: 1.5; color: var(--hp-accent); transition: transform .35s var(--hp-ease); }
@media (hover: hover) {
  .hp-rel__card:hover .hp-rel__title { background-size: 100% 1px; color: var(--hp-accent); }
  .hp-rel__card:hover .hp-rel__arrow { transform: translateX(5px); }
  .hp-rel__card:hover .hp-rel__icon { transform: translateY(-3px); }
}
/* A press is felt before the next page answers. */
.hp-rel__card:active .hp-rel__arrow { transform: translateX(9px); transition-duration: .12s; }
.hp-rel__card:focus-visible { outline: 2px solid var(--hp-accent); outline-offset: 6px; border-radius: 6px; }

/* ---------- closing call ---------- */
.hp-cta h2 { margin-top: 0; }
/* The shared 42% white at 12px measures 3.65:1 on navy; this page lifts it to AA at 13px. */
.hp-cta .ctaband__disclaimer { font-size: 13px; color: rgba(255, 255, 255, .66); }

/* ---------- motion ----------
   Staged only on screen, only when the reader has not asked for less, and
   only while the page script is running (.hp-js; the head snippet drops it
   if the script has not booted in 3s). Every end state is the plain rule
   above, so print, reduced motion and no script all show the finished page. */
@keyframes hpRise { from { opacity: 0; transform: translateY(18px); } to { opacity: 1; transform: none; } }
@keyframes hpHead { from { opacity: 0; transform: translateY(.42em); } to { opacity: 1; transform: none; } }
@keyframes hpFade { from { opacity: 0; } to { opacity: 1; } }
@keyframes hpSlide { from { opacity: 0; transform: translateX(28px); } to { opacity: 1; transform: none; } }
@keyframes hpDraw { from { stroke-dashoffset: var(--hp-len, 1); } to { stroke-dashoffset: 0; } }
@keyframes hpPulse {
  0% { transform: scale(.8); opacity: 1; }
  60% { transform: scale(1.6); opacity: var(--hp-fade, 0); }
  61% { transform: scale(1); opacity: var(--hp-fade, 0); }
  100% { transform: scale(1); opacity: 1; }
}
@keyframes hpSlip { from { transform: none; } to { transform: translate(20px, 4px) rotate(13deg); } }
@keyframes hpZone { 0% { opacity: 0; transform: scale(.4); } 60% { opacity: 1; transform: scale(1.14); } 100% { opacity: 1; transform: none; } }
@keyframes hpBeat { 0%, 100% { transform: none; } 30% { transform: scale(1.22); } 60% { transform: scale(.96); } }
@keyframes hpFrame { from { opacity: 0; transform: scale(.93); } to { opacity: 1; transform: none; } }
@keyframes hpSeat { from { opacity: 0; transform: translate(-10px, 12px); } to { opacity: 1; transform: none; } }
@keyframes hpConfirm { 0% { opacity: 0; transform: scale(.5); } 55% { opacity: 1; transform: scale(1.3); } 100% { opacity: 1; transform: none; } }
@keyframes hpCell { from { opacity: 0; transform: scale(0); } to { opacity: 1; transform: none; } }
@keyframes hpAxis { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes hpAxisDown { from { transform: scaleY(0); } to { transform: scaleY(1); } }
@keyframes hpMark { 0% { opacity: 0; transform: scale(.2); } 70% { opacity: 1; transform: scale(1.25); } 100% { opacity: 1; transform: none; } }
@keyframes hpAnswer { from { opacity: 0; transform: translateY(-6px); } to { opacity: 1; transform: none; } }

@media screen and (prefers-reduced-motion: no-preference) {
  /* Hero, on first paint: the headline's two halves, the answer, the buttons, then the hand draws itself. */
  .hp-js .hp-hero h1 > span, .hp-js .hp-hero__lede, .hp-js .hp-hero__actions { opacity: 0; }
  .hp-js .hp-hero.is-in h1 > span { animation: hpHead .9s var(--hp-ease) both; }
  .hp-js .hp-hero.is-in h1 > .h-tail { animation-delay: .14s; }
  .hp-js .hp-hero.is-in .hp-hero__lede { animation: hpRise .9s var(--hp-ease) .3s both; }
  .hp-js .hp-hero.is-in .hp-hero__actions { animation: hpRise .9s var(--hp-ease) .44s both; }

  .hp-js .hp-hand .hp-bone path { stroke-dasharray: 100; stroke-dashoffset: 100; --hp-len: 100; }
  .hp-js .hp-hand .hp-joint, .hp-js .hp-hand .hp-carpal, .hp-js .hp-hand .hp-spot { opacity: 0; }
  .hp-js .hp-hand.is-in .hp-bone path { animation: hpDraw 1.4s var(--hp-ease) both; }
  .hp-js .hp-hand.is-in .hp-joint, .hp-js .hp-hand.is-in .hp-carpal, .hp-js .hp-hand.is-in .hp-spot { animation: hpFade .7s var(--hp-ease) .6s both; }
  /* Each joint beats twice, one after the other, once the hand has drawn, then
     rests: enough to say "these three can be pressed" without moving for good. */
  .hp-js .hp-hand.is-in .hp-spot__ring { animation: hpPulse 1.6s ease-out 1.3s 2; }
  .hp-js .hp-hand.is-in .hp-spot--fingers .hp-spot__ring { animation-delay: 1.7s; }
  .hp-js .hp-hand.is-in .hp-spot--wrist .hp-spot__ring { animation-delay: 2.1s; }

  /* Headings and prose rise once; what sits beside them has its own entrance below. */
  .hp-js [data-r] { opacity: 0; }
  .hp-js [data-r].is-in { animation: hpRise .9s var(--hp-ease) both; }

  /* Who qualifies: the gap in the sound joint is traced; the other joint slips off its seat. */
  .hp-js .hp-fit__card { opacity: 0; }
  .hp-js .hp-fit.is-in .hp-fit__card { animation: hpRise .8s var(--hp-ease) both; }
  .hp-js .hp-fit.is-in .hp-fit__card:nth-child(2) { animation-delay: .16s; }
  .hp-js .hp-fit .hp-cmc__space { stroke-dashoffset: 1; }
  .hp-js .hp-fit.is-in .hp-cmc__space { animation: hpDraw .9s var(--hp-ease) .5s both; }
  .hp-js .hp-fit .hp-fit__card--no .hp-cmc__meta { transform: none; }
  .hp-js .hp-fit.is-in .hp-fit__card--no .hp-cmc__meta { animation: hpSlip 1.1s cubic-bezier(.5, 0, .2, 1) .9s both; }

  /* Conditions: each close-up settles into its frame and its joints light. */
  .hp-js .hp-cond .hp-cond__fig, .hp-js .hp-cond .hp-zone, .hp-js .hp-cond .hp-cond__t, .hp-js .hp-cond p { opacity: 0; }
  .hp-js .hp-cond.is-in .hp-cond__fig { animation: hpFrame .8s var(--hp-ease) both; }
  .hp-js .hp-cond.is-in .hp-zone { animation: hpZone .8s var(--hp-ease) .35s both; }
  .hp-js .hp-cond.is-in .hp-cond__t { animation: hpFade .8s var(--hp-ease) .1s both; }
  .hp-js .hp-cond.is-in p { animation: hpFade .8s var(--hp-ease) .2s both; }
  /* Arriving from a hero joint, the joints that were pressed answer once in the close-up. */
  .hp-js .hp-cond.is-in.is-flash .hp-zone { animation: hpBeat .9s var(--hp-ease) .5s 1; }

  /* Treatment: the probe is set down, the needle comes in on the hand and on
     the screen together, the target answers, and only then the cells appear. */
  .hp-js .hp-us .hp-us__probe > g, .hp-js .hp-us .hp-us__hub, .hp-js .hp-us .hp-us__target, .hp-js .hp-us .hp-us__cells circle { opacity: 0; }
  .hp-js .hp-us .hp-us__needle { stroke-dashoffset: 1; }
  .hp-js .hp-us.is-in .hp-us__probe > g { animation: hpSeat .8s var(--hp-ease) both; }
  .hp-js .hp-us.is-in .hp-us__hub { animation: hpFade .4s var(--hp-ease) .55s both; }
  .hp-js .hp-us.is-in .hp-us__needle { animation: hpDraw 1.3s cubic-bezier(.45, 0, .2, 1) .7s both; }
  .hp-js .hp-us.is-in .hp-us__target { animation: hpConfirm .7s var(--hp-ease) 1.9s both; }
  .hp-js .hp-us.is-in .hp-us__cells circle { animation: hpCell .5s var(--hp-ease) 2.5s both; }
  .hp-js .hp-us.is-in .hp-us__cells circle:nth-child(2) { animation-delay: 2.62s; }
  .hp-js .hp-us.is-in .hp-us__cells circle:nth-child(3) { animation-delay: 2.74s; }

  /* Timeline: the axis is drawn left to right and each moment arrives as the line reaches it. */
  .hp-js .hp-track::before { transform: scaleX(0); }
  .hp-js .hp-track.is-in::before { animation: hpAxis 1.5s var(--hp-ease) both; }
  .hp-js .hp-track__pt { opacity: 0; }
  .hp-js .hp-track.is-in .hp-track__pt { animation: hpRise .7s var(--hp-ease) both; }
  .hp-js .hp-track.is-in .hp-track__pt:nth-child(2) { animation-delay: .3s; }
  .hp-js .hp-track.is-in .hp-track__pt:nth-child(3) { animation-delay: .6s; }
  .hp-js .hp-track.is-in .hp-track__pt:nth-child(4) { animation-delay: .9s; }
  .hp-js .hp-track.is-in .hp-track__pt:not(.hp-track__pt--span)::before { animation: hpMark .6s var(--hp-ease) .15s both; }
  .hp-js .hp-track.is-in .hp-track__pt:nth-child(2)::before { animation-delay: .45s; }
  .hp-js .hp-track.is-in .hp-track__pt:nth-child(3)::before { animation-delay: .75s; }
  .hp-js .hp-track.is-in .hp-track__pt--span::before { animation: hpAxis 1.2s var(--hp-ease) 1.1s both; }
  .hp-js .hp-grip p { opacity: 0; }
  .hp-js .hp-grip.is-in p { animation: hpRise .9s var(--hp-ease) .1s both; }
  .hp-js .hp-grip .hp-grip__fig path, .hp-js .hp-grip .hp-grip__fig circle { stroke-dashoffset: 1; }
  .hp-js .hp-grip.is-in .hp-grip__key > * { animation: hpDraw 1s var(--hp-ease) .2s both; }
  .hp-js .hp-grip.is-in .hp-grip__cup > * { animation: hpDraw 1s var(--hp-ease) .6s both; }

  /* Other joints arrive one after another. */
  .hp-js .hp-rel__card { opacity: 0; }
  .hp-js .hp-rel.is-in .hp-rel__card { animation: hpFade .8s var(--hp-ease) both; }
  .hp-js .hp-rel.is-in .hp-rel__card:nth-child(2) { animation-delay: .12s; }
  .hp-js .hp-rel.is-in .hp-rel__card:nth-child(3) { animation-delay: .24s; }

  /* Where the browser can animate to auto height, an answer eases open. */
  .hp-page { interpolate-size: allow-keywords; }
  .hp-faq details::details-content {
    height: 0; overflow: clip;
    transition: height .45s var(--hp-ease), content-visibility .45s allow-discrete;
  }
  .hp-faq details[open]::details-content { height: auto; }
  .hp-faq details[open] .hub-faq__a { animation: hpAnswer .45s var(--hp-ease) .06s both; }
}
/* From 761px up the two verdicts come in from the side; on a phone there is
   no gutter to slide through, so they rise like the rest. */
@media screen and (min-width: 761px) and (prefers-reduced-motion: no-preference) {
  .hp-js .hp-fit.is-in .hp-fit__card { animation-name: hpSlide; }
}

@media screen and (max-width: 760px) and (prefers-reduced-motion: no-preference) {
  .hp-js .hp-track.is-in .hp-track__pt--span::before { animation-name: hpAxisDown; }
}

/* ---------- tablet ---------- */
@media (max-width: 1024px) {
  .hp-cond { grid-template-columns: 132px minmax(0, 1fr); row-gap: 10px; }
  .hp-cond__fig { width: 132px; height: 132px; }
  .hp-proto { grid-template-columns: minmax(0, 1fr); }
  .hp-us { max-width: 520px; }
  .hp-index a:active::after { transform: scaleX(1); }
  .hp-track { grid-template-columns: repeat(2, minmax(0, 1fr)); row-gap: 44px; }
  .hp-track::before { right: calc(50% - 14px); }
  .hp-track__pt:nth-child(3)::after {
    content: ""; position: absolute; left: 7px; right: -28px; top: 8px; height: 2px; z-index: -1;
    background: color-mix(in srgb, var(--hp-accent) 45%, transparent);
  }
  .hp-rel { grid-template-columns: minmax(0, 1fr); }
  .hp-page main a.hp-rel__card, .hp-page main a.hp-rel__card:first-child, .hp-page main a.hp-rel__card:last-child {
    padding: 22px 0; border-left: 0; border-top: 1px solid var(--border);
  }
  .hp-page main a.hp-rel__card:first-child { border-top: 0; padding-top: 4px; }
}

/* Between a phone and a desktop the drawing and the two paragraphs sit side by side above the rail. */
@media (min-width: 761px) and (max-width: 1024px) {
  .hp-proto__side { display: grid; grid-template-columns: minmax(0, 1fr) minmax(0, 1.1fr); gap: clamp(28px, 4vw, 48px); align-items: center; }
  .hp-us { margin-bottom: 0; }
}

/* ---------- phone ---------- */
@media (max-width: 760px) {
  :root { --hp-index: 52px; }
  .hp-hero__grid { grid-template-columns: minmax(0, 1fr); }
  .hp-hero__copy, .hp-hero__actions, .hp-hero__hand { grid-column: 1; grid-row: auto; }
  .hp-hero h1 { font-size: clamp(2.15rem, 9.6vw, 2.9rem); margin-bottom: 20px; }
  .hp-hero__lede { font-size: 16.5px; margin-bottom: 8px; }
  .hp-hero__hand { justify-self: center; width: min(52vw, 200px); margin: 14px 0 24px; }
  .hp-hand { width: 100%; }
  .hp-spot__name { font-size: 16px; }
  /* 44px tall for a thumb; the underline stays with the words. */
  .hp-page main a.hp-back { display: inline-flex; align-items: center; min-height: 44px; padding-bottom: 0; background-position: 0 calc(50% + 12px); }
  /* The drawing is small here, so the focus ring is drawn heavier to stay visible. */
  .hp-spot:focus-visible .hp-spot__ring { stroke-width: 4; }
  .hp-spot__hit--touch { display: inline; }
  .hp-page .hp-index a { font-size: 14px; padding: 14px 6px 13px; }
  .hp-index .container { padding-right: 0; }
  .hp-index ul { padding-right: 36px; }
  .hp-cand__grid, .hp-track { grid-template-columns: minmax(0, 1fr); }
  .hp-fit__card { grid-template-columns: 86px minmax(0, 1fr); padding: 22px 0; }
  .hp-cmc { width: 86px; height: 95px; }
  .hp-cond { grid-template-columns: 88px minmax(0, 1fr); column-gap: 18px; row-gap: 14px; align-items: center; padding: 20px 12px; margin: 0 -12px; }
  .hp-cond + .hp-cond::before { left: 12px; right: 12px; }
  .hp-cond__fig { grid-row: auto; width: 88px; height: 88px; border-radius: 10px; }
  .hp-cond__t { align-self: center; }
  .hp-cond p { grid-column: 1 / -1; font-size: 16px; }
  .hp-step { gap: 16px; }
  /* Stacked, the timeline's axis turns to run down the left edge. */
  .hp-track { row-gap: 0; }
  .hp-track::before, .hp-track__pt:nth-child(3)::after { display: none; }
  .hp-track__pt { padding: 0 0 30px 30px; border-left: 2px solid color-mix(in srgb, var(--hp-accent) 45%, transparent); margin-left: 7px; }
  .hp-track__pt::before { left: -9px; top: 6px; }
  .hp-track__pt--span { border-left-color: transparent; padding-bottom: 0; }
  .hp-track__pt--span::before { left: -5px; top: 0; width: 8px; height: 100%; transform-origin: top; background: linear-gradient(180deg, var(--hp-accent), var(--hp-ice) 55%, color-mix(in srgb, var(--hp-ice) 20%, transparent)); }
  .hp-grip { grid-template-columns: minmax(0, 1fr); }
  .hub-faq__a { padding-right: 4px; }
}

/* ---------- print: the finished page, dark on white, nothing pinned or folded ---------- */
@media print {
  .hp-index, .hub-faq__ic { display: none; }
  .hp-proto__side { position: static; }
  .hp-sec { padding: 28px 0; }
  .hp-sec--dark, .hp-sec--wash, .hp-cta { background: #fff; color: #000; }
  .hp-sec--dark .hp-h2, .hp-sec--dark .hp-lede, .hp-sec--dark .hp-proto__text p, .hp-sec--dark .hp-proto__text strong,
  .hp-page main .hp-proto__text a, .hp-step h3, .hp-step p, .hp-cta h2, .hp-cta h2 em, .hp-cta p, .hp-cta .ctaband__disclaimer { color: #000; }
  .hp-page main .btn { color: #000 !important; background: none !important; border: 1px solid #000; }
  .hp-step__dot { border-color: #000; background: #fff; box-shadow: none; }
  .hp-step:not(:last-child)::after { background: #000; }
  .hp-us { --hp-bone-c: #000; --hp-joint-fill: #fff; }
  .hp-us__needle, .hp-us__echo { stroke: #000; }
  .hp-us .hp-us__cells circle { fill: #000; }
  .hp-faq details::details-content { content-visibility: visible; height: auto; }
  .hp-page *, .hp-page *::before, .hp-page *::after { animation: none !important; transition: none !important; }
}
