{"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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"}