/* ==========================================================================
   animations.css — Micro-interactions et animations d'apparition
   Toutes désactivées automatiquement si prefers-reduced-motion: reduce
   (règle globale déjà posée dans style.css)
   ========================================================================== */

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

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

@keyframes scaleIn {
  from { opacity: 0; transform: scale(0.96); }
  to { opacity: 1; transform: scale(1); }
}

@keyframes floatSnow {
  0%   { transform: translateY(0) translateX(0); opacity: 0.85; }
  50%  { transform: translateY(-6px) translateX(4px); opacity: 1; }
  100% { transform: translateY(0) translateX(0); opacity: 0.85; }
}

/* Révélation au scroll : cible les éléments marqués [data-animate] via app.js
   (IntersectionObserver) qui ajoute la classe .is-visible */
[data-animate] {
  opacity: 0;
}
[data-animate].is-visible {
  animation: fadeInUp var(--duration-slow) var(--ease-standard) forwards;
}
[data-animate="fade"].is-visible { animation-name: fadeIn; }
[data-animate="scale"].is-visible { animation-name: scaleIn; }

/* Délais échelonnés pour les grilles de cartes */
[data-animate-delay="1"].is-visible { animation-delay: 80ms; }
[data-animate-delay="2"].is-visible { animation-delay: 160ms; }
[data-animate-delay="3"].is-visible { animation-delay: 240ms; }
[data-animate-delay="4"].is-visible { animation-delay: 320ms; }

/* Lightbox : transition d'ouverture */
.lightbox__figure { animation: scaleIn var(--duration-medium) var(--ease-standard); }

/* Badge "neige" décoratif dans le hero (facultatif, discret) */
.hero__snow-accent { animation: floatSnow 4s ease-in-out infinite; }

@media (prefers-reduced-motion: reduce) {
  [data-animate] { opacity: 1 !important; animation: none !important; }
  .hero__snow-accent { animation: none !important; }
}
