{"version":3,"file":"overlayscrollbars-vue.mjs","sources":["../src/useOverlayScrollbars.ts","../src/OverlayScrollbarsComponent.vue"],"sourcesContent":["import { onUnmounted, shallowRef, unref, watch } from 'vue';\r\nimport { OverlayScrollbars } from 'overlayscrollbars';\r\nimport type { Ref, UnwrapRef } from 'vue';\r\nimport type { InitializationTarget } from 'overlayscrollbars';\r\nimport type {\r\n  OverlayScrollbarsComponentProps,\r\n  OverlayScrollbarsComponentRef,\r\n} from './OverlayScrollbarsComponent.types';\r\n\r\ntype Defer = [\r\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n  requestDefer: (callback: () => any, options?: OverlayScrollbarsComponentProps['defer']) => void,\r\n  cancelDefer: () => void,\r\n];\r\n\r\nexport interface UseOverlayScrollbarsParams {\r\n  /** OverlayScrollbars options. */\r\n  options?:\r\n    | OverlayScrollbarsComponentProps['options']\r\n    | Ref<OverlayScrollbarsComponentProps['options']>;\r\n  /** OverlayScrollbars events. */\r\n  events?:\r\n    | OverlayScrollbarsComponentProps['events']\r\n    | Ref<OverlayScrollbarsComponentProps['events']>;\r\n  /** Whether to defer the initialization to a point in time when the browser is idle. (or to the next frame if `window.requestIdleCallback` is not supported) */\r\n  defer?: OverlayScrollbarsComponentProps['defer'] | Ref<OverlayScrollbarsComponentProps['defer']>;\r\n}\r\n\r\nexport type UseOverlayScrollbarsInitialization = (target: InitializationTarget) => void;\r\n\r\nexport type UseOverlayScrollbarsInstance = () => ReturnType<\r\n  OverlayScrollbarsComponentRef['osInstance']\r\n>;\r\n\r\nconst createDefer = (): Defer => {\r\n  /* c8 ignore start */\r\n  if (typeof window === 'undefined') {\r\n    // mock ssr calls with \"noop\"\r\n\r\n    const noop = () => {};\r\n    return [noop, noop];\r\n  }\r\n  /* c8 ignore end */\r\n\r\n  let idleId: number;\r\n  let rafId: number;\r\n  const wnd = window;\r\n  const idleSupported = typeof wnd.requestIdleCallback === 'function';\r\n  const rAF = wnd.requestAnimationFrame;\r\n  const cAF = wnd.cancelAnimationFrame;\r\n  const rIdle = idleSupported ? wnd.requestIdleCallback : rAF;\r\n  const cIdle = idleSupported ? wnd.cancelIdleCallback : cAF;\r\n  const clear = () => {\r\n    cIdle(idleId);\r\n    cAF(rafId);\r\n  };\r\n\r\n  return [\r\n    (callback, options) => {\r\n      clear();\r\n      idleId = rIdle(\r\n        idleSupported\r\n          ? () => {\r\n              clear();\r\n              // inside idle its best practice to use rAF to change DOM for best performance\r\n              rafId = rAF(callback);\r\n            }\r\n          : callback,\r\n        typeof options === 'object' ? options : { timeout: 2233 }\r\n      );\r\n    },\r\n    clear,\r\n  ];\r\n};\r\n\r\n/**\r\n * Composable for advanced usage of OverlayScrollbars. (When the OverlayScrollbarsComponent is not enough)\r\n * @param params Parameters for customization.\r\n * @returns A tuple with two values:\r\n * The first value is the initialization function, it takes one argument which is the `InitializationTarget` and returns the OverlayScrollbars instance.\r\n * The second value is a function which returns the current OverlayScrollbars instance or `null` if not initialized.\r\n */\r\nexport const useOverlayScrollbars = (\r\n  params?: UseOverlayScrollbarsParams | Ref<UseOverlayScrollbarsParams | undefined>\r\n): [UseOverlayScrollbarsInitialization, UseOverlayScrollbarsInstance] => {\r\n  let instance: ReturnType<UseOverlayScrollbarsInstance> = null;\r\n  let options: UnwrapRef<UseOverlayScrollbarsParams['options']>;\r\n  let events: UnwrapRef<UseOverlayScrollbarsParams['events']>;\r\n  let defer: UnwrapRef<UseOverlayScrollbarsParams['defer']>;\r\n  const paramsRef = shallowRef(params || {});\r\n  const [requestDefer, clearDefer] = createDefer();\r\n\r\n  watch(\r\n    () => unref(paramsRef.value?.defer),\r\n    (currDefer) => {\r\n      defer = currDefer;\r\n    },\r\n    { deep: true, immediate: true }\r\n  );\r\n\r\n  watch(\r\n    () => unref(paramsRef.value?.options),\r\n    (currOptions) => {\r\n      options = currOptions;\r\n\r\n      if (OverlayScrollbars.valid(instance)) {\r\n        instance.options(options || {}, true);\r\n      }\r\n    },\r\n    { deep: true, immediate: true }\r\n  );\r\n\r\n  watch(\r\n    () => unref(paramsRef.value?.events),\r\n    (currEvents) => {\r\n      events = currEvents;\r\n\r\n      if (OverlayScrollbars.valid(instance)) {\r\n        instance.on(\r\n          /* c8 ignore next */\r\n          events || {},\r\n          true\r\n        );\r\n      }\r\n    },\r\n    { deep: true, immediate: true }\r\n  );\r\n\r\n  onUnmounted(() => {\r\n    clearDefer();\r\n    instance?.destroy();\r\n  });\r\n\r\n  return [\r\n    (target) => {\r\n      // if already initialized do nothing\r\n      if (OverlayScrollbars.valid(instance)) {\r\n        return instance;\r\n      }\r\n\r\n      const init = () => (instance = OverlayScrollbars(target, options || {}, events || {}));\r\n\r\n      if (defer) {\r\n        requestDefer(init, defer);\r\n      } else {\r\n        init();\r\n      }\r\n    },\r\n    () => instance,\r\n  ];\r\n};\r\n","<script setup lang=\"ts\">\r\nimport { ref, unref, shallowRef, toRefs, watch, watchPostEffect, type PropType } from 'vue';\r\nimport { useOverlayScrollbars } from './useOverlayScrollbars';\r\nimport type {\r\n  OverlayScrollbarsComponentProps,\r\n  OverlayScrollbarsComponentRef,\r\n} from './OverlayScrollbarsComponent.types';\r\nimport type { EventListeners, EventListenerArgs } from 'overlayscrollbars';\r\n\r\ntype EmitEventsMap = {\r\n  [N in keyof EventListenerArgs]: `os${Capitalize<N>}`;\r\n};\r\n\r\nconst emitEvents: EmitEventsMap = {\r\n  initialized: 'osInitialized',\r\n  updated: 'osUpdated',\r\n  destroyed: 'osDestroyed',\r\n  scroll: 'osScroll',\r\n};\r\nconst props = defineProps({\r\n  element: {\r\n    type: [String, Object] as PropType<Required<OverlayScrollbarsComponentProps>['element']>,\r\n    default: 'div',\r\n  },\r\n  options: { type: Object as PropType<OverlayScrollbarsComponentProps['options']> },\r\n  events: { type: Object as PropType<OverlayScrollbarsComponentProps['events']> },\r\n  defer: { type: [Boolean, Object] as PropType<OverlayScrollbarsComponentProps['defer']> },\r\n});\r\nconst emits = defineEmits<{\r\n  (name: 'osInitialized', ...args: EventListenerArgs['initialized']): void;\r\n  (name: 'osUpdated', ...args: EventListenerArgs['updated']): void;\r\n  (name: 'osDestroyed', ...args: EventListenerArgs['destroyed']): void;\r\n  (name: 'osScroll', ...args: EventListenerArgs['scroll']): void;\r\n}>();\r\n\r\nconst { element, options, events, defer } = toRefs(props);\r\nconst elementRef = shallowRef<HTMLElement | null>(null);\r\nconst slotRef = shallowRef<HTMLElement | null>(null);\r\nconst combinedEvents = ref<EventListeners>();\r\nconst [initialize, osInstance] = useOverlayScrollbars({ options, events: combinedEvents, defer });\r\n\r\nconst exposed: OverlayScrollbarsComponentRef = {\r\n  osInstance,\r\n  getElement: () => elementRef.value,\r\n};\r\n\r\ndefineExpose(exposed);\r\n\r\nwatchPostEffect((onCleanup) => {\r\n  const { value: target } = elementRef;\r\n  const { value: contentsElm } = slotRef;\r\n\r\n  /* c8 ignore start */\r\n  if (!target) {\r\n    return;\r\n  }\r\n  /* c8 ignore end */\r\n\r\n  initialize(\r\n    element.value === 'body'\r\n      ? {\r\n          target,\r\n          cancel: {\r\n            body: null,\r\n          },\r\n        }\r\n      : {\r\n          target,\r\n          elements: {\r\n            viewport: contentsElm,\r\n            content: contentsElm,\r\n          },\r\n        }\r\n  );\r\n\r\n  onCleanup(() => osInstance()?.destroy());\r\n});\r\n\r\nwatch(\r\n  () => unref(events),\r\n  (rawCurrEvents) => {\r\n    const currEvents = rawCurrEvents || {};\r\n    combinedEvents.value = (\r\n      Object.keys(emitEvents) as (keyof EventListeners)[]\r\n    ).reduce<EventListeners>(<N extends keyof EventListeners>(obj: EventListeners, name: N) => {\r\n      const eventListener = currEvents[name];\r\n      obj[name] = [\r\n        (...args: EventListenerArgs[N]) =>\r\n          emits(\r\n            emitEvents[name],\r\n            // @ts-ignore\r\n            ...args\r\n          ),\r\n        ...(Array.isArray(eventListener) ? eventListener : [eventListener]).filter(Boolean),\r\n      ];\r\n      return obj;\r\n    }, {});\r\n  },\r\n  { deep: true, immediate: true }\r\n);\r\n</script>\r\n\r\n<template>\r\n  <component data-overlayscrollbars-initialize=\"\" :is=\"element\" ref=\"elementRef\">\r\n    <slot v-if=\"element === 'body'\"></slot>\r\n    <div v-else data-overlayscrollbars-contents=\"\" ref=\"slotRef\">\r\n      <slot></slot>\r\n    </div>\r\n  </component>\r\n</template>\r\n"],"names":["createDefer","noop","idleId","rafId","wnd","idleSupported","rAF","cAF","rIdle","cIdle","clear","callback","options","useOverlayScrollbars","params","instance","events","defer","paramsRef","shallowRef","requestDefer","clearDefer","watch","unref","_a","currDefer","currOptions","OverlayScrollbars","currEvents","onUnmounted","target","init","emitEvents","element","toRefs","props","elementRef","slotRef","combinedEvents","ref","initialize","osInstance","expose","watchPostEffect","onCleanup","contentsElm","rawCurrEvents","obj","name","eventListener","args","emits"],"mappings":";;AAkCA,MAAMA,IAAc,MAAa;AAE3B,MAAA,OAAO,SAAW,KAAa;AAGjC,UAAMC,IAAO,MAAM;AAAA,IAAC;AACb,WAAA,CAACA,GAAMA,CAAI;AAAA,EAAA;AAIhB,MAAAC,GACAC;AACJ,QAAMC,IAAM,QACNC,IAAgB,OAAOD,EAAI,uBAAwB,YACnDE,IAAMF,EAAI,uBACVG,IAAMH,EAAI,sBACVI,IAAQH,IAAgBD,EAAI,sBAAsBE,GAClDG,IAAQJ,IAAgBD,EAAI,qBAAqBG,GACjDG,IAAQ,MAAM;AAClB,IAAAD,EAAMP,CAAM,GACZK,EAAIJ,CAAK;AAAA,EACX;AAEO,SAAA;AAAA,IACL,CAACQ,GAAUC,MAAY;AACf,MAAAF,EAAA,GACGR,IAAAM;AAAA,QACPH,IACI,MAAM;AACE,UAAAK,EAAA,GAENP,IAAQG,EAAIK,CAAQ;AAAA,QAAA,IAEtBA;AAAA,QACJ,OAAOC,KAAY,WAAWA,IAAU,EAAE,SAAS,KAAK;AAAA,MAC1D;AAAA,IACF;AAAA,IACAF;AAAA,EACF;AACF,GASaG,IAAuB,CAClCC,MACuE;AACvE,MAAIC,IAAqD,MACrDH,GACAI,GACAC;AACJ,QAAMC,IAAYC,EAAWL,KAAU,EAAE,GACnC,CAACM,GAAcC,CAAU,IAAIrB,EAAY;AAE/C,SAAAsB;AAAA,IACE,MAAA;;AAAM,aAAAC,GAAMC,IAAAN,EAAU,UAAV,gBAAAM,EAAiB,KAAK;AAAA;AAAA,IAClC,CAACC,MAAc;AACL,MAAAR,IAAAQ;AAAA,IACV;AAAA,IACA,EAAE,MAAM,IAAM,WAAW,GAAK;AAAA,EAChC,GAEAH;AAAA,IACE,MAAA;;AAAM,aAAAC,GAAMC,IAAAN,EAAU,UAAV,gBAAAM,EAAiB,OAAO;AAAA;AAAA,IACpC,CAACE,MAAgB;AACL,MAAAd,IAAAc,GAENC,EAAkB,MAAMZ,CAAQ,KAClCA,EAAS,QAAQH,KAAW,CAAA,GAAI,EAAI;AAAA,IAExC;AAAA,IACA,EAAE,MAAM,IAAM,WAAW,GAAK;AAAA,EAChC,GAEAU;AAAA,IACE,MAAA;;AAAM,aAAAC,GAAMC,IAAAN,EAAU,UAAV,gBAAAM,EAAiB,MAAM;AAAA;AAAA,IACnC,CAACI,MAAe;AACL,MAAAZ,IAAAY,GAELD,EAAkB,MAAMZ,CAAQ,KACzBA,EAAA;AAAA;AAAA,QAEPC,KAAU,CAAC;AAAA,QACX;AAAA,MACF;AAAA,IAEJ;AAAA,IACA,EAAE,MAAM,IAAM,WAAW,GAAK;AAAA,EAChC,GAEAa,EAAY,MAAM;AACL,IAAAR,EAAA,GACXN,KAAA,QAAAA,EAAU;AAAA,EAAQ,CACnB,GAEM;AAAA,IACL,CAACe,MAAW;AAEN,UAAAH,EAAkB,MAAMZ,CAAQ;AAC3B,eAAAA;AAGH,YAAAgB,IAAO,MAAOhB,IAAWY,EAAkBG,GAAQlB,KAAW,CAAA,GAAII,KAAU,EAAE;AAEpF,MAAIC,IACFG,EAAaW,GAAMd,CAAK,IAEnBc,EAAA;AAAA,IAET;AAAA,IACA,MAAMhB;AAAA,EACR;AACF;;;;;;;;;;;;;iBCzIMiB,IAA4B;AAAA,MAChC,aAAa;AAAA,MACb,SAAS;AAAA,MACT,WAAW;AAAA,MACX,QAAQ;AAAA,IACV,GAiBM,EAAE,SAAAC,GAAS,SAAArB,GAAS,QAAAI,GAAQ,OAAAC,EAAM,IAAIiB,EAAOC,CAAK,GAClDC,IAAajB,EAA+B,IAAI,GAChDkB,IAAUlB,EAA+B,IAAI,GAC7CmB,IAAiBC,EAAoB,GACrC,CAACC,GAAYC,CAAU,IAAI5B,EAAqB,EAAE,SAAAD,GAAS,QAAQ0B,GAAgB,OAAArB,GAAO;AAOhG,WAAAyB,EAL+C;AAAA,MAC7C,YAAAD;AAAA,MACA,YAAY,MAAML,EAAW;AAAA,IAC/B,CAEoB,GAEpBO,EAAgB,CAACC,MAAc;AACvB,YAAA,EAAE,OAAOd,EAAA,IAAWM,GACpB,EAAE,OAAOS,EAAA,IAAgBR;AAG/B,MAAKP,MAKLU;AAAA,QACEP,EAAQ,UAAU,SACd;AAAA,UACE,QAAAH;AAAA,UACA,QAAQ;AAAA,YACN,MAAM;AAAA,UAAA;AAAA,QACR,IAEF;AAAA,UACE,QAAAA;AAAA,UACA,UAAU;AAAA,YACR,UAAUe;AAAA,YACV,SAASA;AAAA,UAAA;AAAA,QACX;AAAA,MAER,GAEAD,EAAU,MAAM;;AAAA,gBAAApB,IAAAiB,QAAA,gBAAAjB,EAAc;AAAA,OAAS;AAAA,IAAA,CACxC,GAEDF;AAAA,MACE,MAAMC,EAAMP,CAAM;AAAA,MAClB,CAAC8B,MAAkB;AACX,cAAAlB,IAAakB,KAAiB,CAAC;AACtB,QAAAR,EAAA,QACb,OAAO,KAAKN,CAAU,EACtB,OAAuB,CAAiCe,GAAqBC,MAAY;AACnF,gBAAAC,IAAgBrB,EAAWoB,CAAI;AACrC,iBAAAD,EAAIC,CAAI,IAAI;AAAA,YACV,IAAIE,MACFC;AAAA,cACEnB,EAAWgB,CAAI;AAAA,cAEf,GAAGE;AAAA,YACL;AAAA,YACF,IAAI,MAAM,QAAQD,CAAa,IAAIA,IAAgB,CAACA,CAAa,GAAG,OAAO,OAAO;AAAA,UACpF,GACOF;AAAA,QACT,GAAG,EAAE;AAAA,MACP;AAAA,MACA,EAAE,MAAM,IAAM,WAAW,GAAK;AAAA,IAChC;;;;;;;;;;;;;;;;;;;"}