@vkontakte/vkui 7.5.4 → 7.6.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/Calendar/Calendar.js +6 -6
- package/dist/components/Calendar/Calendar.js.map +1 -1
- package/dist/components/CalendarDays/CalendarDays.js +3 -3
- package/dist/components/CalendarDays/CalendarDays.js.map +1 -1
- package/dist/components/CalendarRange/CalendarRange.d.ts.map +1 -1
- package/dist/components/CalendarRange/CalendarRange.js +16 -14
- package/dist/components/CalendarRange/CalendarRange.js.map +1 -1
- package/dist/components/CalendarRange/utils.d.ts.map +1 -1
- package/dist/components/CalendarRange/utils.js +6 -5
- package/dist/components/CalendarRange/utils.js.map +1 -1
- package/dist/components/Cell/Cell.d.ts.map +1 -1
- package/dist/components/Cell/Cell.js +6 -3
- package/dist/components/Cell/Cell.js.map +1 -1
- package/dist/components/CellButtonGroup/CellButtonGroup.d.ts +5 -3
- package/dist/components/CellButtonGroup/CellButtonGroup.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.d.ts +4 -0
- package/dist/components/Checkbox/Checkbox.d.ts.map +1 -1
- package/dist/components/Checkbox/Checkbox.js +4 -2
- package/dist/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts +1 -1
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.d.ts.map +1 -1
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js +6 -3
- package/dist/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
- package/dist/components/ChipsInputBase/Chip/Chip.d.ts +41 -2
- package/dist/components/ChipsInputBase/Chip/Chip.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/Chip/Chip.js +7 -2
- package/dist/components/ChipsInputBase/Chip/Chip.js.map +1 -1
- package/dist/components/ChipsInputBase/types.d.ts +2 -35
- package/dist/components/ChipsInputBase/types.d.ts.map +1 -1
- package/dist/components/ChipsInputBase/types.js.map +1 -1
- package/dist/components/ContentBadge/ContentBadge.d.ts +1 -1
- package/dist/components/ContentBadge/ContentBadge.d.ts.map +1 -1
- package/dist/components/ContentBadge/ContentBadge.js +15 -9
- package/dist/components/ContentBadge/ContentBadge.js.map +1 -1
- package/dist/components/ContentCard/ContentCard.d.ts +1 -1
- 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 +16 -27
- package/dist/components/CustomSelect/CustomSelect.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelect.js +161 -428
- package/dist/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts +3 -1
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.d.ts.map +1 -1
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +25 -5
- package/dist/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
- package/dist/components/CustomSelect/helpers.d.ts +12 -0
- package/dist/components/CustomSelect/helpers.d.ts.map +1 -0
- package/dist/components/CustomSelect/helpers.js +63 -0
- package/dist/components/CustomSelect/helpers.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useAfterItems.d.ts +11 -0
- package/dist/components/CustomSelect/hooks/useAfterItems.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useAfterItems.js +57 -0
- package/dist/components/CustomSelect/hooks/useAfterItems.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useDropdownOpenedController.d.ts +13 -0
- package/dist/components/CustomSelect/hooks/useDropdownOpenedController.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useDropdownOpenedController.js +60 -0
- package/dist/components/CustomSelect/hooks/useDropdownOpenedController.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useFocusedOptionController.d.ts +20 -0
- package/dist/components/CustomSelect/hooks/useFocusedOptionController.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useFocusedOptionController.js +52 -0
- package/dist/components/CustomSelect/hooks/useFocusedOptionController.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useInputKeyboardController.d.ts +13 -0
- package/dist/components/CustomSelect/hooks/useInputKeyboardController.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useInputKeyboardController.js +78 -0
- package/dist/components/CustomSelect/hooks/useInputKeyboardController.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useInputValueController.d.ts +15 -0
- package/dist/components/CustomSelect/hooks/useInputValueController.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useInputValueController.js +43 -0
- package/dist/components/CustomSelect/hooks/useInputValueController.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useScrollListController.d.ts +9 -0
- package/dist/components/CustomSelect/hooks/useScrollListController.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useScrollListController.js +37 -0
- package/dist/components/CustomSelect/hooks/useScrollListController.js.map +1 -0
- package/dist/components/CustomSelect/hooks/useSelectedOptionController.d.ts +18 -0
- package/dist/components/CustomSelect/hooks/useSelectedOptionController.d.ts.map +1 -0
- package/dist/components/CustomSelect/hooks/useSelectedOptionController.js +81 -0
- package/dist/components/CustomSelect/hooks/useSelectedOptionController.js.map +1 -0
- package/dist/components/CustomSelect/types.d.ts +33 -0
- package/dist/components/CustomSelect/types.d.ts.map +1 -0
- package/dist/components/CustomSelect/types.js +3 -0
- package/dist/components/CustomSelect/types.js.map +1 -0
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.d.ts.map +1 -1
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
- package/dist/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/components/DateInput/DateInput.d.ts.map +1 -1
- package/dist/components/DateInput/DateInput.js +3 -2
- package/dist/components/DateInput/DateInput.js.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.d.ts.map +1 -1
- package/dist/components/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/components/ImageBase/ImageBaseBadge/ImageBaseBadge.d.ts +1 -1
- package/dist/components/ImageBase/ImageBaseBadge/ImageBaseBadge.js.map +1 -1
- package/dist/components/MiniInfoCell/MiniInfoCell.d.ts +3 -2
- package/dist/components/MiniInfoCell/MiniInfoCell.d.ts.map +1 -1
- package/dist/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/components/ModalCard/ModalCard.d.ts +1 -1
- package/dist/components/ModalCard/ModalCard.d.ts.map +1 -1
- package/dist/components/ModalCard/ModalCard.js +4 -2
- package/dist/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/components/ModalCard/ModalCardInternal.d.ts +1 -1
- package/dist/components/ModalCard/ModalCardInternal.d.ts.map +1 -1
- package/dist/components/ModalCard/ModalCardInternal.js +5 -3
- package/dist/components/ModalCard/ModalCardInternal.js.map +1 -1
- package/dist/components/ModalCard/types.d.ts +8 -0
- package/dist/components/ModalCard/types.d.ts.map +1 -1
- package/dist/components/ModalCard/types.js.map +1 -1
- package/dist/components/ModalOutlet/ModalOutlet.d.ts +2 -1
- package/dist/components/ModalOutlet/ModalOutlet.d.ts.map +1 -1
- package/dist/components/ModalOutlet/ModalOutlet.js +4 -3
- package/dist/components/ModalOutlet/ModalOutlet.js.map +1 -1
- package/dist/components/ModalPage/ModalPage.d.ts +1 -1
- package/dist/components/ModalPage/ModalPage.d.ts.map +1 -1
- package/dist/components/ModalPage/ModalPage.js +3 -1
- package/dist/components/ModalPage/ModalPage.js.map +1 -1
- package/dist/components/ModalPage/ModalPageInternal.d.ts +1 -1
- package/dist/components/ModalPage/ModalPageInternal.d.ts.map +1 -1
- package/dist/components/ModalPage/ModalPageInternal.js +5 -3
- package/dist/components/ModalPage/ModalPageInternal.js.map +1 -1
- package/dist/components/ModalPage/types.d.ts +8 -0
- package/dist/components/ModalPage/types.d.ts.map +1 -1
- package/dist/components/ModalPage/types.js.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.d.ts +1 -1
- package/dist/components/ModalRoot/ModalRoot.d.ts.map +1 -1
- package/dist/components/ModalRoot/ModalRoot.js +4 -2
- package/dist/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/components/ModalRoot/types.d.ts +6 -0
- package/dist/components/ModalRoot/types.d.ts.map +1 -1
- package/dist/components/ModalRoot/types.js.map +1 -1
- package/dist/components/ModalRoot/useModalManager.d.ts +3 -1
- package/dist/components/ModalRoot/useModalManager.d.ts.map +1 -1
- package/dist/components/ModalRoot/useModalManager.js +2 -1
- package/dist/components/ModalRoot/useModalManager.js.map +1 -1
- package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts +2 -2
- package/dist/components/OnboardingTooltip/OnboardingTooltip.d.ts.map +1 -1
- package/dist/components/OnboardingTooltip/OnboardingTooltip.js +4 -2
- package/dist/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
- package/dist/components/Popover/Popover.d.ts +1 -1
- package/dist/components/Popover/Popover.d.ts.map +1 -1
- package/dist/components/Popover/Popover.js.map +1 -1
- package/dist/components/Popover/usePopover.d.ts +1 -1
- package/dist/components/Popover/usePopover.d.ts.map +1 -1
- package/dist/components/Popover/usePopover.js +3 -1
- package/dist/components/Popover/usePopover.js.map +1 -1
- package/dist/components/Popper/Popper.d.ts +2 -2
- package/dist/components/Popper/Popper.d.ts.map +1 -1
- package/dist/components/Popper/Popper.js +3 -1
- package/dist/components/Popper/Popper.js.map +1 -1
- package/dist/components/Select/Select.d.ts +2 -1
- package/dist/components/Select/Select.d.ts.map +1 -1
- package/dist/components/Select/Select.js +5 -2
- package/dist/components/Select/Select.js.map +1 -1
- package/dist/components/SelectionControl/SelectionControl.d.ts +5 -1
- package/dist/components/SelectionControl/SelectionControl.d.ts.map +1 -1
- package/dist/components/SelectionControl/SelectionControl.js +22 -6
- package/dist/components/SelectionControl/SelectionControl.js.map +1 -1
- package/dist/components/SelectionControl/SelectionControlContext.d.ts +7 -0
- package/dist/components/SelectionControl/SelectionControlContext.d.ts.map +1 -0
- package/dist/components/SelectionControl/SelectionControlContext.js +7 -0
- package/dist/components/SelectionControl/SelectionControlContext.js.map +1 -0
- package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.d.ts.map +1 -1
- package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js +3 -1
- package/dist/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.d.ts.map +1 -1
- package/dist/components/SimpleCell/SimpleCell.js +29 -8
- package/dist/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/components/Skeleton/Skeleton.js +1 -1
- package/dist/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/components/Tabs/Tabs.d.ts.map +1 -1
- package/dist/components/Tabs/Tabs.js +19 -9
- package/dist/components/Tabs/Tabs.js.map +1 -1
- package/dist/components/Tabs/TabsController.d.ts +2 -2
- package/dist/components/Tabs/TabsController.d.ts.map +1 -1
- package/dist/components/Tabs/TabsController.js.map +1 -1
- package/dist/components/Tabs/TabsControllerContext.d.ts +5 -0
- package/dist/components/Tabs/TabsControllerContext.d.ts.map +1 -0
- package/dist/components/Tabs/TabsControllerContext.js +4 -0
- package/dist/components/Tabs/TabsControllerContext.js.map +1 -0
- package/dist/components/Tabs/TabsModeContext.d.ts +0 -2
- package/dist/components/Tabs/TabsModeContext.d.ts.map +1 -1
- package/dist/components/Tabs/TabsModeContext.js +1 -2
- package/dist/components/Tabs/TabsModeContext.js.map +1 -1
- package/dist/components/TabsItem/TabsItem.d.ts.map +1 -1
- package/dist/components/TabsItem/TabsItem.js +3 -1
- package/dist/components/TabsItem/TabsItem.js.map +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts +1 -1
- package/dist/components/Tooltip/Tooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/components/Tooltip/useTooltip.d.ts +1 -1
- package/dist/components/Tooltip/useTooltip.d.ts.map +1 -1
- package/dist/components/Tooltip/useTooltip.js +3 -1
- package/dist/components/Tooltip/useTooltip.js.map +1 -1
- package/dist/components/Typography/Caption/Caption.d.ts +2 -0
- package/dist/components/Typography/Caption/Caption.d.ts.map +1 -1
- package/dist/components/Typography/Caption/Caption.js +4 -1
- package/dist/components/Typography/Caption/Caption.js.map +1 -1
- package/dist/components/Typography/Footnote/Footnote.d.ts +2 -0
- package/dist/components/Typography/Footnote/Footnote.d.ts.map +1 -1
- package/dist/components/Typography/Footnote/Footnote.js +4 -1
- package/dist/components/Typography/Footnote/Footnote.js.map +1 -1
- package/dist/components/Typography/Typography.d.ts +1 -0
- package/dist/components/Typography/Typography.d.ts.map +1 -1
- package/dist/components/Typography/Typography.js +7 -1
- package/dist/components/Typography/Typography.js.map +1 -1
- package/dist/components/View/View.d.ts.map +1 -1
- package/dist/components/View/View.js +2 -1
- package/dist/components/View/View.js.map +1 -1
- package/dist/components/View/ViewInfinite.d.ts.map +1 -1
- package/dist/components/View/ViewInfinite.js +2 -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/Banner/Banner.module.css +1 -6
- package/dist/cssm/components/Calendar/Calendar.js +6 -6
- package/dist/cssm/components/Calendar/Calendar.js.map +1 -1
- package/dist/cssm/components/CalendarDays/CalendarDays.js +3 -3
- package/dist/cssm/components/CalendarDays/CalendarDays.js.map +1 -1
- package/dist/cssm/components/CalendarRange/CalendarRange.js +16 -14
- package/dist/cssm/components/CalendarRange/CalendarRange.js.map +1 -1
- package/dist/cssm/components/CalendarRange/utils.js +6 -5
- package/dist/cssm/components/CalendarRange/utils.js.map +1 -1
- package/dist/cssm/components/Cell/Cell.js +3 -1
- package/dist/cssm/components/Cell/Cell.js.map +1 -1
- package/dist/cssm/components/Checkbox/Checkbox.js +2 -1
- package/dist/cssm/components/Checkbox/Checkbox.js.map +1 -1
- package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js +4 -2
- package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.js.map +1 -1
- package/dist/cssm/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css +11 -2
- package/dist/cssm/components/ChipsInputBase/Chip/Chip.js +6 -2
- package/dist/cssm/components/ChipsInputBase/Chip/Chip.js.map +1 -1
- package/dist/cssm/components/ChipsInputBase/Chip/Chip.module.css +8 -1
- package/dist/cssm/components/ChipsInputBase/types.js.map +1 -1
- package/dist/cssm/components/ContentBadge/ContentBadge.js +14 -8
- package/dist/cssm/components/ContentBadge/ContentBadge.js.map +1 -1
- package/dist/cssm/components/ContentCard/ContentCard.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelect.js +154 -421
- package/dist/cssm/components/CustomSelect/CustomSelect.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js +22 -4
- package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.js.map +1 -1
- package/dist/cssm/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +12 -0
- package/dist/cssm/components/CustomSelect/helpers.js +62 -0
- package/dist/cssm/components/CustomSelect/helpers.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useAfterItems.js +58 -0
- package/dist/cssm/components/CustomSelect/hooks/useAfterItems.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useDropdownOpenedController.js +60 -0
- package/dist/cssm/components/CustomSelect/hooks/useDropdownOpenedController.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useFocusedOptionController.js +52 -0
- package/dist/cssm/components/CustomSelect/hooks/useFocusedOptionController.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useInputKeyboardController.js +78 -0
- package/dist/cssm/components/CustomSelect/hooks/useInputKeyboardController.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useInputValueController.js +43 -0
- package/dist/cssm/components/CustomSelect/hooks/useInputValueController.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useScrollListController.js +37 -0
- package/dist/cssm/components/CustomSelect/hooks/useScrollListController.js.map +1 -0
- package/dist/cssm/components/CustomSelect/hooks/useSelectedOptionController.js +81 -0
- package/dist/cssm/components/CustomSelect/hooks/useSelectedOptionController.js.map +1 -0
- package/dist/cssm/components/CustomSelect/types.js +3 -0
- package/dist/cssm/components/CustomSelect/types.js.map +1 -0
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js +1 -0
- package/dist/cssm/components/CustomSelectDropdown/CustomSelectDropdown.js.map +1 -1
- package/dist/cssm/components/DateInput/DateInput.js +3 -2
- package/dist/cssm/components/DateInput/DateInput.js.map +1 -1
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js +4 -4
- package/dist/cssm/components/DateRangeInput/DateRangeInput.js.map +1 -1
- package/dist/cssm/components/ImageBase/ImageBaseBadge/ImageBaseBadge.js.map +1 -1
- package/dist/cssm/components/MiniInfoCell/MiniInfoCell.js.map +1 -1
- package/dist/cssm/components/ModalCard/ModalCard.js +2 -1
- package/dist/cssm/components/ModalCard/ModalCard.js.map +1 -1
- package/dist/cssm/components/ModalCard/ModalCardInternal.js +3 -2
- package/dist/cssm/components/ModalCard/ModalCardInternal.js.map +1 -1
- package/dist/cssm/components/ModalCard/types.js.map +1 -1
- package/dist/cssm/components/ModalOutlet/ModalOutlet.js +2 -2
- package/dist/cssm/components/ModalOutlet/ModalOutlet.js.map +1 -1
- package/dist/cssm/components/ModalOutlet/ModalOutlet.module.css +4 -0
- package/dist/cssm/components/ModalOverlay/ModalOverlay.module.css +1 -1
- package/dist/cssm/components/ModalPage/ModalPage.js +2 -1
- package/dist/cssm/components/ModalPage/ModalPage.js.map +1 -1
- package/dist/cssm/components/ModalPage/ModalPage.module.css +1 -0
- package/dist/cssm/components/ModalPage/ModalPageInternal.js +3 -2
- package/dist/cssm/components/ModalPage/ModalPageInternal.js.map +1 -1
- package/dist/cssm/components/ModalPage/types.js.map +1 -1
- package/dist/cssm/components/ModalRoot/ModalRoot.js +4 -2
- package/dist/cssm/components/ModalRoot/ModalRoot.js.map +1 -1
- package/dist/cssm/components/ModalRoot/types.js.map +1 -1
- package/dist/cssm/components/ModalRoot/useModalManager.js +2 -1
- package/dist/cssm/components/ModalRoot/useModalManager.js.map +1 -1
- package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js +3 -2
- package/dist/cssm/components/OnboardingTooltip/OnboardingTooltip.js.map +1 -1
- package/dist/cssm/components/Popover/Popover.js.map +1 -1
- package/dist/cssm/components/Popover/usePopover.js +2 -1
- package/dist/cssm/components/Popover/usePopover.js.map +1 -1
- package/dist/cssm/components/Popper/Popper.js +2 -1
- package/dist/cssm/components/Popper/Popper.js.map +1 -1
- package/dist/cssm/components/RichCell/RichCell.module.css +4 -2
- package/dist/cssm/components/Select/Select.js +1 -1
- package/dist/cssm/components/Select/Select.js.map +1 -1
- package/dist/cssm/components/SelectionControl/SelectionControl.js +16 -6
- package/dist/cssm/components/SelectionControl/SelectionControl.js.map +1 -1
- package/dist/cssm/components/SelectionControl/SelectionControl.module.css +6 -3
- package/dist/cssm/components/SelectionControl/SelectionControlContext.js +7 -0
- package/dist/cssm/components/SelectionControl/SelectionControlContext.js.map +1 -0
- package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js +3 -1
- package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.js.map +1 -1
- package/dist/cssm/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css +6 -3
- package/dist/cssm/components/SimpleCell/SimpleCell.js +29 -8
- package/dist/cssm/components/SimpleCell/SimpleCell.js.map +1 -1
- package/dist/cssm/components/Skeleton/Skeleton.js +1 -1
- package/dist/cssm/components/Skeleton/Skeleton.js.map +1 -1
- package/dist/cssm/components/Slider/SliderThumb/SliderThumb.module.css +2 -1
- package/dist/cssm/components/Tabs/Tabs.js +19 -9
- package/dist/cssm/components/Tabs/Tabs.js.map +1 -1
- package/dist/cssm/components/Tabs/TabsController.js.map +1 -1
- package/dist/cssm/components/Tabs/TabsControllerContext.js +4 -0
- package/dist/cssm/components/Tabs/TabsControllerContext.js.map +1 -0
- package/dist/cssm/components/Tabs/TabsModeContext.js +1 -2
- package/dist/cssm/components/Tabs/TabsModeContext.js.map +1 -1
- package/dist/cssm/components/TabsItem/TabsItem.js +3 -1
- package/dist/cssm/components/TabsItem/TabsItem.js.map +1 -1
- package/dist/cssm/components/Tooltip/Tooltip.js.map +1 -1
- package/dist/cssm/components/Tooltip/useTooltip.js +2 -1
- package/dist/cssm/components/Tooltip/useTooltip.js.map +1 -1
- package/dist/cssm/components/Typography/Caption/Caption.js +4 -1
- package/dist/cssm/components/Typography/Caption/Caption.js.map +1 -1
- package/dist/cssm/components/Typography/Footnote/Footnote.js +4 -1
- package/dist/cssm/components/Typography/Footnote/Footnote.js.map +1 -1
- package/dist/cssm/components/Typography/Typography.js +7 -1
- package/dist/cssm/components/Typography/Typography.js.map +1 -1
- package/dist/cssm/components/View/View.js +2 -1
- package/dist/cssm/components/View/View.js.map +1 -1
- package/dist/cssm/components/View/View.module.css +1 -1
- package/dist/cssm/components/View/ViewInfinite.js +2 -1
- package/dist/cssm/components/View/ViewInfinite.js.map +1 -1
- package/dist/cssm/components/VisuallyHidden/VisuallyHidden.module.css +0 -2
- package/dist/cssm/hooks/useCalendar.js +6 -4
- package/dist/cssm/hooks/useCalendar.js.map +1 -1
- package/dist/cssm/hooks/useFloatingElement.js +3 -2
- package/dist/cssm/hooks/useFloatingElement.js.map +1 -1
- package/dist/cssm/hooks/useTodayDate.js +3 -2
- package/dist/cssm/hooks/useTodayDate.js.map +1 -1
- package/dist/cssm/index.js.map +1 -1
- package/dist/cssm/lib/accessibility.js +8 -0
- package/dist/cssm/lib/accessibility.js.map +1 -1
- package/dist/cssm/lib/calendar.js +9 -7
- package/dist/cssm/lib/calendar.js.map +1 -1
- package/dist/cssm/lib/date.js +66 -3
- package/dist/cssm/lib/date.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js +18 -8
- package/dist/cssm/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
- package/dist/cssm/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
- package/dist/cssm/lib/touch/UIPanGestureRecognizer.js +2 -2
- package/dist/cssm/lib/touch/UIPanGestureRecognizer.js.map +1 -1
- package/dist/cssm/lib/utils.js +1 -0
- package/dist/cssm/lib/utils.js.map +1 -1
- package/dist/cssm/styles/dynamicTokens.css +14 -2
- package/dist/cssm/styles/themes.css +1 -1
- package/dist/hooks/useCalendar.d.ts.map +1 -1
- package/dist/hooks/useCalendar.js +6 -4
- package/dist/hooks/useCalendar.js.map +1 -1
- package/dist/hooks/useFloatingElement.d.ts +1 -1
- package/dist/hooks/useFloatingElement.d.ts.map +1 -1
- package/dist/hooks/useFloatingElement.js +3 -2
- package/dist/hooks/useFloatingElement.js.map +1 -1
- package/dist/hooks/useTodayDate.d.ts.map +1 -1
- package/dist/hooks/useTodayDate.js +3 -2
- package/dist/hooks/useTodayDate.js.map +1 -1
- package/dist/index.d.ts +4 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/lib/accessibility.d.ts +1 -1
- package/dist/lib/accessibility.d.ts.map +1 -1
- package/dist/lib/accessibility.js +8 -0
- package/dist/lib/accessibility.js.map +1 -1
- package/dist/lib/calendar.d.ts.map +1 -1
- package/dist/lib/calendar.js +9 -7
- package/dist/lib/calendar.js.map +1 -1
- package/dist/lib/date.d.ts +31 -1
- package/dist/lib/date.d.ts.map +1 -1
- package/dist/lib/date.js +67 -3
- package/dist/lib/date.js.map +1 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts +6 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.d.ts.map +1 -1
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js +18 -8
- package/dist/lib/floating/useFloatingMiddlewaresBootstrap/index.js.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/types.d.ts +2 -0
- package/dist/lib/floating/useFloatingWithInteractions/types.d.ts.map +1 -1
- package/dist/lib/floating/useFloatingWithInteractions/types.js.map +1 -1
- package/dist/lib/touch/UIPanGestureRecognizer.d.ts.map +1 -1
- package/dist/lib/touch/UIPanGestureRecognizer.js +2 -2
- package/dist/lib/touch/UIPanGestureRecognizer.js.map +1 -1
- package/dist/lib/utils.d.ts +1 -0
- package/dist/lib/utils.d.ts.map +1 -1
- package/dist/lib/utils.js +1 -0
- package/dist/lib/utils.js.map +1 -1
- package/dist/vkui.css +1 -1
- package/dist/vkui.css.map +1 -1
- package/package.json +6 -7
- package/src/components/Banner/Banner.module.css +1 -6
- package/src/components/Banner/Banner.module.css.d.ts.map +1 -1
- package/src/components/Calendar/Calendar.tsx +6 -6
- package/src/components/CalendarDays/CalendarDays.tsx +3 -3
- package/src/components/CalendarRange/CalendarRange.tsx +15 -20
- package/src/components/CalendarRange/utils.ts +7 -6
- package/src/components/Cell/Cell.tsx +3 -0
- package/src/components/Checkbox/Checkbox.tsx +6 -0
- package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css +7 -2
- package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.module.css.d.ts.map +1 -1
- package/src/components/Checkbox/CheckboxSimple/CheckboxSimple.tsx +12 -3
- package/src/components/ChipsInputBase/Chip/Chip.module.css +8 -1
- package/src/components/ChipsInputBase/Chip/Chip.module.css.d.ts.map +1 -1
- package/src/components/ChipsInputBase/Chip/Chip.tsx +55 -1
- package/src/components/ChipsInputBase/types.ts +2 -45
- package/src/components/ContentBadge/ContentBadge.tsx +18 -12
- package/src/components/ContentCard/ContentCard.tsx +1 -1
- package/src/components/CustomSelect/CustomSelect.tsx +216 -562
- package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css +12 -0
- package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.module.css.d.ts.map +1 -1
- package/src/components/CustomSelect/CustomSelectInput/CustomSelectInput.tsx +25 -2
- package/src/components/CustomSelect/helpers.ts +103 -0
- package/src/components/CustomSelect/hooks/useAfterItems.tsx +89 -0
- package/src/components/CustomSelect/hooks/useDropdownOpenedController.ts +61 -0
- package/src/components/CustomSelect/hooks/useFocusedOptionController.ts +86 -0
- package/src/components/CustomSelect/hooks/useInputKeyboardController.ts +96 -0
- package/src/components/CustomSelect/hooks/useInputValueController.ts +58 -0
- package/src/components/CustomSelect/hooks/useScrollListController.ts +46 -0
- package/src/components/CustomSelect/hooks/useSelectedOptionController.ts +132 -0
- package/src/components/CustomSelect/types.ts +38 -0
- package/src/components/CustomSelectDropdown/CustomSelectDropdown.tsx +1 -0
- package/src/components/DateInput/DateInput.tsx +9 -3
- package/src/components/DateRangeInput/DateRangeInput.tsx +9 -6
- package/src/components/ImageBase/ImageBaseBadge/ImageBaseBadge.tsx +1 -1
- package/src/components/MiniInfoCell/MiniInfoCell.tsx +8 -3
- package/src/components/ModalCard/ModalCard.tsx +2 -0
- package/src/components/ModalCard/ModalCardInternal.tsx +8 -2
- package/src/components/ModalCard/types.ts +8 -0
- package/src/components/ModalOutlet/ModalOutlet.module.css +4 -0
- package/src/components/ModalOutlet/ModalOutlet.module.css.d.ts.map +1 -1
- package/src/components/ModalOutlet/ModalOutlet.tsx +8 -1
- package/src/components/ModalOverlay/ModalOverlay.module.css +1 -1
- package/src/components/ModalPage/ModalPage.module.css +1 -0
- package/src/components/ModalPage/ModalPage.module.css.d.ts.map +1 -1
- package/src/components/ModalPage/ModalPage.tsx +2 -0
- package/src/components/ModalPage/ModalPageInternal.tsx +8 -2
- package/src/components/ModalPage/types.ts +8 -0
- package/src/components/ModalRoot/ModalRoot.tsx +19 -6
- package/src/components/ModalRoot/types.ts +7 -0
- package/src/components/ModalRoot/useModalManager.tsx +4 -0
- package/src/components/OnboardingTooltip/OnboardingTooltip.tsx +3 -0
- package/src/components/Popover/Popover.tsx +1 -0
- package/src/components/Popover/usePopover.tsx +2 -0
- package/src/components/Popper/Popper.tsx +3 -0
- package/src/components/RichCell/RichCell.module.css +4 -2
- package/src/components/RichCell/RichCell.module.css.d.ts.map +1 -1
- package/src/components/Select/Select.tsx +5 -5
- package/src/components/SelectionControl/SelectionControl.module.css +6 -3
- package/src/components/SelectionControl/SelectionControl.module.css.d.ts.map +1 -1
- package/src/components/SelectionControl/SelectionControl.tsx +30 -8
- package/src/components/SelectionControl/SelectionControlContext.ts +7 -0
- package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css +6 -3
- package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.module.css.d.ts.map +1 -1
- package/src/components/SelectionControl/SelectionControlLabel/SelectionControlLabel.tsx +7 -1
- package/src/components/SimpleCell/SimpleCell.tsx +5 -0
- package/src/components/Skeleton/Skeleton.tsx +1 -1
- package/src/components/Slider/SliderThumb/SliderThumb.module.css +1 -1
- package/src/components/Tabs/Tabs.tsx +16 -12
- package/src/components/Tabs/TabsController.ts +2 -2
- package/src/components/Tabs/TabsControllerContext.ts +7 -0
- package/src/components/Tabs/TabsModeContext.ts +0 -3
- package/src/components/TabsItem/TabsItem.tsx +5 -9
- package/src/components/Tooltip/Tooltip.tsx +1 -0
- package/src/components/Tooltip/useTooltip.tsx +2 -0
- package/src/components/Typography/Caption/Caption.tsx +14 -6
- package/src/components/Typography/Footnote/Footnote.tsx +10 -6
- package/src/components/Typography/Typography.tsx +9 -2
- package/src/components/View/View.module.css +1 -1
- package/src/components/View/View.tsx +2 -1
- package/src/components/View/ViewInfinite.tsx +2 -1
- package/src/components/VisuallyHidden/VisuallyHidden.module.css +0 -2
- package/src/components/VisuallyHidden/VisuallyHidden.module.css.d.ts.map +1 -1
- package/src/hooks/useCalendar.ts +6 -4
- package/src/hooks/useFloatingElement.tsx +2 -0
- package/src/hooks/useTodayDate.ts +3 -2
- package/src/index.ts +5 -3
- package/src/lib/accessibility.ts +4 -0
- package/src/lib/calendar.ts +8 -12
- package/src/lib/date.ts +82 -3
- package/src/lib/floating/useFloatingMiddlewaresBootstrap/index.ts +23 -10
- package/src/lib/floating/useFloatingWithInteractions/types.ts +2 -0
- package/src/lib/touch/UIPanGestureRecognizer.ts +2 -2
- package/src/lib/utils.ts +3 -0
- package/src/styles/dynamicTokens.css +13 -2
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { noop } from "@vkontakte/vkjs";
|
|
3
|
+
import { useStableCallback } from "../../../hooks/useStableCallback.js";
|
|
4
|
+
/* eslint-enable jsdoc/require-jsdoc */ export function useDropdownOpenedController({ onClose, onOpen, onOpened, onClosed }) {
|
|
5
|
+
const [opened, setOpened] = React.useState(false);
|
|
6
|
+
const onCloseCb = useStableCallback(onClose || noop);
|
|
7
|
+
const onOpenCb = useStableCallback(onOpen || noop);
|
|
8
|
+
const onOpenedCb = useStableCallback(onOpened || noop);
|
|
9
|
+
const onClosedCb = useStableCallback(onClosed || noop);
|
|
10
|
+
const close = React.useCallback(()=>{
|
|
11
|
+
if (!opened) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
setOpened(false);
|
|
15
|
+
onCloseCb === null || onCloseCb === void 0 ? void 0 : onCloseCb();
|
|
16
|
+
}, [
|
|
17
|
+
onCloseCb,
|
|
18
|
+
opened
|
|
19
|
+
]);
|
|
20
|
+
const open = React.useCallback(()=>{
|
|
21
|
+
if (opened) {
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
setOpened(true);
|
|
25
|
+
onOpenCb === null || onOpenCb === void 0 ? void 0 : onOpenCb();
|
|
26
|
+
}, [
|
|
27
|
+
onOpenCb,
|
|
28
|
+
opened
|
|
29
|
+
]);
|
|
30
|
+
const toggleOpened = React.useCallback(()=>{
|
|
31
|
+
if (opened) {
|
|
32
|
+
close();
|
|
33
|
+
} else {
|
|
34
|
+
open();
|
|
35
|
+
}
|
|
36
|
+
}, [
|
|
37
|
+
close,
|
|
38
|
+
open,
|
|
39
|
+
opened
|
|
40
|
+
]);
|
|
41
|
+
React.useEffect(()=>{
|
|
42
|
+
if (opened) {
|
|
43
|
+
onOpenedCb();
|
|
44
|
+
} else {
|
|
45
|
+
onClosedCb();
|
|
46
|
+
}
|
|
47
|
+
}, [
|
|
48
|
+
onClosedCb,
|
|
49
|
+
onOpenedCb,
|
|
50
|
+
opened
|
|
51
|
+
]);
|
|
52
|
+
return {
|
|
53
|
+
opened,
|
|
54
|
+
open,
|
|
55
|
+
close,
|
|
56
|
+
toggleOpened
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
//# sourceMappingURL=useDropdownOpenedController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/hooks/useDropdownOpenedController.ts"],"sourcesContent":["import * as React from 'react';\nimport { noop } from '@vkontakte/vkjs';\nimport { useStableCallback } from '../../../hooks/useStableCallback';\nimport { type SelectProps } from '../CustomSelect';\n/* eslint-disable jsdoc/require-jsdoc */\ntype UseDropdownOpenedControllerProps = Pick<SelectProps, 'onOpen' | 'onClose'> & {\n onOpened?: () => void;\n onClosed?: () => void;\n};\n/* eslint-enable jsdoc/require-jsdoc */\nexport function useDropdownOpenedController({\n onClose,\n onOpen,\n onOpened,\n onClosed,\n}: UseDropdownOpenedControllerProps) {\n const [opened, setOpened] = React.useState(false);\n const onCloseCb = useStableCallback(onClose || noop);\n const onOpenCb = useStableCallback(onOpen || noop);\n const onOpenedCb = useStableCallback(onOpened || noop);\n const onClosedCb = useStableCallback(onClosed || noop);\n\n const close = React.useCallback(() => {\n if (!opened) {\n return;\n }\n setOpened(false);\n onCloseCb?.();\n }, [onCloseCb, opened]);\n\n const open = React.useCallback(() => {\n if (opened) {\n return;\n }\n setOpened(true);\n onOpenCb?.();\n }, [onOpenCb, opened]);\n\n const toggleOpened = React.useCallback(() => {\n if (opened) {\n close();\n } else {\n open();\n }\n }, [close, open, opened]);\n\n React.useEffect(() => {\n if (opened) {\n onOpenedCb();\n } else {\n onClosedCb();\n }\n }, [onClosedCb, onOpenedCb, opened]);\n\n return {\n opened,\n open,\n close,\n toggleOpened,\n };\n}\n"],"names":["React","noop","useStableCallback","useDropdownOpenedController","onClose","onOpen","onOpened","onClosed","opened","setOpened","useState","onCloseCb","onOpenCb","onOpenedCb","onClosedCb","close","useCallback","open","toggleOpened","useEffect"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,IAAI,QAAQ,kBAAkB;AACvC,SAASC,iBAAiB,QAAQ,sCAAmC;AAOrE,qCAAqC,GACrC,OAAO,SAASC,4BAA4B,EAC1CC,OAAO,EACPC,MAAM,EACNC,QAAQ,EACRC,QAAQ,EACyB;IACjC,MAAM,CAACC,QAAQC,UAAU,GAAGT,MAAMU,QAAQ,CAAC;IAC3C,MAAMC,YAAYT,kBAAkBE,WAAWH;IAC/C,MAAMW,WAAWV,kBAAkBG,UAAUJ;IAC7C,MAAMY,aAAaX,kBAAkBI,YAAYL;IACjD,MAAMa,aAAaZ,kBAAkBK,YAAYN;IAEjD,MAAMc,QAAQf,MAAMgB,WAAW,CAAC;QAC9B,IAAI,CAACR,QAAQ;YACX;QACF;QACAC,UAAU;QACVE,sBAAAA,gCAAAA;IACF,GAAG;QAACA;QAAWH;KAAO;IAEtB,MAAMS,OAAOjB,MAAMgB,WAAW,CAAC;QAC7B,IAAIR,QAAQ;YACV;QACF;QACAC,UAAU;QACVG,qBAAAA,+BAAAA;IACF,GAAG;QAACA;QAAUJ;KAAO;IAErB,MAAMU,eAAelB,MAAMgB,WAAW,CAAC;QACrC,IAAIR,QAAQ;YACVO;QACF,OAAO;YACLE;QACF;IACF,GAAG;QAACF;QAAOE;QAAMT;KAAO;IAExBR,MAAMmB,SAAS,CAAC;QACd,IAAIX,QAAQ;YACVK;QACF,OAAO;YACLC;QACF;IACF,GAAG;QAACA;QAAYD;QAAYL;KAAO;IAEnC,OAAO;QACLA;QACAS;QACAF;QACAG;IACF;AACF"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { type Dispatch, type SetStateAction } from 'react';
|
|
2
|
+
import { type SelectValue } from '../../NativeSelect/NativeSelect';
|
|
3
|
+
import { type SelectProps } from '../CustomSelect';
|
|
4
|
+
import { type CustomSelectOptionInterface } from '../types';
|
|
5
|
+
interface UseFocusedOptionControllerProps<OptionInterfaceT extends CustomSelectOptionInterface> {
|
|
6
|
+
filteredOptions: SelectProps<OptionInterfaceT>['options'];
|
|
7
|
+
scrollToElement: (index: number, center?: boolean) => void;
|
|
8
|
+
selectedOptionValue: SelectValue;
|
|
9
|
+
}
|
|
10
|
+
export interface UseFocusedOptionControllerReturn {
|
|
11
|
+
focusedOptionValue: SelectValue;
|
|
12
|
+
setFocusedOptionValue: Dispatch<SetStateAction<SelectValue>>;
|
|
13
|
+
focusOptionByIndex: (index: number | undefined, scrollTo: boolean) => void;
|
|
14
|
+
resetFocusedOption: () => void;
|
|
15
|
+
focusOption: (type: 'next' | 'prev') => void;
|
|
16
|
+
selectFocusedValue: () => void;
|
|
17
|
+
}
|
|
18
|
+
export declare function useFocusedOptionController<OptionInterfaceT extends CustomSelectOptionInterface>({ selectedOptionValue, filteredOptions, scrollToElement, }: UseFocusedOptionControllerProps<OptionInterfaceT>): UseFocusedOptionControllerReturn;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=useFocusedOptionController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useFocusedOptionController.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/hooks/useFocusedOptionController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,KAAK,cAAc,EAAE,MAAM,OAAO,CAAC;AAE3D,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAG5D,UAAU,+BAA+B,CAAC,gBAAgB,SAAS,2BAA2B;IAC5F,eAAe,EAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC,SAAS,CAAC,CAAC;IAC1D,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3D,mBAAmB,EAAE,WAAW,CAAC;CAClC;AAED,MAAM,WAAW,gCAAgC;IAC/C,kBAAkB,EAAE,WAAW,CAAC;IAChC,qBAAqB,EAAE,QAAQ,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,kBAAkB,EAAE,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,EAAE,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3E,kBAAkB,EAAE,MAAM,IAAI,CAAC;IAC/B,WAAW,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,KAAK,IAAI,CAAC;IAC7C,kBAAkB,EAAE,MAAM,IAAI,CAAC;CAChC;AAGD,wBAAgB,0BAA0B,CAAC,gBAAgB,SAAS,2BAA2B,EAAE,EAC/F,mBAAmB,EACnB,eAAe,EACf,eAAe,GAChB,EAAE,+BAA+B,CAAC,gBAAgB,CAAC,GAAG,gCAAgC,CAyDtF"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { findIndexAfter, findIndexBefore, findSelectedIndex } from "../helpers.js";
|
|
3
|
+
/* eslint-enable jsdoc/require-jsdoc */ export function useFocusedOptionController({ selectedOptionValue, filteredOptions, scrollToElement }) {
|
|
4
|
+
const [focusedOptionValue, setFocusedOptionValue] = React.useState(null);
|
|
5
|
+
const focusOptionByIndex = React.useCallback((index, scrollTo = true)=>{
|
|
6
|
+
if (index === undefined || index < 0 || index > filteredOptions.length - 1) {
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
const option = filteredOptions[index];
|
|
10
|
+
if (!option || option.disabled) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
if (scrollTo) {
|
|
14
|
+
scrollToElement(index);
|
|
15
|
+
}
|
|
16
|
+
setFocusedOptionValue(option.value);
|
|
17
|
+
}, [
|
|
18
|
+
filteredOptions,
|
|
19
|
+
scrollToElement
|
|
20
|
+
]);
|
|
21
|
+
const resetFocusedOption = React.useCallback(()=>{
|
|
22
|
+
setFocusedOptionValue(null);
|
|
23
|
+
}, []);
|
|
24
|
+
const focusOption = React.useCallback((type)=>{
|
|
25
|
+
let index = findSelectedIndex(filteredOptions, focusedOptionValue);
|
|
26
|
+
if (type === 'next') {
|
|
27
|
+
const nextIndex = findIndexAfter(filteredOptions, index);
|
|
28
|
+
index = nextIndex === -1 ? findIndexAfter(filteredOptions) : nextIndex; // Следующий за index или первый валидный до index
|
|
29
|
+
} else if (type === 'prev') {
|
|
30
|
+
const beforeIndex = findIndexBefore(filteredOptions, index);
|
|
31
|
+
index = beforeIndex === -1 ? findIndexBefore(filteredOptions) : beforeIndex; // Предшествующий index или последний валидный после index
|
|
32
|
+
}
|
|
33
|
+
focusOptionByIndex(index);
|
|
34
|
+
}, [
|
|
35
|
+
filteredOptions,
|
|
36
|
+
focusedOptionValue,
|
|
37
|
+
focusOptionByIndex
|
|
38
|
+
]);
|
|
39
|
+
const selectFocusedValue = React.useCallback(()=>setFocusedOptionValue(selectedOptionValue), [
|
|
40
|
+
selectedOptionValue
|
|
41
|
+
]);
|
|
42
|
+
return {
|
|
43
|
+
focusedOptionValue,
|
|
44
|
+
setFocusedOptionValue,
|
|
45
|
+
focusOptionByIndex,
|
|
46
|
+
resetFocusedOption,
|
|
47
|
+
focusOption,
|
|
48
|
+
selectFocusedValue
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
//# sourceMappingURL=useFocusedOptionController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/hooks/useFocusedOptionController.ts"],"sourcesContent":["import { type Dispatch, type SetStateAction } from 'react';\nimport * as React from 'react';\nimport { type SelectValue } from '../../NativeSelect/NativeSelect';\nimport { type SelectProps } from '../CustomSelect';\nimport { findIndexAfter, findIndexBefore, findSelectedIndex } from '../helpers';\nimport { type CustomSelectOptionInterface } from '../types';\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface UseFocusedOptionControllerProps<OptionInterfaceT extends CustomSelectOptionInterface> {\n filteredOptions: SelectProps<OptionInterfaceT>['options'];\n scrollToElement: (index: number, center?: boolean) => void;\n selectedOptionValue: SelectValue;\n}\n\nexport interface UseFocusedOptionControllerReturn {\n focusedOptionValue: SelectValue;\n setFocusedOptionValue: Dispatch<SetStateAction<SelectValue>>;\n focusOptionByIndex: (index: number | undefined, scrollTo: boolean) => void;\n resetFocusedOption: () => void;\n focusOption: (type: 'next' | 'prev') => void;\n selectFocusedValue: () => void;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport function useFocusedOptionController<OptionInterfaceT extends CustomSelectOptionInterface>({\n selectedOptionValue,\n filteredOptions,\n scrollToElement,\n}: UseFocusedOptionControllerProps<OptionInterfaceT>): UseFocusedOptionControllerReturn {\n const [focusedOptionValue, setFocusedOptionValue] = React.useState<SelectValue>(null);\n\n const focusOptionByIndex = React.useCallback(\n (index: number | undefined, scrollTo = true) => {\n if (index === undefined || index < 0 || index > filteredOptions.length - 1) {\n return;\n }\n const option = filteredOptions[index];\n\n if (!option || option.disabled) {\n return;\n }\n\n if (scrollTo) {\n scrollToElement(index);\n }\n\n setFocusedOptionValue(option.value);\n },\n [filteredOptions, scrollToElement],\n );\n\n const resetFocusedOption = React.useCallback(() => {\n setFocusedOptionValue(null);\n }, []);\n\n const focusOption = React.useCallback(\n (type: 'next' | 'prev') => {\n let index = findSelectedIndex(filteredOptions, focusedOptionValue);\n\n if (type === 'next') {\n const nextIndex = findIndexAfter(filteredOptions, index);\n index = nextIndex === -1 ? findIndexAfter(filteredOptions) : nextIndex; // Следующий за index или первый валидный до index\n } else if (type === 'prev') {\n const beforeIndex = findIndexBefore(filteredOptions, index);\n index = beforeIndex === -1 ? findIndexBefore(filteredOptions) : beforeIndex; // Предшествующий index или последний валидный после index\n }\n\n focusOptionByIndex(index);\n },\n [filteredOptions, focusedOptionValue, focusOptionByIndex],\n );\n\n const selectFocusedValue = React.useCallback(\n () => setFocusedOptionValue(selectedOptionValue),\n [selectedOptionValue],\n );\n\n return {\n focusedOptionValue,\n setFocusedOptionValue,\n focusOptionByIndex,\n resetFocusedOption,\n focusOption,\n selectFocusedValue,\n };\n}\n"],"names":["React","findIndexAfter","findIndexBefore","findSelectedIndex","useFocusedOptionController","selectedOptionValue","filteredOptions","scrollToElement","focusedOptionValue","setFocusedOptionValue","useState","focusOptionByIndex","useCallback","index","scrollTo","undefined","length","option","disabled","value","resetFocusedOption","focusOption","type","nextIndex","beforeIndex","selectFocusedValue"],"mappings":"AACA,YAAYA,WAAW,QAAQ;AAG/B,SAASC,cAAc,EAAEC,eAAe,EAAEC,iBAAiB,QAAQ,gBAAa;AAkBhF,qCAAqC,GAErC,OAAO,SAASC,2BAAiF,EAC/FC,mBAAmB,EACnBC,eAAe,EACfC,eAAe,EACmC;IAClD,MAAM,CAACC,oBAAoBC,sBAAsB,GAAGT,MAAMU,QAAQ,CAAc;IAEhF,MAAMC,qBAAqBX,MAAMY,WAAW,CAC1C,CAACC,OAA2BC,WAAW,IAAI;QACzC,IAAID,UAAUE,aAAaF,QAAQ,KAAKA,QAAQP,gBAAgBU,MAAM,GAAG,GAAG;YAC1E;QACF;QACA,MAAMC,SAASX,eAAe,CAACO,MAAM;QAErC,IAAI,CAACI,UAAUA,OAAOC,QAAQ,EAAE;YAC9B;QACF;QAEA,IAAIJ,UAAU;YACZP,gBAAgBM;QAClB;QAEAJ,sBAAsBQ,OAAOE,KAAK;IACpC,GACA;QAACb;QAAiBC;KAAgB;IAGpC,MAAMa,qBAAqBpB,MAAMY,WAAW,CAAC;QAC3CH,sBAAsB;IACxB,GAAG,EAAE;IAEL,MAAMY,cAAcrB,MAAMY,WAAW,CACnC,CAACU;QACC,IAAIT,QAAQV,kBAAkBG,iBAAiBE;QAE/C,IAAIc,SAAS,QAAQ;YACnB,MAAMC,YAAYtB,eAAeK,iBAAiBO;YAClDA,QAAQU,cAAc,CAAC,IAAItB,eAAeK,mBAAmBiB,WAAW,kDAAkD;QAC5H,OAAO,IAAID,SAAS,QAAQ;YAC1B,MAAME,cAActB,gBAAgBI,iBAAiBO;YACrDA,QAAQW,gBAAgB,CAAC,IAAItB,gBAAgBI,mBAAmBkB,aAAa,0DAA0D;QACzI;QAEAb,mBAAmBE;IACrB,GACA;QAACP;QAAiBE;QAAoBG;KAAmB;IAG3D,MAAMc,qBAAqBzB,MAAMY,WAAW,CAC1C,IAAMH,sBAAsBJ,sBAC5B;QAACA;KAAoB;IAGvB,OAAO;QACLG;QACAC;QACAE;QACAS;QACAC;QACAI;IACF;AACF"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type SelectProps } from '../CustomSelect';
|
|
3
|
+
import { type UseFocusedOptionControllerReturn } from './useFocusedOptionController';
|
|
4
|
+
interface UseInputKeyboardController extends Pick<UseFocusedOptionControllerReturn, 'resetFocusedOption' | 'focusOption'>, Pick<SelectProps, 'onInputKeyDown'> {
|
|
5
|
+
opened: boolean;
|
|
6
|
+
scrollBoxRef: React.RefObject<HTMLDivElement | null>;
|
|
7
|
+
selectFocused: () => void;
|
|
8
|
+
open: () => void;
|
|
9
|
+
close: () => void;
|
|
10
|
+
}
|
|
11
|
+
export declare function useInputKeyboardController({ opened, resetFocusedOption, focusOption, scrollBoxRef, selectFocused, onInputKeyDown, open, close, }: UseInputKeyboardController): (e: React.KeyboardEvent<HTMLInputElement>) => void;
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=useInputKeyboardController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInputKeyboardController.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/hooks/useInputKeyboardController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,EAAE,KAAK,gCAAgC,EAAE,MAAM,8BAA8B,CAAC;AAKrF,UAAU,0BACR,SAAQ,IAAI,CAAC,gCAAgC,EAAE,oBAAoB,GAAG,aAAa,CAAC,EAClF,IAAI,CAAC,WAAW,EAAE,gBAAgB,CAAC;IACrC,MAAM,EAAE,OAAO,CAAC;IAChB,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,IAAI,EAAE,MAAM,IAAI,CAAC;IACjB,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAGD,wBAAgB,0BAA0B,CAAC,EACzC,MAAM,EACN,kBAAkB,EAClB,WAAW,EACX,YAAY,EACZ,aAAa,EACb,cAAc,EACd,IAAI,EACJ,KAAK,GACN,EAAE,0BAA0B,OA4DA,KAAK,CAAC,aAAa,CAAC,gBAAgB,CAAC,KAAK,IAAI,CAM1E"}
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { Keys, pressedKey } from "../../../lib/accessibility.js";
|
|
3
|
+
import { callMultiple } from "../../../lib/callMultiple.js";
|
|
4
|
+
const KEYS_TO_PREVENT_DEFAULT = [
|
|
5
|
+
Keys.ARROW_UP,
|
|
6
|
+
Keys.ARROW_DOWN,
|
|
7
|
+
Keys.ESCAPE,
|
|
8
|
+
Keys.ENTER
|
|
9
|
+
];
|
|
10
|
+
/* eslint-enable jsdoc/require-jsdoc */ export function useInputKeyboardController({ opened, resetFocusedOption, focusOption, scrollBoxRef, selectFocused, onInputKeyDown, open, close }) {
|
|
11
|
+
const handleKeyDownSelect = React.useCallback((event)=>{
|
|
12
|
+
const key = pressedKey(event);
|
|
13
|
+
if (event.key.length === 1 && key !== Keys.SPACE) {
|
|
14
|
+
open();
|
|
15
|
+
resetFocusedOption();
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
if (!key) {
|
|
19
|
+
return;
|
|
20
|
+
}
|
|
21
|
+
const areOptionsShown = ()=>scrollBoxRef.current !== null;
|
|
22
|
+
if (KEYS_TO_PREVENT_DEFAULT.includes(key)) {
|
|
23
|
+
event.preventDefault();
|
|
24
|
+
}
|
|
25
|
+
switch(key){
|
|
26
|
+
case Keys.ARROW_UP:
|
|
27
|
+
if (opened) {
|
|
28
|
+
areOptionsShown() && focusOption('prev');
|
|
29
|
+
} else {
|
|
30
|
+
open();
|
|
31
|
+
}
|
|
32
|
+
break;
|
|
33
|
+
case Keys.ARROW_DOWN:
|
|
34
|
+
if (opened) {
|
|
35
|
+
areOptionsShown() && focusOption('next');
|
|
36
|
+
} else {
|
|
37
|
+
open();
|
|
38
|
+
}
|
|
39
|
+
break;
|
|
40
|
+
case Keys.ESCAPE:
|
|
41
|
+
close();
|
|
42
|
+
break;
|
|
43
|
+
case Keys.BACKSPACE:
|
|
44
|
+
case Keys.DELETE:
|
|
45
|
+
{
|
|
46
|
+
open();
|
|
47
|
+
resetFocusedOption();
|
|
48
|
+
break;
|
|
49
|
+
}
|
|
50
|
+
case Keys.ENTER:
|
|
51
|
+
case Keys.SPACE:
|
|
52
|
+
if (opened) {
|
|
53
|
+
areOptionsShown() && selectFocused();
|
|
54
|
+
} else {
|
|
55
|
+
open();
|
|
56
|
+
}
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
}, [
|
|
60
|
+
scrollBoxRef,
|
|
61
|
+
opened,
|
|
62
|
+
close,
|
|
63
|
+
focusOption,
|
|
64
|
+
open,
|
|
65
|
+
resetFocusedOption,
|
|
66
|
+
selectFocused
|
|
67
|
+
]);
|
|
68
|
+
const handleInputKeydown = React.useCallback((event)=>{
|
|
69
|
+
onInputKeyDown === null || onInputKeyDown === void 0 ? void 0 : onInputKeyDown(event, opened);
|
|
70
|
+
}, [
|
|
71
|
+
opened,
|
|
72
|
+
onInputKeyDown
|
|
73
|
+
]);
|
|
74
|
+
const _onInputKeyDown = callMultiple(handleKeyDownSelect, handleInputKeydown);
|
|
75
|
+
return _onInputKeyDown;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
//# sourceMappingURL=useInputKeyboardController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/hooks/useInputKeyboardController.ts"],"sourcesContent":["import * as React from 'react';\nimport { Keys, pressedKey } from '../../../lib/accessibility';\nimport { callMultiple } from '../../../lib/callMultiple';\nimport { type SelectProps } from '../CustomSelect';\nimport { type UseFocusedOptionControllerReturn } from './useFocusedOptionController';\n\nconst KEYS_TO_PREVENT_DEFAULT: string[] = [Keys.ARROW_UP, Keys.ARROW_DOWN, Keys.ESCAPE, Keys.ENTER];\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface UseInputKeyboardController\n extends Pick<UseFocusedOptionControllerReturn, 'resetFocusedOption' | 'focusOption'>,\n Pick<SelectProps, 'onInputKeyDown'> {\n opened: boolean;\n scrollBoxRef: React.RefObject<HTMLDivElement | null>;\n selectFocused: () => void;\n open: () => void;\n close: () => void;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport function useInputKeyboardController({\n opened,\n resetFocusedOption,\n focusOption,\n scrollBoxRef,\n selectFocused,\n onInputKeyDown,\n open,\n close,\n}: UseInputKeyboardController) {\n const handleKeyDownSelect = React.useCallback(\n (event: React.KeyboardEvent) => {\n const key = pressedKey(event);\n if (event.key.length === 1 && key !== Keys.SPACE) {\n open();\n resetFocusedOption();\n return;\n }\n if (!key) {\n return;\n }\n const areOptionsShown = () => scrollBoxRef.current !== null;\n\n if (KEYS_TO_PREVENT_DEFAULT.includes(key)) {\n event.preventDefault();\n }\n switch (key) {\n case Keys.ARROW_UP:\n if (opened) {\n areOptionsShown() && focusOption('prev');\n } else {\n open();\n }\n break;\n case Keys.ARROW_DOWN:\n if (opened) {\n areOptionsShown() && focusOption('next');\n } else {\n open();\n }\n break;\n case Keys.ESCAPE:\n close();\n break;\n case Keys.BACKSPACE:\n case Keys.DELETE: {\n open();\n resetFocusedOption();\n break;\n }\n case Keys.ENTER:\n case Keys.SPACE:\n if (opened) {\n areOptionsShown() && selectFocused();\n } else {\n open();\n }\n break;\n }\n },\n [scrollBoxRef, opened, close, focusOption, open, resetFocusedOption, selectFocused],\n );\n\n const handleInputKeydown = React.useCallback(\n (event: React.KeyboardEvent) => {\n onInputKeyDown?.(event, opened);\n },\n [opened, onInputKeyDown],\n );\n const _onInputKeyDown: (e: React.KeyboardEvent<HTMLInputElement>) => void = callMultiple(\n handleKeyDownSelect,\n handleInputKeydown,\n );\n\n return _onInputKeyDown;\n}\n"],"names":["React","Keys","pressedKey","callMultiple","KEYS_TO_PREVENT_DEFAULT","ARROW_UP","ARROW_DOWN","ESCAPE","ENTER","useInputKeyboardController","opened","resetFocusedOption","focusOption","scrollBoxRef","selectFocused","onInputKeyDown","open","close","handleKeyDownSelect","useCallback","event","key","length","SPACE","areOptionsShown","current","includes","preventDefault","BACKSPACE","DELETE","handleInputKeydown","_onInputKeyDown"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,IAAI,EAAEC,UAAU,QAAQ,gCAA6B;AAC9D,SAASC,YAAY,QAAQ,+BAA4B;AAIzD,MAAMC,0BAAoC;IAACH,KAAKI,QAAQ;IAAEJ,KAAKK,UAAU;IAAEL,KAAKM,MAAM;IAAEN,KAAKO,KAAK;CAAC;AAYnG,qCAAqC,GAErC,OAAO,SAASC,2BAA2B,EACzCC,MAAM,EACNC,kBAAkB,EAClBC,WAAW,EACXC,YAAY,EACZC,aAAa,EACbC,cAAc,EACdC,IAAI,EACJC,KAAK,EACsB;IAC3B,MAAMC,sBAAsBlB,MAAMmB,WAAW,CAC3C,CAACC;QACC,MAAMC,MAAMnB,WAAWkB;QACvB,IAAIA,MAAMC,GAAG,CAACC,MAAM,KAAK,KAAKD,QAAQpB,KAAKsB,KAAK,EAAE;YAChDP;YACAL;YACA;QACF;QACA,IAAI,CAACU,KAAK;YACR;QACF;QACA,MAAMG,kBAAkB,IAAMX,aAAaY,OAAO,KAAK;QAEvD,IAAIrB,wBAAwBsB,QAAQ,CAACL,MAAM;YACzCD,MAAMO,cAAc;QACtB;QACA,OAAQN;YACN,KAAKpB,KAAKI,QAAQ;gBAChB,IAAIK,QAAQ;oBACVc,qBAAqBZ,YAAY;gBACnC,OAAO;oBACLI;gBACF;gBACA;YACF,KAAKf,KAAKK,UAAU;gBAClB,IAAII,QAAQ;oBACVc,qBAAqBZ,YAAY;gBACnC,OAAO;oBACLI;gBACF;gBACA;YACF,KAAKf,KAAKM,MAAM;gBACdU;gBACA;YACF,KAAKhB,KAAK2B,SAAS;YACnB,KAAK3B,KAAK4B,MAAM;gBAAE;oBAChBb;oBACAL;oBACA;gBACF;YACA,KAAKV,KAAKO,KAAK;YACf,KAAKP,KAAKsB,KAAK;gBACb,IAAIb,QAAQ;oBACVc,qBAAqBV;gBACvB,OAAO;oBACLE;gBACF;gBACA;QACJ;IACF,GACA;QAACH;QAAcH;QAAQO;QAAOL;QAAaI;QAAML;QAAoBG;KAAc;IAGrF,MAAMgB,qBAAqB9B,MAAMmB,WAAW,CAC1C,CAACC;QACCL,2BAAAA,qCAAAA,eAAiBK,OAAOV;IAC1B,GACA;QAACA;QAAQK;KAAe;IAE1B,MAAMgB,kBAAsE5B,aAC1Ee,qBACAY;IAGF,OAAOC;AACT"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
import { type SelectValue } from '../../NativeSelect/NativeSelect';
|
|
3
|
+
import { type SelectProps } from '../CustomSelect';
|
|
4
|
+
import { type CustomSelectOptionInterface } from '../types';
|
|
5
|
+
type UseInputValueControllerProps<OptionInterfaceT extends CustomSelectOptionInterface> = Pick<SelectProps<OptionInterfaceT>, 'options' | 'onInputChange' | 'accessible'> & {
|
|
6
|
+
selectedValue: SelectValue;
|
|
7
|
+
};
|
|
8
|
+
export declare function useInputValueController<OptionInterfaceT extends CustomSelectOptionInterface>({ options, accessible, selectedValue, onInputChange: onInputChangeProp, }: UseInputValueControllerProps<OptionInterfaceT>): {
|
|
9
|
+
inputValue: string;
|
|
10
|
+
resetInputValue: () => void;
|
|
11
|
+
resetInputValueBySelectedOption: () => void;
|
|
12
|
+
onInputChange: React.ChangeEventHandler<HTMLInputElement>;
|
|
13
|
+
};
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=useInputValueController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useInputValueController.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/hooks/useInputValueController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iCAAiC,CAAC;AACnE,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAEnD,OAAO,EAAE,KAAK,2BAA2B,EAAE,MAAM,UAAU,CAAC;AAG5D,KAAK,4BAA4B,CAAC,gBAAgB,SAAS,2BAA2B,IAAI,IAAI,CAC5F,WAAW,CAAC,gBAAgB,CAAC,EAC7B,SAAS,GAAG,eAAe,GAAG,YAAY,CAC3C,GAAG;IACF,aAAa,EAAE,WAAW,CAAC;CAC5B,CAAC;AAGF,wBAAgB,uBAAuB,CAAC,gBAAgB,SAAS,2BAA2B,EAAE,EAC5F,OAAO,EACP,UAAU,EACV,aAAa,EACb,aAAa,EAAE,iBAAiB,GACjC,EAAE,4BAA4B,CAAC,gBAAgB,CAAC;;;;;EAoChD"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useIsomorphicLayoutEffect } from "../../../lib/useIsomorphicLayoutEffect.js";
|
|
3
|
+
import { calculateInputValueFromOptions } from "../helpers.js";
|
|
4
|
+
/* eslint-enable jsdoc/require-jsdoc */ export function useInputValueController({ options, accessible, selectedValue, onInputChange: onInputChangeProp }) {
|
|
5
|
+
const [inputValue, setInputValue] = React.useState('');
|
|
6
|
+
const optionsRef = React.useRef(options);
|
|
7
|
+
useIsomorphicLayoutEffect(()=>{
|
|
8
|
+
optionsRef.current = options;
|
|
9
|
+
}, [
|
|
10
|
+
options
|
|
11
|
+
]);
|
|
12
|
+
const resetInputValueBySelectedOption = React.useCallback(()=>{
|
|
13
|
+
setInputValue(calculateInputValueFromOptions(optionsRef.current, selectedValue));
|
|
14
|
+
}, [
|
|
15
|
+
selectedValue
|
|
16
|
+
]);
|
|
17
|
+
useIsomorphicLayoutEffect(()=>{
|
|
18
|
+
if (accessible) {
|
|
19
|
+
resetInputValueBySelectedOption();
|
|
20
|
+
}
|
|
21
|
+
}, [
|
|
22
|
+
accessible,
|
|
23
|
+
resetInputValueBySelectedOption
|
|
24
|
+
]);
|
|
25
|
+
const resetInputValue = React.useCallback(()=>{
|
|
26
|
+
setInputValue('');
|
|
27
|
+
}, []);
|
|
28
|
+
const onInputChange = React.useCallback((e)=>{
|
|
29
|
+
onInputChangeProp && onInputChangeProp(e);
|
|
30
|
+
setInputValue(e.target.value);
|
|
31
|
+
}, [
|
|
32
|
+
onInputChangeProp,
|
|
33
|
+
setInputValue
|
|
34
|
+
]);
|
|
35
|
+
return {
|
|
36
|
+
inputValue,
|
|
37
|
+
resetInputValue,
|
|
38
|
+
resetInputValueBySelectedOption,
|
|
39
|
+
onInputChange
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
//# sourceMappingURL=useInputValueController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/hooks/useInputValueController.ts"],"sourcesContent":["import * as React from 'react';\nimport { useIsomorphicLayoutEffect } from '../../../lib/useIsomorphicLayoutEffect';\nimport { type SelectValue } from '../../NativeSelect/NativeSelect';\nimport { type SelectProps } from '../CustomSelect';\nimport { calculateInputValueFromOptions } from '../helpers';\nimport { type CustomSelectOptionInterface } from '../types';\n\n/* eslint-disable jsdoc/require-jsdoc */\ntype UseInputValueControllerProps<OptionInterfaceT extends CustomSelectOptionInterface> = Pick<\n SelectProps<OptionInterfaceT>,\n 'options' | 'onInputChange' | 'accessible'\n> & {\n selectedValue: SelectValue;\n};\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport function useInputValueController<OptionInterfaceT extends CustomSelectOptionInterface>({\n options,\n accessible,\n selectedValue,\n onInputChange: onInputChangeProp,\n}: UseInputValueControllerProps<OptionInterfaceT>) {\n const [inputValue, setInputValue] = React.useState('');\n const optionsRef = React.useRef(options);\n\n useIsomorphicLayoutEffect(() => {\n optionsRef.current = options;\n }, [options]);\n\n const resetInputValueBySelectedOption = React.useCallback(() => {\n setInputValue(calculateInputValueFromOptions(optionsRef.current, selectedValue));\n }, [selectedValue]);\n\n useIsomorphicLayoutEffect(() => {\n if (accessible) {\n resetInputValueBySelectedOption();\n }\n }, [accessible, resetInputValueBySelectedOption]);\n\n const resetInputValue = React.useCallback(() => {\n setInputValue('');\n }, []);\n\n const onInputChange: React.ChangeEventHandler<HTMLInputElement> = React.useCallback(\n (e) => {\n onInputChangeProp && onInputChangeProp(e);\n setInputValue(e.target.value);\n },\n [onInputChangeProp, setInputValue],\n );\n\n return {\n inputValue,\n resetInputValue,\n resetInputValueBySelectedOption,\n onInputChange,\n };\n}\n"],"names":["React","useIsomorphicLayoutEffect","calculateInputValueFromOptions","useInputValueController","options","accessible","selectedValue","onInputChange","onInputChangeProp","inputValue","setInputValue","useState","optionsRef","useRef","current","resetInputValueBySelectedOption","useCallback","resetInputValue","e","target","value"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,yBAAyB,QAAQ,4CAAyC;AAGnF,SAASC,8BAA8B,QAAQ,gBAAa;AAU5D,qCAAqC,GAErC,OAAO,SAASC,wBAA8E,EAC5FC,OAAO,EACPC,UAAU,EACVC,aAAa,EACbC,eAAeC,iBAAiB,EACe;IAC/C,MAAM,CAACC,YAAYC,cAAc,GAAGV,MAAMW,QAAQ,CAAC;IACnD,MAAMC,aAAaZ,MAAMa,MAAM,CAACT;IAEhCH,0BAA0B;QACxBW,WAAWE,OAAO,GAAGV;IACvB,GAAG;QAACA;KAAQ;IAEZ,MAAMW,kCAAkCf,MAAMgB,WAAW,CAAC;QACxDN,cAAcR,+BAA+BU,WAAWE,OAAO,EAAER;IACnE,GAAG;QAACA;KAAc;IAElBL,0BAA0B;QACxB,IAAII,YAAY;YACdU;QACF;IACF,GAAG;QAACV;QAAYU;KAAgC;IAEhD,MAAME,kBAAkBjB,MAAMgB,WAAW,CAAC;QACxCN,cAAc;IAChB,GAAG,EAAE;IAEL,MAAMH,gBAA4DP,MAAMgB,WAAW,CACjF,CAACE;QACCV,qBAAqBA,kBAAkBU;QACvCR,cAAcQ,EAAEC,MAAM,CAACC,KAAK;IAC9B,GACA;QAACZ;QAAmBE;KAAc;IAGpC,OAAO;QACLD;QACAQ;QACAF;QACAR;IACF;AACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import * as React from 'react';
|
|
2
|
+
interface UseScrollListControllerReturn {
|
|
3
|
+
scrollBoxRef: React.RefObject<HTMLDivElement | null>;
|
|
4
|
+
optionsWrapperRef: React.RefObject<HTMLDivElement | null>;
|
|
5
|
+
scrollToElement: (index: number, center?: boolean) => void;
|
|
6
|
+
}
|
|
7
|
+
export declare function useScrollListController(): UseScrollListControllerReturn;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=useScrollListController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useScrollListController.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/hooks/useScrollListController.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAG/B,UAAU,6BAA6B;IACrC,YAAY,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IACrD,iBAAiB,EAAE,KAAK,CAAC,SAAS,CAAC,cAAc,GAAG,IAAI,CAAC,CAAC;IAC1D,eAAe,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC;CAC5D;AAGD,wBAAgB,uBAAuB,IAAI,6BAA6B,CAmCvE"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
/* eslint-enable jsdoc/require-jsdoc */ export function useScrollListController() {
|
|
3
|
+
const scrollBoxRef = React.useRef(null);
|
|
4
|
+
const optionsWrapperRef = React.useRef(null);
|
|
5
|
+
const scrollToElement = React.useCallback((index, center = false)=>{
|
|
6
|
+
const dropdown = scrollBoxRef.current;
|
|
7
|
+
const optionsWrapper = optionsWrapperRef.current;
|
|
8
|
+
if (!dropdown || !optionsWrapper || index < 0 || index > optionsWrapper.children.length) {
|
|
9
|
+
return;
|
|
10
|
+
}
|
|
11
|
+
const item = optionsWrapper.children[index];
|
|
12
|
+
/* istanbul ignore if: проверка для TS (ситуация, когда среди children нет элемента с index, маловероятна) */ if (!item) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const dropdownHeight = dropdown.offsetHeight;
|
|
16
|
+
const scrollTop = dropdown.scrollTop;
|
|
17
|
+
const itemTop = item.offsetTop;
|
|
18
|
+
const itemHeight = item.offsetHeight;
|
|
19
|
+
if (center) {
|
|
20
|
+
dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;
|
|
21
|
+
} else if (itemTop + itemHeight > dropdownHeight + scrollTop) {
|
|
22
|
+
dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;
|
|
23
|
+
} else if (itemTop < scrollTop) {
|
|
24
|
+
dropdown.scrollTop = itemTop;
|
|
25
|
+
}
|
|
26
|
+
}, [
|
|
27
|
+
optionsWrapperRef,
|
|
28
|
+
scrollBoxRef
|
|
29
|
+
]);
|
|
30
|
+
return {
|
|
31
|
+
scrollToElement,
|
|
32
|
+
scrollBoxRef,
|
|
33
|
+
optionsWrapperRef
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=useScrollListController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/hooks/useScrollListController.ts"],"sourcesContent":["import * as React from 'react';\n\n/* eslint-disable jsdoc/require-jsdoc */\ninterface UseScrollListControllerReturn {\n scrollBoxRef: React.RefObject<HTMLDivElement | null>;\n optionsWrapperRef: React.RefObject<HTMLDivElement | null>;\n scrollToElement: (index: number, center?: boolean) => void;\n}\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport function useScrollListController(): UseScrollListControllerReturn {\n const scrollBoxRef = React.useRef<HTMLDivElement | null>(null);\n const optionsWrapperRef = React.useRef<HTMLDivElement>(null);\n\n const scrollToElement = React.useCallback(\n (index: number, center = false) => {\n const dropdown = scrollBoxRef.current;\n const optionsWrapper = optionsWrapperRef.current;\n\n if (!dropdown || !optionsWrapper || index < 0 || index > optionsWrapper.children.length) {\n return;\n }\n const item = optionsWrapper.children[index] as HTMLElement | null;\n /* istanbul ignore if: проверка для TS (ситуация, когда среди children нет элемента с index, маловероятна) */\n if (!item) {\n return;\n }\n\n const dropdownHeight = dropdown.offsetHeight;\n const scrollTop = dropdown.scrollTop;\n const itemTop = item.offsetTop;\n const itemHeight = item.offsetHeight;\n\n if (center) {\n dropdown.scrollTop = itemTop - dropdownHeight / 2 + itemHeight / 2;\n } else if (itemTop + itemHeight > dropdownHeight + scrollTop) {\n dropdown.scrollTop = itemTop - dropdownHeight + itemHeight;\n } else if (itemTop < scrollTop) {\n dropdown.scrollTop = itemTop;\n }\n },\n [optionsWrapperRef, scrollBoxRef],\n );\n\n return { scrollToElement, scrollBoxRef, optionsWrapperRef };\n}\n"],"names":["React","useScrollListController","scrollBoxRef","useRef","optionsWrapperRef","scrollToElement","useCallback","index","center","dropdown","current","optionsWrapper","children","length","item","dropdownHeight","offsetHeight","scrollTop","itemTop","offsetTop","itemHeight"],"mappings":"AAAA,YAAYA,WAAW,QAAQ;AAQ/B,qCAAqC,GAErC,OAAO,SAASC;IACd,MAAMC,eAAeF,MAAMG,MAAM,CAAwB;IACzD,MAAMC,oBAAoBJ,MAAMG,MAAM,CAAiB;IAEvD,MAAME,kBAAkBL,MAAMM,WAAW,CACvC,CAACC,OAAeC,SAAS,KAAK;QAC5B,MAAMC,WAAWP,aAAaQ,OAAO;QACrC,MAAMC,iBAAiBP,kBAAkBM,OAAO;QAEhD,IAAI,CAACD,YAAY,CAACE,kBAAkBJ,QAAQ,KAAKA,QAAQI,eAAeC,QAAQ,CAACC,MAAM,EAAE;YACvF;QACF;QACA,MAAMC,OAAOH,eAAeC,QAAQ,CAACL,MAAM;QAC3C,2GAA2G,GAC3G,IAAI,CAACO,MAAM;YACT;QACF;QAEA,MAAMC,iBAAiBN,SAASO,YAAY;QAC5C,MAAMC,YAAYR,SAASQ,SAAS;QACpC,MAAMC,UAAUJ,KAAKK,SAAS;QAC9B,MAAMC,aAAaN,KAAKE,YAAY;QAEpC,IAAIR,QAAQ;YACVC,SAASQ,SAAS,GAAGC,UAAUH,iBAAiB,IAAIK,aAAa;QACnE,OAAO,IAAIF,UAAUE,aAAaL,iBAAiBE,WAAW;YAC5DR,SAASQ,SAAS,GAAGC,UAAUH,iBAAiBK;QAClD,OAAO,IAAIF,UAAUD,WAAW;YAC9BR,SAASQ,SAAS,GAAGC;QACvB;IACF,GACA;QAACd;QAAmBF;KAAa;IAGnC,OAAO;QAAEG;QAAiBH;QAAcE;IAAkB;AAC5D"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type ChangeEvent } from 'react';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { type NativeSelectValue, type SelectValue } from '../../NativeSelect/NativeSelect';
|
|
4
|
+
import { type SelectProps } from '../CustomSelect';
|
|
5
|
+
type UseSelectedOptionControllerProps = Pick<SelectProps, 'value' | 'defaultValue'> & {
|
|
6
|
+
isControlledOutside: boolean;
|
|
7
|
+
allowClearButton: boolean;
|
|
8
|
+
onChange?: (e: ChangeEvent<HTMLSelectElement>, newValue: SelectValue) => void;
|
|
9
|
+
};
|
|
10
|
+
export declare function useSelectedOptionController({ value, defaultValue, isControlledOutside, allowClearButton, onChange, }: UseSelectedOptionControllerProps): {
|
|
11
|
+
selectedOptionValue: SelectValue;
|
|
12
|
+
setSelectedOptionValue: React.Dispatch<React.SetStateAction<SelectValue>>;
|
|
13
|
+
nativeSelectValue: NativeSelectValue;
|
|
14
|
+
setNativeSelectValue: (newValue: NativeSelectValue) => void;
|
|
15
|
+
onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
18
|
+
//# sourceMappingURL=useSelectedOptionController.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"useSelectedOptionController.d.ts","sourceRoot":"","sources":["../../../../src/components/CustomSelect/hooks/useSelectedOptionController.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,OAAO,CAAC;AACzC,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,EACL,KAAK,iBAAiB,EAItB,KAAK,WAAW,EACjB,MAAM,iCAAiC,CAAC;AACzC,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAGnD,KAAK,gCAAgC,GAAG,IAAI,CAAC,WAAW,EAAE,OAAO,GAAG,cAAc,CAAC,GAAG;IACpF,mBAAmB,EAAE,OAAO,CAAC;IAC7B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,EAAE,CAAC,CAAC,EAAE,WAAW,CAAC,iBAAiB,CAAC,EAAE,QAAQ,EAAE,WAAW,KAAK,IAAI,CAAC;CAC/E,CAAC;AAGF,wBAAgB,2BAA2B,CAAC,EAC1C,KAAK,EACL,YAAY,EACZ,mBAAmB,EACnB,gBAAgB,EAChB,QAAQ,GACT,EAAE,gCAAgC;;;;qCAkBpB,iBAAiB;;EAuF/B"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useStateWithPrev } from "../../../hooks/useStateWithPrev.js";
|
|
3
|
+
import { NOT_SELECTED, remapFromNativeValueToSelectValue, remapFromSelectValueToNativeValue } from "../../NativeSelect/NativeSelect.js";
|
|
4
|
+
/* eslint-enable jsdoc/require-jsdoc */ export function useSelectedOptionController({ value, defaultValue, isControlledOutside, allowClearButton, onChange }) {
|
|
5
|
+
const [[nativeSelectValue, prevNativeSelectValue], setNativeSelectValue] = useStateWithPrev(()=>{
|
|
6
|
+
if (value !== undefined) {
|
|
7
|
+
return remapFromSelectValueToNativeValue(value);
|
|
8
|
+
}
|
|
9
|
+
if (defaultValue !== undefined) {
|
|
10
|
+
return remapFromSelectValueToNativeValue(defaultValue);
|
|
11
|
+
}
|
|
12
|
+
return NOT_SELECTED.NATIVE;
|
|
13
|
+
});
|
|
14
|
+
const nativeSelectValueRef = React.useRef(nativeSelectValue);
|
|
15
|
+
const [selectedOptionValue, setSelectedOptionValue] = React.useState(()=>remapFromNativeValueToSelectValue(nativeSelectValue));
|
|
16
|
+
const _setNativeSelectValue = React.useCallback((newValue)=>{
|
|
17
|
+
setNativeSelectValue(newValue);
|
|
18
|
+
nativeSelectValueRef.current = newValue;
|
|
19
|
+
}, [
|
|
20
|
+
setNativeSelectValue
|
|
21
|
+
]);
|
|
22
|
+
React.useEffect(function syncNativeSelectValueWithPropValue() {
|
|
23
|
+
if (value !== undefined) {
|
|
24
|
+
_setNativeSelectValue(remapFromSelectValueToNativeValue(value));
|
|
25
|
+
}
|
|
26
|
+
}, [
|
|
27
|
+
value,
|
|
28
|
+
_setNativeSelectValue
|
|
29
|
+
]);
|
|
30
|
+
React.useEffect(function syncNativeSelectValueWithSelectedOptionValue() {
|
|
31
|
+
const remappedSelectedValue = remapFromSelectValueToNativeValue(selectedOptionValue);
|
|
32
|
+
if (nativeSelectValueRef.current !== remappedSelectedValue) {
|
|
33
|
+
setNativeSelectValue(remappedSelectedValue);
|
|
34
|
+
}
|
|
35
|
+
}, [
|
|
36
|
+
selectedOptionValue,
|
|
37
|
+
setNativeSelectValue
|
|
38
|
+
]);
|
|
39
|
+
const onNativeSelectChange = (e)=>{
|
|
40
|
+
// для ситуаций, когда в опциях value это string а value/defaultValue это number
|
|
41
|
+
// и наоборот, приводим значение nativeSelectValue из стейта к строке.
|
|
42
|
+
// ведь nativeSelect всегда возвращает string в onChange, а пользователь
|
|
43
|
+
// может использовать number для опций
|
|
44
|
+
//
|
|
45
|
+
// native select всегда возвращает string в качестве value в onChange
|
|
46
|
+
// Когда селект контролируемый, то пользователь, в onChange может сохранить в свой стейт строку (например '3'), хотя
|
|
47
|
+
// в качестве value опции может использовать число (3),
|
|
48
|
+
// тогда строчное значение value ('3') из стейта пользователя
|
|
49
|
+
// будет передано в CustomSelect, и после синхронизации nativeSelectValue (3) и props.value ('3') и после клика на уже выбранную опцию (3),
|
|
50
|
+
// когда nativeSelectValue обновится на значение опции (число 3),
|
|
51
|
+
// сравнение nativeSelectValue (3) и prevNativeSelectValue ('3') может не сработать лишь из-за того, что они в разных типах.
|
|
52
|
+
const convertedNativeSelectValue = typeof nativeSelectValue === 'number' && (typeof value === 'string' || typeof prevNativeSelectValue === 'string') ? String(nativeSelectValue) : nativeSelectValue;
|
|
53
|
+
const isCalledWithSameControlledOptionValue = isControlledOutside && value === remapFromNativeValueToSelectValue(convertedNativeSelectValue);
|
|
54
|
+
const isNativeValueChanged = convertedNativeSelectValue !== prevNativeSelectValue && prevNativeSelectValue !== undefined;
|
|
55
|
+
const isTriggeredByClearButton = allowClearButton && // Проверяем, что новое значение NOT_SELECTED.NATIVE
|
|
56
|
+
nativeSelectValue === NOT_SELECTED.NATIVE && // Проверяем, что предыдущее значение не undefined(кейс с первой отрисовкой, когда предыдущего значения не было)
|
|
57
|
+
prevNativeSelectValue !== undefined && // Проверяем, что предыдущее значение не NOT_SELECTED.NATIVE(если до этого было уже сброшенное значение)
|
|
58
|
+
prevNativeSelectValue !== NOT_SELECTED.NATIVE;
|
|
59
|
+
const shouldCallOnChange = !isCalledWithSameControlledOptionValue && (isNativeValueChanged || isTriggeredByClearButton);
|
|
60
|
+
if (!shouldCallOnChange) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
const remappedNativeValue = remapFromNativeValueToSelectValue(e.currentTarget.value);
|
|
64
|
+
if (e.target.value === NOT_SELECTED.NATIVE) {
|
|
65
|
+
e.target.value = '';
|
|
66
|
+
}
|
|
67
|
+
if (e.currentTarget.value === NOT_SELECTED.NATIVE) {
|
|
68
|
+
e.currentTarget.value = '';
|
|
69
|
+
}
|
|
70
|
+
onChange === null || onChange === void 0 ? void 0 : onChange(e, remappedNativeValue);
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
selectedOptionValue,
|
|
74
|
+
setSelectedOptionValue,
|
|
75
|
+
nativeSelectValue,
|
|
76
|
+
setNativeSelectValue: _setNativeSelectValue,
|
|
77
|
+
onNativeSelectChange
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
//# sourceMappingURL=useSelectedOptionController.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/components/CustomSelect/hooks/useSelectedOptionController.ts"],"sourcesContent":["import { type ChangeEvent } from 'react';\nimport * as React from 'react';\nimport { useStateWithPrev } from '../../../hooks/useStateWithPrev';\nimport {\n type NativeSelectValue,\n NOT_SELECTED,\n remapFromNativeValueToSelectValue,\n remapFromSelectValueToNativeValue,\n type SelectValue,\n} from '../../NativeSelect/NativeSelect';\nimport { type SelectProps } from '../CustomSelect';\n\n/* eslint-disable jsdoc/require-jsdoc */\ntype UseSelectedOptionControllerProps = Pick<SelectProps, 'value' | 'defaultValue'> & {\n isControlledOutside: boolean;\n allowClearButton: boolean;\n onChange?: (e: ChangeEvent<HTMLSelectElement>, newValue: SelectValue) => void;\n};\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport function useSelectedOptionController({\n value,\n defaultValue,\n isControlledOutside,\n allowClearButton,\n onChange,\n}: UseSelectedOptionControllerProps) {\n const [[nativeSelectValue, prevNativeSelectValue], setNativeSelectValue] =\n useStateWithPrev<NativeSelectValue>(() => {\n if (value !== undefined) {\n return remapFromSelectValueToNativeValue(value);\n }\n if (defaultValue !== undefined) {\n return remapFromSelectValueToNativeValue(defaultValue);\n }\n return NOT_SELECTED.NATIVE;\n });\n const nativeSelectValueRef = React.useRef<NativeSelectValue>(nativeSelectValue);\n\n const [selectedOptionValue, setSelectedOptionValue] = React.useState<SelectValue>(() =>\n remapFromNativeValueToSelectValue(nativeSelectValue),\n );\n\n const _setNativeSelectValue = React.useCallback(\n (newValue: NativeSelectValue) => {\n setNativeSelectValue(newValue);\n nativeSelectValueRef.current = newValue;\n },\n [setNativeSelectValue],\n );\n\n React.useEffect(\n function syncNativeSelectValueWithPropValue() {\n if (value !== undefined) {\n _setNativeSelectValue(remapFromSelectValueToNativeValue(value));\n }\n },\n [value, _setNativeSelectValue],\n );\n\n React.useEffect(\n function syncNativeSelectValueWithSelectedOptionValue() {\n const remappedSelectedValue = remapFromSelectValueToNativeValue(selectedOptionValue);\n if (nativeSelectValueRef.current !== remappedSelectedValue) {\n setNativeSelectValue(remappedSelectedValue);\n }\n },\n [selectedOptionValue, setNativeSelectValue],\n );\n\n const onNativeSelectChange: React.ChangeEventHandler<HTMLSelectElement> = (e) => {\n // для ситуаций, когда в опциях value это string а value/defaultValue это number\n // и наоборот, приводим значение nativeSelectValue из стейта к строке.\n // ведь nativeSelect всегда возвращает string в onChange, а пользователь\n // может использовать number для опций\n //\n // native select всегда возвращает string в качестве value в onChange\n // Когда селект контролируемый, то пользователь, в onChange может сохранить в свой стейт строку (например '3'), хотя\n // в качестве value опции может использовать число (3),\n // тогда строчное значение value ('3') из стейта пользователя\n // будет передано в CustomSelect, и после синхронизации nativeSelectValue (3) и props.value ('3') и после клика на уже выбранную опцию (3),\n // когда nativeSelectValue обновится на значение опции (число 3),\n // сравнение nativeSelectValue (3) и prevNativeSelectValue ('3') может не сработать лишь из-за того, что они в разных типах.\n const convertedNativeSelectValue =\n typeof nativeSelectValue === 'number' &&\n (typeof value === 'string' || typeof prevNativeSelectValue === 'string')\n ? String(nativeSelectValue)\n : nativeSelectValue;\n\n const isCalledWithSameControlledOptionValue =\n isControlledOutside &&\n value === remapFromNativeValueToSelectValue(convertedNativeSelectValue);\n\n const isNativeValueChanged =\n convertedNativeSelectValue !== prevNativeSelectValue && prevNativeSelectValue !== undefined;\n\n const isTriggeredByClearButton =\n allowClearButton &&\n // Проверяем, что новое значение NOT_SELECTED.NATIVE\n nativeSelectValue === NOT_SELECTED.NATIVE &&\n // Проверяем, что предыдущее значение не undefined(кейс с первой отрисовкой, когда предыдущего значения не было)\n prevNativeSelectValue !== undefined &&\n // Проверяем, что предыдущее значение не NOT_SELECTED.NATIVE(если до этого было уже сброшенное значение)\n prevNativeSelectValue !== NOT_SELECTED.NATIVE;\n\n const shouldCallOnChange =\n !isCalledWithSameControlledOptionValue && (isNativeValueChanged || isTriggeredByClearButton);\n\n if (!shouldCallOnChange) {\n return;\n }\n\n const remappedNativeValue = remapFromNativeValueToSelectValue(e.currentTarget.value);\n\n if (e.target.value === NOT_SELECTED.NATIVE) {\n e.target.value = '';\n }\n if (e.currentTarget.value === NOT_SELECTED.NATIVE) {\n e.currentTarget.value = '';\n }\n\n onChange?.(e, remappedNativeValue);\n };\n\n return {\n selectedOptionValue,\n setSelectedOptionValue,\n nativeSelectValue,\n setNativeSelectValue: _setNativeSelectValue,\n onNativeSelectChange,\n };\n}\n"],"names":["React","useStateWithPrev","NOT_SELECTED","remapFromNativeValueToSelectValue","remapFromSelectValueToNativeValue","useSelectedOptionController","value","defaultValue","isControlledOutside","allowClearButton","onChange","nativeSelectValue","prevNativeSelectValue","setNativeSelectValue","undefined","NATIVE","nativeSelectValueRef","useRef","selectedOptionValue","setSelectedOptionValue","useState","_setNativeSelectValue","useCallback","newValue","current","useEffect","syncNativeSelectValueWithPropValue","syncNativeSelectValueWithSelectedOptionValue","remappedSelectedValue","onNativeSelectChange","e","convertedNativeSelectValue","String","isCalledWithSameControlledOptionValue","isNativeValueChanged","isTriggeredByClearButton","shouldCallOnChange","remappedNativeValue","currentTarget","target"],"mappings":"AACA,YAAYA,WAAW,QAAQ;AAC/B,SAASC,gBAAgB,QAAQ,qCAAkC;AACnE,SAEEC,YAAY,EACZC,iCAAiC,EACjCC,iCAAiC,QAE5B,qCAAkC;AASzC,qCAAqC,GAErC,OAAO,SAASC,4BAA4B,EAC1CC,KAAK,EACLC,YAAY,EACZC,mBAAmB,EACnBC,gBAAgB,EAChBC,QAAQ,EACyB;IACjC,MAAM,CAAC,CAACC,mBAAmBC,sBAAsB,EAAEC,qBAAqB,GACtEZ,iBAAoC;QAClC,IAAIK,UAAUQ,WAAW;YACvB,OAAOV,kCAAkCE;QAC3C;QACA,IAAIC,iBAAiBO,WAAW;YAC9B,OAAOV,kCAAkCG;QAC3C;QACA,OAAOL,aAAaa,MAAM;IAC5B;IACF,MAAMC,uBAAuBhB,MAAMiB,MAAM,CAAoBN;IAE7D,MAAM,CAACO,qBAAqBC,uBAAuB,GAAGnB,MAAMoB,QAAQ,CAAc,IAChFjB,kCAAkCQ;IAGpC,MAAMU,wBAAwBrB,MAAMsB,WAAW,CAC7C,CAACC;QACCV,qBAAqBU;QACrBP,qBAAqBQ,OAAO,GAAGD;IACjC,GACA;QAACV;KAAqB;IAGxBb,MAAMyB,SAAS,CACb,SAASC;QACP,IAAIpB,UAAUQ,WAAW;YACvBO,sBAAsBjB,kCAAkCE;QAC1D;IACF,GACA;QAACA;QAAOe;KAAsB;IAGhCrB,MAAMyB,SAAS,CACb,SAASE;QACP,MAAMC,wBAAwBxB,kCAAkCc;QAChE,IAAIF,qBAAqBQ,OAAO,KAAKI,uBAAuB;YAC1Df,qBAAqBe;QACvB;IACF,GACA;QAACV;QAAqBL;KAAqB;IAG7C,MAAMgB,uBAAoE,CAACC;QACzE,gFAAgF;QAChF,sEAAsE;QACtE,wEAAwE;QACxE,sCAAsC;QACtC,EAAE;QACF,qEAAqE;QACrE,oHAAoH;QACpH,uDAAuD;QACvD,6DAA6D;QAC7D,2IAA2I;QAC3I,iEAAiE;QACjE,4HAA4H;QAC5H,MAAMC,6BACJ,OAAOpB,sBAAsB,YAC5B,CAAA,OAAOL,UAAU,YAAY,OAAOM,0BAA0B,QAAO,IAClEoB,OAAOrB,qBACPA;QAEN,MAAMsB,wCACJzB,uBACAF,UAAUH,kCAAkC4B;QAE9C,MAAMG,uBACJH,+BAA+BnB,yBAAyBA,0BAA0BE;QAEpF,MAAMqB,2BACJ1B,oBACA,oDAAoD;QACpDE,sBAAsBT,aAAaa,MAAM,IACzC,gHAAgH;QAChHH,0BAA0BE,aAC1B,wGAAwG;QACxGF,0BAA0BV,aAAaa,MAAM;QAE/C,MAAMqB,qBACJ,CAACH,yCAA0CC,CAAAA,wBAAwBC,wBAAuB;QAE5F,IAAI,CAACC,oBAAoB;YACvB;QACF;QAEA,MAAMC,sBAAsBlC,kCAAkC2B,EAAEQ,aAAa,CAAChC,KAAK;QAEnF,IAAIwB,EAAES,MAAM,CAACjC,KAAK,KAAKJ,aAAaa,MAAM,EAAE;YAC1Ce,EAAES,MAAM,CAACjC,KAAK,GAAG;QACnB;QACA,IAAIwB,EAAEQ,aAAa,CAAChC,KAAK,KAAKJ,aAAaa,MAAM,EAAE;YACjDe,EAAEQ,aAAa,CAAChC,KAAK,GAAG;QAC1B;QAEAI,qBAAAA,+BAAAA,SAAWoB,GAAGO;IAChB;IAEA,OAAO;QACLnB;QACAC;QACAR;QACAE,sBAAsBQ;QACtBQ;IACF;AACF"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type * as React from 'react';
|
|
2
|
+
import { type Alignment, type Side } from '../../lib/floating';
|
|
3
|
+
import { type CustomSelectOptionProps } from '../CustomSelectOption/CustomSelectOption';
|
|
4
|
+
import { type SelectValue } from '../NativeSelect/NativeSelect';
|
|
5
|
+
export type MousePosition = {
|
|
6
|
+
x: React.MouseEvent['clientX'];
|
|
7
|
+
y: React.MouseEvent['clientY'];
|
|
8
|
+
};
|
|
9
|
+
export interface CustomSelectOptionInterface {
|
|
10
|
+
/**
|
|
11
|
+
* Значение.
|
|
12
|
+
*/
|
|
13
|
+
value: Exclude<SelectValue, null>;
|
|
14
|
+
/**
|
|
15
|
+
* Отображаемый текст.
|
|
16
|
+
*/
|
|
17
|
+
label: React.ReactElement | string;
|
|
18
|
+
/**
|
|
19
|
+
* Блокировка взаимодействия с компонентом.
|
|
20
|
+
*/
|
|
21
|
+
disabled?: boolean;
|
|
22
|
+
[index: string]: any;
|
|
23
|
+
}
|
|
24
|
+
export interface CustomSelectRenderOption<T extends CustomSelectOptionInterface> extends CustomSelectOptionProps {
|
|
25
|
+
/**
|
|
26
|
+
* Данные об опции.
|
|
27
|
+
*/
|
|
28
|
+
option: T;
|
|
29
|
+
}
|
|
30
|
+
type PopupDirectionSide = Extract<Side, 'top' | 'bottom'>;
|
|
31
|
+
export type PopupDirection = PopupDirectionSide | `${PopupDirectionSide}-${Alignment}`;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=types.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/components/CustomSelect/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,KAAK,MAAM,OAAO,CAAC;AACpC,OAAO,EAAE,KAAK,SAAS,EAAE,KAAK,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,KAAK,uBAAuB,EAAE,MAAM,0CAA0C,CAAC;AACxF,OAAO,EAAE,KAAK,WAAW,EAAE,MAAM,8BAA8B,CAAC;AAGhE,MAAM,MAAM,aAAa,GAAG;IAC1B,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC,EAAE,KAAK,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;CAChC,CAAC;AAGF,MAAM,WAAW,2BAA2B;IAC1C;;OAEG;IACH,KAAK,EAAE,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC,CAAC;IAClC;;OAEG;IACH,KAAK,EAAE,KAAK,CAAC,YAAY,GAAG,MAAM,CAAC;IACnC;;OAEG;IACH,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,CAAC,KAAK,EAAE,MAAM,GAAG,GAAG,CAAC;CACtB;AAED,MAAM,WAAW,wBAAwB,CAAC,CAAC,SAAS,2BAA2B,CAC7E,SAAQ,uBAAuB;IAC/B;;OAEG;IACH,MAAM,EAAE,CAAC,CAAC;CACX;AAED,KAAK,kBAAkB,GAAG,OAAO,CAAC,IAAI,EAAE,KAAK,GAAG,QAAQ,CAAC,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,kBAAkB,GAAG,GAAG,kBAAkB,IAAI,SAAS,EAAE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/components/CustomSelect/types.ts"],"sourcesContent":["import type * as React from 'react';\nimport { type Alignment, type Side } from '../../lib/floating';\nimport { type CustomSelectOptionProps } from '../CustomSelectOption/CustomSelectOption';\nimport { type SelectValue } from '../NativeSelect/NativeSelect';\n\n/* eslint-disable jsdoc/require-jsdoc */\nexport type MousePosition = {\n x: React.MouseEvent['clientX'];\n y: React.MouseEvent['clientY'];\n};\n/* eslint-enable jsdoc/require-jsdoc */\n\nexport interface CustomSelectOptionInterface {\n /**\n * Значение.\n */\n value: Exclude<SelectValue, null>;\n /**\n * Отображаемый текст.\n */\n label: React.ReactElement | string;\n /**\n * Блокировка взаимодействия с компонентом.\n */\n disabled?: boolean;\n [index: string]: any;\n}\n\nexport interface CustomSelectRenderOption<T extends CustomSelectOptionInterface>\n extends CustomSelectOptionProps {\n /**\n * Данные об опции.\n */\n option: T;\n}\n\ntype PopupDirectionSide = Extract<Side, 'top' | 'bottom'>;\nexport type PopupDirection = PopupDirectionSide | `${PopupDirectionSide}-${Alignment}`;\n"],"names":[],"mappings":"AAqCA,WAAuF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"CustomSelectDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/CustomSelectDropdown/CustomSelectDropdown.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAKpG,MAAM,WAAW,yBACf,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAC/C,IAAI,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,EACjD,gBAAgB;IAClB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,oBAAoB,GAAI,8JAclC,yBAAyB,KAAG,KAAK,CAAC,
|
|
1
|
+
{"version":3,"file":"CustomSelectDropdown.d.ts","sourceRoot":"","sources":["../../../src/components/CustomSelectDropdown/CustomSelectDropdown.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAE/B,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,gBAAgB,EAAE,yBAAyB,EAAE,MAAM,aAAa,CAAC;AAC/E,OAAO,EAAoB,KAAK,qBAAqB,EAAE,MAAM,sCAAsC,CAAC;AAKpG,MAAM,WAAW,yBACf,SAAQ,yBAAyB,CAAC,cAAc,CAAC,EAC/C,IAAI,CAAC,qBAAqB,EAAE,oBAAoB,CAAC,EACjD,gBAAgB;IAClB,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,GAAG,IAAI,CAAC,CAAC;IAC/C,SAAS,CAAC,EAAE,SAAS,CAAC;IACtB,YAAY,CAAC,EAAE,KAAK,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IACzC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB;;OAEG;IACH,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,iBAAiB,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,KAAK,IAAI,CAAC;IACnD;;OAEG;IACH,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB;AAED,eAAO,MAAM,oBAAoB,GAAI,8JAclC,yBAAyB,KAAG,KAAK,CAAC,SAoCpC,CAAC"}
|
|
@@ -37,6 +37,7 @@ export const CustomSelectDropdown = (_param)=>{
|
|
|
37
37
|
className: noMaxHeight ? undefined : "vkuiCustomSelectDropdown__inWithMaxHeight",
|
|
38
38
|
overscrollBehavior: overscrollBehavior,
|
|
39
39
|
tabIndex: -1,
|
|
40
|
+
"aria-busy": fetching,
|
|
40
41
|
children: fetching ? /*#__PURE__*/ _jsx("div", {
|
|
41
42
|
className: "vkuiCustomSelectDropdown__fetching",
|
|
42
43
|
children: /*#__PURE__*/ _jsx(Spinner, {
|