/**
 * animations.css - Keyframes and initial states for GSAP-driven reveals
 * Elements start hidden here so there is no flash before JS runs;
 * a `no-js` fallback below guarantees content is visible without JS.
 */

[data-reveal] {
  opacity: 0;
  will-change: transform, opacity;
}

[data-reveal="up"] { transform: translateY(48px); }
[data-reveal="fade"] { transform: none; }
[data-reveal="scale"] { transform: scale(0.92); }
[data-reveal="blur"] { filter: blur(14px); }

[data-split-word],
[data-split-char] {
  display: inline-block;
  will-change: transform;
}

.mask-reveal {
  position: relative;
  overflow: hidden;
}

.mask-reveal-cover {
  position: absolute;
  inset: 0;
  background: var(--color-primary);
  z-index: 2;
  transform-origin: left;
}

@keyframes floatY {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-14px); }
}

.float-slow {
  animation: floatY 6s var(--ease-in-out) infinite;
}

@keyframes bounceSlow {
  0%, 100% { transform: translateY(0); }
  50% { transform: translateY(-8px); }
}

.animate-bounce-slow {
  animation: bounceSlow 3s ease-in-out infinite;
}

/* No-JS fallback: reveal everything statically */
.no-js [data-reveal] {
  opacity: 1;
  transform: none;
  filter: none;
}
