Skip to content
Drivn

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
rowKeystring—Property 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" }) => void—Callback when sort state changes
selectablebooleanfalseEnable row selection checkboxes
onSelectionChange(keys: Set<string>) => void—Callback when selection changes
loadingbooleanfalseShow skeleton loading rows
toolbarReactNode—Content rendered above the table
footerReactNode—Content rendered below the table
classNamestring—Additional class on the root

ColumnDef

PropTypeDefaultDescription
idstring—Unique column identifier
headerstring—Column header label
cell(value: unknown, row: T) => ReactNode—Custom cell renderer
align"left" | "center" | "right"—Cell text alignment
widthstring—Fixed column width (CSS value)
sortableboolean—Override root sortable for this column

DataTable.Pagination

PropTypeDefaultDescription
pagenumber—Current active page (1-based)
pageCountnumber—Total number of pages
onPageChange(page: number) => void—Callback when page changes
classNamestring—Additional class on the nav