/* GSAP-ready animation primitives.
   animations.js handles reveals via ScrollTrigger. CSS provides the
   hidden initial state + a fallback in case JS fails. */

[data-reveal] {
	opacity: 0;
	transform: translateY(36px);
	will-change: opacity, transform;
}

html:not(.js-loaded) [data-reveal] {
	animation: gtFallback .8s cubic-bezier(0.33, 1, 0.68, 1) 1.2s forwards;
}

html:not(.js-loaded) [data-image-reveal] {
	clip-path: none !important;
	-webkit-clip-path: none !important;
}

@keyframes gtFallback {
	to { opacity: 1; transform: none; }
}

/* Horizontal-reveal variants */
[data-reveal="left"] { transform: translateX(-40px); }
[data-reveal="right"] { transform: translateX(40px); }
[data-reveal="up-soft"] { transform: translateY(18px); }
[data-reveal="scale"] { transform: scale(.96); }

/* Split-line wrapper for hero title */
.split-line { display: block; overflow: hidden; }

/* Sequenced stagger helpers (JS reads [data-stagger] group) */
[data-stagger] [data-reveal] {
	transition-delay: calc(var(--i, 0) * 80ms);
}

/* Hero sequence — pre-hide only when JS has hooked up so GSAP can stage them.
   Without JS (old browser, blocked scripts) the hero content stays visible. */
.js-loaded .hero__title-line { overflow: hidden; }
.js-loaded .hero__title-inner { transform: translateY(105%); will-change: transform; }
.js-loaded .hero__badge,
.js-loaded .hero__lead,
.js-loaded .hero__actions,
.js-loaded .hero__scroll { opacity: 0; transform: translateY(24px); }

@media (prefers-reduced-motion: reduce) {
	[data-reveal] { opacity: 1 !important; transform: none !important; }
	.js-loaded .hero__title-inner,
	.js-loaded .hero__badge,
	.js-loaded .hero__lead,
	.js-loaded .hero__actions,
	.js-loaded .hero__scroll { opacity: 1 !important; transform: none !important; }
}
