Real formula engine.
Tokenizer → AST → recursive evaluator with dependency graph and circular-ref detection. 17 functions: SUM, IF, ROUND, etc.
=SUM(B2:B12) * IF(D2 > 100, 1.1, 1)Headless core, batteries-included React. AG Grid-class features — clipboard, pivot, row grouping, Excel-style fills, and premium animated column drag-to-reorder — MIT-licensed, no paywall, zero-dependency core.
npm i @zvndev/yable-react @zvndev/yable-themesimport { useTable, Table } from '@zvndev/yable-react'
import '@zvndev/yable-themes/midnight.css'
const columns = [
{ accessorKey: 'name', header: 'Name' },
{ accessorKey: 'email', header: 'Email' },
{ accessorKey: 'role', header: 'Role' },
]
function App() {
const table = useTable({ data, columns })
return <Table table={table} striped stickyHeader />
}Clipboard, Excel-style fills, tree data, and row grouping sit behind AG Grid Enterprise at $999 / dev / year — Yable ships them MIT, alongside premium animated column drag-to-reorder. Row grouping and pivots render through <Table>with collapsible headers, dynamic columns, and rolled-up aggregates.
| Capability | YableMIT · free | AG GridMIT core · $999/dev Enterprise |
|---|---|---|
| Clipboard copy / paste / TSV | ●MIT | $Enterprise |
| Excel-style fill handle | ●MIT | $Enterprise |
| Tree data / hierarchical rows | ●MIT | $Enterprise |
| Row grouping render | ●MIT | $Enterprise |
| Pivot tables | ◐programmatic | $Enterprise |
| Animated column drag-to-reorder | ●premium | ◐basic, no animation |
| Column pinning | ● | ●Community |
| Column resizing | ● | ●Community |
| Headless core | ● | — |
| Zero-dependency core | ● | — |
Every Yable checkmark is verifiable in this repo. Competitor columns focus on built-in behavior rather than custom code or extra packages.
| Feature | YableMIT · free | TanStack TableMIT · free | AG Grid CommunityMIT · free | AG Grid Enterprisepaid tier |
|---|---|---|---|---|
| Headless core | ● | ● | — | — |
| React components shipped | ● | — | ● | ● |
| Cell editing (text, select, checkbox…) | ● | ◐ | ● | ● |
| Sorting / filtering / pagination | ● | ● | ● | ● |
| Pivot tablesYable: programmatic row model — render is DIY | ◐ | — | — | $ |
| Formula engine | ● | — | — | $ |
| Clipboard copy / paste / TSV | ● | — | — | $ |
| Fill handle (linear + geometric) | ● | — | — | $ |
| Undo / redo with event hooks | ● | — | ● | ● |
| Tree data / hierarchical rows | ● | — | — | $ |
| Async cell commits + retry | ● | — | — | — |
| 8 themed token packs | ● | — | ◐ | ◐ |
| Row virtualization | ● | ◐ | ● | ● |
| Keyboard navigation grid | ● | — | ● | ● |
| Column drag-to-reorderanimated drop indicator in Yable | ● | ◐ | ◐ | ◐ |
| License | ● | ● | ● | $ |
Tokenizer → AST → recursive evaluator with dependency graph and circular-ref detection. 17 functions: SUM, IF, ROUND, etc.
=SUM(B2:B12) * IF(D2 > 100, 1.1, 1)getPivotRowModel() returns real aggregated rows — row groups, column groups, subtotals, grand totals — from one config. React <Table> can render the generated pivot rows and dynamic columns directly.
const pivot = table.getPivotRowModel({
rows: ["region"],
values: [{ field: "revenue", aggregation: "sum" }],
})onCommit batches edits and sends them to your API. Pending/saved/error states render per-cell. Auto-retry on failure.
onCommit: async (patches) => {
await api.save(patches)
}Search, sort, select, and paginate without leaving the same component tree.
Click a header to sort. Shift-click to multi-sort.
First Name | Last Name | Email | Age | Department | Role | Salary | Start Date | Status | |
|---|---|---|---|---|---|---|---|---|---|
| Alice | Johnson | alice@example.com | 32 | Engineering | Engineer | $125,000 | Mar 15, 2021 | Active | |
| Bob | Smith | bob@example.com | 28 | Design | Designer | $95,000 | Jul 1, 2022 | Active | |
| Carol | Williams | carol@example.com | 45 | Engineering | VP Engineering | $210,000 | Jan 10, 2019 | Active | |
| David | Brown | david@example.com | 35 | Product | Product Manager | $140,000 | Nov 20, 2020 | Active | |
| Eve | Davis | eve@example.com | 26 | Engineering | Junior Engineer | $85,000 | Feb 14, 2023 | Active | |
| Frank | Miller | frank@example.com | 41 | Design | Senior Designer | $130,000 | Sep 5, 2018 | Inactive | |
| Grace | Wilson | grace@example.com | 30 | Engineering | Engineer | $120,000 | Jun 30, 2021 | Active | |
| Henry | Moore | henry@example.com | 38 | Engineering | Engineering Manager | $175,000 | Apr 22, 2019 | Active | |
| Ivy | Taylor | ivy@example.com | 29 | Design | Designer | $100,000 | Jan 17, 2022 | Active | |
| Jack | Anderson | jack@example.com | 33 | Engineering | Data Scientist | $145,000 | Aug 12, 2020 | Active |
Pretext measures every variable-height row before paint. Pick a size — numbers are live.
Title | Excerpt | Author | Category |
|---|---|---|---|
Each step has copy-paste code tested in a live Next.js app.