UNPKG

lenis

Version:
1 lines 9.33 kB
{"version":3,"file":"lenis-vue.mjs","names":[],"sources":["../packages/vue/src/store.ts","../packages/vue/src/provider.ts","../packages/vue/src/use-lenis.ts"],"sourcesContent":["import type Lenis from 'lenis'\r\nimport type { ScrollCallback } from 'lenis'\r\nimport { shallowRef } from 'vue'\r\n\r\nexport const globalLenis = shallowRef<Lenis>()\r\nexport const globalAddCallback =\r\n shallowRef<(callback: ScrollCallback, priority: number) => void>()\r\nexport const globalRemoveCallback =\r\n shallowRef<(callback: ScrollCallback) => void>()\r\n","import Lenis, { type LenisOptions, 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<LenisOptions>,\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 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 { type ComputedRef, 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): ComputedRef<Lenis | undefined> {\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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"}