@cube-dev/ui-kit 0.0.0-canary-e76eb3e → 0.0.0-canary-9fab1b3

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 (595) hide show
  1. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  2. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  3. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  4. package/dist/_internal/hooks/use-event.js +1 -1
  5. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  6. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  7. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  8. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  9. package/dist/_internal/hooks/use-warn.js +1 -1
  10. package/dist/components/Block.js +1 -1
  11. package/dist/components/CollectionItem.js +1 -1
  12. package/dist/components/GlobalStyles.js +1 -1
  13. package/dist/components/GridProvider.js +1 -1
  14. package/dist/components/HiddenInput.js +1 -1
  15. package/dist/components/Root.js +1 -1
  16. package/dist/components/actions/Action/Action.js +1 -1
  17. package/dist/components/actions/Banner/Banner.js +1 -1
  18. package/dist/components/actions/Button/Button.js +1 -1
  19. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  20. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  21. package/dist/components/actions/ButtonSplit/context.js +1 -1
  22. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  23. package/dist/components/actions/CommandMenu/styled.js +1 -1
  24. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  25. package/dist/components/actions/ItemActionContext.js +1 -1
  26. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  27. package/dist/components/actions/Link/Link.js +1 -1
  28. package/dist/components/actions/Menu/Menu.js +1 -1
  29. package/dist/components/actions/Menu/MenuItem.js +1 -1
  30. package/dist/components/actions/Menu/MenuSection.js +1 -1
  31. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  32. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  33. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  34. package/dist/components/actions/Menu/context.js +1 -1
  35. package/dist/components/actions/Menu/styled.js +1 -1
  36. package/dist/components/actions/index.js +1 -1
  37. package/dist/components/actions/use-action.js +1 -1
  38. package/dist/components/actions/use-anchored-menu.js +1 -1
  39. package/dist/components/actions/use-context-menu.js +44 -42
  40. package/dist/components/actions/use-context-menu.js.map +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/InfoBadge/InfoBadge.js +1 -1
  56. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  57. package/dist/components/content/Item/Item.js +1 -1
  58. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  59. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  60. package/dist/components/content/Layout/GridLayout.js +1 -1
  61. package/dist/components/content/Layout/Layout.js +1 -1
  62. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  63. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  64. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  65. package/dist/components/content/Layout/LayoutContent.js +1 -1
  66. package/dist/components/content/Layout/LayoutContext.js +1 -1
  67. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  68. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  69. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  70. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  71. package/dist/components/content/Layout/LayoutPane.js +1 -1
  72. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  73. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  74. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  75. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  76. package/dist/components/content/Layout/index.js +1 -1
  77. package/dist/components/content/Layout/utils.js +1 -1
  78. package/dist/components/content/Paragraph.js +1 -1
  79. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  80. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  81. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  82. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  83. package/dist/components/content/Result/Result.js +1 -1
  84. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  85. package/dist/components/content/Tag/Tag.js +2 -2
  86. package/dist/components/content/Tag/Tag.js.map +1 -1
  87. package/dist/components/content/Text.d.ts +14 -14
  88. package/dist/components/content/Text.js +1 -1
  89. package/dist/components/content/TextItem/TextItem.js +1 -1
  90. package/dist/components/content/Title.js +1 -1
  91. package/dist/components/content/Tree/Tree.js +1 -1
  92. package/dist/components/content/Tree/TreeNode.js +1 -1
  93. package/dist/components/content/Tree/styled.js +1 -1
  94. package/dist/components/content/Tree/tree-index.js +1 -1
  95. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  96. package/dist/components/content/Tree/use-load-data.js +1 -1
  97. package/dist/components/content/highlightText.js +1 -1
  98. package/dist/components/content/use-auto-tooltip.js +1 -1
  99. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  100. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  101. package/dist/components/fields/Checkbox/context.js +1 -1
  102. package/dist/components/fields/ColorInput/ColorInput.d.ts +67 -0
  103. package/dist/components/fields/ColorInput/ColorInput.js +230 -0
  104. package/dist/components/fields/ColorInput/ColorInput.js.map +1 -0
  105. package/dist/components/fields/ColorInput/index.d.ts +2 -0
  106. package/dist/components/fields/ColorPicker/ColorPicker.d.ts +34 -37
  107. package/dist/components/fields/ColorPicker/ColorPicker.js +121 -184
  108. package/dist/components/fields/ColorPicker/ColorPicker.js.map +1 -1
  109. package/dist/components/fields/ColorPicker/index.d.ts +1 -3
  110. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.d.ts +50 -0
  111. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +253 -0
  112. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js.map +1 -0
  113. package/dist/components/fields/ColorSwatchGroup/index.d.ts +2 -0
  114. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  115. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  116. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  117. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  118. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  119. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  120. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  121. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  122. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  123. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  124. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  125. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  126. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  127. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  128. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  129. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  130. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  131. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  132. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  133. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  134. package/dist/components/fields/DatePicker/period.js +1 -1
  135. package/dist/components/fields/DatePicker/props.js +1 -1
  136. package/dist/components/fields/DatePicker/utils.js +1 -1
  137. package/dist/components/fields/FileInput/FileInput.js +1 -1
  138. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  139. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  140. package/dist/components/fields/Input/Input.js +2 -2
  141. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  142. package/dist/components/fields/ListBox/ListBox.js +1 -1
  143. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  144. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  145. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  146. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  147. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  148. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  149. package/dist/components/fields/Picker/Picker.js +1 -1
  150. package/dist/components/fields/RadioGroup/Radio.d.ts +2 -2
  151. package/dist/components/fields/RadioGroup/Radio.js +4 -4
  152. package/dist/components/fields/RadioGroup/Radio.js.map +1 -1
  153. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  154. package/dist/components/fields/RadioGroup/context.js +1 -1
  155. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  156. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  157. package/dist/components/fields/Select/Select.js +1 -1
  158. package/dist/components/fields/Slider/Gradation.js +1 -1
  159. package/dist/components/fields/Slider/HueSlider.js +1 -1
  160. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  161. package/dist/components/fields/Slider/Slider.js +1 -1
  162. package/dist/components/fields/Slider/SliderBase.js +1 -1
  163. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  164. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  165. package/dist/components/fields/Slider/elements.js +1 -1
  166. package/dist/components/fields/Slider/index.js +1 -1
  167. package/dist/components/fields/Switch/Switch.js +1 -1
  168. package/dist/components/fields/TextArea/TextArea.js +1 -1
  169. package/dist/components/fields/TextInput/TextInput.js +1 -1
  170. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  171. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  172. package/dist/components/fields/{ColorPicker/ColorPickerPanel.js → color/ColorPanel.js} +14 -11
  173. package/dist/components/fields/color/ColorPanel.js.map +1 -0
  174. package/dist/components/fields/color/ColorSwatch.d.ts +22 -0
  175. package/dist/components/fields/color/ColorSwatch.js +58 -0
  176. package/dist/components/fields/color/ColorSwatch.js.map +1 -0
  177. package/dist/components/fields/{ColorPicker → color}/channels.d.ts +1 -1
  178. package/dist/components/fields/{ColorPicker → color}/channels.js +2 -2
  179. package/dist/components/fields/color/channels.js.map +1 -0
  180. package/dist/components/fields/color/color.d.ts +21 -0
  181. package/dist/components/fields/{ColorPicker → color}/color.js +2 -2
  182. package/dist/components/fields/color/color.js.map +1 -0
  183. package/dist/components/fields/color/context.js +20 -0
  184. package/dist/components/fields/color/context.js.map +1 -0
  185. package/dist/components/fields/color/index.d.ts +4 -0
  186. package/dist/components/fields/index.d.ts +9 -3
  187. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  188. package/dist/components/form/Form/Field.js +1 -1
  189. package/dist/components/form/Form/Form.js +1 -1
  190. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  191. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  192. package/dist/components/form/Form/SubmitError.js +1 -1
  193. package/dist/components/form/Form/index.js +1 -1
  194. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  195. package/dist/components/form/Form/use-field/use-field.js +1 -1
  196. package/dist/components/form/Form/use-form.js +1 -1
  197. package/dist/components/form/Form/validation.js +1 -1
  198. package/dist/components/form/Label.js +1 -1
  199. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  200. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  201. package/dist/components/form/validation/use-validation-props.js +1 -1
  202. package/dist/components/form/wrapper.js +1 -1
  203. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  204. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  205. package/dist/components/layout/Board/Board.js +1 -1
  206. package/dist/components/layout/Board/BoardProvider.js +1 -1
  207. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  208. package/dist/components/layout/Board/Widget.js +1 -1
  209. package/dist/components/layout/Board/WidgetHost.js +1 -1
  210. package/dist/components/layout/Board/board-context.js +1 -1
  211. package/dist/components/layout/Board/board-store.js +1 -1
  212. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  213. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  214. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  215. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  216. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  217. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  218. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  219. package/dist/components/layout/Board/index.js +1 -1
  220. package/dist/components/layout/Board/responsive-utils.js +1 -1
  221. package/dist/components/layout/Board/use-board-layout.js +1 -1
  222. package/dist/components/layout/Board/use-board-registry.js +1 -1
  223. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  224. package/dist/components/layout/Board/use-board-selection.js +1 -1
  225. package/dist/components/layout/Flex.js +1 -1
  226. package/dist/components/layout/Flow.js +1 -1
  227. package/dist/components/layout/Grid.js +1 -1
  228. package/dist/components/layout/Panel.js +1 -1
  229. package/dist/components/layout/Prefix.js +1 -1
  230. package/dist/components/layout/ResizablePanel.js +1 -1
  231. package/dist/components/layout/Space.js +1 -1
  232. package/dist/components/layout/Suffix.js +1 -1
  233. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  234. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  235. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  236. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  237. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  238. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  239. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  240. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  241. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  242. package/dist/components/navigation/Tabs/styled.js +1 -1
  243. package/dist/components/navigation/Tabs/types.js +1 -1
  244. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  245. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  246. package/dist/components/navigation/index.d.ts +1 -5
  247. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  248. package/dist/components/other/Calendar/Calendar.js +1 -1
  249. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  250. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  251. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  252. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  253. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  254. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  255. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  256. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  257. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  258. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  259. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  260. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  261. package/dist/components/overlays/Dialog/context.js +1 -1
  262. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  263. package/dist/components/overlays/Modal/Modal.js +1 -1
  264. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  265. package/dist/components/overlays/Modal/Overlay.js +1 -1
  266. package/dist/components/overlays/Modal/Popover.js +1 -1
  267. package/dist/components/overlays/Modal/Tray.js +1 -1
  268. package/dist/components/overlays/Modal/Underlay.js +1 -1
  269. package/dist/components/overlays/Notifications/Notification.js +1 -1
  270. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  271. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  272. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  273. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  274. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  275. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  276. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  277. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  278. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  279. package/dist/components/overlays/Notifications/index.js +1 -1
  280. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  281. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  282. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  283. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  284. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  285. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  286. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  287. package/dist/components/overlays/Toast/index.js +1 -1
  288. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  289. package/dist/components/overlays/Toast/useToast.js +1 -1
  290. package/dist/components/overlays/Tooltip/Tooltip.js +1 -1
  291. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  292. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  293. package/dist/components/overlays/Tooltip/context.js +1 -1
  294. package/dist/components/portal/Portal.js +1 -1
  295. package/dist/components/portal/PortalProvider.js +1 -1
  296. package/dist/components/portal/usePortal.js +1 -1
  297. package/dist/components/shared/DraggableCollection.js +8 -24
  298. package/dist/components/shared/DraggableCollection.js.map +1 -1
  299. package/dist/components/shared/InvalidIcon.js +1 -1
  300. package/dist/components/shared/ValidIcon.js +1 -1
  301. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  302. package/dist/components/status/Spin/Cube.js +1 -1
  303. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  304. package/dist/components/status/Spin/Spin.js +1 -1
  305. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  306. package/dist/data/item-themes.js +1 -1
  307. package/dist/data/themes.js +1 -1
  308. package/dist/eslint-plugin/defaults.generated.js +1 -199
  309. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  310. package/dist/eslint-plugin/index.js +1 -1
  311. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  312. package/dist/i18n/I18nProvider.js +1 -1
  313. package/dist/i18n/createFormatter.js +1 -1
  314. package/dist/i18n/index.js +1 -1
  315. package/dist/i18n/instance.js +1 -1
  316. package/dist/i18n/locales/de-DE/uikit.js +1 -35
  317. package/dist/i18n/locales/en-US/uikit.js +1 -35
  318. package/dist/i18n/locales/en-US/uikit.json.d.ts +1 -40
  319. package/dist/i18n/locales/es-ES/uikit.js +1 -35
  320. package/dist/i18n/locales/es-MX/uikit.js +1 -35
  321. package/dist/i18n/locales/fr-FR/uikit.js +1 -35
  322. package/dist/i18n/locales/it-IT/uikit.js +1 -35
  323. package/dist/i18n/locales/ja-JP/uikit.js +1 -35
  324. package/dist/i18n/locales/nb-NO/uikit.js +1 -35
  325. package/dist/i18n/locales/pt-BR/uikit.js +1 -35
  326. package/dist/i18n/locales/pt-PT/uikit.js +1 -35
  327. package/dist/i18n/locales/sv-SE/uikit.js +1 -35
  328. package/dist/i18n/locales/vi-VN/uikit.js +1 -35
  329. package/dist/i18n/locales.js +1 -1
  330. package/dist/i18n/useFormatter.js +1 -1
  331. package/dist/i18n/useI18n.js +1 -1
  332. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  333. package/dist/icons/AdjustmentsIcon.js +1 -1
  334. package/dist/icons/AiIcon.js +1 -1
  335. package/dist/icons/AreaChartIcon.js +1 -1
  336. package/dist/icons/BackwardIcon.js +1 -1
  337. package/dist/icons/BarChartIcon.js +1 -1
  338. package/dist/icons/BellFilledIcon.js +1 -1
  339. package/dist/icons/BellIcon.js +1 -1
  340. package/dist/icons/BooleanIcon.js +1 -1
  341. package/dist/icons/CalendarEditIcon.js +1 -1
  342. package/dist/icons/CalendarIcon.js +1 -1
  343. package/dist/icons/CaretDownIcon.js +1 -1
  344. package/dist/icons/CaretUpIcon.js +1 -1
  345. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  346. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  347. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  348. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  349. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  350. package/dist/icons/ChartBarLineIcon.js +1 -1
  351. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  352. package/dist/icons/ChartBarStackedIcon.js +1 -1
  353. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  354. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  355. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  356. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  357. package/dist/icons/ChartBubbleIcon.js +1 -1
  358. package/dist/icons/ChartDonut2Icon.js +1 -1
  359. package/dist/icons/ChartFunnelIcon.js +1 -1
  360. package/dist/icons/ChartHeatmapIcon.js +1 -1
  361. package/dist/icons/ChartKPIIcon.js +1 -1
  362. package/dist/icons/ChartPie2Icon.js +1 -1
  363. package/dist/icons/ChartScatterIcon.js +1 -1
  364. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  365. package/dist/icons/CheckCircleIcon.js +1 -1
  366. package/dist/icons/CheckIcon.js +1 -1
  367. package/dist/icons/CircleFilledIcon.js +1 -1
  368. package/dist/icons/ClearIcon.js +1 -1
  369. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  370. package/dist/icons/CloseCircleIcon.js +1 -1
  371. package/dist/icons/CloseIcon.js +1 -1
  372. package/dist/icons/CodeIcon.js +1 -1
  373. package/dist/icons/ColumnTotalIcon.js +1 -1
  374. package/dist/icons/CopyIcon.js +1 -1
  375. package/dist/icons/CountIcon.js +1 -1
  376. package/dist/icons/CubeIcon.js +1 -1
  377. package/dist/icons/CubePauseIcon.js +1 -1
  378. package/dist/icons/CubePlayIcon.js +1 -1
  379. package/dist/icons/CurrencyDollarIcon.js +1 -1
  380. package/dist/icons/DangerIcon.js +1 -1
  381. package/dist/icons/DashboardIcon.js +1 -1
  382. package/dist/icons/DatabaseIcon.js +1 -1
  383. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  384. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  385. package/dist/icons/DirectionIcon.js +1 -1
  386. package/dist/icons/DonutIcon.js +1 -1
  387. package/dist/icons/DownIcon.js +1 -1
  388. package/dist/icons/EditIcon.js +1 -1
  389. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  390. package/dist/icons/ExclamationCircleIcon.js +1 -1
  391. package/dist/icons/ExclamationIcon.js +1 -1
  392. package/dist/icons/EyeIcon.js +1 -1
  393. package/dist/icons/EyeInvisibleIcon.js +1 -1
  394. package/dist/icons/FilterIcon.js +1 -1
  395. package/dist/icons/FolderFilledIcon.js +1 -1
  396. package/dist/icons/FolderIcon.js +1 -1
  397. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  398. package/dist/icons/FolderOpenIcon.js +1 -1
  399. package/dist/icons/ForwardIcon.js +1 -1
  400. package/dist/icons/GripVerticalIcon.js +1 -1
  401. package/dist/icons/HierarchyIcon.js +1 -1
  402. package/dist/icons/HierarchyOpenIcon.js +1 -1
  403. package/dist/icons/Icon.js +1 -1
  404. package/dist/icons/InfoCircleIcon.js +1 -1
  405. package/dist/icons/InfoIcon.js +1 -1
  406. package/dist/icons/KeyIcon.js +1 -1
  407. package/dist/icons/LeftIcon.js +1 -1
  408. package/dist/icons/LineChartIcon.js +1 -1
  409. package/dist/icons/LoadingIcon.js +1 -1
  410. package/dist/icons/LockFilledIcon.js +1 -1
  411. package/dist/icons/LockIcon.js +1 -1
  412. package/dist/icons/MoreIcon.js +1 -1
  413. package/dist/icons/NotAllowedIcon.js +1 -1
  414. package/dist/icons/Number123Icon.js +1 -1
  415. package/dist/icons/NumberIcon.js +1 -1
  416. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  417. package/dist/icons/PauseCircleIcon.js +1 -1
  418. package/dist/icons/PauseIcon.js +1 -1
  419. package/dist/icons/PercentageIcon.js +1 -1
  420. package/dist/icons/PieChartIcon.js +1 -1
  421. package/dist/icons/PipetteIcon.js +1 -1
  422. package/dist/icons/PlayCircleIcon.js +1 -1
  423. package/dist/icons/PlayIcon.js +1 -1
  424. package/dist/icons/PlusIcon.js +1 -1
  425. package/dist/icons/ProgressBarIcon.js +1 -1
  426. package/dist/icons/ReloadIcon.js +1 -1
  427. package/dist/icons/ReportIcon.js +1 -1
  428. package/dist/icons/ReturnIcon.js +1 -1
  429. package/dist/icons/RightIcon.js +1 -1
  430. package/dist/icons/RowTotalsIcon.js +1 -1
  431. package/dist/icons/SchemeIcon.js +1 -1
  432. package/dist/icons/SearchIcon.js +1 -1
  433. package/dist/icons/SemanticQueryIcon.js +1 -1
  434. package/dist/icons/SettingsIcon.js +1 -1
  435. package/dist/icons/ShieldFilledIcon.js +1 -1
  436. package/dist/icons/ShieldIcon.js +1 -1
  437. package/dist/icons/SlashIcon.js +1 -1
  438. package/dist/icons/SparklesIcon.js +1 -1
  439. package/dist/icons/SqlIcon.js +1 -1
  440. package/dist/icons/StatsIcon.js +1 -1
  441. package/dist/icons/StopIcon.js +1 -1
  442. package/dist/icons/StringIcon.js +1 -1
  443. package/dist/icons/SubtotalsIcon.js +1 -1
  444. package/dist/icons/SwitchIcon.js +1 -1
  445. package/dist/icons/TableIcon.js +1 -1
  446. package/dist/icons/ThumbsDownIcon.js +1 -1
  447. package/dist/icons/ThumbsUpIcon.js +1 -1
  448. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  449. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  450. package/dist/icons/ThunderboltIcon.js +1 -1
  451. package/dist/icons/TimeIcon.js +1 -1
  452. package/dist/icons/TrashIcon.js +1 -1
  453. package/dist/icons/UnlockIcon.js +1 -1
  454. package/dist/icons/UpIcon.js +1 -1
  455. package/dist/icons/UserGroupIcon.js +1 -1
  456. package/dist/icons/UserIcon.js +1 -1
  457. package/dist/icons/UserLockIcon.js +1 -1
  458. package/dist/icons/ViewIcon.js +1 -1
  459. package/dist/icons/WarningFilledIcon.js +1 -1
  460. package/dist/icons/WarningIcon.js +1 -1
  461. package/dist/icons/wrap-icon.js +1 -1
  462. package/dist/index.d.ts +15 -22
  463. package/dist/index.js +9 -10
  464. package/dist/index.js.map +1 -1
  465. package/dist/provider.js +1 -1
  466. package/dist/providers/TrackingProvider.js +1 -1
  467. package/dist/providers/navigationAdapter.default.js +1 -1
  468. package/dist/tokens/base.js +1 -1
  469. package/dist/tokens/colors.js +1 -1
  470. package/dist/tokens/index.js +1 -1
  471. package/dist/tokens/layout.js +1 -1
  472. package/dist/tokens/lazy-styles.js +1 -1
  473. package/dist/tokens/palette-config.js +1 -1
  474. package/dist/tokens/palette.js +1 -1
  475. package/dist/tokens/shadows.js +1 -1
  476. package/dist/tokens/sizes.js +1 -1
  477. package/dist/tokens/spacing.js +1 -1
  478. package/dist/tokens/typography.d.ts +1 -1
  479. package/dist/tokens/typography.js +2 -11
  480. package/dist/tokens/typography.js.map +1 -1
  481. package/dist/utils/ResizeSensor.js +1 -1
  482. package/dist/utils/is-dev-env.js +1 -1
  483. package/dist/utils/modules.js +1 -1
  484. package/dist/utils/promise.js +1 -1
  485. package/dist/utils/raf.js +1 -1
  486. package/dist/utils/random.js +1 -1
  487. package/dist/utils/range.js +1 -1
  488. package/dist/utils/react/RenderCache.js +1 -1
  489. package/dist/utils/react/Slots.js +1 -1
  490. package/dist/utils/react/chain.js +1 -1
  491. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  492. package/dist/utils/react/index.js +1 -1
  493. package/dist/utils/react/interactions.js +1 -1
  494. package/dist/utils/react/isTextOnly.js +1 -1
  495. package/dist/utils/react/mapProps.js +1 -1
  496. package/dist/utils/react/mergeProps.js +1 -1
  497. package/dist/utils/react/nullableValue.js +1 -1
  498. package/dist/utils/react/resolveIcon.js +1 -1
  499. package/dist/utils/react/sharedStore.js +1 -1
  500. package/dist/utils/react/useCombinedRefs.js +1 -1
  501. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  502. package/dist/utils/react/useEventBus.js +1 -1
  503. package/dist/utils/react/useId.js +1 -1
  504. package/dist/utils/react/useIsDarwin.js +1 -1
  505. package/dist/utils/react/useKeySymbols.js +1 -1
  506. package/dist/utils/react/useLayoutEffect.js +1 -1
  507. package/dist/utils/react/useLocalStorage.js +1 -1
  508. package/dist/utils/react/useMergeStyles.js +1 -1
  509. package/dist/utils/react/usePopoverSync.js +1 -1
  510. package/dist/utils/react/useQaProps.js +1 -1
  511. package/dist/utils/react/useViewportSize.js +1 -1
  512. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  513. package/dist/utils/selection.js +1 -1
  514. package/dist/utils/styles.js +1 -1
  515. package/dist/utils/tree.js +1 -1
  516. package/dist/utils/warnings.js +1 -1
  517. package/dist/version.js +2 -2
  518. package/docs/components/fields/ColorInput.md +272 -0
  519. package/docs/components/fields/ColorPicker.md +80 -146
  520. package/docs/components/fields/ColorSwatchGroup.md +206 -0
  521. package/package.json +3 -8
  522. package/dist/components/data/DataTable/DataTable.d.ts +0 -13
  523. package/dist/components/data/DataTable/DataTable.js +0 -242
  524. package/dist/components/data/DataTable/DataTable.js.map +0 -1
  525. package/dist/components/data/DataTable/index.d.ts +0 -3
  526. package/dist/components/data/DataTable/types.d.ts +0 -140
  527. package/dist/components/data/ItemTable/ItemTable.d.ts +0 -19
  528. package/dist/components/data/ItemTable/ItemTable.js +0 -347
  529. package/dist/components/data/ItemTable/ItemTable.js.map +0 -1
  530. package/dist/components/data/ItemTable/ItemTableBulkBar.d.ts +0 -23
  531. package/dist/components/data/ItemTable/ItemTableBulkBar.js +0 -131
  532. package/dist/components/data/ItemTable/ItemTableBulkBar.js.map +0 -1
  533. package/dist/components/data/ItemTable/ItemTableDragPreview.js +0 -46
  534. package/dist/components/data/ItemTable/ItemTableDragPreview.js.map +0 -1
  535. package/dist/components/data/ItemTable/ItemTableFooter.js +0 -79
  536. package/dist/components/data/ItemTable/ItemTableFooter.js.map +0 -1
  537. package/dist/components/data/ItemTable/ItemTableToolbar.d.ts +0 -34
  538. package/dist/components/data/ItemTable/ItemTableToolbar.js +0 -91
  539. package/dist/components/data/ItemTable/ItemTableToolbar.js.map +0 -1
  540. package/dist/components/data/ItemTable/index.d.ts +0 -4
  541. package/dist/components/data/ItemTable/types.d.ts +0 -322
  542. package/dist/components/data/TableBase/ColumnResizer.js +0 -70
  543. package/dist/components/data/TableBase/ColumnResizer.js.map +0 -1
  544. package/dist/components/data/TableBase/RowCollection.js +0 -99
  545. package/dist/components/data/TableBase/RowCollection.js.map +0 -1
  546. package/dist/components/data/TableBase/TableRow.js +0 -89
  547. package/dist/components/data/TableBase/TableRow.js.map +0 -1
  548. package/dist/components/data/TableBase/TableView.d.ts +0 -22
  549. package/dist/components/data/TableBase/TableView.js +0 -857
  550. package/dist/components/data/TableBase/TableView.js.map +0 -1
  551. package/dist/components/data/TableBase/index.d.ts +0 -5
  552. package/dist/components/data/TableBase/row-menu.js +0 -40
  553. package/dist/components/data/TableBase/row-menu.js.map +0 -1
  554. package/dist/components/data/TableBase/styled.d.ts +0 -5
  555. package/dist/components/data/TableBase/styled.js +0 -504
  556. package/dist/components/data/TableBase/styled.js.map +0 -1
  557. package/dist/components/data/TableBase/types.d.ts +0 -161
  558. package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -3
  559. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  560. package/dist/components/data/TableBase/use-cell-selection.js.map +0 -1
  561. package/dist/components/data/TableBase/use-container-width.js +0 -35
  562. package/dist/components/data/TableBase/use-container-width.js.map +0 -1
  563. package/dist/components/data/TableBase/use-scrollability.js +0 -49
  564. package/dist/components/data/TableBase/use-scrollability.js.map +0 -1
  565. package/dist/components/data/TableBase/use-table-columns.d.ts +0 -2
  566. package/dist/components/data/TableBase/use-table-columns.js +0 -166
  567. package/dist/components/data/TableBase/use-table-columns.js.map +0 -1
  568. package/dist/components/data/TableBase/use-table-search.js +0 -50
  569. package/dist/components/data/TableBase/use-table-search.js.map +0 -1
  570. package/dist/components/data/TableBase/use-table-selection.d.ts +0 -4
  571. package/dist/components/data/TableBase/use-table-selection.js +0 -233
  572. package/dist/components/data/TableBase/use-table-selection.js.map +0 -1
  573. package/dist/components/data/TableBase/use-table-sort.js +0 -91
  574. package/dist/components/data/TableBase/use-table-sort.js.map +0 -1
  575. package/dist/components/data/TableBase/use-table-sorts.js +0 -97
  576. package/dist/components/data/TableBase/use-table-sorts.js.map +0 -1
  577. package/dist/components/data/TableBase/use-table-storage.d.ts +0 -8
  578. package/dist/components/data/TableBase/use-table-storage.js +0 -58
  579. package/dist/components/data/TableBase/use-table-storage.js.map +0 -1
  580. package/dist/components/data/index.d.ts +0 -10
  581. package/dist/components/fields/ColorPicker/ColorPickerPanel.js.map +0 -1
  582. package/dist/components/fields/ColorPicker/channels.js.map +0 -1
  583. package/dist/components/fields/ColorPicker/color.d.ts +0 -15
  584. package/dist/components/fields/ColorPicker/color.js.map +0 -1
  585. package/dist/components/navigation/Pagination/Pagination.d.ts +0 -9
  586. package/dist/components/navigation/Pagination/Pagination.js +0 -258
  587. package/dist/components/navigation/Pagination/Pagination.js.map +0 -1
  588. package/dist/components/navigation/Pagination/index.d.ts +0 -4
  589. package/dist/components/navigation/Pagination/types.d.ts +0 -81
  590. package/dist/components/navigation/Pagination/use-pagination.d.ts +0 -52
  591. package/dist/components/navigation/Pagination/use-pagination.js +0 -83
  592. package/dist/components/navigation/Pagination/use-pagination.js.map +0 -1
  593. package/docs/components/data/DataTable.md +0 -286
  594. package/docs/components/data/ItemTable.md +0 -970
  595. package/docs/components/navigation/Pagination.md +0 -245
