/* ============================================================
   animations.css — Keyframes and motion primitives
   ============================================================ */

@keyframes spin {
  to { transform: rotate(360deg); }
}

/* Letter-by-letter entrance */
@keyframes letterIn {
  from { opacity: 0; transform: translateY(0.6em); }
  to   { opacity: 1; transform: none; }
}

/* Intro rise */
@keyframes introRise {
  from { opacity: 0; transform: translateY(34px); }
  to   { opacity: 1; transform: none; }
}

@keyframes hintFloat {
  0%, 100% { opacity: 0.35; transform: translate(-50%, 0); }
  50%      { opacity: 0.85; transform: translate(-50%, -6px); }
}

/* Slow cinematic zoom on heroes */
@keyframes kenburns {
  0%   { transform: scale(1.14) translate(-1.2%, 0.8%); }
  100% { transform: scale(1.02) translate(0, 0); }
}

/* Soft pulse for the progress dot */
@keyframes dotPulse {
  0%, 100% { box-shadow: 0 0 12px 2px rgba(232, 205, 160, 0.45); }
  50%      { box-shadow: 0 0 22px 6px rgba(232, 205, 160, 0.7); }
}

/* Chapter media stagger reveal (applied via inline transition-delay) */
@keyframes mediaReveal {
  from { opacity: 0; transform: scale(0.97) translateY(16px); }
  to   { opacity: 1; transform: none; }
}

/* Fade that drives .is-in-view transitions when scroll-motion is enabled */
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(26px); }
  to   { opacity: 1; transform: none; }
}

/* Utility animation classes */
.anim-fade-up { animation: fadeUp 1s var(--ease-out) both; }

.anim-delay-1 { animation-delay: 0.15s; }
.anim-delay-2 { animation-delay: 0.3s; }
.anim-delay-3 { animation-delay: 0.5s; }

.anim-kenburns {
  animation: kenburns 16s var(--ease-inout) both;
  will-change: transform;
}
