/* ========== KEYFRAMES ========== */

/* Floating decorations */
@keyframes float {
  0%, 100% { transform: translateY(0) rotate(0deg); }
  25% { transform: translateY(-12px) rotate(3deg); }
  50% { transform: translateY(-20px) rotate(-2deg); }
  75% { transform: translateY(-8px) rotate(4deg); }
}

/* Card entrance */
@keyframes wobbleIn {
  0% { transform: scale(0.85) rotate(-2deg); opacity: 0; }
  40% { transform: scale(1.03) rotate(0.5deg); opacity: 1; }
  60% { transform: scale(0.98) rotate(-0.3deg); }
  80% { transform: scale(1.01) rotate(0.1deg); }
  100% { transform: scale(1) rotate(0deg); opacity: 1; }
}

/* Lock unlock */
@keyframes unlockShackle {
  0% { transform: translateY(0) rotate(0); }
  50% { transform: translateY(-3px) rotate(-15deg); }
  100% { transform: translateY(-2px) rotate(-10deg); }
}

/* Spinner */
@keyframes spin {
  to { transform: rotate(360deg); }
}

/* Pop in */
@keyframes popIn {
  0% { transform: scale(0); }
  60% { transform: scale(1.2); }
  100% { transform: scale(1); }
}

/* CAPTCHA failure shake */
@keyframes shake {
  0%, 100% { transform: translateX(0); }
  15% { transform: translateX(-8px); }
  30% { transform: translateX(8px); }
  45% { transform: translateX(-6px); }
  60% { transform: translateX(6px); }
  75% { transform: translateX(-3px); }
  90% { transform: translateX(3px); }
}

/* Image selection overlay */
@keyframes checkIn {
  0% { transform: scale(0); opacity: 0; }
  50% { transform: scale(1.15); opacity: 0.8; }
  100% { transform: scale(1); opacity: 1; }
}

@keyframes checkOut {
  0% { transform: scale(1); opacity: 1; }
  100% { transform: scale(0); opacity: 0; }
}

/* Heartbeat pulse */
@keyframes heartbeat {
  0%, 100% { transform: scale(1); }
  10% { transform: scale(1.12); }
  20% { transform: scale(1); }
  30% { transform: scale(1.08); }
  40% { transform: scale(1); }
}

/* SVG stroke draw */
@keyframes draw {
  to { stroke-dashoffset: 0; }
}

/* Fade slide up */
@keyframes fadeSlideUp {
  from { opacity: 0; transform: translateY(30px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Fade in */
@keyframes fadeIn {
  from { opacity: 0; }
  to { opacity: 1; }
}

/* Image flip for shuffle */
@keyframes flipOut {
  0% { transform: rotateY(0); opacity: 1; }
  100% { transform: rotateY(90deg); opacity: 0; }
}

@keyframes flipIn {
  0% { transform: rotateY(-90deg); opacity: 0; }
  100% { transform: rotateY(0); opacity: 1; }
}

/* Scale shrink for CAPTCHA success */
@keyframes shrinkAway {
  0% { transform: scale(1); opacity: 1; }
  50% { transform: scale(1.02); opacity: 1; }
  100% { transform: scale(0.8); opacity: 0; }
}

/* Error slide down */
@keyframes slideDown {
  from { transform: translateY(-100%); opacity: 0; }
  to { transform: translateY(0); opacity: 1; }
}

/* Typewriter cursor blink */
@keyframes blink {
  0%, 100% { opacity: 1; }
  50% { opacity: 0; }
}

/* Success badge entrance */
@keyframes badgeIn {
  0% { transform: scale(0) rotate(-180deg); opacity: 0; }
  60% { transform: scale(1.1) rotate(10deg); opacity: 1; }
  100% { transform: scale(1) rotate(0deg); opacity: 1; }
}

/* Love line stagger entrance */
@keyframes loveLine {
  from { opacity: 0; transform: translateY(15px); }
  to { opacity: 1; transform: translateY(0); }
}

/* Red flash for error */
@keyframes flashRed {
  0% { background-color: var(--captcha-blue); }
  30% { background-color: var(--captcha-red); }
  100% { background-color: var(--captcha-blue); }
}

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