{"version":3,"file":"index.mjs","sources":[""],"sourcesContent":["export type TScrollAxis = \"any\" | \"x\" | \"y\";\n\nexport type TGetScrollParentArgs = Parameters<typeof getScrollParent>;\n\nexport type TGetScrollParentReturn = ReturnType<typeof getScrollParent>;\n\nconst isElement = (value: unknown): value is Element => {\n  return Boolean(value && typeof value === \"object\" && (value as Element).nodeType === 1);\n};\n\nconst getParentElement = (element: Element): Element | null => {\n  if (element.parentElement) {\n    return element.parentElement;\n  }\n  const root = element.getRootNode?.();\n  return root && \"host\" in root && isElement(root.host) ? root.host : null;\n};\n\nconst isScrollable = (element: Element, axis: TScrollAxis): boolean => {\n  const view = element.ownerDocument?.defaultView;\n  if (!view) {\n    return false;\n  }\n  const style = view.getComputedStyle(element);\n  const canScroll = (value: string): boolean => /^(auto|overlay|scroll)$/.test(value);\n  const overflow = style.overflow;\n  const overflowX = style.overflowX;\n  const overflowY = style.overflowY;\n  if (axis === \"x\") {\n    return canScroll(overflowX) || canScroll(overflow);\n  }\n  if (axis === \"y\") {\n    return canScroll(overflowY) || canScroll(overflow);\n  }\n  return canScroll(overflowX) || canScroll(overflowY) || canScroll(overflow);\n};\n\n/**\n * Gets the nearest ancestor configured as a scroll container for the selected axis.\n * Falls back to the document scrolling element when no nested container is found.\n * @param {Element} element Source element\n * @param {TScrollAxis} [axis=\"any\"] Scroll axis to inspect\n * @returns {Element|null} Nearest scroll container or document root\n * @throws {TypeError} getScrollParent: arguments are invalid\n * @example\n * const scrollContainer = getScrollParent(dropdownTrigger);\n * scrollContainer?.addEventListener(\"scroll\", repositionDropdown);\n * @example\n * // Use the vertical scroll parent as an IntersectionObserver root\n * const root = getScrollParent(loadMoreButton, \"y\");\n * const observer = new IntersectionObserver(loadNextPage, { root });\n */\nexport const getScrollParent = (\n  element: Element,\n  axis: TScrollAxis = \"any\"\n): Element | null => {\n  if (!isElement(element)) {\n    throw new TypeError(\"getScrollParent: element must be a DOM element\");\n  }\n  if (axis !== \"any\" && axis !== \"x\" && axis !== \"y\") {\n    throw new TypeError('getScrollParent: axis must be \"any\", \"x\", or \"y\"');\n  }\n\n  const document = element.ownerDocument;\n  let parent = getParentElement(element);\n  while (parent && parent !== document.body && parent !== document.documentElement) {\n    if (isScrollable(parent, axis)) {\n      return parent;\n    }\n    parent = getParentElement(parent);\n  }\n  return document.scrollingElement ?? document.documentElement ?? null;\n};\n"],"names":["isElement","value","Boolean","nodeType","getParentElement","element","parentElement","root","getRootNode","host","isScrollable","axis","view","ownerDocument","defaultView","style","getComputedStyle","canScroll","test","overflow","overflowX","overflowY","getScrollParent","TypeError","document","parent","body","documentElement","scrollingElement"],"mappings":"AAMA,MAAMA,UAAaC,OACVC,QAAQD,cAAgBA,QAAU,UAAaA,MAAkBE,WAAa,GAGvF,MAAMC,iBAAoBC,UACxB,GAAIA,QAAQC,cACV,OAAOD,QAAQC,cAEjB,MAAMC,KAAOF,QAAQG,gBACrB,OAAOD,MAAQ,SAAUA,MAAQP,UAAUO,KAAKE,MAAQF,KAAKE,KAAO,MAGtE,MAAMC,aAAe,CAACL,QAAkBM,QACtC,MAAMC,KAAOP,QAAQQ,eAAeC,YACpC,IAAKF,KACH,OAAO,MAET,MAAMG,MAAQH,KAAKI,iBAAiBX,SACpC,MAAMY,UAAahB,OAA2B,0BAA0BiB,KAAKjB,OAC7E,MAAMkB,SAAWJ,MAAMI,SACvB,MAAMC,UAAYL,MAAMK,UACxB,MAAMC,UAAYN,MAAMM,UACxB,GAAIV,OAAS,IACX,OAAOM,UAAUG,YAAcH,UAAUE,UAE3C,GAAIR,OAAS,IACX,OAAOM,UAAUI,YAAcJ,UAAUE,UAE3C,OAAOF,UAAUG,YAAcH,UAAUI,YAAcJ,UAAUE,WAkB5D,MAAMG,gBAAkB,CAC7BjB,QACAM,KAAoB,SAEpB,IAAKX,UAAUK,SACb,MAAM,IAAIkB,UAAU,kDAEtB,GAAIZ,OAAS,OAASA,OAAS,KAAOA,OAAS,IAC7C,MAAM,IAAIY,UAAU,oDAGtB,MAAMC,SAAWnB,QAAQQ,cACzB,IAAIY,OAASrB,iBAAiBC,SAC9B,MAAOoB,QAAUA,SAAWD,SAASE,MAAQD,SAAWD,SAASG,gBAAiB,CAChF,GAAIjB,aAAae,OAAQd,MACvB,OAAOc,OAETA,OAASrB,iBAAiBqB,OAC5B,CACA,OAAOD,SAASI,kBAAoBJ,SAASG,iBAAmB"}