/* =========================================================================
   ONE BOOST — animations.css
   Keyframes, scroll-reveal system, ambient motion, reduced-motion guard.
   ========================================================================= */

@keyframes ob-breathe {
  0%, 100% { opacity: .5; transform: scale(1); }
  50%      { opacity: .8; transform: scale(1.08); }
}
@keyframes ob-marquee {
  from { transform: translateX(0); }
  to   { transform: translateX(-50%); }
}
@keyframes ob-float {
  0%, 100% { transform: translateY(0); }
  50%      { transform: translateY(-10px); }
}
@keyframes ob-pulse {
  0%, 100% { transform: scale(1);   opacity: 1; }
  50%      { transform: scale(1.5); opacity: .55; }
}
@keyframes sec-ring {
  0%   { transform: scale(.72); opacity: .85; }
  100% { transform: scale(1.42); opacity: 0; }
}

/* Ambient motion */
.bg-fx::before { animation: ob-breathe 9s ease-in-out infinite; }
.bg-fx::after  { animation: ob-breathe 11s ease-in-out infinite reverse; }
.pill .dot     { animation: ob-pulse 2.4s ease-in-out infinite; }
.mock          { animation: ob-float 6s ease-in-out infinite; }

/* Scroll reveal (single elements) */
.reveal       { opacity: 0; transform: translateY(28px); transition: opacity .7s var(--ease), transform .7s var(--ease); }
.reveal-left  { transform: translateX(-34px); }
.reveal-right { transform: translateX(34px); }
.reveal-scale { transform: scale(.94); }
.reveal.in    { opacity: 1; transform: none; }

/* Staggered grids: the parent .stagger reveals its children one-by-one */
.stagger > *  { opacity: 0; transform: translateY(26px); transition: opacity .6s var(--ease), transform .6s var(--ease); }
.stagger.in > * { opacity: 1; transform: none; }
.stagger.in > *:nth-child(1) { transition-delay: .00s; }
.stagger.in > *:nth-child(2) { transition-delay: .07s; }
.stagger.in > *:nth-child(3) { transition-delay: .14s; }
.stagger.in > *:nth-child(4) { transition-delay: .21s; }
.stagger.in > *:nth-child(5) { transition-delay: .28s; }
.stagger.in > *:nth-child(6) { transition-delay: .35s; }
.stagger.in > *:nth-child(7) { transition-delay: .42s; }
.stagger.in > *:nth-child(8) { transition-delay: .49s; }
.stagger.in > *:nth-child(9) { transition-delay: .56s; }

/* Mock stat bars fill when the hero mock reveals */
.mock .bar > span    { width: 0; transition: width 1.1s var(--ease) .2s; }
.mock.in .bar > span { width: var(--w, 0%); }

/* Reduced motion */
@media (prefers-reduced-motion: reduce) {
  * { scroll-behavior: auto !important; }
  .reveal, .stagger > * { opacity: 1 !important; transform: none !important; transition: none !important; }
  .bg-fx::before, .bg-fx::after, .pill .dot, .mock, .marquee-track,
  .sec-emblem::before, .sec-emblem::after { animation: none !important; }
  .mock .bar > span { transition: none !important; width: var(--w, 0%); }
}
