@cube-dev/ui-kit 0.83.3 → 0.85.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +20 -0
- package/es/_internal/hooks/index.js +1 -1
- package/es/_internal/hooks/use-chained-callback.js +1 -1
- package/es/_internal/hooks/use-debounced-value.js +1 -1
- package/es/_internal/hooks/use-deprecation-warning.js +1 -1
- package/es/_internal/hooks/use-effect-once.js +1 -1
- package/es/_internal/hooks/use-event.js +1 -1
- package/es/_internal/hooks/use-is-first-render.js +1 -1
- package/es/_internal/hooks/use-sync-ref.js +1 -1
- package/es/_internal/hooks/use-timer/index.js +1 -1
- package/es/_internal/hooks/use-timer/timer.js +1 -1
- package/es/_internal/hooks/use-timer/use-timer.js +1 -1
- package/es/_internal/hooks/use-update-effect.js +1 -1
- package/es/_internal/hooks/use-warn.js +1 -1
- package/es/_internal/index.js +1 -1
- package/es/components/Block.js +1 -1
- package/es/components/GlobalStyles.js +1 -1
- package/es/components/GridProvider.js +1 -1
- package/es/components/HiddenInput.js +1 -1
- package/es/components/Item.js +7 -2
- package/es/components/OpenTrasition.js +1 -1
- package/es/components/Root.js +1 -1
- package/es/components/actions/Action/Action.js +1 -1
- package/es/components/actions/Button/Button.js +1 -1
- package/es/components/actions/Button/index.js +1 -1
- package/es/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/es/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/es/components/actions/CommandMenu/index.js +1 -1
- package/es/components/actions/CommandMenu/styled.js +1 -1
- package/es/components/actions/ItemAction/ItemAction.js +127 -12
- package/es/components/actions/ItemAction/index.js +1 -1
- package/es/components/actions/ItemActionContext.js +25 -0
- package/es/components/actions/ItemButton/ItemButton.js +102 -6
- package/es/components/actions/ItemButton/index.js +1 -1
- package/es/components/actions/Link/Link.js +1 -1
- package/es/components/actions/Menu/Menu.js +1 -1
- package/es/components/actions/Menu/MenuItem.js +3 -3
- package/es/components/actions/Menu/MenuSection.js +1 -1
- package/es/components/actions/Menu/MenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/es/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/es/components/actions/Menu/context.js +1 -1
- package/es/components/actions/Menu/index.js +1 -1
- package/es/components/actions/Menu/styled.js +1 -1
- package/es/components/actions/index.js +2 -1
- package/es/components/actions/use-action.js +1 -1
- package/es/components/actions/use-anchored-menu.js +1 -1
- package/es/components/actions/use-context-menu.js +1 -1
- package/es/components/content/ActiveZone/ActiveZone.js +1 -1
- package/es/components/content/Alert/Alert.js +1 -1
- package/es/components/content/Alert/index.js +1 -1
- package/es/components/content/Alert/types.js +1 -1
- package/es/components/content/Alert/use-alert.js +1 -1
- package/es/components/content/Avatar/Avatar.js +1 -1
- package/es/components/content/Badge/Badge.js +1 -1
- package/es/components/content/Card/Card.js +1 -1
- package/es/components/content/Content.js +1 -1
- package/es/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/es/components/content/CopyPasteBlock/index.js +1 -1
- package/es/components/content/CopySnippet/CopySnippet.js +1 -1
- package/es/components/content/CopySnippet/index.js +1 -1
- package/es/components/content/Divider.js +1 -1
- package/es/components/content/Footer.js +1 -1
- package/es/components/content/Header.js +1 -1
- package/es/components/content/HotKeys/HotKeys.js +1 -1
- package/es/components/content/HotKeys/index.js +1 -1
- package/es/components/content/ItemBadge/ItemBadge.js +119 -0
- package/es/components/content/ItemBadge/index.js +10 -0
- package/es/components/content/ItemBase/ItemBase.js +92 -22
- package/es/components/content/ItemBase/index.js +2 -1
- package/es/components/content/List/SectionHeading.js +1 -1
- package/es/components/content/List/index.js +1 -1
- package/es/components/content/Paragraph.js +1 -1
- package/es/components/content/Placeholder/Placeholder.js +1 -1
- package/es/components/content/PrismCode/PrismCode.js +1 -1
- package/es/components/content/PrismCode/prismSetup.js +1 -1
- package/es/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/es/components/content/Result/Result.js +1 -1
- package/es/components/content/Skeleton/Skeleton.js +1 -1
- package/es/components/content/Tag/Tag.js +1 -1
- package/es/components/content/Text.js +1 -1
- package/es/components/content/Title.js +1 -1
- package/es/components/fields/Checkbox/Checkbox.js +1 -1
- package/es/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/es/components/fields/Checkbox/context.js +1 -1
- package/es/components/fields/Checkbox/index.js +1 -1
- package/es/components/fields/ComboBox/ComboBox.js +225 -134
- package/es/components/fields/ComboBox/index.js +1 -1
- package/es/components/fields/DatePicker/DateInput.js +1 -1
- package/es/components/fields/DatePicker/DateInputBase.js +4 -3
- package/es/components/fields/DatePicker/DatePicker.js +2 -3
- package/es/components/fields/DatePicker/DatePickerButton.js +3 -8
- package/es/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/es/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/es/components/fields/DatePicker/DatePickerSegment.js +3 -1
- package/es/components/fields/DatePicker/DateRangePicker.js +2 -3
- package/es/components/fields/DatePicker/DateRangeSeparatedPicker.js +9 -5
- package/es/components/fields/DatePicker/TimeInput.js +1 -1
- package/es/components/fields/DatePicker/index.js +1 -1
- package/es/components/fields/DatePicker/intl.js +1 -1
- package/es/components/fields/DatePicker/parseDate.js +1 -1
- package/es/components/fields/DatePicker/props.js +1 -1
- package/es/components/fields/DatePicker/types.js +1 -1
- package/es/components/fields/DatePicker/utils.js +1 -1
- package/es/components/fields/FileInput/FileInput.js +1 -1
- package/es/components/fields/FilterListBox/FilterListBox.js +4 -7
- package/es/components/fields/FilterListBox/index.js +1 -1
- package/es/components/fields/FilterPicker/FilterPicker.js +4 -5
- package/es/components/fields/FilterPicker/index.js +1 -1
- package/es/components/fields/Input/Input.js +1 -1
- package/es/components/fields/Input/index.js +1 -1
- package/es/components/fields/LegacyComboBox/LegacyComboBox.js +1 -1
- package/es/components/fields/LegacyComboBox/index.js +1 -1
- package/es/components/fields/ListBox/ListBox.js +7 -6
- package/es/components/fields/ListBox/index.js +1 -1
- package/es/components/fields/NumberInput/NumberInput.js +1 -1
- package/es/components/fields/NumberInput/StepButton.js +1 -1
- package/es/components/fields/PasswordInput/PasswordInput.js +3 -3
- package/es/components/fields/Picker/Picker.js +418 -0
- package/es/components/fields/Picker/index.js +10 -0
- package/es/components/fields/RadioGroup/Radio.js +1 -1
- package/es/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/es/components/fields/RadioGroup/context.js +1 -1
- package/es/components/fields/RadioGroup/index.js +1 -1
- package/es/components/fields/SearchInput/SearchInput.js +1 -1
- package/es/components/fields/SearchInput/index.js +1 -1
- package/es/components/fields/Select/Select.js +29 -27
- package/es/components/fields/Select/index.js +1 -1
- package/es/components/fields/Slider/Gradation.js +1 -1
- package/es/components/fields/Slider/Header.js +1 -1
- package/es/components/fields/Slider/RangeSlider.js +1 -1
- package/es/components/fields/Slider/Slider.js +1 -1
- package/es/components/fields/Slider/SliderBase.js +1 -1
- package/es/components/fields/Slider/SliderInput.js +1 -1
- package/es/components/fields/Slider/SliderThumb.js +1 -1
- package/es/components/fields/Slider/SliderTrack.js +1 -1
- package/es/components/fields/Slider/elements.js +1 -1
- package/es/components/fields/Slider/index.js +1 -1
- package/es/components/fields/Slider/types.js +1 -1
- package/es/components/fields/Switch/Switch.js +1 -1
- package/es/components/fields/Switch/index.js +1 -1
- package/es/components/fields/TextArea/TextArea.js +1 -1
- package/es/components/fields/TextArea/index.js +1 -1
- package/es/components/fields/TextInput/TextInput.js +1 -1
- package/es/components/fields/TextInput/TextInputBase.js +1 -1
- package/es/components/fields/TextInput/index.js +1 -1
- package/es/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/es/components/fields/TextInputMapper/index.js +1 -1
- package/es/components/fields/index.js +2 -1
- package/es/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/es/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/es/components/form/FieldWrapper/index.js +1 -1
- package/es/components/form/FieldWrapper/types.js +1 -1
- package/es/components/form/Form/Field.js +1 -1
- package/es/components/form/Form/Form.js +1 -1
- package/es/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/es/components/form/Form/ResetButton/index.js +1 -1
- package/es/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/es/components/form/Form/SubmitButton/index.js +1 -1
- package/es/components/form/Form/SubmitError.js +1 -1
- package/es/components/form/Form/index.js +1 -1
- package/es/components/form/Form/types.js +1 -1
- package/es/components/form/Form/use-field/index.js +1 -1
- package/es/components/form/Form/use-field/types.js +1 -1
- package/es/components/form/Form/use-field/use-field-props.js +1 -1
- package/es/components/form/Form/use-field/use-field.js +3 -1
- package/es/components/form/Form/use-form.js +1 -1
- package/es/components/form/Form/validation.js +1 -1
- package/es/components/form/Label.js +1 -1
- package/es/components/form/index.js +1 -1
- package/es/components/form/wrapper.js +1 -1
- package/es/components/helpers/DisplayTransition/DisplayTransition.js +17 -3
- package/es/components/helpers/index.js +1 -1
- package/es/components/layout/Flex.js +1 -1
- package/es/components/layout/Flow.js +1 -1
- package/es/components/layout/Grid.js +1 -1
- package/es/components/layout/Panel.js +1 -1
- package/es/components/layout/Prefix.js +1 -1
- package/es/components/layout/ResizablePanel.js +1 -1
- package/es/components/layout/Space.js +1 -1
- package/es/components/layout/Suffix.js +1 -1
- package/es/components/navigation/LegacyTabs/LegacyTabs.js +1 -1
- package/es/components/organisms/FileTabs/FileTabs.js +1 -1
- package/es/components/organisms/StatsCard/StatsCard.js +1 -1
- package/es/components/other/Base64Upload/Base64Upload.js +1 -1
- package/es/components/other/Calendar/Calendar.js +2 -2
- package/es/components/other/Calendar/CalendarCell.js +7 -10
- package/es/components/other/Calendar/CalendarGrid.js +1 -1
- package/es/components/other/Calendar/RangeCalendar.js +1 -1
- package/es/components/other/CloudLogo/CloudLogo.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/es/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/es/components/overlays/AlertDialog/index.js +1 -1
- package/es/components/overlays/AlertDialog/types.js +1 -1
- package/es/components/overlays/Dialog/Dialog.js +2 -1
- package/es/components/overlays/Dialog/DialogContainer.js +1 -1
- package/es/components/overlays/Dialog/DialogForm.js +1 -1
- package/es/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/es/components/overlays/Dialog/context.js +1 -1
- package/es/components/overlays/Dialog/index.js +1 -1
- package/es/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/es/components/overlays/Modal/Modal.js +1 -1
- package/es/components/overlays/Modal/OpenTransition.js +1 -1
- package/es/components/overlays/Modal/Overlay.js +1 -1
- package/es/components/overlays/Modal/Popover.js +1 -1
- package/es/components/overlays/Modal/Tray.js +1 -1
- package/es/components/overlays/Modal/Underlay.js +1 -1
- package/es/components/overlays/Modal/index.js +1 -1
- package/es/components/overlays/Modal/types.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/FloatingNotification.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/NotificationsBar.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/TransitionComponent.js +1 -1
- package/es/components/overlays/NewNotifications/Bar/index.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogContext.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/NotificationsDialogTrigger.js +1 -1
- package/es/components/overlays/NewNotifications/Dialog/index.js +1 -1
- package/es/components/overlays/NewNotifications/Notification.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationAction.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationCloseButton.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationDescription.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationFooter.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationHeader.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationIcon.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/NotificationView.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationView/types.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsContext.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/NotificationsProvider.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsContext/use-notifications.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsList.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/NotificationsListItem.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/index.js +1 -1
- package/es/components/overlays/NewNotifications/NotificationsList/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/index.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/types.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notification-list-item.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-api.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-list.js +1 -1
- package/es/components/overlays/NewNotifications/hooks/use-notifications-observer.js +1 -1
- package/es/components/overlays/NewNotifications/index.js +1 -1
- package/es/components/overlays/NewNotifications/types.js +1 -1
- package/es/components/overlays/Notification/Notification.js +1 -1
- package/es/components/overlays/OverlayWrapper.js +1 -1
- package/es/components/overlays/Toasts/Toast.js +1 -1
- package/es/components/overlays/Toasts/index.js +1 -1
- package/es/components/overlays/Toasts/types.js +1 -1
- package/es/components/overlays/Toasts/use-toasts-api.js +1 -1
- package/es/components/overlays/Tooltip/Tooltip.js +2 -2
- package/es/components/overlays/Tooltip/TooltipProvider.js +4 -4
- package/es/components/overlays/Tooltip/TooltipTrigger.js +5 -4
- package/es/components/overlays/Tooltip/context.js +1 -1
- package/es/components/overlays/Tooltip/index.js +1 -1
- package/es/components/portal/Portal.js +1 -1
- package/es/components/portal/PortalProvider.js +1 -1
- package/es/components/portal/index.js +1 -1
- package/es/components/portal/types.js +1 -1
- package/es/components/portal/usePortal.js +1 -1
- package/es/components/shared/InvalidIcon.js +1 -1
- package/es/components/shared/ValidIcon.js +1 -1
- package/es/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/es/components/status/LoadingAnimation/index.js +1 -1
- package/es/components/status/Spin/Cube.js +1 -1
- package/es/components/status/Spin/InternalSpinner.js +1 -1
- package/es/components/status/Spin/Spin.js +1 -1
- package/es/components/status/Spin/SpinsContainer.js +1 -1
- package/es/components/status/Spin/index.js +1 -1
- package/es/components/status/Spin/types.js +1 -1
- package/es/components/status/index.js +1 -1
- package/es/data/item-themes.js +48 -1
- package/es/data/themes.js +1 -1
- package/es/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/es/icons/AdjustmentsIcon.js +1 -1
- package/es/icons/AiIcon.js +1 -1
- package/es/icons/AreaChartIcon.js +1 -1
- package/es/icons/BackwardIcon.js +1 -1
- package/es/icons/BarChartIcon.js +1 -1
- package/es/icons/BellFilledIcon.js +1 -1
- package/es/icons/BellIcon.js +1 -1
- package/es/icons/BooleanIcon.js +1 -1
- package/es/icons/CalendarEditIcon.js +1 -1
- package/es/icons/CalendarIcon.js +1 -1
- package/es/icons/CaretDownIcon.js +1 -1
- package/es/icons/CaretUpIcon.js +1 -1
- package/es/icons/ChartAreaStackedIcon.js +1 -1
- package/es/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarGroupedIcon.js +1 -1
- package/es/icons/ChartBarHorizontalIcon.js +1 -1
- package/es/icons/ChartBarLineIcon.js +1 -1
- package/es/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/es/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/es/icons/ChartBoxPlot2Icon.js +1 -1
- package/es/icons/ChartBoxPlotIcon.js +1 -1
- package/es/icons/ChartBubbleIcon.js +1 -1
- package/es/icons/ChartDonut2Icon.js +1 -1
- package/es/icons/ChartFunnelIcon.js +1 -1
- package/es/icons/ChartHeatmapIcon.js +1 -1
- package/es/icons/ChartKPIIcon.js +1 -1
- package/es/icons/ChartPie2Icon.js +1 -1
- package/es/icons/ChartScatterIcon.js +1 -1
- package/es/icons/CheckCircleFilledIcon.js +1 -1
- package/es/icons/CheckCircleIcon.js +1 -1
- package/es/icons/CheckIcon.js +1 -1
- package/es/icons/CircleFilledIcon.js +1 -1
- package/es/icons/ClearIcon.js +1 -1
- package/es/icons/CloseCircleFilledIcon.js +1 -1
- package/es/icons/CloseCircleIcon.js +1 -1
- package/es/icons/CloseIcon.js +1 -1
- package/es/icons/CodeIcon.js +1 -1
- package/es/icons/CopyIcon.js +1 -1
- package/es/icons/CountIcon.js +1 -1
- package/es/icons/CubeIcon.js +1 -1
- package/es/icons/CubePauseIcon.js +1 -1
- package/es/icons/CubePlayIcon.js +1 -1
- package/es/icons/CurrencyDollarIcon.js +1 -1
- package/es/icons/DangerIcon.js +1 -1
- package/es/icons/DashboardIcon.js +1 -1
- package/es/icons/DatabaseIcon.js +1 -1
- package/es/icons/DecimalDecreaseIcon.js +1 -1
- package/es/icons/DecimalIncreaseIcon.js +1 -1
- package/es/icons/DirectionIcon.js +1 -1
- package/es/icons/DonutIcon.js +1 -1
- package/es/icons/DownIcon.js +1 -1
- package/es/icons/EditIcon.js +1 -1
- package/es/icons/ExclamationCircleFilledIcon.js +1 -1
- package/es/icons/ExclamationCircleIcon.js +1 -1
- package/es/icons/ExclamationIcon.js +1 -1
- package/es/icons/EyeIcon.js +1 -1
- package/es/icons/EyeInvisibleIcon.js +1 -1
- package/es/icons/FilterIcon.js +1 -1
- package/es/icons/FolderFilledIcon.js +1 -1
- package/es/icons/FolderIcon.js +1 -1
- package/es/icons/FolderOpenFilledIcon.js +1 -1
- package/es/icons/FolderOpenIcon.js +1 -1
- package/es/icons/ForwardIcon.js +1 -1
- package/es/icons/HierarchyIcon.js +1 -1
- package/es/icons/Icon.js +1 -1
- package/es/icons/InfoCircleIcon.js +1 -1
- package/es/icons/InfoIcon.js +1 -1
- package/es/icons/KeyIcon.js +1 -1
- package/es/icons/LeftIcon.js +1 -1
- package/es/icons/LineChartIcon.js +1 -1
- package/es/icons/LoadingIcon.js +1 -1
- package/es/icons/LockFilledIcon.js +1 -1
- package/es/icons/LockIcon.js +1 -1
- package/es/icons/MoreIcon.js +1 -1
- package/es/icons/NotAllowedIcon.js +1 -1
- package/es/icons/Number123Icon.js +1 -1
- package/es/icons/NumberIcon.js +1 -1
- package/es/icons/PauseCircleFilledIcon.js +1 -1
- package/es/icons/PauseCircleIcon.js +1 -1
- package/es/icons/PauseIcon.js +1 -1
- package/es/icons/PercentageIcon.js +1 -1
- package/es/icons/PieChartIcon.js +1 -1
- package/es/icons/PlayCircleIcon.js +1 -1
- package/es/icons/PlayIcon.js +1 -1
- package/es/icons/PlusIcon.js +1 -1
- package/es/icons/ProgressBarIcon.js +1 -1
- package/es/icons/ReloadIcon.js +1 -1
- package/es/icons/ReportIcon.js +1 -1
- package/es/icons/ReturnIcon.js +1 -1
- package/es/icons/RightIcon.js +1 -1
- package/es/icons/SchemeIcon.js +1 -1
- package/es/icons/SearchIcon.js +1 -1
- package/es/icons/SettingsIcon.js +1 -1
- package/es/icons/ShieldFilledIcon.js +1 -1
- package/es/icons/ShieldIcon.js +1 -1
- package/es/icons/SlashIcon.js +1 -1
- package/es/icons/SparklesIcon.js +1 -1
- package/es/icons/SqlIcon.js +1 -1
- package/es/icons/StatsIcon.js +1 -1
- package/es/icons/StopIcon.js +1 -1
- package/es/icons/StringIcon.js +1 -1
- package/es/icons/SwitchIcon.js +1 -1
- package/es/icons/TableIcon.js +1 -1
- package/es/icons/ThumbsDownIcon.js +1 -1
- package/es/icons/ThumbsUpIcon.js +1 -1
- package/es/icons/ThunderboltCrossedIcon.js +1 -1
- package/es/icons/ThunderboltFilledIcon.js +1 -1
- package/es/icons/ThunderboltIcon.js +1 -1
- package/es/icons/TimeIcon.js +1 -1
- package/es/icons/UnlockIcon.js +1 -1
- package/es/icons/UpIcon.js +1 -1
- package/es/icons/UserGroupIcon.js +1 -1
- package/es/icons/UserIcon.js +1 -1
- package/es/icons/UserLockIcon.js +1 -1
- package/es/icons/ViewIcon.js +1 -1
- package/es/icons/WarningFilledIcon.js +1 -1
- package/es/icons/WarningIcon.js +1 -1
- package/es/icons/add-new-icon.js +1 -1
- package/es/icons/index.js +1 -1
- package/es/icons/wrap-icon.js +1 -1
- package/es/index.js +2 -1
- package/es/provider.js +1 -1
- package/es/providers/TrackingProvider.js +1 -1
- package/es/providers/navigation.types.js +1 -1
- package/es/providers/navigationAdapter.default.js +1 -1
- package/es/services/notification.js +1 -1
- package/es/shared/form.js +1 -1
- package/es/shared/index.js +1 -1
- package/es/stories/Form.legacy-stories.js +1 -1
- package/es/stories/FormFieldArgs.js +1 -1
- package/es/stories/Layout.stories.js +1 -1
- package/es/stories/Tasty.stories.js +1 -1
- package/es/stories/components/ConfirmDeletionDialogForm.js +1 -1
- package/es/stories/components/DialogFormApp.js +1 -1
- package/es/stories/components/StyledButton.js +1 -1
- package/es/stories/lists/baseProps.js +1 -1
- package/es/tasty/debug.js +1 -1
- package/es/tasty/index.js +1 -1
- package/es/tasty/injector/index.js +1 -1
- package/es/tasty/injector/injector.js +1 -1
- package/es/tasty/injector/sheet-manager.js +1 -1
- package/es/tasty/injector/types.js +1 -1
- package/es/tasty/parser/classify.js +1 -1
- package/es/tasty/parser/const.js +1 -1
- package/es/tasty/parser/lru.js +1 -1
- package/es/tasty/parser/parser.js +1 -1
- package/es/tasty/parser/tokenizer.js +1 -1
- package/es/tasty/parser/types.js +1 -1
- package/es/tasty/providers/BreakpointsProvider.js +1 -1
- package/es/tasty/styles/align.js +1 -1
- package/es/tasty/styles/border.js +1 -1
- package/es/tasty/styles/boxShadow.combinator.js +1 -1
- package/es/tasty/styles/color.js +1 -1
- package/es/tasty/styles/createStyle.js +1 -1
- package/es/tasty/styles/dimension.js +1 -1
- package/es/tasty/styles/display.js +1 -1
- package/es/tasty/styles/fade.js +1 -1
- package/es/tasty/styles/fill.js +1 -1
- package/es/tasty/styles/flow.js +1 -1
- package/es/tasty/styles/font.js +1 -1
- package/es/tasty/styles/fontStyle.js +1 -1
- package/es/tasty/styles/gap.js +1 -1
- package/es/tasty/styles/groupRadius.js +1 -1
- package/es/tasty/styles/height.js +1 -1
- package/es/tasty/styles/index.js +1 -1
- package/es/tasty/styles/inset.js +1 -1
- package/es/tasty/styles/justify.js +1 -1
- package/es/tasty/styles/list.js +1 -1
- package/es/tasty/styles/margin.js +1 -1
- package/es/tasty/styles/outline.js +1 -1
- package/es/tasty/styles/padding.js +1 -1
- package/es/tasty/styles/place.js +1 -1
- package/es/tasty/styles/predefined.js +1 -1
- package/es/tasty/styles/preset.js +1 -1
- package/es/tasty/styles/radius.js +1 -1
- package/es/tasty/styles/reset.js +1 -1
- package/es/tasty/styles/scrollbar.js +1 -1
- package/es/tasty/styles/shadow.js +1 -1
- package/es/tasty/styles/styledScrollbar.js +1 -1
- package/es/tasty/styles/transition.js +1 -1
- package/es/tasty/styles/types.js +1 -1
- package/es/tasty/styles/width.js +1 -1
- package/es/tasty/tasty.js +1 -1
- package/es/tasty/types.js +1 -1
- package/es/tasty/utils/cache-wrapper.js +1 -1
- package/es/tasty/utils/case-converter.js +1 -1
- package/es/tasty/utils/colors.js +1 -1
- package/es/tasty/utils/dotize.js +1 -1
- package/es/tasty/utils/filterBaseProps.js +1 -1
- package/es/tasty/utils/getDisplayName.js +1 -1
- package/es/tasty/utils/getModCombinations.js +1 -1
- package/es/tasty/utils/isDevEnv.js +1 -1
- package/es/tasty/utils/mergeStyles.js +1 -1
- package/es/tasty/utils/modAttrs.js +1 -1
- package/es/tasty/utils/renderStyles.js +1 -1
- package/es/tasty/utils/responsive.js +1 -1
- package/es/tasty/utils/string.js +1 -1
- package/es/tasty/utils/styles.js +1 -1
- package/es/tasty/utils/warnings.js +1 -1
- package/es/tokens.js +1 -1
- package/es/utils/ResizeSensor.js +1 -1
- package/es/utils/modules.js +1 -1
- package/es/utils/promise.js +1 -1
- package/es/utils/random.js +1 -1
- package/es/utils/range.js +1 -1
- package/es/utils/react/Slots.js +1 -1
- package/es/utils/react/chain.js +1 -1
- package/es/utils/react/forwardRefWithGenerics.js +1 -1
- package/es/utils/react/index.js +1 -1
- package/es/utils/react/interactions.js +1 -1
- package/es/utils/react/isTextOnly.js +1 -1
- package/es/utils/react/mapProps.js +1 -1
- package/es/utils/react/mergeProps.js +1 -1
- package/es/utils/react/nullableValue.js +1 -1
- package/es/utils/react/sharedStore.js +1 -1
- package/es/utils/react/useCombinedRefs.js +1 -1
- package/es/utils/react/useControlledFocusVisible.js +1 -1
- package/es/utils/react/useEventBus.js +1 -1
- package/es/utils/react/useId.js +1 -1
- package/es/utils/react/useIsDarwin.js +1 -1
- package/es/utils/react/useKeySymbols.js +1 -1
- package/es/utils/react/useLayoutEffect.js +1 -1
- package/es/utils/react/useQaProps.js +1 -1
- package/es/utils/react/useViewportSize.js +1 -1
- package/es/utils/react/wrapNodeIfPlain.js +1 -1
- package/es/utils/transitions.js +1 -1
- package/es/utils/tree.js +1 -1
- package/es/utils/warnings.js +1 -1
- package/es/version.js +2 -2
- package/package.json +1 -1
- package/types/components/Item.d.ts +4 -1
- package/types/components/actions/ItemAction/ItemAction.d.ts +15 -7
- package/types/components/actions/ItemActionContext.d.ts +14 -0
- package/types/components/actions/ItemButton/ItemButton.d.ts +14 -3
- package/types/components/actions/Menu/Menu.d.ts +4 -1
- package/types/components/actions/index.d.ts +1 -0
- package/types/components/content/ItemBadge/ItemBadge.d.ts +16 -0
- package/types/components/content/ItemBadge/index.d.ts +2 -0
- package/types/components/content/ItemBase/ItemBase.d.ts +21 -3
- package/types/components/content/ItemBase/index.d.ts +1 -0
- package/types/components/fields/ComboBox/ComboBox.d.ts +2 -2
- package/types/components/fields/DatePicker/DateInputBase.d.ts +1 -0
- package/types/components/fields/FilterListBox/FilterListBox.d.ts +1 -1
- package/types/components/fields/ListBox/ListBox.d.ts +6 -0
- package/types/components/fields/Picker/Picker.d.ts +69 -0
- package/types/components/fields/Picker/index.d.ts +2 -0
- package/types/components/fields/Select/Select.d.ts +4 -1
- package/types/components/fields/index.d.ts +1 -0
- package/types/components/helpers/DisplayTransition/DisplayTransition.d.ts +5 -1
- package/types/data/item-themes.d.ts +1 -0
- package/types/index.d.ts +2 -0
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.85.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
|
|
9
9
|
import React, { cloneElement, forwardRef, useCallback, useEffect, useMemo, useRef, useState, } from 'react';
|
|
10
10
|
import { useFilter, useKeyboard, useOverlay, useOverlayPosition, } from 'react-aria';
|
|
11
|
-
import { Section as BaseSection } from 'react-stately';
|
|
11
|
+
import { Section as BaseSection, useListState } from 'react-stately';
|
|
12
12
|
import { useEvent } from '../../../_internal';
|
|
13
13
|
import { CloseIcon, DirectionIcon, LoadingIcon } from '../../../icons';
|
|
14
14
|
import { useProviderProps } from '../../../provider';
|
|
@@ -34,6 +34,13 @@ const InputElement = tasty({
|
|
|
34
34
|
as: 'input',
|
|
35
35
|
styles: DEFAULT_INPUT_STYLES,
|
|
36
36
|
});
|
|
37
|
+
const ComboBoxOverlayWrapper = tasty({
|
|
38
|
+
qa: 'ComboBoxOverlayWrapper',
|
|
39
|
+
styles: {
|
|
40
|
+
position: 'absolute',
|
|
41
|
+
zIndex: 1000,
|
|
42
|
+
},
|
|
43
|
+
});
|
|
37
44
|
const ComboBoxOverlayElement = tasty({
|
|
38
45
|
qa: 'ComboBoxOverlay',
|
|
39
46
|
styles: {
|
|
@@ -41,7 +48,7 @@ const ComboBoxOverlayElement = tasty({
|
|
|
41
48
|
gridRows: '1sf',
|
|
42
49
|
gridColumns: '1sf',
|
|
43
50
|
width: '$min-width max-content 50vw',
|
|
44
|
-
height: 'initial max-content (50vh -
|
|
51
|
+
height: 'initial max-content (50vh - 5x)',
|
|
45
52
|
overflow: 'auto',
|
|
46
53
|
background: '#white',
|
|
47
54
|
radius: '1cr',
|
|
@@ -118,65 +125,37 @@ function useComboBoxState({ selectedKey, defaultSelectedKey, inputValue, default
|
|
|
118
125
|
isControlledInput,
|
|
119
126
|
};
|
|
120
127
|
}
|
|
121
|
-
function useComboBoxFiltering({
|
|
128
|
+
function useComboBoxFiltering({ effectiveInputValue, filter, }) {
|
|
122
129
|
const [isFilterActive, setIsFilterActive] = useState(false);
|
|
123
130
|
const { contains } = useFilter({ sensitivity: 'base' });
|
|
124
131
|
const textFilterFn = useMemo(() => (filter === false ? () => true : filter || contains), [filter, contains]);
|
|
125
|
-
//
|
|
126
|
-
const
|
|
132
|
+
// Create a filter function for collection nodes
|
|
133
|
+
const filterFn = useCallback((nodes) => {
|
|
127
134
|
const term = effectiveInputValue.trim();
|
|
128
|
-
if
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
const filterChildren = (childNodes) => {
|
|
140
|
-
if (!childNodes)
|
|
141
|
-
return null;
|
|
142
|
-
const childArray = Array.isArray(childNodes) ? childNodes : [childNodes];
|
|
143
|
-
const filteredNodes = [];
|
|
144
|
-
childArray.forEach((child) => {
|
|
145
|
-
if (!child || typeof child !== 'object') {
|
|
146
|
-
return;
|
|
147
|
-
}
|
|
148
|
-
if (child.type === BaseSection ||
|
|
149
|
-
child.type?.displayName === 'Section') {
|
|
150
|
-
const sectionChildren = Array.isArray(child.props.children)
|
|
151
|
-
? child.props.children
|
|
152
|
-
: [child.props.children];
|
|
153
|
-
const filteredSectionChildren = sectionChildren.filter((sectionChild) => {
|
|
154
|
-
return (sectionChild &&
|
|
155
|
-
typeof sectionChild === 'object' &&
|
|
156
|
-
nodeMatches(sectionChild));
|
|
157
|
-
});
|
|
158
|
-
if (filteredSectionChildren.length > 0) {
|
|
159
|
-
filteredNodes.push(cloneElement(child, {
|
|
160
|
-
key: child.key,
|
|
161
|
-
children: filteredSectionChildren,
|
|
162
|
-
}));
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
else if (child.type === Item) {
|
|
166
|
-
if (nodeMatches(child)) {
|
|
167
|
-
filteredNodes.push(child);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
else if (nodeMatches(child)) {
|
|
171
|
-
filteredNodes.push(child);
|
|
135
|
+
// Don't filter if not active or no search term
|
|
136
|
+
if (!isFilterActive || !term) {
|
|
137
|
+
return nodes;
|
|
138
|
+
}
|
|
139
|
+
// Filter nodes based on their textValue and preserve section structure
|
|
140
|
+
return [...nodes]
|
|
141
|
+
.map((node) => {
|
|
142
|
+
if (node.type === 'section' && node.childNodes) {
|
|
143
|
+
const filteredChildren = [...node.childNodes].filter((child) => textFilterFn(child.textValue || '', term));
|
|
144
|
+
if (filteredChildren.length === 0) {
|
|
145
|
+
return null;
|
|
172
146
|
}
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
147
|
+
return {
|
|
148
|
+
...node,
|
|
149
|
+
childNodes: filteredChildren,
|
|
150
|
+
hasChildNodes: true,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
return textFilterFn(node.textValue || '', term) ? node : null;
|
|
154
|
+
})
|
|
155
|
+
.filter(Boolean);
|
|
156
|
+
}, [isFilterActive, effectiveInputValue, textFilterFn]);
|
|
178
157
|
return {
|
|
179
|
-
|
|
158
|
+
filterFn,
|
|
180
159
|
isFilterActive,
|
|
181
160
|
setIsFilterActive,
|
|
182
161
|
};
|
|
@@ -293,6 +272,22 @@ function useComboBoxKeyboard({ isPopoverOpen, listStateRef, hasResults, allowsCu
|
|
|
293
272
|
}
|
|
294
273
|
}
|
|
295
274
|
else if (e.key === 'Enter') {
|
|
275
|
+
// If popover is open, try to select the focused item first
|
|
276
|
+
if (isPopoverOpen) {
|
|
277
|
+
const listState = listStateRef.current;
|
|
278
|
+
if (listState) {
|
|
279
|
+
const keyToSelect = listState.selectionManager.focusedKey;
|
|
280
|
+
if (keyToSelect != null) {
|
|
281
|
+
e.preventDefault();
|
|
282
|
+
listState.selectionManager.select(keyToSelect, e);
|
|
283
|
+
// Ensure the popover closes even if selection stays the same
|
|
284
|
+
onClosePopover();
|
|
285
|
+
inputRef.current?.focus();
|
|
286
|
+
return;
|
|
287
|
+
}
|
|
288
|
+
}
|
|
289
|
+
}
|
|
290
|
+
// If no results, handle empty input or custom values
|
|
296
291
|
if (!hasResults) {
|
|
297
292
|
e.preventDefault();
|
|
298
293
|
if (allowsCustomValue) {
|
|
@@ -304,18 +299,12 @@ function useComboBoxKeyboard({ isPopoverOpen, listStateRef, hasResults, allowsCu
|
|
|
304
299
|
}
|
|
305
300
|
return;
|
|
306
301
|
}
|
|
307
|
-
if (
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
e.preventDefault();
|
|
314
|
-
listState.selectionManager.select(keyToSelect, e);
|
|
315
|
-
// Ensure the popover closes even if selection stays the same
|
|
316
|
-
onClosePopover();
|
|
317
|
-
inputRef.current?.focus();
|
|
318
|
-
}
|
|
302
|
+
// Clear selection if input is empty and popover is closed (or no focused item)
|
|
303
|
+
const trimmed = (effectiveInputValue || '').trim();
|
|
304
|
+
if (trimmed === '') {
|
|
305
|
+
e.preventDefault();
|
|
306
|
+
onSelectionChange(null);
|
|
307
|
+
return;
|
|
319
308
|
}
|
|
320
309
|
}
|
|
321
310
|
else if (e.key === 'Escape') {
|
|
@@ -376,7 +365,7 @@ const ComboBoxInput = forwardRef(function ComboBoxInput({ qa, inputRef, id, valu
|
|
|
376
365
|
? `ListBoxItem-${listStateRef.current?.selectionManager.focusedKey}`
|
|
377
366
|
: undefined }));
|
|
378
367
|
});
|
|
379
|
-
function ComboBoxOverlay({ isOpen, triggerRef, popoverRef, listBoxRef, direction, shouldFlip, overlayOffset, comboBoxWidth, comboBoxId, overlayStyles, listBoxStyles, optionStyles, sectionStyles, headingStyles, effectiveSelectedKey, isDisabled, disabledKeys, items, children, listStateRef, onSelectionChange, onClose, label, ariaLabel, compositeFocusProps, }) {
|
|
368
|
+
function ComboBoxOverlay({ isOpen, triggerRef, popoverRef, listBoxRef, direction, shouldFlip, overlayOffset, comboBoxWidth, comboBoxId, overlayStyles, listBoxStyles, optionStyles, sectionStyles, headingStyles, effectiveSelectedKey, isDisabled, disabledKeys, items, children, listStateRef, onSelectionChange, onClose, label, ariaLabel, compositeFocusProps, filter, }) {
|
|
380
369
|
// Overlay positioning
|
|
381
370
|
const { overlayProps: overlayPositionProps, placement, updatePosition, } = useOverlayPosition({
|
|
382
371
|
targetRef: triggerRef,
|
|
@@ -414,18 +403,14 @@ function ComboBoxOverlay({ isOpen, triggerRef, popoverRef, listBoxRef, direction
|
|
|
414
403
|
}, [isOpen, updatePosition]);
|
|
415
404
|
// Extract primary placement direction for consistent styling
|
|
416
405
|
const placementDirection = placement?.split(' ')[0] || direction;
|
|
417
|
-
const overlayContent = (_jsx(DisplayTransition, {
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
...overlayPositionProps.style,
|
|
426
|
-
}, children: _jsx(ListBox, { ref: listBoxRef, focusOnHover: true, disableSelectionToggle: true, id: `ComboBoxListBox-${comboBoxId}`, "aria-label": ariaLabel || (typeof label === 'string' ? label : 'Options'), selectedKey: effectiveSelectedKey, selectionMode: "single", isDisabled: isDisabled, disabledKeys: disabledKeys, shouldUseVirtualFocus: true, items: items, styles: listBoxStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, stateRef: listStateRef, mods: {
|
|
427
|
-
popover: true,
|
|
428
|
-
}, onSelectionChange: onSelectionChange, children: children }) })) }));
|
|
406
|
+
const overlayContent = (_jsx(DisplayTransition, { isShown: isOpen, children: ({ phase, isShown, ref: transitionRef }) => (_jsx(ComboBoxOverlayWrapper, { ...mergeProps(overlayPositionProps, overlayBehaviorProps, compositeFocusProps), ref: popoverRef, style: overlayPositionProps.style, children: _jsx(ComboBoxOverlayElement, { ref: transitionRef, "data-placement": placementDirection, "data-phase": phase, mods: {
|
|
407
|
+
open: isShown,
|
|
408
|
+
hidden: phase === 'unmounted',
|
|
409
|
+
}, styles: overlayStyles, style: {
|
|
410
|
+
'--min-width': comboBoxWidth ? `${comboBoxWidth}px` : undefined,
|
|
411
|
+
}, children: _jsx(ListBox, { ref: listBoxRef, focusOnHover: true, disableSelectionToggle: true, id: `ComboBoxListBox-${comboBoxId}`, "aria-label": ariaLabel || (typeof label === 'string' ? label : 'Options'), selectedKey: effectiveSelectedKey, selectionMode: "single", isDisabled: isDisabled, disabledKeys: disabledKeys, shouldUseVirtualFocus: true, items: items, filter: filter, styles: listBoxStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, stateRef: listStateRef, mods: {
|
|
412
|
+
popover: true,
|
|
413
|
+
}, onSelectionChange: onSelectionChange, children: children }) }) })) }));
|
|
429
414
|
return _jsx(Portal, { children: overlayContent });
|
|
430
415
|
}
|
|
431
416
|
// ============================================================================
|
|
@@ -553,63 +538,152 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
553
538
|
}
|
|
554
539
|
}, [isPopoverOpen, effectiveSelectedKey]);
|
|
555
540
|
// Filtering hook
|
|
556
|
-
const {
|
|
557
|
-
children,
|
|
541
|
+
const { filterFn, isFilterActive, setIsFilterActive } = useComboBoxFiltering({
|
|
558
542
|
effectiveInputValue,
|
|
559
543
|
filter,
|
|
560
544
|
});
|
|
561
|
-
//
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
}, [isPopoverOpen, filteredChildren]);
|
|
569
|
-
// Use frozen children during close animation, fresh children when open
|
|
570
|
-
const displayedFilteredChildren = isPopoverOpen
|
|
571
|
-
? filteredChildren
|
|
572
|
-
: frozenFilteredChildrenRef.current ?? filteredChildren;
|
|
545
|
+
// Create local collection state for reading item data (labels, etc.)
|
|
546
|
+
// This allows us to read item labels even before the popover opens
|
|
547
|
+
const localCollectionState = useListState({
|
|
548
|
+
children,
|
|
549
|
+
items: sortedItems,
|
|
550
|
+
selectionMode: 'none', // Don't manage selection in this state
|
|
551
|
+
});
|
|
573
552
|
const { isFocused, focusProps } = useFocus({ isDisabled });
|
|
553
|
+
// Helper to check if current input value is valid
|
|
554
|
+
const checkInputValidity = useCallback(() => {
|
|
555
|
+
if (!effectiveInputValue.trim()) {
|
|
556
|
+
return { isValid: false, singleMatchKey: null, filteredCount: 0 };
|
|
557
|
+
}
|
|
558
|
+
// Get filtered collection based on current input
|
|
559
|
+
const filteredNodes = filterFn(localCollectionState.collection);
|
|
560
|
+
const filteredItems = [];
|
|
561
|
+
// Flatten filtered nodes (handle sections)
|
|
562
|
+
for (const node of filteredNodes) {
|
|
563
|
+
if (node.type === 'section' && node.childNodes) {
|
|
564
|
+
for (const child of node.childNodes) {
|
|
565
|
+
if (child.type === 'item') {
|
|
566
|
+
filteredItems.push({
|
|
567
|
+
key: child.key,
|
|
568
|
+
textValue: child.textValue || '',
|
|
569
|
+
});
|
|
570
|
+
}
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
else if (node.type === 'item') {
|
|
574
|
+
filteredItems.push({
|
|
575
|
+
key: node.key,
|
|
576
|
+
textValue: node.textValue || '',
|
|
577
|
+
});
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
const filteredCount = filteredItems.length;
|
|
581
|
+
// Check for exact match
|
|
582
|
+
const exactMatch = filteredItems.find((item) => item.textValue.toLowerCase() ===
|
|
583
|
+
effectiveInputValue.trim().toLowerCase());
|
|
584
|
+
if (exactMatch) {
|
|
585
|
+
return { isValid: true, singleMatchKey: exactMatch.key, filteredCount };
|
|
586
|
+
}
|
|
587
|
+
// If exactly one filtered result, consider it valid
|
|
588
|
+
if (filteredCount === 1) {
|
|
589
|
+
return {
|
|
590
|
+
isValid: true,
|
|
591
|
+
singleMatchKey: filteredItems[0].key,
|
|
592
|
+
filteredCount,
|
|
593
|
+
};
|
|
594
|
+
}
|
|
595
|
+
return { isValid: false, singleMatchKey: null, filteredCount };
|
|
596
|
+
}, [effectiveInputValue, filterFn, localCollectionState.collection]);
|
|
574
597
|
// Composite blur handler - fires when focus leaves the entire component
|
|
575
598
|
const handleCompositeBlur = useEvent(() => {
|
|
576
|
-
//
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
shouldCommitOnBlur &&
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
599
|
+
// NOTE: Do NOT disable filter yet; we need it active for validity check
|
|
600
|
+
// In allowsCustomValue mode
|
|
601
|
+
if (allowsCustomValue) {
|
|
602
|
+
// Commit the input value if it's non-empty and nothing is selected
|
|
603
|
+
if (shouldCommitOnBlur &&
|
|
604
|
+
effectiveInputValue &&
|
|
605
|
+
effectiveSelectedKey == null) {
|
|
606
|
+
externalOnSelectionChange?.(effectiveInputValue);
|
|
607
|
+
if (!isControlledKey) {
|
|
608
|
+
setInternalSelectedKey(effectiveInputValue);
|
|
609
|
+
}
|
|
610
|
+
onBlur?.();
|
|
611
|
+
setIsFilterActive(false);
|
|
612
|
+
return;
|
|
613
|
+
}
|
|
614
|
+
// Clear selection if input is empty
|
|
615
|
+
if (!String(effectiveInputValue).trim()) {
|
|
616
|
+
externalOnSelectionChange?.(null);
|
|
617
|
+
if (!isControlledKey) {
|
|
618
|
+
setInternalSelectedKey(null);
|
|
619
|
+
}
|
|
620
|
+
if (!isControlledInput) {
|
|
621
|
+
setInternalInputValue('');
|
|
622
|
+
}
|
|
623
|
+
onInputChange?.('');
|
|
624
|
+
onBlur?.();
|
|
625
|
+
setIsFilterActive(false);
|
|
626
|
+
return;
|
|
586
627
|
}
|
|
587
|
-
// Call user's onBlur callback
|
|
588
|
-
onBlur?.();
|
|
589
|
-
return;
|
|
590
628
|
}
|
|
591
|
-
// In
|
|
592
|
-
if (
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
629
|
+
// In non-custom-value mode, validate input and handle accordingly
|
|
630
|
+
if (!allowsCustomValue) {
|
|
631
|
+
const { isValid, singleMatchKey } = checkInputValidity();
|
|
632
|
+
// If there's exactly one filtered result, auto-select it
|
|
633
|
+
if (isValid &&
|
|
634
|
+
singleMatchKey != null &&
|
|
635
|
+
singleMatchKey !== effectiveSelectedKey) {
|
|
636
|
+
const label = getItemLabel(singleMatchKey);
|
|
637
|
+
if (!isControlledKey) {
|
|
638
|
+
setInternalSelectedKey(singleMatchKey);
|
|
639
|
+
}
|
|
640
|
+
if (!isControlledInput) {
|
|
641
|
+
setInternalInputValue(label);
|
|
642
|
+
}
|
|
643
|
+
onInputChange?.(label);
|
|
644
|
+
externalOnSelectionChange?.(singleMatchKey);
|
|
645
|
+
onBlur?.();
|
|
646
|
+
setIsFilterActive(false);
|
|
647
|
+
return;
|
|
596
648
|
}
|
|
597
|
-
|
|
598
|
-
|
|
649
|
+
// If input is invalid (no exact match, not a single result)
|
|
650
|
+
if (!isValid) {
|
|
651
|
+
const trimmedInput = effectiveInputValue.trim();
|
|
652
|
+
// Clear if clearOnBlur is set or input is empty
|
|
653
|
+
if (clearOnBlur || !trimmedInput) {
|
|
654
|
+
externalOnSelectionChange?.(null);
|
|
655
|
+
if (!isControlledKey) {
|
|
656
|
+
setInternalSelectedKey(null);
|
|
657
|
+
}
|
|
658
|
+
if (!isControlledInput) {
|
|
659
|
+
setInternalInputValue('');
|
|
660
|
+
}
|
|
661
|
+
onInputChange?.('');
|
|
662
|
+
onBlur?.();
|
|
663
|
+
setIsFilterActive(false);
|
|
664
|
+
return;
|
|
665
|
+
}
|
|
666
|
+
// Reset input to current selected value (or empty if none)
|
|
667
|
+
const nextValue = effectiveSelectedKey != null
|
|
668
|
+
? getItemLabel(effectiveSelectedKey)
|
|
669
|
+
: '';
|
|
670
|
+
if (!isControlledInput) {
|
|
671
|
+
setInternalInputValue(nextValue);
|
|
672
|
+
}
|
|
673
|
+
onInputChange?.(nextValue);
|
|
674
|
+
onBlur?.();
|
|
675
|
+
setIsFilterActive(false);
|
|
676
|
+
return;
|
|
599
677
|
}
|
|
600
|
-
onInputChange?.('');
|
|
601
|
-
// Call user's onBlur callback
|
|
602
|
-
onBlur?.();
|
|
603
|
-
return;
|
|
604
678
|
}
|
|
605
|
-
// Reset input to show current selection (or empty if none)
|
|
679
|
+
// Fallback: Reset input to show current selection (or empty if none)
|
|
606
680
|
const nextValue = effectiveSelectedKey != null ? getItemLabel(effectiveSelectedKey) : '';
|
|
607
681
|
if (!isControlledInput) {
|
|
608
682
|
setInternalInputValue(nextValue);
|
|
609
683
|
}
|
|
610
684
|
onInputChange?.(nextValue);
|
|
611
|
-
// Call user's onBlur callback
|
|
612
685
|
onBlur?.();
|
|
686
|
+
setIsFilterActive(false);
|
|
613
687
|
});
|
|
614
688
|
// Composite focus hook - handles focus tracking across wrapper and portaled popover
|
|
615
689
|
const { compositeFocusProps } = useCompositeFocus({
|
|
@@ -625,11 +699,11 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
625
699
|
// Ref to access internal ListBox state
|
|
626
700
|
const listStateRef = useRef(null);
|
|
627
701
|
const focusInitAttemptsRef = useRef(0);
|
|
628
|
-
// Helper to get label from collection
|
|
702
|
+
// Helper to get label from local collection
|
|
629
703
|
const getItemLabel = useCallback((key) => {
|
|
630
|
-
const item =
|
|
704
|
+
const item = localCollectionState?.collection?.getItem(key);
|
|
631
705
|
return item?.textValue || String(key);
|
|
632
|
-
}, []);
|
|
706
|
+
}, [localCollectionState?.collection]);
|
|
633
707
|
// Selection change handler
|
|
634
708
|
const handleSelectionChange = useEvent((selection) => {
|
|
635
709
|
// Extract single key from selection (we only support single selection)
|
|
@@ -700,9 +774,6 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
700
774
|
}
|
|
701
775
|
// Priority 2: fall back to defaultSelectedKey's label
|
|
702
776
|
if (defaultSelectedKey) {
|
|
703
|
-
// Wait for collection to be ready
|
|
704
|
-
if (!listStateRef.current?.collection)
|
|
705
|
-
return;
|
|
706
777
|
const label = getItemLabel(defaultSelectedKey);
|
|
707
778
|
setInternalInputValue(label);
|
|
708
779
|
setHasInitialized(true);
|
|
@@ -716,13 +787,17 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
716
787
|
children,
|
|
717
788
|
]);
|
|
718
789
|
// Sync input value with controlled selectedKey
|
|
790
|
+
const lastSyncedSelectedKey = useRef(undefined);
|
|
719
791
|
useEffect(() => {
|
|
720
792
|
// Only run when selectedKey is controlled but inputValue is uncontrolled
|
|
721
793
|
if (!isControlledKey || isControlledInput)
|
|
722
794
|
return;
|
|
723
|
-
//
|
|
724
|
-
if (
|
|
795
|
+
// Skip if the key hasn't actually changed (prevents unnecessary resets when collection rebuilds)
|
|
796
|
+
if (lastSyncedSelectedKey.current !== undefined &&
|
|
797
|
+
lastSyncedSelectedKey.current === effectiveSelectedKey) {
|
|
725
798
|
return;
|
|
799
|
+
}
|
|
800
|
+
lastSyncedSelectedKey.current = effectiveSelectedKey;
|
|
726
801
|
// Get the expected label for the current selection
|
|
727
802
|
const expectedLabel = effectiveSelectedKey != null ? getItemLabel(effectiveSelectedKey) : '';
|
|
728
803
|
// Update the input value to match the selected key's label
|
|
@@ -745,10 +820,26 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
745
820
|
? effectiveInputValue !== ''
|
|
746
821
|
: effectiveSelectedKey != null;
|
|
747
822
|
let showClearButton = isClearable && hasValue && !isDisabled && !isReadOnly;
|
|
748
|
-
|
|
749
|
-
|
|
750
|
-
|
|
751
|
-
|
|
823
|
+
// Check if there are any results after filtering
|
|
824
|
+
const hasResults = useMemo(() => {
|
|
825
|
+
if (!children)
|
|
826
|
+
return false;
|
|
827
|
+
if (!Array.isArray(children) && children === null)
|
|
828
|
+
return false;
|
|
829
|
+
// If we have a collection, check if filtering will produce any results
|
|
830
|
+
if (localCollectionState?.collection) {
|
|
831
|
+
const filteredNodes = filterFn(localCollectionState.collection);
|
|
832
|
+
const resultArray = Array.from(filteredNodes).flatMap((node) => {
|
|
833
|
+
if (node.type === 'section' && node.childNodes) {
|
|
834
|
+
return [...node.childNodes];
|
|
835
|
+
}
|
|
836
|
+
return [node];
|
|
837
|
+
});
|
|
838
|
+
return resultArray.length > 0;
|
|
839
|
+
}
|
|
840
|
+
// Fallback: check if children exists
|
|
841
|
+
return Array.isArray(children) ? children.length > 0 : true;
|
|
842
|
+
}, [children, localCollectionState?.collection, filterFn]);
|
|
752
843
|
// Clear function
|
|
753
844
|
let clearValue = useEvent(() => {
|
|
754
845
|
// Clear input
|
|
@@ -889,7 +980,7 @@ export const ComboBox = forwardRef(function ComboBox(props, ref) {
|
|
|
889
980
|
}
|
|
890
981
|
}
|
|
891
982
|
}
|
|
892
|
-
} })) : null] }), _jsx(ComboBoxOverlay, { isOpen: shouldShowPopover, triggerRef: wrapperRef, popoverRef: popoverRef, listBoxRef: listBoxRef, direction: direction, shouldFlip: shouldFlip, overlayOffset: overlayOffset, comboBoxWidth: comboBoxWidth, comboBoxId: comboBoxId, overlayStyles: overlayStyles, listBoxStyles: listBoxStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, effectiveSelectedKey: effectiveSelectedKey, isDisabled: isDisabled, disabledKeys: props.disabledKeys, items: sortedItems, listStateRef: listStateRef, label: label, ariaLabel: props['aria-label'], compositeFocusProps: compositeFocusProps, onSelectionChange: handleSelectionChange, onClose: () => setIsPopoverOpen(false), children:
|
|
983
|
+
} })) : null] }), _jsx(ComboBoxOverlay, { isOpen: shouldShowPopover, triggerRef: wrapperRef, popoverRef: popoverRef, listBoxRef: listBoxRef, direction: direction, shouldFlip: shouldFlip, overlayOffset: overlayOffset, comboBoxWidth: comboBoxWidth, comboBoxId: comboBoxId, overlayStyles: overlayStyles, listBoxStyles: listBoxStyles, optionStyles: optionStyles, sectionStyles: sectionStyles, headingStyles: headingStyles, effectiveSelectedKey: effectiveSelectedKey, isDisabled: isDisabled, disabledKeys: props.disabledKeys, items: sortedItems, listStateRef: listStateRef, label: label, ariaLabel: props['aria-label'], compositeFocusProps: compositeFocusProps, filter: filterFn, onSelectionChange: handleSelectionChange, onClose: () => setIsPopoverOpen(false), children: children })] }));
|
|
893
984
|
const { children: _, ...propsWithoutChildren } = props;
|
|
894
985
|
const finalProps = {
|
|
895
986
|
...propsWithoutChildren,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.85.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -38,7 +38,7 @@ const DateInputElement = tasty({
|
|
|
38
38
|
});
|
|
39
39
|
function DateInputBase(props, ref) {
|
|
40
40
|
let inputRef = useRef(null);
|
|
41
|
-
let { isDisabled, inputStyles, children, fieldProps, style, disableFocusRing, autoFocus, validationState, isLoading, size = 'medium', } = props;
|
|
41
|
+
let { isDisabled, inputStyles, children, fieldProps, style, disableFocusRing, autoFocus, validationState, isLoading, size = 'medium', suffix, } = props;
|
|
42
42
|
let styles = extractStyles(props, CONTAINER_STYLES);
|
|
43
43
|
let { focusProps, isFocused } = useFocusRing({
|
|
44
44
|
isTextInput: true,
|
|
@@ -52,7 +52,8 @@ function DateInputBase(props, ref) {
|
|
|
52
52
|
disabled: isDisabled,
|
|
53
53
|
focused: isFocused && !disableFocusRing,
|
|
54
54
|
invalid: isInvalid,
|
|
55
|
-
|
|
55
|
+
suffix: (validationState && !isLoading) || isLoading || !!suffix,
|
|
56
|
+
}, ...mergeProps(fieldProps ?? {}, focusProps), style: style, children: [_jsx("div", { "data-element": "Contents", role: "presentation", children: _jsx(DateInputElement, { ref: mergeRefs(ref, inputRef), "data-size": size, role: "presentation", styles: inputStyles, children: children }) }), (validationState && !isLoading) || isLoading || suffix ? (_jsxs("div", { "data-element": "Suffix", children: [(validationState && !isLoading) || isLoading ? (_jsx("div", { "data-element": "State", children: validationState && !isLoading ? validation : null })) : null, suffix] })) : null] }));
|
|
56
57
|
}
|
|
57
58
|
const _DateInputBase = React.forwardRef(DateInputBase);
|
|
58
59
|
_DateInputBase.displayName = 'DateInputBase';
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.85.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -17,7 +17,6 @@ import { Calendar } from '../../other/Calendar/Calendar';
|
|
|
17
17
|
import { Dialog, DialogTrigger } from '../../overlays/Dialog';
|
|
18
18
|
import { DateInputBase } from './DateInputBase';
|
|
19
19
|
import { DatePickerButton } from './DatePickerButton';
|
|
20
|
-
import { DatePickerElement } from './DatePickerElement';
|
|
21
20
|
import { DatePickerInput } from './DatePickerInput';
|
|
22
21
|
import { dateMessages } from './intl';
|
|
23
22
|
import { DEFAULT_DATE_PROPS } from './props';
|
|
@@ -61,7 +60,7 @@ function DatePicker(props, ref) {
|
|
|
61
60
|
: null;
|
|
62
61
|
let showTimeField = !!timeGranularity;
|
|
63
62
|
// let visibleMonths = useVisibleMonths(maxVisibleMonths);
|
|
64
|
-
const component = (
|
|
63
|
+
const component = (_jsx(DateInputBase, { ref: targetRef, styles: props.wrapperStyles, disableFocusRing: isFocusedButton, isDisabled: isDisabled, validationState: validationState, size: size, ...focusProps, suffix: _jsxs(DialogTrigger, { hideArrow: true, type: "popover", mobileType: "tray", placement: "bottom right", targetRef: targetRef, isOpen: isOpen, shouldFlip: props.shouldFlip, onOpenChange: setOpen, children: [_jsx(DatePickerButton, { size: size, ...mergeProps(buttonProps, focusPropsButton), isDisabled: isDisabled }), _jsxs(Dialog, { ...dialogProps, width: "max-content", children: [_jsx(Calendar, { ...calendarProps }), showTimeField && (_jsx(TimeInput, { padding: "1x", label: dateMessages['time'], value: state.timeValue, placeholderValue: timePlaceholder, granularity: timeGranularity, minValue: timeMinValue, maxValue: timeMaxValue, hourCycle: props.hourCycle, hideTimeZone: props.hideTimeZone, onChange: state.setTimeValue }))] })] }), children: _jsx(DatePickerInput, { useLocale: useLocaleProp, ...fieldProps }) }));
|
|
65
64
|
return wrapWithField(component, domRef, {
|
|
66
65
|
...props,
|
|
67
66
|
styles,
|
|
@@ -1,21 +1,16 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.85.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
9
9
|
import { CalendarIcon } from '../../../icons';
|
|
10
10
|
import { tasty } from '../../../tasty';
|
|
11
|
-
import {
|
|
12
|
-
export const DatePickerButton = tasty(
|
|
11
|
+
import { ItemAction } from '../../actions';
|
|
12
|
+
export const DatePickerButton = tasty(ItemAction, {
|
|
13
13
|
icon: _jsx(CalendarIcon, {}),
|
|
14
|
-
styles: {
|
|
15
|
-
radius: '1r right',
|
|
16
|
-
border: 'top right bottom',
|
|
17
|
-
backgroundClip: 'content-box',
|
|
18
|
-
},
|
|
19
14
|
});
|
|
20
15
|
|
|
21
16
|
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* @license MIT
|
|
3
3
|
* author: Cube Dev Team
|
|
4
|
-
* @cube-dev/ui-kit v0.
|
|
4
|
+
* @cube-dev/ui-kit v0.85.0
|
|
5
5
|
* Released under the MIT license.
|
|
6
6
|
*/
|
|
7
7
|
|
|
@@ -22,6 +22,8 @@ const EditableSegmentElement = tasty({
|
|
|
22
22
|
fontVariantNumeric: 'tabular-nums lining-nums',
|
|
23
23
|
textAlign: 'right',
|
|
24
24
|
font: 'monospace',
|
|
25
|
+
border: 0,
|
|
26
|
+
outline: 0,
|
|
25
27
|
color: {
|
|
26
28
|
'': 'inherit',
|
|
27
29
|
':focus': '#white',
|