@vkontakte/vkui 7.9.2 → 7.10.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -0
- package/dist/components/Button/Button.js +6 -4
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.d.ts +1 -1
- package/dist/components/CarouselBase/CarouselBase.d.ts.map +1 -1
- package/dist/components/CarouselBase/CarouselBase.js +14 -6
- package/dist/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/components/CarouselBase/ScrollArrows.d.ts +1 -2
- package/dist/components/CarouselBase/ScrollArrows.d.ts.map +1 -1
- package/dist/components/CarouselBase/ScrollArrows.js +2 -2
- package/dist/components/CarouselBase/ScrollArrows.js.map +1 -1
- package/dist/components/Clickable/useState.d.ts +15 -0
- package/dist/components/Clickable/useState.d.ts.map +1 -1
- package/dist/components/Clickable/useState.js +1 -1
- package/dist/components/Clickable/useState.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +1 -1
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/Footer/Footer.d.ts.map +1 -1
- package/dist/components/Footer/Footer.js +2 -1
- package/dist/components/Footer/Footer.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.d.ts +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.d.ts.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalScroll.js +20 -10
- package/dist/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/components/SubnavigationBar/SubnavigationBar.d.ts +6 -2
- package/dist/components/SubnavigationBar/SubnavigationBar.d.ts.map +1 -1
- package/dist/components/SubnavigationBar/SubnavigationBar.js +6 -3
- package/dist/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
- package/dist/components/Typography/Typography.d.ts +5 -1
- package/dist/components/Typography/Typography.d.ts.map +1 -1
- package/dist/components/Typography/Typography.js +9 -3
- package/dist/components/Typography/Typography.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheet.module.css +4 -4
- package/dist/cssm/components/Alert/Alert.module.css +4 -4
- package/dist/cssm/components/Button/Button.js +3 -1
- package/dist/cssm/components/Button/Button.js.map +1 -1
- package/dist/cssm/components/CarouselBase/CarouselBase.js +10 -5
- package/dist/cssm/components/CarouselBase/CarouselBase.js.map +1 -1
- package/dist/cssm/components/CarouselBase/CarouselBase.module.css +1 -1
- package/dist/cssm/components/CarouselBase/ScrollArrows.js +2 -2
- package/dist/cssm/components/CarouselBase/ScrollArrows.js.map +1 -1
- package/dist/cssm/components/CellButton/CellButton.module.css +4 -2
- package/dist/cssm/components/Clickable/useState.js +1 -1
- package/dist/cssm/components/Clickable/useState.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelectOption/CustomSelectOption.module.css +2 -2
- package/dist/cssm/components/DateInput/DateInput.module.css +3 -2
- package/dist/cssm/components/Epic/Epic.module.css +2 -1
- package/dist/cssm/components/FixedLayout/FixedLayout.module.css +6 -3
- package/dist/cssm/components/Flex/Flex.module.css +12 -4
- package/dist/cssm/components/Footer/Footer.js +1 -0
- package/dist/cssm/components/Footer/Footer.js.map +1 -1
- package/dist/cssm/components/Footer/Footer.module.css +0 -1
- package/dist/cssm/components/FormField/FormField.module.css +10 -6
- package/dist/cssm/components/FormItem/FormItem.module.css +24 -12
- package/dist/cssm/components/GridAvatar/GridAvatar.module.css +1 -1
- package/dist/cssm/components/Group/Group.module.css +5 -2
- package/dist/cssm/components/HorizontalCell/HorizontalCell.module.css +4 -2
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js +14 -8
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalScroll.module.css +3 -3
- package/dist/cssm/components/IconButton/IconButton.module.css +6 -2
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.module.css +4 -2
- package/dist/cssm/components/ModalCard/ModalCard.module.css +2 -1
- package/dist/cssm/components/ModalCardBase/ModalCardBase.module.css +14 -10
- package/dist/cssm/components/ModalPage/ModalPage.module.css +2 -1
- package/dist/cssm/components/ModalPageHeader/ModalPageHeader.module.css +5 -3
- package/dist/cssm/components/Panel/Panel.module.css +4 -2
- package/dist/cssm/components/PanelHeader/PanelHeader.module.css +1 -1
- package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.module.css +2 -2
- package/dist/cssm/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
- package/dist/cssm/components/Removable/Removable.module.css +9 -4
- package/dist/cssm/components/Root/Root.module.css +8 -8
- package/dist/cssm/components/Search/Search.module.css +2 -3
- package/dist/cssm/components/Snackbar/Snackbar.module.css +4 -2
- package/dist/cssm/components/Snackbar/subcomponents/Basic/Basic.module.css +15 -15
- package/dist/cssm/components/SplitLayout/SplitLayout.module.css +8 -4
- package/dist/cssm/components/SubnavigationBar/SubnavigationBar.js +4 -3
- package/dist/cssm/components/SubnavigationBar/SubnavigationBar.js.map +1 -1
- package/dist/cssm/components/SubnavigationBar/SubnavigationBar.module.css +9 -0
- package/dist/cssm/components/Switch/Switch.module.css +32 -20
- package/dist/cssm/components/Typography/Typography.js +7 -2
- package/dist/cssm/components/Typography/Typography.js.map +1 -1
- package/dist/cssm/components/Typography/Typography.module.css +12 -0
- package/dist/cssm/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js +1 -1
- package/dist/cssm/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js.map +1 -1
- package/dist/cssm/hooks/useKeyboardInputTracker.js +4 -4
- package/dist/cssm/hooks/useKeyboardInputTracker.js.map +1 -1
- package/dist/cssm/index.js +1 -0
- package/dist/cssm/index.js.map +1 -1
- package/dist/cssm/lib/adaptivity/functions.js.map +1 -1
- package/dist/cssm/lib/animation/useReducedMotion.js +7 -2
- package/dist/cssm/lib/animation/useReducedMotion.js.map +1 -1
- package/dist/cssm/lib/dom.js +2 -2
- package/dist/cssm/lib/dom.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js +1 -1
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/cssm/styles/constants.css +2 -1
- package/dist/cssm/styles/customMedias.generated.css +21 -21
- package/dist/hooks/useDraggableWithDomApi/useDraggableWithDomApi.d.ts.map +1 -1
- package/dist/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js +1 -1
- package/dist/hooks/useDraggableWithDomApi/useDraggableWithDomApi.js.map +1 -1
- package/dist/hooks/useKeyboardInputTracker.d.ts.map +1 -1
- package/dist/hooks/useKeyboardInputTracker.js +4 -4
- package/dist/hooks/useKeyboardInputTracker.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/lib/adaptivity/functions.d.ts.map +1 -1
- package/dist/lib/adaptivity/functions.js.map +1 -1
- package/dist/lib/animation/useReducedMotion.d.ts +6 -0
- package/dist/lib/animation/useReducedMotion.d.ts.map +1 -1
- package/dist/lib/animation/useReducedMotion.js +7 -2
- package/dist/lib/animation/useReducedMotion.js.map +1 -1
- package/dist/lib/dom.d.ts.map +1 -1
- package/dist/lib/dom.js +2 -2
- package/dist/lib/dom.js.map +1 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts +1 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.js +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +2 -1
- package/src/components/ActionSheet/ActionSheet.module.css +4 -4
- package/src/components/Alert/Alert.module.css +4 -4
- package/src/components/Button/Button.tsx +1 -1
- package/src/components/CarouselBase/CarouselBase.module.css +1 -1
- package/src/components/CarouselBase/CarouselBase.module.css.d.ts.map +1 -1
- package/src/components/CarouselBase/CarouselBase.tsx +10 -4
- package/src/components/CarouselBase/ScrollArrows.tsx +1 -3
- package/src/components/CellButton/CellButton.module.css +2 -1
- package/src/components/CellButton/CellButton.module.css.d.ts.map +1 -1
- package/src/components/Clickable/useState.tsx +8 -3
- package/src/components/CustomSelect/CustomSelect.tsx +1 -1
- package/src/components/CustomSelectOption/CustomSelectOption.module.css +1 -1
- package/src/components/DateInput/DateInput.module.css +3 -2
- package/src/components/DateInput/DateInput.module.css.d.ts.map +1 -1
- package/src/components/Epic/Epic.module.css +2 -1
- package/src/components/FixedLayout/FixedLayout.module.css +4 -2
- package/src/components/FixedLayout/FixedLayout.module.css.d.ts.map +1 -1
- package/src/components/Flex/Flex.module.css +6 -2
- package/src/components/Flex/Flex.module.css.d.ts.map +1 -1
- package/src/components/Footer/Footer.module.css +0 -1
- package/src/components/Footer/Footer.tsx +1 -0
- package/src/components/FormField/FormField.module.css +10 -6
- package/src/components/FormField/FormField.module.css.d.ts.map +1 -1
- package/src/components/FormItem/FormItem.module.css +12 -6
- package/src/components/FormItem/FormItem.module.css.d.ts.map +1 -1
- package/src/components/GridAvatar/GridAvatar.module.css +1 -1
- package/src/components/GridAvatar/GridAvatar.module.css.d.ts.map +1 -1
- package/src/components/Group/Group.module.css +5 -2
- package/src/components/Group/Group.module.css.d.ts.map +1 -1
- package/src/components/HorizontalCell/HorizontalCell.module.css +4 -2
- package/src/components/HorizontalCell/HorizontalCell.module.css.d.ts.map +1 -1
- package/src/components/HorizontalScroll/HorizontalScroll.module.css +3 -3
- package/src/components/HorizontalScroll/HorizontalScroll.module.css.d.ts.map +1 -1
- package/src/components/HorizontalScroll/HorizontalScroll.tsx +15 -7
- package/src/components/IconButton/IconButton.module.css +6 -2
- package/src/components/IconButton/IconButton.module.css.d.ts.map +1 -1
- package/src/components/MiniInfoCell/MiniInfoCell.module.css +4 -2
- package/src/components/MiniInfoCell/MiniInfoCell.module.css.d.ts.map +1 -1
- package/src/components/ModalCard/ModalCard.module.css +2 -1
- package/src/components/ModalCard/ModalCard.module.css.d.ts.map +1 -1
- package/src/components/ModalCardBase/ModalCardBase.module.css +7 -5
- package/src/components/ModalCardBase/ModalCardBase.module.css.d.ts.map +1 -1
- package/src/components/ModalPage/ModalPage.module.css +2 -1
- package/src/components/ModalPage/ModalPage.module.css.d.ts.map +1 -1
- package/src/components/ModalPageHeader/ModalPageHeader.module.css +5 -2
- package/src/components/ModalPageHeader/ModalPageHeader.module.css.d.ts.map +1 -1
- package/src/components/Panel/Panel.module.css +2 -1
- package/src/components/Panel/Panel.module.css.d.ts.map +1 -1
- package/src/components/PanelHeader/PanelHeader.module.css +1 -1
- package/src/components/PanelHeader/PanelHeader.module.css.d.ts.map +1 -1
- package/src/components/PanelHeaderButton/PanelHeaderButton.module.css +2 -2
- package/src/components/PopoutWrapper/PopoutWrapper.module.css +2 -2
- package/src/components/Removable/Removable.module.css +9 -4
- package/src/components/Removable/Removable.module.css.d.ts.map +1 -1
- package/src/components/Root/Root.module.css +8 -8
- package/src/components/Search/Search.module.css +2 -2
- package/src/components/Snackbar/Snackbar.module.css +4 -2
- package/src/components/Snackbar/Snackbar.module.css.d.ts.map +1 -1
- package/src/components/Snackbar/subcomponents/Basic/Basic.module.css +15 -15
- package/src/components/SplitLayout/SplitLayout.module.css +4 -2
- package/src/components/SplitLayout/SplitLayout.module.css.d.ts.map +1 -1
- package/src/components/SubnavigationBar/SubnavigationBar.module.css +9 -0
- package/src/components/SubnavigationBar/SubnavigationBar.module.css.d.ts.map +1 -1
- package/src/components/SubnavigationBar/SubnavigationBar.tsx +14 -3
- package/src/components/Switch/Switch.module.css +32 -20
- package/src/components/Switch/Switch.module.css.d.ts.map +1 -1
- package/src/components/Typography/Typography.module.css +12 -0
- package/src/components/Typography/Typography.module.css.d.ts.map +1 -1
- package/src/components/Typography/Typography.tsx +12 -0
- package/src/hooks/useDraggableWithDomApi/useDraggableWithDomApi.ts +7 -1
- package/src/hooks/useKeyboardInputTracker.ts +20 -4
- package/src/index.ts +1 -0
- package/src/lib/adaptivity/functions.ts +36 -6
- package/src/lib/animation/useReducedMotion.ts +7 -1
- package/src/lib/dom.tsx +11 -2
- package/src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts +1 -1
- package/src/lib/sheet/controllers/BottomSheetController.ts +1 -1
- package/src/styles/constants.css +2 -1
- package/src/styles/customMedias.generated.css +21 -21
- package/dist/cssm/hooks/useAdaptivityHasPointer.js +0 -15
- package/dist/cssm/hooks/useAdaptivityHasPointer.js.map +0 -1
- package/dist/hooks/useAdaptivityHasPointer.d.ts +0 -9
- package/dist/hooks/useAdaptivityHasPointer.d.ts.map +0 -1
- package/dist/hooks/useAdaptivityHasPointer.js +0 -15
- package/dist/hooks/useAdaptivityHasPointer.js.map +0 -1
- package/src/hooks/useAdaptivityHasPointer.ts +0 -25
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/HorizontalScroll/HorizontalScroll.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useAdaptivityHasPointer } from '../../hooks/useAdaptivityHasPointer';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusVisible } from '../../hooks/useFocusVisible';\nimport { useFocusVisibleClassName } from '../../hooks/useFocusVisibleClassName';\nimport { easeInOutSine } from '../../lib/fx';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRef, HTMLAttributesWithRootRef } from '../../types';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { ScrollArrow, type ScrollArrowProps } from '../ScrollArrow/ScrollArrow';\nimport styles from './HorizontalScroll.module.css';\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface ScrollContext {\n scrollElement: HTMLElement | null;\n scrollAnimationDuration: number;\n animationQueue: VoidFunction[];\n getScrollPosition: (currentPosition: number) => number;\n onScrollToEndBorder: VoidFunction;\n onScrollEnd: VoidFunction;\n onScrollStart: VoidFunction;\n /**\n * Начальная ширина прокрутки.\n * В некоторых случаях может отличаться от текущей ширины прокрутки из-за transforms: translate.\n */\n initialScrollWidth: number;\n textDirection: 'ltr' | 'rtl';\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport type ScrollPositionHandler = (currentPosition: number) => number;\n\nexport interface HorizontalScrollProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n /**\n * Функция для расчета величины прокрутки при нажатии на левую стрелку.\n */\n getScrollToLeft?: ScrollPositionHandler;\n /**\n * Функция для расчета величины прокрутки при нажатии на правую стрелку.\n */\n getScrollToRight?: ScrollPositionHandler;\n /**\n * Размер стрелок.\n */\n arrowSize?: ScrollArrowProps['size'];\n /**\n * Смещает иконки кнопок навигации по вертикали.\n */\n arrowOffsetY?: number | string;\n /**\n * Показывать ли стрелки.\n */\n showArrows?: boolean | 'always';\n /**\n * Длительность анимации скролла.\n */\n scrollAnimationDuration?: number;\n /**\n * Добавляет возможность прокручивать контент на любое колесо мыши.\n * По умолчанию прокручивается как любой горизонтальный контент через shift.\n */\n scrollOnAnyWheel?: boolean;\n /**\n * Передает атрибут `data-testid` для кнопки прокрутки горизонтального скролла в направлении предыдущего элемента.\n */\n prevButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки прокрутки горизонтального скролла в направлении следующего элемента.\n */\n nextButtonTestId?: string;\n /**\n * Позволяет поменять тег используемый для обертки над контентом, прокинутым в `children`.\n */\n ContentWrapperComponent?: React.ElementType;\n /**\n * `ref` для обертки над контентом, прокинутым в `children`.\n */\n contentWrapperRef?: React.Ref<HTMLElement>;\n /**\n * Специфичный `className` для обертки над контентом, прокинутым в `children`.\n */\n contentWrapperClassName?: string;\n}\n\n/**\n * Timing method.\n */\nfunction now() {\n return performance && performance.now ? performance.now() : Date.now();\n}\n\n/**\n * Округление к большему по модулю.\n *\n * ## Пример\n *\n * ```ts\n * import { strict as assert } from 'node:assert';\n *\n * assert.equal(roundingAwayFromZero(5.1), 6)\n * assert.equal(roundingAwayFromZero(-5.1), -6)\n * ```\n */\nfunction roundingAwayFromZero(value: number): number {\n return value > 0 ? Math.ceil(value) : Math.floor(value);\n}\n\n/**\n * Округляем el.scrollLeft\n * https://github.com/VKCOM/VKUI/pull/2445.\n */\nconst roundUpElementScrollLeft = (el: HTMLElement) => roundingAwayFromZero(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 onScrollToEndBorder,\n onScrollEnd,\n onScrollStart,\n initialScrollWidth,\n scrollAnimationDuration,\n textDirection,\n}: ScrollContext) {\n if (!scrollElement || !getScrollPosition) {\n return;\n }\n\n /**\n * Крайнее значение сдвига.\n */\n const extremeScrollLeft =\n (textDirection === 'ltr' ? 1 : -1) * (initialScrollWidth - scrollElement.offsetWidth);\n\n const startScrollLeft = roundUpElementScrollLeft(scrollElement);\n const remappedStartScrollLeft = startScrollLeft * (textDirection === 'rtl' ? -1 : 1);\n\n let endScrollLeft = getScrollPosition(remappedStartScrollLeft);\n\n const diff = endScrollLeft - remappedStartScrollLeft;\n if (textDirection === 'rtl') {\n endScrollLeft = startScrollLeft - diff;\n }\n\n onScrollStart();\n\n /**\n * Если окончание прокрутки вышло за ноль.\n */\n if (startScrollLeft * endScrollLeft < 0) {\n endScrollLeft = 0;\n }\n\n if (Math.abs(endScrollLeft) >= Math.abs(extremeScrollLeft)) {\n onScrollToEndBorder();\n endScrollLeft = extremeScrollLeft;\n }\n\n const startTime = now();\n\n (function scroll() {\n const time = now();\n const elapsed = Math.min((time - startTime) / scrollAnimationDuration, 1);\n\n const value = easeInOutSine(elapsed);\n\n const currentScrollLeft = startScrollLeft + (endScrollLeft - startScrollLeft) * value;\n scrollElement.scrollLeft = roundingAwayFromZero(currentScrollLeft);\n\n const scrollEnd =\n textDirection === 'ltr' ? Math.max(0, endScrollLeft) : Math.min(0, endScrollLeft);\n if (roundUpElementScrollLeft(scrollElement) !== scrollEnd && 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://vkui.io/components/horizontal-scroll\n */\nexport const HorizontalScroll = ({\n children,\n getScrollToLeft,\n getScrollToRight,\n showArrows = true,\n arrowSize = 'm',\n arrowOffsetY,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n getRef,\n scrollOnAnyWheel = false,\n prevButtonTestId,\n nextButtonTestId,\n // ContentWrapper\n ContentWrapperComponent = 'div',\n contentWrapperRef,\n contentWrapperClassName,\n ...restProps\n}: HorizontalScrollProps): React.ReactNode => {\n const [canScrollStart, setCanScrollStart] = React.useState(false);\n const [canScrollEnd, setCanScrollEnd] = React.useState(false);\n const { focusVisible, ...focusEvents } = useFocusVisible();\n const focusVisibleClassNames = useFocusVisibleClassName({\n focusVisible,\n });\n\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\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 onScrollToEndBorder: () => setCanScrollEnd(false),\n onScrollEnd: () => (isCustomScrollingRef.current = false),\n onScrollStart: () => (isCustomScrollingRef.current = true),\n initialScrollWidth: scrollElement?.firstElementChild?.scrollWidth || 0,\n scrollAnimationDuration,\n textDirection: direction,\n }),\n );\n if (animationQueue.current.length === 1) {\n animationQueue.current[0]();\n }\n },\n [scrollerRef, scrollAnimationDuration, direction, setCanScrollEnd],\n );\n\n const scrollToStart = React.useCallback(() => {\n const getScrollPosition =\n getScrollToLeft ?? ((i: number) => i - scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToLeft, scrollTo, scrollerRef]);\n\n const scrollToEnd = 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 const scrollLeft = scrollElement.scrollLeft;\n\n setCanScrollStart(isRtl ? scrollLeft < 0 : scrollLeft > 0);\n setCanScrollEnd(\n Math.abs(roundUpElementScrollLeft(scrollElement)) + scrollElement.offsetWidth <\n scrollElement.scrollWidth,\n );\n }\n }, [showArrows, hasPointer, scrollerRef, isRtl]);\n\n React.useEffect(calculateArrowsVisibility, [calculateArrowsVisibility, children]);\n\n useIsomorphicLayoutEffect(\n function addWheelEventHandler() {\n const scrollEl = scrollerRef.current;\n if (!scrollEl) {\n return noop;\n }\n /**\n * Прокрутка с помощью любого колеса мыши.\n */\n const onWheel = (e: WheelEvent) => {\n scrollerRef.current!.scrollBy({ left: e.deltaX + e.deltaY, behavior: 'auto' });\n e.preventDefault();\n };\n\n const listenerOptions = { passive: false };\n\n if (scrollOnAnyWheel) {\n scrollEl.addEventListener('wheel', onWheel, listenerOptions);\n }\n scrollEl.addEventListener('scroll', calculateArrowsVisibility, listenerOptions);\n\n return () => {\n if (scrollOnAnyWheel) {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions для wheel нет passive свойства\n scrollEl.removeEventListener('wheel', onWheel, listenerOptions);\n }\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions для scroll нет passive свойства\n scrollEl.removeEventListener('scroll', calculateArrowsVisibility, listenerOptions);\n };\n },\n [scrollOnAnyWheel, calculateArrowsVisibility, scrollerRef],\n );\n\n return (\n <RootComponent\n {...restProps}\n baseClassName={classNames(\n styles.host,\n 'vkuiInternalHorizontalScroll',\n showArrows === 'always' && styles.withConstArrows,\n isRtl && styles.rtl,\n )}\n onMouseEnter={calculateArrowsVisibility}\n >\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollStart && (\n <ScrollArrow\n data-testid={prevButtonTestId}\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"left\"\n aria-hidden\n tabIndex={-1}\n className={classNames(styles.arrow, styles.arrowLeft)}\n onClick={scrollToStart}\n />\n )}\n {showArrows && (hasPointer || hasPointer === undefined) && canScrollEnd && (\n <ScrollArrow\n data-testid={nextButtonTestId}\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"right\"\n aria-hidden\n tabIndex={-1}\n className={classNames(styles.arrow, styles.arrowRight)}\n onClick={scrollToEnd}\n />\n )}\n <div\n className={classNames(styles.in, focusVisibleClassNames)}\n ref={scrollerRef}\n tabIndex={0}\n {...focusEvents}\n >\n <ContentWrapperComponent\n className={classNames(styles.inWrapper, contentWrapperClassName)}\n ref={contentWrapperRef}\n >\n {children}\n </ContentWrapperComponent>\n </div>\n </RootComponent>\n );\n};\n"],"names":["React","classNames","noop","useAdaptivityHasPointer","useConfigDirection","useExternRef","useFocusVisible","useFocusVisibleClassName","easeInOutSine","useIsomorphicLayoutEffect","RootComponent","ScrollArrow","styles","now","performance","Date","roundingAwayFromZero","value","Math","ceil","floor","roundUpElementScrollLeft","el","scrollLeft","SCROLL_ONE_FRAME_TIME","doScroll","scrollElement","getScrollPosition","animationQueue","onScrollToEndBorder","onScrollEnd","onScrollStart","initialScrollWidth","scrollAnimationDuration","textDirection","extremeScrollLeft","offsetWidth","startScrollLeft","remappedStartScrollLeft","endScrollLeft","diff","abs","startTime","scroll","time","elapsed","min","currentScrollLeft","scrollEnd","max","requestAnimationFrame","shift","length","HorizontalScroll","children","getScrollToLeft","getScrollToRight","showArrows","arrowSize","arrowOffsetY","getRef","scrollOnAnyWheel","prevButtonTestId","nextButtonTestId","ContentWrapperComponent","contentWrapperRef","contentWrapperClassName","restProps","canScrollStart","setCanScrollStart","useState","canScrollEnd","setCanScrollEnd","focusVisible","focusEvents","focusVisibleClassNames","direction","isRtl","isCustomScrollingRef","useRef","scrollerRef","hasPointer","scrollTo","useCallback","current","push","firstElementChild","scrollWidth","scrollToStart","i","scrollToEnd","calculateArrowsVisibility","useEffect","addWheelEventHandler","scrollEl","onWheel","e","scrollBy","left","deltaX","deltaY","behavior","preventDefault","listenerOptions","passive","addEventListener","removeEventListener","baseClassName","host","withConstArrows","rtl","onMouseEnter","undefined","data-testid","size","offsetY","aria-hidden","tabIndex","className","arrow","arrowLeft","onClick","arrowRight","div","in","ref","inWrapper"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/HorizontalScroll/HorizontalScroll.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { classNames, noop } from '@vkontakte/vkjs';\nimport { useConfigDirection } from '../../hooks/useConfigDirection';\nimport { useExternRef } from '../../hooks/useExternRef';\nimport { useFocusVisible } from '../../hooks/useFocusVisible';\nimport { useFocusVisibleClassName } from '../../hooks/useFocusVisibleClassName';\nimport { easeInOutSine } from '../../lib/fx';\nimport { mergeCalls } from '../../lib/mergeCalls';\nimport { useIsomorphicLayoutEffect } from '../../lib/useIsomorphicLayoutEffect';\nimport type { HasRef, HTMLAttributesWithRootRef } from '../../types';\nimport { useHover } from '../Clickable/useState';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport { ScrollArrow, type ScrollArrowProps } from '../ScrollArrow/ScrollArrow';\nimport styles from './HorizontalScroll.module.css';\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface ScrollContext {\n scrollElement: HTMLElement | null;\n scrollAnimationDuration: number;\n animationQueue: VoidFunction[];\n getScrollPosition: (currentPosition: number) => number;\n onScrollToEndBorder: VoidFunction;\n onScrollEnd: VoidFunction;\n onScrollStart: VoidFunction;\n /**\n * Начальная ширина прокрутки.\n * В некоторых случаях может отличаться от текущей ширины прокрутки из-за transforms: translate.\n */\n initialScrollWidth: number;\n textDirection: 'ltr' | 'rtl';\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport type ScrollPositionHandler = (currentPosition: number) => number;\n\nexport interface HorizontalScrollProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n HasRef<HTMLDivElement> {\n /**\n * Функция для расчета величины прокрутки при нажатии на левую стрелку.\n */\n getScrollToLeft?: ScrollPositionHandler;\n /**\n * Функция для расчета величины прокрутки при нажатии на правую стрелку.\n */\n getScrollToRight?: ScrollPositionHandler;\n /**\n * Размер стрелок.\n */\n arrowSize?: ScrollArrowProps['size'];\n /**\n * Смещает иконки кнопок навигации по вертикали.\n */\n arrowOffsetY?: number | string;\n /**\n * Показывать ли стрелки.\n */\n showArrows?: boolean | 'always';\n /**\n * Длительность анимации скролла.\n */\n scrollAnimationDuration?: number;\n /**\n * Добавляет возможность прокручивать контент на любое колесо мыши.\n * По умолчанию прокручивается как любой горизонтальный контент через shift.\n */\n scrollOnAnyWheel?: boolean;\n /**\n * Передает атрибут `data-testid` для кнопки прокрутки горизонтального скролла в направлении предыдущего элемента.\n */\n prevButtonTestId?: string;\n /**\n * Передает атрибут `data-testid` для кнопки прокрутки горизонтального скролла в направлении следующего элемента.\n */\n nextButtonTestId?: string;\n /**\n * Позволяет поменять тег используемый для обертки над контентом, прокинутым в `children`.\n */\n ContentWrapperComponent?: React.ElementType;\n /**\n * `ref` для обертки над контентом, прокинутым в `children`.\n */\n contentWrapperRef?: React.Ref<HTMLElement>;\n /**\n * Специфичный `className` для обертки над контентом, прокинутым в `children`.\n */\n contentWrapperClassName?: string;\n}\n\n/**\n * Timing method.\n */\nfunction now() {\n return performance && performance.now ? performance.now() : Date.now();\n}\n\n/**\n * Округление к большему по модулю.\n *\n * ## Пример\n *\n * ```ts\n * import { strict as assert } from 'node:assert';\n *\n * assert.equal(roundingAwayFromZero(5.1), 6)\n * assert.equal(roundingAwayFromZero(-5.1), -6)\n * ```\n */\nfunction roundingAwayFromZero(value: number): number {\n return value > 0 ? Math.ceil(value) : Math.floor(value);\n}\n\n/**\n * Округляем el.scrollLeft\n * https://github.com/VKCOM/VKUI/pull/2445.\n */\nconst roundUpElementScrollLeft = (el: HTMLElement) => roundingAwayFromZero(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 onScrollToEndBorder,\n onScrollEnd,\n onScrollStart,\n initialScrollWidth,\n scrollAnimationDuration,\n textDirection,\n}: ScrollContext) {\n if (!scrollElement || !getScrollPosition) {\n return;\n }\n\n /**\n * Крайнее значение сдвига.\n */\n const extremeScrollLeft =\n (textDirection === 'ltr' ? 1 : -1) * (initialScrollWidth - scrollElement.offsetWidth);\n\n const startScrollLeft = roundUpElementScrollLeft(scrollElement);\n const remappedStartScrollLeft = startScrollLeft * (textDirection === 'rtl' ? -1 : 1);\n\n let endScrollLeft = getScrollPosition(remappedStartScrollLeft);\n\n const diff = endScrollLeft - remappedStartScrollLeft;\n if (textDirection === 'rtl') {\n endScrollLeft = startScrollLeft - diff;\n }\n\n onScrollStart();\n\n /**\n * Если окончание прокрутки вышло за ноль.\n */\n if (startScrollLeft * endScrollLeft < 0) {\n endScrollLeft = 0;\n }\n\n if (Math.abs(endScrollLeft) >= Math.abs(extremeScrollLeft)) {\n onScrollToEndBorder();\n endScrollLeft = extremeScrollLeft;\n }\n\n const startTime = now();\n\n (function scroll() {\n const time = now();\n const elapsed = Math.min((time - startTime) / scrollAnimationDuration, 1);\n\n const value = easeInOutSine(elapsed);\n\n const currentScrollLeft = startScrollLeft + (endScrollLeft - startScrollLeft) * value;\n scrollElement.scrollLeft = roundingAwayFromZero(currentScrollLeft);\n\n const scrollEnd =\n textDirection === 'ltr' ? Math.max(0, endScrollLeft) : Math.min(0, endScrollLeft);\n if (roundUpElementScrollLeft(scrollElement) !== scrollEnd && 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://vkui.io/components/horizontal-scroll\n */\nexport const HorizontalScroll = ({\n children,\n getScrollToLeft,\n getScrollToRight,\n showArrows = true,\n arrowSize = 'm',\n arrowOffsetY,\n scrollAnimationDuration = SCROLL_ONE_FRAME_TIME,\n getRef,\n scrollOnAnyWheel = false,\n prevButtonTestId,\n nextButtonTestId,\n // ContentWrapper\n ContentWrapperComponent = 'div',\n contentWrapperRef,\n contentWrapperClassName,\n onPointerEnter,\n onPointerLeave,\n onMouseEnter,\n ...restProps\n}: HorizontalScrollProps): React.ReactNode => {\n const [canScrollStart, setCanScrollStart] = React.useState(false);\n const [canScrollEnd, setCanScrollEnd] = React.useState(false);\n const { focusVisible, ...focusEvents } = useFocusVisible();\n const focusVisibleClassNames = useFocusVisibleClassName({\n focusVisible,\n });\n\n const direction = useConfigDirection();\n const isRtl = direction === 'rtl';\n\n const isCustomScrollingRef = React.useRef(false);\n\n const scrollerRef = useExternRef(getRef);\n\n const animationQueue = React.useRef<VoidFunction[]>([]);\n\n const { isHovered, ...hoverHandlers } = useHover();\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 onScrollToEndBorder: () => setCanScrollEnd(false),\n onScrollEnd: () => (isCustomScrollingRef.current = false),\n onScrollStart: () => (isCustomScrollingRef.current = true),\n initialScrollWidth: scrollElement?.firstElementChild?.scrollWidth || 0,\n scrollAnimationDuration,\n textDirection: direction,\n }),\n );\n if (animationQueue.current.length === 1) {\n animationQueue.current[0]();\n }\n },\n [scrollerRef, scrollAnimationDuration, direction, setCanScrollEnd],\n );\n\n const scrollToStart = React.useCallback(() => {\n const getScrollPosition =\n getScrollToLeft ?? ((i: number) => i - scrollerRef.current!.offsetWidth);\n scrollTo(getScrollPosition);\n }, [getScrollToLeft, scrollTo, scrollerRef]);\n\n const scrollToEnd = 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 && scrollerRef.current && !isCustomScrollingRef.current) {\n const scrollElement = scrollerRef.current;\n const scrollLeft = scrollElement.scrollLeft;\n\n setCanScrollStart(isRtl ? scrollLeft < 0 : scrollLeft > 0);\n setCanScrollEnd(\n Math.abs(roundUpElementScrollLeft(scrollElement)) + scrollElement.offsetWidth <\n scrollElement.scrollWidth,\n );\n }\n }, [showArrows, scrollerRef, isRtl]);\n\n React.useEffect(calculateArrowsVisibility, [calculateArrowsVisibility, children]);\n\n useIsomorphicLayoutEffect(\n function addWheelEventHandler() {\n const scrollEl = scrollerRef.current;\n if (!scrollEl) {\n return noop;\n }\n /**\n * Прокрутка с помощью любого колеса мыши.\n */\n const onWheel = (e: WheelEvent) => {\n scrollerRef.current!.scrollBy({ left: e.deltaX + e.deltaY, behavior: 'auto' });\n e.preventDefault();\n };\n\n const listenerOptions = { passive: false };\n\n if (scrollOnAnyWheel) {\n scrollEl.addEventListener('wheel', onWheel, listenerOptions);\n }\n scrollEl.addEventListener('scroll', calculateArrowsVisibility, listenerOptions);\n\n return () => {\n if (scrollOnAnyWheel) {\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions для wheel нет passive свойства\n scrollEl.removeEventListener('wheel', onWheel, listenerOptions);\n }\n // @ts-expect-error: TS2769 В интерфейсе EventListenerOptions для scroll нет passive свойства\n scrollEl.removeEventListener('scroll', calculateArrowsVisibility, listenerOptions);\n };\n },\n [scrollOnAnyWheel, calculateArrowsVisibility, scrollerRef],\n );\n\n const handlers = mergeCalls(hoverHandlers, { onPointerEnter, onPointerLeave });\n\n return (\n <RootComponent\n {...restProps}\n {...handlers}\n baseClassName={classNames(\n styles.host,\n 'vkuiInternalHorizontalScroll',\n (showArrows === 'always' || isHovered) && styles.showArrows,\n isRtl && styles.rtl,\n )}\n // FIXME: onMouseEnter из restProps затирается, а при callMultiply орет линтер на рефы.\n onMouseEnter={calculateArrowsVisibility}\n >\n {showArrows && canScrollStart && (\n <ScrollArrow\n data-testid={prevButtonTestId}\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"left\"\n aria-hidden\n tabIndex={-1}\n className={classNames(styles.arrow, styles.arrowLeft)}\n onClick={scrollToStart}\n />\n )}\n {showArrows && canScrollEnd && (\n <ScrollArrow\n data-testid={nextButtonTestId}\n size={arrowSize}\n offsetY={arrowOffsetY}\n direction=\"right\"\n aria-hidden\n tabIndex={-1}\n className={classNames(styles.arrow, styles.arrowRight)}\n onClick={scrollToEnd}\n />\n )}\n <div\n className={classNames(styles.in, focusVisibleClassNames)}\n ref={scrollerRef}\n tabIndex={0}\n {...focusEvents}\n >\n <ContentWrapperComponent\n className={classNames(styles.inWrapper, contentWrapperClassName)}\n ref={contentWrapperRef}\n >\n {children}\n </ContentWrapperComponent>\n </div>\n </RootComponent>\n );\n};\n"],"names":["React","classNames","noop","useConfigDirection","useExternRef","useFocusVisible","useFocusVisibleClassName","easeInOutSine","mergeCalls","useIsomorphicLayoutEffect","useHover","RootComponent","ScrollArrow","styles","now","performance","Date","roundingAwayFromZero","value","Math","ceil","floor","roundUpElementScrollLeft","el","scrollLeft","SCROLL_ONE_FRAME_TIME","doScroll","scrollElement","getScrollPosition","animationQueue","onScrollToEndBorder","onScrollEnd","onScrollStart","initialScrollWidth","scrollAnimationDuration","textDirection","extremeScrollLeft","offsetWidth","startScrollLeft","remappedStartScrollLeft","endScrollLeft","diff","abs","startTime","scroll","time","elapsed","min","currentScrollLeft","scrollEnd","max","requestAnimationFrame","shift","length","HorizontalScroll","children","getScrollToLeft","getScrollToRight","showArrows","arrowSize","arrowOffsetY","getRef","scrollOnAnyWheel","prevButtonTestId","nextButtonTestId","ContentWrapperComponent","contentWrapperRef","contentWrapperClassName","onPointerEnter","onPointerLeave","onMouseEnter","restProps","canScrollStart","setCanScrollStart","useState","canScrollEnd","setCanScrollEnd","focusVisible","focusEvents","focusVisibleClassNames","direction","isRtl","isCustomScrollingRef","useRef","scrollerRef","isHovered","hoverHandlers","scrollTo","useCallback","current","push","firstElementChild","scrollWidth","scrollToStart","i","scrollToEnd","calculateArrowsVisibility","useEffect","addWheelEventHandler","scrollEl","onWheel","e","scrollBy","left","deltaX","deltaY","behavior","preventDefault","listenerOptions","passive","addEventListener","removeEventListener","handlers","baseClassName","host","rtl","data-testid","size","offsetY","aria-hidden","tabIndex","className","arrow","arrowLeft","onClick","arrowRight","div","in","ref","inWrapper"],"mappings":"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"}
|
|
@@ -43,8 +43,7 @@
|
|
|
43
43
|
opacity: 0;
|
|
44
44
|
}
|
|
45
45
|
|
|
46
|
-
.
|
|
47
|
-
.withConstArrows .arrow {
|
|
46
|
+
.showArrows .arrow {
|
|
48
47
|
opacity: var(--vkui--opacity_disable_accessibility);
|
|
49
48
|
}
|
|
50
49
|
|
|
@@ -75,7 +74,8 @@
|
|
|
75
74
|
|
|
76
75
|
:global(.vkuiInternalTabs--withGaps) .inWrapper::after,
|
|
77
76
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
78
|
-
:global(.vkuiInternalTabs--withGaps)
|
|
77
|
+
:global(.vkuiInternalTabs--withGaps)
|
|
78
|
+
.inWrapper::before {
|
|
79
79
|
display: block;
|
|
80
80
|
flex-shrink: 0;
|
|
81
81
|
inline-size: var(--vkui--size_base_padding_horizontal--regular);
|
|
@@ -119,9 +119,13 @@
|
|
|
119
119
|
|
|
120
120
|
:global(.vkuiInternalFormItem--removable) :global(.vkuiInternalRemovable__content) > .host,
|
|
121
121
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
122
|
-
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
122
|
+
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
123
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
124
|
+
:global(.vkuiInternalRemovable__content)
|
|
125
|
+
> .host,
|
|
123
126
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
124
|
-
:global(.vkuiInternalFormField__after)
|
|
127
|
+
:global(.vkuiInternalFormField__after)
|
|
128
|
+
.host {
|
|
125
129
|
display: flex;
|
|
126
130
|
align-content: center;
|
|
127
131
|
align-items: center;
|
|
@@ -80,7 +80,9 @@
|
|
|
80
80
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
81
81
|
|
|
82
82
|
.modeAdd .middle :global(.vkuiIcon),
|
|
83
|
-
|
|
84
|
-
.
|
|
83
|
+
.modeMore
|
|
84
|
+
.middle
|
|
85
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
86
|
+
:global(.vkuiIcon) {
|
|
85
87
|
color: var(--vkui--color_icon_accent_themed);
|
|
86
88
|
}
|
|
@@ -30,7 +30,8 @@
|
|
|
30
30
|
* Для этого также нужны `inline-size: auto` и `margin-inline: auto`.
|
|
31
31
|
*/
|
|
32
32
|
inset-block-end: calc(
|
|
33
|
-
var(--vkui--spacing_size_m) +
|
|
33
|
+
var(--vkui--spacing_size_m) +
|
|
34
|
+
var(--vkui_internal_ModalCard--safeAreaInsetBottom)
|
|
34
35
|
);
|
|
35
36
|
inset-inline: var(--vkui--spacing_size_m);
|
|
36
37
|
box-sizing: border-box;
|
|
@@ -19,12 +19,14 @@
|
|
|
19
19
|
|
|
20
20
|
.withSafeZone .container {
|
|
21
21
|
-webkit-padding-before: calc(
|
|
22
|
-
var(--vkui_internal--dismiss_icon_height) +
|
|
23
|
-
|
|
22
|
+
var(--vkui_internal--dismiss_icon_height) +
|
|
23
|
+
var(--vkui_internal--dismiss_icon_padding) +
|
|
24
|
+
var(--vkui_internal--dismiss_icon_safe_offset)
|
|
24
25
|
);
|
|
25
26
|
padding-block-start: calc(
|
|
26
|
-
var(--vkui_internal--dismiss_icon_height) +
|
|
27
|
-
|
|
27
|
+
var(--vkui_internal--dismiss_icon_height) +
|
|
28
|
+
var(--vkui_internal--dismiss_icon_padding) +
|
|
29
|
+
var(--vkui_internal--dismiss_icon_safe_offset)
|
|
28
30
|
);
|
|
29
31
|
}
|
|
30
32
|
|
|
@@ -103,13 +105,15 @@
|
|
|
103
105
|
|
|
104
106
|
.withSafeZone.desktop .container {
|
|
105
107
|
-webkit-padding-before: calc(
|
|
106
|
-
var(--vkui_internal--dismiss_icon_height) +
|
|
107
|
-
|
|
108
|
-
|
|
108
|
+
var(--vkui_internal--dismiss_icon_height) +
|
|
109
|
+
var(--vkui_internal--dismiss_icon_padding) +
|
|
110
|
+
var(--vkui_internal--dismiss_icon_safe_offset) +
|
|
111
|
+
var(--vkui_internal--dismiss_icon_desktop_offset)
|
|
109
112
|
);
|
|
110
113
|
padding-block-start: calc(
|
|
111
|
-
var(--vkui_internal--dismiss_icon_height) +
|
|
112
|
-
|
|
113
|
-
|
|
114
|
+
var(--vkui_internal--dismiss_icon_height) +
|
|
115
|
+
var(--vkui_internal--dismiss_icon_padding) +
|
|
116
|
+
var(--vkui_internal--dismiss_icon_safe_offset) +
|
|
117
|
+
var(--vkui_internal--dismiss_icon_desktop_offset)
|
|
114
118
|
);
|
|
115
119
|
}
|
|
@@ -26,7 +26,8 @@
|
|
|
26
26
|
|
|
27
27
|
.hostMobileSafeAreaInsetTopWithCustomOffset {
|
|
28
28
|
max-block-size: calc(
|
|
29
|
-
100% -
|
|
29
|
+
100% -
|
|
30
|
+
(var(--vkui_internal--safe_area_inset_top) + var(--vkui_internal--panel_header_height))
|
|
30
31
|
);
|
|
31
32
|
}
|
|
32
33
|
|
|
@@ -15,9 +15,11 @@
|
|
|
15
15
|
padding-inline: 8px;
|
|
16
16
|
}
|
|
17
17
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
18
|
+
.host
|
|
19
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
20
|
+
:global(
|
|
21
|
+
.vkuiIcon--dismiss_24
|
|
22
|
+
) /* Note: <Icon24Dismiss /> по документации используется только для iOS */,
|
|
21
23
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
22
24
|
.host :global(.vkuiIcon--cancel_24) {
|
|
23
25
|
color: var(--vkui--color_icon_secondary);
|
|
@@ -87,10 +87,12 @@
|
|
|
87
87
|
-webkit-padding-after: var(--vkui_internal--tabbar_height);
|
|
88
88
|
padding-block-end: var(--vkui_internal--tabbar_height);
|
|
89
89
|
-webkit-padding-after: calc(
|
|
90
|
-
var(--vkui_internal--safe_area_inset_bottom) +
|
|
90
|
+
var(--vkui_internal--safe_area_inset_bottom) +
|
|
91
|
+
var(--vkui_internal--tabbar_height)
|
|
91
92
|
);
|
|
92
93
|
padding-block-end: calc(
|
|
93
|
-
var(--vkui_internal--safe_area_inset_bottom) +
|
|
94
|
+
var(--vkui_internal--safe_area_inset_bottom) +
|
|
95
|
+
var(--vkui_internal--tabbar_height)
|
|
94
96
|
);
|
|
95
97
|
}
|
|
96
98
|
|
|
@@ -281,7 +281,7 @@
|
|
|
281
281
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
282
282
|
|
|
283
283
|
.vkcom.sizeXRegular:not(:global(.vkuiInternalModalPageHeader__in)):not(.sep):not(.trnsp)
|
|
284
|
-
|
|
284
|
+
.in::after {
|
|
285
285
|
position: absolute;
|
|
286
286
|
inset-block-end: 0;
|
|
287
287
|
inset-inline: var(--vkui--size_border--regular);
|
|
@@ -38,8 +38,8 @@
|
|
|
38
38
|
|
|
39
39
|
.closing .overlay {
|
|
40
40
|
opacity: 0;
|
|
41
|
-
|
|
42
|
-
|
|
41
|
+
animation: animation-full-fade-out var(--vkui--animation_duration_m)
|
|
42
|
+
var(--vkui--animation_easing_default) both;
|
|
43
43
|
}
|
|
44
44
|
|
|
45
45
|
.masked .overlay {
|
|
@@ -4,8 +4,9 @@
|
|
|
4
4
|
align-items: center;
|
|
5
5
|
transform: translateX(
|
|
6
6
|
calc(
|
|
7
|
-
-1px *
|
|
8
|
-
|
|
7
|
+
-1px *
|
|
8
|
+
var(--vkui_internal_Removable_remove_offset) *
|
|
9
|
+
var(--vkui_internal_Removable_remove_offset_direction)
|
|
9
10
|
)
|
|
10
11
|
);
|
|
11
12
|
|
|
@@ -135,7 +136,8 @@
|
|
|
135
136
|
|
|
136
137
|
:global(.vkuiInternalFormItem--removable) .content,
|
|
137
138
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
138
|
-
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
139
|
+
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
140
|
+
.content {
|
|
139
141
|
flex-wrap: wrap;
|
|
140
142
|
align-items: flex-start;
|
|
141
143
|
}
|
|
@@ -148,7 +150,10 @@
|
|
|
148
150
|
|
|
149
151
|
:global(.vkuiInternalFormItem--withTop) :global(.vkuiInternalFormItem__removable) ~ .offset,
|
|
150
152
|
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
151
|
-
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
153
|
+
:global(.vkuiInternalFormLayoutGroup--removable)
|
|
154
|
+
/* stylelint-disable-next-line selector-pseudo-class-disallowed-list */
|
|
155
|
+
:global(.vkuiInternalFormItem--withTop)
|
|
156
|
+
~ .offset {
|
|
152
157
|
display: block;
|
|
153
158
|
order: -1;
|
|
154
159
|
inline-size: 100%;
|
|
@@ -25,13 +25,13 @@
|
|
|
25
25
|
}
|
|
26
26
|
|
|
27
27
|
.viewShowForward {
|
|
28
|
-
|
|
29
|
-
|
|
28
|
+
animation: root-animation-show-forward var(--vkui_internal--root_animation_duration)
|
|
29
|
+
var(--vkui--animation_easing_platform);
|
|
30
30
|
}
|
|
31
31
|
|
|
32
32
|
.viewHideBack {
|
|
33
|
-
|
|
34
|
-
|
|
33
|
+
animation: root-animation-hide-back var(--vkui_internal--root_animation_duration)
|
|
34
|
+
var(--vkui--animation_easing_platform) forwards;
|
|
35
35
|
}
|
|
36
36
|
|
|
37
37
|
.transition .view {
|
|
@@ -63,13 +63,13 @@
|
|
|
63
63
|
}
|
|
64
64
|
|
|
65
65
|
.ios .viewShowBack::after {
|
|
66
|
-
|
|
67
|
-
|
|
66
|
+
animation: root-ios-overlay-animation-show-back var(--vkui_internal--root_animation_duration)
|
|
67
|
+
var(--vkui--animation_easing_platform) forwards;
|
|
68
68
|
}
|
|
69
69
|
|
|
70
70
|
.ios .viewHideForward::after {
|
|
71
|
-
|
|
72
|
-
|
|
71
|
+
animation: root-ios-overlay-animation-hide-forward var(--vkui_internal--root_animation_duration)
|
|
72
|
+
var(--vkui--animation_easing_platform);
|
|
73
73
|
}
|
|
74
74
|
|
|
75
75
|
@media screen and (prefers-reduced-motion: reduce) {
|
|
@@ -38,7 +38,7 @@
|
|
|
38
38
|
flex-basis: 0%;
|
|
39
39
|
/**
|
|
40
40
|
* Костыль для PanelHeader. Необходимо для растягивания на всю ширину.
|
|
41
|
-
|
|
41
|
+
*/
|
|
42
42
|
inline-size: 10000px;
|
|
43
43
|
block-size: var(--vkui_internal--search_height);
|
|
44
44
|
overflow: hidden;
|
|
@@ -80,7 +80,6 @@
|
|
|
80
80
|
box-sizing: border-box;
|
|
81
81
|
flex-grow: 1;
|
|
82
82
|
inline-size: -webkit-fill-available;
|
|
83
|
-
inline-size: -moz-available;
|
|
84
83
|
inline-size: stretch; /* автопрефиксер добавит фолбеки https://caniuse.com/mdn-css_properties_width_stretch */
|
|
85
84
|
min-inline-size: 0;
|
|
86
85
|
max-inline-size: 100%;
|
|
@@ -152,7 +151,7 @@
|
|
|
152
151
|
transform: translate3d(
|
|
153
152
|
calc(
|
|
154
153
|
var(--vkui_internal--search_shift_direction) *
|
|
155
|
-
|
|
154
|
+
calc(100% - var(--vkui_internal--search_icon_size))
|
|
156
155
|
),
|
|
157
156
|
0,
|
|
158
157
|
0
|
|
@@ -37,13 +37,15 @@
|
|
|
37
37
|
|
|
38
38
|
.placementBottomStart {
|
|
39
39
|
--vkui_internal--snackbar_direction: calc(
|
|
40
|
-
-1 *
|
|
40
|
+
-1 *
|
|
41
|
+
var(--vkui_internal--snackbar_animation_text_direction)
|
|
41
42
|
);
|
|
42
43
|
}
|
|
43
44
|
|
|
44
45
|
.placementBottomEnd {
|
|
45
46
|
--vkui_internal--snackbar_direction: calc(
|
|
46
|
-
1 *
|
|
47
|
+
1 *
|
|
48
|
+
var(--vkui_internal--snackbar_animation_text_direction)
|
|
47
49
|
);
|
|
48
50
|
}
|
|
49
51
|
|
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
.body {
|
|
2
2
|
--vkui_internal--snackbar-body_layout_vertical_action_shift: calc(
|
|
3
3
|
-1 *
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
(
|
|
5
|
+
var(--vkui--size_button_small_height--compact) -
|
|
6
|
+
var(--vkui--font_subhead--line_height--compact)
|
|
7
|
+
) /
|
|
8
|
+
2
|
|
9
9
|
);
|
|
10
10
|
|
|
11
11
|
box-sizing: border-box;
|
|
@@ -21,11 +21,11 @@
|
|
|
21
21
|
.sizeYRegular {
|
|
22
22
|
--vkui_internal--snackbar-body_layout_vertical_action_shift: calc(
|
|
23
23
|
-1 *
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
24
|
+
(
|
|
25
|
+
var(--vkui--size_button_small_height--regular) -
|
|
26
|
+
var(--vkui--font_subhead--line_height--regular)
|
|
27
|
+
) /
|
|
28
|
+
2
|
|
29
29
|
);
|
|
30
30
|
}
|
|
31
31
|
|
|
@@ -33,11 +33,11 @@
|
|
|
33
33
|
.sizeYNone {
|
|
34
34
|
--vkui_internal--snackbar-body_layout_vertical_action_shift: calc(
|
|
35
35
|
-1 *
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
36
|
+
(
|
|
37
|
+
var(--vkui--size_button_small_height--regular) -
|
|
38
|
+
var(--vkui--font_subhead--line_height--regular)
|
|
39
|
+
) /
|
|
40
|
+
2
|
|
41
41
|
);
|
|
42
42
|
}
|
|
43
43
|
}
|
|
@@ -18,19 +18,23 @@
|
|
|
18
18
|
position: relative;
|
|
19
19
|
z-index: var(--vkui_internal--z_index_split_layout_panel_header);
|
|
20
20
|
-webkit-margin-before: calc(
|
|
21
|
-
-1 *
|
|
21
|
+
-1 *
|
|
22
|
+
(var(--vkui_internal--panel_header_height) + var(--vkui_internal--safe_area_inset_top))
|
|
22
23
|
);
|
|
23
24
|
margin-block-start: calc(
|
|
24
|
-
-1 *
|
|
25
|
+
-1 *
|
|
26
|
+
(var(--vkui_internal--panel_header_height) + var(--vkui_internal--safe_area_inset_top))
|
|
25
27
|
);
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
.ios .innerHeader {
|
|
29
31
|
-webkit-margin-before: calc(
|
|
30
|
-
-1 *
|
|
32
|
+
-1 *
|
|
33
|
+
(var(--vkui_internal--panel_header_height) + var(--vkui_internal--safe_area_inset_top))
|
|
31
34
|
);
|
|
32
35
|
margin-block-start: calc(
|
|
33
|
-
-1 *
|
|
36
|
+
-1 *
|
|
37
|
+
(var(--vkui_internal--panel_header_height) + var(--vkui_internal--safe_area_inset_top))
|
|
34
38
|
);
|
|
35
39
|
}
|
|
36
40
|
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import * as React from "react";
|
|
3
|
-
import { hasReactNode } from "@vkontakte/vkjs";
|
|
3
|
+
import { classNames, hasReactNode } from "@vkontakte/vkjs";
|
|
4
4
|
import { HorizontalScroll } from "../HorizontalScroll/HorizontalScroll.js";
|
|
5
5
|
import { RootComponent } from "../RootComponent/RootComponent.js";
|
|
6
6
|
import styles from "./SubnavigationBar.module.css";
|
|
@@ -8,7 +8,7 @@ const defaultScrollToLeft = (x)=>x - 240;
|
|
|
8
8
|
const defaultScrollToRight = (x)=>x + 240;
|
|
9
9
|
/**
|
|
10
10
|
* @see https://vkui.io/components/subnavigation-bar
|
|
11
|
-
*/ export const SubnavigationBar = ({ fixed = false, children, showArrows = true, getScrollToLeft = defaultScrollToLeft, getScrollToRight = defaultScrollToRight, scrollAnimationDuration, ...restProps })=>{
|
|
11
|
+
*/ export const SubnavigationBar = ({ fixed = false, children, showArrows = true, noPadding = false, arrowSize = 's', getScrollToLeft = defaultScrollToLeft, getScrollToRight = defaultScrollToRight, scrollAnimationDuration, ...restProps })=>{
|
|
12
12
|
let ScrollWrapper;
|
|
13
13
|
let scrollWrapperProps = {};
|
|
14
14
|
if (fixed) {
|
|
@@ -17,6 +17,7 @@ const defaultScrollToRight = (x)=>x + 240;
|
|
|
17
17
|
ScrollWrapper = HorizontalScroll;
|
|
18
18
|
scrollWrapperProps = {
|
|
19
19
|
showArrows,
|
|
20
|
+
arrowSize,
|
|
20
21
|
getScrollToLeft,
|
|
21
22
|
getScrollToRight,
|
|
22
23
|
scrollAnimationDuration
|
|
@@ -29,7 +30,7 @@ const defaultScrollToRight = (x)=>x + 240;
|
|
|
29
30
|
className: styles.in,
|
|
30
31
|
...scrollWrapperProps,
|
|
31
32
|
children: /*#__PURE__*/ _jsx("ul", {
|
|
32
|
-
className: styles.scrollIn,
|
|
33
|
+
className: classNames(styles.scrollIn, noPadding && styles.noPadding),
|
|
33
34
|
children: React.Children.map(children, (child, idx)=>hasReactNode(child) ? /*#__PURE__*/ _jsx("li", {
|
|
34
35
|
className: styles.item,
|
|
35
36
|
children: child
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/components/SubnavigationBar/SubnavigationBar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { hasReactNode } from '@vkontakte/vkjs';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n HorizontalScroll,\n type HorizontalScrollProps,\n type ScrollPositionHandler,\n} from '../HorizontalScroll/HorizontalScroll';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './SubnavigationBar.module.css';\n\nexport interface SubnavigationBarProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n Pick<\n HorizontalScrollProps,\n 'showArrows' | 'getScrollToLeft'
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/SubnavigationBar/SubnavigationBar.tsx"],"sourcesContent":["import * as React from 'react';\nimport { classNames, hasReactNode } from '@vkontakte/vkjs';\nimport type { HTMLAttributesWithRootRef } from '../../types';\nimport {\n HorizontalScroll,\n type HorizontalScrollProps,\n type ScrollPositionHandler,\n} from '../HorizontalScroll/HorizontalScroll';\nimport { RootComponent } from '../RootComponent/RootComponent';\nimport styles from './SubnavigationBar.module.css';\n\nexport interface SubnavigationBarProps\n extends HTMLAttributesWithRootRef<HTMLDivElement>,\n Pick<\n HorizontalScrollProps,\n | 'showArrows'\n | 'arrowSize'\n | 'getScrollToLeft'\n | 'getScrollToRight'\n | 'scrollAnimationDuration'\n > {\n /**\n * Отключение возможности прокручивания компонента по горизонтали.\n */\n fixed?: boolean;\n /**\n * Отключает отступы. Рекомендуется использовать с `mode=\"outline\"` у [`SubnavigationButton`](https://vkui.io/components/subnavigation-button).\n */\n noPadding?: boolean;\n}\n\nconst defaultScrollToLeft: ScrollPositionHandler = (x) => x - 240;\n\nconst defaultScrollToRight: ScrollPositionHandler = (x) => x + 240;\n\n/**\n * @see https://vkui.io/components/subnavigation-bar\n */\nexport const SubnavigationBar = ({\n fixed = false,\n children,\n showArrows = true,\n noPadding = false,\n arrowSize = 's',\n getScrollToLeft = defaultScrollToLeft,\n getScrollToRight = defaultScrollToRight,\n scrollAnimationDuration,\n ...restProps\n}: SubnavigationBarProps): React.ReactNode => {\n let ScrollWrapper: React.ElementType;\n let scrollWrapperProps = {};\n\n if (fixed) {\n ScrollWrapper = 'div';\n } else {\n ScrollWrapper = HorizontalScroll;\n scrollWrapperProps = {\n showArrows,\n arrowSize,\n getScrollToLeft,\n getScrollToRight,\n scrollAnimationDuration,\n };\n }\n\n return (\n <RootComponent baseClassName={fixed && styles.modeFixed} {...restProps}>\n <ScrollWrapper className={styles.in} {...scrollWrapperProps}>\n <ul className={classNames(styles.scrollIn, noPadding && styles.noPadding)}>\n {React.Children.map(children, (child, idx) =>\n hasReactNode(child) ? (\n <li key={idx} className={styles.item}>\n {child}\n </li>\n ) : null,\n )}\n </ul>\n </ScrollWrapper>\n </RootComponent>\n );\n};\n"],"names":["React","classNames","hasReactNode","HorizontalScroll","RootComponent","styles","defaultScrollToLeft","x","defaultScrollToRight","SubnavigationBar","fixed","children","showArrows","noPadding","arrowSize","getScrollToLeft","getScrollToRight","scrollAnimationDuration","restProps","ScrollWrapper","scrollWrapperProps","baseClassName","modeFixed","className","in","ul","scrollIn","Children","map","child","idx","li","item"],"mappings":";AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,UAAU,EAAEC,YAAY,QAAQ,kBAAkB;AAE3D,SACEC,gBAAgB,QAGX,0CAAuC;AAC9C,SAASC,aAAa,QAAQ,oCAAiC;AAC/D,OAAOC,YAAY,gCAAgC;AAsBnD,MAAMC,sBAA6C,CAACC,IAAMA,IAAI;AAE9D,MAAMC,uBAA8C,CAACD,IAAMA,IAAI;AAE/D;;CAEC,GACD,OAAO,MAAME,mBAAmB,CAAC,EAC/BC,QAAQ,KAAK,EACbC,QAAQ,EACRC,aAAa,IAAI,EACjBC,YAAY,KAAK,EACjBC,YAAY,GAAG,EACfC,kBAAkBT,mBAAmB,EACrCU,mBAAmBR,oBAAoB,EACvCS,uBAAuB,EACvB,GAAGC,WACmB;IACtB,IAAIC;IACJ,IAAIC,qBAAqB,CAAC;IAE1B,IAAIV,OAAO;QACTS,gBAAgB;IAClB,OAAO;QACLA,gBAAgBhB;QAChBiB,qBAAqB;YACnBR;YACAE;YACAC;YACAC;YACAC;QACF;IACF;IAEA,qBACE,KAACb;QAAciB,eAAeX,SAASL,OAAOiB,SAAS;QAAG,GAAGJ,SAAS;kBACpE,cAAA,KAACC;YAAcI,WAAWlB,OAAOmB,EAAE;YAAG,GAAGJ,kBAAkB;sBACzD,cAAA,KAACK;gBAAGF,WAAWtB,WAAWI,OAAOqB,QAAQ,EAAEb,aAAaR,OAAOQ,SAAS;0BACrEb,MAAM2B,QAAQ,CAACC,GAAG,CAACjB,UAAU,CAACkB,OAAOC,MACpC5B,aAAa2B,uBACX,KAACE;wBAAaR,WAAWlB,OAAO2B,IAAI;kCACjCH;uBADMC,OAGP;;;;AAMhB,EAAE"}
|