Table components

FREE

Free and open-source React table components built for modern applications and websites. These tables are built using React Aria and styled with Tailwind CSS.

Team members

100 users
Name
Status
Role
Email address
Teams
Olivia Rhye

Olivia Rhye

@olivia

ActiveProduct Designerolivia@untitledui.com
DesignProductMarketing+4
Phoenix Baker

Phoenix Baker

@phoenix

ActiveProduct Managerphoenix@untitledui.com
DesignProductMarketing+4
Lana Steiner

Lana Steiner

@lana

ActiveFrontend Developerlana@untitledui.com
DesignProductMarketing+2
Demi Wilkinson

Demi Wilkinson

@demi

ActiveBackend Developerdemi@untitledui.com
DesignProductMarketing+1
Candice Wu

Candice Wu

@candice

ActiveFullstack Developercandice@untitledui.com
DesignProductMarketing+2
Natali Craig

Natali Craig

@natali

ActiveUX Designernatali@untitledui.com
DesignProductMarketing+2
Drew Cano

Drew Cano

@drew

ActiveUX Copywriterdrew@untitledui.com
DesignProductMarketing+4
Orlando Diggs

Orlando Diggs

@orlando

ActiveUI Designerorlando@untitledui.com
DesignProductMarketing+4
Andi Lane

Andi Lane

@andi

ActiveProduct Managerandi@untitledui.com
DesignProductMarketing+4
Kate Morrison

Kate Morrison

@kate

ActiveQA Engineerkate@untitledui.com
DesignProductMarketing+2

Installation

You can add this table component using our CLI or manually:

npx untitledui@latest add table

Sizes

Our table components come in 2 sizes: sm and md. You can easily switch between them by changing the size prop either on the TableCard.Root or on the Table component.

<TableCard.Root size="sm">
    {/* rest of the table components */}
</TableCard.Root>
<Table size="sm">
    {/* rest of the table components */}
</Table>

Team members

100 users
Name
Status
Role
Email address
Teams
Olivia Rhye

Olivia Rhye

ActiveProduct Designerolivia@untitledui.com
DesignProductMarketing+4
Phoenix Baker

Phoenix Baker

ActiveProduct Managerphoenix@untitledui.com
DesignProductMarketing+4
Lana Steiner

Lana Steiner

ActiveFrontend Developerlana@untitledui.com
DesignProductMarketing+2
Demi Wilkinson

Demi Wilkinson

ActiveBackend Developerdemi@untitledui.com
DesignProductMarketing+1
Candice Wu

Candice Wu

ActiveFullstack Developercandice@untitledui.com
DesignProductMarketing+2
Natali Craig

Natali Craig

ActiveUX Designernatali@untitledui.com
DesignProductMarketing+2
Drew Cano

Drew Cano

ActiveUX Copywriterdrew@untitledui.com
DesignProductMarketing+4
Orlando Diggs

Orlando Diggs

ActiveUI Designerorlando@untitledui.com
DesignProductMarketing+4
Andi Lane

Andi Lane

ActiveProduct Managerandi@untitledui.com
DesignProductMarketing+4
Kate Morrison

Kate Morrison

ActiveQA Engineerkate@untitledui.com
DesignProductMarketing+2

Table examples

Below are examples and variations of this table component:

Team members

100 users
Name
Status
Role
Email address
Teams
Olivia Rhye

Olivia Rhye

@olivia

ActiveProduct Designerolivia@untitledui.com
DesignProductMarketing+4
Phoenix Baker

Phoenix Baker

@phoenix

ActiveProduct Managerphoenix@untitledui.com
DesignProductMarketing+4
Lana Steiner

Lana Steiner

@lana

ActiveFrontend Developerlana@untitledui.com
DesignProductMarketing+2
Demi Wilkinson

Demi Wilkinson

@demi

ActiveBackend Developerdemi@untitledui.com
DesignProductMarketing+1
Candice Wu

