lenis 1.3.17-framer → 1.3.18-dev.0

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.
@@ -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>(\r\n callback: CB,\r\n delay: number\r\n) {\r\n let timer: ReturnType<typeof setTimeout> | undefined\r\n return function <T>(this: T, ...args: Parameters<typeof callback>): void {\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\nfunction 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 debouncedWrapperResize: () => void\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.align = [align].flat()\r\n\r\n this.debouncedWrapperResize = debounce(this.onWrapperResize, 500)\r\n\r\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedWrapperResize)\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\n\nexport type UID = number\n\nexport function uid(): UID {\n return index++\n}\n","import type Lenis from 'lenis'\r\nimport type { VirtualScrollData } 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// - fix wheel scrolling after limits (see console scroll to)\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' or 'lock'\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' | 'debounce'>\r\n elements = new Map<UID, SnapElement>()\r\n snaps = new Map<UID, SnapItem>()\r\n viewport: { width: number; height: number } = {\r\n width: window.innerWidth,\r\n height: window.innerHeight,\r\n }\r\n isStopped = false\r\n onSnapDebounced: (e: VirtualScrollData) => void\r\n currentSnapIndex?: number\r\n\r\n constructor(\r\n private lenis: Lenis,\r\n {\r\n type = 'proximity',\r\n lerp,\r\n easing,\r\n duration,\r\n distanceThreshold = '50%', // useless when type is \"mandatory\"\r\n debounce: debounceDelay = 500,\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 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('virtual-scroll', this.onSnapDebounced)\r\n }\r\n\r\n /**\r\n * Destroy the snap instance\r\n */\r\n destroy() {\r\n this.lenis.off('virtual-scroll', this.onSnapDebounced)\r\n window.removeEventListener('resize', this.onWindowResize, false)\r\n this.elements.forEach((element) => {\r\n element.destroy()\r\n })\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): () => void {\r\n const id = uid()\r\n\r\n this.snaps.set(id, { value })\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(\r\n element: HTMLElement,\r\n options: SnapElementOptions = {}\r\n ): () => void {\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 addElements(\r\n elements: HTMLElement[],\r\n options: SnapElementOptions = {}\r\n ): () => void {\r\n const map = [...elements].map((element) =>\r\n this.addElement(element, options)\r\n )\r\n return () => {\r\n map.forEach((remove) => {\r\n remove()\r\n })\r\n }\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 computeSnaps = () => {\r\n const { isHorizontal } = this.lenis\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) })\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 return snaps\r\n }\r\n\r\n previous() {\r\n this.goTo((this.currentSnapIndex ?? 0) - 1)\r\n }\r\n\r\n next() {\r\n this.goTo((this.currentSnapIndex ?? 0) + 1)\r\n }\r\n\r\n goTo(index: number) {\r\n const snaps = this.computeSnaps()\r\n\r\n if (snaps.length === 0) return\r\n\r\n this.currentSnapIndex = Math.max(0, Math.min(index, snaps.length - 1))\r\n\r\n const currentSnap = snaps[this.currentSnapIndex]\r\n if (currentSnap === undefined) return\r\n\r\n this.lenis.scrollTo(currentSnap.value, {\r\n duration: this.options.duration,\r\n easing: this.options.easing,\r\n lerp: this.options.lerp,\r\n lock: this.options.type === 'lock',\r\n userData: { initiator: 'snap' },\r\n onStart: () => {\r\n this.options.onSnapStart?.({\r\n index: this.currentSnapIndex,\r\n ...currentSnap,\r\n })\r\n },\r\n onComplete: () => {\r\n this.options.onSnapComplete?.({\r\n index: this.currentSnapIndex,\r\n ...currentSnap,\r\n })\r\n },\r\n })\r\n }\r\n\r\n get distanceThreshold() {\r\n let distanceThreshold = Infinity\r\n if (this.options.type === 'mandatory') return Infinity\r\n\r\n const { isHorizontal } = this.lenis\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 return distanceThreshold\r\n }\r\n\r\n private onSnap = (e: VirtualScrollData) => {\r\n if (this.isStopped) return\r\n\r\n if (e.event.type === 'touchmove') return\r\n\r\n if (\r\n this.options.type === 'lock' &&\r\n this.lenis.userData?.initiator === 'snap'\r\n )\r\n return\r\n\r\n let { scroll, isHorizontal } = this.lenis\r\n const delta = isHorizontal ? e.deltaX : e.deltaY\r\n scroll = Math.ceil(this.lenis.scroll + delta)\r\n\r\n const snaps = this.computeSnaps()\r\n\r\n if (snaps.length === 0) return\r\n\r\n let snapIndex\r\n\r\n const prevSnapIndex = snaps.findLastIndex(({ value }) => value < scroll)\r\n const nextSnapIndex = snaps.findIndex(({ value }) => value > scroll)\r\n\r\n if (this.options.type === 'lock') {\r\n if (delta > 0) {\r\n snapIndex = nextSnapIndex\r\n } else if (delta < 0) {\r\n snapIndex = prevSnapIndex\r\n }\r\n } else {\r\n const prevSnap = snaps[prevSnapIndex]!\r\n const distanceToPrevSnap = prevSnap\r\n ? Math.abs(scroll - prevSnap.value)\r\n : Infinity\r\n\r\n const nextSnap = snaps[nextSnapIndex]!\r\n const distanceToNextSnap = nextSnap\r\n ? Math.abs(scroll - nextSnap.value)\r\n : Infinity\r\n snapIndex =\r\n distanceToPrevSnap < distanceToNextSnap ? prevSnapIndex : nextSnapIndex\r\n }\r\n\r\n if (snapIndex === undefined) return\r\n if (snapIndex === -1) return\r\n\r\n snapIndex = Math.max(0, Math.min(snapIndex, snaps.length - 1))\r\n\r\n const snap = snaps[snapIndex]!\r\n\r\n const distance = Math.abs(scroll - snap.value)\r\n\r\n if (distance <= this.distanceThreshold) {\r\n this.goTo(snapIndex)\r\n }\r\n }\r\n\r\n resize() {\r\n this.elements.forEach((element) => element.onWrapperResize())\r\n }\r\n}\r\n"],"mappings":"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","names":["align","index"]}
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: unknown[]) => void>(\n callback: CB,\n delay: number\n) {\n let timer: ReturnType<typeof setTimeout> | undefined\n return function <T>(this: T, ...args: Parameters<typeof callback>): void {\n clearTimeout(timer)\n timer = setTimeout(() => {\n timer = undefined\n callback.apply(this, args)\n }, delay)\n }\n}\n","import { debounce } from './debounce'\n\nfunction 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 | 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-expect-error\n rect: Rect = {}\n wrapperResizeObserver: ResizeObserver\n resizeObserver: ResizeObserver\n debouncedWrapperResize: () => void\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.align = [align].flat()\n\n this.debouncedWrapperResize = debounce(this.onWrapperResize, 500)\n\n this.wrapperResizeObserver = new ResizeObserver(this.debouncedWrapperResize)\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: number | undefined\n let left: number | undefined\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 { VirtualScrollData } 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// - fix wheel scrolling after limits (see console scroll to)\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' or 'lock'\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' | 'debounce'>\n elements = new Map<UID, SnapElement>()\n snaps = new Map<UID, SnapItem>()\n viewport: { width: number; height: number } = {\n width: window.innerWidth,\n height: window.innerHeight,\n }\n isStopped = false\n onSnapDebounced: (e: VirtualScrollData) => void\n currentSnapIndex?: number\n\n constructor(\n private lenis: Lenis,\n {\n type = 'proximity',\n lerp,\n easing,\n duration,\n distanceThreshold = '50%', // useless when type is \"mandatory\"\n debounce: debounceDelay = 500,\n onSnapStart,\n onSnapComplete,\n }: SnapOptions = {}\n ) {\n this.options = {\n type,\n lerp,\n easing,\n duration,\n distanceThreshold,\n debounce: debounceDelay,\n onSnapStart,\n onSnapComplete,\n }\n\n this.onWindowResize()\n window.addEventListener('resize', this.onWindowResize, false)\n\n this.onSnapDebounced = debounce(\n this.onSnap as (...args: unknown[]) => void,\n this.options.debounce\n )\n\n this.lenis.on('virtual-scroll', this.onSnapDebounced)\n }\n\n /**\n * Destroy the snap instance\n */\n destroy() {\n this.lenis.off('virtual-scroll', this.onSnapDebounced)\n window.removeEventListener('resize', this.onWindowResize, false)\n this.elements.forEach((element) => {\n element.destroy()\n })\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): () => void {\n const id = uid()\n\n this.snaps.set(id, { value })\n\n return () => 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(\n element: HTMLElement,\n options: SnapElementOptions = {}\n ): () => void {\n const id = uid()\n\n this.elements.set(id, new SnapElement(element, options))\n\n return () => this.elements.delete(id)\n }\n\n addElements(\n elements: HTMLElement[],\n options: SnapElementOptions = {}\n ): () => void {\n const map = [...elements].map((element) =>\n this.addElement(element, options)\n )\n return () => {\n map.forEach((remove) => {\n remove()\n })\n }\n }\n\n private onWindowResize = () => {\n this.viewport.width = window.innerWidth\n this.viewport.height = window.innerHeight\n }\n\n private computeSnaps = () => {\n const { isHorizontal } = this.lenis\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) })\n }\n })\n })\n\n snaps = snaps.sort((a, b) => Math.abs(a.value) - Math.abs(b.value))\n\n return snaps\n }\n\n previous() {\n this.goTo((this.currentSnapIndex ?? 0) - 1)\n }\n\n next() {\n this.goTo((this.currentSnapIndex ?? 0) + 1)\n }\n\n goTo(index: number) {\n const snaps = this.computeSnaps()\n\n if (snaps.length === 0) return\n\n this.currentSnapIndex = Math.max(0, Math.min(index, snaps.length - 1))\n\n const currentSnap = snaps[this.currentSnapIndex]\n if (currentSnap === undefined) return\n\n this.lenis.scrollTo(currentSnap.value, {\n duration: this.options.duration,\n easing: this.options.easing,\n lerp: this.options.lerp,\n lock: this.options.type === 'lock',\n userData: { initiator: 'snap' },\n onStart: () => {\n this.options.onSnapStart?.({\n index: this.currentSnapIndex,\n ...currentSnap,\n })\n },\n onComplete: () => {\n this.options.onSnapComplete?.({\n index: this.currentSnapIndex,\n ...currentSnap,\n })\n },\n })\n }\n\n get distanceThreshold() {\n let distanceThreshold = Number.POSITIVE_INFINITY\n if (this.options.type === 'mandatory') return Number.POSITIVE_INFINITY\n\n const { isHorizontal } = this.lenis\n\n const axis = isHorizontal ? 'width' : 'height'\n\n if (\n typeof this.options.distanceThreshold === 'string' &&\n this.options.distanceThreshold.endsWith('%')\n ) {\n distanceThreshold =\n (Number(this.options.distanceThreshold.replace('%', '')) / 100) *\n this.viewport[axis]\n } else if (typeof this.options.distanceThreshold === 'number') {\n distanceThreshold = this.options.distanceThreshold\n } else {\n distanceThreshold = this.viewport[axis]\n }\n\n return distanceThreshold\n }\n\n private onSnap = (e: VirtualScrollData) => {\n if (this.isStopped) return\n\n if (e.event.type === 'touchmove') return\n\n if (\n this.options.type === 'lock' &&\n this.lenis.userData?.initiator === 'snap'\n )\n return\n\n let { scroll, isHorizontal } = this.lenis\n const delta = isHorizontal ? e.deltaX : e.deltaY\n scroll = Math.ceil(this.lenis.scroll + delta)\n\n const snaps = this.computeSnaps()\n\n if (snaps.length === 0) return\n\n let snapIndex: number | undefined\n\n const prevSnapIndex = snaps.findLastIndex(({ value }) => value < scroll)\n const nextSnapIndex = snaps.findIndex(({ value }) => value > scroll)\n\n if (this.options.type === 'lock') {\n if (delta > 0) {\n snapIndex = nextSnapIndex\n } else if (delta < 0) {\n snapIndex = prevSnapIndex\n }\n } else {\n const prevSnap = snaps[prevSnapIndex]!\n const distanceToPrevSnap = prevSnap\n ? Math.abs(scroll - prevSnap.value)\n : Number.POSITIVE_INFINITY\n\n const nextSnap = snaps[nextSnapIndex]!\n const distanceToNextSnap = nextSnap\n ? Math.abs(scroll - nextSnap.value)\n : Number.POSITIVE_INFINITY\n snapIndex =\n distanceToPrevSnap < distanceToNextSnap ? prevSnapIndex : nextSnapIndex\n }\n\n if (snapIndex === undefined) return\n if (snapIndex === -1) return\n\n snapIndex = Math.max(0, Math.min(snapIndex, snaps.length - 1))\n\n const snap = snaps[snapIndex]!\n\n const distance = Math.abs(scroll - snap.value)\n\n if (distance <= this.distanceThreshold) {\n this.goTo(snapIndex)\n }\n }\n\n resize() {\n this.elements.forEach((element) => {\n element.onWrapperResize()\n })\n }\n}\n"],"mappings":"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","names":["align","index"]}
@@ -1,7 +1,7 @@
1
1
  import * as Lenis from 'lenis';
