@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.
Files changed (432) hide show
  1. package/dist/CHANGELOG.md +40 -0
  2. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  3. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  4. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  5. package/dist/_internal/hooks/use-event.js +1 -1
  6. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  7. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  8. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  9. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  10. package/dist/_internal/hooks/use-warn.js +1 -1
  11. package/dist/components/Block.js +1 -1
  12. package/dist/components/CollectionItem.js +1 -1
  13. package/dist/components/GlobalStyles.js +1 -1
  14. package/dist/components/GridProvider.js +1 -1
  15. package/dist/components/HiddenInput.js +1 -1
  16. package/dist/components/Root.js +1 -1
  17. package/dist/components/actions/Action/Action.js +1 -1
  18. package/dist/components/actions/Banner/Banner.js +1 -1
  19. package/dist/components/actions/Button/Button.js +1 -1
  20. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  21. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  22. package/dist/components/actions/ButtonSplit/context.js +1 -1
  23. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  24. package/dist/components/actions/CommandMenu/styled.js +1 -1
  25. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  26. package/dist/components/actions/ItemActionContext.js +1 -1
  27. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  28. package/dist/components/actions/Link/Link.js +1 -1
  29. package/dist/components/actions/Menu/Menu.js +1 -1
  30. package/dist/components/actions/Menu/MenuItem.js +1 -1
  31. package/dist/components/actions/Menu/MenuSection.js +1 -1
  32. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  34. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  35. package/dist/components/actions/Menu/context.js +1 -1
  36. package/dist/components/actions/Menu/styled.js +1 -1
  37. package/dist/components/actions/index.js +1 -1
  38. package/dist/components/actions/use-action.js +1 -1
  39. package/dist/components/actions/use-anchored-menu.js +1 -1
  40. package/dist/components/actions/use-context-menu.js +1 -1
  41. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  42. package/dist/components/content/Alert/Alert.js +1 -1
  43. package/dist/components/content/Alert/use-alert.js +1 -1
  44. package/dist/components/content/Avatar/Avatar.js +1 -1
  45. package/dist/components/content/Badge/Badge.js +1 -1
  46. package/dist/components/content/Card/Card.js +1 -1
  47. package/dist/components/content/Content.js +1 -1
  48. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  49. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  50. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  51. package/dist/components/content/Divider.js +1 -1
  52. package/dist/components/content/Footer.js +1 -1
  53. package/dist/components/content/Header.js +1 -1
  54. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  55. package/dist/components/content/Item/Item.js +1 -1
  56. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  57. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  58. package/dist/components/content/Layout/GridLayout.js +1 -1
  59. package/dist/components/content/Layout/Layout.js +1 -1
  60. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  61. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  62. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  63. package/dist/components/content/Layout/LayoutContent.js +1 -1
  64. package/dist/components/content/Layout/LayoutContext.js +1 -1
  65. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  66. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  67. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  68. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  69. package/dist/components/content/Layout/LayoutPane.js +1 -1
  70. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  71. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  72. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  73. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  74. package/dist/components/content/Layout/index.js +1 -1
  75. package/dist/components/content/Layout/utils.js +1 -1
  76. package/dist/components/content/Paragraph.js +1 -1
  77. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  78. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  79. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  80. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  81. package/dist/components/content/Result/Result.js +1 -1
  82. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  83. package/dist/components/content/Tag/Tag.js +1 -1
  84. package/dist/components/content/Text.js +1 -1
  85. package/dist/components/content/TextItem/TextItem.js +1 -1
  86. package/dist/components/content/Title.js +1 -1
  87. package/dist/components/content/Tree/Tree.d.ts +27 -0
  88. package/dist/components/content/Tree/Tree.js +265 -0
  89. package/dist/components/content/Tree/Tree.js.map +1 -0
  90. package/dist/components/content/Tree/TreeNode.js +107 -0
  91. package/dist/components/content/Tree/TreeNode.js.map +1 -0
  92. package/dist/components/content/Tree/index.d.ts +3 -0
  93. package/dist/components/content/Tree/styled.js +146 -0
  94. package/dist/components/content/Tree/styled.js.map +1 -0
  95. package/dist/components/content/Tree/tree-index.js +26 -0
  96. package/dist/components/content/Tree/tree-index.js.map +1 -0
  97. package/dist/components/content/Tree/types.d.ts +145 -0
  98. package/dist/components/content/Tree/use-checkbox-tree.js +231 -0
  99. package/dist/components/content/Tree/use-checkbox-tree.js.map +1 -0
  100. package/dist/components/content/Tree/use-load-data.js +75 -0
  101. package/dist/components/content/Tree/use-load-data.js.map +1 -0
  102. package/dist/components/content/highlightText.js +1 -1
  103. package/dist/components/content/use-auto-tooltip.js +1 -1
  104. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  105. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  106. package/dist/components/fields/Checkbox/context.js +1 -1
  107. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  108. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  109. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  110. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  111. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  112. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  113. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  114. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  115. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  116. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  117. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  118. package/dist/components/fields/DatePicker/intl.js +1 -1
  119. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  120. package/dist/components/fields/DatePicker/props.js +1 -1
  121. package/dist/components/fields/DatePicker/utils.js +1 -1
  122. package/dist/components/fields/FileInput/FileInput.js +1 -1
  123. package/dist/components/fields/FilterListBox/FilterListBox.d.ts +3 -1
  124. package/dist/components/fields/FilterListBox/FilterListBox.js +115 -51
  125. package/dist/components/fields/FilterListBox/FilterListBox.js.map +1 -1
  126. package/dist/components/fields/FilterPicker/FilterPicker.d.ts +6 -0
  127. package/dist/components/fields/FilterPicker/FilterPicker.js +4 -2
  128. package/dist/components/fields/FilterPicker/FilterPicker.js.map +1 -1
  129. package/dist/components/fields/Input/Input.js +1 -1
  130. package/dist/components/fields/ListBox/ListBox.js +1 -1
  131. package/dist/components/fields/NumberInput/NumberInput.js +2 -2
  132. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  133. package/dist/components/fields/PasswordInput/PasswordInput.js +2 -2
  134. package/dist/components/fields/Picker/Picker.js +1 -1
  135. package/dist/components/fields/RadioGroup/Radio.js +2 -2
  136. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  137. package/dist/components/fields/RadioGroup/context.js +1 -1
  138. package/dist/components/fields/SearchInput/SearchInput.js +2 -2
  139. package/dist/components/fields/Select/Select.js +1 -1
  140. package/dist/components/fields/Slider/Gradation.js +1 -1
  141. package/dist/components/fields/Slider/HueSlider.js +1 -1
  142. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  143. package/dist/components/fields/Slider/Slider.js +1 -1
  144. package/dist/components/fields/Slider/SliderBase.js +1 -1
  145. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  146. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  147. package/dist/components/fields/Slider/elements.js +1 -1
  148. package/dist/components/fields/Slider/index.js +1 -1
  149. package/dist/components/fields/Switch/Switch.js +1 -1
  150. package/dist/components/fields/TextArea/TextArea.js +2 -2
  151. package/dist/components/fields/TextInput/TextInput.js +2 -2
  152. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  153. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  154. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  155. package/dist/components/form/FieldWrapper/extract-field-wrapper-props.js +1 -1
  156. package/dist/components/form/Form/Field.js +1 -1
  157. package/dist/components/form/Form/Form.js +1 -1
  158. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  159. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  160. package/dist/components/form/Form/SubmitError.js +1 -1
  161. package/dist/components/form/Form/index.js +1 -1
  162. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  163. package/dist/components/form/Form/use-field/use-field.js +1 -1
  164. package/dist/components/form/Form/use-form.js +1 -1
  165. package/dist/components/form/Form/validation.js +1 -1
  166. package/dist/components/form/Label.js +1 -1
  167. package/dist/components/form/wrapper.js +1 -1
  168. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  169. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  170. package/dist/components/layout/Flex.js +1 -1
  171. package/dist/components/layout/Flow.js +1 -1
  172. package/dist/components/layout/Grid.js +1 -1
  173. package/dist/components/layout/Panel.js +1 -1
  174. package/dist/components/layout/Prefix.js +1 -1
  175. package/dist/components/layout/ResizablePanel.js +1 -1
  176. package/dist/components/layout/Space.js +1 -1
  177. package/dist/components/layout/Suffix.js +1 -1
  178. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  179. package/dist/components/navigation/Tabs/EditableTitle.js +1 -1
  180. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  181. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  182. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  183. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  184. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  185. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  186. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  187. package/dist/components/navigation/Tabs/styled.js +1 -1
  188. package/dist/components/navigation/Tabs/types.js +1 -1
  189. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  190. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  191. package/dist/components/organisms/FileTabs/FileTabs.js +1 -1
  192. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  193. package/dist/components/other/Calendar/Calendar.js +1 -1
  194. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  195. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  196. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  197. package/dist/components/other/CloudLogo/CloudLogo.js +1 -1
  198. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  199. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  200. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  201. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  202. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  203. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  204. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  205. package/dist/components/overlays/Dialog/context.js +1 -1
  206. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  207. package/dist/components/overlays/Modal/Modal.js +1 -1
  208. package/dist/components/overlays/Modal/OpenTransition.js +1 -1
  209. package/dist/components/overlays/Modal/Overlay.js +1 -1
  210. package/dist/components/overlays/Modal/Popover.js +1 -1
  211. package/dist/components/overlays/Modal/Tray.js +1 -1
  212. package/dist/components/overlays/Modal/Underlay.js +1 -1
  213. package/dist/components/overlays/Notifications/Notification.js +1 -1
  214. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  215. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  216. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  217. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  218. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  219. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  220. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  221. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  222. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  223. package/dist/components/overlays/Notifications/index.js +1 -1
  224. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  225. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  226. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  227. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  228. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  229. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  230. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  231. package/dist/components/overlays/Toast/index.js +1 -1
  232. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  233. package/dist/components/overlays/Toast/useToast.js +1 -1
  234. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  235. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  236. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  237. package/dist/components/overlays/Tooltip/context.js +1 -1
  238. package/dist/components/portal/Portal.js +1 -1
  239. package/dist/components/portal/PortalProvider.js +1 -1
  240. package/dist/components/portal/usePortal.js +1 -1
  241. package/dist/components/shared/InvalidIcon.js +1 -1
  242. package/dist/components/shared/ValidIcon.js +1 -1
  243. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  244. package/dist/components/status/Spin/Cube.js +1 -1
  245. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  246. package/dist/components/status/Spin/Spin.js +1 -1
  247. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  248. package/dist/data/item-themes.js +1 -1
  249. package/dist/data/themes.js +1 -1
  250. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  251. package/dist/icons/AdjustmentsIcon.js +1 -1
  252. package/dist/icons/AiIcon.js +1 -1
  253. package/dist/icons/AreaChartIcon.js +1 -1
  254. package/dist/icons/BackwardIcon.js +1 -1
  255. package/dist/icons/BarChartIcon.js +1 -1
  256. package/dist/icons/BellFilledIcon.js +1 -1
  257. package/dist/icons/BellIcon.js +1 -1
  258. package/dist/icons/BooleanIcon.js +1 -1
  259. package/dist/icons/CalendarEditIcon.js +1 -1
  260. package/dist/icons/CalendarIcon.js +1 -1
  261. package/dist/icons/CaretDownIcon.js +1 -1
  262. package/dist/icons/CaretUpIcon.js +1 -1
  263. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  264. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  265. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  266. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  267. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  268. package/dist/icons/ChartBarLineIcon.js +1 -1
  269. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  270. package/dist/icons/ChartBarStackedIcon.js +1 -1
  271. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  272. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  273. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  274. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  275. package/dist/icons/ChartBubbleIcon.js +1 -1
  276. package/dist/icons/ChartDonut2Icon.js +1 -1
  277. package/dist/icons/ChartFunnelIcon.js +1 -1
  278. package/dist/icons/ChartHeatmapIcon.js +1 -1
  279. package/dist/icons/ChartKPIIcon.js +1 -1
  280. package/dist/icons/ChartPie2Icon.js +1 -1
  281. package/dist/icons/ChartScatterIcon.js +1 -1
  282. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  283. package/dist/icons/CheckCircleIcon.js +1 -1
  284. package/dist/icons/CheckIcon.js +1 -1
  285. package/dist/icons/CircleFilledIcon.js +1 -1
  286. package/dist/icons/ClearIcon.js +1 -1
  287. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  288. package/dist/icons/CloseCircleIcon.js +1 -1
  289. package/dist/icons/CloseIcon.js +1 -1
  290. package/dist/icons/CodeIcon.js +1 -1
  291. package/dist/icons/ColumnTotalIcon.js +1 -1
  292. package/dist/icons/CopyIcon.js +1 -1
  293. package/dist/icons/CountIcon.js +1 -1
  294. package/dist/icons/CubeIcon.js +1 -1
  295. package/dist/icons/CubePauseIcon.js +1 -1
  296. package/dist/icons/CubePlayIcon.js +1 -1
  297. package/dist/icons/CurrencyDollarIcon.js +1 -1
  298. package/dist/icons/DangerIcon.js +1 -1
  299. package/dist/icons/DashboardIcon.js +1 -1
  300. package/dist/icons/DatabaseIcon.js +1 -1
  301. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  302. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  303. package/dist/icons/DirectionIcon.js +1 -1
  304. package/dist/icons/DonutIcon.js +1 -1
  305. package/dist/icons/DownIcon.js +1 -1
  306. package/dist/icons/EditIcon.js +1 -1
  307. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  308. package/dist/icons/ExclamationCircleIcon.js +1 -1
  309. package/dist/icons/ExclamationIcon.js +1 -1
  310. package/dist/icons/EyeIcon.js +1 -1
  311. package/dist/icons/EyeInvisibleIcon.js +1 -1
  312. package/dist/icons/FilterIcon.js +1 -1
  313. package/dist/icons/FolderFilledIcon.js +1 -1
  314. package/dist/icons/FolderIcon.js +1 -1
  315. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  316. package/dist/icons/FolderOpenIcon.js +1 -1
  317. package/dist/icons/ForwardIcon.js +1 -1
  318. package/dist/icons/HierarchyIcon.js +1 -1
  319. package/dist/icons/HierarchyOpenIcon.js +1 -1
  320. package/dist/icons/Icon.js +1 -1
  321. package/dist/icons/InfoCircleIcon.js +1 -1
  322. package/dist/icons/InfoIcon.js +1 -1
  323. package/dist/icons/KeyIcon.js +1 -1
  324. package/dist/icons/LeftIcon.js +1 -1
  325. package/dist/icons/LineChartIcon.js +1 -1
  326. package/dist/icons/LoadingIcon.js +1 -1
  327. package/dist/icons/LockFilledIcon.js +1 -1
  328. package/dist/icons/LockIcon.js +1 -1
  329. package/dist/icons/MoreIcon.js +1 -1
  330. package/dist/icons/NotAllowedIcon.js +1 -1
  331. package/dist/icons/Number123Icon.js +1 -1
  332. package/dist/icons/NumberIcon.js +1 -1
  333. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  334. package/dist/icons/PauseCircleIcon.js +1 -1
  335. package/dist/icons/PauseIcon.js +1 -1
  336. package/dist/icons/PercentageIcon.js +1 -1
  337. package/dist/icons/PieChartIcon.js +1 -1
  338. package/dist/icons/PlayCircleIcon.js +1 -1
  339. package/dist/icons/PlayIcon.js +1 -1
  340. package/dist/icons/PlusIcon.js +1 -1
  341. package/dist/icons/ProgressBarIcon.js +1 -1
  342. package/dist/icons/ReloadIcon.js +1 -1
  343. package/dist/icons/ReportIcon.js +1 -1
  344. package/dist/icons/ReturnIcon.js +1 -1
  345. package/dist/icons/RightIcon.js +1 -1
  346. package/dist/icons/RowTotalsIcon.js +1 -1
  347. package/dist/icons/SchemeIcon.js +1 -1
  348. package/dist/icons/SearchIcon.js +1 -1
  349. package/dist/icons/SemanticQueryIcon.js +1 -1
  350. package/dist/icons/SettingsIcon.js +1 -1
  351. package/dist/icons/ShieldFilledIcon.js +1 -1
  352. package/dist/icons/ShieldIcon.js +1 -1
  353. package/dist/icons/SlashIcon.js +1 -1
  354. package/dist/icons/SparklesIcon.js +1 -1
  355. package/dist/icons/SqlIcon.js +1 -1
  356. package/dist/icons/StatsIcon.js +1 -1
  357. package/dist/icons/StopIcon.js +1 -1
  358. package/dist/icons/StringIcon.js +1 -1
  359. package/dist/icons/SubtotalsIcon.js +1 -1
  360. package/dist/icons/SwitchIcon.js +1 -1
  361. package/dist/icons/TableIcon.js +1 -1
  362. package/dist/icons/ThumbsDownIcon.js +1 -1
  363. package/dist/icons/ThumbsUpIcon.js +1 -1
  364. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  365. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  366. package/dist/icons/ThunderboltIcon.js +1 -1
  367. package/dist/icons/TimeIcon.js +1 -1
  368. package/dist/icons/TrashIcon.js +1 -1
  369. package/dist/icons/UnlockIcon.js +1 -1
  370. package/dist/icons/UpIcon.js +1 -1
  371. package/dist/icons/UserGroupIcon.js +1 -1
  372. package/dist/icons/UserIcon.js +1 -1
  373. package/dist/icons/UserLockIcon.js +1 -1
  374. package/dist/icons/ViewIcon.js +1 -1
  375. package/dist/icons/WarningFilledIcon.js +1 -1
  376. package/dist/icons/WarningIcon.js +1 -1
  377. package/dist/icons/wrap-icon.js +1 -1
  378. package/dist/index.d.ts +4 -1
  379. package/dist/index.js +5 -4
  380. package/dist/index.js.map +1 -1
  381. package/dist/provider.js +1 -1
  382. package/dist/providers/TrackingProvider.js +1 -1
  383. package/dist/providers/navigationAdapter.default.js +1 -1
  384. package/dist/tokens/base.js +1 -1
  385. package/dist/tokens/colors.js +1 -1
  386. package/dist/tokens/index.js +1 -1
  387. package/dist/tokens/layout.js +1 -1
  388. package/dist/tokens/shadows.js +1 -1
  389. package/dist/tokens/sizes.js +1 -1
  390. package/dist/tokens/spacing.js +1 -1
  391. package/dist/tokens/typography.js +1 -1
  392. package/dist/utils/ResizeSensor.js +1 -1
  393. package/dist/utils/is-dev-env.js +1 -1
  394. package/dist/utils/modules.js +1 -1
  395. package/dist/utils/promise.js +1 -1
  396. package/dist/utils/raf.js +1 -1
  397. package/dist/utils/random.js +1 -1
  398. package/dist/utils/range.js +1 -1
  399. package/dist/utils/react/RenderCache.js +1 -1
  400. package/dist/utils/react/Slots.js +1 -1
  401. package/dist/utils/react/chain.js +1 -1
  402. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  403. package/dist/utils/react/index.js +1 -1
  404. package/dist/utils/react/interactions.js +1 -1
  405. package/dist/utils/react/isTextOnly.js +1 -1
  406. package/dist/utils/react/mapProps.js +1 -1
  407. package/dist/utils/react/mergeProps.js +1 -1
  408. package/dist/utils/react/nullableValue.js +1 -1
  409. package/dist/utils/react/resolveIcon.js +1 -1
  410. package/dist/utils/react/sharedStore.js +1 -1
  411. package/dist/utils/react/useCombinedRefs.js +1 -1
  412. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  413. package/dist/utils/react/useEventBus.js +1 -1
  414. package/dist/utils/react/useId.js +1 -1
  415. package/dist/utils/react/useIsDarwin.js +1 -1
  416. package/dist/utils/react/useKeySymbols.js +1 -1
  417. package/dist/utils/react/useLayoutEffect.js +1 -1
  418. package/dist/utils/react/useLocalStorage.js +1 -1
  419. package/dist/utils/react/useMergeStyles.js +1 -1
  420. package/dist/utils/react/useQaProps.js +1 -1
  421. package/dist/utils/react/useViewportSize.js +1 -1
  422. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  423. package/dist/utils/selection.js +1 -1
  424. package/dist/utils/styles.js +1 -1
  425. package/dist/utils/tree.js +1 -1
  426. package/dist/utils/warnings.js +1 -1
  427. package/dist/version.js +2 -2
  428. package/docs/components/content/Tree.md +299 -0
  429. package/docs/components/fields/FilterListBox.md +27 -17
  430. package/docs/components/fields/FilterPicker.md +58 -59
  431. package/docs/tasty/dsl.md +1 -0
  432. 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` / `No results found`) — Label displayed when no items match
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
- ### External Filtering
627
+ ### Server-Side / Dynamic Search
626
628
 
627
- For server-side filtering or complex custom logic, use `filter={false}` with controlled search:
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 [filteredItems, setFilteredItems] = useState(allItems);
634
+ const [isLoadingItems, setIsLoadingItems] = useState(false);
632
635
 
633
- useEffect(() => {
634
- // Your custom filtering logic (e.g., API call, complex algorithm)
635
- const filtered = customFilterLogic(allItems, searchValue);
636
- setFilteredItems(filtered);
637
- }, [searchValue, allItems]);
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={setSearchValue}
647
+ onSearchChange={handleSearchChange}
642
648
  filter={false}
649
+ isLoadingItems={isLoadingItems}
643
650
  >
644
- {filteredItems.map(item => (
651
+ {(item) => (
645
652
  <FilterListBox.Item key={item.id}>{item.name}</FilterListBox.Item>
646
- ))}
653
+ )}
647
654
  </FilterListBox>
648
655
  ```