Candice Wu

@candice

ActiveFullstack Developercandice@untitledui.com
DesignProductMarketing+2
Natali Craig

Natali Craig

@natali

ActiveUX Designernatali@untitledui.com
DesignProductMarketing+2
Drew Cano

Drew Cano

@drew

ActiveUX Copywriterdrew@untitledui.com
DesignProductMarketing+4
Orlando Diggs

Orlando Diggs

@orlando

ActiveUI Designerorlando@untitledui.com
DesignProductMarketing+4
Andi Lane

Andi Lane

@andi

ActiveProduct Managerandi@untitledui.com
DesignProductMarketing+4
Kate Morrison

Kate Morrison

@kate

ActiveQA Engineerkate@untitledui.com
DesignProductMarketing+2

Team members

100 users
Name
Status
Role
Email address
Teams
Olivia Rhye

Olivia Rhye

@olivia

ActiveProduct Designerolivia@untitledui.com
DesignProductMarketing+4
Phoenix Baker

Phoenix Baker

@phoenix

ActiveProduct Managerphoenix@untitledui.com
DesignProductMarketing+4
Lana Steiner

Lana Steiner

@lana

ActiveFrontend Developerlana@untitledui.com
DesignProductMarketing+2
Demi Wilkinson

Demi Wilkinson

@demi

ActiveBackend Developerdemi@untitledui.com
DesignProductMarketing+1
Candice Wu

Candice Wu

@candice

ActiveFullstack Developercandice@untitledui.com
DesignProductMarketing+2
Natali Craig

Natali Craig

@natali

ActiveUX Designernatali@untitledui.com
DesignProductMarketing+2
Drew Cano

Drew Cano

@drew

ActiveUX Copywriterdrew@untitledui.com
DesignProductMarketing+4
Orlando Diggs

Orlando Diggs

@orlando

ActiveUI Designerorlando@untitledui.com
DesignProductMarketing+4
Andi Lane

Andi Lane

@andi

ActiveProduct Managerandi@untitledui.com
DesignProductMarketing+4
Kate Morrison

Kate Morrison

@kate

ActiveQA Engineerkate@untitledui.com
DesignProductMarketing+2

Customers

These companies have purchased in the last 12 months.

Company
Status
About
Users
License use
Stack3d Lab

Stack3d Lab

stack3dlab.com

Churned

Design software

Super lightweight design app

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
60%
ContrastAI

ContrastAI

contrastai.com

Churned

Web app integrations

Connect web apps seamlessly

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
20%
Ephemeral

Ephemeral

ephemeral.io

Customer

Content curating app

Brings all your news into one place

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
70%
Warpspeed

Warpspeed

getwarpspeed.com

Customer

Data prediction

AI and machine learning data

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
30%
CloudWatch

CloudWatch

cloudwatch.app

Customer

Productivity app

Time management and productivity

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
80%
Convergence

Convergence

convergence.io

Customer

Sales CRM

Web-based sales doc management

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
10%
Sisyphus

Sisyphus

sisyphus.com

Customer

Automation and workflow

Time tracking, invoicing and expenses

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
40%

Customers

These companies have purchased in the last 12 months.

Company
Status
About
Users
License use
Stack3d Lab

Stack3d Lab

stack3dlab.com

Churned

Design software

Super lightweight design app

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
60%
ContrastAI

ContrastAI

contrastai.com

Churned

Web app integrations

Connect web apps seamlessly

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
20%
Ephemeral

Ephemeral

ephemeral.io

Customer

Content curating app

Brings all your news into one place

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
70%
Warpspeed

Warpspeed

getwarpspeed.com

Customer

Data prediction

AI and machine learning data

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
30%
CloudWatch

CloudWatch

cloudwatch.app

Customer

Productivity app

Time management and productivity

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
80%
Convergence

Convergence

convergence.io

Customer

Sales CRM

