Data Table

The Data Table component allows for easy display of tabular data with options for sorting and row interaction.

Usage & Examples

Default

Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
default.tsx
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

Visual variants

Themes

primary
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
secondary
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
tertiary
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
quaternary
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass

States

success
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
warning
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
error
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
info
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass

Variants

solid
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
outline
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
glass
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass

Rounding

none
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
medium
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
large
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass

Shadows

none
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
light
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
strong
Data table
Status
1Alice91Pass
2Bob75Pass
3Charlie58Fail
4Dana84Pass
visual-variants.tsx
// Themes
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable theme="primary"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable theme="secondary"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable theme="tertiary"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable theme="quaternary"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

// States
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable state="success"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable state="warning"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable state="error"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable state="info"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

// Variants
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable variant="solid"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable variant="outline"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable variant="glass"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

// Rounding
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable rounding="none"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable rounding="medium"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable rounding="large"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

// Shadows
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable shadow="none"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable shadow="light"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable shadow="strong"
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

Interaction states

Loading
Loading data
Data table
Status
Loading data
interaction-states.tsx
// Loading
 const sampleData = [
      { id: 1, name: "Alice", score: 91, passed: true },
      { id: 2, name: "Bob", score: 75, passed: true },
      { id: 3, name: "Charlie", score: 58, passed: false },
      { id: 4, name: "Dana", score: 84, passed: true },
    ];
  
    <DataTable loading
              data={sampleData}
              columns={[
                { key: "id", label: "ID", sortable: true },
                { key: "name", label: "Name", sortable: true },
                { key: "score", label: "Score", sortable: true },
                {
                  key: "passed",
                  label: "Status",
                  sortable: false,
                  render: (value: unknown) => (value ? "Pass" : "Fail"),
                },
              ]}
              theme="primary"
              striped={true}
            />

Props API

89 props
Columns
Data Table props API
Default
Description
aria-describedbystringNoaria—Accessible description reference for the table. Useful for tying helper or instructional text to the table.
aria-labelstringNoaria—Accessible label for screen readers. Use this when there is no visible caption or heading tied to the table.
aria-labelledbystringNoaria—Accessible labelledby reference for the table. Prefer this when a visible heading already labels the table.
bulkActions((selectedKeys: Array<string | number>, selectedRows: T[]) => ReactNode)Noevents—Optional actions shown only when one or more rows are selected.
bulkToolbarClassNamestringNoprops—Optional class name for the bulk action toolbar.
captionstringNoprops"Data table"Optional visible or screen-reader-only caption text for the table. A table caption is the preferred built-in table label.
cellClassName((value: unknown, row: T, column: Column<T>, rowIndex: number) => string)Noevents—Optional dynamic class name for each cell.
classNamestringNostyling—Optional class name for the table wrapper.
colCountnumberNoprops—Total column count override. Helpful when rendering dynamic or grouped columns in advanced cases.
columnMenuClassNamestringNoprops—Optional class name for the column visibility menu.
columnOrder(keyof T)[]Noprops—Controlled column order.
columnPinningbooleanNopropsfalseEnables column pin/unpin controls.