@cube-dev/ui-kit 0.0.0-canary-1f0dd2c → 0.0.0-canary-1d27aa0

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 (625) hide show
  1. package/README.md +7 -4
  2. package/dist/README.md +7 -4
  3. package/dist/_internal/hooks/use-chained-callback.js +1 -1
  4. package/dist/_internal/hooks/use-debounced-value.js +1 -1
  5. package/dist/_internal/hooks/use-deprecation-warning.js +1 -1
  6. package/dist/_internal/hooks/use-event.js +1 -1
  7. package/dist/_internal/hooks/use-is-first-render.js +1 -1
  8. package/dist/_internal/hooks/use-sync-ref.js +1 -1
  9. package/dist/_internal/hooks/use-timer/timer.js +1 -1
  10. package/dist/_internal/hooks/use-timer/use-timer.js +1 -1
  11. package/dist/_internal/hooks/use-warn.js +1 -1
  12. package/dist/components/Block.js +1 -1
  13. package/dist/components/CollectionItem.js +1 -1
  14. package/dist/components/GlobalStyles.js +1 -1
  15. package/dist/components/GridProvider.js +1 -1
  16. package/dist/components/HiddenInput.js +1 -1
  17. package/dist/components/Root.js +1 -1
  18. package/dist/components/actions/Action/Action.js +1 -1
  19. package/dist/components/actions/Banner/Banner.js +1 -1
  20. package/dist/components/actions/Button/Button.d.ts +0 -1
  21. package/dist/components/actions/Button/Button.js +1 -1
  22. package/dist/components/actions/ButtonGroup/ButtonGroup.js +1 -1
  23. package/dist/components/actions/ButtonSplit/ButtonSplit.js +1 -1
  24. package/dist/components/actions/ButtonSplit/context.js +1 -1
  25. package/dist/components/actions/CommandMenu/CommandMenu.js +1 -1
  26. package/dist/components/actions/CommandMenu/styled.js +1 -1
  27. package/dist/components/actions/ItemAction/ItemAction.js +1 -1
  28. package/dist/components/actions/ItemActionContext.js +1 -1
  29. package/dist/components/actions/ItemButton/ItemButton.js +1 -1
  30. package/dist/components/actions/Link/Link.js +1 -1
  31. package/dist/components/actions/Menu/Menu.js +1 -1
  32. package/dist/components/actions/Menu/MenuItem.js +1 -1
  33. package/dist/components/actions/Menu/MenuSection.js +1 -1
  34. package/dist/components/actions/Menu/MenuTrigger.js +1 -1
  35. package/dist/components/actions/Menu/SubMenuTrigger.js +1 -1
  36. package/dist/components/actions/Menu/SubmenuTriggerContext.js +1 -1
  37. package/dist/components/actions/Menu/context.js +1 -1
  38. package/dist/components/actions/Menu/styled.js +1 -1
  39. package/dist/components/actions/index.js +1 -1
  40. package/dist/components/actions/use-action.js +1 -1
  41. package/dist/components/actions/use-anchored-menu.js +1 -1
  42. package/dist/components/actions/use-context-menu.js +1 -1
  43. package/dist/components/content/ActiveZone/ActiveZone.js +1 -1
  44. package/dist/components/content/Alert/Alert.js +1 -1
  45. package/dist/components/content/Alert/use-alert.js +1 -1
  46. package/dist/components/content/Avatar/Avatar.js +1 -1
  47. package/dist/components/content/Badge/Badge.js +1 -1
  48. package/dist/components/content/Card/Card.js +1 -1
  49. package/dist/components/content/Content.js +1 -1
  50. package/dist/components/content/CopyPasteBlock/CopyPasteBlock.js +1 -1
  51. package/dist/components/content/CopySnippet/CopySnippet.js +1 -1
  52. package/dist/components/content/Disclosure/Disclosure.js +1 -1
  53. package/dist/components/content/Divider.js +1 -1
  54. package/dist/components/content/Footer.js +1 -1
  55. package/dist/components/content/Header.js +1 -1
  56. package/dist/components/content/HotKeys/HotKeys.js +1 -1
  57. package/dist/components/content/InfoBadge/InfoBadge.js +1 -1
  58. package/dist/components/content/InlineInput/InlineInput.js +1 -1
  59. package/dist/components/content/Item/Item.js +1 -1
  60. package/dist/components/content/ItemBadge/ItemBadge.js +1 -1
  61. package/dist/components/content/ItemCard/ItemCard.js +1 -1
  62. package/dist/components/content/Layout/GridLayout.js +1 -1
  63. package/dist/components/content/Layout/Layout.js +1 -1
  64. package/dist/components/content/Layout/LayoutBlock.js +1 -1
  65. package/dist/components/content/Layout/LayoutCenter.js +1 -1
  66. package/dist/components/content/Layout/LayoutContainer.js +1 -1
  67. package/dist/components/content/Layout/LayoutContent.js +1 -1
  68. package/dist/components/content/Layout/LayoutContext.js +1 -1
  69. package/dist/components/content/Layout/LayoutFlex.js +1 -1
  70. package/dist/components/content/Layout/LayoutFooter.js +1 -1
  71. package/dist/components/content/Layout/LayoutGrid.js +1 -1
  72. package/dist/components/content/Layout/LayoutHeader.js +1 -1
  73. package/dist/components/content/Layout/LayoutPane.js +1 -1
  74. package/dist/components/content/Layout/LayoutPanel.js +1 -1
  75. package/dist/components/content/Layout/LayoutPanelHeader.js +1 -1
  76. package/dist/components/content/Layout/LayoutToolbar.js +1 -1
  77. package/dist/components/content/Layout/hooks/useTinyScrollbar.js +1 -1
  78. package/dist/components/content/Layout/index.js +1 -1
  79. package/dist/components/content/Layout/utils.js +1 -1
  80. package/dist/components/content/Paragraph.js +1 -1
  81. package/dist/components/content/Placeholder/Placeholder.js +1 -1
  82. package/dist/components/content/PrismCode/PrismCode.js +1 -1
  83. package/dist/components/content/PrismCode/prismSetup.js +1 -1
  84. package/dist/components/content/PrismDiffCode/PrismDiffCode.js +1 -1
  85. package/dist/components/content/Result/Result.js +1 -1
  86. package/dist/components/content/Skeleton/Skeleton.js +1 -1
  87. package/dist/components/content/Tag/Tag.js +1 -1
  88. package/dist/components/content/Text.d.ts +14 -14
  89. package/dist/components/content/Text.js +1 -1
  90. package/dist/components/content/TextItem/TextItem.js +1 -1
  91. package/dist/components/content/Title.js +1 -1
  92. package/dist/components/content/Tree/Tree.js +1 -1
  93. package/dist/components/content/Tree/TreeNode.js +1 -1
  94. package/dist/components/content/Tree/styled.js +1 -1
  95. package/dist/components/content/Tree/tree-index.js +1 -1
  96. package/dist/components/content/Tree/use-checkbox-tree.js +1 -1
  97. package/dist/components/content/Tree/use-load-data.js +1 -1
  98. package/dist/components/content/highlightText.js +1 -1
  99. package/dist/components/content/use-auto-tooltip.js +1 -1
  100. package/dist/components/data/DataTable/DataTable.js +1 -1
  101. package/dist/components/data/ItemTable/ItemTable.js +1 -1
  102. package/dist/components/data/ItemTable/ItemTableBulkBar.js +1 -1
  103. package/dist/components/data/ItemTable/ItemTableDragPreview.js +1 -1
  104. package/dist/components/data/ItemTable/ItemTableFooter.js +1 -1
  105. package/dist/components/data/ItemTable/ItemTableToolbar.js +1 -1
  106. package/dist/components/data/TableBase/ColumnResizer.js +1 -1
  107. package/dist/components/data/TableBase/RowCollection.js +1 -1
  108. package/dist/components/data/TableBase/TableHeaderCell.js +1 -1
  109. package/dist/components/data/TableBase/TableRow.js +1 -1
  110. package/dist/components/data/TableBase/TableView.js +1 -1
  111. package/dist/components/data/TableBase/column-menu.js +1 -1
  112. package/dist/components/data/TableBase/column-tint.js +1 -1
  113. package/dist/components/data/TableBase/row-menu.js +1 -1
  114. package/dist/components/data/TableBase/styled.d.ts +1 -2
  115. package/dist/components/data/TableBase/styled.js +1 -1
  116. package/dist/components/data/TableBase/table-tree.js +1 -1
  117. package/dist/components/data/TableBase/types.js +1 -1
  118. package/dist/components/data/TableBase/use-cell-selection.d.ts +0 -1
  119. package/dist/components/data/TableBase/use-cell-selection.js +0 -0
  120. package/dist/components/data/TableBase/use-column-order.js +1 -1
  121. package/dist/components/data/TableBase/use-container-width.js +1 -1
  122. package/dist/components/data/TableBase/use-row-move-animation.js +1 -1
  123. package/dist/components/data/TableBase/use-scrollability.js +1 -1
  124. package/dist/components/data/TableBase/use-table-columns.js +1 -1
  125. package/dist/components/data/TableBase/use-table-search.js +1 -1
  126. package/dist/components/data/TableBase/use-table-selection.js +1 -1
  127. package/dist/components/data/TableBase/use-table-sort.js +1 -1
  128. package/dist/components/data/TableBase/use-table-sorts.js +1 -1
  129. package/dist/components/data/TableBase/use-table-storage.js +1 -1
  130. package/dist/components/data/TableBase/use-table-tree-state.js +1 -1
  131. package/dist/components/fields/Checkbox/Checkbox.js +1 -1
  132. package/dist/components/fields/Checkbox/CheckboxGroup.js +1 -1
  133. package/dist/components/fields/Checkbox/context.js +1 -1
  134. package/dist/components/fields/ColorInput/ColorInput.js +1 -1
  135. package/dist/components/fields/ColorPicker/ColorPicker.js +1 -1
  136. package/dist/components/fields/ColorSwatch/ColorSwatch.js +1 -1
  137. package/dist/components/fields/ColorSwatchGroup/ColorSwatchGroup.js +1 -1
  138. package/dist/components/fields/ComboBox/ComboBox.js +1 -1
  139. package/dist/components/fields/CommandTextArea/CommandTextArea.js +1 -1
  140. package/dist/components/fields/CommandTextArea/caretPosition.js +1 -1
  141. package/dist/components/fields/CommandTextArea/useCaretAnchor.js +1 -1
  142. package/dist/components/fields/DatePicker/DateInput.js +1 -1
  143. package/dist/components/fields/DatePicker/DateInputBase.js +1 -1
  144. package/dist/components/fields/DatePicker/DatePicker.js +1 -1
  145. package/dist/components/fields/DatePicker/DatePickerButton.js +1 -1
  146. package/dist/components/fields/DatePicker/DatePickerElement.js +1 -1
  147. package/dist/components/fields/DatePicker/DatePickerInput.js +1 -1
  148. package/dist/components/fields/DatePicker/DatePickerSegment.js +1 -1
  149. package/dist/components/fields/DatePicker/DateRangePicker.js +1 -1
  150. package/dist/components/fields/DatePicker/DateRangeSeparatedPicker.js +1 -1
  151. package/dist/components/fields/DatePicker/MonthPicker.js +1 -1
  152. package/dist/components/fields/DatePicker/PeriodPicker.js +1 -1
  153. package/dist/components/fields/DatePicker/QuarterPicker.js +1 -1
  154. package/dist/components/fields/DatePicker/TimeInput.js +1 -1
  155. package/dist/components/fields/DatePicker/WeekPicker.js +1 -1
  156. package/dist/components/fields/DatePicker/YearPicker.js +1 -1
  157. package/dist/components/fields/DatePicker/parseDate.js +1 -1
  158. package/dist/components/fields/DatePicker/period.js +1 -1
  159. package/dist/components/fields/DatePicker/props.js +1 -1
  160. package/dist/components/fields/DatePicker/utils.js +1 -1
  161. package/dist/components/fields/FileInput/FileInput.js +1 -1
  162. package/dist/components/fields/FilterListBox/FilterListBox.js +1 -1
  163. package/dist/components/fields/FilterPicker/FilterPicker.js +1 -1
  164. package/dist/components/fields/Input/Input.js +1 -1
  165. package/dist/components/fields/ListBox/DraggableListBox.js +1 -1
  166. package/dist/components/fields/ListBox/ListBox.js +1 -1
  167. package/dist/components/fields/ListBoxPopover/ListBoxPopover.js +1 -1
  168. package/dist/components/fields/ListBoxPopover/index.d.ts +0 -1
  169. package/dist/components/fields/ListBoxPopover/listNavigation.js +1 -1
  170. package/dist/components/fields/ListBoxPopover/useCompositeFocus.js +1 -1
  171. package/dist/components/fields/NumberInput/NumberInput.js +1 -1
  172. package/dist/components/fields/NumberInput/StepButton.js +1 -1
  173. package/dist/components/fields/PasswordInput/PasswordInput.js +1 -1
  174. package/dist/components/fields/Picker/Picker.js +1 -1
  175. package/dist/components/fields/RadioGroup/Radio.js +1 -1
  176. package/dist/components/fields/RadioGroup/RadioGroup.js +1 -1
  177. package/dist/components/fields/RadioGroup/context.js +1 -1
  178. package/dist/components/fields/SearchComboBox/SearchComboBox.js +1 -1
  179. package/dist/components/fields/SearchInput/SearchInput.js +1 -1
  180. package/dist/components/fields/Select/Select.js +1 -1
  181. package/dist/components/fields/Slider/Gradation.js +1 -1
  182. package/dist/components/fields/Slider/HueSlider.js +1 -1
  183. package/dist/components/fields/Slider/RangeSlider.js +1 -1
  184. package/dist/components/fields/Slider/Slider.js +1 -1
  185. package/dist/components/fields/Slider/SliderBase.js +1 -1
  186. package/dist/components/fields/Slider/SliderThumb.js +1 -1
  187. package/dist/components/fields/Slider/SliderTrack.js +1 -1
  188. package/dist/components/fields/Slider/elements.js +1 -1
  189. package/dist/components/fields/Slider/index.js +1 -1
  190. package/dist/components/fields/Switch/Switch.js +1 -1
  191. package/dist/components/fields/TextArea/TextArea.js +1 -1
  192. package/dist/components/fields/TextInput/TextInput.js +1 -1
  193. package/dist/components/fields/TextInput/TextInputBase.js +1 -1
  194. package/dist/components/fields/TextInput/useAutoSizeTextArea.js +1 -1
  195. package/dist/components/fields/TextInputMapper/TextInputMapper.js +1 -1
  196. package/dist/components/fields/color/ColorPanel.js +1 -1
  197. package/dist/components/fields/color/channels.js +1 -1
  198. package/dist/components/fields/color/color.js +1 -1
  199. package/dist/components/fields/color/context.js +1 -1
  200. package/dist/components/form/FieldWrapper/FieldWrapper.js +1 -1
  201. package/dist/components/form/Form/Field.js +1 -1
  202. package/dist/components/form/Form/Form.js +1 -1
  203. package/dist/components/form/Form/ResetButton/ResetButton.js +1 -1
  204. package/dist/components/form/Form/SubmitButton/SubmitButton.js +1 -1
  205. package/dist/components/form/Form/SubmitError.js +1 -1
  206. package/dist/components/form/Form/index.js +1 -1
  207. package/dist/components/form/Form/use-field/use-field-props.js +1 -1
  208. package/dist/components/form/Form/use-field/use-field.js +1 -1
  209. package/dist/components/form/Form/use-form.js +1 -1
  210. package/dist/components/form/Form/validation.js +1 -1
  211. package/dist/components/form/Label.js +1 -1
  212. package/dist/components/form/validation/ValidationIndicator.js +1 -1
  213. package/dist/components/form/validation/resolve-validation-props.js +1 -1
  214. package/dist/components/form/validation/use-validation-props.js +1 -1
  215. package/dist/components/form/wrapper.js +1 -1
  216. package/dist/components/helpers/DisplayTransition/DisplayTransition.js +1 -1
  217. package/dist/components/helpers/IconSwitch/IconSwitch.js +1 -1
  218. package/dist/components/layout/Board/Board.js +1 -1
  219. package/dist/components/layout/Board/BoardProvider.js +1 -1
  220. package/dist/components/layout/Board/BoardResponsive.js +1 -1
  221. package/dist/components/layout/Board/Widget.js +1 -1
  222. package/dist/components/layout/Board/WidgetHost.js +1 -1
  223. package/dist/components/layout/Board/board-context.js +1 -1
  224. package/dist/components/layout/Board/board-store.js +1 -1
  225. package/dist/components/layout/Board/grid-core/calculate.js +1 -1
  226. package/dist/components/layout/Board/grid-core/collision-modes.js +1 -1
  227. package/dist/components/layout/Board/grid-core/collision.js +1 -1
  228. package/dist/components/layout/Board/grid-core/compactors.js +1 -1
  229. package/dist/components/layout/Board/grid-core/constraints.js +1 -1
  230. package/dist/components/layout/Board/grid-core/group-move.js +1 -1
  231. package/dist/components/layout/Board/grid-core/layout.js +1 -1
  232. package/dist/components/layout/Board/grid-core/sort.js +1 -1
  233. package/dist/components/layout/Board/index.js +1 -1
  234. package/dist/components/layout/Board/responsive-utils.js +1 -1
  235. package/dist/components/layout/Board/use-board-layout.js +1 -1
  236. package/dist/components/layout/Board/use-board-registry.js +1 -1
  237. package/dist/components/layout/Board/use-board-select-modifier-key.js +1 -1
  238. package/dist/components/layout/Board/use-board-selection.js +1 -1
  239. package/dist/components/layout/Flex.js +1 -1
  240. package/dist/components/layout/Flow.js +1 -1
  241. package/dist/components/layout/Grid.js +1 -1
  242. package/dist/components/layout/Panel.js +1 -1
  243. package/dist/components/layout/Prefix.js +1 -1
  244. package/dist/components/layout/ResizablePanel.js +1 -1
  245. package/dist/components/layout/Space.js +1 -1
  246. package/dist/components/layout/Suffix.js +1 -1
  247. package/dist/components/navigation/Pagination/Pagination.js +1 -1
  248. package/dist/components/navigation/Pagination/use-pagination.js +1 -1
  249. package/dist/components/navigation/Tabs/DraggableTabList.js +1 -1
  250. package/dist/components/navigation/Tabs/TabButton.js +1 -1
  251. package/dist/components/navigation/Tabs/TabDropIndicator.js +1 -1
  252. package/dist/components/navigation/Tabs/TabPanel.js +1 -1
  253. package/dist/components/navigation/Tabs/TabPicker.js +1 -1
  254. package/dist/components/navigation/Tabs/Tabs.js +1 -1
  255. package/dist/components/navigation/Tabs/TabsAction.js +1 -1
  256. package/dist/components/navigation/Tabs/TabsContext.js +1 -1
  257. package/dist/components/navigation/Tabs/popover-placement.js +1 -1
  258. package/dist/components/navigation/Tabs/styled.js +1 -1
  259. package/dist/components/navigation/Tabs/types.js +1 -1
  260. package/dist/components/navigation/Tabs/use-tab-editing.js +1 -1
  261. package/dist/components/navigation/Tabs/use-tab-indicator.js +1 -1
  262. package/dist/components/organisms/StatsCard/StatsCard.js +1 -1
  263. package/dist/components/other/Calendar/Calendar.js +1 -1
  264. package/dist/components/other/Calendar/CalendarCell.js +1 -1
  265. package/dist/components/other/Calendar/CalendarGrid.js +1 -1
  266. package/dist/components/other/Calendar/CalendarHeader.js +1 -1
  267. package/dist/components/other/Calendar/CalendarPanel.js +1 -1
  268. package/dist/components/other/Calendar/PeriodCalendar.js +1 -1
  269. package/dist/components/other/Calendar/PeriodGrid.js +1 -1
  270. package/dist/components/other/Calendar/RangeCalendar.js +1 -1
  271. package/dist/components/other/Calendar/styled.js +1 -1
  272. package/dist/components/other/CubeLogo/CubeLogo.js +1 -1
  273. package/dist/components/other/NoDataIcon/NoDataIcon.js +1 -1
  274. package/dist/components/overlays/AlertDialog/AlertDialog.js +1 -1
  275. package/dist/components/overlays/AlertDialog/AlertDialogApiProvider.js +1 -1
  276. package/dist/components/overlays/AlertDialog/AlertDialogZone.js +1 -1
  277. package/dist/components/overlays/Dialog/Dialog.js +1 -1
  278. package/dist/components/overlays/Dialog/DialogContainer.js +1 -1
  279. package/dist/components/overlays/Dialog/DialogForm.js +1 -1
  280. package/dist/components/overlays/Dialog/DialogTrigger.js +1 -1
  281. package/dist/components/overlays/Dialog/context.js +1 -1
  282. package/dist/components/overlays/Dialog/use-dialog-container.js +1 -1
  283. package/dist/components/overlays/Modal/Modal.d.ts +1 -2
  284. package/dist/components/overlays/Modal/Modal.js +1 -1
  285. package/dist/components/overlays/Modal/OpenTransitionContext.js +1 -1
  286. package/dist/components/overlays/Modal/Overlay.d.ts +0 -1
  287. package/dist/components/overlays/Modal/Overlay.js +1 -1
  288. package/dist/components/overlays/Modal/Popover.js +1 -1
  289. package/dist/components/overlays/Modal/Tray.js +1 -1
  290. package/dist/components/overlays/Modal/Underlay.js +1 -1
  291. package/dist/components/overlays/Modal/types.d.ts +0 -1
  292. package/dist/components/overlays/Notifications/Notification.js +1 -1
  293. package/dist/components/overlays/Notifications/NotificationAction.js +1 -1
  294. package/dist/components/overlays/Notifications/NotificationCard.js +1 -1
  295. package/dist/components/overlays/Notifications/NotificationContext.d.ts +0 -2
  296. package/dist/components/overlays/Notifications/NotificationContext.js +1 -1
  297. package/dist/components/overlays/Notifications/NotificationItem.js +1 -1
  298. package/dist/components/overlays/Notifications/OverlayContainer.js +1 -1
  299. package/dist/components/overlays/Notifications/OverlayProvider.js +1 -1
  300. package/dist/components/overlays/Notifications/PersistentNotificationsList.js +1 -1
  301. package/dist/components/overlays/Notifications/dismissed-storage.js +1 -1
  302. package/dist/components/overlays/Notifications/format-relative-time.js +1 -1
  303. package/dist/components/overlays/Notifications/index.js +1 -1
  304. package/dist/components/overlays/Notifications/use-notification-state.js +1 -1
  305. package/dist/components/overlays/Notifications/use-notifications.js +1 -1
  306. package/dist/components/overlays/Notifications/use-overlay-timers.js +1 -1
  307. package/dist/components/overlays/Notifications/use-persistent-notifications.js +1 -1
  308. package/dist/components/overlays/Notifications/use-persistent-state.js +1 -1
  309. package/dist/components/overlays/Notifications/use-toast-state.js +1 -1
  310. package/dist/components/overlays/Toast/ToastItem.js +1 -1
  311. package/dist/components/overlays/Toast/index.js +1 -1
  312. package/dist/components/overlays/Toast/useProgressToast.js +1 -1
  313. package/dist/components/overlays/Toast/useToast.js +1 -1
  314. package/dist/components/overlays/Tooltip/Tooltip.js +2 -1
  315. package/dist/components/overlays/Tooltip/Tooltip.js.map +1 -1
  316. package/dist/components/overlays/Tooltip/TooltipProvider.js +1 -1
  317. package/dist/components/overlays/Tooltip/TooltipTrigger.js +1 -1
  318. package/dist/components/overlays/Tooltip/context.js +1 -1
  319. package/dist/components/portal/Portal.js +1 -1
  320. package/dist/components/portal/PortalProvider.js +1 -1
  321. package/dist/components/portal/index.d.ts +0 -1
  322. package/dist/components/portal/usePortal.js +1 -1
  323. package/dist/components/shared/DraggableCollection.js +1 -1
  324. package/dist/components/shared/InvalidIcon.js +1 -1
  325. package/dist/components/shared/ValidIcon.js +1 -1
  326. package/dist/components/status/LoadingAnimation/LoadingAnimation.js +1 -1
  327. package/dist/components/status/Spin/Cube.js +1 -1
  328. package/dist/components/status/Spin/InternalSpinner.js +1 -1
  329. package/dist/components/status/Spin/Spin.js +1 -1
  330. package/dist/components/status/Spin/SpinsContainer.js +1 -1
  331. package/dist/data/item-themes.js +1 -1
  332. package/dist/data/themes.js +1 -1
  333. package/dist/eslint-plugin/defaults.generated.js +1 -13
  334. package/dist/eslint-plugin/defaults.generated.js.map +1 -1
  335. package/dist/eslint-plugin/index.js +1 -1
  336. package/dist/eslint-plugin/rules/no-redundant-default-prop.js +1 -1
  337. package/dist/i18n/I18nProvider.js +1 -1
  338. package/dist/i18n/createFormatter.js +1 -1
  339. package/dist/i18n/index.js +1 -1
  340. package/dist/i18n/instance.js +1 -1
  341. package/dist/i18n/locales/de-DE/uikit.js +1 -1
  342. package/dist/i18n/locales/en-US/uikit.js +1 -1
  343. package/dist/i18n/locales/es-ES/uikit.js +1 -1
  344. package/dist/i18n/locales/es-MX/uikit.js +1 -1
  345. package/dist/i18n/locales/fr-FR/uikit.js +1 -1
  346. package/dist/i18n/locales/it-IT/uikit.js +1 -1
  347. package/dist/i18n/locales/ja-JP/uikit.js +1 -1
  348. package/dist/i18n/locales/nb-NO/uikit.js +1 -1
  349. package/dist/i18n/locales/pt-BR/uikit.js +1 -1
  350. package/dist/i18n/locales/pt-PT/uikit.js +1 -1
  351. package/dist/i18n/locales/sv-SE/uikit.js +1 -1
  352. package/dist/i18n/locales/vi-VN/uikit.js +1 -1
  353. package/dist/i18n/locales.js +1 -1
  354. package/dist/i18n/useFormatter.js +1 -1
  355. package/dist/i18n/useI18n.js +1 -1
  356. package/dist/icons/AdjustmentsHorizontalIcon.js +1 -1
  357. package/dist/icons/AdjustmentsIcon.js +1 -1
  358. package/dist/icons/AiIcon.js +1 -1
  359. package/dist/icons/AreaChartIcon.js +1 -1
  360. package/dist/icons/ArrowNarrowDownIcon.js +1 -1
  361. package/dist/icons/ArrowNarrowUpIcon.js +1 -1
  362. package/dist/icons/BackwardIcon.js +1 -1
  363. package/dist/icons/BarChartIcon.js +1 -1
  364. package/dist/icons/BellFilledIcon.js +1 -1
  365. package/dist/icons/BellIcon.js +1 -1
  366. package/dist/icons/BooleanIcon.js +1 -1
  367. package/dist/icons/CalendarEditIcon.js +1 -1
  368. package/dist/icons/CalendarIcon.js +1 -1
  369. package/dist/icons/CaretDownIcon.js +1 -1
  370. package/dist/icons/CaretUpIcon.js +1 -1
  371. package/dist/icons/ChartAreaStackedIcon.js +1 -1
  372. package/dist/icons/ChartAreaStackedPercentageIcon.js +1 -1
  373. package/dist/icons/ChartBarGroupedHorizontalIcon.js +1 -1
  374. package/dist/icons/ChartBarGroupedIcon.js +1 -1
  375. package/dist/icons/ChartBarHorizontalIcon.js +1 -1
  376. package/dist/icons/ChartBarLineIcon.js +1 -1
  377. package/dist/icons/ChartBarStackedHorizontalIcon.js +1 -1
  378. package/dist/icons/ChartBarStackedIcon.js +1 -1
  379. package/dist/icons/ChartBarStackedPercentageHorizontalIcon.js +1 -1
  380. package/dist/icons/ChartBarStackedPercentageIcon.js +1 -1
  381. package/dist/icons/ChartBoxPlot2Icon.js +1 -1
  382. package/dist/icons/ChartBoxPlotIcon.js +1 -1
  383. package/dist/icons/ChartBubbleIcon.js +1 -1
  384. package/dist/icons/ChartDonut2Icon.js +1 -1
  385. package/dist/icons/ChartFunnelIcon.js +1 -1
  386. package/dist/icons/ChartHeatmapIcon.js +1 -1
  387. package/dist/icons/ChartKPIIcon.js +1 -1
  388. package/dist/icons/ChartPie2Icon.js +1 -1
  389. package/dist/icons/ChartScatterIcon.js +1 -1
  390. package/dist/icons/CheckCircleFilledIcon.js +1 -1
  391. package/dist/icons/CheckCircleIcon.js +1 -1
  392. package/dist/icons/CheckIcon.js +1 -1
  393. package/dist/icons/CircleFilledIcon.js +1 -1
  394. package/dist/icons/ClearIcon.js +1 -1
  395. package/dist/icons/CloseCircleFilledIcon.js +1 -1
  396. package/dist/icons/CloseCircleIcon.js +1 -1
  397. package/dist/icons/CloseIcon.js +1 -1
  398. package/dist/icons/CodeIcon.js +1 -1
  399. package/dist/icons/ColumnTotalIcon.js +1 -1
  400. package/dist/icons/CopyIcon.js +1 -1
  401. package/dist/icons/CountIcon.js +1 -1
  402. package/dist/icons/CubeIcon.js +1 -1
  403. package/dist/icons/CubePauseIcon.js +1 -1
  404. package/dist/icons/CubePlayIcon.js +1 -1
  405. package/dist/icons/CurrencyDollarIcon.js +1 -1
  406. package/dist/icons/DangerIcon.js +1 -1
  407. package/dist/icons/DashboardIcon.js +1 -1
  408. package/dist/icons/DatabaseIcon.js +1 -1
  409. package/dist/icons/DecimalDecreaseIcon.js +1 -1
  410. package/dist/icons/DecimalIncreaseIcon.js +1 -1
  411. package/dist/icons/DirectionIcon.js +1 -1
  412. package/dist/icons/DonutIcon.js +1 -1
  413. package/dist/icons/DownIcon.js +1 -1
  414. package/dist/icons/EditIcon.js +1 -1
  415. package/dist/icons/ExclamationCircleFilledIcon.js +1 -1
  416. package/dist/icons/ExclamationCircleIcon.js +1 -1
  417. package/dist/icons/ExclamationIcon.js +1 -1
  418. package/dist/icons/EyeIcon.js +1 -1
  419. package/dist/icons/EyeInvisibleIcon.js +1 -1
  420. package/dist/icons/FilterIcon.js +1 -1
  421. package/dist/icons/FolderFilledIcon.js +1 -1
  422. package/dist/icons/FolderIcon.js +1 -1
  423. package/dist/icons/FolderOpenFilledIcon.js +1 -1
  424. package/dist/icons/FolderOpenIcon.js +1 -1
  425. package/dist/icons/ForwardIcon.js +1 -1
  426. package/dist/icons/GripVerticalIcon.js +1 -1
  427. package/dist/icons/HierarchyIcon.js +1 -1
  428. package/dist/icons/HierarchyOpenIcon.js +1 -1
  429. package/dist/icons/Icon.js +1 -1
  430. package/dist/icons/InfoCircleIcon.js +1 -1
  431. package/dist/icons/InfoIcon.js +1 -1
  432. package/dist/icons/KeyIcon.js +1 -1
  433. package/dist/icons/LeftIcon.js +1 -1
  434. package/dist/icons/LineChartIcon.js +1 -1
  435. package/dist/icons/LoadingIcon.js +1 -1
  436. package/dist/icons/LockFilledIcon.js +1 -1
  437. package/dist/icons/LockIcon.js +1 -1
  438. package/dist/icons/MoreIcon.js +1 -1
  439. package/dist/icons/NotAllowedIcon.js +1 -1
  440. package/dist/icons/Number123Icon.js +1 -1
  441. package/dist/icons/NumberIcon.js +1 -1
  442. package/dist/icons/PauseCircleFilledIcon.js +1 -1
  443. package/dist/icons/PauseCircleIcon.js +1 -1
  444. package/dist/icons/PauseIcon.js +1 -1
  445. package/dist/icons/PercentageIcon.js +1 -1
  446. package/dist/icons/PieChartIcon.js +1 -1
  447. package/dist/icons/PipetteIcon.js +1 -1
  448. package/dist/icons/PlayCircleIcon.js +1 -1
  449. package/dist/icons/PlayIcon.js +1 -1
  450. package/dist/icons/PlusIcon.js +1 -1
  451. package/dist/icons/ProgressBarIcon.js +1 -1
  452. package/dist/icons/ReloadIcon.js +1 -1
  453. package/dist/icons/ReportIcon.js +1 -1
  454. package/dist/icons/ReturnIcon.js +1 -1
  455. package/dist/icons/RightIcon.js +1 -1
  456. package/dist/icons/RowTotalsIcon.js +1 -1
  457. package/dist/icons/SchemeIcon.js +1 -1
  458. package/dist/icons/SearchIcon.js +1 -1
  459. package/dist/icons/SemanticQueryIcon.js +1 -1
  460. package/dist/icons/SettingsIcon.js +1 -1
  461. package/dist/icons/ShieldFilledIcon.js +1 -1
  462. package/dist/icons/ShieldIcon.js +1 -1
  463. package/dist/icons/SlashIcon.js +1 -1
  464. package/dist/icons/SparklesIcon.js +1 -1
  465. package/dist/icons/SqlIcon.js +1 -1
  466. package/dist/icons/StatsIcon.js +1 -1
  467. package/dist/icons/StopIcon.js +1 -1
  468. package/dist/icons/StringIcon.js +1 -1
  469. package/dist/icons/SubtotalsIcon.js +1 -1
  470. package/dist/icons/SwitchIcon.js +1 -1
  471. package/dist/icons/TableIcon.js +1 -1
  472. package/dist/icons/ThumbsDownIcon.js +1 -1
  473. package/dist/icons/ThumbsUpIcon.js +1 -1
  474. package/dist/icons/ThunderboltCrossedIcon.js +1 -1
  475. package/dist/icons/ThunderboltFilledIcon.js +1 -1
  476. package/dist/icons/ThunderboltIcon.js +1 -1
  477. package/dist/icons/TimeIcon.js +1 -1
  478. package/dist/icons/TrashIcon.js +1 -1
  479. package/dist/icons/UnlockIcon.js +1 -1
  480. package/dist/icons/UpIcon.js +1 -1
  481. package/dist/icons/UserGroupIcon.js +1 -1
  482. package/dist/icons/UserIcon.js +1 -1
  483. package/dist/icons/UserLockIcon.js +1 -1
  484. package/dist/icons/ViewIcon.js +1 -1
  485. package/dist/icons/WarningFilledIcon.js +1 -1
  486. package/dist/icons/WarningIcon.js +1 -1
  487. package/dist/icons/wrap-icon.js +1 -1
  488. package/dist/index.js +1 -1
  489. package/dist/probe/canonicalize.js +1 -1
  490. package/dist/probe/css.js +1 -1
  491. package/dist/probe/index.js +1 -1
  492. package/dist/provider.js +1 -1
  493. package/dist/providers/TrackingProvider.js +1 -1
  494. package/dist/providers/navigationAdapter.default.js +1 -1
  495. package/dist/tokens/base.js +1 -1
  496. package/dist/tokens/color-seed.js +1 -1
  497. package/dist/tokens/color-theme.js +1 -1
  498. package/dist/tokens/colors.js +1 -1
  499. package/dist/tokens/index.js +1 -1
  500. package/dist/tokens/layout.js +1 -1
  501. package/dist/tokens/lazy-styles.js +1 -1
  502. package/dist/tokens/palette-config.js +1 -1
  503. package/dist/tokens/palette.js +1 -1
  504. package/dist/tokens/shadows.js +1 -1
  505. package/dist/tokens/sizes.js +1 -1
  506. package/dist/tokens/spacing.js +1 -1
  507. package/dist/tokens/typography.js +1 -1
  508. package/dist/utils/ResizeSensor.js +1 -1
  509. package/dist/utils/is-dev-env.js +1 -1
  510. package/dist/utils/modules.js +1 -1
  511. package/dist/utils/promise.js +1 -1
  512. package/dist/utils/raf.js +1 -1
  513. package/dist/utils/random.js +1 -1
  514. package/dist/utils/range.js +1 -1
  515. package/dist/utils/react/RenderCache.js +1 -1
  516. package/dist/utils/react/Slots.js +1 -1
  517. package/dist/utils/react/chain.js +1 -1
  518. package/dist/utils/react/disabledProps.js +1 -1
  519. package/dist/utils/react/forwardRefWithGenerics.js +1 -1
  520. package/dist/utils/react/index.js +1 -1
  521. package/dist/utils/react/interactions.js +1 -1
  522. package/dist/utils/react/isTextOnly.js +1 -1
  523. package/dist/utils/react/mapProps.js +1 -1
  524. package/dist/utils/react/mergeProps.js +1 -1
  525. package/dist/utils/react/nullableValue.js +1 -1
  526. package/dist/utils/react/resolveIcon.js +1 -1
  527. package/dist/utils/react/sharedStore.js +1 -1
  528. package/dist/utils/react/useBufferedValue.js +1 -1
  529. package/dist/utils/react/useCombinedRefs.js +1 -1
  530. package/dist/utils/react/useControlledFocusVisible.js +1 -1
  531. package/dist/utils/react/useEventBus.js +1 -1
  532. package/dist/utils/react/useId.js +1 -1
  533. package/dist/utils/react/useIsDarwin.js +1 -1
  534. package/dist/utils/react/useKeySymbols.js +1 -1
  535. package/dist/utils/react/useLayoutEffect.js +1 -1
  536. package/dist/utils/react/useLocalStorage.js +1 -1
  537. package/dist/utils/react/useMergeStyles.js +1 -1
  538. package/dist/utils/react/usePopoverSync.js +1 -1
  539. package/dist/utils/react/useQaProps.js +1 -1
  540. package/dist/utils/react/useViewportSize.js +1 -1
  541. package/dist/utils/react/wrapNodeIfPlain.js +1 -1
  542. package/dist/utils/selection.js +1 -1
  543. package/dist/utils/styles.js +1 -1
  544. package/dist/utils/tree.js +1 -1
  545. package/dist/utils/warnings.js +1 -1
  546. package/dist/version.js +3 -3
  547. package/docs/Colors.md +40 -16
  548. package/docs/ComplexLayout.md +0 -8
  549. package/docs/CreateComponent.md +8 -15
  550. package/docs/Introduction.md +36 -15
  551. package/docs/RenderCache.md +6 -8
  552. package/docs/Theming.md +497 -164
  553. package/docs/Usage.md +138 -108
  554. package/docs/Utilities.md +2 -2
  555. package/docs/components/CollectionItem.md +0 -1
  556. package/docs/components/actions/Banner.md +0 -1
  557. package/docs/components/actions/Button.md +36 -8
  558. package/docs/components/actions/ButtonSplit.md +0 -2
  559. package/docs/components/actions/CommandMenu.md +8 -8
  560. package/docs/components/actions/ItemButton.md +20 -6
  561. package/docs/components/actions/Link.md +5 -10
  562. package/docs/components/actions/Menu.md +11 -24
  563. package/docs/components/actions/MenuTrigger.md +12 -3
  564. package/docs/components/actions/use-anchored-menu.md +2 -2
  565. package/docs/components/actions/use-context-menu.md +2 -5
  566. package/docs/components/content/Badge.md +0 -3
  567. package/docs/components/content/HotKeys.md +14 -21
  568. package/docs/components/content/InlineInput.md +14 -14
  569. package/docs/components/content/Item.md +17 -25
  570. package/docs/components/content/ItemCard.md +0 -1
  571. package/docs/components/content/Layout.md +1 -12
  572. package/docs/components/content/PrismCode.md +18 -13
  573. package/docs/components/content/Tag.md +1 -1
  574. package/docs/components/content/TextItem.md +3 -5
  575. package/docs/components/content/Tree.md +154 -69
  576. package/docs/components/data/DataTable.md +168 -56
  577. package/docs/components/data/ItemTable.md +485 -182
  578. package/docs/components/fields/Checkbox.md +0 -2
  579. package/docs/components/fields/ColorInput.md +79 -38
  580. package/docs/components/fields/ColorPicker.md +39 -17
  581. package/docs/components/fields/ColorSwatch.md +30 -11
  582. package/docs/components/fields/ColorSwatchGroup.md +42 -18
  583. package/docs/components/fields/ComboBox.md +1 -13
  584. package/docs/components/fields/CommandTextArea.md +37 -10
  585. package/docs/components/fields/DatePicker.md +0 -3
  586. package/docs/components/fields/FileInput.md +0 -3
  587. package/docs/components/fields/FilterListBox.md +14 -34
  588. package/docs/components/fields/FilterPicker.md +16 -33
  589. package/docs/components/fields/HueSlider.md +5 -5
  590. package/docs/components/fields/ListBox.md +9 -35
  591. package/docs/components/fields/NumberInput.md +0 -3
  592. package/docs/components/fields/PasswordInput.md +0 -3
  593. package/docs/components/fields/PeriodPicker.md +17 -7
  594. package/docs/components/fields/Picker.md +29 -54
  595. package/docs/components/fields/RadioGroup.md +5 -13
  596. package/docs/components/fields/SearchComboBox.md +0 -3
  597. package/docs/components/fields/SearchInput.md +2 -4
  598. package/docs/components/fields/Select.md +13 -23
  599. package/docs/components/fields/Switch.md +0 -3
  600. package/docs/components/fields/TextInput.md +0 -3
  601. package/docs/components/fields/TextInputMapper.md +2 -1
  602. package/docs/components/form/Field.md +2 -5
  603. package/docs/components/form/Form.md +0 -5
  604. package/docs/components/form/FormInstance.md +1 -1
  605. package/docs/components/helpers/DisplayTransition.md +6 -10
  606. package/docs/components/helpers/IconSwitch.md +0 -1
  607. package/docs/components/layout/Board.md +190 -50
  608. package/docs/components/navigation/Pagination.md +75 -36
  609. package/docs/components/navigation/Tabs.md +15 -3
  610. package/docs/components/other/Calendar.md +39 -22
  611. package/docs/components/other/CubeLogo.md +1 -1
  612. package/docs/components/overlays/Dialog.md +0 -3
  613. package/docs/components/overlays/DialogContainer.md +0 -2
  614. package/docs/components/overlays/DialogForm.md +2 -6
  615. package/docs/components/overlays/DialogTrigger.md +2 -4
  616. package/docs/components/overlays/Notifications.md +0 -7
  617. package/docs/components/overlays/Toast.md +8 -12
  618. package/docs/components/overlays/Tooltip.md +12 -6
  619. package/docs/components/overlays/UseDialogContainer.md +10 -16
  620. package/docs/components/status/LoadingAnimation.md +9 -3
  621. package/docs/tasty/configuration.md +0 -127
  622. package/docs/tasty/injector.md +0 -11
  623. package/package.json +4 -4
  624. package/dist/components/fields/ListBoxPopover/useCompositeFocus.d.ts +0 -2
  625. package/dist/components/portal/PortalProvider.d.ts +0 -2
