Yable
AG Grid-class features. TanStack-class control. MIT-licensed, no paywall, zero-dependency core.
Headless core, batteries-included UI -- the control of a headless engine with the polish of a finished grid.
Yable is a TypeScript-first, framework-agnostic data grid. The @zvndev/yable-core engine is headless and zero-dependency; @zvndev/yable-react ships the finished components -- sortable/filterable columns, animated drag-to-reorder, inline editing with async commits, pinning, grouping, and virtualized rendering for large datasets. The features other grids gate behind an Enterprise license -- clipboard, the fill handle, and a formula engine -- ship in Yable's MIT core. Use it with React today, or any framework through the vanilla renderer.
- No paywall on the good stuff -- clipboard copy/paste, the Excel-style fill handle, a formula engine, plus column pinning and resizing, all ship in the MIT-licensed core. AG Grid puts clipboard and the fill handle behind a $999/dev Enterprise license; MUI X puts pinning and resizing behind Pro. Yable charges $0.
- Interactions that ship done -- animated column drag-to-reorder (a floating ghost with the header and body sliding into place in lockstep), 3-state header sort, and inline editing with async cell commits (per-cell pending / error / conflict states, plus retry and dismiss) -- built in, not left as an app-level exercise.
- Headless core + batteries-included UI --
@zvndev/yable-corestays headless and zero-dependency, while@zvndev/yable-react,@zvndev/yable-vanilla, and@zvndev/yable-themesgive you a finished, themed grid. You don't choose between control and convenience. - Spreadsheet-grade engine -- a formula engine (17 built-in functions, extensible) with parser, evaluator, and dependency tracking, plus the Excel-style fill handle and a programmatic pivot row model -- all in the MIT core.
- TypeScript from the ground up -- deep key inference on accessors, fully typed state slices, and generic-safe column helpers.
- Framework-agnostic --
@zvndev/yable-corehas zero (0) dependencies.@zvndev/yable-reactand@zvndev/yable-vanillaare thin adapters.
Built-in feature snapshot. DIY means the library ships the engine/accessor, but you assemble the UI yourself.
| Feature | Yable | TanStack Table | AG Grid Community | AG Grid Enterprise |
|---|---|---|---|---|
| Sorting | Yes | Yes | Yes | Yes |
| Filtering (column + global) | Yes | Yes | Yes | Yes |
| Pagination | Yes | Yes | Yes | Yes |
| Cell editing | Yes | DIY | Yes | Yes |
| Column pinning | Yes | Yes | Yes | Yes |
| Column resizing | Yes | Yes | Yes | Yes |
| Column drag-to-reorder | Animated | DIY | Basic | Basic |
| Row selection | Yes | Yes | Yes | Yes |
| Row grouping | Yes | Plugin | No | Yes |
| Aggregation | Yes | Plugin | No | Yes |
| Pivot tables | DIY | No | No | Yes |
| Formula engine | Yes | No | No | Yes |
| Fill handle | Yes | No | No | Yes |
| Clipboard | Yes | No | No | Yes |
| Undo / Redo | Yes | No | Yes | Yes |
| Row virtualization | Yes | DIY | Yes | Yes |
| Keyboard navigation | Yes | No | Yes | Yes |
| Async cell commits | Yes | No | No | No |
| Tree data | Yes | Yes | No | Yes |
| Export (CSV / JSON) | Yes | No | Yes | Yes |
| Themes / design tokens | Yes | No | Yes | Yes |
| React components | Yes | No | Yes | Yes |
| Vanilla JS renderer | Yes | No | No | No |
| MIT license | Yes | Yes | Yes | No |
| Price | Free | Free | Free | Paid |
npm install @zvndev/yable-core @zvndev/yable-react @zvndev/yable-themesOr with pnpm / yarn:
pnpm add @zvndev/yable-core @zvndev/yable-react @zvndev/yable-themes
yarn add @zvndev/yable-core @zvndev/yable-react @zvndev/yable-themesimport { createColumnHelper } from '@zvndev/yable-react'
import { useTable, Table, Pagination, GlobalFilter } from '@zvndev/yable-react'
import '@zvndev/yable-themes/default.css'
// 1. Define your data type
interface Person {
name: string
age: number
email: string
}
// 2. Create a column helper
const columnHelper = createColumnHelper<Person>()
// 3. Define columns
const columns = [
columnHelper.accessor('name', {
header: 'Name',
enableSorting: true,
}),
columnHelper.accessor('age', {
header: 'Age',
enableSorting: true,
}),
columnHelper.accessor('email', {
header: 'Email',
}),
]
// 4. Sample data
const data: Person[] = [
{ name: 'Alice', age: 32, email: 'alice@example.com' },
{ name: 'Bob', age: 27, email: 'bob@example.com' },
{ name: 'Charlie', age: 45, email: 'charlie@example.com' },
]
// 5. Build your table component
function MyTable() {
const table = useTable({ data, columns })
return (
<Table table={table} striped stickyHeader>
<Pagination table={table} />
</Table>
)
}Click a column header to cycle sort (ascending -> descending -> unsorted); hold Shift to multi-sort; drag a header to reorder columns. See the Quickstart Guide for a step-by-step walkthrough including filtering, editing, drag-to-reorder, and theming.
| Package | Description |
|---|---|
@zvndev/yable-core |
Headless table engine -- sorting, filtering, editing, formulas, pivot, tree data, clipboard, and more. Zero dependencies. |
@zvndev/yable-react |
React adapter -- useTable hook, <Table> component tree, form controls, pagination, global filter. |
@zvndev/yable-vanilla |
Vanilla JS/DOM renderer -- renderTable() and renderPagination() for non-framework use. |
@zvndev/yable-themes |
CSS design token system -- 8 built-in themes (default, stripe, compact, forest, midnight, rose, ocean, mono) with 100+ customizable CSS custom properties. Dark mode included. |
- Sorting -- single and multi-column, 6 built-in comparators, custom sort functions
- Filtering -- column filters, global search, 11 built-in filter functions, custom predicates
- Pagination -- client-side and server-side, configurable page sizes
- Server state -- same columns/table surface with manual sorting, filtering, pagination, cursor loading, and optimistic row updates via
useServerTable - Row grouping -- group rows by one or more columns with collapsible group headers and leaf counts, rendered turnkey through
<Table> - Aggregation -- 9 built-in aggregation functions (sum, min, max, mean, count, and more) that roll up automatically on group rows
- Tree data -- nested/hierarchical row support with expand/collapse
- Cell editing -- text, number, select, checkbox, toggle, date, and custom editors with validation
- Formula engine -- 17 built-in functions (extensible), expression parser, dependency graph, circular reference detection
- Fill handle -- drag to auto-fill cells (like Excel)
- Clipboard -- copy/paste support
- Undo / Redo -- full edit history
- Async cell commits -- optimistic saves with pending, error, and conflict cell states, retry, and conflict resolution
- Column pinning -- freeze columns to left or right edges
- Column resizing -- drag-to-resize with onChange or onEnd modes
- Column ordering -- reorder columns programmatically
- Column visibility -- show/hide columns
- Row selection -- single, multi, and sub-row selection
- Row pinning -- pin rows to top or bottom
- Row expanding -- master/detail pattern with custom detail panels
- Pivot -- programmatic cross-tabulated row model via
getPivotRowModel()
- Export -- CSV and JSON formats
- Themes -- design token system with light/dark mode and 100+ CSS custom properties
- Event system -- cell, row, header click/context menu events
- ARIA -- built-in accessibility attributes
- Quickstart Guide -- from zero to working table in 10 steps
- Feature Documentation -- detailed guide for every feature
- API Reference -- full reference for all public exports
- Contributing Guide -- how to develop, test, and submit PRs
Yable is pre-1.0 but already covers most production grid needs. Current npm line: @zvndev/yable-core and @zvndev/yable-react at 0.6.0, @zvndev/yable-themes at 0.4.1, and @zvndev/yable-vanilla at 0.3.3. Turnkey row grouping with aggregated headers, animated column drag-to-reorder, 3-state sorting, row/column pinning, master/detail, pivots, formulas, fill handle, clipboard, async commits, row and column virtualization, set/floating filters, and the themed React/vanilla adapters are all shipping. The API may still change before a stable 1.0. Near-term focus:
- 1.0 API stabilization
- Expanded keyboard-navigation coverage
- A checked-in Playwright end-to-end suite
MIT -- see LICENSE for details.
We welcome contributions! See the Contributing Guide to get started.