Table, wired and working

Table draws rows, and this one runs them: sorting on header click, a search field, row selection with a select all header, client side pagination, and an empty state, assembled from the presentational pieces so a working data view is one component rather than an afternoon of plumbing.

Fully wired

Search, selection, sorting, and pagination together. Rows carry raw values keyed by column, and a column's render prop turns them into cells, like the status Badges here, while sorting and search keep reading the raw value underneath.

Customers
Ann Press
Waiting
2026-09-20
2646
Aspen Lubin
Failed
2026-03-25
1899
Gretchen Septimus
Shipped
2026-04-20
3740
Jaydon Aminoff
Waiting
2026-07-17
224
John Clarkson
Waiting
2026-09-05
3412

Your filters, its plumbing

The toolbar slot takes consumer owned controls, like this status Dropdown. Filter the rows you pass in and the readout, pagination, and empty state follow.

Customers, filtered by status
John Clarkson
Waiting
2026-09-05
3412
Aspen Lubin
Failed
2026-03-25
1899
Michael Ekstrom
Shipped
2026-08-01
2752
Kianna Vaccaro
Shipped
2026-04-02
145
Livia Saris
Failed
2026-11-14
708

Sorting only

Every part is opt in. With no search, selection, or page size, the component is just a table with sortable headers. Clicks cycle ascending, descending, then back to the given order.

Customers, sorting only
John Clarkson
Waiting
2026-09-05
3412
Aspen Lubin
Failed
2026-03-25
1899
Michael Ekstrom
Shipped
2026-08-01
2752
Kianna Vaccaro
Shipped
2026-04-02
145
Livia Saris
Failed
2026-11-14
708

Empty

A search with no matches renders the bordered empty state instead of a bare table, and the result count reads zero. Override it through the emptyState prop.

No matching rows

Adjust the search or filters and try again.