/* ==========================================================================
   AI ANIMATION SUMMIT — v2 MOTION
   Restrained by design: one orchestrated hero entrance, gentle scroll
   reveals, nothing that loops. Transforms/opacity only, so it stays smooth
   on low-end devices. prefers-reduced-motion disables all of it and forces
   every element visible.
   ========================================================================== */

@keyframes riseIn {
  from { opacity: 0; transform: translate3d(0, 20px, 0); }
  to   { opacity: 1; transform: none; }
}
@keyframes fadeScale {
  from { opacity: 0; transform: scale(.97); }
  to   { opacity: 1; transform: none; }
}

/* Hero EKG underline — scrolls one heartbeat period (100 user units) so the
   trace moves continuously like a heart monitor. Reduced-motion freezes it
   to a static waveform via the global rule below. */
@keyframes ekgScroll {
  from { transform: translateX(0); }
  to   { transform: translateX(-100px); }
}

/* --------------------------------------------------------------------------
   HERO ENTRANCE — one staggered sequence on load
   -------------------------------------------------------------------------- */

.hero__dates { animation: riseIn .6s var(--ease-out) .05s both; }
.hero__title .line:nth-child(1) { animation: riseIn .7s var(--ease-out) .15s both; }
.hero__title .line:nth-child(2) { animation: riseIn .7s var(--ease-out) .27s both; }
.hero__lede   { animation: riseIn .7s var(--ease-out) .42s both; }
.hero .countdown { animation: riseIn .7s var(--ease-out) .52s both; }
.hero .capture { animation: riseIn .7s var(--ease-out) .62s both; }
.hero__media  { animation: fadeScale .9s var(--ease-out) .3s both; }

/* --------------------------------------------------------------------------
   SCROLL REVEAL — IntersectionObserver adds .is-in (see interactions.js).
   Sibling stagger is set inline as --d by the script.
   -------------------------------------------------------------------------- */

.reveal {
  opacity: 0;
  transform: translate3d(0, 22px, 0);
  transition:
    opacity .6s var(--ease-out) var(--d, 0s),
    transform .6s var(--ease-out) var(--d, 0s);
  will-change: opacity, transform;
}
.reveal.is-in { opacity: 1; transform: none; }

/* Cards get a touch of scale on entry — slightly springier than prose. */
.who__card.reveal,
.door.reveal,
.outcomes--proof li.reveal {
  transform: translate3d(0, 24px, 0) scale(.975);
  transition:
    opacity .55s var(--ease-out) var(--d, 0s),
    transform .55s cubic-bezier(.2, .85, .3, 1) var(--d, 0s);
}
.who__card.reveal.is-in,
.door.reveal.is-in,
.outcomes--proof li.reveal.is-in { transform: none; }

/* --------------------------------------------------------------------------
   REDUCED MOTION — everything static, nothing left hidden
   -------------------------------------------------------------------------- */

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: .001ms !important;
    animation-delay: 0ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: .001ms !important;
    scroll-behavior: auto !important;
  }
  html { scroll-behavior: auto; }
  .reveal { opacity: 1 !important; transform: none !important; }
  .hero__dates, .hero__title .line, .hero__lede, .hero .countdown,
  .hero .capture, .hero__media {
    opacity: 1 !important;
    transform: none !important;
  }
}
