/* =====================================================================
   animations.css — Keyframes & motion helpers
   ===================================================================== */

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

@keyframes pulse-dot {
  0%   { box-shadow: 0 0 0 0 rgba(40, 167, 69, 0.5); }
  70%  { box-shadow: 0 0 0 7px rgba(40, 167, 69, 0); }
  100% { box-shadow: 0 0 0 0 rgba(40, 167, 69, 0); }
}

@keyframes shimmer {
  0%   { transform: translateX(-100%); }
  100% { transform: translateX(100%); }
}

@keyframes fade-in   { from { opacity: 0; } to { opacity: 1; } }
@keyframes fade-out  { from { opacity: 1; } to { opacity: 0; } }

@keyframes drop-in {
  from { opacity: 0; transform: translateY(-6px) scale(0.98); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}

@keyframes modal-pop {
  from { opacity: 0; transform: translateY(14px) scale(0.97); }
  to   { opacity: 1; transform: translateY(0) scale(1); }
}
@keyframes modal-pop-out {
  from { opacity: 1; transform: translateY(0) scale(1); }
  to   { opacity: 0; transform: translateY(10px) scale(0.98); }
}

@keyframes flash-update {
  0%   { box-shadow: 0 0 0 0 rgba(51, 122, 183, 0); border-color: var(--color-border); }
  25%  { box-shadow: 0 0 0 3px var(--color-primary-ring); border-color: var(--color-primary); }
  100% { box-shadow: var(--shadow-xs); border-color: var(--color-border); }
}

@keyframes indeterminate {
  0%   { transform: translateX(-100%); width: 40%; }
  50%  { width: 60%; }
  100% { transform: translateX(250%); width: 40%; }
}

@keyframes toast-in {
  from { opacity: 0; transform: translateX(120%); }
  to   { opacity: 1; transform: translateX(0); }
}
@keyframes toast-out {
  from { opacity: 1; transform: translateX(0); max-height: 120px; margin-bottom: var(--sp-2); }
  to   { opacity: 0; transform: translateX(120%); max-height: 0; margin-bottom: 0; padding-top: 0; padding-bottom: 0; }
}

@keyframes count-up { from { opacity: 0.4; transform: translateY(4px); } to { opacity: 1; transform: translateY(0); } }
.stat-value.bump { animation: count-up var(--t-slow) var(--ease-out); }

/* Respect reduced-motion */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
  .live-dot, .refresh-ring .ring-fg { animation: none !important; }
}