Web-based sales doc management

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
10%
Sisyphus

Sisyphus

sisyphus.com

Customer

Automation and workflow

Time tracking, invoicing and expenses

Olivia Rhye
Phoenix Baker
Lana Steiner
Demi Wilkinson
Candice Wu
+5
40%
Invoice
Date
Status
Customer
Purchase
#3066Jan 6, 2025paid
Olivia Rhye

Olivia Rhye

olivia@untitledui.com

Monthly subscription
#3065Jan 6, 2025paid
Phoenix Baker

Phoenix Baker

phoenix@untitledui.com

Monthly subscription
#3064Jan 6, 2025paid
LS

Lana Steiner

lana@untitledui.com

Monthly subscription
#3063Jan 5, 2025paid
DW

Demi Wilkinson

demi@untitledui.com

Monthly subscription
#3062Jan 5, 2025refunded
Candice Wu

Candice Wu

candice@untitledui.com

Monthly subscription
#3061Jan 5, 2025refunded
NC

Natali Craig

natali@untitledui.com

Monthly subscription
#3060Jan 4, 2025cancelled
Drew Cano

Drew Cano

drew@untitledui.com

Monthly subscription
#3059Jan 3, 2025paid
Orlando Diggs

Orlando Diggs

orlando@untitledui.com

Monthly subscription
#3058Jan 3, 2025paid
Andi Lane

Andi Lane

andi@untitledui.com

Monthly subscription
#3057Jan 3, 2025paid
Kate Morrison

Kate Morrison

kate@untitledui.com

Monthly subscription
Invoice
Date
Status
Customer
Purchase
#30662025-01-06paid
Olivia Rhye

Olivia Rhye

olivia@untitledui.com

Monthly subscription
#30652025-01-06paid
Phoenix Baker

Phoenix Baker

phoenix@untitledui.com

Monthly subscription
#30642025-01-06paid
LS

Lana Steiner

lana@untitledui.com

Monthly subscription
#30632025-01-05paid
DW

Demi Wilkinson

demi@untitledui.com

Monthly subscription
#30622025-01-05refunded
Candice Wu

Candice Wu

candice@untitledui.com

Monthly subscription
#30612025-01-05refunded
NC

Natali Craig

natali@untitledui.com

Monthly subscription
#30602025-01-04cancelled
Drew Cano

Drew Cano

drew@untitledui.com

Monthly subscription
#30592025-01-03paid
Orlando Diggs

Orlando Diggs

orlando@untitledui.com

Monthly subscription
#30582025-01-03paid
Andi Lane

Andi Lane

andi@untitledui.com

Monthly subscription
#30572025-01-03paid
Kate Morrison

Kate Morrison

kate@untitledui.com

Monthly subscription

Files uploaded

File name
File size
Date uploaded
Last updated
Uploaded by

Tech requirements.pdf

200 KB

200 KBJan 4, 2025Jan 4, 2025Olivia Rhye

Dashboard screenshot.jpg

720 KB

720 KBJan 4, 2025Jan 4, 2025Phoenix Baker

Dashboard prototype recording.mp4

16 MB

16 MBJan 2, 2025Jan 2, 2025Lana Steiner

Dashboard prototype FINAL.fig

4.2 MB

4.2 MBJan 6, 2025Jan 6, 2025Demi Wilkinson

UX Design Guidelines.docx

400 KB

400 KBJan 8, 2025Jan 8, 2025Candice Wu

Dashboard interaction.aep

12 MB

12 MBJan 6, 2025Jan 6, 2025Natali Craig

Briefing call recording.mp3

18.6 MB

18.6 MBJan 4, 2025Jan 4, 2025Drew Cano

Files uploaded

File name
File size
Date uploaded
Last updated
Uploaded by

Tech requirements.pdf

200 KB

200 KBJan 4, 2025Jan 4, 2025Olivia Rhye

Dashboard screenshot.jpg

