@vkontakte/vkui 5.9.3 → 5.9.4

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.
Files changed (52) hide show
  1. package/dist/cjs/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  2. package/dist/cjs/components/ModalRoot/ModalRoot.js +7 -1
  3. package/dist/cjs/components/ModalRoot/ModalRoot.js.map +1 -1
  4. package/dist/cjs/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
  5. package/dist/cjs/components/PullToRefresh/PullToRefresh.js +14 -1
  6. package/dist/cjs/components/PullToRefresh/PullToRefresh.js.map +1 -1
  7. package/dist/cjs/components/Tappable/Tappable.d.ts.map +1 -1
  8. package/dist/cjs/components/Tappable/Tappable.js +1 -3
  9. package/dist/cjs/components/Tappable/Tappable.js.map +1 -1
  10. package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  11. package/dist/components/ModalRoot/ModalRoot.js +7 -1
  12. package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
  13. package/dist/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
  14. package/dist/components/PullToRefresh/PullToRefresh.js +14 -1
  15. package/dist/components/PullToRefresh/PullToRefresh.js.map +1 -1
  16. package/dist/components/Tappable/Tappable.d.ts.map +1 -1
  17. package/dist/components/Tappable/Tappable.js +1 -3
  18. package/dist/components/Tappable/Tappable.js.map +1 -1
  19. package/dist/components.css +1 -1
  20. package/dist/components.css.map +1 -1
  21. package/dist/components.js.tmp +1496 -1510
  22. package/dist/cssm/components/ModalRoot/ModalRoot.d.ts.map +1 -1
  23. package/dist/cssm/components/ModalRoot/ModalRoot.js +7 -1
  24. package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
  25. package/dist/cssm/components/PullToRefresh/PullToRefresh.d.ts.map +1 -1
  26. package/dist/cssm/components/PullToRefresh/PullToRefresh.js +14 -1
  27. package/dist/cssm/components/PullToRefresh/PullToRefresh.js.map +1 -1
  28. package/dist/cssm/components/Tappable/Tappable.d.ts.map +1 -1
  29. package/dist/cssm/components/Tappable/Tappable.js +1 -3
  30. package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
  31. package/dist/cssm/styles/common.css +5 -0
  32. package/dist/vkui.css +1 -1
  33. package/dist/vkui.css.map +1 -1
  34. package/dist/vkui.js.tmp +1496 -1510
  35. package/package.json +1 -1
  36. package/src/components/ModalRoot/ModalRoot.tsx +9 -1
  37. package/src/components/PullToRefresh/PullToRefresh.tsx +16 -1
  38. package/src/components/Tappable/Tappable.tsx +1 -3
  39. package/src/styles/common.css +6 -0
  40. package/dist/cjs/hooks/useAdaptivityHasHover.d.ts +0 -9
  41. package/dist/cjs/hooks/useAdaptivityHasHover.d.ts.map +0 -1
  42. package/dist/cjs/hooks/useAdaptivityHasHover.js +0 -28
  43. package/dist/cjs/hooks/useAdaptivityHasHover.js.map +0 -1
  44. package/dist/cssm/hooks/useAdaptivityHasHover.d.ts +0 -9
  45. package/dist/cssm/hooks/useAdaptivityHasHover.d.ts.map +0 -1
  46. package/dist/cssm/hooks/useAdaptivityHasHover.js +0 -16
  47. package/dist/cssm/hooks/useAdaptivityHasHover.js.map +0 -1
  48. package/dist/hooks/useAdaptivityHasHover.d.ts +0 -9
  49. package/dist/hooks/useAdaptivityHasHover.d.ts.map +0 -1
  50. package/dist/hooks/useAdaptivityHasHover.js +0 -17
  51. package/dist/hooks/useAdaptivityHasHover.js.map +0 -1
  52. package/src/hooks/useAdaptivityHasHover.ts +0 -26
@@ -1 +1 @@
1
- {"version":3,"file":"ModalRoot.d.ts","sourceRoot":"","sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,EAAE,qBAAqB,EAA+C,MAAM,SAAS,CAAC;AA4lB7F,eAAO,MAAM,cAAc,mDAM1B,CAAC"}
1
+ {"version":3,"file":"ModalRoot.d.ts","sourceRoot":"","sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,EAAE,qBAAqB,EAA+C,MAAM,SAAS,CAAC;AAomB7F,eAAO,MAAM,cAAc,mDAM1B,CAAC"}
@@ -243,7 +243,9 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
243
243
  }
244
244
  this.documentScrolling = enabled;
