/* ============================================================
   Orbita Publishing Portal – Motion
   One orchestrated page reveal, quiet micro-interactions.
   ============================================================ */

@keyframes fadeIn { from { opacity: 0; } to { opacity: 1; } }
@keyframes fadeOut { from { opacity: 1; } to { opacity: 0; } }

@keyframes fadeInUp {
  from { opacity: 0; transform: translateY(14px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes fadeInDown {
  from { opacity: 0; transform: translateY(-10px); }
  to   { opacity: 1; transform: translateY(0); }
}
@keyframes fadeInLeft {
  from { opacity: 0; transform: translateX(-14px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes fadeInRight {
  from { opacity: 0; transform: translateX(14px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes popIn {
  from { opacity: 0; transform: translateY(8px) scale(0.97); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes popOut {
  from { opacity: 1; transform: scale(1); }
  to   { opacity: 0; transform: scale(0.97); }
}
@keyframes slideInRight {
  from { opacity: 0; transform: translateX(24px); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes slideOutRight {
  from { opacity: 1; transform: translateX(0); }
  to   { opacity: 0; transform: translateX(24px); }
}
@keyframes growX { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes growY { from { transform: scaleY(0); } to { transform: scaleY(1); } }
@keyframes spin { to { transform: rotate(360deg); } }
@keyframes orbit { to { transform: rotate(360deg); } }
@keyframes floatY {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-5px); }
}
@keyframes shimmer { to { transform: translateX(100%); } }
@keyframes indeterminate {
  0%   { transform: translateX(-120%); }
  100% { transform: translateX(320%); }
}
@keyframes pulseRing {
  0%   { box-shadow: 0 0 0 0 rgba(42, 91, 255, 0.35); }
  100% { box-shadow: 0 0 0 12px rgba(42, 91, 255, 0); }
}
@keyframes drift {
  0%   { transform: translate3d(0, 0, 0) scale(1); }
  50%  { transform: translate3d(3%, -4%, 0) scale(1.06); }
  100% { transform: translate3d(0, 0, 0) scale(1); }
}

/* Utility reveal classes (also set by app.js with --i for staggering) */
.animate-in, .reveal { animation: fadeInUp var(--dur-slow) var(--ease-out) both; }
.animate-fade { animation: fadeIn var(--dur-slow) ease both; }
.animate-left { animation: fadeInLeft var(--dur-slow) var(--ease-out) both; }
.animate-right { animation: fadeInRight var(--dur-slow) var(--ease-out) both; }
.animate-scale { animation: popIn var(--dur-slow) var(--ease-out) both; }

.animate-delay-1 { animation-delay: 60ms; }
.animate-delay-2 { animation-delay: 120ms; }
.animate-delay-3 { animation-delay: 180ms; }
.animate-delay-4 { animation-delay: 240ms; }
.animate-delay-5 { animation-delay: 300ms; }
.animate-delay-6 { animation-delay: 360ms; }
.animate-delay-7 { animation-delay: 420ms; }
.animate-delay-8 { animation-delay: 480ms; }

[data-reveal] > * { animation: fadeInUp var(--dur-slow) var(--ease-out) both; animation-delay: calc(var(--i, 0) * 55ms); }

.pulse-ring { animation: pulseRing 1.6s var(--ease-out) infinite; }

@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after { animation-duration: 1ms !important; animation-iteration-count: 1 !important; transition-duration: 1ms !important; }
}
