/* ==========================================================================
   animations.css — Keyframes, entrance animations, scroll reveals
   ========================================================================== */

/* Dust drift */
@keyframes dust-drift {
  0% {
    background-position: 0% 0%, 100% 0%, 50% 100%, 0% 50%, 100% 100%;
  }
  100% {
    background-position: 100% 100%, 0% 100%, 50% 0%, 100% 50%, 0% 0%;
  }
}

/* Hero entrance */
@keyframes fade-in-up {
  from {
    opacity: 0;
    transform: translateY(24px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

.hero-avatar-wrap {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.1s forwards;
}

.hero-eyebrow {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.2s forwards;
}

.hero-title {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.3s forwards;
}

.hero-tagline {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.4s forwards;
}

.hero-bio {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.5s forwards;
}

.hero-meta {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.6s forwards;
}

.hero-links {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.7s forwards;
}

.hero-divider {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.8s forwards;
}

/* Showcase header entrance */
.showcase-header {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 0.9s forwards;
}

/* Category filter entrance */
.category-filter {
  opacity: 0;
  animation: fade-in-up 0.7s cubic-bezier(0.22, 1, 0.36, 1) 1s forwards;
}

/* Card entrance — used when cards are rendered */
@keyframes card-enter {
  from {
    opacity: 0;
    transform: scale(0.92);
  }
  to {
    opacity: 1;
    transform: scale(1);
  }
}

@keyframes card-exit {
  from {
    opacity: 1;
    transform: scale(1);
  }
  to {
    opacity: 0;
    transform: scale(0.92);
  }
}

.exhibit-card {
  animation: card-enter 0.35s cubic-bezier(0.22, 1, 0.36, 1) forwards;
}

.exhibit-card.is-exiting {
  animation: card-exit 0.3s cubic-bezier(0.22, 1, 0.36, 1) forwards;
}

/* Pulse glow for active filter */
@keyframes pulse-glow {
  0%,
  100% {
    opacity: 0.5;
  }
  50% {
    opacity: 1;
  }
}

/* Shimmer for loading skeleton */
@keyframes shimmer {
  0% {
    background-position: -200% 0;
  }
  100% {
    background-position: 200% 0;
  }
}

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

/* Scroll reveal utility */
.reveal {
  opacity: 0;
  transform: translateY(24px);
  transition: opacity 0.6s cubic-bezier(0.22, 1, 0.36, 1),
    transform 0.6s cubic-bezier(0.22, 1, 0.36, 1);
}

.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
}
