/* ================= Reveal-on-scroll ================= */
.reveal { opacity: 0; transform: translateY(26px); transition: opacity 0.75s cubic-bezier(0.16,1,0.3,1), transform 0.75s cubic-bezier(0.16,1,0.3,1); }
.reveal.in { opacity: 1; transform: translateY(0); }
.reveal-stagger .reveal:nth-child(1) { transition-delay: 0s; }
.reveal-stagger .reveal:nth-child(2) { transition-delay: 0.08s; }
.reveal-stagger .reveal:nth-child(3) { transition-delay: 0.16s; }
.reveal-stagger .reveal:nth-child(4) { transition-delay: 0.24s; }
.reveal-stagger .reveal:nth-child(5) { transition-delay: 0.32s; }
.reveal-stagger .reveal:nth-child(6) { transition-delay: 0.4s; }

/* ================= Keyframes ================= */
@keyframes driftY {
  0%, 100% { transform: translate(0,0); }
  50% { transform: translate(12px, -22px); }
}

@keyframes floatBob { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-9px); } }

@keyframes navieBob { 0%, 100% { transform: translateY(0) rotate(0deg); } 50% { transform: translateY(-9px) rotate(-1.5deg); } }

/* Phase 3: both pops kept their distinct character (fly = a little swoop-in, bounce = a
   soft landing) but with roughly half the previous amplitude and one fewer oscillation —
   the original overshoot (rotate 14deg, scale 1.1, a -46px pre-bounce) read as "excessive
   bounce"; this settles in one motion instead of two. */
@keyframes navieArriveFly {
  0% { transform: translateY(0) rotate(0deg) scale(1); }
  35% { transform: translateY(-9px) rotate(7deg) scale(1.05); }
  100% { transform: translateY(0) rotate(0deg) scale(1); }
}
@keyframes navieArriveBounce {
  0% { transform: translateY(-22px) scale(0.94) rotate(-3deg); }
  60% { transform: translateY(4px) scale(1.02) rotate(1deg); }
  100% { transform: translateY(0) scale(1) rotate(0deg); }
}
@keyframes navieArriveThink {
  0% { transform: rotate(0deg) scale(1); }
  25% { transform: rotate(-9deg) scale(1.04); }
  50% { transform: rotate(7deg) scale(1); }
  75% { transform: rotate(-4deg) scale(1.02); }
  100% { transform: rotate(0deg) scale(1); }
}
@keyframes navieArriveSettle {
  0% { transform: translateY(-12px) scale(0.94); opacity: 0.7; }
  100% { transform: translateY(0) scale(1); opacity: 1; }
}
@keyframes navieThinkLoop {
  0%, 100% { transform: rotate(0deg) translateX(0); }
  30% { transform: rotate(-4deg) translateX(-3px); }
  70% { transform: rotate(4deg) translateX(3px); }
}

@keyframes blink { 50% { opacity: 0; } }

@keyframes dotPulse { 0%, 100% { opacity: 0.25; transform: scale(0.8); } 50% { opacity: 1; transform: scale(1.1); } }

/* ================= prefers-reduced-motion: reduce ================= */
/* Consolidated from every component — each block below matches the reduced-motion
   override that used to sit next to its component's own rules. */
@media (prefers-reduced-motion: reduce) {
  .particle { animation: none; }

  .reveal { opacity: 1; transform: none; transition: none; }
  html { scroll-behavior: auto; }

  .step-num, .step-stage, .step h3, .step p { opacity: 1; transform: none; transition: none; }

  .float-badge { animation: none; }

  .ai-dots span { animation: none; opacity: 0.7; }

  .navie-teaser { transition: opacity 0.4s ease; top: 80vh !important; }
  .navie-teaser.navie-mobile-lane {
    left: 50% !important; right: auto !important; bottom: 16px !important; top: auto !important;
    opacity: 1; pointer-events: auto; transform: translateX(-50%) translateY(0) scale(1);
  }
  .navie-bot-wrap, .navie-bot-wrap.pop-fly, .navie-bot-wrap.pop-bounce, .navie-bot-wrap.pop-think,
  .navie-bot-wrap.pop-settle, .navie-bot-wrap.thinking-loop { animation: none; }
}
