@vkontakte/vkui 5.7.1 → 5.7.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (155) hide show
  1. package/dist/cjs/components/Banner/Banner.js +1 -1
  2. package/dist/cjs/components/Banner/Banner.js.map +1 -1
  3. package/dist/cjs/components/Checkbox/Checkbox.js +3 -1
  4. package/dist/cjs/components/Checkbox/Checkbox.js.map +1 -1
  5. package/dist/cjs/components/ChipsSelect/ChipsSelect.js +4 -2
  6. package/dist/cjs/components/ChipsSelect/ChipsSelect.js.map +1 -1
  7. package/dist/cjs/components/Group/Group.js +2 -3
  8. package/dist/cjs/components/Group/Group.js.map +1 -1
  9. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js +13 -11
  10. package/dist/cjs/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  11. package/dist/cjs/components/Image/Image.js +52 -37
  12. package/dist/cjs/components/Image/Image.js.map +1 -1
  13. package/dist/cjs/components/ImageBase/ImageBase.js +20 -1
  14. package/dist/cjs/components/ImageBase/ImageBase.js.map +1 -1
  15. package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js +1 -1
  16. package/dist/cjs/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  17. package/dist/cjs/components/PopoutRoot/PopoutRoot.js +1 -3
  18. package/dist/cjs/components/PopoutRoot/PopoutRoot.js.map +1 -1
  19. package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js +1 -1
  20. package/dist/cjs/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  21. package/dist/cjs/components/SelectMimicry/SelectMimicry.d.ts +1 -1
  22. package/dist/cjs/components/SelectMimicry/SelectMimicry.js +8 -3
  23. package/dist/cjs/components/SelectMimicry/SelectMimicry.js.map +1 -1
  24. package/dist/cjs/components/SimpleCell/SimpleCell.js +0 -1
  25. package/dist/cjs/components/SimpleCell/SimpleCell.js.map +1 -1
  26. package/dist/cjs/components/View/View.js +4 -4
  27. package/dist/cjs/components/View/View.js.map +1 -1
  28. package/dist/cjs/components/View/ViewInfinite.js +4 -4
  29. package/dist/cjs/components/View/ViewInfinite.js.map +1 -1
  30. package/dist/cjs/hooks/useAdaptivityHasHover.js +4 -3
  31. package/dist/cjs/hooks/useAdaptivityHasHover.js.map +1 -1
  32. package/dist/cjs/hooks/useAdaptivityHasPointer.js +5 -5
  33. package/dist/cjs/hooks/useAdaptivityHasPointer.js.map +1 -1
  34. package/dist/cjs/hooks/useAutoFocus.d.ts +2 -0
  35. package/dist/cjs/hooks/useAutoFocus.js +23 -0
  36. package/dist/cjs/hooks/useAutoFocus.js.map +1 -0
  37. package/dist/cjs/hooks/useChipsSelect.js +5 -4
  38. package/dist/cjs/hooks/useChipsSelect.js.map +1 -1
  39. package/dist/cjs/hooks/useFocusWithin.js +3 -0
  40. package/dist/cjs/hooks/useFocusWithin.js.map +1 -1
  41. package/dist/cjs/hooks/useIsClient.js +2 -1
  42. package/dist/cjs/hooks/useIsClient.js.map +1 -1
  43. package/dist/components/Banner/Banner.js +2 -2
  44. package/dist/components/Banner/Banner.js.map +1 -1
  45. package/dist/components/Checkbox/Checkbox.js +3 -1
  46. package/dist/components/Checkbox/Checkbox.js.map +1 -1
  47. package/dist/components/ChipsSelect/ChipsSelect.js +4 -2
  48. package/dist/components/ChipsSelect/ChipsSelect.js.map +1 -1
  49. package/dist/components/Group/Group.js +2 -3
  50. package/dist/components/Group/Group.js.map +1 -1
  51. package/dist/components/HorizontalScroll/HorizontalScroll.js +13 -11
  52. package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  53. package/dist/components/Image/Image.js +54 -39
  54. package/dist/components/Image/Image.js.map +1 -1
  55. package/dist/components/ImageBase/ImageBase.js +20 -1
  56. package/dist/components/ImageBase/ImageBase.js.map +1 -1
  57. package/dist/components/MiniInfoCell/MiniInfoCell.js +1 -1
  58. package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  59. package/dist/components/PopoutRoot/PopoutRoot.js +1 -3
  60. package/dist/components/PopoutRoot/PopoutRoot.js.map +1 -1
  61. package/dist/components/PopoutWrapper/PopoutWrapper.js +1 -1
  62. package/dist/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  63. package/dist/components/SelectMimicry/SelectMimicry.d.ts +1 -1
  64. package/dist/components/SelectMimicry/SelectMimicry.js +8 -3
  65. package/dist/components/SelectMimicry/SelectMimicry.js.map +1 -1
  66. package/dist/components/SimpleCell/SimpleCell.js +0 -1
  67. package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
  68. package/dist/components/View/View.js +4 -4
  69. package/dist/components/View/View.js.map +1 -1
  70. package/dist/components/View/ViewInfinite.js +4 -4
  71. package/dist/components/View/ViewInfinite.js.map +1 -1
  72. package/dist/components.css +22 -22
  73. package/dist/components.css.map +1 -1
  74. package/dist/components.js.tmp +757 -698
  75. package/dist/cssm/components/ActionSheet/ActionSheet.module.css +3 -3
  76. package/dist/cssm/components/Alert/Alert.module.css +4 -4
  77. package/dist/cssm/components/Banner/Banner.js +2 -2
  78. package/dist/cssm/components/Banner/Banner.js.map +1 -1
  79. package/dist/cssm/components/Banner/Banner.module.css +2 -2
  80. package/dist/cssm/components/Checkbox/Checkbox.js +3 -1
  81. package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
  82. package/dist/cssm/components/Checkbox/Checkbox.module.css +6 -0
  83. package/dist/cssm/components/ChipsSelect/ChipsSelect.js +3 -1
  84. package/dist/cssm/components/ChipsSelect/ChipsSelect.js.map +1 -1
  85. package/dist/cssm/components/FocusVisible/FocusVisible.module.css +4 -4
  86. package/dist/cssm/components/Group/Group.js +2 -3
  87. package/dist/cssm/components/Group/Group.js.map +1 -1
  88. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +13 -11
  89. package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
  90. package/dist/cssm/components/Image/Image.js +46 -33
  91. package/dist/cssm/components/Image/Image.js.map +1 -1
  92. package/dist/cssm/components/ImageBase/ImageBase.js +20 -1
  93. package/dist/cssm/components/ImageBase/ImageBase.js.map +1 -1
  94. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +1 -1
  95. package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
  96. package/dist/cssm/components/ModalPage/ModalPage.module.css +0 -4
  97. package/dist/cssm/components/ModalRoot/ModalRoot.module.css +2 -2
  98. package/dist/cssm/components/PanelHeader/PanelHeader.module.css +4 -2
  99. package/dist/cssm/components/PanelHeaderContext/PanelHeaderContext.module.css +8 -8
  100. package/dist/cssm/components/Placeholder/Placeholder.module.css +1 -0
  101. package/dist/cssm/components/PopoutRoot/PopoutRoot.js +1 -3
  102. package/dist/cssm/components/PopoutRoot/PopoutRoot.js.map +1 -1
  103. package/dist/cssm/components/PopoutRoot/PopoutRoot.module.css +0 -4
  104. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js +1 -1
  105. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.js.map +1 -1
  106. package/dist/cssm/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
  107. package/dist/cssm/components/Popover/Popover.module.css +2 -2
  108. package/dist/cssm/components/PullToRefresh/PullToRefresh.module.css +4 -4
  109. package/dist/cssm/components/RichTooltip/RichTooltip.module.css +2 -2
  110. package/dist/cssm/components/Root/Root.module.css +12 -13
  111. package/dist/cssm/components/ScreenSpinner/ScreenSpinner.module.css +5 -5
  112. package/dist/cssm/components/SelectMimicry/SelectMimicry.d.ts +1 -1
  113. package/dist/cssm/components/SelectMimicry/SelectMimicry.js +6 -2
  114. package/dist/cssm/components/SelectMimicry/SelectMimicry.js.map +1 -1
  115. package/dist/cssm/components/SimpleCell/SimpleCell.js +0 -1
  116. package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
  117. package/dist/cssm/components/Snackbar/Snackbar.module.css +4 -4
  118. package/dist/cssm/components/Tappable/Tappable.module.css +2 -2
  119. package/dist/cssm/components/TextTooltip/TextTooltip.module.css +2 -2
  120. package/dist/cssm/components/View/View.js +4 -4
  121. package/dist/cssm/components/View/View.js.map +1 -1
  122. package/dist/cssm/components/View/View.module.css +16 -16
  123. package/dist/cssm/components/View/ViewInfinite.js +4 -4
  124. package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
  125. package/dist/cssm/hooks/useAdaptivityHasHover.js +4 -3
  126. package/dist/cssm/hooks/useAdaptivityHasHover.js.map +1 -1
  127. package/dist/cssm/hooks/useAdaptivityHasPointer.js +5 -5
  128. package/dist/cssm/hooks/useAdaptivityHasPointer.js.map +1 -1
  129. package/dist/cssm/hooks/useAutoFocus.d.ts +2 -0
  130. package/dist/cssm/hooks/useAutoFocus.js +12 -0
  131. package/dist/cssm/hooks/useAutoFocus.js.map +1 -0
  132. package/dist/cssm/hooks/useChipsSelect.js +5 -4
  133. package/dist/cssm/hooks/useChipsSelect.js.map +1 -1
  134. package/dist/cssm/hooks/useFocusWithin.js +3 -0
  135. package/dist/cssm/hooks/useFocusWithin.js.map +1 -1
  136. package/dist/cssm/hooks/useIsClient.js +2 -1
  137. package/dist/cssm/hooks/useIsClient.js.map +1 -1
  138. package/dist/cssm/styles/constants.css +1 -1
  139. package/dist/hooks/useAdaptivityHasHover.js +4 -3
  140. package/dist/hooks/useAdaptivityHasHover.js.map +1 -1
  141. package/dist/hooks/useAdaptivityHasPointer.js +5 -5
  142. package/dist/hooks/useAdaptivityHasPointer.js.map +1 -1
  143. package/dist/hooks/useAutoFocus.d.ts +2 -0
  144. package/dist/hooks/useAutoFocus.js +12 -0
  145. package/dist/hooks/useAutoFocus.js.map +1 -0
  146. package/dist/hooks/useChipsSelect.js +5 -4
  147. package/dist/hooks/useChipsSelect.js.map +1 -1
  148. package/dist/hooks/useFocusWithin.js +3 -0
  149. package/dist/hooks/useFocusWithin.js.map +1 -1
  150. package/dist/hooks/useIsClient.js +2 -1
  151. package/dist/hooks/useIsClient.js.map +1 -1
  152. package/dist/vkui.css +22 -22
  153. package/dist/vkui.css.map +1 -1
  154. package/dist/vkui.js.tmp +757 -698
  155. package/package.json +1 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/HorizontalScroll/HorizontalScroll.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { easeInOutSine } from '../../lib/fx';\nimport { HasRef } from '../../types';\nimport { ScrollArrow } from '../ScrollArrow/ScrollArrow';\nimport styles from './HorizontalScroll.module.css';\n\ninterface ScrollContext {\n scrollElement: HTMLElement | null;\n scrollAnimationDuration: number;\n animationQueue: VoidFunction[];\n getScrollPosition: (currentPosition: number) => number;\n onScrollToRightBorder: VoidFunction;\n onScrollEnd: VoidFunction;\n onScrollStart: VoidFunction;\n /**\n * Начальная ширина прокрутки.\n * В некоторых случаях может отличаться от текущей ширины прокрутки из-за transforms: translate\n */\n initialScrollWidth: number;\n}\n\nexport type ScrollPositionHandler = (currentPosition: number) => number;\n\nexport interface HorizontalScrollProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n /**\n * Функция для расчета величины прокрутки при клике на левую стрелку.\n */\n getScrollToLeft?: ScrollPositionHandler;\n /**\n * Функция для расчета величины прокрутки при клике на правую стрелку.\n */\n getScrollToRight?: ScrollPositionHandler;\n arrowSize?: 'm' | 'l';\n /**\n * Смещает иконки кнопок навигации по вертикали.\n */\n arrowOffsetY?: number | string;\n showArrows?: boolean | 'always';\n scrollAnimationDuration?: number;\n /**\n * Добавляет возможность прокручивать контент на любое колесо мыши.\n * По умолчанию прокручивается как любой горизонтальный контент через shift.\n */\n scrollOnAnyWheel?: boolean;\n}\n\n/**\n * timing method\n */\nfunction now() {\n return performance && performance.now ? performance.now() : Date.now();\n}\n\n/**\n * Округляем el.scrollLeft\n * https://github.com/VKCOM/VKUI/pull/2445\n */\nconst roundUpElementScrollLeft = (el: HTMLElement) => Math.ceil(el.scrollLeft);\n\n/**\n * Код анимации скрола, на основе полифила: https://github.com/iamdustan/smoothscroll\n * Константа взята из полифила (468), на дизайн-ревью уточнили до 250\n * @var {number} SCROLL_ONE_FRAME_TIME время анимации скролла\n */\nconst SCROLL_ONE_FRAME_TIME = 250;\n\nfunction doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue,\n onScrollToRightBorder,\n onScrollEnd,\n onScrollStart,\n initialScrollWidth,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n}: ScrollContext) {\n if (!scrollElement || !getScrollPosition) {\n return;\n }\n\n /**\n * максимальное значение сдвига влево\n */\n const maxLeft = initialScrollWidth - scrollElement.offsetWidth;\n\n let startLeft = roundUpElementScrollLeft(scrollElement);\n let endLeft = getScrollPosition(startLeft);\n\n onScrollStart();\n\n if (endLeft >= maxLeft) {\n onScrollToRightBorder();\n endLeft = maxLeft;\n }\n\n const startTime = now();\n\n (function scroll() {\n if (!scrollElement) {\n onScrollEnd();\n return;\n }\n\n const time = now();\n const elapsed = Math.min((time - startTime) / scrollAnimationDuration, 1);\n\n const value = easeInOutSine(elapsed);\n\n const currentLeft = startLeft + (endLeft - startLeft) * value;\n scrollElement.scrollLeft = Math.ceil(currentLeft);\n\n if (roundUpElementScrollLeft(scrollElement) !== Math.max(0, endLeft) && elapsed !== 1) {\n requestAnimationFrame(scroll);\n return;\n }\n\n onScrollEnd();\n animationQueue.shift();\n if (animationQueue.length > 0) {\n animationQueue[0]();\n }\n })();\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/HorizontalScroll\n */\nexport const HorizontalScroll = ({\n children,\n getScrollToLeft,\n getScrollToRight,\n showArrows = true,\n arrowSize = 'l',\n arrowOffsetY,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n getRef,\n className,\n scrollOnAnyWheel = false,\n ...restProps\n}: HorizontalScrollProps) => {\n const [canScrollLeft, setCanScrollLeft] = React.useState(false);\n const [canScrollRight, setCanScrollRight] = React.useState(false);\n\n const isCustomScrollingRef = React.useRef(false);\n\n const scrollerRef = useExternRef(getRef);\n\n const animationQueue = React.useRef<VoidFunction[]>([]);\n\n const hasPointer = useAdaptivityHasPointer();\n\n const scrollTo = React.useCallback(\n (getScrollPosition: ScrollPositionHandler) => {\n const scrollElement = scrollerRef.current;\n\n animationQueue.current.push(() =>\n doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue: animationQueue.current,\n onScrollToRightBorder: () => setCanScrollRight(false),\n onScrollEnd: () => (isCustomScrollingRef.current = false),\n onScrollStart: () => (isCustomScrollingRef.current = true),\n initialScrollWidth: scrollElement?.firstElementChild?.scrollWidth || 0,\n scrollAnimationDuration,\n }),\n );\n if (animationQueue.current.length === 1) {\n animationQueue.current[0]();\n }\n },\n [scrollAnimationDuration, scrollerRef],\n );\n\n const scrollToLeft = React.useCallback(() => {\n const getScrollPosition =\n getScrollToLeft ?? ((i: number) => i - scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToLeft, scrollTo, scrollerRef]);\n\n const scrollToRight = React.useCallback(() => {\n const getScrollPosition =\n getScrollToRight ?? ((i: number) => i + scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToRight, scrollTo, scrollerRef]);\n\n const onscroll = React.useCallback(() => {\n if (showArrows && hasPointer && scrollerRef.current && !isCustomScrollingRef.current) {\n const scrollElement = scrollerRef.current;\n\n setCanScrollLeft(scrollElement.scrollLeft > 0);\n setCanScrollRight(\n roundUpElementScrollLeft(scrollElement) + scrollElement.offsetWidth <\n scrollElement.scrollWidth,\n );\n }\n }, [hasPointer, scrollerRef, showArrows]);\n\n const scrollEvent = useEventListener('scroll', onscroll);\n React.useEffect(() => {\n if (scrollerRef.current) {\n scrollEvent.add(scrollerRef.current);\n }\n }, [scrollEvent, scrollerRef]);\n React.useEffect(onscroll, [scrollerRef, children, onscroll]);\n\n /**\n * Прокрутка с помощью любого колеса мыши\n */\n const onwheel = React.useCallback(\n (e: WheelEvent) => {\n scrollerRef.current!.scrollBy({ left: e.deltaX + e.deltaY, behavior: 'auto' });\n e.preventDefault();\n },\n [scrollerRef],\n );\n\n const wheelEvent = useEventListener('wheel', onwheel);\n React.useEffect(() => {\n if (!scrollerRef.current || !scrollOnAnyWheel) {\n return noop;\n }\n\n wheelEvent.add(scrollerRef.current);\n\n return wheelEvent.remove;\n }, [wheelEvent, scrollerRef, scrollOnAnyWheel]);\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['HorizontalScroll'],\n 'vkuiInternalHorizontalScroll',\n showArrows === 'always' && styles['HorizontalScroll--withConstArrows'],\n className,\n )}\n >\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"left\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowLeft'],\n )}\n onClick={scrollToLeft}\n />\n )}\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollRight && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"right\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowRight'],\n )}\n onClick={scrollToRight}\n />\n )}\n <div className={styles['HorizontalScroll__in']} ref={scrollerRef}>\n <div className={styles['HorizontalScroll__in-wrapper']}>{children}</div>\n </div>\n </div>\n );\n};\n"],"names":["React","classNames","noop","useAdaptivityHasPointer","useEventListener","useExternRef","easeInOutSine","ScrollArrow","styles","now","performance","Date","roundUpElementScrollLeft","el","Math","ceil","scrollLeft","SCROLL_ONE_FRAME_TIME","doScroll","scrollElement","getScrollPosition","animationQueue","onScrollToRightBorder","onScrollEnd","onScrollStart","initialScrollWidth","scrollAnimationDuration","maxLeft","offsetWidth","startLeft","endLeft","startTime","scroll","time","elapsed","min","value","currentLeft","max","requestAnimationFrame","shift","length","HorizontalScroll","children","getScrollToLeft","getScrollToRight","showArrows","arrowSize","arrowOffsetY","getRef","className","scrollOnAnyWheel","restProps","canScrollLeft","setCanScrollLeft","useState","canScrollRight","setCanScrollRight","isCustomScrollingRef","useRef","scrollerRef","hasPointer","scrollTo","useCallback","current","push","firstElementChild","scrollWidth","scrollToLeft","i","scrollToRight","onscroll","scrollEvent","useEffect","add","onwheel","e","scrollBy","left","deltaX","deltaY","behavior","preventDefault","wheelEvent","remove","div","undefined","size","offsetY","direction","onClick","ref"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/HorizontalScroll/HorizontalScroll.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useEventListener } from '../../hooks/useEventListener';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { easeInOutSine } from '../../lib/fx';\nimport { HasRef } from '../../types';\nimport { ScrollArrow } from '../ScrollArrow/ScrollArrow';\nimport styles from './HorizontalScroll.module.css';\n\ninterface ScrollContext {\n scrollElement: HTMLElement | null;\n scrollAnimationDuration: number;\n animationQueue: VoidFunction[];\n getScrollPosition: (currentPosition: number) => number;\n onScrollToRightBorder: VoidFunction;\n onScrollEnd: VoidFunction;\n onScrollStart: VoidFunction;\n /**\n * Начальная ширина прокрутки.\n * В некоторых случаях может отличаться от текущей ширины прокрутки из-за transforms: translate\n */\n initialScrollWidth: number;\n}\n\nexport type ScrollPositionHandler = (currentPosition: number) => number;\n\nexport interface HorizontalScrollProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n /**\n * Функция для расчета величины прокрутки при клике на левую стрелку.\n */\n getScrollToLeft?: ScrollPositionHandler;\n /**\n * Функция для расчета величины прокрутки при клике на правую стрелку.\n */\n getScrollToRight?: ScrollPositionHandler;\n arrowSize?: 'm' | 'l';\n /**\n * Смещает иконки кнопок навигации по вертикали.\n */\n arrowOffsetY?: number | string;\n showArrows?: boolean | 'always';\n scrollAnimationDuration?: number;\n /**\n * Добавляет возможность прокручивать контент на любое колесо мыши.\n * По умолчанию прокручивается как любой горизонтальный контент через shift.\n */\n scrollOnAnyWheel?: boolean;\n}\n\n/**\n * timing method\n */\nfunction now() {\n return performance && performance.now ? performance.now() : Date.now();\n}\n\n/**\n * Округляем el.scrollLeft\n * https://github.com/VKCOM/VKUI/pull/2445\n */\nconst roundUpElementScrollLeft = (el: HTMLElement) => Math.ceil(el.scrollLeft);\n\n/**\n * Код анимации скрола, на основе полифила: https://github.com/iamdustan/smoothscroll\n * Константа взята из полифила (468), на дизайн-ревью уточнили до 250\n * @var {number} SCROLL_ONE_FRAME_TIME время анимации скролла\n */\nconst SCROLL_ONE_FRAME_TIME = 250;\n\nfunction doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue,\n onScrollToRightBorder,\n onScrollEnd,\n onScrollStart,\n initialScrollWidth,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n}: ScrollContext) {\n if (!scrollElement || !getScrollPosition) {\n return;\n }\n\n /**\n * максимальное значение сдвига влево\n */\n const maxLeft = initialScrollWidth - scrollElement.offsetWidth;\n\n let startLeft = roundUpElementScrollLeft(scrollElement);\n let endLeft = getScrollPosition(startLeft);\n\n onScrollStart();\n\n if (endLeft >= maxLeft) {\n onScrollToRightBorder();\n endLeft = maxLeft;\n }\n\n const startTime = now();\n\n (function scroll() {\n if (!scrollElement) {\n onScrollEnd();\n return;\n }\n\n const time = now();\n const elapsed = Math.min((time - startTime) / scrollAnimationDuration, 1);\n\n const value = easeInOutSine(elapsed);\n\n const currentLeft = startLeft + (endLeft - startLeft) * value;\n scrollElement.scrollLeft = Math.ceil(currentLeft);\n\n if (roundUpElementScrollLeft(scrollElement) !== Math.max(0, endLeft) && elapsed !== 1) {\n requestAnimationFrame(scroll);\n return;\n }\n\n onScrollEnd();\n animationQueue.shift();\n if (animationQueue.length > 0) {\n animationQueue[0]();\n }\n })();\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/HorizontalScroll\n */\nexport const HorizontalScroll = ({\n children,\n getScrollToLeft,\n getScrollToRight,\n showArrows = true,\n arrowSize = 'l',\n arrowOffsetY,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n getRef,\n className,\n scrollOnAnyWheel = false,\n ...restProps\n}: HorizontalScrollProps) => {\n const [canScrollLeft, setCanScrollLeft] = React.useState(false);\n const [canScrollRight, setCanScrollRight] = React.useState(false);\n\n const isCustomScrollingRef = React.useRef(false);\n\n const scrollerRef = useExternRef(getRef);\n\n const animationQueue = React.useRef<VoidFunction[]>([]);\n\n const hasPointer = useAdaptivityHasPointer();\n\n const scrollTo = React.useCallback(\n (getScrollPosition: ScrollPositionHandler) => {\n const scrollElement = scrollerRef.current;\n\n animationQueue.current.push(() =>\n doScroll({\n scrollElement,\n getScrollPosition,\n animationQueue: animationQueue.current,\n onScrollToRightBorder: () => setCanScrollRight(false),\n onScrollEnd: () => (isCustomScrollingRef.current = false),\n onScrollStart: () => (isCustomScrollingRef.current = true),\n initialScrollWidth: scrollElement?.firstElementChild?.scrollWidth || 0,\n scrollAnimationDuration,\n }),\n );\n if (animationQueue.current.length === 1) {\n animationQueue.current[0]();\n }\n },\n [scrollAnimationDuration, scrollerRef],\n );\n\n const scrollToLeft = React.useCallback(() => {\n const getScrollPosition =\n getScrollToLeft ?? ((i: number) => i - scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToLeft, scrollTo, scrollerRef]);\n\n const scrollToRight = React.useCallback(() => {\n const getScrollPosition =\n getScrollToRight ?? ((i: number) => i + scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToRight, scrollTo, scrollerRef]);\n\n const calculateArrowsVisibility = React.useCallback(() => {\n if (showArrows && hasPointer && scrollerRef.current && !isCustomScrollingRef.current) {\n const scrollElement = scrollerRef.current;\n\n setCanScrollLeft(scrollElement.scrollLeft > 0);\n setCanScrollRight(\n roundUpElementScrollLeft(scrollElement) + scrollElement.offsetWidth <\n scrollElement.scrollWidth,\n );\n }\n }, [hasPointer, scrollerRef, showArrows]);\n\n const scrollEvent = useEventListener('scroll', calculateArrowsVisibility);\n React.useEffect(\n function addScrollerRefToScrollEvent() {\n if (!scrollerRef.current) {\n return noop;\n }\n\n scrollEvent.add(scrollerRef.current);\n return scrollEvent.remove;\n },\n [scrollEvent, scrollerRef],\n );\n\n React.useEffect(calculateArrowsVisibility, [calculateArrowsVisibility, children]);\n\n /**\n * Прокрутка с помощью любого колеса мыши\n */\n const onwheel = React.useCallback(\n (e: WheelEvent) => {\n scrollerRef.current!.scrollBy({ left: e.deltaX + e.deltaY, behavior: 'auto' });\n e.preventDefault();\n },\n [scrollerRef],\n );\n\n const wheelEvent = useEventListener('wheel', onwheel);\n React.useEffect(\n function addScrollerRefToWheelEvent() {\n if (!scrollerRef.current || !scrollOnAnyWheel) {\n return noop;\n }\n\n wheelEvent.add(scrollerRef.current);\n\n return wheelEvent.remove;\n },\n [wheelEvent, scrollerRef, scrollOnAnyWheel],\n );\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['HorizontalScroll'],\n 'vkuiInternalHorizontalScroll',\n showArrows === 'always' && styles['HorizontalScroll--withConstArrows'],\n className,\n )}\n onMouseEnter={calculateArrowsVisibility}\n >\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollLeft && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"left\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowLeft'],\n )}\n onClick={scrollToLeft}\n />\n )}\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollRight && (\n <ScrollArrow\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"right\"\n className={classNames(\n styles['HorizontalScroll__arrow'],\n styles['HorizontalScroll__arrowRight'],\n )}\n onClick={scrollToRight}\n />\n )}\n <div className={styles['HorizontalScroll__in']} ref={scrollerRef}>\n <div className={styles['HorizontalScroll__in-wrapper']}>{children}</div>\n </div>\n </div>\n );\n};\n"],"names":["React","classNames","noop","useAdaptivityHasPointer","useEventListener","useExternRef","easeInOutSine","ScrollArrow","styles","now","performance","Date","roundUpElementScrollLeft","el","Math","ceil","scrollLeft","SCROLL_ONE_FRAME_TIME","doScroll","scrollElement","getScrollPosition","animationQueue","onScrollToRightBorder","onScrollEnd","onScrollStart","initialScrollWidth","scrollAnimationDuration","maxLeft","offsetWidth","startLeft","endLeft","startTime","scroll","time","elapsed","min","value","currentLeft","max","requestAnimationFrame","shift","length","HorizontalScroll","children","getScrollToLeft","getScrollToRight","showArrows","arrowSize","arrowOffsetY","getRef","className","scrollOnAnyWheel","restProps","canScrollLeft","setCanScrollLeft","useState","canScrollRight","setCanScrollRight","isCustomScrollingRef","useRef","scrollerRef","hasPointer","scrollTo","useCallback","current","push","firstElementChild","scrollWidth","scrollToLeft","i","scrollToRight","calculateArrowsVisibility","scrollEvent","useEffect","addScrollerRefToScrollEvent","add","remove","onwheel","e","scrollBy","left","deltaX","deltaY","behavior","preventDefault","wheelEvent","addScrollerRefToWheelEvent","div","onMouseEnter","undefined","size","offsetY","direction","onClick","ref"],"mappings":"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"}
