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