720 KB

720 KBJan 4, 2025Jan 4, 2025Phoenix Baker

Dashboard prototype recording.mp4

16 MB

16 MBJan 2, 2025Jan 2, 2025Lana Steiner

Dashboard prototype FINAL.fig

4.2 MB

4.2 MBJan 6, 2025Jan 6, 2025Demi Wilkinson

UX Design Guidelines.docx

400 KB

400 KBJan 8, 2025Jan 8, 2025Candice Wu

Dashboard interaction.aep

12 MB

12 MBJan 6, 2025Jan 6, 2025Natali Craig

Briefing call recording.mp3

18.6 MB

18.6 MBJan 4, 2025Jan 4, 2025Drew Cano

Vendor movements

240 vendors

Keep track of vendor and their security ratings.

No vendors found

Your search “Stripe” did not match any vendors. Please try again or create add a new vendor.

Team members

100 users

Something went wrong...

We had some trouble loading this page. Please refresh the page or get in touch for support.

Users

128 online

Keep track of vendor and their security ratings.

No users found

Your search did not match any users.

Integrations

Manage custom integrations and workflows.

Add your first integration

Connect the tools you use every day to automate workflows and keep your data in sync.

Users

Manage team members, external users, and their access.

Invite your first user

Add your team members and external users.

My orders

You're offline

Please check your internet connection and try again. If the issue continues, contact support.

API reference

Import the parts and assemble them:

import { Table, TableCard } from "@/components/application/table/table";
 
<TableCard.Root>
    <TableCard.Header />
    <Table>
        <Table.Header>
            <Table.Head />
        </Table.Header>
        <Table.Body>
            <Table.Row>
                <Table.Cell />
            </Table.Row>
        </Table.Body>
    </Table>
</TableCard.Root>

Table

Renders a <div> element.

Table props
PropTypeDefaultDescription
size
"sm""md"
"md"Controls the density of the header, rows and cells. The size of a wrapping TableCard.Root takes precedence.
Props from React Aria (28)
Table inherited props
PropTypeDefaultDescription
childrenReactNode—The elements that make up the table. Includes the TableHeader, TableBody, Columns, and Rows.
defaultExpandedKeysIterable<Key>—The initial expanded keys in the collection (uncontrolled).
defaultSelectedKeys"all" | Iterable<Key>—The initial selected keys in the collection (uncontrolled).
disabledBehavior
"selection""all"
"all"Whether disabledKeys applies to all interactions, or only selection.
disabledKeysIterable<Key>—A list of row keys to disable.
disallowEmptySelectionboolean—Whether the collection allows empty selection.
dragAndDropHooksDragAndDropHooks—The drag and drop hooks returned by useDragAndDrop used to enable drag and drop behavior for the Table.
escapeKeyBehavior
"clearSelection""none"
"clearSelection"Whether pressing the escape key should clear selection in the table or not.Most experiences should not modify this option as it eliminates a keyboard user's ability to easily clear selection. Only use if the escape key is being handled externally or should not trigger selection clearing contextually.
expandedKeysIterable<Key>—The currently expanded keys in the collection (controlled).
keyboardNavigationBehavior
"arrow""tab"
"arrow"Whether keyboard navigation to focusable elements within the cells is via the left/right arrow keys or the tab key.
onExpandedChange((keys: Set<Key>) => any)—Handler that is called when items are expanded or collapsed.
onRowAction((key: Key) => void)—Handler that is called when a user performs an action on the row.
onSelectionChange((keys: Selection) => void)—Handler that is called when the selection changes.
onSortChange((descriptor: SortDescriptor) => any)—Handler that is called when the sorted column or direction changes.
selectedKeys"all" | Iterable<Key>—The currently selected keys in the collection (controlled).
selectionBehavior
"toggle""replace"
"toggle"How multiple selection should behave in the collection.
selectionMode
"none""single""multiple"
—The type of selection that is allowed in the collection.
shouldSelectOnPressUpboolean—Whether selection should occur on press up instead of press down.
sortDescriptorSortDescriptor—The current sorted column and direction.
treeColumnKey—The id of the column that displays hierarchical data.
styleStyleOrFunction<TableRenderProps>—The inline style for the element. A function may be provided to compute the style based on component state.
slotstring | null—A slot name for the component. Slots allow the component to receive props from a parent component. An explicit null value indicates that the local props completely override all props received from a parent.
classNameClassNameOrFunction<TableRenderProps>"overflow-x-auto"The CSS className for the element. A function may be provided to compute the class based on component state.
renderDOMRenderFunction<"div" | "table", TableRenderProps>—Overrides the default DOM element with a custom render function. This allows rendering existing components with built-in styles and behaviors such as router links, animation libraries, and pre-styled components.Requirements:
  • You must render the expected element type (e.g. if <button> is expected, you cannot render an <a>).
  • Only a single root DOM element can be rendered (no fragments).
  • You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.
