/* ════════════════════════════════════════════════════════
   ANIMATIONS.CSS — Keyframes and scroll reveal
   ════════════════════════════════════════════════════════ */

/* ─── Keyframes ─── */
@keyframes tickerRoll {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}

@keyframes orbDrift {
  0%,100% { transform: scale(1) translate(0,0); }
  33%     { transform: scale(1.07) translate(28px,-22px); }
  66%     { transform: scale(.94) translate(-18px,28px); }
}

@keyframes shineScroll {
  from { background-position: 200% center; }
  to   { background-position: -200% center; }
}

@keyframes pulseDot {
  0%,100% { box-shadow: 0 0 0 3px rgba(74,222,128,.2); }
  50%     { box-shadow: 0 0 0 6px rgba(74,222,128,.08); }
}

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

@keyframes msgIn {
  from { opacity: 0; transform: translateY(7px); }
  to   { opacity: 1; transform: translateY(0); }
}

@keyframes fadeSlideUp {
  from { opacity: 0; transform: translateY(22px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* ─── Scroll reveal ─── */
.reveal {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity .62s ease, transform .62s ease;
}
.reveal.visible {
  opacity: 1;
  transform: translateY(0);
}

/* Delay helpers via data-delay attribute */
.reveal[data-delay="1"] { transition-delay: .07s; }
.reveal[data-delay="2"] { transition-delay: .14s; }
.reveal[data-delay="3"] { transition-delay: .21s; }
.reveal[data-delay="4"] { transition-delay: .28s; }
.reveal[data-delay="5"] { transition-delay: .35s; }
.reveal[data-delay="6"] { transition-delay: .42s; }
