(function() { var isMobile = window.matchMedia('(max-width: 768px)').matches; if (isMobile) return; var GSAP_CDN = 'https://cdn.jsdelivr.net/npm/gsap@3.14.1'; var scripts = [ GSAP_CDN + '/dist/gsap.min.js', GSAP_CDN + '/dist/ScrollTrigger.min.js', GSAP_CDN + '/dist/SplitText.min.js' ]; function loadScript(src) { return new Promise(function(resolve, reject) { var s = document.createElement('script'); s.src = src; s.onload = resolve; s.onerror = reject; document.head.appendChild(s); }); } function loadGsapWhenNeeded() { return loadScript(scripts[0]) .then(function() { return loadScript(scripts[1]); }) .then(function() { return loadScript(scripts[2]); }); } function runManifestoAnimation() { var targets = document.querySelectorAll('[data-paragraph]'); if (!targets.length || !window.gsap) return; var gsap = window.gsap; var ScrollTrigger = window.ScrollTrigger; var SplitText = window.SplitText; if (!ScrollTrigger || !SplitText) return; gsap.registerPlugin(ScrollTrigger, SplitText); function debounce(fn, delay) { var t; return function() { clearTimeout(t); t = setTimeout(fn, delay); }; } var splits = []; var triggers = []; function destroy() { while (triggers.length) triggers.pop().kill(); while (splits.length) splits.pop().revert(); } function build() { destroy(); var targetList = [].slice.call(targets); targetList.forEach(function(target) { var split = new SplitText(target, { type: 'lines', linesClass: 'manifesto-line' }); splits.push(split); split.lines.forEach(function(line, idx) { line.dataset.manifestoLine = idx + 1; gsap.set(line, { filter: 'blur(16px)', opacity: 0.15, y: 22 }); var trigger = ScrollTrigger.create({ trigger: line, start: 'top 80%', end: 'bottom 60%', onEnter: function() { gsap.to(line, { filter: 'blur(0px)', opacity: 1, y: 0, duration: 0.6, ease: 'power2.out' }); }, onLeaveBack: function() { gsap.to(line, { filter: 'blur(16px)', opacity: 0.15, y: 22, duration: 0.4, ease: 'power2.in' }); } }); triggers.push(trigger); }); }); ScrollTrigger.refresh(); } function afterFontsAndLayout(cb) { var whenReady = document.fonts && document.fonts.ready ? document.fonts.ready : new Promise(function(r) { setTimeout(r, 400); }); whenReady.then(function() { requestAnimationFrame(function() { requestAnimationFrame(cb); }); }); } afterFontsAndLayout(function() { build(); var debounced = debounce(build, 150); window.addEventListener('resize', debounced); if (window.lenis) { window.lenis.on('scroll', ScrollTrigger.update); ScrollTrigger.addEventListener('refresh', function() { if (window.lenis && window.lenis.update) window.lenis.update(); }); } }); } var rootMarginPx = Math.round(window.innerHeight * 0.5); var observer = new IntersectionObserver( function(entries) { if (!entries[0].isIntersecting) return; observer.disconnect(); loadGsapWhenNeeded() .then(runManifestoAnimation) .catch(function(err) { console.warn('GSAP lazy load failed:', err); }); }, { root: null, rootMargin: rootMarginPx + 'px 0px', threshold: 0 } ); var anchor = document.querySelector('[data-paragraph]'); if (anchor) { observer.observe(anchor); } else { var bodyObserver = new MutationObserver(function() { var el = document.querySelector('[data-paragraph]'); if (el) { bodyObserver.disconnect(); observer.observe(el); } }); bodyObserver.observe(document.body, { childList: true, subtree: true }); } })();