/* ── Keyframes ─────────────────────────────────────────────────────── */

@keyframes pulse {
  0%   { transform: scale(0.8); opacity: 0.6; }
  100% { transform: scale(2.2); opacity: 0; }
}

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

@keyframes shimmer {
  to { background-position: -200% 0; }
}

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

@keyframes toastOut {
  from {
    opacity: 1;
    transform: translateY(0) scale(1);
  }
  to {
    opacity: 0;
    transform: translateY(8px) scale(0.96);
  }
}

@keyframes toastProgress {
  from { width: 100%; }
  to   { width: 0%; }
}

@keyframes fadeIn {
  from { opacity: 0; }
  to   { opacity: 1; }
}

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

@keyframes scaleIn {
  from {
    opacity: 0;
    transform: scale(0.95);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

@keyframes float {
  0%, 100% { transform: translateY(0) translateX(0); }
  25%      { transform: translateY(-20px) translateX(10px); }
  50%      { transform: translateY(-10px) translateX(-5px); }
  75%      { transform: translateY(-25px) translateX(5px); }
}

@keyframes glowPulse {
  0%, 100% { box-shadow: 0 0 20px rgba(99, 102, 241, .15); }
  50%      { box-shadow: 0 0 30px rgba(99, 102, 241, .25); }
}

/* ── Utility animations ───────────────────────────────────────────── */
.animate-fade-in { animation: fadeIn var(--duration-normal) var(--ease-out); }
.animate-fade-up { animation: fadeUp var(--duration-normal) var(--ease-out); }
.animate-scale-in { animation: scaleIn var(--duration-normal) var(--ease-spring); }

/* Staggered fade-up for stat cards */
.stats-row .stat:nth-child(1) { animation-delay: 0ms; }
.stats-row .stat:nth-child(2) { animation-delay: 50ms; }
.stats-row .stat:nth-child(3) { animation-delay: 100ms; }
.stats-row .stat:nth-child(4) { animation-delay: 150ms; }

/* ── Utilities ─────────────────────────────────────────────────────── */
.mt-0  { margin-top: 0; }
.mt-4  { margin-top: 4px; }
.mt-8  { margin-top: 8px; }
.mt-10 { margin-top: 10px; }
.mt-16 { margin-top: 16px; }
.mt-20 { margin-top: 20px; }
.mt-24 { margin-top: 24px; }
.mt-30 { margin-top: 30px; }
.mb-0  { margin-bottom: 0; }
.mb-8  { margin-bottom: 8px; }
.mb-12 { margin-bottom: 12px; }
.mb-16 { margin-bottom: 16px; }
.mb-20 { margin-bottom: 20px; }
.mb-24 { margin-bottom: 24px; }
.gap-8  { gap: 8px; }
.gap-10 { gap: 10px; }
.gap-20 { gap: 20px; }
.flex   { display: flex; }
.flex-gap { gap: 10px; }
.flex-wrap { flex-wrap: wrap; }
.flex-between { justify-content: space-between; }
.flex-center-y { align-items: center; }
.flex-1 { flex: 1; }
.text-center { text-align: center; }
.fw-600  { font-weight: 600; }
.d-block { display: block; }
.d-inline { display: inline; }
.p-20   { padding: 20px; }
.p-40   { padding: 40px; }
.muted  { color: var(--text-tertiary); }
.text-green  { color: var(--success-text); }
.text-red    { color: var(--danger-text); }
.text-yellow { color: var(--warning-text); }
.color-link  { color: var(--text-link); }
