/* ==========================================================================
   Animations — keyframes partagées et utilitaires de révélation au scroll
   ========================================================================== */

@keyframes ticker-scroll {
  from { transform: translate3d(0, 0, 0); }
  to { transform: translate3d(-50%, 0, 0); }
}

@keyframes spin-slow {
  to { transform: rotate(360deg); }
}

@keyframes spin-reverse {
  to { transform: rotate(-360deg); }
}

@keyframes pulse-halo {
  0%, 100% { opacity: 0.35; transform: scale(1); }
  50% { opacity: 0.8; transform: scale(1.06); }
}

@keyframes breathe {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  50% { transform: translate3d(0, -1.4%, 0) scale(1.03); }
}

@keyframes drift-a {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1); }
  33% { transform: translate3d(4%, -3%, 0) scale(1.08); }
  66% { transform: translate3d(-3%, 3%, 0) scale(0.96); }
}

@keyframes drift-b {
  0%, 100% { transform: translate3d(0, 0, 0) scale(1.04); }
  50% { transform: translate3d(-5%, 4%, 0) scale(0.94); }
}

@keyframes ribbon-flow {
  from { stroke-dashoffset: 0; }
  to { stroke-dashoffset: -1200; }
}

@keyframes float-mote {
  0% { transform: translate3d(0, 0, 0); opacity: 0; }
  12% { opacity: 0.9; }
  88% { opacity: 0.7; }
  100% { transform: translate3d(var(--mote-x, 12px), -120px, 0); opacity: 0; }
}

@keyframes glow-sweep {
  from { transform: translateX(-120%) skewX(-18deg); }
  to { transform: translateX(320%) skewX(-18deg); }
}

@keyframes flicker {
  0%, 100% { opacity: 1; }
  42% { opacity: 1; }
  44% { opacity: 0.55; }
  46% { opacity: 1; }
  71% { opacity: 1; }
  72% { opacity: 0.7; }
  74% { opacity: 1; }
}

@keyframes rise-in {
  from { opacity: 0; transform: translate3d(0, 26px, 0); }
  to { opacity: 1; transform: translate3d(0, 0, 0); }
}

@keyframes caret-blink {
  0%, 45% { opacity: 1; }
  55%, 100% { opacity: 0; }
}

/* --- Révélation au défilement -------------------------------------------- */

[data-reveal] {
  opacity: 0;
  transform: translate3d(0, 30px, 0);
  transition:
    opacity var(--duration-slow) var(--ease-out-expo),
    transform var(--duration-slow) var(--ease-out-expo);
  transition-delay: var(--reveal-delay, 0ms);
  will-change: transform, opacity;
}

[data-reveal="left"] {
  transform: translate3d(-38px, 0, 0);
}

[data-reveal="right"] {
  transform: translate3d(38px, 0, 0);
}

[data-reveal="zoom"] {
  transform: scale(0.93);
}

[data-reveal].is-revealed {
  opacity: 1;
  transform: none;
  will-change: auto;
}

/* --- Utilitaires ---------------------------------------------------------- */

.u-spin-slow {
  animation: spin-slow 64s linear infinite;
  transform-origin: center;
}

.u-spin-reverse {
  animation: spin-reverse 92s linear infinite;
  transform-origin: center;
}

.u-flicker {
  animation: flicker 7s ease-in-out infinite;
}

/* --- Mouvement réduit ------------------------------------------------------ */

@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }

  *,
  *::before,
  *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
    scroll-behavior: auto !important;
  }

  [data-reveal] {
    opacity: 1;
    transform: none;
  }

  .starfield,
  .hero__motes,
  .ticker__track {
    display: none;
  }

  .ticker__viewport {
    mask-image: none;
  }
}
