{"version":3,"file":"lenis.min.js","sources":["../../src/maths.ts","../../src/animate.ts","../../src/dimensions.ts","../../src/debounce.ts","../../src/emitter.ts","../../src/virtual-scroll.ts","../../src/index.ts"],"sourcesContent":["/**\r\n * Clamp a value between a minimum and maximum value\r\n *\r\n * @param min Minimum value\r\n * @param input Value to clamp\r\n * @param max Maximum value\r\n * @returns Clamped value\r\n */\r\nexport function clamp(min: number, input: number, max: number) {\r\n return Math.max(min, Math.min(input, max))\r\n}\r\n\r\n/**\r\n * Truncate a floating-point number to a specified number of decimal places\r\n *\r\n * @param value Value to truncate\r\n * @param decimals Number of decimal places to truncate to\r\n * @returns Truncated value\r\n */\r\nexport function truncate(value: number, decimals = 0) {\r\n return parseFloat(value.toFixed(decimals))\r\n}\r\n\r\n/**\r\n * Linearly interpolate between two values using an amount (0 <= t <= 1)\r\n *\r\n * @param x First value\r\n * @param y Second value\r\n * @param t Amount to interpolate (0 <= t <= 1)\r\n * @returns Interpolated value\r\n */\r\nexport function lerp(x: number, y: number, t: number) {\r\n return (1 - t) * x + t * y\r\n}\r\n\r\n/**\r\n * Damp a value over time using a damping factor\r\n * {@link http://www.rorydriscoll.com/2016/03/07/frame-rate-independent-damping-using-lerp/}\r\n *\r\n * @param x Initial value\r\n * @param y Target value\r\n * @param lambda Damping factor\r\n * @param dt Time elapsed since the last update\r\n * @returns Damped value\r\n */\r\nexport function damp(x: number, y: number, lambda: number, deltaTime: number) {\r\n return lerp(x, y, 1 - Math.exp(-lambda * deltaTime))\r\n}\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 * {@link https://anguscroll.com/just/just-modulo}\r\n *\r\n * @param n Dividend\r\n * @param d Divisor\r\n * @returns Modulo\r\n */\r\nexport function modulo(n: number, d: number) {\r\n return ((n % d) + d) % d\r\n}\r\n","import { clamp, damp } from './maths'\r\nimport type { EasingFunction, FromToOptions, OnUpdateCallback } from './types'\r\n\r\n/**\r\n * Animate class to handle value animations with lerping or easing\r\n *\r\n * @example\r\n * const animate = new Animate()\r\n * animate.fromTo(0, 100, { duration: 1, easing: (t) => t })\r\n * animate.advance(0.5) // 50\r\n */\r\nexport class Animate {\r\n isRunning = false\r\n value = 0\r\n from = 0\r\n to = 0\r\n currentTime = 0\r\n\r\n // These are instanciated in the fromTo method\r\n lerp?: number\r\n duration?: number\r\n easing?: EasingFunction\r\n onUpdate?: OnUpdateCallback\r\n\r\n /**\r\n * Advance the animation by the given delta time\r\n *\r\n * @param deltaTime - The time in seconds to advance the animation\r\n */\r\n advance(deltaTime: number) {\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 /**\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 *\r\n * @param from - The starting value\r\n * @param to - The ending value\r\n * @param options - Options for the animation\r\n */\r\n fromTo(\r\n from: number,\r\n to: number,\r\n { lerp, duration, easing, onStart, onUpdate }: FromToOptions\r\n ) {\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\n/**\r\n * Dimensions class to handle the size of the content and wrapper\r\n *\r\n * @example\r\n * const dimensions = new Dimensions(wrapper, content)\r\n * dimensions.on('resize', (e) => {\r\n * console.log(e.width, e.height)\r\n * })\r\n */\r\nexport class Dimensions {\r\n width = 0\r\n height = 0\r\n scrollHeight = 0\r\n scrollWidth = 0\r\n\r\n // These are instanciated in the constructor as they need information from the options\r\n private debouncedResize?: (...args: unknown[]) => void\r\n private wrapperResizeObserver?: ResizeObserver\r\n private contentResizeObserver?: ResizeObserver\r\n\r\n constructor(\r\n private wrapper: HTMLElement | Window,\r\n private content: HTMLElement,\r\n { autoResize = true, debounce: debounceValue = 250 } = {}\r\n ) {\r\n if (autoResize) {\r\n this.debouncedResize = debounce(this.resize, debounceValue)\r\n\r\n if (this.wrapper instanceof 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\r\n if (this.wrapper === window && this.debouncedResize) {\r\n window.removeEventListener('resize', this.debouncedResize, false)\r\n }\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 instanceof 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 instanceof 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 void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function (this: T, ...args: Parameters) {\r\n let context = this\r\n clearTimeout(timer)\r\n timer = setTimeout(() => {\r\n timer = undefined\r\n callback.apply(context, args)\r\n }, delay)\r\n }\r\n}\r\n","/**\r\n * Emitter class to handle events\r\n * @example\r\n * const emitter = new Emitter()\r\n * emitter.on('event', (data) => {\r\n * console.log(data)\r\n * })\r\n * emitter.emit('event', 'data')\r\n */\r\nexport class Emitter {\r\n private events: Record<\r\n string,\r\n Array<(...args: unknown[]) => void> | undefined\r\n > = {}\r\n\r\n /**\r\n * Emit an event with the given data\r\n * @param event Event name\r\n * @param args Data to pass to the event handlers\r\n */\r\n emit(event: string, ...args: unknown[]) {\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 /**\r\n * Add a callback to the event\r\n * @param event Event name\r\n * @param cb Callback function\r\n * @returns Unsubscribe function\r\n */\r\n on void>(event: string, cb: 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 /**\r\n * Remove a callback from the event\r\n * @param event Event name\r\n * @param callback Callback function\r\n */\r\n off void>(event: string, callback: CB) {\r\n this.events[event] = this.events[event]?.filter((i) => callback !== i)\r\n }\r\n\r\n /**\r\n * Remove all event listeners and clean up\r\n */\r\n destroy() {\r\n this.events = {}\r\n }\r\n}\r\n","import { Emitter } from './emitter'\r\nimport { VirtualScrollCallback } from './types'\r\n\r\nconst LINE_HEIGHT = 100 / 6\r\nconst listenerOptions: AddEventListenerOptions = { passive: false }\r\n\r\nexport class VirtualScroll {\r\n touchStart = {\r\n x: 0,\r\n y: 0,\r\n }\r\n lastDelta = {\r\n x: 0,\r\n y: 0,\r\n }\r\n window = {\r\n width: 0,\r\n height: 0,\r\n }\r\n private emitter = new Emitter()\r\n\r\n constructor(\r\n private element: HTMLElement,\r\n private options = { wheelMultiplier: 1, touchMultiplier: 1 }\r\n ) {\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n this.onWindowResize()\r\n\r\n this.element.addEventListener('wheel', this.onWheel, listenerOptions)\r\n this.element.addEventListener(\r\n 'touchstart',\r\n this.onTouchStart,\r\n listenerOptions\r\n )\r\n this.element.addEventListener(\r\n 'touchmove',\r\n this.onTouchMove,\r\n listenerOptions\r\n )\r\n this.element.addEventListener('touchend', this.onTouchEnd, listenerOptions)\r\n }\r\n\r\n /**\r\n * Add an event listener for the given event and callback\r\n *\r\n * @param event Event name\r\n * @param callback Callback function\r\n */\r\n on(event: string, callback: VirtualScrollCallback) {\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, listenerOptions)\r\n this.element.removeEventListener(\r\n 'touchstart',\r\n this.onTouchStart,\r\n listenerOptions\r\n )\r\n this.element.removeEventListener(\r\n 'touchmove',\r\n this.onTouchMove,\r\n listenerOptions\r\n )\r\n this.element.removeEventListener(\r\n 'touchend',\r\n this.onTouchEnd,\r\n listenerOptions\r\n )\r\n }\r\n\r\n /**\r\n * Event handler for 'touchstart' event\r\n *\r\n * @param event Touch event\r\n */\r\n onTouchStart = (event: TouchEvent) => {\r\n // @ts-expect-error - event.targetTouches is not defined\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: TouchEvent) => {\r\n // @ts-expect-error - event.targetTouches is not defined\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.options.touchMultiplier\r\n const deltaY = -(clientY - this.touchStart.y) * this.options.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: TouchEvent) => {\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: WheelEvent) => {\r\n let { deltaX, deltaY, deltaMode } = event\r\n\r\n const multiplierX =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.width : 1\r\n const multiplierY =\r\n deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.height : 1\r\n\r\n deltaX *= multiplierX\r\n deltaY *= multiplierY\r\n\r\n deltaX *= this.options.wheelMultiplier\r\n deltaY *= this.options.wheelMultiplier\r\n\r\n this.emitter.emit('scroll', { deltaX, deltaY, event })\r\n }\r\n\r\n onWindowResize = () => {\r\n this.window = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\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 type {\r\n LenisEvent,\r\n LenisOptions,\r\n ScrollCallback,\r\n Scrolling,\r\n ScrollToOptions,\r\n UserData,\r\n VirtualScrollCallback,\r\n VirtualScrollData,\r\n} from './types'\r\nimport { VirtualScroll } from './virtual-scroll'\r\n\r\n// Types\r\nexport * from './types'\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 OptionalPick = Omit & Partial>\r\n\r\nexport default class Lenis {\r\n private _isScrolling: Scrolling = false // true when scroll is animating\r\n private _isStopped = false // true if user should not be able to scroll - enable/disable programmatically\r\n private _isLocked = false // same as isStopped but enabled/disabled when scroll reaches target\r\n private _preventNextNativeScrollEvent = false\r\n private _resetVelocityTimeout: number | null = null\r\n\r\n /**\r\n * Whether or not the user is touching the screen\r\n */\r\n isTouching?: boolean\r\n /**\r\n * The time in ms since the lenis instance was created\r\n */\r\n time = 0\r\n /**\r\n * User data that will be forwarded through the scroll event\r\n *\r\n * @example\r\n * lenis.scrollTo(100, {\r\n * userData: {\r\n * foo: 'bar'\r\n * }\r\n * })\r\n */\r\n userData: UserData = {}\r\n /**\r\n * The last velocity of the scroll\r\n */\r\n lastVelocity = 0\r\n /**\r\n * The current velocity of the scroll\r\n */\r\n velocity = 0\r\n /**\r\n * The direction of the scroll\r\n */\r\n direction: 1 | -1 | 0 = 0\r\n /**\r\n * The options passed to the lenis instance\r\n */\r\n options: OptionalPick<\r\n Required,\r\n 'duration' | 'prevent' | 'virtualScroll'\r\n >\r\n /**\r\n * The target scroll value\r\n */\r\n targetScroll: number\r\n /**\r\n * The animated scroll value\r\n */\r\n animatedScroll: number\r\n\r\n // These are instanciated here as they don't need information from the options\r\n private readonly animate = new Animate()\r\n private readonly emitter = new Emitter()\r\n // These are instanciated in the constructor as they need information from the options\r\n readonly dimensions: Dimensions // This is not private because it's used in the Snap class\r\n private readonly virtualScroll: VirtualScroll\r\n\r\n constructor({\r\n wrapper = window,\r\n content = document.documentElement,\r\n eventsTarget = wrapper,\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,\r\n virtualScroll,\r\n __experimental__naiveDimensions = false,\r\n }: LenisOptions = {}) {\r\n // Set version\r\n window.lenisVersion = version\r\n\r\n // Check 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 // Setup options\r\n this.options = {\r\n wrapper,\r\n content,\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 virtualScroll,\r\n __experimental__naiveDimensions,\r\n }\r\n\r\n // Setup dimensions instance\r\n this.dimensions = new Dimensions(wrapper, content, { autoResize })\r\n\r\n // Setup class name\r\n this.updateClassName()\r\n\r\n // Set the initial scroll value for all scroll information\r\n this.targetScroll = this.animatedScroll = this.actualScroll\r\n\r\n // Add event listeners\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 as EventListener,\r\n false\r\n )\r\n\r\n // Setup virtual scroll instance\r\n this.virtualScroll = new VirtualScroll(eventsTarget as HTMLElement, {\r\n touchMultiplier,\r\n wheelMultiplier,\r\n })\r\n this.virtualScroll.on('scroll', this.onVirtualScroll)\r\n }\r\n\r\n /**\r\n * Destroy the lenis instance, remove all event listeners and clean up the class name\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 as EventListener,\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\r\n /**\r\n * Add an event listener for the given event and callback\r\n *\r\n * @param event Event name\r\n * @param callback Callback function\r\n * @returns Unsubscribe function\r\n */\r\n on(event: 'scroll', callback: ScrollCallback): () => void\r\n on(event: 'virtual-scroll', callback: VirtualScrollCallback): () => void\r\n on(event: LenisEvent, callback: any) {\r\n return this.emitter.on(event, callback)\r\n }\r\n\r\n /**\r\n * Remove an event listener for the given event and callback\r\n *\r\n * @param event Event name\r\n * @param callback Callback function\r\n */\r\n off(event: 'scroll', callback: ScrollCallback): void\r\n off(event: 'virtual-scroll', callback: VirtualScrollCallback): void\r\n off(event: LenisEvent, callback: any) {\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 | MouseEvent) => {\r\n if (event.button === 1) {\r\n this.reset()\r\n }\r\n }\r\n\r\n private onVirtualScroll = (data: VirtualScrollData) => {\r\n if (\r\n typeof this.options.virtualScroll === 'function' &&\r\n this.options.virtualScroll(data) === false\r\n )\r\n return\r\n\r\n const { deltaX, deltaY, event } = data\r\n\r\n this.emitter.emit('virtual-scroll', { deltaX, deltaY, event })\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 HTMLElement &&\r\n ((typeof prevent === 'function' && prevent?.(node)) ||\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 /**\r\n * Force lenis to recalculate the dimensions\r\n */\r\n resize() {\r\n this.dimensions.resize()\r\n this.animatedScroll = this.targetScroll = this.actualScroll\r\n this.emit()\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 if (this._resetVelocityTimeout !== null) {\r\n clearTimeout(this._resetVelocityTimeout)\r\n this._resetVelocityTimeout = null\r\n }\r\n\r\n if (this._preventNextNativeScrollEvent) {\r\n this._preventNextNativeScrollEvent = false\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.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 }\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 /**\r\n * Start lenis scroll after it has been stopped\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 /**\r\n * Stop lenis scroll\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 /**\r\n * RequestAnimationFrame for lenis\r\n *\r\n * @param time The time in ms from an external clock like `requestAnimationFrame` or Tempus\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 /**\r\n * Scroll to a target value\r\n *\r\n * @param target The target value to scroll to\r\n * @param options The options for the scroll\r\n *\r\n * @example\r\n * lenis.scrollTo(100, {\r\n * offset: 100,\r\n * duration: 1,\r\n * easing: (t) => 1 - Math.cos((t * Math.PI) / 2),\r\n * lerp: 0.1,\r\n * onStart: () => {\r\n * console.log('onStart')\r\n * },\r\n * onComplete: () => {\r\n * console.log('onComplete')\r\n * },\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 }: ScrollToOptions = {}\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) {\r\n onStart?.(this)\r\n onComplete?.(this)\r\n return\r\n }\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 // 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 this._preventNextNativeScrollEvent = false\r\n })\r\n }\r\n\r\n /**\r\n * The root element on which lenis is instanced\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 /**\r\n * The limit which is the maximum scroll value\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 /**\r\n * Whether or not the scroll is horizontal\r\n */\r\n get isHorizontal() {\r\n return this.options.orientation === 'horizontal'\r\n }\r\n\r\n /**\r\n * The actual scroll value\r\n */\r\n get actualScroll() {\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 /**\r\n * The current scroll value\r\n */\r\n get scroll() {\r\n return this.options.infinite\r\n ? modulo(this.animatedScroll, this.limit)\r\n : this.animatedScroll\r\n }\r\n\r\n /**\r\n * The progress of the scroll relative to the limit\r\n */\r\n get progress() {\r\n // avoid progress to be NaN\r\n return this.limit === 0 ? 1 : this.scroll / this.limit\r\n }\r\n\r\n /**\r\n * Current scroll state\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 /**\r\n * Check if lenis is stopped\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 /**\r\n * Check if lenis is locked\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 /**\r\n * Check if lenis is smooth scrolling\r\n */\r\n get isSmooth() {\r\n return this.isScrolling === 'smooth'\r\n }\r\n\r\n /**\r\n * The class name applied to the wrapper element\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 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","constructor","this","isRunning","value","from","to","currentTime","advance","deltaTime","completed","duration","easing","linearProgress","easedProgress","lerp","damp","x","y","lambda","t","exp","round","stop","_a","onUpdate","call","fromTo","onStart","Dimensions","wrapper","content","autoResize","debounce","debounceValue","width","height","scrollHeight","scrollWidth","resize","onWrapperResize","onContentResize","Window","window","innerWidth","innerHeight","clientWidth","clientHeight","debouncedResize","callback","delay","timer","args","context","clearTimeout","setTimeout","undefined","apply","addEventListener","wrapperResizeObserver","ResizeObserver","observe","contentResizeObserver","destroy","disconnect","_b","removeEventListener","limit","Emitter","events","emit","event","callbacks","i","length","on","cb","push","filter","off","LINE_HEIGHT","listenerOptions","passive","VirtualScroll","element","options","wheelMultiplier","touchMultiplier","touchStart","lastDelta","emitter","onTouchStart","clientX","clientY","targetTouches","deltaX","deltaY","onTouchMove","onTouchEnd","onWheel","deltaMode","onWindowResize","Lenis","document","documentElement","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","pow","infinite","orientation","gestureOrientation","prevent","virtualScroll","__experimental__naiveDimensions","_isScrolling","_isStopped","_isLocked","_preventNextNativeScrollEvent","_resetVelocityTimeout","time","userData","lastVelocity","velocity","direction","animate","onPointerDown","button","reset","onVirtualScroll","data","ctrlKey","isTouch","type","includes","isWheel","isTouching","isStopped","isLocked","isClick","isUnknownGesture","composedPath","slice","indexOf","rootElement","find","node","HTMLElement","hasAttribute","_c","classList","_d","contains","_e","preventDefault","isScrolling","delta","abs","hasTouchInertia","scrollTo","targetScroll","Object","assign","programmatic","onNativeScroll","lastScroll","animatedScroll","actualScroll","sign","lenisVersion","body","dimensions","updateClassName","cleanUpClassName","setScroll","scroll","isHorizontal","scrollLeft","scrollTop","start","raf","target","offset","immediate","lock","onComplete","force","querySelector","nodeType","wrapperRect","getBoundingClientRect","left","top","rect","preventNextNativeScrollEvent","requestAnimationFrame","modulo","n","d","progress","isSmooth","className","trim","replace"],"mappings":"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"}