245
245
  if (enabled) {
246
- // Здесь нужен последний аргумент с такими же параметрами, потому что
246
+ // восстанавливаем значение overscroll behavior
247
+ // eslint-disable-next-line no-restricted-properties
248
+ this.document.documentElement.classList.remove("vkui--disable-overscroll-behavior");
247
249
  // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.
248
250
  // https://github.com/VKCOM/VKUI/issues/444
249
251
  this.window.removeEventListener("touchmove", this.preventTouch, {
@@ -251,6 +253,10 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
251
253
  passive: false
252
254
  });
253
255
  } else {
256
+ // отключаем нативный pull-to-refresh при открытом модальном окне
257
+ // чтобы он не срабатывал при закрытии модалки смахиванием вниз
258
+ // eslint-disable-next-line no-restricted-properties
259
+ this.document.documentElement.classList.add("vkui--disable-overscroll-behavior");
254
260
  this.window.addEventListener("touchmove", this.preventTouch, {
255
261
  passive: false
256
262
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { setTransformStyle } from '../../lib/styles';\nimport { transitionEvent } from '../../lib/supportEvents';\nimport { rubber } from '../../lib/touch';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ConfigProviderContext } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { ModalRootContext, ModalRootContextInterface } from './ModalRootContext';\nimport { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';\nimport { ModalRootWithDOMProps, ModalsStateEntry, ModalType, TranslateRange } from './types';\nimport { ModalTransitionProps, withModalManager } from './useModalManager';\nimport styles from './ModalRoot.module.css';\n\nconst warn = warnOnce('ModalRoot');\n\nfunction numberInRange(number: number, range: TranslateRange | undefined) {\n if (!range) {\n return false;\n }\n return number >= range[0] && number <= range[1];\n}\n\nfunction rangeTranslate(number: number) {\n return clamp(number, 0, 98);\n}\n\ninterface ModalRootState {\n touchDown?: boolean;\n dragging?: boolean;\n modalOpenedLog: string[];\n}\n\nclass ModalRootTouchComponent extends React.Component<\n ModalRootWithDOMProps & DOMProps & ModalTransitionProps,\n ModalRootState\n> {\n constructor(props: ModalRootWithDOMProps & ModalTransitionProps) {\n super(props);\n this.state = {\n touchDown: false,\n dragging: false,\n modalOpenedLog: [],\n };\n\n this.maskElementRef = React.createRef();\n\n this.modalRootContext = {\n updateModalHeight: this.updateModalHeight,\n registerModal: ({ id, ...data }) => Object.assign(this.props.getModalState(id) ?? {}, data),\n onClose: () => this.props.onExit(),\n isInsideModal: true,\n };\n\n this.frameIds = {};\n }\n\n private documentScrolling = false;\n private readonly maskElementRef: React.RefObject<HTMLDivElement>;\n private readonly viewportRef = React.createRef<HTMLDivElement>();\n private maskAnimationFrame: number | undefined = undefined;\n private readonly modalRootContext: ModalRootContextInterface;\n private readonly frameIds: {\n [index: string]: number;\n };\n private restoreFocusTo: HTMLElement | undefined | null = undefined;\n\n get timeout(): number {\n return this.props.platform === Platform.IOS ? 400 : 320;\n }\n\n get document(): Document {\n return this.props.document as Document;\n }\n\n get window(): Window {\n return this.props.window as Window;\n }\n\n getModals() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n componentDidMount() {\n // Отслеживаем изменение размеров viewport\n this.window?.addEventListener('resize', this.updateModalHeight, false);\n }\n\n componentWillUnmount() {\n this.toggleDocumentScrolling(true);\n this.window.removeEventListener('resize', this.updateModalHeight, false);\n }\n\n componentDidUpdate(prevProps: ModalRootWithDOMProps & ModalTransitionProps) {\n // transition phase 2: animate exiting modal\n if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {\n this.closeModal(this.props.exitingModal);\n }\n\n // transition phase 3: animate entering modal\n if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {\n const { enteringModal } = this.props;\n const enteringState = this.props.getModalState(enteringModal);\n this.props.onEnter();\n this.waitTransitionFinish(enteringState, () => {\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = '';\n }\n this.props.onEntered(enteringModal);\n });\n\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = this.props.delayEnter\n ? `${this.timeout}ms`\n : '';\n this.animateTranslate(enteringState, enteringState.translateY);\n this.setMaskOpacity(enteringState, 1);\n }\n }\n\n // focus restoration\n if (this.props.activeModal && !prevProps.activeModal) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement;\n }\n if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n\n this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);\n }\n\n /* Отключает скролл документа */\n toggleDocumentScrolling(enabled: boolean) {\n if (this.documentScrolling === enabled) {\n return;\n }\n this.documentScrolling = enabled;\n\n if (enabled) {\n // Здесь нужен последний аргумент с такими же параметрами, потому что\n // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.\n // https://github.com/VKCOM/VKUI/issues/444\n this.window.removeEventListener('touchmove', this.preventTouch, {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions нет поля passive\n passive: false,\n });\n } else {\n this.window.addEventListener('touchmove', this.preventTouch, {\n passive: false,\n });\n }\n }\n\n preventTouch = (event: any) => {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n return false;\n };\n\n checkPageContentHeight() {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {\n const prevModalState = { ...modalState };\n initPageModal(modalState);\n const currentModalState = { ...modalState };\n\n let needAnimate = false;\n\n if (prevModalState.expandable === currentModalState.expandable) {\n if (prevModalState.translateYFrom !== currentModalState.translateYFrom) {\n needAnimate = true;\n }\n } else {\n needAnimate = true;\n }\n\n if (needAnimate) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n }\n }\n\n updateModalHeight = () => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState && modalState.type === ModalType.PAGE) {\n if (this.props.enteringModal) {\n this.waitTransitionFinish(modalState, () => {\n requestAnimationFrame(() => this.checkPageContentHeight());\n });\n } else {\n requestAnimationFrame(() => this.checkPageContentHeight());\n }\n }\n };\n\n closeModal(id: string) {\n // Сбрасываем состояния, которые могут помешать закрытию модального окна\n this.setState({ touchDown: false });\n\n const prevModalState = this.props.getModalState(id);\n\n if (!prevModalState) {\n id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');\n return;\n }\n if (!this.state.modalOpenedLog.length) {\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, id],\n }));\n }\n const nextModalState = this.props.getModalState(this.props.activeModal);\n const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;\n\n const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;\n this.waitTransitionFinish(prevModalState, () => this.props.onExited(id));\n const exitTranslate =\n prevIsPage &&\n nextIsPage &&\n (prevModalState.translateY ?? 0) <= (nextModalState?.translateYFrom ?? 0) &&\n !this.props.isBack\n ? (nextModalState?.translateYFrom ?? 0) + 10\n : 100;\n this.animateTranslate(prevModalState, exitTranslate);\n\n if (!nextModalState) {\n // NOTE: was only for clean exit\n this.setMaskOpacity(prevModalState, 0);\n this.setState({ modalOpenedLog: [] });\n prevModalState.translateY = undefined;\n } else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {\n nextModalState.translateY = undefined;\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, nextModalState.id!],\n }));\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (this.props.exitingModal) {\n return;\n }\n const modalState = this.props.getModalState(this.props.activeModal);\n if (!modalState) {\n return;\n }\n\n if (modalState.type === ModalType.PAGE) {\n return this.onPageTouchMove(e, modalState);\n }\n\n if (modalState.type === ModalType.CARD) {\n return this.onCardTouchMove(e, modalState);\n }\n };\n\n onPageTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { shiftY, originalEvent } = event;\n const target = originalEvent.target as HTMLElement;\n\n if (!event.isY) {\n if (this.viewportRef.current?.contains(target)) {\n originalEvent.preventDefault();\n }\n return;\n }\n\n if (!modalState.innerElement?.contains(target)) {\n return originalEvent.preventDefault();\n }\n\n originalEvent.stopPropagation();\n\n const { expandable, contentScrolled, collapsed, expanded } = modalState;\n\n if (!this.state.touchDown) {\n modalState.touchStartContentScrollTop = modalState.contentElement?.scrollTop ?? 0;\n this.setState({ touchDown: true });\n }\n\n if (contentScrolled) {\n return;\n }\n\n if (modalState.touchMovePositive === null) {\n modalState.touchMovePositive = shiftY > 0;\n }\n\n if (\n !modalState.expandable ||\n collapsed ||\n (expanded && modalState.touchMovePositive && modalState.touchStartContentScrollTop === 0) ||\n modalState.headerElement?.contains(target)\n ) {\n originalEvent.preventDefault();\n\n if ((!expandable && shiftY < 0) || !this.window) {\n return;\n }\n\n !this.state.dragging && this.setState({ dragging: true });\n\n const shiftYPercent = (shiftY / this.window.innerHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 0.8, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = rangeTranslate((modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onCardTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { originalEvent, shiftY } = event;\n const target = originalEvent.target as HTMLElement;\n if (modalState.innerElement?.contains(target)) {\n if (!this.state.touchDown) {\n this.setState({ touchDown: true, dragging: true });\n }\n\n const shiftYPercent = (shiftY / modalState.innerElement.offsetHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 1.2, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = Math.max(0, (modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onTouchEnd = (e: TouchEvent) => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE) {\n return this.onPageTouchEnd(e, modalState);\n }\n\n if (modalState?.type === ModalType.CARD) {\n return this.onCardTouchEnd(e, modalState);\n }\n };\n\n onPageTouchEnd(event: TouchEvent, modalState: ModalsStateEntry) {\n const { startY, shiftY } = event;\n\n modalState.contentScrolled = false;\n modalState.touchMovePositive = null;\n\n let setStateCallback;\n\n if (this.state.dragging && this.window) {\n const shiftYEndPercent = ((startY + shiftY) / this.window.innerHeight) * 100;\n\n let translateY = modalState.translateYCurrent ?? 0;\n const expectTranslateY =\n (translateY / event.duration) *\n 240 *\n 0.6 *\n ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = rangeTranslate(translateY + expectTranslateY);\n\n if (modalState.settlingHeight !== 100) {\n if (numberInRange(translateY, modalState.expandedRange)) {\n translateY = modalState.expandedRange?.[0] ?? 0;\n } else if (numberInRange(translateY, modalState.collapsedRange)) {\n translateY = modalState.translateYFrom ?? 0;\n } else if (numberInRange(translateY, modalState.hiddenRange)) {\n translateY = 100;\n } else {\n translateY = modalState.translateYFrom ?? 0;\n }\n } else {\n if (numberInRange(translateY, [0, 25])) {\n translateY = 0;\n } else {\n translateY = 100;\n }\n }\n\n if (translateY !== 100 && shiftYEndPercent >= 75) {\n translateY = 100;\n }\n\n modalState.translateY = translateY;\n modalState.translateYCurrent = translateY;\n modalState.collapsed = numberInRange(translateY, modalState.collapsedRange);\n modalState.expanded = translateY === 0;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onCardTouchEnd({ duration }: TouchEvent, modalState: ModalsStateEntry) {\n let setStateCallback;\n\n if (this.state.dragging) {\n let translateY = modalState.translateYCurrent ?? 0;\n\n const expectTranslateY =\n (translateY / duration) * 240 * 0.6 * ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = Math.max(0, translateY + expectTranslateY);\n\n if (translateY >= 30) {\n translateY = 100;\n } else {\n translateY = 0;\n }\n\n modalState.translateY = translateY;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onScroll = (e: React.SyntheticEvent) => {\n const activeModal = this.props.activeModal;\n\n const target = e.target as HTMLElement;\n\n if (!activeModal) {\n return;\n }\n const modalState = this.props.getModalState(activeModal);\n if (modalState?.type === ModalType.PAGE && modalState?.contentElement?.contains(target)) {\n modalState.contentScrolled = true;\n\n if (modalState.contentScrollStopTimeout) {\n clearTimeout(modalState.contentScrollStopTimeout);\n }\n\n modalState.contentScrollStopTimeout = setTimeout(() => {\n if (modalState.contentScrolled) {\n modalState.contentScrolled = false;\n }\n }, 250);\n }\n };\n\n waitTransitionFinish(modalState: ModalsStateEntry | undefined, eventHandler: () => void) {\n if (transitionEvent.supported) {\n const onceHandler = () => {\n modalState?.innerElement?.removeEventListener(transitionEvent.name as string, onceHandler);\n eventHandler();\n };\n\n modalState?.innerElement?.addEventListener(transitionEvent.name as string, onceHandler);\n } else {\n setTimeout(eventHandler, this.timeout);\n }\n }\n\n /**\n * Анимирует сдвиг модалки\n *\n * @param {ModalsStateEntry} modalState\n * @param {number} percent Процент сдвига: 0 – полностью открыта, 100 – полностью закрыта\n */\n animateTranslate(modalState: ModalsStateEntry, percent: number | undefined) {\n const frameId = `animateTranslateFrame${modalState.id}`;\n\n cancelAnimationFrame(this.frameIds[frameId]);\n\n this.frameIds[frameId] = requestAnimationFrame(() => {\n setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);\n });\n }\n\n /* Устанавливает прозрачность для полупрозрачной подложки */\n setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number | null = null) {\n if (forceOpacity === null && this.props.history?.[0] !== modalState.id) {\n return;\n }\n if (this.maskAnimationFrame) {\n cancelAnimationFrame(this.maskAnimationFrame);\n }\n this.maskAnimationFrame = requestAnimationFrame(() => {\n if (this.maskElementRef.current) {\n const { translateY = 0, translateYCurrent = 0 } = modalState;\n\n const opacity =\n forceOpacity === null\n ? 1 - (translateYCurrent - translateY) / (100 - translateY) || 0\n : forceOpacity;\n this.maskElementRef.current.style.opacity = clamp(opacity, 0, 100).toString();\n this.maskElementRef.current.style.transitionDelay =\n opacity && this.props.delayEnter ? `${this.timeout}ms` : '';\n }\n });\n }\n\n render() {\n const { activeModal, exitingModal, enteringModal } = this.props;\n const { touchDown, dragging } = this.state;\n\n if (!activeModal && !exitingModal) {\n return null;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <ModalRootContext.Provider value={this.modalRootContext}>\n <Touch\n className={classNames(\n styles['ModalRoot'],\n this.props.configProvider?.hasCustomPanelHeaderAfter &&\n styles['ModalRoot--hasCustomPanelHeaderAfterSlot'],\n touchDown &&\n classNames(styles['ModalRoot--touched'], 'vkuiInternalModalRoot--touched'),\n !!(enteringModal || exitingModal) &&\n classNames(styles['ModalRoot--switching'], 'vkuiInternalModalRoot--switching'),\n )}\n onMove={this.onTouchMove}\n onEnd={this.onTouchEnd}\n onScroll={this.onScroll}\n >\n <div\n className={styles['ModalRoot__mask']}\n onClick={this.props.onExit}\n ref={this.maskElementRef}\n />\n <div className={styles['ModalRoot__viewport']} ref={this.viewportRef}>\n {this.getModals().map((Modal) => {\n const modalId = getNavId(Modal.props, warn);\n const _modalState = this.props.getModalState(modalId);\n if ((modalId !== activeModal && modalId !== exitingModal) || !_modalState) {\n return null;\n }\n const modalState = { ..._modalState };\n\n const isPage = modalState.type === ModalType.PAGE;\n const key = `modal-${modalId}`;\n\n return (\n <FocusTrap\n key={key}\n getRootRef={(e) => {\n const modalState = this.props.getModalState(modalId);\n if (modalState) {\n modalState.modalElement = e;\n }\n }}\n onClose={this.props.onExit}\n timeout={this.timeout}\n className={classNames(\n styles['ModalRoot__modal'],\n\n dragging && 'vkuiInternalModalRoot__modal--dragging',\n\n isPage && modalState.expandable && 'vkuiInternalModalRoot__modal--expandable',\n isPage && modalState.collapsed && 'vkuiInternalModalRoot__modal--collapsed',\n )}\n restoreFocus={false}\n >\n {Modal}\n </FocusTrap>\n );\n })}\n </div>\n </Touch>\n </ModalRootContext.Provider>\n </TouchRootContext.Provider>\n );\n }\n}\n\nexport const ModalRootTouch = withContext(\n withPlatform(\n withDOM<ModalRootWithDOMProps>(withModalManager(initModal)(ModalRootTouchComponent)),\n ),\n ConfigProviderContext,\n 'configProvider',\n);\n\n/**\n * Инициализирует модалку перед анимацией открытия\n */\nfunction initModal(modalState: ModalsStateEntry) {\n switch (modalState.type) {\n case ModalType.PAGE:\n modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;\n return initPageModal(modalState);\n case ModalType.CARD:\n return initCardModal(modalState);\n default:\n process.env.NODE_ENV === 'development' &&\n warn(`initActiveModal: modalState.type=\"${modalState.type}\" не поддерживается`, 'error');\n }\n}\n\nfunction initPageModal(modalState: ModalsStateEntry) {\n const { contentElement, bottomInset } = modalState;\n const contentElementHeight = (contentElement?.firstElementChild as HTMLElement).scrollHeight;\n const bottomInsetHeight = bottomInset?.offsetHeight || 0;\n const contentHeight = contentElementHeight + bottomInsetHeight;\n let prevTranslateY = modalState.translateY;\n\n modalState.expandable =\n contentHeight > (contentElement?.clientHeight ?? 0) ||\n modalState.settlingHeight === 100 ||\n modalState.expanded;\n\n let collapsed = false;\n let expanded = false;\n let translateYFrom;\n let translateY;\n let expandedRange: TranslateRange;\n let collapsedRange: TranslateRange | undefined;\n let hiddenRange: TranslateRange;\n\n const hasCollapsedState = Boolean(modalState.expandable && modalState.settlingHeight !== 100);\n if (modalState.expandable) {\n translateYFrom = 100 - (modalState.settlingHeight ?? 0);\n\n const shiftHalf = translateYFrom / 2;\n const visiblePart = 100 - translateYFrom;\n\n expandedRange = [0, shiftHalf];\n collapsedRange = hasCollapsedState ? [shiftHalf, translateYFrom + visiblePart / 4] : undefined;\n hiddenRange = [translateYFrom + visiblePart / 4, 100];\n\n collapsed = hasCollapsedState && translateYFrom > 0;\n expanded = translateYFrom <= 0;\n translateY = translateYFrom;\n } else {\n const headerHeight = modalState.headerElement?.offsetHeight ?? 0;\n const height = contentHeight + headerHeight;\n\n translateYFrom =\n 100 - (height / (modalState.innerElement?.parentElement?.offsetHeight ?? 0)) * 100;\n translateY = translateYFrom;\n\n expandedRange = [translateY, translateY + 25];\n collapsedRange = undefined;\n hiddenRange = [translateY + 25, translateY + 100];\n }\n\n // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран\n if (\n (modalState.expandable && translateY > (prevTranslateY ?? 100)) ||\n modalState.settlingHeight === 100\n ) {\n translateY = 0;\n }\n\n // Если модалка уже раскрыта обновляем состояния\n if (translateY === 0) {\n expanded = true;\n collapsed = false;\n }\n\n modalState.expandedRange = expandedRange;\n modalState.collapsedRange = collapsedRange;\n modalState.hiddenRange = hiddenRange;\n modalState.translateY = translateY;\n modalState.translateYFrom = translateYFrom;\n modalState.collapsed = collapsed;\n modalState.expanded = expanded;\n}\n\nfunction initCardModal(modalState: ModalsStateEntry) {\n modalState.translateY = 0;\n}\n"],"names":["ModalRootTouch","warn","warnOnce","numberInRange","number","range","rangeTranslate","clamp","ModalRootTouchComponent","props","documentScrolling","maskElementRef","viewportRef","React","createRef","maskAnimationFrame","undefined","modalRootContext","frameIds","restoreFocusTo","preventTouch","event","originalEvent","preventDefault","updateModalHeight","modalState","getModalState","activeModal","type","ModalType","PAGE","enteringModal","waitTransitionFinish","requestAnimationFrame","checkPageContentHeight","onTouchMove","e","exitingModal","onPageTouchMove","CARD","onCardTouchMove","onTouchEnd","onPageTouchEnd","onCardTouchEnd","onScroll","target","contentElement","contains","contentScrolled","contentScrollStopTimeout","clearTimeout","setTimeout","state","touchDown","dragging","modalOpenedLog","registerModal","id","data","Object","assign","onClose","onExit","isInsideModal","timeout","platform","Platform","IOS","document","window","getModals","Children","toArray","children","componentDidMount","addEventListener","componentWillUnmount","toggleDocumentScrolling","removeEventListener","componentDidUpdate","prevProps","closeModal","enteringState","onEnter","innerElement","style","transitionDelay","onEntered","delayEnter","animateTranslate","translateY","setMaskOpacity","activeElement","focus","enabled","passive","modalElement","prevModalState","initPageModal","currentModalState","needAnimate","expandable","translateYFrom","setState","length","prevState","nextModalState","nextIsPage","prevIsPage","onExited","exitTranslate","isBack","includes","shiftY","isY","current","stopPropagation","collapsed","expanded","touchStartContentScrollTop","scrollTop","touchMovePositive","headerElement","shiftYPercent","innerHeight","shiftYCurrent","rubber","touchShiftYPercent","translateYCurrent","offsetHeight","Math","max","startY","setStateCallback","shiftYEndPercent","expectTranslateY","duration","settlingHeight","expandedRange","collapsedRange","hiddenRange","hidden","eventHandler","transitionEvent","supported","onceHandler","name","percent","frameId","cancelAnimationFrame","setTransformStyle","forceOpacity","history","opacity","toString","render","TouchRootContext","Provider","value","ModalRootContext","Touch","className","classNames","configProvider","hasCustomPanelHeaderAfter","onMove","onEnd","div","onClick","ref","map","Modal","modalId","getNavId","_modalState","isPage","key","FocusTrap","getRootRef","restoreFocus","Component","withContext","withPlatform","withDOM","withModalManager","initModal","ConfigProviderContext","MODAL_PAGE_DEFAULT_PERCENT_HEIGHT","initCardModal","process","env","NODE_ENV","bottomInset","contentElementHeight","firstElementChild","scrollHeight","bottomInsetHeight","contentHeight","prevTranslateY","clientHeight","hasCollapsedState","Boolean","shiftHalf","visiblePart","headerHeight","height","parentElement"],"mappings":";;;;+BA8mBaA;;;eAAAA;;;;;;;;;;;;;;+DA9mBU;oBACI;oBACL;2BACM;4BACC;mBACK;wBACT;wBACA;sBACS;6BACF;qBACT;wBACE;qCACa;yBACZ;qBACQ;qEACL;gCAC+B;yBACV;qBACiC;+BAC5B;AAGvD,IAAMC,OAAOC,IAAAA,kBAAQ,EAAC;AAEtB,SAASC,cAAcC,MAAc,EAAEC,KAAiC;IACtE,IAAI,CAACA,OAAO;QACV,OAAO;IACT;IACA,OAAOD,UAAUC,KAAK,CAAC,EAAE,IAAID,UAAUC,KAAK,CAAC,EAAE;AACjD;AAEA,SAASC,eAAeF,MAAc;IACpC,OAAOG,IAAAA,WAAK,EAACH,QAAQ,GAAG;AAC1B;AAQA,IAAA,AAAMI,wCAqkBH,AArkBH;;gBAAMA;iCAAAA;aAAAA,wBAIQC,KAAmD;kCAJ3DD;;kCAKIC;QAmBR,sDAAQC,qBAAoB;QAC5B,sDAAiBC,kBAAjB,KAAA;QACA,sDAAiBC,6BAAcC,OAAMC,SAAS;QAC9C,sDAAQC,sBAAyCC;QACjD,sDAAiBC,oBAAjB,KAAA;QACA,sDAAiBC,YAAjB,KAAA;QAGA,sDAAQC,kBAAiDH;QAyFzDI,sDAAAA,gBAAe,SAACC;YACd,IAAI,CAACA,OAAO;gBACV,OAAO;YACT;YACA,MAAOA,MAAMC,aAAa,CAAE;gBAC1BD,QAAQA,MAAMC,aAAa;YAC7B;YACA,IAAID,MAAME,cAAc,EAAE;gBACxBF,MAAME,cAAc;YACtB;YACA,OAAO;QACT;QA0BAC,sDAAAA,qBAAoB;YAClB,IAAMC,aAAa,MAAKhB,KAAK,CAACiB,aAAa,CAAC,MAAKjB,KAAK,CAACkB,WAAW;YAElE,IAAIF,cAAcA,WAAWG,IAAI,KAAKC,gBAAS,CAACC,IAAI,EAAE;gBACpD,IAAI,MAAKrB,KAAK,CAACsB,aAAa,EAAE;oBAC5B,MAAKC,oBAAoB,CAACP,YAAY;wBACpCQ,sBAAsB;mCAAM,MAAKC,sBAAsB;;oBACzD;gBACF,OAAO;oBACLD,sBAAsB;+BAAM,MAAKC,sBAAsB;;gBACzD;YACF;QACF;QA4CAC,sDAAAA,eAAc,SAACC;YACb,IAAI,MAAK3B,KAAK,CAAC4B,YAAY,EAAE;gBAC3B;YACF;YACA,IAAMZ,aAAa,MAAKhB,KAAK,CAACiB,aAAa,CAAC,MAAKjB,KAAK,CAACkB,WAAW;YAClE,IAAI,CAACF,YAAY;gBACf;YACF;YAEA,IAAIA,WAAWG,IAAI,KAAKC,gBAAS,CAACC,IAAI,EAAE;gBACtC,OAAO,MAAKQ,eAAe,CAACF,GAAGX;YACjC;YAEA,IAAIA,WAAWG,IAAI,KAAKC,gBAAS,CAACU,IAAI,EAAE;gBACtC,OAAO,MAAKC,eAAe,CAACJ,GAAGX;YACjC;QACF;QA8EAgB,sDAAAA,cAAa,SAACL;YACZ,IAAMX,aAAa,MAAKhB,KAAK,CAACiB,aAAa,CAAC,MAAKjB,KAAK,CAACkB,WAAW;YAElE,IAAIF,CAAAA,uBAAAA,iCAAAA,WAAYG,IAAI,MAAKC,gBAAS,CAACC,IAAI,EAAE;gBACvC,OAAO,MAAKY,cAAc,CAACN,GAAGX;YAChC;YAEA,IAAIA,CAAAA,uBAAAA,iCAAAA,WAAYG,IAAI,MAAKC,gBAAS,CAACU,IAAI,EAAE;gBACvC,OAAO,MAAKI,cAAc,CAACP,GAAGX;YAChC;QACF;QAgHAmB,sDAAAA,YAAW,SAACR;gBASiCX;YAR3C,IAAME,cAAc,MAAKlB,KAAK,CAACkB,WAAW;YAE1C,IAAMkB,SAAST,EAAES,MAAM;YAEvB,IAAI,CAAClB,aAAa;gBAChB;YACF;YACA,IAAMF,aAAa,MAAKhB,KAAK,CAACiB,aAAa,CAACC;YAC5C,IAAIF,CAAAA,uBAAAA,iCAAAA,WAAYG,IAAI,MAAKC,gBAAS,CAACC,IAAI,KAAIL,uBAAAA,kCAAAA,6BAAAA,WAAYqB,cAAc,cAA1BrB,iDAAAA,2BAA4BsB,QAAQ,CAACF,UAAS;gBACvFpB,WAAWuB,eAAe,GAAG;gBAE7B,IAAIvB,WAAWwB,wBAAwB,EAAE;oBACvCC,aAAazB,WAAWwB,wBAAwB;gBAClD;gBAEAxB,WAAWwB,wBAAwB,GAAGE,WAAW;oBAC/C,IAAI1B,WAAWuB,eAAe,EAAE;wBAC9BvB,WAAWuB,eAAe,GAAG;oBAC/B;gBACF,GAAG;YACL;QACF;QA9bE,MAAKI,KAAK,GAAG;YACXC,WAAW;YACXC,UAAU;YACVC,gBAAgB,EAAE;QACpB;QAEA,MAAK5C,cAAc,iBAAGE,OAAMC,SAAS;QAErC,MAAKG,gBAAgB,GAAG;YACtBO,mBAAmB,MAAKA,iBAAiB;YACzCgC,eAAe;oBAAGC,YAAAA,IAAOC;oBAAPD;;oBAAgC;uBAAdE,OAAOC,MAAM,CAAC,CAAA,4BAAA,MAAKnD,KAAK,CAACiB,aAAa,CAAC+B,iBAAzB,uCAAA,4BAAgC,CAAC,GAAGC;YAAI;YAC1FG,SAAS;uBAAM,MAAKpD,KAAK,CAACqD,MAAM;;YAChCC,eAAe;QACjB;QAEA,MAAK7C,QAAQ,GAAG,CAAC;;;oBArBfV;;YAkCAwD,KAAAA;iBAAJ;gBACE,OAAO,IAAI,CAACvD,KAAK,CAACwD,QAAQ,KAAKC,kBAAQ,CAACC,GAAG,GAAG,MAAM;YACtD;;;YAEIC,KAAAA;iBAAJ;gBACE,OAAO,IAAI,CAAC3D,KAAK,CAAC2D,QAAQ;YAC5B;;;YAEIC,KAAAA;iBAAJ;gBACE,OAAO,IAAI,CAAC5D,KAAK,CAAC4D,MAAM;YAC1B;;;YAEAC,KAAAA;mBAAAA,SAAAA;gBACE,OAAOzD,OAAM0D,QAAQ,CAACC,OAAO,CAAC,IAAI,CAAC/D,KAAK,CAACgE,QAAQ;YACnD;;;YAEAC,KAAAA;mBAAAA,SAAAA;oBACE,0CAA0C;gBAC1C;iBAAA,eAAA,IAAI,CAACL,MAAM,cAAX,mCAAA,aAAaM,gBAAgB,CAAC,UAAU,IAAI,CAACnD,iBAAiB,EAAE;YAClE;;;YAEAoD,KAAAA;mBAAAA,SAAAA;gBACE,IAAI,CAACC,uBAAuB,CAAC;gBAC7B,IAAI,CAACR,MAAM,CAACS,mBAAmB,CAAC,UAAU,IAAI,CAACtD,iBAAiB,EAAE;YACpE;;;YAEAuD,KAAAA;mBAAAA,SAAAA,mBAAmBC,SAAuD;;gBACxE,4CAA4C;gBAC5C,IAAI,IAAI,CAACvE,KAAK,CAAC4B,YAAY,IAAI,IAAI,CAAC5B,KAAK,CAAC4B,YAAY,KAAK2C,UAAU3C,YAAY,EAAE;oBACjF,IAAI,CAAC4C,UAAU,CAAC,IAAI,CAACxE,KAAK,CAAC4B,YAAY;gBACzC;gBAEA,6CAA6C;gBAC7C,IAAI,IAAI,CAAC5B,KAAK,CAACsB,aAAa,IAAI,IAAI,CAACtB,KAAK,CAACsB,aAAa,KAAKiD,UAAUjD,aAAa,EAAE;oBACpF,IAAM,AAAEA,gBAAkB,IAAI,CAACtB,KAAK,CAA5BsB;oBACR,IAAMmD,gBAAgB,IAAI,CAACzE,KAAK,CAACiB,aAAa,CAACK;oBAC/C,IAAI,CAACtB,KAAK,CAAC0E,OAAO;oBAClB,IAAI,CAACnD,oBAAoB,CAACkD,eAAe;wBACvC,IAAIA,0BAAAA,oCAAAA,cAAeE,YAAY,EAAE;4BAC/BF,cAAcE,YAAY,CAACC,KAAK,CAACC,eAAe,GAAG;wBACrD;wBACA,MAAK7E,KAAK,CAAC8E,SAAS,CAACxD;oBACvB;oBAEA,IAAImD,0BAAAA,oCAAAA,cAAeE,YAAY,EAAE;wBAC/BF,cAAcE,YAAY,CAACC,KAAK,CAACC,eAAe,GAAG,IAAI,CAAC7E,KAAK,CAAC+E,UAAU,GACpE,AAAC,GAAe,OAAb,IAAI,CAACxB,OAAO,EAAC,QAChB;wBACJ,IAAI,CAACyB,gBAAgB,CAACP,eAAeA,cAAcQ,UAAU;wBAC7D,IAAI,CAACC,cAAc,CAACT,eAAe;oBACrC;gBACF;gBAEA,oBAAoB;gBACpB,IAAI,IAAI,CAACzE,KAAK,CAACkB,WAAW,IAAI,CAACqD,UAAUrD,WAAW,EAAE;oBACpD,IAAI,CAACR,cAAc,GAAG,IAAI,CAACiD,QAAQ,CAACwB,aAAa;gBACnD;gBACA,IAAI,CAAC,IAAI,CAACnF,KAAK,CAACkB,WAAW,IAAI,CAAC,IAAI,CAAClB,KAAK,CAAC4B,YAAY,IAAI,IAAI,CAAClB,cAAc,EAAE;oBAC9E,IAAI,CAACA,cAAc,CAAC0E,KAAK;oBACzB,IAAI,CAAC1E,cAAc,GAAG;gBACxB;gBAEA,IAAI,CAAC0D,uBAAuB,CAAC,CAAC,IAAI,CAACpE,KAAK,CAACkB,WAAW,IAAI,CAAC,IAAI,CAAClB,KAAK,CAAC4B,YAAY;YAClF;;;YAEA,8BAA8B,GAC9BwC,KAAAA;mBAAAA,SAAAA,wBAAwBiB,OAAgB;gBACtC,IAAI,IAAI,CAACpF,iBAAiB,KAAKoF,SAAS;oBACtC;gBACF;gBACA,IAAI,CAACpF,iBAAiB,GAAGoF;gBAEzB,IAAIA,SAAS;oBACX,qEAAqE;oBACrE,4EAA4E;oBAC5E,2CAA2C;oBAC3C,IAAI,CAACzB,MAAM,CAACS,mBAAmB,CAAC,aAAa,IAAI,CAAC1D,YAAY,EAAE;wBAC9D,8EAA8E;wBAC9E2E,SAAS;oBACX;gBACF,OAAO;oBACL,IAAI,CAAC1B,MAAM,CAACM,gBAAgB,CAAC,aAAa,IAAI,CAACvD,YAAY,EAAE;wBAC3D2E,SAAS;oBACX;gBACF;YACF;;;YAeA7D,KAAAA;mBAAAA,SAAAA;gBACE,IAAMT,aAAa,IAAI,CAAChB,KAAK,CAACiB,aAAa,CAAC,IAAI,CAACjB,KAAK,CAACkB,WAAW;gBAElE,IAAIF,CAAAA,uBAAAA,iCAAAA,WAAYG,IAAI,MAAKC,gBAAS,CAACC,IAAI,KAAIL,uBAAAA,iCAAAA,WAAYuE,YAAY,GAAE;oBACnE,IAAMC,iBAAiB,qBAAKxE;oBAC5ByE,cAAczE;oBACd,IAAM0E,oBAAoB,qBAAK1E;oBAE/B,IAAI2E,cAAc;oBAElB,IAAIH,eAAeI,UAAU,KAAKF,kBAAkBE,UAAU,EAAE;wBAC9D,IAAIJ,eAAeK,cAAc,KAAKH,kBAAkBG,cAAc,EAAE;4BACtEF,cAAc;wBAChB;oBACF,OAAO;wBACLA,cAAc;oBAChB;oBAEA,IAAIA,aAAa;wBACf,IAAI,CAACX,gBAAgB,CAAChE,YAAYA,WAAWiE,UAAU;oBACzD;gBACF;YACF;;;YAgBAT,KAAAA;mBAAAA,SAAAA,WAAWxB,EAAU;;gBACnB,wEAAwE;gBACxE,IAAI,CAAC8C,QAAQ,CAAC;oBAAElD,WAAW;gBAAM;gBAEjC,IAAM4C,iBAAiB,IAAI,CAACxF,KAAK,CAACiB,aAAa,CAAC+B;gBAEhD,IAAI,CAACwC,gBAAgB;oBACnBxC,MAAMxD,KAAK,AAAC,+CAAiD,OAAHwD,IAAG,mBAAiB;oBAC9E;gBACF;gBACA,IAAI,CAAC,IAAI,CAACL,KAAK,CAACG,cAAc,CAACiD,MAAM,EAAE;oBACrC,IAAI,CAACD,QAAQ,CAAC,SAACE;+BAAe;4BAC5BlD,gBAAgB,AAAC,uBAAGkD,UAAUlD,cAAc,SAA5B;gCAA8BE;6BAAG;wBACnD;;gBACF;gBACA,IAAMiD,iBAAiB,IAAI,CAACjG,KAAK,CAACiB,aAAa,CAAC,IAAI,CAACjB,KAAK,CAACkB,WAAW;gBACtE,IAAMgF,aAAa,CAAC,CAACD,kBAAkBA,eAAe9E,IAAI,KAAKC,gBAAS,CAACC,IAAI;gBAE7E,IAAM8E,aAAa,CAAC,CAACX,kBAAkBA,eAAerE,IAAI,KAAKC,gBAAS,CAACC,IAAI;gBAC7E,IAAI,CAACE,oBAAoB,CAACiE,gBAAgB;2BAAM,MAAKxF,KAAK,CAACoG,QAAQ,CAACpD;;oBAIjEwC,4BAAoCS,gCAEhCA;gBALP,IAAMI,gBACJF,cACAD,cACA,AAACV,CAAAA,CAAAA,6BAAAA,eAAeP,UAAU,cAAzBO,wCAAAA,6BAA6B,CAAA,KAAOS,CAAAA,CAAAA,iCAAAA,2BAAAA,qCAAAA,eAAgBJ,cAAc,cAA9BI,4CAAAA,iCAAkC,CAAA,KACvE,CAAC,IAAI,CAACjG,KAAK,CAACsG,MAAM,GACd,AAACL,CAAAA,CAAAA,kCAAAA,2BAAAA,qCAAAA,eAAgBJ,cAAc,cAA9BI,6CAAAA,kCAAkC,CAAA,IAAK,KACxC;gBACN,IAAI,CAACjB,gBAAgB,CAACQ,gBAAgBa;gBAEtC,IAAI,CAACJ,gBAAgB;oBACnB,gCAAgC;oBAChC,IAAI,CAACf,cAAc,CAACM,gBAAgB;oBACpC,IAAI,CAACM,QAAQ,CAAC;wBAAEhD,gBAAgB,EAAE;oBAAC;oBACnC0C,eAAeP,UAAU,GAAG1E;gBAC9B,OAAO,IAAI0F,eAAejD,EAAE,IAAI,CAAC,IAAI,CAACL,KAAK,CAACG,cAAc,CAACyD,QAAQ,CAACN,eAAejD,EAAE,GAAG;oBACtFiD,eAAehB,UAAU,GAAG1E;oBAC5B,IAAI,CAACuF,QAAQ,CAAC,SAACE;+BAAe;4BAC5BlD,gBAAgB,AAAC,uBAAGkD,UAAUlD,cAAc,SAA5B;gCAA8BmD,eAAejD,EAAE;6BAAE;wBACnE;;gBACF;YACF;;;YAoBAnB,KAAAA;mBAAAA,SAAAA,gBAAgBjB,KAAiB,EAAEI,UAA4B;oBAWxDA,0BAyBHA;gBAnCF,IAAQwF,SAA0B5F,MAA1B4F,QAAQ3F,gBAAkBD,MAAlBC;gBAChB,IAAMuB,SAASvB,cAAcuB,MAAM;gBAEnC,IAAI,CAACxB,MAAM6F,GAAG,EAAE;wBACV;oBAAJ,KAAI,4BAAA,IAAI,CAACtG,WAAW,CAACuG,OAAO,cAAxB,gDAAA,0BAA0BpE,QAAQ,CAACF,SAAS;wBAC9CvB,cAAcC,cAAc;oBAC9B;oBACA;gBACF;gBAEA,IAAI,GAACE,2BAAAA,WAAW2D,YAAY,cAAvB3D,+CAAAA,yBAAyBsB,QAAQ,CAACF,UAAS;oBAC9C,OAAOvB,cAAcC,cAAc;gBACrC;gBAEAD,cAAc8F,eAAe;gBAE7B,IAAQf,aAAqD5E,WAArD4E,YAAYrD,kBAAyCvB,WAAzCuB,iBAAiBqE,YAAwB5F,WAAxB4F,WAAWC,WAAa7F,WAAb6F;gBAEhD,IAAI,CAAC,IAAI,CAAClE,KAAK,CAACC,SAAS,EAAE;wBACe5B;wBAAAA;oBAAxCA,WAAW8F,0BAA0B,GAAG9F,CAAAA,wCAAAA,6BAAAA,WAAWqB,cAAc,cAAzBrB,iDAAAA,2BAA2B+F,SAAS,cAApC/F,kDAAAA,uCAAwC;oBAChF,IAAI,CAAC8E,QAAQ,CAAC;wBAAElD,WAAW;oBAAK;gBAClC;gBAEA,IAAIL,iBAAiB;oBACnB;gBACF;gBAEA,IAAIvB,WAAWgG,iBAAiB,KAAK,MAAM;oBACzChG,WAAWgG,iBAAiB,GAAGR,SAAS;gBAC1C;gBAEA,IACE,CAACxF,WAAW4E,UAAU,IACtBgB,aACCC,YAAY7F,WAAWgG,iBAAiB,IAAIhG,WAAW8F,0BAA0B,KAAK,OACvF9F,4BAAAA,WAAWiG,aAAa,cAAxBjG,gDAAAA,0BAA0BsB,QAAQ,CAACF,UACnC;oBACAvB,cAAcC,cAAc;oBAE5B,IAAI,AAAC,CAAC8E,cAAcY,SAAS,KAAM,CAAC,IAAI,CAAC5C,MAAM,EAAE;wBAC/C;oBACF;oBAEA,CAAC,IAAI,CAACjB,KAAK,CAACE,QAAQ,IAAI,IAAI,CAACiD,QAAQ,CAAC;wBAAEjD,UAAU;oBAAK;oBAEvD,IAAMqE,gBAAgB,AAACV,SAAS,IAAI,CAAC5C,MAAM,CAACuD,WAAW,GAAI;oBAC3D,IAAMC,gBAAgBC,IAAAA,aAAM,EAACH,eAAe,IAAI,KAAK,IAAI,CAAClH,KAAK,CAACwD,QAAQ,KAAKC,kBAAQ,CAACC,GAAG;oBAEzF1C,WAAWsG,kBAAkB,GAAGJ;wBACelG;oBAA/CA,WAAWuG,iBAAiB,GAAG1H,eAAe,AAACmB,CAAAA,CAAAA,yBAAAA,WAAWiE,UAAU,cAArBjE,oCAAAA,yBAAyB,CAAA,IAAKoG;oBAE7E,IAAI,CAACpC,gBAAgB,CAAChE,YAAYA,WAAWuG,iBAAiB;oBAC9D,IAAI,CAACrC,cAAc,CAAClE;gBACtB;YACF;;;YAEAe,KAAAA;mBAAAA,SAAAA,gBAAgBnB,KAAiB,EAAEI,UAA4B;oBAGzDA;gBAFJ,IAAQH,gBAA0BD,MAA1BC,eAAe2F,SAAW5F,MAAX4F;gBACvB,IAAMpE,SAASvB,cAAcuB,MAAM;gBACnC,KAAIpB,2BAAAA,WAAW2D,YAAY,cAAvB3D,+CAAAA,yBAAyBsB,QAAQ,CAACF,SAAS;oBAC7C,IAAI,CAAC,IAAI,CAACO,KAAK,CAACC,SAAS,EAAE;wBACzB,IAAI,CAACkD,QAAQ,CAAC;4BAAElD,WAAW;4BAAMC,UAAU;wBAAK;oBAClD;oBAEA,IAAMqE,gBAAgB,AAACV,SAASxF,WAAW2D,YAAY,CAAC6C,YAAY,GAAI;oBACxE,IAAMJ,gBAAgBC,IAAAA,aAAM,EAACH,eAAe,IAAI,KAAK,IAAI,CAAClH,KAAK,CAACwD,QAAQ,KAAKC,kBAAQ,CAACC,GAAG;oBAEzF1C,WAAWsG,kBAAkB,GAAGJ;wBACYlG;oBAA5CA,WAAWuG,iBAAiB,GAAGE,KAAKC,GAAG,CAAC,GAAG,AAAC1G,CAAAA,CAAAA,yBAAAA,WAAWiE,UAAU,cAArBjE,oCAAAA,yBAAyB,CAAA,IAAKoG;oBAE1E,IAAI,CAACpC,gBAAgB,CAAChE,YAAYA,WAAWuG,iBAAiB;oBAC9D,IAAI,CAACrC,cAAc,CAAClE;gBACtB;YACF;;;YAcAiB,KAAAA;mBAAAA,SAAAA,eAAerB,KAAiB,EAAEI,UAA4B;;gBAC5D,IAAQ2G,SAAmB/G,MAAnB+G,QAAQnB,SAAW5F,MAAX4F;gBAEhBxF,WAAWuB,eAAe,GAAG;gBAC7BvB,WAAWgG,iBAAiB,GAAG;gBAE/B,IAAIY;gBAEJ,IAAI,IAAI,CAACjF,KAAK,CAACE,QAAQ,IAAI,IAAI,CAACe,MAAM,EAAE;oBACtC,IAAMiE,mBAAmB,AAAEF,CAAAA,SAASnB,MAAK,IAAK,IAAI,CAAC5C,MAAM,CAACuD,WAAW,GAAI;wBAExDnG;oBAAjB,IAAIiE,aAAajE,CAAAA,gCAAAA,WAAWuG,iBAAiB,cAA5BvG,2CAAAA,gCAAgC;wBAK7CA;oBAJJ,IAAM8G,mBACJ,AAAC7C,aAAarE,MAAMmH,QAAQ,GAC5B,MACA,MACC,CAAA,AAAC/G,CAAAA,CAAAA,iCAAAA,WAAWsG,kBAAkB,cAA7BtG,4CAAAA,iCAAiC,CAAA,IAAK,IAAI,CAAC,IAAI,CAAA;oBACnDiE,aAAapF,eAAeoF,aAAa6C;oBAEzC,IAAI9G,WAAWgH,cAAc,KAAK,KAAK;wBACrC,IAAItI,cAAcuF,YAAYjE,WAAWiH,aAAa,GAAG;gCAC1CjH;gCAAAA;4BAAbiE,aAAajE,CAAAA,8BAAAA,4BAAAA,WAAWiH,aAAa,cAAxBjH,gDAAAA,yBAA0B,CAAC,EAAE,cAA7BA,wCAAAA,6BAAiC;wBAChD,OAAO,IAAItB,cAAcuF,YAAYjE,WAAWkH,cAAc,GAAG;gCAClDlH;4BAAbiE,aAAajE,CAAAA,6BAAAA,WAAW6E,cAAc,cAAzB7E,wCAAAA,6BAA6B;wBAC5C,OAAO,IAAItB,cAAcuF,YAAYjE,WAAWmH,WAAW,GAAG;4BAC5DlD,aAAa;wBACf,OAAO;gCACQjE;4BAAbiE,aAAajE,CAAAA,8BAAAA,WAAW6E,cAAc,cAAzB7E,yCAAAA,8BAA6B;wBAC5C;oBACF,OAAO;wBACL,IAAItB,cAAcuF,YAAY;4BAAC;4BAAG;yBAAG,GAAG;4BACtCA,aAAa;wBACf,OAAO;4BACLA,aAAa;wBACf;oBACF;oBAEA,IAAIA,eAAe,OAAO4C,oBAAoB,IAAI;wBAChD5C,aAAa;oBACf;oBAEAjE,WAAWiE,UAAU,GAAGA;oBACxBjE,WAAWuG,iBAAiB,GAAGtC;oBAC/BjE,WAAW4F,SAAS,GAAGlH,cAAcuF,YAAYjE,WAAWkH,cAAc;oBAC1ElH,WAAW6F,QAAQ,GAAG5B,eAAe;oBACrCjE,WAAWoH,MAAM,GAAGnD,eAAe;oBAEnC,IAAIjE,WAAWoH,MAAM,EAAE;wBACrB,IAAI,CAACpI,KAAK,CAACqD,MAAM;oBACnB;oBAEAuE,mBAAmB;wBACjB,IAAI,CAAC5G,WAAWoH,MAAM,EAAE;4BACtB,MAAKpD,gBAAgB,CAAChE,YAAYA,WAAWiE,UAAU;wBACzD;wBAEA,MAAKC,cAAc,CAAClE;oBACtB;gBACF;gBAEA,IAAI,CAAC8E,QAAQ,CACX;oBACElD,WAAW;oBACXC,UAAU;gBACZ,GACA+E;YAEJ;;;YAEA1F,KAAAA;mBAAAA,SAAAA,eAAe,KAAwB,EAAElB,UAA4B;oBAAtD,AAAE+G,WAAF,MAAEA;;gBACf,IAAIH;gBAEJ,IAAI,IAAI,CAACjF,KAAK,CAACE,QAAQ,EAAE;wBACN7B;oBAAjB,IAAIiE,aAAajE,CAAAA,gCAAAA,WAAWuG,iBAAiB,cAA5BvG,2CAAAA,gCAAgC;wBAGPA;oBAD1C,IAAM8G,mBACJ,AAAC7C,aAAa8C,WAAY,MAAM,MAAO,CAAA,AAAC/G,CAAAA,CAAAA,iCAAAA,WAAWsG,kBAAkB,cAA7BtG,4CAAAA,iCAAiC,CAAA,IAAK,IAAI,CAAC,IAAI,CAAA;oBACzFiE,aAAawC,KAAKC,GAAG,CAAC,GAAGzC,aAAa6C;oBAEtC,IAAI7C,cAAc,IAAI;wBACpBA,aAAa;oBACf,OAAO;wBACLA,aAAa;oBACf;oBAEAjE,WAAWiE,UAAU,GAAGA;oBACxBjE,WAAWoH,MAAM,GAAGnD,eAAe;oBAEnC,IAAIjE,WAAWoH,MAAM,EAAE;wBACrB,IAAI,CAACpI,KAAK,CAACqD,MAAM;oBACnB;oBAEAuE,mBAAmB;wBACjB,IAAI,CAAC5G,WAAWoH,MAAM,EAAE;4BACtB,MAAKpD,gBAAgB,CAAChE,YAAYA,WAAWiE,UAAU;wBACzD;wBAEA,MAAKC,cAAc,CAAClE;oBACtB;gBACF;gBAEA,IAAI,CAAC8E,QAAQ,CACX;oBACElD,WAAW;oBACXC,UAAU;gBACZ,GACA+E;YAEJ;;;YA0BArG,KAAAA;mBAAAA,SAAAA,qBAAqBP,UAAwC,EAAEqH,YAAwB;gBACrF,IAAIC,8BAAe,CAACC,SAAS,EAAE;wBAM7BvH;oBALA,IAAMwH,cAAc;4BAClBxH;wBAAAA,uBAAAA,kCAAAA,2BAAAA,WAAY2D,YAAY,cAAxB3D,+CAAAA,yBAA0BqD,mBAAmB,CAACiE,8BAAe,CAACG,IAAI,EAAYD;wBAC9EH;oBACF;oBAEArH,uBAAAA,kCAAAA,2BAAAA,WAAY2D,YAAY,cAAxB3D,+CAAAA,yBAA0BkD,gBAAgB,CAACoE,8BAAe,CAACG,IAAI,EAAYD;gBAC7E,OAAO;oBACL9F,WAAW2F,cAAc,IAAI,CAAC9E,OAAO;gBACvC;YACF;;;YAEA;;;;;GAKC,GACDyB,KAAAA;mBAAAA,SAAAA,iBAAiBhE,UAA4B,EAAE0H,OAA2B;gBACxE,IAAMC,UAAU,AAAC,wBAAqC,OAAd3H,WAAWgC,EAAE;gBAErD4F,qBAAqB,IAAI,CAACnI,QAAQ,CAACkI,QAAQ;gBAE3C,IAAI,CAAClI,QAAQ,CAACkI,QAAQ,GAAGnH,sBAAsB;oBAC7CqH,IAAAA,yBAAiB,EAAC7H,WAAW2D,YAAY,EAAE,AAAC,kBAAyB,OAAR+D,SAAQ;gBACvE;YACF;;;YAEA,0DAA0D,GAC1DxD,KAAAA;mBAAAA,SAAAA,eAAelE,UAA4B;oBAAE8H,eAAAA,iEAA8B;;oBAC5C;gBAA7B,IAAIA,iBAAiB,QAAQ,EAAA,sBAAA,IAAI,CAAC9I,KAAK,CAAC+I,OAAO,cAAlB,0CAAA,mBAAoB,CAAC,EAAE,MAAK/H,WAAWgC,EAAE,EAAE;oBACtE;gBACF;gBACA,IAAI,IAAI,CAAC1C,kBAAkB,EAAE;oBAC3BsI,qBAAqB,IAAI,CAACtI,kBAAkB;gBAC9C;gBACA,IAAI,CAACA,kBAAkB,GAAGkB,sBAAsB;oBAC9C,IAAI,MAAKtB,cAAc,CAACwG,OAAO,EAAE;wBAC/B,6BAAkD1F,WAA1CiE,YAAAA,iDAAa,4DAA6BjE,WAA1BuG,mBAAAA,+DAAoB;wBAE5C,IAAMyB,UACJF,iBAAiB,OACb,IAAI,AAACvB,CAAAA,oBAAoBtC,UAAS,IAAM,CAAA,MAAMA,UAAS,KAAM,IAC7D6D;wBACN,MAAK5I,cAAc,CAACwG,OAAO,CAAC9B,KAAK,CAACoE,OAAO,GAAGlJ,IAAAA,WAAK,EAACkJ,SAAS,GAAG,KAAKC,QAAQ;wBAC3E,MAAK/I,cAAc,CAACwG,OAAO,CAAC9B,KAAK,CAACC,eAAe,GAC/CmE,WAAW,MAAKhJ,KAAK,CAAC+E,UAAU,GAAG,AAAC,GAAe,OAAb,MAAKxB,OAAO,EAAC,QAAM;oBAC7D;gBACF;YACF;;;YAEA2F,KAAAA;mBAAAA,SAAAA;;oBAcY;gBAbV,IAAqD,cAAA,IAAI,CAAClJ,KAAK,EAAvDkB,cAA6C,YAA7CA,aAAaU,eAAgC,YAAhCA,cAAcN,gBAAkB,YAAlBA;gBACnC,IAAgC,cAAA,IAAI,CAACqB,KAAK,EAAlCC,YAAwB,YAAxBA,WAAWC,WAAa,YAAbA;gBAEnB,IAAI,CAAC3B,eAAe,CAACU,cAAc;oBACjC,OAAO;gBACT;gBAEA,qBACE,qBAACuH,qBAAgB,CAACC,QAAQ;oBAACC,OAAO;iCAChC,qBAACC,kCAAgB,CAACF,QAAQ;oBAACC,OAAO,IAAI,CAAC7I,gBAAgB;iCACrD,qBAAC+I,YAAK;oBACJC,WAAWC,IAAAA,gBAAU,mBAEnB,EAAA,6BAAA,IAAI,CAACzJ,KAAK,CAAC0J,cAAc,cAAzB,iDAAA,2BAA2BC,yBAAyB,qDAEpD/G,aACE6G,IAAAA,gBAAU,4BAA+B,mCAC3C,CAAC,CAAEnI,CAAAA,iBAAiBM,YAAW,KAC7B6H,IAAAA,gBAAU,8BAAiC;oBAE/CG,QAAQ,IAAI,CAAClI,WAAW;oBACxBmI,OAAO,IAAI,CAAC7H,UAAU;oBACtBG,UAAU,IAAI,CAACA,QAAQ;iCAEvB,qBAAC2H;oBACCN,SAAS;oBACTO,SAAS,IAAI,CAAC/J,KAAK,CAACqD,MAAM;oBAC1B2G,KAAK,IAAI,CAAC9J,cAAc;kCAE1B,qBAAC4J;oBAAIN,SAAS;oBAAiCQ,KAAK,IAAI,CAAC7J,WAAW;mBACjE,IAAI,CAAC0D,SAAS,GAAGoG,GAAG,CAAC,SAACC;oBACrB,IAAMC,UAAUC,IAAAA,kBAAQ,EAACF,MAAMlK,KAAK,EAAER;oBACtC,IAAM6K,cAAc,MAAKrK,KAAK,CAACiB,aAAa,CAACkJ;oBAC7C,IAAI,AAACA,YAAYjJ,eAAeiJ,YAAYvI,gBAAiB,CAACyI,aAAa;wBACzE,OAAO;oBACT;oBACA,IAAMrJ,aAAa,qBAAKqJ;oBAExB,IAAMC,SAAStJ,WAAWG,IAAI,KAAKC,gBAAS,CAACC,IAAI;oBACjD,IAAMkJ,MAAM,AAAC,SAAgB,OAARJ;oBAErB,qBACE,qBAACK,oBAAS;wBACRD,KAAKA;wBACLE,YAAY,SAAC9I;4BACX,IAAMX,aAAa,MAAKhB,KAAK,CAACiB,aAAa,CAACkJ;4BAC5C,IAAInJ,YAAY;gCACdA,WAAWuE,YAAY,GAAG5D;4BAC5B;wBACF;wBACAyB,SAAS,MAAKpD,KAAK,CAACqD,MAAM;wBAC1BE,SAAS,MAAKA,OAAO;wBACrBiG,WAAWC,IAAAA,gBAAU,0BAGnB5G,YAAY,0CAEZyH,UAAUtJ,WAAW4E,UAAU,IAAI,4CACnC0E,UAAUtJ,WAAW4F,SAAS,IAAI;wBAEpC8D,cAAc;uBAEbR;gBAGP;YAMZ;;;WAlkBInK;EAAgCK,OAAMuK,SAAS;AAqkB9C,IAAMpL,iBAAiBqL,IAAAA,wBAAW,EACvCC,IAAAA,0BAAY,EACVC,IAAAA,YAAO,EAAwBC,IAAAA,iCAAgB,EAACC,WAAWjL,4BAE7DkL,4CAAqB,EACrB;AAGF;;CAEC,GACD,SAASD,UAAUhK,UAA4B;IAC7C,OAAQA,WAAWG,IAAI;QACrB,KAAKC,gBAAS,CAACC,IAAI;YACjBL,WAAWgH,cAAc,GAAGhH,WAAWgH,cAAc,IAAIkD,4CAAiC;YAC1F,OAAOzF,cAAczE;QACvB,KAAKI,gBAAS,CAACU,IAAI;YACjB,OAAOqJ,cAAcnK;QACvB;YACEoK,QAAQC,GAAG,CAACC,QAAQ,KAAK,iBACvB9L,KAAK,AAAC,qCAAoD,OAAhBwB,WAAWG,IAAI,EAAC,wBAAsB;IACtF;AACF;AAEA,SAASsE,cAAczE,UAA4B;IACjD,IAAQqB,iBAAgCrB,WAAhCqB,gBAAgBkJ,cAAgBvK,WAAhBuK;IACxB,IAAMC,uBAAuB,CAACnJ,2BAAAA,qCAAAA,eAAgBoJ,iBAAiB,AAAe,EAAEC,YAAY;IAC5F,IAAMC,oBAAoBJ,CAAAA,wBAAAA,kCAAAA,YAAa/D,YAAY,KAAI;IACvD,IAAMoE,gBAAgBJ,uBAAuBG;IAC7C,IAAIE,iBAAiB7K,WAAWiE,UAAU;QAGvB5C;IADnBrB,WAAW4E,UAAU,GACnBgG,gBAAiBvJ,CAAAA,CAAAA,+BAAAA,2BAAAA,qCAAAA,eAAgByJ,YAAY,cAA5BzJ,0CAAAA,+BAAgC,CAAA,KACjDrB,WAAWgH,cAAc,KAAK,OAC9BhH,WAAW6F,QAAQ;IAErB,IAAID,YAAY;IAChB,IAAIC,WAAW;IACf,IAAIhB;IACJ,IAAIZ;IACJ,IAAIgD;IACJ,IAAIC;IACJ,IAAIC;IAEJ,IAAM4D,oBAAoBC,QAAQhL,WAAW4E,UAAU,IAAI5E,WAAWgH,cAAc,KAAK;IACzF,IAAIhH,WAAW4E,UAAU,EAAE;YACD5E;QAAxB6E,iBAAiB,MAAO7E,CAAAA,CAAAA,6BAAAA,WAAWgH,cAAc,cAAzBhH,wCAAAA,6BAA6B,CAAA;QAErD,IAAMiL,YAAYpG,iBAAiB;QACnC,IAAMqG,cAAc,MAAMrG;QAE1BoC,gBAAgB;YAAC;YAAGgE;SAAU;QAC9B/D,iBAAiB6D,oBAAoB;YAACE;YAAWpG,iBAAiBqG,cAAc;SAAE,GAAG3L;QACrF4H,cAAc;YAACtC,iBAAiBqG,cAAc;YAAG;SAAI;QAErDtF,YAAYmF,qBAAqBlG,iBAAiB;QAClDgB,WAAWhB,kBAAkB;QAC7BZ,aAAaY;IACf,OAAO;YACgB7E,2BAIFA,wCAAAA;YAJEA;QAArB,IAAMmL,eAAenL,CAAAA,0CAAAA,4BAAAA,WAAWiG,aAAa,cAAxBjG,gDAAAA,0BAA0BwG,YAAY,cAAtCxG,oDAAAA,yCAA0C;QAC/D,IAAMoL,SAASR,gBAAgBO;YAGZnL;QADnB6E,iBACE,MAAM,AAACuG,SAAUpL,CAAAA,CAAAA,uDAAAA,2BAAAA,WAAW2D,YAAY,cAAvB3D,gDAAAA,yCAAAA,yBAAyBqL,aAAa,cAAtCrL,6DAAAA,uCAAwCwG,YAAY,cAApDxG,iEAAAA,sDAAwD,CAAA,IAAM;QACjFiE,aAAaY;QAEboC,gBAAgB;YAAChD;YAAYA,aAAa;SAAG;QAC7CiD,iBAAiB3H;QACjB4H,cAAc;YAAClD,aAAa;YAAIA,aAAa;SAAI;IACnD;IAEA,8GAA8G;IAC9G,IACE,AAACjE,WAAW4E,UAAU,IAAIX,aAAc4G,CAAAA,2BAAAA,4BAAAA,iBAAkB,GAAE,KAC5D7K,WAAWgH,cAAc,KAAK,KAC9B;QACA/C,aAAa;IACf;IAEA,gDAAgD;IAChD,IAAIA,eAAe,GAAG;QACpB4B,WAAW;QACXD,YAAY;IACd;IAEA5F,WAAWiH,aAAa,GAAGA;IAC3BjH,WAAWkH,cAAc,GAAGA;IAC5BlH,WAAWmH,WAAW,GAAGA;IACzBnH,WAAWiE,UAAU,GAAGA;IACxBjE,WAAW6E,cAAc,GAAGA;IAC5B7E,WAAW4F,SAAS,GAAGA;IACvB5F,WAAW6F,QAAQ,GAAGA;AACxB;AAEA,SAASsE,cAAcnK,UAA4B;IACjDA,WAAWiE,UAAU,GAAG;AAC1B"}
1
+ {"version":3,"sources":["../../../../src/components/ModalRoot/ModalRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { withContext } from '../../hoc/withContext';\nimport { withPlatform } from '../../hoc/withPlatform';\nimport { DOMProps, withDOM } from '../../lib/dom';\nimport { getNavId } from '../../lib/getNavId';\nimport { Platform } from '../../lib/platform';\nimport { setTransformStyle } from '../../lib/styles';\nimport { transitionEvent } from '../../lib/supportEvents';\nimport { rubber } from '../../lib/touch';\nimport { warnOnce } from '../../lib/warnOnce';\nimport { ConfigProviderContext } from '../ConfigProvider/ConfigProviderContext';\nimport { FocusTrap } from '../FocusTrap/FocusTrap';\nimport { Touch, TouchEvent } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { ModalRootContext, ModalRootContextInterface } from './ModalRootContext';\nimport { MODAL_PAGE_DEFAULT_PERCENT_HEIGHT } from './constants';\nimport { ModalRootWithDOMProps, ModalsStateEntry, ModalType, TranslateRange } from './types';\nimport { ModalTransitionProps, withModalManager } from './useModalManager';\nimport styles from './ModalRoot.module.css';\n\nconst warn = warnOnce('ModalRoot');\n\nfunction numberInRange(number: number, range: TranslateRange | undefined) {\n if (!range) {\n return false;\n }\n return number >= range[0] && number <= range[1];\n}\n\nfunction rangeTranslate(number: number) {\n return clamp(number, 0, 98);\n}\n\ninterface ModalRootState {\n touchDown?: boolean;\n dragging?: boolean;\n modalOpenedLog: string[];\n}\n\nclass ModalRootTouchComponent extends React.Component<\n ModalRootWithDOMProps & DOMProps & ModalTransitionProps,\n ModalRootState\n> {\n constructor(props: ModalRootWithDOMProps & ModalTransitionProps) {\n super(props);\n this.state = {\n touchDown: false,\n dragging: false,\n modalOpenedLog: [],\n };\n\n this.maskElementRef = React.createRef();\n\n this.modalRootContext = {\n updateModalHeight: this.updateModalHeight,\n registerModal: ({ id, ...data }) => Object.assign(this.props.getModalState(id) ?? {}, data),\n onClose: () => this.props.onExit(),\n isInsideModal: true,\n };\n\n this.frameIds = {};\n }\n\n private documentScrolling = false;\n private readonly maskElementRef: React.RefObject<HTMLDivElement>;\n private readonly viewportRef = React.createRef<HTMLDivElement>();\n private maskAnimationFrame: number | undefined = undefined;\n private readonly modalRootContext: ModalRootContextInterface;\n private readonly frameIds: {\n [index: string]: number;\n };\n private restoreFocusTo: HTMLElement | undefined | null = undefined;\n\n get timeout(): number {\n return this.props.platform === Platform.IOS ? 400 : 320;\n }\n\n get document(): Document {\n return this.props.document as Document;\n }\n\n get window(): Window {\n return this.props.window as Window;\n }\n\n getModals() {\n return React.Children.toArray(this.props.children) as React.ReactElement[];\n }\n\n componentDidMount() {\n // Отслеживаем изменение размеров viewport\n this.window?.addEventListener('resize', this.updateModalHeight, false);\n }\n\n componentWillUnmount() {\n this.toggleDocumentScrolling(true);\n this.window.removeEventListener('resize', this.updateModalHeight, false);\n }\n\n componentDidUpdate(prevProps: ModalRootWithDOMProps & ModalTransitionProps) {\n // transition phase 2: animate exiting modal\n if (this.props.exitingModal && this.props.exitingModal !== prevProps.exitingModal) {\n this.closeModal(this.props.exitingModal);\n }\n\n // transition phase 3: animate entering modal\n if (this.props.enteringModal && this.props.enteringModal !== prevProps.enteringModal) {\n const { enteringModal } = this.props;\n const enteringState = this.props.getModalState(enteringModal);\n this.props.onEnter();\n this.waitTransitionFinish(enteringState, () => {\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = '';\n }\n this.props.onEntered(enteringModal);\n });\n\n if (enteringState?.innerElement) {\n enteringState.innerElement.style.transitionDelay = this.props.delayEnter\n ? `${this.timeout}ms`\n : '';\n this.animateTranslate(enteringState, enteringState.translateY);\n this.setMaskOpacity(enteringState, 1);\n }\n }\n\n // focus restoration\n if (this.props.activeModal && !prevProps.activeModal) {\n this.restoreFocusTo = this.document.activeElement as HTMLElement;\n }\n if (!this.props.activeModal && !this.props.exitingModal && this.restoreFocusTo) {\n this.restoreFocusTo.focus();\n this.restoreFocusTo = null;\n }\n\n this.toggleDocumentScrolling(!this.props.activeModal && !this.props.exitingModal);\n }\n\n /* Отключает скролл документа */\n toggleDocumentScrolling(enabled: boolean) {\n if (this.documentScrolling === enabled) {\n return;\n }\n this.documentScrolling = enabled;\n\n if (enabled) {\n // восстанавливаем значение overscroll behavior\n // eslint-disable-next-line no-restricted-properties\n this.document.documentElement.classList.remove('vkui--disable-overscroll-behavior');\n\n // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.\n // https://github.com/VKCOM/VKUI/issues/444\n this.window.removeEventListener('touchmove', this.preventTouch, {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions нет поля passive\n passive: false,\n });\n } else {\n // отключаем нативный pull-to-refresh при открытом модальном окне\n // чтобы он не срабатывал при закрытии модалки смахиванием вниз\n // eslint-disable-next-line no-restricted-properties\n this.document.documentElement.classList.add('vkui--disable-overscroll-behavior');\n\n this.window.addEventListener('touchmove', this.preventTouch, {\n passive: false,\n });\n }\n }\n\n preventTouch = (event: any) => {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault) {\n event.preventDefault();\n }\n return false;\n };\n\n checkPageContentHeight() {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE && modalState?.modalElement) {\n const prevModalState = { ...modalState };\n initPageModal(modalState);\n const currentModalState = { ...modalState };\n\n let needAnimate = false;\n\n if (prevModalState.expandable === currentModalState.expandable) {\n if (prevModalState.translateYFrom !== currentModalState.translateYFrom) {\n needAnimate = true;\n }\n } else {\n needAnimate = true;\n }\n\n if (needAnimate) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n }\n }\n\n updateModalHeight = () => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState && modalState.type === ModalType.PAGE) {\n if (this.props.enteringModal) {\n this.waitTransitionFinish(modalState, () => {\n requestAnimationFrame(() => this.checkPageContentHeight());\n });\n } else {\n requestAnimationFrame(() => this.checkPageContentHeight());\n }\n }\n };\n\n closeModal(id: string) {\n // Сбрасываем состояния, которые могут помешать закрытию модального окна\n this.setState({ touchDown: false });\n\n const prevModalState = this.props.getModalState(id);\n\n if (!prevModalState) {\n id && warn(`closeActiveModal: модальное окно (страница) ${id} не существует`, 'error');\n return;\n }\n if (!this.state.modalOpenedLog.length) {\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, id],\n }));\n }\n const nextModalState = this.props.getModalState(this.props.activeModal);\n const nextIsPage = !!nextModalState && nextModalState.type === ModalType.PAGE;\n\n const prevIsPage = !!prevModalState && prevModalState.type === ModalType.PAGE;\n this.waitTransitionFinish(prevModalState, () => this.props.onExited(id));\n const exitTranslate =\n prevIsPage &&\n nextIsPage &&\n (prevModalState.translateY ?? 0) <= (nextModalState?.translateYFrom ?? 0) &&\n !this.props.isBack\n ? (nextModalState?.translateYFrom ?? 0) + 10\n : 100;\n this.animateTranslate(prevModalState, exitTranslate);\n\n if (!nextModalState) {\n // NOTE: was only for clean exit\n this.setMaskOpacity(prevModalState, 0);\n this.setState({ modalOpenedLog: [] });\n prevModalState.translateY = undefined;\n } else if (nextModalState.id && !this.state.modalOpenedLog.includes(nextModalState.id)) {\n nextModalState.translateY = undefined;\n this.setState((prevState) => ({\n modalOpenedLog: [...prevState.modalOpenedLog, nextModalState.id!],\n }));\n }\n }\n\n onTouchMove = (e: TouchEvent) => {\n if (this.props.exitingModal) {\n return;\n }\n const modalState = this.props.getModalState(this.props.activeModal);\n if (!modalState) {\n return;\n }\n\n if (modalState.type === ModalType.PAGE) {\n return this.onPageTouchMove(e, modalState);\n }\n\n if (modalState.type === ModalType.CARD) {\n return this.onCardTouchMove(e, modalState);\n }\n };\n\n onPageTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { shiftY, originalEvent } = event;\n const target = originalEvent.target as HTMLElement;\n\n if (!event.isY) {\n if (this.viewportRef.current?.contains(target)) {\n originalEvent.preventDefault();\n }\n return;\n }\n\n if (!modalState.innerElement?.contains(target)) {\n return originalEvent.preventDefault();\n }\n\n originalEvent.stopPropagation();\n\n const { expandable, contentScrolled, collapsed, expanded } = modalState;\n\n if (!this.state.touchDown) {\n modalState.touchStartContentScrollTop = modalState.contentElement?.scrollTop ?? 0;\n this.setState({ touchDown: true });\n }\n\n if (contentScrolled) {\n return;\n }\n\n if (modalState.touchMovePositive === null) {\n modalState.touchMovePositive = shiftY > 0;\n }\n\n if (\n !modalState.expandable ||\n collapsed ||\n (expanded && modalState.touchMovePositive && modalState.touchStartContentScrollTop === 0) ||\n modalState.headerElement?.contains(target)\n ) {\n originalEvent.preventDefault();\n\n if ((!expandable && shiftY < 0) || !this.window) {\n return;\n }\n\n !this.state.dragging && this.setState({ dragging: true });\n\n const shiftYPercent = (shiftY / this.window.innerHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 0.8, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = rangeTranslate((modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onCardTouchMove(event: TouchEvent, modalState: ModalsStateEntry) {\n const { originalEvent, shiftY } = event;\n const target = originalEvent.target as HTMLElement;\n if (modalState.innerElement?.contains(target)) {\n if (!this.state.touchDown) {\n this.setState({ touchDown: true, dragging: true });\n }\n\n const shiftYPercent = (shiftY / modalState.innerElement.offsetHeight) * 100;\n const shiftYCurrent = rubber(shiftYPercent, 72, 1.2, this.props.platform !== Platform.IOS);\n\n modalState.touchShiftYPercent = shiftYPercent;\n modalState.translateYCurrent = Math.max(0, (modalState.translateY ?? 0) + shiftYCurrent);\n\n this.animateTranslate(modalState, modalState.translateYCurrent);\n this.setMaskOpacity(modalState);\n }\n }\n\n onTouchEnd = (e: TouchEvent) => {\n const modalState = this.props.getModalState(this.props.activeModal);\n\n if (modalState?.type === ModalType.PAGE) {\n return this.onPageTouchEnd(e, modalState);\n }\n\n if (modalState?.type === ModalType.CARD) {\n return this.onCardTouchEnd(e, modalState);\n }\n };\n\n onPageTouchEnd(event: TouchEvent, modalState: ModalsStateEntry) {\n const { startY, shiftY } = event;\n\n modalState.contentScrolled = false;\n modalState.touchMovePositive = null;\n\n let setStateCallback;\n\n if (this.state.dragging && this.window) {\n const shiftYEndPercent = ((startY + shiftY) / this.window.innerHeight) * 100;\n\n let translateY = modalState.translateYCurrent ?? 0;\n const expectTranslateY =\n (translateY / event.duration) *\n 240 *\n 0.6 *\n ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = rangeTranslate(translateY + expectTranslateY);\n\n if (modalState.settlingHeight !== 100) {\n if (numberInRange(translateY, modalState.expandedRange)) {\n translateY = modalState.expandedRange?.[0] ?? 0;\n } else if (numberInRange(translateY, modalState.collapsedRange)) {\n translateY = modalState.translateYFrom ?? 0;\n } else if (numberInRange(translateY, modalState.hiddenRange)) {\n translateY = 100;\n } else {\n translateY = modalState.translateYFrom ?? 0;\n }\n } else {\n if (numberInRange(translateY, [0, 25])) {\n translateY = 0;\n } else {\n translateY = 100;\n }\n }\n\n if (translateY !== 100 && shiftYEndPercent >= 75) {\n translateY = 100;\n }\n\n modalState.translateY = translateY;\n modalState.translateYCurrent = translateY;\n modalState.collapsed = numberInRange(translateY, modalState.collapsedRange);\n modalState.expanded = translateY === 0;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onCardTouchEnd({ duration }: TouchEvent, modalState: ModalsStateEntry) {\n let setStateCallback;\n\n if (this.state.dragging) {\n let translateY = modalState.translateYCurrent ?? 0;\n\n const expectTranslateY =\n (translateY / duration) * 240 * 0.6 * ((modalState.touchShiftYPercent ?? 0) < 0 ? -1 : 1);\n translateY = Math.max(0, translateY + expectTranslateY);\n\n if (translateY >= 30) {\n translateY = 100;\n } else {\n translateY = 0;\n }\n\n modalState.translateY = translateY;\n modalState.hidden = translateY === 100;\n\n if (modalState.hidden) {\n this.props.onExit();\n }\n\n setStateCallback = () => {\n if (!modalState.hidden) {\n this.animateTranslate(modalState, modalState.translateY);\n }\n\n this.setMaskOpacity(modalState);\n };\n }\n\n this.setState(\n {\n touchDown: false,\n dragging: false,\n },\n setStateCallback,\n );\n }\n\n onScroll = (e: React.SyntheticEvent) => {\n const activeModal = this.props.activeModal;\n\n const target = e.target as HTMLElement;\n\n if (!activeModal) {\n return;\n }\n const modalState = this.props.getModalState(activeModal);\n if (modalState?.type === ModalType.PAGE && modalState?.contentElement?.contains(target)) {\n modalState.contentScrolled = true;\n\n if (modalState.contentScrollStopTimeout) {\n clearTimeout(modalState.contentScrollStopTimeout);\n }\n\n modalState.contentScrollStopTimeout = setTimeout(() => {\n if (modalState.contentScrolled) {\n modalState.contentScrolled = false;\n }\n }, 250);\n }\n };\n\n waitTransitionFinish(modalState: ModalsStateEntry | undefined, eventHandler: () => void) {\n if (transitionEvent.supported) {\n const onceHandler = () => {\n modalState?.innerElement?.removeEventListener(transitionEvent.name as string, onceHandler);\n eventHandler();\n };\n\n modalState?.innerElement?.addEventListener(transitionEvent.name as string, onceHandler);\n } else {\n setTimeout(eventHandler, this.timeout);\n }\n }\n\n /**\n * Анимирует сдвиг модалки\n *\n * @param {ModalsStateEntry} modalState\n * @param {number} percent Процент сдвига: 0 – полностью открыта, 100 – полностью закрыта\n */\n animateTranslate(modalState: ModalsStateEntry, percent: number | undefined) {\n const frameId = `animateTranslateFrame${modalState.id}`;\n\n cancelAnimationFrame(this.frameIds[frameId]);\n\n this.frameIds[frameId] = requestAnimationFrame(() => {\n setTransformStyle(modalState.innerElement, `translate3d(0, ${percent}%, 0)`);\n });\n }\n\n /* Устанавливает прозрачность для полупрозрачной подложки */\n setMaskOpacity(modalState: ModalsStateEntry, forceOpacity: number | null = null) {\n if (forceOpacity === null && this.props.history?.[0] !== modalState.id) {\n return;\n }\n if (this.maskAnimationFrame) {\n cancelAnimationFrame(this.maskAnimationFrame);\n }\n this.maskAnimationFrame = requestAnimationFrame(() => {\n if (this.maskElementRef.current) {\n const { translateY = 0, translateYCurrent = 0 } = modalState;\n\n const opacity =\n forceOpacity === null\n ? 1 - (translateYCurrent - translateY) / (100 - translateY) || 0\n : forceOpacity;\n this.maskElementRef.current.style.opacity = clamp(opacity, 0, 100).toString();\n this.maskElementRef.current.style.transitionDelay =\n opacity && this.props.delayEnter ? `${this.timeout}ms` : '';\n }\n });\n }\n\n render() {\n const { activeModal, exitingModal, enteringModal } = this.props;\n const { touchDown, dragging } = this.state;\n\n if (!activeModal && !exitingModal) {\n return null;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <ModalRootContext.Provider value={this.modalRootContext}>\n <Touch\n className={classNames(\n styles['ModalRoot'],\n this.props.configProvider?.hasCustomPanelHeaderAfter &&\n styles['ModalRoot--hasCustomPanelHeaderAfterSlot'],\n touchDown &&\n classNames(styles['ModalRoot--touched'], 'vkuiInternalModalRoot--touched'),\n !!(enteringModal || exitingModal) &&\n classNames(styles['ModalRoot--switching'], 'vkuiInternalModalRoot--switching'),\n )}\n onMove={this.onTouchMove}\n onEnd={this.onTouchEnd}\n onScroll={this.onScroll}\n >\n <div\n className={styles['ModalRoot__mask']}\n onClick={this.props.onExit}\n ref={this.maskElementRef}\n />\n <div className={styles['ModalRoot__viewport']} ref={this.viewportRef}>\n {this.getModals().map((Modal) => {\n const modalId = getNavId(Modal.props, warn);\n const _modalState = this.props.getModalState(modalId);\n if ((modalId !== activeModal && modalId !== exitingModal) || !_modalState) {\n return null;\n }\n const modalState = { ..._modalState };\n\n const isPage = modalState.type === ModalType.PAGE;\n const key = `modal-${modalId}`;\n\n return (\n <FocusTrap\n key={key}\n getRootRef={(e) => {\n const modalState = this.props.getModalState(modalId);\n if (modalState) {\n modalState.modalElement = e;\n }\n }}\n onClose={this.props.onExit}\n timeout={this.timeout}\n className={classNames(\n styles['ModalRoot__modal'],\n\n dragging && 'vkuiInternalModalRoot__modal--dragging',\n\n isPage && modalState.expandable && 'vkuiInternalModalRoot__modal--expandable',\n isPage && modalState.collapsed && 'vkuiInternalModalRoot__modal--collapsed',\n )}\n restoreFocus={false}\n >\n {Modal}\n </FocusTrap>\n );\n })}\n </div>\n </Touch>\n </ModalRootContext.Provider>\n </TouchRootContext.Provider>\n );\n }\n}\n\nexport const ModalRootTouch = withContext(\n withPlatform(\n withDOM<ModalRootWithDOMProps>(withModalManager(initModal)(ModalRootTouchComponent)),\n ),\n ConfigProviderContext,\n 'configProvider',\n);\n\n/**\n * Инициализирует модалку перед анимацией открытия\n */\nfunction initModal(modalState: ModalsStateEntry) {\n switch (modalState.type) {\n case ModalType.PAGE:\n modalState.settlingHeight = modalState.settlingHeight || MODAL_PAGE_DEFAULT_PERCENT_HEIGHT;\n return initPageModal(modalState);\n case ModalType.CARD:\n return initCardModal(modalState);\n default:\n process.env.NODE_ENV === 'development' &&\n warn(`initActiveModal: modalState.type=\"${modalState.type}\" не поддерживается`, 'error');\n }\n}\n\nfunction initPageModal(modalState: ModalsStateEntry) {\n const { contentElement, bottomInset } = modalState;\n const contentElementHeight = (contentElement?.firstElementChild as HTMLElement).scrollHeight;\n const bottomInsetHeight = bottomInset?.offsetHeight || 0;\n const contentHeight = contentElementHeight + bottomInsetHeight;\n let prevTranslateY = modalState.translateY;\n\n modalState.expandable =\n contentHeight > (contentElement?.clientHeight ?? 0) ||\n modalState.settlingHeight === 100 ||\n modalState.expanded;\n\n let collapsed = false;\n let expanded = false;\n let translateYFrom;\n let translateY;\n let expandedRange: TranslateRange;\n let collapsedRange: TranslateRange | undefined;\n let hiddenRange: TranslateRange;\n\n const hasCollapsedState = Boolean(modalState.expandable && modalState.settlingHeight !== 100);\n if (modalState.expandable) {\n translateYFrom = 100 - (modalState.settlingHeight ?? 0);\n\n const shiftHalf = translateYFrom / 2;\n const visiblePart = 100 - translateYFrom;\n\n expandedRange = [0, shiftHalf];\n collapsedRange = hasCollapsedState ? [shiftHalf, translateYFrom + visiblePart / 4] : undefined;\n hiddenRange = [translateYFrom + visiblePart / 4, 100];\n\n collapsed = hasCollapsedState && translateYFrom > 0;\n expanded = translateYFrom <= 0;\n translateY = translateYFrom;\n } else {\n const headerHeight = modalState.headerElement?.offsetHeight ?? 0;\n const height = contentHeight + headerHeight;\n\n translateYFrom =\n 100 - (height / (modalState.innerElement?.parentElement?.offsetHeight ?? 0)) * 100;\n translateY = translateYFrom;\n\n expandedRange = [translateY, translateY + 25];\n collapsedRange = undefined;\n hiddenRange = [translateY + 25, translateY + 100];\n }\n\n // Если модалка может открываться на весь экран, и новый сдвиг больше предыдущего, то откроем её на весь экран\n if (\n (modalState.expandable && translateY > (prevTranslateY ?? 100)) ||\n modalState.settlingHeight === 100\n ) {\n translateY = 0;\n }\n\n // Если модалка уже раскрыта обновляем состояния\n if (translateY === 0) {\n expanded = true;\n collapsed = false;\n }\n\n modalState.expandedRange = expandedRange;\n modalState.collapsedRange = collapsedRange;\n modalState.hiddenRange = hiddenRange;\n modalState.translateY = translateY;\n modalState.translateYFrom = translateYFrom;\n modalState.collapsed = collapsed;\n modalState.expanded = expanded;\n}\n\nfunction initCardModal(modalState: ModalsStateEntry) {\n modalState.translateY = 0;\n}\n"],"names":["ModalRootTouch","warn","warnOnce","numberInRange","number","range","rangeTranslate","clamp","ModalRootTouchComponent","props","documentScrolling","maskElementRef","viewportRef","React","createRef","maskAnimationFrame","undefined","modalRootContext","frameIds","restoreFocusTo","preventTouch","event","originalEvent","preventDefault","updateModalHeight","modalState","getModalState","activeModal","type","ModalType","PAGE","enteringModal","waitTransitionFinish","requestAnimationFrame","checkPageContentHeight","onTouchMove","e","exitingModal","onPageTouchMove","CARD","onCardTouchMove","onTouchEnd","onPageTouchEnd","onCardTouchEnd","onScroll","target","contentElement","contains","contentScrolled","contentScrollStopTimeout","clearTimeout","setTimeout","state","touchDown","dragging","modalOpenedLog","registerModal","id","data","Object","assign","onClose","onExit","isInsideModal","timeout","platform","Platform","IOS","document","window","getModals","Children","toArray","children","componentDidMount","addEventListener","componentWillUnmount","toggleDocumentScrolling","removeEventListener","componentDidUpdate","prevProps","closeModal","enteringState","onEnter","innerElement","style","transitionDelay","onEntered","delayEnter","animateTranslate","translateY","setMaskOpacity","activeElement","focus","enabled","documentElement","classList","remove","passive","add","modalElement","prevModalState","initPageModal","currentModalState","needAnimate","expandable","translateYFrom","setState","length","prevState","nextModalState","nextIsPage","prevIsPage","onExited","exitTranslate","isBack","includes","shiftY","isY","current","stopPropagation","collapsed","expanded","touchStartContentScrollTop","scrollTop","touchMovePositive","headerElement","shiftYPercent","innerHeight","shiftYCurrent","rubber","touchShiftYPercent","translateYCurrent","offsetHeight","Math","max","startY","setStateCallback","shiftYEndPercent","expectTranslateY","duration","settlingHeight","expandedRange","collapsedRange","hiddenRange","hidden","eventHandler","transitionEvent","supported","onceHandler","name","percent","frameId","cancelAnimationFrame","setTransformStyle","forceOpacity","history","opacity","toString","render","TouchRootContext","Provider","value","ModalRootContext","Touch","className","classNames","configProvider","hasCustomPanelHeaderAfter","onMove","onEnd","div","onClick","ref","map","Modal","modalId","getNavId","_modalState","isPage","key","FocusTrap","getRootRef","restoreFocus","Component","withContext","withPlatform","withDOM","withModalManager","initModal","ConfigProviderContext","MODAL_PAGE_DEFAULT_PERCENT_HEIGHT","initCardModal","process","env","NODE_ENV","bottomInset","contentElementHeight","firstElementChild","scrollHeight","bottomInsetHeight","contentHeight","prevTranslateY","clientHeight","hasCollapsedState","Boolean","shiftHalf","visiblePart","headerHeight","height","parentElement"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"PullToRefresh.d.ts","sourceRoot":"","sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,QAAQ,EAAU,MAAM,eAAe,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAa,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAqB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqB/D,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,EAAE,UAAU,EAAE,WAAW;IAC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,EAAE,WAAW,CAAC;IACvB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;AAOD;;GAEG;AACH,eAAO,MAAM,aAAa,iEAMvB,kBAAkB,sBAiOpB,CAAC"}
1
+ {"version":3,"file":"PullToRefresh.d.ts","sourceRoot":"","sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAO/B,OAAO,EAAE,QAAQ,EAAU,MAAM,eAAe,CAAC;AAKjD,OAAO,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AACvD,OAAO,EAAE,sBAAsB,EAAa,MAAM,0BAA0B,CAAC;AAE7E,OAAO,EAAqB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAqB/D,MAAM,WAAW,kBAAmB,SAAQ,QAAQ,EAAE,UAAU,EAAE,WAAW;IAC3E;;;;;;;;;;;;;;;;;;;;;;;;;;;OA2BG;IACH,SAAS,EAAE,WAAW,CAAC;IACvB;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,cAAc;IACd,MAAM,CAAC,EAAE,sBAAsB,CAAC;CACjC;AAOD;;GAEG;AACH,eAAO,MAAM,aAAa,iEAMvB,kBAAkB,sBAgPpB,CAAC"}
@@ -172,6 +172,10 @@ var PullToRefresh = function(_param) {
172
172
  }
173
173
  setTouchDown(true);
174
174
  startYRef.current = e.startY;
175
+ if (document) {
176
+ // eslint-disable-next-line no-restricted-properties
177
+ document.documentElement.classList.add("vkui--disable-overscroll-behavior");
178
+ }
175
179
  };
176
180
  var shouldPreventTouchMove = function(event) {
177
181
  if (watching || refreshing) {
@@ -180,7 +184,11 @@ var PullToRefresh = function(_param) {
180
184
  /* Нам нужно запретить touchmove у документа как только стало понятно, что
181
185
  * начинается pull.
182
186
  * состояния watching и refreshing устанавливаются слишком поздно и браузер
183
- * может успеть начать нативный pull to refresh. */ var shiftY = (0, _touch.coordY)(event) - startYRef.current;
187
+ * может успеть начать нативный pull to refresh.
188
+ *
189
+ * Этот код является запасным вариантом, на случай, если css свойство
190
+ * overscroll-behavior не поддерживается
191
+ * */ var shiftY = (0, _touch.coordY)(event) - startYRef.current;
184
192
  var pageYOffset = scroll === null || scroll === void 0 ? void 0 : scroll.getScroll().y;
185
193
  var isRefreshGestureStarted = pageYOffset === 0 && shiftY > 0 && touchDown;
186
194
  return isRefreshGestureStarted;
@@ -220,6 +228,11 @@ var PullToRefresh = function(_param) {
220
228
  var onTouchEnd = function() {
221
229
  setWatching(false);
222
230
  setTouchDown(false);
231
+ // восстанавливаем overscroll behavior
232
+ if (document) {
233
+ // eslint-disable-next-line no-restricted-properties
234
+ document.documentElement.classList.remove("vkui--disable-overscroll-behavior");
235
+ }
223
236
  };
224
237
  var spinnerTransform = "translate3d(0, ".concat(spinnerY, "px, 0)");
225
238
  var contentTransform = "";
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { DOMProps, useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { runTapticImpactOccurred } from '../../lib/taptic';\nimport { coordY, VKUITouchEvent } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { AnyFunction, HasChildren } from '../../types';\nimport { ScrollContextInterface, useScroll } from '../AppRoot/ScrollContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { PullToRefreshSpinner } from './PullToRefreshSpinner';\nimport styles from './PullToRefresh.module.css';\n\nfunction cancelEvent(event: any) {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault && event.cancelable) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n return false;\n}\n\nexport interface PullToRefreshProps extends DOMProps, TouchProps, HasChildren {\n /**\n * Будет вызвана для обновления контента (прим.: функция должна быть мемоизированным коллбэком)\n *\n * > ⚠️ **Для разработчиков VK Mini Apps**\n * >\n * > Сейчас метод под конец выполнения вызывает `runTapticImpactOccurred()`.\n * >\n * > В **v6** нужно будет самостоятельно вызывать эту функцию в вашем обработчике `onRefresh()`.\n * > (см. https://github.com/VKCOM/VKUI/issues/5049). Функцию можете импортировать её из\n * > бибилиотеки `@vkontakte/vk-bridge-react`.\n * >\n * > Чтобы подготовить ваше мини-приложение к обновлению до **v6**, в рамках **v5** вы уже можете\n * > вызывать `runTapticImpactOccurred()`, но с одним условием: вы должны вернуть результат\n * > выполнения функции, чтобы исключить двойной вызов. Результат функции — `boolean`. Если\n * > вернётся `true`, значит, вызывать `runTapticImpactOccurred()` снова со стороны **VKUI** —\n * > не нужно.\n * >\n * > ```jsx\n * > const onRefresh = React.useCallback(() => {\n * > // ...\n * > return runTapticImpactOccurred();\n * > }, []);\n * >\n * > // <PullToRefresh onRefresh={onRefresh} />\n * > ```\n * >\n * > Соответственно, в **v6** ничего возвращать уже не потребуется.\n */\n onRefresh: AnyFunction;\n /**\n * Определяет, выполняется ли обновление. Для скрытия спиннера после получения контента необходимо передать `false`\n */\n isFetching?: boolean;\n /** @ignore */\n scroll?: ScrollContextInterface;\n}\n\nconst TOUCH_MOVE_EVENT_PARAMS = {\n cancelable: true,\n passive: false,\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PullToRefresh\n */\nexport const PullToRefresh = ({\n children,\n isFetching,\n onRefresh,\n className,\n ...restProps\n}: PullToRefreshProps) => {\n const platform = usePlatform();\n const scroll = useScroll();\n const { document } = useDOM();\n const prevIsFetching = usePrevious(isFetching);\n\n const initParams = React.useMemo(\n () => ({\n start: platform === Platform.IOS ? -10 : -45,\n max: platform === Platform.IOS ? 50 : 80,\n maxY: platform === Platform.IOS ? 400 : 80,\n refreshing: platform === Platform.IOS ? 36 : 50,\n positionMultiplier: platform === Platform.IOS ? 0.21 : 1,\n }),\n [platform],\n );\n\n const [spinnerY, setSpinnerY] = React.useState(initParams.start);\n const [watching, setWatching] = React.useState(false);\n const [refreshing, setRefreshing] = React.useState(false);\n const [canRefresh, setCanRefresh] = React.useState(false);\n const [touchDown, setTouchDown] = React.useState(false);\n const prevTouchDown = usePrevious(touchDown);\n\n const touchY = React.useRef(0);\n const [contentShift, setContentShift] = React.useState(0);\n const [spinnerProgress, setSpinnerProgress] = React.useState(0);\n\n const resetRefreshingState = React.useCallback(() => {\n setWatching(false);\n setCanRefresh(false);\n setRefreshing(false);\n setSpinnerY(initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }, [initParams]);\n\n const onRefreshingFinish = React.useCallback(() => {\n if (!touchDown) {\n resetRefreshingState();\n }\n }, [touchDown, resetRefreshingState]);\n\n const { set: setWaitFetchingTimeout, clear: clearWaitFetchingTimeout } = useTimeout(\n onRefreshingFinish,\n 1000,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && prevIsFetching && !isFetching) {\n onRefreshingFinish();\n }\n }, [prevIsFetching, isFetching, onRefreshingFinish]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && !prevIsFetching && isFetching) {\n clearWaitFetchingTimeout();\n }\n }, [isFetching, prevIsFetching, clearWaitFetchingTimeout]);\n\n const runRefreshing = React.useCallback(() => {\n if (!refreshing && onRefresh) {\n // cleanup if the consumer does not start fetching in 1s\n setWaitFetchingTimeout();\n\n setRefreshing(true);\n setSpinnerY((prevSpinnerY) =>\n platform === Platform.IOS ? prevSpinnerY : initParams.refreshing,\n );\n\n const runTapticImpactOccurredCalled = onRefresh();\n // TODO [>=6]: удалить блок кода (#5049)\n if (!runTapticImpactOccurredCalled) {\n runTapticImpactOccurred('light');\n }\n }\n }, [refreshing, onRefresh, setWaitFetchingTimeout, platform, initParams.refreshing]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevTouchDown !== undefined && prevTouchDown && !touchDown) {\n if (!refreshing && canRefresh) {\n runRefreshing();\n } else if (refreshing && !isFetching) {\n // only iOS can start refresh before gesture end\n resetRefreshingState();\n } else {\n // refreshing && isFetching: refresh in progress\n // OR !refreshing && !canRefresh: pull was not strong enough\n setSpinnerY(refreshing ? initParams.refreshing : initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }\n }\n }, [\n initParams,\n prevIsFetching,\n isFetching,\n onRefreshingFinish,\n prevTouchDown,\n touchDown,\n refreshing,\n canRefresh,\n runRefreshing,\n ]);\n\n const startYRef = React.useRef(0);\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshing) {\n cancelEvent(e);\n }\n setTouchDown(true);\n startYRef.current = e.startY;\n };\n\n const shouldPreventTouchMove = (event: VKUITouchEvent) => {\n if (watching || refreshing) {\n return true;\n }\n\n /* Нам нужно запретить touchmove у документа как только стало понятно, что\n * начинается pull.\n * состояния watching и refreshing устанавливаются слишком поздно и браузер\n * может успеть начать нативный pull to refresh. */\n const shiftY = coordY(event) - startYRef.current;\n const pageYOffset = scroll?.getScroll().y;\n const isRefreshGestureStarted = pageYOffset === 0 && shiftY > 0 && touchDown;\n return isRefreshGestureStarted;\n };\n\n const onWindowTouchMove = (event: VKUITouchEvent) => {\n if (shouldPreventTouchMove(event)) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);\n\n const onTouchMove = (e: TouchEvent) => {\n const { isY, shiftY } = e;\n const { start, max } = initParams;\n const pageYOffset = scroll?.getScroll().y;\n\n if (watching && touchDown) {\n cancelEvent(e);\n\n const { positionMultiplier, maxY } = initParams;\n\n const shift = Math.max(0, shiftY - touchY.current);\n\n const currentY = clamp(start + shift * positionMultiplier, start, maxY);\n const progress = currentY > -10 ? Math.abs((currentY + 10) / max) * 80 : 0;\n\n setSpinnerY(currentY);\n setSpinnerProgress(clamp(progress, 0, 80));\n setCanRefresh(progress > 80);\n setContentShift((currentY + 10) * 2.3);\n\n if (progress > 85 && !refreshing && platform === Platform.IOS) {\n runRefreshing();\n }\n } else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {\n cancelEvent(e);\n\n touchY.current = shiftY;\n setWatching(true);\n setSpinnerY(start);\n setSpinnerProgress(0);\n }\n };\n\n const onTouchEnd = () => {\n setWatching(false);\n setTouchDown(false);\n };\n\n const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;\n let contentTransform = '';\n\n if (platform === Platform.IOS && refreshing && !touchDown) {\n contentTransform = 'translate3d(0, 100px, 0)';\n } else if (platform === Platform.IOS && (contentShift || refreshing)) {\n contentTransform = `translate3d(0, ${contentShift}px, 0)`;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <Touch\n {...restProps}\n onStart={onTouchStart}\n onMove={onTouchMove}\n onEnd={onTouchEnd}\n className={classNames(\n styles['PullToRefresh'],\n platform === Platform.IOS && styles['PullToRefresh--ios'],\n watching && styles['PullToRefresh--watching'],\n refreshing && styles['PullToRefresh--refreshing'],\n className,\n )}\n >\n <FixedLayout className={styles['PullToRefresh__controls']} useParentWidth>\n <PullToRefreshSpinner\n style={{\n transform: spinnerTransform,\n WebkitTransform: spinnerTransform,\n opacity: watching || refreshing || canRefresh ? 1 : 0,\n }}\n on={refreshing}\n progress={refreshing ? undefined : spinnerProgress}\n />\n </FixedLayout>\n\n <div\n className={styles['PullToRefresh__content']}\n style={{\n transform: contentTransform,\n WebkitTransform: contentTransform,\n }}\n >\n {children}\n </div>\n </Touch>\n </TouchRootContext.Provider>\n );\n};\n"],"names":["PullToRefresh","cancelEvent","event","originalEvent","preventDefault","cancelable","stopPropagation","TOUCH_MOVE_EVENT_PARAMS","passive","children","isFetching","onRefresh","className","restProps","platform","usePlatform","scroll","useScroll","document","useDOM","prevIsFetching","usePrevious","initParams","React","useMemo","start","Platform","IOS","max","maxY","refreshing","positionMultiplier","useState","spinnerY","setSpinnerY","watching","setWatching","setRefreshing","canRefresh","setCanRefresh","touchDown","setTouchDown","prevTouchDown","touchY","useRef","contentShift","setContentShift","spinnerProgress","setSpinnerProgress","resetRefreshingState","useCallback","onRefreshingFinish","useTimeout","set","setWaitFetchingTimeout","clear","clearWaitFetchingTimeout","useIsomorphicLayoutEffect","undefined","runRefreshing","prevSpinnerY","runTapticImpactOccurredCalled","runTapticImpactOccurred","startYRef","onTouchStart","e","current","startY","shouldPreventTouchMove","shiftY","coordY","pageYOffset","getScroll","y","isRefreshGestureStarted","onWindowTouchMove","useGlobalEventListener","onTouchMove","isY","shift","Math","currentY","clamp","progress","abs","onTouchEnd","spinnerTransform","contentTransform","TouchRootContext","Provider","value","Touch","onStart","onMove","onEnd","classNames","FixedLayout","useParentWidth","PullToRefreshSpinner","style","transform","WebkitTransform","opacity","on","div"],"mappings":";;;;+BAkFaA;;;eAAAA;;;;;;;;;+DAlFU;oBACI;oBACL;sCACiB;2BACX;2BACA;0BACD;mBACM;wBACR;sBACe;qBACD;yCACG;6BAEQ;2BACtB;qBACkB;qEACjB;oCACQ;AAGrC,SAASC,YAAYC,KAAU;IAC7B,IAAI,CAACA,OAAO;QACV,OAAO;IACT;IACA,MAAOA,MAAMC,aAAa,CAAE;QAC1BD,QAAQA,MAAMC,aAAa;IAC7B;IACA,IAAID,MAAME,cAAc,IAAIF,MAAMG,UAAU,EAAE;QAC5CH,MAAME,cAAc;IACtB;IACA,IAAIF,MAAMI,eAAe,EAAE;QACzBJ,MAAMI,eAAe;IACvB;IACA,OAAO;AACT;AAwCA,IAAMC,0BAA0B;IAC9BF,YAAY;IACZG,SAAS;AACX;AAKO,IAAMR,gBAAgB;QAC3BS,kBAAAA,UACAC,oBAAAA,YACAC,mBAAAA,WACAC,mBAAAA,WACGC;QAJHJ;QACAC;QACAC;QACAC;;IAGA,IAAME,WAAWC,IAAAA,wBAAW;IAC5B,IAAMC,SAASC,IAAAA,wBAAS;IACxB,IAAM,AAAEC,WAAaC,IAAAA,WAAM,IAAnBD;IACR,IAAME,iBAAiBC,IAAAA,wBAAW,EAACX;IAEnC,IAAMY,aAAaC,OAAMC,OAAO,CAC9B;eAAO;YACLC,OAAOX,aAAaY,kBAAQ,CAACC,GAAG,GAAG,CAAC,KAAK,CAAC;YAC1CC,KAAKd,aAAaY,kBAAQ,CAACC,GAAG,GAAG,KAAK;YACtCE,MAAMf,aAAaY,kBAAQ,CAACC,GAAG,GAAG,MAAM;YACxCG,YAAYhB,aAAaY,kBAAQ,CAACC,GAAG,GAAG,KAAK;YAC7CI,oBAAoBjB,aAAaY,kBAAQ,CAACC,GAAG,GAAG,OAAO;QACzD;OACA;QAACb;KAAS;IAGZ,IAAgCS,qCAAAA,OAAMS,QAAQ,CAACV,WAAWG,KAAK,OAAxDQ,WAAyBV,oBAAfW,cAAeX;IAChC,IAAgCA,sCAAAA,OAAMS,QAAQ,CAAC,YAAxCG,WAAyBZ,qBAAfa,cAAeb;IAChC,IAAoCA,sCAAAA,OAAMS,QAAQ,CAAC,YAA5CF,aAA6BP,qBAAjBc,gBAAiBd;IACpC,IAAoCA,sCAAAA,OAAMS,QAAQ,CAAC,YAA5CM,aAA6Bf,qBAAjBgB,gBAAiBhB;IACpC,IAAkCA,sCAAAA,OAAMS,QAAQ,CAAC,YAA1CQ,YAA2BjB,qBAAhBkB,eAAgBlB;IAClC,IAAMmB,gBAAgBrB,IAAAA,wBAAW,EAACmB;IAElC,IAAMG,SAASpB,OAAMqB,MAAM,CAAC;IAC5B,IAAwCrB,sCAAAA,OAAMS,QAAQ,CAAC,QAAhDa,eAAiCtB,qBAAnBuB,kBAAmBvB;IACxC,IAA8CA,sCAAAA,OAAMS,QAAQ,CAAC,QAAtDe,kBAAuCxB,qBAAtByB,qBAAsBzB;IAE9C,IAAM0B,uBAAuB1B,OAAM2B,WAAW,CAAC;QAC7Cd,YAAY;QACZG,cAAc;QACdF,cAAc;QACdH,YAAYZ,WAAWG,KAAK;QAC5BuB,mBAAmB;QACnBF,gBAAgB;IAClB,GAAG;QAACxB;KAAW;IAEf,IAAM6B,qBAAqB5B,OAAM2B,WAAW,CAAC;QAC3C,IAAI,CAACV,WAAW;YACdS;QACF;IACF,GAAG;QAACT;QAAWS;KAAqB;IAEpC,IAAyEG,eAAAA,IAAAA,sBAAU,EACjFD,oBACA,OAFME,AAAKC,yBAA4DF,aAAjEC,KAA6BE,AAAOC,2BAA6BJ,aAApCG;IAKrCE,IAAAA,oDAAyB,EAAC;QACxB,IAAIrC,mBAAmBsC,aAAatC,kBAAkB,CAACV,YAAY;YACjEyC;QACF;IACF,GAAG;QAAC/B;QAAgBV;QAAYyC;KAAmB;IAEnDM,IAAAA,oDAAyB,EAAC;QACxB,IAAIrC,mBAAmBsC,aAAa,CAACtC,kBAAkBV,YAAY;YACjE8C;QACF;IACF,GAAG;QAAC9C;QAAYU;QAAgBoC;KAAyB;IAEzD,IAAMG,gBAAgBpC,OAAM2B,WAAW,CAAC;QACtC,IAAI,CAACpB,cAAcnB,WAAW;YAC5B,wDAAwD;YACxD2C;YAEAjB,cAAc;YACdH,YAAY,SAAC0B;uBACX9C,aAAaY,kBAAQ,CAACC,GAAG,GAAGiC,eAAetC,WAAWQ,UAAU;;YAGlE,IAAM+B,gCAAgClD;YACtC,wCAAwC;YACxC,IAAI,CAACkD,+BAA+B;gBAClCC,IAAAA,+BAAuB,EAAC;YAC1B;QACF;IACF,GAAG;QAAChC;QAAYnB;QAAW2C;QAAwBxC;QAAUQ,WAAWQ,UAAU;KAAC;IAEnF2B,IAAAA,oDAAyB,EAAC;QACxB,IAAIf,kBAAkBgB,aAAahB,iBAAiB,CAACF,WAAW;YAC9D,IAAI,CAACV,cAAcQ,YAAY;gBAC7BqB;YACF,OAAO,IAAI7B,cAAc,CAACpB,YAAY;gBACpC,gDAAgD;gBAChDuC;YACF,OAAO;gBACL,gDAAgD;gBAChD,4DAA4D;gBAC5Df,YAAYJ,aAAaR,WAAWQ,UAAU,GAAGR,WAAWG,KAAK;gBACjEuB,mBAAmB;gBACnBF,gBAAgB;YAClB;QACF;IACF,GAAG;QACDxB;QACAF;QACAV;QACAyC;QACAT;QACAF;QACAV;QACAQ;QACAqB;KACD;IAED,IAAMI,YAAYxC,OAAMqB,MAAM,CAAC;IAE/B,IAAMoB,eAAe,SAACC;QACpB,IAAInC,YAAY;YACd7B,YAAYgE;QACd;QACAxB,aAAa;QACbsB,UAAUG,OAAO,GAAGD,EAAEE,MAAM;IAC9B;IAEA,IAAMC,yBAAyB,SAAClE;QAC9B,IAAIiC,YAAYL,YAAY;YAC1B,OAAO;QACT;QAEA;;;qDAGiD,GACjD,IAAMuC,SAASC,IAAAA,aAAM,EAACpE,SAAS6D,UAAUG,OAAO;QAChD,IAAMK,cAAcvD,mBAAAA,6BAAAA,OAAQwD,SAAS,GAAGC,CAAC;QACzC,IAAMC,0BAA0BH,gBAAgB,KAAKF,SAAS,KAAK7B;QACnE,OAAOkC;IACT;IAEA,IAAMC,oBAAoB,SAACzE;QACzB,IAAIkE,uBAAuBlE,QAAQ;YACjCA,MAAME,cAAc;YACpBF,MAAMI,eAAe;QACvB;IACF;IAEAsE,IAAAA,8CAAsB,EAAC1D,UAAU,aAAayD,mBAAmBpE;IAEjE,IAAMsE,cAAc,SAACZ;QACnB,IAAQa,MAAgBb,EAAhBa,KAAKT,SAAWJ,EAAXI;QACb,IAAQ5C,QAAeH,WAAfG,OAAOG,MAAQN,WAARM;QACf,IAAM2C,cAAcvD,mBAAAA,6BAAAA,OAAQwD,SAAS,GAAGC,CAAC;QAEzC,IAAItC,YAAYK,WAAW;YACzBvC,YAAYgE;YAEZ,IAAQlC,qBAA6BT,WAA7BS,oBAAoBF,OAASP,WAATO;YAE5B,IAAMkD,QAAQC,KAAKpD,GAAG,CAAC,GAAGyC,SAAS1B,OAAOuB,OAAO;YAEjD,IAAMe,WAAWC,IAAAA,WAAK,EAACzD,QAAQsD,QAAQhD,oBAAoBN,OAAOI;YAClE,IAAMsD,WAAWF,WAAW,CAAC,KAAKD,KAAKI,GAAG,CAAC,AAACH,CAAAA,WAAW,EAAC,IAAKrD,OAAO,KAAK;YAEzEM,YAAY+C;YACZjC,mBAAmBkC,IAAAA,WAAK,EAACC,UAAU,GAAG;YACtC5C,cAAc4C,WAAW;YACzBrC,gBAAgB,AAACmC,CAAAA,WAAW,EAAC,IAAK;YAElC,IAAIE,WAAW,MAAM,CAACrD,cAAchB,aAAaY,kBAAQ,CAACC,GAAG,EAAE;gBAC7DgC;YACF;QACF,OAAO,IAAImB,OAAOP,gBAAgB,KAAKF,SAAS,KAAK,CAACvC,cAAcU,WAAW;YAC7EvC,YAAYgE;YAEZtB,OAAOuB,OAAO,GAAGG;YACjBjC,YAAY;YACZF,YAAYT;YACZuB,mBAAmB;QACrB;IACF;IAEA,IAAMqC,aAAa;QACjBjD,YAAY;QACZK,aAAa;IACf;IAEA,IAAM6C,mBAAmB,AAAC,kBAA0B,OAATrD,UAAS;IACpD,IAAIsD,mBAAmB;IAEvB,IAAIzE,aAAaY,kBAAQ,CAACC,GAAG,IAAIG,cAAc,CAACU,WAAW;QACzD+C,mBAAmB;IACrB,OAAO,IAAIzE,aAAaY,kBAAQ,CAACC,GAAG,IAAKkB,CAAAA,gBAAgBf,UAAS,GAAI;QACpEyD,mBAAmB,AAAC,kBAA8B,OAAb1C,cAAa;IACpD;IAEA,qBACE,qBAAC2C,qBAAgB,CAACC,QAAQ;QAACC,OAAO;qBAChC,qBAACC,YAAK,8CACA9E;QACJ+E,SAAS5B;QACT6B,QAAQhB;QACRiB,OAAOT;QACPzE,WAAWmF,IAAAA,gBAAU,uBAEnBjF,aAAaY,kBAAQ,CAACC,GAAG,8BACzBQ,2CACAL,+CACAlB;sBAGF,qBAACoF,wBAAW;QAACpF,SAAS;QAAqCqF,gBAAAA;qBACzD,qBAACC,0CAAoB;QACnBC,OAAO;YACLC,WAAWd;YACXe,iBAAiBf;YACjBgB,SAASnE,YAAYL,cAAcQ,aAAa,IAAI;QACtD;QACAiE,IAAIzE;QACJqD,UAAUrD,aAAa4B,YAAYX;uBAIvC,qBAACyD;QACC5F,SAAS;QACTuF,OAAO;YACLC,WAAWb;YACXc,iBAAiBd;QACnB;OAEC9E;AAKX"}
1
+ {"version":3,"sources":["../../../../src/components/PullToRefresh/PullToRefresh.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { clamp } from '../../helpers/math';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { usePrevious } from '../../hooks/usePrevious';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { DOMProps, useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport { runTapticImpactOccurred } from '../../lib/taptic';\nimport { coordY, VKUITouchEvent } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport { AnyFunction, HasChildren } from '../../types';\nimport { ScrollContextInterface, useScroll } from '../AppRoot/ScrollContext';\nimport { FixedLayout } from '../FixedLayout/FixedLayout';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport { PullToRefreshSpinner } from './PullToRefreshSpinner';\nimport styles from './PullToRefresh.module.css';\n\nfunction cancelEvent(event: any) {\n if (!event) {\n return false;\n }\n while (event.originalEvent) {\n event = event.originalEvent;\n }\n if (event.preventDefault && event.cancelable) {\n event.preventDefault();\n }\n if (event.stopPropagation) {\n event.stopPropagation();\n }\n return false;\n}\n\nexport interface PullToRefreshProps extends DOMProps, TouchProps, HasChildren {\n /**\n * Будет вызвана для обновления контента (прим.: функция должна быть мемоизированным коллбэком)\n *\n * > ⚠️ **Для разработчиков VK Mini Apps**\n * >\n * > Сейчас метод под конец выполнения вызывает `runTapticImpactOccurred()`.\n * >\n * > В **v6** нужно будет самостоятельно вызывать эту функцию в вашем обработчике `onRefresh()`.\n * > (см. https://github.com/VKCOM/VKUI/issues/5049). Функцию можете импортировать её из\n * > бибилиотеки `@vkontakte/vk-bridge-react`.\n * >\n * > Чтобы подготовить ваше мини-приложение к обновлению до **v6**, в рамках **v5** вы уже можете\n * > вызывать `runTapticImpactOccurred()`, но с одним условием: вы должны вернуть результат\n * > выполнения функции, чтобы исключить двойной вызов. Результат функции — `boolean`. Если\n * > вернётся `true`, значит, вызывать `runTapticImpactOccurred()` снова со стороны **VKUI** —\n * > не нужно.\n * >\n * > ```jsx\n * > const onRefresh = React.useCallback(() => {\n * > // ...\n * > return runTapticImpactOccurred();\n * > }, []);\n * >\n * > // <PullToRefresh onRefresh={onRefresh} />\n * > ```\n * >\n * > Соответственно, в **v6** ничего возвращать уже не потребуется.\n */\n onRefresh: AnyFunction;\n /**\n * Определяет, выполняется ли обновление. Для скрытия спиннера после получения контента необходимо передать `false`\n */\n isFetching?: boolean;\n /** @ignore */\n scroll?: ScrollContextInterface;\n}\n\nconst TOUCH_MOVE_EVENT_PARAMS = {\n cancelable: true,\n passive: false,\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PullToRefresh\n */\nexport const PullToRefresh = ({\n children,\n isFetching,\n onRefresh,\n className,\n ...restProps\n}: PullToRefreshProps) => {\n const platform = usePlatform();\n const scroll = useScroll();\n const { document } = useDOM();\n const prevIsFetching = usePrevious(isFetching);\n\n const initParams = React.useMemo(\n () => ({\n start: platform === Platform.IOS ? -10 : -45,\n max: platform === Platform.IOS ? 50 : 80,\n maxY: platform === Platform.IOS ? 400 : 80,\n refreshing: platform === Platform.IOS ? 36 : 50,\n positionMultiplier: platform === Platform.IOS ? 0.21 : 1,\n }),\n [platform],\n );\n\n const [spinnerY, setSpinnerY] = React.useState(initParams.start);\n const [watching, setWatching] = React.useState(false);\n const [refreshing, setRefreshing] = React.useState(false);\n const [canRefresh, setCanRefresh] = React.useState(false);\n const [touchDown, setTouchDown] = React.useState(false);\n const prevTouchDown = usePrevious(touchDown);\n\n const touchY = React.useRef(0);\n const [contentShift, setContentShift] = React.useState(0);\n const [spinnerProgress, setSpinnerProgress] = React.useState(0);\n\n const resetRefreshingState = React.useCallback(() => {\n setWatching(false);\n setCanRefresh(false);\n setRefreshing(false);\n setSpinnerY(initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }, [initParams]);\n\n const onRefreshingFinish = React.useCallback(() => {\n if (!touchDown) {\n resetRefreshingState();\n }\n }, [touchDown, resetRefreshingState]);\n\n const { set: setWaitFetchingTimeout, clear: clearWaitFetchingTimeout } = useTimeout(\n onRefreshingFinish,\n 1000,\n );\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && prevIsFetching && !isFetching) {\n onRefreshingFinish();\n }\n }, [prevIsFetching, isFetching, onRefreshingFinish]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevIsFetching !== undefined && !prevIsFetching && isFetching) {\n clearWaitFetchingTimeout();\n }\n }, [isFetching, prevIsFetching, clearWaitFetchingTimeout]);\n\n const runRefreshing = React.useCallback(() => {\n if (!refreshing && onRefresh) {\n // cleanup if the consumer does not start fetching in 1s\n setWaitFetchingTimeout();\n\n setRefreshing(true);\n setSpinnerY((prevSpinnerY) =>\n platform === Platform.IOS ? prevSpinnerY : initParams.refreshing,\n );\n\n const runTapticImpactOccurredCalled = onRefresh();\n // TODO [>=6]: удалить блок кода (#5049)\n if (!runTapticImpactOccurredCalled) {\n runTapticImpactOccurred('light');\n }\n }\n }, [refreshing, onRefresh, setWaitFetchingTimeout, platform, initParams.refreshing]);\n\n useIsomorphicLayoutEffect(() => {\n if (prevTouchDown !== undefined && prevTouchDown && !touchDown) {\n if (!refreshing && canRefresh) {\n runRefreshing();\n } else if (refreshing && !isFetching) {\n // only iOS can start refresh before gesture end\n resetRefreshingState();\n } else {\n // refreshing && isFetching: refresh in progress\n // OR !refreshing && !canRefresh: pull was not strong enough\n setSpinnerY(refreshing ? initParams.refreshing : initParams.start);\n setSpinnerProgress(0);\n setContentShift(0);\n }\n }\n }, [\n initParams,\n prevIsFetching,\n isFetching,\n onRefreshingFinish,\n prevTouchDown,\n touchDown,\n refreshing,\n canRefresh,\n runRefreshing,\n ]);\n\n const startYRef = React.useRef(0);\n\n const onTouchStart = (e: TouchEvent) => {\n if (refreshing) {\n cancelEvent(e);\n }\n setTouchDown(true);\n startYRef.current = e.startY;\n\n if (document) {\n // eslint-disable-next-line no-restricted-properties\n document.documentElement.classList.add('vkui--disable-overscroll-behavior');\n }\n };\n\n const shouldPreventTouchMove = (event: VKUITouchEvent) => {\n if (watching || refreshing) {\n return true;\n }\n\n /* Нам нужно запретить touchmove у документа как только стало понятно, что\n * начинается pull.\n * состояния watching и refreshing устанавливаются слишком поздно и браузер\n * может успеть начать нативный pull to refresh.\n *\n * Этот код является запасным вариантом, на случай, если css свойство\n * overscroll-behavior не поддерживается\n * */\n const shiftY = coordY(event) - startYRef.current;\n const pageYOffset = scroll?.getScroll().y;\n const isRefreshGestureStarted = pageYOffset === 0 && shiftY > 0 && touchDown;\n return isRefreshGestureStarted;\n };\n\n const onWindowTouchMove = (event: VKUITouchEvent) => {\n if (shouldPreventTouchMove(event)) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n\n useGlobalEventListener(document, 'touchmove', onWindowTouchMove, TOUCH_MOVE_EVENT_PARAMS);\n\n const onTouchMove = (e: TouchEvent) => {\n const { isY, shiftY } = e;\n const { start, max } = initParams;\n const pageYOffset = scroll?.getScroll().y;\n\n if (watching && touchDown) {\n cancelEvent(e);\n\n const { positionMultiplier, maxY } = initParams;\n\n const shift = Math.max(0, shiftY - touchY.current);\n\n const currentY = clamp(start + shift * positionMultiplier, start, maxY);\n const progress = currentY > -10 ? Math.abs((currentY + 10) / max) * 80 : 0;\n\n setSpinnerY(currentY);\n setSpinnerProgress(clamp(progress, 0, 80));\n setCanRefresh(progress > 80);\n setContentShift((currentY + 10) * 2.3);\n\n if (progress > 85 && !refreshing && platform === Platform.IOS) {\n runRefreshing();\n }\n } else if (isY && pageYOffset === 0 && shiftY > 0 && !refreshing && touchDown) {\n cancelEvent(e);\n\n touchY.current = shiftY;\n setWatching(true);\n setSpinnerY(start);\n setSpinnerProgress(0);\n }\n };\n\n const onTouchEnd = () => {\n setWatching(false);\n setTouchDown(false);\n\n // восстанавливаем overscroll behavior\n if (document) {\n // eslint-disable-next-line no-restricted-properties\n document.documentElement.classList.remove('vkui--disable-overscroll-behavior');\n }\n };\n\n const spinnerTransform = `translate3d(0, ${spinnerY}px, 0)`;\n let contentTransform = '';\n\n if (platform === Platform.IOS && refreshing && !touchDown) {\n contentTransform = 'translate3d(0, 100px, 0)';\n } else if (platform === Platform.IOS && (contentShift || refreshing)) {\n contentTransform = `translate3d(0, ${contentShift}px, 0)`;\n }\n\n return (\n <TouchRootContext.Provider value={true}>\n <Touch\n {...restProps}\n onStart={onTouchStart}\n onMove={onTouchMove}\n onEnd={onTouchEnd}\n className={classNames(\n styles['PullToRefresh'],\n platform === Platform.IOS && styles['PullToRefresh--ios'],\n watching && styles['PullToRefresh--watching'],\n refreshing && styles['PullToRefresh--refreshing'],\n className,\n )}\n >\n <FixedLayout className={styles['PullToRefresh__controls']} useParentWidth>\n <PullToRefreshSpinner\n style={{\n transform: spinnerTransform,\n WebkitTransform: spinnerTransform,\n opacity: watching || refreshing || canRefresh ? 1 : 0,\n }}\n on={refreshing}\n progress={refreshing ? undefined : spinnerProgress}\n />\n </FixedLayout>\n\n <div\n className={styles['PullToRefresh__content']}\n style={{\n transform: contentTransform,\n WebkitTransform: contentTransform,\n }}\n >\n {children}\n </div>\n </Touch>\n </TouchRootContext.Provider>\n );\n};\n"],"names":["PullToRefresh","cancelEvent","event","originalEvent","preventDefault","cancelable","stopPropagation","TOUCH_MOVE_EVENT_PARAMS","passive","children","isFetching","onRefresh","className","restProps","platform","usePlatform","scroll","useScroll","document","useDOM","prevIsFetching","usePrevious","initParams","React","useMemo","start","Platform","IOS","max","maxY","refreshing","positionMultiplier","useState","spinnerY","setSpinnerY","watching","setWatching","setRefreshing","canRefresh","setCanRefresh","touchDown","setTouchDown","prevTouchDown","touchY","useRef","contentShift","setContentShift","spinnerProgress","setSpinnerProgress","resetRefreshingState","useCallback","onRefreshingFinish","useTimeout","set","setWaitFetchingTimeout","clear","clearWaitFetchingTimeout","useIsomorphicLayoutEffect","undefined","runRefreshing","prevSpinnerY","runTapticImpactOccurredCalled","runTapticImpactOccurred","startYRef","onTouchStart","e","current","startY","documentElement","classList","add","shouldPreventTouchMove","shiftY","coordY","pageYOffset","getScroll","y","isRefreshGestureStarted","onWindowTouchMove","useGlobalEventListener","onTouchMove","isY","shift","Math","currentY","clamp","progress","abs","onTouchEnd","remove","spinnerTransform","contentTransform","TouchRootContext","Provider","value","Touch","onStart","onMove","onEnd","classNames","FixedLayout","useParentWidth","PullToRefreshSpinner","style","transform","WebkitTransform","opacity","on","div"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"Tappable.d.ts","sourceRoot":"","sources":["../../../../src/components/Tappable/Tappable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAqB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmB/D,KAAK,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAI1C,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAClC,cAAc,GACd,aAAa,GACb,YAAY,GACZ,eAAe,GACf,aAAa,GACb,aAAa,GACb,WAAW,GACX,cAAc,CACjB,GACC,wBAAwB,CAAC;AAE3B,MAAM,WAAW,aACf,SAAQ,oBAAoB,EAC1B,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY,EACZ,WAAW,EACX,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClD;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAQD,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,mBAAmB,MAAM,CAAC;AA2EvC;;GAEG;AACH,eAAO,MAAM,QAAQ,0SAoBlB,aAAa,sBA8Kf,CAAC"}
1
+ {"version":3,"file":"Tappable.d.ts","sourceRoot":"","sources":["../../../../src/components/Tappable/Tappable.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAiB/B,OAAO,EACL,wBAAwB,EACxB,WAAW,EACX,YAAY,EACZ,UAAU,EACV,YAAY,EACb,MAAM,aAAa,CAAC;AACrB,OAAO,EAAgB,gBAAgB,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAqB,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAmB/D,KAAK,SAAS,GAAG,SAAS,GAAG,YAAY,CAAC;AAI1C,MAAM,MAAM,oBAAoB,GAAG,IAAI,CACrC,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,EAClC,cAAc,GACd,aAAa,GACb,YAAY,GACZ,eAAe,GACf,aAAa,GACb,aAAa,GACb,WAAW,GACX,cAAc,CACjB,GACC,wBAAwB,CAAC;AAE3B,MAAM,WAAW,aACf,SAAQ,oBAAoB,EAC1B,UAAU,CAAC,WAAW,CAAC,EACvB,YAAY,EACZ,WAAW,EACX,IAAI,CAAC,UAAU,EAAE,SAAS,GAAG,OAAO,GAAG,QAAQ,CAAC;IAClD;;OAEG;IACH,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB;;OAEG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC7C;;OAEG;IACH,SAAS,CAAC,EAAE,YAAY,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC5C;;OAEG;IACH,gBAAgB,CAAC,EAAE,YAAY,CAAC,gBAAgB,EAAE,MAAM,CAAC,CAAC;IAC1D,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC,OAAO,CAAC,CAAC,WAAW,EAAE,UAAU,GAAG,IAAI,CAAC;IACxC;;;OAGG;IACH,gBAAgB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAC;CACvC;AAQD,MAAM,WAAW,kBAAmB,SAAQ,UAAU;IACpD,GAAG,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;CAC9B;AAED,eAAO,MAAM,YAAY,KAAK,CAAC;AAC/B,eAAO,MAAM,mBAAmB,MAAM,CAAC;AA2EvC;;GAEG;AACH,eAAO,MAAM,QAAQ,0SAoBlB,aAAa,sBA6Kf,CAAC"}
@@ -30,7 +30,6 @@ var _react = /*#__PURE__*/ _interop_require_wildcard._(require("react"));
30
30
  var _vkjs = require("@vkontakte/vkjs");
31
31
  var _mitt = /*#__PURE__*/ _interop_require_default._(require("mitt"));
32
32
  var _useAdaptivity = require("../../hooks/useAdaptivity");
33
- var _useAdaptivityHasHover = require("../../hooks/useAdaptivityHasHover");
34
33
  var _useAdaptivityHasPointer = require("../../hooks/useAdaptivityHasPointer");
35
34
  var _useBooleanState = require("../../hooks/useBooleanState");
36
35
  var _useExternRef = require("../../hooks/useExternRef");
@@ -235,9 +234,8 @@ var Tappable = function(_param) {
235
234
  var insideTouchRoot = _react.useContext(_TouchContext.default);
236
235
  var platform = (0, _usePlatform.usePlatform)();
237
236
  var _useFocusVisible1 = (0, _useFocusVisible.useFocusVisible)(), focusVisible = _useFocusVisible1.focusVisible, onBlur = _useFocusVisible1.onBlur, onFocus = _useFocusVisible1.onFocus;
238
- var _useAdaptivity1 = (0, _useAdaptivity.useAdaptivity)(), _useAdaptivity_sizeX = _useAdaptivity1.sizeX, sizeX = _useAdaptivity_sizeX === void 0 ? "none" : _useAdaptivity_sizeX;
237
+ var _useAdaptivity1 = (0, _useAdaptivity.useAdaptivity)(), _useAdaptivity_sizeX = _useAdaptivity1.sizeX, sizeX = _useAdaptivity_sizeX === void 0 ? "none" : _useAdaptivity_sizeX, tmp2 = _useAdaptivity1.hasHover, hasHoverContext = tmp2 === void 0 ? true : tmp2;
239
238
  var hasPointerContext = (0, _useAdaptivityHasPointer.useAdaptivityHasPointer)();
240
- var hasHoverContext = (0, _useAdaptivityHasHover.useAdaptivityHasHover)();
241
239
  var _React_useState = _sliced_to_array._(_react.useState([]), 2), clicks = _React_useState[0], setClicks = _React_useState[1];
242
240
  var _React_useState1 = _sliced_to_array._(_react.useState(false), 2), childHover = _React_useState1[0], setChildHover = _React_useState1[1];
243
241
  var _useBooleanState1 = (0, _useBooleanState.useBooleanState)(false), _hovered = _useBooleanState1.value, setHoveredTrue = _useBooleanState1.setTrue, setHoveredFalse = _useBooleanState1.setFalse;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Tappable/Tappable.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport mitt from 'mitt';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityHasHover } from '../../hooks/useAdaptivityHasHover';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusVisible } from '../../hooks/useFocusVisible';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\nimport { SizeType } from '../../lib/adaptivity';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { getOffsetRect } from '../../lib/offset';\nimport { Platform } from '../../lib/platform';\nimport { coordX, coordY } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport {\n AnchorHTMLAttributesOnly,\n HasChildren,\n HasComponent,\n HasRootRef,\n LiteralUnion,\n} from '../../types';\nimport { FocusVisible, FocusVisibleMode } from '../FocusVisible/FocusVisible';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport styles from './Tappable.module.css';\n\nconst sizeXClassNames = {\n none: styles['Tappable--sizeX-none'],\n compact: styles['Tappable--sizeX-compact'],\n};\n\nconst stylesHoverMode = {\n background: styles['Tappable--hover-background'],\n opacity: styles['Tappable--hover-opacity'],\n};\n\nconst stylesActiveMode = {\n background: styles['Tappable--active-background'],\n opacity: styles['Tappable--active-opacity'],\n};\n\ntype StateMode = 'opacity' | 'background';\n\nconst WAVE_LIVE = 225;\n\nexport type TappableElementProps = Omit<\n React.AllHTMLAttributes<HTMLElement>,\n | 'onTouchStart'\n | 'onTouchMove'\n | 'onTouchEnd'\n | 'onTouchCancel'\n | 'onMouseDown'\n | 'onMouseMove'\n | 'onMouseUp'\n | 'onMouseLeave'\n> &\n AnchorHTMLAttributesOnly; // В AllHTMLAttributes не хватает типов для ссылок\n\nexport interface TappableProps\n extends TappableElementProps,\n HasRootRef<HTMLElement>,\n HasComponent,\n HasChildren,\n Pick<TouchProps, 'onStart' | 'onEnd' | 'onMove'> {\n /**\n * Длительность показа active-состояния\n */\n activeEffectDelay?: number;\n stopPropagation?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на hover-состояние\n */\n hasHover?: boolean;\n /**\n * Позволяет управлять hovered-состоянием извне\n */\n hovered?: boolean;\n /**\n * Позволяет управлять activated-состоянием извне\n */\n activated?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на active-состояние\n */\n hasActive?: boolean;\n /**\n * Стиль подсветки active-состояния. Если передать произвольную строку, она добавится как css-класс во время active\n */\n activeMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль подсветки hover-состояния. Если передать произвольную строку, она добавится как css-класс во время hover\n */\n hoverMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль аутлайна focus visible. Если передать произвольную строку, она добавится как css-класс во время focus-visible\n */\n focusVisibleMode?: LiteralUnion<FocusVisibleMode, string>;\n onEnter?(outputEvent: MouseEvent): void;\n onLeave?(outputEvent: MouseEvent): void;\n /**\n * Задает border-radius элементу\n * В режиме `auto` на маленьких экранах `border-radius: 0`, иначе определяется токеном `--vkui--size_border_radius--regular`\n */\n borderRadiusMode?: 'auto' | 'inherit';\n}\n\ninterface Wave {\n x: number;\n y: number;\n id: number;\n}\n\nexport interface RootComponentProps extends TouchProps {\n ref?: React.Ref<HTMLElement>;\n}\n\nexport const ACTIVE_DELAY = 70;\nexport const ACTIVE_EFFECT_DELAY = 600;\n\nconst activeBus = mitt<{ active: string }>();\nconst TapState = { none: 0, pending: 1, active: 2, exiting: 3 } as const;\n\ntype TappableContextInterface = { onHoverChange: (s: boolean) => void };\nconst TappableContext = React.createContext<TappableContextInterface>({\n onHoverChange: noop,\n});\n\nfunction isPresetStateMode(stateMode: LiteralUnion<StateMode, string>): stateMode is StateMode {\n switch (stateMode) {\n case 'opacity':\n case 'background':\n return true;\n default:\n return false;\n }\n}\n\nfunction useActivity(hasActive: boolean, stopDelay: number) {\n const id = React.useMemo(() => Math.round(Math.random() * 1e8).toString(16), []);\n\n const [activity, setActivity] = React.useState<(typeof TapState)[keyof typeof TapState]>(\n TapState.none,\n );\n const _stop = () => setActivity(TapState.none);\n const start = () => hasActive && setActivity(TapState.active);\n const delayStart = () => {\n hasActive && setActivity(TapState.pending);\n };\n\n const activeTimeout = useTimeout(start, ACTIVE_DELAY);\n const stopTimeout = useTimeout(_stop, stopDelay);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.pending) {\n activeTimeout.set();\n return activeTimeout.clear;\n }\n if (activity === TapState.exiting) {\n return stopTimeout.clear;\n }\n if (activity === TapState.active) {\n activeBus.emit('active', id);\n }\n return noop;\n }, [activity]);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.none) {\n return noop;\n }\n const onActiveChange = (activeId: string) => {\n activeId !== id && _stop();\n };\n activeBus.on('active', onActiveChange);\n return () => activeBus.off('active', onActiveChange);\n }, [activity === TapState.none]);\n\n useIsomorphicLayoutEffect(() => {\n !hasActive && _stop();\n }, [hasActive]);\n\n const stop = (delay?: number) => {\n if (delay) {\n setActivity(TapState.exiting);\n return stopTimeout.set(delay);\n }\n _stop();\n };\n\n return [activity, { delayStart, start, stop }] as const;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Tappable\n */\nexport const Tappable = ({\n children,\n Component,\n onClick,\n onKeyDown: _onKeyDown,\n activeEffectDelay = ACTIVE_EFFECT_DELAY,\n stopPropagation = false,\n getRootRef,\n hasHover: _hasHover = true,\n hoverMode = 'background',\n hasActive: _hasActive = true,\n activeMode = 'background',\n focusVisibleMode = 'inside',\n onEnter,\n onLeave,\n className,\n hovered: hoveredProp,\n activated: activatedProp,\n borderRadiusMode = 'auto',\n ...props\n}: TappableProps) => {\n Component = Component || ((props.href ? 'a' : 'div') as React.ElementType);\n\n const { onHoverChange } = React.useContext(TappableContext);\n const insideTouchRoot = React.useContext(TouchRootContext);\n const platform = usePlatform();\n const { focusVisible, onBlur, onFocus } = useFocusVisible();\n const { sizeX = 'none' } = useAdaptivity();\n const hasPointerContext = useAdaptivityHasPointer();\n const hasHoverContext = useAdaptivityHasHover();\n\n const [clicks, setClicks] = React.useState<Wave[]>([]);\n const [childHover, setChildHover] = React.useState(false);\n const {\n value: _hovered,\n setTrue: setHoveredTrue,\n setFalse: setHoveredFalse,\n } = useBooleanState(false);\n\n const hovered = (_hovered || hoveredProp) && !props.disabled;\n const hasActive = _hasActive && !childHover && !props.disabled;\n const hasHover = hasHoverContext && _hasHover && !childHover;\n const isCustomElement =\n Component !== 'a' && Component !== 'button' && Component !== 'label' && !props.contentEditable;\n const isPresetHoverMode = isPresetStateMode(hoverMode);\n const isPresetActiveMode = isPresetStateMode(activeMode);\n const isPresetFocusVisibleMode = ['inside', 'outside'].includes(focusVisibleMode);\n\n const [activity, { start, stop, delayStart }] = useActivity(hasActive, activeEffectDelay);\n const active = activity === TapState.active || activity === TapState.exiting;\n const activated = (active || activatedProp) && !props.disabled;\n\n const containerRef = useExternRef(getRootRef);\n\n // hover propagation\n const childContext = React.useRef({ onHoverChange: setChildHover }).current;\n useIsomorphicLayoutEffect(() => {\n if (!hovered) {\n return noop;\n }\n onHoverChange(true);\n return () => onHoverChange(false);\n }, [hovered]);\n\n /*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\n function onKeyDown(e: React.KeyboardEvent<HTMLElement>) {\n if (isCustomElement && shouldTriggerClickOnEnterOrSpace(e)) {\n e.preventDefault();\n containerRef.current?.click();\n }\n }\n\n const needWaves =\n platform === Platform.ANDROID && !hasPointerContext && hasActive && activeMode === 'background';\n\n const clearClicks = useTimeout(() => setClicks([]), WAVE_LIVE);\n\n function addClick(x: number, y: number) {\n const dateNow = Date.now();\n const filteredClicks = clicks.filter((click) => click.id + WAVE_LIVE > dateNow);\n\n setClicks([...filteredClicks, { x, y, id: dateNow }]);\n clearClicks.set();\n }\n\n function onStart({ originalEvent }: TouchEvent) {\n if (hasActive) {\n if (originalEvent.touches && originalEvent.touches.length > 1) {\n // r сожалению я так и не понял, что это делает и можно ли упихнуть его в Touch\n return stop();\n }\n\n if (needWaves) {\n const { top, left } = getOffsetRect(containerRef.current);\n const x = coordX(originalEvent) - (left ?? 0);\n const y = coordY(originalEvent) - (top ?? 0);\n addClick(x, y);\n }\n\n delayStart();\n }\n }\n\n function onMove({ isSlide }: TouchEvent) {\n if (isSlide) {\n stop();\n }\n }\n\n function onEnd({ duration }: TouchEvent) {\n if (activity === TapState.none) {\n return;\n }\n if (activity === TapState.pending) {\n // активировать при коротком тапе\n start();\n }\n\n // отключить без задержки при длинном тапе\n const activeDuration = duration - ACTIVE_DELAY;\n stop(activeDuration >= 100 ? 0 : activeEffectDelay - activeDuration);\n }\n\n const classes = classNames(\n className,\n styles['Tappable'],\n 'vkuiInternalTappable',\n platform === Platform.IOS && styles['Tappable--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n hasHover && styles['Tappable--hasHover'],\n hasActive && styles['Tappable--hasActive'],\n hasHover && hovered && !isPresetHoverMode && hoverMode,\n hasActive && activated && !isPresetActiveMode && activeMode,\n focusVisible && !isPresetFocusVisibleMode && focusVisibleMode,\n hasHover && hovered && isPresetHoverMode && stylesHoverMode[hoverMode],\n hasActive && activated && isPresetActiveMode && stylesActiveMode[activeMode],\n focusVisible && styles['Tappable--focus-visible'],\n borderRadiusMode === 'inherit' && styles['Tappable--borderRadiusInherit'],\n );\n\n const handlers: RootComponentProps = {\n onStart: callMultiple(onStart, props.onStart),\n onMove: callMultiple(onMove, props.onMove),\n onEnd: callMultiple(onEnd, props.onEnd),\n onClick,\n onKeyDown: callMultiple(onKeyDown, _onKeyDown),\n };\n const role = props.href ? 'link' : 'button';\n\n return (\n <Touch\n onEnter={callMultiple(setHoveredTrue, onEnter)}\n onLeave={callMultiple(setHoveredFalse, onLeave)}\n type={Component === 'button' ? 'button' : undefined}\n tabIndex={isCustomElement && !props.disabled ? 0 : undefined}\n role={isCustomElement ? role : undefined}\n aria-disabled={isCustomElement ? props.disabled : undefined}\n stopPropagation={stopPropagation && !insideTouchRoot && !props.disabled}\n {...props}\n slideThreshold={20}\n usePointerHover\n className={classes}\n Component={Component}\n getRootRef={containerRef}\n onBlur={callMultiple(onBlur, props.onBlur)}\n onFocus={callMultiple(onFocus, props.onFocus)}\n {...(props.disabled ? {} : handlers)}\n >\n <TappableContext.Provider value={childContext}>{children}</TappableContext.Provider>\n {needWaves && (\n <span aria-hidden className={styles.Tappable__waves}>\n {clicks.map((wave) => (\n <span\n key={wave.id}\n className={styles.Tappable__wave}\n style={{ top: wave.y, left: wave.x }}\n />\n ))}\n </span>\n )}\n {((hasHover && hoverMode === 'background') || (hasActive && activeMode === 'background')) && (\n <span aria-hidden className={styles.Tappable__stateLayer} />\n )}\n {!props.disabled && isPresetFocusVisibleMode && (\n <FocusVisible visible={focusVisible} mode={focusVisibleMode as FocusVisibleMode} />\n )}\n </Touch>\n );\n};\n"],"names":["ACTIVE_DELAY","ACTIVE_EFFECT_DELAY","Tappable","sizeXClassNames","none","compact","stylesHoverMode","background","opacity","stylesActiveMode","WAVE_LIVE","activeBus","mitt","TapState","pending","active","exiting","TappableContext","React","createContext","onHoverChange","noop","isPresetStateMode","stateMode","useActivity","hasActive","stopDelay","id","useMemo","Math","round","random","toString","useState","activity","setActivity","_stop","start","delayStart","activeTimeout","useTimeout","stopTimeout","useIsomorphicLayoutEffect","set","clear","emit","onActiveChange","activeId","on","off","stop","delay","onKeyDown","e","isCustomElement","shouldTriggerClickOnEnterOrSpace","containerRef","preventDefault","current","click","addClick","x","y","dateNow","Date","now","filteredClicks","clicks","filter","setClicks","clearClicks","onStart","originalEvent","touches","length","needWaves","getOffsetRect","top","left","coordX","coordY","onMove","isSlide","onEnd","duration","activeDuration","activeEffectDelay","children","Component","onClick","_onKeyDown","stopPropagation","getRootRef","_hasHover","hasHover","hoverMode","_hasActive","activeMode","focusVisibleMode","onEnter","onLeave","className","hovered","hoveredProp","activated","activatedProp","borderRadiusMode","props","href","useContext","insideTouchRoot","TouchRootContext","platform","usePlatform","useFocusVisible","focusVisible","onBlur","onFocus","useAdaptivity","sizeX","hasPointerContext","useAdaptivityHasPointer","hasHoverContext","useAdaptivityHasHover","childHover","setChildHover","useBooleanState","value","_hovered","setTrue","setHoveredTrue","setFalse","setHoveredFalse","disabled","contentEditable","isPresetHoverMode","isPresetActiveMode","isPresetFocusVisibleMode","includes","useExternRef","childContext","useRef","Platform","ANDROID","classes","classNames","IOS","SizeType","REGULAR","handlers","callMultiple","role","Touch","type","undefined","tabIndex","aria-disabled","slideThreshold","usePointerHover","Provider","span","aria-hidden","map","wave","key","style","FocusVisible","visible","mode"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/Tappable/Tappable.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport mitt from 'mitt';\nimport { useAdaptivity } from '../../hooks/useAdaptivity';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useBooleanState } from '../../hooks/useBooleanState';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusVisible } from '../../hooks/useFocusVisible';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { shouldTriggerClickOnEnterOrSpace } from '../../lib/accessibility';\nimport { SizeType } from '../../lib/adaptivity';\nimport { callMultiple } from '../../lib/callMultiple';\nimport { getOffsetRect } from '../../lib/offset';\nimport { Platform } from '../../lib/platform';\nimport { coordX, coordY } from '../../lib/touch';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport {\n AnchorHTMLAttributesOnly,\n HasChildren,\n HasComponent,\n HasRootRef,\n LiteralUnion,\n} from '../../types';\nimport { FocusVisible, FocusVisibleMode } from '../FocusVisible/FocusVisible';\nimport { Touch, TouchEvent, TouchProps } from '../Touch/Touch';\nimport TouchRootContext from '../Touch/TouchContext';\nimport styles from './Tappable.module.css';\n\nconst sizeXClassNames = {\n none: styles['Tappable--sizeX-none'],\n compact: styles['Tappable--sizeX-compact'],\n};\n\nconst stylesHoverMode = {\n background: styles['Tappable--hover-background'],\n opacity: styles['Tappable--hover-opacity'],\n};\n\nconst stylesActiveMode = {\n background: styles['Tappable--active-background'],\n opacity: styles['Tappable--active-opacity'],\n};\n\ntype StateMode = 'opacity' | 'background';\n\nconst WAVE_LIVE = 225;\n\nexport type TappableElementProps = Omit<\n React.AllHTMLAttributes<HTMLElement>,\n | 'onTouchStart'\n | 'onTouchMove'\n | 'onTouchEnd'\n | 'onTouchCancel'\n | 'onMouseDown'\n | 'onMouseMove'\n | 'onMouseUp'\n | 'onMouseLeave'\n> &\n AnchorHTMLAttributesOnly; // В AllHTMLAttributes не хватает типов для ссылок\n\nexport interface TappableProps\n extends TappableElementProps,\n HasRootRef<HTMLElement>,\n HasComponent,\n HasChildren,\n Pick<TouchProps, 'onStart' | 'onEnd' | 'onMove'> {\n /**\n * Длительность показа active-состояния\n */\n activeEffectDelay?: number;\n stopPropagation?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на hover-состояние\n */\n hasHover?: boolean;\n /**\n * Позволяет управлять hovered-состоянием извне\n */\n hovered?: boolean;\n /**\n * Позволяет управлять activated-состоянием извне\n */\n activated?: boolean;\n /**\n * Указывает, должен ли компонент реагировать на active-состояние\n */\n hasActive?: boolean;\n /**\n * Стиль подсветки active-состояния. Если передать произвольную строку, она добавится как css-класс во время active\n */\n activeMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль подсветки hover-состояния. Если передать произвольную строку, она добавится как css-класс во время hover\n */\n hoverMode?: LiteralUnion<StateMode, string>;\n /**\n * Стиль аутлайна focus visible. Если передать произвольную строку, она добавится как css-класс во время focus-visible\n */\n focusVisibleMode?: LiteralUnion<FocusVisibleMode, string>;\n onEnter?(outputEvent: MouseEvent): void;\n onLeave?(outputEvent: MouseEvent): void;\n /**\n * Задает border-radius элементу\n * В режиме `auto` на маленьких экранах `border-radius: 0`, иначе определяется токеном `--vkui--size_border_radius--regular`\n */\n borderRadiusMode?: 'auto' | 'inherit';\n}\n\ninterface Wave {\n x: number;\n y: number;\n id: number;\n}\n\nexport interface RootComponentProps extends TouchProps {\n ref?: React.Ref<HTMLElement>;\n}\n\nexport const ACTIVE_DELAY = 70;\nexport const ACTIVE_EFFECT_DELAY = 600;\n\nconst activeBus = mitt<{ active: string }>();\nconst TapState = { none: 0, pending: 1, active: 2, exiting: 3 } as const;\n\ntype TappableContextInterface = { onHoverChange: (s: boolean) => void };\nconst TappableContext = React.createContext<TappableContextInterface>({\n onHoverChange: noop,\n});\n\nfunction isPresetStateMode(stateMode: LiteralUnion<StateMode, string>): stateMode is StateMode {\n switch (stateMode) {\n case 'opacity':\n case 'background':\n return true;\n default:\n return false;\n }\n}\n\nfunction useActivity(hasActive: boolean, stopDelay: number) {\n const id = React.useMemo(() => Math.round(Math.random() * 1e8).toString(16), []);\n\n const [activity, setActivity] = React.useState<(typeof TapState)[keyof typeof TapState]>(\n TapState.none,\n );\n const _stop = () => setActivity(TapState.none);\n const start = () => hasActive && setActivity(TapState.active);\n const delayStart = () => {\n hasActive && setActivity(TapState.pending);\n };\n\n const activeTimeout = useTimeout(start, ACTIVE_DELAY);\n const stopTimeout = useTimeout(_stop, stopDelay);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.pending) {\n activeTimeout.set();\n return activeTimeout.clear;\n }\n if (activity === TapState.exiting) {\n return stopTimeout.clear;\n }\n if (activity === TapState.active) {\n activeBus.emit('active', id);\n }\n return noop;\n }, [activity]);\n\n useIsomorphicLayoutEffect(() => {\n if (activity === TapState.none) {\n return noop;\n }\n const onActiveChange = (activeId: string) => {\n activeId !== id && _stop();\n };\n activeBus.on('active', onActiveChange);\n return () => activeBus.off('active', onActiveChange);\n }, [activity === TapState.none]);\n\n useIsomorphicLayoutEffect(() => {\n !hasActive && _stop();\n }, [hasActive]);\n\n const stop = (delay?: number) => {\n if (delay) {\n setActivity(TapState.exiting);\n return stopTimeout.set(delay);\n }\n _stop();\n };\n\n return [activity, { delayStart, start, stop }] as const;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Tappable\n */\nexport const Tappable = ({\n children,\n Component,\n onClick,\n onKeyDown: _onKeyDown,\n activeEffectDelay = ACTIVE_EFFECT_DELAY,\n stopPropagation = false,\n getRootRef,\n hasHover: _hasHover = true,\n hoverMode = 'background',\n hasActive: _hasActive = true,\n activeMode = 'background',\n focusVisibleMode = 'inside',\n onEnter,\n onLeave,\n className,\n hovered: hoveredProp,\n activated: activatedProp,\n borderRadiusMode = 'auto',\n ...props\n}: TappableProps) => {\n Component = Component || ((props.href ? 'a' : 'div') as React.ElementType);\n\n const { onHoverChange } = React.useContext(TappableContext);\n const insideTouchRoot = React.useContext(TouchRootContext);\n const platform = usePlatform();\n const { focusVisible, onBlur, onFocus } = useFocusVisible();\n const { sizeX = 'none', hasHover: hasHoverContext = true } = useAdaptivity();\n const hasPointerContext = useAdaptivityHasPointer();\n\n const [clicks, setClicks] = React.useState<Wave[]>([]);\n const [childHover, setChildHover] = React.useState(false);\n const {\n value: _hovered,\n setTrue: setHoveredTrue,\n setFalse: setHoveredFalse,\n } = useBooleanState(false);\n\n const hovered = (_hovered || hoveredProp) && !props.disabled;\n const hasActive = _hasActive && !childHover && !props.disabled;\n const hasHover = hasHoverContext && _hasHover && !childHover;\n const isCustomElement =\n Component !== 'a' && Component !== 'button' && Component !== 'label' && !props.contentEditable;\n const isPresetHoverMode = isPresetStateMode(hoverMode);\n const isPresetActiveMode = isPresetStateMode(activeMode);\n const isPresetFocusVisibleMode = ['inside', 'outside'].includes(focusVisibleMode);\n\n const [activity, { start, stop, delayStart }] = useActivity(hasActive, activeEffectDelay);\n const active = activity === TapState.active || activity === TapState.exiting;\n const activated = (active || activatedProp) && !props.disabled;\n\n const containerRef = useExternRef(getRootRef);\n\n // hover propagation\n const childContext = React.useRef({ onHoverChange: setChildHover }).current;\n useIsomorphicLayoutEffect(() => {\n if (!hovered) {\n return noop;\n }\n onHoverChange(true);\n return () => onHoverChange(false);\n }, [hovered]);\n\n /*\n * [a11y]\n * Обрабатывает событие onkeydown\n * для кастомных доступных элементов:\n * - role=\"link\" (активация по Enter)\n * - role=\"button\" (активация по Space и Enter)\n */\n function onKeyDown(e: React.KeyboardEvent<HTMLElement>) {\n if (isCustomElement && shouldTriggerClickOnEnterOrSpace(e)) {\n e.preventDefault();\n containerRef.current?.click();\n }\n }\n\n const needWaves =\n platform === Platform.ANDROID && !hasPointerContext && hasActive && activeMode === 'background';\n\n const clearClicks = useTimeout(() => setClicks([]), WAVE_LIVE);\n\n function addClick(x: number, y: number) {\n const dateNow = Date.now();\n const filteredClicks = clicks.filter((click) => click.id + WAVE_LIVE > dateNow);\n\n setClicks([...filteredClicks, { x, y, id: dateNow }]);\n clearClicks.set();\n }\n\n function onStart({ originalEvent }: TouchEvent) {\n if (hasActive) {\n if (originalEvent.touches && originalEvent.touches.length > 1) {\n // r сожалению я так и не понял, что это делает и можно ли упихнуть его в Touch\n return stop();\n }\n\n if (needWaves) {\n const { top, left } = getOffsetRect(containerRef.current);\n const x = coordX(originalEvent) - (left ?? 0);\n const y = coordY(originalEvent) - (top ?? 0);\n addClick(x, y);\n }\n\n delayStart();\n }\n }\n\n function onMove({ isSlide }: TouchEvent) {\n if (isSlide) {\n stop();\n }\n }\n\n function onEnd({ duration }: TouchEvent) {\n if (activity === TapState.none) {\n return;\n }\n if (activity === TapState.pending) {\n // активировать при коротком тапе\n start();\n }\n\n // отключить без задержки при длинном тапе\n const activeDuration = duration - ACTIVE_DELAY;\n stop(activeDuration >= 100 ? 0 : activeEffectDelay - activeDuration);\n }\n\n const classes = classNames(\n className,\n styles['Tappable'],\n 'vkuiInternalTappable',\n platform === Platform.IOS && styles['Tappable--ios'],\n sizeX !== SizeType.REGULAR && sizeXClassNames[sizeX],\n hasHover && styles['Tappable--hasHover'],\n hasActive && styles['Tappable--hasActive'],\n hasHover && hovered && !isPresetHoverMode && hoverMode,\n hasActive && activated && !isPresetActiveMode && activeMode,\n focusVisible && !isPresetFocusVisibleMode && focusVisibleMode,\n hasHover && hovered && isPresetHoverMode && stylesHoverMode[hoverMode],\n hasActive && activated && isPresetActiveMode && stylesActiveMode[activeMode],\n focusVisible && styles['Tappable--focus-visible'],\n borderRadiusMode === 'inherit' && styles['Tappable--borderRadiusInherit'],\n );\n\n const handlers: RootComponentProps = {\n onStart: callMultiple(onStart, props.onStart),\n onMove: callMultiple(onMove, props.onMove),\n onEnd: callMultiple(onEnd, props.onEnd),\n onClick,\n onKeyDown: callMultiple(onKeyDown, _onKeyDown),\n };\n const role = props.href ? 'link' : 'button';\n\n return (\n <Touch\n onEnter={callMultiple(setHoveredTrue, onEnter)}\n onLeave={callMultiple(setHoveredFalse, onLeave)}\n type={Component === 'button' ? 'button' : undefined}\n tabIndex={isCustomElement && !props.disabled ? 0 : undefined}\n role={isCustomElement ? role : undefined}\n aria-disabled={isCustomElement ? props.disabled : undefined}\n stopPropagation={stopPropagation && !insideTouchRoot && !props.disabled}\n {...props}\n slideThreshold={20}\n usePointerHover\n className={classes}\n Component={Component}\n getRootRef={containerRef}\n onBlur={callMultiple(onBlur, props.onBlur)}\n onFocus={callMultiple(onFocus, props.onFocus)}\n {...(props.disabled ? {} : handlers)}\n >\n <TappableContext.Provider value={childContext}>{children}</TappableContext.Provider>\n {needWaves && (\n <span aria-hidden className={styles.Tappable__waves}>\n {clicks.map((wave) => (\n <span\n key={wave.id}\n className={styles.Tappable__wave}\n style={{ top: wave.y, left: wave.x }}\n />\n ))}\n </span>\n )}\n {((hasHover && hoverMode === 'background') || (hasActive && activeMode === 'background')) && (\n <span aria-hidden className={styles.Tappable__stateLayer} />\n )}\n {!props.disabled && isPresetFocusVisibleMode && (\n <FocusVisible visible={focusVisible} mode={focusVisibleMode as FocusVisibleMode} />\n )}\n </Touch>\n );\n};\n"],"names":["ACTIVE_DELAY","ACTIVE_EFFECT_DELAY","Tappable","sizeXClassNames","none","compact","stylesHoverMode","background","opacity","stylesActiveMode","WAVE_LIVE","activeBus","mitt","TapState","pending","active","exiting","TappableContext","React","createContext","onHoverChange","noop","isPresetStateMode","stateMode","useActivity","hasActive","stopDelay","id","useMemo","Math","round","random","toString","useState","activity","setActivity","_stop","start","delayStart","activeTimeout","useTimeout","stopTimeout","useIsomorphicLayoutEffect","set","clear","emit","onActiveChange","activeId","on","off","stop","delay","onKeyDown","e","isCustomElement","shouldTriggerClickOnEnterOrSpace","containerRef","preventDefault","current","click","addClick","x","y","dateNow","Date","now","filteredClicks","clicks","filter","setClicks","clearClicks","onStart","originalEvent","touches","length","needWaves","getOffsetRect","top","left","coordX","coordY","onMove","isSlide","onEnd","duration","activeDuration","activeEffectDelay","children","Component","onClick","_onKeyDown","stopPropagation","getRootRef","_hasHover","hasHover","hoverMode","_hasActive","activeMode","focusVisibleMode","onEnter","onLeave","className","hovered","hoveredProp","activated","activatedProp","borderRadiusMode","props","href","useContext","insideTouchRoot","TouchRootContext","platform","usePlatform","useFocusVisible","focusVisible","onBlur","onFocus","useAdaptivity","sizeX","hasHoverContext","hasPointerContext","useAdaptivityHasPointer","childHover","setChildHover","useBooleanState","value","_hovered","setTrue","setHoveredTrue","setFalse","setHoveredFalse","disabled","contentEditable","isPresetHoverMode","isPresetActiveMode","isPresetFocusVisibleMode","includes","useExternRef","childContext","useRef","Platform","ANDROID","classes","classNames","IOS","SizeType","REGULAR","handlers","callMultiple","role","Touch","type","undefined","tabIndex","aria-disabled","slideThreshold","usePointerHover","Provider","span","aria-hidden","map","wave","key","style","FocusVisible","visible","mode"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"ModalRoot.d.ts","sourceRoot":"","sources":["../../../src/components/ModalRoot/ModalRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,EAAE,qBAAqB,EAA+C,MAAM,SAAS,CAAC;AA4lB7F,eAAO,MAAM,cAAc,mDAM1B,CAAC"}
1
+ {"version":3,"file":"ModalRoot.d.ts","sourceRoot":"","sources":["../../../src/components/ModalRoot/ModalRoot.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAkB/B,OAAO,EAAE,qBAAqB,EAA+C,MAAM,SAAS,CAAC;AAomB7F,eAAO,MAAM,cAAc,mDAM1B,CAAC"}
@@ -231,7 +231,9 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
231
231
  }
232
232
  this.documentScrolling = enabled;
233
233
  if (enabled) {
234
- // Здесь нужен последний аргумент с такими же параметрами, потому что
234
+ // восстанавливаем значение overscroll behavior
235
+ // eslint-disable-next-line no-restricted-properties
236
+ this.document.documentElement.classList.remove("vkui--disable-overscroll-behavior");
235
237
  // некоторые браузеры на странных вендорах типа Meizu не удаляют обработчик.
236
238
  // https://github.com/VKCOM/VKUI/issues/444
237
239
  this.window.removeEventListener("touchmove", this.preventTouch, {
@@ -239,6 +241,10 @@ var ModalRootTouchComponent = /*#__PURE__*/ function(_React_Component) {
239
241
  passive: false
240
242
  });
241
243
  } else {
244
+ // отключаем нативный pull-to-refresh при открытом модальном окне
245
+ // чтобы он не срабатывал при закрытии модалки смахиванием вниз
246
+ // eslint-disable-next-line no-restricted-properties
247
+ this.document.documentElement.classList.add("vkui--disable-overscroll-behavior");
242
248
  this.window.addEventListener("touchmove", this.preventTouch, {
243
249
  passive: false
244
250
  });