lenis 1.3.4 → 1.3.6
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/LICENSE +8 -8
- package/README.md +34 -28
- package/dist/lenis-react.mjs.map +1 -1
- package/dist/lenis-snap.d.ts +8 -18
- package/dist/lenis-snap.js +16 -21
- package/dist/lenis-snap.js.map +1 -1
- package/dist/lenis-snap.min.js +1 -1
- package/dist/lenis-snap.min.js.map +1 -1
- package/dist/lenis-snap.mjs +16 -21
- package/dist/lenis-snap.mjs.map +1 -1
- package/dist/lenis-vue-nuxt.mjs +14 -1
- package/dist/lenis-vue.d.ts +10 -2
- package/dist/lenis-vue.mjs +2 -1
- package/dist/lenis-vue.mjs.map +1 -1
- package/dist/lenis.d.ts +4 -2
- package/dist/lenis.js +29 -9
- 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 +29 -9
- package/dist/lenis.mjs.map +1 -1
- package/package.json +1 -1
package/dist/lenis-snap.mjs
CHANGED
|
@@ -148,8 +148,9 @@ var Snap = class {
|
|
|
148
148
|
lerp,
|
|
149
149
|
easing,
|
|
150
150
|
duration,
|
|
151
|
-
|
|
152
|
-
|
|
151
|
+
distanceThreshold = "100%",
|
|
152
|
+
velocityThreshold = 1.2,
|
|
153
|
+
debounce: debounceDelay = 50,
|
|
153
154
|
onSnapStart,
|
|
154
155
|
onSnapComplete
|
|
155
156
|
} = {}) {
|
|
@@ -159,6 +160,7 @@ var Snap = class {
|
|
|
159
160
|
lerp,
|
|
160
161
|
easing,
|
|
161
162
|
duration,
|
|
163
|
+
distanceThreshold,
|
|
162
164
|
velocityThreshold,
|
|
163
165
|
debounce: debounceDelay,
|
|
164
166
|
onSnapStart,
|
|
@@ -208,15 +210,7 @@ var Snap = class {
|
|
|
208
210
|
add(value, userData = {}) {
|
|
209
211
|
const id = uid();
|
|
210
212
|
this.snaps.set(id, { value, userData });
|
|
211
|
-
return () => this.
|
|
212
|
-
}
|
|
213
|
-
/**
|
|
214
|
-
* Remove a snap from the snap instance
|
|
215
|
-
*
|
|
216
|
-
* @param id The snap id of the snap to remove
|
|
217
|
-
*/
|
|
218
|
-
remove(id) {
|
|
219
|
-
this.snaps.delete(id);
|
|
213
|
+
return () => this.snaps.delete(id);
|
|
220
214
|
}
|
|
221
215
|
/**
|
|
222
216
|
* Add an element to the snap instance
|
|
@@ -228,15 +222,7 @@ var Snap = class {
|
|
|
228
222
|
addElement(element, options = {}) {
|
|
229
223
|
const id = uid();
|
|
230
224
|
this.elements.set(id, new SnapElement(element, options));
|
|
231
|
-
return () => this.
|
|
232
|
-
}
|
|
233
|
-
/**
|
|
234
|
-
* Remove an element from the snap instance
|
|
235
|
-
*
|
|
236
|
-
* @param id The snap id of the snap element to remove
|
|
237
|
-
*/
|
|
238
|
-
removeElement(id) {
|
|
239
|
-
this.elements.delete(id);
|
|
225
|
+
return () => this.elements.delete(id);
|
|
240
226
|
}
|
|
241
227
|
onWindowResize = () => {
|
|
242
228
|
this.viewport.width = window.innerWidth;
|
|
@@ -286,7 +272,16 @@ var Snap = class {
|
|
|
286
272
|
const distanceToNextSnap = Math.abs(scroll - nextSnap.value);
|
|
287
273
|
const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap;
|
|
288
274
|
const distance = Math.abs(scroll - snap.value);
|
|
289
|
-
|
|
275
|
+
let distanceThreshold;
|
|
276
|
+
const axis = isHorizontal ? "width" : "height";
|
|
277
|
+
if (typeof this.options.distanceThreshold === "string" && this.options.distanceThreshold.endsWith("%")) {
|
|
278
|
+
distanceThreshold = Number(this.options.distanceThreshold.replace("%", "")) / 100 * this.viewport[axis];
|
|
279
|
+
} else if (typeof this.options.distanceThreshold === "number") {
|
|
280
|
+
distanceThreshold = this.options.distanceThreshold;
|
|
281
|
+
} else {
|
|
282
|
+
distanceThreshold = this.viewport[axis];
|
|
283
|
+
}
|
|
284
|
+
if (this.options.type === "mandatory" || this.options.type === "proximity" && distance <= distanceThreshold) {
|
|
290
285
|
this.lenis.scrollTo(snap.value, {
|
|
291
286
|
lerp: this.options.lerp,
|
|
292
287
|
easing: this.options.easing,
|
package/dist/lenis-snap.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/snap/src/debounce.ts","../packages/snap/src/element.ts","../packages/snap/src/uid.ts","../packages/snap/src/snap.ts"],"sourcesContent":["export function debounce<CB extends (...args: any[]) => void>(\n callback: CB,\n delay: number\n) {\n let timer: number | undefined\n return function <T>(this: T, ...args: Parameters<typeof callback>) {\n let context = this\n clearTimeout(timer)\n timer = setTimeout(() => {\n timer = undefined\n callback.apply(context, args)\n }, delay)\n }\n}\n","function removeParentSticky(element: HTMLElement) {\n const position = getComputedStyle(element).position\n\n const isSticky = position === 'sticky'\n\n if (isSticky) {\n element.style.setProperty('position', 'static')\n element.dataset.sticky = 'true'\n }\n\n if (element.offsetParent) {\n removeParentSticky(element.offsetParent as HTMLElement)\n }\n}\n\nfunction addParentSticky(element: HTMLElement) {\n if (element?.dataset?.sticky === 'true') {\n element.style.removeProperty('position')\n delete element.dataset.sticky\n }\n\n if (element.offsetParent) {\n addParentSticky(element.offsetParent as HTMLElement)\n }\n}\n\nfunction offsetTop(element: HTMLElement, accumulator = 0) {\n const top = accumulator + element.offsetTop\n if (element.offsetParent) {\n return offsetTop(element.offsetParent as HTMLElement, top)\n }\n return top\n}\n\nfunction offsetLeft(element: HTMLElement, accumulator = 0) {\n const left = accumulator + element.offsetLeft\n if (element.offsetParent) {\n return offsetLeft(element.offsetParent as HTMLElement, left)\n }\n return left\n}\n\nfunction scrollTop(element: HTMLElement, accumulator = 0) {\n const top = accumulator + element.scrollTop\n if (element.offsetParent) {\n return scrollTop(element.offsetParent as HTMLElement, top)\n }\n return top + window.scrollY\n}\n\nfunction scrollLeft(element: HTMLElement, accumulator = 0) {\n const left = accumulator + element.scrollLeft\n if (element.offsetParent) {\n return scrollLeft(element.offsetParent as HTMLElement, left)\n }\n return left + window.scrollX\n}\n\nexport type SnapElementOptions = {\n align?: string[]\n ignoreSticky?: boolean\n ignoreTransform?: boolean\n}\n\ntype Rect = {\n top: number\n left: number\n width: number\n height: number\n x: number\n y: number\n bottom: number\n right: number\n element: HTMLElement\n}\n\nexport class SnapElement {\n element: HTMLElement\n options: SnapElementOptions\n align: string[]\n // @ts-ignore\n rect: Rect = {}\n wrapperResizeObserver: ResizeObserver\n resizeObserver: ResizeObserver\n\n constructor(\n element: HTMLElement,\n {\n align = ['start'],\n ignoreSticky = true,\n ignoreTransform = false,\n }: SnapElementOptions = {}\n ) {\n this.element = element\n\n this.options = { align, ignoreSticky, ignoreTransform }\n\n // this.ignoreSticky = ignoreSticky\n // this.ignoreTransform = ignoreTransform\n\n this.align = [align].flat()\n\n // TODO: assing rect immediately\n\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\n this.wrapperResizeObserver.observe(document.body)\n this.onWrapperResize()\n\n this.resizeObserver = new ResizeObserver(this.onResize)\n this.resizeObserver.observe(this.element)\n this.setRect({\n width: this.element.offsetWidth,\n height: this.element.offsetHeight,\n })\n }\n\n destroy() {\n this.wrapperResizeObserver.disconnect()\n this.resizeObserver.disconnect()\n }\n\n setRect({\n top,\n left,\n width,\n height,\n element,\n }: {\n top?: number\n left?: number\n width?: number\n height?: number\n element?: HTMLElement\n } = {}) {\n top = top ?? this.rect.top\n left = left ?? this.rect.left\n width = width ?? this.rect.width\n height = height ?? this.rect.height\n element = element ?? this.rect.element\n\n if (\n top === this.rect.top &&\n left === this.rect.left &&\n width === this.rect.width &&\n height === this.rect.height &&\n element === this.rect.element\n )\n return\n\n this.rect.top = top\n this.rect.y = top\n this.rect.width = width\n this.rect.height = height\n this.rect.left = left\n this.rect.x = left\n this.rect.bottom = top + height\n this.rect.right = left + width\n }\n\n onWrapperResize = () => {\n let top, left\n\n if (this.options.ignoreSticky) removeParentSticky(this.element)\n if (this.options.ignoreTransform) {\n top = offsetTop(this.element)\n left = offsetLeft(this.element)\n } else {\n const rect = this.element.getBoundingClientRect()\n top = rect.top + scrollTop(this.element)\n left = rect.left + scrollLeft(this.element)\n }\n if (this.options.ignoreSticky) addParentSticky(this.element)\n\n this.setRect({ top, left })\n }\n\n onResize = ([entry]: ResizeObserverEntry[]) => {\n if (!entry?.borderBoxSize[0]) return\n const width = entry.borderBoxSize[0].inlineSize\n const height = entry.borderBoxSize[0].blockSize\n\n this.setRect({ width, height })\n }\n}\n","let index = 0\n\nexport type UID = number\n\nexport function uid(): UID {\n return index++\n}\n","import type Lenis from 'lenis'\nimport type { UserData } from 'lenis'\nimport { debounce } from './debounce'\nimport type { SnapElementOptions } from './element'\nimport { SnapElement } from './element'\nimport type { SnapItem, SnapOptions } from './types'\nimport type { UID } from './uid'\nimport { uid } from './uid'\n\n// TODO:\n// - horizontal\n// - fix trackpad snapping too soon due to velocity (fuck Apple)\n// - fix wheel scrolling after limits (see console scroll to)\n// - fix touch scroll, do not snap when not released\n// - arrow, spacebar\n\ntype RequiredPick<T, F extends keyof T> = Omit<T, F> & Required<Pick<T, F>>\n\n/**\n * Snap class to handle the snap functionality\n *\n * @example\n * const snap = new Snap(lenis, {\n * type: 'mandatory', // 'mandatory', 'proximity'\n * lerp: 0.1,\n * duration: 1,\n * easing: (t) => t,\n * onSnapStart: (snap) => {\n * console.log('onSnapStart', snap)\n * },\n * onSnapComplete: (snap) => {\n * console.log('onSnapComplete', snap)\n * },\n * })\n *\n * snap.add(500) // snap at 500px\n *\n * const removeSnap = snap.add(500)\n *\n * if (someCondition) {\n * removeSnap()\n * }\n */\nexport class Snap {\n options: RequiredPick<SnapOptions, 'type' | 'velocityThreshold' | 'debounce'>\n elements = new Map<UID, SnapElement>()\n snaps = new Map<UID, SnapItem>()\n viewport = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n isStopped = false\n onSnapDebounced: () => void\n\n constructor(\n private lenis: Lenis,\n {\n type = 'mandatory',\n lerp,\n easing,\n duration,\n velocityThreshold = 1,\n debounce: debounceDelay = 0,\n onSnapStart,\n onSnapComplete,\n }: SnapOptions = {}\n ) {\n this.options = {\n type,\n lerp,\n easing,\n duration,\n velocityThreshold,\n debounce: debounceDelay,\n onSnapStart,\n onSnapComplete,\n }\n\n this.onWindowResize()\n window.addEventListener('resize', this.onWindowResize, false)\n\n this.onSnapDebounced = debounce(this.onSnap, this.options.debounce)\n\n this.lenis.on('scroll', this.onScroll)\n }\n\n /**\n * Destroy the snap instance\n */\n destroy() {\n this.lenis.off('scroll', this.onScroll)\n window.removeEventListener('resize', this.onWindowResize, false)\n this.elements.forEach((element) => element.destroy())\n }\n\n /**\n * Start the snap after it has been stopped\n */\n start() {\n this.isStopped = false\n }\n\n /**\n * Stop the snap\n */\n stop() {\n this.isStopped = true\n }\n\n /**\n * Add a snap to the snap instance\n *\n * @param value The value to snap to\n * @param userData User data that will be forwarded through the snap event\n * @returns Unsubscribe function\n */\n add(value: number, userData: UserData = {}) {\n const id = uid()\n\n this.snaps.set(id, { value, userData })\n\n return () => this.remove(id)\n }\n\n /**\n * Remove a snap from the snap instance\n *\n * @param id The snap id of the snap to remove\n */\n remove(id: UID) {\n this.snaps.delete(id)\n }\n\n /**\n * Add an element to the snap instance\n *\n * @param element The element to add\n * @param options The options for the element\n * @returns Unsubscribe function\n */\n addElement(element: HTMLElement, options = {} as SnapElementOptions) {\n const id = uid()\n\n this.elements.set(id, new SnapElement(element, options))\n\n return () => this.removeElement(id)\n }\n\n /**\n * Remove an element from the snap instance\n *\n * @param id The snap id of the snap element to remove\n */\n removeElement(id: UID) {\n this.elements.delete(id)\n }\n\n private onWindowResize = () => {\n this.viewport.width = window.innerWidth\n this.viewport.height = window.innerHeight\n }\n\n private onScroll = ({\n // scroll,\n // limit,\n lastVelocity,\n velocity,\n // isScrolling,\n userData,\n }: // isHorizontal,\n Lenis) => {\n if (this.isStopped) return\n\n // return\n const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity)\n const isTurningBack =\n Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0\n\n if (\n Math.abs(velocity) < this.options.velocityThreshold &&\n // !isTouching &&\n isDecelerating &&\n !isTurningBack &&\n userData?.initiator !== 'snap'\n ) {\n this.onSnapDebounced()\n }\n }\n\n private onSnap = () => {\n let { scroll, isHorizontal } = this.lenis\n scroll = Math.ceil(this.lenis.scroll)\n\n let snaps = [...this.snaps.values()] as SnapItem[]\n\n this.elements.forEach(({ rect, align }) => {\n let value: number | undefined\n\n align.forEach((align) => {\n if (align === 'start') {\n value = rect.top\n } else if (align === 'center') {\n value = isHorizontal\n ? rect.left + rect.width / 2 - this.viewport.width / 2\n : rect.top + rect.height / 2 - this.viewport.height / 2\n } else if (align === 'end') {\n value = isHorizontal\n ? rect.left + rect.width - this.viewport.width\n : rect.top + rect.height - this.viewport.height\n }\n\n if (typeof value === 'number') {\n snaps.push({ value: Math.ceil(value), userData: {} })\n }\n })\n })\n\n snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\n\n let prevSnap = snaps.findLast(({ value }) => value <= scroll)\n if (prevSnap === undefined) prevSnap = snaps[0]!\n const distanceToPrevSnap = Math.abs(scroll - prevSnap.value)\n\n let nextSnap = snaps.find(({ value }) => value >= scroll)\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]!\n const distanceToNextSnap = Math.abs(scroll - nextSnap.value)\n\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\n\n const distance = Math.abs(scroll - snap.value)\n\n if (\n this.options.type === 'mandatory' ||\n (this.options.type === 'proximity' &&\n distance <=\n (isHorizontal\n ? this.lenis.dimensions.width\n : this.lenis.dimensions.height))\n ) {\n // this.__isScrolling = true\n // this.onSnapStart?.(snap)\n\n // console.log('scroll to')\n\n this.lenis.scrollTo(snap.value, {\n lerp: this.options.lerp,\n easing: this.options.easing,\n duration: this.options.duration,\n userData: { initiator: 'snap' },\n onStart: () => {\n this.options.onSnapStart?.(snap)\n },\n onComplete: () => {\n this.options.onSnapComplete?.(snap)\n },\n })\n }\n\n // console.timeEnd('scroll')\n }\n}\n"],"mappings":"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","names":["align"]}
|
|
1
|
+
{"version":3,"sources":["../packages/snap/src/debounce.ts","../packages/snap/src/element.ts","../packages/snap/src/uid.ts","../packages/snap/src/snap.ts"],"sourcesContent":["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","function removeParentSticky(element: HTMLElement) {\r\n const position = getComputedStyle(element).position\r\n\r\n const isSticky = position === 'sticky'\r\n\r\n if (isSticky) {\r\n element.style.setProperty('position', 'static')\r\n element.dataset.sticky = 'true'\r\n }\r\n\r\n if (element.offsetParent) {\r\n removeParentSticky(element.offsetParent as HTMLElement)\r\n }\r\n}\r\n\r\nfunction addParentSticky(element: HTMLElement) {\r\n if (element?.dataset?.sticky === 'true') {\r\n element.style.removeProperty('position')\r\n delete element.dataset.sticky\r\n }\r\n\r\n if (element.offsetParent) {\r\n addParentSticky(element.offsetParent as HTMLElement)\r\n }\r\n}\r\n\r\nfunction offsetTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.offsetTop\r\n if (element.offsetParent) {\r\n return offsetTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top\r\n}\r\n\r\nfunction offsetLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.offsetLeft\r\n if (element.offsetParent) {\r\n return offsetLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left\r\n}\r\n\r\nfunction scrollTop(element: HTMLElement, accumulator = 0) {\r\n const top = accumulator + element.scrollTop\r\n if (element.offsetParent) {\r\n return scrollTop(element.offsetParent as HTMLElement, top)\r\n }\r\n return top + window.scrollY\r\n}\r\n\r\nfunction scrollLeft(element: HTMLElement, accumulator = 0) {\r\n const left = accumulator + element.scrollLeft\r\n if (element.offsetParent) {\r\n return scrollLeft(element.offsetParent as HTMLElement, left)\r\n }\r\n return left + window.scrollX\r\n}\r\n\r\nexport type SnapElementOptions = {\r\n align?: string | string[]\r\n ignoreSticky?: boolean\r\n ignoreTransform?: boolean\r\n}\r\n\r\ntype Rect = {\r\n top: number\r\n left: number\r\n width: number\r\n height: number\r\n x: number\r\n y: number\r\n bottom: number\r\n right: number\r\n element: HTMLElement\r\n}\r\n\r\nexport class SnapElement {\r\n element: HTMLElement\r\n options: SnapElementOptions\r\n align: string[]\r\n // @ts-ignore\r\n rect: Rect = {}\r\n wrapperResizeObserver: ResizeObserver\r\n resizeObserver: ResizeObserver\r\n\r\n constructor(\r\n element: HTMLElement,\r\n {\r\n align = ['start'],\r\n ignoreSticky = true,\r\n ignoreTransform = false,\r\n }: SnapElementOptions = {}\r\n ) {\r\n this.element = element\r\n\r\n this.options = { align, ignoreSticky, ignoreTransform }\r\n\r\n // this.ignoreSticky = ignoreSticky\r\n // this.ignoreTransform = ignoreTransform\r\n\r\n this.align = [align].flat()\r\n\r\n // TODO: assing rect immediately\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.onWrapperResize)\r\n this.wrapperResizeObserver.observe(document.body)\r\n this.onWrapperResize()\r\n\r\n this.resizeObserver = new ResizeObserver(this.onResize)\r\n this.resizeObserver.observe(this.element)\r\n this.setRect({\r\n width: this.element.offsetWidth,\r\n height: this.element.offsetHeight,\r\n })\r\n }\r\n\r\n destroy() {\r\n this.wrapperResizeObserver.disconnect()\r\n this.resizeObserver.disconnect()\r\n }\r\n\r\n setRect({\r\n top,\r\n left,\r\n width,\r\n height,\r\n element,\r\n }: {\r\n top?: number\r\n left?: number\r\n width?: number\r\n height?: number\r\n element?: HTMLElement\r\n } = {}) {\r\n top = top ?? this.rect.top\r\n left = left ?? this.rect.left\r\n width = width ?? this.rect.width\r\n height = height ?? this.rect.height\r\n element = element ?? this.rect.element\r\n\r\n if (\r\n top === this.rect.top &&\r\n left === this.rect.left &&\r\n width === this.rect.width &&\r\n height === this.rect.height &&\r\n element === this.rect.element\r\n )\r\n return\r\n\r\n this.rect.top = top\r\n this.rect.y = top\r\n this.rect.width = width\r\n this.rect.height = height\r\n this.rect.left = left\r\n this.rect.x = left\r\n this.rect.bottom = top + height\r\n this.rect.right = left + width\r\n }\r\n\r\n onWrapperResize = () => {\r\n let top, left\r\n\r\n if (this.options.ignoreSticky) removeParentSticky(this.element)\r\n if (this.options.ignoreTransform) {\r\n top = offsetTop(this.element)\r\n left = offsetLeft(this.element)\r\n } else {\r\n const rect = this.element.getBoundingClientRect()\r\n top = rect.top + scrollTop(this.element)\r\n left = rect.left + scrollLeft(this.element)\r\n }\r\n if (this.options.ignoreSticky) addParentSticky(this.element)\r\n\r\n this.setRect({ top, left })\r\n }\r\n\r\n onResize = ([entry]: ResizeObserverEntry[]) => {\r\n if (!entry?.borderBoxSize[0]) return\r\n const width = entry.borderBoxSize[0].inlineSize\r\n const height = entry.borderBoxSize[0].blockSize\r\n\r\n this.setRect({ width, height })\r\n }\r\n}\r\n","let index = 0\r\n\r\nexport type UID = number\r\n\r\nexport function uid(): UID {\r\n return index++\r\n}\r\n","import type Lenis from 'lenis'\r\nimport type { UserData } from 'lenis'\r\nimport { debounce } from './debounce'\r\nimport type { SnapElementOptions } from './element'\r\nimport { SnapElement } from './element'\r\nimport type { SnapItem, SnapOptions } from './types'\r\nimport type { UID } from './uid'\r\nimport { uid } from './uid'\r\n\r\n// TODO:\r\n// - horizontal\r\n// - fix trackpad snapping too soon due to velocity (fuck Apple)\r\n// - fix wheel scrolling after limits (see console scroll to)\r\n// - fix touch scroll, do not snap when not released\r\n// - arrow, spacebar\r\n\r\ntype RequiredPick<T, F extends keyof T> = Omit<T, F> & Required<Pick<T, F>>\r\n\r\n/**\r\n * Snap class to handle the snap functionality\r\n *\r\n * @example\r\n * const snap = new Snap(lenis, {\r\n * type: 'mandatory', // 'mandatory', 'proximity'\r\n * lerp: 0.1,\r\n * duration: 1,\r\n * easing: (t) => t,\r\n * onSnapStart: (snap) => {\r\n * console.log('onSnapStart', snap)\r\n * },\r\n * onSnapComplete: (snap) => {\r\n * console.log('onSnapComplete', snap)\r\n * },\r\n * })\r\n *\r\n * snap.add(500) // snap at 500px\r\n *\r\n * const removeSnap = snap.add(500)\r\n *\r\n * if (someCondition) {\r\n * removeSnap()\r\n * }\r\n */\r\nexport class Snap {\r\n options: RequiredPick<SnapOptions, 'type' | 'velocityThreshold' | 'debounce'>\r\n elements = new Map<UID, SnapElement>()\r\n snaps = new Map<UID, SnapItem>()\r\n viewport = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n isStopped = false\r\n onSnapDebounced: () => void\r\n\r\n constructor(\r\n private lenis: Lenis,\r\n {\r\n type = 'mandatory',\r\n lerp,\r\n easing,\r\n duration,\r\n distanceThreshold = '100%',\r\n velocityThreshold = 1.2,\r\n debounce: debounceDelay = 50,\r\n onSnapStart,\r\n onSnapComplete,\r\n }: SnapOptions = {}\r\n ) {\r\n this.options = {\r\n type,\r\n lerp,\r\n easing,\r\n duration,\r\n distanceThreshold,\r\n velocityThreshold,\r\n debounce: debounceDelay,\r\n onSnapStart,\r\n onSnapComplete,\r\n }\r\n\r\n this.onWindowResize()\r\n window.addEventListener('resize', this.onWindowResize, false)\r\n\r\n this.onSnapDebounced = debounce(this.onSnap, this.options.debounce)\r\n\r\n this.lenis.on('scroll', this.onScroll)\r\n }\r\n\r\n /**\r\n * Destroy the snap instance\r\n */\r\n destroy() {\r\n this.lenis.off('scroll', this.onScroll)\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n this.elements.forEach((element) => element.destroy())\r\n }\r\n\r\n /**\r\n * Start the snap after it has been stopped\r\n */\r\n start() {\r\n this.isStopped = false\r\n }\r\n\r\n /**\r\n * Stop the snap\r\n */\r\n stop() {\r\n this.isStopped = true\r\n }\r\n\r\n /**\r\n * Add a snap to the snap instance\r\n *\r\n * @param value The value to snap to\r\n * @param userData User data that will be forwarded through the snap event\r\n * @returns Unsubscribe function\r\n */\r\n add(value: number, userData: UserData = {}) {\r\n const id = uid()\r\n\r\n this.snaps.set(id, { value, userData })\r\n\r\n return () => this.snaps.delete(id)\r\n }\r\n\r\n /**\r\n * Add an element to the snap instance\r\n *\r\n * @param element The element to add\r\n * @param options The options for the element\r\n * @returns Unsubscribe function\r\n */\r\n addElement(element: HTMLElement, options: SnapElementOptions = {}) {\r\n const id = uid()\r\n\r\n this.elements.set(id, new SnapElement(element, options))\r\n\r\n return () => this.elements.delete(id)\r\n }\r\n\r\n private onWindowResize = () => {\r\n this.viewport.width = window.innerWidth\r\n this.viewport.height = window.innerHeight\r\n }\r\n\r\n private onScroll = ({\r\n // scroll,\r\n // limit,\r\n lastVelocity,\r\n velocity,\r\n // isScrolling,\r\n userData,\r\n }: // isHorizontal,\r\n Lenis) => {\r\n if (this.isStopped) return\r\n\r\n // return\r\n const isDecelerating = Math.abs(lastVelocity) > Math.abs(velocity)\r\n const isTurningBack =\r\n Math.sign(lastVelocity) !== Math.sign(velocity) && velocity !== 0\r\n\r\n if (\r\n Math.abs(velocity) < this.options.velocityThreshold &&\r\n // !isTouching &&\r\n isDecelerating &&\r\n !isTurningBack &&\r\n userData?.initiator !== 'snap'\r\n ) {\r\n this.onSnapDebounced()\r\n }\r\n }\r\n\r\n private onSnap = () => {\r\n let { scroll, isHorizontal } = this.lenis\r\n scroll = Math.ceil(this.lenis.scroll)\r\n\r\n let snaps = [...this.snaps.values()] as SnapItem[]\r\n\r\n this.elements.forEach(({ rect, align }) => {\r\n let value: number | undefined\r\n\r\n align.forEach((align) => {\r\n if (align === 'start') {\r\n value = rect.top\r\n } else if (align === 'center') {\r\n value = isHorizontal\r\n ? rect.left + rect.width / 2 - this.viewport.width / 2\r\n : rect.top + rect.height / 2 - this.viewport.height / 2\r\n } else if (align === 'end') {\r\n value = isHorizontal\r\n ? rect.left + rect.width - this.viewport.width\r\n : rect.top + rect.height - this.viewport.height\r\n }\r\n\r\n if (typeof value === 'number') {\r\n snaps.push({ value: Math.ceil(value), userData: {} })\r\n }\r\n })\r\n })\r\n\r\n snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\r\n\r\n let prevSnap = snaps.findLast(({ value }) => value <= scroll)\r\n if (prevSnap === undefined) prevSnap = snaps[0]!\r\n const distanceToPrevSnap = Math.abs(scroll - prevSnap.value)\r\n\r\n let nextSnap = snaps.find(({ value }) => value >= scroll)\r\n if (nextSnap === undefined) nextSnap = snaps[snaps.length - 1]!\r\n const distanceToNextSnap = Math.abs(scroll - nextSnap.value)\r\n\r\n const snap = distanceToPrevSnap < distanceToNextSnap ? prevSnap : nextSnap\r\n\r\n const distance = Math.abs(scroll - snap.value)\r\n\r\n let distanceThreshold\r\n\r\n const axis = isHorizontal ? 'width' : 'height'\r\n\r\n if (\r\n typeof this.options.distanceThreshold === 'string' &&\r\n this.options.distanceThreshold.endsWith('%')\r\n ) {\r\n distanceThreshold =\r\n (Number(this.options.distanceThreshold.replace('%', '')) / 100) *\r\n this.viewport[axis]\r\n } else if (typeof this.options.distanceThreshold === 'number') {\r\n distanceThreshold = this.options.distanceThreshold\r\n } else {\r\n distanceThreshold = this.viewport[axis]\r\n }\r\n\r\n if (\r\n this.options.type === 'mandatory' ||\r\n (this.options.type === 'proximity' && distance <= distanceThreshold)\r\n ) {\r\n // this.__isScrolling = true\r\n // this.onSnapStart?.(snap)\r\n\r\n // console.log('scroll to')\r\n\r\n this.lenis.scrollTo(snap.value, {\r\n lerp: this.options.lerp,\r\n easing: this.options.easing,\r\n duration: this.options.duration,\r\n userData: { initiator: 'snap' },\r\n onStart: () => {\r\n this.options.onSnapStart?.(snap)\r\n },\r\n onComplete: () => {\r\n this.options.onSnapComplete?.(snap)\r\n },\r\n })\r\n }\r\n\r\n // console.timeEnd('scroll')\r\n }\r\n}\r\n"],"mappings":"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","names":["align"]}
|
package/dist/lenis-vue-nuxt.mjs
CHANGED
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
// packages/vue/nuxt/module.ts
|
|
2
|
-
import {
|
|
2
|
+
import {
|
|
3
|
+
addComponent,
|
|
4
|
+
addImports,
|
|
5
|
+
addPlugin,
|
|
6
|
+
createResolver,
|
|
7
|
+
defineNuxtModule
|
|
8
|
+
} from "@nuxt/kit";
|
|
3
9
|
export * from "lenis/vue";
|
|
4
10
|
var nuxtModule = defineNuxtModule({
|
|
5
11
|
meta: {
|
|
@@ -14,6 +20,13 @@ var nuxtModule = defineNuxtModule({
|
|
|
14
20
|
src: resolve("./nuxt/runtime/lenis.mjs"),
|
|
15
21
|
name: "lenis"
|
|
16
22
|
});
|
|
23
|
+
addImports({ name: "useLenis", from: "lenis/vue" });
|
|
24
|
+
addComponent({
|
|
25
|
+
name: "VueLenis",
|
|
26
|
+
filePath: "lenis/vue",
|
|
27
|
+
global: true,
|
|
28
|
+
export: "VueLenis"
|
|
29
|
+
});
|
|
17
30
|
}
|
|
18
31
|
});
|
|
19
32
|
var module_default = nuxtModule;
|
package/dist/lenis-vue.d.ts
CHANGED
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
import * as Lenis from 'lenis';
|
|
2
2
|
import Lenis__default, { ScrollCallback } from 'lenis';
|
|
3
3
|
import * as vue from 'vue';
|
|
4
|
-
import { PropType, HTMLAttributes
|
|
4
|
+
import { Plugin, PropType, HTMLAttributes } from 'vue';
|
|
5
5
|
|
|
6
|
-
|
|
6
|
+
type LenisExposed = {
|
|
7
|
+
wrapper?: HTMLDivElement;
|
|
8
|
+
content?: HTMLDivElement;
|
|
9
|
+
lenis?: Lenis__default;
|
|
10
|
+
};
|
|
11
|
+
declare const VueLenisImpl: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
7
12
|
root: {
|
|
8
13
|
type: PropType<boolean>;
|
|
9
14
|
default: boolean;
|
|
@@ -47,6 +52,9 @@ declare const VueLenis: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
|
47
52
|
autoRaf: boolean;
|
|
48
53
|
options: Lenis.LenisOptions | undefined;
|
|
49
54
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
55
|
+
declare const VueLenis: typeof VueLenisImpl & {
|
|
56
|
+
new (): LenisExposed;
|
|
57
|
+
};
|
|
50
58
|
declare const vueLenisPlugin: Plugin;
|
|
51
59
|
declare module '@vue/runtime-core' {
|
|
52
60
|
interface GlobalComponents {
|
package/dist/lenis-vue.mjs
CHANGED
|
@@ -21,7 +21,7 @@ var globalRemoveCallback = shallowRef();
|
|
|
21
21
|
var LenisSymbol = Symbol("LenisContext");
|
|
22
22
|
var AddCallbackSymbol = Symbol("AddCallback");
|
|
23
23
|
var RemoveCallbackSymbol = Symbol("RemoveCallback");
|
|
24
|
-
var
|
|
24
|
+
var VueLenisImpl = defineComponent({
|
|
25
25
|
name: "VueLenis",
|
|
26
26
|
props: {
|
|
27
27
|
root: {
|
|
@@ -120,6 +120,7 @@ var VueLenis = defineComponent({
|
|
|
120
120
|
};
|
|
121
121
|
}
|
|
122
122
|
});
|
|
123
|
+
var VueLenis = VueLenisImpl;
|
|
123
124
|
var vueLenisPlugin = (app) => {
|
|
124
125
|
app.component("vue-lenis", VueLenis);
|
|
125
126
|
app.provide(LenisSymbol, shallowRef2(void 0));
|
package/dist/lenis-vue.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../packages/vue/src/provider.ts","../packages/vue/src/store.ts","../packages/vue/src/use-lenis.ts"],"sourcesContent":["// import Tempus from '@darkroom.engineering/tempus'\nimport Lenis, { type ScrollCallback } from 'lenis'\nimport type {\n HTMLAttributes,\n InjectionKey,\n Plugin,\n PropType,\n ShallowRef,\n} from 'vue'\nimport {\n defineComponent,\n h,\n onWatcherCleanup,\n provide,\n reactive,\n ref,\n shallowRef,\n watch,\n} from 'vue'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport const LenisSymbol: InjectionKey<ShallowRef<Lenis | undefined>> =\n Symbol('LenisContext')\nexport const AddCallbackSymbol: InjectionKey<\n (callback: any, priority: number) => void\n> = Symbol('AddCallback')\nexport const RemoveCallbackSymbol: InjectionKey<(callback: any) => void> =\n Symbol('RemoveCallback')\n\nexport const VueLenis = defineComponent({\n name: 'VueLenis',\n props: {\n root: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n autoRaf: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n options: {\n type: Object as PropType<ConstructorParameters<typeof Lenis>[0]>,\n default: () => ({}),\n },\n props: {\n type: Object as PropType<HTMLAttributes>,\n default: () => ({}),\n },\n },\n setup(props, { slots, expose }) {\n const lenisRef = shallowRef<Lenis>()\n // const tempusCleanupRef = shallowRef<() => void>()\n const wrapper = ref<HTMLDivElement>()\n const content = ref<HTMLDivElement>()\n // Setup exposed properties\n expose({\n lenis: lenisRef,\n wrapper,\n content,\n })\n\n // Sync options\n watch(\n [() => props.options, wrapper, content],\n () => {\n const isClient = typeof window !== 'undefined'\n\n if (!isClient) return\n\n if (!props.root && (!wrapper.value || !content.value)) return\n\n lenisRef.value = new Lenis({\n ...props.options,\n ...(!props.root\n ? {\n wrapper: wrapper.value,\n content: content.value,\n }\n : {}),\n autoRaf: props.options?.autoRaf ?? props.autoRaf,\n })\n\n onWatcherCleanup(() => {\n lenisRef.value?.destroy()\n lenisRef.value = undefined\n })\n },\n { deep: true, immediate: true }\n )\n\n const callbacks = reactive<\n { callback: ScrollCallback; priority: number }[]\n >([])\n\n function addCallback(callback: ScrollCallback, priority: number) {\n callbacks.push({ callback, priority })\n callbacks.sort((a, b) => a.priority - b.priority)\n }\n\n function removeCallback(callback: ScrollCallback) {\n callbacks.splice(\n callbacks.findIndex((cb) => cb.callback === callback),\n 1\n )\n }\n\n const onScroll: ScrollCallback = (data) => {\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]?.callback(data)\n }\n }\n\n watch(\n [lenisRef, () => props.root],\n ([lenis, root]) => {\n lenis?.on('scroll', onScroll)\n\n if (root) {\n globalLenis.value = lenis\n globalAddCallback.value = addCallback\n globalRemoveCallback.value = removeCallback\n\n onWatcherCleanup(() => {\n globalLenis.value = undefined\n globalAddCallback.value = undefined\n globalRemoveCallback.value = undefined\n })\n }\n },\n { immediate: true }\n )\n\n if (!props.root) {\n provide(LenisSymbol, lenisRef)\n provide(AddCallbackSymbol, addCallback)\n provide(RemoveCallbackSymbol, removeCallback)\n }\n\n return () => {\n if (props.root) {\n return slots.default?.()\n } else {\n return h('div', { ref: wrapper, ...props?.props }, [\n h('div', { ref: content }, slots.default?.()),\n ])\n }\n }\n },\n})\n\nexport const vueLenisPlugin: Plugin = (app) => {\n app.component('vue-lenis', VueLenis)\n // Setup a global provide to silence top level useLenis injection warning\n app.provide(LenisSymbol, shallowRef(undefined))\n app.provide(AddCallbackSymbol, undefined as any)\n app.provide(RemoveCallbackSymbol, undefined as any)\n}\n\n// @ts-ignore\ndeclare module '@vue/runtime-core' {\n export interface GlobalComponents {\n 'vue-lenis': typeof VueLenis\n }\n}\n","import type Lenis from 'lenis'\nimport type { ScrollCallback } from 'lenis'\nimport { shallowRef } from 'vue'\n\nexport const globalLenis = shallowRef<Lenis>()\nexport const globalAddCallback =\n shallowRef<(callback: ScrollCallback, priority: number) => void>()\nexport const globalRemoveCallback =\n shallowRef<(callback: ScrollCallback) => void>()\n","import type { ScrollCallback } from 'lenis'\nimport { computed, inject, nextTick, onWatcherCleanup, watch } from 'vue'\nimport {\n AddCallbackSymbol,\n LenisSymbol,\n RemoveCallbackSymbol,\n} from './provider'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport function useLenis(callback?: ScrollCallback, priority = 0) {\n const lenisInjection = inject(LenisSymbol)\n const addCallbackInjection = inject(AddCallbackSymbol)\n const removeCallbackInjection = inject(RemoveCallbackSymbol)\n\n const addCallback = computed(() =>\n addCallbackInjection ? addCallbackInjection : globalAddCallback.value\n )\n const removeCallback = computed(() =>\n removeCallbackInjection\n ? removeCallbackInjection\n : globalRemoveCallback.value\n )\n\n const lenis = computed(() =>\n lenisInjection?.value ? lenisInjection.value : globalLenis.value\n )\n\n if (typeof window !== 'undefined') {\n // Wait two ticks to make sure the lenis instance is mounted\n nextTick(() => {\n nextTick(() => {\n if (!lenis.value) {\n console.warn(\n 'No lenis instance found, either mount a root lenis instance or wrap your component in a lenis provider'\n )\n }\n })\n })\n }\n\n watch(\n [lenis, addCallback, removeCallback],\n ([lenis, addCallback, removeCallback]) => {\n if (!lenis || !addCallback || !removeCallback || !callback) return\n\n addCallback?.(callback, priority)\n callback?.(lenis as any)\n\n onWatcherCleanup(() => {\n removeCallback?.(callback)\n })\n },\n {\n immediate: true,\n }\n )\n return lenis\n}\n"],"mappings":"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","names":["shallowRef","shallowRef","onWatcherCleanup","watch","watch","lenis","addCallback","removeCallback","onWatcherCleanup"]}
|
|
1
|
+
{"version":3,"sources":["../packages/vue/src/provider.ts","../packages/vue/src/store.ts","../packages/vue/src/use-lenis.ts"],"sourcesContent":["// import Tempus from '@darkroom.engineering/tempus'\nimport Lenis, { type ScrollCallback } from 'lenis'\nimport type {\n HTMLAttributes,\n InjectionKey,\n Plugin,\n PropType,\n ShallowRef,\n ToRefs,\n} from 'vue'\nimport {\n defineComponent,\n h,\n onWatcherCleanup,\n provide,\n reactive,\n ref,\n shallowRef,\n watch,\n} from 'vue'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport const LenisSymbol: InjectionKey<ShallowRef<Lenis | undefined>> =\n Symbol('LenisContext')\nexport const AddCallbackSymbol: InjectionKey<\n (callback: any, priority: number) => void\n> = Symbol('AddCallback')\nexport const RemoveCallbackSymbol: InjectionKey<(callback: any) => void> =\n Symbol('RemoveCallback')\n\nexport type LenisExposed = {\n wrapper?: HTMLDivElement\n content?: HTMLDivElement\n lenis?: Lenis\n}\n\nconst VueLenisImpl = defineComponent({\n name: 'VueLenis',\n props: {\n root: {\n type: Boolean as PropType<boolean>,\n default: false,\n },\n autoRaf: {\n type: Boolean as PropType<boolean>,\n default: true,\n },\n options: {\n type: Object as PropType<ConstructorParameters<typeof Lenis>[0]>,\n default: () => ({}),\n },\n props: {\n type: Object as PropType<HTMLAttributes>,\n default: () => ({}),\n },\n },\n setup(props, { slots, expose }) {\n const lenisRef = shallowRef<Lenis>()\n // const tempusCleanupRef = shallowRef<() => void>()\n const wrapper = ref<HTMLDivElement>()\n const content = ref<HTMLDivElement>()\n // Setup exposed properties\n expose<ToRefs<LenisExposed>>({\n lenis: lenisRef,\n wrapper,\n content,\n })\n\n // Sync options\n watch(\n [() => props.options, wrapper, content],\n () => {\n const isClient = typeof window !== 'undefined'\n\n if (!isClient) return\n\n if (!props.root && (!wrapper.value || !content.value)) return\n\n lenisRef.value = new Lenis({\n ...props.options,\n ...(!props.root\n ? {\n wrapper: wrapper.value,\n content: content.value,\n }\n : {}),\n autoRaf: props.options?.autoRaf ?? props.autoRaf,\n })\n\n onWatcherCleanup(() => {\n lenisRef.value?.destroy()\n lenisRef.value = undefined\n })\n },\n { deep: true, immediate: true }\n )\n\n const callbacks = reactive<\n { callback: ScrollCallback; priority: number }[]\n >([])\n\n function addCallback(callback: ScrollCallback, priority: number) {\n callbacks.push({ callback, priority })\n callbacks.sort((a, b) => a.priority - b.priority)\n }\n\n function removeCallback(callback: ScrollCallback) {\n callbacks.splice(\n callbacks.findIndex((cb) => cb.callback === callback),\n 1\n )\n }\n\n const onScroll: ScrollCallback = (data) => {\n for (let i = 0; i < callbacks.length; i++) {\n callbacks[i]?.callback(data)\n }\n }\n\n watch(\n [lenisRef, () => props.root],\n ([lenis, root]) => {\n lenis?.on('scroll', onScroll)\n\n if (root) {\n globalLenis.value = lenis\n globalAddCallback.value = addCallback\n globalRemoveCallback.value = removeCallback\n\n onWatcherCleanup(() => {\n globalLenis.value = undefined\n globalAddCallback.value = undefined\n globalRemoveCallback.value = undefined\n })\n }\n },\n { immediate: true }\n )\n\n if (!props.root) {\n provide(LenisSymbol, lenisRef)\n provide(AddCallbackSymbol, addCallback)\n provide(RemoveCallbackSymbol, removeCallback)\n }\n\n return () => {\n if (props.root) {\n return slots.default?.()\n } else {\n return h('div', { ref: wrapper, ...props?.props }, [\n h('div', { ref: content }, slots.default?.()),\n ])\n }\n }\n },\n})\n\nexport const VueLenis = VueLenisImpl as typeof VueLenisImpl & {\n new (): LenisExposed\n}\n\nexport const vueLenisPlugin: Plugin = (app) => {\n app.component('vue-lenis', VueLenis)\n // Setup a global provide to silence top level useLenis injection warning\n app.provide(LenisSymbol, shallowRef(undefined))\n app.provide(AddCallbackSymbol, undefined as any)\n app.provide(RemoveCallbackSymbol, undefined as any)\n}\n\n// @ts-ignore\ndeclare module '@vue/runtime-core' {\n export interface GlobalComponents {\n 'vue-lenis': typeof VueLenis\n }\n}\n","import type Lenis from 'lenis'\r\nimport type { ScrollCallback } from 'lenis'\r\nimport { shallowRef } from 'vue'\r\n\r\nexport const globalLenis = shallowRef<Lenis>()\r\nexport const globalAddCallback =\r\n shallowRef<(callback: ScrollCallback, priority: number) => void>()\r\nexport const globalRemoveCallback =\r\n shallowRef<(callback: ScrollCallback) => void>()\r\n","import type { ScrollCallback } from 'lenis'\nimport { computed, inject, nextTick, onWatcherCleanup, watch } from 'vue'\nimport {\n AddCallbackSymbol,\n LenisSymbol,\n RemoveCallbackSymbol,\n} from './provider'\nimport { globalAddCallback, globalLenis, globalRemoveCallback } from './store'\n\nexport function useLenis(callback?: ScrollCallback, priority = 0) {\n const lenisInjection = inject(LenisSymbol)\n const addCallbackInjection = inject(AddCallbackSymbol)\n const removeCallbackInjection = inject(RemoveCallbackSymbol)\n\n const addCallback = computed(() =>\n addCallbackInjection ? addCallbackInjection : globalAddCallback.value\n )\n const removeCallback = computed(() =>\n removeCallbackInjection\n ? removeCallbackInjection\n : globalRemoveCallback.value\n )\n\n const lenis = computed(() =>\n lenisInjection?.value ? lenisInjection.value : globalLenis.value\n )\n\n if (typeof window !== 'undefined') {\n // Wait two ticks to make sure the lenis instance is mounted\n nextTick(() => {\n nextTick(() => {\n if (!lenis.value) {\n console.warn(\n 'No lenis instance found, either mount a root lenis instance or wrap your component in a lenis provider'\n )\n }\n })\n })\n }\n\n watch(\n [lenis, addCallback, removeCallback],\n ([lenis, addCallback, removeCallback]) => {\n if (!lenis || !addCallback || !removeCallback || !callback) return\n\n addCallback?.(callback, priority)\n callback?.(lenis as any)\n\n onWatcherCleanup(() => {\n removeCallback?.(callback)\n })\n },\n {\n immediate: true,\n }\n )\n return lenis\n}\n"],"mappings":"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","names":["shallowRef","shallowRef","onWatcherCleanup","watch","watch","lenis","addCallback","removeCallback","onWatcherCleanup"]}
|
package/dist/lenis.d.ts
CHANGED
|
@@ -159,7 +159,7 @@ type LenisOptions = {
|
|
|
159
159
|
* Manage the the strength of `syncTouch` inertia
|
|
160
160
|
* @default 35
|
|
161
161
|
*/
|
|
162
|
-
|
|
162
|
+
touchInertiaExponent?: number;
|
|
163
163
|
/**
|
|
164
164
|
* Scroll duration in seconds
|
|
165
165
|
*/
|
|
@@ -304,7 +304,7 @@ declare class Lenis {
|
|
|
304
304
|
private readonly emitter;
|
|
305
305
|
readonly dimensions: Dimensions;
|
|
306
306
|
private readonly virtualScroll;
|
|
307
|
-
constructor({ wrapper, content, eventsTarget, smoothWheel, syncTouch, syncTouchLerp,
|
|
307
|
+
constructor({ wrapper, content, eventsTarget, smoothWheel, syncTouch, syncTouchLerp, touchInertiaExponent, duration, // in seconds
|
|
308
308
|
easing, lerp, infinite, orientation, // vertical, horizontal
|
|
309
309
|
gestureOrientation, // vertical, horizontal, both
|
|
310
310
|
touchMultiplier, wheelMultiplier, autoResize, prevent, virtualScroll, overscroll, autoRaf, anchors, autoToggle, // https://caniuse.com/?search=transition-behavior
|
|
@@ -348,10 +348,12 @@ declare class Lenis {
|
|
|
348
348
|
* Start lenis scroll after it has been stopped
|
|
349
349
|
*/
|
|
350
350
|
start(): void;
|
|
351
|
+
private internalStart;
|
|
351
352
|
/**
|
|
352
353
|
* Stop lenis scroll
|
|
353
354
|
*/
|
|
354
355
|
stop(): void;
|
|
356
|
+
private internalStop;
|
|
355
357
|
/**
|
|
356
358
|
* RequestAnimationFrame for lenis
|
|
357
359
|
*
|
package/dist/lenis.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// package.json
|
|
2
|
-
var version = "1.3.
|
|
2
|
+
var version = "1.3.6";
|
|
3
3
|
|
|
4
4
|
// packages/core/src/maths.ts
|
|
5
5
|
function clamp(min, input, max) {
|
|
@@ -395,7 +395,7 @@ var Lenis = class {
|
|
|
395
395
|
smoothWheel = true,
|
|
396
396
|
syncTouch = false,
|
|
397
397
|
syncTouchLerp = 0.075,
|
|
398
|
-
|
|
398
|
+
touchInertiaExponent = 1.7,
|
|
399
399
|
duration,
|
|
400
400
|
// in seconds
|
|
401
401
|
easing,
|
|
@@ -434,7 +434,7 @@ var Lenis = class {
|
|
|
434
434
|
smoothWheel,
|
|
435
435
|
syncTouch,
|
|
436
436
|
syncTouchLerp,
|
|
437
|
-
|
|
437
|
+
touchInertiaExponent,
|
|
438
438
|
duration,
|
|
439
439
|
easing,
|
|
440
440
|
lerp: lerp2,
|
|
@@ -547,9 +547,9 @@ var Lenis = class {
|
|
|
547
547
|
const property = this.isHorizontal ? "overflow-x" : "overflow-y";
|
|
548
548
|
const overflow = getComputedStyle(this.rootElement)[property];
|
|
549
549
|
if (["hidden", "clip"].includes(overflow)) {
|
|
550
|
-
this.
|
|
550
|
+
this.internalStop();
|
|
551
551
|
} else {
|
|
552
|
-
this.
|
|
552
|
+
this.internalStart();
|
|
553
553
|
}
|
|
554
554
|
}
|
|
555
555
|
};
|
|
@@ -610,7 +610,9 @@ var Lenis = class {
|
|
|
610
610
|
))
|
|
611
611
|
return;
|
|
612
612
|
if (this.isStopped || this.isLocked) {
|
|
613
|
-
event.
|
|
613
|
+
if (event.cancelable) {
|
|
614
|
+
event.preventDefault();
|
|
615
|
+
}
|
|
614
616
|
return;
|
|
615
617
|
}
|
|
616
618
|
const isSmooth = this.options.syncTouch && isTouch || this.options.smoothWheel && isWheel;
|
|
@@ -629,12 +631,14 @@ var Lenis = class {
|
|
|
629
631
|
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)) {
|
|
630
632
|
event.lenisStopPropagation = true;
|
|
631
633
|
}
|
|
632
|
-
event.
|
|
634
|
+
if (event.cancelable) {
|
|
635
|
+
event.preventDefault();
|
|
636
|
+
}
|
|
633
637
|
const isSyncTouch = isTouch && this.options.syncTouch;
|
|
634
638
|
const isTouchEnd = isTouch && event.type === "touchend";
|
|
635
|
-
const hasTouchInertia = isTouchEnd
|
|
639
|
+
const hasTouchInertia = isTouchEnd;
|
|
636
640
|
if (hasTouchInertia) {
|
|
637
|
-
delta = this.velocity * this.options.
|
|
641
|
+
delta = Math.sign(this.velocity) * Math.pow(Math.abs(this.velocity), this.options.touchInertiaExponent);
|
|
638
642
|
}
|
|
639
643
|
this.scrollTo(this.targetScroll + delta, {
|
|
640
644
|
programmatic: false,
|
|
@@ -701,6 +705,14 @@ var Lenis = class {
|
|
|
701
705
|
* Start lenis scroll after it has been stopped
|
|
702
706
|
*/
|
|
703
707
|
start() {
|
|
708
|
+
if (!this.isStopped) return;
|
|
709
|
+
if (this.options.autoToggle) {
|
|
710
|
+
this.rootElement.style.removeProperty("overflow");
|
|
711
|
+
return;
|
|
712
|
+
}
|
|
713
|
+
this.internalStart();
|
|
714
|
+
}
|
|
715
|
+
internalStart() {
|
|
704
716
|
if (!this.isStopped) return;
|
|
705
717
|
this.reset();
|
|
706
718
|
this.isStopped = false;
|
|
@@ -710,6 +722,14 @@ var Lenis = class {
|
|
|
710
722
|
* Stop lenis scroll
|
|
711
723
|
*/
|
|
712
724
|
stop() {
|
|
725
|
+
if (this.isStopped) return;
|
|
726
|
+
if (this.options.autoToggle) {
|
|
727
|
+
this.rootElement.style.setProperty("overflow", "clip");
|
|
728
|
+
return;
|
|
729
|
+
}
|
|
730
|
+
this.internalStop();
|
|
731
|
+
}
|
|
732
|
+
internalStop() {
|
|
713
733
|
if (this.isStopped) return;
|
|
714
734
|
this.reset();
|
|
715
735
|
this.isStopped = true;
|