@@ -1,18 +1,27 @@
1
1
  # ItemTable
2
2
 
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.
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.
4
6
 
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.
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.
6
10
 
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).
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).
8
14
 
9
15
  ## When to Use
10
16
 
11
17
  - Listing entities the user acts on: deployments, users, API keys, roles.
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.
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.
14
22
 
15
- Use `DataTable` instead when a _cell_ is the unit of interest — query results, pivots, totals. Use `ListBox` when there is only one column.
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.
16
25
 
17
26
  ## Component
18
27
 
@@ -22,102 +31,197 @@ Use `DataTable` instead when a _cell_ is the unit of interest — query results,
22
31
  - **`columns`** `CubeItemTableColumn<T>[]` — Column definitions. See below.
23
32
  - **`rowKey`** `string` (default: `'id'`) — Property used as the row key.
24
33
  - **`getRowKey`** `(row: T, index: number) => Key` — Wins over `rowKey`.
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.
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.
27
38
  - **`expandedKeys`** `Key[]` — Controlled expanded rows.
28
39
  - **`defaultExpandedKeys`** `Key[]` — Initially expanded rows. Defaults to none.
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.
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.
36
58
  - **`error`** `ReactNode` — Takes precedence over both labels.
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.
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.
40
66
  - **`headerHeight`** `number` — Header height in px, excluding its 1px border.
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.
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.
42
70
  - **`isRowMoveAnimated`** `boolean` (default: `true`) — Slide rows to their new positions when the order changes, instead of teleporting them. Respects `prefers-reduced-motion`.
