/* ============================================================
   MOOEZ — ANIMATION CLASSES ONLY
   States are set/animated by GSAP (animations.js).
   These classes define initial states + reduced-motion fallbacks.
   ============================================================ */

/* Reveal-on-scroll: hidden until GSAP animates in */
[data-reveal] {
  opacity: 0;
  transform: translateY(28px);
  will-change: opacity, transform;
}
[data-reveal].is-revealed {
  opacity: 1;
  transform: none;
}

/* Split-text hero words */
.split-word {
  display: inline-block;
  overflow: hidden;
  vertical-align: top;
}
.split-word > span {
  display: inline-block;
  transform: translateY(110%);
  will-change: transform;
}

/* Gradient text stays visible after split-text wraps each word.
   The gradient lives on .grad and is clipped to text; once words are
   wrapped in child spans those spans inherit color:transparent but lose
   the clipped gradient, rendering invisible. Re-apply the gradient per
   word so each glyph is painted. */
.grad .split-word,
.grad .split-word > span {
  background: inherit;
  -webkit-background-clip: text;
  background-clip: text;
  -webkit-text-fill-color: transparent;
  color: transparent;
}

/* Counter targets — keep layout stable while counting */
[data-counter] { font-variant-numeric: tabular-nums; }

/* Magnetic elements */
[data-magnetic] { will-change: transform; }

/* Tilt cards */
[data-tilt] {
  transform-style: preserve-3d;
  will-change: transform;
}
[data-tilt] > * { transform: translateZ(0); }

/* Chart draw states */
.chart-line path.line-path {
  fill: none;
  stroke-width: 2.5;
}
.chart-bar rect {
  transform-origin: bottom;
}

/* Reduced motion: show everything immediately, kill transforms */
@media (prefers-reduced-motion: reduce) {
  [data-reveal] { opacity: 1 !important; transform: none !important; }
  .split-word > span { transform: none !important; }
  .curtain { display: none !important; }
  *, *::before, *::after {
    animation-duration: 0.01ms !important;
    animation-iteration-count: 1 !important;
    transition-duration: 0.01ms !important;
  }
}

/* No-JS fallback: never hide content behind animations */
.no-js [data-reveal] { opacity: 1; transform: none; }
.no-js .split-word > span { transform: none; }
.no-js .curtain { display: none; }
