/* chrisipeters.com Animations
   All keyframes for the dark editorial magazine. */

/* Hero gradient — background-position shift, 12s cycle */
@keyframes heroGradient {
  0%   { background-position: 0 0, 0% 0%; }
  50%  { background-position: 0 0, 100% 100%; }
  100% { background-position: 0 0, 0% 0%; }
}

/* Fade up — general entrance */
@keyframes fadeUp {
  from { opacity: 0; transform: translateY(20px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Live pulse — radiating rings on live dot */
@keyframes livePulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50%      { transform: scale(1.8); opacity: 0; }
}

/* Status blink — feed dot activity indicator */
@keyframes statusBlink {
  0%, 100% { opacity: 1; }
  50%      { opacity: 0.3; }
}

/* Shimmer — card top edge sweep */
@keyframes shimmer {
  from { transform: translateX(-100%); }
  to   { transform: translateX(100%); }
}

/* Speed streak — warp lines RIGHT TO LEFT for Items Shipped */
@keyframes speedStreak {
  0%   { left: 110%; opacity: 0; }
  5%   { opacity: 1; }
  90%  { opacity: 1; }
  100% { left: -40%; opacity: 0; }
}

/* Repair float — particles rising for Bugs Squashed */
@keyframes repairFloat {
  0%   { transform: translateY(0) scale(1); opacity: 0; }
  20%  { opacity: 0.8; }
  80%  { opacity: 0.4; }
  100% { transform: translateY(-120px) scale(0.3); opacity: 0; }
}

/* Count up — stat number entrance */
@keyframes countUp {
  from { opacity: 0; transform: translateY(10px); }
  to   { opacity: 1; transform: translateY(0); }
}

/* Slide in — timeline items */
@keyframes slideIn {
  from { opacity: 0; transform: translateX(20px); }
  to   { opacity: 1; transform: translateX(0); }
}

/* Dot glow — timeline dots pulse */
@keyframes dotGlow {
  0%, 100% { transform: scale(1); opacity: 0.7; }
  50%      { transform: scale(1.3); opacity: 1; }
}

/* Emerald glow — text-shadow pulse */
@keyframes emeraldGlow {
  0%, 100% { text-shadow: 0 0 8px rgba(0, 229, 160, 0.3); }
  50%      { text-shadow: 0 0 20px rgba(0, 229, 160, 0.6); }
}

/* Blink — terminal cursor */
@keyframes blink {
  0%, 49%  { opacity: 1; }
  50%, 100% { opacity: 0; }
}

/* Reduced motion — disable all animations */
@media (prefers-reduced-motion: reduce) {
  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}