43
71
  - **`isStriped`** `boolean` (default: `false`) — Alternating row background.
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'`.
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'`.
49
84
  - **`defaultSort`** `CubeTableSort | null` — Initial sort for uncontrolled usage.
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.
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.
54
94
  - **`searchPlaceholder`** `string` — Placeholder for the search input.
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.
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.
56
98
  - **`defaultSearchValue`** `string` — Initial term for uncontrolled usage.
57
99
  - **`onSearchChange`** `(value: string) => void` — Debounced.
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.
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.
60
104
  - **`filters`** `ReactNode` — Left group, after the search input.
61
105
  - **`actions`** `ReactNode` — Right group. Arbitrary JSX.
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".
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".
68
122
  - **`defaultSelectedKeys`** `Key[] | 'all'` — Initial selection.
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.
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.
73
131
  - **`disabledKeys`** `Key[]` — Rows that cannot be interacted with at all.
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.
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.
83
155
  - **`bulkBarStyles`** `Styles` — Styles for the bar.
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.
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.
85
159
  - **`pageSize`** `number` — Controlled page size.
86
160
  - **`defaultPageSize`** `number` (default: `50`) — Initial page size.
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.
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.
89
165
  - **`page`** `number` — Controlled 1-based page.
90
166
  - **`defaultPage`** `number` (default: `1`) — Initial page.
