UNPKG

@ariakit/react-core

Version:

Ariakit React core

75 lines (66 loc) 2.92 kB
"use strict";Object.defineProperty(exports, "__esModule", {value: true}); var _RH6NCQ3Jcjs = require('./RH6NCQ3J.cjs'); var _4SKDRUBRcjs = require('./4SKDRUBR.cjs'); // src/dialog/utils/use-prevent-body-scroll.ts var _dom = require('@ariakit/core/utils/dom'); var _misc = require('@ariakit/core/utils/misc'); var _platform = require('@ariakit/core/utils/platform'); var _react = require('react'); function getPaddingProperty(documentElement) { const documentLeft = documentElement.getBoundingClientRect().left; const scrollbarX = Math.round(documentLeft) + documentElement.scrollLeft; return scrollbarX ? "paddingLeft" : "paddingRight"; } function usePreventBodyScroll(contentElement, contentId, enabled) { const isRootDialog = _RH6NCQ3Jcjs.useRootDialog.call(void 0, { attribute: "data-dialog-prevent-body-scroll", contentElement, contentId, enabled }); _react.useEffect.call(void 0, () => { if (!isRootDialog()) return; if (!contentElement) return; const doc = _dom.getDocument.call(void 0, contentElement); const win = _dom.getWindow.call(void 0, contentElement); const { documentElement, body } = doc; const cssScrollbarWidth = documentElement.style.getPropertyValue("--scrollbar-width"); const scrollbarWidth = cssScrollbarWidth ? Number.parseInt(cssScrollbarWidth, 10) : win.innerWidth - documentElement.clientWidth; const setScrollbarWidthProperty = () => _4SKDRUBRcjs.setCSSProperty.call(void 0, documentElement, "--scrollbar-width", `${scrollbarWidth}px` ); const paddingProperty = getPaddingProperty(documentElement); const setStyle = () => _4SKDRUBRcjs.assignStyle.call(void 0, body, { overflow: "hidden", [paddingProperty]: `${scrollbarWidth}px` }); const setIOSStyle = () => { var _a, _b; const { scrollX, scrollY, visualViewport } = win; const offsetLeft = (_a = visualViewport == null ? void 0 : visualViewport.offsetLeft) != null ? _a : 0; const offsetTop = (_b = visualViewport == null ? void 0 : visualViewport.offsetTop) != null ? _b : 0; const restoreStyle = _4SKDRUBRcjs.assignStyle.call(void 0, body, { position: "fixed", overflow: "hidden", top: `${-(scrollY - Math.floor(offsetTop))}px`, left: `${-(scrollX - Math.floor(offsetLeft))}px`, right: "0", [paddingProperty]: `${scrollbarWidth}px` }); return () => { restoreStyle(); if (process.env.NODE_ENV !== "test") { win.scrollTo({ left: scrollX, top: scrollY, behavior: "instant" }); } }; }; const isIOS = _platform.isApple.call(void 0, ) && !_platform.isMac.call(void 0, ); return _misc.chain.call(void 0, setScrollbarWidthProperty(), isIOS ? setIOSStyle() : setStyle() ); }, [isRootDialog, contentElement]); } exports.usePreventBodyScroll = usePreventBodyScroll;