@vkontakte/vkui 7.1.2-alpha.0 → 7.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AppRoot/ScrollContext.d.ts.map +1 -1
- package/dist/components/AppRoot/ScrollContext.js +19 -15
- package/dist/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/AppRoot/ScrollContext.js +19 -15
- package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/cssm/components/FormItem/FormItem.module.css +37 -19
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +1 -1
- package/src/components/AppRoot/ScrollContext.tsx +17 -20
- package/src/components/FormItem/FormItem.module.css +19 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ScrollContext.d.ts","sourceRoot":"","sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"ScrollContext.d.ts","sourceRoot":"","sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAuB/C,MAAM,MAAM,gBAAgB,GAAG;IAC7B,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC,CAAC;AAEF,MAAM,WAAW,sBAAsB;IACrC,SAAS,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,EAAE,gBAAgB,KAAK;QAAE,CAAC,EAAE,MAAM,CAAC;QAAC,CAAC,EAAE,MAAM,CAAA;KAAE,CAAC;IAChF,QAAQ,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACvD;;OAEG;IACH,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjD;;OAEG;IACH,0BAA0B,EAAE,CAAC,IAAI,EAAE,IAAI,KAAK,IAAI,CAAC;IACjD,wBAAwB,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,MAAM,IAAI,CAAC,CAAC,CAAC;CAC7D;AAED,eAAO,MAAM,aAAa,EAAE,KAAK,CAAC,OAAO,CAAC,sBAAsB,CAM5D,CAAC;AAEL,eAAO,MAAM,SAAS,QAAO,sBAAyD,CAAC;AA8BvF,MAAM,WAAW,qBAAsB,SAAQ,WAAW;IACxD,KAAK,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;CAC5C;AAED,eAAO,MAAM,sBAAsB,iBAAkB,qBAAqB,KAAG,KAAK,CAAC,SAwElF,CAAC;AAEF,eAAO,MAAM,uBAAuB,yBAGjC,qBAAqB,KAAG,KAAK,CAAC,SA4EhC,CAAC;AAEF;;;;GAIG;AACH,eAAO,MAAM,aAAa,yBAAqB,IAW9C,CAAC"}
|
|
@@ -3,7 +3,6 @@ import { jsx as _jsx } from "react/jsx-runtime";
|
|
|
3
3
|
import * as React from "react";
|
|
4
4
|
import { noop } from "@vkontakte/vkjs";
|
|
5
5
|
import { clamp } from "../../helpers/math.js";
|
|
6
|
-
import { useCounter } from "../../hooks/useCounter.js";
|
|
7
6
|
import { useDOM } from "../../lib/dom.js";
|
|
8
7
|
const clearDisableScrollStyle = (node)=>{
|
|
9
8
|
Object.assign(node.style, {
|
|
@@ -37,28 +36,33 @@ export const useScroll = ()=>React.useContext(ScrollContext);
|
|
|
37
36
|
* Управляет блокировкой окна в зависимости от внутреннего счетчика.
|
|
38
37
|
* Если счетчик больше нуля, требуется заблокировать прокрутку
|
|
39
38
|
*/ function useScrollLockController(enableScrollLock, disableScrollLock) {
|
|
40
|
-
const
|
|
41
|
-
const
|
|
42
|
-
|
|
43
|
-
React.useEffect(()=>{
|
|
44
|
-
if (isFirstEffect.current) {
|
|
45
|
-
isFirstEffect.current = false;
|
|
46
|
-
return;
|
|
47
|
-
}
|
|
48
|
-
if (needLockScroll) {
|
|
39
|
+
const countRef = React.useRef(0);
|
|
40
|
+
const updateScrollLock = React.useCallback(()=>{
|
|
41
|
+
if (countRef.current > 0) {
|
|
49
42
|
enableScrollLock();
|
|
50
43
|
} else {
|
|
51
44
|
disableScrollLock();
|
|
52
45
|
}
|
|
53
46
|
}, [
|
|
54
|
-
needLockScroll,
|
|
55
47
|
enableScrollLock,
|
|
56
48
|
disableScrollLock
|
|
57
49
|
]);
|
|
58
|
-
|
|
50
|
+
const incrementScrollLockCounter = React.useCallback(()=>{
|
|
51
|
+
countRef.current += 1;
|
|
52
|
+
updateScrollLock();
|
|
53
|
+
}, [
|
|
54
|
+
updateScrollLock
|
|
55
|
+
]);
|
|
56
|
+
const decrementScrollLockCounter = React.useCallback(()=>{
|
|
57
|
+
countRef.current -= 1;
|
|
58
|
+
updateScrollLock();
|
|
59
|
+
}, [
|
|
60
|
+
updateScrollLock
|
|
61
|
+
]);
|
|
62
|
+
return [
|
|
59
63
|
incrementScrollLockCounter,
|
|
60
64
|
decrementScrollLockCounter
|
|
61
|
-
|
|
65
|
+
];
|
|
62
66
|
}
|
|
63
67
|
export const GlobalScrollController = ({ children })=>{
|
|
64
68
|
const { window, document } = useDOM();
|
|
@@ -114,7 +118,7 @@ export const GlobalScrollController = ({ children })=>{
|
|
|
114
118
|
document,
|
|
115
119
|
window
|
|
116
120
|
]);
|
|
117
|
-
const
|
|
121
|
+
const [incrementScrollLockCounter, decrementScrollLockCounter] = useScrollLockController(enableScrollLock, disableScrollLock);
|
|
118
122
|
const scrollController = React.useMemo(()=>({
|
|
119
123
|
getScroll,
|
|
120
124
|
scrollTo,
|
|
@@ -186,7 +190,7 @@ export const ElementScrollController = ({ elRef, children })=>{
|
|
|
186
190
|
}, [
|
|
187
191
|
elRef
|
|
188
192
|
]);
|
|
189
|
-
const
|
|
193
|
+
const [incrementScrollLockCounter, decrementScrollLockCounter] = useScrollLockController(enableScrollLock, disableScrollLock);
|
|
190
194
|
const scrollController = React.useMemo(()=>({
|
|
191
195
|
getScroll,
|
|
192
196
|
scrollTo,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useCounter } from '../../hooks/useCounter';\nimport { useDOM } from '../../lib/dom';\nimport type { HasChildren } from '../../types';\n\nconst clearDisableScrollStyle = (node: HTMLElement) => {\n Object.assign(node.style, {\n position: '',\n top: '',\n left: '',\n right: '',\n overscrollBehavior: '',\n overflowY: '',\n overflowX: '',\n });\n};\n\nconst getPageYOffsetWithoutKeyboardHeight = (window: Window) => {\n // Note: здесь расчёт на то, что `clientHeight` равен `window.innerHeight`.\n // Это достигается тем, что тегу `html` задали`height: 100%` и у него нет отступов сверху и снизу. Если есть отступы,\n // то надо задать `box-sizing: border-box`, чтобы они не учитывались.\n const diffOfClientHeightAndViewportHeight =\n window.document.documentElement.clientHeight - window.innerHeight;\n return window.pageYOffset - diffOfClientHeightAndViewportHeight;\n};\n\nexport type GetScrollOptions = {\n compensateKeyboardHeight?: boolean;\n};\n\nexport interface ScrollContextInterface {\n getScroll: (this: void, options?: GetScrollOptions) => { x: number; y: number };\n scrollTo: (this: void, x?: number, y?: number) => void;\n /**\n * Увеличивает счетчик блокировки прокрутки\n */\n incrementScrollLockCounter: (this: void) => void;\n /**\n * Уменьшает счетчик блокировки прокрутки\n */\n decrementScrollLockCounter: (this: void) => void;\n beforeScrollLockFnSetRef?: React.RefObject<Set<() => void>>;\n}\n\nexport const ScrollContext: React.Context<ScrollContextInterface> =\n React.createContext<ScrollContextInterface>({\n getScroll: () => ({ x: 0, y: 0 }),\n scrollTo: noop,\n incrementScrollLockCounter: noop,\n decrementScrollLockCounter: noop,\n });\n\nexport const useScroll = (): ScrollContextInterface => React.useContext(ScrollContext);\n\n/**\n * Управляет блокировкой окна в зависимости от внутреннего счетчика.\n * Если счетчик больше нуля, требуется заблокировать прокрутку\n */\nfunction useScrollLockController(enableScrollLock: () => void, disableScrollLock: () => void) {\n const isFirstEffect = React.useRef(true);\n const [count, { increment: incrementScrollLockCounter, decrement: decrementScrollLockCounter }] =\n useCounter(0);\n\n const needLockScroll = count > 0;\n\n React.useEffect(() => {\n if (isFirstEffect.current) {\n isFirstEffect.current = false;\n return;\n }\n\n if (needLockScroll) {\n enableScrollLock();\n } else {\n disableScrollLock();\n }\n }, [needLockScroll, enableScrollLock, disableScrollLock]);\n\n return {\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n };\n}\n\nexport interface ScrollControllerProps extends HasChildren {\n elRef: React.RefObject<HTMLElement | null>;\n}\n\nexport const GlobalScrollController = ({ children }: ScrollControllerProps): React.ReactNode => {\n const { window, document } = useDOM();\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n (options = { compensateKeyboardHeight: true }) => ({\n x: window!.pageXOffset,\n y: options.compensateKeyboardHeight\n ? getPageYOffsetWithoutKeyboardHeight(window!)\n : window!.pageYOffset,\n }),\n [window],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n // Some iOS versions do not normalize scroll — do it manually.\n window!.scrollTo(\n x ? clamp(x, 0, document!.body.scrollWidth - window!.innerWidth) : 0,\n y ? clamp(y, 0, document!.body.scrollHeight - window!.innerHeight) : 0,\n );\n },\n [document, window],\n );\n\n const enableScrollLock = React.useCallback(() => {\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = window!.pageYOffset;\n const scrollX = window!.pageXOffset;\n const overflowY = window!.innerWidth > document!.documentElement.clientWidth ? 'scroll' : '';\n const overflowX = window!.innerHeight > document!.documentElement.clientHeight ? 'scroll' : '';\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: 'none' });\n Object.assign(document!.body.style, {\n position: 'fixed',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overscrollBehavior: 'none',\n overflowY,\n overflowX,\n });\n }, [document, window]);\n\n const disableScrollLock = React.useCallback(() => {\n const scrollY = document!.body.style.top;\n const scrollX = document!.body.style.left;\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: '' });\n clearDisableScrollStyle(document!.body);\n window!.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [document, window]);\n\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef: beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\nexport const ElementScrollController = ({\n elRef,\n children,\n}: ScrollControllerProps): React.ReactNode => {\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n () => ({\n x: elRef.current?.scrollLeft ?? 0,\n y: elRef.current?.scrollTop ?? 0,\n }),\n [elRef],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n const el = elRef.current;\n // Some iOS versions do not normalize scroll — do it manually.\n el?.scrollTo(\n x ? clamp(x, 0, el.scrollWidth - el.clientWidth) : 0,\n y ? clamp(y, 0, el.scrollHeight - el.clientHeight) : 0,\n );\n },\n [elRef],\n );\n\n const enableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = el.scrollTop;\n const scrollX = el.scrollLeft;\n const overflowY = el.scrollWidth > el.clientWidth ? 'scroll' : '';\n const overflowX = el.scrollHeight > el.clientHeight ? 'scroll' : '';\n\n Object.assign(el.style, {\n position: 'absolute',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overflowY,\n overflowX,\n });\n }, [elRef]);\n\n const disableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n\n const scrollY = el.style.top;\n const scrollX = el.style.left;\n\n clearDisableScrollStyle(el);\n el.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [elRef]);\n\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\n/**\n * Блокирует прокрутку окна\n *\n * @param enabled - если false то не будет блокировать\n */\nexport const useScrollLock = (enabled = true): void => {\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScroll();\n\n React.useEffect(() => {\n if (enabled) {\n incrementScrollLockCounter();\n return decrementScrollLockCounter;\n }\n\n return noop;\n }, [enabled, incrementScrollLockCounter, decrementScrollLockCounter]);\n};\n"],"names":["React","noop","clamp","useCounter","useDOM","clearDisableScrollStyle","node","Object","assign","style","position","top","left","right","overscrollBehavior","overflowY","overflowX","getPageYOffsetWithoutKeyboardHeight","window","diffOfClientHeightAndViewportHeight","document","documentElement","clientHeight","innerHeight","pageYOffset","ScrollContext","createContext","getScroll","x","y","scrollTo","incrementScrollLockCounter","decrementScrollLockCounter","useScroll","useContext","useScrollLockController","enableScrollLock","disableScrollLock","isFirstEffect","useRef","count","increment","decrement","needLockScroll","useEffect","current","GlobalScrollController","children","beforeScrollLockFnSetRef","Set","useCallback","options","compensateKeyboardHeight","pageXOffset","body","scrollWidth","innerWidth","scrollHeight","forEach","fn","scrollY","scrollX","clientWidth","parseInt","scrollController","useMemo","Provider","value","ElementScrollController","elRef","scrollLeft","scrollTop","el","useScrollLock","enabled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useDOM } from '../../lib/dom';\nimport type { HasChildren } from '../../types';\n\nconst clearDisableScrollStyle = (node: HTMLElement) => {\n Object.assign(node.style, {\n position: '',\n top: '',\n left: '',\n right: '',\n overscrollBehavior: '',\n overflowY: '',\n overflowX: '',\n });\n};\n\nconst getPageYOffsetWithoutKeyboardHeight = (window: Window) => {\n // Note: здесь расчёт на то, что `clientHeight` равен `window.innerHeight`.\n // Это достигается тем, что тегу `html` задали`height: 100%` и у него нет отступов сверху и снизу. Если есть отступы,\n // то надо задать `box-sizing: border-box`, чтобы они не учитывались.\n const diffOfClientHeightAndViewportHeight =\n window.document.documentElement.clientHeight - window.innerHeight;\n return window.pageYOffset - diffOfClientHeightAndViewportHeight;\n};\n\nexport type GetScrollOptions = {\n compensateKeyboardHeight?: boolean;\n};\n\nexport interface ScrollContextInterface {\n getScroll: (this: void, options?: GetScrollOptions) => { x: number; y: number };\n scrollTo: (this: void, x?: number, y?: number) => void;\n /**\n * Увеличивает счетчик блокировки прокрутки\n */\n incrementScrollLockCounter: (this: void) => void;\n /**\n * Уменьшает счетчик блокировки прокрутки\n */\n decrementScrollLockCounter: (this: void) => void;\n beforeScrollLockFnSetRef?: React.RefObject<Set<() => void>>;\n}\n\nexport const ScrollContext: React.Context<ScrollContextInterface> =\n React.createContext<ScrollContextInterface>({\n getScroll: () => ({ x: 0, y: 0 }),\n scrollTo: noop,\n incrementScrollLockCounter: noop,\n decrementScrollLockCounter: noop,\n });\n\nexport const useScroll = (): ScrollContextInterface => React.useContext(ScrollContext);\n\n/**\n * Управляет блокировкой окна в зависимости от внутреннего счетчика.\n * Если счетчик больше нуля, требуется заблокировать прокрутку\n */\nfunction useScrollLockController(enableScrollLock: () => void, disableScrollLock: () => void) {\n const countRef = React.useRef(0);\n\n const updateScrollLock = React.useCallback(() => {\n if (countRef.current > 0) {\n enableScrollLock();\n } else {\n disableScrollLock();\n }\n }, [enableScrollLock, disableScrollLock]);\n\n const incrementScrollLockCounter = React.useCallback(() => {\n countRef.current += 1;\n updateScrollLock();\n }, [updateScrollLock]);\n\n const decrementScrollLockCounter = React.useCallback(() => {\n countRef.current -= 1;\n updateScrollLock();\n }, [updateScrollLock]);\n\n return [incrementScrollLockCounter, decrementScrollLockCounter];\n}\n\nexport interface ScrollControllerProps extends HasChildren {\n elRef: React.RefObject<HTMLElement | null>;\n}\n\nexport const GlobalScrollController = ({ children }: ScrollControllerProps): React.ReactNode => {\n const { window, document } = useDOM();\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n (options = { compensateKeyboardHeight: true }) => ({\n x: window!.pageXOffset,\n y: options.compensateKeyboardHeight\n ? getPageYOffsetWithoutKeyboardHeight(window!)\n : window!.pageYOffset,\n }),\n [window],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n // Some iOS versions do not normalize scroll — do it manually.\n window!.scrollTo(\n x ? clamp(x, 0, document!.body.scrollWidth - window!.innerWidth) : 0,\n y ? clamp(y, 0, document!.body.scrollHeight - window!.innerHeight) : 0,\n );\n },\n [document, window],\n );\n\n const enableScrollLock = React.useCallback(() => {\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = window!.pageYOffset;\n const scrollX = window!.pageXOffset;\n const overflowY = window!.innerWidth > document!.documentElement.clientWidth ? 'scroll' : '';\n const overflowX = window!.innerHeight > document!.documentElement.clientHeight ? 'scroll' : '';\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: 'none' });\n Object.assign(document!.body.style, {\n position: 'fixed',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overscrollBehavior: 'none',\n overflowY,\n overflowX,\n });\n }, [document, window]);\n\n const disableScrollLock = React.useCallback(() => {\n const scrollY = document!.body.style.top;\n const scrollX = document!.body.style.left;\n\n Object.assign(document!.documentElement.style, { overscrollBehavior: '' });\n clearDisableScrollStyle(document!.body);\n window!.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [document, window]);\n\n const [incrementScrollLockCounter, decrementScrollLockCounter] = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef: beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\nexport const ElementScrollController = ({\n elRef,\n children,\n}: ScrollControllerProps): React.ReactNode => {\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n () => ({\n x: elRef.current?.scrollLeft ?? 0,\n y: elRef.current?.scrollTop ?? 0,\n }),\n [elRef],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n const el = elRef.current;\n // Some iOS versions do not normalize scroll — do it manually.\n el?.scrollTo(\n x ? clamp(x, 0, el.scrollWidth - el.clientWidth) : 0,\n y ? clamp(y, 0, el.scrollHeight - el.clientHeight) : 0,\n );\n },\n [elRef],\n );\n\n const enableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n\n const scrollY = el.scrollTop;\n const scrollX = el.scrollLeft;\n const overflowY = el.scrollWidth > el.clientWidth ? 'scroll' : '';\n const overflowX = el.scrollHeight > el.clientHeight ? 'scroll' : '';\n\n Object.assign(el.style, {\n position: 'absolute',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overflowY,\n overflowX,\n });\n }, [elRef]);\n\n const disableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n\n const scrollY = el.style.top;\n const scrollX = el.style.left;\n\n clearDisableScrollStyle(el);\n el.scrollTo(-parseInt(scrollX || '0'), -parseInt(scrollY || '0'));\n }, [elRef]);\n\n const [incrementScrollLockCounter, decrementScrollLockCounter] = useScrollLockController(\n enableScrollLock,\n disableScrollLock,\n );\n\n const scrollController = React.useMemo<ScrollContextInterface>(\n () => ({\n getScroll,\n scrollTo,\n incrementScrollLockCounter,\n decrementScrollLockCounter,\n beforeScrollLockFnSetRef,\n }),\n [getScroll, scrollTo, incrementScrollLockCounter, decrementScrollLockCounter],\n );\n\n return <ScrollContext.Provider value={scrollController}>{children}</ScrollContext.Provider>;\n};\n\n/**\n * Блокирует прокрутку окна\n *\n * @param enabled - если false то не будет блокировать\n */\nexport const useScrollLock = (enabled = true): void => {\n const { incrementScrollLockCounter, decrementScrollLockCounter } = useScroll();\n\n React.useEffect(() => {\n if (enabled) {\n incrementScrollLockCounter();\n return decrementScrollLockCounter;\n }\n\n return noop;\n }, [enabled, incrementScrollLockCounter, decrementScrollLockCounter]);\n};\n"],"names":["React","noop","clamp","useDOM","clearDisableScrollStyle","node","Object","assign","style","position","top","left","right","overscrollBehavior","overflowY","overflowX","getPageYOffsetWithoutKeyboardHeight","window","diffOfClientHeightAndViewportHeight","document","documentElement","clientHeight","innerHeight","pageYOffset","ScrollContext","createContext","getScroll","x","y","scrollTo","incrementScrollLockCounter","decrementScrollLockCounter","useScroll","useContext","useScrollLockController","enableScrollLock","disableScrollLock","countRef","useRef","updateScrollLock","useCallback","current","GlobalScrollController","children","beforeScrollLockFnSetRef","Set","options","compensateKeyboardHeight","pageXOffset","body","scrollWidth","innerWidth","scrollHeight","forEach","fn","scrollY","scrollX","clientWidth","parseInt","scrollController","useMemo","Provider","value","ElementScrollController","elRef","scrollLeft","scrollTop","el","useScrollLock","enabled","useEffect"],"mappings":"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"}
|