91
167
  - **`onPageChange`** `(page: number) => void` — Fires with the clamped page.
92
- - **`onLoadMore`** `() => void` — `paginationMode="infinite"` only. Fires once the end of the list comes into view.
168
+ - **`onLoadMore`** `() => void` — `paginationMode="infinite"` only. Fires once
169
+ the end of the list comes into view.
93
170
  - **`hasMore`** `boolean` — Whether there is anything left to fetch.
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.
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.
97
179
  - **`total`** `number` — Server mode: total row count behind the query.
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".
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".
101
186
  - **`footer`** `ReactNode` — Replaces the entire footer row.
102
- - **`footerStart`** `ReactNode` — Start footer slot. Renders even with `paginationMode="off"` — this is where a "Load all results" button belongs.
187
+ - **`footerStart`** `ReactNode` — Start footer slot. Renders even with
188
+ `paginationMode="off"` — this is where a "Load all results" button belongs.
103
189
  - **`footerCenter`** `ReactNode` — Center footer slot.
104
190
  - **`footerEnd`** `ReactNode` — End footer slot, before the pagination control.
105
191
  - **`footerStyles`** `Styles` — Styles for the footer row.
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`.
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`.
111
204
  - **`columnWidths`** `Record<string, number>` — Controlled widths by column key.
