@adapttable/base-ui
v2.1.1
Published
Base UI adapter for AdaptTable — a batteries-included Base UI data table with sorting, filtering, URL state, selection, RTL, and dark mode.
Maintainers
Readme
@adapttable/base-ui
📖 Documentation · 🚀 Live demo · Get started · ⚡ Try in StackBlitz
The Base UI adapter for AdaptTable —
a batteries-included Base UI data table with sorting, filtering, URL-synced
state, selection + bulk actions, RTL, and dark mode. Built on the headless
@adapttable/core engine. (Targets @base-ui/react ^1.6.)
pnpm add @adapttable/base-ui @adapttable/core @base-ui/react react react-domImport the adapter styles once in your app entry (or rely on the side-effect import from @adapttable/base-ui):
import "@adapttable/base-ui/styles.css";Quickstart
import {
DataTable,
useFrontendData,
type ColumnDef,
} from "@adapttable/base-ui";
interface Person {
id: string;
name: string;
email: string;
}
const columns: ColumnDef<Person>[] = [
{ key: "name", header: "Name", accessor: (r) => r.name, sortable: true },
{ key: "email", header: "Email", accessor: (r) => r.email },
];
export function PeopleTable({ data }: { data: Person[] }) {
const source = useFrontendData({ data, columns });
return <DataTable source={source} columns={columns} rowKey={(r) => r.id} />;
}Behavior lives in @adapttable/core; this package only renders Base UI primitives
(Popover, Drawer, Select, Checkbox, Tooltip, Button, Input) plus minimal chrome CSS.
Features
- Automatic mobile cards — below the mobile breakpoint every row renders as a card (same filters, search, selection and URL state) and infinite scroll replaces the pager; tune per column with
mobileLabel/hideOnMobile, pin either layout withforceMobile. See it flip live. - Client or server data through one
TableSourcecontract — same props either way. - URL-synced search / sort / filters / page — shareable, deep-linkable links.
- Sorting via sortable headers.
- Filtering — a
PopoverorDialogof filters plus removable chips, with a filter count on the trigger. - Selection + bulk actions using Base UI
Checkboxes, with confirm dialogs (bulkActions). - Row actions with optional confirm,
isHidden/isDisabledper row. - Row expansion — inline detail panels via
renderRowDetail. - Inline cell editing (
onCellEdit+editablecolumns) — text, number and select editors; Enter commits, Escape cancels, Tab moves on. Omit the handler and no cell opens. - Row grouping (
groupBy) with per-group aggregates sharing thesummaryRowmapper. - Column management — show/hide, reorder, pin (sticky) and resize, from a built-in menu.
- Saved views — name a filter/sort/column arrangement and switch between them.
- CSV export (
exportCsv) — current page or the full filtered set. - Virtualization (
virtualize) — opt-in row/card windowing for very large lists. - Pagination — numbered pagination, or infinite scroll (auto by device).
- States — skeleton loading, error with retry, and an empty state.
- RTL via
dir; dark mode follows your theme tokens. - Customisation —
slots,className, injectableconfirm— Base UI ships unstyled, so every part is yours, and the full headless escape hatch via@adapttable/core.
See it work
Each clip is the real adapter, recorded on the live demo.
Row grouping — group rows by a column with per-group subtotals

Inline cell editing — double-click a cell; text, number and select editors

Filtering — type a bound and the table answers as you type

Column management — show, hide, reorder, pin and resize

RTL / Arabic — the whole table mirrors, not just the text

