@vkontakte/vkui 7.3.1 → 7.3.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/ActionSheetItem/ActionSheetItem.d.ts.map +1 -1
- package/dist/components/ActionSheetItem/ActionSheetItem.js +1 -1
- package/dist/components/ActionSheetItem/ActionSheetItem.js.map +1 -1
- package/dist/components/AppRoot/ScrollContext.js +5 -5
- 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/ActionSheetItem/ActionSheetItem.js +1 -1
- package/dist/cssm/components/ActionSheetItem/ActionSheetItem.js.map +1 -1
- package/dist/cssm/components/ActionSheetItem/ActionSheetItem.module.css +5 -5
- package/dist/cssm/components/AppRoot/ScrollContext.js +5 -5
- package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/cssm/lib/calendar.js +1 -1
- package/dist/cssm/lib/calendar.js.map +1 -1
- package/dist/lib/calendar.js +1 -1
- package/dist/lib/calendar.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +1 -1
- package/src/components/ActionSheetItem/ActionSheetItem.module.css +5 -5
- package/src/components/ActionSheetItem/ActionSheetItem.module.css.d.ts.map +1 -1
- package/src/components/ActionSheetItem/ActionSheetItem.tsx +1 -0
- package/src/components/AppRoot/ScrollContext.tsx +6 -6
- package/src/lib/calendar.ts +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ActionSheetItem.d.ts","sourceRoot":"","sources":["../../../src/components/ActionSheetItem/ActionSheetItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACvC,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,EACvC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACjF;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;IAC5C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxD;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,iNAoB7B,oBAAoB,KAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"ActionSheetItem.d.ts","sourceRoot":"","sources":["../../../src/components/ActionSheetItem/ActionSheetItem.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAc/B,MAAM,WAAW,oBACf,SAAQ,KAAK,CAAC,cAAc,CAAC,WAAW,CAAC,EACvC,KAAK,CAAC,oBAAoB,CAAC,WAAW,CAAC,EACvC,IAAI,CAAC,KAAK,CAAC,mBAAmB,CAAC,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAAC;IACjF;;OAEG;IACH,IAAI,CAAC,EAAE,SAAS,GAAG,aAAa,GAAG,QAAQ,CAAC;IAC5C;;OAEG;IACH,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;OAEG;IACH,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB;;OAEG;IACH,MAAM,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACzB;;OAEG;IACH,KAAK,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACxB;;OAEG;IACH,IAAI,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IACvB;;OAEG;IACH,QAAQ,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC3B;;;OAGG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAC5B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;;;OAIG;IACH,OAAO,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IAC/C;;OAEG;IACH,gBAAgB,CAAC,EAAE,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACxD;;OAEG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC,SAAS,CAAC;IAC9B;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,eAAO,MAAM,eAAe,GAAI,iNAoB7B,oBAAoB,KAAG,KAAK,CAAC,SAuG/B,CAAC"}
|
|
@@ -83,7 +83,7 @@ import { Radio } from "./subcomponents/Radio/Radio.js";
|
|
|
83
83
|
}, restProps), {
|
|
84
84
|
onClick: onItemClickImpl,
|
|
85
85
|
activeMode: platform === 'ios' ? "vkuiActionSheetItem__active" : undefined,
|
|
86
|
-
baseClassName: classNames("vkuiActionSheetItem__host", platform === 'ios' && "vkuiActionSheetItem__ios", mode === 'cancel' && "vkuiActionSheetItem__modeCancel", mode === 'destructive' && "vkuiActionSheetItem__modeDestructive", sizeY === 'compact' && "vkuiActionSheetItem__sizeYCompact", isRich && "vkuiActionSheetItem__rich", actionSheetMode === 'menu' && "vkuiActionSheetItem__menu"),
|
|
86
|
+
baseClassName: classNames("vkuiActionSheetItem__host", platform === 'ios' && "vkuiActionSheetItem__ios", mode === 'cancel' && "vkuiActionSheetItem__modeCancel", mode === 'destructive' && "vkuiActionSheetItem__modeDestructive", sizeY === 'compact' && "vkuiActionSheetItem__sizeYCompact", isRich && "vkuiActionSheetItem__rich", actionSheetMode === 'menu' && "vkuiActionSheetItem__menu", restProps.disabled && "vkuiActionSheetItem__disabled"),
|
|
87
87
|
onKeyDown: onKeyDown,
|
|
88
88
|
children: [
|
|
89
89
|
before && /*#__PURE__*/ _jsx("div", {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/ActionSheetItem/ActionSheetItem.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { ActionSheetContext, type ActionSheetContextType } from '../ActionSheet/ActionSheetContext';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport { Text } from '../Typography/Text/Text';\nimport { Title } from '../Typography/Title/Title';\nimport { isRealClickEvent } from './helpers';\nimport { Radio } from './subcomponents/Radio/Radio';\nimport styles from './ActionSheetItem.module.css';\n\nexport interface ActionSheetItemProps\n extends React.HTMLAttributes<HTMLElement>,\n React.AnchorHTMLAttributes<HTMLElement>,\n Pick<React.InputHTMLAttributes<HTMLInputElement>, 'name' | 'checked' | 'value'> {\n /**\n * Свойство, определяющее внешний вид элемента действия.\n */\n mode?: 'default' | 'destructive' | 'cancel';\n /**\n * Если указано, элемент будет использоваться как ссылка.\n */\n href?: string;\n /**\n * Атрибут `target` для тега `<a>`.\n */\n target?: string;\n /**\n * Иконка или другой React-элемент для отображения перед основным контентом.\n */\n before?: React.ReactNode;\n /**\n * Иконка или другой React-элемент для отображения после основного контента.\n */\n after?: React.ReactNode;\n /**\n * Дополнительная информация, отображаемая рядом с основным контентом.\n */\n meta?: React.ReactNode;\n /**\n * Слот для подсказки или вспомогательного текста.\n */\n subtitle?: React.ReactNode;\n /**\n * По умолчанию нажатие на опцию вызывает переданную в `ActionSheet` функцию `onClose`, данное свойство\n * позволяет отключить такое поведение.\n */\n autoCloseDisabled?: boolean;\n /**\n * Включает возможность выбрать элемент (отображает радиокнопку).\n */\n selectable?: boolean;\n /**\n * Блокировка взаимодействия с компонентом.\n */\n disabled?: boolean;\n /**\n * Все текстовые элементы при необходимости занимают несколько строк.\n */\n multiline?: boolean;\n /**\n * По умолчанию `onClick` будет вызван после завершения анимации скрытия и после вызова `onClose`.\n * Из этого следует, что в объекте события значения полей типа `currentTarget` будут не определены.\n * Если вам нужен объект события именно на момент нажатия, используйте `onImmediateClick`.\n */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /**\n * Обработчик нажатия, вызывающийся непосредственно в момент нажатия (в отличие от `onClick`).\n */\n onImmediateClick?: React.MouseEventHandler<HTMLElement>;\n /**\n * Иконка для `selectable` режима.\n */\n iconChecked?: React.ReactNode;\n /**\n * Позволяет отделить `ActionItem` от `CancelItem` для определении того,\n * кто вызвал закрытие `ActionSheet`. Используется в `ActionSheet.onClose()`.\n */\n isCancelItem?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ActionSheetItem\n */\nexport const ActionSheetItem = ({\n children,\n autoCloseDisabled = false,\n mode = 'default',\n meta,\n subtitle,\n before,\n after,\n selectable,\n value,\n name,\n checked,\n defaultChecked,\n onChange,\n onClick,\n onImmediateClick,\n multiline = false,\n iconChecked,\n isCancelItem,\n ...restProps\n}: ActionSheetItemProps): React.ReactNode => {\n const platform = usePlatform();\n const {\n onItemClick = () => noop,\n mode: actionSheetMode,\n onClose: onActionSheetClose,\n } = React.useContext<ActionSheetContextType<HTMLElement>>(ActionSheetContext);\n const { sizeY } = useAdaptivityWithJSMediaQueries();\n\n const Component: React.ElementType | undefined = selectable ? 'label' : undefined;\n\n const isRich = subtitle || meta || selectable;\n const isCentered = !isRich && !before && platform === 'ios';\n\n const onItemClickHandler = React.useCallback(\n (e: React.MouseEvent) => {\n onItemClick({\n action: onClick,\n immediateAction: onImmediateClick,\n autoClose: !autoCloseDisabled,\n isCancelItem: Boolean(isCancelItem),\n })?.(e);\n },\n [autoCloseDisabled, isCancelItem, onClick, onImmediateClick, onItemClick],\n );\n\n const onKeyDown: React.KeyboardEventHandler<HTMLElement> = React.useCallback(\n (event) => {\n if (pressedKey(event) === Keys.ENTER) {\n onActionSheetClose?.();\n }\n },\n [onActionSheetClose],\n );\n\n const onItemClickImpl: React.MouseEventHandler<HTMLElement> = React.useCallback(\n (event) => {\n if (selectable) {\n if (isRealClickEvent(event)) {\n onItemClickHandler(event);\n }\n } else {\n onItemClickHandler(event);\n }\n },\n [onItemClickHandler, selectable],\n );\n\n return (\n <Tappable\n {...(Component && { Component })}\n {...restProps}\n onClick={onItemClickImpl}\n activeMode={platform === 'ios' ? styles.active : undefined}\n baseClassName={classNames(\n styles.host,\n platform === 'ios' && styles.ios,\n mode === 'cancel' && styles.modeCancel,\n mode === 'destructive' && styles.modeDestructive,\n sizeY === 'compact' && styles.sizeYCompact,\n isRich && styles.rich,\n actionSheetMode === 'menu' && styles.menu,\n )}\n onKeyDown={onKeyDown}\n >\n {before && <div className={styles.before}>{before}</div>}\n <div className={classNames(styles.container, !multiline && styles.ellipsis)}>\n <div className={classNames(styles.content, isCentered && styles.centered)}>\n {platform === 'ios' ? (\n <Title\n className={styles.children}\n weight={mode === 'cancel' ? '2' : '3'}\n level={isCentered ? '2' : '3'}\n >\n {children}\n </Title>\n ) : (\n <Text className={styles.children}>{children}</Text>\n )}\n {meta && <Text className={styles.meta}>{meta}</Text>}\n </div>\n {subtitle && <Subhead className={styles.subtitle}>{subtitle}</Subhead>}\n </div>\n {(selectable || after) && (\n <div className={styles.after}>\n {after}\n {selectable && (\n <Radio\n name={name}\n value={value}\n onChange={onChange}\n defaultChecked={defaultChecked}\n checked={checked}\n disabled={restProps.disabled}\n >\n {iconChecked}\n </Radio>\n )}\n </div>\n )}\n </Tappable>\n );\n};\n"],"names":["React","classNames","noop","useAdaptivityWithJSMediaQueries","usePlatform","Keys","pressedKey","ActionSheetContext","Tappable","Subhead","Text","Title","isRealClickEvent","Radio","ActionSheetItem","children","autoCloseDisabled","mode","meta","subtitle","before","after","selectable","value","name","checked","defaultChecked","onChange","onClick","onImmediateClick","multiline","iconChecked","isCancelItem","restProps","platform","onItemClick","actionSheetMode","onClose","onActionSheetClose","useContext","sizeY","Component","undefined","isRich","isCentered","onItemClickHandler","useCallback","e","action","immediateAction","autoClose","Boolean","onKeyDown","event","ENTER","onItemClickImpl","activeMode","baseClassName","div","className","weight","level","disabled"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/ActionSheetItem/ActionSheetItem.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { Keys, pressedKey } from '../../lib/accessibility';\nimport { ActionSheetContext, type ActionSheetContextType } from '../ActionSheet/ActionSheetContext';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Subhead } from '../Typography/Subhead/Subhead';\nimport { Text } from '../Typography/Text/Text';\nimport { Title } from '../Typography/Title/Title';\nimport { isRealClickEvent } from './helpers';\nimport { Radio } from './subcomponents/Radio/Radio';\nimport styles from './ActionSheetItem.module.css';\n\nexport interface ActionSheetItemProps\n extends React.HTMLAttributes<HTMLElement>,\n React.AnchorHTMLAttributes<HTMLElement>,\n Pick<React.InputHTMLAttributes<HTMLInputElement>, 'name' | 'checked' | 'value'> {\n /**\n * Свойство, определяющее внешний вид элемента действия.\n */\n mode?: 'default' | 'destructive' | 'cancel';\n /**\n * Если указано, элемент будет использоваться как ссылка.\n */\n href?: string;\n /**\n * Атрибут `target` для тега `<a>`.\n */\n target?: string;\n /**\n * Иконка или другой React-элемент для отображения перед основным контентом.\n */\n before?: React.ReactNode;\n /**\n * Иконка или другой React-элемент для отображения после основного контента.\n */\n after?: React.ReactNode;\n /**\n * Дополнительная информация, отображаемая рядом с основным контентом.\n */\n meta?: React.ReactNode;\n /**\n * Слот для подсказки или вспомогательного текста.\n */\n subtitle?: React.ReactNode;\n /**\n * По умолчанию нажатие на опцию вызывает переданную в `ActionSheet` функцию `onClose`, данное свойство\n * позволяет отключить такое поведение.\n */\n autoCloseDisabled?: boolean;\n /**\n * Включает возможность выбрать элемент (отображает радиокнопку).\n */\n selectable?: boolean;\n /**\n * Блокировка взаимодействия с компонентом.\n */\n disabled?: boolean;\n /**\n * Все текстовые элементы при необходимости занимают несколько строк.\n */\n multiline?: boolean;\n /**\n * По умолчанию `onClick` будет вызван после завершения анимации скрытия и после вызова `onClose`.\n * Из этого следует, что в объекте события значения полей типа `currentTarget` будут не определены.\n * Если вам нужен объект события именно на момент нажатия, используйте `onImmediateClick`.\n */\n onClick?: React.MouseEventHandler<HTMLElement>;\n /**\n * Обработчик нажатия, вызывающийся непосредственно в момент нажатия (в отличие от `onClick`).\n */\n onImmediateClick?: React.MouseEventHandler<HTMLElement>;\n /**\n * Иконка для `selectable` режима.\n */\n iconChecked?: React.ReactNode;\n /**\n * Позволяет отделить `ActionItem` от `CancelItem` для определении того,\n * кто вызвал закрытие `ActionSheet`. Используется в `ActionSheet.onClose()`.\n */\n isCancelItem?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ActionSheetItem\n */\nexport const ActionSheetItem = ({\n children,\n autoCloseDisabled = false,\n mode = 'default',\n meta,\n subtitle,\n before,\n after,\n selectable,\n value,\n name,\n checked,\n defaultChecked,\n onChange,\n onClick,\n onImmediateClick,\n multiline = false,\n iconChecked,\n isCancelItem,\n ...restProps\n}: ActionSheetItemProps): React.ReactNode => {\n const platform = usePlatform();\n const {\n onItemClick = () => noop,\n mode: actionSheetMode,\n onClose: onActionSheetClose,\n } = React.useContext<ActionSheetContextType<HTMLElement>>(ActionSheetContext);\n const { sizeY } = useAdaptivityWithJSMediaQueries();\n\n const Component: React.ElementType | undefined = selectable ? 'label' : undefined;\n\n const isRich = subtitle || meta || selectable;\n const isCentered = !isRich && !before && platform === 'ios';\n\n const onItemClickHandler = React.useCallback(\n (e: React.MouseEvent) => {\n onItemClick({\n action: onClick,\n immediateAction: onImmediateClick,\n autoClose: !autoCloseDisabled,\n isCancelItem: Boolean(isCancelItem),\n })?.(e);\n },\n [autoCloseDisabled, isCancelItem, onClick, onImmediateClick, onItemClick],\n );\n\n const onKeyDown: React.KeyboardEventHandler<HTMLElement> = React.useCallback(\n (event) => {\n if (pressedKey(event) === Keys.ENTER) {\n onActionSheetClose?.();\n }\n },\n [onActionSheetClose],\n );\n\n const onItemClickImpl: React.MouseEventHandler<HTMLElement> = React.useCallback(\n (event) => {\n if (selectable) {\n if (isRealClickEvent(event)) {\n onItemClickHandler(event);\n }\n } else {\n onItemClickHandler(event);\n }\n },\n [onItemClickHandler, selectable],\n );\n\n return (\n <Tappable\n {...(Component && { Component })}\n {...restProps}\n onClick={onItemClickImpl}\n activeMode={platform === 'ios' ? styles.active : undefined}\n baseClassName={classNames(\n styles.host,\n platform === 'ios' && styles.ios,\n mode === 'cancel' && styles.modeCancel,\n mode === 'destructive' && styles.modeDestructive,\n sizeY === 'compact' && styles.sizeYCompact,\n isRich && styles.rich,\n actionSheetMode === 'menu' && styles.menu,\n restProps.disabled && styles.disabled,\n )}\n onKeyDown={onKeyDown}\n >\n {before && <div className={styles.before}>{before}</div>}\n <div className={classNames(styles.container, !multiline && styles.ellipsis)}>\n <div className={classNames(styles.content, isCentered && styles.centered)}>\n {platform === 'ios' ? (\n <Title\n className={styles.children}\n weight={mode === 'cancel' ? '2' : '3'}\n level={isCentered ? '2' : '3'}\n >\n {children}\n </Title>\n ) : (\n <Text className={styles.children}>{children}</Text>\n )}\n {meta && <Text className={styles.meta}>{meta}</Text>}\n </div>\n {subtitle && <Subhead className={styles.subtitle}>{subtitle}</Subhead>}\n </div>\n {(selectable || after) && (\n <div className={styles.after}>\n {after}\n {selectable && (\n <Radio\n name={name}\n value={value}\n onChange={onChange}\n defaultChecked={defaultChecked}\n checked={checked}\n disabled={restProps.disabled}\n >\n {iconChecked}\n </Radio>\n )}\n </div>\n )}\n </Tappable>\n );\n};\n"],"names":["React","classNames","noop","useAdaptivityWithJSMediaQueries","usePlatform","Keys","pressedKey","ActionSheetContext","Tappable","Subhead","Text","Title","isRealClickEvent","Radio","ActionSheetItem","children","autoCloseDisabled","mode","meta","subtitle","before","after","selectable","value","name","checked","defaultChecked","onChange","onClick","onImmediateClick","multiline","iconChecked","isCancelItem","restProps","platform","onItemClick","actionSheetMode","onClose","onActionSheetClose","useContext","sizeY","Component","undefined","isRich","isCentered","onItemClickHandler","useCallback","e","action","immediateAction","autoClose","Boolean","onKeyDown","event","ENTER","onItemClickImpl","activeMode","baseClassName","disabled","div","className","weight","level"],"mappings":"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"}
|
|
@@ -158,17 +158,17 @@ export const GlobalScrollController = ({ children })=>{
|
|
|
158
158
|
const overflowX = window.innerHeight > document.documentElement.clientHeight ? 'scroll' : '';
|
|
159
159
|
Object.assign(document.documentElement.style, {
|
|
160
160
|
position: 'fixed',
|
|
161
|
+
top: `-${scrollY}px`,
|
|
162
|
+
left: `-${scrollX}px`,
|
|
161
163
|
right: '0',
|
|
162
164
|
overscrollBehavior: 'none',
|
|
163
165
|
overflowY,
|
|
164
166
|
overflowX
|
|
165
167
|
});
|
|
166
168
|
scrollLockEnabledRef.current = true;
|
|
167
|
-
scrollTo(scrollX, scrollY);
|
|
168
169
|
}, [
|
|
169
170
|
document,
|
|
170
171
|
getScroll,
|
|
171
|
-
scrollTo,
|
|
172
172
|
window
|
|
173
173
|
]);
|
|
174
174
|
const disableScrollLock = React.useCallback(()=>{
|
|
@@ -254,15 +254,15 @@ export const ElementScrollController = ({ elRef, children })=>{
|
|
|
254
254
|
Object.assign(el.style, {
|
|
255
255
|
position: 'absolute',
|
|
256
256
|
right: '0',
|
|
257
|
+
top: `-${scrollY}px`,
|
|
258
|
+
left: `-${scrollX}px`,
|
|
257
259
|
overflowY,
|
|
258
260
|
overflowX
|
|
259
261
|
});
|
|
260
262
|
scrollLockEnabledRef.current = true;
|
|
261
|
-
scrollTo(scrollX, scrollY);
|
|
262
263
|
}, [
|
|
263
264
|
elRef,
|
|
264
|
-
getScroll
|
|
265
|
-
scrollTo
|
|
265
|
+
getScroll
|
|
266
266
|
]);
|
|
267
267
|
const disableScrollLock = React.useCallback(()=>{
|
|
268
268
|
const el = elRef.current;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"sourcesContent":["'use client';\n/* eslint-disable jsdoc/require-jsdoc */\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, scrollTop: number) => {\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 scrollTop - 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 function useManualScroll(): Pick<ScrollContextInterface, 'scrollTo' | 'getScroll'> {\n const { scrollTo, getScroll } = React.useContext(ScrollContext);\n return React.useMemo(\n () => ({\n scrollTo,\n getScroll,\n }),\n [getScroll, scrollTo],\n );\n}\n\nexport interface ScrollControllerProps extends HasChildren {\n elRef: React.RefObject<HTMLElement | null>;\n}\n\nconst _scrollTo = ({\n x,\n y,\n scrollWidth,\n clientWidth,\n scrollHeight,\n clientHeight,\n scrollLockEnabled,\n lockedElement,\n elementToScroll,\n}: {\n x: number;\n y: number;\n scrollWidth: number;\n clientWidth: number;\n scrollHeight: number;\n clientHeight: number;\n scrollLockEnabled: boolean;\n lockedElement: HTMLElement;\n elementToScroll: Window | HTMLElement;\n}) => {\n // Some iOS versions do not normalize scroll — do it manually.\n const left = x ? clamp(x, 0, scrollWidth - clientWidth) : 0;\n const top = y ? clamp(y, 0, scrollHeight - clientHeight) : 0;\n\n if (scrollLockEnabled) {\n Object.assign(lockedElement.style, {\n left: `-${left}px`,\n top: `-${top}px`,\n });\n } else {\n elementToScroll.scrollTo({\n left,\n top,\n });\n }\n};\n\nconst _getScroll = ({\n xOffset,\n yOffset,\n element,\n scrollLockEnabled,\n customCalcY = (v) => v,\n}: {\n xOffset: number;\n yOffset: number;\n element: HTMLElement;\n scrollLockEnabled: boolean;\n customCalcY?: (scrollTop: number) => number;\n}) => {\n const elementStyles = element.style;\n const [scrollLeft, scrollTop] = scrollLockEnabled\n ? [-parseFloat(elementStyles.left || '0'), -parseFloat(elementStyles.top || '0')]\n : [xOffset, yOffset];\n return {\n x: scrollLeft,\n y: customCalcY(scrollTop),\n };\n};\n\nexport const GlobalScrollController = ({ children }: ScrollControllerProps): React.ReactNode => {\n const { window, document } = useDOM();\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n const scrollLockEnabledRef = React.useRef(false);\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n (options = { compensateKeyboardHeight: true }) => {\n if (!window || !document) {\n return { x: 0, y: 0 };\n }\n return _getScroll({\n xOffset: window.pageXOffset,\n yOffset: window.pageYOffset,\n element: document.documentElement,\n scrollLockEnabled: scrollLockEnabledRef.current,\n customCalcY: (scrollTop) =>\n options.compensateKeyboardHeight\n ? getPageYOffsetWithoutKeyboardHeight(window, scrollTop)\n : scrollTop,\n });\n },\n [document, window],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n if (!window || !document) {\n return;\n }\n _scrollTo({\n x,\n y,\n\n scrollWidth: document.body.scrollWidth,\n clientWidth: window.innerWidth,\n\n scrollHeight: document.body.scrollHeight,\n clientHeight: window.innerHeight,\n\n scrollLockEnabled: scrollLockEnabledRef.current,\n lockedElement: document.documentElement,\n elementToScroll: window,\n });\n },\n [document, window],\n );\n\n const enableScrollLock = React.useCallback(() => {\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n const { x: scrollX, y: scrollY } = getScroll({ compensateKeyboardHeight: false });\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, {\n position: 'fixed',\n right: '0',\n overscrollBehavior: 'none',\n overflowY,\n overflowX,\n });\n\n scrollLockEnabledRef.current = true;\n\n scrollTo(scrollX, scrollY);\n }, [document, getScroll, scrollTo, window]);\n\n const disableScrollLock = React.useCallback(() => {\n const scrollData = getScroll({ compensateKeyboardHeight: false });\n clearDisableScrollStyle(document!.documentElement);\n scrollLockEnabledRef.current = false;\n\n scrollTo(scrollData.x, scrollData.y);\n }, [document, getScroll, scrollTo]);\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 const scrollLockEnabledRef = React.useRef(false);\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(() => {\n const element = elRef.current;\n if (!element) {\n return { x: 0, y: 0 };\n }\n return _getScroll({\n xOffset: element.scrollLeft,\n yOffset: element.scrollTop,\n element: element,\n scrollLockEnabled: scrollLockEnabledRef.current,\n });\n }, [elRef]);\n\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n _scrollTo({\n x,\n y,\n\n scrollWidth: el.scrollWidth,\n clientWidth: el.clientWidth,\n\n scrollHeight: el.scrollHeight,\n clientHeight: el.clientHeight,\n\n scrollLockEnabled: scrollLockEnabledRef.current,\n lockedElement: el,\n elementToScroll: el,\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 { x: scrollX, y: scrollY } = getScroll();\n\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 right: '0',\n overflowY,\n overflowX,\n });\n scrollLockEnabledRef.current = true;\n\n scrollTo(scrollX, scrollY);\n }, [elRef, getScroll, scrollTo]);\n\n const disableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n\n const scrollData = getScroll();\n clearDisableScrollStyle(el);\n scrollLockEnabledRef.current = false;\n\n scrollTo(scrollData.x, scrollData.y);\n }, [elRef, getScroll, scrollTo]);\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","scrollTop","diffOfClientHeightAndViewportHeight","document","documentElement","clientHeight","innerHeight","ScrollContext","createContext","getScroll","x","y","scrollTo","incrementScrollLockCounter","decrementScrollLockCounter","useScroll","useContext","useScrollLockController","enableScrollLock","disableScrollLock","countRef","useRef","updateScrollLock","useCallback","current","useManualScroll","useMemo","_scrollTo","scrollWidth","clientWidth","scrollHeight","scrollLockEnabled","lockedElement","elementToScroll","_getScroll","xOffset","yOffset","element","customCalcY","v","elementStyles","scrollLeft","parseFloat","GlobalScrollController","children","beforeScrollLockFnSetRef","Set","scrollLockEnabledRef","options","compensateKeyboardHeight","pageXOffset","pageYOffset","body","innerWidth","forEach","fn","scrollX","scrollY","scrollData","scrollController","Provider","value","ElementScrollController","elRef","el","useScrollLock","enabled","useEffect"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/AppRoot/ScrollContext.tsx"],"sourcesContent":["'use client';\n/* eslint-disable jsdoc/require-jsdoc */\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, scrollTop: number) => {\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 scrollTop - 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 function useManualScroll(): Pick<ScrollContextInterface, 'scrollTo' | 'getScroll'> {\n const { scrollTo, getScroll } = React.useContext(ScrollContext);\n return React.useMemo(\n () => ({\n scrollTo,\n getScroll,\n }),\n [getScroll, scrollTo],\n );\n}\n\nexport interface ScrollControllerProps extends HasChildren {\n elRef: React.RefObject<HTMLElement | null>;\n}\n\nconst _scrollTo = ({\n x,\n y,\n scrollWidth,\n clientWidth,\n scrollHeight,\n clientHeight,\n scrollLockEnabled,\n lockedElement,\n elementToScroll,\n}: {\n x: number;\n y: number;\n scrollWidth: number;\n clientWidth: number;\n scrollHeight: number;\n clientHeight: number;\n scrollLockEnabled: boolean;\n lockedElement: HTMLElement;\n elementToScroll: Window | HTMLElement;\n}) => {\n // Some iOS versions do not normalize scroll — do it manually.\n const left = x ? clamp(x, 0, scrollWidth - clientWidth) : 0;\n const top = y ? clamp(y, 0, scrollHeight - clientHeight) : 0;\n\n if (scrollLockEnabled) {\n Object.assign(lockedElement.style, {\n left: `-${left}px`,\n top: `-${top}px`,\n });\n } else {\n elementToScroll.scrollTo({\n left,\n top,\n });\n }\n};\n\nconst _getScroll = ({\n xOffset,\n yOffset,\n element,\n scrollLockEnabled,\n customCalcY = (v) => v,\n}: {\n xOffset: number;\n yOffset: number;\n element: HTMLElement;\n scrollLockEnabled: boolean;\n customCalcY?: (scrollTop: number) => number;\n}) => {\n const elementStyles = element.style;\n const [scrollLeft, scrollTop] = scrollLockEnabled\n ? [-parseFloat(elementStyles.left || '0'), -parseFloat(elementStyles.top || '0')]\n : [xOffset, yOffset];\n return {\n x: scrollLeft,\n y: customCalcY(scrollTop),\n };\n};\n\nexport const GlobalScrollController = ({ children }: ScrollControllerProps): React.ReactNode => {\n const { window, document } = useDOM();\n const beforeScrollLockFnSetRef = React.useRef<Set<() => void>>(new Set());\n const scrollLockEnabledRef = React.useRef(false);\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(\n (options = { compensateKeyboardHeight: true }) => {\n if (!window || !document) {\n return { x: 0, y: 0 };\n }\n return _getScroll({\n xOffset: window.pageXOffset,\n yOffset: window.pageYOffset,\n element: document.documentElement,\n scrollLockEnabled: scrollLockEnabledRef.current,\n customCalcY: (scrollTop) =>\n options.compensateKeyboardHeight\n ? getPageYOffsetWithoutKeyboardHeight(window, scrollTop)\n : scrollTop,\n });\n },\n [document, window],\n );\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n if (!window || !document) {\n return;\n }\n _scrollTo({\n x,\n y,\n\n scrollWidth: document.body.scrollWidth,\n clientWidth: window.innerWidth,\n\n scrollHeight: document.body.scrollHeight,\n clientHeight: window.innerHeight,\n\n scrollLockEnabled: scrollLockEnabledRef.current,\n lockedElement: document.documentElement,\n elementToScroll: window,\n });\n },\n [document, window],\n );\n\n const enableScrollLock = React.useCallback(() => {\n beforeScrollLockFnSetRef.current.forEach((fn) => {\n fn();\n });\n const { x: scrollX, y: scrollY } = getScroll({ compensateKeyboardHeight: false });\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, {\n position: 'fixed',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n right: '0',\n overscrollBehavior: 'none',\n overflowY,\n overflowX,\n });\n\n scrollLockEnabledRef.current = true;\n }, [document, getScroll, window]);\n\n const disableScrollLock = React.useCallback(() => {\n const scrollData = getScroll({ compensateKeyboardHeight: false });\n clearDisableScrollStyle(document!.documentElement);\n scrollLockEnabledRef.current = false;\n\n scrollTo(scrollData.x, scrollData.y);\n }, [document, getScroll, scrollTo]);\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 const scrollLockEnabledRef = React.useRef(false);\n\n const getScroll = React.useCallback<ScrollContextInterface['getScroll']>(() => {\n const element = elRef.current;\n if (!element) {\n return { x: 0, y: 0 };\n }\n return _getScroll({\n xOffset: element.scrollLeft,\n yOffset: element.scrollTop,\n element: element,\n scrollLockEnabled: scrollLockEnabledRef.current,\n });\n }, [elRef]);\n\n const scrollTo = React.useCallback<ScrollContextInterface['scrollTo']>(\n (x = 0, y = 0) => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n _scrollTo({\n x,\n y,\n\n scrollWidth: el.scrollWidth,\n clientWidth: el.clientWidth,\n\n scrollHeight: el.scrollHeight,\n clientHeight: el.clientHeight,\n\n scrollLockEnabled: scrollLockEnabledRef.current,\n lockedElement: el,\n elementToScroll: el,\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 { x: scrollX, y: scrollY } = getScroll();\n\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 right: '0',\n top: `-${scrollY}px`,\n left: `-${scrollX}px`,\n overflowY,\n overflowX,\n });\n scrollLockEnabledRef.current = true;\n }, [elRef, getScroll]);\n\n const disableScrollLock = React.useCallback(() => {\n const el = elRef.current;\n if (!el) {\n return;\n }\n\n const scrollData = getScroll();\n clearDisableScrollStyle(el);\n scrollLockEnabledRef.current = false;\n\n scrollTo(scrollData.x, scrollData.y);\n }, [elRef, getScroll, scrollTo]);\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","scrollTop","diffOfClientHeightAndViewportHeight","document","documentElement","clientHeight","innerHeight","ScrollContext","createContext","getScroll","x","y","scrollTo","incrementScrollLockCounter","decrementScrollLockCounter","useScroll","useContext","useScrollLockController","enableScrollLock","disableScrollLock","countRef","useRef","updateScrollLock","useCallback","current","useManualScroll","useMemo","_scrollTo","scrollWidth","clientWidth","scrollHeight","scrollLockEnabled","lockedElement","elementToScroll","_getScroll","xOffset","yOffset","element","customCalcY","v","elementStyles","scrollLeft","parseFloat","GlobalScrollController","children","beforeScrollLockFnSetRef","Set","scrollLockEnabledRef","options","compensateKeyboardHeight","pageXOffset","pageYOffset","body","innerWidth","forEach","fn","scrollX","scrollY","scrollData","scrollController","Provider","value","ElementScrollController","elRef","el","useScrollLock","enabled","useEffect"],"mappings":"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"}
|