2
2
  import Lenis__default, { ScrollCallback } from 'lenis';
3
3
  import * as vue from 'vue';
4
- import { Plugin, PropType, HTMLAttributes } from 'vue';
4
+ import { PropType, HTMLAttributes, Plugin } from 'vue';
5
5
 
6
6
  type LenisExposed = {
7
7
  wrapper?: HTMLDivElement;
@@ -18,9 +18,9 @@ var globalAddCallback = shallowRef();
18
18
  var globalRemoveCallback = shallowRef();
19
19
 
20
20
  // packages/vue/src/provider.ts
21
- var LenisSymbol = Symbol("LenisContext");
22
- var AddCallbackSymbol = Symbol("AddCallback");
23
- var RemoveCallbackSymbol = Symbol("RemoveCallback");
21
+ var LenisSymbol = /* @__PURE__ */ Symbol("LenisContext");
22
+ var AddCallbackSymbol = /* @__PURE__ */ Symbol("AddCallback");
23
+ var RemoveCallbackSymbol = /* @__PURE__ */ Symbol("RemoveCallback");
24
24
  var VueLenisImpl = defineComponent({
25
25
  name: "VueLenis",
26
26
  props: {
@@ -55,7 +55,7 @@ var VueLenisImpl = defineComponent({
55
55
  () => {
56
56
  const isClient = typeof window !== "undefined";
57
57
  if (!isClient) return;
58
- if (!props.root && (!wrapper.value || !content.value)) return;
58
+ if (!(props.root || wrapper.value && content.value)) return;
59
59
  lenisRef.value = new Lenis({
60
60
  ...props.options,
61
61
  ...!props.root ? {
@@ -83,8 +83,8 @@ var VueLenisImpl = defineComponent({
83
83
  );
84
84
  }
85
85
  const onScroll = (data) => {
86
- for (let i = 0; i < callbacks.length; i++) {
87
- callbacks[i]?.callback(data);
86
+ for (const { callback } of callbacks) {
87
+ callback(data);
88
88
  }
89
89
  };
90
90
  watch(
@@ -112,11 +112,10 @@ var VueLenisImpl = defineComponent({
112
112
  return () => {
113
113
  if (props.root) {
114
114
  return slots.default?.();
115
- } else {
116
- return h("div", { ref: wrapper, ...props?.props }, [
117
- h("div", { ref: content }, slots.default?.())
118
- ]);
119
115
  }
116
+ return h("div", { ref: wrapper, ...props?.props }, [
117
+ h("div", { ref: content }, slots.default?.())
118
+ ]);
120
119
  };
121
120
  }
122
121
  });
@@ -157,7 +156,7 @@ function useLenis(callback, priority = 0) {
157
156
  watch2(
158
157
  [lenis, addCallback, removeCallback],
159
158
  ([lenis2, addCallback2, removeCallback2]) => {
160
- if (!lenis2 || !addCallback2 || !removeCallback2 || !callback) return;
159
+ if (!(lenis2 && addCallback2 && removeCallback2 && callback)) return;
161
160
  addCallback2?.(callback, priority);
162
161
  callback?.(lenis2);
163
162
  onWatcherCleanup2(() => {
@@ -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 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'\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 // @ts-ignore - import.meta.env is available in vite and nuxt\n if (!lenis.value && import.meta.env.DEV) {\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: ScrollCallback, priority: number) => void) | undefined\n> = Symbol('AddCallback')\nexport const RemoveCallbackSymbol: InjectionKey<\n ((callback: ScrollCallback) => void) | undefined\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 (const { callback } of callbacks) {\n 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 }\n return h('div', { ref: wrapper, ...props?.props }, [\n h('div', { ref: content }, slots.default?.()),\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)\n app.provide(RemoveCallbackSymbol, undefined)\n}\n\n// @ts-expect-error\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 // @ts-expect-error - import.meta.env is available in vite and nuxt\n if (!lenis.value && import.meta.env.DEV) {\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!)\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
@@ -58,7 +58,7 @@ type FromToOptions = {
58
58
  */
59
59
  onUpdate?: OnUpdateCallback;
60
60
  };
61
- type UserData = Record<string, any>;
61
+ type UserData = Record<string, unknown>;
62
62
  type Scrolling = boolean | 'native' | 'smooth';
63
63
  type LenisEvent = 'scroll' | 'virtual-scroll';
64
64
  type ScrollCallback = (lenis: Lenis) => void;
@@ -237,6 +237,10 @@ type LenisOptions = {
237
237
  * @default false
238
238
  */
239
239
  allowNestedScroll?: boolean;
240
+ /**
241
+ * @deprecated use `naiveDimensions` instead
242
+ */
243
+ __experimental__naiveDimensions?: boolean;
240
244
  /**
241
245
  * If `true`, Lenis will use naive dimensions calculation, be careful this has a performance impact
242
246
  * @default false
@@ -296,7 +300,7 @@ declare class Lenis {
296
300
  /**
297
301
  * The options passed to the lenis instance
298
302
  */
299
- options: OptionalPick<Required<LenisOptions>, 'duration' | 'easing' | 'prevent' | 'virtualScroll'>;
303
+ options: OptionalPick<Required<LenisOptions>, 'duration' | 'easing' | 'prevent' | 'virtualScroll' | '__experimental__naiveDimensions'>;
300
304
  /**
301
305
  * The target scroll value
302
306
  */
@@ -387,7 +391,7 @@ declare class Lenis {
387
391
  * },
388
392
  * })
389
393
  */
390
- scrollTo(target: number | string | HTMLElement, { offset, immediate, lock, programmatic, // called from outside of the class
394
+ scrollTo(_target: number | string | HTMLElement, { offset, immediate, lock, programmatic, // called from outside of the class
391
395
  lerp, duration, easing, onStart, onComplete, force, // scroll even if stopped
392
396
  userData, }?: ScrollToOptions): void;
393
397
  private preventNextNativeScrollEvent;
package/dist/lenis.js CHANGED
@@ -1,5 +1,5 @@
1
1
  // package.json
2
- var version = "1.3.17-framer";
2
+ var version = "1.3.18-dev.0";
3
3
 
4
4
  // packages/core/src/maths.ts
5
5
  function clamp(min, input, max) {
@@ -85,11 +85,10 @@ var Animate = class {
85
85
  function debounce(callback, delay) {
86
86
  let timer;
87
87
  return function(...args) {
88
- let context = this;
89
88
  clearTimeout(timer);
90
89
  timer = setTimeout(() => {
91
90
  timer = void 0;
92
- callback.apply(context, args);
91
+ callback.apply(this, args);
93
92
  }, delay);
94
93
  };
95
94
  }
@@ -166,7 +165,7 @@ var Emitter = class {
166
165
  * @param args Data to pass to the event handlers
167
166
  */
168
167
  emit(event, ...args) {
169
- let callbacks = this.events[event] || [];
168
+ const callbacks = this.events[event] || [];
170
169
  for (let i = 0, length = callbacks.length; i < length; i++) {
171
170
  callbacks[i]?.(...args);
172
171
  }
@@ -178,7 +177,11 @@ var Emitter = class {
178
177
  * @returns Unsubscribe function
179
178
  */
180
179
  on(event, cb) {
181
- this.events[event]?.push(cb) || (this.events[event] = [cb]);
180
+ if (this.events[event]) {
181
+ this.events[event].push(cb);
182
+ } else {
183
+ this.events[event] = [cb];
184
+ }
182
185
  return () => {
183
186
  this.events[event] = this.events[event]?.filter((i) => cb !== i);
184
187
  };
@@ -202,6 +205,11 @@ var Emitter = class {
202
205
  // packages/core/src/virtual-scroll.ts
203
206
  var LINE_HEIGHT = 100 / 6;
204
207
  var listenerOptions = { passive: false };
208
+ function getDeltaMultiplier(deltaMode, size) {
209
+ if (deltaMode === 1) return LINE_HEIGHT;
210
+ if (deltaMode === 2) return size;
211
+ return 1;
212
+ }
205
213
  var VirtualScroll = class {
206
214
  constructor(element, options = { wheelMultiplier: 1, touchMultiplier: 1 }) {
207
215
  this.element = element;
@@ -310,8 +318,8 @@ var VirtualScroll = class {
310
318
  /** Event handler for 'wheel' event */
311
319
  onWheel = (event) => {
312
320
  let { deltaX, deltaY, deltaMode } = event;
313
- const multiplierX = deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.width : 1;
314
- const multiplierY = deltaMode === 1 ? LINE_HEIGHT : deltaMode === 2 ? this.window.height : 1;
321
+ const multiplierX = getDeltaMultiplier(deltaMode, this.window.width);
322
+ const multiplierY = getDeltaMultiplier(deltaMode, this.window.height);
315
323
  deltaX *= multiplierX;
316
324
  deltaY *= multiplierY;
317
325
  deltaX *= this.options.wheelMultiplier;
@@ -327,7 +335,7 @@ var VirtualScroll = class {
327
335
  };
328
336
 
329
337
  // packages/core/src/lenis.ts
330
- var defaultEasing = (t) => Math.min(1, 1.001 - Math.pow(2, -10 * t));
338
+ var defaultEasing = (t) => Math.min(1, 1.001 - 2 ** (-10 * t));
331
339
  var Lenis = class {
332
340
  _isScrolling = false;
333
341
  // true when scroll is animating
@@ -416,7 +424,6 @@ var Lenis = class {
416
424
  autoToggle = false,
417
425
  // https://caniuse.com/?search=transition-behavior
418
426
  allowNestedScroll = false,
419
- // @ts-ignore: this will be deprecated in the future
420
427
  __experimental__naiveDimensions = false,
421
428
  naiveDimensions = __experimental__naiveDimensions,
422
429
  stopInertiaOnNavigate = false
@@ -625,7 +632,7 @@ var Lenis = class {
625
632
  let composedPath = event.composedPath();
626
633
  composedPath = composedPath.slice(0, composedPath.indexOf(this.rootElement));
627
634
  const prevent = this.options.prevent;
628
- if (!!composedPath.find(
635
+ if (composedPath.find(
629
636
  (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") || this.options.allowNestedScroll && this.checkNestedScroll(node, { deltaX, deltaY }))
630
637
  ))
631
638
  return;
@@ -658,7 +665,7 @@ var Lenis = class {
658
665
  const isTouchEnd = isTouch && event.type === "touchend";
659
666
  const hasTouchInertia = isTouchEnd;
660
667
  if (hasTouchInertia) {
661
- delta = Math.sign(this.velocity) * Math.pow(Math.abs(this.velocity), this.options.touchInertiaExponent);
668
+ delta = Math.sign(this.velocity) * Math.abs(this.velocity) ** this.options.touchInertiaExponent;
662
669
  }
663
670
  this.scrollTo(this.targetScroll + delta, {
664
671
  programmatic: false,
@@ -787,7 +794,7 @@ var Lenis = class {
787
794
  * },
788
795
  * })
789
796
  */
790
- scrollTo(target, {
797
+ scrollTo(_target, {
791
798
  offset = 0,
792
799
  immediate = false,
793
800
  lock = false,
@@ -803,12 +810,14 @@ var Lenis = class {
803
810
  userData
804
811
  } = {}) {
805
812
  if ((this.isStopped || this.isLocked) && !force) return;
813
+ let target = _target;
814
+ let adjustedOffset = offset;
806
815
  if (typeof target === "string" && ["top", "left", "start", "#"].includes(target)) {
807
816
  target = 0;
808
817
  } else if (typeof target === "string" && ["bottom", "right", "end"].includes(target)) {
809
818
  target = this.limit;
810
819
  } else {
811
- let node;
820
+ let node = null;
812
821
  if (typeof target === "string") {
813
822
  node = document.querySelector(target);
814
823
  if (!node) {
@@ -824,23 +833,23 @@ var Lenis = class {
824
833
  if (node) {
825
834
  if (this.options.wrapper !== window) {
826
835
  const wrapperRect = this.rootElement.getBoundingClientRect();
827
- offset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top;
836
+ adjustedOffset -= this.isHorizontal ? wrapperRect.left : wrapperRect.top;
828
837
  }
829
838
  const rect = node.getBoundingClientRect();
830
839
  target = (this.isHorizontal ? rect.left : rect.top) + this.animatedScroll;
831
840
  }
832
841
  }
833
842
  if (typeof target !== "number") return;
834
- target += offset;
843
+ target += adjustedOffset;
835
844
  target = Math.round(target);
836
845
  if (this.options.infinite) {
837
846
  if (programmatic) {
838
847
  this.targetScroll = this.animatedScroll = this.scroll;
839
848
  const distance = target - this.animatedScroll;
840
849
  if (distance > this.limit / 2) {
841
- target = target - this.limit;
850
+ target -= this.limit;
842
851
  } else if (distance < -this.limit / 2) {
843
- target = target + this.limit;
852
+ target += this.limit;
844
853
  }
845
854
  }
846
855
  } else {
@@ -914,8 +923,16 @@ var Lenis = class {
914
923
  }
915
924
  checkNestedScroll(node, { deltaX, deltaY }) {
916
925
  const time = Date.now();
917
- const cache = node._lenis ??= {};
918
- let hasOverflowX, hasOverflowY, isScrollableX, isScrollableY, scrollWidth, scrollHeight, clientWidth, clientHeight;
926
+ if (!node._lenis) node._lenis = {};
927
+ const cache = node._lenis;
928
+ let hasOverflowX;
929
+ let hasOverflowY;
930
+ let isScrollableX;
931
+ let isScrollableY;
932
+ let scrollWidth;
933
+ let scrollHeight;
934
+ let clientWidth;
935
+ let clientHeight;
919
936
  const gestureOrientation = this.options.gestureOrientation;
920
937
  if (time - (cache.time ?? 0) > 2e3) {
921
938
  cache.time = Date.now();
@@ -927,7 +944,7 @@ var Lenis = class {
927
944
  hasOverflowY = ["auto", "overlay", "scroll"].includes(overflowYString);
928
945
  cache.hasOverflowX = hasOverflowX;
929
946
  cache.hasOverflowY = hasOverflowY;
930
- if (!hasOverflowX && !hasOverflowY) return false;
947
+ if (!(hasOverflowX || hasOverflowY)) return false;
931
948
  if (gestureOrientation === "vertical" && !hasOverflowY) return false;
932
949
  if (gestureOrientation === "horizontal" && !hasOverflowX) return false;
933
950
  scrollWidth = node.scrollWidth;
@@ -952,12 +969,12 @@ var Lenis = class {
952
969
  clientWidth = cache.clientWidth;
953
970
  clientHeight = cache.clientHeight;
954
971
  }
955
- if (!hasOverflowX && !hasOverflowY || !isScrollableX && !isScrollableY) {
972
+ if (!((hasOverflowX || hasOverflowY) && (isScrollableX || isScrollableY))) {
956
973
  return false;
957
974
  }
958
- if (gestureOrientation === "vertical" && (!hasOverflowY || !isScrollableY))
975
+ if (gestureOrientation === "vertical" && !(hasOverflowY && isScrollableY))
959
976
  return false;
960
- if (gestureOrientation === "horizontal" && (!hasOverflowX || !isScrollableX))
977
+ if (gestureOrientation === "horizontal" && !(hasOverflowX && isScrollableX))
961
978
  return false;
962
979
  let orientation;
963
980
  if (gestureOrientation === "horizontal") {
@@ -975,7 +992,11 @@ var Lenis = class {
975
992
  }
976
993
  }
977
994
  if (!orientation) return false;
978
- let scroll, maxScroll, delta, hasOverflow, isScrollable;
995
+ let scroll;
996
+ let maxScroll;
997
+ let delta;
998
+ let hasOverflow;
999
+ let isScrollable;
979
1000
  if (orientation === "x") {
980
1001
  scroll = node.scrollLeft;
981
1002
  maxScroll = scrollWidth - clientWidth;
@@ -1007,12 +1028,10 @@ var Lenis = class {
1007
1028
  if (this.options.naiveDimensions) {
1008
1029
  if (this.isHorizontal) {
1009
1030
  return this.rootElement.scrollWidth - this.rootElement.clientWidth;
1010
- } else {
1011
- return this.rootElement.scrollHeight - this.rootElement.clientHeight;
1012
1031
  }
1013
- } else {
1014
- return this.dimensions.limit[this.isHorizontal ? "x" : "y"];
1032
+ return this.rootElement.scrollHeight - this.rootElement.clientHeight;
1015
1033
  }
1034
+ return this.dimensions.limit[this.isHorizontal ? "x" : "y"];
1016
1035
  }
1017
1036
  /**
1018
1037
  * Whether or not the scroll is horizontal