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