112
205
  - **`defaultColumnWidths`** `Record<string, number>` — Initial widths.
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.
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.
116
214
  - **`columnMenuTriggerProps`** `Record<string, any>` — Props for the `⋮` trigger.
117
215
  - **`columnMenuProps`** `Record<string, any>` — Props for the `Menu`.
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.
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.
121
225
  - **`ariaLabel`** `string` — Labels the grid.
122
226
  - **`isChecked`** `boolean` — Base checked-state modifier.
123
227
  - **`place`** `string` — Tasty placement shorthand on the root frame.
@@ -156,11 +260,16 @@ interface CubeItemTableColumn<T> {
156
260
  }
157
261
  ```
158
262
 
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]"`.
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]"`.
160
268
 
161
269
  #### `CubeTableColumnHeader`
162
270
 
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:
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:
164
273
 
165
274
  ```jsx
166
275
  {
@@ -178,7 +287,11 @@ Every slot maps 1:1 onto the `Item` rendered inside the header cell, so a header
178
287
 
179
288
  `header.render(ctx)` takes over the cell's content entirely.
180
289
 
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`.
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`.
182
295
 
183
296
  ### Base Properties
184
297
 
@@ -188,7 +301,8 @@ Supports Base Properties.
188
301
 
189
302
  #### styles
190
303
 
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.
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.
192
306
 
193
307
  **Sub-elements:**
194
308
 
@@ -196,7 +310,8 @@ Customizes the root frame. Every internal part of the table is a **sub-element**
196
310
  - `Table` — the `<table>`
197
311
  - `Head`, `HeadRow`, `HeaderCell` — the column header
198
312
  - `Body`, `Row`, `Cell` — the data rows
199
- - `TreeContent`, `TreeToggle`, `TreeValue` — indentation, disclosure/leaf placeholder, and the consumer-rendered value in the tree column
313
+ - `TreeContent`, `TreeToggle`, `TreeValue` — indentation, disclosure/leaf
314
+ placeholder, and the consumer-rendered value in the tree column
200
315
  - `SortIndicator` — the sort arrow, inside the header `Item`'s suffix
201
316
  - `Foot`, `FootRow`, `FootCell` — pinned totals
202
317
  - `StateContent` — the empty / no-results / error content
@@ -210,13 +325,20 @@ const Compact = tasty(ItemTable, {
210
325
  });
211
326
  ```
