/* ===== deck-motion: biblioteca de motion da casa para apresentacoes =====
   Promocao A do upgrade de craft (aprovado pelo Diego 2026-07-06).
   Doutrina (cookbook oficial Anthropic "Prompting for frontend aesthetics", 2025-10-21):
   CSS-first; UM momento orquestrado por peca vale mais que efeitos espalhados;
   reveals escalonados por animation-delay; prefers-reduced-motion respeitado.

   CONTRATO DECLARATIVO (o que o executor escreve nas laminas):
   - data-reveal          : elemento entra com reveal escalonado quando a lamina ativa.
                            A ordem do stagger vem da ordem no DOM (o runtime atribui --m-i),
                            ou explicita: data-reveal="3" força o passo 3.
   - data-reveal="hold"   : entra por ultimo (depois de todos os numerados).
   - data-moment          : O momento orquestrado da peca (UM por peca, doutrina).
                            Sem script proprio, o runtime aplica a coreografia default abaixo;
                            com script, a peca define window.deckMoment(gsap, slide) e o
                            runtime a executa na ativacao da lamina (GSAP vendorizado em
                            motor/assets/vendor/gsap.min.js).
   SEGURANCA (nunca enfraquecer):
   - Tudo 100% visivel sem JS: os estados escondidos so existem sob html.motion-on,
     que o shell adiciona via JS. O deck.html do PDF (deck-to-pdf.sh) nunca ganha
     motion-on, entao o render estatico sai integro.
   - @media print e prefers-reduced-motion desligam qualquer motion e forcam visivel. */

:root{
  /* tokens de duracao */
  --m-dur-1:.45s;   /* reveal de elemento */
  --m-dur-2:.7s;    /* bloco composto */
  --m-dur-3:1.1s;   /* o momento orquestrado */
  /* tokens de easing (saida rapida, chegada suave) */
  --m-ease:cubic-bezier(.22,1,.36,1);
  --m-ease-io:cubic-bezier(.65,0,.35,1);
  /* tokens de deslocamento e ritmo */
  --m-rise:16px;    /* distancia do rise */
  --m-stag:90ms;    /* passo do stagger */
}

/* estados escondidos SO com o runtime ligado (html.motion-on) */
html.motion-on .slide [data-reveal]{opacity:0;}
html.motion-on .slide.active [data-reveal]{
  animation:m-rise var(--m-dur-1) var(--m-ease) both;
  animation-delay:calc(var(--m-i,0) * var(--m-stag));
}
html.motion-on .slide [data-moment]{opacity:0;}
html.motion-on .slide.active [data-moment]{
  animation:m-moment var(--m-dur-3) var(--m-ease) both;
  animation-delay:calc(var(--m-i,0) * var(--m-stag));
}

@keyframes m-rise{
  from{opacity:0;transform:translateY(var(--m-rise));}
  to{opacity:1;transform:translateY(0);}
}
@keyframes m-moment{
  0%{opacity:0;transform:translateY(calc(var(--m-rise) * 1.5)) scale(.985);
     clip-path:inset(0 0 28% 0);}
  55%{opacity:1;}
  100%{opacity:1;transform:translateY(0) scale(1);clip-path:inset(0 0 0 0);}
}

/* salvaguardas duras */
@media print{
  [data-reveal],[data-moment]{opacity:1 !important;animation:none !important;
    transform:none !important;clip-path:none !important;}
}
@media (prefers-reduced-motion: reduce){
  html.motion-on .slide [data-reveal],
  html.motion-on .slide [data-moment]{opacity:1;animation:none;transform:none;clip-path:none;}
}
