/* =========================================================================
   LORNSPARK INDUSTRIES™ — Motion Library
   Document Control: LS-MOTION-0007
   Authorisation: Department of Perpetual Micro-Motion
   ========================================================================= */

@keyframes pulseDot {
  0%, 100% { opacity: 1; transform: scale(1); }
  50% { opacity: 0.6; transform: scale(0.85); }
}

@keyframes blink {
  0%, 50% { opacity: 1; }
  51%, 100% { opacity: 0; }
}

@keyframes heroWord {
  0% { opacity: 0; transform: translateY(70%) skewY(4deg); }
  60% { opacity: 1; }
  100% { opacity: 1; transform: translateY(0) skewY(0); }
}

@keyframes tickerScroll {
  from { transform: translateX(0); }
  to { transform: translateX(-50%); }
}

@keyframes audioBars {
  0%, 100% { height: 4px; }
  50% { height: 14px; }
}

@keyframes shake {
  0%, 100% { transform: translateX(0); }
  20% { transform: translateX(-4px); }
  40% { transform: translateX(4px); }
  60% { transform: translateX(-3px); }
  80% { transform: translateX(3px); }
}

@keyframes jitter {
  0% { transform: translate(0, 0); }
  25% { transform: translate(-0.6px, 0.4px); }
  50% { transform: translate(0.6px, -0.4px); }
  75% { transform: translate(-0.4px, -0.6px); }
  100% { transform: translate(0, 0); }
}

@keyframes ringPulse {
  0% { transform: scale(1); opacity: 0.4; }
  100% { transform: scale(1.4); opacity: 0; }
}

@keyframes bootProgress {
  0% { transform: scaleX(0); }
  35% { transform: scaleX(0.6); }
  100% { transform: scaleX(1); }
}

@keyframes scanline {
  0% { transform: translateY(-100%); }
  100% { transform: translateY(100%); }
}

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

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

@keyframes stampImpact {
  0% { opacity: 0; transform: rotate(-12deg) scale(2.4); filter: blur(8px); }
  60% { opacity: 0.9; transform: rotate(-12deg) scale(0.96); filter: blur(0); }
  100% { opacity: 0.85; transform: rotate(-12deg) scale(1); }
}

@keyframes glitch {
  0%, 100% { clip-path: inset(0 0 0 0); transform: translate(0); }
  20% { clip-path: inset(10% 0 80% 0); transform: translate(-2px, 1px); }
  40% { clip-path: inset(60% 0 20% 0); transform: translate(2px, -1px); }
  60% { clip-path: inset(20% 0 60% 0); transform: translate(-1px, 2px); }
  80% { clip-path: inset(80% 0 5% 0); transform: translate(1px, 0); }
}

@keyframes breathe {
  0%, 100% { transform: scale(1); opacity: 0.9; }
  50% { transform: scale(1.02); opacity: 1; }
}

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

@keyframes rotateSlow {
  from { transform: rotate(0); }
  to { transform: rotate(360deg); }
}

@keyframes typeIn {
  from { width: 0; }
  to { width: 100%; }
}

@keyframes stampDrop {
  0% { transform: rotate(-30deg) scale(3) translateY(-200px); opacity: 0; }
  70% { transform: rotate(-10deg) scale(0.94); opacity: 0.95; }
  100% { transform: rotate(-12deg) scale(1); opacity: 0.85; }
}

/* Reusable motion utility classes */
.animate-fade-up { animation: fadeUp 800ms var(--ease-out) both; }
.animate-glitch { animation: glitch 600ms steps(2) infinite; }
.animate-breathe { animation: breathe 4s infinite var(--ease-in-out); }
.animate-shimmer {
  background: linear-gradient(110deg, transparent 30%, var(--tint) 50%, transparent 70%);
  background-size: 200% 100%;
  animation: shimmer 2.4s linear infinite;
}
.animate-rotate-slow { animation: rotateSlow 60s linear infinite; }
.animate-stamp-drop { animation: stampDrop 700ms var(--ease-elastic) both; }