212
327
 
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.
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.
214
332
 
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.
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.
216
337
 
217
338
  #### toolbarStyles
218
339
 
219
- The toolbar row. Sub-elements: `Start` (search + filters) and `End` (actions + refresh).
340
+ The toolbar row. Sub-elements: `Start` (search + filters) and `End` (actions +
341
+ refresh).
220
342
 
221
343
  #### searchStyles
222
344
 
@@ -224,11 +346,13 @@ The built-in search input.
224
346
 
225
347
  #### headerStyles
226
348
 
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.)
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.)
228
351
 
229
352
  #### headerCellStyles
230
353
 
231
- Every column header cell. Wins over `headerPreset`, so this is where you go for anything the preset does not cover.
354
+ Every column header cell. Wins over `headerPreset`, so this is where you go for
355
+ anything the preset does not cover.
232
356
 
233
357
  #### bodyStyles
234
358
 
@@ -253,17 +377,21 @@ These properties allow direct style application without using the `styles` prop:
253
377
  - **Color:** `color`, `fill`, `fade`, `image`
254
378
  - **Flow:** `flow`, `gap`, `columnGap`, `rowGap`, `placeItems`, `placeContent`, `alignItems`, `alignContent`, `justifyItems`, `justifyContent`, `align`, `justify`, `gridColumns`, `gridRows`, `gridTemplate`, `gridAreas`
