/* === Squish (press feedback) === */
@keyframes squish {
  0% { transform: scale(1); }
  30% { transform: scale(0.9, 1.1); }
  50% { transform: scale(1.05, 0.95); }
  70% { transform: scale(0.98, 1.02); }
  100% { transform: scale(1); }
}

.anim-squish {
  animation: squish 0.4s var(--ease-bounce);
}

/* === Wiggle === */
@keyframes wiggle {
  0%, 100% { transform: rotate(0deg); }
  15% { transform: rotate(-6deg); }
  30% { transform: rotate(5deg); }
  45% { transform: rotate(-4deg); }
  60% { transform: rotate(3deg); }
  75% { transform: rotate(-1deg); }
}

.anim-wiggle {
  animation: wiggle 0.6s var(--ease-smooth);
}

/* === Float (idle hover) === */
@keyframes float {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-8px); }
}

.anim-float {
  animation: float 3s ease-in-out infinite;
}

/* === Pulse (glow attention) === */
@keyframes pulse {
  0%, 100% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.08); opacity: 0.85; }
}

.anim-pulse {
  animation: pulse 1.5s ease-in-out infinite;
}

/* === Pop In === */
@keyframes popIn {
  0% { transform: scale(0); opacity: 0; }
  60% { transform: scale(1.15); }
  100% { transform: scale(1); opacity: 1; }
}

.anim-pop-in {
  animation: popIn 0.4s var(--ease-bounce) forwards;
}

/* === Slide Up === */
@keyframes slideUp {
  0% { transform: translateY(40px); opacity: 0; }
  100% { transform: translateY(0); opacity: 1; }
}

.anim-slide-up {
  animation: slideUp 0.5s var(--ease-bounce) forwards;
}

/* === Fade In === */
@keyframes fadeIn {
  0% { opacity: 0; }
  100% { opacity: 1; }
}

.anim-fade-in {
  animation: fadeIn var(--duration-normal) var(--ease-smooth) forwards;
}

/* === Spin === */
@keyframes spin {
  0% { transform: rotate(0deg); }
  100% { transform: rotate(360deg); }
}

.anim-spin {
  animation: spin 1s linear infinite;
}

/* === Star Burst (earned star) === */
@keyframes starBurst {
  0% { transform: scale(0) rotate(-30deg); }
  50% { transform: scale(1.4) rotate(10deg); }
  75% { transform: scale(0.9) rotate(-5deg); }
  100% { transform: scale(1) rotate(0deg); }
}

.anim-star-burst {
  animation: starBurst 0.6s var(--ease-bounce) forwards;
}

/* === Bounce (attention) === */
@keyframes bounce {
  0%, 100% { transform: translateY(0); }
  25% { transform: translateY(-12px); }
  50% { transform: translateY(0); }
  75% { transform: translateY(-6px); }
}

.anim-bounce {
  animation: bounce 0.8s var(--ease-bounce);
}

/* === Rainbow shift === */
@keyframes rainbow {
  0%   { filter: hue-rotate(0deg); }
  100% { filter: hue-rotate(360deg); }
}

.anim-rainbow {
  animation: rainbow 4s linear infinite;
}

/* === Delayed animations === */
.delay-1 { animation-delay: 0.1s; }
.delay-2 { animation-delay: 0.2s; }
.delay-3 { animation-delay: 0.3s; }
.delay-4 { animation-delay: 0.4s; }
.delay-5 { animation-delay: 0.5s; }

/* === Cell reveal cascade (for puzzle grids) === */
@keyframes cellReveal {
  0% { transform: scale(0) rotate(-10deg); background-color: transparent; }
  60% { transform: scale(1.1) rotate(2deg); }
  100% { transform: scale(1) rotate(0deg); }
}
