{"version":3,"file":"scroll.mjs","sources":["../../../../../../packages/utils/dom/scroll.ts"],"sourcesContent":["import { isIOS as checkIsIOS, isClient } from '../browser'\nimport { easeInOutCubic } from '../easings'\nimport { isWindow } from '../types'\nimport { cAF, rAF } from '../raf'\nimport { getStyle } from './style'\n\nexport const isScroll = (el: HTMLElement, isVertical?: boolean): boolean => {\n  if (!isClient) return false\n\n  const key = (\n    {\n      undefined: 'overflow',\n      true: 'overflow-y',\n      false: 'overflow-x',\n    } as const\n  )[String(isVertical)]!\n  const overflow = getStyle(el, key)\n  return ['scroll', 'auto', 'overlay'].some((s) => overflow.includes(s))\n}\n\nexport const getScrollContainer = (\n  el: HTMLElement,\n  isVertical?: boolean\n): Window | HTMLElement | undefined => {\n  if (!isClient) return\n\n  let parent: HTMLElement = el\n  while (parent) {\n    if ([window, document, document.documentElement].includes(parent))\n      return window\n\n    if (isScroll(parent, isVertical)) return parent\n\n    parent = parent.parentNode as HTMLElement\n  }\n\n  return parent\n}\n\nlet scrollBarWidth: number\nexport const getScrollBarWidth = (namespace: string): number => {\n  if (!isClient) return 0\n  if (scrollBarWidth !== undefined) return scrollBarWidth\n\n  const outer = document.createElement('div')\n  outer.className = `${namespace}-scrollbar__wrap`\n  outer.style.visibility = 'hidden'\n  outer.style.width = '100px'\n  outer.style.position = 'absolute'\n  outer.style.top = '-9999px'\n  document.body.appendChild(outer)\n\n  const widthNoScroll = outer.offsetWidth\n  outer.style.overflow = 'scroll'\n\n  const inner = document.createElement('div')\n  inner.style.width = '100%'\n  outer.appendChild(inner)\n\n  const widthWithScroll = inner.offsetWidth\n  outer.parentNode?.removeChild(outer)\n  scrollBarWidth = widthNoScroll - widthWithScroll\n\n  return scrollBarWidth\n}\n\n/**\n * Scroll with in the container element, positioning the **selected** element at the top\n * of the container\n */\nexport function scrollIntoView(\n  container: HTMLElement,\n  selected: HTMLElement\n): void {\n  if (!isClient) return\n\n  if (!selected) {\n    container.scrollTop = 0\n    return\n  }\n\n  const offsetParents: HTMLElement[] = []\n  let pointer = selected.offsetParent\n  while (\n    pointer !== null &&\n    container !== pointer &&\n    container.contains(pointer)\n  ) {\n    offsetParents.push(pointer as HTMLElement)\n    pointer = (pointer as HTMLElement).offsetParent\n  }\n  const top =\n    selected.offsetTop +\n    offsetParents.reduce((prev, curr) => prev + curr.offsetTop, 0)\n  const bottom = top + selected.offsetHeight\n  const viewRectTop = container.scrollTop\n  const viewRectBottom = viewRectTop + container.clientHeight\n\n  if (top < viewRectTop) {\n    container.scrollTop = top\n  } else if (bottom > viewRectBottom) {\n    container.scrollTop = bottom - container.clientHeight\n  }\n}\n\nexport function animateScrollTo(\n  container: HTMLElement | Window,\n  from: number,\n  to: number,\n  duration: number,\n  callback?: unknown\n) {\n  const startTime = Date.now()\n\n  let handle: number | undefined\n  const scroll = () => {\n    const timestamp = Date.now()\n    const time = timestamp - startTime\n    const nextScrollTop = easeInOutCubic(\n      time > duration ? duration : time,\n      from,\n      to,\n      duration\n    )\n\n    if (isWindow(container)) {\n      container.scrollTo(window.pageXOffset, nextScrollTop)\n    } else {\n      container.scrollTop = nextScrollTop\n    }\n    if (time < duration) {\n      handle = rAF(scroll)\n    } else if (typeof callback === 'function') {\n      callback()\n    }\n  }\n\n  scroll()\n\n  return () => {\n    handle && cAF(handle)\n  }\n}\n\nexport const getScrollElement = (\n  target: HTMLElement,\n  container: HTMLElement | Window\n) => {\n  if (isWindow(container)) {\n    return target.ownerDocument.documentElement\n  }\n  return container\n}\n\nexport const getScrollTop = (container: ScrollElement) => {\n  if (isWindow(container)) {\n    return window.scrollY\n  }\n  return container.scrollTop\n}\n\nexport const getRootScrollTop = (): number => {\n  return (\n    window.pageYOffset ||\n    document.documentElement.scrollTop ||\n    document.body.scrollTop ||\n    0\n  )\n}\n\nexport type ScrollElement = Element | Window\n\nexport function setScrollTop(el: ScrollElement, value: number) {\n  if ('scrollTop' in el) {\n    el.scrollTop = value\n  } else {\n    el.scrollTo(el.scrollX, value)\n  }\n}\n\nexport function setRootScrollTop(value: number) {\n  setScrollTop(window, value)\n  setScrollTop(document.body, value)\n}\n\nconst isIOS = checkIsIOS()\n\nexport function resetScroll() {\n  if (isIOS) {\n    setRootScrollTop(getRootScrollTop())\n  }\n}\n"],"names":["checkIsIOS"],"mappings":"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"}