Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
69 commits
Select commit Hold shift + click to select a range
ee1b538
feat: initialize ember-table addon
rtablada Jun 29, 2026
8d5b7a8
chore: update build and package to tanstack
rtablada Jun 29, 2026
46c52cf
claude: initial use-table ember-table implementation
rtablada Jun 29, 2026
53ae208
feat: flex-render uses components
rtablada Jun 30, 2026
280ee4c
feat: fix the types around flex render
rtablada Jun 30, 2026
795379b
wip: initialize test-app for ember-table
rtablada Jun 29, 2026
d541253
feat: implement basic-external-state ember example
rtablada Jun 29, 2026
0cfc3bf
remove legacy directory gitkeeps
rtablada Jun 30, 2026
d6cda72
fix: use FlexRender components
rtablada Jun 30, 2026
27eaa7c
wip: working on ember with external state
rtablada Jul 2, 2026
7c0ec68
feat: working reactivity and use-table
rtablada Jul 2, 2026
c55c817
feat: for initial development internalize examples
rtablada Jul 2, 2026
b1ae417
example: kitchen sink
rtablada Jul 3, 2026
345b266
wip: removing example ember temporarily
rtablada Jul 3, 2026
9bf699b
chore: remove ember-cli legacy addon files
rtablada Jul 9, 2026
30c9d91
rebased pnpm-lock
rtablada Jul 9, 2026
03c31b4
test: add base test example
rtablada Jul 9, 2026
5566cdc
test: add reactivity and use-table tests
rtablada Jul 9, 2026
6544080
test: flex render test
rtablada Jul 9, 2026
5eb858d
claude: wrap state slices in proxy object
rtablada Jul 9, 2026
3944589
feat: test with ember create-atom
rtablada Jul 9, 2026
7cfac9a
claude: update value with compare
rtablada Jul 9, 2026
0ce015d
subscribe with ember
rtablada Jul 9, 2026
42a30c8
ref: move signals to own file
rtablada Jul 10, 2026
77b9ad6
chore: update use-state comment/type and lint fix
rtablada Jul 10, 2026
02129e1
chore: remove duplicate configs and move prettier to root
rtablada Jul 10, 2026
82c4977
lint: update to global prettier config
rtablada Jul 10, 2026
146c0be
wip: blank example app
rtablada Jul 10, 2026
e59512b
example: basic-table
rtablada Jul 10, 2026
d4258b1
example: basic-external-state
rtablada Jul 10, 2026
f1233b1
example: sorting
rtablada Jul 10, 2026
32770d0
example: filters
rtablada Jul 10, 2026
a7a5850
example: filters-faceted
rtablada Jul 10, 2026
c3300d9
example: filters-fuzzy
rtablada Jul 10, 2026
f1c6948
example: pagination
rtablada Jul 10, 2026
771e998
example: row-selection
rtablada Jul 10, 2026
4599712
example: expanding
rtablada Jul 10, 2026
21279dc
example: sub-components
rtablada Jul 10, 2026
d62c49a
example: row-pinning
rtablada Jul 10, 2026
d7d7fd3
example: grouping
rtablada Jul 10, 2026
a432ee8
example: editable
rtablada Jul 10, 2026
4981377
example: row-dnd
rtablada Jul 10, 2026
ea0099e
example: column-groups
rtablada Jul 10, 2026
45a341d
example: column-visibility
rtablada Jul 10, 2026
a1edea2
example: column-ordering
rtablada Jul 10, 2026
5aef2c6
example: column-pinning
rtablada Jul 10, 2026
c326eec
example: column-pinning-sticky
rtablada Jul 10, 2026
8a7a761
example: column-pinning-split
rtablada Jul 10, 2026
1b8c4e2
example: column-sizing
rtablada Jul 10, 2026
ce9ba5e
example: column-resizing
rtablada Jul 10, 2026
1bf9cb7
example: column-resizing-performant
rtablada Jul 10, 2026
d0d2bf3
example: custom-plugin
rtablada Jul 10, 2026
5351ea0
example: remote-data
rtablada Jul 10, 2026
c97250d
example: kitchen-sink
rtablada Jul 10, 2026
4cafd76
example: basic-external-atoms
rtablada Jul 10, 2026
57c768f
chore: remove the ember demo-app
rtablada Jul 10, 2026
0d99c1f
fix: run lint fix
rtablada Jul 10, 2026
707877f
fix: remove unused dev deps and update order of package deps
rtablada Jul 10, 2026
54e1c49
ref: change `@args` to `@optins`
rtablada Jul 11, 2026
e6e401c
fix: sherif
rtablada Jul 11, 2026
1a7096b
fix: lints
rtablada Jul 11, 2026
eeb6aa4
fix: lints
rtablada Jul 11, 2026
c41284f
fix: knip config
rtablada Jul 11, 2026
f8c479e
ci: apply automated fixes
autofix-ci[bot] Jul 11, 2026
94de400
generate ember api reference docs, add smoke tests, fix wrong api met…
KevinVandy Jul 11, 2026
629520b
add ember docs
KevinVandy Jul 11, 2026
990918e
create ember-table skills and update fix example inconsistencies
KevinVandy Jul 11, 2026
4af3daf
try to fix nx target for ember
KevinVandy Jul 11, 2026
07f7f5a
remove unncessary devDeps
KevinVandy Jul 11, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
1 change: 1 addition & 0 deletions .prettierignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
**/reference
**/old-examples
**/examples/**/*.svelte
**/test-results
pnpm-lock.yaml
docs/config.json

Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
> - [Svelte Table](https://tanstack.com/table/alpha/docs/framework/svelte/svelte-table)
> - [Vue Table](https://tanstack.com/table/alpha/docs/framework/vue/vue-table)
> - [Alpine Table](https://tanstack.com/table/alpha/docs/framework/alpine/alpine-table)
> - [Ember Table](https://tanstack.com/table/alpha/docs/framework/ember/ember-table)

A headless table library for building powerful datagrids with full control over markup, styles, and behavior.

Expand Down
58 changes: 57 additions & 1 deletion _artifacts/domain_map.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ scope:
- 'Use docs and examples for intended workflows, and direct exact API discovery to the installed package src directory.'
- 'Teach headless rendering, feature registration, row-model ownership, framework state, and v8-to-v9 changes as foundations.'
included:
- 'All 16 public workspace packages.'
- 'All 17 public workspace packages.'
- 'All 14 stock Table v9 features, custom features, TypeScript helpers, migrations, framework state, composable table hooks, Query, Virtual, Devtools, and fuzzy ranking.'
- 'Renderer-owned CSS edge cases for sticky positioning, column widths, resizing, layout, and virtualization.'
excluded:
Expand Down Expand Up @@ -1271,6 +1271,62 @@ skills:
- 'Virtualizing raw input data instead of table.getRowModel().rows.'
- 'Assuming Virtual or Table owns absolute positioning, measurement attributes, sticky CSS, or column widths.'

- slug: getting-started
package: '@tanstack/ember-table'
domain: framework-adapters
type: framework
framework: ember
purpose: 'Create an Ember v9 table through the tracked useTable options thunk and render it with Glimmer-native FlexRender components.'
sources:
[
'TanStack/table:docs/framework/ember/quick-start.md',
'TanStack/table:examples/ember/basic-table',
'TanStack/table:packages/ember-table/src/index.ts',
'TanStack/table:packages/ember-table/src/use-table.ts',
'TanStack/table:packages/ember-table/src/FlexRender.gts',
]
failure_modes:
- 'Passing an options object instead of a thunk, or failing to read tracked data inside that thunk.'
- 'Passing extracted v9 prototype methods through Ember templates without preserving their receiver.'
- 'Recreating features, columns, or derived data whenever tracked options rerun.'

- slug: table-state
package: '@tanstack/ember-table'
domain: framework-adapters
type: framework
framework: ember
purpose: 'Use Glimmer-tracked table reads and own slices internally, through Ember atoms, or through tracked controlled state.'
sources:
[
'TanStack/table:docs/framework/ember/guide/table-state.md',
'TanStack/table:examples/ember/basic-external-atoms',
'TanStack/table:examples/ember/basic-external-state',
'TanStack/table:packages/ember-table/src/use-table.ts',
'TanStack/table:packages/ember-table/src/reactivity.ts',
'TanStack/table:packages/ember-table/src/signal.ts',
]
failure_modes:
- 'Inventing table.Subscribe or using the intentionally no-op table.store.subscribe instead of Glimmer-tracked reads.'
- 'Using removed table.getState() rather than table.store.state or a slice atom.'
- 'Mixing atoms and state ownership, omitting updater resolution, or trying to replace construct-time atoms after table creation.'

- slug: create-table-hook
package: '@tanstack/ember-table'
domain: framework-adapters
type: framework
framework: ember
purpose: 'Share Ember table features, row-model slots, defaults, and inferred column helpers without inventing a component registry.'
sources:
[
'TanStack/table:docs/framework/ember/guide/composable-tables.md',
'TanStack/table:examples/ember/basic-app-table',
'TanStack/table:packages/ember-table/src/create-table-hook.ts',
]
failure_modes:
- 'Expecting AppTable/AppCell/context registries that the Ember factory does not implement.'
- 'Passing features at each createAppTable call or recreating the app hook in tracked scope.'
- 'Putting shared mutable state in factory defaults instead of keeping state ownership per table.'

- slug: getting-started
package: '@tanstack/alpine-table'
domain: framework-adapters
Expand Down
21 changes: 18 additions & 3 deletions _artifacts/skill_spec.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ This specification is the generation contract for a deliberately smaller, foot-g

## Outcome

Generate 72 short package-local skills across all 16 public packages. A loaded skill should quickly do three things:
Generate 75 short package-local skills across all 17 public packages. A loaded skill should quickly do three things:

1. Correct the user or agent mental model.
2. Show the smallest reliable setup or decision pattern.
Expand Down Expand Up @@ -233,7 +233,13 @@ Alpine ships three:
- table-state
- create-table-hook

Do not add Query where no maintained adapter example exists. Do not add an Alpine migration skill because there is no v8 Alpine adapter journey to teach. Do not invent Preact virtualization examples; its Virtual skill should rely on the maintained adapter guide and installed APIs.
Ember ships three:

- getting-started
- table-state
- create-table-hook

Do not add Query where no maintained adapter example exists. Do not add Alpine or Ember migration skills because neither has a v8 adapter journey to teach. Do not add Ember Query or Virtual skills until maintained adapter examples exist. Do not invent Preact virtualization examples; its Virtual skill should rely on the maintained adapter guide and installed APIs.

### Devtools set (6)

Expand Down Expand Up @@ -265,14 +271,15 @@ All Devtools skills must emphasize the required non-empty table options.key, lif
| @tanstack/angular-table | 6 |
| @tanstack/lit-table | 5 |
| @tanstack/alpine-table | 3 |
| @tanstack/ember-table | 3 |
| @tanstack/table-devtools | 1 |
| @tanstack/react-table-devtools | 1 |
| @tanstack/preact-table-devtools | 1 |
| @tanstack/solid-table-devtools | 1 |
| @tanstack/vue-table-devtools | 1 |
| @tanstack/angular-table-devtools | 1 |
| @tanstack/match-sorter-utils | 1 |
| Total | 72 |
| Total | 75 |

## Framework distinctions that must survive generation

Expand Down Expand Up @@ -323,6 +330,14 @@ All Devtools skills must emphasize the required non-empty table options.key, lif
- x-html does not initialize nested Alpine directives.
- createTableHook shares features/options/helpers, not a reusable component registry.

### Ember

- `useTable` and `createAppTable` take options thunks; tracked values must be read inside the thunk while features, atoms, and columns remain stable.
- Glimmer tracks table API and Ember atom reads directly. There is no table.Subscribe, `table.store.subscribe` is intentionally a no-op, and v8 `table.getState()` is removed.
- V9 prototype methods need their receiver, so templates use getters or module helpers rather than extracted table/column/row methods.
- FlexRender components receive `@ctx` and optional `@options`.
- Ember createTableHook shares features/defaults and inferred column helpers; it does not provide component or context registries.

## Cross-cutting placement rules

- Performance: stable inputs in getting-started/core; selectors in table-state; CSS variables in resizing; measurement/overscan in Virtual; row ownership in client-vs-server.
Expand Down
45 changes: 45 additions & 0 deletions _artifacts/skill_tree.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -938,6 +938,51 @@ skills:
- 'TanStack/table:examples/lit/virtualized-columns'
- 'TanStack/table:examples/lit/virtualized-infinite-scrolling'

- name: 'Ember Getting Started'
slug: getting-started
type: framework
domain: framework-adapters
path: 'packages/ember-table/skills/getting-started/SKILL.md'
package: 'packages/ember-table'
description: "Create a TanStack Ember Table v9 table with useTable, a tracked options thunk, stable tableFeatures and columns, .gts templates, FlexRenderCell/Header/Footer, and correctly bound template helpers. Load for first-table setup, Glimmer reactivity, component cell renderers, or adapting another framework's example to Ember."
requires:
['@tanstack/table-core#core', '@tanstack/table-core#table-features']
sources:
- 'TanStack/table:docs/framework/ember/quick-start.md'
- 'TanStack/table:examples/ember/basic-table'
- 'TanStack/table:packages/ember-table/src/index.ts'
- 'TanStack/table:packages/ember-table/src/use-table.ts'
- 'TanStack/table:packages/ember-table/src/FlexRender.gts'

- name: 'Ember Table State'
slug: table-state
type: framework
domain: framework-adapters
path: 'packages/ember-table/skills/table-state/SKILL.md'
package: 'packages/ember-table'
description: 'Read, track, initialize, control, and reset TanStack Ember Table v9 state through Glimmer-reactive table APIs, baseAtoms, atoms, store, Ember createAtom, or @tracked state plus on*Change. Load for ownership precedence, updater callbacks, stale template state, options-thunk reactivity, or incorrect table.Subscribe/store.subscribe usage.'
requires: ['@tanstack/table-core#core', 'getting-started']
sources:
- 'TanStack/table:docs/framework/ember/guide/table-state.md'
- 'TanStack/table:examples/ember/basic-external-atoms'
- 'TanStack/table:examples/ember/basic-external-state'
- 'TanStack/table:packages/ember-table/src/use-table.ts'
- 'TanStack/table:packages/ember-table/src/reactivity.ts'
- 'TanStack/table:packages/ember-table/src/signal.ts'

- name: 'Ember createTableHook'
slug: create-table-hook
type: framework
domain: framework-adapters
path: 'packages/ember-table/skills/create-table-hook/SKILL.md'
package: 'packages/ember-table'
description: 'Share TanStack Ember Table v9 features, row-model slots, defaults, and inferred column helpers with createTableHook, createAppTable, createAppColumnHelper, and appFeatures. Load for recurring Ember table conventions, per-table overrides, or confusion with component/context registries from other adapters.'
requires: ['@tanstack/table-core#core', 'getting-started', 'table-state']
sources:
- 'TanStack/table:docs/framework/ember/guide/composable-tables.md'
- 'TanStack/table:examples/ember/basic-app-table'
- 'TanStack/table:packages/ember-table/src/create-table-hook.ts'

- name: 'Alpine Getting Started'
slug: getting-started
type: framework
Expand Down
108 changes: 108 additions & 0 deletions docs/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,12 @@
{ "label": "Rendering components", "to": "framework/angular/guide/rendering" }
]
},
{
"label": "ember",
"children": [
{ "label": "Quick Start", "to": "framework/ember/quick-start" }
]
},
{
"label": "lit",
"children": [
Expand Down Expand Up @@ -121,6 +127,14 @@
{ "label": "Custom Plugins", "to": "framework/angular/guide/custom-features" }
]
},
{
"label": "ember",
"children": [
{ "label": "Table State", "to": "framework/ember/guide/table-state" },
{ "label": "Composable Tables (createTableHook)", "to": "framework/ember/guide/composable-tables" },
{ "label": "Custom Plugins", "to": "framework/ember/guide/custom-features" }
]
},
{
"label": "lit",
"children": [
Expand Down Expand Up @@ -224,6 +238,26 @@
{ "label": "Virtualization", "to": "framework/angular/guide/virtualization" }
]
},
{
"label": "ember",
"children": [
{ "label": "Column Ordering", "to": "framework/ember/guide/column-ordering" },
{ "label": "Column Pinning", "to": "framework/ember/guide/column-pinning" },
{ "label": "Column Sizing", "to": "framework/ember/guide/column-sizing" },
{ "label": "Column Resizing", "to": "framework/ember/guide/column-resizing" },
{ "label": "Column Visibility", "to": "framework/ember/guide/column-visibility" },
{ "label": "Column Filtering", "to": "framework/ember/guide/column-filtering" },
{ "label": "Global Filtering", "to": "framework/ember/guide/global-filtering" },
{ "label": "Fuzzy Filtering", "to": "framework/ember/guide/fuzzy-filtering" },
{ "label": "Faceting", "to": "framework/ember/guide/column-faceting" },
{ "label": "Grouping", "to": "framework/ember/guide/grouping" },
{ "label": "Expanding", "to": "framework/ember/guide/expanding" },
{ "label": "Pagination", "to": "framework/ember/guide/pagination" },
{ "label": "Row Pinning", "to": "framework/ember/guide/row-pinning" },
{ "label": "Row Selection", "to": "framework/ember/guide/row-selection" },
{ "label": "Sorting", "to": "framework/ember/guide/sorting" }
]
},
{
"label": "lit",
"children": [
Expand Down Expand Up @@ -370,6 +404,12 @@
{ "label": "Angular API Reference", "to": "framework/angular/reference/index" }
]
},
{
"label": "ember",
"children": [
{ "label": "Ember API Reference", "to": "framework/ember/reference/index" }
]
},
{
"label": "react",
"children": [
Expand Down Expand Up @@ -473,6 +513,25 @@
{ "label": "injectTableContext", "to": "framework/angular/reference/functions/injectTableContext" }
]
},
{
"label": "ember",
"children": [
{ "label": "useTable", "to": "framework/ember/reference/functions/useTable" },
{ "label": "createTableHook", "to": "framework/ember/reference/functions/createTableHook" },
{ "label": "AppEmberTable", "to": "framework/ember/reference/type-aliases/AppEmberTable" },
{ "label": "CreateTableHookOptions", "to": "framework/ember/reference/type-aliases/CreateTableHookOptions" },
{ "label": "FlexRenderCell", "to": "framework/ember/reference/classes/FlexRenderCell" },
{ "label": "FlexRenderHeader", "to": "framework/ember/reference/classes/FlexRenderHeader" },
{ "label": "FlexRenderFooter", "to": "framework/ember/reference/classes/FlexRenderFooter" },
{ "label": "flexRenderComponent", "to": "framework/ember/reference/functions/flexRenderComponent" },
{ "label": "FlexRenderableSignature", "to": "framework/ember/reference/interfaces/FlexRenderableSignature" },
{ "label": "CellRenderableSignature", "to": "framework/ember/reference/interfaces/CellRenderableSignature" },
{ "label": "emberReactivity", "to": "framework/ember/reference/functions/emberReactivity" },
{ "label": "createAtom", "to": "framework/ember/reference/functions/createAtom" },
{ "label": "signal", "to": "framework/ember/reference/functions/signal" },
{ "label": "computed", "to": "framework/ember/reference/functions/computed" }
]
},
{
"label": "preact",
"children": [
Expand Down Expand Up @@ -580,6 +639,12 @@
{ "label": "AppColumnHelper", "to": "framework/angular/reference/type-aliases/AppColumnHelper" }
]
},
{
"label": "ember",
"children": [
{ "label": "AppColumnHelper", "to": "framework/ember/reference/type-aliases/AppColumnHelper" }
]
},
{
"label": "preact",
"children": [
Expand Down Expand Up @@ -875,6 +940,16 @@
{ "label": "Header Groups", "to": "framework/angular/examples/column-groups" }
]
},
{
"label": "ember",
"children": [
{ "label": "Basic (useTable)", "to": "framework/ember/examples/basic-table" },
{ "label": "Basic (createAppTable)", "to": "framework/ember/examples/basic-app-table" },
{ "label": "Basic (External State)", "to": "framework/ember/examples/basic-external-state" },
{ "label": "Basic (External Atoms)", "to": "framework/ember/examples/basic-external-atoms" },
{ "label": "Header Groups", "to": "framework/ember/examples/column-groups" }
]
},
{
"label": "lit",
"children": [
Expand Down Expand Up @@ -1005,6 +1080,30 @@
{ "label": "Sorting", "to": "framework/angular/examples/sorting" }
]
},
{
"label": "ember",
"children": [
{ "label": "Kitchen Sink (All Features)", "to": "framework/ember/examples/kitchen-sink" },
{ "label": "Column Filters", "to": "framework/ember/examples/filters" },
{ "label": "Column Filters (Faceted)", "to": "framework/ember/examples/filters-faceted" },
{ "label": "Fuzzy Search Filters", "to": "framework/ember/examples/filters-fuzzy" },
{ "label": "Column Ordering", "to": "framework/ember/examples/column-ordering" },
{ "label": "Column Pinning", "to": "framework/ember/examples/column-pinning" },
{ "label": "Column Pinning (Split)", "to": "framework/ember/examples/column-pinning-split" },
{ "label": "Sticky Column Pinning", "to": "framework/ember/examples/column-pinning-sticky" },
{ "label": "Column Sizing", "to": "framework/ember/examples/column-sizing" },
{ "label": "Column Resizing", "to": "framework/ember/examples/column-resizing" },
{ "label": "Performant Column Resizing", "to": "framework/ember/examples/column-resizing-performant" },
{ "label": "Column Visibility", "to": "framework/ember/examples/column-visibility" },
{ "label": "Expanding", "to": "framework/ember/examples/expanding" },
{ "label": "Expanding Sub Components", "to": "framework/ember/examples/sub-components" },
{ "label": "Grouping", "to": "framework/ember/examples/grouping" },
{ "label": "Pagination", "to": "framework/ember/examples/pagination" },
{ "label": "Row Pinning", "to": "framework/ember/examples/row-pinning" },
{ "label": "Row Selection", "to": "framework/ember/examples/row-selection" },
{ "label": "Sorting", "to": "framework/ember/examples/sorting" }
]
},
{
"label": "lit",
"children": [
Expand Down Expand Up @@ -1188,6 +1287,15 @@
{ "label": "Row Drag & Drop", "to": "framework/angular/examples/row-dnd" }
]
},
{
"label": "ember",
"children": [
{ "label": "Custom Plugin", "to": "framework/ember/examples/custom-plugin" },
{ "label": "Editable data", "to": "framework/ember/examples/editable" },
{ "label": "Fetch API data (SPA / SSR)", "to": "framework/ember/examples/remote-data" },
{ "label": "Row Drag & Drop", "to": "framework/ember/examples/row-dnd" }
]
},
{
"label": "lit",
"children": [
Expand Down
Loading
Loading