From 09889bb14ad799d0f6b0760ba77184393afe3b7c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cl=C3=A9ment=20Roche?= Date: Tue, 25 Jun 2024 12:30:44 +0200 Subject: [PATCH] publish v1.1.4 --- README.md | 2 +- dist/lenis.d.ts | 3 +++ dist/lenis.js | 9 ++++++++- dist/lenis.js.map | 2 +- dist/lenis.min.js | 2 +- dist/lenis.min.js.map | 2 +- dist/lenis.mjs | 2 +- dist/lenis.mjs.map | 2 +- 8 files changed, 17 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index dc6a444f..75309f1f 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ import Lenis from 'lenis' using scripts: ```html - + ``` diff --git a/dist/lenis.d.ts b/dist/lenis.d.ts index 8f46a9e7..bac0791d 100644 --- a/dist/lenis.d.ts +++ b/dist/lenis.d.ts @@ -27,6 +27,8 @@ declare class Lenis { __isScrolling: Scrolling; __isStopped: boolean; __isLocked: boolean; + __preventNextNativeScrollEvent?: boolean; + __resetVelocityTimeout?: number; time: number; userData: object; lastVelocity: number; @@ -40,6 +42,7 @@ declare class Lenis { on(event: string, callback: Function): any; off(event: string, callback: Function): any; private setScroll; + private onPointerDown; private onVirtualScroll; resize(): void; private emit; diff --git a/dist/lenis.js b/dist/lenis.js index e62fb24d..f4023fda 100644 --- a/dist/lenis.js +++ b/dist/lenis.js @@ -4,7 +4,7 @@ (global = typeof globalThis !== 'undefined' ? globalThis : global || self, global.Lenis = factory()); })(this, (function () { 'use strict'; - var version = "1.1.3"; + var version = "1.1.4"; // Clamp a value between a minimum and maximum value function clamp(min, input, max) { @@ -329,6 +329,11 @@ this.__isStopped = false; this.__isLocked = false; this.direction = 0; + this.onPointerDown = (event) => { + if (event.button === 1) { + this.reset(); + } + }; this.onVirtualScroll = ({ deltaX, deltaY, event, }) => { if (event.ctrlKey) return; @@ -463,6 +468,7 @@ this.isScrolling = false; this.targetScroll = this.animatedScroll = this.actualScroll; this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false); + this.options.wrapper.addEventListener('pointerdown', this.onPointerDown, false); this.virtualScroll = new VirtualScroll(eventsTarget, { touchMultiplier, wheelMultiplier, @@ -472,6 +478,7 @@ destroy() { this.emitter.destroy(); this.options.wrapper.removeEventListener('scroll', this.onNativeScroll, false); + this.options.wrapper.removeEventListener('pointerdown', this.onPointerDown, false); this.virtualScroll.destroy(); this.dimensions.destroy(); this.cleanUpClassName(); diff --git a/dist/lenis.js.map b/dist/lenis.js.map index 907b5844..3ea72b1a 100644 --- a/dist/lenis.js.map +++ b/dist/lenis.js.map @@ -1 +1 @@ -{"version":3,"file":"lenis.js","sources":["../src/maths.js","../src/animate.js","../src/debounce.js","../src/dimensions.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.duration && this.easing) {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n } else if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n // If no easing or lerp, just jump to the end value\r\n this.value = this.to\r\n completed = true\r\n }\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n this.onUpdate?.(this.value, completed)\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(from, to, { lerp, duration, easing, onStart, onUpdate }) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n","export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({\r\n wrapper,\r\n content,\r\n autoResize = true,\r\n debounce: debounceValue = 250,\r\n } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper === window) {\r\n window.addEventListener('resize', this.debouncedResize, false)\r\n } else {\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n if (this.wrapper === window) {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n } else {\r\n this.scrollHeight = this.wrapper.scrollHeight\r\n this.scrollWidth = this.wrapper.scrollWidth\r\n }\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n","export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX: 0,\r\n deltaY: 0,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.windowWidth = window.innerWidth\r\n this.windowHeight = window.innerHeight\r\n }\r\n}\r\n","import { version } from '../../../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\ntype Scrolling = boolean | 'native' | 'smooth'\r\n\r\nexport type LenisOptions = Partial<{\r\n wrapper: Window | HTMLElement\r\n content: HTMLElement\r\n wheelEventsTarget: Window | HTMLElement\r\n eventsTarget: Window | HTMLElement\r\n smoothWheel: boolean\r\n syncTouch: boolean\r\n syncTouchLerp: number\r\n touchInertiaMultiplier: number\r\n duration: number\r\n easing: EasingFunction\r\n lerp: number\r\n infinite: boolean\r\n orientation: Orientation\r\n gestureOrientation: GestureOrientation\r\n touchMultiplier: number\r\n wheelMultiplier: number\r\n autoResize: boolean\r\n prevent: boolean | ((node: Element) => boolean)\r\n __experimental__naiveDimensions: boolean\r\n}>\r\n\r\nexport default class Lenis {\r\n // __isSmooth: boolean = false // true if scroll should be animated\r\n __isScrolling: Scrolling = false // true when scroll is animating\r\n __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n\r\n time: number\r\n userData: object\r\n lastVelocity: number\r\n velocity: number\r\n direction: 1 | -1 | 0 = 0\r\n options: LenisOptions\r\n targetScroll: number\r\n animatedScroll: number\r\n // animate: Animate\r\n // emitter: Emitter\r\n // dimensions: Dimensions\r\n // virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n syncTouch = false,\r\n syncTouchLerp = 0.075,\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n autoResize = true,\r\n prevent = false,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // @ts-expect-error\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (\r\n !wrapper ||\r\n wrapper === document.documentElement ||\r\n wrapper === document.body\r\n ) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n syncTouch,\r\n syncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n autoResize,\r\n prevent,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n // this.toggleClassName('lenis', true)\r\n this.updateClassName()\r\n\r\n this.userData = {}\r\n this.time = 0\r\n this.velocity = this.lastVelocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n // this.hasScrolled = false\r\n // this.isSmooth = syncTouch || smoothWheel\r\n // this.isSmooth = false\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener(\r\n 'scroll',\r\n this.onNativeScroll,\r\n false\r\n )\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.cleanUpClassName()\r\n\r\n // this.rootElement.className = ''\r\n\r\n // this.toggleClassName('lenis', false)\r\n // this.toggleClassName('lenis-smooth', false)\r\n // this.toggleClassName('lenis-scrolling', false)\r\n // this.toggleClassName('lenis-stopped', false)\r\n // this.toggleClassName('lenis-locked', false)\r\n }\r\n\r\n on(event: string, callback: Function) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event: string, callback: Function) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n private setScroll(scroll: number) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n private onVirtualScroll = ({\r\n deltaX,\r\n deltaY,\r\n event,\r\n }: {\r\n deltaX: number\r\n deltaY: number\r\n event: WheelEvent | TouchEvent\r\n }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n // if (event.type === 'touchend') {\r\n // console.log('touchend', this.scroll)\r\n // // this.lastVelocity = this.velocity\r\n // // this.velocity = 0\r\n // // this.isScrolling = false\r\n // this.emit({ type: 'touchend' })\r\n // // alert('touchend')\r\n // return\r\n // }\r\n\r\n const isTapToStop =\r\n this.options.syncTouch &&\r\n isTouch &&\r\n event.type === 'touchstart' &&\r\n !this.isStopped &&\r\n !this.isLocked\r\n\r\n if (isTapToStop) {\r\n this.reset()\r\n return\r\n }\r\n\r\n const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n // const isPullToRefresh =\r\n // this.options.gestureOrientation === 'vertical' &&\r\n // this.scroll === 0 &&\r\n // !this.options.infinite &&\r\n // deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n const isUnknownGesture =\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n if (isClick || isUnknownGesture) {\r\n // console.log('prevent')\r\n return\r\n }\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n const prevent = this.options.prevent\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node instanceof Element &&\r\n ((typeof prevent === 'function' ? prevent?.(node) : prevent) ||\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n (node.classList?.contains('lenis') &&\r\n !node.classList?.contains('lenis-stopped'))) // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n return\r\n }\r\n\r\n const isSmooth =\r\n (this.options.syncTouch && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!isSmooth) {\r\n this.isScrolling = 'native'\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5\r\n\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch\r\n ? {\r\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n }\r\n : {\r\n lerp: this.options.lerp,\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n private emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n private onNativeScroll = () => {\r\n clearTimeout(this.__resetVelocityTimeout)\r\n delete this.__resetVelocityTimeout\r\n\r\n if (this.__preventNextNativeScrollEvent) {\r\n delete this.__preventNextNativeScrollEvent\r\n return\r\n }\r\n\r\n if (this.isScrolling === false || this.isScrolling === 'native') {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity\r\n this.velocity = this.animatedScroll - lastScroll\r\n this.direction = Math.sign(\r\n this.animatedScroll - lastScroll\r\n ) as Lenis['direction']\r\n // this.isSmooth = false\r\n this.isScrolling = 'native'\r\n this.emit()\r\n\r\n if (this.velocity !== 0) {\r\n this.__resetVelocityTimeout = setTimeout(() => {\r\n this.lastVelocity = this.velocity\r\n this.velocity = 0\r\n this.isScrolling = false\r\n this.emit()\r\n }, 400)\r\n }\r\n\r\n // this.hasScrolled = true\r\n // }, 50)\r\n }\r\n }\r\n\r\n private reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n if (!this.isStopped) return\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n if (this.isStopped) return\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time: number) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target: number | string | HTMLElement,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = this.options.lerp,\r\n onStart,\r\n onComplete,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n userData = {},\r\n }: {\r\n offset?: number\r\n immediate?: boolean\r\n lock?: boolean\r\n duration?: number\r\n easing?: EasingFunction\r\n lerp?: number\r\n onStart?: (lenis: Lenis) => void\r\n onComplete?: (lenis: Lenis) => void\r\n force?: boolean\r\n programmatic?: boolean\r\n userData?: object\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (\r\n typeof target === 'string' &&\r\n ['top', 'left', 'start'].includes(target)\r\n ) {\r\n target = 0\r\n } else if (\r\n typeof target === 'string' &&\r\n ['bottom', 'right', 'end'].includes(target)\r\n ) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target instanceof HTMLElement && target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.rootElement.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (target === this.targetScroll) return\r\n\r\n this.userData = userData\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n this.preventNextNativeScrollEvent()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = 'smooth'\r\n onStart?.(this)\r\n },\r\n onUpdate: (value: number, completed: boolean) => {\r\n this.isScrolling = 'smooth'\r\n\r\n // updated\r\n this.lastVelocity = this.velocity\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity) as Lenis['direction']\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n\r\n // avoid emitting event twice\r\n this.preventNextNativeScrollEvent()\r\n }\r\n },\r\n })\r\n }\r\n\r\n private preventNextNativeScrollEvent() {\r\n this.__preventNextNativeScrollEvent = true\r\n\r\n requestAnimationFrame(() => {\r\n delete this.__preventNextNativeScrollEvent\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return (\r\n this.options.wrapper === window\r\n ? document.documentElement\r\n : this.options.wrapper\r\n ) as HTMLElement\r\n }\r\n\r\n get limit() {\r\n if (this.options.__experimental__naiveDimensions) {\r\n if (this.isHorizontal) {\r\n return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n } else {\r\n return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n }\r\n } else {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll(): number {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll(): number {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress(): number {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n // get isSmooth() {\r\n // return this.__isSmooth\r\n // }\r\n\r\n // private set isSmooth(value: boolean) {\r\n // if (this.__isSmooth !== value) {\r\n // this.__isSmooth = value\r\n // this.updateClassName()\r\n // }\r\n // }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n private set isScrolling(value: Scrolling) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n private set isStopped(value: boolean) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n private set isLocked(value: boolean) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n // if (this.isScrolling === 'native') className += ' lenis-native'\r\n // if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n private updateClassName() {\r\n this.cleanUpClassName()\r\n\r\n this.rootElement.className =\r\n `${this.rootElement.className} ${this.className}`.trim()\r\n }\r\n\r\n private cleanUpClassName() {\r\n this.rootElement.className = this.rootElement.className\r\n .replace(/lenis(-\\w+)?/g, '')\r\n .trim()\r\n }\r\n}\r\n"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"lenis.js","sources":["../src/maths.js","../src/animate.js","../src/debounce.js","../src/dimensions.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.duration && this.easing) {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n } else if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n // If no easing or lerp, just jump to the end value\r\n this.value = this.to\r\n completed = true\r\n }\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n this.onUpdate?.(this.value, completed)\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(from, to, { lerp, duration, easing, onStart, onUpdate }) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n","export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({\r\n wrapper,\r\n content,\r\n autoResize = true,\r\n debounce: debounceValue = 250,\r\n } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper === window) {\r\n window.addEventListener('resize', this.debouncedResize, false)\r\n } else {\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n if (this.wrapper === window) {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n } else {\r\n this.scrollHeight = this.wrapper.scrollHeight\r\n this.scrollWidth = this.wrapper.scrollWidth\r\n }\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n","export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX: 0,\r\n deltaY: 0,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.windowWidth = window.innerWidth\r\n this.windowHeight = window.innerHeight\r\n }\r\n}\r\n","import { version } from '../../../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\ntype Scrolling = boolean | 'native' | 'smooth'\r\n\r\nexport type LenisOptions = Partial<{\r\n wrapper: Window | HTMLElement\r\n content: HTMLElement\r\n wheelEventsTarget: Window | HTMLElement\r\n eventsTarget: Window | HTMLElement\r\n smoothWheel: boolean\r\n syncTouch: boolean\r\n syncTouchLerp: number\r\n touchInertiaMultiplier: number\r\n duration: number\r\n easing: EasingFunction\r\n lerp: number\r\n infinite: boolean\r\n orientation: Orientation\r\n gestureOrientation: GestureOrientation\r\n touchMultiplier: number\r\n wheelMultiplier: number\r\n autoResize: boolean\r\n prevent: boolean | ((node: Element) => boolean)\r\n __experimental__naiveDimensions: boolean\r\n}>\r\n\r\nexport default class Lenis {\r\n // __isSmooth: boolean = false // true if scroll should be animated\r\n __isScrolling: Scrolling = false // true when scroll is animating\r\n __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n __preventNextNativeScrollEvent?: boolean\r\n __resetVelocityTimeout?: number\r\n\r\n time: number\r\n userData: object\r\n lastVelocity: number\r\n velocity: number\r\n direction: 1 | -1 | 0 = 0\r\n options: LenisOptions\r\n targetScroll: number\r\n animatedScroll: number\r\n // animate: Animate\r\n // emitter: Emitter\r\n // dimensions: Dimensions\r\n // virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n syncTouch = false,\r\n syncTouchLerp = 0.075,\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n autoResize = true,\r\n prevent = false,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // @ts-expect-error\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (\r\n !wrapper ||\r\n wrapper === document.documentElement ||\r\n wrapper === document.body\r\n ) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n syncTouch,\r\n syncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n autoResize,\r\n prevent,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n // this.toggleClassName('lenis', true)\r\n this.updateClassName()\r\n\r\n this.userData = {}\r\n this.time = 0\r\n this.velocity = this.lastVelocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n // this.hasScrolled = false\r\n // this.isSmooth = syncTouch || smoothWheel\r\n // this.isSmooth = false\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n this.options.wrapper.addEventListener(\r\n 'pointerdown',\r\n this.onPointerDown,\r\n false\r\n )\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener(\r\n 'scroll',\r\n this.onNativeScroll,\r\n false\r\n )\r\n this.options.wrapper.removeEventListener(\r\n 'pointerdown',\r\n this.onPointerDown,\r\n false\r\n )\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.cleanUpClassName()\r\n\r\n // this.rootElement.className = ''\r\n\r\n // this.toggleClassName('lenis', false)\r\n // this.toggleClassName('lenis-smooth', false)\r\n // this.toggleClassName('lenis-scrolling', false)\r\n // this.toggleClassName('lenis-stopped', false)\r\n // this.toggleClassName('lenis-locked', false)\r\n }\r\n\r\n on(event: string, callback: Function) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event: string, callback: Function) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n private setScroll(scroll: number) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n private onPointerDown = (event: PointerEvent) => {\r\n if (event.button === 1) {\r\n this.reset()\r\n }\r\n }\r\n\r\n private onVirtualScroll = ({\r\n deltaX,\r\n deltaY,\r\n event,\r\n }: {\r\n deltaX: number\r\n deltaY: number\r\n event: WheelEvent | TouchEvent\r\n }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n // if (event.type === 'touchend') {\r\n // console.log('touchend', this.scroll)\r\n // // this.lastVelocity = this.velocity\r\n // // this.velocity = 0\r\n // // this.isScrolling = false\r\n // this.emit({ type: 'touchend' })\r\n // // alert('touchend')\r\n // return\r\n // }\r\n\r\n const isTapToStop =\r\n this.options.syncTouch &&\r\n isTouch &&\r\n event.type === 'touchstart' &&\r\n !this.isStopped &&\r\n !this.isLocked\r\n\r\n if (isTapToStop) {\r\n this.reset()\r\n return\r\n }\r\n\r\n const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n // const isPullToRefresh =\r\n // this.options.gestureOrientation === 'vertical' &&\r\n // this.scroll === 0 &&\r\n // !this.options.infinite &&\r\n // deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n const isUnknownGesture =\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n if (isClick || isUnknownGesture) {\r\n // console.log('prevent')\r\n return\r\n }\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n const prevent = this.options.prevent\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node instanceof Element &&\r\n ((typeof prevent === 'function' ? prevent?.(node) : prevent) ||\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n (node.classList?.contains('lenis') &&\r\n !node.classList?.contains('lenis-stopped'))) // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n return\r\n }\r\n\r\n const isSmooth =\r\n (this.options.syncTouch && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!isSmooth) {\r\n this.isScrolling = 'native'\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5\r\n\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch\r\n ? {\r\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n }\r\n : {\r\n lerp: this.options.lerp,\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n private emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n private onNativeScroll = () => {\r\n clearTimeout(this.__resetVelocityTimeout)\r\n delete this.__resetVelocityTimeout\r\n\r\n if (this.__preventNextNativeScrollEvent) {\r\n delete this.__preventNextNativeScrollEvent\r\n return\r\n }\r\n\r\n if (this.isScrolling === false || this.isScrolling === 'native') {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity\r\n this.velocity = this.animatedScroll - lastScroll\r\n this.direction = Math.sign(\r\n this.animatedScroll - lastScroll\r\n ) as Lenis['direction']\r\n // this.isSmooth = false\r\n this.isScrolling = 'native'\r\n this.emit()\r\n\r\n if (this.velocity !== 0) {\r\n this.__resetVelocityTimeout = setTimeout(() => {\r\n this.lastVelocity = this.velocity\r\n this.velocity = 0\r\n this.isScrolling = false\r\n this.emit()\r\n }, 400)\r\n }\r\n\r\n // this.hasScrolled = true\r\n // }, 50)\r\n }\r\n }\r\n\r\n private reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n if (!this.isStopped) return\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n if (this.isStopped) return\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time: number) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target: number | string | HTMLElement,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = this.options.lerp,\r\n onStart,\r\n onComplete,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n userData = {},\r\n }: {\r\n offset?: number\r\n immediate?: boolean\r\n lock?: boolean\r\n duration?: number\r\n easing?: EasingFunction\r\n lerp?: number\r\n onStart?: (lenis: Lenis) => void\r\n onComplete?: (lenis: Lenis) => void\r\n force?: boolean\r\n programmatic?: boolean\r\n userData?: object\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (\r\n typeof target === 'string' &&\r\n ['top', 'left', 'start'].includes(target)\r\n ) {\r\n target = 0\r\n } else if (\r\n typeof target === 'string' &&\r\n ['bottom', 'right', 'end'].includes(target)\r\n ) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target instanceof HTMLElement && target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.rootElement.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (target === this.targetScroll) return\r\n\r\n this.userData = userData\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n this.preventNextNativeScrollEvent()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = 'smooth'\r\n onStart?.(this)\r\n },\r\n onUpdate: (value: number, completed: boolean) => {\r\n this.isScrolling = 'smooth'\r\n\r\n // updated\r\n this.lastVelocity = this.velocity\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity) as Lenis['direction']\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n\r\n // avoid emitting event twice\r\n this.preventNextNativeScrollEvent()\r\n }\r\n },\r\n })\r\n }\r\n\r\n private preventNextNativeScrollEvent() {\r\n this.__preventNextNativeScrollEvent = true\r\n\r\n requestAnimationFrame(() => {\r\n delete this.__preventNextNativeScrollEvent\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return (\r\n this.options.wrapper === window\r\n ? document.documentElement\r\n : this.options.wrapper\r\n ) as HTMLElement\r\n }\r\n\r\n get limit() {\r\n if (this.options.__experimental__naiveDimensions) {\r\n if (this.isHorizontal) {\r\n return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n } else {\r\n return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n }\r\n } else {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll(): number {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll(): number {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress(): number {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n // get isSmooth() {\r\n // return this.__isSmooth\r\n // }\r\n\r\n // private set isSmooth(value: boolean) {\r\n // if (this.__isSmooth !== value) {\r\n // this.__isSmooth = value\r\n // this.updateClassName()\r\n // }\r\n // }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n private set isScrolling(value: Scrolling) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n private set isStopped(value: boolean) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n private set isLocked(value: boolean) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n // if (this.isScrolling === 'native') className += ' lenis-native'\r\n // if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n private updateClassName() {\r\n this.cleanUpClassName()\r\n\r\n this.rootElement.className =\r\n `${this.rootElement.className} ${this.className}`.trim()\r\n }\r\n\r\n private cleanUpClassName() {\r\n this.rootElement.className = this.rootElement.className\r\n .replace(/lenis(-\\w+)?/g, '')\r\n .trim()\r\n }\r\n}\r\n"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/dist/lenis.min.js b/dist/lenis.min.js index 4142ecc9..525b76ad 100644 --- a/dist/lenis.min.js +++ b/dist/lenis.min.js @@ -1,2 +1,2 @@ -!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Lenis=e()}(this,(function(){"use strict";function clamp(t,e,i){return Math.max(t,Math.min(e,i))}class Animate{advance(t){if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;const i=clamp(0,this.currentTime/this.duration,1);e=i>=1;const s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=function damp(t,e,i,s){return function lerp(t,e,i){return(1-i)*t+i*e}(t,e,1-Math.exp(-i*s))}(this.value,this.to,60*this.lerp,t),Math.round(this.value)===this.to&&(this.value=this.to,e=!0)):(this.value=this.to,e=!0);e&&this.stop(),this.onUpdate?.(this.value,e)}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i,duration:s,easing:o,onStart:n,onUpdate:l}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,n?.(),this.onUpdate=l}}class Dimensions{constructor({wrapper:t,content:e,autoResize:i=!0,debounce:s=250}={}){this.wrapper=t,this.content=e,i&&(this.debouncedResize=function debounce(t,e){let i;return function(){let s=arguments,o=this;clearTimeout(i),i=setTimeout((function(){t.apply(o,s)}),e)}}(this.resize,s),this.wrapper===window?window.addEventListener("resize",this.debouncedResize,!1):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),window.removeEventListener("resize",this.debouncedResize,!1)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper===window?(this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth):(this.scrollHeight=this.wrapper.scrollHeight,this.scrollWidth=this.wrapper.scrollWidth)};get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class Emitter{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{this.events[t]=this.events[t]?.filter((t=>e!==t))}}off(t,e){this.events[t]=this.events[t]?.filter((t=>e!==t))}destroy(){this.events={}}}const t=100/6;class VirtualScroll{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=1}){this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.touchStart={x:null,y:null},this.emitter=new Emitter,window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),window.removeEventListener("resize",this.onWindowResize,!1),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0},this.emitter.emit("scroll",{deltaX:0,deltaY:0,event:t})};onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,o=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:o},this.emitter.emit("scroll",{deltaX:s,deltaY:o,event:t})};onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})};onWheel=e=>{let{deltaX:i,deltaY:s,deltaMode:o}=e;i*=1===o?t:2===o?this.windowWidth:1,s*=1===o?t:2===o?this.windowHeight:1,i*=this.wheelMultiplier,s*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:i,deltaY:s,event:e})};onWindowResize=()=>{this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight}}return class Lenis{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:s=i,smoothWheel:o=!0,syncTouch:n=!1,syncTouchLerp:l=.075,touchInertiaMultiplier:r=35,duration:h,easing:a=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:c=.1,infinite:u=!1,orientation:d="vertical",gestureOrientation:p="vertical",touchMultiplier:m=1,wheelMultiplier:v=1,autoResize:g=!0,prevent:S=!1,__experimental__naiveDimensions:w=!1}={}){this.__isScrolling=!1,this.__isStopped=!1,this.__isLocked=!1,this.direction=0,this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const s=i.type.includes("touch"),o=i.type.includes("wheel");this.isTouching="touchstart"===i.type||"touchmove"===i.type;if(this.options.syncTouch&&s&&"touchstart"===i.type&&!this.isStopped&&!this.isLocked)return void this.reset();const n=0===t&&0===e,l="vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t;if(n||l)return;let r=i.composedPath();r=r.slice(0,r.indexOf(this.rootElement));const h=this.options.prevent;if(r.find((t=>{var e,i,n,l,r;return t instanceof Element&&(("function"==typeof h?null==h?void 0:h(t):h)||(null===(e=t.hasAttribute)||void 0===e?void 0:e.call(t,"data-lenis-prevent"))||s&&(null===(i=t.hasAttribute)||void 0===i?void 0:i.call(t,"data-lenis-prevent-touch"))||o&&(null===(n=t.hasAttribute)||void 0===n?void 0:n.call(t,"data-lenis-prevent-wheel"))||(null===(l=t.classList)||void 0===l?void 0:l.contains("lenis"))&&!(null===(r=t.classList)||void 0===r?void 0:r.contains("lenis-stopped")))})))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(!(this.options.syncTouch&&s||this.options.smoothWheel&&o))return this.isScrolling="native",void this.animate.stop();i.preventDefault();let a=e;"both"===this.options.gestureOrientation?a=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(a=t);const c=s&&this.options.syncTouch,u=s&&"touchend"===i.type&&Math.abs(a)>5;u&&(a=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+a,Object.assign({programmatic:!1},c?{lerp:u?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}))},this.onNativeScroll=()=>{if(clearTimeout(this.__resetVelocityTimeout),delete this.__resetVelocityTimeout,this.__preventNextNativeScrollEvent)delete this.__preventNextNativeScrollEvent;else if(!1===this.isScrolling||"native"===this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity,this.velocity=this.animatedScroll-t,this.direction=Math.sign(this.animatedScroll-t),this.isScrolling="native",this.emit(),0!==this.velocity&&(this.__resetVelocityTimeout=setTimeout((()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()}),400))}},window.lenisVersion="1.1.3",t&&t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:s,smoothWheel:o,syncTouch:n,syncTouchLerp:l,touchInertiaMultiplier:r,duration:h,easing:a,lerp:c,infinite:u,gestureOrientation:p,orientation:d,touchMultiplier:m,wheelMultiplier:v,autoResize:g,prevent:S,__experimental__naiveDimensions:w},this.animate=new Animate,this.emitter=new Emitter,this.dimensions=new Dimensions({wrapper:t,content:e,autoResize:g}),this.updateClassName(),this.userData={},this.time=0,this.velocity=this.lastVelocity=0,this.isLocked=!1,this.isStopped=!1,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,!1),this.virtualScroll=new VirtualScroll(s,{touchMultiplier:m,wheelMultiplier:v}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,!1),this.virtualScroll.destroy(),this.dimensions.destroy(),this.cleanUpClassName()}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity=0,this.animate.stop()}start(){this.isStopped&&(this.isStopped=!1,this.reset())}stop(){this.isStopped||(this.isStopped=!0,this.animate.stop(),this.reset())}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:o=this.options.duration,easing:n=this.options.easing,lerp:l=this.options.lerp,onStart:r,onComplete:h,force:a=!1,programmatic:c=!0,userData:u={}}={}){if(!this.isStopped&&!this.isLocked||a){if("string"==typeof t&&["top","left","start"].includes(t))t=0;else if("string"==typeof t&&["bottom","right","end"].includes(t))t=this.limit;else{let i;if("string"==typeof t?i=document.querySelector(t):t instanceof HTMLElement&&(null==t?void 0:t.nodeType)&&(i=t),i){if(this.options.wrapper!==window){const t=this.rootElement.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t&&(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=clamp(0,t,this.limit),t!==this.targetScroll)){if(this.userData=u,i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),null==h||h(this),void(this.userData={});c||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:n,lerp:l,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling="smooth",null==r||r(this)},onUpdate:(t,e)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==h||h(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this.__preventNextNativeScrollEvent=!0,requestAnimationFrame((()=>{delete this.__preventNextNativeScrollEvent}))}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.options.__experimental__naiveDimensions?this.isHorizontal?this.rootElement.scrollWidth-this.rootElement.clientWidth:this.rootElement.scrollHeight-this.rootElement.clientHeight:this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?function modulo(t,e){return(t%e+e)%e}(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.updateClassName())}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.updateClassName())}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.updateClassName())}get isSmooth(){return"smooth"===this.isScrolling}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),"smooth"===this.isScrolling&&(t+=" lenis-smooth"),t}updateClassName(){this.cleanUpClassName(),this.rootElement.className=`${this.rootElement.className} ${this.className}`.trim()}cleanUpClassName(){this.rootElement.className=this.rootElement.className.replace(/lenis(-\w+)?/g,"").trim()}}})); +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Lenis=e()}(this,(function(){"use strict";function clamp(t,e,i){return Math.max(t,Math.min(e,i))}class Animate{advance(t){if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;const i=clamp(0,this.currentTime/this.duration,1);e=i>=1;const s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=function damp(t,e,i,s){return function lerp(t,e,i){return(1-i)*t+i*e}(t,e,1-Math.exp(-i*s))}(this.value,this.to,60*this.lerp,t),Math.round(this.value)===this.to&&(this.value=this.to,e=!0)):(this.value=this.to,e=!0);e&&this.stop(),this.onUpdate?.(this.value,e)}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i,duration:s,easing:o,onStart:n,onUpdate:r}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,n?.(),this.onUpdate=r}}class Dimensions{constructor({wrapper:t,content:e,autoResize:i=!0,debounce:s=250}={}){this.wrapper=t,this.content=e,i&&(this.debouncedResize=function debounce(t,e){let i;return function(){let s=arguments,o=this;clearTimeout(i),i=setTimeout((function(){t.apply(o,s)}),e)}}(this.resize,s),this.wrapper===window?window.addEventListener("resize",this.debouncedResize,!1):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),window.removeEventListener("resize",this.debouncedResize,!1)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper===window?(this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth):(this.scrollHeight=this.wrapper.scrollHeight,this.scrollWidth=this.wrapper.scrollWidth)};get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class Emitter{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{this.events[t]=this.events[t]?.filter((t=>e!==t))}}off(t,e){this.events[t]=this.events[t]?.filter((t=>e!==t))}destroy(){this.events={}}}const t=100/6;class VirtualScroll{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=1}){this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.touchStart={x:null,y:null},this.emitter=new Emitter,window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),window.removeEventListener("resize",this.onWindowResize,!1),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0},this.emitter.emit("scroll",{deltaX:0,deltaY:0,event:t})};onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,o=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:o},this.emitter.emit("scroll",{deltaX:s,deltaY:o,event:t})};onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})};onWheel=e=>{let{deltaX:i,deltaY:s,deltaMode:o}=e;i*=1===o?t:2===o?this.windowWidth:1,s*=1===o?t:2===o?this.windowHeight:1,i*=this.wheelMultiplier,s*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:i,deltaY:s,event:e})};onWindowResize=()=>{this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight}}return class Lenis{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:s=i,smoothWheel:o=!0,syncTouch:n=!1,syncTouchLerp:r=.075,touchInertiaMultiplier:l=35,duration:h,easing:a=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:c=.1,infinite:d=!1,orientation:p="vertical",gestureOrientation:u="vertical",touchMultiplier:m=1,wheelMultiplier:v=1,autoResize:g=!0,prevent:w=!1,__experimental__naiveDimensions:S=!1}={}){this.__isScrolling=!1,this.__isStopped=!1,this.__isLocked=!1,this.direction=0,this.onPointerDown=t=>{1===t.button&&this.reset()},this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const s=i.type.includes("touch"),o=i.type.includes("wheel");this.isTouching="touchstart"===i.type||"touchmove"===i.type;if(this.options.syncTouch&&s&&"touchstart"===i.type&&!this.isStopped&&!this.isLocked)return void this.reset();const n=0===t&&0===e,r="vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t;if(n||r)return;let l=i.composedPath();l=l.slice(0,l.indexOf(this.rootElement));const h=this.options.prevent;if(l.find((t=>{var e,i,n,r,l;return t instanceof Element&&(("function"==typeof h?null==h?void 0:h(t):h)||(null===(e=t.hasAttribute)||void 0===e?void 0:e.call(t,"data-lenis-prevent"))||s&&(null===(i=t.hasAttribute)||void 0===i?void 0:i.call(t,"data-lenis-prevent-touch"))||o&&(null===(n=t.hasAttribute)||void 0===n?void 0:n.call(t,"data-lenis-prevent-wheel"))||(null===(r=t.classList)||void 0===r?void 0:r.contains("lenis"))&&!(null===(l=t.classList)||void 0===l?void 0:l.contains("lenis-stopped")))})))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(!(this.options.syncTouch&&s||this.options.smoothWheel&&o))return this.isScrolling="native",void this.animate.stop();i.preventDefault();let a=e;"both"===this.options.gestureOrientation?a=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(a=t);const c=s&&this.options.syncTouch,d=s&&"touchend"===i.type&&Math.abs(a)>5;d&&(a=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+a,Object.assign({programmatic:!1},c?{lerp:d?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}))},this.onNativeScroll=()=>{if(clearTimeout(this.__resetVelocityTimeout),delete this.__resetVelocityTimeout,this.__preventNextNativeScrollEvent)delete this.__preventNextNativeScrollEvent;else if(!1===this.isScrolling||"native"===this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity,this.velocity=this.animatedScroll-t,this.direction=Math.sign(this.animatedScroll-t),this.isScrolling="native",this.emit(),0!==this.velocity&&(this.__resetVelocityTimeout=setTimeout((()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()}),400))}},window.lenisVersion="1.1.4",t&&t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:s,smoothWheel:o,syncTouch:n,syncTouchLerp:r,touchInertiaMultiplier:l,duration:h,easing:a,lerp:c,infinite:d,gestureOrientation:u,orientation:p,touchMultiplier:m,wheelMultiplier:v,autoResize:g,prevent:w,__experimental__naiveDimensions:S},this.animate=new Animate,this.emitter=new Emitter,this.dimensions=new Dimensions({wrapper:t,content:e,autoResize:g}),this.updateClassName(),this.userData={},this.time=0,this.velocity=this.lastVelocity=0,this.isLocked=!1,this.isStopped=!1,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,!1),this.options.wrapper.addEventListener("pointerdown",this.onPointerDown,!1),this.virtualScroll=new VirtualScroll(s,{touchMultiplier:m,wheelMultiplier:v}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,!1),this.options.wrapper.removeEventListener("pointerdown",this.onPointerDown,!1),this.virtualScroll.destroy(),this.dimensions.destroy(),this.cleanUpClassName()}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity=0,this.animate.stop()}start(){this.isStopped&&(this.isStopped=!1,this.reset())}stop(){this.isStopped||(this.isStopped=!0,this.animate.stop(),this.reset())}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:o=this.options.duration,easing:n=this.options.easing,lerp:r=this.options.lerp,onStart:l,onComplete:h,force:a=!1,programmatic:c=!0,userData:d={}}={}){if(!this.isStopped&&!this.isLocked||a){if("string"==typeof t&&["top","left","start"].includes(t))t=0;else if("string"==typeof t&&["bottom","right","end"].includes(t))t=this.limit;else{let i;if("string"==typeof t?i=document.querySelector(t):t instanceof HTMLElement&&(null==t?void 0:t.nodeType)&&(i=t),i){if(this.options.wrapper!==window){const t=this.rootElement.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t&&(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=clamp(0,t,this.limit),t!==this.targetScroll)){if(this.userData=d,i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),null==h||h(this),void(this.userData={});c||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:n,lerp:r,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling="smooth",null==l||l(this)},onUpdate:(t,e)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==h||h(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this.__preventNextNativeScrollEvent=!0,requestAnimationFrame((()=>{delete this.__preventNextNativeScrollEvent}))}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.options.__experimental__naiveDimensions?this.isHorizontal?this.rootElement.scrollWidth-this.rootElement.clientWidth:this.rootElement.scrollHeight-this.rootElement.clientHeight:this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?function modulo(t,e){return(t%e+e)%e}(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.updateClassName())}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.updateClassName())}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.updateClassName())}get isSmooth(){return"smooth"===this.isScrolling}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),"smooth"===this.isScrolling&&(t+=" lenis-smooth"),t}updateClassName(){this.cleanUpClassName(),this.rootElement.className=`${this.rootElement.className} ${this.className}`.trim()}cleanUpClassName(){this.rootElement.className=this.rootElement.className.replace(/lenis(-\w+)?/g,"").trim()}}})); //# sourceMappingURL=lenis.min.js.map diff --git a/dist/lenis.min.js.map b/dist/lenis.min.js.map index 1f9f7a8b..c67d9698 100644 --- a/dist/lenis.min.js.map +++ b/dist/lenis.min.js.map @@ -1 +1 @@ -{"version":3,"file":"lenis.min.js","sources":["../src/maths.js","../src/animate.js","../src/dimensions.js","../src/debounce.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.duration && this.easing) {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n } else if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n // If no easing or lerp, just jump to the end value\r\n this.value = this.to\r\n completed = true\r\n }\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n this.onUpdate?.(this.value, completed)\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(from, to, { lerp, duration, easing, onStart, onUpdate }) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({\r\n wrapper,\r\n content,\r\n autoResize = true,\r\n debounce: debounceValue = 250,\r\n } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper === window) {\r\n window.addEventListener('resize', this.debouncedResize, false)\r\n } else {\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n if (this.wrapper === window) {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n } else {\r\n this.scrollHeight = this.wrapper.scrollHeight\r\n this.scrollWidth = this.wrapper.scrollWidth\r\n }\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n","export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX: 0,\r\n deltaY: 0,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.windowWidth = window.innerWidth\r\n this.windowHeight = window.innerHeight\r\n }\r\n}\r\n","import { version } from '../../../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\ntype Scrolling = boolean | 'native' | 'smooth'\r\n\r\nexport type LenisOptions = Partial<{\r\n wrapper: Window | HTMLElement\r\n content: HTMLElement\r\n wheelEventsTarget: Window | HTMLElement\r\n eventsTarget: Window | HTMLElement\r\n smoothWheel: boolean\r\n syncTouch: boolean\r\n syncTouchLerp: number\r\n touchInertiaMultiplier: number\r\n duration: number\r\n easing: EasingFunction\r\n lerp: number\r\n infinite: boolean\r\n orientation: Orientation\r\n gestureOrientation: GestureOrientation\r\n touchMultiplier: number\r\n wheelMultiplier: number\r\n autoResize: boolean\r\n prevent: boolean | ((node: Element) => boolean)\r\n __experimental__naiveDimensions: boolean\r\n}>\r\n\r\nexport default class Lenis {\r\n // __isSmooth: boolean = false // true if scroll should be animated\r\n __isScrolling: Scrolling = false // true when scroll is animating\r\n __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n\r\n time: number\r\n userData: object\r\n lastVelocity: number\r\n velocity: number\r\n direction: 1 | -1 | 0 = 0\r\n options: LenisOptions\r\n targetScroll: number\r\n animatedScroll: number\r\n // animate: Animate\r\n // emitter: Emitter\r\n // dimensions: Dimensions\r\n // virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n syncTouch = false,\r\n syncTouchLerp = 0.075,\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n autoResize = true,\r\n prevent = false,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // @ts-expect-error\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (\r\n !wrapper ||\r\n wrapper === document.documentElement ||\r\n wrapper === document.body\r\n ) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n syncTouch,\r\n syncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n autoResize,\r\n prevent,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n // this.toggleClassName('lenis', true)\r\n this.updateClassName()\r\n\r\n this.userData = {}\r\n this.time = 0\r\n this.velocity = this.lastVelocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n // this.hasScrolled = false\r\n // this.isSmooth = syncTouch || smoothWheel\r\n // this.isSmooth = false\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener(\r\n 'scroll',\r\n this.onNativeScroll,\r\n false\r\n )\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.cleanUpClassName()\r\n\r\n // this.rootElement.className = ''\r\n\r\n // this.toggleClassName('lenis', false)\r\n // this.toggleClassName('lenis-smooth', false)\r\n // this.toggleClassName('lenis-scrolling', false)\r\n // this.toggleClassName('lenis-stopped', false)\r\n // this.toggleClassName('lenis-locked', false)\r\n }\r\n\r\n on(event: string, callback: Function) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event: string, callback: Function) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n private setScroll(scroll: number) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n private onVirtualScroll = ({\r\n deltaX,\r\n deltaY,\r\n event,\r\n }: {\r\n deltaX: number\r\n deltaY: number\r\n event: WheelEvent | TouchEvent\r\n }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n // if (event.type === 'touchend') {\r\n // console.log('touchend', this.scroll)\r\n // // this.lastVelocity = this.velocity\r\n // // this.velocity = 0\r\n // // this.isScrolling = false\r\n // this.emit({ type: 'touchend' })\r\n // // alert('touchend')\r\n // return\r\n // }\r\n\r\n const isTapToStop =\r\n this.options.syncTouch &&\r\n isTouch &&\r\n event.type === 'touchstart' &&\r\n !this.isStopped &&\r\n !this.isLocked\r\n\r\n if (isTapToStop) {\r\n this.reset()\r\n return\r\n }\r\n\r\n const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n // const isPullToRefresh =\r\n // this.options.gestureOrientation === 'vertical' &&\r\n // this.scroll === 0 &&\r\n // !this.options.infinite &&\r\n // deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n const isUnknownGesture =\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n if (isClick || isUnknownGesture) {\r\n // console.log('prevent')\r\n return\r\n }\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n const prevent = this.options.prevent\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node instanceof Element &&\r\n ((typeof prevent === 'function' ? prevent?.(node) : prevent) ||\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n (node.classList?.contains('lenis') &&\r\n !node.classList?.contains('lenis-stopped'))) // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n return\r\n }\r\n\r\n const isSmooth =\r\n (this.options.syncTouch && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!isSmooth) {\r\n this.isScrolling = 'native'\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5\r\n\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch\r\n ? {\r\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n }\r\n : {\r\n lerp: this.options.lerp,\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n private emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n private onNativeScroll = () => {\r\n clearTimeout(this.__resetVelocityTimeout)\r\n delete this.__resetVelocityTimeout\r\n\r\n if (this.__preventNextNativeScrollEvent) {\r\n delete this.__preventNextNativeScrollEvent\r\n return\r\n }\r\n\r\n if (this.isScrolling === false || this.isScrolling === 'native') {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity\r\n this.velocity = this.animatedScroll - lastScroll\r\n this.direction = Math.sign(\r\n this.animatedScroll - lastScroll\r\n ) as Lenis['direction']\r\n // this.isSmooth = false\r\n this.isScrolling = 'native'\r\n this.emit()\r\n\r\n if (this.velocity !== 0) {\r\n this.__resetVelocityTimeout = setTimeout(() => {\r\n this.lastVelocity = this.velocity\r\n this.velocity = 0\r\n this.isScrolling = false\r\n this.emit()\r\n }, 400)\r\n }\r\n\r\n // this.hasScrolled = true\r\n // }, 50)\r\n }\r\n }\r\n\r\n private reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n if (!this.isStopped) return\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n if (this.isStopped) return\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time: number) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target: number | string | HTMLElement,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = this.options.lerp,\r\n onStart,\r\n onComplete,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n userData = {},\r\n }: {\r\n offset?: number\r\n immediate?: boolean\r\n lock?: boolean\r\n duration?: number\r\n easing?: EasingFunction\r\n lerp?: number\r\n onStart?: (lenis: Lenis) => void\r\n onComplete?: (lenis: Lenis) => void\r\n force?: boolean\r\n programmatic?: boolean\r\n userData?: object\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (\r\n typeof target === 'string' &&\r\n ['top', 'left', 'start'].includes(target)\r\n ) {\r\n target = 0\r\n } else if (\r\n typeof target === 'string' &&\r\n ['bottom', 'right', 'end'].includes(target)\r\n ) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target instanceof HTMLElement && target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.rootElement.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (target === this.targetScroll) return\r\n\r\n this.userData = userData\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n this.preventNextNativeScrollEvent()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = 'smooth'\r\n onStart?.(this)\r\n },\r\n onUpdate: (value: number, completed: boolean) => {\r\n this.isScrolling = 'smooth'\r\n\r\n // updated\r\n this.lastVelocity = this.velocity\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity) as Lenis['direction']\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n\r\n // avoid emitting event twice\r\n this.preventNextNativeScrollEvent()\r\n }\r\n },\r\n })\r\n }\r\n\r\n private preventNextNativeScrollEvent() {\r\n this.__preventNextNativeScrollEvent = true\r\n\r\n requestAnimationFrame(() => {\r\n delete this.__preventNextNativeScrollEvent\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return (\r\n this.options.wrapper === window\r\n ? document.documentElement\r\n : this.options.wrapper\r\n ) as HTMLElement\r\n }\r\n\r\n get limit() {\r\n if (this.options.__experimental__naiveDimensions) {\r\n if (this.isHorizontal) {\r\n return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n } else {\r\n return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n }\r\n } else {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll(): number {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll(): number {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress(): number {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n // get isSmooth() {\r\n // return this.__isSmooth\r\n // }\r\n\r\n // private set isSmooth(value: boolean) {\r\n // if (this.__isSmooth !== value) {\r\n // this.__isSmooth = value\r\n // this.updateClassName()\r\n // }\r\n // }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n private set isScrolling(value: Scrolling) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n private set isStopped(value: boolean) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n private set isLocked(value: boolean) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n // if (this.isScrolling === 'native') className += ' lenis-native'\r\n // if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n private updateClassName() {\r\n this.cleanUpClassName()\r\n\r\n this.rootElement.className =\r\n `${this.rootElement.className} ${this.className}`.trim()\r\n }\r\n\r\n private cleanUpClassName() {\r\n this.rootElement.className = this.rootElement.className\r\n .replace(/lenis(-\\w+)?/g, '')\r\n .trim()\r\n }\r\n}\r\n"],"names":["clamp","min","input","max","Math","Animate","advance","deltaTime","this","isRunning","completed","duration","easing","currentTime","linearProgress","easedProgress","value","from","to","lerp","damp","x","y","lambda","dt","t","exp","round","stop","onUpdate","fromTo","onStart","Dimensions","constructor","wrapper","content","autoResize","debounce","debounceValue","debouncedResize","callback","delay","timer","args","arguments","context","clearTimeout","setTimeout","apply","resize","window","addEventListener","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","disconnect","removeEventListener","onWrapperResize","onContentResize","width","innerWidth","height","innerHeight","clientWidth","clientHeight","scrollHeight","scrollWidth","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","push","filter","off","LINE_HEIGHT","VirtualScroll","element","wheelMultiplier","touchMultiplier","touchStart","emitter","onWindowResize","onWheel","passive","onTouchStart","onTouchMove","onTouchEnd","clientX","clientY","targetTouches","lastDelta","deltaX","deltaY","deltaMode","windowWidth","windowHeight","Lenis","document","documentElement","wheelEventsTarget","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","prevent","__experimental__naiveDimensions","__isScrolling","__isStopped","__isLocked","direction","onVirtualScroll","ctrlKey","isTouch","type","includes","isWheel","isTouching","options","isStopped","isLocked","reset","isClick","isUnknownGesture","composedPath","slice","indexOf","rootElement","find","node","Element","_a","hasAttribute","call","_b","_c","classList","_d","contains","_e","preventDefault","isScrolling","animate","delta","abs","hasTouchInertia","velocity","scrollTo","targetScroll","Object","assign","programmatic","onNativeScroll","__resetVelocityTimeout","__preventNextNativeScrollEvent","lastScroll","animatedScroll","actualScroll","lastVelocity","sign","lenisVersion","body","dimensions","updateClassName","userData","time","virtualScroll","cleanUpClassName","setScroll","scroll","isHorizontal","scrollLeft","scrollTop","start","raf","target","offset","immediate","lock","onComplete","force","querySelector","HTMLElement","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","preventNextNativeScrollEvent","requestAnimationFrame","modulo","n","d","progress","isSmooth","className","trim","replace"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"lenis.min.js","sources":["../src/maths.js","../src/animate.js","../src/dimensions.js","../src/debounce.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.duration && this.easing) {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n } else if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n // If no easing or lerp, just jump to the end value\r\n this.value = this.to\r\n completed = true\r\n }\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n this.onUpdate?.(this.value, completed)\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(from, to, { lerp, duration, easing, onStart, onUpdate }) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({\r\n wrapper,\r\n content,\r\n autoResize = true,\r\n debounce: debounceValue = 250,\r\n } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper === window) {\r\n window.addEventListener('resize', this.debouncedResize, false)\r\n } else {\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n if (this.wrapper === window) {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n } else {\r\n this.scrollHeight = this.wrapper.scrollHeight\r\n this.scrollWidth = this.wrapper.scrollWidth\r\n }\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n","export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX: 0,\r\n deltaY: 0,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.windowWidth = window.innerWidth\r\n this.windowHeight = window.innerHeight\r\n }\r\n}\r\n","import { version } from '../../../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\ntype Scrolling = boolean | 'native' | 'smooth'\r\n\r\nexport type LenisOptions = Partial<{\r\n wrapper: Window | HTMLElement\r\n content: HTMLElement\r\n wheelEventsTarget: Window | HTMLElement\r\n eventsTarget: Window | HTMLElement\r\n smoothWheel: boolean\r\n syncTouch: boolean\r\n syncTouchLerp: number\r\n touchInertiaMultiplier: number\r\n duration: number\r\n easing: EasingFunction\r\n lerp: number\r\n infinite: boolean\r\n orientation: Orientation\r\n gestureOrientation: GestureOrientation\r\n touchMultiplier: number\r\n wheelMultiplier: number\r\n autoResize: boolean\r\n prevent: boolean | ((node: Element) => boolean)\r\n __experimental__naiveDimensions: boolean\r\n}>\r\n\r\nexport default class Lenis {\r\n // __isSmooth: boolean = false // true if scroll should be animated\r\n __isScrolling: Scrolling = false // true when scroll is animating\r\n __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n __preventNextNativeScrollEvent?: boolean\r\n __resetVelocityTimeout?: number\r\n\r\n time: number\r\n userData: object\r\n lastVelocity: number\r\n velocity: number\r\n direction: 1 | -1 | 0 = 0\r\n options: LenisOptions\r\n targetScroll: number\r\n animatedScroll: number\r\n // animate: Animate\r\n // emitter: Emitter\r\n // dimensions: Dimensions\r\n // virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n syncTouch = false,\r\n syncTouchLerp = 0.075,\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n autoResize = true,\r\n prevent = false,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // @ts-expect-error\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (\r\n !wrapper ||\r\n wrapper === document.documentElement ||\r\n wrapper === document.body\r\n ) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n syncTouch,\r\n syncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n autoResize,\r\n prevent,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n // this.toggleClassName('lenis', true)\r\n this.updateClassName()\r\n\r\n this.userData = {}\r\n this.time = 0\r\n this.velocity = this.lastVelocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n // this.hasScrolled = false\r\n // this.isSmooth = syncTouch || smoothWheel\r\n // this.isSmooth = false\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n this.options.wrapper.addEventListener(\r\n 'pointerdown',\r\n this.onPointerDown,\r\n false\r\n )\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener(\r\n 'scroll',\r\n this.onNativeScroll,\r\n false\r\n )\r\n this.options.wrapper.removeEventListener(\r\n 'pointerdown',\r\n this.onPointerDown,\r\n false\r\n )\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.cleanUpClassName()\r\n\r\n // this.rootElement.className = ''\r\n\r\n // this.toggleClassName('lenis', false)\r\n // this.toggleClassName('lenis-smooth', false)\r\n // this.toggleClassName('lenis-scrolling', false)\r\n // this.toggleClassName('lenis-stopped', false)\r\n // this.toggleClassName('lenis-locked', false)\r\n }\r\n\r\n on(event: string, callback: Function) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event: string, callback: Function) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n private setScroll(scroll: number) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n private onPointerDown = (event: PointerEvent) => {\r\n if (event.button === 1) {\r\n this.reset()\r\n }\r\n }\r\n\r\n private onVirtualScroll = ({\r\n deltaX,\r\n deltaY,\r\n event,\r\n }: {\r\n deltaX: number\r\n deltaY: number\r\n event: WheelEvent | TouchEvent\r\n }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n // if (event.type === 'touchend') {\r\n // console.log('touchend', this.scroll)\r\n // // this.lastVelocity = this.velocity\r\n // // this.velocity = 0\r\n // // this.isScrolling = false\r\n // this.emit({ type: 'touchend' })\r\n // // alert('touchend')\r\n // return\r\n // }\r\n\r\n const isTapToStop =\r\n this.options.syncTouch &&\r\n isTouch &&\r\n event.type === 'touchstart' &&\r\n !this.isStopped &&\r\n !this.isLocked\r\n\r\n if (isTapToStop) {\r\n this.reset()\r\n return\r\n }\r\n\r\n const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n // const isPullToRefresh =\r\n // this.options.gestureOrientation === 'vertical' &&\r\n // this.scroll === 0 &&\r\n // !this.options.infinite &&\r\n // deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n const isUnknownGesture =\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n if (isClick || isUnknownGesture) {\r\n // console.log('prevent')\r\n return\r\n }\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n const prevent = this.options.prevent\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node instanceof Element &&\r\n ((typeof prevent === 'function' ? prevent?.(node) : prevent) ||\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n (node.classList?.contains('lenis') &&\r\n !node.classList?.contains('lenis-stopped'))) // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n return\r\n }\r\n\r\n const isSmooth =\r\n (this.options.syncTouch && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!isSmooth) {\r\n this.isScrolling = 'native'\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5\r\n\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch\r\n ? {\r\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n }\r\n : {\r\n lerp: this.options.lerp,\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n private emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n private onNativeScroll = () => {\r\n clearTimeout(this.__resetVelocityTimeout)\r\n delete this.__resetVelocityTimeout\r\n\r\n if (this.__preventNextNativeScrollEvent) {\r\n delete this.__preventNextNativeScrollEvent\r\n return\r\n }\r\n\r\n if (this.isScrolling === false || this.isScrolling === 'native') {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity\r\n this.velocity = this.animatedScroll - lastScroll\r\n this.direction = Math.sign(\r\n this.animatedScroll - lastScroll\r\n ) as Lenis['direction']\r\n // this.isSmooth = false\r\n this.isScrolling = 'native'\r\n this.emit()\r\n\r\n if (this.velocity !== 0) {\r\n this.__resetVelocityTimeout = setTimeout(() => {\r\n this.lastVelocity = this.velocity\r\n this.velocity = 0\r\n this.isScrolling = false\r\n this.emit()\r\n }, 400)\r\n }\r\n\r\n // this.hasScrolled = true\r\n // }, 50)\r\n }\r\n }\r\n\r\n private reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n if (!this.isStopped) return\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n if (this.isStopped) return\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time: number) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target: number | string | HTMLElement,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = this.options.lerp,\r\n onStart,\r\n onComplete,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n userData = {},\r\n }: {\r\n offset?: number\r\n immediate?: boolean\r\n lock?: boolean\r\n duration?: number\r\n easing?: EasingFunction\r\n lerp?: number\r\n onStart?: (lenis: Lenis) => void\r\n onComplete?: (lenis: Lenis) => void\r\n force?: boolean\r\n programmatic?: boolean\r\n userData?: object\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (\r\n typeof target === 'string' &&\r\n ['top', 'left', 'start'].includes(target)\r\n ) {\r\n target = 0\r\n } else if (\r\n typeof target === 'string' &&\r\n ['bottom', 'right', 'end'].includes(target)\r\n ) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target instanceof HTMLElement && target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.rootElement.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (target === this.targetScroll) return\r\n\r\n this.userData = userData\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n this.preventNextNativeScrollEvent()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = 'smooth'\r\n onStart?.(this)\r\n },\r\n onUpdate: (value: number, completed: boolean) => {\r\n this.isScrolling = 'smooth'\r\n\r\n // updated\r\n this.lastVelocity = this.velocity\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity) as Lenis['direction']\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n\r\n // avoid emitting event twice\r\n this.preventNextNativeScrollEvent()\r\n }\r\n },\r\n })\r\n }\r\n\r\n private preventNextNativeScrollEvent() {\r\n this.__preventNextNativeScrollEvent = true\r\n\r\n requestAnimationFrame(() => {\r\n delete this.__preventNextNativeScrollEvent\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return (\r\n this.options.wrapper === window\r\n ? document.documentElement\r\n : this.options.wrapper\r\n ) as HTMLElement\r\n }\r\n\r\n get limit() {\r\n if (this.options.__experimental__naiveDimensions) {\r\n if (this.isHorizontal) {\r\n return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n } else {\r\n return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n }\r\n } else {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll(): number {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll(): number {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress(): number {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n // get isSmooth() {\r\n // return this.__isSmooth\r\n // }\r\n\r\n // private set isSmooth(value: boolean) {\r\n // if (this.__isSmooth !== value) {\r\n // this.__isSmooth = value\r\n // this.updateClassName()\r\n // }\r\n // }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n private set isScrolling(value: Scrolling) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n private set isStopped(value: boolean) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n private set isLocked(value: boolean) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n // if (this.isScrolling === 'native') className += ' lenis-native'\r\n // if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n private updateClassName() {\r\n this.cleanUpClassName()\r\n\r\n this.rootElement.className =\r\n `${this.rootElement.className} ${this.className}`.trim()\r\n }\r\n\r\n private cleanUpClassName() {\r\n this.rootElement.className = this.rootElement.className\r\n .replace(/lenis(-\\w+)?/g, '')\r\n .trim()\r\n }\r\n}\r\n"],"names":["clamp","min","input","max","Math","Animate","advance","deltaTime","this","isRunning","completed","duration","easing","currentTime","linearProgress","easedProgress","value","from","to","lerp","damp","x","y","lambda","dt","t","exp","round","stop","onUpdate","fromTo","onStart","Dimensions","constructor","wrapper","content","autoResize","debounce","debounceValue","debouncedResize","callback","delay","timer","args","arguments","context","clearTimeout","setTimeout","apply","resize","window","addEventListener","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","disconnect","removeEventListener","onWrapperResize","onContentResize","width","innerWidth","height","innerHeight","clientWidth","clientHeight","scrollHeight","scrollWidth","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","push","filter","off","LINE_HEIGHT","VirtualScroll","element","wheelMultiplier","touchMultiplier","touchStart","emitter","onWindowResize","onWheel","passive","onTouchStart","onTouchMove","onTouchEnd","clientX","clientY","targetTouches","lastDelta","deltaX","deltaY","deltaMode","windowWidth","windowHeight","Lenis","document","documentElement","wheelEventsTarget","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","prevent","__experimental__naiveDimensions","__isScrolling","__isStopped","__isLocked","direction","onPointerDown","button","reset","onVirtualScroll","ctrlKey","isTouch","type","includes","isWheel","isTouching","options","isStopped","isLocked","isClick","isUnknownGesture","composedPath","slice","indexOf","rootElement","find","node","Element","_a","hasAttribute","call","_b","_c","classList","_d","contains","_e","preventDefault","isScrolling","animate","delta","abs","hasTouchInertia","velocity","scrollTo","targetScroll","Object","assign","programmatic","onNativeScroll","__resetVelocityTimeout","__preventNextNativeScrollEvent","lastScroll","animatedScroll","actualScroll","lastVelocity","sign","lenisVersion","body","dimensions","updateClassName","userData","time","virtualScroll","cleanUpClassName","setScroll","scroll","isHorizontal","scrollLeft","scrollTop","start","raf","target","offset","immediate","lock","onComplete","force","querySelector","HTMLElement","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","preventNextNativeScrollEvent","requestAnimationFrame","modulo","n","d","progress","isSmooth","className","trim","replace"],"mappings":"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"} \ No newline at end of file diff --git a/dist/lenis.mjs b/dist/lenis.mjs index b8acc171..ae0618d1 100644 --- a/dist/lenis.mjs +++ b/dist/lenis.mjs @@ -1,2 +1,2 @@ -function clamp(t,e,i){return Math.max(t,Math.min(e,i))}class Animate{advance(t){if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;const i=clamp(0,this.currentTime/this.duration,1);e=i>=1;const s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=function damp(t,e,i,s){return function lerp(t,e,i){return(1-i)*t+i*e}(t,e,1-Math.exp(-i*s))}(this.value,this.to,60*this.lerp,t),Math.round(this.value)===this.to&&(this.value=this.to,e=!0)):(this.value=this.to,e=!0);e&&this.stop(),this.onUpdate?.(this.value,e)}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i,duration:s,easing:o,onStart:n,onUpdate:r}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,n?.(),this.onUpdate=r}}class Dimensions{constructor({wrapper:t,content:e,autoResize:i=!0,debounce:s=250}={}){this.wrapper=t,this.content=e,i&&(this.debouncedResize=function debounce(t,e){let i;return function(){let s=arguments,o=this;clearTimeout(i),i=setTimeout((function(){t.apply(o,s)}),e)}}(this.resize,s),this.wrapper===window?window.addEventListener("resize",this.debouncedResize,!1):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),window.removeEventListener("resize",this.debouncedResize,!1)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper===window?(this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth):(this.scrollHeight=this.wrapper.scrollHeight,this.scrollWidth=this.wrapper.scrollWidth)};get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class Emitter{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{this.events[t]=this.events[t]?.filter((t=>e!==t))}}off(t,e){this.events[t]=this.events[t]?.filter((t=>e!==t))}destroy(){this.events={}}}const t=100/6;class VirtualScroll{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=1}){this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.touchStart={x:null,y:null},this.emitter=new Emitter,window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),window.removeEventListener("resize",this.onWindowResize,!1),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0},this.emitter.emit("scroll",{deltaX:0,deltaY:0,event:t})};onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,o=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:o},this.emitter.emit("scroll",{deltaX:s,deltaY:o,event:t})};onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})};onWheel=e=>{let{deltaX:i,deltaY:s,deltaMode:o}=e;i*=1===o?t:2===o?this.windowWidth:1,s*=1===o?t:2===o?this.windowHeight:1,i*=this.wheelMultiplier,s*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:i,deltaY:s,event:e})};onWindowResize=()=>{this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight}}class Lenis{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:s=i,smoothWheel:o=!0,syncTouch:n=!1,syncTouchLerp:r=.075,touchInertiaMultiplier:l=35,duration:h,easing:a=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:c=.1,infinite:u=!1,orientation:d="vertical",gestureOrientation:p="vertical",touchMultiplier:m=1,wheelMultiplier:v=1,autoResize:g=!0,prevent:S=!1,__experimental__naiveDimensions:w=!1}={}){this.__isScrolling=!1,this.__isStopped=!1,this.__isLocked=!1,this.direction=0,this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const s=i.type.includes("touch"),o=i.type.includes("wheel");this.isTouching="touchstart"===i.type||"touchmove"===i.type;if(this.options.syncTouch&&s&&"touchstart"===i.type&&!this.isStopped&&!this.isLocked)return void this.reset();const n=0===t&&0===e,r="vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t;if(n||r)return;let l=i.composedPath();l=l.slice(0,l.indexOf(this.rootElement));const h=this.options.prevent;if(l.find((t=>{var e,i,n,r,l;return t instanceof Element&&(("function"==typeof h?null==h?void 0:h(t):h)||(null===(e=t.hasAttribute)||void 0===e?void 0:e.call(t,"data-lenis-prevent"))||s&&(null===(i=t.hasAttribute)||void 0===i?void 0:i.call(t,"data-lenis-prevent-touch"))||o&&(null===(n=t.hasAttribute)||void 0===n?void 0:n.call(t,"data-lenis-prevent-wheel"))||(null===(r=t.classList)||void 0===r?void 0:r.contains("lenis"))&&!(null===(l=t.classList)||void 0===l?void 0:l.contains("lenis-stopped")))})))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(!(this.options.syncTouch&&s||this.options.smoothWheel&&o))return this.isScrolling="native",void this.animate.stop();i.preventDefault();let a=e;"both"===this.options.gestureOrientation?a=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(a=t);const c=s&&this.options.syncTouch,u=s&&"touchend"===i.type&&Math.abs(a)>5;u&&(a=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+a,Object.assign({programmatic:!1},c?{lerp:u?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}))},this.onNativeScroll=()=>{if(clearTimeout(this.__resetVelocityTimeout),delete this.__resetVelocityTimeout,this.__preventNextNativeScrollEvent)delete this.__preventNextNativeScrollEvent;else if(!1===this.isScrolling||"native"===this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity,this.velocity=this.animatedScroll-t,this.direction=Math.sign(this.animatedScroll-t),this.isScrolling="native",this.emit(),0!==this.velocity&&(this.__resetVelocityTimeout=setTimeout((()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()}),400))}},window.lenisVersion="1.1.3",t&&t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:s,smoothWheel:o,syncTouch:n,syncTouchLerp:r,touchInertiaMultiplier:l,duration:h,easing:a,lerp:c,infinite:u,gestureOrientation:p,orientation:d,touchMultiplier:m,wheelMultiplier:v,autoResize:g,prevent:S,__experimental__naiveDimensions:w},this.animate=new Animate,this.emitter=new Emitter,this.dimensions=new Dimensions({wrapper:t,content:e,autoResize:g}),this.updateClassName(),this.userData={},this.time=0,this.velocity=this.lastVelocity=0,this.isLocked=!1,this.isStopped=!1,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,!1),this.virtualScroll=new VirtualScroll(s,{touchMultiplier:m,wheelMultiplier:v}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,!1),this.virtualScroll.destroy(),this.dimensions.destroy(),this.cleanUpClassName()}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity=0,this.animate.stop()}start(){this.isStopped&&(this.isStopped=!1,this.reset())}stop(){this.isStopped||(this.isStopped=!0,this.animate.stop(),this.reset())}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:o=this.options.duration,easing:n=this.options.easing,lerp:r=this.options.lerp,onStart:l,onComplete:h,force:a=!1,programmatic:c=!0,userData:u={}}={}){if(!this.isStopped&&!this.isLocked||a){if("string"==typeof t&&["top","left","start"].includes(t))t=0;else if("string"==typeof t&&["bottom","right","end"].includes(t))t=this.limit;else{let i;if("string"==typeof t?i=document.querySelector(t):t instanceof HTMLElement&&(null==t?void 0:t.nodeType)&&(i=t),i){if(this.options.wrapper!==window){const t=this.rootElement.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t&&(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=clamp(0,t,this.limit),t!==this.targetScroll)){if(this.userData=u,i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),null==h||h(this),void(this.userData={});c||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:n,lerp:r,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling="smooth",null==l||l(this)},onUpdate:(t,e)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==h||h(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this.__preventNextNativeScrollEvent=!0,requestAnimationFrame((()=>{delete this.__preventNextNativeScrollEvent}))}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.options.__experimental__naiveDimensions?this.isHorizontal?this.rootElement.scrollWidth-this.rootElement.clientWidth:this.rootElement.scrollHeight-this.rootElement.clientHeight:this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?function modulo(t,e){return(t%e+e)%e}(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.updateClassName())}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.updateClassName())}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.updateClassName())}get isSmooth(){return"smooth"===this.isScrolling}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),"smooth"===this.isScrolling&&(t+=" lenis-smooth"),t}updateClassName(){this.cleanUpClassName(),this.rootElement.className=`${this.rootElement.className} ${this.className}`.trim()}cleanUpClassName(){this.rootElement.className=this.rootElement.className.replace(/lenis(-\w+)?/g,"").trim()}}export{Lenis as default}; +function clamp(t,e,i){return Math.max(t,Math.min(e,i))}class Animate{advance(t){if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;const i=clamp(0,this.currentTime/this.duration,1);e=i>=1;const s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=function damp(t,e,i,s){return function lerp(t,e,i){return(1-i)*t+i*e}(t,e,1-Math.exp(-i*s))}(this.value,this.to,60*this.lerp,t),Math.round(this.value)===this.to&&(this.value=this.to,e=!0)):(this.value=this.to,e=!0);e&&this.stop(),this.onUpdate?.(this.value,e)}stop(){this.isRunning=!1}fromTo(t,e,{lerp:i,duration:s,easing:o,onStart:n,onUpdate:r}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,n?.(),this.onUpdate=r}}class Dimensions{constructor({wrapper:t,content:e,autoResize:i=!0,debounce:s=250}={}){this.wrapper=t,this.content=e,i&&(this.debouncedResize=function debounce(t,e){let i;return function(){let s=arguments,o=this;clearTimeout(i),i=setTimeout((function(){t.apply(o,s)}),e)}}(this.resize,s),this.wrapper===window?window.addEventListener("resize",this.debouncedResize,!1):(this.wrapperResizeObserver=new ResizeObserver(this.debouncedResize),this.wrapperResizeObserver.observe(this.wrapper)),this.contentResizeObserver=new ResizeObserver(this.debouncedResize),this.contentResizeObserver.observe(this.content)),this.resize()}destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),window.removeEventListener("resize",this.debouncedResize,!1)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper===window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper===window?(this.scrollHeight=this.content.scrollHeight,this.scrollWidth=this.content.scrollWidth):(this.scrollHeight=this.wrapper.scrollHeight,this.scrollWidth=this.wrapper.scrollWidth)};get limit(){return{x:this.scrollWidth-this.width,y:this.scrollHeight-this.height}}}class Emitter{constructor(){this.events={}}emit(t,...e){let i=this.events[t]||[];for(let t=0,s=i.length;t{this.events[t]=this.events[t]?.filter((t=>e!==t))}}off(t,e){this.events[t]=this.events[t]?.filter((t=>e!==t))}destroy(){this.events={}}}const t=100/6;class VirtualScroll{constructor(t,{wheelMultiplier:e=1,touchMultiplier:i=1}){this.element=t,this.wheelMultiplier=e,this.touchMultiplier=i,this.touchStart={x:null,y:null},this.emitter=new Emitter,window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,{passive:!1}),this.element.addEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.addEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.addEventListener("touchend",this.onTouchEnd,{passive:!1})}on(t,e){return this.emitter.on(t,e)}destroy(){this.emitter.destroy(),window.removeEventListener("resize",this.onWindowResize,!1),this.element.removeEventListener("wheel",this.onWheel,{passive:!1}),this.element.removeEventListener("touchstart",this.onTouchStart,{passive:!1}),this.element.removeEventListener("touchmove",this.onTouchMove,{passive:!1}),this.element.removeEventListener("touchend",this.onTouchEnd,{passive:!1})}onTouchStart=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:0,y:0},this.emitter.emit("scroll",{deltaX:0,deltaY:0,event:t})};onTouchMove=t=>{const{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.touchMultiplier,o=-(i-this.touchStart.y)*this.touchMultiplier;this.touchStart.x=e,this.touchStart.y=i,this.lastDelta={x:s,y:o},this.emitter.emit("scroll",{deltaX:s,deltaY:o,event:t})};onTouchEnd=t=>{this.emitter.emit("scroll",{deltaX:this.lastDelta.x,deltaY:this.lastDelta.y,event:t})};onWheel=e=>{let{deltaX:i,deltaY:s,deltaMode:o}=e;i*=1===o?t:2===o?this.windowWidth:1,s*=1===o?t:2===o?this.windowHeight:1,i*=this.wheelMultiplier,s*=this.wheelMultiplier,this.emitter.emit("scroll",{deltaX:i,deltaY:s,event:e})};onWindowResize=()=>{this.windowWidth=window.innerWidth,this.windowHeight=window.innerHeight}}class Lenis{constructor({wrapper:t=window,content:e=document.documentElement,wheelEventsTarget:i=t,eventsTarget:s=i,smoothWheel:o=!0,syncTouch:n=!1,syncTouchLerp:r=.075,touchInertiaMultiplier:l=35,duration:h,easing:a=(t=>Math.min(1,1.001-Math.pow(2,-10*t))),lerp:c=.1,infinite:p=!1,orientation:d="vertical",gestureOrientation:u="vertical",touchMultiplier:m=1,wheelMultiplier:v=1,autoResize:g=!0,prevent:w=!1,__experimental__naiveDimensions:S=!1}={}){this.__isScrolling=!1,this.__isStopped=!1,this.__isLocked=!1,this.direction=0,this.onPointerDown=t=>{1===t.button&&this.reset()},this.onVirtualScroll=({deltaX:t,deltaY:e,event:i})=>{if(i.ctrlKey)return;const s=i.type.includes("touch"),o=i.type.includes("wheel");this.isTouching="touchstart"===i.type||"touchmove"===i.type;if(this.options.syncTouch&&s&&"touchstart"===i.type&&!this.isStopped&&!this.isLocked)return void this.reset();const n=0===t&&0===e,r="vertical"===this.options.gestureOrientation&&0===e||"horizontal"===this.options.gestureOrientation&&0===t;if(n||r)return;let l=i.composedPath();l=l.slice(0,l.indexOf(this.rootElement));const h=this.options.prevent;if(l.find((t=>{var e,i,n,r,l;return t instanceof Element&&(("function"==typeof h?null==h?void 0:h(t):h)||(null===(e=t.hasAttribute)||void 0===e?void 0:e.call(t,"data-lenis-prevent"))||s&&(null===(i=t.hasAttribute)||void 0===i?void 0:i.call(t,"data-lenis-prevent-touch"))||o&&(null===(n=t.hasAttribute)||void 0===n?void 0:n.call(t,"data-lenis-prevent-wheel"))||(null===(r=t.classList)||void 0===r?void 0:r.contains("lenis"))&&!(null===(l=t.classList)||void 0===l?void 0:l.contains("lenis-stopped")))})))return;if(this.isStopped||this.isLocked)return void i.preventDefault();if(!(this.options.syncTouch&&s||this.options.smoothWheel&&o))return this.isScrolling="native",void this.animate.stop();i.preventDefault();let a=e;"both"===this.options.gestureOrientation?a=Math.abs(e)>Math.abs(t)?e:t:"horizontal"===this.options.gestureOrientation&&(a=t);const c=s&&this.options.syncTouch,p=s&&"touchend"===i.type&&Math.abs(a)>5;p&&(a=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+a,Object.assign({programmatic:!1},c?{lerp:p?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}))},this.onNativeScroll=()=>{if(clearTimeout(this.__resetVelocityTimeout),delete this.__resetVelocityTimeout,this.__preventNextNativeScrollEvent)delete this.__preventNextNativeScrollEvent;else if(!1===this.isScrolling||"native"===this.isScrolling){const t=this.animatedScroll;this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity,this.velocity=this.animatedScroll-t,this.direction=Math.sign(this.animatedScroll-t),this.isScrolling="native",this.emit(),0!==this.velocity&&(this.__resetVelocityTimeout=setTimeout((()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()}),400))}},window.lenisVersion="1.1.4",t&&t!==document.documentElement&&t!==document.body||(t=window),this.options={wrapper:t,content:e,wheelEventsTarget:i,eventsTarget:s,smoothWheel:o,syncTouch:n,syncTouchLerp:r,touchInertiaMultiplier:l,duration:h,easing:a,lerp:c,infinite:p,gestureOrientation:u,orientation:d,touchMultiplier:m,wheelMultiplier:v,autoResize:g,prevent:w,__experimental__naiveDimensions:S},this.animate=new Animate,this.emitter=new Emitter,this.dimensions=new Dimensions({wrapper:t,content:e,autoResize:g}),this.updateClassName(),this.userData={},this.time=0,this.velocity=this.lastVelocity=0,this.isLocked=!1,this.isStopped=!1,this.isScrolling=!1,this.targetScroll=this.animatedScroll=this.actualScroll,this.options.wrapper.addEventListener("scroll",this.onNativeScroll,!1),this.options.wrapper.addEventListener("pointerdown",this.onPointerDown,!1),this.virtualScroll=new VirtualScroll(s,{touchMultiplier:m,wheelMultiplier:v}),this.virtualScroll.on("scroll",this.onVirtualScroll)}destroy(){this.emitter.destroy(),this.options.wrapper.removeEventListener("scroll",this.onNativeScroll,!1),this.options.wrapper.removeEventListener("pointerdown",this.onPointerDown,!1),this.virtualScroll.destroy(),this.dimensions.destroy(),this.cleanUpClassName()}on(t,e){return this.emitter.on(t,e)}off(t,e){return this.emitter.off(t,e)}setScroll(t){this.isHorizontal?this.rootElement.scrollLeft=t:this.rootElement.scrollTop=t}resize(){this.dimensions.resize()}emit(){this.emitter.emit("scroll",this)}reset(){this.isLocked=!1,this.isScrolling=!1,this.animatedScroll=this.targetScroll=this.actualScroll,this.lastVelocity=this.velocity=0,this.animate.stop()}start(){this.isStopped&&(this.isStopped=!1,this.reset())}stop(){this.isStopped||(this.isStopped=!0,this.animate.stop(),this.reset())}raf(t){const e=t-(this.time||t);this.time=t,this.animate.advance(.001*e)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:o=this.options.duration,easing:n=this.options.easing,lerp:r=this.options.lerp,onStart:l,onComplete:h,force:a=!1,programmatic:c=!0,userData:p={}}={}){if(!this.isStopped&&!this.isLocked||a){if("string"==typeof t&&["top","left","start"].includes(t))t=0;else if("string"==typeof t&&["bottom","right","end"].includes(t))t=this.limit;else{let i;if("string"==typeof t?i=document.querySelector(t):t instanceof HTMLElement&&(null==t?void 0:t.nodeType)&&(i=t),i){if(this.options.wrapper!==window){const t=this.rootElement.getBoundingClientRect();e-=this.isHorizontal?t.left:t.top}const s=i.getBoundingClientRect();t=(this.isHorizontal?s.left:s.top)+this.animatedScroll}}if("number"==typeof t&&(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=clamp(0,t,this.limit),t!==this.targetScroll)){if(this.userData=p,i)return this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),null==h||h(this),void(this.userData={});c||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:n,lerp:r,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling="smooth",null==l||l(this)},onUpdate:(t,e)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=t-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=t,this.setScroll(this.scroll),c&&(this.targetScroll=t),e||this.emit(),e&&(this.reset(),this.emit(),null==h||h(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this.__preventNextNativeScrollEvent=!0,requestAnimationFrame((()=>{delete this.__preventNextNativeScrollEvent}))}get rootElement(){return this.options.wrapper===window?document.documentElement:this.options.wrapper}get limit(){return this.options.__experimental__naiveDimensions?this.isHorizontal?this.rootElement.scrollWidth-this.rootElement.clientWidth:this.rootElement.scrollHeight-this.rootElement.clientHeight:this.dimensions.limit[this.isHorizontal?"x":"y"]}get isHorizontal(){return"horizontal"===this.options.orientation}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?function modulo(t,e){return(t%e+e)%e}(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return 0===this.limit?1:this.scroll/this.limit}get isScrolling(){return this.__isScrolling}set isScrolling(t){this.__isScrolling!==t&&(this.__isScrolling=t,this.updateClassName())}get isStopped(){return this.__isStopped}set isStopped(t){this.__isStopped!==t&&(this.__isStopped=t,this.updateClassName())}get isLocked(){return this.__isLocked}set isLocked(t){this.__isLocked!==t&&(this.__isLocked=t,this.updateClassName())}get isSmooth(){return"smooth"===this.isScrolling}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),"smooth"===this.isScrolling&&(t+=" lenis-smooth"),t}updateClassName(){this.cleanUpClassName(),this.rootElement.className=`${this.rootElement.className} ${this.className}`.trim()}cleanUpClassName(){this.rootElement.className=this.rootElement.className.replace(/lenis(-\w+)?/g,"").trim()}}export{Lenis as default}; //# sourceMappingURL=lenis.mjs.map diff --git a/dist/lenis.mjs.map b/dist/lenis.mjs.map index 45a2f204..12558fe0 100644 --- a/dist/lenis.mjs.map +++ b/dist/lenis.mjs.map @@ -1 +1 @@ -{"version":3,"file":"lenis.mjs","sources":["../src/maths.js","../src/animate.js","../src/dimensions.js","../src/debounce.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.duration && this.easing) {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n } else if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n // If no easing or lerp, just jump to the end value\r\n this.value = this.to\r\n completed = true\r\n }\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n this.onUpdate?.(this.value, completed)\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(from, to, { lerp, duration, easing, onStart, onUpdate }) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({\r\n wrapper,\r\n content,\r\n autoResize = true,\r\n debounce: debounceValue = 250,\r\n } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper === window) {\r\n window.addEventListener('resize', this.debouncedResize, false)\r\n } else {\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n if (this.wrapper === window) {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n } else {\r\n this.scrollHeight = this.wrapper.scrollHeight\r\n this.scrollWidth = this.wrapper.scrollWidth\r\n }\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n","export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX: 0,\r\n deltaY: 0,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.windowWidth = window.innerWidth\r\n this.windowHeight = window.innerHeight\r\n }\r\n}\r\n","import { version } from '../../../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\ntype Scrolling = boolean | 'native' | 'smooth'\r\n\r\nexport type LenisOptions = Partial<{\r\n wrapper: Window | HTMLElement\r\n content: HTMLElement\r\n wheelEventsTarget: Window | HTMLElement\r\n eventsTarget: Window | HTMLElement\r\n smoothWheel: boolean\r\n syncTouch: boolean\r\n syncTouchLerp: number\r\n touchInertiaMultiplier: number\r\n duration: number\r\n easing: EasingFunction\r\n lerp: number\r\n infinite: boolean\r\n orientation: Orientation\r\n gestureOrientation: GestureOrientation\r\n touchMultiplier: number\r\n wheelMultiplier: number\r\n autoResize: boolean\r\n prevent: boolean | ((node: Element) => boolean)\r\n __experimental__naiveDimensions: boolean\r\n}>\r\n\r\nexport default class Lenis {\r\n // __isSmooth: boolean = false // true if scroll should be animated\r\n __isScrolling: Scrolling = false // true when scroll is animating\r\n __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n\r\n time: number\r\n userData: object\r\n lastVelocity: number\r\n velocity: number\r\n direction: 1 | -1 | 0 = 0\r\n options: LenisOptions\r\n targetScroll: number\r\n animatedScroll: number\r\n // animate: Animate\r\n // emitter: Emitter\r\n // dimensions: Dimensions\r\n // virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n syncTouch = false,\r\n syncTouchLerp = 0.075,\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n autoResize = true,\r\n prevent = false,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // @ts-expect-error\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (\r\n !wrapper ||\r\n wrapper === document.documentElement ||\r\n wrapper === document.body\r\n ) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n syncTouch,\r\n syncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n autoResize,\r\n prevent,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n // this.toggleClassName('lenis', true)\r\n this.updateClassName()\r\n\r\n this.userData = {}\r\n this.time = 0\r\n this.velocity = this.lastVelocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n // this.hasScrolled = false\r\n // this.isSmooth = syncTouch || smoothWheel\r\n // this.isSmooth = false\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener(\r\n 'scroll',\r\n this.onNativeScroll,\r\n false\r\n )\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.cleanUpClassName()\r\n\r\n // this.rootElement.className = ''\r\n\r\n // this.toggleClassName('lenis', false)\r\n // this.toggleClassName('lenis-smooth', false)\r\n // this.toggleClassName('lenis-scrolling', false)\r\n // this.toggleClassName('lenis-stopped', false)\r\n // this.toggleClassName('lenis-locked', false)\r\n }\r\n\r\n on(event: string, callback: Function) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event: string, callback: Function) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n private setScroll(scroll: number) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n private onVirtualScroll = ({\r\n deltaX,\r\n deltaY,\r\n event,\r\n }: {\r\n deltaX: number\r\n deltaY: number\r\n event: WheelEvent | TouchEvent\r\n }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n // if (event.type === 'touchend') {\r\n // console.log('touchend', this.scroll)\r\n // // this.lastVelocity = this.velocity\r\n // // this.velocity = 0\r\n // // this.isScrolling = false\r\n // this.emit({ type: 'touchend' })\r\n // // alert('touchend')\r\n // return\r\n // }\r\n\r\n const isTapToStop =\r\n this.options.syncTouch &&\r\n isTouch &&\r\n event.type === 'touchstart' &&\r\n !this.isStopped &&\r\n !this.isLocked\r\n\r\n if (isTapToStop) {\r\n this.reset()\r\n return\r\n }\r\n\r\n const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n // const isPullToRefresh =\r\n // this.options.gestureOrientation === 'vertical' &&\r\n // this.scroll === 0 &&\r\n // !this.options.infinite &&\r\n // deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n const isUnknownGesture =\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n if (isClick || isUnknownGesture) {\r\n // console.log('prevent')\r\n return\r\n }\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n const prevent = this.options.prevent\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node instanceof Element &&\r\n ((typeof prevent === 'function' ? prevent?.(node) : prevent) ||\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n (node.classList?.contains('lenis') &&\r\n !node.classList?.contains('lenis-stopped'))) // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n return\r\n }\r\n\r\n const isSmooth =\r\n (this.options.syncTouch && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!isSmooth) {\r\n this.isScrolling = 'native'\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5\r\n\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch\r\n ? {\r\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n }\r\n : {\r\n lerp: this.options.lerp,\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n private emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n private onNativeScroll = () => {\r\n clearTimeout(this.__resetVelocityTimeout)\r\n delete this.__resetVelocityTimeout\r\n\r\n if (this.__preventNextNativeScrollEvent) {\r\n delete this.__preventNextNativeScrollEvent\r\n return\r\n }\r\n\r\n if (this.isScrolling === false || this.isScrolling === 'native') {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity\r\n this.velocity = this.animatedScroll - lastScroll\r\n this.direction = Math.sign(\r\n this.animatedScroll - lastScroll\r\n ) as Lenis['direction']\r\n // this.isSmooth = false\r\n this.isScrolling = 'native'\r\n this.emit()\r\n\r\n if (this.velocity !== 0) {\r\n this.__resetVelocityTimeout = setTimeout(() => {\r\n this.lastVelocity = this.velocity\r\n this.velocity = 0\r\n this.isScrolling = false\r\n this.emit()\r\n }, 400)\r\n }\r\n\r\n // this.hasScrolled = true\r\n // }, 50)\r\n }\r\n }\r\n\r\n private reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n if (!this.isStopped) return\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n if (this.isStopped) return\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time: number) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target: number | string | HTMLElement,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = this.options.lerp,\r\n onStart,\r\n onComplete,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n userData = {},\r\n }: {\r\n offset?: number\r\n immediate?: boolean\r\n lock?: boolean\r\n duration?: number\r\n easing?: EasingFunction\r\n lerp?: number\r\n onStart?: (lenis: Lenis) => void\r\n onComplete?: (lenis: Lenis) => void\r\n force?: boolean\r\n programmatic?: boolean\r\n userData?: object\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (\r\n typeof target === 'string' &&\r\n ['top', 'left', 'start'].includes(target)\r\n ) {\r\n target = 0\r\n } else if (\r\n typeof target === 'string' &&\r\n ['bottom', 'right', 'end'].includes(target)\r\n ) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target instanceof HTMLElement && target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.rootElement.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (target === this.targetScroll) return\r\n\r\n this.userData = userData\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n this.preventNextNativeScrollEvent()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = 'smooth'\r\n onStart?.(this)\r\n },\r\n onUpdate: (value: number, completed: boolean) => {\r\n this.isScrolling = 'smooth'\r\n\r\n // updated\r\n this.lastVelocity = this.velocity\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity) as Lenis['direction']\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n\r\n // avoid emitting event twice\r\n this.preventNextNativeScrollEvent()\r\n }\r\n },\r\n })\r\n }\r\n\r\n private preventNextNativeScrollEvent() {\r\n this.__preventNextNativeScrollEvent = true\r\n\r\n requestAnimationFrame(() => {\r\n delete this.__preventNextNativeScrollEvent\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return (\r\n this.options.wrapper === window\r\n ? document.documentElement\r\n : this.options.wrapper\r\n ) as HTMLElement\r\n }\r\n\r\n get limit() {\r\n if (this.options.__experimental__naiveDimensions) {\r\n if (this.isHorizontal) {\r\n return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n } else {\r\n return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n }\r\n } else {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll(): number {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll(): number {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress(): number {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n // get isSmooth() {\r\n // return this.__isSmooth\r\n // }\r\n\r\n // private set isSmooth(value: boolean) {\r\n // if (this.__isSmooth !== value) {\r\n // this.__isSmooth = value\r\n // this.updateClassName()\r\n // }\r\n // }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n private set isScrolling(value: Scrolling) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n private set isStopped(value: boolean) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n private set isLocked(value: boolean) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n // if (this.isScrolling === 'native') className += ' lenis-native'\r\n // if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n private updateClassName() {\r\n this.cleanUpClassName()\r\n\r\n this.rootElement.className =\r\n `${this.rootElement.className} ${this.className}`.trim()\r\n }\r\n\r\n private cleanUpClassName() {\r\n this.rootElement.className = this.rootElement.className\r\n .replace(/lenis(-\\w+)?/g, '')\r\n .trim()\r\n }\r\n}\r\n"],"names":["clamp","min","input","max","Math","Animate","advance","deltaTime","this","isRunning","completed","duration","easing","currentTime","linearProgress","easedProgress","value","from","to","lerp","damp","x","y","lambda","dt","t","exp","round","stop","onUpdate","fromTo","onStart","Dimensions","constructor","wrapper","content","autoResize","debounce","debounceValue","debouncedResize","callback","delay","timer","args","arguments","context","clearTimeout","setTimeout","apply","resize","window","addEventListener","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","disconnect","removeEventListener","onWrapperResize","onContentResize","width","innerWidth","height","innerHeight","clientWidth","clientHeight","scrollHeight","scrollWidth","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","push","filter","off","LINE_HEIGHT","VirtualScroll","element","wheelMultiplier","touchMultiplier","touchStart","emitter","onWindowResize","onWheel","passive","onTouchStart","onTouchMove","onTouchEnd","clientX","clientY","targetTouches","lastDelta","deltaX","deltaY","deltaMode","windowWidth","windowHeight","Lenis","document","documentElement","wheelEventsTarget","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","prevent","__experimental__naiveDimensions","__isScrolling","__isStopped","__isLocked","direction","onVirtualScroll","ctrlKey","isTouch","type","includes","isWheel","isTouching","options","isStopped","isLocked","reset","isClick","isUnknownGesture","composedPath","slice","indexOf","rootElement","find","node","Element","_a","hasAttribute","call","_b","_c","classList","_d","contains","_e","preventDefault","isScrolling","animate","delta","abs","hasTouchInertia","velocity","scrollTo","targetScroll","Object","assign","programmatic","onNativeScroll","__resetVelocityTimeout","__preventNextNativeScrollEvent","lastScroll","animatedScroll","actualScroll","lastVelocity","sign","lenisVersion","body","dimensions","updateClassName","userData","time","virtualScroll","cleanUpClassName","setScroll","scroll","isHorizontal","scrollLeft","scrollTop","start","raf","target","offset","immediate","lock","onComplete","force","querySelector","HTMLElement","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","preventNextNativeScrollEvent","requestAnimationFrame","modulo","n","d","progress","isSmooth","className","trim","replace"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"lenis.mjs","sources":["../src/maths.js","../src/animate.js","../src/dimensions.js","../src/debounce.js","../src/emitter.js","../src/virtual-scroll.js","../src/index.ts"],"sourcesContent":["// Clamp a value between a minimum and maximum value\r\nexport function clamp(min, input, max) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n// Truncate a floating-point number to a specified number of decimal places\r\nexport function truncate(value, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n// Linearly interpolate between two values using an amount (0 <= t <= 1)\r\nexport function lerp(x, y, t) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n// http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/\r\nexport function damp(x, y, lambda, dt) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * dt))\r\n}\r\n\r\n// Calculate the modulo of the dividend and divisor while keeping the result within the same sign as the divisor\r\n// https://anguscroll.com/just/just-modulo\r\nexport function modulo(n, d) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\n\r\n// Animate class to handle value animations with lerping or easing\r\nexport class Animate {\r\n // Advance the animation by the given delta time\r\n advance(deltaTime) {\r\n if (!this.isRunning) return\r\n\r\n let completed = false\r\n\r\n if (this.duration && this.easing) {\r\n this.currentTime += deltaTime\r\n const linearProgress = clamp(0, this.currentTime / this.duration, 1)\r\n\r\n completed = linearProgress >= 1\r\n const easedProgress = completed ? 1 : this.easing(linearProgress)\r\n this.value = this.from + (this.to - this.from) * easedProgress\r\n } else if (this.lerp) {\r\n this.value = damp(this.value, this.to, this.lerp * 60, deltaTime)\r\n if (Math.round(this.value) === this.to) {\r\n this.value = this.to\r\n completed = true\r\n }\r\n } else {\r\n // If no easing or lerp, just jump to the end value\r\n this.value = this.to\r\n completed = true\r\n }\r\n\r\n if (completed) {\r\n this.stop()\r\n }\r\n\r\n // Call the onUpdate callback with the current value and completed status\r\n this.onUpdate?.(this.value, completed)\r\n }\r\n\r\n // Stop the animation\r\n stop() {\r\n this.isRunning = false\r\n }\r\n\r\n // Set up the animation from a starting value to an ending value\r\n // with optional parameters for lerping, duration, easing, and onUpdate callback\r\n fromTo(from, to, { lerp, duration, easing, onStart, onUpdate }) {\r\n this.from = this.value = from\r\n this.to = to\r\n this.lerp = lerp\r\n this.duration = duration\r\n this.easing = easing\r\n this.currentTime = 0\r\n this.isRunning = true\r\n\r\n onStart?.()\r\n this.onUpdate = onUpdate\r\n }\r\n}\r\n","import { debounce } from './debounce'\r\n\r\nexport class Dimensions {\r\n constructor({\r\n wrapper,\r\n content,\r\n autoResize = true,\r\n debounce: debounceValue = 250,\r\n } = {}) {\r\n this.wrapper = wrapper\r\n this.content = content\r\n\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper === window) {\r\n window.addEventListener('resize', this.debouncedResize, false)\r\n } else {\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.wrapperResizeObserver.observe(this.wrapper)\r\n }\r\n\r\n this.contentResizeObserver = new ResizeObserver(this.debouncedResize)\r\n this.contentResizeObserver.observe(this.content)\r\n }\r\n\r\n this.resize()\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver?.disconnect()\r\n this.contentResizeObserver?.disconnect()\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\r\n\r\n resize = () => {\r\n this.onWrapperResize()\r\n this.onContentResize()\r\n }\r\n\r\n onWrapperResize = () => {\r\n if (this.wrapper === window) {\r\n this.width = window.innerWidth\r\n this.height = window.innerHeight\r\n } else {\r\n this.width = this.wrapper.clientWidth\r\n this.height = this.wrapper.clientHeight\r\n }\r\n }\r\n\r\n onContentResize = () => {\r\n if (this.wrapper === window) {\r\n this.scrollHeight = this.content.scrollHeight\r\n this.scrollWidth = this.content.scrollWidth\r\n } else {\r\n this.scrollHeight = this.wrapper.scrollHeight\r\n this.scrollWidth = this.wrapper.scrollWidth\r\n }\r\n }\r\n\r\n get limit() {\r\n return {\r\n x: this.scrollWidth - this.width,\r\n y: this.scrollHeight - this.height,\r\n }\r\n }\r\n}\r\n","export function debounce(callback, delay) {\r\n let timer\r\n return function () {\r\n let args = arguments\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(function () {\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","export class Emitter {\r\n constructor() {\r\n this.events = {}\r\n }\r\n\r\n emit(event, ...args) {\r\n let callbacks = this.events[event] || []\r\n for (let i = 0, length = callbacks.length; i < length; i++) {\r\n callbacks[i](...args)\r\n }\r\n }\r\n\r\n on(event, cb) {\r\n // Add the callback to the event's callback list, or create a new list with the callback\r\n this.events[event]?.push(cb) || (this.events[event] = [cb])\r\n\r\n // Return an unsubscribe function\r\n return () => {\r\n this.events[event] = this.events[event]?.filter((i) => cb !== i)\r\n }\r\n }\r\n\r\n off(event, callback) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\n\r\nexport class VirtualScroll {\r\n constructor(element, { wheelMultiplier = 1, touchMultiplier = 1 }) {\r\n this.element = element\r\n this.wheelMultiplier = wheelMultiplier\r\n this.touchMultiplier = touchMultiplier\r\n\r\n this.touchStart = {\r\n x: null,\r\n y: null,\r\n }\r\n\r\n this.emitter = new Emitter()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, { passive: false })\r\n this.element.addEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.addEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Add an event listener for the given event and callback\r\n on(event, callback) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n // Remove all event listeners and clean up\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n\r\n this.element.removeEventListener('wheel', this.onWheel, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchstart', this.onTouchStart, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchmove', this.onTouchMove, {\r\n passive: false,\r\n })\r\n this.element.removeEventListener('touchend', this.onTouchEnd, {\r\n passive: false,\r\n })\r\n }\r\n\r\n // Event handler for 'touchstart' event\r\n onTouchStart = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX: 0,\r\n deltaY: 0,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'touchmove' event\r\n onTouchMove = (event) => {\r\n const { clientX, clientY } = event.targetTouches\r\n ? event.targetTouches[0]\r\n : event\r\n\r\n const deltaX = -(clientX - this.touchStart.x) * this.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.touchMultiplier\r\n\r\n this.touchStart.x = clientX\r\n this.touchStart.y = clientY\r\n\r\n this.lastDelta = {\r\n x: deltaX,\r\n y: deltaY,\r\n }\r\n\r\n this.emitter.emit('scroll', {\r\n deltaX,\r\n deltaY,\r\n event,\r\n })\r\n }\r\n\r\n onTouchEnd = (event) => {\r\n this.emitter.emit('scroll', {\r\n deltaX: this.lastDelta.x,\r\n deltaY: this.lastDelta.y,\r\n event,\r\n })\r\n }\r\n\r\n // Event handler for 'wheel' event\r\n onWheel = (event) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowWidth : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.windowHeight : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.wheelMultiplier\r\n deltaY *= this.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.windowWidth = window.innerWidth\r\n this.windowHeight = window.innerHeight\r\n }\r\n}\r\n","import { version } from '../../../package.json'\r\nimport { Animate } from './animate'\r\nimport { Dimensions } from './dimensions'\r\nimport { Emitter } from './emitter'\r\nimport { clamp, modulo } from './maths'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Technical explanation\r\n// - listen to 'wheel' events\r\n// - prevent 'wheel' event to prevent scroll\r\n// - normalize wheel delta\r\n// - add delta to targetScroll\r\n// - animate scroll to targetScroll (smooth context)\r\n// - if animation is not running, listen to 'scroll' events (native context)\r\n\r\ntype EasingFunction = (t: number) => number\r\ntype Orientation = 'vertical' | 'horizontal'\r\ntype GestureOrientation = 'vertical' | 'horizontal' | 'both'\r\ntype Scrolling = boolean | 'native' | 'smooth'\r\n\r\nexport type LenisOptions = Partial<{\r\n wrapper: Window | HTMLElement\r\n content: HTMLElement\r\n wheelEventsTarget: Window | HTMLElement\r\n eventsTarget: Window | HTMLElement\r\n smoothWheel: boolean\r\n syncTouch: boolean\r\n syncTouchLerp: number\r\n touchInertiaMultiplier: number\r\n duration: number\r\n easing: EasingFunction\r\n lerp: number\r\n infinite: boolean\r\n orientation: Orientation\r\n gestureOrientation: GestureOrientation\r\n touchMultiplier: number\r\n wheelMultiplier: number\r\n autoResize: boolean\r\n prevent: boolean | ((node: Element) => boolean)\r\n __experimental__naiveDimensions: boolean\r\n}>\r\n\r\nexport default class Lenis {\r\n // __isSmooth: boolean = false // true if scroll should be animated\r\n __isScrolling: Scrolling = false // true when scroll is animating\r\n __isStopped: boolean = false // true if user should not be able to scroll - enable/disable programmatically\r\n __isLocked: boolean = false // same as isStopped but enabled/disabled when scroll reaches target\r\n __preventNextNativeScrollEvent?: boolean\r\n __resetVelocityTimeout?: number\r\n\r\n time: number\r\n userData: object\r\n lastVelocity: number\r\n velocity: number\r\n direction: 1 | -1 | 0 = 0\r\n options: LenisOptions\r\n targetScroll: number\r\n animatedScroll: number\r\n // animate: Animate\r\n // emitter: Emitter\r\n // dimensions: Dimensions\r\n // virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n wheelEventsTarget = wrapper, // deprecated\r\n eventsTarget = wheelEventsTarget,\r\n smoothWheel = true,\r\n syncTouch = false,\r\n syncTouchLerp = 0.075,\r\n touchInertiaMultiplier = 35,\r\n duration, // in seconds\r\n easing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t)),\r\n lerp = 0.1,\r\n infinite = false,\r\n orientation = 'vertical', // vertical, horizontal\r\n gestureOrientation = 'vertical', // vertical, horizontal, both\r\n touchMultiplier = 1,\r\n wheelMultiplier = 1,\r\n autoResize = true,\r\n prevent = false,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // @ts-expect-error\r\n window.lenisVersion = version\r\n\r\n // if wrapper is html or body, fallback to window\r\n if (\r\n !wrapper ||\r\n wrapper === document.documentElement ||\r\n wrapper === document.body\r\n ) {\r\n wrapper = window\r\n }\r\n\r\n this.options = {\r\n wrapper,\r\n content,\r\n wheelEventsTarget,\r\n eventsTarget,\r\n smoothWheel,\r\n syncTouch,\r\n syncTouchLerp,\r\n touchInertiaMultiplier,\r\n duration,\r\n easing,\r\n lerp,\r\n infinite,\r\n gestureOrientation,\r\n orientation,\r\n touchMultiplier,\r\n wheelMultiplier,\r\n autoResize,\r\n prevent,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n this.animate = new Animate()\r\n this.emitter = new Emitter()\r\n this.dimensions = new Dimensions({ wrapper, content, autoResize })\r\n // this.toggleClassName('lenis', true)\r\n this.updateClassName()\r\n\r\n this.userData = {}\r\n this.time = 0\r\n this.velocity = this.lastVelocity = 0\r\n this.isLocked = false\r\n this.isStopped = false\r\n // this.hasScrolled = false\r\n // this.isSmooth = syncTouch || smoothWheel\r\n // this.isSmooth = false\r\n this.isScrolling = false\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n this.options.wrapper.addEventListener('scroll', this.onNativeScroll, false)\r\n\r\n this.options.wrapper.addEventListener(\r\n 'pointerdown',\r\n this.onPointerDown,\r\n false\r\n )\r\n\r\n this.virtualScroll = new VirtualScroll(eventsTarget, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n destroy() {\r\n this.emitter.destroy()\r\n\r\n this.options.wrapper.removeEventListener(\r\n 'scroll',\r\n this.onNativeScroll,\r\n false\r\n )\r\n this.options.wrapper.removeEventListener(\r\n 'pointerdown',\r\n this.onPointerDown,\r\n false\r\n )\r\n\r\n this.virtualScroll.destroy()\r\n this.dimensions.destroy()\r\n\r\n this.cleanUpClassName()\r\n\r\n // this.rootElement.className = ''\r\n\r\n // this.toggleClassName('lenis', false)\r\n // this.toggleClassName('lenis-smooth', false)\r\n // this.toggleClassName('lenis-scrolling', false)\r\n // this.toggleClassName('lenis-stopped', false)\r\n // this.toggleClassName('lenis-locked', false)\r\n }\r\n\r\n on(event: string, callback: Function) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n off(event: string, callback: Function) {\r\n return this.emitter.off(event, callback)\r\n }\r\n\r\n private setScroll(scroll: number) {\r\n // apply scroll value immediately\r\n if (this.isHorizontal) {\r\n this.rootElement.scrollLeft = scroll\r\n } else {\r\n this.rootElement.scrollTop = scroll\r\n }\r\n }\r\n\r\n private onPointerDown = (event: PointerEvent) => {\r\n if (event.button === 1) {\r\n this.reset()\r\n }\r\n }\r\n\r\n private onVirtualScroll = ({\r\n deltaX,\r\n deltaY,\r\n event,\r\n }: {\r\n deltaX: number\r\n deltaY: number\r\n event: WheelEvent | TouchEvent\r\n }) => {\r\n // keep zoom feature\r\n if (event.ctrlKey) return\r\n\r\n const isTouch = event.type.includes('touch')\r\n const isWheel = event.type.includes('wheel')\r\n\r\n this.isTouching = event.type === 'touchstart' || event.type === 'touchmove'\r\n // if (event.type === 'touchend') {\r\n // console.log('touchend', this.scroll)\r\n // // this.lastVelocity = this.velocity\r\n // // this.velocity = 0\r\n // // this.isScrolling = false\r\n // this.emit({ type: 'touchend' })\r\n // // alert('touchend')\r\n // return\r\n // }\r\n\r\n const isTapToStop =\r\n this.options.syncTouch &&\r\n isTouch &&\r\n event.type === 'touchstart' &&\r\n !this.isStopped &&\r\n !this.isLocked\r\n\r\n if (isTapToStop) {\r\n this.reset()\r\n return\r\n }\r\n\r\n const isClick = deltaX === 0 && deltaY === 0 // click event\r\n\r\n // const isPullToRefresh =\r\n // this.options.gestureOrientation === 'vertical' &&\r\n // this.scroll === 0 &&\r\n // !this.options.infinite &&\r\n // deltaY <= 5 // touch pull to refresh, not reliable yet\r\n\r\n const isUnknownGesture =\r\n (this.options.gestureOrientation === 'vertical' && deltaY === 0) ||\r\n (this.options.gestureOrientation === 'horizontal' && deltaX === 0)\r\n\r\n if (isClick || isUnknownGesture) {\r\n // console.log('prevent')\r\n return\r\n }\r\n\r\n // catch if scrolling on nested scroll elements\r\n let composedPath = event.composedPath()\r\n composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement)) // remove parents elements\r\n\r\n const prevent = this.options.prevent\r\n\r\n if (\r\n !!composedPath.find(\r\n (node) =>\r\n node instanceof Element &&\r\n ((typeof prevent === 'function' ? prevent?.(node) : prevent) ||\r\n node.hasAttribute?.('data-lenis-prevent') ||\r\n (isTouch && node.hasAttribute?.('data-lenis-prevent-touch')) ||\r\n (isWheel && node.hasAttribute?.('data-lenis-prevent-wheel')) ||\r\n (node.classList?.contains('lenis') &&\r\n !node.classList?.contains('lenis-stopped'))) // nested lenis instance\r\n )\r\n )\r\n return\r\n\r\n if (this.isStopped || this.isLocked) {\r\n event.preventDefault() // this will stop forwarding the event to the parent, this is problematic\r\n return\r\n }\r\n\r\n const isSmooth =\r\n (this.options.syncTouch && isTouch) ||\r\n (this.options.smoothWheel && isWheel)\r\n\r\n if (!isSmooth) {\r\n this.isScrolling = 'native'\r\n this.animate.stop()\r\n return\r\n }\r\n\r\n event.preventDefault()\r\n\r\n let delta = deltaY\r\n if (this.options.gestureOrientation === 'both') {\r\n delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX\r\n } else if (this.options.gestureOrientation === 'horizontal') {\r\n delta = deltaX\r\n }\r\n\r\n const syncTouch = isTouch && this.options.syncTouch\r\n const isTouchEnd = isTouch && event.type === 'touchend'\r\n\r\n const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5\r\n\r\n if (hasTouchInertia) {\r\n delta = this.velocity * this.options.touchInertiaMultiplier\r\n }\r\n\r\n this.scrollTo(this.targetScroll + delta, {\r\n programmatic: false,\r\n ...(syncTouch\r\n ? {\r\n lerp: hasTouchInertia ? this.options.syncTouchLerp : 1,\r\n }\r\n : {\r\n lerp: this.options.lerp,\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n }),\r\n })\r\n }\r\n\r\n resize() {\r\n this.dimensions.resize()\r\n }\r\n\r\n private emit() {\r\n this.emitter.emit('scroll', this)\r\n }\r\n\r\n private onNativeScroll = () => {\r\n clearTimeout(this.__resetVelocityTimeout)\r\n delete this.__resetVelocityTimeout\r\n\r\n if (this.__preventNextNativeScrollEvent) {\r\n delete this.__preventNextNativeScrollEvent\r\n return\r\n }\r\n\r\n if (this.isScrolling === false || this.isScrolling === 'native') {\r\n const lastScroll = this.animatedScroll\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity\r\n this.velocity = this.animatedScroll - lastScroll\r\n this.direction = Math.sign(\r\n this.animatedScroll - lastScroll\r\n ) as Lenis['direction']\r\n // this.isSmooth = false\r\n this.isScrolling = 'native'\r\n this.emit()\r\n\r\n if (this.velocity !== 0) {\r\n this.__resetVelocityTimeout = setTimeout(() => {\r\n this.lastVelocity = this.velocity\r\n this.velocity = 0\r\n this.isScrolling = false\r\n this.emit()\r\n }, 400)\r\n }\r\n\r\n // this.hasScrolled = true\r\n // }, 50)\r\n }\r\n }\r\n\r\n private reset() {\r\n this.isLocked = false\r\n this.isScrolling = false\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.lastVelocity = this.velocity = 0\r\n this.animate.stop()\r\n }\r\n\r\n start() {\r\n if (!this.isStopped) return\r\n this.isStopped = false\r\n\r\n this.reset()\r\n }\r\n\r\n stop() {\r\n if (this.isStopped) return\r\n this.isStopped = true\r\n this.animate.stop()\r\n\r\n this.reset()\r\n }\r\n\r\n raf(time: number) {\r\n const deltaTime = time - (this.time || time)\r\n this.time = time\r\n\r\n this.animate.advance(deltaTime * 0.001)\r\n }\r\n\r\n scrollTo(\r\n target: number | string | HTMLElement,\r\n {\r\n offset = 0,\r\n immediate = false,\r\n lock = false,\r\n duration = this.options.duration,\r\n easing = this.options.easing,\r\n lerp = this.options.lerp,\r\n onStart,\r\n onComplete,\r\n force = false, // scroll even if stopped\r\n programmatic = true, // called from outside of the class\r\n userData = {},\r\n }: {\r\n offset?: number\r\n immediate?: boolean\r\n lock?: boolean\r\n duration?: number\r\n easing?: EasingFunction\r\n lerp?: number\r\n onStart?: (lenis: Lenis) => void\r\n onComplete?: (lenis: Lenis) => void\r\n force?: boolean\r\n programmatic?: boolean\r\n userData?: object\r\n } = {}\r\n ) {\r\n if ((this.isStopped || this.isLocked) && !force) return\r\n\r\n // keywords\r\n if (\r\n typeof target === 'string' &&\r\n ['top', 'left', 'start'].includes(target)\r\n ) {\r\n target = 0\r\n } else if (\r\n typeof target === 'string' &&\r\n ['bottom', 'right', 'end'].includes(target)\r\n ) {\r\n target = this.limit\r\n } else {\r\n let node\r\n\r\n if (typeof target === 'string') {\r\n // CSS selector\r\n node = document.querySelector(target)\r\n } else if (target instanceof HTMLElement && target?.nodeType) {\r\n // Node element\r\n node = target\r\n }\r\n\r\n if (node) {\r\n if (this.options.wrapper !== window) {\r\n // nested scroll offset correction\r\n const wrapperRect = this.rootElement.getBoundingClientRect()\r\n offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top\r\n }\r\n\r\n const rect = node.getBoundingClientRect()\r\n\r\n target =\r\n (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll\r\n }\r\n }\r\n\r\n if (typeof target !== 'number') return\r\n\r\n target += offset\r\n target = Math.round(target)\r\n\r\n if (this.options.infinite) {\r\n if (programmatic) {\r\n this.targetScroll = this.animatedScroll = this.scroll\r\n }\r\n } else {\r\n target = clamp(0, target, this.limit)\r\n }\r\n\r\n if (target === this.targetScroll) return\r\n\r\n this.userData = userData\r\n\r\n if (immediate) {\r\n this.animatedScroll = this.targetScroll = target\r\n this.setScroll(this.scroll)\r\n this.reset()\r\n this.preventNextNativeScrollEvent()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n return\r\n }\r\n\r\n if (!programmatic) {\r\n this.targetScroll = target\r\n }\r\n\r\n this.animate.fromTo(this.animatedScroll, target, {\r\n duration,\r\n easing,\r\n lerp,\r\n onStart: () => {\r\n // started\r\n if (lock) this.isLocked = true\r\n this.isScrolling = 'smooth'\r\n onStart?.(this)\r\n },\r\n onUpdate: (value: number, completed: boolean) => {\r\n this.isScrolling = 'smooth'\r\n\r\n // updated\r\n this.lastVelocity = this.velocity\r\n this.velocity = value - this.animatedScroll\r\n this.direction = Math.sign(this.velocity) as Lenis['direction']\r\n\r\n this.animatedScroll = value\r\n this.setScroll(this.scroll)\r\n\r\n if (programmatic) {\r\n // wheel during programmatic should stop it\r\n this.targetScroll = value\r\n }\r\n\r\n if (!completed) this.emit()\r\n\r\n if (completed) {\r\n this.reset()\r\n this.emit()\r\n onComplete?.(this)\r\n this.userData = {}\r\n\r\n // avoid emitting event twice\r\n this.preventNextNativeScrollEvent()\r\n }\r\n },\r\n })\r\n }\r\n\r\n private preventNextNativeScrollEvent() {\r\n this.__preventNextNativeScrollEvent = true\r\n\r\n requestAnimationFrame(() => {\r\n delete this.__preventNextNativeScrollEvent\r\n })\r\n }\r\n\r\n get rootElement() {\r\n return (\r\n this.options.wrapper === window\r\n ? document.documentElement\r\n : this.options.wrapper\r\n ) as HTMLElement\r\n }\r\n\r\n get limit() {\r\n if (this.options.__experimental__naiveDimensions) {\r\n if (this.isHorizontal) {\r\n return this.rootElement.scrollWidth - this.rootElement.clientWidth\r\n } else {\r\n return this.rootElement.scrollHeight - this.rootElement.clientHeight\r\n }\r\n } else {\r\n return this.dimensions.limit[this.isHorizontal ? 'x' : 'y']\r\n }\r\n }\r\n\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n get actualScroll(): number {\r\n // value browser takes into account\r\n return this.isHorizontal\r\n ? this.rootElement.scrollLeft\r\n : this.rootElement.scrollTop\r\n }\r\n\r\n get scroll(): number {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n get progress(): number {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n // get isSmooth() {\r\n // return this.__isSmooth\r\n // }\r\n\r\n // private set isSmooth(value: boolean) {\r\n // if (this.__isSmooth !== value) {\r\n // this.__isSmooth = value\r\n // this.updateClassName()\r\n // }\r\n // }\r\n\r\n get isScrolling() {\r\n return this.__isScrolling\r\n }\r\n\r\n private set isScrolling(value: Scrolling) {\r\n if (this.__isScrolling !== value) {\r\n this.__isScrolling = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isStopped() {\r\n return this.__isStopped\r\n }\r\n\r\n private set isStopped(value: boolean) {\r\n if (this.__isStopped !== value) {\r\n this.__isStopped = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isLocked() {\r\n return this.__isLocked\r\n }\r\n\r\n private set isLocked(value: boolean) {\r\n if (this.__isLocked !== value) {\r\n this.__isLocked = value\r\n this.updateClassName()\r\n }\r\n }\r\n\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n get className() {\r\n let className = 'lenis'\r\n if (this.isStopped) className += ' lenis-stopped'\r\n if (this.isLocked) className += ' lenis-locked'\r\n if (this.isScrolling) className += ' lenis-scrolling'\r\n if (this.isScrolling === 'smooth') className += ' lenis-smooth'\r\n // if (this.isScrolling === 'native') className += ' lenis-native'\r\n // if (this.isSmooth) className += ' lenis-smooth'\r\n return className\r\n }\r\n\r\n private updateClassName() {\r\n this.cleanUpClassName()\r\n\r\n this.rootElement.className =\r\n `${this.rootElement.className} ${this.className}`.trim()\r\n }\r\n\r\n private cleanUpClassName() {\r\n this.rootElement.className = this.rootElement.className\r\n .replace(/lenis(-\\w+)?/g, '')\r\n .trim()\r\n }\r\n}\r\n"],"names":["clamp","min","input","max","Math","Animate","advance","deltaTime","this","isRunning","completed","duration","easing","currentTime","linearProgress","easedProgress","value","from","to","lerp","damp","x","y","lambda","dt","t","exp","round","stop","onUpdate","fromTo","onStart","Dimensions","constructor","wrapper","content","autoResize","debounce","debounceValue","debouncedResize","callback","delay","timer","args","arguments","context","clearTimeout","setTimeout","apply","resize","window","addEventListener","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","disconnect","removeEventListener","onWrapperResize","onContentResize","width","innerWidth","height","innerHeight","clientWidth","clientHeight","scrollHeight","scrollWidth","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","push","filter","off","LINE_HEIGHT","VirtualScroll","element","wheelMultiplier","touchMultiplier","touchStart","emitter","onWindowResize","onWheel","passive","onTouchStart","onTouchMove","onTouchEnd","clientX","clientY","targetTouches","lastDelta","deltaX","deltaY","deltaMode","windowWidth","windowHeight","Lenis","document","documentElement","wheelEventsTarget","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","prevent","__experimental__naiveDimensions","__isScrolling","__isStopped","__isLocked","direction","onPointerDown","button","reset","onVirtualScroll","ctrlKey","isTouch","type","includes","isWheel","isTouching","options","isStopped","isLocked","isClick","isUnknownGesture","composedPath","slice","indexOf","rootElement","find","node","Element","_a","hasAttribute","call","_b","_c","classList","_d","contains","_e","preventDefault","isScrolling","animate","delta","abs","hasTouchInertia","velocity","scrollTo","targetScroll","Object","assign","programmatic","onNativeScroll","__resetVelocityTimeout","__preventNextNativeScrollEvent","lastScroll","animatedScroll","actualScroll","lastVelocity","sign","lenisVersion","body","dimensions","updateClassName","userData","time","virtualScroll","cleanUpClassName","setScroll","scroll","isHorizontal","scrollLeft","scrollTop","start","raf","target","offset","immediate","lock","onComplete","force","querySelector","HTMLElement","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","preventNextNativeScrollEvent","requestAnimationFrame","modulo","n","d","progress","isSmooth","className","trim","replace"],"mappings":"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"} \ No newline at end of file