@@ -1,970 +0,0 @@
1
- # ItemTable
2
-
3
- ItemTable renders a list of records as a table: one row per entity, columns
4
- declared as data rather than JSX. It is the general-purpose table for list and
5
- admin pages.
6
-
7
- It renders a real `<table>` with `role="grid"`, and is styled entirely through
8
- tasty sub-elements — `Row`, `Cell`, `HeaderCell` and friends are reachable from
9
- the single `styles` prop.
10
-
11
- > `ItemTable` and `DataTable` are siblings over one internal engine. `ItemTable`
12
- > is for records; `DataTable` is for analytics results (pivoted columns, pinned
13
- > totals, cell-range selection).
14
-
15
- ## When to Use
16
-
17
- - Listing entities the user acts on: deployments, users, API keys, roles.
18
- - Any table where a row is a *thing* — it can be opened, selected, or given a
19
- menu.
20
- - Tables that need a column header richer than a label: icon, description,
21
- tooltip, actions.
22
-
23
- Use `DataTable` instead when a *cell* is the unit of interest — query results,
24
- pivots, totals. Use `ListBox` when there is only one column.
25
-
26
- ## Component
27
-
28
- ### Properties
29
-
30
- - **`data`** `readonly T[]` — The rows to render.
31
- - **`columns`** `CubeItemTableColumn<T>[]` — Column definitions. See below.
32
- - **`rowKey`** `string` (default: `'id'`) — Property used as the row key.
33
- - **`getRowKey`** `(row: T, index: number) => Key` — Wins over `rowKey`.
34
- - **`isLoading`** `boolean` (default: `false`) — Marks a fetch in flight. What
35
- the user sees depends on `loadingIndicator`.
36
- - **`loadingIndicator`** `'overlay' | 'skeleton' | 'none'` (default: `'overlay'`)
37
- — What to show while `isLoading` is true over rows the table already has.
38
- `overlay` keeps them, dimmed, behind a spinner; `skeleton` replaces them with
39
- placeholders; `none` paints nothing beyond `aria-busy`. With no rows yet,
40
- `overlay` and `skeleton` both fall back to skeleton rows.
41
- - **`skeletonRowCount`** `number` (default: `6`) — Skeleton rows to show while
42
- loading.
43
- - **`emptyLabel`** `ReactNode` — Shown when there is nothing at all. Defaults to
44
- a localized "No items".
45
- - **`noResultsLabel`** `ReactNode` — Shown instead of `emptyLabel` when
46
- `isFiltered` is set. Defaults to a localized "No results found".
47
- - **`isFiltered`** `boolean` — Marks the emptiness as the result of a filter, so
48
- `noResultsLabel` is shown instead of `emptyLabel`. The built-in search sets it
49
- on its own; pass it explicitly when you filter `data` yourself.
50
- - **`error`** `ReactNode` — Takes precedence over both labels.
51
- - **`shape`** `'plain' | 'card'` (default: `'plain'`) — `card` adds a border and
52
- a card radius.
53
- - **`size`** `'xsmall' | 'small' | 'medium' | 'large' | 'xlarge'` (default:
54
- `'medium'`) — Drives both heights. At `medium` a row is 40px and the header
55
- 32px, each plus its 1px separator.
56
- - **`rowHeight`** `number` — Row height in px, overriding the one `size`
57
- implies. Excludes the 1px separator.
58
- - **`headerHeight`** `number` — Header height in px, excluding its 1px border.
59
- - **`headerPreset`** `string` (default: `'c3'`) — Typography preset for the
60
- column header. `c3` is the small uppercase caption the Cloud list tables use;
61
- pass `'t3m'` for body-sized headers.
62
- - **`isStriped`** `boolean` (default: `false`) — Alternating row background.
63
- - **`isHeaderHidden`** `boolean` (default: `false`) — Hides the column header
64
- row and drops it from `aria-rowcount`.
65
- - **`isHeaderSticky`** `boolean` (default: `true`) — Pins the column header
66
- while the body scrolls.
67
- - **`sortMode`** `'client' | 'server' | 'off'` (default: `'client'` when any
68
- column is sortable, else `'off'`) — `client` reorders `data` itself; `server`
69
- only reflects `sort` and fires `onSortChange`; `off` removes the affordance.
70
- - **`sort`** `CubeTableSort | null` — Controlled sort, `{ columnKey, direction }`
71
- with `direction` being `'asc' | 'desc'`.
72
- - **`defaultSort`** `CubeTableSort | null` — Initial sort for uncontrolled usage.
73
- - **`onSortChange`** `(sort: CubeTableSort | null) => void` — Fires on every step
74
- of the cycle, including the return to unsorted.
75
- - **`toolbar`** `ReactNode` — Replaces the entire toolbar row. Compose it from
76
- `ItemTable.Search` / `ItemTable.Toolbar`, which read the table's state from
77
- context.
78
- - **`isSearchable`** `boolean` (default: `false`) — Render the built-in search
79
- input in the toolbar.
80
- - **`searchMode`** `'client' | 'server'` (default: `'client'`) — `client`
81
- filters `data` with the built-in matcher; `server` only reports the term.
82
- - **`searchPlaceholder`** `string` — Placeholder for the search input.
83
- - **`searchValue`** `string` — Controlled term. Works with
84
- `isSearchable={false}` too, so a page can render its own input anywhere and
85
- still drive the table's matcher.
86
- - **`defaultSearchValue`** `string` — Initial term for uncontrolled usage.
87
- - **`onSearchChange`** `(value: string) => void` — Debounced.
88
- - **`searchDelay`** `number` (default: `500`) — Debounces the filter **and** the
89
- callback, in both modes. The input itself stays immediate.
90
- - **`searchFilter`** `(row: T, query: string) => boolean` — Replaces the default
91
- client matcher.
92
- - **`filters`** `ReactNode` — Left group, after the search input.
93
- - **`actions`** `ReactNode` — Right group. Arbitrary JSX.
94
- - **`onRefresh`** `() => void` — Renders a refresh button at the end of the
95
- toolbar.
96
- - **`isVirtualized`** `boolean | 'auto'` (default: `'auto'`) — `'auto'` turns
97
- virtualization on once the row count passes `virtualizeThreshold`. It needs a
98
- bounded height to have a viewport to work against.
99
- - **`virtualizeThreshold`** `number` (default: `50`) — Row count above which
100
- `'auto'` virtualizes.
101
- - **`overscan`** `number` (default: `12`) — Rows mounted beyond each viewport
102
- edge while virtualized. Higher than a list's, because a fast flick outruns
103
- React's re-render and the gap shows as blank rows.
104
- - **`selectionMode`** `'none' | 'single' | 'multiple'` (default: `'none'`) —
105
- `multiple` adds the checkbox column and a select-all header checkbox;
106
- `single` adds the column without the header checkbox.
107
- - **`selectedKeys`** `Key[] | 'all'` — Controlled selection. `'all'` is a
108
- sentinel meaning "everything, including rows the client has not loaded".
109
- - **`defaultSelectedKeys`** `Key[] | 'all'` — Initial selection.
110
- - **`onSelectionChange`** `(keys: Key[] | 'all', rows: T[]) => void` — `rows`
111
- holds only the rows the client has loaded.
112
- - **`selectAllMode`** `'page' | 'filtered' | 'all'` (default: `'page'`) — What
113
- the header checkbox acts on.
114
- - **`isRowSelectable`** `(row: T) => boolean` — The row stays focusable and
115
- clickable; only its checkbox goes inert.
116
- - **`selectionTooltip`** `string | ((row: T) => string | undefined)` — Explains
117
- an inert checkbox.
118
- - **`disabledKeys`** `Key[]` — Rows that cannot be interacted with at all.
119
- - **`rowLink`** `(row: T, index: number) => NavigateArg | undefined` — Turns the
120
- row-header cell into a stretched link covering the whole row. Return
121
- `undefined` for a row that should not navigate.
122
- - **`onRowAction`** `(row: T, key: Key) => void` — Non-navigational activation:
123
- Enter, or a click that did not land on a control inside a cell.
124
- - **`rowMenu`** `ReactNode | ((row, ctx) => ReactNode | null)` — `Menu.Item`
125
- children. Inert until `rowContextMenu` exposes it.
126
- - **`rowContextMenu`** `boolean | 'context-only'` (default: `false`) — `true`
127
- gives a `⋮` trigger column **and** right-click / Shift+F10;
128
- `'context-only'` gives the keyboard and pointer paths without the column.
129
- - **`onRowMenuAction`** `(action: string, row: T, key: Key) => void` — The
130
- action key as written on `Menu.Item`.
131
- - **`rowMenuTriggerProps`** `Partial<CubeItemActionProps>` — Forwarded to every
132
- `⋮` trigger.
133
- - **`bulkActions`** `CubeTableBulkAction<T>[]` — Actions offered while rows are
134
- selected. Supplying any implies `selectionMode="multiple"`.
135
- - **`bulkBarPlacement`** `'floating' | 'toolbar'` (default: `'floating'`) —
136
- `floating` centres the bar over the body without changing the table's height;
137
- `toolbar` replaces the `actions` group while a selection exists.
138
- - **`bulkBarStyles`** `Styles` — Styles for the bar.
139
- - **`paginationMode`** `'client' | 'server' | 'off'` (default: `'client'`) —
140
- `client` slices the searched and sorted rows; `server` never slices and only
141
- reflects `page` / `total`; `off` removes the control.
142
- - **`pageSize`** `number` — Controlled page size.
143
- - **`defaultPageSize`** `number` (default: `50`) — Initial page size.
144
- - **`onPageSizeChange`** `(pageSize: number) => void` — Fires with the new size.
145
- Changing the size returns to page 1.
146
- - **`pageSizeOptions`** `number[]` (default: `[10, 20, 50, 100, 500]`) — Choices
147
- in the page-size selector.
148
- - **`page`** `number` — Controlled 1-based page.
149
- - **`defaultPage`** `number` (default: `1`) — Initial page.
150
- - **`onPageChange`** `(page: number) => void` — Fires with the clamped page.
151
- - **`onLoadMore`** `() => void` — `paginationMode="infinite"` only. Fires once
152
- the end of the list comes into view.
153
- - **`hasMore`** `boolean` — Whether there is anything left to fetch.
154
- - **`isLoadingMore`** `boolean` — Suppresses further calls while a batch is in
155
- flight and shows a loading row.
156
- - **`loadMoreMargin`** `number` (default: `200`) — How far before the end to
157
- prefetch, in px.
158
- - **`autoHidePagination`** `boolean` (default: `true`) — Hides the pagination
159
- control when it cannot do anything: a single page whose total even the
160
- smallest `pageSizeOptions` entry would not split. The footer still renders if
161
- any slot has content.
162
- - **`total`** `number` — Server mode: total row count behind the query.
163
- - **`totalPages`** `number` — Server mode alternative to `total` when the count
164
- is unknown.
165
- - **`hasNextPage`** `boolean` — Server mode: keeps "next" enabled when neither
166
- `total` nor `totalPages` is known.
167
- - **`summary`** `boolean | ((info: CubeTablePageInfo) => ReactNode)` (default:
168
- `true`) — The localized item range in the footer, e.g. "1–50 of 1,204".
169
- - **`footer`** `ReactNode` — Replaces the entire footer row.
170
- - **`footerStart`** `ReactNode` — Start footer slot. Renders even with
171
- `paginationMode="off"` — this is where a "Load all results" button belongs.
172
- - **`footerCenter`** `ReactNode` — Center footer slot.
173
- - **`footerEnd`** `ReactNode` — End footer slot, before the pagination control.
174
- - **`footerStyles`** `Styles` — Styles for the footer row.
175
- - **`isReorderable`** `boolean` (default: `false`) — Lets rows be dragged into a
176
- new order.
177
- - **`onReorder`** `(keys: Key[], rows: T[]) => void` — The **whole** new order,
178
- not just the moved row, so it can be persisted directly.
179
- - **`dropOnRow`** `{ isTarget, isAllowed?, onDrop }` — Dropping rows *onto* a
180
- row, e.g. a workbook into a folder. Enables dragging on its own, and composes
181
- with `isReorderable`.
182
- - **`getItemDragInfo`** `(row: T) => { label, icon? }` — What the cursor drags.
183
- One row shows its icon and label; several show a count. Without it the browser
184
- drags a screenshot of the row.
185
- - **`isResizable`** `boolean` (default: `false`) — Adds a resize handle to every
186
- column; a column overrides with its own `isResizable`.
187
- - **`columnWidths`** `Record<string, number>` — Controlled widths by column key.
188
- - **`defaultColumnWidths`** `Record<string, number>` — Initial widths.
189
- - **`onColumnResize`** `(columnKey, width, all) => void` — Fires once the
190
- gesture ends, not on every pixel.
191
- - **`storageKey`** `string` — Persists the table's own state under
192
- `cube-ui-kit:table:${storageKey}`. Controlled state is never stored — a
193
- controlled `pageSize` or `sort` belongs to the page, and restoring it would
194
- give the table a second, competing source of truth.
195
- - **`persist`** `('pageSize' | 'columnWidths' | 'sort')[]` (default:
196
- `['pageSize', 'columnWidths']`) — What `storageKey` covers. Sort is opt-in,
197
- because a stored sort silently changes what the first screen of a table means.
198
- - **`getRowProps`** `(ctx) => { isDimmed?, mods?, styles?, height?, qa?, tooltip? }`
199
- — Per-row visuals.
200
- - **`ariaLabel`** `string` — Labels the grid.
201
-
202
- #### `CubeItemTableColumn<T>`
203
-
204
- ```ts
205
- interface CubeItemTableColumn<T> {
206
- key: string; // column id; also the data path — dots walk objects
207
- title?: ReactNode; // header label
208
- header?: CubeTableColumnHeader;
209
- isRowHeader?: boolean; // renders <th scope="row"> and names the row
210
-
211
- width?: number; // fixed px; mutually exclusive with `flex`
212
- flex?: number; // weight for the leftover space (default 1)
213
- minWidth?: number; // default 150
214
- maxWidth?: number;
215
- pin?: 'start' | 'end'; // sticky to an edge during horizontal scroll
216
- isHidden?: boolean;
217
-
218
- getValue?: (row, i) => unknown; // when `key` is not the data path
219
- format?: (value, row, i) => string; // raw value → display text
220
- compare?: (a, b, rowA, rowB) => number; // client-side comparator
221
-
222
- render?: (value, row, i, ctx) => ReactNode;
223
- cellStyles?: Styles | ((ctx) => Styles | undefined);
224
- cellProps?: (ctx) => Record<string, any> | undefined;
225
-
226
- align?: 'start' | 'center' | 'end';
227
- isSortable?: boolean;
228
- isSearchable?: boolean; // include in the built-in search (default true)
229
- isCopyable?: boolean; // include in TSV copy (default true)
230
- autoHeight?: boolean; // wrap text and let the row grow
231
- meta?: Record<string, unknown>;
232
- }
233
- ```
234
-
235
- **The value pipeline is the escape hatch.** `getValue`, `format` and `compare`
236
- exist so a column whose displayed text differs from its raw value stays
237
- sortable, searchable and copyable. `render` is for appearance only — sorting and
238
- searching never see its output, which is why an object-valued column with no
239
- `format` renders empty rather than `"[object Object]"`.
240
-
241
- #### `CubeTableColumnHeader`
242
-
243
- Every slot maps 1:1 onto the `Item` rendered inside the header cell, so a header
244
- gets an icon, a description, a tooltip and actions for free:
245
-
246
- ```jsx
247
- {
248
- key: 'owner',
249
- title: 'Owner',
250
- header: {
251
- icon: <UserIcon />,
252
- description: 'Who created it',
253
- descriptionPlacement: 'block',
254
- tooltip: true, // auto tooltip when the label truncates
255
- actions: <ItemAction icon={<MoreIcon />} />,
256
- },
257
- }
258
- ```
259
-
260
- `header.render(ctx)` takes over the cell's content entirely.
261
-
262
- On a sortable column the sort arrow occupies the `rightIcon` slot — it is an
263
- icon, and that slot is sized and aligned for one. The slot stays reserved while
264
- unsorted, so toggling a sort never shifts the label. If you set
265
- `header.rightIcon` yourself it keeps the slot and the arrow falls back to
266
- `suffix`.
267
-
268
- ### Base Properties
269
-
270
- Supports Base Properties.
271
-
272
- ### Styling Properties
273
-
274
- #### styles
275
-
276
- Customizes the root frame. Every internal part of the table is a **sub-element**
277
- reachable from this one prop — that is the whole styling contract.
278
-
279
- **Sub-elements:**
280
-
281
- - `Scroller` — the single scroll container (both axes)
282
- - `Table` — the `<table>`
283
- - `Head`, `HeadRow`, `HeaderCell` — the column header
284
- - `Body`, `Row`, `Cell` — the data rows
285
- - `SortIndicator` — the sort arrow, inside the header `Item`'s suffix
286
- - `Foot`, `FootRow`, `FootCell` — pinned totals
287
- - `StateContent` — the empty / no-results / error content
288
-
289
- ```jsx
290
- const Compact = tasty(ItemTable, {
291
- styles: {
292
- Cell: { padding: '1x' },
293
- Row: { height: 'min 6x' },
294
- },
295
- });
296
- ```
297
-
298
- Rows publish their paint as inherited custom properties — `#row-base`,
299
- `#row-overlay`, `#row-text` and `$dim` — which cells consume. That is what lets
300
- a pinned (and therefore opaque) cell match its row's state without duplicating
301
- the state matrix.
302
-
303
- Geometry runs through tokens too: `$row-height`, `$header-height`,
304
- `$cell-padding-x` (16px) and `$cell-padding-y`. Height lives on the **cells**,
305
- not the `<tr>` — table layout ignores `min-height` on a row and sizes it from
306
- its cells instead.
307
-
308
- #### toolbarStyles
309
-
310
- The toolbar row. Sub-elements: `Start` (search + filters) and `End` (actions +
311
- refresh).
312
-
313
- #### searchStyles
314
-
315
- The built-in search input.
316
-
317
- #### headerStyles
318
-
319
- The **column header row**. (The top chrome, when it arrives, is `toolbarStyles`
320
- — a table has two things called "header" and this one is the columns.)
321
-
322
- #### headerCellStyles
323
-
324
- Every column header cell. Wins over `headerPreset`, so this is where you go for
325
- anything the preset does not cover.
326
-
327
- #### bodyStyles
328
-
329
- The `<tbody>`.
330
-
331
- #### rowStyles
332
-
333
- Every body row.
334
-
335
- #### cellStyles
336
-
337
- Every body cell.
338
-
339
- ### Style Properties
340
-
341
- These properties allow direct style application without using the `styles` prop:
342
-
343
- - **Base:** `display`, `font`, `preset`, `hide`, `opacity`, `whiteSpace`, `transition`
344
- - **Position:** `gridArea`, `order`, `gridColumn`, `gridRow`, `place`, `placeSelf`, `alignSelf`, `justifySelf`, `zIndex`, `margin`, `inset`, `position`, `scrollMargin`
345
- - **Dimension:** `width`, `height`, `flexBasis`, `flexGrow`, `flexShrink`, `flex`
346
- - **Block:** `padding`, `paddingInline`, `paddingBlock`, `border`, `radius`, `shadow`, `overflow`, `outline`, `scrollbar`, `textAlign`
347
- - **Color:** `color`, `fill`, `fade`, `image`
348
- - **Flow:** `flow`, `gap`, `columnGap`, `rowGap`, `placeItems`, `placeContent`, `alignItems`, `alignContent`, `justifyItems`, `justifyContent`, `align`, `justify`, `gridColumns`, `gridRows`, `gridTemplate`, `gridAreas`
349
-
350
- `height` is the important one: there is no page-scroll mode, so
351
- bounding the table is what turns the body into a scroller and pins the header.
352
- An unbounded table simply sizes to its content.
353
-
354
- ### Modifiers
355
-
356
- | Modifier | Type | Description |
357
- | -------- | ---- | ----------- |
358
- | `size` | `SizeName` | Row height scale |
359
- | `shape` | `'plain' \| 'card'` | Frame treatment |
360
- | `sticky-header` | `boolean` | Header is pinned |
361
-
362
- Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`,
363
- `disabled`, `drop-target`, `placeholder`. Cell-level: `pin`, `pin-edge`,
364
- `align`, `wrap`, `state`.
365
-
366
- ## Examples
367
-
368
- ### Basic Usage
369
-
370
- ```jsx
371
- <ItemTable
372
- data={deployments}
373
- columns={[
374
- { key: 'name', title: 'Name', isRowHeader: true, flex: 2 },
375
- { key: 'status', title: 'Status', width: 140 },
376
- { key: 'owner.name', title: 'Owner' },
377
- { key: 'queries', title: 'Queries', width: 140, align: 'end',
378
- format: (v) => v.toLocaleString() },
379
- ]}
380
- ariaLabel="Deployments"
381
- />
382
- ```
383
-
384
- ### Custom Cells
385
-
386
- ```jsx
387
- {
388
- key: 'status',
389
- title: 'Status',
390
- width: 140,
391
- render: (value) => <Tag theme={STATUS_THEME[value]}>{value}</Tag>,
392
- }
393
- ```
394
-
395
- ### Appearance
396
-
397
- `shape="card"` frames the table, `isStriped` bands the rows, `size` drives both
398
- row and header height, and `isHeaderHidden` drops the header row.
399
-
400
- ### Empty, No-results and Error States
401
-
402
- `isFiltered` is what separates "no matches" from "nothing exists"; the built-in
403
- search sets it for you.
404
-
405
- ### Sorting
406
-
407
- Mark columns `isSortable` and clicking a header cycles
408
- `ascending → descending → unsorted`. The third state matters whenever the source
409
- order is meaningful, which is why it is the default cycle; set
410
- `disallowSortRemoval` on a column to reduce it to `asc ↔ desc`.
411
-
412
- ```jsx
413
- <ItemTable
414
- data={rows}
415
- columns={[
416
- { key: 'name', title: 'Name', isSortable: true },
417
- { key: 'queries', title: 'Queries', isSortable: true,
418
- format: (v) => v.toLocaleString() },
419
- ]}
420
- defaultSort={{ columnKey: 'queries', direction: 'desc' }}
421
- />
422
- ```
423
-
424
- Client-side sorting compares raw `getValue` results — numerically for numbers,
425
- chronologically for dates — and falls back to a locale-aware collator over the
426
- column's display text, so a formatted column sorts the way it reads. `compare`
427
- overrides all of it. Nullish values sort first, then flip with the direction.
428
-
429
- `sortMode="server"` reflects the state and reports changes without ever
430
- reordering the rows. The second table below is server-sorted over a simulated
431
- round trip:
432
-
433
- ```jsx
434
- <ItemTable
435
- sortMode="server"
436
- sort={sort}
437
- onSortChange={setSort}
438
- isLoading={isFetching}
439
- data={rowsFromQuery}
440
- columns={columns}
441
- />
442
- ```
443
-
444
- ### Search
445
-
446
- `isSearchable` puts the input in the toolbar and the table filters itself:
447
-
448
- ```jsx
449
- <ItemTable
450
- data={deployments}
451
- columns={columns}
452
- isSearchable
453
- searchPlaceholder="Search deployments..."
454
- noResultsLabel="No deployments match that search"
455
- />
456
- ```
457
-
458
- The default matcher tests each column's **display text** — `format?.(value) ??
459
- String(getValue(row))` — not the raw value. So a formatted column matches what
460
- the user can actually see, a dotted `key` like `owner.name` is searchable, and a
461
- column holding an object with no `format` is skipped rather than stringified
462
- into `"[object Object]"` (which would make the query "object" match every row).
463
- Opt a column out with `isSearchable: false`, or replace the matcher entirely
464
- with `searchFilter`.
465
-
466
- Searching also selects `noResultsLabel` over `emptyLabel` on its own, and resets
467
- to page 1, so a client-search table distinguishes "no matches" from "nothing
468
- exists" without the page owning the term.
469
-
470
- ### Server-side Search
471
-
472
- `searchMode="server"` never filters — it reports the debounced term and the
473
- query does the work.
474
-
475
- ### An External Search Box, and a Custom Toolbar
476
-
477
- The input does not have to live in the table. `isSearchable={false}` hides the
478
- built-in one while a controlled `searchValue` still drives the table's matcher —
479
- a first-class path, not a workaround. The second table rebuilds the toolbar
480
- entirely; `ItemTable.Search` reads the table's state from context, so the term
481
- still has one owner.
482
-
483
- ```jsx
484
- const [term, setTerm] = useState('');
485
-
486
- <SearchInput value={term} onChange={setTerm} />
487
- <ItemTable data={rows} columns={columns} isSearchable={false} searchValue={term} />
488
- ```
489
-
490
- ### Pagination
491
-
492
- Pagination lives in the footer and is on by default (`paginationMode="client"`,
493
- 50 rows a page). The page-size selector appears whenever `pageSizeOptions` is
494
- set, and `summary` prints the localized item range.
495
-
496
- ```jsx
497
- <ItemTable data={rows} columns={columns} defaultPageSize={20} pageSizeOptions={[20, 50, 100]} />
498
- ```
499
-
500
- Client pagination slices the **searched and sorted** rows, so a page always
501
- reflects what the user is looking at, and the summary counts filtered rows
502
- rather than the raw array. Changing the page size returns to page 1, because the
503
- old page index points at different rows under a new size.
504
-
505
- Pagination that cannot do anything hides itself. One page of five rows would
506
- otherwise render "1–5 of 5", a page-size selector whose every option shows the
507
- same five rows, and a solitary "1" button. The test is both conditions together
508
- — a single page **and** a total the smallest page size would not split — so a
509
- 15-row single page keeps its control, because "10 / page" would genuinely
510
- paginate it. Set `autoHidePagination={false}` to always show it.
511
-
512
- Note that pagination and virtualization are alternatives: a 50-row page is well
513
- under `virtualizeThreshold`, so a paginated table normally renders every row.
514
- Set `paginationMode="off"` for the long-scroll case.
515
-
516
- ### Infinite Scroll
517
-
518
- `paginationMode="infinite"` replaces the page control with load-on-scroll. The
519
- table never slices in this mode — `data` is the list accumulated so far:
520
-
521
- ```jsx
522
- <ItemTable
523
- height="420px"
524
- data={loaded}
525
- columns={columns}
526
- paginationMode="infinite"
527
- hasMore={hasMore}
528
- isLoadingMore={isFetching}
529
- onLoadMore={fetchNextPage}
530
- />
531
- ```
532
-
533
- It is driven by an `IntersectionObserver` on a sentinel at the end of the body
534
- rather than a scroll handler: `loadMoreMargin` then expresses "prefetch this far
535
- before the end" directly, and it costs nothing per scroll tick. The observer
536
- re-arms only once `isLoadingMore` clears, so a request in flight is never fired
537
- twice by a sentinel still sitting in view.
538
-
539
- While a batch is in flight the table appends **skeleton rows**, not a spinner.
540
- They keep the row grid, read as "more rows of this shape are coming", and grow
541
- the scroll height smoothly instead of a block that appears and vanishes — and it
542
- matches what the first load already shows. `skeletonRowCount` caps them; the
543
- appended burst is short, because this is an increment to a list the user is
544
- already reading.
545
-
546
- Under virtualization the trailing spacer holds the remaining height, so the
547
- sentinel still marks the true end of the list rather than the end of the
548
- rendered window.
549
-
550
- ### Footer Slots
551
-
552
- The footer has three named slots, and they render whether or not pagination is
553
- on. `footerStart` is where Cloud's "Load all results" button belongs — the thing
554
- that today needs a `MutationObserver` to inject into ag-grid's paging panel,
555
- because Community has no status bar.
556
-
557
- ```jsx
558
- <ItemTable
559
- data={rows}
560
- columns={columns}
561
- footerStart={<Button type="outline" size="small">Load all results</Button>}
562
- footerCenter={<Text color="#dark-03">Partial result set</Text>}
563
- />
564
- ```
565
-
566
- ### Server-side Pagination
567
-
568
- `paginationMode="server"` never slices — it reflects `page` and reports changes,
569
- and `total` comes from the query. `data` is the current page.
570
-
571
- ```jsx
572
- <ItemTable
573
- data={pageFromQuery}
574
- columns={columns}
575
- paginationMode="server"
576
- page={page}
577
- pageSize={pageSize}
578
- total={totalFromQuery}
579
- isLoading={isFetching}
580
- onPageChange={setPage}
581
- onPageSizeChange={setPageSize}
582
- />
583
- ```
584
-
585
- ### Loading Behaviour
586
-
587
- `loadingIndicator` chooses what happens while `isLoading` is true over rows the
588
- table already has — the window that only exists once a query is involved:
589
-
590
- | Value | Behaviour |
591
- | --- | --- |
592
- | `overlay` (default) | The previous rows stay readable, dimmed, behind a spinner. Nothing moves, so the eye keeps its place and the table does not change height. |
593
- | `skeleton` | The previous rows are discarded for placeholders. Honest that the data is gone, but it flashes on every page and a short page makes the table jump. |
594
- | `none` | No visuals beyond `aria-busy`. For pages that already show a top-level progress bar and do not want a second indicator. |
595
-
596
- With no rows yet, `overlay` and `skeleton` both render skeleton rows — there is
597
- nothing to keep — and `none` renders an empty body rather than flashing the
598
- `emptyLabel` before the first response arrives.
599
-
600
- ### Bounded Height, Sticky Header and Pinned Columns
601
-
602
- A bounded height turns the body into a scroller and pins the header. Pinned
603
- columns are sticky `<th>`/`<td>` — one scroller, no lanes, no scroll sync. They
604
- are moved to the edges in DOM order too, so `aria-colindex` stays truthful.
605
-
606
- ```jsx
607
- <ItemTable
608
- height="400px"
609
- columns={[
610
- { key: 'name', title: 'Name', pin: 'start', width: 220 },
611
- /* … */
612
- { key: 'status', title: 'Status', pin: 'end', width: 140 },
613
- ]}
614
- data={rows}
615
- />
616
- ```
617
-
618
- ### Virtualization
619
-
620
- Above `virtualizeThreshold` rows a bounded table virtualizes automatically. The
621
- DOM and the styles are identical either way — only the number of mounted rows
622
- changes, so sorting, search, pinned columns and the sticky header all behave the
623
- same.
624
-
625
- ```jsx
626
- <ItemTable height="420px" paginationMode="off" data={tenThousandRows} columns={columns} />
627
- ```
628
-
629
- Overscroll is locked per axis, and only where the table can actually scroll, so
630
- a table whose content fits never traps the wheel — the page behind it scrolls as
631
- usual. On an axis that does scroll, a swipe at the edge neither chains to the
632
- page (which is what would trigger browser back-navigation) nor rubber-bands,
633
- since bouncing drags the rows off the sticky header and shows blank surface
634
- behind them.
635
-
636
- A native table cannot absolutely position a `<tr>` without breaking the table
637
- box, so the offset comes from leading and trailing spacer rows. Those are
638
- `aria-hidden`, and `aria-rowcount` / `aria-rowindex` continue to describe the
639
- whole dataset rather than the mounted window.
640
-
641
- Virtualization is skipped for the empty, error and loading states, and turns off
642
- entirely with `isVirtualized={false}`.
643
-
644
- ### Wrapping Cells
645
-
646
- Rows are **measured, not assumed**, so a column with `autoHeight` can wrap to a
647
- different number of lines per row and the virtualized window still tracks
648
- correctly.
649
-
650
- ### Selection
651
-
652
- `selectionMode="multiple"` adds the checkbox column:
653
-
654
- ```jsx
655
- const [keys, setKeys] = useState([]);
656
-
657
- <ItemTable
658
- data={deployments}
659
- columns={columns}
660
- selectionMode="multiple"
661
- selectedKeys={keys}
662
- onSelectionChange={(next) => setKeys(next)}
663
- />
664
- ```
665
-
666
- Selection is **keyed, not indexed**, so it survives sorting, searching and
667
- paging — the same row stays selected wherever it lands, and a row filtered out
668
- by a search keeps its key rather than being silently deselected.
669
-
670
- Shift-click a checkbox to extend the range from the last one you clicked
671
- plainly. Shift-clicking back toward the anchor shrinks the range rather than
672
- leaving the overshoot selected.
673
-
674
- #### Three ways a row can be special
675
-
676
- Deliberately distinct, and not interchangeable:
677
-
678
- | Prop | Focusable | Interactive | Selectable |
679
- | --- | --- | --- | --- |
680
- | `disabledKeys` | no | no | no |
681
- | `isRowSelectable` | yes | yes | no |
682
- | `getRowProps().isDimmed` | yes | yes | **yes** — it is purely visual |
683
-
684
- `selectionTooltip` explains an inert checkbox, which is the difference between
685
- "this is broken" and "this row is still deploying".
686
-
687
- #### What select-all reaches
688
-
689
- `selectAllMode` decides the scope of the header checkbox:
690
-
691
- - **`'page'`** (default) — the rows on the current page.
692
- - **`'filtered'`** — every row passing the current search or filter, across
693
- pages.
694
- - **`'all'`** — emits the `'all'` sentinel instead of a key list. This is the
695
- only mode that can mean rows the client has never loaded, so the consumer
696
- decides what it means for its query — usually a `DELETE … WHERE <filter>`
697
- rather than `WHERE id IN (…)`.
698
-
699
- Unselectable rows are excluded from every scope. Pressing the header checkbox
700
- while everything in scope is selected clears the **whole** selection, not just
701
- the scope — leaving keys selected on other pages behind an unchecked-looking box
702
- is how people delete things they did not mean to.
703
-
704
- ### Row Links and Row Actions
705
-
706
- `rowLink` turns the row-header cell into a stretched anchor covering the whole
707
- row:
708
-
709
- ```jsx
710
- <ItemTable
711
- data={deployments}
712
- columns={columns}
713
- rowLink={(row) => `/deployments/${row.id}`}
714
- />
715
- ```
716
-
717
- Because it is a real `<a href>`, ⌘-click, middle-click and "Open in new tab"
718
- all work natively — none of which an `onClick` handler can give you. The anchor
719
- sits below the cells' own content in the stacking order, so a button or `⋮`
720
- trigger inside a cell still takes its own clicks, and its accessible name comes
721
- from the row-header cell rather than being announced as "link".
722
-
723
- The row-header cell is styled as a link — `#purple-text` at weight 600, matching
724
- the kit's `Link`, with an underline while the row is hovered. The anchor itself
725
- is invisible, so without that the row would give no sign that it navigates.
726
-
727
- `onRowAction` is the non-navigational alternative — Enter, or a click that did
728
- not land on a control inside a cell. Use one or the other, not both.
729
-
730
- ### Row Menu
731
-
732
- `rowMenu` supplies `Menu.Item` children, and `rowContextMenu` decides where they
733
- are exposed. The split is deliberate: `rowMenu` alone renders nothing, so a row
734
- never grows a `⋮` nobody asked for.
735
-
736
- ```jsx
737
- <ItemTable
738
- data={deployments}
739
- columns={columns}
740
- rowContextMenu
741
- rowMenu={(row) => (
742
- <>
743
- <Menu.Item key="open">Open {row.name}</Menu.Item>
744
- <Menu.Item key="delete">Delete</Menu.Item>
745
- </>
746
- )}
747
- onRowMenuAction={(action, row) => run(action, row)}
748
- />
749
- ```
750
-
751
- | `rowContextMenu` | `⋮` column | Right-click / Shift+F10 |
752
- | --- | --- | --- |
753
- | `false` (default) | no | no |
754
- | `true` | yes | yes |
755
- | `'context-only'` | no | yes |
756
-
757
- A row whose resolver returns `null` gets no trigger, and right-clicking it falls
758
- through to the browser's own context menu — more useful than an empty popover.
759
-
760
- ### Bulk Actions
761
-
762
- `bulkActions` implies `selectionMode="multiple"` — a bulk action with no way to
763
- select rows is a contradiction, not a configuration.
764
-
765
- ```jsx
766
- <ItemTable
767
- data={deployments}
768
- columns={columns}
769
- bulkActions={[
770
- {
771
- key: 'restart',
772
- label: 'Restart',
773
- onAction: async (rows, { setLoading }) => {
774
- setLoading(true);
775
- await restart(rows.map((row) => row.id));
776
- },
777
- },
778
- {
779
- key: 'delete',
780
- label: 'Delete',
781
- theme: 'danger',
782
- isDisabled: (rows) => rows.some((row) => row.status === 'running'),
783
- disabledTooltip: 'A running deployment cannot be deleted',
784
- onAction: (rows) => remove(rows),
785
- },
786
- ]}
787
- />
788
- ```
789
-
790
- Each action drives its own spinner through `setLoading`, so one slow request
791
- does not freeze the others, and the selection clears when the action resolves.
792
- Opt out with `deselectAfter: false` for an action that only reads — the default
793
- exists because the rows an action just deleted or moved are usually gone.
794
-
795
- `bulkBarPlacement="floating"` (the default) centres the bar over the body
796
- without changing the table's height, so the rows never shift under the cursor.
797
- `"toolbar"` takes over the `actions` group instead, for a page whose toolbar is
798
- already crowded — the two compete for the same space, and while rows are
799
- selected the bulk actions are what the user is reaching for.
800
-
801
- **Escape** clears the selection from anywhere inside the table.
802
-
803
- `ItemTable.BulkBar` is available as a compound member for placing the bar
804
- outside the default chrome; it reads the selection from context, so there is
805
- still exactly one owner.
806
-
807
- ### Reordering Rows
808
-
809
- `isReorderable` lets rows be dragged into a new order:
810
-
811
- ```jsx
812
- <ItemTable
813
- isReorderable
814
- data={rows}
815
- columns={columns}
816
- onReorder={(keys, nextRows) => setRows(nextRows)}
817
- />
818
- ```
819
-
820
- It is built on React Aria's collection drag-and-drop, through the same
821
- `DraggableCollection` wrapper `Tabs` and `ListBox` use — `RowCollection` and the
822
- table's own `SelectionManager` satisfy its contract unchanged.
823
-
824
- That buys the keyboard path as well as the pointer one: the grid takes a single
825
- tab stop, arrows move between rows, Enter picks a row up and drops it, Escape
826
- cancels. The drop line is drawn **on** the row rather than between rows, because
827
- a native table has nowhere to put an element between two `<tr>`s.
828
-
829
- `onReorder` reports the whole key order rather than just the moved row, so the
830
- result can be persisted without reconstructing it.
831
-
832
- ### Dropping Rows onto a Row
833
-
834
- Some tables move rows *into* other rows rather than around them — a workbook
835
- into a folder. `dropOnRow` covers that, and enables dragging on its own:
836
-
837
- ```jsx
838
- <ItemTable
839
- data={items}
840
- columns={columns}
841
- dropOnRow={{
842
- isTarget: (row) => row.type === 'folder',
843
- isAllowed: (dragged, target) => dragged.every((row) => row.id !== target.id),
844
- onDrop: (dragged, target) => move(dragged, target),
845
- }}
846
- />
847
- ```
848
-
849
- This is a **different case from reordering**, and usually the only one a given
850
- table wants: Cloud's Workbooks page drags items into folders and never reorders
851
- them. The story below is that shape.
852
-
853
- They do compose if you need it — set `isReorderable` as well and a row that
854
- refuses a drop falls back to reordering — but that combination is rare. Cloud
855
- has to treat them as mutually exclusive because ag-grid cannot express both at
856
- once; that restriction does not carry over.
857
-
858
- `dropOnRow` replaces Cloud's `isDropOnRowEnabled`, `isDropTarget`,
859
- `isDropOnRowAllowed` and `onDropOnRow` with one object, and drops the two
860
- ag-grid workarounds beside them (`dropTargetRowKeyRef`,
861
- `dropTargetRefreshColumnKey`) that existed only because ag-grid cannot re-render
862
- a single cell from React state. Here the hovered row is just
863
- `ctx.isDropTarget`.
864
-
865
- ### Column Resize
866
-
867
- `isResizable` puts a grab handle on each column's trailing edge:
868
-
869
- ```jsx
870
- <ItemTable isResizable storageKey="deployments" data={rows} columns={columns} />
871
- ```
872
-
873
- It is built on React Aria's `useMove` — the same hook behind `Board`'s widgets —
874
- so the handle takes **keyboard** input for free: focus it and use the arrow
875
- keys, or Home/End to jump to the column's minimum and maximum. Widths clamp to
876
- each column's `minWidth` / `maxWidth`, and a column opts out with
877
- `isResizable: false`.
878
-
879
- `onColumnResize` fires once the gesture ends rather than on every pixel, and
880
- `columnWidths` is in the default `persist` list, so pairing `isResizable` with
881
- `storageKey` makes a resized table come back the way the user left it.
882
-
883
- ### Persisting State
884
-
885
- `storageKey` remembers the parts of the table's state a user expects to survive
886
- a reload:
887
-
888
- ```jsx
889
- <ItemTable data={rows} columns={columns} storageKey="deployments" />
890
- ```
891
-
892
- Only state the **table** owns is stored, so a controlled `pageSize` or `sort`
893
- stays entirely the page's business. Sort is opt-in via `persist` — a stored sort
894
- silently changes what the first screen of a table means, which is rarely what
895
- you want by default:
896
-
897
- ```jsx
898
- <ItemTable storageKey="deployments" persist={['pageSize', 'sort']} data={rows} columns={columns} />
899
- ```
900
-
901
- Reads and writes are best-effort: private mode, a disabled store, a quota error
902
- or a hand-edited value all degrade to "no persistence" rather than failing.
903
-
904
- ### Per-row Visuals
905
-
906
- ```jsx
907
- <ItemTable
908
- getRowProps={({ row }) => ({ isDimmed: row.status === 'stopped' })}
909
- data={rows}
910
- columns={columns}
911
- />
912
- ```
913
-
914
- ## Accessibility
915
-
916
- ### Screen Reader Support
917
-
918
- - The `<table>` carries `role="grid"` with `aria-rowcount` and `aria-colcount`.
919
- - Row and column indices are **1-based and document-absolute** — header rows are
920
- counted, and the indices stay truthful when rows are virtualized or columns
921
- are pinned.
922
- - A column marked `isRowHeader` renders `<th scope="row">`, so a screen reader
923
- announces the row by name when moving between cells.
924
- - `aria-sort` is set on the sorted header only, never `"none"` on the rest.
925
- - `aria-busy` is set while loading; skeleton rows keep the full cell structure so
926
- nothing shifts when the data lands.
927
-
928
- ### ARIA Properties
929
-
930
- | Property | Applied to |
931
- | -------- | ---------- |
932
- | `role="grid"` | the `<table>` |
933
- | `aria-rowcount` / `aria-colcount` | the `<table>` |
934
- | `aria-rowindex` | every `<tr>` |
935
- | `aria-colindex` | every cell and column header |
936
- | `aria-sort` | the sorted column header |
937
- | `aria-busy` | the grid and its skeleton rows |
938
-
939
- ## Best Practices
940
-
941
- - Do: mark one column `isRowHeader`. It names the row for assistive tech and is
942
- where a row link will anchor.
943
- - Do: give a column `format` when its display text differs from its raw value —
944
- that is what keeps it sortable, searchable and copyable.
945
- - Do: bound the table's height. Without a bound it grows to fit, the header
946
- cannot stick, and virtualization has no viewport to work against.
947
- - Do: leave the header preset alone unless you have a reason. `c3` is what the
948
- Cloud list tables use, and the header `Item` inherits the cell's typography so
949
- overriding `headerPreset` restyles the whole header consistently.
950
- - Do: pass `isFiltered` when you filter `data` yourself, so the empty state says
951
- "no matches".
952
- - Don't: reach for `render` to reformat text. `format` does it in a way the rest
953
- of the table understands — including sorting and search.
954
- - Don't: filter `data` yourself *and* leave `isFiltered` unset, or an empty
955
- result will read as "nothing exists".
956
- - Don't: put an `Item` in every cell. `Item` runs a hotkey subscription per
957
- instance; use `TextItem` (which the table does automatically for plain text)
958
- and reserve `Item` for the row-header cell.
959
-
960
- ## Suggested Improvements
961
-
962
- - Selection, pagination, row menus and drag & drop are arriving in follow-ups.
963
- - Multi-column sorting (the sibling `DataTable` will take `sorts: []`).
964
-
965
- ## Related Components
966
-
967
- - [Pagination](../navigation/Pagination.md) — pairs with the table footer
968
- - [Item](../content/Item.md) — the header cell's content
969
- - [TextItem](../content/TextItem.md) — truncating body text
970
- - [ListBox](../fields/ListBox.md) — when there is only one column