lenis 1.3.19-dev.0 → 1.3.20-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.
- package/LICENSE +8 -8
- package/README.md +2 -2
- package/dist/lenis-react.d.ts +58 -60
- package/dist/lenis-react.mjs +185 -156
- package/dist/lenis-react.mjs.map +1 -1
- package/dist/lenis-snap.d.ts +145 -122
- package/dist/lenis-snap.js +339 -358
- package/dist/lenis-snap.js.map +1 -1
- package/dist/lenis-snap.min.js +2 -1
- package/dist/lenis-snap.min.js.map +1 -1
- package/dist/lenis-snap.mjs +313 -342
- package/dist/lenis-snap.mjs.map +1 -1
- package/dist/lenis-vue-nuxt.mjs +27 -33
- package/dist/lenis-vue.d.ts +54 -52
- package/dist/lenis-vue.mjs +136 -172
- package/dist/lenis-vue.mjs.map +1 -1
- package/dist/lenis.css +26 -1
- package/dist/lenis.d.ts +468 -421
- package/dist/lenis.js +1021 -1120
- package/dist/lenis.js.map +1 -1
- package/dist/lenis.min.js +2 -1
- package/dist/lenis.min.js.map +1 -1
- package/dist/lenis.mjs +992 -1105
- package/dist/lenis.mjs.map +1 -1
- package/dist/nuxt/runtime/lenis.mjs +8 -13
- package/package.json +13 -11
- package/dist/nuxt/runtime/lenis.d.ts +0 -5
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: 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 if (!window.lenis) {\n window.lenis = {}\n }\n\n window.lenis.snap = true\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)\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)\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":";AAAO,SAAS,SACd,UACA,OACA;AACA,MAAI;AACJ,SAAO,YAAyB,MAAyC;AACvE,iBAAa,KAAK;AAClB,YAAQ,WAAW,MAAM;AACvB,cAAQ;AACR,eAAS,MAAM,MAAM,IAAI;AAAA,IAC3B,GAAG,KAAK;AAAA,EACV;AACF;;;ACVA,SAAS,mBAAmB,SAAsB;AAChD,QAAM,WAAW,iBAAiB,OAAO,EAAE;AAE3C,QAAM,WAAW,aAAa;AAE9B,MAAI,UAAU;AACZ,YAAQ,MAAM,YAAY,YAAY,QAAQ;AAC9C,YAAQ,QAAQ,SAAS;AAAA,EAC3B;AAEA,MAAI,QAAQ,cAAc;AACxB,uBAAmB,QAAQ,YAA2B;AAAA,EACxD;AACF;AAEA,SAAS,gBAAgB,SAAsB;AAC7C,MAAI,SAAS,SAAS,WAAW,QAAQ;AACvC,YAAQ,MAAM,eAAe,UAAU;AACvC,WAAO,QAAQ,QAAQ;AAAA,EACzB;AAEA,MAAI,QAAQ,cAAc;AACxB,oBAAgB,QAAQ,YAA2B;AAAA,EACrD;AACF;AAEA,SAAS,UAAU,SAAsB,cAAc,GAAG;AACxD,QAAM,MAAM,cAAc,QAAQ;AAClC,MAAI,QAAQ,cAAc;AACxB,WAAO,UAAU,QAAQ,cAA6B,GAAG;AAAA,EAC3D;AACA,SAAO;AACT;AAEA,SAAS,WAAW,SAAsB,cAAc,GAAG;AACzD,QAAM,OAAO,cAAc,QAAQ;AACnC,MAAI,QAAQ,cAAc;AACxB,WAAO,WAAW,QAAQ,cAA6B,IAAI;AAAA,EAC7D;AACA,SAAO;AACT;AAEA,SAAS,UAAU,SAAsB,cAAc,GAAG;AACxD,QAAM,MAAM,cAAc,QAAQ;AAClC,MAAI,QAAQ,cAAc;AACxB,WAAO,UAAU,QAAQ,cAA6B,GAAG;AAAA,EAC3D;AACA,SAAO,MAAM,OAAO;AACtB;AAEA,SAAS,WAAW,SAAsB,cAAc,GAAG;AACzD,QAAM,OAAO,cAAc,QAAQ;AACnC,MAAI,QAAQ,cAAc;AACxB,WAAO,WAAW,QAAQ,cAA6B,IAAI;AAAA,EAC7D;AACA,SAAO,OAAO,OAAO;AACvB;AAoBO,IAAM,cAAN,MAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EACA;AAAA;AAAA,EAEA,OAAa,CAAC;AAAA,EACd;AAAA,EACA;AAAA,EACA;AAAA,EAEA,YACE,SACA;AAAA,IACE,QAAQ,CAAC,OAAO;AAAA,IAChB,eAAe;AAAA,IACf,kBAAkB;AAAA,EACpB,IAAwB,CAAC,GACzB;AACA,SAAK,UAAU;AAEf,SAAK,UAAU,EAAE,OAAO,cAAc,gBAAgB;AAEtD,SAAK,QAAQ,CAAC,KAAK,EAAE,KAAK;AAE1B,SAAK,yBAAyB,SAAS,KAAK,iBAAiB,GAAG;AAEhE,SAAK,wBAAwB,IAAI,eAAe,KAAK,sBAAsB;AAC3E,SAAK,sBAAsB,QAAQ,SAAS,IAAI;AAChD,SAAK,gBAAgB;AAErB,SAAK,iBAAiB,IAAI,eAAe,KAAK,QAAQ;AACtD,SAAK,eAAe,QAAQ,KAAK,OAAO;AACxC,SAAK,QAAQ;AAAA,MACX,OAAO,KAAK,QAAQ;AAAA,MACpB,QAAQ,KAAK,QAAQ;AAAA,IACvB,CAAC;AAAA,EACH;AAAA,EAEA,UAAU;AACR,SAAK,sBAAsB,WAAW;AACtC,SAAK,eAAe,WAAW;AAAA,EACjC;AAAA,EAEA,QAAQ;AAAA,IACN;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,IACA;AAAA,EACF,IAMI,CAAC,GAAG;AACN,UAAM,OAAO,KAAK,KAAK;AACvB,WAAO,QAAQ,KAAK,KAAK;AACzB,YAAQ,SAAS,KAAK,KAAK;AAC3B,aAAS,UAAU,KAAK,KAAK;AAC7B,cAAU,WAAW,KAAK,KAAK;AAE/B,QACE,QAAQ,KAAK,KAAK,OAClB,SAAS,KAAK,KAAK,QACnB,UAAU,KAAK,KAAK,SACpB,WAAW,KAAK,KAAK,UACrB,YAAY,KAAK,KAAK;AAEtB;AAEF,SAAK,KAAK,MAAM;AAChB,SAAK,KAAK,IAAI;AACd,SAAK,KAAK,QAAQ;AAClB,SAAK,KAAK,SAAS;AACnB,SAAK,KAAK,OAAO;AACjB,SAAK,KAAK,IAAI;AACd,SAAK,KAAK,SAAS,MAAM;AACzB,SAAK,KAAK,QAAQ,OAAO;AAAA,EAC3B;AAAA,EAEA,kBAAkB,MAAM;AACtB,QAAI;AACJ,QAAI;AAEJ,QAAI,KAAK,QAAQ,aAAc,oBAAmB,KAAK,OAAO;AAC9D,QAAI,KAAK,QAAQ,iBAAiB;AAChC,YAAM,UAAU,KAAK,OAAO;AAC5B,aAAO,WAAW,KAAK,OAAO;AAAA,IAChC,OAAO;AACL,YAAM,OAAO,KAAK,QAAQ,sBAAsB;AAChD,YAAM,KAAK,MAAM,UAAU,KAAK,OAAO;AACvC,aAAO,KAAK,OAAO,WAAW,KAAK,OAAO;AAAA,IAC5C;AACA,QAAI,KAAK,QAAQ,aAAc,iBAAgB,KAAK,OAAO;AAE3D,SAAK,QAAQ,EAAE,KAAK,KAAK,CAAC;AAAA,EAC5B;AAAA,EAEA,WAAW,CAAC,CAAC,KAAK,MAA6B;AAC7C,QAAI,CAAC,OAAO,cAAc,CAAC,EAAG;AAC9B,UAAM,QAAQ,MAAM,cAAc,CAAC,EAAE;AACrC,UAAM,SAAS,MAAM,cAAc,CAAC,EAAE;AAEtC,SAAK,QAAQ,EAAE,OAAO,OAAO,CAAC;AAAA,EAChC;AACF;;;ACxLA,IAAI,QAAQ;AAIL,SAAS,MAAW;AACzB,SAAO;AACT;;;AC+BO,IAAM,OAAN,MAAW;AAAA,EAYhB,YACU,OACR;AAAA,IACE,OAAO;AAAA,IACP;AAAA,IACA;AAAA,IACA;AAAA,IACA,oBAAoB;AAAA;AAAA,IACpB,UAAU,gBAAgB;AAAA,IAC1B;AAAA,IACA;AAAA,EACF,IAAiB,CAAC,GAClB;AAXQ;AAYR,QAAI,CAAC,OAAO,OAAO;AACjB,aAAO,QAAQ,CAAC;AAAA,IAClB;AAEA,WAAO,MAAM,OAAO;AAEpB,SAAK,UAAU;AAAA,MACb;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,MACA,UAAU;AAAA,MACV;AAAA,MACA;AAAA,IACF;AAEA,SAAK,eAAe;AACpB,WAAO,iBAAiB,UAAU,KAAK,cAAc;AAErD,SAAK,kBAAkB;AAAA,MACrB,KAAK;AAAA,MACL,KAAK,QAAQ;AAAA,IACf;AAEA,SAAK,MAAM,GAAG,kBAAkB,KAAK,eAAe;AAAA,EACtD;AAAA,EAlDA;AAAA,EACA,WAAW,oBAAI,IAAsB;AAAA,EACrC,QAAQ,oBAAI,IAAmB;AAAA,EAC/B,WAA8C;AAAA,IAC5C,OAAO,OAAO;AAAA,IACd,QAAQ,OAAO;AAAA,EACjB;AAAA,EACA,YAAY;AAAA,EACZ;AAAA,EACA;AAAA;AAAA;AAAA;AAAA,EA8CA,UAAU;AACR,SAAK,MAAM,IAAI,kBAAkB,KAAK,eAAe;AACrD,WAAO,oBAAoB,UAAU,KAAK,cAAc;AACxD,SAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,cAAQ,QAAQ;AAAA,IAClB,CAAC;AAAA,EACH;AAAA;AAAA;AAAA;AAAA,EAKA,QAAQ;AACN,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,OAAO;AACL,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,IAAI,OAA2B;AAC7B,UAAM,KAAK,IAAI;AAEf,SAAK,MAAM,IAAI,IAAI,EAAE,MAAM,CAAC;AAE5B,WAAO,MAAM,KAAK,MAAM,OAAO,EAAE;AAAA,EACnC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EASA,WACE,SACA,UAA8B,CAAC,GACnB;AACZ,UAAM,KAAK,IAAI;AAEf,SAAK,SAAS,IAAI,IAAI,IAAI,YAAY,SAAS,OAAO,CAAC;AAEvD,WAAO,MAAM,KAAK,SAAS,OAAO,EAAE;AAAA,EACtC;AAAA,EAEA,YACE,UACA,UAA8B,CAAC,GACnB;AACZ,UAAM,MAAM,CAAC,GAAG,QAAQ,EAAE;AAAA,MAAI,CAAC,YAC7B,KAAK,WAAW,SAAS,OAAO;AAAA,IAClC;AACA,WAAO,MAAM;AACX,UAAI,QAAQ,CAAC,WAAW;AACtB,eAAO;AAAA,MACT,CAAC;AAAA,IACH;AAAA,EACF;AAAA,EAEQ,iBAAiB,MAAM;AAC7B,SAAK,SAAS,QAAQ,OAAO;AAC7B,SAAK,SAAS,SAAS,OAAO;AAAA,EAChC;AAAA,EAEQ,eAAe,MAAM;AAC3B,UAAM,EAAE,aAAa,IAAI,KAAK;AAE9B,QAAI,QAAQ,CAAC,GAAG,KAAK,MAAM,OAAO,CAAC;AAEnC,SAAK,SAAS,QAAQ,CAAC,EAAE,MAAM,MAAM,MAAM;AACzC,UAAI;AAEJ,YAAM,QAAQ,CAACA,WAAU;AACvB,YAAIA,WAAU,SAAS;AACrB,kBAAQ,KAAK;AAAA,QACf,WAAWA,WAAU,UAAU;AAC7B,kBAAQ,eACJ,KAAK,OAAO,KAAK,QAAQ,IAAI,KAAK,SAAS,QAAQ,IACnD,KAAK,MAAM,KAAK,SAAS,IAAI,KAAK,SAAS,SAAS;AAAA,QAC1D,WAAWA,WAAU,OAAO;AAC1B,kBAAQ,eACJ,KAAK,OAAO,KAAK,QAAQ,KAAK,SAAS,QACvC,KAAK,MAAM,KAAK,SAAS,KAAK,SAAS;AAAA,QAC7C;AAEA,YAAI,OAAO,UAAU,UAAU;AAC7B,gBAAM,KAAK,EAAE,OAAO,KAAK,KAAK,KAAK,EAAE,CAAC;AAAA,QACxC;AAAA,MACF,CAAC;AAAA,IACH,CAAC;AAED,YAAQ,MAAM,KAAK,CAAC,GAAG,MAAM,KAAK,IAAI,EAAE,KAAK,IAAI,KAAK,IAAI,EAAE,KAAK,CAAC;AAElE,WAAO;AAAA,EACT;AAAA,EAEA,WAAW;AACT,SAAK,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,OAAO;AACL,SAAK,MAAM,KAAK,oBAAoB,KAAK,CAAC;AAAA,EAC5C;AAAA,EAEA,KAAKC,QAAe;AAClB,UAAM,QAAQ,KAAK,aAAa;AAEhC,QAAI,MAAM,WAAW,EAAG;AAExB,SAAK,mBAAmB,KAAK,IAAI,GAAG,KAAK,IAAIA,QAAO,MAAM,SAAS,CAAC,CAAC;AAErE,UAAM,cAAc,MAAM,KAAK,gBAAgB;AAC/C,QAAI,gBAAgB,OAAW;AAE/B,SAAK,MAAM,SAAS,YAAY,OAAO;AAAA,MACrC,UAAU,KAAK,QAAQ;AAAA,MACvB,QAAQ,KAAK,QAAQ;AAAA,MACrB,MAAM,KAAK,QAAQ;AAAA,MACnB,MAAM,KAAK,QAAQ,SAAS;AAAA,MAC5B,UAAU,EAAE,WAAW,OAAO;AAAA,MAC9B,SAAS,MAAM;AACb,aAAK,QAAQ,cAAc;AAAA,UACzB,OAAO,KAAK;AAAA,UACZ,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,MACA,YAAY,MAAM;AAChB,aAAK,QAAQ,iBAAiB;AAAA,UAC5B,OAAO,KAAK;AAAA,UACZ,GAAG;AAAA,QACL,CAAC;AAAA,MACH;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEA,IAAI,oBAAoB;AACtB,QAAI,oBAAoB,OAAO;AAC/B,QAAI,KAAK,QAAQ,SAAS,YAAa,QAAO,OAAO;AAErD,UAAM,EAAE,aAAa,IAAI,KAAK;AAE9B,UAAM,OAAO,eAAe,UAAU;AAEtC,QACE,OAAO,KAAK,QAAQ,sBAAsB,YAC1C,KAAK,QAAQ,kBAAkB,SAAS,GAAG,GAC3C;AACA,0BACG,OAAO,KAAK,QAAQ,kBAAkB,QAAQ,KAAK,EAAE,CAAC,IAAI,MAC3D,KAAK,SAAS,IAAI;AAAA,IACtB,WAAW,OAAO,KAAK,QAAQ,sBAAsB,UAAU;AAC7D,0BAAoB,KAAK,QAAQ;AAAA,IACnC,OAAO;AACL,0BAAoB,KAAK,SAAS,IAAI;AAAA,IACxC;AAEA,WAAO;AAAA,EACT;AAAA,EAEQ,SAAS,CAAC,MAAyB;AACzC,QAAI,KAAK,UAAW;AAEpB,QAAI,EAAE,MAAM,SAAS,YAAa;AAElC,QACE,KAAK,QAAQ,SAAS,UACtB,KAAK,MAAM,UAAU,cAAc;AAEnC;AAEF,QAAI,EAAE,QAAQ,aAAa,IAAI,KAAK;AACpC,UAAM,QAAQ,eAAe,EAAE,SAAS,EAAE;AAC1C,aAAS,KAAK,KAAK,KAAK,MAAM,SAAS,KAAK;AAE5C,UAAM,QAAQ,KAAK,aAAa;AAEhC,QAAI,MAAM,WAAW,EAAG;AAExB,QAAI;AAEJ,UAAM,gBAAgB,MAAM,cAAc,CAAC,EAAE,MAAM,MAAM,QAAQ,MAAM;AACvE,UAAM,gBAAgB,MAAM,UAAU,CAAC,EAAE,MAAM,MAAM,QAAQ,MAAM;AAEnE,QAAI,KAAK,QAAQ,SAAS,QAAQ;AAChC,UAAI,QAAQ,GAAG;AACb,oBAAY;AAAA,MACd,WAAW,QAAQ,GAAG;AACpB,oBAAY;AAAA,MACd;AAAA,IACF,OAAO;AACL,YAAM,WAAW,MAAM,aAAa;AACpC,YAAM,qBAAqB,WACvB,KAAK,IAAI,SAAS,SAAS,KAAK,IAChC,OAAO;AAEX,YAAM,WAAW,MAAM,aAAa;AACpC,YAAM,qBAAqB,WACvB,KAAK,IAAI,SAAS,SAAS,KAAK,IAChC,OAAO;AACX,kBACE,qBAAqB,qBAAqB,gBAAgB;AAAA,IAC9D;AAEA,QAAI,cAAc,OAAW;AAC7B,QAAI,cAAc,GAAI;AAEtB,gBAAY,KAAK,IAAI,GAAG,KAAK,IAAI,WAAW,MAAM,SAAS,CAAC,CAAC;AAE7D,UAAM,OAAO,MAAM,SAAS;AAE5B,UAAM,WAAW,KAAK,IAAI,SAAS,KAAK,KAAK;AAE7C,QAAI,YAAY,KAAK,mBAAmB;AACtC,WAAK,KAAK,SAAS;AAAA,IACrB;AAAA,EACF;AAAA,EAEA,SAAS;AACP,SAAK,SAAS,QAAQ,CAAC,YAAY;AACjC,cAAQ,gBAAgB;AAAA,IAC1B,CAAC;AAAA,EACH;AACF;","names":["align","index"]}
|
|
1
|
+
{"version":3,"file":"lenis-snap.mjs","names":[],"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\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'\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 if (!window.lenis) {\n window.lenis = {}\n }\n\n window.lenis.snap = true\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)\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)\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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"}
|
package/dist/lenis-vue-nuxt.mjs
CHANGED
|
@@ -1,35 +1,29 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
addComponent,
|
|
4
|
-
addImports,
|
|
5
|
-
addPlugin,
|
|
6
|
-
createResolver,
|
|
7
|
-
defineNuxtModule
|
|
8
|
-
} from "@nuxt/kit";
|
|
1
|
+
import { addComponent, addImports, addPlugin, createResolver, defineNuxtModule } from "@nuxt/kit";
|
|
9
2
|
export * from "lenis/vue";
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
3
|
+
//#region packages/vue/nuxt/module.ts
|
|
4
|
+
const nuxtModule = defineNuxtModule({
|
|
5
|
+
meta: {
|
|
6
|
+
name: "lenis/nuxt",
|
|
7
|
+
configKey: "lenis"
|
|
8
|
+
},
|
|
9
|
+
defaults: {},
|
|
10
|
+
setup(_options, _nuxt) {
|
|
11
|
+
const { resolve } = createResolver(import.meta.url);
|
|
12
|
+
addPlugin({
|
|
13
|
+
src: resolve("./nuxt/runtime/lenis.mjs"),
|
|
14
|
+
name: "lenis"
|
|
15
|
+
});
|
|
16
|
+
addImports({
|
|
17
|
+
name: "useLenis",
|
|
18
|
+
from: "lenis/vue"
|
|
19
|
+
});
|
|
20
|
+
addComponent({
|
|
21
|
+
name: "VueLenis",
|
|
22
|
+
filePath: "lenis/vue",
|
|
23
|
+
global: true,
|
|
24
|
+
export: "VueLenis"
|
|
25
|
+
});
|
|
26
|
+
}
|
|
31
27
|
});
|
|
32
|
-
|
|
33
|
-
export {
|
|
34
|
-
module_default as default
|
|
35
|
-
};
|
|
28
|
+
//#endregion
|
|
29
|
+
export { nuxtModule as default };
|
package/dist/lenis-vue.d.ts
CHANGED
|
@@ -1,67 +1,69 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import { PropType, HTMLAttributes, Plugin } from 'vue';
|
|
1
|
+
import Lenis, { LenisOptions, ScrollCallback } from "lenis";
|
|
2
|
+
import * as vue from "vue";
|
|
3
|
+
import { ComputedRef, HTMLAttributes, Plugin, PropType } from "vue";
|
|
5
4
|
|
|
5
|
+
//#region packages/vue/src/provider.d.ts
|
|
6
6
|
type LenisExposed = {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
7
|
+
wrapper?: HTMLDivElement;
|
|
8
|
+
content?: HTMLDivElement;
|
|
9
|
+
lenis?: Lenis;
|
|
10
10
|
};
|
|
11
11
|
declare const VueLenisImpl: vue.DefineComponent<vue.ExtractPropTypes<{
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
12
|
+
root: {
|
|
13
|
+
type: PropType<boolean>;
|
|
14
|
+
default: boolean;
|
|
15
|
+
};
|
|
16
|
+
autoRaf: {
|
|
17
|
+
type: PropType<boolean>;
|
|
18
|
+
default: boolean;
|
|
19
|
+
};
|
|
20
|
+
options: {
|
|
21
|
+
type: PropType<LenisOptions>;
|
|
22
|
+
default: () => {};
|
|
23
|
+
};
|
|
24
|
+
props: {
|
|
25
|
+
type: PropType<HTMLAttributes>;
|
|
26
|
+
default: () => {};
|
|
27
|
+
};
|
|
28
28
|
}>, () => vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
29
|
-
|
|
29
|
+
[key: string]: any;
|
|
30
30
|
}> | vue.VNode<vue.RendererNode, vue.RendererElement, {
|
|
31
|
-
|
|
31
|
+
[key: string]: any;
|
|
32
32
|
}>[] | undefined, {}, {}, {}, vue.ComponentOptionsMixin, vue.ComponentOptionsMixin, {}, string, vue.PublicProps, Readonly<vue.ExtractPropTypes<{
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
33
|
+
root: {
|
|
34
|
+
type: PropType<boolean>;
|
|
35
|
+
default: boolean;
|
|
36
|
+
};
|
|
37
|
+
autoRaf: {
|
|
38
|
+
type: PropType<boolean>;
|
|
39
|
+
default: boolean;
|
|
40
|
+
};
|
|
41
|
+
options: {
|
|
42
|
+
type: PropType<LenisOptions>;
|
|
43
|
+
default: () => {};
|
|
44
|
+
};
|
|
45
|
+
props: {
|
|
46
|
+
type: PropType<HTMLAttributes>;
|
|
47
|
+
default: () => {};
|
|
48
|
+
};
|
|
49
49
|
}>> & Readonly<{}>, {
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
props: HTMLAttributes;
|
|
51
|
+
root: boolean;
|
|
52
|
+
autoRaf: boolean;
|
|
53
|
+
options: LenisOptions;
|
|
54
54
|
}, {}, {}, {}, string, vue.ComponentProvideOptions, true, {}, any>;
|
|
55
55
|
declare const VueLenis: typeof VueLenisImpl & {
|
|
56
|
-
|
|
56
|
+
new (): LenisExposed;
|
|
57
57
|
};
|
|
58
58
|
declare const vueLenisPlugin: Plugin;
|
|
59
59
|
declare module '@vue/runtime-core' {
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
60
|
+
interface GlobalComponents {
|
|
61
|
+
'vue-lenis': typeof VueLenis;
|
|
62
|
+
}
|
|
63
63
|
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
//#endregion
|
|
65
|
+
//#region packages/vue/src/use-lenis.d.ts
|
|
66
|
+
declare function useLenis(callback?: ScrollCallback, priority?: number): ComputedRef<Lenis | undefined>;
|
|
67
|
+
//#endregion
|
|
67
68
|
export { VueLenis as Lenis, VueLenis, vueLenisPlugin as default, useLenis };
|
|
69
|
+
//# sourceMappingURL=lenis-vue.d.ts.map
|
package/dist/lenis-vue.mjs
CHANGED
|
@@ -1,178 +1,142 @@
|
|
|
1
|
-
// packages/vue/src/provider.ts
|
|
2
1
|
import Lenis from "lenis";
|
|
3
|
-
import {
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
{ immediate: true }
|
|
106
|
-
);
|
|
107
|
-
if (!props.root) {
|
|
108
|
-
provide(LenisSymbol, lenisRef);
|
|
109
|
-
provide(AddCallbackSymbol, addCallback);
|
|
110
|
-
provide(RemoveCallbackSymbol, removeCallback);
|
|
111
|
-
}
|
|
112
|
-
return () => {
|
|
113
|
-
if (props.root) {
|
|
114
|
-
return slots.default?.();
|
|
115
|
-
}
|
|
116
|
-
return h("div", { ref: wrapper, ...props?.props }, [
|
|
117
|
-
h("div", { ref: content }, slots.default?.())
|
|
118
|
-
]);
|
|
119
|
-
};
|
|
120
|
-
}
|
|
2
|
+
import { computed, defineComponent, h, inject, nextTick, onWatcherCleanup, provide, reactive, ref, shallowRef, watch } from "vue";
|
|
3
|
+
//#region packages/vue/src/store.ts
|
|
4
|
+
const globalLenis = shallowRef();
|
|
5
|
+
const globalAddCallback = shallowRef();
|
|
6
|
+
const globalRemoveCallback = shallowRef();
|
|
7
|
+
//#endregion
|
|
8
|
+
//#region packages/vue/src/provider.ts
|
|
9
|
+
const LenisSymbol = Symbol("LenisContext");
|
|
10
|
+
const AddCallbackSymbol = Symbol("AddCallback");
|
|
11
|
+
const RemoveCallbackSymbol = Symbol("RemoveCallback");
|
|
12
|
+
const VueLenis = defineComponent({
|
|
13
|
+
name: "VueLenis",
|
|
14
|
+
props: {
|
|
15
|
+
root: {
|
|
16
|
+
type: Boolean,
|
|
17
|
+
default: false
|
|
18
|
+
},
|
|
19
|
+
autoRaf: {
|
|
20
|
+
type: Boolean,
|
|
21
|
+
default: true
|
|
22
|
+
},
|
|
23
|
+
options: {
|
|
24
|
+
type: Object,
|
|
25
|
+
default: () => ({})
|
|
26
|
+
},
|
|
27
|
+
props: {
|
|
28
|
+
type: Object,
|
|
29
|
+
default: () => ({})
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
setup(props, { slots, expose }) {
|
|
33
|
+
const lenisRef = shallowRef();
|
|
34
|
+
const wrapper = ref();
|
|
35
|
+
const content = ref();
|
|
36
|
+
expose({
|
|
37
|
+
lenis: lenisRef,
|
|
38
|
+
wrapper,
|
|
39
|
+
content
|
|
40
|
+
});
|
|
41
|
+
watch([
|
|
42
|
+
() => props.options,
|
|
43
|
+
wrapper,
|
|
44
|
+
content
|
|
45
|
+
], () => {
|
|
46
|
+
if (!(typeof window !== "undefined")) return;
|
|
47
|
+
if (!(props.root || wrapper.value && content.value)) return;
|
|
48
|
+
lenisRef.value = new Lenis({
|
|
49
|
+
...props.options,
|
|
50
|
+
...!props.root ? {
|
|
51
|
+
wrapper: wrapper.value,
|
|
52
|
+
content: content.value
|
|
53
|
+
} : {},
|
|
54
|
+
autoRaf: props.options?.autoRaf ?? props.autoRaf
|
|
55
|
+
});
|
|
56
|
+
onWatcherCleanup(() => {
|
|
57
|
+
lenisRef.value?.destroy();
|
|
58
|
+
lenisRef.value = void 0;
|
|
59
|
+
});
|
|
60
|
+
}, {
|
|
61
|
+
deep: true,
|
|
62
|
+
immediate: true
|
|
63
|
+
});
|
|
64
|
+
const callbacks = reactive([]);
|
|
65
|
+
function addCallback(callback, priority) {
|
|
66
|
+
callbacks.push({
|
|
67
|
+
callback,
|
|
68
|
+
priority
|
|
69
|
+
});
|
|
70
|
+
callbacks.sort((a, b) => a.priority - b.priority);
|
|
71
|
+
}
|
|
72
|
+
function removeCallback(callback) {
|
|
73
|
+
callbacks.splice(callbacks.findIndex((cb) => cb.callback === callback), 1);
|
|
74
|
+
}
|
|
75
|
+
const onScroll = (data) => {
|
|
76
|
+
for (const { callback } of callbacks) callback(data);
|
|
77
|
+
};
|
|
78
|
+
watch([lenisRef, () => props.root], ([lenis, root]) => {
|
|
79
|
+
lenis?.on("scroll", onScroll);
|
|
80
|
+
if (root) {
|
|
81
|
+
globalLenis.value = lenis;
|
|
82
|
+
globalAddCallback.value = addCallback;
|
|
83
|
+
globalRemoveCallback.value = removeCallback;
|
|
84
|
+
onWatcherCleanup(() => {
|
|
85
|
+
globalLenis.value = void 0;
|
|
86
|
+
globalAddCallback.value = void 0;
|
|
87
|
+
globalRemoveCallback.value = void 0;
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
}, { immediate: true });
|
|
91
|
+
if (!props.root) {
|
|
92
|
+
provide(LenisSymbol, lenisRef);
|
|
93
|
+
provide(AddCallbackSymbol, addCallback);
|
|
94
|
+
provide(RemoveCallbackSymbol, removeCallback);
|
|
95
|
+
}
|
|
96
|
+
return () => {
|
|
97
|
+
if (props.root) return slots.default?.();
|
|
98
|
+
return h("div", {
|
|
99
|
+
ref: wrapper,
|
|
100
|
+
...props?.props
|
|
101
|
+
}, [h("div", { ref: content }, slots.default?.())]);
|
|
102
|
+
};
|
|
103
|
+
}
|
|
121
104
|
});
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
app.provide(RemoveCallbackSymbol, void 0);
|
|
105
|
+
const vueLenisPlugin = (app) => {
|
|
106
|
+
app.component("vue-lenis", VueLenis);
|
|
107
|
+
app.provide(LenisSymbol, shallowRef(void 0));
|
|
108
|
+
app.provide(AddCallbackSymbol, void 0);
|
|
109
|
+
app.provide(RemoveCallbackSymbol, void 0);
|
|
128
110
|
};
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
import { computed, inject, nextTick, onWatcherCleanup as onWatcherCleanup2, watch as watch2 } from "vue";
|
|
111
|
+
//#endregion
|
|
112
|
+
//#region packages/vue/src/use-lenis.ts
|
|
132
113
|
function useLenis(callback, priority = 0) {
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
[lenis, addCallback, removeCallback],
|
|
158
|
-
([lenis2, addCallback2, removeCallback2]) => {
|
|
159
|
-
if (!(lenis2 && addCallback2 && removeCallback2 && callback)) return;
|
|
160
|
-
addCallback2?.(callback, priority);
|
|
161
|
-
callback?.(lenis2);
|
|
162
|
-
onWatcherCleanup2(() => {
|
|
163
|
-
removeCallback2?.(callback);
|
|
164
|
-
});
|
|
165
|
-
},
|
|
166
|
-
{
|
|
167
|
-
immediate: true
|
|
168
|
-
}
|
|
169
|
-
);
|
|
170
|
-
return lenis;
|
|
114
|
+
const lenisInjection = inject(LenisSymbol);
|
|
115
|
+
const addCallbackInjection = inject(AddCallbackSymbol);
|
|
116
|
+
const removeCallbackInjection = inject(RemoveCallbackSymbol);
|
|
117
|
+
const addCallback = computed(() => addCallbackInjection ? addCallbackInjection : globalAddCallback.value);
|
|
118
|
+
const removeCallback = computed(() => removeCallbackInjection ? removeCallbackInjection : globalRemoveCallback.value);
|
|
119
|
+
const lenis = computed(() => lenisInjection?.value ? lenisInjection.value : globalLenis.value);
|
|
120
|
+
if (typeof window !== "undefined") nextTick(() => {
|
|
121
|
+
nextTick(() => {
|
|
122
|
+
if (!lenis.value && import.meta.env.DEV) console.warn("No lenis instance found, either mount a root lenis instance or wrap your component in a lenis provider");
|
|
123
|
+
});
|
|
124
|
+
});
|
|
125
|
+
watch([
|
|
126
|
+
lenis,
|
|
127
|
+
addCallback,
|
|
128
|
+
removeCallback
|
|
129
|
+
], ([lenis, addCallback, removeCallback]) => {
|
|
130
|
+
if (!(lenis && addCallback && removeCallback && callback)) return;
|
|
131
|
+
addCallback?.(callback, priority);
|
|
132
|
+
callback?.(lenis);
|
|
133
|
+
onWatcherCleanup(() => {
|
|
134
|
+
removeCallback?.(callback);
|
|
135
|
+
});
|
|
136
|
+
}, { immediate: true });
|
|
137
|
+
return lenis;
|
|
171
138
|
}
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
vueLenisPlugin as default,
|
|
176
|
-
useLenis
|
|
177
|
-
};
|
|
139
|
+
//#endregion
|
|
140
|
+
export { VueLenis as Lenis, VueLenis, vueLenisPlugin as default, useLenis };
|
|
141
|
+
|
|
178
142
|
//# sourceMappingURL=lenis-vue.mjs.map
|