lenis 1.1.14-dev.1 → 1.1.14-dev.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -16
- package/dist/lenis.d.ts +1 -1
- package/dist/lenis.js +9 -6
- package/dist/lenis.js.map +1 -1
- package/dist/lenis.min.js +1 -1
- package/dist/lenis.min.js.map +1 -1
- package/dist/lenis.mjs +9 -6
- package/dist/lenis.mjs.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -158,7 +158,7 @@ See documentation for [lenis/react](https://github.com/darkroomengineering/lenis
|
|
|
158
158
|
| `gestureOrientation` | `string` | `vertical` | The orientation of the gestures. Can be `vertical`, `horizontal` or `both` |
|
|
159
159
|
| `syncTouch` | `boolean` | `false` | Mimic touch device scroll while allowing scroll sync (can be unstable on iOS<16) |
|
|
160
160
|
| `syncTouchLerp` | `number` | `0.075` | Lerp applied during `syncTouch` inertia |
|
|
161
|
-
| `touchInertiaMultiplier` | `number` | `35` | Manage the strength of syncTouch inertia
|
|
161
|
+
| `touchInertiaMultiplier` | `number` | `35` | Manage the strength of syncTouch inertia |
|
|
162
162
|
| `wheelMultiplier` | `number` | `1` | The multiplier to use for mouse wheel events |
|
|
163
163
|
| `touchMultiplier` | `number` | `1` | The multiplier to use for touch events |
|
|
164
164
|
| `infinite` | `boolean` | `false` | Enable infinite scrolling! `syncTouch: true` is required on touch devices. ([See example](https://codepen.io/ClementRoche/pen/OJqBLod)) |
|
|
@@ -297,27 +297,17 @@ prevent touch events only
|
|
|
297
297
|
|
|
298
298
|
- [r3f-scroll-rig](https://github.com/14islands/r3f-scroll-rig) by [14islands](https://14islands.com/)
|
|
299
299
|
- [locomotive-scroll](https://github.com/locomotivemtl/locomotive-scroll) by [Locomotive](https://locomotive.ca/)
|
|
300
|
-
- [vue-lenis](https://github.com/zeokku/vue-lenis) by [ZEOKKU](https://zeokku.com/)
|
|
301
|
-
- [nuxt-lenis](https://www.npmjs.com/package/nuxt-lenis) by [Milkshake Studio](https://milkshake.studio/)
|
|
302
300
|
|
|
303
301
|
<br>
|
|
304
302
|
|
|
305
303
|
## Lenis in use
|
|
306
304
|
|
|
307
|
-
- [Lunchbox](https://lunchbox.io/) by [Studio Freight](https://www.studiofreight.com/)
|
|
308
|
-
- [Easol](https://easol.com/) by [Studio Freight](https://www.studiofreight.com/)
|
|
309
|
-
- [Dragonfly](https://dragonfly.xyz/) by [Studio Freight](https://www.studiofreight.com/)
|
|
310
|
-
- [Yuga Labs](https://yuga.com/) by [Antinomy Studio](https://antinomy.studio/)
|
|
311
|
-
- [Quentin Hocde's Portfolio](https://quentinhocde.com) by [Quentin Hocde](https://twitter.com/QuentinHocde)
|
|
312
|
-
- [Houses Of](https://housesof.world) by [Félix P.](https://flayks.com/) & [Shelby Kay](https://shelbykay.dev/)
|
|
313
|
-
- [Shelby Kay's Portfolio](https://shelbykay.dev) by [Shelby Kay](https://shelbykay.dev/)
|
|
314
|
-
- [Heights Agency Portfolio](https://www.heights.agency/) by [Francesco Michelini](https://www.francescomichelini.com/)
|
|
315
|
-
- [Goodship](https://goodship.io) by [Studio Freight](https://www.studiofreight.com/)
|
|
316
|
-
- [Flayks' Portfolio](https://flayks.com) by [Félix P.](https://flayks.com/) & [Shelby Kay](https://shelbykay.dev/)
|
|
317
|
-
- [Matt Rothenberg's portfolio](https://mattrothenberg.com) by [Matt Rothenberg](https://twitter.com/mattrothenberg)
|
|
318
|
-
- [Edoardo Lunardi's portfolio](https://www.edoardolunardi.dev/) by [Edoardo Lunardi](https://www.edoardolunardi.dev/)
|
|
319
305
|
- [DeSo](https://deso.com) by [Studio Freight](https://www.studiofreight.com/)
|
|
320
|
-
- [
|
|
306
|
+
- [Sculpting Harmony](https://gehry.getty.edu/) by [Resn](https://resn.co.nz/)
|
|
307
|
+
- [Superpower](https://superpower.com/)
|
|
308
|
+
- [Daylight Computer](https://daylightcomputer.com/) by [Basement Studio](https://basement.studio/)
|
|
309
|
+
- [Lifeworld by Olafur Eliasson](https://lifeworld.wetransfer.com/) by Nicolas Garnier, Simon Riisnæs Dagfinrud, Lumír Španihel, Everton Guilherme, Diana Alcausin, Cristiana Sousa
|
|
310
|
+
|
|
321
311
|
|
|
322
312
|
<br/>
|
|
323
313
|
|
package/dist/lenis.d.ts
CHANGED
|
@@ -214,7 +214,7 @@ type LenisOptions = {
|
|
|
214
214
|
virtualScroll?: (data: VirtualScrollData) => boolean;
|
|
215
215
|
/**
|
|
216
216
|
* Wether or not to enable overscroll on a nested lenis instance, similar to CSS overscroll-behavior (https://developer.mozilla.org/en-US/docs/Web/CSS/overscroll-behavior)
|
|
217
|
-
* @default
|
|
217
|
+
* @default true
|
|
218
218
|
*/
|
|
219
219
|
overscroll?: boolean;
|
|
220
220
|
/**
|
package/dist/lenis.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// package.json
|
|
2
|
-
var version = "1.1.14-dev.
|
|
2
|
+
var version = "1.1.14-dev.2";
|
|
3
3
|
|
|
4
4
|
// packages/core/src/maths.ts
|
|
5
5
|
function clamp(min, input, max) {
|
|
@@ -408,7 +408,7 @@ var Lenis = class {
|
|
|
408
408
|
autoResize = true,
|
|
409
409
|
prevent,
|
|
410
410
|
virtualScroll,
|
|
411
|
-
overscroll =
|
|
411
|
+
overscroll = true,
|
|
412
412
|
__experimental__naiveDimensions = false
|
|
413
413
|
} = {}) {
|
|
414
414
|
window.lenisVersion = version;
|
|
@@ -495,6 +495,7 @@ var Lenis = class {
|
|
|
495
495
|
const { deltaX, deltaY, event } = data;
|
|
496
496
|
this.emitter.emit("virtual-scroll", { deltaX, deltaY, event });
|
|
497
497
|
if (event.ctrlKey) return;
|
|
498
|
+
if (event.lenisStopPropagation) return;
|
|
498
499
|
const isTouch = event.type.includes("touch");
|
|
499
500
|
const isWheel = event.type.includes("wheel");
|
|
500
501
|
this.isTouching = event.type === "touchstart" || event.type === "touchmove";
|
|
@@ -512,8 +513,7 @@ var Lenis = class {
|
|
|
512
513
|
composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement));
|
|
513
514
|
const prevent = this.options.prevent;
|
|
514
515
|
if (!!composedPath.find(
|
|
515
|
-
(node) => node instanceof HTMLElement && (typeof prevent === "function" && prevent?.(node) || node.hasAttribute?.("data-lenis-prevent") || isTouch && node.hasAttribute?.("data-lenis-prevent-touch") || isWheel && node.hasAttribute?.("data-lenis-prevent-wheel")
|
|
516
|
-
// nested lenis instance
|
|
516
|
+
(node) => node instanceof HTMLElement && (typeof prevent === "function" && prevent?.(node) || node.hasAttribute?.("data-lenis-prevent") || isTouch && node.hasAttribute?.("data-lenis-prevent-touch") || isWheel && node.hasAttribute?.("data-lenis-prevent-wheel"))
|
|
517
517
|
))
|
|
518
518
|
return;
|
|
519
519
|
if (this.isStopped || this.isLocked) {
|
|
@@ -524,15 +524,19 @@ var Lenis = class {
|
|
|
524
524
|
if (!isSmooth) {
|
|
525
525
|
this.isScrolling = "native";
|
|
526
526
|
this.animate.stop();
|
|
527
|
+
event.lenisStopPropagation = true;
|
|
527
528
|
return;
|
|
528
529
|
}
|
|
529
|
-
event.preventDefault();
|
|
530
530
|
let delta = deltaY;
|
|
531
531
|
if (this.options.gestureOrientation === "both") {
|
|
532
532
|
delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX;
|
|
533
533
|
} else if (this.options.gestureOrientation === "horizontal") {
|
|
534
534
|
delta = deltaX;
|
|
535
535
|
}
|
|
536
|
+
if (!this.options.overscroll || this.options.infinite || this.options.wrapper !== window && (this.animatedScroll > 0 && this.animatedScroll < this.limit || this.animatedScroll === 0 && deltaY > 0 || this.animatedScroll === this.limit && deltaY < 0)) {
|
|
537
|
+
event.lenisStopPropagation = true;
|
|
538
|
+
}
|
|
539
|
+
event.preventDefault();
|
|
536
540
|
const syncTouch = isTouch && this.options.syncTouch;
|
|
537
541
|
const isTouchEnd = isTouch && event.type === "touchend";
|
|
538
542
|
const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5;
|
|
@@ -840,7 +844,6 @@ var Lenis = class {
|
|
|
840
844
|
if (this.isLocked) className += " lenis-locked";
|
|
841
845
|
if (this.isScrolling) className += " lenis-scrolling";
|
|
842
846
|
if (this.isScrolling === "smooth") className += " lenis-smooth";
|
|
843
|
-
if (this.options.overscroll) className += " lenis-overscroll";
|
|
844
847
|
return className;
|
|
845
848
|
}
|
|
846
849
|
updateClassName() {
|
package/dist/lenis.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../packages/core/src/maths.ts","../packages/core/src/animate.ts","../packages/core/src/debounce.ts","../packages/core/src/dimensions.ts","../packages/core/src/emitter.ts","../packages/core/src/virtual-scroll.ts","../packages/core/src/lenis.ts","../packages/core/browser.ts"],"sourcesContent":["{\r\n \"name\": \"lenis\",\r\n \"version\": \"1.1.14-dev.1\",\r\n \"type\": \"module\",\r\n \"sideEffects\": false,\r\n \"author\": \"darkroom.engineering\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n },\r\n \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n \"funding\": {\r\n \"type\": \"github\",\r\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n },\r\n \"keywords\": [\r\n \"scroll\",\r\n \"smooth\",\r\n \"lenis\",\r\n \"react\",\r\n \"vue\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"pnpm build:core && pnpm build:all\",\r\n \"build:core\": \"tsup --config tsup.core.ts\",\r\n \"build:all\": \"tsup\",\r\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n \"dev:build\": \"tsup --watch\",\r\n \"dev:playground\": \"pnpm --filter playground dev\",\r\n \"readme\": \"node ./scripts/update-readme.js\",\r\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n \"postversion\": \"pnpm build && pnpm readme\",\r\n \"publish:main\": \"npm publish\",\r\n \"publish:dev\": \"npm publish --tag dev\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"dependencies\": {\r\n \"@darkroom.engineering/tempus\": \"^0.0.46\"\r\n },\r\n \"devDependencies\": {\r\n \"tsup\": \"^8.2.4\",\r\n \"typescript\": \"^5.4.5\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=17.0.0\",\r\n \"vue\": \">=3.0.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"vue\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"unpkg\": \"./dist/lenis.mjs\",\r\n \"main\": \"./dist/lenis.mjs\",\r\n \"module\": \"./dist/lenis.mjs\",\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"default\": \"./dist/lenis.mjs\"\r\n },\r\n \"./dist/*\": \"./dist/*\",\r\n \"./react\": {\r\n \"types\": \"./dist/lenis-react.d.ts\",\r\n \"default\": \"./dist/lenis-react.mjs\"\r\n },\r\n \"./snap\": {\r\n \"types\": \"./dist/lenis-snap.d.ts\",\r\n \"default\": \"./dist/lenis-snap.mjs\"\r\n },\r\n \"./vue\": {\r\n \"types\": \"./dist/lenis-vue.d.ts\",\r\n \"default\": \"./dist/lenis-vue.mjs\"\r\n }\r\n }\r\n}\r\n","/**\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","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\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","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 | Element,\r\n private content: HTMLElement | Element,\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","/**\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<CB extends (...args: any[]) => 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<CB extends (...args: any[]) => 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 type { 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// 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<T, F extends keyof T> = Omit<T, F> & Partial<Pick<T, F>>\r\n\r\nexport 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<LenisOptions>,\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 overscroll = false,\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 overscroll,\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') &&\r\n !node.classList?.contains('lenis-locked') &&\r\n (node.classList?.contains('lenis-overscroll')\r\n ? node.classList?.contains('lenis-scrolling') &&\r\n node.classList?.contains('lenis-smooth')\r\n : true))) // 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 if (this.options.overscroll) className += ' lenis-overscroll'\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","// This file serves as an entry point for the package\r\nimport { Lenis } from './src/lenis'\r\nglobalThis.Lenis = Lenis\r\n"],"mappings":"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","names":["lerp","lerp"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../packages/core/src/maths.ts","../packages/core/src/animate.ts","../packages/core/src/debounce.ts","../packages/core/src/dimensions.ts","../packages/core/src/emitter.ts","../packages/core/src/virtual-scroll.ts","../packages/core/src/lenis.ts","../packages/core/browser.ts"],"sourcesContent":["{\r\n \"name\": \"lenis\",\r\n \"version\": \"1.1.14-dev.2\",\r\n \"type\": \"module\",\r\n \"sideEffects\": false,\r\n \"author\": \"darkroom.engineering\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n },\r\n \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n \"funding\": {\r\n \"type\": \"github\",\r\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n },\r\n \"keywords\": [\r\n \"scroll\",\r\n \"smooth\",\r\n \"lenis\",\r\n \"react\",\r\n \"vue\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"pnpm build:core && pnpm build:all\",\r\n \"build:core\": \"tsup --config tsup.core.ts\",\r\n \"build:all\": \"tsup\",\r\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n \"dev:build\": \"tsup --watch\",\r\n \"dev:playground\": \"pnpm --filter playground dev\",\r\n \"readme\": \"node ./scripts/update-readme.js\",\r\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n \"postversion\": \"pnpm build && pnpm readme\",\r\n \"publish:main\": \"npm publish\",\r\n \"publish:dev\": \"npm publish --tag dev\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"dependencies\": {\r\n \"@darkroom.engineering/tempus\": \"^0.0.46\"\r\n },\r\n \"devDependencies\": {\r\n \"tsup\": \"^8.2.4\",\r\n \"typescript\": \"^5.4.5\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=17.0.0\",\r\n \"vue\": \">=3.0.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"vue\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"unpkg\": \"./dist/lenis.mjs\",\r\n \"main\": \"./dist/lenis.mjs\",\r\n \"module\": \"./dist/lenis.mjs\",\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"default\": \"./dist/lenis.mjs\"\r\n },\r\n \"./dist/*\": \"./dist/*\",\r\n \"./react\": {\r\n \"types\": \"./dist/lenis-react.d.ts\",\r\n \"default\": \"./dist/lenis-react.mjs\"\r\n },\r\n \"./snap\": {\r\n \"types\": \"./dist/lenis-snap.d.ts\",\r\n \"default\": \"./dist/lenis-snap.mjs\"\r\n },\r\n \"./vue\": {\r\n \"types\": \"./dist/lenis-vue.d.ts\",\r\n \"default\": \"./dist/lenis-vue.mjs\"\r\n }\r\n }\r\n}\r\n","/**\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","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\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","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 | Element,\r\n private content: HTMLElement | Element,\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","/**\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<CB extends (...args: any[]) => 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<CB extends (...args: any[]) => 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 type { 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// 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<T, F extends keyof T> = Omit<T, F> & Partial<Pick<T, F>>\r\n\r\nexport 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<LenisOptions>,\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 overscroll = true,\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 overscroll,\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 // @ts-ignore\r\n if (event.lenisStopPropagation) 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 )\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 // @ts-ignore\r\n event.lenisStopPropagation = true\r\n return\r\n }\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 if (\r\n !this.options.overscroll ||\r\n this.options.infinite ||\r\n (this.options.wrapper !== window &&\r\n ((this.animatedScroll > 0 && this.animatedScroll < this.limit) ||\r\n (this.animatedScroll === 0 && deltaY > 0) ||\r\n (this.animatedScroll === this.limit && deltaY < 0)))\r\n ) {\r\n // @ts-ignore\r\n event.lenisStopPropagation = true\r\n // event.stopPropagation()\r\n }\r\n\r\n event.preventDefault()\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","// This file serves as an entry point for the package\r\nimport { Lenis } from './src/lenis'\r\nglobalThis.Lenis = Lenis\r\n"],"mappings":";AAEE,cAAW;;;ACMN,SAAS,MAAM,KAAa,OAAe,KAAa;AAC7D,SAAO,KAAK,IAAI,KAAK,KAAK,IAAI,OAAO,GAAG,CAAC;AAC3C;AAqBO,SAAS,KAAK,GAAW,GAAW,GAAW;AACpD,UAAQ,IAAI,KAAK,IAAI,IAAI;AAC3B;AAYO,SAAS,KAAK,GAAW,GAAW,QAAgB,WAAmB;AAC5E,SAAO,KAAK,GAAG,GAAG,IAAI,KAAK,IAAI,CAAC,SAAS,SAAS,CAAC;AACrD;AAUO,SAAS,OAAO,GAAW,GAAW;AAC3C,UAAS,IAAI,IAAK,KAAK;AACzB;;;AChDO,IAAM,UAAN,MAAc;AAAA,EACnB,YAAY;AAAA,EACZ,QAAQ;AAAA,EACR,OAAO;AAAA,EACP,KAAK;AAAA,EACL,cAAc;AAAA;AAAA,EAGd;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,QAAQ,WAAmB;AACzB,QAAI,CAAC,KAAK,UAAW;AAErB,QAAI,YAAY;AAEhB,QAAI,KAAK,YAAY,KAAK,QAAQ;AAChC,WAAK,eAAe;AACpB,YAAM,iBAAiB,MAAM,GAAG,KAAK,cAAc,KAAK,UAAU,CAAC;AAEnE,kBAAY,kBAAkB;AAC9B,YAAM,gBAAgB,YAAY,IAAI,KAAK,OAAO,cAAc;AAChE,WAAK,QAAQ,KAAK,QAAQ,KAAK,KAAK,KAAK,QAAQ;AAAA,IACnD,WAAW,KAAK,MAAM;AACpB,WAAK,QAAQ,KAAK,KAAK,OAAO,KAAK,IAAI,KAAK,OAAO,IAAI,SAAS;AAChE,UAAI,KAAK,MAAM,KAAK,KAAK,MAAM,KAAK,IAAI;AACtC,aAAK,QAAQ,KAAK;AAClB,oBAAY;AAAA,MACd;AAAA,IACF,OAAO;AAEL,WAAK,QAAQ,KAAK;AAClB,kBAAY;AAAA,IACd;AAEA,QAAI,WAAW;AACb,WAAK,KAAK;AAAA,IACZ;AAGA,SAAK,WAAW,KAAK,OAAO,SAAS;AAAA,EACvC;AAAA;AAAA,EAGA,OAAO;AACL,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAUA,OACE,MACA,IACA,EAAE,MAAAA,OAAM,UAAU,QAAQ,SAAS,SAAS,GAC5C;AACA,SAAK,OAAO,KAAK,QAAQ;AACzB,SAAK,KAAK;AACV,SAAK,OAAOA;AACZ,SAAK,WAAW;AAChB,SAAK,SAAS;AACd,SAAK,cAAc;AACnB,SAAK,YAAY;AAEjB,cAAU;AACV,SAAK,WAAW;AAAA,EAClB;AACF;;;AC1FO,SAAS,SACd,UACA,OACA;AACA,MAAI;AACJ,SAAO,YAAyB,MAAmC;AACjE,QAAI,UAAU;AACd,iBAAa,KAAK;AAClB,YAAQ,WAAW,MAAM;AACvB,cAAQ;AACR,eAAS,MAAM,SAAS,IAAI;AAAA,IAC9B,GAAG,KAAK;AAAA,EACV;AACF;;;ACFO,IAAM,aAAN,MAAiB;AAAA,EAWtB,YACU,SACA,SACR,EAAE,aAAa,MAAM,UAAU,gBAAgB,IAAI,IAAI,CAAC,GACxD;AAHQ;AACA;AAGR,QAAI,YAAY;AACd,WAAK,kBAAkB,SAAS,KAAK,QAAQ,aAAa;AAE1D,UAAI,KAAK,mBAAmB,QAAQ;AAClC,eAAO,iBAAiB,UAAU,KAAK,iBAAiB,KAAK;AAAA,MAC/D,OAAO;AACL,aAAK,wBAAwB,IAAI,eAAe,KAAK,eAAe;AACpE,aAAK,sBAAsB,QAAQ,KAAK,OAAO;AAAA,MACjD;AAEA,WAAK,wBAAwB,IAAI,eAAe,KAAK,eAAe;AACpE,WAAK,sBAAsB,QAAQ,KAAK,OAAO;AAAA,IACjD;AAEA,SAAK,OAAO;AAAA,EACd;AAAA,EA9BA,QAAQ;AAAA,EACR,SAAS;AAAA,EACT,eAAe;AAAA,EACf,cAAc;AAAA;AAAA,EAGN;AAAA,EACA;AAAA,EACA;AAAA,EAwBR,UAAU;AACR,SAAK,uBAAuB,WAAW;AACvC,SAAK,uBAAuB,WAAW;AAEvC,QAAI,KAAK,YAAY,UAAU,KAAK,iBAAiB;AACnD,aAAO,oBAAoB,UAAU,KAAK,iBAAiB,KAAK;AAAA,IAClE;AAAA,EACF;AAAA,EAEA,SAAS,MAAM;AACb,SAAK,gBAAgB;AACrB,SAAK,gBAAgB;AAAA,EACvB;AAAA,EAEA,kBAAkB,MAAM;AACtB,QAAI,KAAK,mBAAmB,QAAQ;AAClC,WAAK,QAAQ,OAAO;AACpB,WAAK,SAAS,OAAO;AAAA,IACvB,OAAO;AACL,WAAK,QAAQ,KAAK,QAAQ;AAC1B,WAAK,SAAS,KAAK,QAAQ;AAAA,IAC7B;AAAA,EACF;AAAA,EAEA,kBAAkB,MAAM;AACtB,QAAI,KAAK,mBAAmB,QAAQ;AAClC,WAAK,eAAe,KAAK,QAAQ;AACjC,WAAK,cAAc,KAAK,QAAQ;AAAA,IAClC,OAAO;AACL,WAAK,eAAe,KAAK,QAAQ;AACjC,WAAK,cAAc,KAAK,QAAQ;AAAA,IAClC;AAAA,EACF;AAAA,EAEA,IAAI,QAAQ;AACV,WAAO;AAAA,MACL,GAAG,KAAK,cAAc,KAAK;AAAA,MAC3B,GAAG,KAAK,eAAe,KAAK;AAAA,IAC9B;AAAA,EACF;AACF;;;AC3EO,IAAM,UAAN,MAAc;AAAA,EACX,SAGJ,CAAC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOL,KAAK,UAAkB,MAAiB;AACtC,QAAI,YAAY,KAAK,OAAO,KAAK,KAAK,CAAC;AACvC,aAAS,IAAI,GAAG,SAAS,UAAU,QAAQ,IAAI,QAAQ,KAAK;AAC1D,gBAAU,CAAC,IAAI,GAAG,IAAI;AAAA,IACxB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,GAAwC,OAAe,IAAQ;AAE7D,SAAK,OAAO,KAAK,GAAG,KAAK,EAAE,MAAM,KAAK,OAAO,KAAK,IAAI,CAAC,EAAE;AAGzD,WAAO,MAAM;AACX,WAAK,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,GAAG,OAAO,CAAC,MAAM,OAAO,CAAC;AAAA,IACjE;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAyC,OAAe,UAAc;AACpE,SAAK,OAAO,KAAK,IAAI,KAAK,OAAO,KAAK,GAAG,OAAO,CAAC,MAAM,aAAa,CAAC;AAAA,EACvE;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,SAAS,CAAC;AAAA,EACjB;AACF;;;ACvDA,IAAM,cAAc,MAAM;AAC1B,IAAM,kBAA2C,EAAE,SAAS,MAAM;AAE3D,IAAM,gBAAN,MAAoB;AAAA,EAezB,YACU,SACA,UAAU,EAAE,iBAAiB,GAAG,iBAAiB,EAAE,GAC3D;AAFQ;AACA;AAER,WAAO,iBAAiB,UAAU,KAAK,gBAAgB,KAAK;AAC5D,SAAK,eAAe;AAEpB,SAAK,QAAQ,iBAAiB,SAAS,KAAK,SAAS,eAAe;AACpE,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,SAAK,QAAQ,iBAAiB,YAAY,KAAK,YAAY,eAAe;AAAA,EAC5E;AAAA,EAjCA,aAAa;AAAA,IACX,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,YAAY;AAAA,IACV,GAAG;AAAA,IACH,GAAG;AAAA,EACL;AAAA,EACA,SAAS;AAAA,IACP,OAAO;AAAA,IACP,QAAQ;AAAA,EACV;AAAA,EACQ,UAAU,IAAI,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EA6B9B,GAAG,OAAe,UAAiC;AACjD,WAAO,KAAK,QAAQ,GAAG,OAAO,QAAQ;AAAA,EACxC;AAAA;AAAA,EAGA,UAAU;AACR,SAAK,QAAQ,QAAQ;AAErB,WAAO,oBAAoB,UAAU,KAAK,gBAAgB,KAAK;AAE/D,SAAK,QAAQ,oBAAoB,SAAS,KAAK,SAAS,eAAe;AACvE,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,SAAK,QAAQ;AAAA,MACX;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAAA,EACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,eAAe,CAAC,UAAsB;AAEpC,UAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,gBAC/B,MAAM,cAAc,CAAC,IACrB;AAEJ,SAAK,WAAW,IAAI;AACpB,SAAK,WAAW,IAAI;AAEpB,SAAK,YAAY;AAAA,MACf,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SAAK,QAAQ,KAAK,UAAU;AAAA,MAC1B,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,cAAc,CAAC,UAAsB;AAEnC,UAAM,EAAE,SAAS,QAAQ,IAAI,MAAM,gBAC/B,MAAM,cAAc,CAAC,IACrB;AAEJ,UAAM,SAAS,EAAE,UAAU,KAAK,WAAW,KAAK,KAAK,QAAQ;AAC7D,UAAM,SAAS,EAAE,UAAU,KAAK,WAAW,KAAK,KAAK,QAAQ;AAE7D,SAAK,WAAW,IAAI;AACpB,SAAK,WAAW,IAAI;AAEpB,SAAK,YAAY;AAAA,MACf,GAAG;AAAA,MACH,GAAG;AAAA,IACL;AAEA,SAAK,QAAQ,KAAK,UAAU;AAAA,MAC1B;AAAA,MACA;AAAA,MACA;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,aAAa,CAAC,UAAsB;AAClC,SAAK,QAAQ,KAAK,UAAU;AAAA,MAC1B,QAAQ,KAAK,UAAU;AAAA,MACvB,QAAQ,KAAK,UAAU;AAAA,MACvB;AAAA,IACF,CAAC;AAAA,EACH;AAAA;AAAA,EAGA,UAAU,CAAC,UAAsB;AAC/B,QAAI,EAAE,QAAQ,QAAQ,UAAU,IAAI;AAEpC,UAAM,cACJ,cAAc,IAAI,cAAc,cAAc,IAAI,KAAK,OAAO,QAAQ;AACxE,UAAM,cACJ,cAAc,IAAI,cAAc,cAAc,IAAI,KAAK,OAAO,SAAS;AAEzE,cAAU;AACV,cAAU;AAEV,cAAU,KAAK,QAAQ;AACvB,cAAU,KAAK,QAAQ;AAEvB,SAAK,QAAQ,KAAK,UAAU,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAAA,EACvD;AAAA,EAEA,iBAAiB,MAAM;AACrB,SAAK,SAAS;AAAA,MACZ,OAAO,OAAO;AAAA,MACd,QAAQ,OAAO;AAAA,IACjB;AAAA,EACF;AACF;;;ACpIO,IAAM,QAAN,MAAY;AAAA,EACT,eAA0B;AAAA;AAAA,EAC1B,aAAa;AAAA;AAAA,EACb,YAAY;AAAA;AAAA,EACZ,gCAAgC;AAAA,EAChC,wBAAuC;AAAA;AAAA;AAAA;AAAA,EAK/C;AAAA;AAAA;AAAA;AAAA,EAIA,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAWP,WAAqB,CAAC;AAAA;AAAA;AAAA;AAAA,EAItB,eAAe;AAAA;AAAA;AAAA;AAAA,EAIf,WAAW;AAAA;AAAA;AAAA;AAAA,EAIX,YAAwB;AAAA;AAAA;AAAA;AAAA,EAIxB;AAAA;AAAA;AAAA;AAAA,EAOA;AAAA;AAAA;AAAA;AAAA,EAIA;AAAA;AAAA,EAGiB,UAAU,IAAI,QAAQ;AAAA,EACtB,UAAU,IAAI,QAAQ;AAAA;AAAA,EAE9B;AAAA;AAAA,EACQ;AAAA,EAEjB,YAAY;AAAA,IACV,UAAU;AAAA,IACV,UAAU,SAAS;AAAA,IACnB,eAAe;AAAA,IACf,cAAc;AAAA,IACd,YAAY;AAAA,IACZ,gBAAgB;AAAA,IAChB,yBAAyB;AAAA,IACzB;AAAA;AAAA,IACA,SAAS,CAAC,MAAM,KAAK,IAAI,GAAG,QAAQ,KAAK,IAAI,GAAG,MAAM,CAAC,CAAC;AAAA,IACxD,MAAAC,QAAO;AAAA,IACP,WAAW;AAAA,IACX,cAAc;AAAA;AAAA,IACd,qBAAqB;AAAA;AAAA,IACrB,kBAAkB;AAAA,IAClB,kBAAkB;AAAA,IAClB,aAAa;AAAA,IACb;AAAA,IACA;AAAA,IACA,aAAa;AAAA,IACb,kCAAkC;AAAA,EACpC,IAAkB,CAAC,GAAG;AAEpB,WAAO,eAAe;AAGtB,QACE,CAAC,WACD,YAAY,SAAS,mBACrB,YAAY,SAAS,MACrB;AACA,gBAAU;AAAA,IACZ;AAGA,SAAK,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,MAAAA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF;AAGA,SAAK,aAAa,IAAI,WAAW,SAAS,SAAS,EAAE,WAAW,CAAC;AAGjE,SAAK,gBAAgB;AAGrB,SAAK,eAAe,KAAK,iBAAiB,KAAK;AAG/C,SAAK,QAAQ,QAAQ,iBAAiB,UAAU,KAAK,gBAAgB,KAAK;AAE1E,SAAK,QAAQ,QAAQ;AAAA,MACnB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAGA,SAAK,gBAAgB,IAAI,cAAc,cAA6B;AAAA,MAClE;AAAA,MACA;AAAA,IACF,CAAC;AACD,SAAK,cAAc,GAAG,UAAU,KAAK,eAAe;AAAA,EACtD;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,QAAQ,QAAQ;AAErB,SAAK,QAAQ,QAAQ;AAAA,MACnB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AACA,SAAK,QAAQ,QAAQ;AAAA,MACnB;AAAA,MACA,KAAK;AAAA,MACL;AAAA,IACF;AAEA,SAAK,cAAc,QAAQ;AAC3B,SAAK,WAAW,QAAQ;AAExB,SAAK,iBAAiB;AAAA,EACxB;AAAA,EAWA,GAAG,OAAmB,UAAe;AACnC,WAAO,KAAK,QAAQ,GAAG,OAAO,QAAQ;AAAA,EACxC;AAAA,EAUA,IAAI,OAAmB,UAAe;AACpC,WAAO,KAAK,QAAQ,IAAI,OAAO,QAAQ;AAAA,EACzC;AAAA,EAEQ,UAAU,QAAgB;AAEhC,QAAI,KAAK,cAAc;AACrB,WAAK,YAAY,aAAa;AAAA,IAChC,OAAO;AACL,WAAK,YAAY,YAAY;AAAA,IAC/B;AAAA,EACF;AAAA,EAEQ,gBAAgB,CAAC,UAAqC;AAC5D,QAAI,MAAM,WAAW,GAAG;AACtB,WAAK,MAAM;AAAA,IACb;AAAA,EACF;AAAA,EAEQ,kBAAkB,CAAC,SAA4B;AACrD,QACE,OAAO,KAAK,QAAQ,kBAAkB,cACtC,KAAK,QAAQ,cAAc,IAAI,MAAM;AAErC;AAEF,UAAM,EAAE,QAAQ,QAAQ,MAAM,IAAI;AAElC,SAAK,QAAQ,KAAK,kBAAkB,EAAE,QAAQ,QAAQ,MAAM,CAAC;AAG7D,QAAI,MAAM,QAAS;AAEnB,QAAI,MAAM,qBAAsB;AAEhC,UAAM,UAAU,MAAM,KAAK,SAAS,OAAO;AAC3C,UAAM,UAAU,MAAM,KAAK,SAAS,OAAO;AAE3C,SAAK,aAAa,MAAM,SAAS,gBAAgB,MAAM,SAAS;AAWhE,UAAM,cACJ,KAAK,QAAQ,aACb,WACA,MAAM,SAAS,gBACf,CAAC,KAAK,aACN,CAAC,KAAK;AAER,QAAI,aAAa;AACf,WAAK,MAAM;AACX;AAAA,IACF;AAEA,UAAM,UAAU,WAAW,KAAK,WAAW;AAQ3C,UAAM,mBACH,KAAK,QAAQ,uBAAuB,cAAc,WAAW,KAC7D,KAAK,QAAQ,uBAAuB,gBAAgB,WAAW;AAElE,QAAI,WAAW,kBAAkB;AAE/B;AAAA,IACF;AAGA,QAAI,eAAe,MAAM,aAAa;AACtC,mBAAe,aAAa,MAAM,GAAG,aAAa,QAAQ,KAAK,WAAW,CAAC;AAE3E,UAAM,UAAU,KAAK,QAAQ;AAE7B,QACE,CAAC,CAAC,aAAa;AAAA,MACb,CAAC,SACC,gBAAgB,gBACd,OAAO,YAAY,cAAc,UAAU,IAAI,KAC/C,KAAK,eAAe,oBAAoB,KACvC,WAAW,KAAK,eAAe,0BAA0B,KACzD,WAAW,KAAK,eAAe,0BAA0B;AAAA,IAChE;AAEA;AAEF,QAAI,KAAK,aAAa,KAAK,UAAU;AACnC,YAAM,eAAe;AACrB;AAAA,IACF;AAEA,UAAM,WACH,KAAK,QAAQ,aAAa,WAC1B,KAAK,QAAQ,eAAe;AAE/B,QAAI,CAAC,UAAU;AACb,WAAK,cAAc;AACnB,WAAK,QAAQ,KAAK;AAElB,YAAM,uBAAuB;AAC7B;AAAA,IACF;AAEA,QAAI,QAAQ;AACZ,QAAI,KAAK,QAAQ,uBAAuB,QAAQ;AAC9C,cAAQ,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM,IAAI,SAAS;AAAA,IACzD,WAAW,KAAK,QAAQ,uBAAuB,cAAc;AAC3D,cAAQ;AAAA,IACV;AAEA,QACE,CAAC,KAAK,QAAQ,cACd,KAAK,QAAQ,YACZ,KAAK,QAAQ,YAAY,WACtB,KAAK,iBAAiB,KAAK,KAAK,iBAAiB,KAAK,SACrD,KAAK,mBAAmB,KAAK,SAAS,KACtC,KAAK,mBAAmB,KAAK,SAAS,SAAS,IACpD;AAEA,YAAM,uBAAuB;AAAA,IAE/B;AAEA,UAAM,eAAe;AAErB,UAAM,YAAY,WAAW,KAAK,QAAQ;AAC1C,UAAM,aAAa,WAAW,MAAM,SAAS;AAE7C,UAAM,kBAAkB,cAAc,KAAK,IAAI,KAAK,IAAI;AAExD,QAAI,iBAAiB;AACnB,cAAQ,KAAK,WAAW,KAAK,QAAQ;AAAA,IACvC;AAEA,SAAK,SAAS,KAAK,eAAe,OAAO;AAAA,MACvC,cAAc;AAAA,MACd,GAAI,YACA;AAAA,QACE,MAAM,kBAAkB,KAAK,QAAQ,gBAAgB;AAAA,MACvD,IACA;AAAA,QACE,MAAM,KAAK,QAAQ;AAAA,QACnB,UAAU,KAAK,QAAQ;AAAA,QACvB,QAAQ,KAAK,QAAQ;AAAA,MACvB;AAAA,IACN,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,SAAS;AACP,SAAK,WAAW,OAAO;AACvB,SAAK,iBAAiB,KAAK,eAAe,KAAK;AAC/C,SAAK,KAAK;AAAA,EACZ;AAAA,EAEQ,OAAO;AACb,SAAK,QAAQ,KAAK,UAAU,IAAI;AAAA,EAClC;AAAA,EAEQ,iBAAiB,MAAM;AAC7B,QAAI,KAAK,0BAA0B,MAAM;AACvC,mBAAa,KAAK,qBAAqB;AACvC,WAAK,wBAAwB;AAAA,IAC/B;AAEA,QAAI,KAAK,+BAA+B;AACtC,WAAK,gCAAgC;AACrC;AAAA,IACF;AAEA,QAAI,KAAK,gBAAgB,SAAS,KAAK,gBAAgB,UAAU;AAC/D,YAAM,aAAa,KAAK;AACxB,WAAK,iBAAiB,KAAK,eAAe,KAAK;AAC/C,WAAK,eAAe,KAAK;AACzB,WAAK,WAAW,KAAK,iBAAiB;AACtC,WAAK,YAAY,KAAK;AAAA,QACpB,KAAK,iBAAiB;AAAA,MACxB;AACA,WAAK,cAAc;AACnB,WAAK,KAAK;AAEV,UAAI,KAAK,aAAa,GAAG;AACvB,aAAK,wBAAwB,WAAW,MAAM;AAC5C,eAAK,eAAe,KAAK;AACzB,eAAK,WAAW;AAChB,eAAK,cAAc;AACnB,eAAK,KAAK;AAAA,QACZ,GAAG,GAAG;AAAA,MACR;AAAA,IACF;AAAA,EACF;AAAA,EAEQ,QAAQ;AACd,SAAK,WAAW;AAChB,SAAK,cAAc;AACnB,SAAK,iBAAiB,KAAK,eAAe,KAAK;AAC/C,SAAK,eAAe,KAAK,WAAW;AACpC,SAAK,QAAQ,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,QAAI,CAAC,KAAK,UAAW;AACrB,SAAK,YAAY;AAEjB,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACL,QAAI,KAAK,UAAW;AACpB,SAAK,YAAY;AACjB,SAAK,QAAQ,KAAK;AAElB,SAAK,MAAM;AAAA,EACb;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,IAAI,MAAc;AAChB,UAAM,YAAY,QAAQ,KAAK,QAAQ;AACvC,SAAK,OAAO;AAEZ,SAAK,QAAQ,QAAQ,YAAY,IAAK;AAAA,EACxC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAsBA,SACE,QACA;AAAA,IACE,SAAS;AAAA,IACT,YAAY;AAAA,IACZ,OAAO;AAAA,IACP,WAAW,KAAK,QAAQ;AAAA,IACxB,SAAS,KAAK,QAAQ;AAAA,IACtB,MAAAA,QAAO,KAAK,QAAQ;AAAA,IACpB;AAAA,IACA;AAAA,IACA,QAAQ;AAAA;AAAA,IACR,eAAe;AAAA;AAAA,IACf;AAAA,EACF,IAAqB,CAAC,GACtB;AACA,SAAK,KAAK,aAAa,KAAK,aAAa,CAAC,MAAO;AAGjD,QACE,OAAO,WAAW,YAClB,CAAC,OAAO,QAAQ,OAAO,EAAE,SAAS,MAAM,GACxC;AACA,eAAS;AAAA,IACX,WACE,OAAO,WAAW,YAClB,CAAC,UAAU,SAAS,KAAK,EAAE,SAAS,MAAM,GAC1C;AACA,eAAS,KAAK;AAAA,IAChB,OAAO;AACL,UAAI;AAEJ,UAAI,OAAO,WAAW,UAAU;AAE9B,eAAO,SAAS,cAAc,MAAM;AAAA,MACtC,WAAW,kBAAkB,eAAe,QAAQ,UAAU;AAE5D,eAAO;AAAA,MACT;AAEA,UAAI,MAAM;AACR,YAAI,KAAK,QAAQ,YAAY,QAAQ;AAEnC,gBAAM,cAAc,KAAK,YAAY,sBAAsB;AAC3D,oBAAU,KAAK,eAAe,YAAY,OAAO,YAAY;AAAA,QAC/D;AAEA,cAAM,OAAO,KAAK,sBAAsB;AAExC,kBACG,KAAK,eAAe,KAAK,OAAO,KAAK,OAAO,KAAK;AAAA,MACtD;AAAA,IACF;AAEA,QAAI,OAAO,WAAW,SAAU;AAEhC,cAAU;AACV,aAAS,KAAK,MAAM,MAAM;AAE1B,QAAI,KAAK,QAAQ,UAAU;AACzB,UAAI,cAAc;AAChB,aAAK,eAAe,KAAK,iBAAiB,KAAK;AAAA,MACjD;AAAA,IACF,OAAO;AACL,eAAS,MAAM,GAAG,QAAQ,KAAK,KAAK;AAAA,IACtC;AAEA,QAAI,WAAW,KAAK,cAAc;AAChC,gBAAU,IAAI;AACd,mBAAa,IAAI;AACjB;AAAA,IACF;AAEA,SAAK,WAAW,YAAY,CAAC;AAE7B,QAAI,WAAW;AACb,WAAK,iBAAiB,KAAK,eAAe;AAC1C,WAAK,UAAU,KAAK,MAAM;AAC1B,WAAK,MAAM;AACX,WAAK,6BAA6B;AAClC,WAAK,KAAK;AACV,mBAAa,IAAI;AACjB,WAAK,WAAW,CAAC;AACjB;AAAA,IACF;AAEA,QAAI,CAAC,cAAc;AACjB,WAAK,eAAe;AAAA,IACtB;AAEA,SAAK,QAAQ,OAAO,KAAK,gBAAgB,QAAQ;AAAA,MAC/C;AAAA,MACA;AAAA,MACA,MAAAA;AAAA,MACA,SAAS,MAAM;AAEb,YAAI,KAAM,MAAK,WAAW;AAC1B,aAAK,cAAc;AACnB,kBAAU,IAAI;AAAA,MAChB;AAAA,MACA,UAAU,CAAC,OAAe,cAAuB;AAC/C,aAAK,cAAc;AAGnB,aAAK,eAAe,KAAK;AACzB,aAAK,WAAW,QAAQ,KAAK;AAC7B,aAAK,YAAY,KAAK,KAAK,KAAK,QAAQ;AAExC,aAAK,iBAAiB;AACtB,aAAK,UAAU,KAAK,MAAM;AAE1B,YAAI,cAAc;AAEhB,eAAK,eAAe;AAAA,QACtB;AAEA,YAAI,CAAC,UAAW,MAAK,KAAK;AAE1B,YAAI,WAAW;AACb,eAAK,MAAM;AACX,eAAK,KAAK;AACV,uBAAa,IAAI;AACjB,eAAK,WAAW,CAAC;AAEjB,eAAK,6BAA6B;AAAA,QACpC;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEQ,+BAA+B;AACrC,SAAK,gCAAgC;AAErC,0BAAsB,MAAM;AAC1B,WAAK,gCAAgC;AAAA,IACvC,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAc;AAChB,WACE,KAAK,QAAQ,YAAY,SACrB,SAAS,kBACT,KAAK,QAAQ;AAAA,EAErB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,QAAQ;AACV,QAAI,KAAK,QAAQ,iCAAiC;AAChD,UAAI,KAAK,cAAc;AACrB,eAAO,KAAK,YAAY,cAAc,KAAK,YAAY;AAAA,MACzD,OAAO;AACL,eAAO,KAAK,YAAY,eAAe,KAAK,YAAY;AAAA,MAC1D;AAAA,IACF,OAAO;AACL,aAAO,KAAK,WAAW,MAAM,KAAK,eAAe,MAAM,GAAG;AAAA,IAC5D;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AACjB,WAAO,KAAK,QAAQ,gBAAgB;AAAA,EACtC;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,eAAe;AAEjB,WAAO,KAAK,eACR,KAAK,YAAY,aACjB,KAAK,YAAY;AAAA,EACvB;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,SAAS;AACX,WAAO,KAAK,QAAQ,WAChB,OAAO,KAAK,gBAAgB,KAAK,KAAK,IACtC,KAAK;AAAA,EACX;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AAEb,WAAO,KAAK,UAAU,IAAI,IAAI,KAAK,SAAS,KAAK;AAAA,EACnD;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,cAAc;AAChB,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAY,YAAY,OAAkB;AACxC,QAAI,KAAK,iBAAiB,OAAO;AAC/B,WAAK,eAAe;AACpB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAY,UAAU,OAAgB;AACpC,QAAI,KAAK,eAAe,OAAO;AAC7B,WAAK,aAAa;AAClB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK;AAAA,EACd;AAAA,EAEA,IAAY,SAAS,OAAgB;AACnC,QAAI,KAAK,cAAc,OAAO;AAC5B,WAAK,YAAY;AACjB,WAAK,gBAAgB;AAAA,IACvB;AAAA,EACF;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,WAAW;AACb,WAAO,KAAK,gBAAgB;AAAA,EAC9B;AAAA;AAAA;AAAA;AAAA,EAKA,IAAI,YAAY;AACd,QAAI,YAAY;AAChB,QAAI,KAAK,UAAW,cAAa;AACjC,QAAI,KAAK,SAAU,cAAa;AAChC,QAAI,KAAK,YAAa,cAAa;AACnC,QAAI,KAAK,gBAAgB,SAAU,cAAa;AAChD,WAAO;AAAA,EACT;AAAA,EAEQ,kBAAkB;AACxB,SAAK,iBAAiB;AAEtB,SAAK,YAAY,YACf,GAAG,KAAK,YAAY,SAAS,IAAI,KAAK,SAAS,GAAG,KAAK;AAAA,EAC3D;AAAA,EAEQ,mBAAmB;AACzB,SAAK,YAAY,YAAY,KAAK,YAAY,UAC3C,QAAQ,iBAAiB,EAAE,EAC3B,KAAK;AAAA,EACV;AACF;;;AC9uBA,WAAW,QAAQ;","names":["lerp","lerp"]}
|
package/dist/lenis.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
var k="1.1.14-dev.1";function w(r,t,e){return Math.max(r,Math.min(t,e))}function _(r,t,e){return(1-e)*r+e*t}function z(r,t,e,i){return _(r,t,1-Math.exp(-e*i))}function x(r,t){return(r%t+t)%t}var y=class{isRunning=!1;value=0;from=0;to=0;currentTime=0;lerp;duration;easing;onUpdate;advance(t){if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;let i=w(0,this.currentTime/this.duration,1);e=i>=1;let s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=z(this.value,this.to,this.lerp*60,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:a,onUpdate:m}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,a?.(),this.onUpdate=m}};function N(r,t){let e;return function(...i){let s=this;clearTimeout(e),e=setTimeout(()=>{e=void 0,r.apply(s,i)},t)}}var E=class{constructor(t,e,{autoResize:i=!0,debounce:s=250}={}){this.wrapper=t;this.content=e;i&&(this.debouncedResize=N(this.resize,s),this.wrapper instanceof 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()}width=0;height=0;scrollHeight=0;scrollWidth=0;debouncedResize;wrapperResizeObserver;contentResizeObserver;destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),this.wrapper===window&&this.debouncedResize&&window.removeEventListener("resize",this.debouncedResize,!1)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper instanceof Window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper instanceof 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}}};var g=class{events={};emit(t,...e){let i=this.events[t]||[];for(let s=0,o=i.length;s<o;s++)i[s]?.(...e)}on(t,e){return this.events[t]?.push(e)||(this.events[t]=[e]),()=>{this.events[t]=this.events[t]?.filter(i=>e!==i)}}off(t,e){this.events[t]=this.events[t]?.filter(i=>e!==i)}destroy(){this.events={}}};var R=100/6,u={passive:!1},T=class{constructor(t,e={wheelMultiplier:1,touchMultiplier:1}){this.element=t;this.options=e;window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,u),this.element.addEventListener("touchstart",this.onTouchStart,u),this.element.addEventListener("touchmove",this.onTouchMove,u),this.element.addEventListener("touchend",this.onTouchEnd,u)}touchStart={x:0,y:0};lastDelta={x:0,y:0};window={width:0,height:0};emitter=new g;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,u),this.element.removeEventListener("touchstart",this.onTouchStart,u),this.element.removeEventListener("touchmove",this.onTouchMove,u),this.element.removeEventListener("touchend",this.onTouchEnd,u)}onTouchStart=t=>{let{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=>{let{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.options.touchMultiplier,o=-(i-this.touchStart.y)*this.options.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=t=>{let{deltaX:e,deltaY:i,deltaMode:s}=t,o=s===1?R:s===2?this.window.width:1,a=s===1?R:s===2?this.window.height:1;e*=o,i*=a,e*=this.options.wheelMultiplier,i*=this.options.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})};onWindowResize=()=>{this.window={width:window.innerWidth,height:window.innerHeight}}};var L=class{_isScrolling=!1;_isStopped=!1;_isLocked=!1;_preventNextNativeScrollEvent=!1;_resetVelocityTimeout=null;isTouching;time=0;userData={};lastVelocity=0;velocity=0;direction=0;options;targetScroll;animatedScroll;animate=new y;emitter=new g;dimensions;virtualScroll;constructor({wrapper:t=window,content:e=document.documentElement,eventsTarget:i=t,smoothWheel:s=!0,syncTouch:o=!1,syncTouchLerp:a=.075,touchInertiaMultiplier:m=35,duration:v,easing:d=C=>Math.min(1,1.001-Math.pow(2,-10*C)),lerp:c=.1,infinite:p=!1,orientation:b="vertical",gestureOrientation:n="vertical",touchMultiplier:h=1,wheelMultiplier:f=1,autoResize:S=!0,prevent:l,virtualScroll:M,overscroll:O=!1,__experimental__naiveDimensions:H=!1}={}){window.lenisVersion=k,(!t||t===document.documentElement||t===document.body)&&(t=window),this.options={wrapper:t,content:e,eventsTarget:i,smoothWheel:s,syncTouch:o,syncTouchLerp:a,touchInertiaMultiplier:m,duration:v,easing:d,lerp:c,infinite:p,gestureOrientation:n,orientation:b,touchMultiplier:h,wheelMultiplier:f,autoResize:S,prevent:l,virtualScroll:M,overscroll:O,__experimental__naiveDimensions:H},this.dimensions=new E(t,e,{autoResize:S}),this.updateClassName(),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 T(i,{touchMultiplier:h,wheelMultiplier:f}),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}onPointerDown=t=>{t.button===1&&this.reset()};onVirtualScroll=t=>{if(typeof this.options.virtualScroll=="function"&&this.options.virtualScroll(t)===!1)return;let{deltaX:e,deltaY:i,event:s}=t;if(this.emitter.emit("virtual-scroll",{deltaX:e,deltaY:i,event:s}),s.ctrlKey)return;let o=s.type.includes("touch"),a=s.type.includes("wheel");if(this.isTouching=s.type==="touchstart"||s.type==="touchmove",this.options.syncTouch&&o&&s.type==="touchstart"&&!this.isStopped&&!this.isLocked){this.reset();return}let v=e===0&&i===0,d=this.options.gestureOrientation==="vertical"&&i===0||this.options.gestureOrientation==="horizontal"&&e===0;if(v||d)return;let c=s.composedPath();c=c.slice(0,c.indexOf(this.rootElement));let p=this.options.prevent;if(c.find(l=>l instanceof HTMLElement&&(typeof p=="function"&&p?.(l)||l.hasAttribute?.("data-lenis-prevent")||o&&l.hasAttribute?.("data-lenis-prevent-touch")||a&&l.hasAttribute?.("data-lenis-prevent-wheel")||l.classList?.contains("lenis")&&!l.classList?.contains("lenis-stopped")&&!l.classList?.contains("lenis-locked")&&(l.classList?.contains("lenis-overscroll")?l.classList?.contains("lenis-scrolling")&&l.classList?.contains("lenis-smooth"):!0))))return;if(this.isStopped||this.isLocked){s.preventDefault();return}if(!(this.options.syncTouch&&o||this.options.smoothWheel&&a)){this.isScrolling="native",this.animate.stop();return}s.preventDefault();let n=i;this.options.gestureOrientation==="both"?n=Math.abs(i)>Math.abs(e)?i:e:this.options.gestureOrientation==="horizontal"&&(n=e);let h=o&&this.options.syncTouch,S=o&&s.type==="touchend"&&Math.abs(n)>5;S&&(n=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+n,{programmatic:!1,...h?{lerp:S?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}})};resize(){this.dimensions.resize(),this.animatedScroll=this.targetScroll=this.actualScroll,this.emit()}emit(){this.emitter.emit("scroll",this)}onNativeScroll=()=>{if(this._resetVelocityTimeout!==null&&(clearTimeout(this._resetVelocityTimeout),this._resetVelocityTimeout=null),this._preventNextNativeScrollEvent){this._preventNextNativeScrollEvent=!1;return}if(this.isScrolling===!1||this.isScrolling==="native"){let 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(),this.velocity!==0&&(this._resetVelocityTimeout=setTimeout(()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()},400))}};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){let e=t-(this.time||t);this.time=t,this.animate.advance(e*.001)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:o=this.options.duration,easing:a=this.options.easing,lerp:m=this.options.lerp,onStart:v,onComplete:d,force:c=!1,programmatic:p=!0,userData:b}={}){if(!((this.isStopped||this.isLocked)&&!c)){if(typeof t=="string"&&["top","left","start"].includes(t))t=0;else if(typeof t=="string"&&["bottom","right","end"].includes(t))t=this.limit;else{let n;if(typeof t=="string"?n=document.querySelector(t):t instanceof HTMLElement&&t?.nodeType&&(n=t),n){if(this.options.wrapper!==window){let f=this.rootElement.getBoundingClientRect();e-=this.isHorizontal?f.left:f.top}let h=n.getBoundingClientRect();t=(this.isHorizontal?h.left:h.top)+this.animatedScroll}}if(typeof t=="number"){if(t+=e,t=Math.round(t),this.options.infinite?p&&(this.targetScroll=this.animatedScroll=this.scroll):t=w(0,t,this.limit),t===this.targetScroll){v?.(this),d?.(this);return}if(this.userData=b??{},i){this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),d?.(this),this.userData={};return}p||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:a,lerp:m,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling="smooth",v?.(this)},onUpdate:(n,h)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=n-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=n,this.setScroll(this.scroll),p&&(this.targetScroll=n),h||this.emit(),h&&(this.reset(),this.emit(),d?.(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this._preventNextNativeScrollEvent=!0,requestAnimationFrame(()=>{this._preventNextNativeScrollEvent=!1})}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 this.options.orientation==="horizontal"}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?x(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return this.limit===0?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 this.isScrolling==="smooth"}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),this.isScrolling==="smooth"&&(t+=" lenis-smooth"),this.options.overscroll&&(t+=" lenis-overscroll"),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()}};globalThis.Lenis=L;
|
|
1
|
+
var k="1.1.14-dev.2";function w(r,t,e){return Math.max(r,Math.min(t,e))}function _(r,t,e){return(1-e)*r+e*t}function z(r,t,e,i){return _(r,t,1-Math.exp(-e*i))}function x(r,t){return(r%t+t)%t}var y=class{isRunning=!1;value=0;from=0;to=0;currentTime=0;lerp;duration;easing;onUpdate;advance(t){if(!this.isRunning)return;let e=!1;if(this.duration&&this.easing){this.currentTime+=t;let i=w(0,this.currentTime/this.duration,1);e=i>=1;let s=e?1:this.easing(i);this.value=this.from+(this.to-this.from)*s}else this.lerp?(this.value=z(this.value,this.to,this.lerp*60,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:l,onUpdate:m}){this.from=this.value=t,this.to=e,this.lerp=i,this.duration=s,this.easing=o,this.currentTime=0,this.isRunning=!0,l?.(),this.onUpdate=m}};function N(r,t){let e;return function(...i){let s=this;clearTimeout(e),e=setTimeout(()=>{e=void 0,r.apply(s,i)},t)}}var E=class{constructor(t,e,{autoResize:i=!0,debounce:s=250}={}){this.wrapper=t;this.content=e;i&&(this.debouncedResize=N(this.resize,s),this.wrapper instanceof 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()}width=0;height=0;scrollHeight=0;scrollWidth=0;debouncedResize;wrapperResizeObserver;contentResizeObserver;destroy(){this.wrapperResizeObserver?.disconnect(),this.contentResizeObserver?.disconnect(),this.wrapper===window&&this.debouncedResize&&window.removeEventListener("resize",this.debouncedResize,!1)}resize=()=>{this.onWrapperResize(),this.onContentResize()};onWrapperResize=()=>{this.wrapper instanceof Window?(this.width=window.innerWidth,this.height=window.innerHeight):(this.width=this.wrapper.clientWidth,this.height=this.wrapper.clientHeight)};onContentResize=()=>{this.wrapper instanceof 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}}};var g=class{events={};emit(t,...e){let i=this.events[t]||[];for(let s=0,o=i.length;s<o;s++)i[s]?.(...e)}on(t,e){return this.events[t]?.push(e)||(this.events[t]=[e]),()=>{this.events[t]=this.events[t]?.filter(i=>e!==i)}}off(t,e){this.events[t]=this.events[t]?.filter(i=>e!==i)}destroy(){this.events={}}};var R=100/6,p={passive:!1},T=class{constructor(t,e={wheelMultiplier:1,touchMultiplier:1}){this.element=t;this.options=e;window.addEventListener("resize",this.onWindowResize,!1),this.onWindowResize(),this.element.addEventListener("wheel",this.onWheel,p),this.element.addEventListener("touchstart",this.onTouchStart,p),this.element.addEventListener("touchmove",this.onTouchMove,p),this.element.addEventListener("touchend",this.onTouchEnd,p)}touchStart={x:0,y:0};lastDelta={x:0,y:0};window={width:0,height:0};emitter=new g;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,p),this.element.removeEventListener("touchstart",this.onTouchStart,p),this.element.removeEventListener("touchmove",this.onTouchMove,p),this.element.removeEventListener("touchend",this.onTouchEnd,p)}onTouchStart=t=>{let{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=>{let{clientX:e,clientY:i}=t.targetTouches?t.targetTouches[0]:t,s=-(e-this.touchStart.x)*this.options.touchMultiplier,o=-(i-this.touchStart.y)*this.options.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=t=>{let{deltaX:e,deltaY:i,deltaMode:s}=t,o=s===1?R:s===2?this.window.width:1,l=s===1?R:s===2?this.window.height:1;e*=o,i*=l,e*=this.options.wheelMultiplier,i*=this.options.wheelMultiplier,this.emitter.emit("scroll",{deltaX:e,deltaY:i,event:t})};onWindowResize=()=>{this.window={width:window.innerWidth,height:window.innerHeight}}};var L=class{_isScrolling=!1;_isStopped=!1;_isLocked=!1;_preventNextNativeScrollEvent=!1;_resetVelocityTimeout=null;isTouching;time=0;userData={};lastVelocity=0;velocity=0;direction=0;options;targetScroll;animatedScroll;animate=new y;emitter=new g;dimensions;virtualScroll;constructor({wrapper:t=window,content:e=document.documentElement,eventsTarget:i=t,smoothWheel:s=!0,syncTouch:o=!1,syncTouchLerp:l=.075,touchInertiaMultiplier:m=35,duration:v,easing:u=C=>Math.min(1,1.001-Math.pow(2,-10*C)),lerp:h=.1,infinite:c=!1,orientation:b="vertical",gestureOrientation:n="vertical",touchMultiplier:a=1,wheelMultiplier:f=1,autoResize:S=!0,prevent:d,virtualScroll:M,overscroll:O=!0,__experimental__naiveDimensions:H=!1}={}){window.lenisVersion=k,(!t||t===document.documentElement||t===document.body)&&(t=window),this.options={wrapper:t,content:e,eventsTarget:i,smoothWheel:s,syncTouch:o,syncTouchLerp:l,touchInertiaMultiplier:m,duration:v,easing:u,lerp:h,infinite:c,gestureOrientation:n,orientation:b,touchMultiplier:a,wheelMultiplier:f,autoResize:S,prevent:d,virtualScroll:M,overscroll:O,__experimental__naiveDimensions:H},this.dimensions=new E(t,e,{autoResize:S}),this.updateClassName(),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 T(i,{touchMultiplier:a,wheelMultiplier:f}),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}onPointerDown=t=>{t.button===1&&this.reset()};onVirtualScroll=t=>{if(typeof this.options.virtualScroll=="function"&&this.options.virtualScroll(t)===!1)return;let{deltaX:e,deltaY:i,event:s}=t;if(this.emitter.emit("virtual-scroll",{deltaX:e,deltaY:i,event:s}),s.ctrlKey||s.lenisStopPropagation)return;let o=s.type.includes("touch"),l=s.type.includes("wheel");if(this.isTouching=s.type==="touchstart"||s.type==="touchmove",this.options.syncTouch&&o&&s.type==="touchstart"&&!this.isStopped&&!this.isLocked){this.reset();return}let v=e===0&&i===0,u=this.options.gestureOrientation==="vertical"&&i===0||this.options.gestureOrientation==="horizontal"&&e===0;if(v||u)return;let h=s.composedPath();h=h.slice(0,h.indexOf(this.rootElement));let c=this.options.prevent;if(h.find(d=>d instanceof HTMLElement&&(typeof c=="function"&&c?.(d)||d.hasAttribute?.("data-lenis-prevent")||o&&d.hasAttribute?.("data-lenis-prevent-touch")||l&&d.hasAttribute?.("data-lenis-prevent-wheel"))))return;if(this.isStopped||this.isLocked){s.preventDefault();return}if(!(this.options.syncTouch&&o||this.options.smoothWheel&&l)){this.isScrolling="native",this.animate.stop(),s.lenisStopPropagation=!0;return}let n=i;this.options.gestureOrientation==="both"?n=Math.abs(i)>Math.abs(e)?i:e:this.options.gestureOrientation==="horizontal"&&(n=e),(!this.options.overscroll||this.options.infinite||this.options.wrapper!==window&&(this.animatedScroll>0&&this.animatedScroll<this.limit||this.animatedScroll===0&&i>0||this.animatedScroll===this.limit&&i<0))&&(s.lenisStopPropagation=!0),s.preventDefault();let a=o&&this.options.syncTouch,S=o&&s.type==="touchend"&&Math.abs(n)>5;S&&(n=this.velocity*this.options.touchInertiaMultiplier),this.scrollTo(this.targetScroll+n,{programmatic:!1,...a?{lerp:S?this.options.syncTouchLerp:1}:{lerp:this.options.lerp,duration:this.options.duration,easing:this.options.easing}})};resize(){this.dimensions.resize(),this.animatedScroll=this.targetScroll=this.actualScroll,this.emit()}emit(){this.emitter.emit("scroll",this)}onNativeScroll=()=>{if(this._resetVelocityTimeout!==null&&(clearTimeout(this._resetVelocityTimeout),this._resetVelocityTimeout=null),this._preventNextNativeScrollEvent){this._preventNextNativeScrollEvent=!1;return}if(this.isScrolling===!1||this.isScrolling==="native"){let 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(),this.velocity!==0&&(this._resetVelocityTimeout=setTimeout(()=>{this.lastVelocity=this.velocity,this.velocity=0,this.isScrolling=!1,this.emit()},400))}};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){let e=t-(this.time||t);this.time=t,this.animate.advance(e*.001)}scrollTo(t,{offset:e=0,immediate:i=!1,lock:s=!1,duration:o=this.options.duration,easing:l=this.options.easing,lerp:m=this.options.lerp,onStart:v,onComplete:u,force:h=!1,programmatic:c=!0,userData:b}={}){if(!((this.isStopped||this.isLocked)&&!h)){if(typeof t=="string"&&["top","left","start"].includes(t))t=0;else if(typeof t=="string"&&["bottom","right","end"].includes(t))t=this.limit;else{let n;if(typeof t=="string"?n=document.querySelector(t):t instanceof HTMLElement&&t?.nodeType&&(n=t),n){if(this.options.wrapper!==window){let f=this.rootElement.getBoundingClientRect();e-=this.isHorizontal?f.left:f.top}let a=n.getBoundingClientRect();t=(this.isHorizontal?a.left:a.top)+this.animatedScroll}}if(typeof t=="number"){if(t+=e,t=Math.round(t),this.options.infinite?c&&(this.targetScroll=this.animatedScroll=this.scroll):t=w(0,t,this.limit),t===this.targetScroll){v?.(this),u?.(this);return}if(this.userData=b??{},i){this.animatedScroll=this.targetScroll=t,this.setScroll(this.scroll),this.reset(),this.preventNextNativeScrollEvent(),this.emit(),u?.(this),this.userData={};return}c||(this.targetScroll=t),this.animate.fromTo(this.animatedScroll,t,{duration:o,easing:l,lerp:m,onStart:()=>{s&&(this.isLocked=!0),this.isScrolling="smooth",v?.(this)},onUpdate:(n,a)=>{this.isScrolling="smooth",this.lastVelocity=this.velocity,this.velocity=n-this.animatedScroll,this.direction=Math.sign(this.velocity),this.animatedScroll=n,this.setScroll(this.scroll),c&&(this.targetScroll=n),a||this.emit(),a&&(this.reset(),this.emit(),u?.(this),this.userData={},this.preventNextNativeScrollEvent())}})}}}preventNextNativeScrollEvent(){this._preventNextNativeScrollEvent=!0,requestAnimationFrame(()=>{this._preventNextNativeScrollEvent=!1})}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 this.options.orientation==="horizontal"}get actualScroll(){return this.isHorizontal?this.rootElement.scrollLeft:this.rootElement.scrollTop}get scroll(){return this.options.infinite?x(this.animatedScroll,this.limit):this.animatedScroll}get progress(){return this.limit===0?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 this.isScrolling==="smooth"}get className(){let t="lenis";return this.isStopped&&(t+=" lenis-stopped"),this.isLocked&&(t+=" lenis-locked"),this.isScrolling&&(t+=" lenis-scrolling"),this.isScrolling==="smooth"&&(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()}};globalThis.Lenis=L;
|
|
2
2
|
//# sourceMappingURL=lenis.min.js.map
|
package/dist/lenis.min.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../packages/core/src/maths.ts","../packages/core/src/animate.ts","../packages/core/src/debounce.ts","../packages/core/src/dimensions.ts","../packages/core/src/emitter.ts","../packages/core/src/virtual-scroll.ts","../packages/core/src/lenis.ts","../packages/core/browser.ts"],"sourcesContent":["{\r\n \"name\": \"lenis\",\r\n \"version\": \"1.1.14-dev.1\",\r\n \"type\": \"module\",\r\n \"sideEffects\": false,\r\n \"author\": \"darkroom.engineering\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n },\r\n \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n \"funding\": {\r\n \"type\": \"github\",\r\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n },\r\n \"keywords\": [\r\n \"scroll\",\r\n \"smooth\",\r\n \"lenis\",\r\n \"react\",\r\n \"vue\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"pnpm build:core && pnpm build:all\",\r\n \"build:core\": \"tsup --config tsup.core.ts\",\r\n \"build:all\": \"tsup\",\r\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n \"dev:build\": \"tsup --watch\",\r\n \"dev:playground\": \"pnpm --filter playground dev\",\r\n \"readme\": \"node ./scripts/update-readme.js\",\r\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n \"postversion\": \"pnpm build && pnpm readme\",\r\n \"publish:main\": \"npm publish\",\r\n \"publish:dev\": \"npm publish --tag dev\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"dependencies\": {\r\n \"@darkroom.engineering/tempus\": \"^0.0.46\"\r\n },\r\n \"devDependencies\": {\r\n \"tsup\": \"^8.2.4\",\r\n \"typescript\": \"^5.4.5\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=17.0.0\",\r\n \"vue\": \">=3.0.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"vue\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"unpkg\": \"./dist/lenis.mjs\",\r\n \"main\": \"./dist/lenis.mjs\",\r\n \"module\": \"./dist/lenis.mjs\",\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"default\": \"./dist/lenis.mjs\"\r\n },\r\n \"./dist/*\": \"./dist/*\",\r\n \"./react\": {\r\n \"types\": \"./dist/lenis-react.d.ts\",\r\n \"default\": \"./dist/lenis-react.mjs\"\r\n },\r\n \"./snap\": {\r\n \"types\": \"./dist/lenis-snap.d.ts\",\r\n \"default\": \"./dist/lenis-snap.mjs\"\r\n },\r\n \"./vue\": {\r\n \"types\": \"./dist/lenis-vue.d.ts\",\r\n \"default\": \"./dist/lenis-vue.mjs\"\r\n }\r\n }\r\n}\r\n","/**\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","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\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","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 | Element,\r\n private content: HTMLElement | Element,\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","/**\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<CB extends (...args: any[]) => 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<CB extends (...args: any[]) => 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 type { 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// 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<T, F extends keyof T> = Omit<T, F> & Partial<Pick<T, F>>\r\n\r\nexport 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<LenisOptions>,\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 overscroll = false,\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 overscroll,\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') &&\r\n !node.classList?.contains('lenis-locked') &&\r\n (node.classList?.contains('lenis-overscroll')\r\n ? node.classList?.contains('lenis-scrolling') &&\r\n node.classList?.contains('lenis-smooth')\r\n : true))) // 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 if (this.options.overscroll) className += ' lenis-overscroll'\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","// This file serves as an entry point for the package\r\nimport { Lenis } from './src/lenis'\r\nglobalThis.Lenis = Lenis\r\n"],"mappings":"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","names":["version","clamp","min","input","max","lerp","x","y","t","damp","lambda","deltaTime","modulo","n","d","Animate","deltaTime","completed","linearProgress","clamp","easedProgress","damp","from","to","lerp","duration","easing","onStart","onUpdate","debounce","callback","delay","timer","args","context","Dimensions","wrapper","content","autoResize","debounceValue","debounce","Emitter","event","args","callbacks","i","length","cb","callback","LINE_HEIGHT","listenerOptions","VirtualScroll","element","options","Emitter","event","callback","clientX","clientY","deltaX","deltaY","deltaMode","multiplierX","multiplierY","Lenis","Animate","Emitter","wrapper","content","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","duration","easing","t","lerp","infinite","orientation","gestureOrientation","touchMultiplier","wheelMultiplier","autoResize","prevent","virtualScroll","overscroll","__experimental__naiveDimensions","version","Dimensions","VirtualScroll","event","callback","scroll","data","deltaX","deltaY","isTouch","isWheel","isClick","isUnknownGesture","composedPath","node","delta","hasTouchInertia","lastScroll","time","deltaTime","target","offset","immediate","lock","onStart","onComplete","force","programmatic","userData","wrapperRect","rect","clamp","value","completed","modulo","className","Lenis"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../packages/core/src/maths.ts","../packages/core/src/animate.ts","../packages/core/src/debounce.ts","../packages/core/src/dimensions.ts","../packages/core/src/emitter.ts","../packages/core/src/virtual-scroll.ts","../packages/core/src/lenis.ts","../packages/core/browser.ts"],"sourcesContent":["{\r\n \"name\": \"lenis\",\r\n \"version\": \"1.1.14-dev.2\",\r\n \"type\": \"module\",\r\n \"sideEffects\": false,\r\n \"author\": \"darkroom.engineering\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n },\r\n \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n \"funding\": {\r\n \"type\": \"github\",\r\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n },\r\n \"keywords\": [\r\n \"scroll\",\r\n \"smooth\",\r\n \"lenis\",\r\n \"react\",\r\n \"vue\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"pnpm build:core && pnpm build:all\",\r\n \"build:core\": \"tsup --config tsup.core.ts\",\r\n \"build:all\": \"tsup\",\r\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n \"dev:build\": \"tsup --watch\",\r\n \"dev:playground\": \"pnpm --filter playground dev\",\r\n \"readme\": \"node ./scripts/update-readme.js\",\r\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n \"postversion\": \"pnpm build && pnpm readme\",\r\n \"publish:main\": \"npm publish\",\r\n \"publish:dev\": \"npm publish --tag dev\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"dependencies\": {\r\n \"@darkroom.engineering/tempus\": \"^0.0.46\"\r\n },\r\n \"devDependencies\": {\r\n \"tsup\": \"^8.2.4\",\r\n \"typescript\": \"^5.4.5\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=17.0.0\",\r\n \"vue\": \">=3.0.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"vue\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"unpkg\": \"./dist/lenis.mjs\",\r\n \"main\": \"./dist/lenis.mjs\",\r\n \"module\": \"./dist/lenis.mjs\",\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"default\": \"./dist/lenis.mjs\"\r\n },\r\n \"./dist/*\": \"./dist/*\",\r\n \"./react\": {\r\n \"types\": \"./dist/lenis-react.d.ts\",\r\n \"default\": \"./dist/lenis-react.mjs\"\r\n },\r\n \"./snap\": {\r\n \"types\": \"./dist/lenis-snap.d.ts\",\r\n \"default\": \"./dist/lenis-snap.mjs\"\r\n },\r\n \"./vue\": {\r\n \"types\": \"./dist/lenis-vue.d.ts\",\r\n \"default\": \"./dist/lenis-vue.mjs\"\r\n }\r\n }\r\n}\r\n","/**\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","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\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","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 | Element,\r\n private content: HTMLElement | Element,\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","/**\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<CB extends (...args: any[]) => 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<CB extends (...args: any[]) => 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 type { 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// 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<T, F extends keyof T> = Omit<T, F> & Partial<Pick<T, F>>\r\n\r\nexport 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<LenisOptions>,\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 overscroll = true,\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 overscroll,\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 // @ts-ignore\r\n if (event.lenisStopPropagation) 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 )\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 // @ts-ignore\r\n event.lenisStopPropagation = true\r\n return\r\n }\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 if (\r\n !this.options.overscroll ||\r\n this.options.infinite ||\r\n (this.options.wrapper !== window &&\r\n ((this.animatedScroll > 0 && this.animatedScroll < this.limit) ||\r\n (this.animatedScroll === 0 && deltaY > 0) ||\r\n (this.animatedScroll === this.limit && deltaY < 0)))\r\n ) {\r\n // @ts-ignore\r\n event.lenisStopPropagation = true\r\n // event.stopPropagation()\r\n }\r\n\r\n event.preventDefault()\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","// This file serves as an entry point for the package\r\nimport { Lenis } from './src/lenis'\r\nglobalThis.Lenis = Lenis\r\n"],"mappings":"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","names":["version","clamp","min","input","max","lerp","x","y","t","damp","lambda","deltaTime","modulo","n","d","Animate","deltaTime","completed","linearProgress","clamp","easedProgress","damp","from","to","lerp","duration","easing","onStart","onUpdate","debounce","callback","delay","timer","args","context","Dimensions","wrapper","content","autoResize","debounceValue","debounce","Emitter","event","args","callbacks","i","length","cb","callback","LINE_HEIGHT","listenerOptions","VirtualScroll","element","options","Emitter","event","callback","clientX","clientY","deltaX","deltaY","deltaMode","multiplierX","multiplierY","Lenis","Animate","Emitter","wrapper","content","eventsTarget","smoothWheel","syncTouch","syncTouchLerp","touchInertiaMultiplier","duration","easing","t","lerp","infinite","orientation","gestureOrientation","touchMultiplier","wheelMultiplier","autoResize","prevent","virtualScroll","overscroll","__experimental__naiveDimensions","version","Dimensions","VirtualScroll","event","callback","scroll","data","deltaX","deltaY","isTouch","isWheel","isClick","isUnknownGesture","composedPath","node","delta","hasTouchInertia","lastScroll","time","deltaTime","target","offset","immediate","lock","onStart","onComplete","force","programmatic","userData","wrapperRect","rect","clamp","value","completed","modulo","className","Lenis"]}
|
package/dist/lenis.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// package.json
|
|
2
|
-
var version = "1.1.14-dev.
|
|
2
|
+
var version = "1.1.14-dev.2";
|
|
3
3
|
|
|
4
4
|
// packages/core/src/maths.ts
|
|
5
5
|
function clamp(min, input, max) {
|
|
@@ -408,7 +408,7 @@ var Lenis = class {
|
|
|
408
408
|
autoResize = true,
|
|
409
409
|
prevent,
|
|
410
410
|
virtualScroll,
|
|
411
|
-
overscroll =
|
|
411
|
+
overscroll = true,
|
|
412
412
|
__experimental__naiveDimensions = false
|
|
413
413
|
} = {}) {
|
|
414
414
|
window.lenisVersion = version;
|
|
@@ -495,6 +495,7 @@ var Lenis = class {
|
|
|
495
495
|
const { deltaX, deltaY, event } = data;
|
|
496
496
|
this.emitter.emit("virtual-scroll", { deltaX, deltaY, event });
|
|
497
497
|
if (event.ctrlKey) return;
|
|
498
|
+
if (event.lenisStopPropagation) return;
|
|
498
499
|
const isTouch = event.type.includes("touch");
|
|
499
500
|
const isWheel = event.type.includes("wheel");
|
|
500
501
|
this.isTouching = event.type === "touchstart" || event.type === "touchmove";
|
|
@@ -512,8 +513,7 @@ var Lenis = class {
|
|
|
512
513
|
composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement));
|
|
513
514
|
const prevent = this.options.prevent;
|
|
514
515
|
if (!!composedPath.find(
|
|
515
|
-
(node) => node instanceof HTMLElement && (typeof prevent === "function" && prevent?.(node) || node.hasAttribute?.("data-lenis-prevent") || isTouch && node.hasAttribute?.("data-lenis-prevent-touch") || isWheel && node.hasAttribute?.("data-lenis-prevent-wheel")
|
|
516
|
-
// nested lenis instance
|
|
516
|
+
(node) => node instanceof HTMLElement && (typeof prevent === "function" && prevent?.(node) || node.hasAttribute?.("data-lenis-prevent") || isTouch && node.hasAttribute?.("data-lenis-prevent-touch") || isWheel && node.hasAttribute?.("data-lenis-prevent-wheel"))
|
|
517
517
|
))
|
|
518
518
|
return;
|
|
519
519
|
if (this.isStopped || this.isLocked) {
|
|
@@ -524,15 +524,19 @@ var Lenis = class {
|
|
|
524
524
|
if (!isSmooth) {
|
|
525
525
|
this.isScrolling = "native";
|
|
526
526
|
this.animate.stop();
|
|
527
|
+
event.lenisStopPropagation = true;
|
|
527
528
|
return;
|
|
528
529
|
}
|
|
529
|
-
event.preventDefault();
|
|
530
530
|
let delta = deltaY;
|
|
531
531
|
if (this.options.gestureOrientation === "both") {
|
|
532
532
|
delta = Math.abs(deltaY) > Math.abs(deltaX) ? deltaY : deltaX;
|
|
533
533
|
} else if (this.options.gestureOrientation === "horizontal") {
|
|
534
534
|
delta = deltaX;
|
|
535
535
|
}
|
|
536
|
+
if (!this.options.overscroll || this.options.infinite || this.options.wrapper !== window && (this.animatedScroll > 0 && this.animatedScroll < this.limit || this.animatedScroll === 0 && deltaY > 0 || this.animatedScroll === this.limit && deltaY < 0)) {
|
|
537
|
+
event.lenisStopPropagation = true;
|
|
538
|
+
}
|
|
539
|
+
event.preventDefault();
|
|
536
540
|
const syncTouch = isTouch && this.options.syncTouch;
|
|
537
541
|
const isTouchEnd = isTouch && event.type === "touchend";
|
|
538
542
|
const hasTouchInertia = isTouchEnd && Math.abs(delta) > 5;
|
|
@@ -840,7 +844,6 @@ var Lenis = class {
|
|
|
840
844
|
if (this.isLocked) className += " lenis-locked";
|
|
841
845
|
if (this.isScrolling) className += " lenis-scrolling";
|
|
842
846
|
if (this.isScrolling === "smooth") className += " lenis-smooth";
|
|
843
|
-
if (this.options.overscroll) className += " lenis-overscroll";
|
|
844
847
|
return className;
|
|
845
848
|
}
|
|
846
849
|
updateClassName() {
|
package/dist/lenis.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../package.json","../packages/core/src/maths.ts","../packages/core/src/animate.ts","../packages/core/src/debounce.ts","../packages/core/src/dimensions.ts","../packages/core/src/emitter.ts","../packages/core/src/virtual-scroll.ts","../packages/core/src/lenis.ts"],"sourcesContent":["{\r\n \"name\": \"lenis\",\r\n \"version\": \"1.1.14-dev.1\",\r\n \"type\": \"module\",\r\n \"sideEffects\": false,\r\n \"author\": \"darkroom.engineering\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n },\r\n \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n \"funding\": {\r\n \"type\": \"github\",\r\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n },\r\n \"keywords\": [\r\n \"scroll\",\r\n \"smooth\",\r\n \"lenis\",\r\n \"react\",\r\n \"vue\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"pnpm build:core && pnpm build:all\",\r\n \"build:core\": \"tsup --config tsup.core.ts\",\r\n \"build:all\": \"tsup\",\r\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n \"dev:build\": \"tsup --watch\",\r\n \"dev:playground\": \"pnpm --filter playground dev\",\r\n \"readme\": \"node ./scripts/update-readme.js\",\r\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n \"postversion\": \"pnpm build && pnpm readme\",\r\n \"publish:main\": \"npm publish\",\r\n \"publish:dev\": \"npm publish --tag dev\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"dependencies\": {\r\n \"@darkroom.engineering/tempus\": \"^0.0.46\"\r\n },\r\n \"devDependencies\": {\r\n \"tsup\": \"^8.2.4\",\r\n \"typescript\": \"^5.4.5\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=17.0.0\",\r\n \"vue\": \">=3.0.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"vue\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"unpkg\": \"./dist/lenis.mjs\",\r\n \"main\": \"./dist/lenis.mjs\",\r\n \"module\": \"./dist/lenis.mjs\",\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"default\": \"./dist/lenis.mjs\"\r\n },\r\n \"./dist/*\": \"./dist/*\",\r\n \"./react\": {\r\n \"types\": \"./dist/lenis-react.d.ts\",\r\n \"default\": \"./dist/lenis-react.mjs\"\r\n },\r\n \"./snap\": {\r\n \"types\": \"./dist/lenis-snap.d.ts\",\r\n \"default\": \"./dist/lenis-snap.mjs\"\r\n },\r\n \"./vue\": {\r\n \"types\": \"./dist/lenis-vue.d.ts\",\r\n \"default\": \"./dist/lenis-vue.mjs\"\r\n }\r\n }\r\n}\r\n","/**\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","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\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","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 | Element,\r\n private content: HTMLElement | Element,\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","/**\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<CB extends (...args: any[]) => 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<CB extends (...args: any[]) => 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 type { 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// 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<T, F extends keyof T> = Omit<T, F> & Partial<Pick<T, F>>\r\n\r\nexport 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<LenisOptions>,\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 overscroll = false,\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 overscroll,\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') &&\r\n !node.classList?.contains('lenis-locked') &&\r\n (node.classList?.contains('lenis-overscroll')\r\n ? node.classList?.contains('lenis-scrolling') &&\r\n node.classList?.contains('lenis-smooth')\r\n : true))) // 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 if (this.options.overscroll) className += ' lenis-overscroll'\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"],"mappings":"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","names":["lerp","lerp"]}
|
|
1
|
+
{"version":3,"sources":["../package.json","../packages/core/src/maths.ts","../packages/core/src/animate.ts","../packages/core/src/debounce.ts","../packages/core/src/dimensions.ts","../packages/core/src/emitter.ts","../packages/core/src/virtual-scroll.ts","../packages/core/src/lenis.ts"],"sourcesContent":["{\r\n \"name\": \"lenis\",\r\n \"version\": \"1.1.14-dev.2\",\r\n \"type\": \"module\",\r\n \"sideEffects\": false,\r\n \"author\": \"darkroom.engineering\",\r\n \"license\": \"MIT\",\r\n \"repository\": {\r\n \"type\": \"git\",\r\n \"url\": \"git+https://github.com/darkroomengineering/lenis.git\"\r\n },\r\n \"bugs\": {\r\n \"url\": \"https://github.com/darkroomengineering/lenis/issues\"\r\n },\r\n \"homepage\": \"https://github.com/darkroomengineering/lenis\",\r\n \"funding\": {\r\n \"type\": \"github\",\r\n \"url\": \"https://github.com/sponsors/darkroomengineering\"\r\n },\r\n \"keywords\": [\r\n \"scroll\",\r\n \"smooth\",\r\n \"lenis\",\r\n \"react\",\r\n \"vue\"\r\n ],\r\n \"scripts\": {\r\n \"build\": \"pnpm build:core && pnpm build:all\",\r\n \"build:core\": \"tsup --config tsup.core.ts\",\r\n \"build:all\": \"tsup\",\r\n \"dev\": \"pnpm run -w --parallel /^dev:.*/\",\r\n \"dev:build\": \"tsup --watch\",\r\n \"dev:playground\": \"pnpm --filter playground dev\",\r\n \"readme\": \"node ./scripts/update-readme.js\",\r\n \"version:dev\": \"npm version prerelease --preid dev --force --no-git-tag-version\",\r\n \"version:patch\": \"npm version patch --force --no-git-tag-version\",\r\n \"version:minor\": \"npm version minor --force --no-git-tag-version\",\r\n \"version:major\": \"npm version major --force --no-git-tag-version\",\r\n \"postversion\": \"pnpm build && pnpm readme\",\r\n \"publish:main\": \"npm publish\",\r\n \"publish:dev\": \"npm publish --tag dev\"\r\n },\r\n \"files\": [\r\n \"dist\"\r\n ],\r\n \"dependencies\": {\r\n \"@darkroom.engineering/tempus\": \"^0.0.46\"\r\n },\r\n \"devDependencies\": {\r\n \"tsup\": \"^8.2.4\",\r\n \"typescript\": \"^5.4.5\"\r\n },\r\n \"peerDependencies\": {\r\n \"react\": \">=17.0.0\",\r\n \"vue\": \">=3.0.0\"\r\n },\r\n \"peerDependenciesMeta\": {\r\n \"react\": {\r\n \"optional\": true\r\n },\r\n \"vue\": {\r\n \"optional\": true\r\n }\r\n },\r\n \"unpkg\": \"./dist/lenis.mjs\",\r\n \"main\": \"./dist/lenis.mjs\",\r\n \"module\": \"./dist/lenis.mjs\",\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"exports\": {\r\n \".\": {\r\n \"types\": \"./dist/lenis.d.ts\",\r\n \"default\": \"./dist/lenis.mjs\"\r\n },\r\n \"./dist/*\": \"./dist/*\",\r\n \"./react\": {\r\n \"types\": \"./dist/lenis-react.d.ts\",\r\n \"default\": \"./dist/lenis-react.mjs\"\r\n },\r\n \"./snap\": {\r\n \"types\": \"./dist/lenis-snap.d.ts\",\r\n \"default\": \"./dist/lenis-snap.mjs\"\r\n },\r\n \"./vue\": {\r\n \"types\": \"./dist/lenis-vue.d.ts\",\r\n \"default\": \"./dist/lenis-vue.mjs\"\r\n }\r\n }\r\n}\r\n","/**\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","export function debounce<CB extends (...args: any[]) => void>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: number | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\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","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 | Element,\r\n private content: HTMLElement | Element,\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","/**\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<CB extends (...args: any[]) => 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<CB extends (...args: any[]) => 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 type { 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// 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<T, F extends keyof T> = Omit<T, F> & Partial<Pick<T, F>>\r\n\r\nexport 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<LenisOptions>,\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 overscroll = true,\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 overscroll,\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 // @ts-ignore\r\n if (event.lenisStopPropagation) 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 )\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 // @ts-ignore\r\n event.lenisStopPropagation = true\r\n return\r\n }\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 if (\r\n !this.options.overscroll ||\r\n this.options.infinite ||\r\n (this.options.wrapper !== window &&\r\n ((this.animatedScroll > 0 && this.animatedScroll < this.limit) ||\r\n (this.animatedScroll === 0 && deltaY > 0) ||\r\n (this.animatedScroll === this.limit && deltaY < 0)))\r\n ) {\r\n // @ts-ignore\r\n event.lenisStopPropagation = true\r\n // event.stopPropagation()\r\n }\r\n\r\n event.preventDefault()\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"],"mappings":"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","names":["lerp","lerp"]}
|