aria-describedbystring—Identifies the element (or elements) that describes the object.
aria-detailsstring—Identifies the element (or elements) that provide a detailed, extended description for the object.
aria-labelstring—Defines a string value that labels the current element.
aria-labelledbystring—Identifies the element (or elements) that labels the current element.

Also accepts the global HTML attributes (dir, lang, hidden, inert, translate), all standard React DOM event handlers, all standard table attributes, all standard HTML attributes, all aria-* attributes.

Table.Body

Renders React Aria’s TableBody — all of its props are supported.

Table.Body props
PropTypeDefaultDescription
renderEmptyState((props: TableBodyRenderProps) => ReactNode)—Provides content to display when there are no rows in the table.
childrenReactNode | ((item: T) => ReactNode)—The contents of the collection.
itemsIterable<T>—Item objects in the collection.
dependenciesreadonly any[]—Values that should invalidate the item cache when using dynamic collections.
Styling (3)
Table.Body styling props
PropTypeDefaultDescription
classNameClassNameOrFunction<TableBodyRenderProps>—The CSS className for the element. A function may be provided to compute the class based on component state.
styleStyleOrFunction<TableBodyRenderProps>—The inline style for the element. A function may be provided to compute the style based on component state.
renderDOMRenderFunction<"tbody" | "div", TableBodyRenderProps>—Overrides the default DOM element with a custom render function. This allows rendering existing components with built-in styles and behaviors such as router links, animation libraries, and pre-styled components.Requirements:
  • You must render the expected element type (e.g. if <button> is expected, you cannot render an <a>).
  • Only a single root DOM element can be rendered (no fragments).
  • You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.

Also accepts the global HTML attributes (dir, lang, hidden, inert, translate), all standard React DOM event handlers.

Table.Cell

Renders React Aria’s Cell — all of its props are supported.

Table.Cell props
PropTypeDefaultDescription
size
"sm""md"
—Controls the horizontal and vertical padding of the cell. Falls back to the size inherited from the table.
Props from React Aria Components (9)
Table.Cell inherited props
PropTypeDefaultDescription
allowsArrowNavigationboolean—Whether the cell should support arrow key navigation even when the containing table uses tab keyboard navigation. Allows users to navigate between cells and rows with arrow keys while focus is on an interactive child element within the cell.
colSpannumber—Indicates how many columns the data cell spans.
focusMode
"child""cell"
—Whether the cell or its first focusable child element should be focused when the cell is focused. Defaults to 'child' in arrow keyboard navigation mode and 'cell' in tab keyboard navigation mode.
idKey—The unique id of the cell.
textValuestring—A string representation of the cell's contents, used for features like typeahead.
styleStyleOrFunction<CellRenderProps>—The inline style for the element. A function may be provided to compute the style based on component state.
childrenChildrenOrFunction<CellRenderProps>—The children of the component. A function may be provided to alter the children based on component state.
classNameClassNameOrFunction<CellRenderProps>—The CSS className for the element. A function may be provided to compute the class based on component state.
renderDOMRenderFunction<"div" | "td", CellRenderProps>—Overrides the default DOM element with a custom render function. This allows rendering existing components with built-in styles and behaviors such as router links, animation libraries, and pre-styled components.Requirements:
  • You must render the expected element type (e.g. if <button> is expected, you cannot render an <a>).
  • Only a single root DOM element can be rendered (no fragments).
  • You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.

