/* Movimiento moderno y sobrio · Academia GDP (.ac2) y GDP Alerta Tasa (.mv)
   Principios: una entrada ordenada por página, nada que flote en bucle sobre contenido que se lee,
   curva fuerte de salida (--ease), solo transform/opacity, hover solo con mouse y reducción de movimiento respetada. */

@keyframes mv-fade{from{opacity:0}to{opacity:1}}
@keyframes mv-up{from{opacity:0;transform:translateY(12px)}to{opacity:1;transform:none}}
@keyframes mv-in{from{opacity:0;transform:translateY(-4px)}to{opacity:1;transform:none}}
@keyframes mv-pop{from{opacity:0;transform:scale(.9)}to{opacity:1;transform:none}}
@keyframes mv-toast{from{opacity:0;transform:translateY(12px) scale(.96)}to{opacity:1;transform:none}}
@keyframes mv-ping{0%{transform:scale(1);opacity:.45}100%{transform:scale(3.2);opacity:0}}

/* =====================  GDP ALERTA TASA  ===================== */

/* Entrada de la portada: el texto y el radar suben juntos una sola vez */
.mv .hero .wrap>div:first-child{animation:mv-up .6s var(--ease) both}
.mv .hero .radar-stage{animation:mv-up .7s var(--ease) .12s both}

/* Radar: el barrido sigue (movimiento constante y lineal); el punto objetivo late con transform/opacity */
.mv .radar-dot.is-target{animation:none}
.mv .radar-dot.is-target::after{content:"";position:absolute;inset:0;border-radius:50%;background:var(--btn);pointer-events:none;animation:mv-ping 2s var(--ease) infinite}
/* La notificación llega una vez, cuando el radar ya está en marcha (antes flotaba sin parar) */
.mv .radar-toast{animation:mv-toast .6s var(--ease) 1.1s both}

/* El teléfono se queda quieto para poder leerlo; los mensajes entran un poco más seguidos */
.mv .phone{animation:none}
.mv .phone.on .bub{animation-delay:calc(var(--i)*320ms + 150ms)}

/* Números y íconos de los pasos y beneficios: aparecen sin rebote */
.mv .step-card.is-visible .step-index,.mv .benefit-card.is-visible .benefit-icon{animation:mv-pop .45s var(--ease) .1s backwards}

/* Secciones de abajo: aparecen al llegar a ellas, una sola vez, con escalonado corto */
html.js.reveal-ready .mv :is(.section,.seccion-formulario,.stats) .reveal-on-scroll:not(.is-visible){opacity:0;transform:translateY(12px)}
.mv :is(.section,.seccion-formulario,.stats) .reveal-on-scroll{transition:opacity .5s var(--ease),transform .5s var(--ease);transition-delay:calc(var(--reveal-delay,0ms)*.55)}

/* Formulario: foco y errores se notan sin saltos */
.mv .field input{transition:border-color .2s ease,box-shadow .2s ease}
.mv .error.visible,.mv .error.show{animation:mv-in .25s var(--ease) both}

/* =====================  ACADEMIA GDP  ===================== */

.ac2 .academia-intro{animation:mv-up .6s var(--ease) both}
.ac2 .tiktok-live{animation:mv-up .6s var(--ease) .12s both}

/* Botón principal: sube solo con mouse; al presionar se hunde */
.ac2 .ac-btn{transition:transform 160ms var(--ease),box-shadow 160ms ease}
.ac2 .ac-btn:hover{transform:none;box-shadow:none}
.ac2 .ac-btn:active{transform:scale(.97)}
@media(hover:hover) and (pointer:fine){.ac2 .ac-btn:hover{transform:translateY(-1px);box-shadow:0 12px 22px -14px rgba(242,107,0,.9)}}

/* Portada del video: aparece con fundido y el botón de play responde al mouse y al toque */
.ac2 .ac-play{animation:mv-fade .25s ease both}
.ac2 .ac-play-icono{transition:transform 160ms var(--ease)}
.ac2 .ac-play:hover .ac-play-icono{transform:none}
.ac2 .ac-play:active .ac-play-icono{transform:scale(.95)}
@media(hover:hover) and (pointer:fine){.ac2 .ac-play:hover .ac-play-icono{transform:scale(1.06)}}

/* Progreso: se mueve con transform, no con width */
.ac2 .lms-progreso-fill{width:100%!important;transform:scaleX(var(--p,0));transform-origin:left;transition:transform .5s var(--ease)}

/* =====================  Movimiento reducido  ===================== */
@media(prefers-reduced-motion:reduce){
  .mv .hero .wrap>div:first-child,.mv .hero .radar-stage,.ac2 .academia-intro,.ac2 .tiktok-live{animation:mv-fade .2s both}
  .mv .radar-dot.is-target::after{animation:none}
  .mv .radar-toast{animation:mv-fade .3s both}
  .mv .phone.on .bub{animation:mv-fade .2s both;animation-delay:calc(var(--i)*60ms)}
  .mv .step-card.is-visible .step-index,.mv .benefit-card.is-visible .benefit-icon{animation:none}
  .mv .error.visible,.mv .error.show{animation:none}
  .ac2 .ac-play{animation:none}
  .ac2 .lms-progreso-fill{transition:none}
}
