/* ==========================================================================
   animations.css — Keyframes y microinteracciones
   ========================================================================== */
@keyframes fadeInUp{0%{opacity:0;transform:translateY(30px);}100%{opacity:1;transform:translateY(0);}}
.animate-fade-in-up{ animation:fadeInUp .8s cubic-bezier(.16,1,.3,1) forwards; }

/* Variantes con retraso de .animate-fade-in-up, para escalonar la entrada del
   hero de index.html (logo → encabezado → botones) en vez de que todo el
   bloque aparezca de golpe. Se usan SOLAS (no junto con .animate-fade-in-up),
   son autocontenidas — repiten el `animation` completo con solo el retraso
   distinto — para no depender del orden de carga entre archivos CSS.
   animation-fill-mode:both evita que el elemento se vea ya visible durante
   el retraso, antes de que empiece su propia animación. */
.animate-fade-in-up-d1{ animation:fadeInUp .8s cubic-bezier(.16,1,.3,1) .15s both; }
.animate-fade-in-up-d2{ animation:fadeInUp .8s cubic-bezier(.16,1,.3,1) .3s both; }

@keyframes fadeIn{0%{opacity:0;}100%{opacity:1;}}
.animate-fade-in{ animation:fadeIn .6s ease-out forwards; }

@keyframes pulseSoft{0%,100%{opacity:1;transform:scale(1);}50%{opacity:.9;transform:scale(1.02);}}
.animate-pulse-soft{ animation:pulseSoft 2.5s infinite ease-in-out; }
.animate-pulse{ animation:pulseSoft 2.5s infinite ease-in-out; }

@keyframes spin{ to{ transform:rotate(360deg); } }
.animate-spin-btn{ animation:spin 1s linear infinite; }