649
656
 
650
- **When to use:**
651
- - Server-side filtering for large datasets
652
- - Complex custom search algorithms
653
- - Debounced API calls
654
- - Multi-field search logic
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`** `string` Custom label to display when no results are found after filtering
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
- ### External Filtering
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
- #### Approach 1: Disabled Internal Filtering
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
- // Simulate debounced search
757
- const [processedSearch, setProcessedSearch] = useState('');
758
- useEffect(() => {
759
- const timer = setTimeout(() => setProcessedSearch(searchValue), 300);
760
- return () => clearTimeout(timer);
761
- }, [searchValue]);
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
- label="Select Fruits"
772
- placeholder="Choose fruits..."
773
- selectionMode="multiple"
752
+ items={items}
774
753
  searchValue={searchValue}
754
+ onSearchChange={handleSearchChange}
775
755
  filter={false}
776
- items={filteredFruits}
777
- onSearchChange={setSearchValue}
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
- {(fruit) => (
780
- <FilterPicker.Item key={fruit.key}>{fruit.label}</FilterPicker.Item>
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
- **When to use each approach:**
786
- - **`filter={false}`**: Simpler approach when you just need to pre-filter items without controlling the search input itself. Good for server-side filtering or custom filter logic.
787
- - **Controlled Search**: Use when you need full control over the search input (debouncing, external UI sync, clearing from outside, or tracking search analytics).
788
- - **Combine Both**: You can use both together for maximum control - controlled search input with external filtering.
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.127.3",
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.0",
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",