/* ==========================================================================
   Motion & Animation - APEX
   ========================================================================== */

/* Preloader */
.preloader {
  position: fixed;
  inset: 0;
  background-color: var(--clr-bg);
  z-index: 10000;
  display: flex;
  justify-content: center;
  align-items: center;
  transition: transform 0.6s var(--ease-snappy);
}
.preloader.hidden {
  transform: translateY(-100%);
}
.preloader__text {
  font-family: var(--font-display);
  font-size: var(--text-3xl);
  color: var(--clr-red);
  text-transform: uppercase;
  animation: revving 0.1s infinite alternate;
}

@keyframes revving {
  0% { transform: translateX(-2px) skewX(-10deg); }
  100% { transform: translateX(2px) skewX(-10deg); }
}

/* Intersection Observer Animations */
.reveal-snap-up {
  opacity: 0;
  transform: translateY(50px) skewX(-10deg);
  transition: opacity var(--transition-med), transform var(--transition-med);
}
.reveal-snap-up.is-inview {
  opacity: 1;
  transform: translateY(0) skewX(0);
}

.reveal-snap-left {
  opacity: 0;
  transform: translateX(-100px);
  transition: opacity var(--transition-med), transform var(--transition-med);
}
.reveal-snap-left.is-inview {
  opacity: 1;
  transform: translateX(0);
}

/* Stagger Delays */
.delay-1 { transition-delay: 0.1s; }
.delay-2 { transition-delay: 0.2s; }
.delay-3 { transition-delay: 0.3s; }

/* Glitch Effect Text */
.glitch-text {
  position: relative;
  display: inline-block;
}
.glitch-text::before, .glitch-text::after {
  content: attr(data-text);
  position: absolute;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  opacity: 0;
}
.glitch-text.is-inview::before {
  left: 2px;
  text-shadow: -2px 0 var(--clr-red);
  animation: glitch-anim-1 0.4s var(--ease-snappy) forwards;
}
.glitch-text.is-inview::after {
  left: -2px;
  text-shadow: 2px 0 var(--clr-text-muted);
  animation: glitch-anim-2 0.4s var(--ease-snappy) forwards;
}

@keyframes glitch-anim-1 {
  0% { clip-path: inset(20% 0 80% 0); opacity: 1; }
  20% { clip-path: inset(60% 0 10% 0); }
  40% { clip-path: inset(40% 0 50% 0); }
  60% { clip-path: inset(80% 0 5% 0); }
  80% { clip-path: inset(10% 0 70% 0); }
  100% { clip-path: inset(0 0 0 0); opacity: 0; }
}
@keyframes glitch-anim-2 {
  0% { clip-path: inset(10% 0 60% 0); opacity: 1; }
  20% { clip-path: inset(30% 0 20% 0); }
  40% { clip-path: inset(70% 0 10% 0); }
  60% { clip-path: inset(20% 0 50% 0); }
  80% { clip-path: inset(90% 0 5% 0); }
  100% { clip-path: inset(0 0 0 0); opacity: 0; }
}
