/* FutureAITechX — animations */

@keyframes fadeUp {
  from { opacity: 0; transform: translateY(26px); }
  to { opacity: 1; transform: translateY(0); }
}
@keyframes ticker {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}
@keyframes pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: .45; transform: scale(.78); }
}
@keyframes floatSlow {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
}

/* Scroll reveal — hidden state only when JS is active (html.js-anim),
   so content is never lost if scripts or animation clocks fail.
   Uses a transition (not a keyframe) so the end state is the natural one. */
html.js-anim .reveal { opacity: 0; transform: translateY(26px); transition: opacity .65s cubic-bezier(.22, .8, .3, 1), transform .65s cubic-bezier(.22, .8, .3, 1); }
html.js-anim .reveal.visible { opacity: 1; transform: none; }
html.js-anim .reveal.d1 { transition-delay: .07s; }
html.js-anim .reveal.d2 { transition-delay: .14s; }
html.js-anim .reveal.d3 { transition-delay: .21s; }

@media (prefers-reduced-motion: reduce) {
  html.js-anim .reveal { opacity: 1 !important; transform: none !important; transition: none !important; }
  .ticker-track { animation: none; }
  *, *::before, *::after { transition-duration: .01ms !important; animation-duration: .01ms !important; }
}
