{"version":3,"file":"overlayscrollbars-react.cjs","sources":["../src/useOverlayScrollbars.ts","../src/OverlayScrollbarsComponent.tsx"],"sourcesContent":["// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport React, { useEffect, useMemo, useRef } from 'react';\r\nimport { OverlayScrollbars } from 'overlayscrollbars';\r\nimport type { InitializationTarget } from 'overlayscrollbars';\r\nimport type {\r\n  OverlayScrollbarsComponentProps,\r\n  OverlayScrollbarsComponentRef,\r\n} from './OverlayScrollbarsComponent';\r\n\r\ntype Defer = [\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?: OverlayScrollbarsComponentProps['options'];\r\n  /** OverlayScrollbars events. */\r\n  events?: 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'];\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    // eslint-disable-next-line @typescript-eslint/no-empty-function\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 * Hook 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`.\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\r\n): [UseOverlayScrollbarsInitialization, UseOverlayScrollbarsInstance] => {\r\n  const { options, events, defer } = params || {};\r\n  const [requestDefer, cancelDefer] = useMemo<Defer>(createDefer, []);\r\n  const instanceRef = useRef<ReturnType<UseOverlayScrollbarsInstance>>(null);\r\n  const deferRef = useRef(defer);\r\n  const optionsRef = useRef(options);\r\n  const eventsRef = useRef(events);\r\n\r\n  useEffect(() => {\r\n    deferRef.current = defer;\r\n  }, [defer]);\r\n\r\n  useEffect(() => {\r\n    const { current: instance } = instanceRef;\r\n\r\n    optionsRef.current = options;\r\n\r\n    if (OverlayScrollbars.valid(instance)) {\r\n      instance.options(options || {}, true);\r\n    }\r\n  }, [options]);\r\n\r\n  useEffect(() => {\r\n    const { current: instance } = instanceRef;\r\n\r\n    eventsRef.current = events;\r\n\r\n    if (OverlayScrollbars.valid(instance)) {\r\n      instance.on(events || {}, true);\r\n    }\r\n  }, [events]);\r\n\r\n  useEffect(\r\n    () => () => {\r\n      cancelDefer();\r\n      instanceRef.current?.destroy();\r\n    },\r\n    []\r\n  );\r\n\r\n  return useMemo<[UseOverlayScrollbarsInitialization, UseOverlayScrollbarsInstance]>(\r\n    () => [\r\n      (target) => {\r\n        // if already initialized do nothing\r\n        const presentInstance = instanceRef.current;\r\n        if (OverlayScrollbars.valid(presentInstance)) {\r\n          return;\r\n        }\r\n\r\n        const currDefer = deferRef.current;\r\n        const currOptions = optionsRef.current || {};\r\n        const currEvents = eventsRef.current || {};\r\n        const init = () =>\r\n          (instanceRef.current = OverlayScrollbars(target, currOptions, currEvents));\r\n\r\n        if (currDefer) {\r\n          requestDefer(init, currDefer);\r\n        } else {\r\n          init();\r\n        }\r\n      },\r\n      () => instanceRef.current,\r\n    ],\r\n    []\r\n  );\r\n};\r\n","// eslint-disable-next-line @typescript-eslint/no-unused-vars\r\nimport React, { forwardRef, useEffect, useRef, useImperativeHandle } from 'react';\r\nimport type { OverlayScrollbars } from 'overlayscrollbars';\r\nimport type { PartialOptions, EventListeners } from 'overlayscrollbars';\r\nimport type {\r\n  ComponentPropsWithoutRef,\r\n  ElementRef,\r\n  ElementType,\r\n  ForwardedRef,\r\n  ReactElement,\r\n} from 'react';\r\nimport { useOverlayScrollbars } from './useOverlayScrollbars';\r\n\r\ntype OverlayScrollbarsComponentBaseProps<T extends ElementType = 'div'> =\r\n  ComponentPropsWithoutRef<T> & {\r\n    /** Tag of the root element. */\r\n    element?: T;\r\n    /** OverlayScrollbars options. */\r\n    options?: PartialOptions | false | null;\r\n    /** OverlayScrollbars events. */\r\n    events?: EventListeners | false | null;\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?: boolean | IdleRequestOptions;\r\n  };\r\n\r\nexport type OverlayScrollbarsComponentProps<T extends ElementType = 'div'> =\r\n  OverlayScrollbarsComponentBaseProps<T> & {\r\n    ref?: ForwardedRef<OverlayScrollbarsComponentRef<T>>;\r\n  };\r\n\r\nexport interface OverlayScrollbarsComponentRef<T extends ElementType = 'div'> {\r\n  /** Returns the OverlayScrollbars instance or null if not initialized. */\r\n  osInstance(): OverlayScrollbars | null;\r\n  /** Returns the root element. */\r\n  getElement(): ElementRef<T> | null;\r\n}\r\n\r\nconst OverlayScrollbarsComponent = <T extends ElementType = 'div'>(\r\n  props: OverlayScrollbarsComponentBaseProps<T>,\r\n  ref: ForwardedRef<OverlayScrollbarsComponentRef<T>>\r\n): ReactElement | null => {\r\n  const { element = 'div', options, events, defer, children, ...other } = props;\r\n  const Tag = element;\r\n  const elementRef = useRef<ElementRef<T>>(null);\r\n  const childrenRef = useRef<HTMLDivElement>(null);\r\n  const [initialize, osInstance] = useOverlayScrollbars({ options, events, defer });\r\n\r\n  useEffect(() => {\r\n    const { current: elm } = elementRef;\r\n    const { current: contentsElm } = childrenRef;\r\n\r\n    /* c8 ignore start */\r\n    if (!elm) {\r\n      return;\r\n    }\r\n    /* c8 ignore end */\r\n\r\n    const target = elm as unknown as HTMLElement;\r\n\r\n    initialize(\r\n      element === '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    return () => osInstance()?.destroy();\r\n  }, [initialize, element]);\r\n\r\n  useImperativeHandle(\r\n    ref,\r\n    () => {\r\n      return {\r\n        osInstance,\r\n        getElement: () => elementRef.current,\r\n      };\r\n    },\r\n    []\r\n  );\r\n\r\n  return (\r\n    // @ts-ignore\r\n    <Tag data-overlayscrollbars-initialize=\"\" ref={elementRef} {...other}>\r\n      {element === 'body' ? (\r\n        children\r\n      ) : (\r\n        <div data-overlayscrollbars-contents=\"\" ref={childrenRef}>\r\n          {children}\r\n        </div>\r\n      )}\r\n    </Tag>\r\n  );\r\n};\r\n\r\nconst OverlayScrollbarsComponentForwardedRef = forwardRef(OverlayScrollbarsComponent) as <\r\n  T extends ElementType = 'div'\r\n>(\r\n  props: OverlayScrollbarsComponentProps<T>\r\n) => ReturnType<typeof OverlayScrollbarsComponent>;\r\n\r\nexport { OverlayScrollbarsComponentForwardedRef as OverlayScrollbarsComponent };\r\n"],"names":["createDefer","noop","idleId","rafId","wnd","idleSupported","rAF","cAF","rIdle","cIdle","clear","callback","options","useOverlayScrollbars","params","events","defer","requestDefer","cancelDefer","useMemo","instanceRef","useRef","deferRef","optionsRef","eventsRef","useEffect","instance","OverlayScrollbars","_a","target","presentInstance","currDefer","currOptions","currEvents","init","OverlayScrollbarsComponent","props","ref","element","children","other","Tag","elementRef","childrenRef","initialize","osInstance","elm","contentsElm","useImperativeHandle","OverlayScrollbarsComponentForwardedRef","forwardRef"],"mappings":"wIA6BMA,EAAc,IAAa,CAE3B,GAAA,OAAO,OAAW,IAAa,CAGjC,MAAMC,EAAO,IAAM,CAAA,EACZ,MAAA,CAACA,EAAMA,CAAI,CACpB,CAGI,IAAAC,EACAC,EACJ,MAAMC,EAAM,OACNC,EAAgB,OAAOD,EAAI,qBAAwB,WACnDE,EAAMF,EAAI,sBACVG,EAAMH,EAAI,qBACVI,EAAQH,EAAgBD,EAAI,oBAAsBE,EAClDG,EAAQJ,EAAgBD,EAAI,mBAAqBG,EACjDG,EAAQ,IAAM,CAClBD,EAAMP,CAAM,EACZK,EAAIJ,CAAK,CAAA,EAGJ,MAAA,CACL,CAACQ,EAAUC,IAAY,CACfF,IACGR,EAAAM,EACPH,EACI,IAAM,CACEK,IAENP,EAAQG,EAAIK,CAAQ,CAAA,EAEtBA,EACJ,OAAOC,GAAY,SAAWA,EAAU,CAAE,QAAS,IAAK,CAAA,CAE5D,EACAF,CAAA,CAEJ,EASaG,EACXC,GACuE,CACvE,KAAM,CAAE,QAAAF,EAAS,OAAAG,EAAQ,MAAAC,CAAM,EAAIF,GAAU,CAAA,EACvC,CAACG,EAAcC,CAAW,EAAIC,EAAAA,QAAenB,EAAa,CAAA,CAAE,EAC5DoB,EAAcC,SAAiD,IAAI,EACnEC,EAAWD,SAAOL,CAAK,EACvBO,EAAaF,SAAOT,CAAO,EAC3BY,EAAYH,SAAON,CAAM,EAE/BU,OAAAA,EAAAA,UAAU,IAAM,CACdH,EAAS,QAAUN,CAAA,EAClB,CAACA,CAAK,CAAC,EAEVS,EAAAA,UAAU,IAAM,CACR,KAAA,CAAE,QAASC,CAAa,EAAAN,EAE9BG,EAAW,QAAUX,EAEjBe,EAAA,kBAAkB,MAAMD,CAAQ,GAClCA,EAAS,QAAQd,GAAW,CAAC,EAAG,EAAI,CACtC,EACC,CAACA,CAAO,CAAC,EAEZa,EAAAA,UAAU,IAAM,CACR,KAAA,CAAE,QAASC,CAAa,EAAAN,EAE9BI,EAAU,QAAUT,EAEhBY,EAAA,kBAAkB,MAAMD,CAAQ,GAClCA,EAAS,GAAGX,GAAU,CAAC,EAAG,EAAI,CAChC,EACC,CAACA,CAAM,CAAC,EAEXU,EAAA,UACE,IAAM,IAAM,OACEP,KACZU,EAAAR,EAAY,UAAZ,MAAAQ,EAAqB,SACvB,EACA,CAAC,CAAA,EAGIT,EAAA,QACL,IAAM,CACHU,GAAW,CAEV,MAAMC,EAAkBV,EAAY,QAChC,GAAAO,EAAA,kBAAkB,MAAMG,CAAe,EACzC,OAGF,MAAMC,EAAYT,EAAS,QACrBU,EAAcT,EAAW,SAAW,GACpCU,EAAaT,EAAU,SAAW,GAClCU,EAAO,IACVd,EAAY,QAAUO,EAAkB,kBAAAE,EAAQG,EAAaC,CAAU,EAEtEF,EACFd,EAAaiB,EAAMH,CAAS,EAEvBG,GAET,EACA,IAAMd,EAAY,OACpB,EACA,CAAC,CAAA,CAEL,EC3GMe,EAA6B,CACjCC,EACAC,IACwB,CAClB,KAAA,CAAE,QAAAC,EAAU,MAAO,QAAA1B,EAAS,OAAAG,EAAQ,MAAAC,EAAO,SAAAuB,EAAU,GAAGC,CAAU,EAAAJ,EAClEK,EAAMH,EACNI,EAAarB,SAAsB,IAAI,EACvCsB,EAActB,SAAuB,IAAI,EACzC,CAACuB,EAAYC,CAAU,EAAIhC,EAAqB,CAAE,QAAAD,EAAS,OAAAG,EAAQ,MAAAC,CAAA,CAAO,EAEhFS,OAAAA,EAAAA,UAAU,IAAM,CACR,KAAA,CAAE,QAASqB,CAAQ,EAAAJ,EACnB,CAAE,QAASK,CAAgB,EAAAJ,EAGjC,GAAI,CAACG,EACH,OAIF,MAAMjB,EAASiB,EAEf,OAAAF,EACEN,IAAY,OACR,CACE,OAAAT,EACA,OAAQ,CACN,KAAM,IACR,CAAA,EAEF,CACE,OAAAA,EACA,SAAU,CACR,SAAUkB,EACV,QAASA,CACX,CACF,CAAA,EAGC,IAAM,OAAA,OAAAnB,EAAAiB,MAAA,YAAAjB,EAAc,UAAQ,EAClC,CAACgB,EAAYN,CAAO,CAAC,EAExBU,EAAA,oBACEX,EACA,KACS,CACL,WAAAQ,EACA,WAAY,IAAMH,EAAW,OAAA,GAGjC,CAAC,CAAA,kBAKAD,EAAI,CAAA,oCAAkC,GAAG,IAAKC,EAAa,GAAGF,CAC5D,EAAAF,IAAY,OACXC,kBAEC,MAAI,CAAA,kCAAgC,GAAG,IAAKI,GAC1CJ,CACH,CAEJ,CAEJ,EAEMU,EAAyCC,aAAWf,CAA0B"}