.word-shuffle-stage.is-solved .word-shuffle-slots {
  animation: wordShuffleSolved 0.55s ease;
}

@keyframes wordShuffleSnap {
  0% { transform: scale(0.86); }
  60% { transform: scale(1.12); }
  100% { transform: scale(1); }
}

@keyframes wordShuffleWrong {
  0%, 100% { transform: translate(-50%, -50%) rotate(var(--rot)); }
  25% { transform: translate(calc(-50% - 9px), -50%) rotate(var(--rot)); }
  75% { transform: translate(calc(-50% + 9px), -50%) rotate(var(--rot)); }
}

@keyframes wordShuffleSlotWrong {
  0%, 100% { transform: translateX(0); }
  25% { transform: translateX(-8px); }
  75% { transform: translateX(8px); }
}

@keyframes wordShuffleSolved {
  0% { filter: none; transform: scale(1); }
  35% { filter: drop-shadow(0 0 20px rgba(34, 197, 94, 0.72)); transform: scale(1.018); }
  100% { filter: none; transform: scale(1); }
}

@keyframes wordShuffleUrgent {
  from { transform: translateY(0) scale(1); }
  to { transform: translateY(-2px) scale(1.045); }
}
