Text without an explicit text style follows the cell’s density font size, so muted and truncate can be used alongside plain cell text. Use textStyle to opt into a specific text style.
radius accepts the keys of your radii group and styles the table frame.
sortable on Table.HeaderCell manages aria-sort state and accessible sort triggers.
Table.SelectAllCell and Table.SelectionCell provide accessible row selection checkboxes.
Table.VirtualBody renders a window of rows around the viewport. Choose measured heights for wrapped content or an explicit fixed height when every row is equal.
align="end" also uses tabular numbers, so amounts line up.
caption is visible and names the table for screen readers.
estimateRowHeight is a positive initial estimate in CSS pixels. ResizeObserver replaces it with each rendered row’s actual height. Unvisited rows retain their estimate, so the scrollbar becomes more accurate as you scroll. Choose an estimate close to a typical row to reduce adjustments.
getItemKey is required in measured mode. Return a unique, stable ID that follows the item through sorting and filtering. An array index is unsuitable for mutable order. Measurements are cached by this key, refreshed when visible content resizes, and invalidated when table width, density or theme changes. The first visible item remains the scroll anchor when earlier rows are remeasured. The focused row and its immediate neighbors stay mounted so Tab and Shift+Tab can continue across virtual windows. The sticky table wrapper can receive keyboard focus; use PageDown to scroll, Home for the first row and End for the last row.
Render exactly one Table.Row or native tr per item. A custom row component must spread its props onto its tr. Row and body refs remain available. Keep column widths stable, for example with tableLayout: 'fixed' or a colgroup, so different windows do not continually change text wrapping.
For fixed mode, pass rowHeight instead of estimateRowHeight. Rows must all render at that height, including their padding and borders. Both modes reject duplicate item keys. Update it if density or content changes the height:
overscan is a nonnegative integer. Both modes use the table wrapper as their scroll container. Pass scrollRef when an ancestor handles scrolling; captions and content before the table are accounted for in the offsets. Use Table.Body when every row must be present for printing, browser find or assistive technology traversal.
Configure root, header, row and cell through component parts. The root is the scrollable frame; header cells expose data-part="header", body cells expose "cell", and compound rows expose "row". Use wrapClassName to scope application CSS to a table frame.
Add typed column widths, pointer and keyboard resize handles, and visibility checkboxes with useTableColumns, Table.Columns and Table.ColumnVisibility. They work with sorting, selection, sticky headers and both virtualization modes. See the complete table columns guide.