255
379
 
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.
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.
257
383
 
258
384
  ### Modifiers
259
385
 
260
- | Modifier | Type | Description |
261
- | --------------- | ------------------- | ---------------- |
262
- | `size` | `SizeName` | Row height scale |
263
- | `shape` | `'plain' \| 'card'` | Frame treatment |
264
- | `sticky-header` | `boolean` | Header is pinned |
386
+ | Modifier | Type | Description |
387
+ | -------- | ---- | ----------- |
388
+ | `size` | `SizeName` | Row height scale |
389
+ | `shape` | `'plain' \| 'card'` | Frame treatment |
390
+ | `sticky-header` | `boolean` | Header is pinned |
265
391
 
266
- Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`, `disabled`, `drop-target`, `placeholder`. Cell-level: `pin`, `pin-edge`, `align`, `wrap`, `state`.
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`.
267
395
 
268
396
  ## Examples
269
397
 
@@ -285,7 +413,8 @@ Row-level modifiers, set on each `<tr>`: `odd`, `selected`, `focused`, `dimmed`,
285
413
 
286
414
  ### Tree Rows
287
415
 
288
- Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep their original objects; keys must be unique across the complete hierarchy.
416
+ Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep their
417
+ original objects; keys must be unique across the complete hierarchy.
289
418
 
290
419
  ```jsx
291
420
  <ItemTable
@@ -298,11 +427,22 @@ Supplying `getRowChildren` changes the root to `role="treegrid"`. Rows keep thei
298
427
  />
299
428
  ```
300
429
 
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.
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.
302
436
 
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.
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.
304
442
 
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.
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.
306
446
 
307
447
  ### Custom Cells
308
448
 
@@ -317,15 +457,21 @@ Tree mode ignores `isReorderable`, because a flat reordered array cannot encode
317
457
 
318
458
  ### Appearance
319
459
 
320
- `shape="card"` frames the table, `isStriped` bands the rows, `size` drives both row and header height, and `isHeaderHidden` drops the header row.
460
+ `shape="card"` frames the table, `isStriped` bands the rows, `size` drives both
461
+ row and header height, and `isHeaderHidden` drops the header row.
321
462
 
322
463
  ### Empty, No-results and Error States
323
464
 
324
- `isFiltered` is what separates "no matches" from "nothing exists"; the built-in search sets it for you.
465
+ `isFiltered` is what separates "no matches" from "nothing exists"; the built-in
466
+ search sets it for you.
325
467
 
326
468
  ### Sorting
327
469
 
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`.
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`.
329
475
 
330
476
  ```jsx
331
477
  <ItemTable
@@ -341,7 +487,10 @@ Sorting is **opt in, per column**: a table with no `isSortable` column has inert
341
487
 
342
488
  #### A fixed order the user cannot change
343
489
 
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:
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:
345
494
 
346
495
  ```jsx
347
496
  <ItemTable
@@ -352,13 +501,21 @@ For a list that arrives in a meaningful order — most of them — leave every c
352
501
  />
353
502
  ```
354
503
 
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.
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.
356
508
 
357
509
  Data already in the right order needs none of this: pass it and set nothing.
358
510
 
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.
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.
360
515
 
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:
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:
362
519
 
363
520
  ```jsx
364
521
  <ItemTable
@@ -385,17 +542,30 @@ Client-side sorting compares raw `getValue` results — numerically for numbers,
385
542
  />
386
543
  ```
387
544
 
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`.
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`.
389
552
 
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.
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.
391
556
 
392
557
  ### Server-side Search
393
558
 
394
- `searchMode="server"` never filters — it reports the debounced term and the query does the work.
559
+ `searchMode="server"` never filters — it reports the debounced term and the
560
+ query does the work.
395
561
 
396
562
  ### An External Search Box, and a Custom Toolbar
397
563
 
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.
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.
399
569
 
400
570
  ```jsx
401
571
  const [term, setTerm] = useState('');
@@ -406,21 +576,34 @@ const [term, setTerm] = useState('');
406
576
 
407
577
  ### Pagination
408
578
 
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.
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.
410
582
 
411
583
  ```jsx
412
584
  <ItemTable data={rows} columns={columns} defaultPageSize={20} pageSizeOptions={[20, 50, 100]} />
413
585
  ```
414
586
 
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.
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.
416
591
 
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.
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.
418
598
 
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.
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.
420
602
 
421
603
  ### Infinite Scroll
422
604
 
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:
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:
424
607
 
425
608
  ```jsx
426
609
  <ItemTable
@@ -434,19 +617,42 @@ Note that pagination and virtualization are alternatives: a 50-row page is well
434
617
  />
435
618
  ```
436
619
 
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.
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.
446
649
 
447
650
  ### Footer Slots
448
651
 
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.
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.
450
656
 
