/* Staged hero load (see part.js). A timing sheet for a hero's entrance: elements opt in with data-stage="<cue>" and
   arrive on the sheet's beat; HOW each one arrives is a move (built in, or a banked reveal part the sheet calls).

   Knobs (custom properties, on the sheet root or any ancestor; Sadewa's numbers):
     --stage-x          20px     slide: start offset to the right
     --stage-dur        1s       slide / fade duration
     --stage-zoom       1.5      zoom: start scale
     --stage-zoom-dur   .7s      zoom duration
     --stage-ease       Framer's spring, bounce 0 (the 1 s and .7 s springs share this shape), sampled to linear() */
:root {
  --stage-x: 20px;
  --stage-dur: 1s;
  --stage-zoom: 1.5;
  --stage-zoom-dur: .7s;
  --stage-ease: linear(0, 0.0151, 0.0535, 0.107, 0.1694, 0.2361, 0.3039, 0.3706, 0.4346, 0.4949, 0.5509, 0.6024, 0.6493, 0.6917, 0.7298, 0.7638, 0.794, 0.8207, 0.8443, 0.865, 0.8832, 0.8991, 0.9129, 0.925, 0.9354, 0.9445, 0.9523, 0.9591, 0.9649, 0.97, 0.9743, 0.978, 0.9812, 0.984, 0.9863, 0.9884, 0.9901, 0.9916, 0.9928, 0.9939, 0.9948, 0.9956, 0.9963, 0.9968, 0.9973, 0.9977, 0.9981, 0.9984, 0.9986, 0.9988, 1);
}
@supports not (transition-timing-function: linear(0, 1)) { :root { --stage-ease: cubic-bezier(.22, 1, .36, 1); } }

/* part.js marks <html> from <head>: staged elements stay invisible until the sheet has armed them (each move then
   holds its own start state). If the script dies after marking <html>, they show anyway at 4 s. No JS = no hold. */
html.stage-js [data-stage]:not(.stage-armed) { opacity: 0; animation: stage-failsafe .4s 4s forwards; }
@keyframes stage-failsafe { to { opacity: 1; } }
/* moves that can't hold a start state of their own stay hidden until their cue */
.stage-wait { visibility: hidden; }

@media (prefers-reduced-motion: reduce) { html.stage-js [data-stage]:not(.stage-armed) { opacity: 1; animation: none; } }
