@cube-dev/ui-kit 0.127.3 → 0.129.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/CHANGELOG.md +40 -0
- package/dist/_internal/hooks/use-chained-callback.js +1 -1
- package/dist/_internal/hooks/use-debounced-value.js +1 -1
- package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
- package/dist/_internal/hooks/use-event.js +1 -1
- package/dist/_internal/hooks/use-is-first-render.js +1 -1
- package/dist/_internal/hooks/use-sync-ref.js +1 -1
- package/dist/_internal/hooks/use-timer/timer.js +1 -1
- package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
- package/dist/_internal/hooks/use-warn.js +1 -1
- package/dist/components/Block.js +1 -1
- package/dist/components/CollectionItem.js +1 -1
- package/dist/components/GlobalStyles.js +1 -1
- package/dist/components/GridProvider.js +1 -1
- package/dist/components/HiddenInput.js +1 -1
- package/dist/components/Root.js +1 -1
- package/dist/components/actions/Action/Action.js +1 -1
- package/dist/components/actions/Banner/Banner.js +1 -1
- package/dist/components/actions/Button/Button.js +1 -1
- package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
- package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
- package/dist/components/actions/ButtonSplit/context.js +1 -1
- package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
- package/dist/components/actions/CommandMenu/styled.js +1 -1
- package/dist/components/actions/ItemAction/ItemAction.js +1 -1
- package/dist/components/actions/ItemActionContext.js +1 -1
- package/dist/components/actions/ItemButton/ItemButton.js +1 -1
- package/dist/components/actions/Link/Link.js +1 -1
- package/dist/components/actions/Menu/Menu.js +1 -1
- package/dist/components/actions/Menu/MenuItem.js +1 -1
- package/dist/components/actions/Menu/MenuSection.js +1 -1
- package/dist/components/actions/Menu/MenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
- package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
- package/dist/components/actions/Menu/context.js +1 -1
- package/dist/components/actions/Menu/styled.js +1 -1
- package/dist/components/actions/index.js +1 -1
- package/dist/components/actions/use-action.js +1 -1
- package/dist/components/actions/use-anchored-menu.js +1 -1
- package/dist/components/actions/use-context-menu.js +1 -1
- package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
- package/dist/components/content/Alert/Alert.js +1 -1
- package/dist/components/content/Alert/use-alert.js +1 -1
- package/dist/components/content/Avatar/Avatar.js +1 -1
- package/dist/components/content/Badge/Badge.js +1 -1
- package/dist/components/content/Card/Card.js +1 -1
- package/dist/components/content/Content.js +1 -1
- package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
- package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
- package/dist/components/content/Disclosure/Disclosure.js +1 -1
- package/dist/components/content/Divider.js +1 -1
- package/dist/components/content/Footer.js +1 -1
- package/dist/components/content/Header.js +1 -1
- package/dist/components/content/HotKeys/HotKeys.js +1 -1
- package/dist/components/content/Item/Item.js +1 -1
- package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
- package/dist/components/content/ItemCard/ItemCard.js +1 -1
- package/dist/components/content/Layout/GridLayout.js +1 -1
- package/dist/components/content/Layout/Layout.js +1 -1
- package/dist/components/content/Layout/LayoutBlock.js +1 -1
- package/dist/components/content/Layout/LayoutCenter.js +1 -1
- package/dist/components/content/Layout/LayoutContainer.js +1 -1
- package/dist/components/content/Layout/LayoutContent.js +1 -1
- package/dist/components/content/Layout/LayoutContext.js +1 -1
- package/dist/components/content/Layout/LayoutFlex.js +1 -1
- package/dist/components/content/Layout/LayoutFooter.js +1 -1
- package/dist/components/content/Layout/LayoutGrid.js +1 -1
- package/dist/components/content/Layout/LayoutHeader.js +1 -1
- package/dist/components/content/Layout/LayoutPane.js +1 -1
- package/dist/components/content/Layout/LayoutPanel.js +1 -1
- package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
- package/dist/components/content/Layout/LayoutToolbar.js +1 -1
- package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
- package/dist/components/content/Layout/index.js +1 -1
- package/dist/components/content/Layout/utils.js +1 -1
- package/dist/components/content/Paragraph.js +1 -1
- package/dist/components/content/Placeholder/Placeholder.js +1 -1
- package/dist/components/content/PrismCode/PrismCode.js +1 -1
- package/dist/components/content/PrismCode/prismSetup.js +1 -1
- package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
- package/dist/components/content/Result/Result.js +1 -1
- package/dist/components/content/Skeleton/Skeleton.js +1 -1
- package/dist/components/content/Tag/Tag.js +1 -1
- package/dist/components/content/Text.js +1 -1
- package/dist/components/content/TextItem/TextItem.js +1 -1
- package/dist/components/content/Title.js +1 -1
- package/dist/components/content/Tree/Tree.d.ts +27 -0
- package/dist/components/content/Tree/Tree.js +265 -0
- package/dist/components/content/Tree/Tree.js.map +1 -0
- package/dist/components/content/Tree/TreeNode.js +107 -0
- package/dist/components/content/Tree/TreeNode.js.map +1 -0
- package/dist/components/content/Tree/index.d.ts +3 -0
- package/dist/components/content/Tree/styled.js +146 -0
- package/dist/components/content/Tree/styled.js.map +1 -0
- package/dist/components/content/Tree/tree-index.js +26 -0
- package/dist/components/content/Tree/tree-index.js.map +1 -0
- package/dist/components/content/Tree/types.d.ts +145 -0
- package/dist/components/content/Tree/use-checkbox-tree.js +231 -0
- package/dist/components/content/Tree/use-checkbox-tree.js.map +1 -0
- package/dist/components/content/Tree/use-load-data.js +75 -0
- package/dist/components/content/Tree/use-load-data.js.map +1 -0
- package/dist/components/content/highlightText.js +1 -1
- package/dist/components/content/use-auto-tooltip.js +1 -1
- package/dist/components/fields/Checkbox/Checkbox.js +1 -1
- package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
- package/dist/components/fields/Checkbox/context.js +1 -1
- package/dist/components/fields/ComboBox/ComboBox.js +1 -1
- package/dist/components/fields/DatePicker/DateInput.js +1 -1
- package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
- package/dist/components/fields/DatePicker/DatePicker.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
- package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
- package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
- package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
- package/dist/components/fields/DatePicker/TimeInput.js +1 -1
- package/dist/components/fields/DatePicker/intl.js +1 -1
- package/dist/components/fields/DatePicker/parseDate.js +1 -1
- package/dist/components/fields/DatePicker/props.js +1 -1
- package/dist/components/fields/DatePicker/utils.js +1 -1
- package/dist/components/fields/FileInput/FileInput.js +1 -1
- package/dist/components/fields/FilterListBox/FilterListBox.d.ts +3 -1
- package/dist/components/fields/FilterListBox/FilterListBox.js +115 -51
- package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
- package/dist/components/fields/FilterPicker/FilterPicker.d.ts +6 -0
- package/dist/components/fields/FilterPicker/FilterPicker.js +4 -2
- package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
- package/dist/components/fields/Input/Input.js +1 -1
- package/dist/components/fields/ListBox/ListBox.js +1 -1
- package/dist/components/fields/NumberInput/NumberInput.js +2 -2
- package/dist/components/fields/NumberInput/StepButton.js +1 -1
- package/dist/components/fields/PasswordInput/PasswordInput.js +2 -2
- package/dist/components/fields/Picker/Picker.js +1 -1
- package/dist/components/fields/RadioGroup/Radio.js +2 -2
- package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
- package/dist/components/fields/RadioGroup/context.js +1 -1
- package/dist/components/fields/SearchInput/SearchInput.js +2 -2
- package/dist/components/fields/Select/Select.js +1 -1
- package/dist/components/fields/Slider/Gradation.js +1 -1
- package/dist/components/fields/Slider/HueSlider.js +1 -1
- package/dist/components/fields/Slider/RangeSlider.js +1 -1
- package/dist/components/fields/Slider/Slider.js +1 -1
- package/dist/components/fields/Slider/SliderBase.js +1 -1
- package/dist/components/fields/Slider/SliderThumb.js +1 -1
- package/dist/components/fields/Slider/SliderTrack.js +1 -1
- package/dist/components/fields/Slider/elements.js +1 -1
- package/dist/components/fields/Slider/index.js +1 -1
- package/dist/components/fields/Switch/Switch.js +1 -1
- package/dist/components/fields/TextArea/TextArea.js +2 -2
- package/dist/components/fields/TextInput/TextInput.js +2 -2
- package/dist/components/fields/TextInput/TextInputBase.js +1 -1
- package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
- package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
- package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
- package/dist/components/form/Form/Field.js +1 -1
- package/dist/components/form/Form/Form.js +1 -1
- package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
- package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
- package/dist/components/form/Form/SubmitError.js +1 -1
- package/dist/components/form/Form/index.js +1 -1
- package/dist/components/form/Form/use-field/use-field-props.js +1 -1
- package/dist/components/form/Form/use-field/use-field.js +1 -1
- package/dist/components/form/Form/use-form.js +1 -1
- package/dist/components/form/Form/validation.js +1 -1
- package/dist/components/form/Label.js +1 -1
- package/dist/components/form/wrapper.js +1 -1
- package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
- package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
- package/dist/components/layout/Flex.js +1 -1
- package/dist/components/layout/Flow.js +1 -1
- package/dist/components/layout/Grid.js +1 -1
- package/dist/components/layout/Panel.js +1 -1
- package/dist/components/layout/Prefix.js +1 -1
- package/dist/components/layout/ResizablePanel.js +1 -1
- package/dist/components/layout/Space.js +1 -1
- package/dist/components/layout/Suffix.js +1 -1
- package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
- package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
- package/dist/components/navigation/Tabs/TabButton.js +1 -1
- package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
- package/dist/components/navigation/Tabs/TabPanel.js +1 -1
- package/dist/components/navigation/Tabs/TabPicker.js +1 -1
- package/dist/components/navigation/Tabs/Tabs.js +1 -1
- package/dist/components/navigation/Tabs/TabsAction.js +1 -1
- package/dist/components/navigation/Tabs/TabsContext.js +1 -1
- package/dist/components/navigation/Tabs/styled.js +1 -1
- package/dist/components/navigation/Tabs/types.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
- package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
- package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
- package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
- package/dist/components/other/Calendar/Calendar.js +1 -1
- package/dist/components/other/Calendar/CalendarCell.js +1 -1
- package/dist/components/other/Calendar/CalendarGrid.js +1 -1
- package/dist/components/other/Calendar/RangeCalendar.js +1 -1
- package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
- package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
- package/dist/components/overlays/Dialog/Dialog.js +1 -1
- package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
- package/dist/components/overlays/Dialog/DialogForm.js +1 -1
- package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
- package/dist/components/overlays/Dialog/context.js +1 -1
- package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
- package/dist/components/overlays/Modal/Modal.js +1 -1
- package/dist/components/overlays/Modal/OpenTransition.js +1 -1
- package/dist/components/overlays/Modal/Overlay.js +1 -1
- package/dist/components/overlays/Modal/Popover.js +1 -1
- package/dist/components/overlays/Modal/Tray.js +1 -1
- package/dist/components/overlays/Modal/Underlay.js +1 -1
- package/dist/components/overlays/Notifications/Notification.js +1 -1
- package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
- package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
- package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
- package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
- package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
- package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
- package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
- package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
- package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
- package/dist/components/overlays/Notifications/index.js +1 -1
- package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
- package/dist/components/overlays/Notifications/use-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
- package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
- package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
- package/dist/components/overlays/Toast/ToastItem.js +1 -1
- package/dist/components/overlays/Toast/index.js +1 -1
- package/dist/components/overlays/Toast/useProgressToast.js +1 -1
- package/dist/components/overlays/Toast/useToast.js +1 -1
- package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
- package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
- package/dist/components/overlays/Tooltip/context.js +1 -1
- package/dist/components/portal/Portal.js +1 -1
- package/dist/components/portal/PortalProvider.js +1 -1
- package/dist/components/portal/usePortal.js +1 -1
- package/dist/components/shared/InvalidIcon.js +1 -1
- package/dist/components/shared/ValidIcon.js +1 -1
- package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
- package/dist/components/status/Spin/Cube.js +1 -1
- package/dist/components/status/Spin/InternalSpinner.js +1 -1
- package/dist/components/status/Spin/Spin.js +1 -1
- package/dist/components/status/Spin/SpinsContainer.js +1 -1
- package/dist/data/item-themes.js +1 -1
- package/dist/data/themes.js +1 -1
- package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
- package/dist/icons/AdjustmentsIcon.js +1 -1
- package/dist/icons/AiIcon.js +1 -1
- package/dist/icons/AreaChartIcon.js +1 -1
- package/dist/icons/BackwardIcon.js +1 -1
- package/dist/icons/BarChartIcon.js +1 -1
- package/dist/icons/BellFilledIcon.js +1 -1
- package/dist/icons/BellIcon.js +1 -1
- package/dist/icons/BooleanIcon.js +1 -1
- package/dist/icons/CalendarEditIcon.js +1 -1
- package/dist/icons/CalendarIcon.js +1 -1
- package/dist/icons/CaretDownIcon.js +1 -1
- package/dist/icons/CaretUpIcon.js +1 -1
- package/dist/icons/ChartAreaStackedIcon.js +1 -1
- package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarGroupedIcon.js +1 -1
- package/dist/icons/ChartBarHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarLineIcon.js +1 -1
- package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
- package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
- package/dist/icons/ChartBoxPlot2Icon.js +1 -1
- package/dist/icons/ChartBoxPlotIcon.js +1 -1
- package/dist/icons/ChartBubbleIcon.js +1 -1
- package/dist/icons/ChartDonut2Icon.js +1 -1
- package/dist/icons/ChartFunnelIcon.js +1 -1
- package/dist/icons/ChartHeatmapIcon.js +1 -1
- package/dist/icons/ChartKPIIcon.js +1 -1
- package/dist/icons/ChartPie2Icon.js +1 -1
- package/dist/icons/ChartScatterIcon.js +1 -1
- package/dist/icons/CheckCircleFilledIcon.js +1 -1
- package/dist/icons/CheckCircleIcon.js +1 -1
- package/dist/icons/CheckIcon.js +1 -1
- package/dist/icons/CircleFilledIcon.js +1 -1
- package/dist/icons/ClearIcon.js +1 -1
- package/dist/icons/CloseCircleFilledIcon.js +1 -1
- package/dist/icons/CloseCircleIcon.js +1 -1
- package/dist/icons/CloseIcon.js +1 -1
- package/dist/icons/CodeIcon.js +1 -1
- package/dist/icons/ColumnTotalIcon.js +1 -1
- package/dist/icons/CopyIcon.js +1 -1
- package/dist/icons/CountIcon.js +1 -1
- package/dist/icons/CubeIcon.js +1 -1
- package/dist/icons/CubePauseIcon.js +1 -1
- package/dist/icons/CubePlayIcon.js +1 -1
- package/dist/icons/CurrencyDollarIcon.js +1 -1
- package/dist/icons/DangerIcon.js +1 -1
- package/dist/icons/DashboardIcon.js +1 -1
- package/dist/icons/DatabaseIcon.js +1 -1
- package/dist/icons/DecimalDecreaseIcon.js +1 -1
- package/dist/icons/DecimalIncreaseIcon.js +1 -1
- package/dist/icons/DirectionIcon.js +1 -1
- package/dist/icons/DonutIcon.js +1 -1
- package/dist/icons/DownIcon.js +1 -1
- package/dist/icons/EditIcon.js +1 -1
- package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
- package/dist/icons/ExclamationCircleIcon.js +1 -1
- package/dist/icons/ExclamationIcon.js +1 -1
- package/dist/icons/EyeIcon.js +1 -1
- package/dist/icons/EyeInvisibleIcon.js +1 -1
- package/dist/icons/FilterIcon.js +1 -1
- package/dist/icons/FolderFilledIcon.js +1 -1
- package/dist/icons/FolderIcon.js +1 -1
- package/dist/icons/FolderOpenFilledIcon.js +1 -1
- package/dist/icons/FolderOpenIcon.js +1 -1
- package/dist/icons/ForwardIcon.js +1 -1
- package/dist/icons/HierarchyIcon.js +1 -1
- package/dist/icons/HierarchyOpenIcon.js +1 -1
- package/dist/icons/Icon.js +1 -1
- package/dist/icons/InfoCircleIcon.js +1 -1
- package/dist/icons/InfoIcon.js +1 -1
- package/dist/icons/KeyIcon.js +1 -1
- package/dist/icons/LeftIcon.js +1 -1
- package/dist/icons/LineChartIcon.js +1 -1
- package/dist/icons/LoadingIcon.js +1 -1
- package/dist/icons/LockFilledIcon.js +1 -1
- package/dist/icons/LockIcon.js +1 -1
- package/dist/icons/MoreIcon.js +1 -1
- package/dist/icons/NotAllowedIcon.js +1 -1
- package/dist/icons/Number123Icon.js +1 -1
- package/dist/icons/NumberIcon.js +1 -1
- package/dist/icons/PauseCircleFilledIcon.js +1 -1
- package/dist/icons/PauseCircleIcon.js +1 -1
- package/dist/icons/PauseIcon.js +1 -1
- package/dist/icons/PercentageIcon.js +1 -1
- package/dist/icons/PieChartIcon.js +1 -1
- package/dist/icons/PlayCircleIcon.js +1 -1
- package/dist/icons/PlayIcon.js +1 -1
- package/dist/icons/PlusIcon.js +1 -1
- package/dist/icons/ProgressBarIcon.js +1 -1
- package/dist/icons/ReloadIcon.js +1 -1
- package/dist/icons/ReportIcon.js +1 -1
- package/dist/icons/ReturnIcon.js +1 -1
- package/dist/icons/RightIcon.js +1 -1
- package/dist/icons/RowTotalsIcon.js +1 -1
- package/dist/icons/SchemeIcon.js +1 -1
- package/dist/icons/SearchIcon.js +1 -1
- package/dist/icons/SemanticQueryIcon.js +1 -1
- package/dist/icons/SettingsIcon.js +1 -1
- package/dist/icons/ShieldFilledIcon.js +1 -1
- package/dist/icons/ShieldIcon.js +1 -1
- package/dist/icons/SlashIcon.js +1 -1
- package/dist/icons/SparklesIcon.js +1 -1
- package/dist/icons/SqlIcon.js +1 -1
- package/dist/icons/StatsIcon.js +1 -1
- package/dist/icons/StopIcon.js +1 -1
- package/dist/icons/StringIcon.js +1 -1
- package/dist/icons/SubtotalsIcon.js +1 -1
- package/dist/icons/SwitchIcon.js +1 -1
- package/dist/icons/TableIcon.js +1 -1
- package/dist/icons/ThumbsDownIcon.js +1 -1
- package/dist/icons/ThumbsUpIcon.js +1 -1
- package/dist/icons/ThunderboltCrossedIcon.js +1 -1
- package/dist/icons/ThunderboltFilledIcon.js +1 -1
- package/dist/icons/ThunderboltIcon.js +1 -1
- package/dist/icons/TimeIcon.js +1 -1
- package/dist/icons/TrashIcon.js +1 -1
- package/dist/icons/UnlockIcon.js +1 -1
- package/dist/icons/UpIcon.js +1 -1
- package/dist/icons/UserGroupIcon.js +1 -1
- package/dist/icons/UserIcon.js +1 -1
- package/dist/icons/UserLockIcon.js +1 -1
- package/dist/icons/ViewIcon.js +1 -1
- package/dist/icons/WarningFilledIcon.js +1 -1
- package/dist/icons/WarningIcon.js +1 -1
- package/dist/icons/wrap-icon.js +1 -1
- package/dist/index.d.ts +4 -1
- package/dist/index.js +5 -4
- package/dist/index.js.map +1 -1
- package/dist/provider.js +1 -1
- package/dist/providers/TrackingProvider.js +1 -1
- package/dist/providers/navigationAdapter.default.js +1 -1
- package/dist/tokens/base.js +1 -1
- package/dist/tokens/colors.js +1 -1
- package/dist/tokens/index.js +1 -1
- package/dist/tokens/layout.js +1 -1
- package/dist/tokens/shadows.js +1 -1
- package/dist/tokens/sizes.js +1 -1
- package/dist/tokens/spacing.js +1 -1
- package/dist/tokens/typography.js +1 -1
- package/dist/utils/ResizeSensor.js +1 -1
- package/dist/utils/is-dev-env.js +1 -1
- package/dist/utils/modules.js +1 -1
- package/dist/utils/promise.js +1 -1
- package/dist/utils/raf.js +1 -1
- package/dist/utils/random.js +1 -1
- package/dist/utils/range.js +1 -1
- package/dist/utils/react/RenderCache.js +1 -1
- package/dist/utils/react/Slots.js +1 -1
- package/dist/utils/react/chain.js +1 -1
- package/dist/utils/react/forwardRefWithGenerics.js +1 -1
- package/dist/utils/react/index.js +1 -1
- package/dist/utils/react/interactions.js +1 -1
- package/dist/utils/react/isTextOnly.js +1 -1
- package/dist/utils/react/mapProps.js +1 -1
- package/dist/utils/react/mergeProps.js +1 -1
- package/dist/utils/react/nullableValue.js +1 -1
- package/dist/utils/react/resolveIcon.js +1 -1
- package/dist/utils/react/sharedStore.js +1 -1
- package/dist/utils/react/useCombinedRefs.js +1 -1
- package/dist/utils/react/useControlledFocusVisible.js +1 -1
- package/dist/utils/react/useEventBus.js +1 -1
- package/dist/utils/react/useId.js +1 -1
- package/dist/utils/react/useIsDarwin.js +1 -1
- package/dist/utils/react/useKeySymbols.js +1 -1
- package/dist/utils/react/useLayoutEffect.js +1 -1
- package/dist/utils/react/useLocalStorage.js +1 -1
- package/dist/utils/react/useMergeStyles.js +1 -1
- package/dist/utils/react/useQaProps.js +1 -1
- package/dist/utils/react/useViewportSize.js +1 -1
- package/dist/utils/react/wrapNodeIfPlain.js +1 -1
- package/dist/utils/selection.js +1 -1
- package/dist/utils/styles.js +1 -1
- package/dist/utils/tree.js +1 -1
- package/dist/utils/warnings.js +1 -1
- package/dist/version.js +2 -2
- package/docs/components/content/Tree.md +299 -0
- package/docs/components/fields/FilterListBox.md +27 -17
- package/docs/components/fields/FilterPicker.md +58 -59
- package/docs/tasty/dsl.md +1 -0
- package/package.json +2 -2
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
# Tree
|
|
2
|
+
|
|
3
|
+
Tree displays hierarchical data as a list of nodes you can expand, collapse,
|
|
4
|
+
select, and (optionally) check. Built on `useTree` and `useTreeState`
|
|
5
|
+
(React Aria + React Stately) and styled with Tasty.
|
|
6
|
+
|
|
7
|
+
The component's data shape (`treeData`) and the public callback shape are
|
|
8
|
+
designed to be a near drop-in for AntD's `Tree` (modulo the `is*` boolean
|
|
9
|
+
prop convention used across `@cube-dev/ui-kit`), so existing AntD `Tree`
|
|
10
|
+
consumers can be migrated with minimal churn.
|
|
11
|
+
|
|
12
|
+
## When to Use
|
|
13
|
+
|
|
14
|
+
- Rendering hierarchical structures such as file systems, organizational
|
|
15
|
+
charts, navigation, or schema browsers.
|
|
16
|
+
- Letting users select one or many nodes from a tree, with cascading
|
|
17
|
+
parent/child checkbox semantics.
|
|
18
|
+
- Lazily loading children when a node is expanded the first time
|
|
19
|
+
(`loadData`).
|
|
20
|
+
- Filtering with auto-expanded ancestors (`autoExpandParent`).
|
|
21
|
+
|
|
22
|
+
## Component
|
|
23
|
+
|
|
24
|
+
---
|
|
25
|
+
|
|
26
|
+
### Properties
|
|
27
|
+
|
|
28
|
+
- **`treeData`** `CubeTreeNodeData[]` — Hierarchical data describing the
|
|
29
|
+
tree.
|
|
30
|
+
- **`isCheckable`** `boolean` (default: `false`) — Render a checkbox in
|
|
31
|
+
front of every eligible row.
|
|
32
|
+
- **`isSelectable`** `boolean` — Sugar for `selectionMode="none"` when
|
|
33
|
+
`false`. `selectionMode` wins when both are passed.
|
|
34
|
+
- **`selectionMode`** `'none' | 'single' | 'multiple'` (default: `'single'`)
|
|
35
|
+
— Selection cardinality.
|
|
36
|
+
- **`isDisabled`** `boolean` (default: `false`) — Disable the entire tree.
|
|
37
|
+
- **`defaultExpandedKeys`** `string[]` — Default expanded keys
|
|
38
|
+
(uncontrolled).
|
|
39
|
+
- **`expandedKeys`** `string[]` — Controlled expanded keys.
|
|
40
|
+
- **`autoExpandParent`** `boolean` (default: `false`) — Auto-expand parents
|
|
41
|
+
of currently expanded keys. Useful for filtering.
|
|
42
|
+
- **`defaultCheckedKeys`** `string[]` — Default checked keys (uncontrolled).
|
|
43
|
+
- **`checkedKeys`** `string[] | { checked: string[]; halfChecked?: string[] }`
|
|
44
|
+
— Controlled checked keys. Pass the object form to receive the same
|
|
45
|
+
shape back from `onCheck`.
|
|
46
|
+
- **`defaultSelectedKeys`** `string[]` — Default selected keys
|
|
47
|
+
(uncontrolled).
|
|
48
|
+
- **`selectedKeys`** `string[]` — Controlled selected keys.
|
|
49
|
+
- **`height`** `number` — Fixed height in pixels. When omitted, the tree
|
|
50
|
+
fills the available vertical space and scrolls internally.
|
|
51
|
+
- **`loadData`** `(node: TreeLoadDataNode) => Promise<void>` — Async
|
|
52
|
+
loader called the first time a non-leaf node with no `children` is
|
|
53
|
+
expanded. The consumer is expected to merge new children into
|
|
54
|
+
`treeData` (typical AntD pattern).
|
|
55
|
+
- **`onExpand`** `(expandedKeys: Key[], info: TreeOnExpandInfo) => void` —
|
|
56
|
+
Called when a node is expanded or collapsed.
|
|
57
|
+
- **`onCheck`** `(checked: Key[] | { checked, halfChecked }, info: TreeOnCheckInfo) => void`
|
|
58
|
+
— Called when a node is checked or unchecked.
|
|
59
|
+
- **`onSelect`** `(selectedKeys: Key[], info: TreeOnSelectInfo) => void` —
|
|
60
|
+
Called when row selection changes.
|
|
61
|
+
- **`rowStyles`** `Styles` — Override styles for `[data-element="Row"]`.
|
|
62
|
+
|
|
63
|
+
#### `CubeTreeNodeData`
|
|
64
|
+
|
|
65
|
+
- **`key`** `string` — Unique identifier of the node.
|
|
66
|
+
- **`title`** `ReactNode` — Visible label.
|
|
67
|
+
- **`children`** `CubeTreeNodeData[]` — Children. Pass `undefined`
|
|
68
|
+
together with `isLeaf={false}` for lazy nodes.
|
|
69
|
+
- **`isLeaf`** `boolean` — Force leaf rendering (no expand toggle, no
|
|
70
|
+
`loadData` call).
|
|
71
|
+
- **`isDisabled`** `boolean` — Disable interactions on this row (focus /
|
|
72
|
+
select / expand / check).
|
|
73
|
+
- **`isCheckboxDisabled`** `boolean` — Disable only the checkbox of this
|
|
74
|
+
row.
|
|
75
|
+
- **`isCheckable`** `boolean` — Per-node override; `false` hides the
|
|
76
|
+
checkbox for this row even when the tree is `isCheckable`.
|
|
77
|
+
|
|
78
|
+
### Base Properties
|
|
79
|
+
|
|
80
|
+
Supports [Base properties](../../BaseProperties.md)
|
|
81
|
+
|
|
82
|
+
### Styling Properties
|
|
83
|
+
|
|
84
|
+
#### styles
|
|
85
|
+
|
|
86
|
+
Customizes the root `treegrid` element of the Tree.
|
|
87
|
+
|
|
88
|
+
**Sub-elements:**
|
|
89
|
+
|
|
90
|
+
- `Row` — A single tree row (also targetable via the dedicated
|
|
91
|
+
`rowStyles` prop).
|
|
92
|
+
|
|
93
|
+
#### rowStyles
|
|
94
|
+
|
|
95
|
+
Customizes `[data-element="Row"]`. Useful when you need to override row
|
|
96
|
+
spacing, hover/selected colors, or cell layout without re-targeting via
|
|
97
|
+
`styles`.
|
|
98
|
+
|
|
99
|
+
**Sub-elements:**
|
|
100
|
+
|
|
101
|
+
- `Toggle` — The expand/collapse button.
|
|
102
|
+
- `Checkbox` — The checkbox slot (visible only when `isCheckable`).
|
|
103
|
+
- `Title` — The title label.
|
|
104
|
+
|
|
105
|
+
### Modifiers
|
|
106
|
+
|
|
107
|
+
The following row-level modifiers are emitted automatically. They are
|
|
108
|
+
useful when overriding `rowStyles`:
|
|
109
|
+
|
|
110
|
+
| Modifier | Type | Description |
|
|
111
|
+
| --------------- | --------- | ------------------------------------------------------ |
|
|
112
|
+
| `selected` | `boolean` | Row is selected. |
|
|
113
|
+
| `checked` | `boolean` | Row is fully checked. |
|
|
114
|
+
| `indeterminate` | `boolean` | Row is in the half-checked state. |
|
|
115
|
+
| `expanded` | `boolean` | Row is expanded. |
|
|
116
|
+
| `disabled` | `boolean` | Row is disabled. |
|
|
117
|
+
| `loading` | `boolean` | The row's children are being fetched via `loadData`. |
|
|
118
|
+
| `leaf` | `boolean` | Row has no children. |
|
|
119
|
+
| `has-checkbox` | `boolean` | Row renders a checkbox. |
|
|
120
|
+
|
|
121
|
+
## Variants
|
|
122
|
+
|
|
123
|
+
### Selection Modes
|
|
124
|
+
|
|
125
|
+
- `none` — Row click does not select. Useful in pure-display or pure-
|
|
126
|
+
checkable trees.
|
|
127
|
+
- `single` (default) — One row selected at a time.
|
|
128
|
+
- `multiple` — Multi-select with keyboard modifiers and shift-range.
|
|
129
|
+
|
|
130
|
+
## Examples
|
|
131
|
+
|
|
132
|
+
### Basic Usage
|
|
133
|
+
|
|
134
|
+
```jsx
|
|
135
|
+
const data = [
|
|
136
|
+
{ key: 'fruits', title: 'Fruits', children: [
|
|
137
|
+
{ key: 'apple', title: 'Apple' },
|
|
138
|
+
{ key: 'banana', title: 'Banana' },
|
|
139
|
+
]},
|
|
140
|
+
{ key: 'vegetables', title: 'Vegetables', children: [
|
|
141
|
+
{ key: 'carrot', title: 'Carrot' },
|
|
142
|
+
]},
|
|
143
|
+
];
|
|
144
|
+
|
|
145
|
+
<Tree treeData={data} defaultExpandedKeys={['fruits']} />;
|
|
146
|
+
```
|
|
147
|
+
|
|
148
|
+
### Checkable
|
|
149
|
+
|
|
150
|
+
`isCheckable` enables AntD-style cascading parent ↔ child checkbox
|
|
151
|
+
behavior: checking a parent checks all eligible descendants, and a
|
|
152
|
+
parent flips into the indeterminate (half-checked) state when only some
|
|
153
|
+
of its descendants are checked.
|
|
154
|
+
|
|
155
|
+
```jsx
|
|
156
|
+
<Tree
|
|
157
|
+
treeData={data}
|
|
158
|
+
isCheckable
|
|
159
|
+
selectionMode="none"
|
|
160
|
+
defaultCheckedKeys={['apple']}
|
|
161
|
+
onCheck={(keys, info) => {
|
|
162
|
+
console.log('checked', keys);
|
|
163
|
+
console.log('half-checked', info.halfCheckedKeys);
|
|
164
|
+
}}
|
|
165
|
+
/>
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
### Controlled Checked
|
|
169
|
+
|
|
170
|
+
To match AntD's object-shape API, pass `checkedKeys` as
|
|
171
|
+
`{ checked, halfChecked }`. `onCheck` returns the same shape.
|
|
172
|
+
|
|
173
|
+
```jsx
|
|
174
|
+
const [checkedKeys, setCheckedKeys] = useState({ checked: [], halfChecked: [] });
|
|
175
|
+
|
|
176
|
+
<Tree
|
|
177
|
+
treeData={data}
|
|
178
|
+
isCheckable
|
|
179
|
+
checkedKeys={checkedKeys}
|
|
180
|
+
onCheck={(next) => setCheckedKeys(next)}
|
|
181
|
+
/>
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
### Lazy Loading
|
|
185
|
+
|
|
186
|
+
Set `isLeaf: false` and omit `children` on a node, then provide a
|
|
187
|
+
`loadData` callback. The callback should merge new children into
|
|
188
|
+
`treeData`. The row shows a spinner while in flight; subsequent expands
|
|
189
|
+
of the same key won't refire `loadData`.
|
|
190
|
+
|
|
191
|
+
```jsx
|
|
192
|
+
const handleLoadData = (node) =>
|
|
193
|
+
fetch(`/api/children?key=${node.key}`)
|
|
194
|
+
.then((r) => r.json())
|
|
195
|
+
.then((children) => mergeIntoTreeData(node.key, children));
|
|
196
|
+
|
|
197
|
+
<Tree treeData={data} loadData={handleLoadData} />
|
|
198
|
+
```
|
|
199
|
+
|
|
200
|
+
### Auto-expand Parent (Filtering)
|
|
201
|
+
|
|
202
|
+
Pass the matching keys via `expandedKeys` and set `autoExpandParent` to
|
|
203
|
+
keep their ancestors expanded.
|
|
204
|
+
|
|
205
|
+
```jsx
|
|
206
|
+
<Tree
|
|
207
|
+
treeData={data}
|
|
208
|
+
expandedKeys={matchedKeys}
|
|
209
|
+
autoExpandParent
|
|
210
|
+
/>
|
|
211
|
+
```
|
|
212
|
+
|
|
213
|
+
### Per-node Disabling
|
|
214
|
+
|
|
215
|
+
Disable the entire row, just the checkbox, or hide the checkbox via
|
|
216
|
+
node-level flags.
|
|
217
|
+
|
|
218
|
+
```jsx
|
|
219
|
+
const data = [
|
|
220
|
+
{ key: 'a', title: 'A', children: [
|
|
221
|
+
{ key: 'a-1', title: 'A-1', isDisabled: true },
|
|
222
|
+
{ key: 'a-2', title: 'A-2', isCheckboxDisabled: true },
|
|
223
|
+
{ key: 'a-3', title: 'A-3', isCheckable: false },
|
|
224
|
+
]},
|
|
225
|
+
];
|
|
226
|
+
|
|
227
|
+
<Tree treeData={data} isCheckable defaultExpandedKeys={['a']} />
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
### Fixed Height
|
|
231
|
+
|
|
232
|
+
```jsx
|
|
233
|
+
<Tree treeData={data} height={300} />
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
## Accessibility
|
|
237
|
+
|
|
238
|
+
Tree implements the
|
|
239
|
+
[`treegrid` ARIA pattern](https://www.w3.org/WAI/ARIA/apg/patterns/treegrid/)
|
|
240
|
+
via `useTree` from React Aria.
|
|
241
|
+
|
|
242
|
+
### Keyboard Navigation
|
|
243
|
+
|
|
244
|
+
- `Tab` — Moves focus into / out of the tree (focus stays on the
|
|
245
|
+
currently active row inside).
|
|
246
|
+
- `ArrowUp` / `ArrowDown` — Move focus to the previous / next visible row.
|
|
247
|
+
- `ArrowRight` — Expand the focused row (or move to its first child if
|
|
248
|
+
already expanded).
|
|
249
|
+
- `ArrowLeft` — Collapse the focused row (or move to its parent if
|
|
250
|
+
already collapsed).
|
|
251
|
+
- `Home` / `End` — Move focus to the first / last visible row.
|
|
252
|
+
- `Space` / `Enter` — Toggle selection on the focused row (in `single`
|
|
253
|
+
or `multiple` mode).
|
|
254
|
+
|
|
255
|
+
### Screen Reader Support
|
|
256
|
+
|
|
257
|
+
- Each row reports `aria-level`, `aria-posinset`, `aria-setsize`, and
|
|
258
|
+
`aria-expanded` so screen readers can announce the position and
|
|
259
|
+
expansion state.
|
|
260
|
+
- When `isCheckable` is enabled, the row carries `aria-checked` (`true`,
|
|
261
|
+
`false`, or `mixed` for the indeterminate state).
|
|
262
|
+
- Disabled rows expose `aria-disabled="true"`.
|
|
263
|
+
|
|
264
|
+
### ARIA Properties
|
|
265
|
+
|
|
266
|
+
- `aria-label` — Provide a label that describes the tree's contents
|
|
267
|
+
(defaults to `"Tree"`).
|
|
268
|
+
|
|
269
|
+
## Best Practices
|
|
270
|
+
|
|
271
|
+
1. **Do**: Provide stable, unique `key`s — they are used for selection,
|
|
272
|
+
expansion, checking, and lazy-load tracking.
|
|
273
|
+
```jsx
|
|
274
|
+
<Tree treeData={data.map((node) => ({ ...node, key: node.id }))} />
|
|
275
|
+
```
|
|
276
|
+
2. **Don't**: Mutate `treeData` in place. Always return a new array
|
|
277
|
+
from `loadData`'s commit step so React Stately can rebuild the
|
|
278
|
+
collection.
|
|
279
|
+
3. **Accessibility**: When using checkboxes for selection, set
|
|
280
|
+
`selectionMode="none"` so the row click doesn't compete with the
|
|
281
|
+
checkbox.
|
|
282
|
+
4. **Performance**: For very large trees, prefer virtualization (planned;
|
|
283
|
+
see Suggested Improvements) or use `loadData` to defer subtree
|
|
284
|
+
construction.
|
|
285
|
+
|
|
286
|
+
## Suggested Improvements
|
|
287
|
+
|
|
288
|
+
- Built-in virtualization for very large trees (10k+ rows).
|
|
289
|
+
- Drag-and-drop reordering, mirroring AntD's `draggable` API.
|
|
290
|
+
- An `onRightClick`/context menu hook.
|
|
291
|
+
- Reveal-on-mount: scroll the focused row into view when expanded
|
|
292
|
+
programmatically.
|
|
293
|
+
- Optional inline title editing.
|
|
294
|
+
|
|
295
|
+
## Related Components
|
|
296
|
+
|
|
297
|
+
- [ListBox](/components/ListBox) — Flat list with single/multi selection.
|
|
298
|
+
- [Menu](/components/Menu) — Hierarchical action lists in popovers.
|
|
299
|
+
- [Tabs](/components/Tabs) — Switch between sibling content panels.
|
|
@@ -28,7 +28,7 @@ A searchable list selection component that combines a ListBox with an integrated
|
|
|
28
28
|
- **`size`** `'small' | 'medium' | 'large'` (default: `medium`) — FilterListBox size
|
|
29
29
|
- **`searchPlaceholder`** `string` (default: `Search...`) — Placeholder text in the search input
|
|
30
30
|
- **`filter`** `((textValue: string, inputValue: string) => boolean) | false` — Custom filter function or `false` to disable filtering
|
|
31
|
-
- **`emptyLabel`** `ReactNode` (default: `No items`
|
|
31
|
+
- **`emptyLabel`** `ReactNode` (default: context-aware: `No items` or `No results found`) — Label shown when the list is empty. When provided, overrides both defaults for any empty state
|
|
32
32
|
- **`allowsCustomValue`** `boolean` (default: `false`) — Whether to allow custom values not in the options list
|
|
33
33
|
- **`isCheckable`** `boolean` (default: `false`) — Whether to show checkboxes for multiple selection
|
|
34
34
|
- **`shouldFocusWrap`** `boolean` (default: `false`) — Whether keyboard navigation should wrap around
|
|
@@ -44,6 +44,7 @@ A searchable list selection component that combines a ListBox with an integrated
|
|
|
44
44
|
- **`onOptionClick`** `(key: Key) => void` — Callback when an option is clicked
|
|
45
45
|
- **`items`** `Iterable<T>` — Array of items for dynamic content with render function pattern
|
|
46
46
|
- **`isLoading`** `boolean` (default: `false`) — Whether the FilterListBox is in a loading state (shows loading icon in search input)
|
|
47
|
+
- **`isLoadingItems`** `boolean` (default: `false`) — Whether items are currently loading. Shows a loading icon in the search input suffix
|
|
47
48
|
- **`autoFocus`** `boolean` — Whether the search input should have autofocus
|
|
48
49
|
- **`customValueProps`** `Partial<CubeItemProps>` — Props to apply to existing custom values (already selected but not in predefined options)
|
|
49
50
|
- **`newCustomValueProps`** `Partial<CubeItemProps>` — Props to apply to new custom values appearing in search results (merged with `customValueProps`)
|
|
@@ -142,6 +143,7 @@ The `mods` property accepts the following modifiers you can override:
|
|
|
142
143
|
- `disabled` `boolean` — Applied when `isDisabled={true}`
|
|
143
144
|
- `focused` `boolean` — Applied when the FilterListBox has focus
|
|
144
145
|
- `loading` `boolean` — Applied when `isLoading={true}`
|
|
146
|
+
- `loading-items` `boolean` — Applied when `isLoadingItems={true}`
|
|
145
147
|
- `searchable` `boolean` — Always true for FilterListBox
|
|
146
148
|
- `prefix` `boolean` — Applied when loading icon is shown
|
|
147
149
|
|
|
@@ -622,36 +624,44 @@ Use `customValueProps` to style existing custom values and `newCustomValueProps`
|
|
|
622
624
|
- `customValueProps` - Applied to custom values that are already selected
|
|
623
625
|
- `newCustomValueProps` - Applied to new custom values appearing when typing in search (merged with `customValueProps`)
|
|
624
626
|
|
|
625
|
-
###
|
|
627
|
+
### Server-Side / Dynamic Search
|
|
626
628
|
|
|
627
|
-
For server-side filtering
|
|
629
|
+
For server-side filtering, use `filter={false}` with controlled search and dynamic `items`. Items are replaced when the server responds, and `isLoadingItems` shows a subtle spinner in the search input while the fetch is in flight.
|
|
628
630
|
|
|
629
631
|
```jsx
|
|
632
|
+
const [items, setItems] = useState(initialItems);
|
|
630
633
|
const [searchValue, setSearchValue] = useState('');
|
|
631
|
-
const [
|
|
634
|
+
const [isLoadingItems, setIsLoadingItems] = useState(false);
|
|
632
635
|
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
636
|
+
const handleSearchChange = useCallback((value) => {
|
|
637
|
+
setSearchValue(value);
|
|
638
|
+
setIsLoadingItems(true);
|
|
639
|
+
debouncedFetch(value)
|
|
640
|
+
.then(setItems)
|
|
641
|
+
.finally(() => setIsLoadingItems(false));
|
|
642
|
+
}, []);
|
|
638
643
|
|
|
639
644
|
<FilterListBox
|
|
645
|
+
items={items}
|
|
640
646
|
searchValue={searchValue}
|
|
641
|
-
onSearchChange={
|
|
647
|
+
onSearchChange={handleSearchChange}
|
|
642
648
|
filter={false}
|
|
649
|
+
isLoadingItems={isLoadingItems}
|
|
643
650
|
>
|
|
644
|
-
{
|
|
651
|
+
{(item) => (
|
|
645
652
|
<FilterListBox.Item key={item.id}>{item.name}</FilterListBox.Item>
|
|
646
|
-
)
|
|
653
|
+
)}
|
|
647
654
|
</FilterListBox>
|
|
648
655
|
```
|
|
649
656
|
|
|
650
|
-
**
|
|
651
|
-
-
|
|
652
|
-
-
|
|
653
|
-
-
|
|
654
|
-
-
|
|
657
|
+
**How it works:**
|
|
658
|
+
- **`filter={false}`** disables client-side filtering so items appear exactly as the server returns them
|
|
659
|
+
- **`searchValue` + `onSearchChange`** give you control over the search input; debounce and fetch on your side
|
|
660
|
+
- **`items`** is reactive — replace it with server results and the list updates automatically
|
|
661
|
+
- **`isLoadingItems`** shows a loading spinner in the search input suffix while fetching. While loading, stale items that do not text-match the current search are hidden client-side so the user only sees relevant suggestions
|
|
662
|
+
- **Selected custom values** (with `allowsCustomValue` in multi-select) are filtered against the search input too, so they don't appear when they don't match
|
|
663
|
+
- **`emptyLabel`** can be used to customize the empty state message (e.g. `"Loading items..."` during initial load)
|
|
664
|
+
- Debouncing is the consumer's responsibility (300-500ms is typical)
|
|
655
665
|
|
|
656
666
|
### Escape Key Handling
|
|
657
667
|
|
|
@@ -24,6 +24,7 @@ A versatile selection component that combines a trigger button with a searchable
|
|
|
24
24
|
- **`selectionMode`** `'single' | 'multiple'` (default: `single`) — Selection mode for the picker
|
|
25
25
|
- **`allowsCustomValue`** `boolean` (default: `false`) — Whether to allow entering custom values that are not present in the predefined options
|
|
26
26
|
- **`isClearable`** `boolean` (default: `false`) — Whether the filter picker is clearable using a clear button in the rightIcon slot
|
|
27
|
+
- **`isLoadingItems`** `boolean` (default: `false`) — Whether items are currently loading. Shows a loading spinner in the search input suffix inside the popover. Unlike `isLoading`, does not disable the trigger.
|
|
27
28
|
- **`disallowEmptySelection`** `boolean` (default: `false`) — Whether to disallow empty selection
|
|
28
29
|
- **`disabledKeys`** `Key[]` — Array of keys for disabled items
|
|
29
30
|
- **`items`** `Iterable<T>` — Array of items to render when using the render function pattern for large datasets with dynamic content
|
|
@@ -33,7 +34,7 @@ A versatile selection component that combines a trigger button with a searchable
|
|
|
33
34
|
- **`theme`** `'default' | 'special'` (default: `default`) — Button theme
|
|
34
35
|
- **`size`** `'small' | 'medium' | 'large'` (default: `medium`) — Size of the picker component
|
|
35
36
|
- **`searchPlaceholder`** `string` — Placeholder text in the search input
|
|
36
|
-
- **`emptyLabel`** `
|
|
37
|
+
- **`emptyLabel`** `ReactNode` (default: context-aware: `No items` or `No results found`) — Label shown when the list is empty. When provided, overrides both defaults for any empty state
|
|
37
38
|
- **`filter`** `((textValue: string, inputValue: string) => boolean) | false` — Custom filter function for determining if an option should be included in search results
|
|
38
39
|
- **`header`** `ReactNode` — Custom header content
|
|
39
40
|
- **`footer`** `ReactNode` — Custom footer content
|
|
@@ -455,6 +456,22 @@ const categories = [
|
|
|
455
456
|
</FilterPicker>
|
|
456
457
|
```
|
|
457
458
|
|
|
459
|
+
### Loading Items
|
|
460
|
+
|
|
461
|
+
Use `isLoadingItems` to indicate that items are currently being fetched. Unlike `isLoading`, the trigger stays enabled so users can still open the popover and interact with items that have already loaded. A loading spinner appears in the search input suffix.
|
|
462
|
+
|
|
463
|
+
```jsx
|
|
464
|
+
<FilterPicker
|
|
465
|
+
label="Loading Items"
|
|
466
|
+
placeholder="Select a fruit..."
|
|
467
|
+
isLoadingItems={true}
|
|
468
|
+
selectionMode="multiple"
|
|
469
|
+
>
|
|
470
|
+
<FilterPicker.Item key="apple">Apple</FilterPicker.Item>
|
|
471
|
+
<FilterPicker.Item key="banana">Banana</FilterPicker.Item>
|
|
472
|
+
</FilterPicker>
|
|
473
|
+
```
|
|
474
|
+
|
|
458
475
|
### Complex Example
|
|
459
476
|
|
|
460
477
|
```jsx
|
|
@@ -714,78 +731,60 @@ The clear button:
|
|
|
714
731
|
- Calls the optional `onClear` callback
|
|
715
732
|
- Is hidden when the picker is disabled or read-only
|
|
716
733
|
|
|
717
|
-
###
|
|
718
|
-
|
|
719
|
-
FilterPicker provides two approaches for implementing external filtering when you need to control the filtering logic outside the component:
|
|
734
|
+
### Server-Side / Dynamic Search
|
|
720
735
|
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
Use `filter={false}` to disable internal filtering while providing pre-filtered items:
|
|
724
|
-
|
|
725
|
-
```jsx
|
|
726
|
-
const [externalSearch, setExternalSearch] = useState('');
|
|
727
|
-
|
|
728
|
-
const filteredFruits = useMemo(() => {
|
|
729
|
-
if (!externalSearch.trim()) return allFruits;
|
|
730
|
-
return allFruits.filter((fruit) =>
|
|
731
|
-
fruit.label.toLowerCase().includes(externalSearch.toLowerCase())
|
|
732
|
-
);
|
|
733
|
-
}, [externalSearch]);
|
|
734
|
-
|
|
735
|
-
<FilterPicker
|
|
736
|
-
label="Select Fruits"
|
|
737
|
-
placeholder="Choose fruits..."
|
|
738
|
-
selectionMode="multiple"
|
|
739
|
-
filter={false}
|
|
740
|
-
items={filteredFruits}
|
|
741
|
-
searchPlaceholder="Type to search..."
|
|
742
|
-
>
|
|
743
|
-
{(fruit) => (
|
|
744
|
-
<FilterPicker.Item key={fruit.key}>{fruit.label}</FilterPicker.Item>
|
|
745
|
-
)}
|
|
746
|
-
</FilterPicker>
|
|
747
|
-
```
|
|
748
|
-
|
|
749
|
-
#### Approach 2: Controlled Search Input
|
|
750
|
-
|
|
751
|
-
Use `searchValue` and `onSearchChange` for complete control over the search behavior:
|
|
736
|
+
When items come from a backend API, use `filter={false}` with controlled search to let the server handle filtering. Items are replaced when the response arrives, and `isLoadingItems` shows a subtle spinner in the search input while the fetch is in flight.
|
|
752
737
|
|
|
753
738
|
```jsx
|
|
739
|
+
const [items, setItems] = useState(initialItems);
|
|
754
740
|
const [searchValue, setSearchValue] = useState('');
|
|
741
|
+
const [isLoadingItems, setIsLoadingItems] = useState(false);
|
|
755
742
|
|
|
756
|
-
|
|
757
|
-
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
const filteredFruits = useMemo(() => {
|
|
764
|
-
if (!processedSearch.trim()) return allFruits;
|
|
765
|
-
return allFruits.filter((fruit) =>
|
|
766
|
-
fruit.label.toLowerCase().includes(processedSearch.toLowerCase())
|
|
767
|
-
);
|
|
768
|
-
}, [processedSearch]);
|
|
743
|
+
const handleSearchChange = useCallback((value) => {
|
|
744
|
+
setSearchValue(value);
|
|
745
|
+
setIsLoadingItems(true);
|
|
746
|
+
debouncedFetch(value)
|
|
747
|
+
.then(setItems)
|
|
748
|
+
.finally(() => setIsLoadingItems(false));
|
|
749
|
+
}, []);
|
|
769
750
|
|
|
770
751
|
<FilterPicker
|
|
771
|
-
|
|
772
|
-
placeholder="Choose fruits..."
|
|
773
|
-
selectionMode="multiple"
|
|
752
|
+
items={items}
|
|
774
753
|
searchValue={searchValue}
|
|
754
|
+
onSearchChange={handleSearchChange}
|
|
775
755
|
filter={false}
|
|
776
|
-
|
|
777
|
-
|
|
756
|
+
sortSelectedToTop={false}
|
|
757
|
+
isLoadingItems={isLoadingItems}
|
|
758
|
+
placeholder="Search items..."
|
|
759
|
+
selectionMode="multiple"
|
|
760
|
+
onOpenChange={(isOpen) => {
|
|
761
|
+
if (!isOpen) {
|
|
762
|
+
setSearchValue('');
|
|
763
|
+
setItems(initialItems);
|
|
764
|
+
}
|
|
765
|
+
}}
|
|
778
766
|
>
|
|
779
|
-
{(
|
|
780
|
-
<FilterPicker.Item key={
|
|
767
|
+
{(item) => (
|
|
768
|
+
<FilterPicker.Item key={item.id} textValue={item.name}>
|
|
769
|
+
{item.name}
|
|
770
|
+
</FilterPicker.Item>
|
|
781
771
|
)}
|
|
782
772
|
</FilterPicker>
|
|
783
773
|
```
|
|
784
774
|
|
|
785
|
-
**
|
|
786
|
-
- **`filter={false}
|
|
787
|
-
-
|
|
788
|
-
-
|
|
775
|
+
**How it works:**
|
|
776
|
+
- **`filter={false}`** disables client-side filtering so items are shown exactly as the server returns them
|
|
777
|
+
- **`searchValue` + `onSearchChange`** give you control over the search input; debounce and fetch on your side
|
|
778
|
+
- **`items`** is a reactive prop — replace it with server results and the list updates automatically
|
|
779
|
+
- **`isLoadingItems`** shows a loading spinner in the search input suffix while fetching. While loading, stale items that do not text-match the current search are hidden client-side so the user only sees relevant suggestions
|
|
780
|
+
- **Selected custom values** (with `allowsCustomValue` in multi-select) are filtered against the search input too, so they don't appear when they don't match
|
|
781
|
+
- **`sortSelectedToTop={false}`** is recommended when the server controls item order
|
|
782
|
+
- **`emptyLabel`** can be used to customize the empty state message (e.g. `"Loading items..."` during initial load)
|
|
783
|
+
- **Reset on close** — use `onOpenChange` to restore the initial item set and clear the search when the popover closes, ensuring the trigger label resolves correctly
|
|
784
|
+
|
|
785
|
+
**Tips:**
|
|
786
|
+
- Debouncing is the consumer's responsibility (300-500ms is typical)
|
|
787
|
+
- During the debounce delay, old items remain visible — if you want instant client-side feedback while waiting, use a filter function instead of `false`
|
|
789
788
|
|
|
790
789
|
## Performance
|
|
791
790
|
|
package/docs/tasty/dsl.md
CHANGED
|
@@ -59,6 +59,7 @@ Control how a sub-element selector attaches to the root selector using the `$` p
|
|
|
59
59
|
| *(none)* | ` [el]` | Descendant (default) |
|
|
60
60
|
| `>` | `> [el]` | Direct child |
|
|
61
61
|
| `>Body>Row>` | `> [Body] > [Row] > [el]` | Chained elements |
|
|
62
|
+
| `> SubElementName` | `> [SubElementName]` | Self-name shorthand — when the trailing element name matches the sub-element's own key, it acts as the placeholder (same as `@`); no duplication |
|
|
62
63
|
| `h1` | ` h1` | Tag selector (no key injection) |
|
|
63
64
|
| `h1 >` | ` h1 > [el]` | Key is direct child of tag |
|
|
64
65
|
| `h1 *` | ` h1 *` | Any descendant of tag |
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@cube-dev/ui-kit",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.129.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "UIKit for Cube Projects",
|
|
6
6
|
"repository": {
|
|
@@ -45,7 +45,7 @@
|
|
|
45
45
|
"@react-types/shared": "^3.32.1",
|
|
46
46
|
"@tabler/icons-react": "^3.31.0",
|
|
47
47
|
"@tanstack/react-virtual": "^3.13.12",
|
|
48
|
-
"@tenphi/tasty": "2.1.
|
|
48
|
+
"@tenphi/tasty": "2.1.1",
|
|
49
49
|
"clipboard-copy": "^4.0.1",
|
|
50
50
|
"clsx": "^1.1.1",
|
|
51
51
|
"diff": "^8.0.3",
|