/* Spring Curves & Transitions */
.transition-all-spring {
  transition: all 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
}

.transition-transform-spring {
  transition: transform 300ms cubic-bezier(0.34, 1.56, 0.64, 1);
}

/* Skeleton loader shimmer effect */
.skeleton-shimmer {
  background: linear-gradient(
    90deg,
    #F3F4F6 25%,
    #E5E7EB 37%,
    #F3F4F6 63%
  );
  background-size: 400% 100%;
  animation: shimmer 1.5s ease-in-out infinite;
}

@keyframes shimmer {
  0% {
    background-position: 100% 50%;
  }
  100% {
    background-position: 0% 50%;
  }
}

/* Validation shake error animation */
.shake-error {
  animation: shake 400ms cubic-bezier(.36,.07,.19,.97) both;
  transform: translate3d(0, 0, 0);
  border-color: var(--danger) !important;
}

@keyframes shake {
  10%, 90% {
    transform: translate3d(-1px, 0, 0);
  }
  20%, 80% {
    transform: translate3d(2px, 0, 0);
  }
  30%, 50%, 70% {
    transform: translate3d(-4px, 0, 0);
  }
  40%, 60% {
    transform: translate3d(4px, 0, 0);
  }
}

/* Modal scale and fade entrance */
.modal-enter {
  animation: modalEnter 350ms cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
}

.modal-exit {
  animation: modalExit 200ms cubic-bezier(0.4, 0, 1, 1) forwards;
}

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

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

/* SVG Success Checkmark draw animation */
.checkmark-draw {
  stroke-dasharray: 100;
  stroke-dashoffset: 100;
  animation: drawCheckmark 600ms cubic-bezier(0.4, 0, 0.2, 1) forwards;
}

@keyframes drawCheckmark {
  to {
    stroke-dashoffset: 0;
  }
}

/* Card hover and scale lift */
.card-hover-lift {
  transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1), box-shadow 300ms cubic-bezier(0.4, 0, 0.2, 1), border-color 300ms cubic-bezier(0.4, 0, 0.2, 1);
}

.card-hover-lift:hover {
  transform: translateY(-2px) scale(1.02);
  box-shadow: var(--shadow-high);
  border-color: var(--border-interactive);
}

/* Fade in elements */
.fade-in {
  animation: fadeIn 300ms cubic-bezier(0, 0, 0.2, 1) forwards;
}

@keyframes fadeIn {
  from {
    opacity: 0;
  }
  to {
    opacity: 1;
  }
}

/* Slide in from bottom */
.slide-up {
  animation: slideUp 400ms cubic-bezier(0, 0, 0.2, 1) forwards;
}

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

/* Confetti Container */
.confetti-canvas {
  position: fixed;
  top: 0;
  left: 0;
  width: 100vw;
  height: 100vh;
  pointer-events: none;
  z-index: 100;
}

/* Timeline unrolling effect */
.timeline-item-details {
  overflow: hidden;
  max-height: 0;
  transition: max-height 350ms cubic-bezier(0.4, 0, 0.2, 1);
}

.timeline-item.expanded .timeline-item-details {
  max-height: 1000px;
}

.timeline-item-arrow {
  transition: transform 300ms cubic-bezier(0.4, 0, 0.2, 1);
}

.timeline-item.expanded .timeline-item-arrow {
  transform: rotate(90deg);
}

/* Pulse save glow */
.pulse-save {
  animation: pulseGlow 1.5s infinite;
}

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

/* Accessibility: Support reduced motion */
@media (prefers-reduced-motion: reduce) {
  * {
    animation-delay: 0s !important;
    animation-duration: 0s !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0s !important;
    scroll-behavior: auto !important;
  }
  
  .skeleton-shimmer {
    background: #E5E7EB;
  }
}
