/* ================================================
   ANIMACIONES — KEYFRAMES Y FADE-IN OBSERVER
   ================================================ */

/* ── Fade-in al scroll ───────────────────────── */
.fade-in {
  opacity: 0;
  transform: translateY(20px);
  transition: opacity 0.6s ease, transform 0.6s ease;
}

.fade-in.visible { opacity: 1; transform: translateY(0); }

/* ── Reducción de movimiento ─────────────────── */
@media (prefers-reduced-motion: reduce) {
  .fade-in,
  .carousel-track,
  .card, .step, .testimonial,
  .btn-primary, .btn-secondary {
    transition: none !important;
    animation: none !important;
  }
  .cta-banner::before { animation: none; }
}

/* ── Keyframes ───────────────────────────────── */
@keyframes ctaPulse {
  0%, 100% { opacity: 0.6; transform: translateX(-50%) scale(1); }
  50%       { opacity: 1;   transform: translateX(-50%) scale(1.15); }
}

@keyframes fadeIn {
  from { opacity: 0; transform: translateY(-8px); }
  to   { opacity: 1; transform: translateY(0); }
}

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

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

@keyframes zoomViewer {
  to { transform: scale(1); }
}

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