/* Content is visible by default, including when scripts or observers fail. */
[data-reveal],
.hero-copy > *,
.specimen-plate {
  opacity: 1;
  transform: none;
}

body.is-ready [data-reveal].is-in,
body.is-ready .hero-copy > :not(.hero-heading),
body.is-ready .specimen-plate {
  animation: molt-reveal 600ms var(--ease-out-expo, ease-out) both;
}

@keyframes molt-reveal {
  from { opacity: 0; transform: translate3d(0, 12px, 0); }
  to { opacity: 1; transform: none; }
}

@media (prefers-reduced-motion: reduce) {
  html { scroll-behavior: auto; }
  *, *::before, *::after {
    animation: none !important;
    transition: none !important;
  }
  [data-reveal], .hero-copy > *, .specimen-plate {
    opacity: 1 !important;
    transform: none !important;
  }
}

/* Words rise together with a static blur crossfade: only opacity and transform animate. */
.reveal-word { position: relative; display: inline-block; animation: word-rise 700ms var(--ease-out-expo) var(--word-delay) both; }
.word-sharp { animation: word-sharp 700ms var(--ease-out-expo) var(--word-delay) both; }
.word-blur { position: absolute; inset: 0; filter: blur(6px); pointer-events: none; animation: word-blur 700ms var(--ease-out-expo) var(--word-delay) both; }
@keyframes word-rise { from { transform: translateY(12px); opacity: 0; } to { transform: translateY(0); opacity: 1; } }
@keyframes word-sharp { from { opacity: 0; } to { opacity: 1; } }
@keyframes word-blur { from { opacity: 1; } to { opacity: 0; } }
.nav-links a::after { content: ''; position: absolute; bottom: 3px; inset-inline: 0; height: 1px; background: var(--forest); transform: scaleX(0); transform-origin: right; transition: transform 320ms var(--ease-out-expo); }
.nav-links a:hover::after, .nav-links a:focus-visible::after { transform: scaleX(1); transform-origin: left; }
.nav-arrow { display: inline-block; opacity: 0; transform: translate(-3px, 6px); transition: transform 320ms var(--ease-out-expo), opacity 320ms var(--ease-out-expo); }
.nav-links a:hover .nav-arrow, .nav-links a:focus-visible .nav-arrow { opacity: 1; transform: translate(0, 0); transition-delay: 40ms; }
.factor-thumb { transition: transform 220ms var(--ease-out-expo), opacity 220ms var(--ease-out-expo); }
/* Monotonic expo return supplies the requested damped settle without overshoot. */
.btn[data-magnetic] { transition: transform 360ms var(--ease-out-expo); }
@media (prefers-reduced-motion: reduce) {
  .reveal-word, .word-sharp { opacity: 1; transform: none; }
  .word-blur { display: none; }
  .btn[data-magnetic] { transform: none !important; }
  .nav-arrow { transform: none; }
}
