{"version":3,"file":"usePreventScroll.mjs","names":["React","canUseDOM","useUID","getScrollbarWidth","outer","document","createElement","style","visibility","width","msOverflowStyle","body","appendChild","widthNoScroll","offsetWidth","overflow","inner","widthWithScroll","parentNode","removeChild","getIntValueFromCss","value","Number","isNaN","parseInt","scrollPreventers","Set","lockedBodyStyles","paddingRight","boxSizing","usePreventScroll","visible","disabled","scrollbarWidth","useMemo","id","useEffect","add","size","window","getComputedStyle","intPaddingRight","intPaddingRightFromStyle","delete"],"sources":["../../../src/utils/use/usePreventScroll.tsx"],"sourcesContent":["import React from 'react';\n\nimport canUseDOM from '../canUseDOM';\nimport { useUID } from '../uniqueID';\n\nexport function getScrollbarWidth(): number {\n  if (!canUseDOM()) return 0;\n  const outer = document.createElement('div');\n  outer.style.visibility = 'hidden';\n  outer.style.width = '100px';\n  // @ts-expect-error\n  outer.style.msOverflowStyle = 'scrollbar'; // needed for WinJS apps\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\n  outer.parentNode?.removeChild(outer);\n\n  return widthNoScroll - widthWithScroll;\n}\n\nfunction getIntValueFromCss(value: any) {\n  return !Number.isNaN(Number(value)) ? Number(value) : Number.parseInt(value, 10);\n}\n\nconst scrollPreventers = new Set<string>();\nconst lockedBodyStyles = {\n  paddingRight: '',\n  overflow: '',\n  boxSizing: '',\n};\nexport default function usePreventScroll(visible = true, disabled = false) {\n  const scrollbarWidth = React.useMemo(getScrollbarWidth, [getScrollbarWidth]);\n  const id = useUID('scroll-preventer-');\n\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!canUseDOM() || !visible) return;\n    scrollPreventers.add(id);\n    if (scrollPreventers.size > 1) return;\n\n    const { paddingRight } = window.getComputedStyle(document.body);\n\n    lockedBodyStyles.paddingRight = document.body.style.paddingRight;\n    lockedBodyStyles.overflow = document.body.style.overflow;\n    lockedBodyStyles.boxSizing = document.body.style.boxSizing;\n\n    const intPaddingRight = getIntValueFromCss(paddingRight);\n    let intPaddingRightFromStyle = getIntValueFromCss(document.body.style.paddingRight);\n    // Detected own style for window inside window\n    if (intPaddingRightFromStyle !== scrollbarWidth) {\n      intPaddingRightFromStyle = 0;\n    }\n\n    document.body.style.overflow = 'hidden';\n    document.body.style.paddingRight =\n      scrollbarWidth + (intPaddingRight - intPaddingRightFromStyle) + 'px';\n    document.body.style.boxSizing = 'border-box';\n  }, [visible, id, disabled]);\n\n  React.useEffect(() => {\n    if (disabled) return;\n    if (!canUseDOM() || !visible) return;\n    return () => {\n      scrollPreventers.delete(id);\n      if (scrollPreventers.size !== 0) return;\n      document.body.style.overflow = lockedBodyStyles.overflow;\n      document.body.style.paddingRight = lockedBodyStyles.paddingRight;\n      document.body.style.boxSizing = lockedBodyStyles.boxSizing;\n    };\n  }, [visible, id, disabled]);\n}\n"],"mappings":"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","ignoreList":[]}