26 lines
848 B
JavaScript
26 lines
848 B
JavaScript
|
|
(function () {
|
||
|
|
if (window.matchMedia('(prefers-reduced-motion: reduce)').matches) return;
|
||
|
|
if (!window.gsap || !window.ScrollTrigger || !window.Lenis) return;
|
||
|
|
|
||
|
|
gsap.registerPlugin(ScrollTrigger);
|
||
|
|
|
||
|
|
const lenis = new Lenis({ lerp: 0.1, smoothWheel: true });
|
||
|
|
lenis.on('scroll', ScrollTrigger.update);
|
||
|
|
gsap.ticker.add((time) => { lenis.raf(time * 1000); });
|
||
|
|
gsap.ticker.lagSmoothing(0);
|
||
|
|
|
||
|
|
// Hero stagger — runs once on load.
|
||
|
|
gsap.to('.hero .reveal', {
|
||
|
|
y: 0, opacity: 1, duration: 1.1, ease: 'power3.out', stagger: 0.12
|
||
|
|
});
|
||
|
|
|
||
|
|
// Card reveals — batched so cards in the same row come in together.
|
||
|
|
ScrollTrigger.batch('[data-gsap="card"]', {
|
||
|
|
start: 'top 90%',
|
||
|
|
onEnter: (els) => gsap.to(els, {
|
||
|
|
y: 0, opacity: 1, scale: 1,
|
||
|
|
duration: 0.9, ease: 'power3.out', stagger: 0.08, overwrite: true
|
||
|
|
})
|
||
|
|
});
|
||
|
|
})();
|