/* ============================================================
   ANIMATIONS — keyframes + scroll-reveal
   ============================================================ */

@keyframes pulse {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.5; transform: scale(1.35); }
}

/* Gentle attention pulse for deal badges (no big scale jump) */
@keyframes pulse-soft {
  0%, 100% { transform: scale(1); filter: brightness(1); }
  50% { transform: scale(1.04); filter: brightness(1.12); }
}

@keyframes spin { to { transform: rotate(360deg); } }

@keyframes sweep {
  0% { left: -75%; }
  60%, 100% { left: 130%; }
}

@keyframes slide-bg {
  0% { background-position: 0% center; }
  100% { background-position: 220% center; }
}

@keyframes ticker-scroll {
  0% { transform: translateX(0); }
  100% { transform: translateX(-50%); }
}

/* Floating review wall — two rows scrolling opposite directions (tracks duplicated) */
@keyframes review-scroll-l {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}
@keyframes review-scroll-r {
  from { transform: translateX(-50%); }
  to { transform: translateX(0); }
}
/* Vertical floating gallery (review-wall--vert) — track duplicated, -50% loops */
@keyframes review-scroll-up {
  from { transform: translateY(0); }
  to { transform: translateY(-50%); }
}
@keyframes review-scroll-down {
  from { transform: translateY(-50%); }
  to { transform: translateY(0); }
}

@keyframes float-glow {
  0% { transform: translate(0, 0) scale(1); }
  100% { transform: translate(-4%, 6%) scale(1.12); }
}

@keyframes fade-up {
  from { opacity: 0; transform: translateY(14px); }
  to { opacity: 1; transform: translateY(0); }
}

@keyframes pop-in {
  from { opacity: 0; transform: translateY(16px) scale(0.96); }
  to { opacity: 1; transform: translateY(0) scale(1); }
}

/* Scroll reveal — JS toggles .is-visible via IntersectionObserver */
.reveal {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity 0.6s var(--ease), transform 0.6s var(--ease);
  will-change: opacity, transform;
}
.reveal.is-visible { opacity: 1; transform: translateY(0); }

@media (prefers-reduced-motion: reduce) {
  .reveal { opacity: 1; transform: none; transition: none; }
}
