@vkontakte/vkui 7.3.8 → 7.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/ActionSheet/ActionSheet.d.ts +1 -1
- package/dist/components/ActionSheet/ActionSheet.d.ts.map +1 -1
- package/dist/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/components/AppRoot/ScrollContext.js +2 -2
- package/dist/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/components/Banner/Banner.d.ts +2 -2
- package/dist/components/Banner/Banner.d.ts.map +1 -1
- package/dist/components/Banner/Banner.js.map +1 -1
- package/dist/components/Button/Button.d.ts +2 -2
- package/dist/components/Button/Button.d.ts.map +1 -1
- package/dist/components/Button/Button.js.map +1 -1
- package/dist/components/Calendar/Calendar.d.ts.map +1 -1
- package/dist/components/Calendar/Calendar.js +9 -7
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/CalendarRange/CalendarRange.d.ts +9 -2
- package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
- package/dist/components/CalendarRange/CalendarRange.js +48 -35
- package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
- package/dist/components/CalendarRange/types.d.ts +2 -0
- package/dist/components/CalendarRange/types.d.ts.map +1 -0
- package/dist/components/CalendarRange/types.js +3 -0
- package/dist/components/CalendarRange/types.js.map +1 -0
- package/dist/components/CalendarRange/utils.d.ts +29 -0
- package/dist/components/CalendarRange/utils.d.ts.map +1 -0
- package/dist/components/CalendarRange/utils.js +123 -0
- package/dist/components/CalendarRange/utils.js.map +1 -0
- package/dist/components/Checkbox/Checkbox.d.ts +2 -2
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/ChipsInput/useChipsInput.d.ts.map +1 -1
- package/dist/components/ChipsInput/useChipsInput.js +21 -2
- package/dist/components/ChipsInput/useChipsInput.js.map +1 -1
- package/dist/components/ChipsInputBase/types.d.ts +5 -1
- package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/types.js.map +1 -1
- package/dist/components/Clickable/Clickable.d.ts +4 -0
- package/dist/components/Clickable/Clickable.d.ts.map +1 -1
- package/dist/components/Clickable/Clickable.js +9 -5
- package/dist/components/Clickable/Clickable.js.map +1 -1
- package/dist/components/Clickable/RealClickable.d.ts +1 -1
- package/dist/components/Clickable/RealClickable.d.ts.map +1 -1
- package/dist/components/Clickable/RealClickable.js +3 -2
- package/dist/components/Clickable/RealClickable.js.map +1 -1
- package/dist/components/ContentCard/ContentCard.d.ts +2 -2
- package/dist/components/ContentCard/ContentCard.d.ts.map +1 -1
- package/dist/components/ContentCard/ContentCard.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts +4 -1
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/DateInput/DateInput.d.ts +1 -1
- package/dist/components/DateInput/DateInput.d.ts.map +1 -1
- package/dist/components/DateInput/DateInput.js +48 -50
- package/dist/components/DateInput/DateInput.js.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.d.ts +22 -2
- package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.js +159 -66
- package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/components/FocusTrap/FocusTrap.d.ts +1 -1
- package/dist/components/FocusTrap/FocusTrap.d.ts.map +1 -1
- package/dist/components/FocusTrap/FocusTrap.js +6 -3
- package/dist/components/FocusTrap/FocusTrap.js.map +1 -1
- package/dist/components/HorizontalCell/HorizontalCell.d.ts +2 -2
- package/dist/components/HorizontalCell/HorizontalCell.d.ts.map +1 -1
- package/dist/components/HorizontalCell/HorizontalCell.js.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.d.ts +2 -2
- package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.d.ts.map +1 -1
- package/dist/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.js.map +1 -1
- package/dist/components/IconButton/IconButton.d.ts +2 -2
- package/dist/components/IconButton/IconButton.d.ts.map +1 -1
- package/dist/components/IconButton/IconButton.js.map +1 -1
- package/dist/components/InputLike/InputLike.d.ts +1 -1
- package/dist/components/InputLike/InputLike.d.ts.map +1 -1
- package/dist/components/InputLike/InputLike.js +7 -6
- package/dist/components/InputLike/InputLike.js.map +1 -1
- package/dist/components/Link/Link.d.ts +2 -2
- package/dist/components/Link/Link.d.ts.map +1 -1
- package/dist/components/Link/Link.js +2 -1
- package/dist/components/Link/Link.js.map +1 -1
- package/dist/components/MiniInfoCell/MiniInfoCell.d.ts.map +1 -1
- package/dist/components/MiniInfoCell/MiniInfoCell.js +1 -8
- package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/components/ModalOutsideButton/ModalOutsideButton.d.ts +2 -2
- package/dist/components/ModalOutsideButton/ModalOutsideButton.d.ts.map +1 -1
- package/dist/components/ModalOutsideButton/ModalOutsideButton.js.map +1 -1
- package/dist/components/NumberInputLike/NumberInputLike.d.ts +8 -0
- package/dist/components/NumberInputLike/NumberInputLike.d.ts.map +1 -0
- package/dist/components/NumberInputLike/NumberInputLike.js +45 -0
- package/dist/components/NumberInputLike/NumberInputLike.js.map +1 -0
- package/dist/components/Pagination/PaginationPage/PaginationPageButton.d.ts +2 -2
- package/dist/components/Pagination/PaginationPage/PaginationPageButton.d.ts.map +1 -1
- package/dist/components/Pagination/PaginationPage/PaginationPageButton.js.map +1 -1
- package/dist/components/PanelHeader/PanelHeader.d.ts +3 -1
- package/dist/components/PanelHeader/PanelHeader.d.ts.map +1 -1
- package/dist/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/components/PanelHeaderButton/PanelHeaderButton.d.ts +2 -2
- package/dist/components/PanelHeaderButton/PanelHeaderButton.d.ts.map +1 -1
- package/dist/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
- package/dist/components/Radio/Radio.d.ts +2 -2
- package/dist/components/Radio/Radio.d.ts.map +1 -1
- package/dist/components/Radio/Radio.js.map +1 -1
- package/dist/components/Removable/Removable.d.ts +1 -4
- package/dist/components/Removable/Removable.d.ts.map +1 -1
- package/dist/components/Removable/Removable.js +39 -116
- package/dist/components/Removable/Removable.js.map +1 -1
- package/dist/components/Removable/RemovableIos.d.ts +10 -0
- package/dist/components/Removable/RemovableIos.d.ts.map +1 -0
- package/dist/components/Removable/RemovableIos.js +124 -0
- package/dist/components/Removable/RemovableIos.js.map +1 -0
- package/dist/components/RichCell/RichCell.d.ts +2 -2
- package/dist/components/RichCell/RichCell.d.ts.map +1 -1
- package/dist/components/RichCell/RichCell.js.map +1 -1
- package/dist/components/ScreenSpinner/ScreenSpinner.d.ts.map +1 -1
- package/dist/components/ScreenSpinner/ScreenSpinner.js +4 -2
- package/dist/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/components/ScreenSpinner/ScreenSpinnerContainer.d.ts +2 -2
- package/dist/components/ScreenSpinner/ScreenSpinnerContainer.d.ts.map +1 -1
- package/dist/components/ScreenSpinner/ScreenSpinnerContainer.js +4 -3
- package/dist/components/ScreenSpinner/ScreenSpinnerContainer.js.map +1 -1
- package/dist/components/SelectionControl/SelectionControl.d.ts +2 -2
- package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
- package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.d.ts +2 -2
- package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.d.ts +5 -1
- package/dist/components/Skeleton/Skeleton.d.ts.map +1 -1
- package/dist/components/Skeleton/Skeleton.js +7 -4
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Spinner/Spinner.d.ts +5 -1
- package/dist/components/Spinner/Spinner.d.ts.map +1 -1
- package/dist/components/Spinner/Spinner.js +6 -3
- package/dist/components/Spinner/Spinner.js.map +1 -1
- package/dist/components/SubnavigationButton/SubnavigationButton.d.ts +2 -2
- package/dist/components/SubnavigationButton/SubnavigationButton.d.ts.map +1 -1
- package/dist/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts +13 -9
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +14 -10
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/TabsController.d.ts +7 -0
- package/dist/components/Tabs/TabsController.d.ts.map +1 -0
- package/dist/components/Tabs/TabsController.js +19 -0
- package/dist/components/Tabs/TabsController.js.map +1 -0
- package/dist/components/Tabs/TabsModeContext.d.ts +13 -0
- package/dist/components/Tabs/TabsModeContext.d.ts.map +1 -0
- package/dist/components/Tabs/TabsModeContext.js +11 -0
- package/dist/components/Tabs/TabsModeContext.js.map +1 -0
- package/dist/components/TabsItem/TabsItem.d.ts +3 -3
- package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
- package/dist/components/TabsItem/TabsItem.js +21 -6
- package/dist/components/TabsItem/TabsItem.js.map +1 -1
- package/dist/components/Tappable/Tappable.d.ts +1 -0
- package/dist/components/Tappable/Tappable.d.ts.map +1 -1
- package/dist/components/Tappable/Tappable.js.map +1 -1
- package/dist/components/ToolButton/ToolButton.d.ts +2 -2
- package/dist/components/ToolButton/ToolButton.d.ts.map +1 -1
- package/dist/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/components/View/ViewInfinite.js.map +1 -1
- package/dist/components.css +1 -1
- package/dist/components.css.map +1 -1
- package/dist/cssm/components/ActionSheet/ActionSheet.js.map +1 -1
- package/dist/cssm/components/AppRoot/ScrollContext.js +2 -2
- package/dist/cssm/components/AppRoot/ScrollContext.js.map +1 -1
- package/dist/cssm/components/Banner/Banner.js.map +1 -1
- package/dist/cssm/components/Button/Button.js.map +1 -1
- package/dist/cssm/components/Calendar/Calendar.js +9 -7
- package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
- package/dist/cssm/components/CalendarRange/CalendarRange.js +44 -31
- package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
- package/dist/cssm/components/CalendarRange/types.js +3 -0
- package/dist/cssm/components/CalendarRange/types.js.map +1 -0
- package/dist/cssm/components/CalendarRange/utils.js +122 -0
- package/dist/cssm/components/CalendarRange/utils.js.map +1 -0
- package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/cssm/components/ChipsInput/useChipsInput.js +21 -2
- package/dist/cssm/components/ChipsInput/useChipsInput.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
- package/dist/cssm/components/Clickable/Clickable.js +4 -3
- package/dist/cssm/components/Clickable/Clickable.js.map +1 -1
- package/dist/cssm/components/Clickable/RealClickable.js +1 -1
- package/dist/cssm/components/Clickable/RealClickable.js.map +1 -1
- package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/DateInput/DateInput.js +45 -46
- package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js +148 -58
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/cssm/components/FocusTrap/FocusTrap.js +4 -2
- package/dist/cssm/components/FocusTrap/FocusTrap.js.map +1 -1
- package/dist/cssm/components/HorizontalCell/HorizontalCell.js.map +1 -1
- package/dist/cssm/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.js.map +1 -1
- package/dist/cssm/components/IconButton/IconButton.js.map +1 -1
- package/dist/cssm/components/InputLike/InputLike.js +3 -3
- package/dist/cssm/components/InputLike/InputLike.js.map +1 -1
- package/dist/cssm/components/Link/Link.js +1 -0
- package/dist/cssm/components/Link/Link.js.map +1 -1
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js +1 -8
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/cssm/components/ModalOutsideButton/ModalOutsideButton.js.map +1 -1
- package/dist/cssm/components/NumberInputLike/NumberInputLike.js +33 -0
- package/dist/cssm/components/NumberInputLike/NumberInputLike.js.map +1 -0
- package/dist/cssm/components/Pagination/PaginationPage/PaginationPageButton.js.map +1 -1
- package/dist/cssm/components/PanelHeader/PanelHeader.js.map +1 -1
- package/dist/cssm/components/PanelHeaderButton/PanelHeaderButton.js.map +1 -1
- package/dist/cssm/components/Radio/Radio.js.map +1 -1
- package/dist/cssm/components/Removable/Removable.js +39 -115
- package/dist/cssm/components/Removable/Removable.js.map +1 -1
- package/dist/cssm/components/Removable/Removable.module.css +9 -0
- package/dist/cssm/components/Removable/RemovableIos.js +118 -0
- package/dist/cssm/components/Removable/RemovableIos.js.map +1 -0
- package/dist/cssm/components/RichCell/RichCell.js.map +1 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js +2 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinner.js.map +1 -1
- package/dist/cssm/components/ScreenSpinner/ScreenSpinnerContainer.js +3 -2
- package/dist/cssm/components/ScreenSpinner/ScreenSpinnerContainer.js.map +1 -1
- package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
- package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/cssm/components/Skeleton/Skeleton.js +6 -3
- package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/cssm/components/Spinner/Spinner.js +5 -2
- package/dist/cssm/components/Spinner/Spinner.js.map +1 -1
- package/dist/cssm/components/SubnavigationButton/SubnavigationButton.js.map +1 -1
- package/dist/cssm/components/Tabs/Tabs.js +10 -9
- package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
- package/dist/cssm/components/Tabs/TabsController.js +19 -0
- package/dist/cssm/components/Tabs/TabsController.js.map +1 -0
- package/dist/cssm/components/Tabs/TabsModeContext.js +11 -0
- package/dist/cssm/components/Tabs/TabsModeContext.js.map +1 -0
- package/dist/cssm/components/TabsItem/TabsItem.js +17 -4
- package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
- package/dist/cssm/components/Tappable/Tappable.js.map +1 -1
- package/dist/cssm/components/ToolButton/ToolButton.js.map +1 -1
- package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
- package/dist/cssm/hooks/useCalendar.js +0 -10
- package/dist/cssm/hooks/useCalendar.js.map +1 -1
- package/dist/cssm/hooks/useDateInput.js +28 -17
- package/dist/cssm/hooks/useDateInput.js.map +1 -1
- package/dist/cssm/hooks/useEventListener.js.map +1 -1
- package/dist/cssm/hooks/useExternRef.js.map +1 -1
- package/dist/cssm/hooks/useFocusTrap.js +2 -2
- package/dist/cssm/hooks/useFocusTrap.js.map +1 -1
- package/dist/cssm/hooks/useMutationObserver.js +6 -5
- package/dist/cssm/hooks/useMutationObserver.js.map +1 -1
- package/dist/cssm/lib/dom.js +7 -1
- package/dist/cssm/lib/dom.js.map +1 -1
- package/dist/cssm/lib/floating/customResizeObserver.js.map +1 -1
- package/dist/cssm/lib/floating/index.js.map +1 -1
- package/dist/cssm/lib/floating/types/common.js.map +1 -1
- package/dist/cssm/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/cssm/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
- package/dist/cssm/styles/animationVisibilityDelay.js +10 -0
- package/dist/cssm/styles/animationVisibilityDelay.js.map +1 -0
- package/dist/cssm/styles/animationVisibilityDelay.module.css +13 -0
- package/dist/cssm/styles/themes.css +4 -2
- package/dist/hooks/useCalendar.d.ts +0 -3
- package/dist/hooks/useCalendar.d.ts.map +1 -1
- package/dist/hooks/useCalendar.js +0 -10
- package/dist/hooks/useCalendar.js.map +1 -1
- package/dist/hooks/useDateInput.d.ts.map +1 -1
- package/dist/hooks/useDateInput.js +29 -18
- package/dist/hooks/useDateInput.js.map +1 -1
- package/dist/hooks/useEventListener.js.map +1 -1
- package/dist/hooks/useExternRef.js.map +1 -1
- package/dist/hooks/useFocusTrap.d.ts +5 -1
- package/dist/hooks/useFocusTrap.d.ts.map +1 -1
- package/dist/hooks/useFocusTrap.js +2 -2
- package/dist/hooks/useFocusTrap.js.map +1 -1
- package/dist/hooks/useMutationObserver.d.ts +2 -1
- package/dist/hooks/useMutationObserver.d.ts.map +1 -1
- package/dist/hooks/useMutationObserver.js +6 -5
- package/dist/hooks/useMutationObserver.js.map +1 -1
- package/dist/lib/dom.d.ts.map +1 -1
- package/dist/lib/dom.js +7 -1
- package/dist/lib/dom.js.map +1 -1
- package/dist/lib/floating/customResizeObserver.js.map +1 -1
- package/dist/lib/floating/index.d.ts +1 -1
- package/dist/lib/floating/index.d.ts.map +1 -1
- package/dist/lib/floating/index.js.map +1 -1
- package/dist/lib/floating/types/common.d.ts +1 -1
- package/dist/lib/floating/types/common.d.ts.map +1 -1
- package/dist/lib/floating/types/common.js.map +1 -1
- package/dist/lib/sheet/controllers/BottomSheetController.js.map +1 -1
- package/dist/lib/sheet/controllers/CSSTransitionController.js.map +1 -1
- package/dist/styles/animationVisibilityDelay.d.ts +3 -0
- package/dist/styles/animationVisibilityDelay.d.ts.map +1 -0
- package/dist/styles/animationVisibilityDelay.js +10 -0
- package/dist/styles/animationVisibilityDelay.js.map +1 -0
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +3 -6
- package/src/components/ActionSheet/ActionSheet.tsx +4 -1
- package/src/components/AppRoot/AppRoot.mdx +1 -1
- package/src/components/AppRoot/ScrollContext.tsx +2 -2
- package/src/components/Banner/Banner.tsx +2 -2
- package/src/components/Button/Button.tsx +2 -2
- package/src/components/Calendar/Calendar.tsx +8 -7
- package/src/components/CalendarRange/CalendarRange.tsx +65 -42
- package/src/components/CalendarRange/types.ts +1 -0
- package/src/components/CalendarRange/utils.ts +190 -0
- package/src/components/Checkbox/Checkbox.tsx +2 -2
- package/src/components/ChipsInput/useChipsInput.ts +23 -2
- package/src/components/ChipsInputBase/types.ts +5 -1
- package/src/components/Clickable/Clickable.tsx +12 -4
- package/src/components/Clickable/RealClickable.tsx +1 -0
- package/src/components/ContentCard/ContentCard.tsx +2 -2
- package/src/components/CustomSelect/CustomSelect.tsx +11 -7
- package/src/components/DateInput/DateInput.tsx +41 -43
- package/src/components/DateRangeInput/DateRangeInput.tsx +183 -65
- package/src/components/FocusTrap/FocusTrap.tsx +3 -0
- package/src/components/FormItem/FormItemTop/FormItemTop.mdx +1 -1
- package/src/components/HorizontalCell/HorizontalCell.tsx +2 -2
- package/src/components/HorizontalScroll/HorizontalCellShowMore/HorizontalCellShowMore.tsx +2 -2
- package/src/components/IconButton/IconButton.tsx +2 -2
- package/src/components/InputLike/InputLike.tsx +4 -3
- package/src/components/Link/Link.tsx +3 -2
- package/src/components/MiniInfoCell/MiniInfoCell.tsx +2 -7
- package/src/components/ModalOutsideButton/ModalOutsideButton.tsx +2 -2
- package/src/components/NumberInputLike/NumberInputLike.tsx +56 -0
- package/src/components/Pagination/PaginationPage/PaginationPageButton.tsx +2 -2
- package/src/components/PanelHeader/PanelHeader.tsx +3 -1
- package/src/components/PanelHeaderButton/PanelHeaderButton.tsx +2 -2
- package/src/components/Radio/Radio.tsx +2 -2
- package/src/components/Removable/Removable.module.css +9 -0
- package/src/components/Removable/Removable.module.css.d.ts.map +1 -1
- package/src/components/Removable/Removable.tsx +50 -120
- package/src/components/Removable/RemovableIos.tsx +135 -0
- package/src/components/RichCell/RichCell.tsx +2 -2
- package/src/components/ScreenSpinner/ScreenSpinner.tsx +8 -1
- package/src/components/ScreenSpinner/ScreenSpinnerContainer.tsx +4 -1
- package/src/components/SelectionControl/SelectionControl.tsx +2 -2
- package/src/components/SimpleCell/SimpleCell.tsx +2 -2
- package/src/components/Skeleton/Skeleton.tsx +15 -2
- package/src/components/Spinner/Spinner.tsx +13 -1
- package/src/components/SubnavigationButton/SubnavigationButton.tsx +2 -2
- package/src/components/Tabs/Tabs.tsx +23 -19
- package/src/components/Tabs/TabsController.ts +37 -0
- package/src/components/Tabs/TabsModeContext.ts +24 -0
- package/src/components/TabsItem/TabsItem.tsx +22 -5
- package/src/components/Tappable/Tappable.tsx +5 -0
- package/src/components/ToolButton/ToolButton.tsx +2 -2
- package/src/components/UnstyledTextField/UnstyledTextField.mdx +1 -1
- package/src/hooks/useCalendar.ts +0 -12
- package/src/hooks/useDateInput.ts +21 -12
- package/src/hooks/useFocusTrap.ts +10 -1
- package/src/hooks/useMutationObserver.ts +7 -4
- package/src/lib/dom.tsx +7 -1
- package/src/lib/floating/index.ts +2 -0
- package/src/lib/floating/types/common.ts +2 -0
- package/src/styles/animationVisibilityDelay.module.css +13 -0
- package/src/styles/animationVisibilityDelay.module.css.d.ts.map +1 -0
- package/src/styles/animationVisibilityDelay.ts +13 -0
package/dist/cssm/lib/dom.js
CHANGED
|
@@ -57,7 +57,13 @@ export function getTransformedParentCoords(element) {
|
|
|
57
57
|
let parentNode = element.parentNode;
|
|
58
58
|
while(parentNode !== null){
|
|
59
59
|
if (isHTMLElement(parentNode)) {
|
|
60
|
-
|
|
60
|
+
let { transform, willChange } = getComputedStyle(parentNode);
|
|
61
|
+
if (transform === '') {
|
|
62
|
+
transform = 'unset';
|
|
63
|
+
}
|
|
64
|
+
if (willChange === '') {
|
|
65
|
+
willChange = 'unset';
|
|
66
|
+
}
|
|
61
67
|
if (!TRANSFORM_DEFAULT_VALUES.includes(transform) || !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)) {
|
|
62
68
|
const { x, y } = parentNode.getBoundingClientRect();
|
|
63
69
|
return {
|
package/dist/cssm/lib/dom.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/lib/dom.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { canUseDOM } from '@vkontakte/vkjs';\nimport { rectToClientRect } from '@vkontakte/vkui-floating-ui/core';\nimport {\n getParentNode,\n getWindow,\n isElement,\n isHTMLElement,\n isLastTraversableNode,\n isOverflowElement,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport {\n getWindow,\n getNodeScroll,\n isHTMLElement,\n isElement,\n getParentNode,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport { canUseDOM, canUseEventListeners, onDOMLoaded } from '@vkontakte/vkjs';\nexport interface DOMContextInterface {\n /**\n * @ignore\n */\n window?: Window;\n /**\n * @ignore\n */\n document?: Document;\n}\n\nexport type DOMProps = DOMContextInterface;\n\n/* eslint-disable no-restricted-globals */\nconst getDOM = (): DOMContextInterface => ({\n window: canUseDOM ? window : undefined,\n document: canUseDOM ? document : undefined,\n});\n/* eslint-enable no-restricted-globals */\n\nexport const DOMContext: React.Context<DOMContextInterface> =\n React.createContext<DOMContextInterface>(getDOM());\n\nexport const useDOM = (): DOMContextInterface => {\n return React.useContext(DOMContext);\n};\n\n/**\n * В случае, если используется DOMContext, при проверке 'node instanceOf Window' – Window может быть\n * другим объектом.\n */\nexport const isWindow = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is Window => {\n return node !== null && node !== undefined && 'navigator' in node;\n};\n\nexport const isBody = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLBodyElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'BODY';\n};\n\nexport const isDocumentElement = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLHtmlElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'HTML';\n};\n\nexport function withDOM<Props>(\n Component: React.ComponentType<Props & DOMProps>,\n): React.ComponentType<Props> {\n const WithDOM = (props: Props) => {\n const dom = useDOM();\n return <Component {...props} {...dom} />;\n };\n return WithDOM;\n}\n\nexport function blurActiveElement(document: Document | undefined): void {\n if (document && document.activeElement) {\n (document.activeElement as HTMLElement).blur();\n }\n}\n\nexport const TRANSFORM_DEFAULT_VALUES: string[] = ['none', 'initial', 'inherit', 'unset'];\nexport const WILL_CHANGE_DEFAULT_VALUES: string[] = ['auto', 'initial', 'inherit', 'unset'];\nexport function getTransformedParentCoords(element: Element): {\n x: number;\n y: number;\n} {\n let parentNode = element.parentNode;\n while (parentNode !== null) {\n if (isHTMLElement(parentNode)) {\n const { transform, willChange } = getComputedStyle(parentNode);\n if (\n !TRANSFORM_DEFAULT_VALUES.includes(transform) ||\n !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)\n ) {\n const { x, y } = parentNode.getBoundingClientRect();\n return { x, y };\n }\n }\n parentNode = parentNode.parentNode;\n }\n return { x: 0, y: 0 };\n}\n\nexport const getBoundingClientRect = (node: Element | Window, isFixedStrategy = false) => {\n const element = isWindow(node) ? node.document.documentElement : node;\n const clientRect = element.getBoundingClientRect();\n\n if (isDocumentElement(element)) {\n /**\n * Если на странице не используется `html, body { height: 100% }` (или `height: 100vh`), то\n * `height`, полученный из `document.documentElement.getBoundingClientRect()`, будет возвращать\n * `scrollHeight`, а не `clientHeight`. Поэтому перебиваем `height` на `clientHeight`.\n */\n clientRect.height = element.clientHeight;\n }\n\n let offsetX = 0;\n let offsetY = 0;\n if (isFixedStrategy) {\n const { x, y } = getTransformedParentCoords(element);\n offsetX = x;\n offsetY = y;\n }\n\n return rectToClientRect({\n x: clientRect.left - offsetX,\n y: clientRect.top - offsetY,\n width: clientRect.width,\n height: clientRect.height,\n }) as DOMRect;\n};\n\nexport const getRelativeBoundingClientRect = (parent: Element, child: Element) => {\n const parentRect = getBoundingClientRect(parent);\n const childRect = getBoundingClientRect(child);\n return rectToClientRect({\n x: childRect.left - parentRect.left,\n y: childRect.top - parentRect.top,\n width: childRect.width,\n height: childRect.height,\n }) as DOMRect;\n};\n\n/**\n * Переписанный `getNearestOverflowAncestor` из @floating-ui/utils/dom.\n *\n * [1] добавляем ноду, на которой нужно остановить рекурсию\n * [2] document.body подменяем на window, т.к. на document.body нельзя применить скролл.\n *\n * @link https://github.com/floating-ui/floating-ui/blob/%40floating-ui/dom%401.6.3/packages/utils/src/dom.ts#L143\n */\nexport function getNearestOverflowAncestor(node: Node): HTMLElement | Window | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode: Node): HTMLElement | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode?: any): any {\n const parentNode = getParentNode(node);\n\n if (terminalNode === parentNode) {\n return null; /* [1] */\n }\n\n if (isLastTraversableNode(parentNode)) {\n return getWindow(parentNode); /* [2] */\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode, terminalNode);\n}\n\nexport const getScrollHeight = (node: Element | Window): number => {\n return isWindow(node) ? node.document.documentElement.scrollHeight : node.scrollHeight;\n};\n\nexport const getScrollRect = (\n node: Element | Window,\n): {\n relative: DOMRect;\n edges: {\n y: [number, number];\n };\n} => {\n const window = isElement(node) ? getWindow(node) : node;\n const scrollElRect = getBoundingClientRect(node);\n\n const edgeTop = window.scrollY + scrollElRect.top;\n const edgeBottom = edgeTop + scrollElRect.height;\n const y: [number, number] = [edgeTop, edgeBottom];\n\n return {\n relative: scrollElRect,\n edges: { y },\n };\n};\n\nexport const getDocumentBody = (node?: any): HTMLElement => getWindow(node).document.body;\n\nexport const getActiveElementByAnotherElement = (el: Element | null): Element | null =>\n el ? el.ownerDocument.activeElement : null;\n\nexport const contains = (parent?: Element | null, child?: Element | null): boolean => {\n return parent && child ? parent.contains(child) : false;\n};\n\nexport const getFirstTouchEventData = (\n event: UIEvent | React.UIEvent<HTMLElement>,\n): {\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n} => {\n let dataRaw = (function resolveData() {\n switch (event.type) {\n case 'touchend':\n return (event as TouchEvent).changedTouches[0];\n case 'touchstart':\n case 'touchmove':\n case 'touchcancel':\n return (event as TouchEvent).touches[0];\n case 'mousedown':\n case 'mousemove':\n case 'mouseup':\n case 'mouseleave':\n return event as MouseEvent;\n default:\n return { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n })();\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test') {\n dataRaw = dataRaw\n ? dataRaw\n : { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n return {\n screenX: dataRaw.screenX || 0,\n screenY: dataRaw.screenY || 0,\n clientX: dataRaw.clientX || 0,\n clientY: dataRaw.clientY || 0,\n pageX: dataRaw.pageX || 0,\n pageY: dataRaw.pageY || 0,\n };\n};\n\n/**\n * ⚠️ В частности, необходимо для iOS 15. Начиная с этой версии в Safari добавили\n * pull-to-refresh. CSS св-во `overflow-behavior` появился только с iOS 16.\n *\n * Во вторую очередь, полезна блокированием скролла, чтобы пользователь дождался обновления\n * данных.\n */\nexport const initializeBrowserGesturePreventionEffect = (window: Window): VoidFunction => {\n const options: AddEventListenerOptions & EventListenerOptions = { passive: false };\n const handleWindowTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.document.documentElement.classList.add('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.addEventListener('touchmove', handleWindowTouchMove, options);\n\n return function dispose() {\n window.document.documentElement.classList.remove('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.removeEventListener('touchmove', handleWindowTouchMove, options);\n };\n};\n\nconst nonTextInputTypes = { button: true, submit: true, reset: true, color: true, file: true, image: true, checkbox: true, radio: true }; // prettier-ignore\n\nexport const isHTMLContentEditableElement = (\n el: Element | null,\n): el is HTMLInputElement | HTMLTextAreaElement | HTMLElement => {\n if (el === null) {\n return false;\n }\n\n if (el.tagName === 'INPUT') {\n // @ts-expect-error: TS2339 за счёт `tagName` удовлетворяемся, что это `HTMLInputElement`\n return !nonTextInputTypes[el.type]; // prettier-ignore\n }\n\n return (\n el.tagName === 'TEXTAREA' ||\n // eslint-disable-next-line no-restricted-properties\n el.closest('[contenteditable=true]') !== null\n );\n};\n\nexport type VisualViewport = {\n offsetTop: number;\n offsetLeft: number;\n width: number;\n height: number;\n};\n\n/**\n * Фоллбек `visualViewport` для **Safari 12**.\n */\nexport function getVisualViewport(win: Window): VisualViewport {\n const result: VisualViewport = { offsetTop: 0, offsetLeft: 0, width: 0, height: 0 };\n if (win.visualViewport) {\n const { offsetTop, offsetLeft, width, height } = win.visualViewport;\n result.offsetTop = Math.round(offsetTop);\n result.offsetLeft = offsetLeft;\n result.width = width;\n result.height = Math.round(height);\n\n return result;\n }\n\n // TODO[Safari@>=13] Удалить фоллбек\n result.offsetTop = win.pageYOffset;\n result.offsetLeft = win.pageXOffset;\n result.width = win.innerWidth; // note: вызывает reflow в отличии от visualViewport\n result.height = win.innerHeight; // note: вызывает reflow в отличии от visualViewport\n return result;\n}\n\nexport const hasSelectionWithRangeType = (node: unknown) => {\n const selection = getWindow(node).getSelection();\n return selection ? selection.type === 'Range' : false;\n};\n\nexport function isSVGElement(value: unknown): value is SVGElement {\n if (!canUseDOM) {\n return false;\n }\n\n return value instanceof SVGElement || value instanceof getWindow(value).SVGElement;\n}\n"],"names":["React","canUseDOM","rectToClientRect","getParentNode","getWindow","isElement","isHTMLElement","isLastTraversableNode","isOverflowElement","getNodeScroll","canUseEventListeners","onDOMLoaded","getDOM","window","undefined","document","DOMContext","createContext","useDOM","useContext","isWindow","node","isBody","tagName","isDocumentElement","withDOM","Component","WithDOM","props","dom","blurActiveElement","activeElement","blur","TRANSFORM_DEFAULT_VALUES","WILL_CHANGE_DEFAULT_VALUES","getTransformedParentCoords","element","parentNode","transform","willChange","getComputedStyle","includes","x","y","getBoundingClientRect","isFixedStrategy","documentElement","clientRect","height","clientHeight","offsetX","offsetY","left","top","width","getRelativeBoundingClientRect","parent","child","parentRect","childRect","getNearestOverflowAncestor","terminalNode","getScrollHeight","scrollHeight","getScrollRect","scrollElRect","edgeTop","scrollY","edgeBottom","relative","edges","getDocumentBody","body","getActiveElementByAnotherElement","el","ownerDocument","contains","getFirstTouchEventData","event","dataRaw","resolveData","type","changedTouches","touches","screenX","screenY","clientX","clientY","pageX","pageY","process","env","NODE_ENV","initializeBrowserGesturePreventionEffect","options","passive","handleWindowTouchMove","preventDefault","stopPropagation","classList","add","addEventListener","dispose","remove","removeEventListener","nonTextInputTypes","button","submit","reset","color","file","image","checkbox","radio","isHTMLContentEditableElement","closest","getVisualViewport","win","result","offsetTop","offsetLeft","visualViewport","Math","round","pageYOffset","pageXOffset","innerWidth","innerHeight","hasSelectionWithRangeType","selection","getSelection","isSVGElement","value","SVGElement"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/lib/dom.tsx"],"sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { canUseDOM } from '@vkontakte/vkjs';\nimport { rectToClientRect } from '@vkontakte/vkui-floating-ui/core';\nimport {\n getParentNode,\n getWindow,\n isElement,\n isHTMLElement,\n isLastTraversableNode,\n isOverflowElement,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport {\n getWindow,\n getNodeScroll,\n isHTMLElement,\n isElement,\n getParentNode,\n} from '@vkontakte/vkui-floating-ui/utils/dom';\n\nexport { canUseDOM, canUseEventListeners, onDOMLoaded } from '@vkontakte/vkjs';\nexport interface DOMContextInterface {\n /**\n * @ignore\n */\n window?: Window;\n /**\n * @ignore\n */\n document?: Document;\n}\n\nexport type DOMProps = DOMContextInterface;\n\n/* eslint-disable no-restricted-globals */\nconst getDOM = (): DOMContextInterface => ({\n window: canUseDOM ? window : undefined,\n document: canUseDOM ? document : undefined,\n});\n/* eslint-enable no-restricted-globals */\n\nexport const DOMContext: React.Context<DOMContextInterface> =\n React.createContext<DOMContextInterface>(getDOM());\n\nexport const useDOM = (): DOMContextInterface => {\n return React.useContext(DOMContext);\n};\n\n/**\n * В случае, если используется DOMContext, при проверке 'node instanceOf Window' – Window может быть\n * другим объектом.\n */\nexport const isWindow = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is Window => {\n return node !== null && node !== undefined && 'navigator' in node;\n};\n\nexport const isBody = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLBodyElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'BODY';\n};\n\nexport const isDocumentElement = (\n node: Element | Window | VisualViewport | undefined | null,\n): node is HTMLHtmlElement => {\n return node !== null && node !== undefined && 'tagName' in node && node.tagName === 'HTML';\n};\n\nexport function withDOM<Props>(\n Component: React.ComponentType<Props & DOMProps>,\n): React.ComponentType<Props> {\n const WithDOM = (props: Props) => {\n const dom = useDOM();\n return <Component {...props} {...dom} />;\n };\n return WithDOM;\n}\n\nexport function blurActiveElement(document: Document | undefined): void {\n if (document && document.activeElement) {\n (document.activeElement as HTMLElement).blur();\n }\n}\n\nexport const TRANSFORM_DEFAULT_VALUES: string[] = ['none', 'initial', 'inherit', 'unset'];\nexport const WILL_CHANGE_DEFAULT_VALUES: string[] = ['auto', 'initial', 'inherit', 'unset'];\nexport function getTransformedParentCoords(element: Element): {\n x: number;\n y: number;\n} {\n let parentNode = element.parentNode;\n while (parentNode !== null) {\n if (isHTMLElement(parentNode)) {\n let { transform, willChange } = getComputedStyle(parentNode);\n if (transform === '') {\n transform = 'unset';\n }\n if (willChange === '') {\n willChange = 'unset';\n }\n if (\n !TRANSFORM_DEFAULT_VALUES.includes(transform) ||\n !WILL_CHANGE_DEFAULT_VALUES.includes(willChange)\n ) {\n const { x, y } = parentNode.getBoundingClientRect();\n return { x, y };\n }\n }\n parentNode = parentNode.parentNode;\n }\n return { x: 0, y: 0 };\n}\n\nexport const getBoundingClientRect = (node: Element | Window, isFixedStrategy = false) => {\n const element = isWindow(node) ? node.document.documentElement : node;\n const clientRect = element.getBoundingClientRect();\n\n if (isDocumentElement(element)) {\n /**\n * Если на странице не используется `html, body { height: 100% }` (или `height: 100vh`), то\n * `height`, полученный из `document.documentElement.getBoundingClientRect()`, будет возвращать\n * `scrollHeight`, а не `clientHeight`. Поэтому перебиваем `height` на `clientHeight`.\n */\n clientRect.height = element.clientHeight;\n }\n\n let offsetX = 0;\n let offsetY = 0;\n if (isFixedStrategy) {\n const { x, y } = getTransformedParentCoords(element);\n offsetX = x;\n offsetY = y;\n }\n\n return rectToClientRect({\n x: clientRect.left - offsetX,\n y: clientRect.top - offsetY,\n width: clientRect.width,\n height: clientRect.height,\n }) as DOMRect;\n};\n\nexport const getRelativeBoundingClientRect = (parent: Element, child: Element) => {\n const parentRect = getBoundingClientRect(parent);\n const childRect = getBoundingClientRect(child);\n return rectToClientRect({\n x: childRect.left - parentRect.left,\n y: childRect.top - parentRect.top,\n width: childRect.width,\n height: childRect.height,\n }) as DOMRect;\n};\n\n/**\n * Переписанный `getNearestOverflowAncestor` из @floating-ui/utils/dom.\n *\n * [1] добавляем ноду, на которой нужно остановить рекурсию\n * [2] document.body подменяем на window, т.к. на document.body нельзя применить скролл.\n *\n * @link https://github.com/floating-ui/floating-ui/blob/%40floating-ui/dom%401.6.3/packages/utils/src/dom.ts#L143\n */\nexport function getNearestOverflowAncestor(node: Node): HTMLElement | Window | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode: Node): HTMLElement | null;\nexport function getNearestOverflowAncestor(node: Node, terminalNode?: any): any {\n const parentNode = getParentNode(node);\n\n if (terminalNode === parentNode) {\n return null; /* [1] */\n }\n\n if (isLastTraversableNode(parentNode)) {\n return getWindow(parentNode); /* [2] */\n }\n\n if (isHTMLElement(parentNode) && isOverflowElement(parentNode)) {\n return parentNode;\n }\n\n return getNearestOverflowAncestor(parentNode, terminalNode);\n}\n\nexport const getScrollHeight = (node: Element | Window): number => {\n return isWindow(node) ? node.document.documentElement.scrollHeight : node.scrollHeight;\n};\n\nexport const getScrollRect = (\n node: Element | Window,\n): {\n relative: DOMRect;\n edges: {\n y: [number, number];\n };\n} => {\n const window = isElement(node) ? getWindow(node) : node;\n const scrollElRect = getBoundingClientRect(node);\n\n const edgeTop = window.scrollY + scrollElRect.top;\n const edgeBottom = edgeTop + scrollElRect.height;\n const y: [number, number] = [edgeTop, edgeBottom];\n\n return {\n relative: scrollElRect,\n edges: { y },\n };\n};\n\nexport const getDocumentBody = (node?: any): HTMLElement => getWindow(node).document.body;\n\nexport const getActiveElementByAnotherElement = (el: Element | null): Element | null =>\n el ? el.ownerDocument.activeElement : null;\n\nexport const contains = (parent?: Element | null, child?: Element | null): boolean => {\n return parent && child ? parent.contains(child) : false;\n};\n\nexport const getFirstTouchEventData = (\n event: UIEvent | React.UIEvent<HTMLElement>,\n): {\n screenX: number;\n screenY: number;\n clientX: number;\n clientY: number;\n pageX: number;\n pageY: number;\n} => {\n let dataRaw = (function resolveData() {\n switch (event.type) {\n case 'touchend':\n return (event as TouchEvent).changedTouches[0];\n case 'touchstart':\n case 'touchmove':\n case 'touchcancel':\n return (event as TouchEvent).touches[0];\n case 'mousedown':\n case 'mousemove':\n case 'mouseup':\n case 'mouseleave':\n return event as MouseEvent;\n default:\n return { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n })();\n /* istanbul ignore if */\n if (process.env.NODE_ENV === 'test') {\n dataRaw = dataRaw\n ? dataRaw\n : { screenX: 0, screenY: 0, clientX: 0, clientY: 0, pageX: 0, pageY: 0 };\n }\n return {\n screenX: dataRaw.screenX || 0,\n screenY: dataRaw.screenY || 0,\n clientX: dataRaw.clientX || 0,\n clientY: dataRaw.clientY || 0,\n pageX: dataRaw.pageX || 0,\n pageY: dataRaw.pageY || 0,\n };\n};\n\n/**\n * ⚠️ В частности, необходимо для iOS 15. Начиная с этой версии в Safari добавили\n * pull-to-refresh. CSS св-во `overflow-behavior` появился только с iOS 16.\n *\n * Во вторую очередь, полезна блокированием скролла, чтобы пользователь дождался обновления\n * данных.\n */\nexport const initializeBrowserGesturePreventionEffect = (window: Window): VoidFunction => {\n const options: AddEventListenerOptions & EventListenerOptions = { passive: false };\n const handleWindowTouchMove = (event: TouchEvent) => {\n event.preventDefault();\n event.stopPropagation();\n };\n\n window.document.documentElement.classList.add('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.addEventListener('touchmove', handleWindowTouchMove, options);\n\n return function dispose() {\n window.document.documentElement.classList.remove('vkui--disable-overscroll-behavior'); // eslint-disable-line no-restricted-properties\n window.removeEventListener('touchmove', handleWindowTouchMove, options);\n };\n};\n\nconst nonTextInputTypes = { button: true, submit: true, reset: true, color: true, file: true, image: true, checkbox: true, radio: true }; // prettier-ignore\n\nexport const isHTMLContentEditableElement = (\n el: Element | null,\n): el is HTMLInputElement | HTMLTextAreaElement | HTMLElement => {\n if (el === null) {\n return false;\n }\n\n if (el.tagName === 'INPUT') {\n // @ts-expect-error: TS2339 за счёт `tagName` удовлетворяемся, что это `HTMLInputElement`\n return !nonTextInputTypes[el.type]; // prettier-ignore\n }\n\n return (\n el.tagName === 'TEXTAREA' ||\n // eslint-disable-next-line no-restricted-properties\n el.closest('[contenteditable=true]') !== null\n );\n};\n\nexport type VisualViewport = {\n offsetTop: number;\n offsetLeft: number;\n width: number;\n height: number;\n};\n\n/**\n * Фоллбек `visualViewport` для **Safari 12**.\n */\nexport function getVisualViewport(win: Window): VisualViewport {\n const result: VisualViewport = { offsetTop: 0, offsetLeft: 0, width: 0, height: 0 };\n if (win.visualViewport) {\n const { offsetTop, offsetLeft, width, height } = win.visualViewport;\n result.offsetTop = Math.round(offsetTop);\n result.offsetLeft = offsetLeft;\n result.width = width;\n result.height = Math.round(height);\n\n return result;\n }\n\n // TODO[Safari@>=13] Удалить фоллбек\n result.offsetTop = win.pageYOffset;\n result.offsetLeft = win.pageXOffset;\n result.width = win.innerWidth; // note: вызывает reflow в отличии от visualViewport\n result.height = win.innerHeight; // note: вызывает reflow в отличии от visualViewport\n return result;\n}\n\nexport const hasSelectionWithRangeType = (node: unknown) => {\n const selection = getWindow(node).getSelection();\n return selection ? selection.type === 'Range' : false;\n};\n\nexport function isSVGElement(value: unknown): value is SVGElement {\n if (!canUseDOM) {\n return false;\n }\n\n return value instanceof SVGElement || value instanceof getWindow(value).SVGElement;\n}\n"],"names":["React","canUseDOM","rectToClientRect","getParentNode","getWindow","isElement","isHTMLElement","isLastTraversableNode","isOverflowElement","getNodeScroll","canUseEventListeners","onDOMLoaded","getDOM","window","undefined","document","DOMContext","createContext","useDOM","useContext","isWindow","node","isBody","tagName","isDocumentElement","withDOM","Component","WithDOM","props","dom","blurActiveElement","activeElement","blur","TRANSFORM_DEFAULT_VALUES","WILL_CHANGE_DEFAULT_VALUES","getTransformedParentCoords","element","parentNode","transform","willChange","getComputedStyle","includes","x","y","getBoundingClientRect","isFixedStrategy","documentElement","clientRect","height","clientHeight","offsetX","offsetY","left","top","width","getRelativeBoundingClientRect","parent","child","parentRect","childRect","getNearestOverflowAncestor","terminalNode","getScrollHeight","scrollHeight","getScrollRect","scrollElRect","edgeTop","scrollY","edgeBottom","relative","edges","getDocumentBody","body","getActiveElementByAnotherElement","el","ownerDocument","contains","getFirstTouchEventData","event","dataRaw","resolveData","type","changedTouches","touches","screenX","screenY","clientX","clientY","pageX","pageY","process","env","NODE_ENV","initializeBrowserGesturePreventionEffect","options","passive","handleWindowTouchMove","preventDefault","stopPropagation","classList","add","addEventListener","dispose","remove","removeEventListener","nonTextInputTypes","button","submit","reset","color","file","image","checkbox","radio","isHTMLContentEditableElement","closest","getVisualViewport","win","result","offsetTop","offsetLeft","visualViewport","Math","round","pageYOffset","pageXOffset","innerWidth","innerHeight","hasSelectionWithRangeType","selection","getSelection","isSVGElement","value","SVGElement"],"mappings":"AAAA;;AAEA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,SAAS,QAAQ,kBAAkB;AAC5C,SAASC,gBAAgB,QAAQ,mCAAmC;AACpE,SACEC,aAAa,EACbC,SAAS,EACTC,SAAS,EACTC,aAAa,EACbC,qBAAqB,EACrBC,iBAAiB,QACZ,wCAAwC;AAE/C,SACEJ,SAAS,EACTK,aAAa,EACbH,aAAa,EACbD,SAAS,EACTF,aAAa,QACR,wCAAwC;AAE/C,SAASF,SAAS,EAAES,oBAAoB,EAAEC,WAAW,QAAQ,kBAAkB;AAc/E,wCAAwC,GACxC,MAAMC,SAAS,IAA4B,CAAA;QACzCC,QAAQZ,YAAYY,SAASC;QAC7BC,UAAUd,YAAYc,WAAWD;IACnC,CAAA;AACA,uCAAuC,GAEvC,OAAO,MAAME,2BACXhB,MAAMiB,aAAa,CAAsBL,UAAU;AAErD,OAAO,MAAMM,SAAS;IACpB,OAAOlB,MAAMmB,UAAU,CAACH;AAC1B,EAAE;AAEF;;;CAGC,GACD,OAAO,MAAMI,WAAW,CACtBC;IAEA,OAAOA,SAAS,QAAQA,SAASP,aAAa,eAAeO;AAC/D,EAAE;AAEF,OAAO,MAAMC,SAAS,CACpBD;IAEA,OAAOA,SAAS,QAAQA,SAASP,aAAa,aAAaO,QAAQA,KAAKE,OAAO,KAAK;AACtF,EAAE;AAEF,OAAO,MAAMC,oBAAoB,CAC/BH;IAEA,OAAOA,SAAS,QAAQA,SAASP,aAAa,aAAaO,QAAQA,KAAKE,OAAO,KAAK;AACtF,EAAE;AAEF,OAAO,SAASE,QACdC,SAAgD;IAEhD,MAAMC,UAAU,CAACC;QACf,MAAMC,MAAMX;QACZ,qBAAO,KAACQ;YAAW,GAAGE,KAAK;YAAG,GAAGC,GAAG;;IACtC;IACA,OAAOF;AACT;AAEA,OAAO,SAASG,kBAAkBf,SAA8B;IAC9D,IAAIA,aAAYA,UAASgB,aAAa,EAAE;QACrChB,UAASgB,aAAa,CAAiBC,IAAI;IAC9C;AACF;AAEA,OAAO,MAAMC,2BAAqC;IAAC;IAAQ;IAAW;IAAW;CAAQ,CAAC;AAC1F,OAAO,MAAMC,6BAAuC;IAAC;IAAQ;IAAW;IAAW;CAAQ,CAAC;AAC5F,OAAO,SAASC,2BAA2BC,OAAgB;IAIzD,IAAIC,aAAaD,QAAQC,UAAU;IACnC,MAAOA,eAAe,KAAM;QAC1B,IAAI/B,cAAc+B,aAAa;YAC7B,IAAI,EAAEC,SAAS,EAAEC,UAAU,EAAE,GAAGC,iBAAiBH;YACjD,IAAIC,cAAc,IAAI;gBACpBA,YAAY;YACd;YACA,IAAIC,eAAe,IAAI;gBACrBA,aAAa;YACf;YACA,IACE,CAACN,yBAAyBQ,QAAQ,CAACH,cACnC,CAACJ,2BAA2BO,QAAQ,CAACF,aACrC;gBACA,MAAM,EAAEG,CAAC,EAAEC,CAAC,EAAE,GAAGN,WAAWO,qBAAqB;gBACjD,OAAO;oBAAEF;oBAAGC;gBAAE;YAChB;QACF;QACAN,aAAaA,WAAWA,UAAU;IACpC;IACA,OAAO;QAAEK,GAAG;QAAGC,GAAG;IAAE;AACtB;AAEA,OAAO,MAAMC,wBAAwB,CAACvB,MAAwBwB,kBAAkB,KAAK;IACnF,MAAMT,UAAUhB,SAASC,QAAQA,KAAKN,QAAQ,CAAC+B,eAAe,GAAGzB;IACjE,MAAM0B,aAAaX,QAAQQ,qBAAqB;IAEhD,IAAIpB,kBAAkBY,UAAU;QAC9B;;;;KAIC,GACDW,WAAWC,MAAM,GAAGZ,QAAQa,YAAY;IAC1C;IAEA,IAAIC,UAAU;IACd,IAAIC,UAAU;IACd,IAAIN,iBAAiB;QACnB,MAAM,EAAEH,CAAC,EAAEC,CAAC,EAAE,GAAGR,2BAA2BC;QAC5Cc,UAAUR;QACVS,UAAUR;IACZ;IAEA,OAAOzC,iBAAiB;QACtBwC,GAAGK,WAAWK,IAAI,GAAGF;QACrBP,GAAGI,WAAWM,GAAG,GAAGF;QACpBG,OAAOP,WAAWO,KAAK;QACvBN,QAAQD,WAAWC,MAAM;IAC3B;AACF,EAAE;AAEF,OAAO,MAAMO,gCAAgC,CAACC,QAAiBC;IAC7D,MAAMC,aAAad,sBAAsBY;IACzC,MAAMG,YAAYf,sBAAsBa;IACxC,OAAOvD,iBAAiB;QACtBwC,GAAGiB,UAAUP,IAAI,GAAGM,WAAWN,IAAI;QACnCT,GAAGgB,UAAUN,GAAG,GAAGK,WAAWL,GAAG;QACjCC,OAAOK,UAAUL,KAAK;QACtBN,QAAQW,UAAUX,MAAM;IAC1B;AACF,EAAE;AAYF,OAAO,SAASY,2BAA2BvC,IAAU,EAAEwC,YAAkB;IACvE,MAAMxB,aAAalC,cAAckB;IAEjC,IAAIwC,iBAAiBxB,YAAY;QAC/B,OAAO,MAAM,OAAO;IACtB;IAEA,IAAI9B,sBAAsB8B,aAAa;QACrC,OAAOjC,UAAUiC,aAAa,OAAO;IACvC;IAEA,IAAI/B,cAAc+B,eAAe7B,kBAAkB6B,aAAa;QAC9D,OAAOA;IACT;IAEA,OAAOuB,2BAA2BvB,YAAYwB;AAChD;AAEA,OAAO,MAAMC,kBAAkB,CAACzC;IAC9B,OAAOD,SAASC,QAAQA,KAAKN,QAAQ,CAAC+B,eAAe,CAACiB,YAAY,GAAG1C,KAAK0C,YAAY;AACxF,EAAE;AAEF,OAAO,MAAMC,gBAAgB,CAC3B3C;IAOA,MAAMR,UAASR,UAAUgB,QAAQjB,UAAUiB,QAAQA;IACnD,MAAM4C,eAAerB,sBAAsBvB;IAE3C,MAAM6C,UAAUrD,QAAOsD,OAAO,GAAGF,aAAaZ,GAAG;IACjD,MAAMe,aAAaF,UAAUD,aAAajB,MAAM;IAChD,MAAML,IAAsB;QAACuB;QAASE;KAAW;IAEjD,OAAO;QACLC,UAAUJ;QACVK,OAAO;YAAE3B;QAAE;IACb;AACF,EAAE;AAEF,OAAO,MAAM4B,kBAAkB,CAAClD,OAA4BjB,UAAUiB,MAAMN,QAAQ,CAACyD,IAAI,CAAC;AAE1F,OAAO,MAAMC,mCAAmC,CAACC,KAC/CA,KAAKA,GAAGC,aAAa,CAAC5C,aAAa,GAAG,KAAK;AAE7C,OAAO,MAAM6C,WAAW,CAACpB,QAAyBC;IAChD,OAAOD,UAAUC,QAAQD,OAAOoB,QAAQ,CAACnB,SAAS;AACpD,EAAE;AAEF,OAAO,MAAMoB,yBAAyB,CACpCC;IASA,IAAIC,UAAU,AAAC,SAASC;QACtB,OAAQF,MAAMG,IAAI;YAChB,KAAK;gBACH,OAAO,AAACH,MAAqBI,cAAc,CAAC,EAAE;YAChD,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAO,AAACJ,MAAqBK,OAAO,CAAC,EAAE;YACzC,KAAK;YACL,KAAK;YACL,KAAK;YACL,KAAK;gBACH,OAAOL;YACT;gBACE,OAAO;oBAAEM,SAAS;oBAAGC,SAAS;oBAAGC,SAAS;oBAAGC,SAAS;oBAAGC,OAAO;oBAAGC,OAAO;gBAAE;QAChF;IACF;IACA,sBAAsB,GACtB,IAAIC,QAAQC,GAAG,CAACC,QAAQ,KAAK,QAAQ;QACnCb,UAAUA,UACNA,UACA;YAAEK,SAAS;YAAGC,SAAS;YAAGC,SAAS;YAAGC,SAAS;YAAGC,OAAO;YAAGC,OAAO;QAAE;IAC3E;IACA,OAAO;QACLL,SAASL,QAAQK,OAAO,IAAI;QAC5BC,SAASN,QAAQM,OAAO,IAAI;QAC5BC,SAASP,QAAQO,OAAO,IAAI;QAC5BC,SAASR,QAAQQ,OAAO,IAAI;QAC5BC,OAAOT,QAAQS,KAAK,IAAI;QACxBC,OAAOV,QAAQU,KAAK,IAAI;IAC1B;AACF,EAAE;AAEF;;;;;;CAMC,GACD,OAAO,MAAMI,2CAA2C,CAAChF;IACvD,MAAMiF,UAA0D;QAAEC,SAAS;IAAM;IACjF,MAAMC,wBAAwB,CAAClB;QAC7BA,MAAMmB,cAAc;QACpBnB,MAAMoB,eAAe;IACvB;IAEArF,QAAOE,QAAQ,CAAC+B,eAAe,CAACqD,SAAS,CAACC,GAAG,CAAC,sCAAsC,+CAA+C;IACnIvF,QAAOwF,gBAAgB,CAAC,aAAaL,uBAAuBF;IAE5D,OAAO,SAASQ;QACdzF,QAAOE,QAAQ,CAAC+B,eAAe,CAACqD,SAAS,CAACI,MAAM,CAAC,sCAAsC,+CAA+C;QACtI1F,QAAO2F,mBAAmB,CAAC,aAAaR,uBAAuBF;IACjE;AACF,EAAE;AAEF,MAAMW,oBAAoB;IAAEC,QAAQ;IAAMC,QAAQ;IAAMC,OAAO;IAAMC,OAAO;IAAMC,MAAM;IAAMC,OAAO;IAAMC,UAAU;IAAMC,OAAO;AAAK,GAAG,kBAAkB;AAE5J,OAAO,MAAMC,+BAA+B,CAC1CxC;IAEA,IAAIA,OAAO,MAAM;QACf,OAAO;IACT;IAEA,IAAIA,GAAGnD,OAAO,KAAK,SAAS;QAC1B,yFAAyF;QACzF,OAAO,CAACkF,iBAAiB,CAAC/B,GAAGO,IAAI,CAAC,EAAE,kBAAkB;IACxD;IAEA,OACEP,GAAGnD,OAAO,KAAK,cACf,oDAAoD;IACpDmD,GAAGyC,OAAO,CAAC,8BAA8B;AAE7C,EAAE;AASF;;CAEC,GACD,OAAO,SAASC,kBAAkBC,GAAW;IAC3C,MAAMC,SAAyB;QAAEC,WAAW;QAAGC,YAAY;QAAGlE,OAAO;QAAGN,QAAQ;IAAE;IAClF,IAAIqE,IAAII,cAAc,EAAE;QACtB,MAAM,EAAEF,SAAS,EAAEC,UAAU,EAAElE,KAAK,EAAEN,MAAM,EAAE,GAAGqE,IAAII,cAAc;QACnEH,OAAOC,SAAS,GAAGG,KAAKC,KAAK,CAACJ;QAC9BD,OAAOE,UAAU,GAAGA;QACpBF,OAAOhE,KAAK,GAAGA;QACfgE,OAAOtE,MAAM,GAAG0E,KAAKC,KAAK,CAAC3E;QAE3B,OAAOsE;IACT;IAEA,oCAAoC;IACpCA,OAAOC,SAAS,GAAGF,IAAIO,WAAW;IAClCN,OAAOE,UAAU,GAAGH,IAAIQ,WAAW;IACnCP,OAAOhE,KAAK,GAAG+D,IAAIS,UAAU,EAAE,oDAAoD;IACnFR,OAAOtE,MAAM,GAAGqE,IAAIU,WAAW,EAAE,oDAAoD;IACrF,OAAOT;AACT;AAEA,OAAO,MAAMU,4BAA4B,CAAC3G;IACxC,MAAM4G,YAAY7H,UAAUiB,MAAM6G,YAAY;IAC9C,OAAOD,YAAYA,UAAUhD,IAAI,KAAK,UAAU;AAClD,EAAE;AAEF,OAAO,SAASkD,aAAaC,KAAc;IACzC,IAAI,CAACnI,WAAW;QACd,OAAO;IACT;IAEA,OAAOmI,iBAAiBC,cAAcD,iBAAiBhI,UAAUgI,OAAOC,UAAU;AACpF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n | 'position'\n | 'left'\n | 'top'\n | 'zIndex'\n | 'width'\n | 'height'\n | 'pointerEvents'\n | 'opacity'\n | 'border'\n> = {\n position: 'absolute',\n left: '0',\n top: '0',\n zIndex: '-1',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n opacity: '0',\n border: '0',\n};\n\n/*\n * Специальный CustomResizeObserver как fallback для ResizeObserver\n * Используется для вызова update() функции (перерисовка плавающего окна) floating-ui\n * при изменении размера reference или floating элементов.\n *\n * По умолчанию пытаемся нарисовать скрытый, абсолютно позиционированный относительно\n * наблюдаемого элемента iframe.\n * В случае же, если наблюдаемый элемент имеет position: static, то правильно спозиционировать\n * iframe у нас не получится, поэтому в такой ситуации мы используем MutationObserver.\n *\n * Использовать только MutationObserver мы не можем, потому что с помощью него нельзя отследить\n * изменение размера вызванное переполнением текста.\n *\n * Применяется только если нету поддержики или полифила ResizeObserver.\n * */\nexport class CustomResizeObserver {\n records: Array<{\n target: HTMLElement;\n iframe: HTMLIFrameElement;\n }> = [];\n mutationObserverFallback: MutationObserver | null = null;\n private readonly updateFunction: () => void;\n\n constructor(updateFunction: () => void) {\n this.updateFunction = updateFunction;\n }\n\n observe(element: HTMLElement): void {\n if (isPositioned(element)) {\n return this.observeUsingIframe(element);\n }\n return this.observeUsingMutationObserver(element);\n }\n\n appendToTheDOM(): void {\n for (let record of this.records) {\n record.target.appendChild(record.iframe);\n }\n\n for (let record of this.records) {\n if (record.iframe.contentWindow) {\n record.iframe.contentWindow.addEventListener('resize', this.updateFunction);\n }\n }\n }\n\n observeUsingIframe(element: HTMLElement): void {\n const iframe = element.ownerDocument.createElement('iframe');\n iframe.ariaHidden = 'true';\n iframe.tabIndex = -1;\n Object.assign(iframe.style, defaultIframeStyles);\n\n this.records.push({ target: element, iframe });\n }\n\n observeUsingMutationObserver(element: HTMLElement): void {\n if (!this.mutationObserverFallback) {\n this.mutationObserverFallback = new MutationObserver(this.updateFunction);\n }\n\n this.mutationObserverFallback.observe(element, {\n childList: true,\n subtree: true,\n });\n }\n\n disconnect(): void {\n this.records.map(({ target, iframe }) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.removeEventListener('resize', this.updateFunction);\n }\n\n target.removeChild(iframe);\n });\n this.records = [];\n\n if (this.mutationObserverFallback) {\n this.mutationObserverFallback.disconnect();\n }\n this.mutationObserverFallback = null;\n }\n}\n\nfunction isPositioned(element: HTMLElement): boolean {\n return getComputedStyle(element).position !== 'static';\n}\n"],"names":["defaultIframeStyles","position","left","top","zIndex","width","height","pointerEvents","opacity","border","CustomResizeObserver","records","mutationObserverFallback","updateFunction","
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/floating/customResizeObserver.ts"],"sourcesContent":["const defaultIframeStyles: Pick<\n CSSStyleDeclaration,\n | 'position'\n | 'left'\n | 'top'\n | 'zIndex'\n | 'width'\n | 'height'\n | 'pointerEvents'\n | 'opacity'\n | 'border'\n> = {\n position: 'absolute',\n left: '0',\n top: '0',\n zIndex: '-1',\n width: '100%',\n height: '100%',\n pointerEvents: 'none',\n opacity: '0',\n border: '0',\n};\n\n/*\n * Специальный CustomResizeObserver как fallback для ResizeObserver\n * Используется для вызова update() функции (перерисовка плавающего окна) floating-ui\n * при изменении размера reference или floating элементов.\n *\n * По умолчанию пытаемся нарисовать скрытый, абсолютно позиционированный относительно\n * наблюдаемого элемента iframe.\n * В случае же, если наблюдаемый элемент имеет position: static, то правильно спозиционировать\n * iframe у нас не получится, поэтому в такой ситуации мы используем MutationObserver.\n *\n * Использовать только MutationObserver мы не можем, потому что с помощью него нельзя отследить\n * изменение размера вызванное переполнением текста.\n *\n * Применяется только если нету поддержики или полифила ResizeObserver.\n * */\nexport class CustomResizeObserver {\n records: Array<{\n target: HTMLElement;\n iframe: HTMLIFrameElement;\n }> = [];\n mutationObserverFallback: MutationObserver | null = null;\n private readonly updateFunction: () => void;\n\n constructor(updateFunction: () => void) {\n this.updateFunction = updateFunction;\n }\n\n observe(element: HTMLElement): void {\n if (isPositioned(element)) {\n return this.observeUsingIframe(element);\n }\n return this.observeUsingMutationObserver(element);\n }\n\n appendToTheDOM(): void {\n for (let record of this.records) {\n record.target.appendChild(record.iframe);\n }\n\n for (let record of this.records) {\n if (record.iframe.contentWindow) {\n record.iframe.contentWindow.addEventListener('resize', this.updateFunction);\n }\n }\n }\n\n observeUsingIframe(element: HTMLElement): void {\n const iframe = element.ownerDocument.createElement('iframe');\n iframe.ariaHidden = 'true';\n iframe.tabIndex = -1;\n Object.assign(iframe.style, defaultIframeStyles);\n\n this.records.push({ target: element, iframe });\n }\n\n observeUsingMutationObserver(element: HTMLElement): void {\n if (!this.mutationObserverFallback) {\n this.mutationObserverFallback = new MutationObserver(this.updateFunction);\n }\n\n this.mutationObserverFallback.observe(element, {\n childList: true,\n subtree: true,\n });\n }\n\n disconnect(): void {\n this.records.map(({ target, iframe }) => {\n if (iframe.contentWindow) {\n iframe.contentWindow.removeEventListener('resize', this.updateFunction);\n }\n\n target.removeChild(iframe);\n });\n this.records = [];\n\n if (this.mutationObserverFallback) {\n this.mutationObserverFallback.disconnect();\n }\n this.mutationObserverFallback = null;\n }\n}\n\nfunction isPositioned(element: HTMLElement): boolean {\n return getComputedStyle(element).position !== 'static';\n}\n"],"names":["defaultIframeStyles","position","left","top","zIndex","width","height","pointerEvents","opacity","border","CustomResizeObserver","records","mutationObserverFallback","updateFunction","observe","element","isPositioned","observeUsingIframe","observeUsingMutationObserver","appendToTheDOM","record","target","appendChild","iframe","contentWindow","addEventListener","ownerDocument","createElement","ariaHidden","tabIndex","Object","assign","style","push","MutationObserver","childList","subtree","disconnect","map","removeEventListener","removeChild","getComputedStyle"],"mappings":"AAAA,MAAMA,sBAWF;IACFC,UAAU;IACVC,MAAM;IACNC,KAAK;IACLC,QAAQ;IACRC,OAAO;IACPC,QAAQ;IACRC,eAAe;IACfC,SAAS;IACTC,QAAQ;AACV;AAEA;;;;;;;;;;;;;;GAcG,GACH,OAAO,MAAMC;IACXC,UAGK,EAAE,CAAC;IACRC,2BAAoD,KAAK;IACxCC,eAA2B;IAE5C,YAAYA,cAA0B,CAAE;QACtC,IAAI,CAACA,cAAc,GAAGA;IACxB;IAEAC,QAAQC,OAAoB,EAAQ;QAClC,IAAIC,aAAaD,UAAU;YACzB,OAAO,IAAI,CAACE,kBAAkB,CAACF;QACjC;QACA,OAAO,IAAI,CAACG,4BAA4B,CAACH;IAC3C;IAEAI,iBAAuB;QACrB,KAAK,IAAIC,UAAU,IAAI,CAACT,OAAO,CAAE;YAC/BS,OAAOC,MAAM,CAACC,WAAW,CAACF,OAAOG,MAAM;QACzC;QAEA,KAAK,IAAIH,UAAU,IAAI,CAACT,OAAO,CAAE;YAC/B,IAAIS,OAAOG,MAAM,CAACC,aAAa,EAAE;gBAC/BJ,OAAOG,MAAM,CAACC,aAAa,CAACC,gBAAgB,CAAC,UAAU,IAAI,CAACZ,cAAc;YAC5E;QACF;IACF;IAEAI,mBAAmBF,OAAoB,EAAQ;QAC7C,MAAMQ,SAASR,QAAQW,aAAa,CAACC,aAAa,CAAC;QACnDJ,OAAOK,UAAU,GAAG;QACpBL,OAAOM,QAAQ,GAAG,CAAC;QACnBC,OAAOC,MAAM,CAACR,OAAOS,KAAK,EAAEhC;QAE5B,IAAI,CAACW,OAAO,CAACsB,IAAI,CAAC;YAAEZ,QAAQN;YAASQ;QAAO;IAC9C;IAEAL,6BAA6BH,OAAoB,EAAQ;QACvD,IAAI,CAAC,IAAI,CAACH,wBAAwB,EAAE;YAClC,IAAI,CAACA,wBAAwB,GAAG,IAAIsB,iBAAiB,IAAI,CAACrB,cAAc;QAC1E;QAEA,IAAI,CAACD,wBAAwB,CAACE,OAAO,CAACC,SAAS;YAC7CoB,WAAW;YACXC,SAAS;QACX;IACF;IAEAC,aAAmB;QACjB,IAAI,CAAC1B,OAAO,CAAC2B,GAAG,CAAC,CAAC,EAAEjB,MAAM,EAAEE,MAAM,EAAE;YAClC,IAAIA,OAAOC,aAAa,EAAE;gBACxBD,OAAOC,aAAa,CAACe,mBAAmB,CAAC,UAAU,IAAI,CAAC1B,cAAc;YACxE;YAEAQ,OAAOmB,WAAW,CAACjB;QACrB;QACA,IAAI,CAACZ,OAAO,GAAG,EAAE;QAEjB,IAAI,IAAI,CAACC,wBAAwB,EAAE;YACjC,IAAI,CAACA,wBAAwB,CAACyB,UAAU;QAC1C;QACA,IAAI,CAACzB,wBAAwB,GAAG;IAClC;AACF;AAEA,SAASI,aAAaD,OAAoB;IACxC,OAAO0B,iBAAiB1B,SAASd,QAAQ,KAAK;AAChD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/lib/floating/index.ts"],"sourcesContent":["export type {\n UseFloatingOptions,\n Placement,\n VirtualElement,\n PlacementWithAuto,\n AutoPlacementType,\n UseFloatingMiddleware,\n OnPlacementChange,\n} from './types/common';\n\nexport type { FloatingComponentProps, FloatingContentRenderProp } from './types/component';\n\nexport {\n checkIsNotAutoPlacement,\n getAutoPlacementAlign,\n convertFloatingDataToReactCSSProperties,\n getArrowCoordsByMiddlewareData,\n} from './functions';\n\nexport {\n useFloating,\n offsetMiddleware,\n flipMiddleware,\n shiftMiddleware,\n autoPlacementMiddleware,\n arrowMiddleware,\n sizeMiddleware,\n hideMiddleware,\n getOverflowAncestors,\n autoUpdateFloatingElement,\n} from './adapters';\n\nexport {\n type UseFloatingMiddlewaresBootstrapOptions,\n useFloatingMiddlewaresBootstrap,\n} from './useFloatingMiddlewaresBootstrap';\n\nexport * from './useFloatingWithInteractions';\n\nexport { usePlacementChangeCallback } from './usePlacementChangeCallback';\n"],"names":["checkIsNotAutoPlacement","getAutoPlacementAlign","convertFloatingDataToReactCSSProperties","getArrowCoordsByMiddlewareData","useFloating","offsetMiddleware","flipMiddleware","shiftMiddleware","autoPlacementMiddleware","arrowMiddleware","sizeMiddleware","hideMiddleware","getOverflowAncestors","autoUpdateFloatingElement","useFloatingMiddlewaresBootstrap","usePlacementChangeCallback"],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../src/lib/floating/index.ts"],"sourcesContent":["export type {\n UseFloatingOptions,\n Placement,\n Side,\n Alignment,\n VirtualElement,\n PlacementWithAuto,\n AutoPlacementType,\n UseFloatingMiddleware,\n OnPlacementChange,\n} from './types/common';\n\nexport type { FloatingComponentProps, FloatingContentRenderProp } from './types/component';\n\nexport {\n checkIsNotAutoPlacement,\n getAutoPlacementAlign,\n convertFloatingDataToReactCSSProperties,\n getArrowCoordsByMiddlewareData,\n} from './functions';\n\nexport {\n useFloating,\n offsetMiddleware,\n flipMiddleware,\n shiftMiddleware,\n autoPlacementMiddleware,\n arrowMiddleware,\n sizeMiddleware,\n hideMiddleware,\n getOverflowAncestors,\n autoUpdateFloatingElement,\n} from './adapters';\n\nexport {\n type UseFloatingMiddlewaresBootstrapOptions,\n useFloatingMiddlewaresBootstrap,\n} from './useFloatingMiddlewaresBootstrap';\n\nexport * from './useFloatingWithInteractions';\n\nexport { usePlacementChangeCallback } from './usePlacementChangeCallback';\n"],"names":["checkIsNotAutoPlacement","getAutoPlacementAlign","convertFloatingDataToReactCSSProperties","getArrowCoordsByMiddlewareData","useFloating","offsetMiddleware","flipMiddleware","shiftMiddleware","autoPlacementMiddleware","arrowMiddleware","sizeMiddleware","hideMiddleware","getOverflowAncestors","autoUpdateFloatingElement","useFloatingMiddlewaresBootstrap","usePlacementChangeCallback"],"mappings":"AAcA,SACEA,uBAAuB,EACvBC,qBAAqB,EACrBC,uCAAuC,EACvCC,8BAA8B,QACzB,iBAAc;AAErB,SACEC,WAAW,EACXC,gBAAgB,EAChBC,cAAc,EACdC,eAAe,EACfC,uBAAuB,EACvBC,eAAe,EACfC,cAAc,EACdC,cAAc,EACdC,oBAAoB,EACpBC,yBAAyB,QACpB,gBAAa;AAEpB,SAEEC,+BAA+B,QAC1B,6CAAoC;AAE3C,cAAc,yCAAgC;AAE9C,SAASC,0BAA0B,QAAQ,kCAA+B"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/floating/types/common.ts"],"sourcesContent":["import type {\n Placement,\n ReferenceType,\n UseFloatingReturn,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type AutoPlacementType = 'auto' | 'auto-start' | 'auto-end';\n\nexport type PlacementWithAuto = AutoPlacementType | Placement;\n\nexport type {\n VirtualElement,\n UseFloatingOptions,\n ReferenceType,\n ArrowOptions,\n UseFloatingReturn,\n Placement,\n Middleware as UseFloatingMiddleware,\n UseFloatingData,\n Strategy as FloatingPositionStrategy,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type UseFloatingRefs<RT extends ReferenceType = ReferenceType> =\n UseFloatingReturn<RT>['refs'];\n\nexport type OnPlacementChange = (nextPlacement: Placement) => void;\n"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/floating/types/common.ts"],"sourcesContent":["import type {\n Placement,\n ReferenceType,\n UseFloatingReturn,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type AutoPlacementType = 'auto' | 'auto-start' | 'auto-end';\n\nexport type PlacementWithAuto = AutoPlacementType | Placement;\n\nexport type {\n VirtualElement,\n UseFloatingOptions,\n ReferenceType,\n ArrowOptions,\n UseFloatingReturn,\n Placement,\n Side,\n Alignment,\n Middleware as UseFloatingMiddleware,\n UseFloatingData,\n Strategy as FloatingPositionStrategy,\n} from '@vkontakte/vkui-floating-ui/react-dom';\n\nexport type UseFloatingRefs<RT extends ReferenceType = ReferenceType> =\n UseFloatingReturn<RT>['refs'];\n\nexport type OnPlacementChange = (nextPlacement: Placement) => void;\n"],"names":[],"mappings":"AA2BA,WAAmE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/sheet/controllers/BottomSheetController.ts"],"sourcesContent":["import { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../../helpers/math';\nimport { rubberbandIfOutOfBounds } from '../../animation';\nimport { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';\nimport { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';\nimport {\n BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,\n DRAG_THRESHOLDS,\n DYNAMIC_SNAP_POINT_DATA,\n SNAP_POINT_DETENTS,\n} from '../constants';\nimport type { CSSTransitionController } from './CSSTransitionController';\n\nexport type SnapPointDetents = [number, number] | [number, number, number];\n\nexport type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };\n\nexport type SnapPointChange = (snapPoint: number) => void;\n\nexport type BottomSheetControllerOptions = {\n sheetScrollEl: HTMLElement | null;\n sheetTransitionController: CSSTransitionController<string>;\n backdropTransitionController: CSSTransitionController | null;\n onSnapPointChange: SnapPointChange;\n onDismiss: VoidFunction;\n};\n\nexport class BottomSheetController {\n private readonly sheetEl: HTMLElement;\n\n constructor(\n sheetEl: HTMLElement,\n {\n sheetScrollEl,\n sheetTransitionController,\n backdropTransitionController,\n onSnapPointChange,\n onDismiss,\n }: BottomSheetControllerOptions,\n ) {\n this.sheetEl = sheetEl;\n this.onSnapPointChange = onSnapPointChange;\n this.onDismiss = onDismiss;\n this.panGestureRecognizer = new UIPanGestureRecognizer();\n this.sheetScrollEl = sheetScrollEl;\n this.sheetTransitionController = sheetTransitionController;\n this.backdropTransitionController = backdropTransitionController;\n }\n\n init(snapPoint: SnapPoint) {\n this.isInitialized = true;\n\n if (snapPoint === 'auto') {\n this.unit = 'px';\n this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;\n this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];\n } else {\n this.unit = '%';\n this.currentSnapPoint = snapPoint.initial;\n this.snapPointDetents = snapPoint.detents;\n }\n }\n\n destroy() {\n this.isInitialized = false;\n this.pannedEl = null;\n this.sheetTransitionController.cleanup();\n this.backdropTransitionController?.cleanup();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n panStart(event: UIEvent) {\n if (\n !this.isInitialized ||\n this.panState !== 'idle' ||\n hasSelectionWithRangeType(event.target)\n ) {\n return;\n }\n\n this.panState = 'start';\n this.pannedEl = event.target as HTMLElement;\n this.panGestureRecognizer.setStartCoords(event);\n }\n\n panMove(event: UIEvent) {\n switch (this.panState) {\n case 'start':\n this.panGestureRecognizer.setInitialTimeOnce();\n this.panGestureRecognizer.setEndCoords(event);\n\n if (this.preventUntilPanGestureBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfPannedElIsNotValid()) {\n this.panState = 'idle';\n return;\n }\n\n if (this.preventUntilVerticalScrollingOnSheetScrollElBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled()) {\n this.panState = 'idle';\n return;\n }\n\n this.panState = 'moving';\n this.panGestureRecognizer.setStartCoords(event);\n\n this.sheetHeight = this.sheetEl.offsetHeight;\n\n this.disableVerticalScrollBouncingDispose =\n BottomSheetController.disableVerticalScrollBouncingIfNeeded(\n this.sheetScrollEl,\n this.pannedEl,\n );\n\n if (this.isDynamicSnapPoint) {\n this.currentSnapPoint = this.sheetHeight;\n this.snapPointDetents[DYNAMIC_SNAP_POINT_DATA.COMPUTED_INDEX] = this.sheetHeight;\n }\n break;\n case 'moving':\n this.panGestureRecognizer.setEndCoords(event);\n\n const { y1, y2 } = this.panGestureRecognizer;\n\n this.nextSnapPoint = rubberbandIfOutOfBounds(\n this.currentSnapPoint - ((y2 - y1) / this.sheetHeight) * this.currentSnapPoint,\n SNAP_POINT_DETENTS.MIN,\n this.isDynamicSnapPoint ? this.sheetHeight : SNAP_POINT_DETENTS.LARGE,\n );\n\n this.calculateSnapPoint(this.nextSnapPoint, true);\n break;\n }\n }\n\n panEnd() {\n switch (this.panState) {\n case 'moving':\n const prevCurrentSnapPoint = this.currentSnapPoint;\n this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);\n\n if (\n prevCurrentSnapPoint !== this.currentSnapPoint &&\n this.currentSnapPoint > SNAP_POINT_DETENTS.MIN\n ) {\n this.onSnapPointChange(this.currentSnapPoint);\n }\n\n this.calculateSnapPoint(this.currentSnapPoint);\n break;\n }\n\n this.panState = 'idle';\n this.panGestureRecognizer.reset();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n private isInitialized = false;\n private panState: 'idle' | 'start' | 'moving' = 'idle';\n private pannedEl: HTMLElement | null = null;\n private sheetHeight = 0;\n private rafId: number | null = null;\n private currentSnapPoint = 0;\n private nextSnapPoint = 0;\n private snapPointDetents: SnapPointDetents = [0, 0];\n private unit: 'px' | '%' = '%';\n private get isDynamicSnapPoint() {\n return this.unit === 'px';\n }\n private disableVerticalScrollBouncingDispose = noop;\n private readonly sheetScrollEl: HTMLElement | null;\n private readonly sheetTransitionController: CSSTransitionController<string>;\n private readonly backdropTransitionController: CSSTransitionController | null;\n private readonly panGestureRecognizer: UIPanGestureRecognizer;\n private readonly onSnapPointChange: SnapPointChange;\n private readonly onDismiss: VoidFunction;\n\n private calculateSnapPoint(nextSnapPoint: number, immediately = false) {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n\n if (nextSnapPoint <= SNAP_POINT_DETENTS.MIN) {\n this.sheetTransitionController.enableTransition();\n this.backdropTransitionController?.enableTransition();\n this.panState = 'idle';\n this.onDismiss();\n return;\n }\n\n const backdropOpacity = clamp(\n this.isDynamicSnapPoint\n ? nextSnapPoint / this.sheetHeight\n : (nextSnapPoint * 2) / SNAP_POINT_DETENTS.LARGE,\n 0,\n 1,\n );\n\n this.rafId = requestAnimationFrame(() => {\n if (immediately) {\n this.backdropTransitionController?.disableTransition().set(backdropOpacity);\n this.sheetTransitionController.disableTransition().set(`${nextSnapPoint}${this.unit}`);\n return;\n }\n\n if (this.isDynamicSnapPoint) {\n this.sheetTransitionController.cleanupOnTransitionEnd();\n }\n\n this.backdropTransitionController?.unset();\n this.sheetTransitionController.enableTransition().set(`${this.currentSnapPoint}${this.unit}`);\n });\n }\n\n private getSnapPointTo(nextSnapPoint: number) {\n const closestSnapPoint = BottomSheetController.getClosestSnapPoint(\n this.snapPointDetents,\n nextSnapPoint,\n );\n if (closestSnapPoint !== this.currentSnapPoint) {\n return closestSnapPoint;\n }\n\n const panDirection = this.panGestureRecognizer.direction();\n if (panDirection.axis !== 'y' || panDirection.direction === null) {\n return this.currentSnapPoint;\n }\n\n const velocity = this.panGestureRecognizer.velocity();\n if (Math.abs(velocity.y) < DRAG_THRESHOLDS.VELOCITY) {\n return this.currentSnapPoint;\n }\n\n const closestSnapPointByDirection = BottomSheetController.getClosestSnapPointByDirection(\n this.snapPointDetents,\n closestSnapPoint,\n panDirection.direction,\n );\n\n return closestSnapPointByDirection;\n }\n\n private preventUntilPanGestureBecomesExpected() {\n return (\n this.panGestureRecognizer.direction().axis === 'x' ||\n this.panGestureRecognizer.distance() < DRAG_THRESHOLDS.DISTANCE_FOR_MOVING_START\n );\n }\n\n private preventImmediatelyIfPannedElIsNotValid() {\n return (\n this.pannedEl === null ||\n // Элемент со специальным атрибутом\n this.pannedEl.closest(`[${BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY}=true]`) !== null || // eslint-disable-line no-restricted-properties\n // Элемент за пределами панели.\n !this.sheetEl.contains(this.pannedEl)\n );\n }\n\n private preventUntilVerticalScrollingOnSheetScrollElBecomesExpected() {\n if (\n this.sheetScrollEl === null ||\n !this.sheetScrollEl.contains(this.pannedEl) ||\n this.sheetScrollEl.scrollHeight <= this.sheetScrollEl.clientHeight\n ) {\n return false;\n }\n\n if (this.sheetScrollEl.scrollTop === 0) {\n return (\n this.panGestureRecognizer.direction().direction === -1 &&\n BottomSheetController.isLastSnapPointDetents(this.snapPointDetents, this.currentSnapPoint)\n );\n }\n\n return true;\n }\n\n private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {\n if (\n /* istanbul ignore next: покрываем TypeScript */\n this.pannedEl === null ||\n this.pannedEl === this.sheetEl ||\n this.pannedEl === this.sheetScrollEl\n ) {\n return false;\n }\n\n const overflowAncestor = getNearestOverflowAncestor(this.pannedEl, this.sheetEl);\n\n if (\n overflowAncestor === null ||\n this.sheetScrollEl === overflowAncestor ||\n overflowAncestor.scrollHeight <= overflowAncestor.clientHeight\n ) {\n return false;\n }\n\n return (\n overflowAncestor.scrollTop !== 0 || this.panGestureRecognizer.direction().direction === -1\n );\n }\n\n private static disableVerticalScrollBouncingIfNeeded(\n sheetScrollEl: HTMLElement | null,\n targetEl: HTMLElement | null,\n ) {\n if (\n sheetScrollEl !== null &&\n sheetScrollEl.scrollTop <= 0 &&\n sheetScrollEl.contains(targetEl) &&\n sheetScrollEl.scrollHeight > sheetScrollEl.clientHeight\n ) {\n sheetScrollEl.style.setProperty('overflow-y', 'hidden');\n return function dispose() {\n sheetScrollEl.style.removeProperty('overflow-y');\n };\n }\n return noop;\n }\n\n private static isLastSnapPointDetents(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n ): boolean {\n return currentY === snapPointDetents[snapPointDetents.length - 1];\n }\n\n private static getClosestSnapPointByDirection(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n direction: -1 | 1,\n ): number {\n const foundIndex = snapPointDetents.findIndex((i) => i === currentY);\n switch (direction) {\n case -1:\n return snapPointDetents[foundIndex + 1] ?? snapPointDetents[snapPointDetents.length - 1];\n case 1:\n return snapPointDetents[foundIndex - 1] ?? snapPointDetents[0];\n }\n }\n\n private static getClosestSnapPoint(snapPointDetents: SnapPointDetents, currentY: number) {\n let closest = snapPointDetents[0];\n let minDifference = Math.abs(snapPointDetents[0] - currentY);\n\n for (let i = 1; i < snapPointDetents.length; i += 1) {\n const difference = Math.abs(snapPointDetents[i] - currentY);\n if (difference < minDifference) {\n closest = snapPointDetents[i];\n minDifference = difference;\n }\n }\n\n return closest;\n }\n}\n"],"names":["noop","clamp","rubberbandIfOutOfBounds","getNearestOverflowAncestor","hasSelectionWithRangeType","UIPanGestureRecognizer","BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY","DRAG_THRESHOLDS","DYNAMIC_SNAP_POINT_DATA","SNAP_POINT_DETENTS","BottomSheetController","sheetEl","constructor","sheetScrollEl","sheetTransitionController","backdropTransitionController","onSnapPointChange","onDismiss","panGestureRecognizer","init","snapPoint","isInitialized","unit","currentSnapPoint","IDLE_POINT_VALUE","snapPointDetents","MIN","initial","detents","destroy","pannedEl","cleanup","disableVerticalScrollBouncingDispose","panStart","event","panState","target","setStartCoords","panMove","setInitialTimeOnce","setEndCoords","preventUntilPanGestureBecomesExpected","preventImmediatelyIfPannedElIsNotValid","preventUntilVerticalScrollingOnSheetScrollElBecomesExpected","preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled","sheetHeight","offsetHeight","disableVerticalScrollBouncingIfNeeded","isDynamicSnapPoint","COMPUTED_INDEX","y1","y2","nextSnapPoint","LARGE","calculateSnapPoint","panEnd","prevCurrentSnapPoint","getSnapPointTo","reset","rafId","immediately","cancelAnimationFrame","enableTransition","backdropOpacity","requestAnimationFrame","disableTransition","set","cleanupOnTransitionEnd","unset","closestSnapPoint","getClosestSnapPoint","panDirection","direction","axis","velocity","Math","abs","y","VELOCITY","closestSnapPointByDirection","getClosestSnapPointByDirection","distance","DISTANCE_FOR_MOVING_START","closest","contains","scrollHeight","clientHeight","scrollTop","isLastSnapPointDetents","overflowAncestor","targetEl","style","setProperty","dispose","removeProperty","currentY","length","foundIndex","findIndex","i","minDifference","difference"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/sheet/controllers/BottomSheetController.ts"],"sourcesContent":["import { noop } from '@vkontakte/vkjs';\nimport { clamp } from '../../../helpers/math';\nimport { rubberbandIfOutOfBounds } from '../../animation';\nimport { getNearestOverflowAncestor, hasSelectionWithRangeType } from '../../dom';\nimport { UIPanGestureRecognizer } from '../../touch/UIPanGestureRecognizer';\nimport {\n BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY,\n DRAG_THRESHOLDS,\n DYNAMIC_SNAP_POINT_DATA,\n SNAP_POINT_DETENTS,\n} from '../constants';\nimport type { CSSTransitionController } from './CSSTransitionController';\n\nexport type SnapPointDetents = [number, number] | [number, number, number];\n\nexport type SnapPoint = 'auto' | { initial: number; detents: SnapPointDetents };\n\nexport type SnapPointChange = (snapPoint: number) => void;\n\nexport type BottomSheetControllerOptions = {\n sheetScrollEl: HTMLElement | null;\n sheetTransitionController: CSSTransitionController<string>;\n backdropTransitionController: CSSTransitionController | null;\n onSnapPointChange: SnapPointChange;\n onDismiss: VoidFunction;\n};\n\nexport class BottomSheetController {\n private readonly sheetEl: HTMLElement;\n\n constructor(\n sheetEl: HTMLElement,\n {\n sheetScrollEl,\n sheetTransitionController,\n backdropTransitionController,\n onSnapPointChange,\n onDismiss,\n }: BottomSheetControllerOptions,\n ) {\n this.sheetEl = sheetEl;\n this.onSnapPointChange = onSnapPointChange;\n this.onDismiss = onDismiss;\n this.panGestureRecognizer = new UIPanGestureRecognizer();\n this.sheetScrollEl = sheetScrollEl;\n this.sheetTransitionController = sheetTransitionController;\n this.backdropTransitionController = backdropTransitionController;\n }\n\n init(snapPoint: SnapPoint) {\n this.isInitialized = true;\n\n if (snapPoint === 'auto') {\n this.unit = 'px';\n this.currentSnapPoint = DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE;\n this.snapPointDetents = [SNAP_POINT_DETENTS.MIN, DYNAMIC_SNAP_POINT_DATA.IDLE_POINT_VALUE];\n } else {\n this.unit = '%';\n this.currentSnapPoint = snapPoint.initial;\n this.snapPointDetents = snapPoint.detents;\n }\n }\n\n destroy() {\n this.isInitialized = false;\n this.pannedEl = null;\n this.sheetTransitionController.cleanup();\n this.backdropTransitionController?.cleanup();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n panStart(event: UIEvent) {\n if (\n !this.isInitialized ||\n this.panState !== 'idle' ||\n hasSelectionWithRangeType(event.target)\n ) {\n return;\n }\n\n this.panState = 'start';\n this.pannedEl = event.target as HTMLElement;\n this.panGestureRecognizer.setStartCoords(event);\n }\n\n panMove(event: UIEvent) {\n switch (this.panState) {\n case 'start':\n this.panGestureRecognizer.setInitialTimeOnce();\n this.panGestureRecognizer.setEndCoords(event);\n\n if (this.preventUntilPanGestureBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfPannedElIsNotValid()) {\n this.panState = 'idle';\n return;\n }\n\n if (this.preventUntilVerticalScrollingOnSheetScrollElBecomesExpected()) {\n return;\n }\n\n if (this.preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled()) {\n this.panState = 'idle';\n return;\n }\n\n this.panState = 'moving';\n this.panGestureRecognizer.setStartCoords(event);\n\n this.sheetHeight = this.sheetEl.offsetHeight;\n\n this.disableVerticalScrollBouncingDispose =\n BottomSheetController.disableVerticalScrollBouncingIfNeeded(\n this.sheetScrollEl,\n this.pannedEl,\n );\n\n if (this.isDynamicSnapPoint) {\n this.currentSnapPoint = this.sheetHeight;\n this.snapPointDetents[DYNAMIC_SNAP_POINT_DATA.COMPUTED_INDEX] = this.sheetHeight;\n }\n break;\n case 'moving':\n this.panGestureRecognizer.setEndCoords(event);\n\n const { y1, y2 } = this.panGestureRecognizer;\n\n this.nextSnapPoint = rubberbandIfOutOfBounds(\n this.currentSnapPoint - ((y2 - y1) / this.sheetHeight) * this.currentSnapPoint,\n SNAP_POINT_DETENTS.MIN,\n this.isDynamicSnapPoint ? this.sheetHeight : SNAP_POINT_DETENTS.LARGE,\n );\n\n this.calculateSnapPoint(this.nextSnapPoint, true);\n break;\n }\n }\n\n panEnd() {\n switch (this.panState) {\n case 'moving':\n const prevCurrentSnapPoint = this.currentSnapPoint;\n this.currentSnapPoint = this.getSnapPointTo(this.nextSnapPoint);\n\n if (\n prevCurrentSnapPoint !== this.currentSnapPoint &&\n this.currentSnapPoint > SNAP_POINT_DETENTS.MIN\n ) {\n this.onSnapPointChange(this.currentSnapPoint);\n }\n\n this.calculateSnapPoint(this.currentSnapPoint);\n break;\n }\n\n this.panState = 'idle';\n this.panGestureRecognizer.reset();\n\n this.disableVerticalScrollBouncingDispose();\n this.disableVerticalScrollBouncingDispose = noop;\n }\n\n private isInitialized = false;\n private panState: 'idle' | 'start' | 'moving' = 'idle';\n private pannedEl: HTMLElement | null = null;\n private sheetHeight = 0;\n private rafId: number | null = null;\n private currentSnapPoint = 0;\n private nextSnapPoint = 0;\n private snapPointDetents: SnapPointDetents = [0, 0];\n private unit: 'px' | '%' = '%';\n private get isDynamicSnapPoint() {\n return this.unit === 'px';\n }\n private disableVerticalScrollBouncingDispose = noop;\n private readonly sheetScrollEl: HTMLElement | null;\n private readonly sheetTransitionController: CSSTransitionController<string>;\n private readonly backdropTransitionController: CSSTransitionController | null;\n private readonly panGestureRecognizer: UIPanGestureRecognizer;\n private readonly onSnapPointChange: SnapPointChange;\n private readonly onDismiss: VoidFunction;\n\n private calculateSnapPoint(nextSnapPoint: number, immediately = false) {\n if (this.rafId !== null) {\n cancelAnimationFrame(this.rafId);\n }\n\n if (nextSnapPoint <= SNAP_POINT_DETENTS.MIN) {\n this.sheetTransitionController.enableTransition();\n this.backdropTransitionController?.enableTransition();\n this.panState = 'idle';\n this.onDismiss();\n return;\n }\n\n const backdropOpacity = clamp(\n this.isDynamicSnapPoint\n ? nextSnapPoint / this.sheetHeight\n : (nextSnapPoint * 2) / SNAP_POINT_DETENTS.LARGE,\n 0,\n 1,\n );\n\n this.rafId = requestAnimationFrame(() => {\n if (immediately) {\n this.backdropTransitionController?.disableTransition().set(backdropOpacity);\n this.sheetTransitionController.disableTransition().set(`${nextSnapPoint}${this.unit}`);\n return;\n }\n\n if (this.isDynamicSnapPoint) {\n this.sheetTransitionController.cleanupOnTransitionEnd();\n }\n\n this.backdropTransitionController?.unset();\n this.sheetTransitionController.enableTransition().set(`${this.currentSnapPoint}${this.unit}`);\n });\n }\n\n private getSnapPointTo(nextSnapPoint: number) {\n const closestSnapPoint = BottomSheetController.getClosestSnapPoint(\n this.snapPointDetents,\n nextSnapPoint,\n );\n if (closestSnapPoint !== this.currentSnapPoint) {\n return closestSnapPoint;\n }\n\n const panDirection = this.panGestureRecognizer.direction();\n if (panDirection.axis !== 'y' || panDirection.direction === null) {\n return this.currentSnapPoint;\n }\n\n const velocity = this.panGestureRecognizer.velocity();\n if (Math.abs(velocity.y) < DRAG_THRESHOLDS.VELOCITY) {\n return this.currentSnapPoint;\n }\n\n const closestSnapPointByDirection = BottomSheetController.getClosestSnapPointByDirection(\n this.snapPointDetents,\n closestSnapPoint,\n panDirection.direction,\n );\n\n return closestSnapPointByDirection;\n }\n\n private preventUntilPanGestureBecomesExpected() {\n return (\n this.panGestureRecognizer.direction().axis === 'x' ||\n this.panGestureRecognizer.distance() < DRAG_THRESHOLDS.DISTANCE_FOR_MOVING_START\n );\n }\n\n private preventImmediatelyIfPannedElIsNotValid() {\n return (\n this.pannedEl === null ||\n // Элемент со специальным атрибутом\n this.pannedEl.closest(`[${BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY}=true]`) !== null || // eslint-disable-line no-restricted-properties\n // Элемент за пределами панели.\n !this.sheetEl.contains(this.pannedEl)\n );\n }\n\n private preventUntilVerticalScrollingOnSheetScrollElBecomesExpected() {\n if (\n this.sheetScrollEl === null ||\n !this.sheetScrollEl.contains(this.pannedEl) ||\n this.sheetScrollEl.scrollHeight <= this.sheetScrollEl.clientHeight\n ) {\n return false;\n }\n\n if (this.sheetScrollEl.scrollTop === 0) {\n return (\n this.panGestureRecognizer.direction().direction === -1 &&\n BottomSheetController.isLastSnapPointDetents(this.snapPointDetents, this.currentSnapPoint)\n );\n }\n\n return true;\n }\n\n private preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled() {\n if (\n /* istanbul ignore next: покрываем TypeScript */\n this.pannedEl === null ||\n this.pannedEl === this.sheetEl ||\n this.pannedEl === this.sheetScrollEl\n ) {\n return false;\n }\n\n const overflowAncestor = getNearestOverflowAncestor(this.pannedEl, this.sheetEl);\n\n if (\n overflowAncestor === null ||\n this.sheetScrollEl === overflowAncestor ||\n overflowAncestor.scrollHeight <= overflowAncestor.clientHeight\n ) {\n return false;\n }\n\n return (\n overflowAncestor.scrollTop !== 0 || this.panGestureRecognizer.direction().direction === -1\n );\n }\n\n private static disableVerticalScrollBouncingIfNeeded(\n sheetScrollEl: HTMLElement | null,\n targetEl: HTMLElement | null,\n ) {\n if (\n sheetScrollEl !== null &&\n sheetScrollEl.scrollTop <= 0 &&\n sheetScrollEl.contains(targetEl) &&\n sheetScrollEl.scrollHeight > sheetScrollEl.clientHeight\n ) {\n sheetScrollEl.style.setProperty('overflow-y', 'hidden');\n return function dispose() {\n sheetScrollEl.style.removeProperty('overflow-y');\n };\n }\n return noop;\n }\n\n private static isLastSnapPointDetents(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n ): boolean {\n return currentY === snapPointDetents[snapPointDetents.length - 1];\n }\n\n private static getClosestSnapPointByDirection(\n snapPointDetents: SnapPointDetents,\n currentY: number,\n direction: -1 | 1,\n ): number {\n const foundIndex = snapPointDetents.findIndex((i) => i === currentY);\n switch (direction) {\n case -1:\n return snapPointDetents[foundIndex + 1] ?? snapPointDetents[snapPointDetents.length - 1];\n case 1:\n return snapPointDetents[foundIndex - 1] ?? snapPointDetents[0];\n }\n }\n\n private static getClosestSnapPoint(snapPointDetents: SnapPointDetents, currentY: number) {\n let closest = snapPointDetents[0];\n let minDifference = Math.abs(snapPointDetents[0] - currentY);\n\n for (let i = 1; i < snapPointDetents.length; i += 1) {\n const difference = Math.abs(snapPointDetents[i] - currentY);\n if (difference < minDifference) {\n closest = snapPointDetents[i];\n minDifference = difference;\n }\n }\n\n return closest;\n }\n}\n"],"names":["noop","clamp","rubberbandIfOutOfBounds","getNearestOverflowAncestor","hasSelectionWithRangeType","UIPanGestureRecognizer","BLOCK_SHEET_BEHAVIOR_DATA_ATTRIBUTE_KEY","DRAG_THRESHOLDS","DYNAMIC_SNAP_POINT_DATA","SNAP_POINT_DETENTS","BottomSheetController","sheetEl","sheetScrollEl","sheetTransitionController","backdropTransitionController","onSnapPointChange","onDismiss","panGestureRecognizer","init","snapPoint","isInitialized","unit","currentSnapPoint","IDLE_POINT_VALUE","snapPointDetents","MIN","initial","detents","destroy","pannedEl","cleanup","disableVerticalScrollBouncingDispose","panStart","event","panState","target","setStartCoords","panMove","setInitialTimeOnce","setEndCoords","preventUntilPanGestureBecomesExpected","preventImmediatelyIfPannedElIsNotValid","preventUntilVerticalScrollingOnSheetScrollElBecomesExpected","preventImmediatelyIfVerticalScrollingOnPannedElIsScrolled","sheetHeight","offsetHeight","disableVerticalScrollBouncingIfNeeded","isDynamicSnapPoint","COMPUTED_INDEX","y1","y2","nextSnapPoint","LARGE","calculateSnapPoint","panEnd","prevCurrentSnapPoint","getSnapPointTo","reset","rafId","immediately","cancelAnimationFrame","enableTransition","backdropOpacity","requestAnimationFrame","disableTransition","set","cleanupOnTransitionEnd","unset","closestSnapPoint","getClosestSnapPoint","panDirection","direction","axis","velocity","Math","abs","y","VELOCITY","closestSnapPointByDirection","getClosestSnapPointByDirection","distance","DISTANCE_FOR_MOVING_START","closest","contains","scrollHeight","clientHeight","scrollTop","isLastSnapPointDetents","overflowAncestor","targetEl","style","setProperty","dispose","removeProperty","currentY","length","foundIndex","findIndex","i","minDifference","difference"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/lib/sheet/controllers/CSSTransitionController.ts"],"sourcesContent":["export type CSSTransitionControllerUnit = 'px' | '%' | '';\n\nexport class CSSTransitionController<V extends number | string = number> {\n public readonly el: HTMLElement;\n public readonly property: string;\n\n constructor(el: HTMLElement, property: string) {\n this.el = el;\n this.property = property;\n }\n\n set(to: V) {\n this.el.style.setProperty(this.property, `${to}`);\n return this;\n }\n\n unset() {\n return this.cleanup();\n }\n\n enableTransition() {\n this.el.style.removeProperty('transition');\n return this;\n }\n\n disableTransition() {\n this.el.style.setProperty('transition', 'none');\n return this;\n }\n\n cleanup() {\n this.el.removeEventListener('transitionend', this.handleTransitionEnd);\n this.el.style.removeProperty('transition');\n this.el.style.removeProperty(this.property);\n return this;\n }\n\n cleanupOnTransitionEnd() {\n this.el.addEventListener('transitionend', this.handleTransitionEnd, { once: true });\n return this;\n }\n\n private readonly handleTransitionEnd = () => {\n this.cleanup();\n return this;\n };\n}\n"],"names":["CSSTransitionController","el","property","
|
|
1
|
+
{"version":3,"sources":["../../../../../src/lib/sheet/controllers/CSSTransitionController.ts"],"sourcesContent":["export type CSSTransitionControllerUnit = 'px' | '%' | '';\n\nexport class CSSTransitionController<V extends number | string = number> {\n public readonly el: HTMLElement;\n public readonly property: string;\n\n constructor(el: HTMLElement, property: string) {\n this.el = el;\n this.property = property;\n }\n\n set(to: V) {\n this.el.style.setProperty(this.property, `${to}`);\n return this;\n }\n\n unset() {\n return this.cleanup();\n }\n\n enableTransition() {\n this.el.style.removeProperty('transition');\n return this;\n }\n\n disableTransition() {\n this.el.style.setProperty('transition', 'none');\n return this;\n }\n\n cleanup() {\n this.el.removeEventListener('transitionend', this.handleTransitionEnd);\n this.el.style.removeProperty('transition');\n this.el.style.removeProperty(this.property);\n return this;\n }\n\n cleanupOnTransitionEnd() {\n this.el.addEventListener('transitionend', this.handleTransitionEnd, { once: true });\n return this;\n }\n\n private readonly handleTransitionEnd = () => {\n this.cleanup();\n return this;\n };\n}\n"],"names":["CSSTransitionController","el","property","set","to","style","setProperty","unset","cleanup","enableTransition","removeProperty","disableTransition","removeEventListener","handleTransitionEnd","cleanupOnTransitionEnd","addEventListener","once"],"mappings":"AAEA,OAAO,MAAMA;IACKC,GAAgB;IAChBC,SAAiB;IAEjC,YAAYD,EAAe,EAAEC,QAAgB,CAAE;QAC7C,IAAI,CAACD,EAAE,GAAGA;QACV,IAAI,CAACC,QAAQ,GAAGA;IAClB;IAEAC,IAAIC,EAAK,EAAE;QACT,IAAI,CAACH,EAAE,CAACI,KAAK,CAACC,WAAW,CAAC,IAAI,CAACJ,QAAQ,EAAE,GAAGE,IAAI;QAChD,OAAO,IAAI;IACb;IAEAG,QAAQ;QACN,OAAO,IAAI,CAACC,OAAO;IACrB;IAEAC,mBAAmB;QACjB,IAAI,CAACR,EAAE,CAACI,KAAK,CAACK,cAAc,CAAC;QAC7B,OAAO,IAAI;IACb;IAEAC,oBAAoB;QAClB,IAAI,CAACV,EAAE,CAACI,KAAK,CAACC,WAAW,CAAC,cAAc;QACxC,OAAO,IAAI;IACb;IAEAE,UAAU;QACR,IAAI,CAACP,EAAE,CAACW,mBAAmB,CAAC,iBAAiB,IAAI,CAACC,mBAAmB;QACrE,IAAI,CAACZ,EAAE,CAACI,KAAK,CAACK,cAAc,CAAC;QAC7B,IAAI,CAACT,EAAE,CAACI,KAAK,CAACK,cAAc,CAAC,IAAI,CAACR,QAAQ;QAC1C,OAAO,IAAI;IACb;IAEAY,yBAAyB;QACvB,IAAI,CAACb,EAAE,CAACc,gBAAgB,CAAC,iBAAiB,IAAI,CAACF,mBAAmB,EAAE;YAAEG,MAAM;QAAK;QACjF,OAAO,IAAI;IACb;IAEiBH,sBAAsB;QACrC,IAAI,CAACL,OAAO;QACZ,OAAO,IAAI;IACb,EAAE;AACJ"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/styles/animationVisibilityDelay.ts"],"sourcesContent":["import { type CSSCustomProperties } from '../types';\n\nexport function animationVisibilityDelayStyles(\n delay: number | undefined,\n): CSSCustomProperties | undefined {\n if (delay === undefined) {\n return undefined;\n }\n\n return {\n '--vkui_internal--animation_delay_visibility': `${delay}ms`,\n };\n}\n"],"names":["animationVisibilityDelayStyles","delay","undefined"],"mappings":"AAEA,OAAO,SAASA,+BACdC,KAAyB;IAEzB,IAAIA,UAAUC,WAAW;QACvB,OAAOA;IACT;IAEA,OAAO;QACL,+CAA+C,GAAGD,MAAM,EAAE,CAAC;IAC7D;AACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
.visibilityDelay {
|
|
2
|
+
--vkui_internal--animation_delay_visibility: 200ms;
|
|
3
|
+
|
|
4
|
+
visibility: hidden;
|
|
5
|
+
animation: 0ms linear var(--vkui_internal--animation_delay_visibility) forwards
|
|
6
|
+
animation-styles-delay-visibility;
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
@keyframes animation-styles-delay-visibility {
|
|
10
|
+
to {
|
|
11
|
+
visibility: visible;
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -15,6 +15,7 @@
|
|
|
15
15
|
:root, .vkui--vkBase--light, .vkui--vkBase--dark, .vkui--vkIOS--light, .vkui--vkIOS--dark, .vkui--vkCom--light, .vkui--vkCom--dark {
|
|
16
16
|
--vkui--gradient_black: rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 0.02) 15%, rgba(0, 0, 0, 0.08) 30%, rgba(0, 0, 0, 0.32) 70%, rgba(0, 0, 0, 0.38) 85%, rgba(0, 0, 0, 0.4) 100%;
|
|
17
17
|
--vkui--gradient_white: rgba(255, 255, 255, 0) 0%, rgba(255, 255, 255, 0.05) 15%, rgba(255, 255, 255, 0.2) 30%, rgba(255, 255, 255, 0.8) 70%, rgba(255, 255, 255, 0.95) 85%, rgba(255, 255, 255, 1) 100%;
|
|
18
|
+
--vkui--blur_m: 16px;
|
|
18
19
|
--vkui--font_weight_accent1: 600;
|
|
19
20
|
--vkui--font_weight_accent2: 500;
|
|
20
21
|
--vkui--font_weight_accent3: 400;
|
|
@@ -605,7 +606,8 @@
|
|
|
605
606
|
--vkui--color_background_secondary--hover: #2C2C2D;
|
|
606
607
|
--vkui--color_background_secondary--active: #353536;
|
|
607
608
|
--vkui--color_background_secondary_alpha: rgba(255, 255, 255, 0.10);
|
|
608
|
-
--vkui--color_background_secondary_alpha--
|
|
609
|
+
--vkui--color_background_secondary_alpha--hover: rgba(255, 255, 255, 0.14);
|
|
610
|
+
--vkui--color_background_secondary_alpha--active: rgba(255, 255, 255, 0.18);
|
|
609
611
|
--vkui--color_background_tertiary: #202021;
|
|
610
612
|
--vkui--color_background_tertiary--hover: #29292A;
|
|
611
613
|
--vkui--color_background_tertiary--active: #323233;
|
|
@@ -766,7 +768,6 @@
|
|
|
766
768
|
--vkui--color_background_content_inverse: #FFFFFF;
|
|
767
769
|
--vkui--color_background_content_inverse--hover: #EBEDF0;
|
|
768
770
|
--vkui--color_background_content_inverse--active: #D7D8DB;
|
|
769
|
-
--vkui--color_background_secondary_alpha--hover: rgba(255, 255, 255, 0.12);
|
|
770
771
|
--vkui--color_background_tertiary_alpha: rgba(255, 255, 255, 0.03);
|
|
771
772
|
--vkui--color_background_tertiary_alpha--hover: rgba(255, 255, 255, 0.07);
|
|
772
773
|
--vkui--color_background_tertiary_alpha--active: rgba(255, 255, 255, 0.11);
|
|
@@ -1156,6 +1157,7 @@
|
|
|
1156
1157
|
--vkui--color_background_secondary--hover: #3B3B3B;
|
|
1157
1158
|
--vkui--color_background_secondary--active: #434343;
|
|
1158
1159
|
--vkui--color_background_secondary_alpha: rgba(255, 255, 255, 0.08);
|
|
1160
|
+
--vkui--color_background_secondary_alpha--hover: rgba(255, 255, 255, 0.12);
|
|
1159
1161
|
--vkui--color_background_secondary_alpha--active: rgba(255, 255, 255, 0.16);
|
|
1160
1162
|
--vkui--color_background_tertiary: #292929;
|
|
1161
1163
|
--vkui--color_background_tertiary--hover: #323232;
|
|
@@ -10,11 +10,8 @@ export declare function useCalendar({ value, disablePast, disableFuture, shouldD
|
|
|
10
10
|
setNextMonth: () => void;
|
|
11
11
|
focusedDay: Date | undefined;
|
|
12
12
|
setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
|
|
13
|
-
focusableDay: Date | undefined;
|
|
14
|
-
setFocusableDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
|
|
15
13
|
isDayFocused: (day: Date) => boolean;
|
|
16
14
|
isDayDisabled: (day: Date, withTime?: boolean) => boolean;
|
|
17
|
-
resetSelectedDay: () => void;
|
|
18
15
|
isMonthDisabled: (month: number, year?: number) => boolean;
|
|
19
16
|
isYearDisabled: (year: number) => boolean;
|
|
20
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useCalendar.d.ts","sourceRoot":"","sources":["../../src/hooks/useCalendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,MAAM,WAAW,uBACf,SAAQ,IAAI,CACV,aAAa,EACX,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,aAAa,GACb,aAAa,GACb,mBAAmB,GACnB,eAAe,GACf,aAAa,CAChB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,EAAE,uBAAuB,GAAG;IAC3B,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IAC7B,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;IACtE,YAAY,EAAE,
|
|
1
|
+
{"version":3,"file":"useCalendar.d.ts","sourceRoot":"","sources":["../../src/hooks/useCalendar.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAGrE,MAAM,WAAW,uBACf,SAAQ,IAAI,CACV,aAAa,EACX,gBAAgB,GAChB,aAAa,GACb,aAAa,GACb,aAAa,GACb,aAAa,GACb,mBAAmB,GACnB,eAAe,GACf,aAAa,CAChB;IACD,KAAK,CAAC,EAAE,KAAK,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;CAC1C;AAED,wBAAgB,WAAW,CAAC,EAC1B,KAAK,EACL,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,WAAW,EACX,WAAW,EACX,WAAW,EACX,WAAW,GACZ,EAAE,uBAAuB,GAAG;IAC3B,QAAQ,EAAE,IAAI,CAAC;IACf,WAAW,EAAE,CAAC,KAAK,EAAE,IAAI,KAAK,IAAI,CAAC;IACnC,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,UAAU,EAAE,IAAI,GAAG,SAAS,CAAC;IAC7B,aAAa,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,SAAS,CAAC,CAAC,CAAC;IACtE,YAAY,EAAE,CAAC,GAAG,EAAE,IAAI,KAAK,OAAO,CAAC;IACrC,aAAa,EAAE,CAAC,GAAG,EAAE,IAAI,EAAE,QAAQ,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;IAC1D,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC;IAC3D,cAAc,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;CAC3C,CAgHA"}
|
|
@@ -7,8 +7,6 @@ export function useCalendar({ value, disablePast, disableFuture, shouldDisableDa
|
|
|
7
7
|
// соответствует дню, на котором сейчас есть фокус
|
|
8
8
|
// меняется при переключении дней с помощью стрелок
|
|
9
9
|
const [focusedDay, setFocusedDay] = React.useState();
|
|
10
|
-
// соотвествует дню, на котором можно сфокусироваться с помощью Tab
|
|
11
|
-
const [focusableDay, setFocusableDay] = React.useState();
|
|
12
10
|
const setPrevMonth = React.useCallback(()=>{
|
|
13
11
|
onPrevMonth === null || onPrevMonth === void 0 ? void 0 : onPrevMonth();
|
|
14
12
|
setViewDate(subMonths(viewDate, 1));
|
|
@@ -98,11 +96,6 @@ export function useCalendar({ value, disablePast, disableFuture, shouldDisableDa
|
|
|
98
96
|
minDateTime,
|
|
99
97
|
maxDateTime
|
|
100
98
|
]);
|
|
101
|
-
const resetSelectedDay = React.useCallback(()=>{
|
|
102
|
-
setFocusedDay(undefined);
|
|
103
|
-
}, [
|
|
104
|
-
setFocusedDay
|
|
105
|
-
]);
|
|
106
99
|
return {
|
|
107
100
|
viewDate,
|
|
108
101
|
setViewDate: handleSetViewDate,
|
|
@@ -110,11 +103,8 @@ export function useCalendar({ value, disablePast, disableFuture, shouldDisableDa
|
|
|
110
103
|
setNextMonth,
|
|
111
104
|
focusedDay,
|
|
112
105
|
setFocusedDay,
|
|
113
|
-
focusableDay,
|
|
114
|
-
setFocusableDay,
|
|
115
106
|
isDayFocused,
|
|
116
107
|
isDayDisabled,
|
|
117
|
-
resetSelectedDay,
|
|
118
108
|
isMonthDisabled,
|
|
119
109
|
isYearDisabled
|
|
120
110
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/hooks/useCalendar.ts"],"sourcesContent":["import * as React from 'react';\nimport { addMonths, endOfDay, isAfter, isBefore, isSameDay, startOfDay, subMonths } from 'date-fns';\nimport type { CalendarProps } from '../components/Calendar/Calendar';\nimport { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, isDayMinMaxRestricted } from '../lib/calendar';\n\nexport interface UseCalendarDependencies\n extends Pick<\n CalendarProps,\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'minDateTime'\n | 'maxDateTime'\n | 'shouldDisableDate'\n | 'disableFuture'\n | 'disablePast'\n > {\n value?: Array<Date | null> | Date | null;\n}\n\nexport function useCalendar({\n value,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n}: UseCalendarDependencies): {\n viewDate: Date;\n setViewDate: (value: Date) => void;\n setPrevMonth: () => void;\n setNextMonth: () => void;\n focusedDay: Date | undefined;\n setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n
|
|
1
|
+
{"version":3,"sources":["../../src/hooks/useCalendar.ts"],"sourcesContent":["import * as React from 'react';\nimport { addMonths, endOfDay, isAfter, isBefore, isSameDay, startOfDay, subMonths } from 'date-fns';\nimport type { CalendarProps } from '../components/Calendar/Calendar';\nimport { DEFAULT_MAX_YEAR, DEFAULT_MIN_YEAR, isDayMinMaxRestricted } from '../lib/calendar';\n\nexport interface UseCalendarDependencies\n extends Pick<\n CalendarProps,\n | 'onHeaderChange'\n | 'onNextMonth'\n | 'onPrevMonth'\n | 'minDateTime'\n | 'maxDateTime'\n | 'shouldDisableDate'\n | 'disableFuture'\n | 'disablePast'\n > {\n value?: Array<Date | null> | Date | null;\n}\n\nexport function useCalendar({\n value,\n disablePast,\n disableFuture,\n shouldDisableDate,\n onHeaderChange,\n onNextMonth,\n onPrevMonth,\n minDateTime,\n maxDateTime,\n}: UseCalendarDependencies): {\n viewDate: Date;\n setViewDate: (value: Date) => void;\n setPrevMonth: () => void;\n setNextMonth: () => void;\n focusedDay: Date | undefined;\n setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;\n isDayFocused: (day: Date) => boolean;\n isDayDisabled: (day: Date, withTime?: boolean) => boolean;\n isMonthDisabled: (month: number, year?: number) => boolean;\n isYearDisabled: (year: number) => boolean;\n} {\n const [viewDate, setViewDate] = React.useState(\n (Array.isArray(value) ? value[0] : value) ?? new Date(),\n );\n // соответствует дню, на котором сейчас есть фокус\n // меняется при переключении дней с помощью стрелок\n const [focusedDay, setFocusedDay] = React.useState<Date>();\n\n const setPrevMonth = React.useCallback(() => {\n onPrevMonth?.();\n setViewDate(subMonths(viewDate, 1));\n }, [viewDate, onPrevMonth]);\n const setNextMonth = React.useCallback(() => {\n onNextMonth?.();\n setViewDate(addMonths(viewDate, 1));\n }, [viewDate, onNextMonth]);\n\n const handleSetViewDate = React.useCallback(\n (value: Date) => {\n onHeaderChange?.(value);\n setViewDate(value);\n },\n [onHeaderChange],\n );\n\n const isDayFocused = React.useCallback(\n (day: Date) => Boolean(focusedDay && isSameDay(day, focusedDay)),\n [focusedDay],\n );\n\n const isDayDisabled = React.useCallback(\n (day: Date, withTime?: boolean) => {\n const now = new Date();\n if (shouldDisableDate) {\n return shouldDisableDate(day);\n }\n if (disableFuture) {\n return isAfter(startOfDay(day), now);\n }\n if (disablePast) {\n return isBefore(endOfDay(day), now);\n }\n if (minDateTime || maxDateTime) {\n return isDayMinMaxRestricted(day, { min: minDateTime, max: maxDateTime, withTime });\n }\n\n return false;\n },\n [disableFuture, disablePast, shouldDisableDate, minDateTime, maxDateTime],\n );\n\n const isMonthDisabled = React.useCallback(\n (month: number, year?: number): boolean => {\n const now = new Date();\n year = year || viewDate.getFullYear();\n const minMonth = minDateTime ? minDateTime.getMonth() : 0;\n const maxMonth = maxDateTime ? maxDateTime.getMonth() : 11;\n const minYear = minDateTime?.getFullYear() || DEFAULT_MIN_YEAR;\n const maxYear = maxDateTime?.getFullYear() || DEFAULT_MAX_YEAR;\n\n let isDisabled =\n year >= minYear && year <= maxYear\n ? (year === minYear && minMonth > month) || (year === maxYear && month > maxMonth)\n : true;\n\n if (disableFuture) {\n isDisabled =\n isDisabled ||\n (year === now.getFullYear() ? month > now.getMonth() : year > now.getFullYear());\n }\n if (disablePast) {\n isDisabled =\n isDisabled ||\n (year === now.getFullYear() ? month < now.getMonth() : year < now.getFullYear());\n }\n\n return isDisabled;\n },\n [disableFuture, disablePast, viewDate, minDateTime, maxDateTime],\n );\n\n const isYearDisabled = React.useCallback(\n (year: number): boolean => {\n const now = new Date();\n const minYear = minDateTime?.getFullYear() || DEFAULT_MIN_YEAR;\n const maxYear = maxDateTime?.getFullYear() || DEFAULT_MAX_YEAR;\n\n let isDisabled = minYear > year || year > maxYear;\n if (disableFuture) {\n isDisabled = isDisabled || year > now.getFullYear();\n }\n if (disablePast) {\n isDisabled = isDisabled || year < now.getFullYear();\n }\n\n return isDisabled;\n },\n [disableFuture, disablePast, minDateTime, maxDateTime],\n );\n\n return {\n viewDate,\n setViewDate: handleSetViewDate,\n setPrevMonth,\n setNextMonth,\n focusedDay,\n setFocusedDay,\n isDayFocused,\n isDayDisabled,\n isMonthDisabled,\n isYearDisabled,\n };\n}\n"],"names":["React","addMonths","endOfDay","isAfter","isBefore","isSameDay","startOfDay","subMonths","DEFAULT_MAX_YEAR","DEFAULT_MIN_YEAR","isDayMinMaxRestricted","useCalendar","value","disablePast","disableFuture","shouldDisableDate","onHeaderChange","onNextMonth","onPrevMonth","minDateTime","maxDateTime","Array","viewDate","setViewDate","useState","isArray","Date","focusedDay","setFocusedDay","setPrevMonth","useCallback","setNextMonth","handleSetViewDate","isDayFocused","day","Boolean","isDayDisabled","withTime","now","min","max","isMonthDisabled","month","year","getFullYear","minMonth","getMonth","maxMonth","minYear","maxYear","isDisabled","isYearDisabled"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"useDateInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useDateInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,wBAAwB,CAAC,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC;IAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,EACrD,UAAU,EACV,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,cAAc,EACd,OAAO,EACP,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,qBAAqB,EACrB,UAAU,GACX,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAClC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvE,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IACjE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,kBAAkB,EAAE,MAAM,OAAO,CAAC;CACnC,
|
|
1
|
+
{"version":3,"file":"useDateInput.d.ts","sourceRoot":"","sources":["../../src/hooks/useDateInput.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,wBAAwB,CAAC,CAAC,EAAE,CAAC;IAC5C,UAAU,EAAE,MAAM,CAAC;IACnB,IAAI,EAAE,KAAK,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC;IACvC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;IACjB,cAAc,EAAE,CAAC,KAAK,EAAE,MAAM,KAAK;QACjC,MAAM,EAAE,MAAM,CAAC;QACf,GAAG,EAAE,MAAM,CAAC;QACZ,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,qBAAqB,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,IAAI,CAAC;IACjD,gBAAgB,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,KAAK,MAAM,EAAE,CAAC;IAC7D,OAAO,EAAE,MAAM,IAAI,CAAC;IACpB,qBAAqB,CAAC,EAAE,CAAC,MAAM,EAAE,OAAO,KAAK,IAAI,CAAC;IAClD,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,wBAAgB,YAAY,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,EAAE,EACrD,UAAU,EACV,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,cAAc,EACd,OAAO,EACP,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,EACL,qBAAqB,EACrB,UAAU,GACX,EAAE,wBAAwB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG;IAClC,OAAO,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAChD,WAAW,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACpD,IAAI,EAAE,OAAO,CAAC;IACd,YAAY,EAAE,MAAM,IAAI,CAAC;IACzB,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,cAAc,EAAE,MAAM,IAAI,CAAC;IAC3B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,cAAc,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,iBAAiB,EAAE,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;IACvE,aAAa,EAAE,CAAC,CAAC,EAAE,KAAK,CAAC,aAAa,CAAC,eAAe,CAAC,KAAK,IAAI,CAAC;IACjE,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,gBAAgB,EAAE,MAAM,IAAI,CAAC;IAC7B,oBAAoB,EAAE,MAAM,IAAI,CAAC;IACjC,kBAAkB,EAAE,MAAM,OAAO,CAAC;CACnC,CAgOA"}
|
|
@@ -42,31 +42,38 @@ export function useDateInput({ maxElement, refs, autoFocus, disabled, elementsCo
|
|
|
42
42
|
openCalendar,
|
|
43
43
|
accessible
|
|
44
44
|
]);
|
|
45
|
-
const
|
|
46
|
-
if (open) {
|
|
47
|
-
_onCalendarClose();
|
|
48
|
-
} else {
|
|
49
|
-
_onCalendarOpen();
|
|
50
|
-
}
|
|
51
|
-
}, [
|
|
52
|
-
open,
|
|
53
|
-
_onCalendarOpen,
|
|
54
|
-
_onCalendarClose
|
|
55
|
-
]);
|
|
56
|
-
const removeFocusFromField = React.useCallback(()=>{
|
|
45
|
+
const resetFocusedElement = React.useCallback(()=>{
|
|
57
46
|
if (focusedElement !== null) {
|
|
58
47
|
var _window_getSelection;
|
|
59
48
|
setFocusedElement(null);
|
|
60
49
|
(_window_getSelection = window.getSelection()) === null || _window_getSelection === void 0 ? void 0 : _window_getSelection.removeAllRanges();
|
|
61
50
|
setInternalValue(getInternalValue(value));
|
|
62
51
|
}
|
|
63
|
-
_onCalendarClose();
|
|
64
52
|
}, [
|
|
65
|
-
|
|
66
|
-
window,
|
|
53
|
+
focusedElement,
|
|
67
54
|
getInternalValue,
|
|
68
55
|
value,
|
|
69
|
-
|
|
56
|
+
window
|
|
57
|
+
]);
|
|
58
|
+
const removeFocusFromField = React.useCallback(()=>{
|
|
59
|
+
resetFocusedElement();
|
|
60
|
+
_onCalendarClose();
|
|
61
|
+
}, [
|
|
62
|
+
resetFocusedElement,
|
|
63
|
+
_onCalendarClose
|
|
64
|
+
]);
|
|
65
|
+
const toggleCalendar = useCallback(()=>{
|
|
66
|
+
resetFocusedElement();
|
|
67
|
+
if (open) {
|
|
68
|
+
_onCalendarClose();
|
|
69
|
+
} else {
|
|
70
|
+
_onCalendarOpen();
|
|
71
|
+
}
|
|
72
|
+
}, [
|
|
73
|
+
resetFocusedElement,
|
|
74
|
+
open,
|
|
75
|
+
_onCalendarClose,
|
|
76
|
+
_onCalendarOpen
|
|
70
77
|
]);
|
|
71
78
|
const handleClickOutside = React.useCallback((e)=>{
|
|
72
79
|
var _rootRef_current, _calendarRef_current;
|
|
@@ -178,13 +185,17 @@ export function useDateInput({ maxElement, refs, autoFocus, disabled, elementsCo
|
|
|
178
185
|
_value[focusedElement] = String(currentValue >= config.max ? config.min : currentValue + 1).padStart(config.length, '0');
|
|
179
186
|
} else if (e.key === 'ArrowLeft' || e.key === 'Left' || e.key === 'Tab' && e.shiftKey) {
|
|
180
187
|
if (focusedElement <= 0) {
|
|
181
|
-
|
|
188
|
+
if (e.key === 'Tab') {
|
|
189
|
+
removeFocusFromField();
|
|
190
|
+
}
|
|
182
191
|
return;
|
|
183
192
|
}
|
|
184
193
|
setFocusedElement(focusedElement - 1);
|
|
185
194
|
} else if (e.key === 'ArrowRight' || e.key === 'Right' || e.key === 'Tab') {
|
|
186
195
|
if (focusedElement >= maxElement) {
|
|
187
|
-
|
|
196
|
+
if (e.key === 'Tab') {
|
|
197
|
+
removeFocusFromField();
|
|
198
|
+
}
|
|
188
199
|
return;
|
|
189
200
|
}
|
|
190
201
|
setFocusedElement(focusedElement + 1);
|