Also accepts the global HTML attributes (dir, lang, hidden, inert, translate), all standard React DOM event handlers, all standard table cell attributes, all standard HTML attributes, all aria-* attributes.

Table.Head

Renders React Aria’s Column — all of its props are supported.

Table.Head props
PropTypeDefaultDescription
labelstring—The column heading text, rendered before any children.
tooltipstring—Help text shown in a tooltip when hovering the help icon next to the heading.
Props from React Aria Components (14)
Table.Head inherited props
PropTypeDefaultDescription
allowsArrowNavigationboolean—Whether the column should support arrow key navigation even when the containing table uses tab keyboard navigation. Allows users to navigate between columns and rows with arrow keys while focus is on an interactive child element within the column header.
allowsSortingboolean—Whether the column allows sorting.
defaultWidthColumnSize | null—The default width of the column. This prop only applies when the <Table> is wrapped in a <ResizableTableContainer>.
focusMode
"child""cell"
—Whether the column header or its first focusable child element should be focused when the column header is focused. Defaults to 'child' in arrow keyboard navigation mode and 'cell' in tab keyboard navigation mode.
idKey—The unique id of the column.
isRowHeaderboolean—Whether a column is a row header and should be announced by assistive technology during row navigation.
maxWidthColumnStaticSize | null—The maximum width of the column. This prop only applies when the <Table> is wrapped in a <ResizableTableContainer>.
minWidthColumnStaticSize | null—The minimum width of the column. This prop only applies when the <Table> is wrapped in a <ResizableTableContainer>.
textValuestring—A string representation of the column's contents, used for accessibility announcements.
widthColumnSize | null—The width of the column. This prop only applies when the <Table> is wrapped in a <ResizableTableContainer>.
styleStyleOrFunction<ColumnRenderProps>—The inline style for the element. A function may be provided to compute the style based on component state.
childrenChildrenOrFunction<ColumnRenderProps>—The children of the component. A function may be provided to alter the children based on component state.
classNameClassNameOrFunction<ColumnRenderProps>—The CSS className for the element. A function may be provided to compute the class based on component state.
renderDOMRenderFunction<"div" | "th", ColumnRenderProps>—Overrides the default DOM element with a custom render function. This allows rendering existing components with built-in styles and behaviors such as router links, animation libraries, and pre-styled components.Requirements:
  • You must render the expected element type (e.g. if <button> is expected, you cannot render an <a>).
  • Only a single root DOM element can be rendered (no fragments).
  • You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.

Also accepts the global HTML attributes (dir, lang, hidden, inert, translate), all standard React DOM event handlers, all standard table header attributes, all standard HTML attributes, all aria-* attributes.

Table.Header

Renders React Aria’s TableHeader — all of its props are supported.

