/**
* Aroa — GSAP Scroll Animations
*/
gsap.registerPlugin(ScrollTrigger);
const map = {
'fade-up': { opacity: 0, y: 45 },
'scale-in': { opacity: 0, scale: 1.08 },
'fade-right': { opacity: 0, x: -40 },
'fade-left': { opacity: 0, x: 40 },
'fade-in': { opacity: 0 },
};
window.initAnimations = function() {
const isMobile = !window.matchMedia('(min-width: 768px) and (prefers-reduced-motion: no-preference)').matches;
const singles = document.querySelectorAll('[data-animate]');
const groups = document.querySelectorAll('[data-animate-group]');
const children = document.querySelectorAll('[data-animate-group] > *');
if (isMobile) {
singles.forEach(el => el.style.opacity = 1);
children.forEach(el => el.style.opacity = 1);
return;
}
singles.forEach(el => {
if (el.dataset.animate !== 'display-text') {
gsap.set(el, { opacity: 0 });
}
});
gsap.set(children, { opacity: 0 });
singles.forEach(el => {
const type = el.dataset.animate;
if (type === 'display-text') {
const text = el.textContent;
el.innerHTML = text.split('').map(char =>
`${char === ' ' ? ' ' : char}`
).join('');
gsap.fromTo(el.querySelectorAll('span'),
{ opacity: 0, y: 70, rotateX: -45, transformOrigin: '0% 50% -20px' },
{
opacity: 1, y: 0, rotateX: 0,
stagger: 0.035,
duration: 0.65,
ease: 'power3.out',
scrollTrigger: { trigger: el, start: 'top 90%', once: true }
}
);
return;
}
const from = map[type];
if (!from) return;
gsap.fromTo(el,
{ ...from },
{
opacity: 1, x: 0, y: 0, scale: 1,
duration: parseFloat(el.dataset.duration) || 0.75,
delay: parseFloat(el.dataset.delay) || 0,
ease: 'power3.out',
scrollTrigger: { trigger: el, start: 'top 90%', once: true }
}
);
});
groups.forEach(parent => {
gsap.fromTo(parent.children,
{ opacity: 0, y: 40 },
{
opacity: 1, y: 0,
duration: 0.7,
stagger: 0.13,
ease: 'power3.out',
scrollTrigger: { trigger: parent, start: 'top 90%', once: true }
}
);
});
ScrollTrigger.refresh();
}
// Trigger animations after HCP gate is dismissed
document.addEventListener('hcp:confirmed', () => {
document.body.classList.add('site-ready');
setTimeout(initAnimations, 450);
});
// Fallback for returning users (cookie already set, no gate shown)
window.addEventListener('load', () => {
setTimeout(() => {
if (!document.body.classList.contains('site-ready')) {
document.body.classList.add('site-ready');
initAnimations();
}
}, 500);
});