/* ================= KEYFRAMES ================= */

@keyframes pulse-dot {
  0%, 100% { opacity: 1; transform: scale(1); }
  50%      { opacity: .4; transform: scale(.7); }
}

/* ================= REVEAL ON SCROLL ================= */
/* Estado inicial/visível controlado via classe .visible adicionada pelo
   IntersectionObserver em assets/js/reveal.js. */

[data-reveal] {
  opacity: 0;
  transform: translateY(28px);
  transition: opacity .7s var(--ease-out), transform .7s var(--ease-out);
}
[data-reveal].visible {
  opacity: 1;
  transform: none;
}
[data-reveal="left"] {
  transform: translateX(-28px);
}
[data-reveal="right"] {
  transform: translateX(28px);
}
[data-reveal="left"].visible,
[data-reveal="right"].visible {
  transform: none;
}

[data-delay="1"] { transition-delay: .1s; }
[data-delay="2"] { transition-delay: .2s; }
[data-delay="3"] { transition-delay: .3s; }
[data-delay="4"] { transition-delay: .4s; }
[data-delay="5"] { transition-delay: .5s; }
[data-delay="6"] { transition-delay: .6s; }

/* Respeita usuários que preferem menos movimento: remove a transição de
   entrada e exibe o conteúdo já no estado final, sem alterar o layout. */
@media (prefers-reduced-motion: reduce) {
  html {
    scroll-behavior: auto;
  }
  [data-reveal] {
    transition: none;
    opacity: 1;
    transform: none;
  }
}
