window.__STYLEGALLERY_ASSETS__={}; gsap.registerPlugin(ScrollTrigger); let panels = gsap.utils.toArray(".panel"), copy = panels[0].cloneNode(true); panels[0].parentNode.appendChild(copy); panels.forEach((panel, i) => { ScrollTrigger.create({ trigger: panel, start: "top top", pin: true, pinSpacing: false }); }); let maxScroll; let pageScrollTrigger = ScrollTrigger.create({ // snap whole page to the closest section! // normally we'd just do snap: 1 / panels.length but we'll use a function-based value so that we can handle the very start and end values in a special way to prevent looping on the snap snap(value) { let snappedValue = gsap.utils.snap(1 / panels.length, value); if (snappedValue <= 0) { return 1.05 / maxScroll; } else if (snappedValue >= 1) { return maxScroll / (maxScroll + 1.05); } return snappedValue; } }); function onResize() { maxScroll = ScrollTrigger.maxScroll(window) - 1; } onResize(); window.addEventListener("resize", onResize); window.addEventListener("scroll", (e) => { let scroll = pageScrollTrigger.scroll(); if (scroll > maxScroll) { pageScrollTrigger.scroll(1); e.preventDefault(); } else if (scroll < 1) { pageScrollTrigger.scroll(maxScroll - 1); e.preventDefault(); } }, { passive: false });