451
657
  ```jsx
452
658
  <ItemTable
@@ -459,7 +665,8 @@ The footer has three named slots, and they render whether or not pagination is o
459
665
 
460
666
  ### Server-side Pagination
461
667
 
462
- `paginationMode="server"` never slices — it reflects `page` and reports changes, and `total` comes from the query. `data` is the current page.
668
+ `paginationMode="server"` never slices — it reflects `page` and reports changes,
669
+ and `total` comes from the query. `data` is the current page.
463
670
 
464
671
  ```jsx
465
672
  <ItemTable
@@ -477,7 +684,8 @@ The footer has three named slots, and they render whether or not pagination is o
477
684
 
478
685
  ### Loading Behaviour
479
686
 
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:
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:
481
689
 
482
690
  | Value | Behaviour |
483
691
  | --- | --- |
@@ -485,11 +693,15 @@ The footer has three named slots, and they render whether or not pagination is o
485
693
  | `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. |
486
694
  | `none` | No visuals beyond `aria-busy`. For pages that already show a top-level progress bar and do not want a second indicator. |
487
695
 
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.
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.
489
699
 
490
700
  ### Bounded Height, Sticky Header and Pinned Columns
491
701
 
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.
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.
493
705
 
494
706
  ```jsx
495
707
  <ItemTable
@@ -505,9 +717,14 @@ A bounded height turns the body into a scroller and pins the header. Pinned colu
505
717
 
506
718
  ### Virtualization
507
719
 
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.
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.
509
724
 
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.
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.
511
728
 
512
729
  ```jsx
513
730
  <ItemTable data={recentRows} columns={columns} paginationMode="off" isAutoHeight />
@@ -517,15 +734,26 @@ For a compact list in normal page flow, set `isAutoHeight`. Its frame then ends
517
734
  <ItemTable height="420px" paginationMode="off" data={tenThousandRows} columns={columns} />
518
735
  ```
519
736
 
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.
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.
521
743
 
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.
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.
523
748
 
524
- Virtualization is skipped for the empty, error and loading states, and turns off entirely with `isVirtualized={false}`.
749
+ Virtualization is skipped for the empty, error and loading states, and turns off
750
+ entirely with `isVirtualized={false}`.
525
751
 
526
752
  ### Wrapping Cells
527
753
 
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.
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.
529
757
 
530
758
  ### Selection
531
759
 
@@ -543,9 +771,13 @@ const [keys, setKeys] = useState([]);
543
771
  />
544
772
  ```
545
773
 
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.
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.
547
777
 
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.
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.
549
781
 
550
782
  #### Three ways a row can be special
551
783
 
@@ -557,21 +789,30 @@ Deliberately distinct, and not interchangeable:
557
789
  | `isRowSelectable` | yes | yes | no |
558
790
  | `getRowProps().isDimmed` | yes | yes | **yes** — it is purely visual |
559
791
 
560
- `selectionTooltip` explains an inert checkbox, which is the difference between "this is broken" and "this row is still deploying".
792
+ `selectionTooltip` explains an inert checkbox, which is the difference between
793
+ "this is broken" and "this row is still deploying".
561
794
 
562
795
  #### What select-all reaches
563
796
 
564
797
  `selectAllMode` decides the scope of the header checkbox:
565
798
 
566
799
  - **`'page'`** (default) — the rows on the current page.
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.
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.
571
811
 
572
812
  ### Row Links and Row Actions
573
813
 
574
- `rowLink` turns the row-header cell into a stretched anchor covering the whole row:
814
+ `rowLink` turns the row-header cell into a stretched anchor covering the whole
815
+ row:
575
816
 
576
817
  ```jsx
577
818
  <ItemTable
@@ -581,15 +822,24 @@ Unselectable rows are excluded from every scope. Pressing the header checkbox wh
581
822
  />
582
823
  ```
583
824
 
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".
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".
585
830
 
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.
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.
587
834
 
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.
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.
589
837
 
590
838
  ### Row Menu
591
839
 
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.
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.
593
843
 
594
844
  ```jsx
595
845
  <ItemTable
@@ -606,17 +856,19 @@ The row-header cell is styled as a link — `#purple-text` at weight 600, matchi
606
856
  />
607
857
  ```
608
858
 
609
- | `rowContextMenu` | `⋮` column | Right-click / Shift+F10 |
610
- | ----------------- | ---------- | ----------------------- |
611
- | `false` (default) | no | no |
612
- | `true` | yes | yes |
613
- | `'context-only'` | no | yes |
859
+ | `rowContextMenu` | `⋮` column | Right-click / Shift+F10 |
860
+ | --- | --- | --- |
861
+ | `false` (default) | no | no |
862
+ | `true` | yes | yes |
863
+ | `'context-only'` | no | yes |
614
864
 
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.
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.
616
867
 
617
868
  ### Bulk Actions
618
869
 
619
- `bulkActions` implies `selectionMode="multiple"` — a bulk action with no way to select rows is a contradiction, not a configuration.
870
+ `bulkActions` implies `selectionMode="multiple"` — a bulk action with no way to
871
+ select rows is a contradiction, not a configuration.
620
872
 
621
873
  ```jsx
622
874
  <ItemTable
@@ -643,13 +895,22 @@ A row whose resolver returns `null` gets no trigger, and right-clicking it falls
643
895
  />
644
896
  ```
645
897
 
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.
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.
647
902
 
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.
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.
649
908
 
650
909
  **Escape** clears the selection from anywhere inside the table.
651
910
 
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.
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.
653
914
 
654
915
  ### Reordering Rows
655
916
 
@@ -664,15 +925,22 @@ Each action drives its own spinner through `setLoading`, so one slow request doe
664
925
  />
665
926
  ```
666
927
 
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.
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.
668
931
 
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.
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.
670
936
 
671
- `onReorder` reports the whole key order rather than just the moved row, so the result can be persisted without reconstructing it.
937
+ `onReorder` reports the whole key order rather than just the moved row, so the
938
+ result can be persisted without reconstructing it.
672
939
 
673
940
  ### Dropping Rows onto a Row
674
941
 
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:
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:
676
944
 
677
945
  ```jsx
678
946
  <ItemTable
@@ -686,11 +954,21 @@ Some tables move rows _into_ other rows rather than around them — a workbook i
686
954
  />
687
955
  ```
688
956
 
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.
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.
690
960
 
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.
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.
692
965
 
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`.
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`.
694
972
 
695
973
  ### Column Resize
696
974
 
@@ -700,25 +978,36 @@ They do compose if you need it — set `isReorderable` as well and a row that re
700
978
  <ItemTable isResizable storageKey="deployments" data={rows} columns={columns} />
701
979
  ```
702
980
 
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`.
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`.
704
986
 
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.
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.
706
990
 
707
991
  ### Persisting State
708
992
 
709
- `storageKey` remembers the parts of the table's state a user expects to survive a reload:
993
+ `storageKey` remembers the parts of the table's state a user expects to survive
994
+ a reload:
710
995
 
711
996
  ```jsx
712
997
  <ItemTable data={rows} columns={columns} storageKey="deployments" />
713
998
  ```
714
999
 
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:
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:
716
1004
 
717
1005
  ```jsx
718
1006
  <ItemTable storageKey="deployments" persist={['pageSize', 'sort']} data={rows} columns={columns} />
719
1007
  ```
720
1008
 
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.
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.
722
1011
 
723
1012
  ### Per-row Visuals
724
1013
 
@@ -735,32 +1024,46 @@ Reads and writes are best-effort: private mode, a disabled store, a quota error
735
1024
  ### Screen Reader Support
736
1025
 
737
1026
  - The `<table>` carries `role="grid"` with `aria-rowcount` and `aria-colcount`.
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.
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.
740
1032
  - `aria-sort` is set on the sorted header only, never `"none"` on the rest.
741
- - `aria-busy` is set while loading; skeleton rows keep the full cell structure so nothing shifts when the data lands.
1033
+ - `aria-busy` is set while loading; skeleton rows keep the full cell structure so
1034
+ nothing shifts when the data lands.
742
1035
 
743
1036
  ### ARIA Properties
744
1037
 
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 |
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 |
753
1046
 
754
1047
  ## Best Practices
755
1048
 
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.
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.
764
1067
 
765
1068
  ## Suggested Improvements
766
1069