/* ============================================================
   WEDDING-12 | animations.css
   Scroll-reveal (per-act, via IntersectionObserver) + entrances
   ============================================================ */

/* ── Generic reveal utility (used inside every act) ── */
.reveal,
.reveal-up,
.reveal-left,
.reveal-right,
.reveal-scale {
  opacity: 0;
  will-change: opacity, transform;
  transition:
    opacity var(--duration-slow) var(--ease-out-expo),
    transform var(--duration-slow) var(--ease-out-expo);
}
.reveal-up {
  transform: translateY(30px);
}
.reveal-left {
  transform: translateX(-30px);
}
.reveal-right {
  transform: translateX(30px);
}
.reveal-scale {
  transform: scale(0.96);
}
.reveal.is-visible,
.reveal-up.is-visible,
.reveal-left.is-visible,
.reveal-right.is-visible,
.reveal-scale.is-visible {
  opacity: 1;
  transform: none;
}

/* Stagger delays for direct children of .stagger-parent */
.stagger-parent .reveal-up:nth-child(1),
.stagger-parent > *:nth-child(1) .reveal-up {
  transition-delay: 0ms;
}
.stagger-parent .reveal-up:nth-child(2) {
  transition-delay: 90ms;
}
.stagger-parent .reveal-up:nth-child(3) {
  transition-delay: 180ms;
}

/* ── Poster entrance (fires once on load, not scroll-triggered) ── */
@keyframes posterFadeUp {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}
.poster-badge {
  animation: posterFadeUp 0.9s var(--ease-out-expo) 0.15s both;
}
.poster-title {
  animation: posterFadeUp 1s var(--ease-out-expo) 0.35s both;
}
.poster-tagline {
  animation: posterFadeUp 0.9s var(--ease-out-expo) 0.55s both;
}
.poster-meta {
  animation: posterFadeUp 0.9s var(--ease-out-expo) 0.7s both;
}
.poster-actions {
  animation: posterFadeUp 0.9s var(--ease-out-expo) 0.85s both;
}
.poster-scroll {
  animation: posterFadeUp 0.9s var(--ease-out-expo) 1.05s both;
}

/* ── Ticket entrance ── */
@keyframes ticketIn {
  from {
    opacity: 0;
    transform: translateY(16px) scale(0.98);
  }
  to {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
}
.ticket {
  animation: ticketIn 0.8s var(--ease-out-expo) 0.1s both;
}

/* ── Image fade-load ── */
@keyframes imgFadeLoad {
  from {
    opacity: 0;
    filter: blur(6px);
  }
  to {
    opacity: 1;
    filter: blur(0);
  }
}
img.loaded {
  animation: imgFadeLoad 0.6s var(--ease-out-expo) forwards;
}

/* ── Countdown digit flip ── */
@keyframes timeFlip {
  0% {
    opacity: 0;
    transform: translateY(-8px);
  }
  100% {
    opacity: 1;
    transform: translateY(0);
  }
}
.timecode-flip {
  animation: timeFlip 0.35s var(--ease-out-expo);
}
