Aliases
data table
TableData table with sorting, selection, and sticky headers.
| Apollo | Nina | Ready | Apr 16 | |
| Linen | Mara | Blocked | Apr 22 | |
| Zephyr | Rafi | Queued | Apr 18 |
Table uses row and column semantics. Horizontal scrolling preserves columns on narrow screens.Aliases
data table
Foundations
Layout and composition,Contrast and distinctness,Proof system
Table for structured rows and columns where scanning, sorting, and selection matter.Table for fully editable grids or spreadsheet-like workflows.scroll container
shell Horizontal overflow shell for narrow viewports.
table header row
header Column labels and sort controls.
data row
row Single record in the table body.
data cell
cell Single value within a row.
optional checkbox column
selection Select-all and row-selection controls.
| Name | Type | Default | Description |
|---|---|---|---|
columns | TableColumn[] | — | Column definitions including label, alignment, and sortability. |
rows | TableRow[] | — | Data rows, each with a stable id. |
caption | string | — | Visible caption describing the table. |
description | string | — | Optional supporting description for the table context. |
size | 'sm' | 'md' | 'md' | Chooses the table density recipe. |
selectable | boolean | false | Shows row selection controls. |
sortable | boolean | false | Enables sortable headers. |
stickyHeader | boolean | false | Pins the header inside the scroll shell. |
sortBy | string | — | Controlled active sort column key. |
sortDirection | 'asc' | 'desc' | 'asc' | Controlled sort direction. |
selectedRowIds | string[] | — | Controlled selected row IDs. |
emptyTitle | string | 'No rows' | Heading for the empty state inside the table shell. |
emptyDescription | string | '' | Supporting empty-state copy. |
onSortChange | (detail: { sortBy: string; sortDirection: "asc" | "desc" }) => void | — | Runs when sorting changes. |
onSelectionChange | (detail: { ids: string[] }) => void | — | Runs when row selection changes. |
theme | ThemeContract | — | Sets the theme used to resolve component styles. |
| Name | Payload | Description |
|---|---|---|
sortchange | { sortBy: string; sortDirection: "asc" | "desc" } | Fires when sorting changes. |
selectionchange | { ids: string[] } | Fires when row selection changes. |
| Name | Description |
|---|---|
default | Table is data-driven and does not expose cell or row slots. |
Variants
sortable: Columns expose sort controlsselectable: Rows expose selection controlssticky: Header remains visible in the shellSizes
sm: Dense data tablemd: Default table densityStates
sorted: Active sort appliedselected: Row selectedempty: No rows availablesticky: Header pinned in scroll shellSemantics
aria-sort for sortable headers.Keyboard
Screen readers
Checklist
Implementation notes
Table does not provide cell editing.A standard product data table with sortable headers.
<Table caption="Release schedule" columns={releaseColumns} rows={releaseRows} sortable={true} stickyHeader={true} /> Select rows for bulk actions.
<Table caption="Launch support roster" columns={teamColumns} rows={teamRows} selectable={true} sortable={true} selectedRowIds={['team-a', 'team-c']} /> Provide guidance when users can resolve the empty condition.
<Table caption="Incidents" columns={teamColumns} rows={[]} emptyTitle="No incidents open" emptyDescription="No incidents require action." /> Calculated fixtures; browser evidence is not collected. Layout estimates use declared text behavior and maximum token values.
size=md
size=sm
size=md