/* Motion base — infraestrutura compartilhada dos módulos GSAP.
   Quando o GSAP assume (html.gsap-on), o sistema antigo de reveal por
   IntersectionObserver é neutralizado: os módulos passam a ser donos da cena. */

html.gsap-on .reveal {
  opacity: 1 !important;
  transform: none !important;
  transition: none !important;
}

/* Palavras mascaráveis geradas por GM.splitWords() */
.gm-w {
  display: inline-block;
  overflow: clip;
  vertical-align: top;
}
.gm-w-in {
  display: inline-block;
  will-change: transform;
}

/* Títulos com reveal 3D (GM.titleReveal): a perspectiva das palavras não
   pode ser cortada pela máscara — libera o overflow só nesses títulos.
   O hero segue usando .gm-w com overflow:clip (máscara) intacto. */
.gm-reveal-3d .gm-w {
  overflow: visible;
}

/* Transição de seção (modules/sections.js): o conteúdo assenta ao entrar.
   Transform-only — se o observer não disparar, o conteúdo NÃO some, no
   máximo fica levemente deslocado até o failsafe assentar. */
.gm-rise[data-rise="pending"] {
  transform: translateY(46px);
}
.gm-rise[data-rise="in"] {
  transform: none;
  transition: transform 0.9s cubic-bezier(0.16, 1, 0.3, 1);
}

/* Lenis (desktop) */
html.lenis, html.lenis body { height: auto; }
.lenis.lenis-smooth { scroll-behavior: auto !important; }
