/* ky-contactfix — contact card anchor landing
   The CTA wrapper carries translate-y-[-20vh] sm:translate-y-[-80vh] plus a
   scroll-scrubbed tween toward y:-100, so #Contact drifts in document space
   while the page scrolls toward it: hash navigation and end-of-page scroll
   land with the form cut off, and the vacated band reads as a dead stretch
   before the footer. The !important pin takes the transform channel away
   from the site engine (its inline writes keep landing harmlessly beneath),
   but the pinned VALUE is ky-reveal's --kyrv-y custom property: on fine
   desktops ky-reveal.js tucks the band behind #About and scrubs it back down
   ("Curtain Call"), finishing exactly at the anchor-landing position. The
   -100px fallback is the settled resting value — no JS, mobile, and
   reduced-motion all render today's static, anchor-correct page. Keep the
   fallback in sync with PIN in ky-reveal.js. */
.section-padding-x.translate-y-\[-20vh\] {
  transform: translateY(var(--kyrv-y, -100px)) !important;
}

/* Dignified landing gap when arriving via #Contact. */
#Contact {
  scroll-margin-block-start: clamp(1rem, 6vh, 3.5rem);
}

/* ── CURTAIN-CALL TRAVEL BUDGET ───────────────────────────────────────────
   Measured on the scrub (1440x900, wheel-driven through the whole window):
   avg frame 28.7ms, max 73.3ms, 118 of 253 frames over 32ms — ~35fps for the
   entire slide. The band travels 1272px and everything below re-renders per
   frame, so anything inside it that costs per-pixel work is paid ~80 times.

   Inside the band there are four such things:
     - a full-width wrapper with backdrop-filter:blur(24px) over a background
       of rgba(0,0,0,0) — it tints nothing, it only blurs;
     - the form card, backdrop-filter:blur(24px) over rgba(209,209,199,.05);
     - two headlines carrying filter:url(#roughen), an SVG reference filter,
       re-run per frame on text that is sliding past at speed.

   A moving backdrop-filter is the expensive case specifically because it
   moves: the sampled backdrop is different every frame, so nothing caches.
   None of it is legible while travelling anyway.

   So: spend nothing while the band is in flight, and restore the full
   material the moment it parks. ky-reveal adds .ky-cc-live when the driver
   takes over and .ky-cc-card-in at renderedP >= 0.96 (CARD_AT), i.e. once the
   band is effectively home — :not(.ky-cc-card-in) is exactly "in flight".
   Both classes are dropped on teardown, so if the driver dies or never runs
   (touch, narrow, reduced-motion) this block simply never matches and the
   band keeps today's full glass. */
html.ky-cc-live:not(.ky-cc-card-in) .section-padding-x.translate-y-\[-20vh\] {
  will-change: transform;          /* promote the one thing that does move */
}
html.ky-cc-live:not(.ky-cc-card-in) .section-padding-x.translate-y-\[-20vh\] [style],
html.ky-cc-live:not(.ky-cc-card-in) .section-padding-x.translate-y-\[-20vh\] * {
  backdrop-filter: none !important;
  -webkit-backdrop-filter: none !important;
}
html.ky-cc-live:not(.ky-cc-card-in) .section-padding-x.translate-y-\[-20vh\] h2 {
  filter: none !important;         /* #roughen — texture nobody can read at speed */
}
