@vkontakte/vkui 7.3.8 → 7.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/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/HorizontalScroll/HorizontalScroll.module.css +2 -3
- package/dist/cssm/components/IconButton/IconButton.js.map +1 -1
- package/dist/cssm/components/ImageBase/ImageBase.module.css +2 -3
- 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/HorizontalScroll/HorizontalScroll.module.css +2 -3
- package/src/components/HorizontalScroll/HorizontalScroll.module.css.d.ts.map +1 -1
- package/src/components/IconButton/IconButton.tsx +2 -2
- package/src/components/ImageBase/ImageBase.module.css +2 -3
- package/src/components/ImageBase/ImageBase.module.css.d.ts.map +1 -1
- 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
|
@@ -1,12 +1,14 @@
|
|
|
1
1
|
import * as React from 'react';
|
|
2
2
|
import { classNames, hasReactNode } from '@vkontakte/vkjs';
|
|
3
3
|
import { defineComponentDisplayNames } from '../../lib/react/defineComponentDisplayNames';
|
|
4
|
+
import { animationVisibilityDelayStyles } from '../../styles/animationVisibilityDelay';
|
|
4
5
|
import type { HTMLAttributesWithRootRef } from '../../types';
|
|
5
6
|
import { RootComponent } from '../RootComponent/RootComponent';
|
|
6
7
|
import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
|
|
7
8
|
import { SpinnerAnimation } from './SpinnerAnimation';
|
|
8
9
|
import { Icon16Spinner, Icon24Spinner, Icon32Spinner, Icon44Spinner } from './icons';
|
|
9
10
|
import styles from './Spinner.module.css';
|
|
11
|
+
import stylesDelay from '../../styles/animationVisibilityDelay.module.css';
|
|
10
12
|
|
|
11
13
|
const spinnerIconMap = {
|
|
12
14
|
s: Icon16Spinner,
|
|
@@ -28,6 +30,10 @@ export interface SpinnerProps extends HTMLAttributesWithRootRef<HTMLSpanElement>
|
|
|
28
30
|
* Задать цвет можно будет через свойство color родителя.
|
|
29
31
|
*/
|
|
30
32
|
noColor?: boolean;
|
|
33
|
+
/**
|
|
34
|
+
* Задерживает отрисовку элемента на заданное количество миллисекунд.
|
|
35
|
+
*/
|
|
36
|
+
visibilityDelay?: number;
|
|
31
37
|
}
|
|
32
38
|
|
|
33
39
|
/**
|
|
@@ -40,6 +46,7 @@ export const Spinner = React.memo(
|
|
|
40
46
|
children = 'Загружается...',
|
|
41
47
|
disableAnimation = false,
|
|
42
48
|
noColor = false,
|
|
49
|
+
visibilityDelay,
|
|
43
50
|
...restProps
|
|
44
51
|
}: SpinnerProps) => {
|
|
45
52
|
const SpinnerIcon = spinnerIconMap[size];
|
|
@@ -49,7 +56,12 @@ export const Spinner = React.memo(
|
|
|
49
56
|
Component="span"
|
|
50
57
|
role="status"
|
|
51
58
|
{...restProps}
|
|
52
|
-
baseClassName={classNames(
|
|
59
|
+
baseClassName={classNames(
|
|
60
|
+
styles.host,
|
|
61
|
+
noColor && styles.noColor,
|
|
62
|
+
visibilityDelay && stylesDelay.visibilityDelay,
|
|
63
|
+
)}
|
|
64
|
+
baseStyle={animationVisibilityDelayStyles(visibilityDelay)}
|
|
53
65
|
>
|
|
54
66
|
<SpinnerIcon>{disableAnimation ? null : <SpinnerAnimation size={size} />}</SpinnerIcon>
|
|
55
67
|
{hasReactNode(children) && <VisuallyHidden>{children}</VisuallyHidden>}
|
|
@@ -5,7 +5,7 @@ import { Icon16Dropdown } from '@vkontakte/icons';
|
|
|
5
5
|
import { classNames } from '@vkontakte/vkjs';
|
|
6
6
|
import { useAdaptivity } from '../../hooks/useAdaptivity';
|
|
7
7
|
import type { HasChildren, HasComponent } from '../../types';
|
|
8
|
-
import { Tappable, type
|
|
8
|
+
import { Tappable, type TappableOmitProps } from '../Tappable/Tappable';
|
|
9
9
|
import { Caption } from '../Typography/Caption/Caption';
|
|
10
10
|
import { Subhead } from '../Typography/Subhead/Subhead';
|
|
11
11
|
import styles from './SubnavigationButton.module.css';
|
|
@@ -32,7 +32,7 @@ const sizeYClassNames = {
|
|
|
32
32
|
compact: styles.sizeYCompact,
|
|
33
33
|
};
|
|
34
34
|
|
|
35
|
-
export interface SubnavigationButtonProps extends Omit<
|
|
35
|
+
export interface SubnavigationButtonProps extends Omit<TappableOmitProps, 'size'> {
|
|
36
36
|
/**
|
|
37
37
|
* Стиль отображения кнопки.
|
|
38
38
|
*/
|
|
@@ -7,6 +7,8 @@ import { usePlatform } from '../../hooks/usePlatform';
|
|
|
7
7
|
import { useTabsNavigation } from '../../hooks/useTabsNavigation';
|
|
8
8
|
import type { HTMLAttributesWithRootRef } from '../../types';
|
|
9
9
|
import { RootComponent } from '../RootComponent/RootComponent';
|
|
10
|
+
import { useTabsController } from './TabsController';
|
|
11
|
+
import { TabsModeContext } from './TabsModeContext';
|
|
10
12
|
import styles from './Tabs.module.css';
|
|
11
13
|
|
|
12
14
|
export interface TabsProps extends HTMLAttributesWithRootRef<HTMLDivElement> {
|
|
@@ -33,27 +35,20 @@ export interface TabsProps extends HTMLAttributesWithRootRef<HTMLDivElement> {
|
|
|
33
35
|
* либо выравниваются по контенту соответственно.
|
|
34
36
|
*/
|
|
35
37
|
layoutFillMode?: 'auto' | 'stretched' | 'shrinked';
|
|
38
|
+
/**
|
|
39
|
+
* Идентификатор выбранной вкладки. Чтобы свойство работало корректно, у каждого `TabsItem` должно быть прокинуто свойство `id`.
|
|
40
|
+
*/
|
|
41
|
+
selectedId?: string;
|
|
42
|
+
/**
|
|
43
|
+
* Идентификатор выбранной вкладки по умолчанию. Чтобы свойство работало корректно, у каждого `TabsItem` должно быть прокинуто свойство `id`.
|
|
44
|
+
*/
|
|
45
|
+
defaultSelectedId?: string;
|
|
46
|
+
/**
|
|
47
|
+
* Обработчик изменения выбранной вкладки. Чтобы свойство работало корректно, у каждого `TabsItem` должно быть прокинуто свойство `id`.
|
|
48
|
+
*/
|
|
49
|
+
onSelectedIdChange?: (id: string) => void;
|
|
36
50
|
}
|
|
37
51
|
|
|
38
|
-
/* eslint-disable jsdoc/require-jsdoc */
|
|
39
|
-
export interface TabsContextProps {
|
|
40
|
-
mode: TabsProps['mode'];
|
|
41
|
-
withGaps: boolean;
|
|
42
|
-
layoutFillMode: NonNullable<TabsProps['layoutFillMode']>;
|
|
43
|
-
withScrollToSelectedTab: TabsProps['withScrollToSelectedTab'];
|
|
44
|
-
scrollBehaviorToSelectedTab: Required<TabsProps['scrollBehaviorToSelectedTab']>;
|
|
45
|
-
}
|
|
46
|
-
/* eslint-enable jsdoc/require-jsdoc */
|
|
47
|
-
|
|
48
|
-
export const TabsModeContext: React.Context<TabsContextProps> =
|
|
49
|
-
React.createContext<TabsContextProps>({
|
|
50
|
-
mode: 'default',
|
|
51
|
-
withGaps: false,
|
|
52
|
-
layoutFillMode: 'auto',
|
|
53
|
-
withScrollToSelectedTab: false,
|
|
54
|
-
scrollBehaviorToSelectedTab: 'nearest',
|
|
55
|
-
});
|
|
56
|
-
|
|
57
52
|
/**
|
|
58
53
|
* @see https://vkcom.github.io/VKUI/#/Tabs
|
|
59
54
|
*/
|
|
@@ -64,8 +59,16 @@ export const Tabs = ({
|
|
|
64
59
|
withScrollToSelectedTab,
|
|
65
60
|
scrollBehaviorToSelectedTab = 'nearest',
|
|
66
61
|
layoutFillMode = 'auto',
|
|
62
|
+
selectedId,
|
|
63
|
+
defaultSelectedId,
|
|
64
|
+
onSelectedIdChange,
|
|
67
65
|
...restProps
|
|
68
66
|
}: TabsProps): React.ReactNode => {
|
|
67
|
+
const controller = useTabsController({
|
|
68
|
+
selectedId,
|
|
69
|
+
defaultSelectedId,
|
|
70
|
+
onSelectedIdChange,
|
|
71
|
+
});
|
|
69
72
|
const platform = usePlatform();
|
|
70
73
|
const direction = useConfigDirection();
|
|
71
74
|
const isTabFlow = role === 'tablist';
|
|
@@ -93,6 +96,7 @@ export const Tabs = ({
|
|
|
93
96
|
layoutFillMode,
|
|
94
97
|
withScrollToSelectedTab,
|
|
95
98
|
scrollBehaviorToSelectedTab,
|
|
99
|
+
controller,
|
|
96
100
|
}}
|
|
97
101
|
>
|
|
98
102
|
{children}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { useCustomEnsuredControl } from '../../hooks/useEnsuredControl';
|
|
2
|
+
import { useStableCallback } from '../../hooks/useStableCallback';
|
|
3
|
+
import { type TabsProps } from './Tabs';
|
|
4
|
+
|
|
5
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
6
|
+
export type TabsController = {
|
|
7
|
+
onChange: (id: string) => void;
|
|
8
|
+
selectedTab: string;
|
|
9
|
+
};
|
|
10
|
+
/* eslint-enable jsdoc/require-jsdoc */
|
|
11
|
+
|
|
12
|
+
export const useTabsController = ({
|
|
13
|
+
selectedId,
|
|
14
|
+
defaultSelectedId,
|
|
15
|
+
onSelectedIdChange: onSelectedIdChangeProp,
|
|
16
|
+
}: Pick<
|
|
17
|
+
TabsProps,
|
|
18
|
+
'selectedId' | 'defaultSelectedId' | 'onSelectedIdChange'
|
|
19
|
+
>): TabsController | null => {
|
|
20
|
+
const onSelectedIdChange = useStableCallback(
|
|
21
|
+
(id: string | undefined) => id && onSelectedIdChangeProp?.(id),
|
|
22
|
+
);
|
|
23
|
+
|
|
24
|
+
const [value, onChange] = useCustomEnsuredControl<string | undefined>({
|
|
25
|
+
onChange: onSelectedIdChange,
|
|
26
|
+
value: selectedId,
|
|
27
|
+
defaultValue: defaultSelectedId,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
if ((!selectedId && !defaultSelectedId) || !value) {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
return {
|
|
34
|
+
onChange,
|
|
35
|
+
selectedTab: value,
|
|
36
|
+
};
|
|
37
|
+
};
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type TabsProps } from './Tabs';
|
|
3
|
+
import { type TabsController } from './TabsController';
|
|
4
|
+
|
|
5
|
+
/* eslint-disable jsdoc/require-jsdoc */
|
|
6
|
+
export interface TabsContextProps {
|
|
7
|
+
mode: TabsProps['mode'];
|
|
8
|
+
withGaps: boolean;
|
|
9
|
+
layoutFillMode: NonNullable<TabsProps['layoutFillMode']>;
|
|
10
|
+
withScrollToSelectedTab: TabsProps['withScrollToSelectedTab'];
|
|
11
|
+
scrollBehaviorToSelectedTab: Required<TabsProps['scrollBehaviorToSelectedTab']>;
|
|
12
|
+
controller: TabsController | null;
|
|
13
|
+
}
|
|
14
|
+
/* eslint-enable jsdoc/require-jsdoc */
|
|
15
|
+
|
|
16
|
+
export const TabsModeContext: React.Context<TabsContextProps> =
|
|
17
|
+
React.createContext<TabsContextProps>({
|
|
18
|
+
mode: 'default',
|
|
19
|
+
withGaps: false,
|
|
20
|
+
layoutFillMode: 'auto',
|
|
21
|
+
withScrollToSelectedTab: false,
|
|
22
|
+
scrollBehaviorToSelectedTab: 'nearest',
|
|
23
|
+
controller: null,
|
|
24
|
+
});
|
|
@@ -8,8 +8,8 @@ import { usePrevious } from '../../hooks/usePrevious';
|
|
|
8
8
|
import { useDOM } from '../../lib/dom';
|
|
9
9
|
import { warnOnce } from '../../lib/warnOnce';
|
|
10
10
|
import type { AnchorHTMLAttributesOnly, HTMLAttributesWithRootRef } from '../../types';
|
|
11
|
-
import { type TabsContextProps, TabsModeContext } from '../Tabs/
|
|
12
|
-
import { Tappable, type
|
|
11
|
+
import { type TabsContextProps, TabsModeContext } from '../Tabs/TabsModeContext';
|
|
12
|
+
import { Tappable, type TappableOmitProps } from '../Tappable/Tappable';
|
|
13
13
|
import { Headline } from '../Typography/Headline/Headline';
|
|
14
14
|
import { Subhead } from '../Typography/Subhead/Subhead';
|
|
15
15
|
import { VisuallyHidden } from '../VisuallyHidden/VisuallyHidden';
|
|
@@ -35,7 +35,7 @@ export interface TabsItemProps
|
|
|
35
35
|
extends HTMLAttributesWithRootRef<HTMLElement>,
|
|
36
36
|
AnchorHTMLAttributesOnly,
|
|
37
37
|
Pick<
|
|
38
|
-
|
|
38
|
+
TappableOmitProps,
|
|
39
39
|
| 'Component'
|
|
40
40
|
| 'activeMode'
|
|
41
41
|
| 'hoverMode'
|
|
@@ -86,7 +86,7 @@ export const TabsItem = ({
|
|
|
86
86
|
children,
|
|
87
87
|
status,
|
|
88
88
|
after,
|
|
89
|
-
selected = false,
|
|
89
|
+
selected: selectedProp = false,
|
|
90
90
|
role = 'tab',
|
|
91
91
|
tabIndex: tabIndexProp,
|
|
92
92
|
getRootRef,
|
|
@@ -94,6 +94,8 @@ export const TabsItem = ({
|
|
|
94
94
|
activeMode = '',
|
|
95
95
|
hasActive = false,
|
|
96
96
|
focusVisibleMode = 'inside',
|
|
97
|
+
id,
|
|
98
|
+
onClick,
|
|
97
99
|
...restProps
|
|
98
100
|
}: TabsItemProps): React.ReactNode => {
|
|
99
101
|
const { sizeY = 'none' } = useAdaptivity();
|
|
@@ -103,11 +105,14 @@ export const TabsItem = ({
|
|
|
103
105
|
layoutFillMode,
|
|
104
106
|
scrollBehaviorToSelectedTab,
|
|
105
107
|
withScrollToSelectedTab,
|
|
108
|
+
controller,
|
|
106
109
|
}: TabsContextProps = React.useContext(TabsModeContext);
|
|
107
110
|
let statusComponent = null;
|
|
108
111
|
|
|
109
112
|
const isTabFlow = role === 'tab';
|
|
110
113
|
|
|
114
|
+
const selected = selectedProp || (!!id && controller?.selectedTab === id);
|
|
115
|
+
|
|
111
116
|
if (hasReactNode(status)) {
|
|
112
117
|
statusComponent =
|
|
113
118
|
typeof status === 'number' ? (
|
|
@@ -130,7 +135,7 @@ export const TabsItem = ({
|
|
|
130
135
|
if (process.env.NODE_ENV === 'development' && isTabFlow) {
|
|
131
136
|
if (!restProps['aria-controls']) {
|
|
132
137
|
warn(`Передайте в "aria-controls" id контролируемого блока`, 'warn');
|
|
133
|
-
} else if (!
|
|
138
|
+
} else if (!id) {
|
|
134
139
|
warn(
|
|
135
140
|
`Передайте "id" компоненту для использования в "aria-labelledby" контролируемого блока`,
|
|
136
141
|
'warn',
|
|
@@ -183,6 +188,16 @@ export const TabsItem = ({
|
|
|
183
188
|
[rootRef, document, shouldScrollToSelected, scrollBehaviorToSelectedTab],
|
|
184
189
|
);
|
|
185
190
|
|
|
191
|
+
const _onClick: React.MouseEventHandler<HTMLElement> = React.useCallback(
|
|
192
|
+
(e) => {
|
|
193
|
+
onClick?.(e);
|
|
194
|
+
if (id) {
|
|
195
|
+
controller?.onChange(id);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
[id, onClick, controller],
|
|
199
|
+
);
|
|
200
|
+
|
|
186
201
|
return (
|
|
187
202
|
<Tappable
|
|
188
203
|
getRootRef={rootRef}
|
|
@@ -201,6 +216,8 @@ export const TabsItem = ({
|
|
|
201
216
|
withGaps && styles.withGaps,
|
|
202
217
|
layoutFillMode !== 'auto' && fillModeClassNames[layoutFillMode],
|
|
203
218
|
)}
|
|
219
|
+
onClick={_onClick}
|
|
220
|
+
id={id}
|
|
204
221
|
{...restProps}
|
|
205
222
|
>
|
|
206
223
|
{before && <div className={styles.before}>{before}</div>}
|
|
@@ -45,6 +45,11 @@ export interface TappableProps extends ClickableProps, StateProps {
|
|
|
45
45
|
hoverClassName?: string; // Переделать на Omit<ClickableProps, 'activeClassName' | 'hoverClassName'>
|
|
46
46
|
}
|
|
47
47
|
|
|
48
|
+
// TODO [>=8]: = React.AllHTMLAttributes<HTMLElement> & HasRootRef<HTMLElement>
|
|
49
|
+
//
|
|
50
|
+
// NOTE: Возможно стоит вообще запретить компонентам расширяться от TappableProps?
|
|
51
|
+
export type TappableOmitProps = Omit<TappableProps, 'DefaultComponent'>;
|
|
52
|
+
|
|
48
53
|
export const Tappable = ({
|
|
49
54
|
baseClassName,
|
|
50
55
|
borderRadiusMode = 'auto',
|
|
@@ -6,7 +6,7 @@ import {
|
|
|
6
6
|
AdaptiveIconRenderer,
|
|
7
7
|
type AdaptiveIconRendererProps,
|
|
8
8
|
} from '../AdaptiveIconRenderer/AdaptiveIconRenderer';
|
|
9
|
-
import { Tappable, type
|
|
9
|
+
import { Tappable, type TappableOmitProps } from '../Tappable/Tappable';
|
|
10
10
|
import styles from './ToolButton.module.css';
|
|
11
11
|
|
|
12
12
|
const stylesMode = {
|
|
@@ -31,7 +31,7 @@ const sizeYClassNames = {
|
|
|
31
31
|
regular: styles.sizeYRegular,
|
|
32
32
|
};
|
|
33
33
|
|
|
34
|
-
export interface ToolButtonProps extends
|
|
34
|
+
export interface ToolButtonProps extends TappableOmitProps, AdaptiveIconRendererProps {
|
|
35
35
|
/**
|
|
36
36
|
* Режим отображения компонента.
|
|
37
37
|
*/
|
package/src/hooks/useCalendar.ts
CHANGED
|
@@ -35,11 +35,8 @@ export function useCalendar({
|
|
|
35
35
|
setNextMonth: () => void;
|
|
36
36
|
focusedDay: Date | undefined;
|
|
37
37
|
setFocusedDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
|
|
38
|
-
focusableDay: Date | undefined;
|
|
39
|
-
setFocusableDay: React.Dispatch<React.SetStateAction<Date | undefined>>;
|
|
40
38
|
isDayFocused: (day: Date) => boolean;
|
|
41
39
|
isDayDisabled: (day: Date, withTime?: boolean) => boolean;
|
|
42
|
-
resetSelectedDay: () => void;
|
|
43
40
|
isMonthDisabled: (month: number, year?: number) => boolean;
|
|
44
41
|
isYearDisabled: (year: number) => boolean;
|
|
45
42
|
} {
|
|
@@ -49,8 +46,6 @@ export function useCalendar({
|
|
|
49
46
|
// соответствует дню, на котором сейчас есть фокус
|
|
50
47
|
// меняется при переключении дней с помощью стрелок
|
|
51
48
|
const [focusedDay, setFocusedDay] = React.useState<Date>();
|
|
52
|
-
// соотвествует дню, на котором можно сфокусироваться с помощью Tab
|
|
53
|
-
const [focusableDay, setFocusableDay] = React.useState<Date>();
|
|
54
49
|
|
|
55
50
|
const setPrevMonth = React.useCallback(() => {
|
|
56
51
|
onPrevMonth?.();
|
|
@@ -144,10 +139,6 @@ export function useCalendar({
|
|
|
144
139
|
[disableFuture, disablePast, minDateTime, maxDateTime],
|
|
145
140
|
);
|
|
146
141
|
|
|
147
|
-
const resetSelectedDay = React.useCallback(() => {
|
|
148
|
-
setFocusedDay(undefined);
|
|
149
|
-
}, [setFocusedDay]);
|
|
150
|
-
|
|
151
142
|
return {
|
|
152
143
|
viewDate,
|
|
153
144
|
setViewDate: handleSetViewDate,
|
|
@@ -155,11 +146,8 @@ export function useCalendar({
|
|
|
155
146
|
setNextMonth,
|
|
156
147
|
focusedDay,
|
|
157
148
|
setFocusedDay,
|
|
158
|
-
focusableDay,
|
|
159
|
-
setFocusableDay,
|
|
160
149
|
isDayFocused,
|
|
161
150
|
isDayDisabled,
|
|
162
|
-
resetSelectedDay,
|
|
163
151
|
isMonthDisabled,
|
|
164
152
|
isYearDisabled,
|
|
165
153
|
};
|
|
@@ -83,22 +83,27 @@ export function useDateInput<T extends HTMLElement, D>({
|
|
|
83
83
|
}
|
|
84
84
|
}, [onCalendarOpenChanged, open, openCalendar, accessible]);
|
|
85
85
|
|
|
86
|
-
const
|
|
87
|
-
if (open) {
|
|
88
|
-
_onCalendarClose();
|
|
89
|
-
} else {
|
|
90
|
-
_onCalendarOpen();
|
|
91
|
-
}
|
|
92
|
-
}, [open, _onCalendarOpen, _onCalendarClose]);
|
|
93
|
-
|
|
94
|
-
const removeFocusFromField = React.useCallback(() => {
|
|
86
|
+
const resetFocusedElement = React.useCallback(() => {
|
|
95
87
|
if (focusedElement !== null) {
|
|
96
88
|
setFocusedElement(null);
|
|
97
89
|
window!.getSelection()?.removeAllRanges();
|
|
98
90
|
setInternalValue(getInternalValue(value));
|
|
99
91
|
}
|
|
92
|
+
}, [focusedElement, getInternalValue, value, window]);
|
|
93
|
+
|
|
94
|
+
const removeFocusFromField = React.useCallback(() => {
|
|
95
|
+
resetFocusedElement();
|
|
100
96
|
_onCalendarClose();
|
|
101
|
-
}, [
|
|
97
|
+
}, [resetFocusedElement, _onCalendarClose]);
|
|
98
|
+
|
|
99
|
+
const toggleCalendar = useCallback(() => {
|
|
100
|
+
resetFocusedElement();
|
|
101
|
+
if (open) {
|
|
102
|
+
_onCalendarClose();
|
|
103
|
+
} else {
|
|
104
|
+
_onCalendarOpen();
|
|
105
|
+
}
|
|
106
|
+
}, [resetFocusedElement, open, _onCalendarClose, _onCalendarOpen]);
|
|
102
107
|
|
|
103
108
|
const handleClickOutside = React.useCallback(
|
|
104
109
|
(e: MouseEvent) => {
|
|
@@ -212,13 +217,17 @@ export function useDateInput<T extends HTMLElement, D>({
|
|
|
212
217
|
).padStart(config.length, '0');
|
|
213
218
|
} else if (e.key === 'ArrowLeft' || e.key === 'Left' || (e.key === 'Tab' && e.shiftKey)) {
|
|
214
219
|
if (focusedElement <= 0) {
|
|
215
|
-
|
|
220
|
+
if (e.key === 'Tab') {
|
|
221
|
+
removeFocusFromField();
|
|
222
|
+
}
|
|
216
223
|
return;
|
|
217
224
|
}
|
|
218
225
|
setFocusedElement(focusedElement - 1);
|
|
219
226
|
} else if (e.key === 'ArrowRight' || e.key === 'Right' || e.key === 'Tab') {
|
|
220
227
|
if (focusedElement >= maxElement) {
|
|
221
|
-
|
|
228
|
+
if (e.key === 'Tab') {
|
|
229
|
+
removeFocusFromField();
|
|
230
|
+
}
|
|
222
231
|
return;
|
|
223
232
|
}
|
|
224
233
|
|
|
@@ -114,6 +114,10 @@ export type UseFocusTrapProps = {
|
|
|
114
114
|
* @default true
|
|
115
115
|
*/
|
|
116
116
|
captureEscapeKeyboardEvent?: boolean;
|
|
117
|
+
/**
|
|
118
|
+
* Пользовательские опции для MutationObserver, который отслеживает изменения DOM внутри компонента и пересчитывает ноды для фокуса.
|
|
119
|
+
*/
|
|
120
|
+
mutationObserverOptions?: MutationObserverInit;
|
|
117
121
|
};
|
|
118
122
|
|
|
119
123
|
/**
|
|
@@ -129,6 +133,7 @@ export const useFocusTrap = (
|
|
|
129
133
|
timeout = 0,
|
|
130
134
|
onClose,
|
|
131
135
|
captureEscapeKeyboardEvent = true,
|
|
136
|
+
mutationObserverOptions,
|
|
132
137
|
}: UseFocusTrapProps,
|
|
133
138
|
) => {
|
|
134
139
|
const { document } = useDOM();
|
|
@@ -189,7 +194,11 @@ export const useFocusTrap = (
|
|
|
189
194
|
}
|
|
190
195
|
};
|
|
191
196
|
|
|
192
|
-
useMutationObserver(
|
|
197
|
+
useMutationObserver(
|
|
198
|
+
ref,
|
|
199
|
+
() => ref.current && onMutateParentHandler(ref.current),
|
|
200
|
+
mutationObserverOptions,
|
|
201
|
+
);
|
|
193
202
|
|
|
194
203
|
useIsomorphicLayoutEffect(() => {
|
|
195
204
|
ref.current && recalculateFocusableNodesRef(ref.current);
|
|
@@ -2,9 +2,15 @@ import type * as React from 'react';
|
|
|
2
2
|
import { useIsomorphicLayoutEffect } from '../lib/useIsomorphicLayoutEffect';
|
|
3
3
|
import { useStableCallback } from './useStableCallback';
|
|
4
4
|
|
|
5
|
+
export const DEFAULT_MUTATION_OBSERVER_OPTIONS: MutationObserverInit = {
|
|
6
|
+
subtree: true,
|
|
7
|
+
childList: true,
|
|
8
|
+
};
|
|
9
|
+
|
|
5
10
|
export const useMutationObserver = (
|
|
6
11
|
ref: React.RefObject<HTMLElement | null> | null,
|
|
7
12
|
callback: () => void,
|
|
13
|
+
options: MutationObserverInit = DEFAULT_MUTATION_OBSERVER_OPTIONS,
|
|
8
14
|
): void => {
|
|
9
15
|
const stableCallback = useStableCallback(callback);
|
|
10
16
|
|
|
@@ -13,10 +19,7 @@ export const useMutationObserver = (
|
|
|
13
19
|
return;
|
|
14
20
|
}
|
|
15
21
|
const observer = new MutationObserver(stableCallback);
|
|
16
|
-
observer.observe(ref.current,
|
|
17
|
-
subtree: true,
|
|
18
|
-
childList: true,
|
|
19
|
-
});
|
|
22
|
+
observer.observe(ref.current, options);
|
|
20
23
|
return () => observer.disconnect();
|
|
21
24
|
}, [ref, stableCallback]);
|
|
22
25
|
};
|
package/src/lib/dom.tsx
CHANGED
|
@@ -95,7 +95,13 @@ export function getTransformedParentCoords(element: Element): {
|
|
|
95
95
|
let parentNode = element.parentNode;
|
|
96
96
|
while (parentNode !== null) {
|
|
97
97
|
if (isHTMLElement(parentNode)) {
|
|
98
|
-
|
|
98
|
+
let { transform, willChange } = getComputedStyle(parentNode);
|
|
99
|
+
if (transform === '') {
|
|
100
|
+
transform = 'unset';
|
|
101
|
+
}
|
|
102
|
+
if (willChange === '') {
|
|
103
|
+
willChange = 'unset';
|
|
104
|
+
}
|
|
99
105
|
if (
|
|
100
106
|
!TRANSFORM_DEFAULT_VALUES.includes(transform) ||
|
|
101
107
|
!WILL_CHANGE_DEFAULT_VALUES.includes(willChange)
|
|
@@ -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
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["./animationVisibilityDelay.module.css"],"names":["visibilityDelay"],"mappings":"AAAA;AAAA,E,aAAAA,iB,WAAA;AAAA;AAAA","file":"animationVisibilityDelay.module.css.d.ts","sourceRoot":""}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { type CSSCustomProperties } from '../types';
|
|
2
|
+
|
|
3
|
+
export function animationVisibilityDelayStyles(
|
|
4
|
+
delay: number | undefined,
|
|
5
|
+
): CSSCustomProperties | undefined {
|
|
6
|
+
if (delay === undefined) {
|
|
7
|
+
return undefined;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return {
|
|
11
|
+
'--vkui_internal--animation_delay_visibility': `${delay}ms`,
|
|
12
|
+
};
|
|
13
|
+
}
|