/**
 * Granpai — Site-Wide Animation Presets (structural CSS only)
 * See inc/animation-presets.php for the architecture.
 *
 * GSAP's own .from() calls (scroll-reveal.js) set the actual
 * transform/scale/blur values directly as inline styles — those never
 * need a matching CSS rule, which is what caused this project's whole
 * run of earlier bugs (a value tuned in JS but a CSS copy of it left
 * stale). The ONE thing that genuinely can't wait for JS to catch up
 * is a bare opacity:0 below — with NO css rule at all, a real, once-
 * confirmed symptom was the page rendering fully visible for a moment,
 * then vanishing once GSAP's script finally ran and set its own
 * opacity:0 "from" state, then reappearing as it animated back in.
 * A plain opacity:0 has no VALUE to keep in sync (unlike a distance,
 * a scale, a blur amount) — it's the same one bit regardless of which
 * preset is active, so it's safe to hardcode here without
 * reintroducing the CSS/JS drift problem.
 */

[data-anim-role] {
	opacity: 0;
}

@media (prefers-reduced-motion: reduce) {
	/* scroll-reveal.js already exits entirely when this is set (no
	   ScrollTrigger created at all), so nothing mid-animation needs
	   overriding here — this just guarantees marked elements render
	   at their natural, fully-visible state regardless, even if some
	   other reason kept the JS from running at all (e.g. GSAP failing
	   to load) and the bare opacity:0 above would otherwise be the
	   only thing ever applied to them. Nothing to add here for
	   SplitText's own words — GSAP's SplitText plugin itself is never
	   invoked at all when reduced-motion is set (see scroll-reveal.js's
	   own early-return), so there's no split-word state it could ever
	   leave behind to override. */
	[data-anim-role] { opacity: 1 !important; }
}
