@keyframes loadSweep { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes driftNebula { 50% { transform: translate3d(8vw, 6vh, 0) scale(1.15); opacity: .48; } }
@keyframes floatObject {
  0%, 100% { translate: 0 0; }
  50% { translate: 0 -22px; }
}
@keyframes cue {
  from { transform: translateY(0); opacity: 0; }
  35% { opacity: 1; }
  to { transform: translateY(44px); opacity: 0; }
}
@keyframes orbPulse {
  0%, 100% { transform: scale(1) rotate(0deg); filter: brightness(1); }
  50% { transform: scale(1.04) rotate(6deg); filter: brightness(1.2); }
}
@keyframes waveMove { to { background-position: 420px 0, -360px 80px; } }
@keyframes spiral { to { transform: rotate(360deg); } }
.reveal {
  opacity: 0;
  transform: translateY(38px);
  filter: blur(12px);
}
.reveal.is-visible {
  opacity: 1;
  transform: translateY(0);
  filter: blur(0);
  transition: opacity .9s ease, transform .9s cubic-bezier(.2,.8,.2,1), filter .9s ease;
}
.trail-dot {
  position: fixed;
  width: 8px;
  height: 8px;
  border-radius: 50%;
  pointer-events: none;
  z-index: 89;
  background: rgba(104,231,255,.48);
  box-shadow: 0 0 18px rgba(104,231,255,.42);
  animation: trailFade .7s ease forwards;
}
@keyframes trailFade {
  to { transform: scale(0); opacity: 0; }
}