Table.Header props
PropTypeDefaultDescription
borderedbooleantrueWhether to draw a hairline border along the bottom edge of the header row.
size
"sm""md"
—Controls the height of the header row. Falls back to the size inherited from the table.
Props from React Aria Components (9)
Table.Header inherited props
PropTypeDefaultDescription
onHoverChange((isHovering: boolean) => void)—Handler that is called when the hover state changes.
onHoverEnd((e: HoverEvent) => void)—Handler that is called when a hover interaction ends.
onHoverStart((e: HoverEvent) => void)—Handler that is called when a hover interaction starts.
childrenReactNode | ((item: T) => ReactElement)—A list of Column(s) or a function. If the latter, a list of columns must be provided using the columns prop.
columnsIterable<T>—A list of table columns.
dependenciesreadonly any[]—Values that should invalidate the column cache when using dynamic collections.
styleStyleOrFunction<TableHeaderRenderProps>—The inline style for the element. A function may be provided to compute the style based on component state.
classNameClassNameOrFunction<TableHeaderRenderProps>—The CSS className for the element. A function may be provided to compute the class based on component state.
renderDOMRenderFunction<"div" | "thead", TableHeaderRenderProps>—Overrides the default DOM element with a custom render function. This allows rendering existing components with built-in styles and behaviors such as router links, animation libraries, and pre-styled components.Requirements:
  • You must render the expected element type (e.g. if <button> is expected, you cannot render an <a>).
  • Only a single root DOM element can be rendered (no fragments).
  • You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.

Also accepts the global HTML attributes (dir, lang, hidden, inert, translate), all standard React DOM event handlers, all standard HTML attributes, all aria-* attributes.

Table.Row

Renders React Aria’s Row — all of its props are supported.

