{"version":3,"file":"overlayscrollbars-solid.mjs","sources":["../src/createOverlayScrollbars.ts","../src/OverlayScrollbarsComponent.tsx"],"sourcesContent":["import { createRenderEffect, onCleanup } from 'solid-js';\r\nimport { OverlayScrollbars } from 'overlayscrollbars';\r\nimport type { Accessor } from 'solid-js';\r\nimport type { Store } from 'solid-js/store';\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 CreateOverlayScrollbarsParams {\r\n  /** OverlayScrollbars options. */\r\n  options?:\r\n    | OverlayScrollbarsComponentProps['options']\r\n    | Accessor<OverlayScrollbarsComponentProps['options']>;\r\n  /** OverlayScrollbars events. */\r\n  events?:\r\n    | OverlayScrollbarsComponentProps['events']\r\n    | Accessor<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?:\r\n    | OverlayScrollbarsComponentProps['defer']\r\n    | Accessor<OverlayScrollbarsComponentProps['defer']>;\r\n}\r\n\r\nexport type CreateOverlayScrollbarsInitialization = (target: InitializationTarget) => void;\r\n\r\nexport type CreateOverlayScrollbarsInstance = () => 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\nconst isAccessor = (obj: any): obj is Accessor<any> => typeof obj === 'function';\r\nconst unwrapAccessor = <T>(obj: Accessor<T> | T): T => (isAccessor(obj) ? obj() : obj);\r\n\r\nexport const createOverlayScrollbars = (\r\n  params?:\r\n    | CreateOverlayScrollbarsParams\r\n    | Accessor<CreateOverlayScrollbarsParams | undefined>\r\n    | Store<CreateOverlayScrollbarsParams | undefined>\r\n): [CreateOverlayScrollbarsInitialization, CreateOverlayScrollbarsInstance] => {\r\n  let instance: OverlayScrollbars | null = null;\r\n  let options: OverlayScrollbarsComponentProps['options'];\r\n  let events: OverlayScrollbarsComponentProps['events'];\r\n  let defer: OverlayScrollbarsComponentProps['defer'];\r\n  const [requestDefer, clearDefer] = createDefer();\r\n\r\n  createRenderEffect(() => {\r\n    defer = unwrapAccessor(unwrapAccessor(params)?.defer);\r\n  });\r\n\r\n  createRenderEffect(() => {\r\n    options = unwrapAccessor(unwrapAccessor(params)?.options);\r\n\r\n    if (OverlayScrollbars.valid(instance)) {\r\n      instance.options(options || {}, true);\r\n    }\r\n  });\r\n\r\n  createRenderEffect(() => {\r\n    events = unwrapAccessor(unwrapAccessor(params)?.events);\r\n\r\n    if (OverlayScrollbars.valid(instance)) {\r\n      instance.on(events || {}, true);\r\n    }\r\n  });\r\n\r\n  onCleanup(() => {\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","import {\r\n  mergeProps,\r\n  splitProps,\r\n  children,\r\n  onCleanup,\r\n  createEffect,\r\n  createRenderEffect,\r\n  createSignal,\r\n} from 'solid-js';\r\nimport { Dynamic } from 'solid-js/web';\r\nimport type { JSX, ParentProps, ComponentProps, Ref, ValidComponent } from 'solid-js';\r\nimport type { OverlayScrollbars, PartialOptions, EventListeners } from 'overlayscrollbars';\r\nimport { createOverlayScrollbars } from './createOverlayScrollbars';\r\n\r\ntype InferGenericElement<T> = T extends keyof JSX.HTMLAttributes<infer G> ? G : HTMLElement;\r\n\r\nexport type OverlayScrollbarsComponentProps<T extends ValidComponent = 'div'> = Omit<\r\n  ComponentProps<T>,\r\n  'ref'\r\n> &\r\n  ParentProps<{\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    /** OverlayScrollbarsComponent ref. */\r\n    ref?: Ref<OverlayScrollbarsComponentRef<T>>;\r\n  }>;\r\n\r\nexport interface OverlayScrollbarsComponentRef<T extends ValidComponent = '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(): InferGenericElement<T> | null;\r\n}\r\n\r\nexport const OverlayScrollbarsComponent = <T extends ValidComponent = 'div'>(\r\n  props: OverlayScrollbarsComponentProps<T>\r\n) => {\r\n  const [finalProps, other] = splitProps(\r\n    mergeProps({ element: 'div' }, props as OverlayScrollbarsComponentProps),\r\n    ['element', 'options', 'events', 'defer', 'ref', 'children']\r\n  );\r\n  const [elementRef, setElementRef] = createSignal<HTMLDivElement | undefined>();\r\n  const [childrenRef, setChildrenRef] = createSignal<HTMLDivElement | undefined>();\r\n  const [initialize, instance] = createOverlayScrollbars(finalProps);\r\n  // https://github.com/KingSora/OverlayScrollbars/issues/700\r\n  // use the children helper outside of jsx: https://docs.solidjs.com/reference/component-apis/children\r\n  const resolvedChildren = children(() => finalProps.children);\r\n\r\n  createEffect(() => {\r\n    const target = elementRef();\r\n    const contentsElement = childrenRef();\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      finalProps.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: contentsElement,\r\n              content: contentsElement,\r\n            },\r\n          }\r\n    );\r\n\r\n    onCleanup(() => {\r\n      instance()?.destroy();\r\n    });\r\n  });\r\n\r\n  createRenderEffect(() => {\r\n    const ref = {\r\n      osInstance: instance,\r\n      getElement: () =>\r\n        /* c8 ignore next */\r\n        elementRef() || null,\r\n    };\r\n\r\n    if (typeof finalProps.ref === 'function') {\r\n      finalProps.ref(ref);\r\n    } else {\r\n      finalProps.ref = ref;\r\n    }\r\n  });\r\n\r\n  return (\r\n    <Dynamic\r\n      component={finalProps.element}\r\n      data-overlayscrollbars-initialize=\"\"\r\n      ref={setElementRef}\r\n      {...other}\r\n    >\r\n      {finalProps.element === 'body' ? (\r\n        resolvedChildren()\r\n      ) : (\r\n        <div data-overlayscrollbars-contents=\"\" ref={setChildrenRef}>\r\n          {resolvedChildren()}\r\n        </div>\r\n      )}\r\n    </Dynamic>\r\n  );\r\n};\r\n"],"names":["createDefer","noop","idleId","rafId","wnd","idleSupported","rAF","cAF","rIdle","cIdle","clear","callback","options","isAccessor","obj","unwrapAccessor","createOverlayScrollbars","params","instance","events","defer","requestDefer","clearDefer","createRenderEffect","_a","OverlayScrollbars","onCleanup","target","init","OverlayScrollbarsComponent","props","finalProps","other","splitProps","mergeProps","element","elementRef","setElementRef","createSignal","childrenRef","setChildrenRef","initialize","resolvedChildren","children","createEffect","contentsElement","cancel","body","elements","viewport","content","destroy","ref","osInstance","getElement","_$createComponent","Dynamic","_$mergeProps","component","_$memo","_el$","_$getNextElement","_tmpl$","_$use","_$insert"],"mappings":"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"}