UNPKG

lenis

Version:
2 lines 5.84 kB
(function(){function e(e,t){let n;return function(...r){clearTimeout(n),n=setTimeout(()=>{n=void 0,e.apply(this,r)},t)}}function t(e){getComputedStyle(e).position===`sticky`&&(e.style.setProperty(`position`,`static`),e.dataset.sticky=`true`),e.offsetParent&&t(e.offsetParent)}function n(e){e?.dataset?.sticky===`true`&&(e.style.removeProperty(`position`),delete e.dataset.sticky),e.offsetParent&&n(e.offsetParent)}function r(e,t=0){let n=t+e.offsetTop;return e.offsetParent?r(e.offsetParent,n):n}function i(e,t=0){let n=t+e.offsetLeft;return e.offsetParent?i(e.offsetParent,n):n}function a(e,t=0){let n=t+e.scrollTop;return e.offsetParent?a(e.offsetParent,n):n+window.scrollY}function o(e,t=0){let n=t+e.scrollLeft;return e.offsetParent?o(e.offsetParent,n):n+window.scrollX}var s=class{element;options;align;rect={};wrapperResizeObserver;resizeObserver;debouncedWrapperResize;constructor(t,{align:n=[`start`],ignoreSticky:r=!0,ignoreTransform:i=!1}={}){this.element=t,this.options={align:n,ignoreSticky:r,ignoreTransform:i},this.align=[n].flat(),this.debouncedWrapperResize=e(this.onWrapperResize,500),this.wrapperResizeObserver=new ResizeObserver(this.debouncedWrapperResize),this.wrapperResizeObserver.observe(document.body),this.onWrapperResize(),this.resizeObserver=new ResizeObserver(this.onResize),this.resizeObserver.observe(this.element),this.setRect({width:this.element.offsetWidth,height:this.element.offsetHeight})}destroy(){this.wrapperResizeObserver.disconnect(),this.resizeObserver.disconnect()}setRect({top:e,left:t,width:n,height:r,element:i}={}){e??=this.rect.top,t??=this.rect.left,n??=this.rect.width,r??=this.rect.height,i??=this.rect.element,!(e===this.rect.top&&t===this.rect.left&&n===this.rect.width&&r===this.rect.height&&i===this.rect.element)&&(this.rect.top=e,this.rect.y=e,this.rect.width=n,this.rect.height=r,this.rect.left=t,this.rect.x=t,this.rect.bottom=e+r,this.rect.right=t+n)}onWrapperResize=()=>{let e,s;if(this.options.ignoreSticky&&t(this.element),this.options.ignoreTransform)e=r(this.element),s=i(this.element);else{let t=this.element.getBoundingClientRect();e=t.top+a(this.element),s=t.left+o(this.element)}this.options.ignoreSticky&&n(this.element),this.setRect({top:e,left:s})};onResize=([e])=>{if(!e?.borderBoxSize[0])return;let t=e.borderBoxSize[0].inlineSize,n=e.borderBoxSize[0].blockSize;this.setRect({width:t,height:n})}};let c=0;function l(){return c++}var u=class{options;elements=new Map;snaps=new Map;viewport={width:window.innerWidth,height:window.innerHeight};isStopped=!1;onSnapDebounced;currentSnapIndex;constructor(t,{type:n=`proximity`,lerp:r,easing:i,duration:a,distanceThreshold:o=`50%`,debounce:s=500,onSnapStart:c,onSnapComplete:l}={}){this.lenis=t,window.lenis||(window.lenis={}),window.lenis.snap=!0,this.options={type:n,lerp:r,easing:i,duration:a,distanceThreshold:o,debounce:s,onSnapStart:c,onSnapComplete:l},this.onWindowResize(),window.addEventListener(`resize`,this.onWindowResize),this.onSnapDebounced=e(this.onSnap,this.options.debounce),this.lenis.on(`virtual-scroll`,this.onSnapDebounced)}destroy(){this.lenis.off(`virtual-scroll`,this.onSnapDebounced),window.removeEventListener(`resize`,this.onWindowResize),this.elements.forEach(e=>{e.destroy()})}start(){this.isStopped=!1}stop(){this.isStopped=!0}add(e){let t=l();return this.snaps.set(t,{value:e}),()=>this.snaps.delete(t)}addElement(e,t={}){let n=l();return this.elements.set(n,new s(e,t)),()=>this.elements.delete(n)}addElements(e,t={}){let n=[...e].map(e=>this.addElement(e,t));return()=>{n.forEach(e=>{e()})}}onWindowResize=()=>{this.viewport.width=window.innerWidth,this.viewport.height=window.innerHeight};computeSnaps=()=>{let{isHorizontal:e}=this.lenis,t=[...this.snaps.values()];return this.elements.forEach(({rect:n,align:r})=>{let i;r.forEach(r=>{r===`start`?i=n.top:r===`center`?i=e?n.left+n.width/2-this.viewport.width/2:n.top+n.height/2-this.viewport.height/2:r===`end`&&(i=e?n.left+n.width-this.viewport.width:n.top+n.height-this.viewport.height),typeof i==`number`&&t.push({value:Math.ceil(i)})})}),t=t.sort((e,t)=>Math.abs(e.value)-Math.abs(t.value)),t};previous(){this.goTo((this.currentSnapIndex??0)-1)}next(){this.goTo((this.currentSnapIndex??0)+1)}goTo(e){let t=this.computeSnaps();if(t.length===0)return;this.currentSnapIndex=Math.max(0,Math.min(e,t.length-1));let n=t[this.currentSnapIndex];n!==void 0&&this.lenis.scrollTo(n.value,{duration:this.options.duration,easing:this.options.easing,lerp:this.options.lerp,lock:this.options.type===`lock`,userData:{initiator:`snap`},onStart:()=>{this.options.onSnapStart?.({index:this.currentSnapIndex,...n})},onComplete:()=>{this.options.onSnapComplete?.({index:this.currentSnapIndex,...n})}})}get distanceThreshold(){let e=1/0;if(this.options.type===`mandatory`)return 1/0;let{isHorizontal:t}=this.lenis,n=t?`width`:`height`;return e=typeof this.options.distanceThreshold==`string`&&this.options.distanceThreshold.endsWith(`%`)?Number(this.options.distanceThreshold.replace(`%`,``))/100*this.viewport[n]:typeof this.options.distanceThreshold==`number`?this.options.distanceThreshold:this.viewport[n],e}onSnap=e=>{if(this.isStopped||e.event.type===`touchmove`||this.options.type===`lock`&&this.lenis.userData?.initiator===`snap`)return;let{scroll:t,isHorizontal:n}=this.lenis,r=n?e.deltaX:e.deltaY;t=Math.ceil(this.lenis.scroll+r);let i=this.computeSnaps();if(i.length===0)return;let a,o=i.findLastIndex(({value:e})=>e<t),s=i.findIndex(({value:e})=>e>t);if(this.options.type===`lock`)r>0?a=s:r<0&&(a=o);else{let e=i[o],n=e?Math.abs(t-e.value):1/0,r=i[s];a=n<(r?Math.abs(t-r.value):1/0)?o:s}if(a===void 0||a===-1)return;a=Math.max(0,Math.min(a,i.length-1));let c=i[a];Math.abs(t-c.value)<=this.distanceThreshold&&this.goTo(a)};resize(){this.elements.forEach(e=>{e.onWrapperResize()})}};globalThis.Snap=u})(); //# sourceMappingURL=lenis-snap.min.js.map