Skip to content
Drivn logoDrivn

Data Table

Data-driven table with sorting, selection, loading, and empty states.

Preview

Alice Johnsonalice@example.comAdminActive
Bob Smithbob@example.comEditorActive
Charlie Browncharlie@example.comViewerInactive
Diana Princediana@example.comAdminActive
Eve Wilsoneve@example.comEditorPending

Installation

npx drivn add data-table

Usage

1import { useState } from "react"
2import { DataTable } from "@/components/ui/data-table"
3
4const columns = [
5 { id: "name", header: "Name" },
6 { id: "email", header: "Email" },
7 { id: "role", header: "Role" },
8]
9
10const users = [
11 { id: "1", name: "Alice Johnson", email: "alice@example.com", role: "Admin", status: "Active" },
12 { id: "2", name: "Bob Smith", email: "bob@example.com", role: "Editor", status: "Active" },
13 { id: "3", name: "Charlie Brown", email: "charlie@example.com", role: "Viewer", status: "Inactive" },
14 { id: "4", name: "Diana Prince", email: "diana@example.com", role: "Admin", status: "Active" },
15 { id: "5", name: "Eve Wilson", email: "eve@example.com", role: "Editor", status: "Pending" },
16]
17
18export default function Page() {
19 return (
20 <DataTable
21 data={users}
22 columns={columns}
23 rowKey="id"
24 />
25 )
26}

Sortable

Click column headers to cycle through ascending, descending, and unsorted.

Alice Johnsonalice@example.comAdmin
Bob Smithbob@example.comEditor
Charlie Browncharlie@example.comViewer
Diana Princediana@example.comAdmin
Eve Wilsoneve@example.comEditor

Row Selection

Checkbox column with select all and individual row toggling.

0 of 5 selected

NameEmailRole
Alice Johnsonalice@example.comAdmin
Bob Smithbob@example.comEditor
Charlie Browncharlie@example.comViewer
Diana Princediana@example.comAdmin
Eve Wilsoneve@example.comEditor

Custom Cells

Use the cell renderer for badges, icons, or action buttons.

NameRoleStatus
Alice JohnsonAdminActive
Bob SmithEditorActive
Charlie BrownViewerInactive
Diana PrinceAdminActive
Eve WilsonEditorPending

Search Filter

Use the toolbar slot with an Input to filter rows.

NameEmailRole
Alice Johnsonalice@example.comAdmin
Bob Smithbob@example.comEditor
Charlie Browncharlie@example.comViewer
Diana Princediana@example.comAdmin
Eve Wilsoneve@example.comEditor

Column Visibility

Use a Select with Checkboxes inside the Menu to toggle columns.

NameEmailRoleStatus
Alice Johnsonalice@example.comAdminActive
Bob Smithbob@example.comEditorActive
Charlie Browncharlie@example.comViewerInactive
Diana Princediana@example.comAdminActive
Eve Wilsoneve@example.comEditorPending

Empty State

NameEmailRole
No results.

Loading State

NameEmailRole

With Pagination

Slice data externally and use DataTable.Pagination in the footer slot.

NameEmailRole
Alice Johnsonalice@example.comAdmin
Bob Smithbob@example.comEditor
Charlie Browncharlie@example.comViewer
Page 1 of 2

Variants

NameEmailRole
Alice Johnsonalice@example.comAdmin
Bob Smithbob@example.comEditor
Charlie Browncharlie@example.comViewer
Diana Princediana@example.comAdmin
Eve Wilsoneve@example.comEditor
NameEmailRole
Alice Johnsonalice@example.comAdmin
Bob Smithbob@example.comEditor
Charlie Browncharlie@example.comViewer
Diana Princediana@example.comAdmin
Eve Wilsoneve@example.comEditor

API Reference

DataTable

PropTypeDefaultDescription
dataT[]Array of row data objects
columnsColumnDef<T>[]Column definitions array
rowKeystringProperty name used as unique row key
variant"default" | "striped" | "bordered""default"Visual variant passed to the underlying Table
sortablebooleanfalseEnable sorting on all columns
onSortChange(sort: { id: string; direction: "asc" | "desc" }) => voidCallback when sort state changes
selectablebooleanfalseEnable row selection checkboxes
onSelectionChange(keys: Set<string>) => voidCallback when selection changes
loadingbooleanfalseShow skeleton loading rows
toolbarReactNodeContent rendered above the table
footerReactNodeContent rendered below the table
classNamestringAdditional class on the root

ColumnDef

PropTypeDefaultDescription
idstringUnique column identifier
headerstringColumn header label
cell(value: unknown, row: T) => ReactNodeCustom cell renderer
align"left" | "center" | "right"Cell text alignment
widthstringFixed column width (CSS value)
sortablebooleanOverride root sortable for this column

DataTable.Pagination

PropTypeDefaultDescription
pagenumberCurrent active page (1-based)
pageCountnumberTotal number of pages
onPageChange(page: number) => voidCallback when page changes
classNamestringAdditional class on the nav