Table.Row props
PropTypeDefaultDescription
highlightSelectedRowbooleantrueWhether the row keeps a secondary background while it is selected.
size
"sm""md"
—Controls the height of the row. Falls back to the size inherited from the table.
Props from React Aria (30)
Table.Row inherited props
PropTypeDefaultDescription
onClick((e: MouseEvent<FocusableElement>) => void)—Not recommended – use onPress instead. onClick is an alias for onPress provided for compatibility with other libraries. onPress provides additional event details for non-mouse interactions.
onPress((e: PressEvent) => void)—Handler that is called when the press is released over the target.
onPressChange((isPressed: boolean) => void)—Handler that is called when the press state changes.
onPressEnd((e: PressEvent) => void)—Handler that is called when a press interaction ends, either over the target or when the pointer leaves the target.
onPressStart((e: PressEvent) => void)—Handler that is called when a press interaction starts.
onPressUp((e: PressEvent) => void)—Handler that is called when a press is released over the target, regardless of whether it started on the target or not.
onHoverChange((isHovering: boolean) => void)—Handler that is called when the hover state changes.
onHoverEnd((e: HoverEvent) => void)—Handler that is called when a hover interaction ends.
onHoverStart((e: HoverEvent) => void)—Handler that is called when a hover interaction starts.
downloadstring | boolean—Causes the browser to download the linked URL. A string may be provided to suggest a file name.
hrefstring—A URL to link to.
hrefLangstring—Hints at the human language of the linked URL.
pingstring—A space-separated list of URLs to ping when the link is followed.
referrerPolicy
"""no-referrer""no-referrer-when-downgrade""origin""origin-when-cross-origin""same-origin""strict-origin""strict-origin-when-cross-origin""unsafe-url"
—How much of the referrer to send when following the link.
relstring—The relationship between the linked resource and the current page.
routerOptionsRouterOptions—Options for the configured client side router.
targetHTMLAttributeAnchorTarget—The target window for the link.
childrenReactNode | ((item: T) => ReactElement)—The cells within the row. Supports static items or a function for dynamic rendering.
columnsIterable<T>—A list of columns used when dynamically rendering cells.
dependenciesreadonly any[]—Values that should invalidate the cell cache when using dynamic collections.
disabledBehavior
"selection""all"
—Whether disabledKeys applies to all interactions, or only selection.
hasChildItemsboolean—Whether this row has children, even if not loaded yet.
idKey—The unique id of the row.
isDisabledboolean—Whether the row is disabled.
onAction(() => void)—Handler that is called when a user performs an action on the row. The exact user event depends on the collection's selectionBehavior prop and the interaction modality.
textValuestring—A string representation of the row's contents, used for features like typeahead.
valueT—The object value that this row represents. When using dynamic collections, this is set automatically.
styleStyleOrFunction<RowRenderProps>—The inline style for the element. A function may be provided to compute the style based on component state.
classNameClassNameOrFunction<RowRenderProps>—The CSS className for the element. A function may be provided to compute the class based on component state.
renderDOMRenderFunction<"div" | "tr", RowRenderProps>—Overrides the default DOM element with a custom render function. This allows rendering existing components with built-in styles and behaviors such as router links, animation libraries, and pre-styled components.Requirements:
  • You must render the expected element type (e.g. if <button> is expected, you cannot render an <a>).
  • Only a single root DOM element can be rendered (no fragments).
  • You must pass through props and ref to the underlying DOM element, merging with your own prop as appropriate.

Also accepts the global HTML attributes (dir, lang, hidden, inert, translate), all standard React DOM event handlers, all standard HTML attributes, all aria-* attributes.

TableCard.Header

Renders a <div> element.

TableCard.Header props
PropTypeDefaultDescription
title* (required)string—The title of the table card header.
badgeReactNode—The badge displayed next to the title.
descriptionstring—The description of the table card header.
contentTrailingReactNode—The content displayed after the title and badge.
classNamestring—The class name of the table card header.

TableCard.Root

Renders a <div> element.

TableCard.Root props
PropTypeDefaultDescription
size
"sm""md"
"md"Controls the density of the card and every descendant header, row and cell.

Also accepts all standard HTML attributes, all aria-* attributes, all standard React DOM event handlers.

FAQs

Please refer to our frequently asked questions page for more.

Tables come in two sizes, "sm" and "md", with "md" as the default. Set size on TableCard.Root and it flows down through context to the header, rows, and cells. When the table is not wrapped in a card, set size on Table.Header, Table.Row, and Table.Cell instead — each accepts its own size prop, which also lets you override a single part inside a card. The size prop on Table itself has no effect, because the size context always supplies a value for it to fall back to.

Table is a compound component with Table.Header, Table.Head (one per column), Table.Body, Table.Row, and Table.Cell. TableCard.Root and TableCard.Header wrap it in the bordered card with a title bar, and TableRowActionsDropdown is a ready-made dots menu with Edit, Copy link, and Delete items for the last cell of each row.

Add allowsSorting to the Table.Head for that column and hold a React Aria SortDescriptor in state, passing sortDescriptor and onSortChange to Table. The column header then renders the sort chevron and flips the arrow to match sortDescriptor.direction. Sorting the rows themselves is up to you — the examples derive the sorted array with a useMemo keyed on the descriptor.

Set selectionMode="multiple" on Table. A checkbox column is inserted automatically at the start of Table.Header and every Table.Row — you do not add it yourself — with a select-all checkbox in the header. Give each Table.Row a stable id, and read or control the selection with React Aria's selectedKeys and onSelectionChange props. Selected rows are highlighted by default; pass highlightSelectedRow={false} on Table.Row to turn that off.

Use TableCard.Header inside TableCard.Root. It accepts title, description, badge, and contentTrailing. A string or number passed to badge is wrapped automatically in a gray modern badge (for example badge="100 users"), while a React element is rendered as-is, and contentTrailing is the slot for a search input, filter, or overflow menu.

Table.Head takes a label string for the column title and a tooltip string that renders a help-circle icon next to it with your text on hover or focus. It also passes through React Aria's column props such as id and isRowHeader, and you can still supply custom children instead of label when a column needs richer markup.

Table already wraps its markup in an overflow-x-auto container, so wide tables scroll horizontally instead of breaking the page. To drop non-essential columns, apply the same responsive utilities to the matching Table.Head and Table.Cell. To hide a column on narrow viewports only, use className="hidden md:table-cell". The examples on this page instead use className="md:hidden xl:table-cell" on the email column, which shows it on the narrowest layout, hides it between the md and xl breakpoints where the table is most cramped, and brings it back on wide screens.