All features
Every capability the table ships with, grouped the way the sidebar groups them.
Each capability below is one page with a runnable demo, its variations, the ways it can be customised, its known limitations and links to the generated reference.
What is in scope: rendering, querying and interacting with tabular data, in the browser or against a server. What is deliberately out: fetching (bring your own), charting, pivot tables and spreadsheet-style editing. Inline editing is specified and planned; see the roadmap.
Core features
Accessors, headers, types and formatting: the column definition is where most of a table is decided.
Click to sort, shift-click to add a column, and comparators that understand text, dates and your own domain order.
One input that matches across every searchable column, with debouncing, a minimum length and optional match highlighting.
Per-column filters in a panel, a popover or a filter row, with a control chosen from the column's type and values drawn from the data.
Filter options and counts computed from the data: from the loaded rows in client mode, from your API in server mode.
Six presentations of the same state (numbered, compact, simple, load-more, infinite or none), including cursor-based paging.
Checkboxes or radios, range selection with shift-click, a selection bar for bulk actions, and select-all that survives server paging.
Detail panels that open under a row, lazily rendered, animated, and pinned to the viewport width so a wide table cannot scroll them away.
The same table and the same props, with the work done in the browser, on your API, or split feature by feature.
Advanced features
Display & layout
Freeze columns to either edge, stacked and responsive, with a shadow that appears only when content actually scrolls underneath.
Percentage or pixel widths, a keyboard-operable resize handle, and double-click autosizing that measures the rendered rows.
Drag headers to reorder, or move them from the columns menu with the keyboard. Pinned groups and locked positions are respected.
A columns menu for the reader, a per-column menu for actions, and responsive hiding that needs no state at all.
A footer row with per-column totals, computed over the current page or over everything the filters left.
Keep chosen rows at the top or the bottom while the rest of the table sorts, filters and pages away beneath them.
A numbered column that counts through the whole result set, or restarts on every page.
Striping, hover and per-row classes, styles and props: the way a row shows what it is without a custom renderer.
Keep the header and the totals in view while the rows scroll, in both axes when columns are pinned.
The panel the table sits on: a bordered card with its pagination attached, or nothing at all, with corners you choose.
Three row heights the reader can switch between (compact, standard and comfortable), driven entirely by tokens.
Render the rows on screen instead of all of them: a hundred thousand rows with the same markup, the same keyboard model and the same counts for screen readers.
Breakpoint-aware props, a card layout for small screens, and a server-rendered first paint that does not jump.
Interaction
The strip above the table (search, filters, columns, density, export), either as one component or as parts you place yourself.
Skeletons, a delayed overlay, an empty state that knows why it is empty, and errors that keep the rest of the table usable.
The WAI-ARIA data grid pattern: arrow keys between cells, one tab stop for the whole table, and Enter to reach interactive content.
Automation
CSV of the page, the selection or everything matching, chunked through your API when the result is larger than the browser holds.
Put table state in the URL, in storage, or in both, so a link reproduces a view and a reload does not lose one.
Developer tools
The engine without the markup: every feature, none of the table. Use it for cards, lists, charts, or a table you draw yourself.
Every string the table can show, in one object, with number, date and currency formatting that follows the same locale.