@@ -2,55 +2,68 @@ import * as React from 'react';
2
2
  import { ImageBase } from '../ImageBase/ImageBase';
3
3
  import { ImageBadge } from './ImageBadge/ImageBadge';
4
4
  export const IMAGE_DEFAULT_SIZE = 48;
5
- /**
6
- * @see https://vkcom.github.io/VKUI/#/Image
7
- */ export const Image = ({ size = IMAGE_DEFAULT_SIZE, borderRadius: borderRadiusProp = 'm', style, className, ...restProps })=>{
8
- let borderRadius;
9
- switch(borderRadiusProp){
5
+ const getBorderRadiusBySize = (size, borderRadius)=>{
6
+ switch(borderRadius){
10
7
  case 's':
11
8
  {
12
9
  if (size <= 32) {
13
- borderRadius = 2;
14
- } else if (size <= 56) {
15
- borderRadius = 3;
10
+ return 2;
16
11
  }
17
- borderRadius = 4;
18
- break;
12
+ if (size <= 56) {
13
+ return 3;
14
+ }
15
+ return 4;
19
16
  }
20
17
  case 'm':
21
18
  {
22
19
  if (size <= 32) {
23
- borderRadius = 3;
24
- } else if (size <= 48) {
25
- borderRadius = 4;
26
- } else if (size <= 72) {
27
- borderRadius = 6;
28
- } else if (size <= 80) {
29
- borderRadius = 8;
20
+ return 3;
21
+ }
22
+ if (size <= 48) {
23
+ return 4;
30
24
  }
31
- borderRadius = 10;
32
- break;
25
+ if (size <= 72) {
26
+ return 6;
27
+ }
28
+ if (size <= 80) {
29
+ return 8;
30
+ }
31
+ return 10;
33
32
  }
34
33
  case 'l':
35
34
  {
36
35
  if (size <= 16) {
37
- borderRadius = 4;
38
- } else if (size <= 20) {
39
- borderRadius = 5;
40
- } else if (size <= 32) {
41
- borderRadius = 6;
42
- } else if (size <= 40) {
43
- borderRadius = 8;
44
- } else if (size <= 48) {
45
- borderRadius = 10;
46
- } else if (size <= 56) {
47
- borderRadius = 12;
48
- } else if (size <= 64) {
49
- borderRadius = 14;
36
+ return 4;
37
+ }
38
+ if (size <= 20) {
39
+ return 5;
40
+ }
41
+ if (size <= 32) {
42
+ return 6;
43
+ }
44
+ if (size <= 40) {
45
+ return 8;
46
+ }
47
+ if (size <= 48) {
48
+ return 10;
49
+ }
50
+ if (size <= 56) {
51
+ return 12;
52
+ }
53
+ if (size <= 64) {
54
+ return 14;
50
55
  }
51
- borderRadius = 16;
56
+ return 16;
52
57
  }
53
58
  }
59
+ };
60
+ /**
61
+ * @see https://vkcom.github.io/VKUI/#/Image
62
+ */ export const Image = ({ size = IMAGE_DEFAULT_SIZE, borderRadius: borderRadiusProp = 'm', style, className, ...restProps })=>{
63
+ const borderRadius = React.useMemo(()=>getBorderRadiusBySize(size, borderRadiusProp), [
64
+ size,
65
+ borderRadiusProp
66
+ ]);
54
67
  return /*#__PURE__*/ React.createElement(ImageBase, {
55
68
  ...restProps,
56
69
  size: size,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/Image/Image.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ImageBase, type ImageBaseOverlayProps, type ImageBaseProps } from '../ImageBase/ImageBase';\nimport { ImageBadge, type ImageBadgeProps } from './ImageBadge/ImageBadge';\n\nexport type { ImageBadgeProps, ImageBaseOverlayProps as ImageOverlayProps };\n\nexport const IMAGE_DEFAULT_SIZE = 48;\n\nexport interface ImageProps extends Omit<ImageBaseProps, 'badge'> {\n /**\n * Размер закругления.\n */\n borderRadius?: 's' | 'l' | 'm';\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Image\n */\nexport const Image = ({\n size = IMAGE_DEFAULT_SIZE,\n borderRadius: borderRadiusProp = 'm',\n style,\n className,\n ...restProps\n}: ImageProps) => {\n let borderRadius: number;\n\n switch (borderRadiusProp) {\n case 's': {\n if (size <= 32) {\n borderRadius = 2;\n } else if (size <= 56) {\n borderRadius = 3;\n }\n borderRadius = 4;\n break;\n }\n case 'm': {\n if (size <= 32) {\n borderRadius = 3;\n } else if (size <= 48) {\n borderRadius = 4;\n } else if (size <= 72) {\n borderRadius = 6;\n } else if (size <= 80) {\n borderRadius = 8;\n }\n borderRadius = 10;\n break;\n }\n case 'l': {\n if (size <= 16) {\n borderRadius = 4;\n } else if (size <= 20) {\n borderRadius = 5;\n } else if (size <= 32) {\n borderRadius = 6;\n } else if (size <= 40) {\n borderRadius = 8;\n } else if (size <= 48) {\n borderRadius = 10;\n } else if (size <= 56) {\n borderRadius = 12;\n } else if (size <= 64) {\n borderRadius = 14;\n }\n borderRadius = 16;\n }\n }\n\n return (\n <ImageBase\n {...restProps}\n size={size}\n style={{ ...style, borderRadius }}\n className={className}\n />\n );\n};\n\nImage.Badge = ImageBadge;\n\nImage.Overlay = ImageBase.Overlay;\n"],"names":["React","ImageBase","ImageBadge","IMAGE_DEFAULT_SIZE","Image","size","borderRadius","borderRadiusProp","style","className","restProps","Badge","Overlay"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,SAAS,QAAyD,yBAAyB;AACpG,SAASC,UAAU,QAA8B,0BAA0B;AAI3E,OAAO,MAAMC,qBAAqB,GAAG;AASrC;;CAEC,GACD,OAAO,MAAMC,QAAQ,CAAC,EACpBC,OAAOF,kBAAkB,EACzBG,cAAcC,mBAAmB,GAAG,EACpCC,KAAK,EACLC,SAAS,EACT,GAAGC,WACQ;IACX,IAAIJ;IAEJ,OAAQC;QACN,KAAK;YAAK;gBACR,IAAIF,QAAQ,IAAI;oBACdC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB;gBACAA,eAAe;gBACf;YACF;QACA,KAAK;YAAK;gBACR,IAAID,QAAQ,IAAI;oBACdC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB;gBACAA,eAAe;gBACf;YACF;QACA,KAAK;YAAK;gBACR,IAAID,QAAQ,IAAI;oBACdC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB,OAAO,IAAID,QAAQ,IAAI;oBACrBC,eAAe;gBACjB;gBACAA,eAAe;YACjB;IACF;IAEA,qBACE,oBAACL;QACE,GAAGS,SAAS;QACbL,MAAMA;QACNG,OAAO;YAAE,GAAGA,KAAK;YAAEF;QAAa;QAChCG,WAAWA;;AAGjB,EAAE;AAEFL,MAAMO,KAAK,GAAGT;AAEdE,MAAMQ,OAAO,GAAGX,UAAUW,OAAO"}
1
+ {"version":3,"sources":["../../../../src/components/Image/Image.tsx"],"sourcesContent":["import * as React from 'react';\nimport { ImageBase, type ImageBaseOverlayProps, type ImageBaseProps } from '../ImageBase/ImageBase';\nimport { ImageBadge, type ImageBadgeProps } from './ImageBadge/ImageBadge';\n\nexport type { ImageBadgeProps, ImageBaseOverlayProps as ImageOverlayProps };\n\nexport const IMAGE_DEFAULT_SIZE = 48;\n\nexport interface ImageProps extends Omit<ImageBaseProps, 'badge'> {\n /**\n * Размер закругления.\n */\n borderRadius?: 's' | 'l' | 'm';\n}\n\nconst getBorderRadiusBySize = (\n size: Exclude<ImageBaseProps['size'], undefined>,\n borderRadius: Exclude<ImageProps['borderRadius'], undefined>,\n) => {\n switch (borderRadius) {\n case 's': {\n if (size <= 32) {\n return 2;\n }\n if (size <= 56) {\n return 3;\n }\n return 4;\n }\n case 'm': {\n if (size <= 32) {\n return 3;\n }\n if (size <= 48) {\n return 4;\n }\n if (size <= 72) {\n return 6;\n }\n if (size <= 80) {\n return 8;\n }\n return 10;\n }\n case 'l': {\n if (size <= 16) {\n return 4;\n }\n if (size <= 20) {\n return 5;\n }\n if (size <= 32) {\n return 6;\n }\n if (size <= 40) {\n return 8;\n }\n if (size <= 48) {\n return 10;\n }\n if (size <= 56) {\n return 12;\n }\n if (size <= 64) {\n return 14;\n }\n return 16;\n }\n }\n};\n\n/**\n * @see https://vkcom.github.io/VKUI/#/Image\n */\nexport const Image = ({\n size = IMAGE_DEFAULT_SIZE,\n borderRadius: borderRadiusProp = 'm',\n style,\n className,\n ...restProps\n}: ImageProps) => {\n const borderRadius = React.useMemo(\n () => getBorderRadiusBySize(size, borderRadiusProp),\n [size, borderRadiusProp],\n );\n\n return (\n <ImageBase\n {...restProps}\n size={size}\n style={{ ...style, borderRadius }}\n className={className}\n />\n );\n};\n\nImage.Badge = ImageBadge;\n\nImage.Overlay = ImageBase.Overlay;\n"],"names":["React","ImageBase","ImageBadge","IMAGE_DEFAULT_SIZE","getBorderRadiusBySize","size","borderRadius","Image","borderRadiusProp","style","className","restProps","useMemo","Badge","Overlay"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,SAAS,QAAyD,yBAAyB;AACpG,SAASC,UAAU,QAA8B,0BAA0B;AAI3E,OAAO,MAAMC,qBAAqB,GAAG;AASrC,MAAMC,wBAAwB,CAC5BC,MACAC;IAEA,OAAQA;QACN,KAAK;YAAK;gBACR,IAAID,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,OAAO;YACT;QACA,KAAK;YAAK;gBACR,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,OAAO;YACT;QACA,KAAK;YAAK;gBACR,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,IAAIA,QAAQ,IAAI;oBACd,OAAO;gBACT;gBACA,OAAO;YACT;IACF;AACF;AAEA;;CAEC,GACD,OAAO,MAAME,QAAQ,CAAC,EACpBF,OAAOF,kBAAkB,EACzBG,cAAcE,mBAAmB,GAAG,EACpCC,KAAK,EACLC,SAAS,EACT,GAAGC,WACQ;IACX,MAAML,eAAeN,MAAMY,OAAO,CAChC,IAAMR,sBAAsBC,MAAMG,mBAClC;QAACH;QAAMG;KAAiB;IAG1B,qBACE,oBAACP;QACE,GAAGU,SAAS;QACbN,MAAMA;QACNI,OAAO;YAAE,GAAGA,KAAK;YAAEH;QAAa;QAChCI,WAAWA;;AAGjB,EAAE;AAEFH,MAAMM,KAAK,GAAGX;AAEdK,MAAMO,OAAO,GAAGb,UAAUa,OAAO"}
@@ -1,5 +1,6 @@
1
1
  import * as React from 'react';
2
2
  import { classNames } from '@vkontakte/vkjs';
3
+ import { useExternRef } from '../../hooks/useExternRef';
3
4
  import { ImageBaseBadge } from './ImageBaseBadge/ImageBaseBadge';
4
5
  import { ImageBaseOverlay } from './ImageBaseOverlay/ImageBaseOverlay';
5
6
  import { ImageBaseContext } from './context';
@@ -25,6 +26,9 @@ export { ImageBaseContext };
25
26
  }
26
27
  }
27
28
  const handleImageLoad = (event)=>{
29
+ if (loaded) {
30
+ return;
31
+ }
28
32
  setLoaded(true);
29
33
  setFailed(false);
30
34
  onLoad?.(event);
@@ -34,6 +38,21 @@ export { ImageBaseContext };
34
38
  setFailed(true);
35
39
  onError?.(event);
36
40
  };
41
+ const imgRef = useExternRef(getRef);
42
+ const isOnLoadStatusCheckedRef = React.useRef(false);
43
+ React.useEffect(function dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater() {
44
+ if (isOnLoadStatusCheckedRef.current) {
45
+ return;
46
+ }
47
+ isOnLoadStatusCheckedRef.current = true;
48
+ if (imgRef.current && imgRef.current.complete && !loaded) {
49
+ const event = new Event('load');
50
+ imgRef.current.dispatchEvent(event);
51
+ }
52
+ }, [
53
+ imgRef,
54
+ loaded
55
+ ]);
37
56
  const sizeClassName = (()=>{
38
57
  switch(size){
39
58
  case 28:
@@ -66,7 +85,7 @@ export { ImageBaseContext };
66
85
  "aria-label": ariaLabel,
67
86
  onClick: onClick
68
87
  }, hasSrc && /*#__PURE__*/ React.createElement("img", {
69
- ref: getRef,
88
+ ref: imgRef,
70
89
  alt: alt,
71
90
  className: styles['ImageBase__img'],
72
91
  crossOrigin: crossOrigin,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/ImageBase/ImageBase.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport type { HasRef, HasRootRef, LiteralUnion } from '../../types';\nimport { ImageBaseBadge, type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';\nimport { ImageBaseOverlay, type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';\nimport { ImageBaseContext } from './context';\nimport type { ImageBaseContextProps, ImageBaseExpectedIconProps, ImageBaseSize } from './types';\nimport { validateFallbackIcon, validateSize } from './validators';\nimport styles from './ImageBase.module.css';\n\nexport type {\n ImageBaseSize,\n ImageBaseExpectedIconProps,\n ImageBaseBadgeProps,\n ImageBaseOverlayProps,\n ImageBaseContextProps,\n};\n\nexport {\n getBadgeIconSizeByImageBaseSize,\n getFallbackIconSizeByImageBaseSize,\n getOverlayIconSizeByImageBaseSize,\n} from './helpers';\n\nexport { ImageBaseContext };\n\nexport interface ImageBaseProps\n extends React.ImgHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLImageElement> {\n /**\n * Задаёт размер картинки.\n *\n * Используйте размеры заданные дизайн-системой `16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 56 | 64 | 72 | 80 | 88 | 96`.\n *\n * > ⚠️ Использование кастомного размера – это пограничный кейс.\n */\n size?: LiteralUnion<ImageBaseSize, number>;\n /**\n * Включает или отключает обводку.\n */\n withBorder?: boolean;\n /**\n * Фолбек на случай, если картинка не прогрузилась.\n *\n * > 📝 Нужный для `<ImageBase size={...} />` размер можно узнать из функции `getFallbackIconSizeByImageBaseSize()`.\n *\n * > Предпочтительней использовать иконки из `@vkontakte/icons`.\n *\n * > 📊️ Если вы хотите передать кастомную иконку, то следует именовать её по шаблону `Icon<size><name>`. Или же\n * > чтобы в неё был передан параметр `width`. Тогда мы сможем выводить в консоль подсказку правильного ли размера вы\n * > использовали иконку.\n *\n * > ⚠️ Может перекрывать `children`.\n */\n fallbackIcon?: React.ReactElement<ImageBaseExpectedIconProps>;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ImageBase\n */\nexport const ImageBase = ({\n alt,\n crossOrigin,\n decoding,\n loading,\n referrerPolicy,\n sizes,\n src,\n srcSet,\n useMap,\n getRef,\n size = 24,\n width,\n height,\n style,\n className,\n getRootRef,\n withBorder = true,\n 'fallbackIcon': fallbackIconProp,\n children,\n 'aria-label': ariaLabel,\n onClick,\n onLoad,\n onError,\n ...restProps\n}: ImageBaseProps) => {\n const [loaded, setLoaded] = React.useState(false);\n const [failed, setFailed] = React.useState(false);\n\n const hasSrc = src || srcSet;\n const needShowFallbackIcon = (failed || !hasSrc) && React.isValidElement(fallbackIconProp);\n\n const fallbackIcon = needShowFallbackIcon ? fallbackIconProp : null;\n\n if (process.env.NODE_ENV === 'development') {\n validateSize(size);\n if (fallbackIcon) {\n validateFallbackIcon(size, { name: 'fallbackIcon', value: fallbackIcon });\n }\n }\n\n const handleImageLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(true);\n setFailed(false);\n onLoad?.(event);\n };\n\n const handleImageError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(false);\n setFailed(true);\n onError?.(event);\n };\n\n const sizeClassName = (() => {\n switch (size) {\n case 28:\n return styles['ImageBase--size-28'];\n case 32:\n return styles['ImageBase--size-32'];\n case 40:\n return styles['ImageBase--size-40'];\n case 48:\n return styles['ImageBase--size-48'];\n case 72:\n return styles['ImageBase--size-72'];\n }\n\n return null;\n })();\n\n return (\n <ImageBaseContext.Provider value={{ size }}>\n <div\n {...restProps}\n ref={getRootRef}\n style={{ ...style, width: size, height: size }}\n className={classNames(\n className,\n styles['ImageBase'],\n sizeClassName,\n loaded && styles['ImageBase--loaded'],\n )}\n role={hasSrc ? 'img' : 'presentation'}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {hasSrc && (\n <img\n ref={getRef}\n alt={alt}\n className={styles['ImageBase__img']}\n crossOrigin={crossOrigin}\n decoding={decoding}\n loading={loading}\n referrerPolicy={referrerPolicy}\n sizes={sizes}\n src={src}\n srcSet={srcSet}\n useMap={useMap}\n width={width}\n height={height}\n onLoad={handleImageLoad}\n onError={handleImageError}\n />\n )}\n {fallbackIcon && (\n <div className={classNames(styles['ImageBase__fallback'])}>{fallbackIcon}</div>\n )}\n {children}\n {withBorder && <div aria-hidden className={styles['ImageBase__border']} />}\n </div>\n </ImageBaseContext.Provider>\n );\n};\n\nImageBase.Badge = ImageBaseBadge;\n\nImageBase.Overlay = ImageBaseOverlay;\n"],"names":["React","classNames","ImageBaseBadge","ImageBaseOverlay","ImageBaseContext","validateFallbackIcon","validateSize","styles","getBadgeIconSizeByImageBaseSize","getFallbackIconSizeByImageBaseSize","getOverlayIconSizeByImageBaseSize","ImageBase","alt","crossOrigin","decoding","loading","referrerPolicy","sizes","src","srcSet","useMap","getRef","size","width","height","style","className","getRootRef","withBorder","fallbackIconProp","children","ariaLabel","onClick","onLoad","onError","restProps","loaded","setLoaded","useState","failed","setFailed","hasSrc","needShowFallbackIcon","isValidElement","fallbackIcon","process","env","NODE_ENV","name","value","handleImageLoad","event","handleImageError","sizeClassName","Provider","div","ref","role","aria-label","img","aria-hidden","Badge","Overlay"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../src/components/ImageBase/ImageBase.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport type { HasRef, HasRootRef, LiteralUnion } from '../../types';\nimport { ImageBaseBadge, type ImageBaseBadgeProps } from './ImageBaseBadge/ImageBaseBadge';\nimport { ImageBaseOverlay, type ImageBaseOverlayProps } from './ImageBaseOverlay/ImageBaseOverlay';\nimport { ImageBaseContext } from './context';\nimport type { ImageBaseContextProps, ImageBaseExpectedIconProps, ImageBaseSize } from './types';\nimport { validateFallbackIcon, validateSize } from './validators';\nimport styles from './ImageBase.module.css';\n\nexport type {\n ImageBaseSize,\n ImageBaseExpectedIconProps,\n ImageBaseBadgeProps,\n ImageBaseOverlayProps,\n ImageBaseContextProps,\n};\n\nexport {\n getBadgeIconSizeByImageBaseSize,\n getFallbackIconSizeByImageBaseSize,\n getOverlayIconSizeByImageBaseSize,\n} from './helpers';\n\nexport { ImageBaseContext };\n\nexport interface ImageBaseProps\n extends React.ImgHTMLAttributes<HTMLElement>,\n HasRootRef<HTMLDivElement>,\n HasRef<HTMLImageElement> {\n /**\n * Задаёт размер картинки.\n *\n * Используйте размеры заданные дизайн-системой `16 | 20 | 24 | 28 | 32 | 36 | 40 | 44 | 48 | 56 | 64 | 72 | 80 | 88 | 96`.\n *\n * > ⚠️ Использование кастомного размера – это пограничный кейс.\n */\n size?: LiteralUnion<ImageBaseSize, number>;\n /**\n * Включает или отключает обводку.\n */\n withBorder?: boolean;\n /**\n * Фолбек на случай, если картинка не прогрузилась.\n *\n * > 📝 Нужный для `<ImageBase size={...} />` размер можно узнать из функции `getFallbackIconSizeByImageBaseSize()`.\n *\n * > Предпочтительней использовать иконки из `@vkontakte/icons`.\n *\n * > 📊️ Если вы хотите передать кастомную иконку, то следует именовать её по шаблону `Icon<size><name>`. Или же\n * > чтобы в неё был передан параметр `width`. Тогда мы сможем выводить в консоль подсказку правильного ли размера вы\n * > использовали иконку.\n *\n * > ⚠️ Может перекрывать `children`.\n */\n fallbackIcon?: React.ReactElement<ImageBaseExpectedIconProps>;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/ImageBase\n */\nexport const ImageBase = ({\n alt,\n crossOrigin,\n decoding,\n loading,\n referrerPolicy,\n sizes,\n src,\n srcSet,\n useMap,\n getRef,\n size = 24,\n width,\n height,\n style,\n className,\n getRootRef,\n withBorder = true,\n 'fallbackIcon': fallbackIconProp,\n children,\n 'aria-label': ariaLabel,\n onClick,\n onLoad,\n onError,\n ...restProps\n}: ImageBaseProps) => {\n const [loaded, setLoaded] = React.useState(false);\n const [failed, setFailed] = React.useState(false);\n\n const hasSrc = src || srcSet;\n const needShowFallbackIcon = (failed || !hasSrc) && React.isValidElement(fallbackIconProp);\n\n const fallbackIcon = needShowFallbackIcon ? fallbackIconProp : null;\n\n if (process.env.NODE_ENV === 'development') {\n validateSize(size);\n if (fallbackIcon) {\n validateFallbackIcon(size, { name: 'fallbackIcon', value: fallbackIcon });\n }\n }\n\n const handleImageLoad = (event: React.SyntheticEvent<HTMLImageElement>) => {\n if (loaded) {\n return;\n }\n\n setLoaded(true);\n setFailed(false);\n onLoad?.(event);\n };\n\n const handleImageError = (event: React.SyntheticEvent<HTMLImageElement>) => {\n setLoaded(false);\n setFailed(true);\n onError?.(event);\n };\n\n const imgRef = useExternRef(getRef);\n const isOnLoadStatusCheckedRef = React.useRef(false);\n React.useEffect(\n function dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater() {\n if (isOnLoadStatusCheckedRef.current) {\n return;\n }\n isOnLoadStatusCheckedRef.current = true;\n\n if (imgRef.current && imgRef.current.complete && !loaded) {\n const event = new Event('load');\n imgRef.current.dispatchEvent(event);\n }\n },\n [imgRef, loaded],\n );\n\n const sizeClassName = (() => {\n switch (size) {\n case 28:\n return styles['ImageBase--size-28'];\n case 32:\n return styles['ImageBase--size-32'];\n case 40:\n return styles['ImageBase--size-40'];\n case 48:\n return styles['ImageBase--size-48'];\n case 72:\n return styles['ImageBase--size-72'];\n }\n\n return null;\n })();\n\n return (\n <ImageBaseContext.Provider value={{ size }}>\n <div\n {...restProps}\n ref={getRootRef}\n style={{ ...style, width: size, height: size }}\n className={classNames(\n className,\n styles['ImageBase'],\n sizeClassName,\n loaded && styles['ImageBase--loaded'],\n )}\n role={hasSrc ? 'img' : 'presentation'}\n aria-label={ariaLabel}\n onClick={onClick}\n >\n {hasSrc && (\n <img\n ref={imgRef}\n alt={alt}\n className={styles['ImageBase__img']}\n crossOrigin={crossOrigin}\n decoding={decoding}\n loading={loading}\n referrerPolicy={referrerPolicy}\n sizes={sizes}\n src={src}\n srcSet={srcSet}\n useMap={useMap}\n width={width}\n height={height}\n onLoad={handleImageLoad}\n onError={handleImageError}\n />\n )}\n {fallbackIcon && (\n <div className={classNames(styles['ImageBase__fallback'])}>{fallbackIcon}</div>\n )}\n {children}\n {withBorder && <div aria-hidden className={styles['ImageBase__border']} />}\n </div>\n </ImageBaseContext.Provider>\n );\n};\n\nImageBase.Badge = ImageBaseBadge;\n\nImageBase.Overlay = ImageBaseOverlay;\n"],"names":["React","classNames","useExternRef","ImageBaseBadge","ImageBaseOverlay","ImageBaseContext","validateFallbackIcon","validateSize","styles","getBadgeIconSizeByImageBaseSize","getFallbackIconSizeByImageBaseSize","getOverlayIconSizeByImageBaseSize","ImageBase","alt","crossOrigin","decoding","loading","referrerPolicy","sizes","src","srcSet","useMap","getRef","size","width","height","style","className","getRootRef","withBorder","fallbackIconProp","children","ariaLabel","onClick","onLoad","onError","restProps","loaded","setLoaded","useState","failed","setFailed","hasSrc","needShowFallbackIcon","isValidElement","fallbackIcon","process","env","NODE_ENV","name","value","handleImageLoad","event","handleImageError","imgRef","isOnLoadStatusCheckedRef","useRef","useEffect","dispatchLoadEventForAlreadyLoadedResourceIfReactInitializedLater","current","complete","Event","dispatchEvent","sizeClassName","Provider","div","ref","role","aria-label","img","aria-hidden","Badge","Overlay"],"mappings":"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"}
@@ -16,7 +16,7 @@ import styles from './MiniInfoCell.module.css';
16
16
  accent: styles['MiniInfoCell--mode-accent'],
17
17
  more: styles['MiniInfoCell--mode-more']
18
18
  })[mode], className);
19
- const cellContent = /*#__PURE__*/ React.createElement(React.Fragment, null, /*#__PURE__*/ React.createElement("span", {
19
+ const cellContent = /*#__PURE__*/ React.createElement(React.Fragment, null, hasReactNode(before) && /*#__PURE__*/ React.createElement("span", {
20
20
  className: styles['MiniInfoCell__before']
21
21
  }, before), /*#__PURE__*/ React.createElement("div", {
22
22
  className: styles['MiniInfoCell__middle']
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/MiniInfoCell/MiniInfoCell.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Chevron } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport styles from './MiniInfoCell.module.css';\n\nexport interface MiniInfoCellProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Иконка слева.<br />\n * Рекомендуется использовать иконки размера 20.\n */\n before: React.ReactNode;\n\n /**\n * Содержимое справа.<br />\n * `<UsersStack size=\"s\" />` или `<Avatar size={24} />`\n */\n after?: React.ReactNode;\n\n /**\n * Тип ячейки:\n *\n * - `base` – базовая ячейка с серой иконкой и серым текстом.<br />\n * В компонент можно передать `Link`, чтобы визуально сделать часть текста ссылкой.\n * - `add` – тип ячейки, который показывает, что взаимодействие с ней должно вызывать действие добавления чего-то.\n * - `more` – взаимодействие с такой ячейкой должно открывать какую-то подробную информацию.\n */\n mode?: 'base' | 'accent' | 'add' | 'more';\n\n /**\n * Тип отображения текста:\n *\n * - `nowrap` – в одну строку, текст не переносится и обрезается.\n * - `short` – максимально отображается 3 строки, остальное обрезается.\n * - `full` – текст отображается полностью.\n */\n textWrap?: 'nowrap' | 'short' | 'full';\n\n /**\n * Передавать `true`, если предполагается переход при клике по ячейке.\n */\n expandable?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/MiniInfoCell\n */\nexport const MiniInfoCell = ({\n before,\n after,\n children,\n mode = 'base',\n textWrap = 'nowrap',\n expandable = false,\n className,\n ...restProps\n}: MiniInfoCellProps) => {\n const cellClasses = classNames(\n styles['MiniInfoCell'],\n {\n nowrap: styles['MiniInfoCell--textWrap-nowrap'],\n full: styles['MiniInfoCell--textWrap-full'],\n short: styles['MiniInfoCell--textWrap-short'],\n }[textWrap],\n mode !== 'base' &&\n {\n add: styles['MiniInfoCell--mode-add'],\n accent: styles['MiniInfoCell--mode-accent'],\n more: styles['MiniInfoCell--mode-more'],\n }[mode],\n className,\n );\n\n const cellContent = (\n <React.Fragment>\n <span className={styles['MiniInfoCell__before']}>{before}</span>\n <div className={styles['MiniInfoCell__middle']}>\n <Paragraph\n className={styles['MiniInfoCell__content']}\n weight={mode === 'more' ? '2' : undefined}\n >\n {children}\n </Paragraph>\n {expandable && <Icon16Chevron />}\n </div>\n {hasReactNode(after) && <span className={styles['MiniInfoCell__after']}>{after}</span>}\n </React.Fragment>\n );\n\n return restProps.onClick ? (\n <Tappable Component=\"div\" role=\"button\" {...restProps} className={cellClasses}>\n {cellContent}\n </Tappable>\n ) : (\n <div {...restProps} className={cellClasses}>\n {cellContent}\n </div>\n );\n};\n"],"names":["React","Icon16Chevron","classNames","hasReactNode","Tappable","Paragraph","styles","MiniInfoCell","before","after","children","mode","textWrap","expandable","className","restProps","cellClasses","nowrap","full","short","add","accent","more","cellContent","Fragment","span","div","weight","undefined","onClick","Component","role"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,aAAa,QAAQ,mBAAmB;AACjD,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,SAAS,QAAQ,oCAAoC;AAC9D,OAAOC,YAAY,4BAA4B;AAwC/C;;CAEC,GACD,OAAO,MAAMC,eAAe,CAAC,EAC3BC,MAAM,EACNC,KAAK,EACLC,QAAQ,EACRC,OAAO,MAAM,EACbC,WAAW,QAAQ,EACnBC,aAAa,KAAK,EAClBC,SAAS,EACT,GAAGC,WACe;IAClB,MAAMC,cAAcd,WAClBI,MAAM,CAAC,eAAe,EACtB;QACEW,QAAQX,MAAM,CAAC,gCAAgC;QAC/CY,MAAMZ,MAAM,CAAC,8BAA8B;QAC3Ca,OAAOb,MAAM,CAAC,+BAA+B;IAC/C,CAAC,CAACM,SAAS,EACXD,SAAS,UACP,CAAA;QACES,KAAKd,MAAM,CAAC,yBAAyB;QACrCe,QAAQf,MAAM,CAAC,4BAA4B;QAC3CgB,MAAMhB,MAAM,CAAC,0BAA0B;IACzC,CAAA,CAAC,CAACK,KAAK,EACTG;IAGF,MAAMS,4BACJ,oBAACvB,MAAMwB,QAAQ,sBACb,oBAACC;QAAKX,WAAWR,MAAM,CAAC,uBAAuB;OAAGE,uBAClD,oBAACkB;QAAIZ,WAAWR,MAAM,CAAC,uBAAuB;qBAC5C,oBAACD;QACCS,WAAWR,MAAM,CAAC,wBAAwB;QAC1CqB,QAAQhB,SAAS,SAAS,MAAMiB;OAE/BlB,WAEFG,4BAAc,oBAACZ,uBAEjBE,aAAaM,wBAAU,oBAACgB;QAAKX,WAAWR,MAAM,CAAC,sBAAsB;OAAGG;IAI7E,OAAOM,UAAUc,OAAO,iBACtB,oBAACzB;QAAS0B,WAAU;QAAMC,MAAK;QAAU,GAAGhB,SAAS;QAAED,WAAWE;OAC/DO,6BAGH,oBAACG;QAAK,GAAGX,SAAS;QAAED,WAAWE;OAC5BO;AAGP,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/MiniInfoCell/MiniInfoCell.tsx"],"sourcesContent":["import * as React from 'react';\nimport { Icon16Chevron } from '@vkontakte/icons';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport { Tappable } from '../Tappable/Tappable';\nimport { Paragraph } from '../Typography/Paragraph/Paragraph';\nimport styles from './MiniInfoCell.module.css';\n\nexport interface MiniInfoCellProps extends React.HTMLAttributes<HTMLDivElement> {\n /**\n * Иконка слева.<br />\n * Рекомендуется использовать иконки размера 20.\n */\n before: React.ReactNode;\n\n /**\n * Содержимое справа.<br />\n * `<UsersStack size=\"s\" />` или `<Avatar size={24} />`\n */\n after?: React.ReactNode;\n\n /**\n * Тип ячейки:\n *\n * - `base` – базовая ячейка с серой иконкой и серым текстом.<br />\n * В компонент можно передать `Link`, чтобы визуально сделать часть текста ссылкой.\n * - `add` – тип ячейки, который показывает, что взаимодействие с ней должно вызывать действие добавления чего-то.\n * - `more` – взаимодействие с такой ячейкой должно открывать какую-то подробную информацию.\n */\n mode?: 'base' | 'accent' | 'add' | 'more';\n\n /**\n * Тип отображения текста:\n *\n * - `nowrap` – в одну строку, текст не переносится и обрезается.\n * - `short` – максимально отображается 3 строки, остальное обрезается.\n * - `full` – текст отображается полностью.\n */\n textWrap?: 'nowrap' | 'short' | 'full';\n\n /**\n * Передавать `true`, если предполагается переход при клике по ячейке.\n */\n expandable?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/MiniInfoCell\n */\nexport const MiniInfoCell = ({\n before,\n after,\n children,\n mode = 'base',\n textWrap = 'nowrap',\n expandable = false,\n className,\n ...restProps\n}: MiniInfoCellProps) => {\n const cellClasses = classNames(\n styles['MiniInfoCell'],\n {\n nowrap: styles['MiniInfoCell--textWrap-nowrap'],\n full: styles['MiniInfoCell--textWrap-full'],\n short: styles['MiniInfoCell--textWrap-short'],\n }[textWrap],\n mode !== 'base' &&\n {\n add: styles['MiniInfoCell--mode-add'],\n accent: styles['MiniInfoCell--mode-accent'],\n more: styles['MiniInfoCell--mode-more'],\n }[mode],\n className,\n );\n\n const cellContent = (\n <React.Fragment>\n {hasReactNode(before) && <span className={styles['MiniInfoCell__before']}>{before}</span>}\n <div className={styles['MiniInfoCell__middle']}>\n <Paragraph\n className={styles['MiniInfoCell__content']}\n weight={mode === 'more' ? '2' : undefined}\n >\n {children}\n </Paragraph>\n {expandable && <Icon16Chevron />}\n </div>\n {hasReactNode(after) && <span className={styles['MiniInfoCell__after']}>{after}</span>}\n </React.Fragment>\n );\n\n return restProps.onClick ? (\n <Tappable Component=\"div\" role=\"button\" {...restProps} className={cellClasses}>\n {cellContent}\n </Tappable>\n ) : (\n <div {...restProps} className={cellClasses}>\n {cellContent}\n </div>\n );\n};\n"],"names":["React","Icon16Chevron","classNames","hasReactNode","Tappable","Paragraph","styles","MiniInfoCell","before","after","children","mode","textWrap","expandable","className","restProps","cellClasses","nowrap","full","short","add","accent","more","cellContent","Fragment","span","div","weight","undefined","onClick","Component","role"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,aAAa,QAAQ,mBAAmB;AACjD,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAC3D,SAASC,QAAQ,QAAQ,uBAAuB;AAChD,SAASC,SAAS,QAAQ,oCAAoC;AAC9D,OAAOC,YAAY,4BAA4B;AAwC/C;;CAEC,GACD,OAAO,MAAMC,eAAe,CAAC,EAC3BC,MAAM,EACNC,KAAK,EACLC,QAAQ,EACRC,OAAO,MAAM,EACbC,WAAW,QAAQ,EACnBC,aAAa,KAAK,EAClBC,SAAS,EACT,GAAGC,WACe;IAClB,MAAMC,cAAcd,WAClBI,MAAM,CAAC,eAAe,EACtB;QACEW,QAAQX,MAAM,CAAC,gCAAgC;QAC/CY,MAAMZ,MAAM,CAAC,8BAA8B;QAC3Ca,OAAOb,MAAM,CAAC,+BAA+B;IAC/C,CAAC,CAACM,SAAS,EACXD,SAAS,UACP,CAAA;QACES,KAAKd,MAAM,CAAC,yBAAyB;QACrCe,QAAQf,MAAM,CAAC,4BAA4B;QAC3CgB,MAAMhB,MAAM,CAAC,0BAA0B;IACzC,CAAA,CAAC,CAACK,KAAK,EACTG;IAGF,MAAMS,4BACJ,oBAACvB,MAAMwB,QAAQ,QACZrB,aAAaK,yBAAW,oBAACiB;QAAKX,WAAWR,MAAM,CAAC,uBAAuB;OAAGE,uBAC3E,oBAACkB;QAAIZ,WAAWR,MAAM,CAAC,uBAAuB;qBAC5C,oBAACD;QACCS,WAAWR,MAAM,CAAC,wBAAwB;QAC1CqB,QAAQhB,SAAS,SAAS,MAAMiB;OAE/BlB,WAEFG,4BAAc,oBAACZ,uBAEjBE,aAAaM,wBAAU,oBAACgB;QAAKX,WAAWR,MAAM,CAAC,sBAAsB;OAAGG;IAI7E,OAAOM,UAAUc,OAAO,iBACtB,oBAACzB;QAAS0B,WAAU;QAAMC,MAAK;QAAU,GAAGhB,SAAS;QAAED,WAAWE;OAC/DO,6BAGH,oBAACG;QAAK,GAAGX,SAAS;QAAED,WAAWE;OAC5BO;AAGP,EAAE"}
@@ -123,10 +123,6 @@
123
123
  height: 100%;
124
124
  }
125
125
 
126
- .ModalPage__content-in {
127
- position: relative;
128
- }
129
-
130
126
  .ModalPage__content-in::after {
131
127
  content: '';
132
128
  height: var(--vkui_internal--safe_area_inset_bottom);
@@ -16,7 +16,7 @@
16
16
  -ms-user-select: none;
17
17
  user-select: none;
18
18
  transition: opacity 167ms ease-out;
19
- animation: vkui-animation-fadeIn 0.32s ease;
19
+ animation: animation-fade-in 0.32s ease;
20
20
  }
21
21
 
22
22
  .ModalRoot--touched .ModalRoot__mask {
@@ -54,7 +54,7 @@
54
54
  box-sizing: border-box;
55
55
  }
56
56
 
57
- @keyframes vkui-animation-fadeIn {
57
+ @keyframes animation-fade-in {
58
58
  from {
59
59
  opacity: 0;
60
60
  }
@@ -9,10 +9,12 @@
9
9
 
10
10
  .PanelHeader:not(.PanelHeader--vis):not(.PanelHeader--fixed) {
11
11
  height: 0;
12
+ /* см. https://github.com/VKCOM/VKUI/issues/5571 */
13
+ z-index: var(--vkui_internal--z_index_panel_header);
12
14
  }
13
15
 
14
16
  .PanelHeader__fixed {
15
- z-index: var(--vkui_internal--z_index_panel_header_fixed);
17
+ z-index: var(--vkui_internal--z_index_panel_header);
16
18
  }
17
19
 
18
20
  .PanelHeader__in {
@@ -243,7 +245,7 @@
243
245
 
244
246
  .PanelHeader--vkcom {
245
247
  position: relative;
246
- z-index: var(--vkui_internal--z_index_panel_header_fixed);
248
+ z-index: var(--vkui_internal--z_index_panel_header);
247
249
  }
248
250
 
249
251
  .PanelHeader--vkcom.PanelHeader--sizeX-regular:not(:global(.vkuiInternalModalPageHeader__in)):not(
@@ -50,20 +50,20 @@
50
50
  }
51
51
 
52
52
  .PanelHeaderContext--opened .PanelHeaderContext__fade {
53
- animation: vkui-animation-panelheadercontext-fade-in 0.2s ease;
53
+ animation: animation-panelheadercontext-fade-in 0.2s ease;
54
54
  }
55
55
 
56
56
  .PanelHeaderContext--closing .PanelHeaderContext__fade {
57
- animation: vkui-animation-panelheadercontext-fade-out 0.2s ease;
57
+ animation: animation-panelheadercontext-fade-out 0.2s ease;
58
58
  }
59
59
 
60
60
  .PanelHeaderContext--opened .PanelHeaderContext__in {
61
61
  pointer-events: auto;
62
- animation: vkui-animation-panelheadercontext-translate-in 0.2s ease;
62
+ animation: animation-panelheadercontext-translate-in 0.2s ease;
63
63
  }
64
64
 
65
65
  .PanelHeaderContext--closing .PanelHeaderContext__in {
66
- animation: vkui-animation-panelheadercontext-translate-out 0.2s ease;
66
+ animation: animation-panelheadercontext-translate-out 0.2s ease;
67
67
  }
68
68
 
69
69
  .PanelHeaderContext__content {
@@ -128,7 +128,7 @@
128
128
  Animations
129
129
  */
130
130
 
131
- @keyframes vkui-animation-panelheadercontext-translate-in {
131
+ @keyframes animation-panelheadercontext-translate-in {
132
132
  from {
133
133
  transform: translateY(-100%);
134
134
  }
@@ -138,7 +138,7 @@
138
138
  }
139
139
  }
140
140
 
141
- @keyframes vkui-animation-panelheadercontext-translate-out {
141
+ @keyframes animation-panelheadercontext-translate-out {
142
142
  from {
143
143
  transform: translateY(0);
144
144
  }
@@ -148,7 +148,7 @@
148
148
  }
149
149
  }
150
150
 
151
- @keyframes vkui-animation-panelheadercontext-fade-in {
151
+ @keyframes animation-panelheadercontext-fade-in {
152
152
  from {
153
153
  opacity: 0;
154
154
  }
@@ -158,7 +158,7 @@
158
158
  }
159
159
  }
160
160
 
161
- @keyframes vkui-animation-panelheadercontext-fade-out {
161
+ @keyframes animation-panelheadercontext-fade-out {
162
162
  from {
163
163
  opacity: 1;
164
164
  }
@@ -15,6 +15,7 @@
15
15
  flex: 1 0;
16
16
  padding-top: inherit;
17
17
  padding-bottom: inherit;
18
+ height: 100%;
18
19
  }
19
20
 
20
21
  .Placeholder__icon {
@@ -1,13 +1,11 @@
1
1
  import * as React from 'react';
2
2
  import { classNames } from '@vkontakte/vkjs';
3
- import { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';
4
3
  import { blurActiveElement, useDOM } from '../../lib/dom';
5
4
  import { AppRootPortal } from '../AppRoot/AppRootPortal';
6
5
  import styles from './PopoutRoot.module.css';
7
6
  const PopoutRootPopout = ({ children })=>{
8
- const { isDesktop } = useAdaptivityWithJSMediaQueries();
9
7
  return /*#__PURE__*/ React.createElement("div", {
10
- className: classNames(styles['PopoutRoot__popout'], isDesktop && styles['PopoutRoot__popout--absolute'])
8
+ className: classNames(styles['PopoutRoot__popout'])
11
9
  }, children);
12
10
  };
13
11
  const PopoutRootModal = ({ children })=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/PopoutRoot/PopoutRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useAdaptivityWithJSMediaQueries } from '../../hooks/useAdaptivityWithJSMediaQueries';\nimport { blurActiveElement, useDOM } from '../../lib/dom';\nimport { HasRootRef } from '../../types';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport styles from './PopoutRoot.module.css';\n\ninterface PopoutRootPopoutProps {\n children: React.ReactNode;\n}\n\nconst PopoutRootPopout = ({ children }: PopoutRootPopoutProps) => {\n const { isDesktop } = useAdaptivityWithJSMediaQueries();\n\n return (\n <div\n className={classNames(\n styles['PopoutRoot__popout'],\n isDesktop && styles['PopoutRoot__popout--absolute'],\n )}\n >\n {children}\n </div>\n );\n};\n\ninterface PopoutRootModalProps {\n children: React.ReactNode;\n}\n\nconst PopoutRootModal = ({ children }: PopoutRootModalProps) => {\n return <div className={styles['PopoutRoot__modal']}>{children}</div>;\n};\n\nexport interface PopoutRootProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n popout?: React.ReactNode;\n modal?: React.ReactNode;\n}\n\nexport const PopoutRoot = ({\n popout,\n modal,\n children,\n getRootRef,\n className,\n ...restProps\n}: PopoutRootProps) => {\n const { document } = useDOM();\n\n React.useEffect(() => {\n popout && blurActiveElement(document);\n }, [document, popout]);\n\n return (\n <div {...restProps} className={classNames(styles['PopoutRoot'], className)} ref={getRootRef}>\n {children}\n <AppRootPortal>\n {!!popout && <PopoutRootPopout>{popout}</PopoutRootPopout>}\n {!!modal && <PopoutRootModal>{modal}</PopoutRootModal>}\n </AppRootPortal>\n </div>\n );\n};\n"],"names":["React","classNames","useAdaptivityWithJSMediaQueries","blurActiveElement","useDOM","AppRootPortal","styles","PopoutRootPopout","children","isDesktop","div","className","PopoutRootModal","PopoutRoot","popout","modal","getRootRef","restProps","document","useEffect","ref"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,+BAA+B,QAAQ,8CAA8C;AAC9F,SAASC,iBAAiB,EAAEC,MAAM,QAAQ,gBAAgB;AAE1D,SAASC,aAAa,QAAQ,2BAA2B;AACzD,OAAOC,YAAY,0BAA0B;AAM7C,MAAMC,mBAAmB,CAAC,EAAEC,QAAQ,EAAyB;IAC3D,MAAM,EAAEC,SAAS,EAAE,GAAGP;IAEtB,qBACE,oBAACQ;QACCC,WAAWV,WACTK,MAAM,CAAC,qBAAqB,EAC5BG,aAAaH,MAAM,CAAC,+BAA+B;OAGpDE;AAGP;AAMA,MAAMI,kBAAkB,CAAC,EAAEJ,QAAQ,EAAwB;IACzD,qBAAO,oBAACE;QAAIC,WAAWL,MAAM,CAAC,oBAAoB;OAAGE;AACvD;AASA,OAAO,MAAMK,aAAa,CAAC,EACzBC,MAAM,EACNC,KAAK,EACLP,QAAQ,EACRQ,UAAU,EACVL,SAAS,EACT,GAAGM,WACa;IAChB,MAAM,EAAEC,QAAQ,EAAE,GAAGd;IAErBJ,MAAMmB,SAAS,CAAC;QACdL,UAAUX,kBAAkBe;IAC9B,GAAG;QAACA;QAAUJ;KAAO;IAErB,qBACE,oBAACJ;QAAK,GAAGO,SAAS;QAAEN,WAAWV,WAAWK,MAAM,CAAC,aAAa,EAAEK;QAAYS,KAAKJ;OAC9ER,wBACD,oBAACH,qBACE,CAAC,CAACS,wBAAU,oBAACP,wBAAkBO,SAC/B,CAAC,CAACC,uBAAS,oBAACH,uBAAiBG;AAItC,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/PopoutRoot/PopoutRoot.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { blurActiveElement, useDOM } from '../../lib/dom';\nimport { HasRootRef } from '../../types';\nimport { AppRootPortal } from '../AppRoot/AppRootPortal';\nimport styles from './PopoutRoot.module.css';\n\ninterface PopoutRootPopoutProps {\n children: React.ReactNode;\n}\n\nconst PopoutRootPopout = ({ children }: PopoutRootPopoutProps) => {\n return <div className={classNames(styles['PopoutRoot__popout'])}>{children}</div>;\n};\n\ninterface PopoutRootModalProps {\n children: React.ReactNode;\n}\n\nconst PopoutRootModal = ({ children }: PopoutRootModalProps) => {\n return <div className={styles['PopoutRoot__modal']}>{children}</div>;\n};\n\nexport interface PopoutRootProps\n extends React.HTMLAttributes<HTMLDivElement>,\n HasRootRef<HTMLDivElement> {\n popout?: React.ReactNode;\n modal?: React.ReactNode;\n}\n\nexport const PopoutRoot = ({\n popout,\n modal,\n children,\n getRootRef,\n className,\n ...restProps\n}: PopoutRootProps) => {\n const { document } = useDOM();\n\n React.useEffect(() => {\n popout && blurActiveElement(document);\n }, [document, popout]);\n\n return (\n <div {...restProps} className={classNames(styles['PopoutRoot'], className)} ref={getRootRef}>\n {children}\n <AppRootPortal>\n {!!popout && <PopoutRootPopout>{popout}</PopoutRootPopout>}\n {!!modal && <PopoutRootModal>{modal}</PopoutRootModal>}\n </AppRootPortal>\n </div>\n );\n};\n"],"names":["React","classNames","blurActiveElement","useDOM","AppRootPortal","styles","PopoutRootPopout","children","div","className","PopoutRootModal","PopoutRoot","popout","modal","getRootRef","restProps","document","useEffect","ref"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,iBAAiB,EAAEC,MAAM,QAAQ,gBAAgB;AAE1D,SAASC,aAAa,QAAQ,2BAA2B;AACzD,OAAOC,YAAY,0BAA0B;AAM7C,MAAMC,mBAAmB,CAAC,EAAEC,QAAQ,EAAyB;IAC3D,qBAAO,oBAACC;QAAIC,WAAWR,WAAWI,MAAM,CAAC,qBAAqB;OAAIE;AACpE;AAMA,MAAMG,kBAAkB,CAAC,EAAEH,QAAQ,EAAwB;IACzD,qBAAO,oBAACC;QAAIC,WAAWJ,MAAM,CAAC,oBAAoB;OAAGE;AACvD;AASA,OAAO,MAAMI,aAAa,CAAC,EACzBC,MAAM,EACNC,KAAK,EACLN,QAAQ,EACRO,UAAU,EACVL,SAAS,EACT,GAAGM,WACa;IAChB,MAAM,EAAEC,QAAQ,EAAE,GAAGb;IAErBH,MAAMiB,SAAS,CAAC;QACdL,UAAUV,kBAAkBc;IAC9B,GAAG;QAACA;QAAUJ;KAAO;IAErB,qBACE,oBAACJ;QAAK,GAAGO,SAAS;QAAEN,WAAWR,WAAWI,MAAM,CAAC,aAAa,EAAEI;QAAYS,KAAKJ;OAC9EP,wBACD,oBAACH,qBACE,CAAC,CAACQ,wBAAU,oBAACN,wBAAkBM,SAC/B,CAAC,CAACC,uBAAS,oBAACH,uBAAiBG;AAItC,EAAE"}
@@ -13,10 +13,6 @@
13
13
  height: 100%;
14
14
  }
15
15
 
16
- .PopoutRoot__popout--absolute {
17
- position: absolute;
18
- }
19
-
20
16
  .PopoutRoot__modal {
21
17
  position: fixed;
22
18
  left: 0;
@@ -13,7 +13,7 @@ import styles from './PopoutWrapper.module.css';
13
13
  const [opened, setOpened] = React.useState(!hasMask);
14
14
  const elRef = React.useRef(null);
15
15
  const onFadeInEnd = (e)=>{
16
- if (!e || e.animationName === styles['vkui-animation-full-fade-in']) {
16
+ if (!e || e.animationName === styles['animation-full-fade-in']) {
17
17
  setOpened(true);
18
18
  }
19
19
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/components/PopoutWrapper/PopoutWrapper.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport styles from './PopoutWrapper.module.css';\n\nexport interface PopoutWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n hasMask?: boolean;\n fixed?: boolean;\n alignY?: 'top' | 'center' | 'bottom';\n alignX?: 'left' | 'center' | 'right';\n closing?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PopoutWrapper\n */\nexport const PopoutWrapper = ({\n alignY = 'center',\n alignX = 'center',\n closing = false,\n hasMask = true,\n fixed = true,\n children,\n onClick,\n className,\n ...restProps\n}: PopoutWrapperProps) => {\n const platform = usePlatform();\n const [opened, setOpened] = React.useState(!hasMask);\n const elRef = React.useRef<HTMLDivElement>(null);\n\n const onFadeInEnd = (e?: React.AnimationEvent) => {\n if (!e || e.animationName === styles['vkui-animation-full-fade-in']) {\n setOpened(true);\n }\n };\n const animationFinishFallback = useTimeout(onFadeInEnd, platform === Platform.IOS ? 300 : 200);\n React.useEffect(() => {\n !opened && animationFinishFallback.set();\n }, [animationFinishFallback, opened]);\n\n const { window } = useDOM();\n useGlobalEventListener(window, 'touchmove', (e) => e.preventDefault(), {\n passive: false,\n });\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['PopoutWrapper'],\n {\n center: styles['PopoutWrapper--alignY-center'],\n top: styles['PopoutWrapper--alignY-top'],\n bottom: styles['PopoutWrapper--alignY-bottom'],\n }[alignY],\n {\n center: styles['PopoutWrapper--alignX-center'],\n left: styles['PopoutWrapper--alignX-left'],\n right: styles['PopoutWrapper--alignX-right'],\n }[alignX],\n closing && styles['PopoutWrapper--closing'],\n opened && styles['PopoutWrapper--opened'],\n fixed && styles['PopoutWrapper--fixed'],\n hasMask && styles['PopoutWrapper--masked'],\n className,\n )}\n onAnimationEnd={opened ? undefined : onFadeInEnd}\n ref={elRef}\n >\n <div className={styles['PopoutWrapper__container']}>\n <div className={styles['PopoutWrapper__overlay']} onClick={onClick} />\n <div className={styles['PopoutWrapper__content']}>{children}</div>\n </div>\n </div>\n );\n};\n"],"names":["React","classNames","useGlobalEventListener","usePlatform","useTimeout","useDOM","Platform","styles","PopoutWrapper","alignY","alignX","closing","hasMask","fixed","children","onClick","className","restProps","platform","opened","setOpened","useState","elRef","useRef","onFadeInEnd","e","animationName","animationFinishFallback","IOS","useEffect","set","window","preventDefault","passive","div","center","top","bottom","left","right","onAnimationEnd","undefined","ref"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,sBAAsB,QAAQ,qCAAqC;AAC5E,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,UAAU,QAAQ,yBAAyB;AACpD,SAASC,MAAM,QAAQ,gBAAgB;AACvC,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,OAAOC,YAAY,6BAA6B;AAUhD;;CAEC,GACD,OAAO,MAAMC,gBAAgB,CAAC,EAC5BC,SAAS,QAAQ,EACjBC,SAAS,QAAQ,EACjBC,UAAU,KAAK,EACfC,UAAU,IAAI,EACdC,QAAQ,IAAI,EACZC,QAAQ,EACRC,OAAO,EACPC,SAAS,EACT,GAAGC,WACgB;IACnB,MAAMC,WAAWf;IACjB,MAAM,CAACgB,QAAQC,UAAU,GAAGpB,MAAMqB,QAAQ,CAAC,CAACT;IAC5C,MAAMU,QAAQtB,MAAMuB,MAAM,CAAiB;IAE3C,MAAMC,cAAc,CAACC;QACnB,IAAI,CAACA,KAAKA,EAAEC,aAAa,KAAKnB,MAAM,CAAC,8BAA8B,EAAE;YACnEa,UAAU;QACZ;IACF;IACA,MAAMO,0BAA0BvB,WAAWoB,aAAaN,aAAaZ,SAASsB,GAAG,GAAG,MAAM;IAC1F5B,MAAM6B,SAAS,CAAC;QACd,CAACV,UAAUQ,wBAAwBG,GAAG;IACxC,GAAG;QAACH;QAAyBR;KAAO;IAEpC,MAAM,EAAEY,MAAM,EAAE,GAAG1B;IACnBH,uBAAuB6B,QAAQ,aAAa,CAACN,IAAMA,EAAEO,cAAc,IAAI;QACrEC,SAAS;IACX;IAEA,qBACE,oBAACC;QACE,GAAGjB,SAAS;QACbD,WAAWf,WACTM,MAAM,CAAC,gBAAgB,EACvB;YACE4B,QAAQ5B,MAAM,CAAC,+BAA+B;YAC9C6B,KAAK7B,MAAM,CAAC,4BAA4B;YACxC8B,QAAQ9B,MAAM,CAAC,+BAA+B;QAChD,CAAC,CAACE,OAAO,EACT;YACE0B,QAAQ5B,MAAM,CAAC,+BAA+B;YAC9C+B,MAAM/B,MAAM,CAAC,6BAA6B;YAC1CgC,OAAOhC,MAAM,CAAC,8BAA8B;QAC9C,CAAC,CAACG,OAAO,EACTC,WAAWJ,MAAM,CAAC,yBAAyB,EAC3CY,UAAUZ,MAAM,CAAC,wBAAwB,EACzCM,SAASN,MAAM,CAAC,uBAAuB,EACvCK,WAAWL,MAAM,CAAC,wBAAwB,EAC1CS;QAEFwB,gBAAgBrB,SAASsB,YAAYjB;QACrCkB,KAAKpB;qBAEL,oBAACY;QAAIlB,WAAWT,MAAM,CAAC,2BAA2B;qBAChD,oBAAC2B;QAAIlB,WAAWT,MAAM,CAAC,yBAAyB;QAAEQ,SAASA;sBAC3D,oBAACmB;QAAIlB,WAAWT,MAAM,CAAC,yBAAyB;OAAGO;AAI3D,EAAE"}
1
+ {"version":3,"sources":["../../../../src/components/PopoutWrapper/PopoutWrapper.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames } from '@vkontakte/vkjs';\nimport { useGlobalEventListener } from '../../hooks/useGlobalEventListener';\nimport { usePlatform } from '../../hooks/usePlatform';\nimport { useTimeout } from '../../hooks/useTimeout';\nimport { useDOM } from '../../lib/dom';\nimport { Platform } from '../../lib/platform';\nimport styles from './PopoutWrapper.module.css';\n\nexport interface PopoutWrapperProps extends React.HTMLAttributes<HTMLDivElement> {\n hasMask?: boolean;\n fixed?: boolean;\n alignY?: 'top' | 'center' | 'bottom';\n alignX?: 'left' | 'center' | 'right';\n closing?: boolean;\n}\n\n/**\n * @see https://vkcom.github.io/VKUI/#/PopoutWrapper\n */\nexport const PopoutWrapper = ({\n alignY = 'center',\n alignX = 'center',\n closing = false,\n hasMask = true,\n fixed = true,\n children,\n onClick,\n className,\n ...restProps\n}: PopoutWrapperProps) => {\n const platform = usePlatform();\n const [opened, setOpened] = React.useState(!hasMask);\n const elRef = React.useRef<HTMLDivElement>(null);\n\n const onFadeInEnd = (e?: React.AnimationEvent) => {\n if (!e || e.animationName === styles['animation-full-fade-in']) {\n setOpened(true);\n }\n };\n const animationFinishFallback = useTimeout(onFadeInEnd, platform === Platform.IOS ? 300 : 200);\n React.useEffect(() => {\n !opened && animationFinishFallback.set();\n }, [animationFinishFallback, opened]);\n\n const { window } = useDOM();\n useGlobalEventListener(window, 'touchmove', (e) => e.preventDefault(), {\n passive: false,\n });\n\n return (\n <div\n {...restProps}\n className={classNames(\n styles['PopoutWrapper'],\n {\n center: styles['PopoutWrapper--alignY-center'],\n top: styles['PopoutWrapper--alignY-top'],\n bottom: styles['PopoutWrapper--alignY-bottom'],\n }[alignY],\n {\n center: styles['PopoutWrapper--alignX-center'],\n left: styles['PopoutWrapper--alignX-left'],\n right: styles['PopoutWrapper--alignX-right'],\n }[alignX],\n closing && styles['PopoutWrapper--closing'],\n opened && styles['PopoutWrapper--opened'],\n fixed && styles['PopoutWrapper--fixed'],\n hasMask && styles['PopoutWrapper--masked'],\n className,\n )}\n onAnimationEnd={opened ? undefined : onFadeInEnd}\n ref={elRef}\n >\n <div className={styles['PopoutWrapper__container']}>\n <div className={styles['PopoutWrapper__overlay']} onClick={onClick} />\n <div className={styles['PopoutWrapper__content']}>{children}</div>\n </div>\n </div>\n );\n};\n"],"names":["React","classNames","useGlobalEventListener","usePlatform","useTimeout","useDOM","Platform","styles","PopoutWrapper","alignY","alignX","closing","hasMask","fixed","children","onClick","className","restProps","platform","opened","setOpened","useState","elRef","useRef","onFadeInEnd","e","animationName","animationFinishFallback","IOS","useEffect","set","window","preventDefault","passive","div","center","top","bottom","left","right","onAnimationEnd","undefined","ref"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,QAAQ,kBAAkB;AAC7C,SAASC,sBAAsB,QAAQ,qCAAqC;AAC5E,SAASC,WAAW,QAAQ,0BAA0B;AACtD,SAASC,UAAU,QAAQ,yBAAyB;AACpD,SAASC,MAAM,QAAQ,gBAAgB;AACvC,SAASC,QAAQ,QAAQ,qBAAqB;AAC9C,OAAOC,YAAY,6BAA6B;AAUhD;;CAEC,GACD,OAAO,MAAMC,gBAAgB,CAAC,EAC5BC,SAAS,QAAQ,EACjBC,SAAS,QAAQ,EACjBC,UAAU,KAAK,EACfC,UAAU,IAAI,EACdC,QAAQ,IAAI,EACZC,QAAQ,EACRC,OAAO,EACPC,SAAS,EACT,GAAGC,WACgB;IACnB,MAAMC,WAAWf;IACjB,MAAM,CAACgB,QAAQC,UAAU,GAAGpB,MAAMqB,QAAQ,CAAC,CAACT;IAC5C,MAAMU,QAAQtB,MAAMuB,MAAM,CAAiB;IAE3C,MAAMC,cAAc,CAACC;QACnB,IAAI,CAACA,KAAKA,EAAEC,aAAa,KAAKnB,MAAM,CAAC,yBAAyB,EAAE;YAC9Da,UAAU;QACZ;IACF;IACA,MAAMO,0BAA0BvB,WAAWoB,aAAaN,aAAaZ,SAASsB,GAAG,GAAG,MAAM;IAC1F5B,MAAM6B,SAAS,CAAC;QACd,CAACV,UAAUQ,wBAAwBG,GAAG;IACxC,GAAG;QAACH;QAAyBR;KAAO;IAEpC,MAAM,EAAEY,MAAM,EAAE,GAAG1B;IACnBH,uBAAuB6B,QAAQ,aAAa,CAACN,IAAMA,EAAEO,cAAc,IAAI;QACrEC,SAAS;IACX;IAEA,qBACE,oBAACC;QACE,GAAGjB,SAAS;QACbD,WAAWf,WACTM,MAAM,CAAC,gBAAgB,EACvB;YACE4B,QAAQ5B,MAAM,CAAC,+BAA+B;YAC9C6B,KAAK7B,MAAM,CAAC,4BAA4B;YACxC8B,QAAQ9B,MAAM,CAAC,+BAA+B;QAChD,CAAC,CAACE,OAAO,EACT;YACE0B,QAAQ5B,MAAM,CAAC,+BAA+B;YAC9C+B,MAAM/B,MAAM,CAAC,6BAA6B;YAC1CgC,OAAOhC,MAAM,CAAC,8BAA8B;QAC9C,CAAC,CAACG,OAAO,EACTC,WAAWJ,MAAM,CAAC,yBAAyB,EAC3CY,UAAUZ,MAAM,CAAC,wBAAwB,EACzCM,SAASN,MAAM,CAAC,uBAAuB,EACvCK,WAAWL,MAAM,CAAC,wBAAwB,EAC1CS;QAEFwB,gBAAgBrB,SAASsB,YAAYjB;QACrCkB,KAAKpB;qBAEL,oBAACY;QAAIlB,WAAWT,MAAM,CAAC,2BAA2B;qBAChD,oBAAC2B;QAAIlB,WAAWT,MAAM,CAAC,yBAAyB;QAAEQ,SAASA;sBAC3D,oBAACmB;QAAIlB,WAAWT,MAAM,CAAC,yBAAyB;OAAGO;AAI3D,EAAE"}
@@ -26,7 +26,7 @@
26
26
  width: 100%;
27
27
  height: 100%;
28
28
  opacity: 1;
29
- animation: vkui-animation-full-fade-in var(--vkui--animation_duration_m) ease;
29
+ animation: animation-full-fade-in var(--vkui--animation_duration_m) ease;
30
30
  }
31
31
 
32
32
  .PopoutWrapper--closing .PopoutWrapper__overlay {
@@ -86,7 +86,7 @@
86
86
  justify-content: flex-end;
87
87
  }
88
88
 
89
- @keyframes vkui-animation-full-fade-in {
89
+ @keyframes animation-full-fade-in {
90
90
  from {
91
91
  opacity: 0;
92
92
  }
@@ -1,6 +1,6 @@
1
1
  .Popover {
2
2
  position: relative;
3
- animation: vkui-popover-fadein 0.2s ease;
3
+ animation: popover-fade-in 0.2s ease;
4
4
  background: var(--vkui--color_background_modal);
5
5
  border-radius: var(--vkui--size_border_radius--regular);
6
6
  box-shadow: var(--vkui--elevation3);
@@ -21,7 +21,7 @@
21
21
  position: relative;
22
22
  }
23
23
 
24
- @keyframes vkui-popover-fadein {
24
+ @keyframes popover-fade-in {
25
25
  from {
26
26
  opacity: 0;
27
27
  }
@@ -48,7 +48,7 @@
48
48
  }
49
49
 
50
50
  .PullToRefresh--ios.PullToRefresh--refreshing .PullToRefresh__spinner-self {
51
- animation: vkui-PullToRefreshToRefreshing 380ms ease-out;
51
+ animation: pull-to-refresh-to-refreshing 380ms ease-out;
52
52
  }
53
53
 
54
54
  .PullToRefresh__spinner-path {
@@ -63,7 +63,7 @@
63
63
  }
64
64
 
65
65
  .PullToRefresh__spinner--on .PullToRefresh__spinner-path {
66
- animation: vkui-ptr-rotator var(--vkui_internal--duration) linear infinite;
66
+ animation: ptr-rotator var(--vkui_internal--duration) linear infinite;
67
67
  }
68
68
 
69
69
  .PullToRefresh__content {
@@ -75,7 +75,7 @@
75
75
  transition: none;
76
76
  }
77
77
 
78
- @keyframes vkui-PullToRefreshToRefreshing {
78
+ @keyframes pull-to-refresh-to-refreshing {
79
79
  0% {
80
80
  transform: scale(1);
81
81
  }
@@ -93,7 +93,7 @@
93
93
  }
94
94
  }
95
95
 
96
- @keyframes vkui-ptr-rotator {
96
+ @keyframes ptr-rotator {
97
97
  0% {
98
98
  transform: rotate(0deg);
99
99
  }