/* ============================================================
   MOTION — Coronel Lenise / AGIR
   Vocabulário de animação das apresentações (release/ e rede/apresentacao).
   Consolidado aqui para não viver duplicado em cada peça.

   TRÊS REGRAS QUE NÃO SE NEGOCIAM
   1. ENTRADA NUNCA ESCONDE. O estado-base é visível (opacity:1). Se a
      animação não rodar — reduced-motion, JS morto, print/PDF — o conteúdo
      continua lá. Por isso as entradas só entram dentro do bloco
      `prefers-reduced-motion: no-preference`.
   2. AMBIENTE SÓ NO SLIDE ATIVO. Slides inativos continuam no DOM
      (visibility/opacity, não display:none). Sem o gate em
      `[data-deck-active]` / `[data-active]` as animações contínuas rodariam
      nos ~15 slides ao mesmo tempo e derrubam o frame rate no celular.
   3. NADA DE BOUNCE. A marca é institucional: sobe, aparece, para. O único
      overshoot permitido é o `popIn` (selo/pílula), e é discreto.

   Duração e easing saem dos tokens de spacing.css (--dur-reveal, --stagger,
   --ease-out, --ease-flip).
   ============================================================ */

/* ------------------------------------------------------------
   ENTRADAS — um elemento chegando ao slide.
   Cascata: cada nível entra --stagger depois do anterior.
   No player 9:16 (rede/apresentacao) estas mesmas curvas existem em JS
   (Web Animations API), acionadas por data-anim/data-delay/data-dur —
   mantenha os dois lados com os MESMOS nomes e valores.
   ------------------------------------------------------------ */
@keyframes upIn    { from { opacity: 0; transform: translateY(48px); }  to { opacity: 1; transform: translateY(0); } }
@keyframes downIn  { from { opacity: 0; transform: translateY(-38px); } to { opacity: 1; transform: translateY(0); } }
@keyframes leftIn  { from { opacity: 0; transform: translateX(-60px); } to { opacity: 1; transform: translateX(0); } }
@keyframes rightIn { from { opacity: 0; transform: translateX(60px); }  to { opacity: 1; transform: translateX(0); } }
@keyframes heroIn  { from { opacity: 0; transform: translateX(200px); } to { opacity: 1; transform: translateX(0); } }
@keyframes fadeIn  { from { opacity: 0; } to { opacity: 1; } }
@keyframes scaleIn { from { opacity: 0; transform: scale(0.82); } to { opacity: 1; transform: scale(1); } }
@keyframes popIn   { 0% { opacity: 0; transform: scale(0.4); }
                     62% { opacity: 1; transform: scale(1.1); }
                     100% { opacity: 1; transform: scale(1); } }
/* Réguas e barras: crescem a partir da origem, sem fade. */
@keyframes growX   { from { transform: scaleX(0); } to { transform: scaleX(1); } }
@keyframes growY   { from { transform: scaleY(0); } to { transform: scaleY(1); } }
/* Saída (só em autoplay 16:9 — na rolagem nada "sai" por tempo). */
@keyframes leftOut { from { opacity: 1; transform: translateX(0); } to { opacity: 0; transform: translateX(-80px); } }

/* ------------------------------------------------------------
   AMBIENTE — movimento contínuo que dá vida ao slide parado.
   Sempre lento (14s+), sempre de baixa amplitude. Se chama atenção,
   está errado.
   ------------------------------------------------------------ */
@keyframes spin      { to { transform: rotate(360deg); } }
@keyframes pulse     { 0%, 100% { transform: scale(1); }    50% { transform: scale(1.06); } }
@keyframes drift     { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-20px); } }
@keyframes floaty    { 0%, 100% { transform: translateY(0); } 50% { transform: translateY(-9px); } }
@keyframes glowPulse { 0%, 100% { opacity: 0.45; } 50% { opacity: 1; } }
@keyframes ringPulse { 0% { transform: scale(0.7); opacity: 0.7; } 100% { transform: scale(2); opacity: 0; } }
/* Ken Burns: zoom lento na foto. NUNCA animar background-position do slide
   inteiro (repinta a tela a cada frame) — só `scale` no elemento da foto. */
@keyframes kbZoom    { from { scale: 1; } to { scale: 1.06; } }
/* Brilho que varre uma superfície (selo, botão) — usar com parcimônia. */
@keyframes sheen     { 0% { transform: translateX(-130%) skewX(-18deg); }
                       100% { transform: translateX(260%) skewX(-18deg); } }
/* Feixes e cometas de fundo (mapas, redes, órbitas). */
@keyframes beamX   { 0% { opacity: 0; } 28% { opacity: 0.9; } 100% { opacity: 0; } }
@keyframes beamY   { 0% { opacity: 0; } 28% { opacity: 0.9; } 100% { opacity: 0; } }
@keyframes cometX  { 0% { left: 8%; opacity: 0; } 15% { opacity: 1; } 85% { opacity: 1; } 100% { left: 92%; opacity: 0; } }
@keyframes cometY  { 0% { top: 8%; opacity: 0; } 15% { opacity: 1; } 85% { opacity: 1; } 100% { top: 92%; opacity: 0; } }

/* ------------------------------------------------------------
   UTILIDADES DE CASCATA
   Estado-base visível (regra 1); a animação só entra com motion liberado.
   ------------------------------------------------------------ */
.lenise-reveal,
.lenise-reveal-2,
.lenise-reveal-3,
.lenise-reveal-4 { opacity: 1; }

@media (prefers-reduced-motion: no-preference) {
  [data-deck-active] .lenise-reveal,
  [data-active] .lenise-reveal   { animation: upIn var(--dur-reveal) var(--ease-out) 60ms both; }
  [data-deck-active] .lenise-reveal-2,
  [data-active] .lenise-reveal-2 { animation: upIn var(--dur-reveal) var(--ease-out) 180ms both; }
  [data-deck-active] .lenise-reveal-3,
  [data-active] .lenise-reveal-3 { animation: upIn var(--dur-reveal) var(--ease-out) 300ms both; }
  [data-deck-active] .lenise-reveal-4,
  [data-active] .lenise-reveal-4 { animation: upIn var(--dur-reveal) var(--ease-out) 420ms both; }

  /* Ken Burns só na foto do slide ativo. */
  [data-deck-active] .lenise-kenburns,
  [data-active] .lenise-kenburns { animation: kbZoom 24s ease-in-out infinite alternate; }
}

/* Trava de segurança: nada anima em slide fora de foco, nem por engano. */
[data-slide]:not([data-active]) * { animation-play-state: paused !important; }
