/* ==========================================================================
   Animations — GSAP-driven, minimal CSS fallbacks
   shawnpander.com
   Developed by Brian Kaplan
   ========================================================================== */

/* --- Vinyl Spin (used by GSAP but also works standalone) --- */
@keyframes spin {
  from { transform: rotate(0deg); }
  to   { transform: rotate(360deg); }
}

.vinyl-spinning {
  animation: spin 1.8s linear infinite;  /* 33⅓ RPM feel */
}

.vinyl-spinning.paused {
  animation-play-state: paused;
}

/* --- Reveal classes (set by GSAP ScrollTrigger) --- */
.reveal-up {
  opacity: 0;
  transform: translateY(60px);
}

.reveal-left {
  opacity: 0;
  transform: translateX(-60px);
}

.reveal-right {
  opacity: 0;
  transform: translateX(60px);
}

.reveal-scale {
  opacity: 0;
  transform: scale(0.9);
}

.reveal-mask {
  clip-path: inset(100% 0 0 0);
}

/* --- Stagger children (GSAP-controlled) --- */
.stagger > * {
  opacity: 0;
  transform: translateY(20px);
}

/* --- Split text line mask --- */
.line-mask {
  overflow: hidden;
  display: block;
}

.line-mask .line-inner {
  display: block;
  transform: translateY(110%);
}

/* --- Hero entrance sequence (CSS fallback if JS fails) --- */
@keyframes fadeInUp {
  from {
    opacity: 0;
    transform: translateY(50px);
  }
  to {
    opacity: 1;
    transform: translateY(0);
  }
}

/* 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;
  }

  .vinyl-spinning { animation: none; }
  .grain::after { animation: none; }
  .scroll-line { animation: none; }

  .reveal-up,
  .reveal-left,
  .reveal-right,
  .reveal-scale {
    opacity: 1;
    transform: none;
  }

  .reveal-mask {
    clip-path: none;
  }

  .stagger > * {
    opacity: 1;
    transform: none;
  }

  .line-mask .line-inner {
    transform: none;
  }
}
