@vkontakte/vkui 7.9.2 → 7.10.1
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/README.md +1 -0
- package/dist/components/Button/Button.js +6 -4
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.d.ts +1 -1
- package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.js +14 -6
- package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/components/CarouselBase/ScrollArrows.d.ts +1 -2
- package/dist/components/CarouselBase/ScrollArrows.d.ts.map +1 -1
- package/dist/components/CarouselBase/ScrollArrows.js +2 -2
- package/dist/components/CarouselBase/ScrollArrows.js.map +1 -1
- package/dist/components/Clickable/useState.d.ts +15 -0
- package/dist/components/Clickable/useState.d.ts.map +1 -1
- package/dist/components/Clickable/useState.js +1 -1
- package/dist/components/Clickable/useState.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +1 -1
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/Footer/Footer.d.ts.map +1 -1
- package/dist/components/Footer/Footer.js +2 -1
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.d.ts +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.js +20 -10
- package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/components/SubnavigationBar/SubnavigationBar.d.ts +6 -2
- package/dist/components/SubnavigationBar/SubnavigationBar.d.ts.map +1 -1
- package/dist/components/SubnavigationBar/SubnavigationBar.js +6 -3
- package/dist/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
- package/dist/components/Typography/Typography.d.ts +5 -1
- package/dist/components/Typography/Typography.d.ts.map +1 -1
- package/dist/components/Typography/Typography.js +9 -3
- package/dist/components/Typography/Typography.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheet.module.css +4 -4
- package/dist/cssm/components/Alert/Alert.module.css +4 -4
- package/dist/cssm/components/Button/Button.js +3 -1
- package/dist/cssm/components/Button/Button.js.map +1 -1
- package/dist/cssm/components/CarouselBase/CarouselBase.js +10 -5
- package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/cssm/components/CarouselBase/CarouselBase.module.css +1 -1
- package/dist/cssm/components/CarouselBase/ScrollArrows.js +2 -2
- package/dist/cssm/components/CarouselBase/ScrollArrows.js.map +1 -1
- package/dist/cssm/components/CellButton/CellButton.module.css +4 -2
- package/dist/cssm/components/Clickable/useState.js +1 -1
- package/dist/cssm/components/Clickable/useState.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.module.css +2 -2
- package/dist/cssm/components/DateInput/DateInput.module.css +3 -2
- package/dist/cssm/components/Epic/Epic.module.css +2 -1
- package/dist/cssm/components/FixedLayout/FixedLayout.module.css +6 -3
- package/dist/cssm/components/Flex/Flex.module.css +12 -4
- package/dist/cssm/components/Footer/Footer.js +1 -0
- package/dist/cssm/components/Footer/Footer.js.map +1 -1
- package/dist/cssm/components/Footer/Footer.module.css +0 -1
- package/dist/cssm/components/FormField/FormField.module.css +10 -6
- package/dist/cssm/components/FormItem/FormItem.module.css +24 -12
- package/dist/cssm/components/GridAvatar/GridAvatar.module.css +1 -1
- package/dist/cssm/components/Group/Group.module.css +5 -2
- package/dist/cssm/components/HorizontalCell/HorizontalCell.module.css +4 -2
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +14 -8
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +3 -3
- package/dist/cssm/components/IconButton/IconButton.module.css +6 -2
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +4 -2
- package/dist/cssm/components/ModalCard/ModalCard.module.css +2 -1
- package/dist/cssm/components/ModalCardBase/ModalCardBase.module.css +14 -10
- package/dist/cssm/components/ModalPage/ModalPage.module.css +2 -1
- package/dist/cssm/components/ModalPageHeader/ModalPageHeader.module.css +5 -3
- package/dist/cssm/components/Panel/Panel.module.css +4 -2
- package/dist/cssm/components/PanelHeader/PanelHeader.module.css +1 -1
- package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.module.css +2 -2
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
- package/dist/cssm/components/Removable/Removable.module.css +9 -4
- package/dist/cssm/components/Root/Root.module.css +8 -8
- package/dist/cssm/components/Search/Search.module.css +2 -3
- package/dist/cssm/components/Snackbar/Snackbar.module.css +4 -2
- package/dist/cssm/components/Snackbar/subcomponents/Basic/Basic.module.css +15 -15
- package/dist/cssm/components/SplitLayout/SplitLayout.module.css +8 -4
- package/dist/cssm/components/SubnavigationBar/SubnavigationBar.js +4 -3
- package/dist/cssm/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
- package/dist/cssm/components/SubnavigationBar/SubnavigationBar.module.css +9 -0
- package/dist/cssm/components/Switch/Switch.module.css +32 -20
- package/dist/cssm/components/Typography/Typography.js +7 -2
- package/dist/cssm/components/Typography/Typography.js.map +1 -1
- package/dist/cssm/components/Typography/Typography.module.css +12 -0
- package/dist/cssm/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js +1 -1
- package/dist/cssm/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js.map +1 -1
- package/dist/cssm/hooks/useKeyboardInputTracker.js +4 -4
- package/dist/cssm/hooks/useKeyboardInputTracker.js.map +1 -1
- package/dist/cssm/index.js +1 -0
- package/dist/cssm/index.js.map +1 -1
- package/dist/cssm/lib/adaptivity/functions.js.map +1 -1
- package/dist/cssm/lib/animation/useReducedMotion.js +7 -2
- package/dist/cssm/lib/animation/useReducedMotion.js.map +1 -1
- package/dist/cssm/lib/dom.js +2 -2
- package/dist/cssm/lib/dom.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js +1 -1
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/cssm/styles/constants.css +2 -1
- package/dist/cssm/styles/customMedias.generated.css +21 -21
- package/dist/hooks/useDraggableWithDomApi/useDraggableWithDomApi.d.ts.map +1 -1
- package/dist/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js +1 -1
- package/dist/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js.map +1 -1
- package/dist/hooks/useKeyboardInputTracker.d.ts.map +1 -1
- package/dist/hooks/useKeyboardInputTracker.js +4 -4
- package/dist/hooks/useKeyboardInputTracker.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/adaptivity/functions.d.ts.map +1 -1
- package/dist/lib/adaptivity/functions.js.map +1 -1
- package/dist/lib/animation/useReducedMotion.d.ts +6 -0
- package/dist/lib/animation/useReducedMotion.d.ts.map +1 -1
- package/dist/lib/animation/useReducedMotion.js +7 -2
- package/dist/lib/animation/useReducedMotion.js.map +1 -1
- package/dist/lib/dom.d.ts.map +1 -1
- package/dist/lib/dom.js +2 -2
- package/dist/lib/dom.js.map +1 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts +1 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.js +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +2 -1
- package/src/components/ActionSheet/ActionSheet.module.css +4 -4
- package/src/components/Alert/Alert.module.css +4 -4
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/CarouselBase/CarouselBase.module.css +1 -1
- package/src/components/CarouselBase/CarouselBase.module.css.d.ts.map +1 -1
- package/src/components/CarouselBase/CarouselBase.tsx +10 -4
- package/src/components/CarouselBase/ScrollArrows.tsx +1 -3
- package/src/components/CellButton/CellButton.module.css +2 -1
- package/src/components/CellButton/CellButton.module.css.d.ts.map +1 -1
- package/src/components/Clickable/useState.tsx +8 -3
- package/src/components/CustomSelect/CustomSelect.tsx +1 -1
- package/src/components/CustomSelectOption/CustomSelectOption.module.css +1 -1
- package/src/components/DateInput/DateInput.module.css +3 -2
- package/src/components/DateInput/DateInput.module.css.d.ts.map +1 -1
- package/src/components/Epic/Epic.module.css +2 -1
- package/src/components/FixedLayout/FixedLayout.module.css +4 -2
- package/src/components/FixedLayout/FixedLayout.module.css.d.ts.map +1 -1
- package/src/components/Flex/Flex.module.css +6 -2
- package/src/components/Flex/Flex.module.css.d.ts.map +1 -1
- package/src/components/Footer/Footer.module.css +0 -1
- package/src/components/Footer/Footer.tsx +1 -0
- package/src/components/FormField/FormField.module.css +10 -6
- package/src/components/FormField/FormField.module.css.d.ts.map +1 -1
- package/src/components/FormItem/FormItem.module.css +12 -6
- package/src/components/FormItem/FormItem.module.css.d.ts.map +1 -1
- package/src/components/GridAvatar/GridAvatar.module.css +1 -1
- package/src/components/GridAvatar/GridAvatar.module.css.d.ts.map +1 -1
- package/src/components/Group/Group.module.css +5 -2
- package/src/components/Group/Group.module.css.d.ts.map +1 -1
- package/src/components/HorizontalCell/HorizontalCell.module.css +4 -2
- package/src/components/HorizontalCell/HorizontalCell.module.css.d.ts.map +1 -1
- package/src/components/HorizontalScroll/HorizontalScroll.module.css +3 -3
- package/src/components/HorizontalScroll/HorizontalScroll.module.css.d.ts.map +1 -1
- package/src/components/HorizontalScroll/HorizontalScroll.tsx +15 -7
- package/src/components/IconButton/IconButton.module.css +6 -2
- package/src/components/IconButton/IconButton.module.css.d.ts.map +1 -1
- package/src/components/MiniInfoCell/MiniInfoCell.module.css +4 -2
- package/src/components/MiniInfoCell/MiniInfoCell.module.css.d.ts.map +1 -1
- package/src/components/ModalCard/ModalCard.module.css +2 -1
- package/src/components/ModalCard/ModalCard.module.css.d.ts.map +1 -1
- package/src/components/ModalCardBase/ModalCardBase.module.css +7 -5
- package/src/components/ModalCardBase/ModalCardBase.module.css.d.ts.map +1 -1
- package/src/components/ModalPage/ModalPage.module.css +2 -1
- package/src/components/ModalPage/ModalPage.module.css.d.ts.map +1 -1
- package/src/components/ModalPageHeader/ModalPageHeader.module.css +5 -2
- package/src/components/ModalPageHeader/ModalPageHeader.module.css.d.ts.map +1 -1
- package/src/components/Panel/Panel.module.css +2 -1
- package/src/components/Panel/Panel.module.css.d.ts.map +1 -1
- package/src/components/PanelHeader/PanelHeader.module.css +1 -1
- package/src/components/PanelHeader/PanelHeader.module.css.d.ts.map +1 -1
- package/src/components/PanelHeaderButton/PanelHeaderButton.module.css +2 -2
- package/src/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
- package/src/components/Removable/Removable.module.css +9 -4
- package/src/components/Removable/Removable.module.css.d.ts.map +1 -1
- package/src/components/Root/Root.module.css +8 -8
- package/src/components/Search/Search.module.css +2 -2
- package/src/components/Snackbar/Snackbar.module.css +4 -2
- package/src/components/Snackbar/Snackbar.module.css.d.ts.map +1 -1
- package/src/components/Snackbar/subcomponents/Basic/Basic.module.css +15 -15
- package/src/components/SplitLayout/SplitLayout.module.css +4 -2
- package/src/components/SplitLayout/SplitLayout.module.css.d.ts.map +1 -1
- package/src/components/SubnavigationBar/SubnavigationBar.module.css +9 -0
- package/src/components/SubnavigationBar/SubnavigationBar.module.css.d.ts.map +1 -1
- package/src/components/SubnavigationBar/SubnavigationBar.tsx +14 -3
- package/src/components/Switch/Switch.module.css +32 -20
- package/src/components/Switch/Switch.module.css.d.ts.map +1 -1
- package/src/components/Typography/Typography.module.css +12 -0
- package/src/components/Typography/Typography.module.css.d.ts.map +1 -1
- package/src/components/Typography/Typography.tsx +12 -0
- package/src/hooks/useDraggableWithDomApi/useDraggableWithDomApi.ts +7 -1
- package/src/hooks/useKeyboardInputTracker.ts +20 -4
- package/src/index.ts +1 -0
- package/src/lib/adaptivity/functions.ts +36 -6
- package/src/lib/animation/useReducedMotion.ts +7 -1
- package/src/lib/dom.tsx +11 -2
- package/src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts +1 -1
- package/src/lib/sheet/controllers/BottomSheetController.ts +1 -1
- package/src/styles/constants.css +2 -1
- package/src/styles/customMedias.generated.css +21 -21
- package/dist/cssm/hooks/useAdaptivityHasPointer.js +0 -15
- package/dist/cssm/hooks/useAdaptivityHasPointer.js.map +0 -1
- package/dist/hooks/useAdaptivityHasPointer.d.ts +0 -9
- package/dist/hooks/useAdaptivityHasPointer.d.ts.map +0 -1
- package/dist/hooks/useAdaptivityHasPointer.js +0 -15
- package/dist/hooks/useAdaptivityHasPointer.js.map +0 -1
- package/src/hooks/useAdaptivityHasPointer.ts +0 -25
package/dist/lib/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/lib/dom.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { canUseDOM } from '@vkontakte/vkjs';\nimport { rectToClientRect } from '@vkontakte/vkui-floating-ui/core';\nimport {\n getParentNode,\n getWindow,\n isElement,\n isHTMLElement,\n isLastTraversableNode,\n isOverflowElement,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport {\n getWindow,\n getNodeScroll,\n isHTMLElement,\n isElement,\n getParentNode,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport { canUseDOM, canUseEventListeners, onDOMLoaded } from '@vkontakte/vkjs';\nexport interface DOMContextInterface {\n /**\n * @ignore\n */\n window?: Window;\n /**\n * @ignore\n */\n document?: Document;\n}\n\nexport type DOMProps = DOMContextInterface;\n\n/* eslint-disable no-restricted-globals */\nconst getDOM = (): DOMContextInterface => ({\n window: canUseDOM ? window : undefined,\n document: canUseDOM ? document : undefined,\n});\n/* eslint-enable no-restricted-globals */\n\nexport const DOMContext: React.Context<DOMContextInterface> =\n React.createContext<DOMContextInterface>(getDOM());\n\nexport const useDOM = (): DOMContextInterface => {\n return React.useContext(DOMContext);\n};\n\n/**\n * В случае, если используется DOMContext, при проверке 'node instanceOf Window' – Window может быть\n * другим объектом.\n */\nexport const isWindow = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is Window => {\n return node !== null && node !== undefined && 'navigator' in node;\n};\n\nexport const isBody = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLBodyElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'BODY';\n};\n\nexport const isDocumentElement = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLHtmlElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'HTML';\n};\n\nexport function withDOM<Props>(\n Component: React.ComponentType<Props & DOMProps>,\n): React.ComponentType<Props> {\n const WithDOM = (props: Props) => {\n const dom = useDOM();\n return <Component {...props} {...dom} />;\n };\n return WithDOM;\n}\n\nexport function blurActiveElement(document: Document | undefined): void {\n if (document && document.activeElement) {\n (document.activeElement as HTMLElement).blur();\n }\n}\n\nexport const TRANSFORM_DEFAULT_VALUES: string[] = ['none', 'initial', 'inherit', 'unset'];\nexport const WILL_CHANGE_DEFAULT_VALUES: string[] = ['auto', 'initial', 'inherit', 'unset'];\nexport function getTransformedParentCoords(element: Element): {\n x: number;\n y: number;\n} {\n let parentNode = element.parentNode;\n while (parentNode !== null) {\n if (isHTMLElement(parentNode)) {\n let { transform, willChange } = getComputedStyle(parentNode);\n if (transform === '') {\n transform = 'unset';\n }\n if (willChange === '') {\n willChange = 'unset';\n }\n if (\n !TRANSFORM_DEFAULT_VALUES.includes(transform) ||\n !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)\n ) {\n const { x, y } = parentNode.getBoundingClientRect();\n return { x, y };\n }\n }\n parentNode = parentNode.parentNode;\n }\n return { x: 0, y: 0 };\n}\n\nexport const getBoundingClientRect = (node: Element | Window, isFixedStrategy = false) => {\n const element = isWindow(node) ? node.document.documentElement : node;\n const clientRect = element.getBoundingClientRect();\n\n if (isDocumentElement(element)) {\n /**\n * Если на странице не используется `html, body { height: 100% }` (или `height: 100vh`), то\n * `height`, полученный из `document.documentElement.getBoundingClientRect()`, будет возвращать\n * `scrollHeight`, а не `clientHeight`. Поэтому перебиваем `height` на `clientHeight`.\n */\n clientRect.height = element.clientHeight;\n }\n\n let offsetX = 0;\n let offsetY = 0;\n if (isFixedStrategy) {\n const { x, y } = getTransformedParentCoords(element);\n offsetX = x;\n offsetY = y;\n }\n\n return rectToClientRect({\n x: clientRect.left - offsetX,\n y: clientRect.top - offsetY,\n width: clientRect.width,\n height: clientRect.height,\n }) as DOMRect;\n};\n\nexport const getRelativeBoundingClientRect = (parent: Element, child: Element) => {\n const parentRect = getBoundingClientRect(parent);\n const childRect = getBoundingClientRect(child);\n return rectToClientRect({\n x: childRect.left - parentRect.left,\n y: childRect.top - parentRect.top,\n width: childRect.width,\n height: childRect.height,\n }) as DOMRect;\n};\n\n/**\n * Переписанный `getNearestOverflowAncestor` из @floating-ui/utils/dom.\n *\n * [1] добавляем ноду, на которой нужно остановить рекурсию\n * [2] document.body подменяем на window, т.к. на document.body нельзя применить скролл.\n *\n * @link https://github.com/floating-ui/floating-ui/blob/%40floating-ui/dom%401.6.3/packages/utils/src/dom.ts#L143\n */\nexport function getNearestOverflowAncestor(node: Node): HTMLElement | Window | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode: Node): HTMLElement | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode?: any): any {\n const parentNode = getParentNode(node);\n\n if (terminalNode === parentNode) {\n return null; /* [1] */\n }\n\n if (isLastTraversableNode(parentNode)) {\n return getWindow(parentNode); /* [2] */\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode, terminalNode);\n}\n\nexport const getScrollHeight = (node: Element | Window): number => {\n return isWindow(node) ? node.document.documentElement.scrollHeight : node.scrollHeight;\n};\n\nexport const getScrollRect = (\n node: Element | Window,\n): {\n relative: DOMRect;\n edges: {\n y: [number, number];\n };\n} => {\n const window = isElement(node) ? getWindow(node) : node;\n const scrollElRect = getBoundingClientRect(node);\n\n const edgeTop = window.scrollY + scrollElRect.top;\n const edgeBottom = edgeTop + scrollElRect.height;\n const y: [number, number] = [edgeTop, edgeBottom];\n\n return {\n relative: scrollElRect,\n edges: { y },\n };\n};\n\nexport const getDocumentBody = (node?: any): HTMLElement => getWindow(node).document.body;\n\nexport const getActiveElementByAnotherElement = (el: Element | null): Element | null =>\n el ? el.ownerDocument.activeElement : null;\n\nexport const contains = (parent?: Element | null, child?: Element | null): boolean => {\n return parent && child ? parent.contains(child) : false;\n};\n\nexport const getFirstTouchEventData = (\n event: UIEvent | React.UIEvent<HTMLElement>,\n): {\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n} => {\n let dataRaw = (function resolveData() {\n switch (event.type) {\n case 'touchend':\n return (event as TouchEvent).changedTouches[0];\n case 'touchstart':\n case 'touchmove':\n case 'touchcancel':\n return (event as TouchEvent).touches[0];\n case 'mousedown':\n case 'mousemove':\n case 'mouseup':\n case 'mouseleave':\n return event as MouseEvent;\n default:\n return { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n })();\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test') {\n dataRaw = dataRaw\n ? dataRaw\n : { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n return {\n screenX: dataRaw.screenX || 0,\n screenY: dataRaw.screenY || 0,\n clientX: dataRaw.clientX || 0,\n clientY: dataRaw.clientY || 0,\n pageX: dataRaw.pageX || 0,\n pageY: dataRaw.pageY || 0,\n };\n};\n\n/**\n * ⚠️ В частности, необходимо для iOS 15. Начиная с этой версии в Safari добавили\n * pull-to-refresh. CSS св-во `overflow-behavior` появился только с iOS 16.\n *\n * Во вторую очередь, полезна блокированием скролла, чтобы пользователь дождался обновления\n * данных.\n */\nexport const initializeBrowserGesturePreventionEffect = (window: Window): VoidFunction => {\n const options: AddEventListenerOptions & EventListenerOptions = { passive: false };\n const handleWindowTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.document.documentElement.classList.add('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.addEventListener('touchmove', handleWindowTouchMove, options);\n\n return function dispose() {\n window.document.documentElement.classList.remove('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.removeEventListener('touchmove', handleWindowTouchMove, options);\n };\n};\n\nconst nonTextInputTypes = { button: true, submit: true, reset: true, color: true, file: true, image: true, checkbox: true, radio: true }; // prettier-ignore\n\nexport const isHTMLContentEditableElement = (\n el: Element | null,\n): el is HTMLInputElement | HTMLTextAreaElement | HTMLElement => {\n if (el === null) {\n return false;\n }\n\n if (el.tagName === 'INPUT') {\n // @ts-expect-error: TS2339 за счёт `tagName` удовлетворяемся, что это `HTMLInputElement`\n return !nonTextInputTypes[el.type]; // prettier-ignore\n }\n\n return (\n el.tagName === 'TEXTAREA' ||\n // eslint-disable-next-line no-restricted-properties\n el.closest('[contenteditable=true]') !== null\n );\n};\n\nexport type VisualViewport = {\n offsetTop: number;\n offsetLeft: number;\n width: number;\n height: number;\n};\n\n/**\n * Фоллбек `visualViewport` для **Safari 12**.\n */\nexport function getVisualViewport(win: Window): VisualViewport {\n const result: VisualViewport = { offsetTop: 0, offsetLeft: 0, width: 0, height: 0 };\n if (win.visualViewport) {\n const { offsetTop, offsetLeft, width, height } = win.visualViewport;\n result.offsetTop = Math.round(offsetTop);\n result.offsetLeft = offsetLeft;\n result.width = width;\n result.height = Math.round(height);\n\n return result;\n }\n\n // TODO[Safari@>=13] Удалить фоллбек\n result.offsetTop = win.pageYOffset;\n result.offsetLeft = win.pageXOffset;\n result.width = win.innerWidth; // note: вызывает reflow в отличии от visualViewport\n result.height = win.innerHeight; // note: вызывает reflow в отличии от visualViewport\n return result;\n}\n\nexport const hasSelectionWithRangeType = (node: unknown) => {\n const selection = getWindow(node).getSelection();\n return selection ? selection.type === 'Range' : false;\n};\n\nexport function isSVGElement(value: unknown): value is SVGElement {\n if (!canUseDOM) {\n return false;\n }\n\n return value instanceof SVGElement || value instanceof getWindow(value).SVGElement;\n}\n"],"names":["React","canUseDOM","rectToClientRect","getParentNode","getWindow","isElement","isHTMLElement","isLastTraversableNode","isOverflowElement","getNodeScroll","canUseEventListeners","onDOMLoaded","getDOM","window","undefined","document","DOMContext","createContext","useDOM","useContext","isWindow","node","isBody","tagName","isDocumentElement","withDOM","Component","WithDOM","props","dom","blurActiveElement","activeElement","blur","TRANSFORM_DEFAULT_VALUES","WILL_CHANGE_DEFAULT_VALUES","getTransformedParentCoords","element","parentNode","transform","willChange","getComputedStyle","includes","x","y","getBoundingClientRect","isFixedStrategy","documentElement","clientRect","height","clientHeight","offsetX","offsetY","left","top","width","getRelativeBoundingClientRect","parent","child","parentRect","childRect","getNearestOverflowAncestor","terminalNode","getScrollHeight","scrollHeight","getScrollRect","scrollElRect","edgeTop","scrollY","edgeBottom","relative","edges","getDocumentBody","body","getActiveElementByAnotherElement","el","ownerDocument","contains","getFirstTouchEventData","event","dataRaw","resolveData","type","changedTouches","touches","screenX","screenY","clientX","clientY","pageX","pageY","process","env","NODE_ENV","initializeBrowserGesturePreventionEffect","options","passive","handleWindowTouchMove","preventDefault","stopPropagation","classList","add","addEventListener","dispose","remove","removeEventListener","nonTextInputTypes","button","submit","reset","color","file","image","checkbox","radio","isHTMLContentEditableElement","closest","getVisualViewport","win","result","offsetTop","offsetLeft","visualViewport","Math","round","pageYOffset","pageXOffset","innerWidth","innerHeight","hasSelectionWithRangeType","selection","getSelection","isSVGElement","value","SVGElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../src/lib/dom.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { canUseDOM } from '@vkontakte/vkjs';\nimport { rectToClientRect } from '@vkontakte/vkui-floating-ui/core';\nimport {\n getParentNode,\n getWindow,\n isElement,\n isHTMLElement,\n isLastTraversableNode,\n isOverflowElement,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport {\n getWindow,\n getNodeScroll,\n isHTMLElement,\n isElement,\n getParentNode,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport { canUseDOM, canUseEventListeners, onDOMLoaded } from '@vkontakte/vkjs';\nexport interface DOMContextInterface {\n /**\n * @ignore\n */\n window?: Window;\n /**\n * @ignore\n */\n document?: Document;\n}\n\nexport type DOMProps = DOMContextInterface;\n\n/* eslint-disable no-restricted-globals */\nconst getDOM = (): DOMContextInterface => ({\n window: canUseDOM ? window : undefined,\n document: canUseDOM ? document : undefined,\n});\n/* eslint-enable no-restricted-globals */\n\nexport const DOMContext: React.Context<DOMContextInterface> =\n React.createContext<DOMContextInterface>(getDOM());\n\nexport const useDOM = (): DOMContextInterface => {\n return React.useContext(DOMContext);\n};\n\n/**\n * В случае, если используется DOMContext, при проверке 'node instanceOf Window' – Window может быть\n * другим объектом.\n */\nexport const isWindow = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is Window => {\n return node !== null && node !== undefined && 'navigator' in node;\n};\n\nexport const isBody = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLBodyElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'BODY';\n};\n\nexport const isDocumentElement = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLHtmlElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'HTML';\n};\n\nexport function withDOM<Props>(\n Component: React.ComponentType<Props & DOMProps>,\n): React.ComponentType<Props> {\n const WithDOM = (props: Props) => {\n const dom = useDOM();\n return <Component {...props} {...dom} />;\n };\n return WithDOM;\n}\n\nexport function blurActiveElement(document: Document | undefined): void {\n if (document && document.activeElement) {\n (document.activeElement as HTMLElement).blur();\n }\n}\n\nexport const TRANSFORM_DEFAULT_VALUES: string[] = ['none', 'initial', 'inherit', 'unset'];\nexport const WILL_CHANGE_DEFAULT_VALUES: string[] = ['auto', 'initial', 'inherit', 'unset'];\nexport function getTransformedParentCoords(element: Element): {\n x: number;\n y: number;\n} {\n let parentNode = element.parentNode;\n while (parentNode !== null) {\n if (isHTMLElement(parentNode)) {\n let { transform, willChange } = getComputedStyle(parentNode);\n if (transform === '') {\n transform = 'unset';\n }\n if (willChange === '') {\n willChange = 'unset';\n }\n if (\n !TRANSFORM_DEFAULT_VALUES.includes(transform) ||\n !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)\n ) {\n const { x, y } = parentNode.getBoundingClientRect();\n return { x, y };\n }\n }\n parentNode = parentNode.parentNode;\n }\n return { x: 0, y: 0 };\n}\n\nexport const getBoundingClientRect = (node: Element | Window, isFixedStrategy = false) => {\n const element = isWindow(node) ? node.document.documentElement : node;\n const clientRect = element.getBoundingClientRect();\n\n if (isDocumentElement(element)) {\n /**\n * Если на странице не используется `html, body { height: 100% }` (или `height: 100vh`), то\n * `height`, полученный из `document.documentElement.getBoundingClientRect()`, будет возвращать\n * `scrollHeight`, а не `clientHeight`. Поэтому перебиваем `height` на `clientHeight`.\n */\n clientRect.height = element.clientHeight;\n }\n\n let offsetX = 0;\n let offsetY = 0;\n if (isFixedStrategy) {\n const { x, y } = getTransformedParentCoords(element);\n offsetX = x;\n offsetY = y;\n }\n\n return rectToClientRect({\n x: clientRect.left - offsetX,\n y: clientRect.top - offsetY,\n width: clientRect.width,\n height: clientRect.height,\n }) as DOMRect;\n};\n\nexport const getRelativeBoundingClientRect = (parent: Element, child: Element) => {\n const parentRect = getBoundingClientRect(parent);\n const childRect = getBoundingClientRect(child);\n return rectToClientRect({\n x: childRect.left - parentRect.left,\n y: childRect.top - parentRect.top,\n width: childRect.width,\n height: childRect.height,\n }) as DOMRect;\n};\n\n/**\n * Переписанный `getNearestOverflowAncestor` из @floating-ui/utils/dom.\n *\n * [1] добавляем ноду, на которой нужно остановить рекурсию\n * [2] document.body подменяем на window, т.к. на document.body нельзя применить скролл.\n *\n * @link https://github.com/floating-ui/floating-ui/blob/%40floating-ui/dom%401.6.3/packages/utils/src/dom.ts#L143\n */\nexport function getNearestOverflowAncestor(node: Node): HTMLElement | Window | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode: Node): HTMLElement | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode?: any): any {\n const parentNode = getParentNode(node);\n\n if (terminalNode === parentNode) {\n return null; /* [1] */\n }\n\n if (isLastTraversableNode(parentNode)) {\n return getWindow(parentNode); /* [2] */\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode, terminalNode);\n}\n\nexport const getScrollHeight = (node: Element | Window): number => {\n return isWindow(node) ? node.document.documentElement.scrollHeight : node.scrollHeight;\n};\n\nexport const getScrollRect = (\n node: Element | Window,\n): {\n relative: DOMRect;\n edges: {\n y: [number, number];\n };\n} => {\n const window = isElement(node) ? getWindow(node) : node;\n const scrollElRect = getBoundingClientRect(node);\n\n const edgeTop = window.scrollY + scrollElRect.top;\n const edgeBottom = edgeTop + scrollElRect.height;\n const y: [number, number] = [edgeTop, edgeBottom];\n\n return {\n relative: scrollElRect,\n edges: { y },\n };\n};\n\nexport const getDocumentBody = (node?: any): HTMLElement => getWindow(node).document.body;\n\nexport const getActiveElementByAnotherElement = (el: Element | null): Element | null =>\n el ? el.ownerDocument.activeElement : null;\n\nexport const contains = (parent?: Element | null, child?: Element | null): boolean => {\n return parent && child ? parent.contains(child) : false;\n};\n\nexport const getFirstTouchEventData = (\n event: UIEvent | React.UIEvent<HTMLElement>,\n): {\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n} => {\n let dataRaw = (function resolveData() {\n switch (event.type) {\n case 'touchend':\n return (event as TouchEvent).changedTouches[0];\n case 'touchstart':\n case 'touchmove':\n case 'touchcancel':\n return (event as TouchEvent).touches[0];\n case 'mousedown':\n case 'mousemove':\n case 'mouseup':\n case 'mouseleave':\n return event as MouseEvent;\n default:\n return { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n })();\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test') {\n dataRaw = dataRaw\n ? dataRaw\n : { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n return {\n screenX: dataRaw.screenX || 0,\n screenY: dataRaw.screenY || 0,\n clientX: dataRaw.clientX || 0,\n clientY: dataRaw.clientY || 0,\n pageX: dataRaw.pageX || 0,\n pageY: dataRaw.pageY || 0,\n };\n};\n\n/**\n * ⚠️ В частности, необходимо для iOS 15. Начиная с этой версии в Safari добавили\n * pull-to-refresh. CSS св-во `overflow-behavior` появился только с iOS 16.\n *\n * Во вторую очередь, полезна блокированием скролла, чтобы пользователь дождался обновления\n * данных.\n */\nexport const initializeBrowserGesturePreventionEffect = (window: Window): VoidFunction => {\n const options: AddEventListenerOptions & EventListenerOptions = { passive: false };\n const handleWindowTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.document.documentElement.classList.add('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.addEventListener('touchmove', handleWindowTouchMove, options);\n\n return function dispose() {\n window.document.documentElement.classList.remove('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.removeEventListener('touchmove', handleWindowTouchMove, options);\n };\n};\n\nconst nonTextInputTypes = {\n button: true,\n submit: true,\n reset: true,\n color: true,\n file: true,\n image: true,\n checkbox: true,\n radio: true,\n};\n\nexport const isHTMLContentEditableElement = (\n el: Element | null,\n): el is HTMLInputElement | HTMLTextAreaElement | HTMLElement => {\n if (el === null) {\n return false;\n }\n\n if (el.tagName === 'INPUT') {\n // @ts-expect-error: TS2339 за счёт `tagName` удовлетворяемся, что это `HTMLInputElement`\n return !nonTextInputTypes[el.type];\n }\n\n return (\n el.tagName === 'TEXTAREA' ||\n // eslint-disable-next-line no-restricted-properties\n el.closest('[contenteditable=true]') !== null\n );\n};\n\nexport type VisualViewport = {\n offsetTop: number;\n offsetLeft: number;\n width: number;\n height: number;\n};\n\n/**\n * Фоллбек `visualViewport` для **Safari 12**.\n */\nexport function getVisualViewport(win: Window): VisualViewport {\n const result: VisualViewport = { offsetTop: 0, offsetLeft: 0, width: 0, height: 0 };\n if (win.visualViewport) {\n const { offsetTop, offsetLeft, width, height } = win.visualViewport;\n result.offsetTop = Math.round(offsetTop);\n result.offsetLeft = offsetLeft;\n result.width = width;\n result.height = Math.round(height);\n\n return result;\n }\n\n // TODO[Safari@>=13] Удалить фоллбек\n result.offsetTop = win.pageYOffset;\n result.offsetLeft = win.pageXOffset;\n result.width = win.innerWidth; // note: вызывает reflow в отличии от visualViewport\n result.height = win.innerHeight; // note: вызывает reflow в отличии от visualViewport\n return result;\n}\n\nexport const hasSelectionWithRangeType = (node: unknown) => {\n const selection = getWindow(node).getSelection();\n return selection ? selection.type === 'Range' : false;\n};\n\nexport function isSVGElement(value: unknown): value is SVGElement {\n if (!canUseDOM) {\n return false;\n }\n\n return value instanceof SVGElement || value instanceof getWindow(value).SVGElement;\n}\n"],"names":["React","canUseDOM","rectToClientRect","getParentNode","getWindow","isElement","isHTMLElement","isLastTraversableNode","isOverflowElement","getNodeScroll","canUseEventListeners","onDOMLoaded","getDOM","window","undefined","document","DOMContext","createContext","useDOM","useContext","isWindow","node","isBody","tagName","isDocumentElement","withDOM","Component","WithDOM","props","dom","blurActiveElement","activeElement","blur","TRANSFORM_DEFAULT_VALUES","WILL_CHANGE_DEFAULT_VALUES","getTransformedParentCoords","element","parentNode","transform","willChange","getComputedStyle","includes","x","y","getBoundingClientRect","isFixedStrategy","documentElement","clientRect","height","clientHeight","offsetX","offsetY","left","top","width","getRelativeBoundingClientRect","parent","child","parentRect","childRect","getNearestOverflowAncestor","terminalNode","getScrollHeight","scrollHeight","getScrollRect","scrollElRect","edgeTop","scrollY","edgeBottom","relative","edges","getDocumentBody","body","getActiveElementByAnotherElement","el","ownerDocument","contains","getFirstTouchEventData","event","dataRaw","resolveData","type","changedTouches","touches","screenX","screenY","clientX","clientY","pageX","pageY","process","env","NODE_ENV","initializeBrowserGesturePreventionEffect","options","passive","handleWindowTouchMove","preventDefault","stopPropagation","classList","add","addEventListener","dispose","remove","removeEventListener","nonTextInputTypes","button","submit","reset","color","file","image","checkbox","radio","isHTMLContentEditableElement","closest","getVisualViewport","win","result","offsetTop","offsetLeft","visualViewport","Math","round","pageYOffset","pageXOffset","innerWidth","innerHeight","hasSelectionWithRangeType","selection","getSelection","isSVGElement","value","SVGElement"],"mappings":"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"}
|
|
@@ -45,7 +45,7 @@ export interface UseFloatingMiddlewaresBootstrapOptions {
|
|
|
45
45
|
*/
|
|
46
46
|
sameWidth?: boolean;
|
|
47
47
|
/**
|
|
48
|
-
*
|
|
48
|
+
* Позволяет задать или переопределить модификаторы библиотеки **Floating UI** (подробнее в документации про [middleware](https://floating-ui.com/docs/middleware)).
|
|
49
49
|
*/
|
|
50
50
|
customMiddlewares?: UseFloatingMiddleware[];
|
|
51
51
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n arrowMiddleware,\n autoPlacementMiddleware,\n flipMiddleware,\n type FlipMiddlewareOptions,\n hideMiddleware,\n offsetMiddleware,\n shiftMiddleware,\n sizeMiddleware,\n} from '../adapters';\nimport { checkIsNotAutoPlacement, getAutoPlacementAlign } from '../functions';\nimport {\n type ArrowOptions,\n type Placement,\n type PlacementWithAuto,\n type UseFloatingMiddleware,\n} from '../types/common';\n\nexport interface UseFloatingMiddlewaresBootstrapOptions {\n /**\n * По умолчанию компонент выберет наилучшее расположение сам, но приоритетное можно задать с помощью этого свойства.\n */\n placement?: PlacementWithAuto;\n /**\n * Указанное значение `placement` форсируется, даже если для выпадающего элемента недостаточно места.\n * Не оказывает влияния при `placement` значениях - `'auto' | 'auto-start' | 'auto-end'`\n */\n disableFlipMiddleware?: boolean;\n /**\n * Позволяет отключить смещение по главной оси,\n * которое не даёт всплывающему элементу выходить за границы видимой области.\n */\n disableShiftMiddleware?: boolean;\n /**\n * Задаёт резервный вариант размещения по перпендикулярной оси.\n */\n flipMiddlewareFallbackAxisSideDirection?: FlipMiddlewareOptions['fallbackAxisSideDirection'];\n /**\n * Отступ по главной оси.\n */\n offsetByMainAxis?: number;\n /**\n * Отступ по вспомогательной оси.\n */\n offsetByCrossAxis?: number;\n arrowRef?: ArrowOptions['element'];\n /**\n * Отображать ли стрелку, указывающую на якорный элемент.\n */\n arrow?: boolean;\n /**\n * Высота стрелки. Складывается с `mainAxis`, чтобы стрелка не залезала на якорный элемент.\n */\n arrowHeight?: number;\n /**\n * Безопасная зона вокруг стрелки, чтобы та не выходила за края контента.\n */\n arrowPadding?: number;\n /**\n * Выставлять ширину равной target элементу.\n */\n sameWidth?: boolean;\n /**\n *
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts"],"sourcesContent":["import * as React from 'react';\nimport {\n arrowMiddleware,\n autoPlacementMiddleware,\n flipMiddleware,\n type FlipMiddlewareOptions,\n hideMiddleware,\n offsetMiddleware,\n shiftMiddleware,\n sizeMiddleware,\n} from '../adapters';\nimport { checkIsNotAutoPlacement, getAutoPlacementAlign } from '../functions';\nimport {\n type ArrowOptions,\n type Placement,\n type PlacementWithAuto,\n type UseFloatingMiddleware,\n} from '../types/common';\n\nexport interface UseFloatingMiddlewaresBootstrapOptions {\n /**\n * По умолчанию компонент выберет наилучшее расположение сам, но приоритетное можно задать с помощью этого свойства.\n */\n placement?: PlacementWithAuto;\n /**\n * Указанное значение `placement` форсируется, даже если для выпадающего элемента недостаточно места.\n * Не оказывает влияния при `placement` значениях - `'auto' | 'auto-start' | 'auto-end'`\n */\n disableFlipMiddleware?: boolean;\n /**\n * Позволяет отключить смещение по главной оси,\n * которое не даёт всплывающему элементу выходить за границы видимой области.\n */\n disableShiftMiddleware?: boolean;\n /**\n * Задаёт резервный вариант размещения по перпендикулярной оси.\n */\n flipMiddlewareFallbackAxisSideDirection?: FlipMiddlewareOptions['fallbackAxisSideDirection'];\n /**\n * Отступ по главной оси.\n */\n offsetByMainAxis?: number;\n /**\n * Отступ по вспомогательной оси.\n */\n offsetByCrossAxis?: number;\n arrowRef?: ArrowOptions['element'];\n /**\n * Отображать ли стрелку, указывающую на якорный элемент.\n */\n arrow?: boolean;\n /**\n * Высота стрелки. Складывается с `mainAxis`, чтобы стрелка не залезала на якорный элемент.\n */\n arrowHeight?: number;\n /**\n * Безопасная зона вокруг стрелки, чтобы та не выходила за края контента.\n */\n arrowPadding?: number;\n /**\n * Выставлять ширину равной target элементу.\n */\n sameWidth?: boolean;\n /**\n * Позволяет задать или переопределить модификаторы библиотеки **Floating UI** (подробнее в документации про [middleware](https://floating-ui.com/docs/middleware)).\n */\n customMiddlewares?: UseFloatingMiddleware[];\n /**\n * Принудительно скрывает компонент если целевой элемент вышел за область видимости.\n */\n hideWhenReferenceHidden?: boolean;\n}\n\nexport const useFloatingMiddlewaresBootstrap = ({\n placement = 'bottom-start',\n arrowRef = null,\n arrow,\n arrowHeight,\n arrowPadding,\n sameWidth,\n offsetByMainAxis = 0,\n offsetByCrossAxis = 0,\n customMiddlewares,\n hideWhenReferenceHidden,\n disableFlipMiddleware = false,\n disableShiftMiddleware = false,\n flipMiddlewareFallbackAxisSideDirection = 'end',\n}: UseFloatingMiddlewaresBootstrapOptions): {\n middlewares: UseFloatingMiddleware[];\n strictPlacement: Placement | undefined;\n} => {\n return React.useMemo(() => {\n const isAutoPlacement = !checkIsNotAutoPlacement(placement);\n const middlewares: UseFloatingMiddleware[] = [\n offsetMiddleware({\n crossAxis: offsetByCrossAxis,\n mainAxis: arrow && arrowHeight ? offsetByMainAxis + arrowHeight : offsetByMainAxis,\n }),\n ];\n\n const shift = disableShiftMiddleware ? null : shiftMiddleware();\n\n // см. https://github.com/floating-ui/floating-ui/blob/%40floating-ui/core%401.7.1/website/pages/docs/flip.mdx#conflict-with-autoplacementjs\n if (isAutoPlacement) {\n middlewares.push(autoPlacementMiddleware({ alignment: getAutoPlacementAlign(placement) }));\n if (shift) {\n middlewares.push(shift);\n }\n } else if (!disableFlipMiddleware) {\n const flip = flipMiddleware({\n crossAxis: 'alignment',\n fallbackAxisSideDirection: flipMiddlewareFallbackAxisSideDirection,\n });\n\n // см. https://github.com/floating-ui/floating-ui/blob/%40floating-ui/core%401.7.1/website/pages/docs/flip.mdx#combining-with-shiftjs\n if (placement.includes('-')) {\n middlewares.push(flip);\n if (shift) {\n middlewares.push(shift);\n }\n } else {\n if (shift) {\n middlewares.push(shift);\n }\n middlewares.push(flip);\n }\n } else if (shift) {\n middlewares.push(shift);\n }\n\n if (sameWidth) {\n middlewares.push(\n sizeMiddleware({\n apply({ rects, elements }) {\n Object.assign(elements.floating.style, {\n width: `${rects.reference.width}px`,\n });\n },\n }),\n );\n }\n\n if (customMiddlewares) {\n middlewares.push(...customMiddlewares);\n }\n\n // см. https://github.com/floating-ui/floating-ui/blob/%40floating-ui/core%401.7.1/website/pages/docs/arrow.mdx#order\n if (arrow) {\n middlewares.push(\n arrowMiddleware({\n element: arrowRef,\n padding: arrowPadding,\n }),\n );\n }\n\n if (hideWhenReferenceHidden) {\n middlewares.push(hideMiddleware());\n }\n\n return { middlewares, strictPlacement: isAutoPlacement ? undefined : placement };\n }, [\n placement,\n offsetByCrossAxis,\n arrow,\n arrowHeight,\n offsetByMainAxis,\n disableFlipMiddleware,\n disableShiftMiddleware,\n flipMiddlewareFallbackAxisSideDirection,\n sameWidth,\n customMiddlewares,\n hideWhenReferenceHidden,\n arrowRef,\n arrowPadding,\n ]);\n};\n"],"names":["React","arrowMiddleware","autoPlacementMiddleware","flipMiddleware","hideMiddleware","offsetMiddleware","shiftMiddleware","sizeMiddleware","checkIsNotAutoPlacement","getAutoPlacementAlign","useFloatingMiddlewaresBootstrap","placement","arrowRef","arrow","arrowHeight","arrowPadding","sameWidth","offsetByMainAxis","offsetByCrossAxis","customMiddlewares","hideWhenReferenceHidden","disableFlipMiddleware","disableShiftMiddleware","flipMiddlewareFallbackAxisSideDirection","useMemo","isAutoPlacement","middlewares","crossAxis","mainAxis","shift","push","alignment","flip","fallbackAxisSideDirection","includes","apply","rects","elements","Object","assign","floating","style","width","reference","element","padding","strictPlacement","undefined"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SACEC,eAAe,EACfC,uBAAuB,EACvBC,cAAc,EAEdC,cAAc,EACdC,gBAAgB,EAChBC,eAAe,EACfC,cAAc,QACT,iBAAc;AACrB,SAASC,uBAAuB,EAAEC,qBAAqB,QAAQ,kBAAe;AA8D9E,OAAO,MAAMC,kCAAkC,CAAC,EAC9CC,YAAY,cAAc,EAC1BC,WAAW,IAAI,EACfC,KAAK,EACLC,WAAW,EACXC,YAAY,EACZC,SAAS,EACTC,mBAAmB,CAAC,EACpBC,oBAAoB,CAAC,EACrBC,iBAAiB,EACjBC,uBAAuB,EACvBC,wBAAwB,KAAK,EAC7BC,yBAAyB,KAAK,EAC9BC,0CAA0C,KAAK,EACR;IAIvC,OAAOvB,MAAMwB,OAAO,CAAC;QACnB,MAAMC,kBAAkB,CAACjB,wBAAwBG;QACjD,MAAMe,cAAuC;YAC3CrB,iBAAiB;gBACfsB,WAAWT;gBACXU,UAAUf,SAASC,cAAcG,mBAAmBH,cAAcG;YACpE;SACD;QAED,MAAMY,QAAQP,yBAAyB,OAAOhB;QAE9C,4IAA4I;QAC5I,IAAImB,iBAAiB;YACnBC,YAAYI,IAAI,CAAC5B,wBAAwB;gBAAE6B,WAAWtB,sBAAsBE;YAAW;YACvF,IAAIkB,OAAO;gBACTH,YAAYI,IAAI,CAACD;YACnB;QACF,OAAO,IAAI,CAACR,uBAAuB;YACjC,MAAMW,OAAO7B,eAAe;gBAC1BwB,WAAW;gBACXM,2BAA2BV;YAC7B;YAEA,qIAAqI;YACrI,IAAIZ,UAAUuB,QAAQ,CAAC,MAAM;gBAC3BR,YAAYI,IAAI,CAACE;gBACjB,IAAIH,OAAO;oBACTH,YAAYI,IAAI,CAACD;gBACnB;YACF,OAAO;gBACL,IAAIA,OAAO;oBACTH,YAAYI,IAAI,CAACD;gBACnB;gBACAH,YAAYI,IAAI,CAACE;YACnB;QACF,OAAO,IAAIH,OAAO;YAChBH,YAAYI,IAAI,CAACD;QACnB;QAEA,IAAIb,WAAW;YACbU,YAAYI,IAAI,CACdvB,eAAe;gBACb4B,OAAM,EAAEC,KAAK,EAAEC,QAAQ,EAAE;oBACvBC,OAAOC,MAAM,CAACF,SAASG,QAAQ,CAACC,KAAK,EAAE;wBACrCC,OAAO,GAAGN,MAAMO,SAAS,CAACD,KAAK,CAAC,EAAE,CAAC;oBACrC;gBACF;YACF;QAEJ;QAEA,IAAIvB,mBAAmB;YACrBO,YAAYI,IAAI,IAAIX;QACtB;QAEA,qHAAqH;QACrH,IAAIN,OAAO;YACTa,YAAYI,IAAI,CACd7B,gBAAgB;gBACd2C,SAAShC;gBACTiC,SAAS9B;YACX;QAEJ;QAEA,IAAIK,yBAAyB;YAC3BM,YAAYI,IAAI,CAAC1B;QACnB;QAEA,OAAO;YAAEsB;YAAaoB,iBAAiBrB,kBAAkBsB,YAAYpC;QAAU;IACjF,GAAG;QACDA;QACAO;QACAL;QACAC;QACAG;QACAI;QACAC;QACAC;QACAP;QACAG;QACAC;QACAR;QACAG;KACD;AACH,EAAE"}
|
|
@@ -178,7 +178,7 @@ export class BottomSheetController {
|
|
|
178
178
|
return currentY === snapPointDetents[snapPointDetents.length - 1];
|
|
179
179
|
}
|
|
180
180
|
static getClosestSnapPointByDirection(snapPointDetents, currentY, direction) {
|
|
181
|
-
const foundIndex = snapPointDetents.
|
|
181
|
+
const foundIndex = snapPointDetents.indexOf(currentY);
|
|
182
182
|
switch(direction){
|
|
183
183
|
case -1:
|
|
184
184
|
var _snapPointDetents_;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/sheet/controllers/BottomSheetController.ts"],"sourcesContent":["import { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../../helpers/math';\nimport { rubberbandIfOutOfBounds } from '../../animation';\nimport { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';\nimport { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';\nimport {\n BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,\n DRAG_THRESHOLDS,\n DYNAMIC_SNAP_POINT_DATA,\n SNAP_POINT_DETENTS,\n} from '../constants';\nimport type { CSSTransitionController } from './CSSTransitionController';\n\nexport type SnapPointDetents = [number, number] | [number, number, number];\n\nexport type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };\n\nexport type SnapPointChange = (snapPoint: number) => void;\n\nexport type BottomSheetControllerOptions = {\n sheetScrollEl: HTMLElement | null;\n sheetTransitionController: CSSTransitionController<string>;\n backdropTransitionController: CSSTransitionController | null;\n onSnapPointChange: SnapPointChange;\n onDismiss: VoidFunction;\n};\n\nexport class BottomSheetController {\n private readonly sheetEl: HTMLElement;\n\n constructor(\n sheetEl: HTMLElement,\n {\n sheetScrollEl,\n sheetTransitionController,\n backdropTransitionController,\n onSnapPointChange,\n onDismiss,\n }: BottomSheetControllerOptions,\n ) {\n this.sheetEl = sheetEl;\n this.onSnapPointChange = onSnapPointChange;\n this.onDismiss = onDismiss;\n this.panGestureRecognizer = new UIPanGestureRecognizer();\n this.sheetScrollEl = sheetScrollEl;\n this.sheetTransitionController = sheetTransitionController;\n this.backdropTransitionController = backdropTransitionController;\n }\n\n init(snapPoint: SnapPoint) {\n this.isInitialized = true;\n\n if (snapPoint === 'auto') {\n this.unit = 'px';\n this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;\n this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];\n } else {\n this.unit = '%';\n this.currentSnapPoint = snapPoint.initial;\n this.snapPointDetents = snapPoint.detents;\n }\n }\n\n destroy() {\n this.isInitialized = false;\n this.pannedEl = null;\n this.sheetTransitionController.cleanup();\n this.backdropTransitionController?.cleanup();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n panStart(event: UIEvent) {\n if (\n !this.isInitialized ||\n this.panState !== 'idle' ||\n hasSelectionWithRangeType(event.target)\n ) {\n return;\n }\n\n this.panState = 'start';\n this.pannedEl = event.target as HTMLElement;\n this.panGestureRecognizer.setStartCoords(event);\n }\n\n panMove(event: UIEvent) {\n switch (this.panState) {\n case 'start':\n this.panGestureRecognizer.setInitialTimeOnce();\n this.panGestureRecognizer.setEndCoords(event);\n\n if (this.preventUntilPanGestureBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfPannedElIsNotValid()) {\n this.panState = 'idle';\n return;\n }\n\n if (this.preventUntilVerticalScrollingOnSheetScrollElBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled()) {\n this.panState = 'idle';\n return;\n }\n\n this.panState = 'moving';\n this.panGestureRecognizer.setStartCoords(event);\n\n this.sheetHeight = this.sheetEl.offsetHeight;\n\n this.disableVerticalScrollBouncingDispose =\n BottomSheetController.disableVerticalScrollBouncingIfNeeded(\n this.sheetScrollEl,\n this.pannedEl,\n );\n\n if (this.isDynamicSnapPoint) {\n this.currentSnapPoint = this.sheetHeight;\n this.snapPointDetents[DYNAMIC_SNAP_POINT_DATA.COMPUTED_INDEX] = this.sheetHeight;\n }\n break;\n case 'moving':\n this.panGestureRecognizer.setEndCoords(event);\n\n const { y1, y2 } = this.panGestureRecognizer;\n\n this.nextSnapPoint = rubberbandIfOutOfBounds(\n this.currentSnapPoint - ((y2 - y1) / this.sheetHeight) * this.currentSnapPoint,\n SNAP_POINT_DETENTS.MIN,\n this.isDynamicSnapPoint ? this.sheetHeight : SNAP_POINT_DETENTS.LARGE,\n );\n\n this.calculateSnapPoint(this.nextSnapPoint, true);\n break;\n }\n }\n\n panEnd() {\n switch (this.panState) {\n case 'moving':\n const prevCurrentSnapPoint = this.currentSnapPoint;\n this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);\n\n if (\n prevCurrentSnapPoint !== this.currentSnapPoint &&\n this.currentSnapPoint > SNAP_POINT_DETENTS.MIN\n ) {\n this.onSnapPointChange(this.currentSnapPoint);\n }\n\n this.calculateSnapPoint(this.currentSnapPoint);\n break;\n }\n\n this.panState = 'idle';\n this.panGestureRecognizer.reset();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n private isInitialized = false;\n private panState: 'idle' | 'start' | 'moving' = 'idle';\n private pannedEl: HTMLElement | null = null;\n private sheetHeight = 0;\n private rafId: number | null = null;\n private currentSnapPoint = 0;\n private nextSnapPoint = 0;\n private snapPointDetents: SnapPointDetents = [0, 0];\n private unit: 'px' | '%' = '%';\n private get isDynamicSnapPoint() {\n return this.unit === 'px';\n }\n private disableVerticalScrollBouncingDispose = noop;\n private readonly sheetScrollEl: HTMLElement | null;\n private readonly sheetTransitionController: CSSTransitionController<string>;\n private readonly backdropTransitionController: CSSTransitionController | null;\n private readonly panGestureRecognizer: UIPanGestureRecognizer;\n private readonly onSnapPointChange: SnapPointChange;\n private readonly onDismiss: VoidFunction;\n\n private calculateSnapPoint(nextSnapPoint: number, immediately = false) {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n\n if (nextSnapPoint <= SNAP_POINT_DETENTS.MIN) {\n this.sheetTransitionController.enableTransition();\n this.backdropTransitionController?.enableTransition();\n this.panState = 'idle';\n this.onDismiss();\n return;\n }\n\n const backdropOpacity = clamp(\n this.isDynamicSnapPoint\n ? nextSnapPoint / this.sheetHeight\n : (nextSnapPoint * 2) / SNAP_POINT_DETENTS.LARGE,\n 0,\n 1,\n );\n\n this.rafId = requestAnimationFrame(() => {\n if (immediately) {\n this.backdropTransitionController?.disableTransition().set(backdropOpacity);\n this.sheetTransitionController.disableTransition().set(`${nextSnapPoint}${this.unit}`);\n return;\n }\n\n if (this.isDynamicSnapPoint) {\n this.sheetTransitionController.cleanupOnTransitionEnd();\n }\n\n this.backdropTransitionController?.unset();\n this.sheetTransitionController.enableTransition().set(`${this.currentSnapPoint}${this.unit}`);\n });\n }\n\n private getSnapPointTo(nextSnapPoint: number) {\n const closestSnapPoint = BottomSheetController.getClosestSnapPoint(\n this.snapPointDetents,\n nextSnapPoint,\n );\n if (closestSnapPoint !== this.currentSnapPoint) {\n return closestSnapPoint;\n }\n\n const panDirection = this.panGestureRecognizer.direction();\n if (panDirection.axis !== 'y' || panDirection.direction === null) {\n return this.currentSnapPoint;\n }\n\n const velocity = this.panGestureRecognizer.velocity();\n if (Math.abs(velocity.y) < DRAG_THRESHOLDS.VELOCITY) {\n return this.currentSnapPoint;\n }\n\n const closestSnapPointByDirection = BottomSheetController.getClosestSnapPointByDirection(\n this.snapPointDetents,\n closestSnapPoint,\n panDirection.direction,\n );\n\n return closestSnapPointByDirection;\n }\n\n private preventUntilPanGestureBecomesExpected() {\n return (\n this.panGestureRecognizer.direction().axis === 'x' ||\n this.panGestureRecognizer.distance() < DRAG_THRESHOLDS.DISTANCE_FOR_MOVING_START\n );\n }\n\n private preventImmediatelyIfPannedElIsNotValid() {\n return (\n this.pannedEl === null ||\n // Элемент со специальным атрибутом\n this.pannedEl.closest(`[${BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY}=true]`) !== null || // eslint-disable-line no-restricted-properties\n // Элемент за пределами панели.\n !this.sheetEl.contains(this.pannedEl)\n );\n }\n\n private preventUntilVerticalScrollingOnSheetScrollElBecomesExpected() {\n if (\n this.sheetScrollEl === null ||\n !this.sheetScrollEl.contains(this.pannedEl) ||\n this.sheetScrollEl.scrollHeight <= this.sheetScrollEl.clientHeight\n ) {\n return false;\n }\n\n if (this.sheetScrollEl.scrollTop === 0) {\n return (\n this.panGestureRecognizer.direction().direction === -1 &&\n BottomSheetController.isLastSnapPointDetents(this.snapPointDetents, this.currentSnapPoint)\n );\n }\n\n return true;\n }\n\n private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {\n if (\n /* istanbul ignore next: покрываем TypeScript */\n this.pannedEl === null ||\n this.pannedEl === this.sheetEl ||\n this.pannedEl === this.sheetScrollEl\n ) {\n return false;\n }\n\n const overflowAncestor = getNearestOverflowAncestor(this.pannedEl, this.sheetEl);\n\n if (\n overflowAncestor === null ||\n this.sheetScrollEl === overflowAncestor ||\n overflowAncestor.scrollHeight <= overflowAncestor.clientHeight\n ) {\n return false;\n }\n\n return (\n overflowAncestor.scrollTop !== 0 || this.panGestureRecognizer.direction().direction === -1\n );\n }\n\n private static disableVerticalScrollBouncingIfNeeded(\n sheetScrollEl: HTMLElement | null,\n targetEl: HTMLElement | null,\n ) {\n if (\n sheetScrollEl !== null &&\n sheetScrollEl.scrollTop <= 0 &&\n sheetScrollEl.contains(targetEl) &&\n sheetScrollEl.scrollHeight > sheetScrollEl.clientHeight\n ) {\n sheetScrollEl.style.setProperty('overflow-y', 'hidden');\n return function dispose() {\n sheetScrollEl.style.removeProperty('overflow-y');\n };\n }\n return noop;\n }\n\n private static isLastSnapPointDetents(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n ): boolean {\n return currentY === snapPointDetents[snapPointDetents.length - 1];\n }\n\n private static getClosestSnapPointByDirection(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n direction: -1 | 1,\n ): number {\n const foundIndex = snapPointDetents.findIndex((i) => i === currentY);\n switch (direction) {\n case -1:\n return snapPointDetents[foundIndex + 1] ?? snapPointDetents[snapPointDetents.length - 1];\n case 1:\n return snapPointDetents[foundIndex - 1] ?? snapPointDetents[0];\n }\n }\n\n private static getClosestSnapPoint(snapPointDetents: SnapPointDetents, currentY: number) {\n let closest = snapPointDetents[0];\n let minDifference = Math.abs(snapPointDetents[0] - currentY);\n\n for (let i = 1; i < snapPointDetents.length; i += 1) {\n const difference = Math.abs(snapPointDetents[i] - currentY);\n if (difference < minDifference) {\n closest = snapPointDetents[i];\n minDifference = difference;\n }\n }\n\n return closest;\n }\n}\n"],"names":["noop","clamp","rubberbandIfOutOfBounds","getNearestOverflowAncestor","hasSelectionWithRangeType","UIPanGestureRecognizer","BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY","DRAG_THRESHOLDS","DYNAMIC_SNAP_POINT_DATA","SNAP_POINT_DETENTS","BottomSheetController","init","snapPoint","isInitialized","unit","currentSnapPoint","IDLE_POINT_VALUE","snapPointDetents","MIN","initial","detents","destroy","pannedEl","sheetTransitionController","cleanup","backdropTransitionController","disableVerticalScrollBouncingDispose","panStart","event","panState","target","panGestureRecognizer","setStartCoords","panMove","setInitialTimeOnce","setEndCoords","preventUntilPanGestureBecomesExpected","preventImmediatelyIfPannedElIsNotValid","preventUntilVerticalScrollingOnSheetScrollElBecomesExpected","preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled","sheetHeight","sheetEl","offsetHeight","disableVerticalScrollBouncingIfNeeded","sheetScrollEl","isDynamicSnapPoint","COMPUTED_INDEX","y1","y2","nextSnapPoint","LARGE","calculateSnapPoint","panEnd","prevCurrentSnapPoint","getSnapPointTo","onSnapPointChange","reset","immediately","rafId","cancelAnimationFrame","enableTransition","onDismiss","backdropOpacity","requestAnimationFrame","disableTransition","set","cleanupOnTransitionEnd","unset","closestSnapPoint","getClosestSnapPoint","panDirection","direction","axis","velocity","Math","abs","y","VELOCITY","closestSnapPointByDirection","getClosestSnapPointByDirection","distance","DISTANCE_FOR_MOVING_START","closest","contains","scrollHeight","clientHeight","scrollTop","isLastSnapPointDetents","overflowAncestor","targetEl","style","setProperty","dispose","removeProperty","currentY","length","foundIndex","findIndex","i","minDifference","difference"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/sheet/controllers/BottomSheetController.ts"],"sourcesContent":["import { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../../helpers/math';\nimport { rubberbandIfOutOfBounds } from '../../animation';\nimport { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';\nimport { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';\nimport {\n BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,\n DRAG_THRESHOLDS,\n DYNAMIC_SNAP_POINT_DATA,\n SNAP_POINT_DETENTS,\n} from '../constants';\nimport type { CSSTransitionController } from './CSSTransitionController';\n\nexport type SnapPointDetents = [number, number] | [number, number, number];\n\nexport type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };\n\nexport type SnapPointChange = (snapPoint: number) => void;\n\nexport type BottomSheetControllerOptions = {\n sheetScrollEl: HTMLElement | null;\n sheetTransitionController: CSSTransitionController<string>;\n backdropTransitionController: CSSTransitionController | null;\n onSnapPointChange: SnapPointChange;\n onDismiss: VoidFunction;\n};\n\nexport class BottomSheetController {\n private readonly sheetEl: HTMLElement;\n\n constructor(\n sheetEl: HTMLElement,\n {\n sheetScrollEl,\n sheetTransitionController,\n backdropTransitionController,\n onSnapPointChange,\n onDismiss,\n }: BottomSheetControllerOptions,\n ) {\n this.sheetEl = sheetEl;\n this.onSnapPointChange = onSnapPointChange;\n this.onDismiss = onDismiss;\n this.panGestureRecognizer = new UIPanGestureRecognizer();\n this.sheetScrollEl = sheetScrollEl;\n this.sheetTransitionController = sheetTransitionController;\n this.backdropTransitionController = backdropTransitionController;\n }\n\n init(snapPoint: SnapPoint) {\n this.isInitialized = true;\n\n if (snapPoint === 'auto') {\n this.unit = 'px';\n this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;\n this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];\n } else {\n this.unit = '%';\n this.currentSnapPoint = snapPoint.initial;\n this.snapPointDetents = snapPoint.detents;\n }\n }\n\n destroy() {\n this.isInitialized = false;\n this.pannedEl = null;\n this.sheetTransitionController.cleanup();\n this.backdropTransitionController?.cleanup();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n panStart(event: UIEvent) {\n if (\n !this.isInitialized ||\n this.panState !== 'idle' ||\n hasSelectionWithRangeType(event.target)\n ) {\n return;\n }\n\n this.panState = 'start';\n this.pannedEl = event.target as HTMLElement;\n this.panGestureRecognizer.setStartCoords(event);\n }\n\n panMove(event: UIEvent) {\n switch (this.panState) {\n case 'start':\n this.panGestureRecognizer.setInitialTimeOnce();\n this.panGestureRecognizer.setEndCoords(event);\n\n if (this.preventUntilPanGestureBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfPannedElIsNotValid()) {\n this.panState = 'idle';\n return;\n }\n\n if (this.preventUntilVerticalScrollingOnSheetScrollElBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled()) {\n this.panState = 'idle';\n return;\n }\n\n this.panState = 'moving';\n this.panGestureRecognizer.setStartCoords(event);\n\n this.sheetHeight = this.sheetEl.offsetHeight;\n\n this.disableVerticalScrollBouncingDispose =\n BottomSheetController.disableVerticalScrollBouncingIfNeeded(\n this.sheetScrollEl,\n this.pannedEl,\n );\n\n if (this.isDynamicSnapPoint) {\n this.currentSnapPoint = this.sheetHeight;\n this.snapPointDetents[DYNAMIC_SNAP_POINT_DATA.COMPUTED_INDEX] = this.sheetHeight;\n }\n break;\n case 'moving':\n this.panGestureRecognizer.setEndCoords(event);\n\n const { y1, y2 } = this.panGestureRecognizer;\n\n this.nextSnapPoint = rubberbandIfOutOfBounds(\n this.currentSnapPoint - ((y2 - y1) / this.sheetHeight) * this.currentSnapPoint,\n SNAP_POINT_DETENTS.MIN,\n this.isDynamicSnapPoint ? this.sheetHeight : SNAP_POINT_DETENTS.LARGE,\n );\n\n this.calculateSnapPoint(this.nextSnapPoint, true);\n break;\n }\n }\n\n panEnd() {\n switch (this.panState) {\n case 'moving':\n const prevCurrentSnapPoint = this.currentSnapPoint;\n this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);\n\n if (\n prevCurrentSnapPoint !== this.currentSnapPoint &&\n this.currentSnapPoint > SNAP_POINT_DETENTS.MIN\n ) {\n this.onSnapPointChange(this.currentSnapPoint);\n }\n\n this.calculateSnapPoint(this.currentSnapPoint);\n break;\n }\n\n this.panState = 'idle';\n this.panGestureRecognizer.reset();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n private isInitialized = false;\n private panState: 'idle' | 'start' | 'moving' = 'idle';\n private pannedEl: HTMLElement | null = null;\n private sheetHeight = 0;\n private rafId: number | null = null;\n private currentSnapPoint = 0;\n private nextSnapPoint = 0;\n private snapPointDetents: SnapPointDetents = [0, 0];\n private unit: 'px' | '%' = '%';\n private get isDynamicSnapPoint() {\n return this.unit === 'px';\n }\n private disableVerticalScrollBouncingDispose = noop;\n private readonly sheetScrollEl: HTMLElement | null;\n private readonly sheetTransitionController: CSSTransitionController<string>;\n private readonly backdropTransitionController: CSSTransitionController | null;\n private readonly panGestureRecognizer: UIPanGestureRecognizer;\n private readonly onSnapPointChange: SnapPointChange;\n private readonly onDismiss: VoidFunction;\n\n private calculateSnapPoint(nextSnapPoint: number, immediately = false) {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n\n if (nextSnapPoint <= SNAP_POINT_DETENTS.MIN) {\n this.sheetTransitionController.enableTransition();\n this.backdropTransitionController?.enableTransition();\n this.panState = 'idle';\n this.onDismiss();\n return;\n }\n\n const backdropOpacity = clamp(\n this.isDynamicSnapPoint\n ? nextSnapPoint / this.sheetHeight\n : (nextSnapPoint * 2) / SNAP_POINT_DETENTS.LARGE,\n 0,\n 1,\n );\n\n this.rafId = requestAnimationFrame(() => {\n if (immediately) {\n this.backdropTransitionController?.disableTransition().set(backdropOpacity);\n this.sheetTransitionController.disableTransition().set(`${nextSnapPoint}${this.unit}`);\n return;\n }\n\n if (this.isDynamicSnapPoint) {\n this.sheetTransitionController.cleanupOnTransitionEnd();\n }\n\n this.backdropTransitionController?.unset();\n this.sheetTransitionController.enableTransition().set(`${this.currentSnapPoint}${this.unit}`);\n });\n }\n\n private getSnapPointTo(nextSnapPoint: number) {\n const closestSnapPoint = BottomSheetController.getClosestSnapPoint(\n this.snapPointDetents,\n nextSnapPoint,\n );\n if (closestSnapPoint !== this.currentSnapPoint) {\n return closestSnapPoint;\n }\n\n const panDirection = this.panGestureRecognizer.direction();\n if (panDirection.axis !== 'y' || panDirection.direction === null) {\n return this.currentSnapPoint;\n }\n\n const velocity = this.panGestureRecognizer.velocity();\n if (Math.abs(velocity.y) < DRAG_THRESHOLDS.VELOCITY) {\n return this.currentSnapPoint;\n }\n\n const closestSnapPointByDirection = BottomSheetController.getClosestSnapPointByDirection(\n this.snapPointDetents,\n closestSnapPoint,\n panDirection.direction,\n );\n\n return closestSnapPointByDirection;\n }\n\n private preventUntilPanGestureBecomesExpected() {\n return (\n this.panGestureRecognizer.direction().axis === 'x' ||\n this.panGestureRecognizer.distance() < DRAG_THRESHOLDS.DISTANCE_FOR_MOVING_START\n );\n }\n\n private preventImmediatelyIfPannedElIsNotValid() {\n return (\n this.pannedEl === null ||\n // Элемент со специальным атрибутом\n this.pannedEl.closest(`[${BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY}=true]`) !== null || // eslint-disable-line no-restricted-properties\n // Элемент за пределами панели.\n !this.sheetEl.contains(this.pannedEl)\n );\n }\n\n private preventUntilVerticalScrollingOnSheetScrollElBecomesExpected() {\n if (\n this.sheetScrollEl === null ||\n !this.sheetScrollEl.contains(this.pannedEl) ||\n this.sheetScrollEl.scrollHeight <= this.sheetScrollEl.clientHeight\n ) {\n return false;\n }\n\n if (this.sheetScrollEl.scrollTop === 0) {\n return (\n this.panGestureRecognizer.direction().direction === -1 &&\n BottomSheetController.isLastSnapPointDetents(this.snapPointDetents, this.currentSnapPoint)\n );\n }\n\n return true;\n }\n\n private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {\n if (\n /* istanbul ignore next: покрываем TypeScript */\n this.pannedEl === null ||\n this.pannedEl === this.sheetEl ||\n this.pannedEl === this.sheetScrollEl\n ) {\n return false;\n }\n\n const overflowAncestor = getNearestOverflowAncestor(this.pannedEl, this.sheetEl);\n\n if (\n overflowAncestor === null ||\n this.sheetScrollEl === overflowAncestor ||\n overflowAncestor.scrollHeight <= overflowAncestor.clientHeight\n ) {\n return false;\n }\n\n return (\n overflowAncestor.scrollTop !== 0 || this.panGestureRecognizer.direction().direction === -1\n );\n }\n\n private static disableVerticalScrollBouncingIfNeeded(\n sheetScrollEl: HTMLElement | null,\n targetEl: HTMLElement | null,\n ) {\n if (\n sheetScrollEl !== null &&\n sheetScrollEl.scrollTop <= 0 &&\n sheetScrollEl.contains(targetEl) &&\n sheetScrollEl.scrollHeight > sheetScrollEl.clientHeight\n ) {\n sheetScrollEl.style.setProperty('overflow-y', 'hidden');\n return function dispose() {\n sheetScrollEl.style.removeProperty('overflow-y');\n };\n }\n return noop;\n }\n\n private static isLastSnapPointDetents(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n ): boolean {\n return currentY === snapPointDetents[snapPointDetents.length - 1];\n }\n\n private static getClosestSnapPointByDirection(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n direction: -1 | 1,\n ): number {\n const foundIndex = snapPointDetents.indexOf(currentY);\n switch (direction) {\n case -1:\n return snapPointDetents[foundIndex + 1] ?? snapPointDetents[snapPointDetents.length - 1];\n case 1:\n return snapPointDetents[foundIndex - 1] ?? snapPointDetents[0];\n }\n }\n\n private static getClosestSnapPoint(snapPointDetents: SnapPointDetents, currentY: number) {\n let closest = snapPointDetents[0];\n let minDifference = Math.abs(snapPointDetents[0] - currentY);\n\n for (let i = 1; i < snapPointDetents.length; i += 1) {\n const difference = Math.abs(snapPointDetents[i] - currentY);\n if (difference < minDifference) {\n closest = snapPointDetents[i];\n minDifference = difference;\n }\n }\n\n return closest;\n }\n}\n"],"names":["noop","clamp","rubberbandIfOutOfBounds","getNearestOverflowAncestor","hasSelectionWithRangeType","UIPanGestureRecognizer","BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY","DRAG_THRESHOLDS","DYNAMIC_SNAP_POINT_DATA","SNAP_POINT_DETENTS","BottomSheetController","init","snapPoint","isInitialized","unit","currentSnapPoint","IDLE_POINT_VALUE","snapPointDetents","MIN","initial","detents","destroy","pannedEl","sheetTransitionController","cleanup","backdropTransitionController","disableVerticalScrollBouncingDispose","panStart","event","panState","target","panGestureRecognizer","setStartCoords","panMove","setInitialTimeOnce","setEndCoords","preventUntilPanGestureBecomesExpected","preventImmediatelyIfPannedElIsNotValid","preventUntilVerticalScrollingOnSheetScrollElBecomesExpected","preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled","sheetHeight","sheetEl","offsetHeight","disableVerticalScrollBouncingIfNeeded","sheetScrollEl","isDynamicSnapPoint","COMPUTED_INDEX","y1","y2","nextSnapPoint","LARGE","calculateSnapPoint","panEnd","prevCurrentSnapPoint","getSnapPointTo","onSnapPointChange","reset","immediately","rafId","cancelAnimationFrame","enableTransition","onDismiss","backdropOpacity","requestAnimationFrame","disableTransition","set","cleanupOnTransitionEnd","unset","closestSnapPoint","getClosestSnapPoint","panDirection","direction","axis","velocity","Math","abs","y","VELOCITY","closestSnapPointByDirection","getClosestSnapPointByDirection","distance","DISTANCE_FOR_MOVING_START","closest","contains","scrollHeight","clientHeight","scrollTop","isLastSnapPointDetents","overflowAncestor","targetEl","style","setProperty","dispose","removeProperty","currentY","length","foundIndex","indexOf","minDifference","i","difference"],"mappings":";AAAA,SAASA,IAAI,QAAQ,kBAAkB;AACvC,SAASC,KAAK,QAAQ,2BAAwB;AAC9C,SAASC,uBAAuB,QAAQ,2BAAkB;AAC1D,SAASC,0BAA0B,EAAEC,yBAAyB,QAAQ,eAAY;AAClF,SAASC,sBAAsB,QAAQ,wCAAqC;AAC5E,SACEC,uCAAuC,EACvCC,eAAe,EACfC,uBAAuB,EACvBC,kBAAkB,QACb,kBAAe;AAiBtB,OAAO,MAAMC;IAsBXC,KAAKC,SAAoB,EAAE;QACzB,IAAI,CAACC,aAAa,GAAG;QAErB,IAAID,cAAc,QAAQ;YACxB,IAAI,CAACE,IAAI,GAAG;YACZ,IAAI,CAACC,gBAAgB,GAAGP,wBAAwBQ,gBAAgB;YAChE,IAAI,CAACC,gBAAgB,GAAG;gBAACR,mBAAmBS,GAAG;gBAAEV,wBAAwBQ,gBAAgB;aAAC;QAC5F,OAAO;YACL,IAAI,CAACF,IAAI,GAAG;YACZ,IAAI,CAACC,gBAAgB,GAAGH,UAAUO,OAAO;YACzC,IAAI,CAACF,gBAAgB,GAAGL,UAAUQ,OAAO;QAC3C;IACF;IAEAC,UAAU;YAIR;QAHA,IAAI,CAACR,aAAa,GAAG;QACrB,IAAI,CAACS,QAAQ,GAAG;QAChB,IAAI,CAACC,yBAAyB,CAACC,OAAO;SACtC,qCAAA,IAAI,CAACC,4BAA4B,cAAjC,yDAAA,mCAAmCD,OAAO;QAE1C,IAAI,CAACE,oCAAoC;QACzC,IAAI,CAACA,oCAAoC,GAAG1B;IAC9C;IAEA2B,SAASC,KAAc,EAAE;QACvB,IACE,CAAC,IAAI,CAACf,aAAa,IACnB,IAAI,CAACgB,QAAQ,KAAK,UAClBzB,0BAA0BwB,MAAME,MAAM,GACtC;YACA;QACF;QAEA,IAAI,CAACD,QAAQ,GAAG;QAChB,IAAI,CAACP,QAAQ,GAAGM,MAAME,MAAM;QAC5B,IAAI,CAACC,oBAAoB,CAACC,cAAc,CAACJ;IAC3C;IAEAK,QAAQL,KAAc,EAAE;QACtB,OAAQ,IAAI,CAACC,QAAQ;YACnB,KAAK;gBACH,IAAI,CAACE,oBAAoB,CAACG,kBAAkB;gBAC5C,IAAI,CAACH,oBAAoB,CAACI,YAAY,CAACP;gBAEvC,IAAI,IAAI,CAACQ,qCAAqC,IAAI;oBAChD;gBACF;gBAEA,IAAI,IAAI,CAACC,sCAAsC,IAAI;oBACjD,IAAI,CAACR,QAAQ,GAAG;oBAChB;gBACF;gBAEA,IAAI,IAAI,CAACS,2DAA2D,IAAI;oBACtE;gBACF;gBAEA,IAAI,IAAI,CAACC,yDAAyD,IAAI;oBACpE,IAAI,CAACV,QAAQ,GAAG;oBAChB;gBACF;gBAEA,IAAI,CAACA,QAAQ,GAAG;gBAChB,IAAI,CAACE,oBAAoB,CAACC,cAAc,CAACJ;gBAEzC,IAAI,CAACY,WAAW,GAAG,IAAI,CAACC,OAAO,CAACC,YAAY;gBAE5C,IAAI,CAAChB,oCAAoC,GACvChB,sBAAsBiC,qCAAqC,CACzD,IAAI,CAACC,aAAa,EAClB,IAAI,CAACtB,QAAQ;gBAGjB,IAAI,IAAI,CAACuB,kBAAkB,EAAE;oBAC3B,IAAI,CAAC9B,gBAAgB,GAAG,IAAI,CAACyB,WAAW;oBACxC,IAAI,CAACvB,gBAAgB,CAACT,wBAAwBsC,cAAc,CAAC,GAAG,IAAI,CAACN,WAAW;gBAClF;gBACA;YACF,KAAK;gBACH,IAAI,CAACT,oBAAoB,CAACI,YAAY,CAACP;gBAEvC,MAAM,EAAEmB,EAAE,EAAEC,EAAE,EAAE,GAAG,IAAI,CAACjB,oBAAoB;gBAE5C,IAAI,CAACkB,aAAa,GAAG/C,wBACnB,IAAI,CAACa,gBAAgB,GAAG,AAAEiC,CAAAA,KAAKD,EAAC,IAAK,IAAI,CAACP,WAAW,GAAI,IAAI,CAACzB,gBAAgB,EAC9EN,mBAAmBS,GAAG,EACtB,IAAI,CAAC2B,kBAAkB,GAAG,IAAI,CAACL,WAAW,GAAG/B,mBAAmByC,KAAK;gBAGvE,IAAI,CAACC,kBAAkB,CAAC,IAAI,CAACF,aAAa,EAAE;gBAC5C;QACJ;IACF;IAEAG,SAAS;QACP,OAAQ,IAAI,CAACvB,QAAQ;YACnB,KAAK;gBACH,MAAMwB,uBAAuB,IAAI,CAACtC,gBAAgB;gBAClD,IAAI,CAACA,gBAAgB,GAAG,IAAI,CAACuC,cAAc,CAAC,IAAI,CAACL,aAAa;gBAE9D,IACEI,yBAAyB,IAAI,CAACtC,gBAAgB,IAC9C,IAAI,CAACA,gBAAgB,GAAGN,mBAAmBS,GAAG,EAC9C;oBACA,IAAI,CAACqC,iBAAiB,CAAC,IAAI,CAACxC,gBAAgB;gBAC9C;gBAEA,IAAI,CAACoC,kBAAkB,CAAC,IAAI,CAACpC,gBAAgB;gBAC7C;QACJ;QAEA,IAAI,CAACc,QAAQ,GAAG;QAChB,IAAI,CAACE,oBAAoB,CAACyB,KAAK;QAE/B,IAAI,CAAC9B,oCAAoC;QACzC,IAAI,CAACA,oCAAoC,GAAG1B;IAC9C;IAWA,IAAY6C,qBAAqB;QAC/B,OAAO,IAAI,CAAC/B,IAAI,KAAK;IACvB;IASQqC,mBAAmBF,aAAqB,EAAEQ,cAAc,KAAK,EAAE;QACrE,IAAI,IAAI,CAACC,KAAK,KAAK,MAAM;YACvBC,qBAAqB,IAAI,CAACD,KAAK;QACjC;QAEA,IAAIT,iBAAiBxC,mBAAmBS,GAAG,EAAE;gBAE3C;YADA,IAAI,CAACK,yBAAyB,CAACqC,gBAAgB;aAC/C,qCAAA,IAAI,CAACnC,4BAA4B,cAAjC,yDAAA,mCAAmCmC,gBAAgB;YACnD,IAAI,CAAC/B,QAAQ,GAAG;YAChB,IAAI,CAACgC,SAAS;YACd;QACF;QAEA,MAAMC,kBAAkB7D,MACtB,IAAI,CAAC4C,kBAAkB,GACnBI,gBAAgB,IAAI,CAACT,WAAW,GAChC,AAACS,gBAAgB,IAAKxC,mBAAmByC,KAAK,EAClD,GACA;QAGF,IAAI,CAACQ,KAAK,GAAGK,sBAAsB;gBAWjC;YAVA,IAAIN,aAAa;oBACf;iBAAA,sCAAA,IAAI,CAAChC,4BAA4B,cAAjC,0DAAA,oCAAmCuC,iBAAiB,GAAGC,GAAG,CAACH;gBAC3D,IAAI,CAACvC,yBAAyB,CAACyC,iBAAiB,GAAGC,GAAG,CAAC,GAAGhB,gBAAgB,IAAI,CAACnC,IAAI,EAAE;gBACrF;YACF;YAEA,IAAI,IAAI,CAAC+B,kBAAkB,EAAE;gBAC3B,IAAI,CAACtB,yBAAyB,CAAC2C,sBAAsB;YACvD;aAEA,qCAAA,IAAI,CAACzC,4BAA4B,cAAjC,yDAAA,mCAAmC0C,KAAK;YACxC,IAAI,CAAC5C,yBAAyB,CAACqC,gBAAgB,GAAGK,GAAG,CAAC,GAAG,IAAI,CAAClD,gBAAgB,GAAG,IAAI,CAACD,IAAI,EAAE;QAC9F;IACF;IAEQwC,eAAeL,aAAqB,EAAE;QAC5C,MAAMmB,mBAAmB1D,sBAAsB2D,mBAAmB,CAChE,IAAI,CAACpD,gBAAgB,EACrBgC;QAEF,IAAImB,qBAAqB,IAAI,CAACrD,gBAAgB,EAAE;YAC9C,OAAOqD;QACT;QAEA,MAAME,eAAe,IAAI,CAACvC,oBAAoB,CAACwC,SAAS;QACxD,IAAID,aAAaE,IAAI,KAAK,OAAOF,aAAaC,SAAS,KAAK,MAAM;YAChE,OAAO,IAAI,CAACxD,gBAAgB;QAC9B;QAEA,MAAM0D,WAAW,IAAI,CAAC1C,oBAAoB,CAAC0C,QAAQ;QACnD,IAAIC,KAAKC,GAAG,CAACF,SAASG,CAAC,IAAIrE,gBAAgBsE,QAAQ,EAAE;YACnD,OAAO,IAAI,CAAC9D,gBAAgB;QAC9B;QAEA,MAAM+D,8BAA8BpE,sBAAsBqE,8BAA8B,CACtF,IAAI,CAAC9D,gBAAgB,EACrBmD,kBACAE,aAAaC,SAAS;QAGxB,OAAOO;IACT;IAEQ1C,wCAAwC;QAC9C,OACE,IAAI,CAACL,oBAAoB,CAACwC,SAAS,GAAGC,IAAI,KAAK,OAC/C,IAAI,CAACzC,oBAAoB,CAACiD,QAAQ,KAAKzE,gBAAgB0E,yBAAyB;IAEpF;IAEQ5C,yCAAyC;QAC/C,OACE,IAAI,CAACf,QAAQ,KAAK,QAClB,mCAAmC;QACnC,IAAI,CAACA,QAAQ,CAAC4D,OAAO,CAAC,CAAC,CAAC,EAAE5E,wCAAwC,MAAM,CAAC,MAAM,QAAQ,+CAA+C;QACtI,+BAA+B;QAC/B,CAAC,IAAI,CAACmC,OAAO,CAAC0C,QAAQ,CAAC,IAAI,CAAC7D,QAAQ;IAExC;IAEQgB,8DAA8D;QACpE,IACE,IAAI,CAACM,aAAa,KAAK,QACvB,CAAC,IAAI,CAACA,aAAa,CAACuC,QAAQ,CAAC,IAAI,CAAC7D,QAAQ,KAC1C,IAAI,CAACsB,aAAa,CAACwC,YAAY,IAAI,IAAI,CAACxC,aAAa,CAACyC,YAAY,EAClE;YACA,OAAO;QACT;QAEA,IAAI,IAAI,CAACzC,aAAa,CAAC0C,SAAS,KAAK,GAAG;YACtC,OACE,IAAI,CAACvD,oBAAoB,CAACwC,SAAS,GAAGA,SAAS,KAAK,CAAC,KACrD7D,sBAAsB6E,sBAAsB,CAAC,IAAI,CAACtE,gBAAgB,EAAE,IAAI,CAACF,gBAAgB;QAE7F;QAEA,OAAO;IACT;IAEQwB,4DAA4D;QAClE,IACE,8CAA8C,GAC9C,IAAI,CAACjB,QAAQ,KAAK,QAClB,IAAI,CAACA,QAAQ,KAAK,IAAI,CAACmB,OAAO,IAC9B,IAAI,CAACnB,QAAQ,KAAK,IAAI,CAACsB,aAAa,EACpC;YACA,OAAO;QACT;QAEA,MAAM4C,mBAAmBrF,2BAA2B,IAAI,CAACmB,QAAQ,EAAE,IAAI,CAACmB,OAAO;QAE/E,IACE+C,qBAAqB,QACrB,IAAI,CAAC5C,aAAa,KAAK4C,oBACvBA,iBAAiBJ,YAAY,IAAII,iBAAiBH,YAAY,EAC9D;YACA,OAAO;QACT;QAEA,OACEG,iBAAiBF,SAAS,KAAK,KAAK,IAAI,CAACvD,oBAAoB,CAACwC,SAAS,GAAGA,SAAS,KAAK,CAAC;IAE7F;IAEA,OAAe5B,sCACbC,aAAiC,EACjC6C,QAA4B,EAC5B;QACA,IACE7C,kBAAkB,QAClBA,cAAc0C,SAAS,IAAI,KAC3B1C,cAAcuC,QAAQ,CAACM,aACvB7C,cAAcwC,YAAY,GAAGxC,cAAcyC,YAAY,EACvD;YACAzC,cAAc8C,KAAK,CAACC,WAAW,CAAC,cAAc;YAC9C,OAAO,SAASC;gBACdhD,cAAc8C,KAAK,CAACG,cAAc,CAAC;YACrC;QACF;QACA,OAAO7F;IACT;IAEA,OAAeuF,uBACbtE,gBAAkC,EAClC6E,QAAgB,EACP;QACT,OAAOA,aAAa7E,gBAAgB,CAACA,iBAAiB8E,MAAM,GAAG,EAAE;IACnE;IAEA,OAAehB,+BACb9D,gBAAkC,EAClC6E,QAAgB,EAChBvB,SAAiB,EACT;QACR,MAAMyB,aAAa/E,iBAAiBgF,OAAO,CAACH;QAC5C,OAAQvB;YACN,KAAK,CAAC;oBACGtD;gBAAP,OAAOA,CAAAA,qBAAAA,gBAAgB,CAAC+E,aAAa,EAAE,cAAhC/E,gCAAAA,qBAAoCA,gBAAgB,CAACA,iBAAiB8E,MAAM,GAAG,EAAE;YAC1F,KAAK;oBACI9E;gBAAP,OAAOA,CAAAA,sBAAAA,gBAAgB,CAAC+E,aAAa,EAAE,cAAhC/E,iCAAAA,sBAAoCA,gBAAgB,CAAC,EAAE;QAClE;IACF;IAEA,OAAeoD,oBAAoBpD,gBAAkC,EAAE6E,QAAgB,EAAE;QACvF,IAAIZ,UAAUjE,gBAAgB,CAAC,EAAE;QACjC,IAAIiF,gBAAgBxB,KAAKC,GAAG,CAAC1D,gBAAgB,CAAC,EAAE,GAAG6E;QAEnD,IAAK,IAAIK,IAAI,GAAGA,IAAIlF,iBAAiB8E,MAAM,EAAEI,KAAK,EAAG;YACnD,MAAMC,aAAa1B,KAAKC,GAAG,CAAC1D,gBAAgB,CAACkF,EAAE,GAAGL;YAClD,IAAIM,aAAaF,eAAe;gBAC9BhB,UAAUjE,gBAAgB,CAACkF,EAAE;gBAC7BD,gBAAgBE;YAClB;QACF;QAEA,OAAOlB;IACT;IA/UA,YACEzC,OAAoB,EACpB,EACEG,aAAa,EACbrB,yBAAyB,EACzBE,4BAA4B,EAC5B8B,iBAAiB,EACjBM,SAAS,EACoB,CAC/B;QAXF,uBAAiBpB,WAAjB,KAAA;QA2IA,uBAAQ5B,iBAAgB;QACxB,uBAAQgB,YAAwC;QAChD,uBAAQP,YAA+B;QACvC,uBAAQkB,eAAc;QACtB,uBAAQkB,SAAuB;QAC/B,uBAAQ3C,oBAAmB;QAC3B,uBAAQkC,iBAAgB;QACxB,uBAAQhC,oBAAqC;YAAC;YAAG;SAAE;QACnD,uBAAQH,QAAmB;QAI3B,uBAAQY,wCAAuC1B;QAC/C,uBAAiB4C,iBAAjB,KAAA;QACA,uBAAiBrB,6BAAjB,KAAA;QACA,uBAAiBE,gCAAjB,KAAA;QACA,uBAAiBM,wBAAjB,KAAA;QACA,uBAAiBwB,qBAAjB,KAAA;QACA,uBAAiBM,aAAjB,KAAA;QAjJE,IAAI,CAACpB,OAAO,GAAGA;QACf,IAAI,CAACc,iBAAiB,GAAGA;QACzB,IAAI,CAACM,SAAS,GAAGA;QACjB,IAAI,CAAC9B,oBAAoB,GAAG,IAAI1B;QAChC,IAAI,CAACuC,aAAa,GAAGA;QACrB,IAAI,CAACrB,yBAAyB,GAAGA;QACjC,IAAI,CAACE,4BAA4B,GAAGA;IACtC;AA+TF"}
|