/* =========================================================
   ANIMACIONES DISCRETAS
========================================================= */

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

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

@keyframes floatSlow {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-10px); }
}

@keyframes pulseSoft {
  0%, 100% { box-shadow: 0 0 0 0 rgba(66, 165, 245, 0.35); }
  50% { box-shadow: 0 0 0 10px rgba(66, 165, 245, 0); }
}

.animate-float {
  animation: floatSlow 4s ease-in-out infinite;
}

.animate-pulse {
  animation: pulseSoft 2.5s infinite;
}

/* Skeleton de carga para imágenes lazy */
img.lazy {
  filter: blur(8px);
  transition: filter 0.4s ease;
  background: var(--bg-surface-alt);
}

img.lazy.loaded {
  filter: blur(0);
}

/* Respeto por preferencias de movimiento reducido */
@media (prefers-reduced-motion: reduce) {
  *, *::before, *::after {
    animation-duration: 0.001ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.001ms !important;
    scroll-behavior: auto !important;
  }
}
