{"version":3,"file":"dom.mjs","sources":["../../../../packages/utils/dom.ts"],"sourcesContent":["import type { VNode, CSSProperties } from 'vue'\nimport { NOOP } from '../shared/utils'\nimport { isObject, isString } from './is'\nimport { isClient } from './browser'\nimport { toCamelCase } from './convert-case'\n\nexport const on = (() => {\n  if (!isClient) {\n    return NOOP\n  }\n  return <K extends keyof HTMLElementEventMap>(\n    element: HTMLElement | Window,\n    event: K,\n    handler: (ev: HTMLElementEventMap[K]) => void,\n    options: boolean | AddEventListenerOptions = false\n  ) => {\n    element.addEventListener(event, handler as EventListenerOrEventListenerObject, options)\n  }\n})()\n\nexport const off = (() => {\n  if (!isClient) {\n    return NOOP\n  }\n  return <K extends keyof HTMLElementEventMap>(\n    element: HTMLElement | Window,\n    type: K,\n    handler: (ev: HTMLElementEventMap[K]) => void,\n    options: boolean | EventListenerOptions = false\n  ) => {\n    element.removeEventListener(type, handler as EventListenerOrEventListenerObject, options)\n  }\n})()\n\nexport const findDomNode = (vnode: VNode) => {\n  let node = vnode.el\n  while (node && !node.tagName) {\n    node = node.nextSibling\n  }\n  return node as HTMLElement\n}\n\nexport const contains = (root: Node | null | undefined, ele: Node | null) => {\n  if (!root || !ele) {\n    return false\n  }\n  let node: Node | null = ele\n  while (node) {\n    if (node === root) {\n      return true\n    }\n    node = node.parentNode\n  }\n  return false\n}\n\nexport const querySelector = (selectors: string, container?: Document | HTMLElement) => {\n  if (!isClient) {\n    return\n  }\n  return (container ?? document).querySelector<HTMLElement>(selectors) ?? undefined\n}\n\nexport const getElement = (\n  target: string | HTMLElement | undefined,\n  container?: Document | HTMLElement\n): HTMLElement | undefined => {\n  if (isString(target)) {\n    const selector = target[0] === '#' ? `[id='${target.slice(1)}']` : target\n    return querySelector(selector, container)\n  }\n  return target\n}\n\n/**\n * Get the relative distance between two DOMs\n * @param target\n * @param relative\n */\nexport const getRelativeRect = (target: HTMLElement, relative: HTMLElement) => {\n  const targetRect = target.getBoundingClientRect()\n  const relativeRect = relative.getBoundingClientRect()\n\n  return {\n    top: targetRect.top - relativeRect.top,\n    bottom: relativeRect.bottom - targetRect.bottom,\n    left: targetRect.left - relativeRect.left,\n    right: relativeRect.right - targetRect.right,\n    width: targetRect.width,\n    height: targetRect.height\n  }\n}\n\nexport const isScroll = (element: HTMLElement) => {\n  return element.tagName === 'BODY'\n    ? document.documentElement.scrollHeight > window.innerHeight\n    : element.scrollHeight > element.offsetHeight\n}\n\nexport const getScrollBarWidth = (element: HTMLElement) => {\n  if (element.tagName === 'BODY') {\n    return window.innerWidth - (document.documentElement.offsetWidth || document.body.offsetWidth)\n  }\n  const { borderLeftWidth, borderRightWidth } = window.getComputedStyle(element)\n  const borderWidth =\n    Number(borderLeftWidth.replace('px', '')) + Number(borderRightWidth.replace('px', ''))\n  const scrollbarWidth = element.offsetWidth - (element.clientWidth + borderWidth)\n  return scrollbarWidth\n}\n\nexport const getStyle = (element: HTMLElement, styleName: keyof CSSProperties): string => {\n  if (!isClient || !element || !styleName) return ''\n\n  let key = toCamelCase(styleName)\n  if (key === 'float') key = 'cssFloat'\n  try {\n    const style = (element.style as any)[key]\n    if (style) return style\n    const computed: any = document.defaultView?.getComputedStyle(element, '')\n    return computed ? computed[key] : ''\n  } catch {\n    return (element.style as any)[key]\n  }\n}\n\nexport const setStyle = (\n  element: HTMLElement,\n  styleName: CSSProperties | keyof CSSProperties,\n  value?: string | number\n) => {\n  if (!element || !styleName) return\n  if (isObject(styleName)) {\n    Object.entries(styleName).forEach(([prop, value]) =>\n      setStyle(element, prop as any, value as string)\n    )\n  } else {\n    const key: any = toCamelCase(styleName as keyof CSSProperties)\n    element.style[key] = value as any\n  }\n}\n"],"names":["value"],"mappings":"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"}