/* Reveal animation — only active when reveal.js adds .js-reveal (crawlers/no-JS see everything).
   A CSS *animation* (not a transition) on purpose: transitions need a prior rendered
   state and silently skip when hide+reveal happen before the page's first paint
   (e.g. slow-network loads); keyframes play on first render, unconditionally. */
.js-reveal [data-reveal] { opacity: 0; }
.js-reveal [data-reveal].revealed {
  animation: kp-reveal .8s cubic-bezier(.2,.7,.2,1) both;
}
@keyframes kp-reveal {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: none; }
}
@media (prefers-reduced-motion: reduce) {
  .js-reveal [data-reveal] { opacity: 1; animation: none; }
}

/* Ambient-animation pause — reveal.js toggles .anim-paused on the aurora, the
   tagline gradient and the status dot while they are offscreen. Even a cheap
   infinite loop keeps the renderer/compositor ticking every frame; paused is
   truly idle. Progressive: without JS nothing is ever paused. */
.anim-paused,
.anim-paused::before,
.anim-paused::after,
.anim-paused .hero-aurora-layer,
.anim-paused .hero-aurora-layer::after {
  animation-play-state: paused !important;
}
