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

@keyframes pulse-dot {
  0%   { box-shadow: 0 0 0 0 rgba(16,185,129,0.5); }
  70%  { box-shadow: 0 0 0 6px rgba(16,185,129,0); }
  100% { box-shadow: 0 0 0 0 rgba(16,185,129,0); }
}

/* The one signature moment: a ticket-validation stamp slamming down */
@keyframes stampIn {
  0%   { opacity: 0; transform: scale(2.2) rotate(-14deg); }
  60%  { opacity: 1; transform: scale(0.92) rotate(-8deg); }
  80%  { transform: scale(1.05) rotate(-10deg); }
  100% { opacity: 1; transform: scale(1) rotate(-9deg); }
}

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

@keyframes shimmer {
  0%   { background-position: -200px 0; }
  100% { background-position: calc(200px + 100%) 0; }
}
