diff --git a/examples/angular/basic-app-table/package.json b/examples/angular/basic-app-table/package.json index 4b4b7cb703..dc3da4ee65 100644 --- a/examples/angular/basic-app-table/package.json +++ b/examples/angular/basic-app-table/package.json @@ -17,7 +17,9 @@ "@angular/forms": "^21.2.13", "@angular/platform-browser": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/basic-app-table/src/app/app.config.ts b/examples/angular/basic-app-table/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/basic-app-table/src/app/app.config.ts +++ b/examples/angular/basic-app-table/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/basic-app-table/src/app/app.html b/examples/angular/basic-app-table/src/app/app.html index bb2de8903e..a5eff916f6 100644 --- a/examples/angular/basic-app-table/src/app/app.html +++ b/examples/angular/basic-app-table/src/app/app.html @@ -1,17 +1,16 @@
- - -
@for (headerGroup of table.getHeaderGroups(); track headerGroup.id) { @for (header of headerGroup.headers; track header.id) { - @if (!header.isPlaceholder) { - - } + } } @@ -20,8 +19,10 @@ @for (row of table.getRowModel().rows; track row.id) { @for (cell of row.getAllCells(); track cell.id) { - } @@ -31,12 +32,19 @@ @for (footerGroup of table.getFooterGroups(); track footerGroup.id) { @for (footer of footerGroup.headers; track footer.id) { - } }
-
-
+ @if (!header.isPlaceholder) { + + {{ headerCell }} + + } +
-
+
+ + {{ renderCell }} +
- {{ footer }} + + @if (!footer.isPlaceholder) { + + {{ footerCell }} + + }
+
+ + Render count: {{ renderCount() }}
diff --git a/examples/angular/basic-app-table/src/app/app.ts b/examples/angular/basic-app-table/src/app/app.ts index cb578b1920..8e33e614c0 100644 --- a/examples/angular/basic-app-table/src/app/app.ts +++ b/examples/angular/basic-app-table/src/app/app.ts @@ -1,34 +1,78 @@ import { ChangeDetectionStrategy, Component, signal } from '@angular/core' import { FlexRender, createTableHook } from '@tanstack/angular-table' -import { makeData } from './makeData' -import type { Person } from './makeData' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' + +// This example uses `createTableHook` to create a reusable Angular table helper instead of independently using `injectTable` and `createColumnHelper`. + +// 1. Define what the shape of your data will be for each row +type Person = { + firstName: string + lastName: string + age: number + visits: number + status: string + progress: number +} + +// 2. Create some dummy data with a stable reference +const defaultData: Array = [ + { + firstName: 'tanner', + lastName: 'linsley', + age: 24, + visits: 100, + status: 'In Relationship', + progress: 50, + }, + { + firstName: 'tandy', + lastName: 'miller', + age: 40, + visits: 40, + status: 'Single', + progress: 80, + }, + { + firstName: 'joe', + lastName: 'dirte', + age: 45, + visits: 20, + status: 'Complicated', + progress: 10, + }, + { + firstName: 'kevin', + lastName: 'vandy', + age: 28, + visits: 100, + status: 'Single', + progress: 70, + }, +] // 3. New in V9! Tell the table which features and row models we want to use. // In this case, this will be a basic table with no additional features const { injectAppTable, createAppColumnHelper } = createTableHook({ _features: {}, - _rowModels: {}, // client-side row models. `Core` row model is now included by default, but you can still override it here + _rowModels: {}, debugTable: true, }) // 4. Create a helper object to help define our columns const columnHelper = createAppColumnHelper() -// 5. Define the columns for your table with a stable reference (in this case, defined statically outside of a react component) +// 5. Define the columns for your table with a stable reference const columns = columnHelper.columns([ - // accessorKey method (most common for simple use-cases) columnHelper.accessor('firstName', { cell: (info) => info.getValue(), footer: (info) => info.column.id, }), - // accessorFn used (alternative) along with a custom id columnHelper.accessor((row) => row.lastName, { id: 'lastName', - cell: (info) => `${info.getValue()}`, - header: () => `Last Name`, + cell: (info) => info.getValue(), + header: () => 'Last Name', footer: (info) => info.column.id, }), - // accessorFn used to transform the data columnHelper.accessor((row) => Number(row.age), { id: 'age', header: () => 'Age', @@ -36,7 +80,7 @@ const columns = columnHelper.columns([ footer: (info) => info.column.id, }), columnHelper.accessor('visits', { - header: () => `Visits`, + header: () => 'Visits', footer: (info) => info.column.id, }), columnHelper.accessor('status', { @@ -56,16 +100,25 @@ const columns = columnHelper.columns([ changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { - readonly data = signal>(makeData(20)) + // 6. Store data with a stable reference + readonly data = signal>([...defaultData]) + readonly renderCount = signal(0) - // 6. Create the table instance with the required columns and data. + // 7. Create the table instance with the required columns and data. // Features and row models are already defined in the createTableHook call above readonly table = injectAppTable(() => ({ + debugTable: true, columns, data: this.data(), - // add additional table options here or in the createTableHook call above })) - refreshData = () => this.data.set(makeData(20)) - stressTest = () => this.data.set(makeData(1_000)) + rerender() { + this.renderCount.update((count) => count + 1) + } + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'basic-app-table', + })) + } } diff --git a/examples/angular/basic-external-atoms/angular.json b/examples/angular/basic-external-atoms/angular.json new file mode 100644 index 0000000000..83757030d4 --- /dev/null +++ b/examples/angular/basic-external-atoms/angular.json @@ -0,0 +1,64 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "analytics": false, + "cache": { "enabled": false } + }, + "newProjectRoot": "projects", + "projects": { + "basic-external-atoms": { + "projectType": "application", + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [], + "styles": ["src/styles.css"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "basic-external-atoms:build:production" + }, + "development": { + "buildTarget": "basic-external-atoms:build:development" + } + }, + "defaultConfiguration": "development" + } + } + } + } +} diff --git a/examples/angular/basic-external-atoms/package.json b/examples/angular/basic-external-atoms/package.json new file mode 100644 index 0000000000..c3760306df --- /dev/null +++ b/examples/angular/basic-external-atoms/package.json @@ -0,0 +1,31 @@ +{ + "name": "tanstack-angular-table-example-basic-external-atoms", + "scripts": { + "ng": "ng", + "start": "ng serve --port 5173", + "dev": "ng serve --port 5173", + "build": "ng build", + "lint": "eslint ./src", + "watch": "ng build --watch --configuration development" + }, + "private": true, + "packageManager": "pnpm@11.1.3", + "dependencies": { + "@angular/common": "^21.2.13", + "@angular/compiler": "^21.2.13", + "@angular/core": "^21.2.13", + "@angular/forms": "^21.2.13", + "@angular/platform-browser": "^21.2.13", + "@faker-js/faker": "^10.4.0", + "@tanstack/angular-store": "^0.11.0", + "@tanstack/angular-table": "^9.0.0-alpha.49", + "rxjs": "~7.8.2", + "tslib": "^2.8.1" + }, + "devDependencies": { + "@angular/build": "^21.2.11", + "@angular/cli": "^21.2.11", + "@angular/compiler-cli": "^21.2.13", + "typescript": "6.0.3" + } +} diff --git a/examples/angular/basic-external-atoms/src/app/app.config.ts b/examples/angular/basic-external-atoms/src/app/app.config.ts new file mode 100644 index 0000000000..cbb47d366c --- /dev/null +++ b/examples/angular/basic-external-atoms/src/app/app.config.ts @@ -0,0 +1,6 @@ +import { provideBrowserGlobalErrorListeners } from '@angular/core' +import type { ApplicationConfig } from '@angular/core' + +export const appConfig: ApplicationConfig = { + providers: [provideBrowserGlobalErrorListeners()], +} diff --git a/examples/angular/basic-external-atoms/src/app/app.html b/examples/angular/basic-external-atoms/src/app/app.html new file mode 100644 index 0000000000..6403827699 --- /dev/null +++ b/examples/angular/basic-external-atoms/src/app/app.html @@ -0,0 +1,103 @@ +
+
+ + +
+
+ + + @for (headerGroup of table.getHeaderGroups(); track headerGroup.id) { + + @for (header of headerGroup.headers; track header.id) { + + } + + } + + + @for (row of table.getRowModel().rows; track row.id) { + + @for (cell of row.getAllCells(); track cell.id) { + + } + + } + +
+ @if (!header.isPlaceholder) { +
+ {{ + headerCell + }} + @if (header.column.getIsSorted() === 'asc') { + 🔼 + } + @if (header.column.getIsSorted() === 'desc') { + 🔽 + } +
+ } +
+ {{ renderCell }} +
+
+
+ + + + +
Page
+ {{ (pagination().pageIndex + 1).toLocaleString() }} of + {{ table.getPageCount().toLocaleString() }}
+ | Go to page: + + +
+
+ + Render count: {{ renderCount() }} +
{{ stateJson() }}
+
diff --git a/examples/angular/basic-external-atoms/src/app/app.ts b/examples/angular/basic-external-atoms/src/app/app.ts new file mode 100644 index 0000000000..8892652516 --- /dev/null +++ b/examples/angular/basic-external-atoms/src/app/app.ts @@ -0,0 +1,115 @@ +import { + ChangeDetectionStrategy, + Component, + Injector, + effect, + inject, + signal, +} from '@angular/core' +import { createAtom, injectSelector } from '@tanstack/angular-store' +import { + FlexRender, + createColumnHelper, + createPaginatedRowModel, + createSortedRowModel, + injectTable, + rowPaginationFeature, + rowSortingFeature, + sortFns, + tableFeatures, +} from '@tanstack/angular-table' +import { makeData } from './makeData' +import type { PaginationState, SortingState } from '@tanstack/angular-table' +import type { Person } from './makeData' + +const _features = tableFeatures({ rowPaginationFeature, rowSortingFeature }) + +const columnHelper = createColumnHelper() + +const columns = columnHelper.columns([ + columnHelper.accessor('firstName', { + header: 'First Name', + cell: (info) => info.getValue(), + }), + columnHelper.accessor('lastName', { + header: 'Last Name', + cell: (info) => info.getValue(), + }), + columnHelper.accessor('age', { header: 'Age' }), + columnHelper.accessor('visits', { header: 'Visits' }), + columnHelper.accessor('status', { header: 'Status' }), + columnHelper.accessor('progress', { header: 'Profile Progress' }), +]) + +@Component({ + selector: 'app-root', + imports: [FlexRender], + templateUrl: './app.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class App { + private readonly injector = inject(Injector) + + readonly data = signal(makeData(1_000)) + readonly renderCount = signal(0) + readonly sortingAtom = createAtom([]) + readonly paginationAtom = createAtom({ + pageIndex: 0, + pageSize: 10, + }) + + readonly sorting = injectSelector(this.sortingAtom) + readonly pagination = injectSelector(this.paginationAtom) + + readonly table = injectTable(() => ({ + debugTable: true, + _features, + _rowModels: { + sortedRowModel: createSortedRowModel(sortFns), + paginatedRowModel: createPaginatedRowModel(), + }, + columns, + data: this.data(), + atoms: { + sorting: this.sortingAtom, + pagination: this.paginationAtom, + }, + })) + + constructor() { + effect(() => { + console.log('atom', this.paginationAtom.get()) + }) + } + + refreshData() { + this.data.set(makeData(1_000)) + } + + stressTest() { + this.data.set(makeData(200_000)) + } + + rerender() { + this.renderCount.update((count) => count + 1) + } + + onPageInputChange(event: Event) { + const input = event.target as HTMLInputElement + const page = input.value ? Number(input.value) - 1 : 0 + this.table.setPageIndex(page) + } + + onPageSizeChange(event: Event) { + const select = event.target as HTMLSelectElement + this.table.setPageSize(Number(select.value)) + } + + stateJson() { + return JSON.stringify( + { sorting: this.sorting(), pagination: this.pagination() }, + null, + 2, + ) + } +} diff --git a/examples/angular/basic-external-atoms/src/app/makeData.ts b/examples/angular/basic-external-atoms/src/app/makeData.ts new file mode 100644 index 0000000000..70d0f2dd79 --- /dev/null +++ b/examples/angular/basic-external-atoms/src/app/makeData.ts @@ -0,0 +1,25 @@ +import { faker } from '@faker-js/faker' + +export type Person = { + firstName: string + lastName: string + age: number + visits: number + status: 'relationship' | 'complicated' | 'single' + progress: number +} + +const range = (len: number) => Array.from({ length: len }, (_, index) => index) + +const newPerson = (): Person => ({ + firstName: faker.person.firstName(), + lastName: faker.person.lastName(), + age: faker.number.int(40), + visits: faker.number.int(1000), + status: faker.helpers.arrayElement(['relationship', 'complicated', 'single']), + progress: faker.number.int(100), +}) + +export function makeData(len: number): Array { + return range(len).map(() => newPerson()) +} diff --git a/examples/angular/basic-external-atoms/src/index.html b/examples/angular/basic-external-atoms/src/index.html new file mode 100644 index 0000000000..2035204fa7 --- /dev/null +++ b/examples/angular/basic-external-atoms/src/index.html @@ -0,0 +1,12 @@ + + + + + Basic External Atoms + + + + + + + diff --git a/examples/angular/basic-external-atoms/src/main.ts b/examples/angular/basic-external-atoms/src/main.ts new file mode 100644 index 0000000000..8192dca694 --- /dev/null +++ b/examples/angular/basic-external-atoms/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser' +import { appConfig } from './app/app.config' +import { App } from './app/app' + +bootstrapApplication(App, appConfig).catch((err) => console.error(err)) diff --git a/examples/angular/basic-external-atoms/src/styles.css b/examples/angular/basic-external-atoms/src/styles.css new file mode 100644 index 0000000000..2a30368984 --- /dev/null +++ b/examples/angular/basic-external-atoms/src/styles.css @@ -0,0 +1,49 @@ +html { + font-family: sans-serif; + font-size: 14px; +} +table { + border: 1px solid lightgray; + border-collapse: collapse; + border-spacing: 0; +} +tbody { + border-bottom: 1px solid lightgray; +} +th, +td { + border-bottom: 1px solid lightgray; + border-right: 1px solid lightgray; + padding: 2px 4px; +} +.demo-root { + padding: 0.5rem; +} +.spacer-sm { + height: 0.5rem; +} +.spacer-md { + height: 1rem; +} +.controls, +.inline-controls { + display: flex; + align-items: center; + gap: 0.5rem; +} +.demo-button { + border: 1px solid currentColor; + border-radius: 0.25rem; + padding: 0.5rem; +} +.demo-button-sm { + padding: 0.25rem; +} +.sortable-header { + cursor: pointer; + user-select: none; +} +.page-size-input { + width: 4rem; + padding: 0.25rem; +} diff --git a/examples/angular/basic-external-atoms/tsconfig.app.json b/examples/angular/basic-external-atoms/tsconfig.app.json new file mode 100644 index 0000000000..12855a8e4d --- /dev/null +++ b/examples/angular/basic-external-atoms/tsconfig.app.json @@ -0,0 +1,6 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { "outDir": "./out-tsc/app", "types": [] }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/examples/angular/basic-external-atoms/tsconfig.json b/examples/angular/basic-external-atoms/tsconfig.json new file mode 100644 index 0000000000..32789cdc2b --- /dev/null +++ b/examples/angular/basic-external-atoms/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "include": ["**/*.ts", "vite.config.js", "vite.config.ts"] +} diff --git a/examples/angular/basic-external-state/angular.json b/examples/angular/basic-external-state/angular.json new file mode 100644 index 0000000000..eb17f3e8c8 --- /dev/null +++ b/examples/angular/basic-external-state/angular.json @@ -0,0 +1,64 @@ +{ + "$schema": "./node_modules/@angular/cli/lib/config/schema.json", + "version": 1, + "cli": { + "packageManager": "pnpm", + "analytics": false, + "cache": { "enabled": false } + }, + "newProjectRoot": "projects", + "projects": { + "basic-external-state": { + "projectType": "application", + "root": "", + "sourceRoot": "src", + "prefix": "app", + "architect": { + "build": { + "builder": "@angular/build:application", + "options": { + "browser": "src/main.ts", + "tsConfig": "tsconfig.app.json", + "assets": [], + "styles": ["src/styles.css"] + }, + "configurations": { + "production": { + "budgets": [ + { + "type": "initial", + "maximumWarning": "500kB", + "maximumError": "1MB" + }, + { + "type": "anyComponentStyle", + "maximumWarning": "4kB", + "maximumError": "8kB" + } + ], + "outputHashing": "all" + }, + "development": { + "optimization": false, + "extractLicenses": false, + "sourceMap": true + } + }, + "defaultConfiguration": "production" + }, + "serve": { + "builder": "@angular/build:dev-server", + "configurations": { + "production": { + "buildTarget": "basic-external-state:build:production" + }, + "development": { + "buildTarget": "basic-external-state:build:development" + } + }, + "defaultConfiguration": "development" + } + } + } + } +} diff --git a/examples/angular/basic-external-state/package.json b/examples/angular/basic-external-state/package.json new file mode 100644 index 0000000000..60e79a0ba2 --- /dev/null +++ b/examples/angular/basic-external-state/package.json @@ -0,0 +1,31 @@ +{ + "name": "tanstack-angular-table-example-basic-external-state", + "scripts": { + "ng": "ng", + "start": "ng serve --port 5173", + "dev": "ng serve --port 5173", + "build": "ng build", + "lint": "eslint ./src", + "watch": "ng build --watch --configuration development" + }, + "private": true, + "packageManager": "pnpm@11.1.3", + "dependencies": { + "@angular/common": "^21.2.13", + "@angular/compiler": "^21.2.13", + "@angular/core": "^21.2.13", + "@angular/forms": "^21.2.13", + "@angular/platform-browser": "^21.2.13", + "@faker-js/faker": "^10.4.0", + "@tanstack/angular-store": "^0.11.0", + "@tanstack/angular-table": "^9.0.0-alpha.49", + "rxjs": "~7.8.2", + "tslib": "^2.8.1" + }, + "devDependencies": { + "@angular/build": "^21.2.11", + "@angular/cli": "^21.2.11", + "@angular/compiler-cli": "^21.2.13", + "typescript": "6.0.3" + } +} diff --git a/examples/angular/basic-external-state/src/app/app.config.ts b/examples/angular/basic-external-state/src/app/app.config.ts new file mode 100644 index 0000000000..cbb47d366c --- /dev/null +++ b/examples/angular/basic-external-state/src/app/app.config.ts @@ -0,0 +1,6 @@ +import { provideBrowserGlobalErrorListeners } from '@angular/core' +import type { ApplicationConfig } from '@angular/core' + +export const appConfig: ApplicationConfig = { + providers: [provideBrowserGlobalErrorListeners()], +} diff --git a/examples/angular/basic-external-state/src/app/app.html b/examples/angular/basic-external-state/src/app/app.html new file mode 100644 index 0000000000..792630339c --- /dev/null +++ b/examples/angular/basic-external-state/src/app/app.html @@ -0,0 +1,106 @@ +
+
+ + +
+
+ + + @for (headerGroup of table.getHeaderGroups(); track headerGroup.id) { + + @for (header of headerGroup.headers; track header.id) { + + } + + } + + + @for (row of table.getRowModel().rows; track row.id) { + + @for (cell of row.getAllCells(); track cell.id) { + + } + + } + +
+ @if (!header.isPlaceholder) { +
+ + {{ headerCell }} + + @if (header.column.getIsSorted() === 'asc') { + 🔼 + } + @if (header.column.getIsSorted() === 'desc') { + 🔽 + } +
+ } +
+ + {{ renderCell }} + +
+
+
+ + + + + +
Page
+ {{ (pagination().pageIndex + 1).toLocaleString() }} of + {{ table.getPageCount().toLocaleString() }} +
+ + | Go to page: + + + +
+
+ + Render count: {{ renderCount() }} +
{{ stateJson() }}
+
diff --git a/examples/angular/basic-external-state/src/app/app.ts b/examples/angular/basic-external-state/src/app/app.ts new file mode 100644 index 0000000000..0d3d00f743 --- /dev/null +++ b/examples/angular/basic-external-state/src/app/app.ts @@ -0,0 +1,123 @@ +import { + ChangeDetectionStrategy, + Component, + computed, + signal, +} from '@angular/core' +import { + FlexRender, + createColumnHelper, + createPaginatedRowModel, + createSortedRowModel, + injectTable, + rowPaginationFeature, + rowSortingFeature, + sortFns, + tableFeatures, +} from '@tanstack/angular-table' +import { makeData } from './makeData' +import type { + PaginationState, + SortingState, + Updater, +} from '@tanstack/angular-table' +import type { Person } from './makeData' + +const _features = tableFeatures({ + rowPaginationFeature, + rowSortingFeature, +}) + +const columnHelper = createColumnHelper() + +const columns = columnHelper.columns([ + columnHelper.accessor('firstName', { + header: 'First Name', + cell: (info) => info.getValue(), + }), + columnHelper.accessor('lastName', { + header: 'Last Name', + cell: (info) => info.getValue(), + }), + columnHelper.accessor('age', { + header: 'Age', + }), + columnHelper.accessor('visits', { + header: 'Visits', + }), + columnHelper.accessor('status', { + header: 'Status', + }), + columnHelper.accessor('progress', { + header: 'Profile Progress', + }), +]) + +@Component({ + selector: 'app-root', + imports: [FlexRender], + templateUrl: './app.html', + changeDetection: ChangeDetectionStrategy.OnPush, +}) +export class App { + readonly data = signal(makeData(1_000)) + readonly sorting = signal([]) + readonly pagination = signal({ pageIndex: 0, pageSize: 10 }) + readonly renderCount = signal(0) + + readonly table = injectTable(() => ({ + debugTable: true, + _features, + _rowModels: { + sortedRowModel: createSortedRowModel(sortFns), + paginatedRowModel: createPaginatedRowModel(), + }, + columns, + data: this.data(), + state: { + sorting: this.sorting(), + pagination: this.pagination(), + }, + onSortingChange: (updater: Updater) => { + typeof updater === 'function' + ? this.sorting.update(updater) + : this.sorting.set(updater) + }, + onPaginationChange: (updater: Updater) => { + typeof updater === 'function' + ? this.pagination.update(updater) + : this.pagination.set(updater) + }, + })) + + readonly stateJson = computed(() => + JSON.stringify( + { sorting: this.sorting(), pagination: this.pagination() }, + null, + 2, + ), + ) + + refreshData() { + this.data.set(makeData(1_000)) + } + + stressTest() { + this.data.set(makeData(200_000)) + } + + rerender() { + this.renderCount.update((count) => count + 1) + } + + onPageInputChange(event: Event) { + const input = event.target as HTMLInputElement + const page = input.value ? Number(input.value) - 1 : 0 + this.table.setPageIndex(page) + } + + onPageSizeChange(event: Event) { + const select = event.target as HTMLSelectElement + this.table.setPageSize(Number(select.value)) + } +} diff --git a/examples/angular/basic-external-state/src/app/makeData.ts b/examples/angular/basic-external-state/src/app/makeData.ts new file mode 100644 index 0000000000..70d0f2dd79 --- /dev/null +++ b/examples/angular/basic-external-state/src/app/makeData.ts @@ -0,0 +1,25 @@ +import { faker } from '@faker-js/faker' + +export type Person = { + firstName: string + lastName: string + age: number + visits: number + status: 'relationship' | 'complicated' | 'single' + progress: number +} + +const range = (len: number) => Array.from({ length: len }, (_, index) => index) + +const newPerson = (): Person => ({ + firstName: faker.person.firstName(), + lastName: faker.person.lastName(), + age: faker.number.int(40), + visits: faker.number.int(1000), + status: faker.helpers.arrayElement(['relationship', 'complicated', 'single']), + progress: faker.number.int(100), +}) + +export function makeData(len: number): Array { + return range(len).map(() => newPerson()) +} diff --git a/examples/angular/basic-external-state/src/index.html b/examples/angular/basic-external-state/src/index.html new file mode 100644 index 0000000000..f7a60244de --- /dev/null +++ b/examples/angular/basic-external-state/src/index.html @@ -0,0 +1,12 @@ + + + + + Basic External State + + + + + + + diff --git a/examples/angular/basic-external-state/src/main.ts b/examples/angular/basic-external-state/src/main.ts new file mode 100644 index 0000000000..8192dca694 --- /dev/null +++ b/examples/angular/basic-external-state/src/main.ts @@ -0,0 +1,5 @@ +import { bootstrapApplication } from '@angular/platform-browser' +import { appConfig } from './app/app.config' +import { App } from './app/app' + +bootstrapApplication(App, appConfig).catch((err) => console.error(err)) diff --git a/examples/angular/basic-external-state/src/styles.css b/examples/angular/basic-external-state/src/styles.css new file mode 100644 index 0000000000..70e6fd5b4c --- /dev/null +++ b/examples/angular/basic-external-state/src/styles.css @@ -0,0 +1,60 @@ +html { + font-family: sans-serif; + font-size: 14px; +} + +table { + border: 1px solid lightgray; + border-collapse: collapse; + border-spacing: 0; +} + +tbody { + border-bottom: 1px solid lightgray; +} + +th, +td { + border-bottom: 1px solid lightgray; + border-right: 1px solid lightgray; + padding: 2px 4px; +} + +.demo-root { + padding: 0.5rem; +} + +.spacer-sm { + height: 0.5rem; +} + +.spacer-md { + height: 1rem; +} + +.controls, +.inline-controls { + display: flex; + align-items: center; + gap: 0.5rem; +} + +.demo-button { + border: 1px solid currentColor; + border-radius: 0.25rem; + padding: 0.5rem; +} + +.demo-button-sm { + padding: 0.25rem; +} + +.sortable-header { + cursor: pointer; + user-select: none; +} + +.page-size-input { + width: 4rem; + padding: 0.25rem; +} diff --git a/examples/angular/basic-external-state/tsconfig.app.json b/examples/angular/basic-external-state/tsconfig.app.json new file mode 100644 index 0000000000..8426ad9558 --- /dev/null +++ b/examples/angular/basic-external-state/tsconfig.app.json @@ -0,0 +1,9 @@ +{ + "extends": "./tsconfig.json", + "compilerOptions": { + "outDir": "./out-tsc/app", + "types": [] + }, + "include": ["src/**/*.ts"], + "exclude": ["src/**/*.spec.ts"] +} diff --git a/examples/angular/basic-external-state/tsconfig.json b/examples/angular/basic-external-state/tsconfig.json new file mode 100644 index 0000000000..32789cdc2b --- /dev/null +++ b/examples/angular/basic-external-state/tsconfig.json @@ -0,0 +1,23 @@ +{ + "compileOnSave": false, + "compilerOptions": { + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "skipLibCheck": true, + "isolatedModules": true, + "experimentalDecorators": true, + "importHelpers": true, + "target": "ES2022", + "module": "preserve" + }, + "angularCompilerOptions": { + "enableI18nLegacyMessageIdFormat": false, + "strictInjectionParameters": true, + "strictInputAccessModifiers": true, + "strictTemplates": true + }, + "include": ["**/*.ts", "vite.config.js", "vite.config.ts"] +} diff --git a/examples/angular/basic-inject-table/package.json b/examples/angular/basic-inject-table/package.json index 97879b00fd..fafbfbb14f 100644 --- a/examples/angular/basic-inject-table/package.json +++ b/examples/angular/basic-inject-table/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/basic-inject-table/src/app/app.config.ts b/examples/angular/basic-inject-table/src/app/app.config.ts index 00f6004def..1805a5f5ce 100644 --- a/examples/angular/basic-inject-table/src/app/app.config.ts +++ b/examples/angular/basic-inject-table/src/app/app.config.ts @@ -1,8 +1,25 @@ +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import { provideRouter } from '@angular/router' -import { provideBrowserGlobalErrorListeners } from '@angular/core' import { routes } from './app.routes' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners(), provideRouter(routes)], + providers: [ + provideBrowserGlobalErrorListeners(), + provideRouter(routes), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/basic-inject-table/src/app/app.html b/examples/angular/basic-inject-table/src/app/app.html index bb2de8903e..a5eff916f6 100644 --- a/examples/angular/basic-inject-table/src/app/app.html +++ b/examples/angular/basic-inject-table/src/app/app.html @@ -1,17 +1,16 @@
- - -
@for (headerGroup of table.getHeaderGroups(); track headerGroup.id) { @for (header of headerGroup.headers; track header.id) { - @if (!header.isPlaceholder) { - - } + } } @@ -20,8 +19,10 @@ @for (row of table.getRowModel().rows; track row.id) { @for (cell of row.getAllCells(); track cell.id) { - } @@ -31,12 +32,19 @@ @for (footerGroup of table.getFooterGroups(); track footerGroup.id) { @for (footer of footerGroup.headers; track footer.id) { - } }
-
-
+ @if (!header.isPlaceholder) { + + {{ headerCell }} + + } +
-
+
+ + {{ renderCell }} +
- {{ footer }} + + @if (!footer.isPlaceholder) { + + {{ footerCell }} + + }
+
+ + Render count: {{ renderCount() }}
diff --git a/examples/angular/basic-inject-table/src/app/app.ts b/examples/angular/basic-inject-table/src/app/app.ts index 44cce9194c..98f0828912 100644 --- a/examples/angular/basic-inject-table/src/app/app.ts +++ b/examples/angular/basic-inject-table/src/app/app.ts @@ -1,47 +1,93 @@ import { ChangeDetectionStrategy, Component, signal } from '@angular/core' import { FlexRender, injectTable, tableFeatures } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { makeData } from './makeData' import type { Person } from './makeData' import type { ColumnDef } from '@tanstack/angular-table' +// This example uses the Angular standalone `injectTable` helper to create a table without the `createTableHook` util. + +// 1. Define what the shape of your data will be for each row +type Person = { + firstName: string + lastName: string + age: number + visits: number + status: string + progress: number +} + +// 2. Create some dummy data with a stable reference +const defaultData: Array = [ + { + firstName: 'tanner', + lastName: 'linsley', + age: 24, + visits: 100, + status: 'In Relationship', + progress: 50, + }, + { + firstName: 'tandy', + lastName: 'miller', + age: 40, + visits: 40, + status: 'Single', + progress: 80, + }, + { + firstName: 'joe', + lastName: 'dirte', + age: 45, + visits: 20, + status: 'Complicated', + progress: 10, + }, + { + firstName: 'kevin', + lastName: 'vandy', + age: 12, + visits: 100, + status: 'Single', + progress: 70, + }, +] + // 3. New in V9! Tell the table which features and row models we want to use. // In this case, this will be a basic table with no additional features -const _features = tableFeatures({}) // util method to create sharable TFeatures object/type +const _features = tableFeatures({}) // 4. Define the columns for your table. This uses the new `ColumnDef` type to define columns. -// Alternatively, check out the createAppTable/createColumnHelper util for an even more type-safe way to define columns. -const defaultColumns: Array> = [ +// Alternatively, check out the createTableHook/createColumnHelper util for an even more type-safe way to define columns. +const columns: Array> = [ { accessorKey: 'firstName', + header: 'First Name', cell: (info) => info.getValue(), - footer: (info) => info.column.id, }, { accessorFn: (row) => row.lastName, id: 'lastName', - cell: (info) => `${info.getValue()}`, - header: () => `Last Name`, - footer: (info) => info.column.id, + header: () => 'Last Name', + cell: (info) => info.getValue(), }, { - accessorKey: 'age', + accessorFn: (row) => Number(row.age), + id: 'age', header: () => 'Age', - footer: (info) => info.column.id, + cell: (info) => info.renderValue(), }, { accessorKey: 'visits', - header: () => `Visits`, - footer: (info) => info.column.id, + header: () => 'Visits', }, { accessorKey: 'status', header: 'Status', - footer: (info) => info.column.id, }, { accessorKey: 'progress', header: 'Profile Progress', - footer: (info) => info.column.id, }, ] @@ -52,18 +98,27 @@ const defaultColumns: Array> = [ changeDetection: ChangeDetectionStrategy.OnPush, }) export class App { - readonly data = signal>(makeData(20)) + // 5. Store data with a stable reference + readonly data = signal>([...defaultData]) + readonly renderCount = signal(0) - // 5. Create the table instance with required _features, columns, and data - table = injectTable(() => ({ + // 6. Create the table instance with required _features, columns, and data + readonly table = injectTable(() => ({ debugTable: true, - _features, // new required option in V9. Tell the table which features you are importing and using (better tree-shaking) - _rowModels: {}, // `Core` row model is now included by default, but you can still override it here + _features, + _rowModels: {}, + columns, data: this.data(), - columns: defaultColumns, - // ...other options here })) - refreshData = () => this.data.set(makeData(20)) - stressTest = () => this.data.set(makeData(1_000)) + rerender() { + this.renderCount.update((count) => count + 1) + } + + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'basic-inject-table', + })) + } } diff --git a/examples/angular/column-ordering/package.json b/examples/angular/column-ordering/package.json index b0dc31d536..5a3fd48552 100644 --- a/examples/angular/column-ordering/package.json +++ b/examples/angular/column-ordering/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/column-ordering/src/app/app.config.ts b/examples/angular/column-ordering/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/column-ordering/src/app/app.config.ts +++ b/examples/angular/column-ordering/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/column-ordering/src/app/app.ts b/examples/angular/column-ordering/src/app/app.ts index adcd415740..c7f07e994a 100644 --- a/examples/angular/column-ordering/src/app/app.ts +++ b/examples/angular/column-ordering/src/app/app.ts @@ -12,6 +12,7 @@ import { injectTable, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { faker } from '@faker-js/faker' import { makeData } from './makeData' import type { Person } from './makeData' @@ -107,7 +108,7 @@ export class App { })) readonly stringifiedColumnOrdering = computed(() => { - return JSON.stringify(this.table.store.state.columnOrder) + return JSON.stringify(this.table.state.columnOrder) }) randomizeColumns() { @@ -118,4 +119,10 @@ export class App { refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'column-ordering', + })) + } } diff --git a/examples/angular/column-pinning-sticky/package.json b/examples/angular/column-pinning-sticky/package.json index 32101afc07..05b7062a23 100644 --- a/examples/angular/column-pinning-sticky/package.json +++ b/examples/angular/column-pinning-sticky/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/column-pinning-sticky/src/app/app.config.ts b/examples/angular/column-pinning-sticky/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/column-pinning-sticky/src/app/app.config.ts +++ b/examples/angular/column-pinning-sticky/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/column-pinning-sticky/src/app/app.ts b/examples/angular/column-pinning-sticky/src/app/app.ts index c001307ce2..f256a2bb3c 100644 --- a/examples/angular/column-pinning-sticky/src/app/app.ts +++ b/examples/angular/column-pinning-sticky/src/app/app.ts @@ -10,6 +10,7 @@ import { injectTable, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { faker } from '@faker-js/faker' import { makeData } from './makeData' import type { Person } from './makeData' @@ -98,7 +99,7 @@ export class App { })) stringifiedColumnPinning = computed(() => { - return JSON.stringify(this.table.store.state.columnPinning) + return JSON.stringify(this.table.state.columnPinning) }) readonly getCommonPinningStyles = ( @@ -133,4 +134,10 @@ export class App { refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'column-pinning-sticky', + })) + } } diff --git a/examples/angular/column-pinning/package.json b/examples/angular/column-pinning/package.json index 0ea23a038e..d447243a6a 100644 --- a/examples/angular/column-pinning/package.json +++ b/examples/angular/column-pinning/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/column-pinning/src/app/app.config.ts b/examples/angular/column-pinning/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/column-pinning/src/app/app.config.ts +++ b/examples/angular/column-pinning/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/column-pinning/src/app/app.ts b/examples/angular/column-pinning/src/app/app.ts index 34cc9de4b1..cfa95e443b 100644 --- a/examples/angular/column-pinning/src/app/app.ts +++ b/examples/angular/column-pinning/src/app/app.ts @@ -12,6 +12,7 @@ import { injectTable, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { faker } from '@faker-js/faker' import { NgTemplateOutlet, SlicePipe } from '@angular/common' import { makeData } from './makeData' @@ -127,7 +128,7 @@ export class App { })) stringifiedColumnPinning = computed(() => { - return JSON.stringify(this.table.store.state.columnPinning) + return JSON.stringify(this.table.state.columnPinning) }) randomizeColumns() { @@ -138,4 +139,10 @@ export class App { refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'column-pinning', + })) + } } diff --git a/examples/angular/column-resizing-performant/package.json b/examples/angular/column-resizing-performant/package.json index 5f586c857e..bec0ea4305 100644 --- a/examples/angular/column-resizing-performant/package.json +++ b/examples/angular/column-resizing-performant/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/column-resizing-performant/src/app/app.config.ts b/examples/angular/column-resizing-performant/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/column-resizing-performant/src/app/app.config.ts +++ b/examples/angular/column-resizing-performant/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/column-resizing-performant/src/app/app.ts b/examples/angular/column-resizing-performant/src/app/app.ts index e09963e237..21445b4f46 100644 --- a/examples/angular/column-resizing-performant/src/app/app.ts +++ b/examples/angular/column-resizing-performant/src/app/app.ts @@ -13,6 +13,7 @@ import { shallow, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { makeData } from './makeData' import { TableResizableCells } from './resizable-cell/resizable-cell' import type { Person } from './makeData' @@ -128,4 +129,10 @@ export class App { refreshData = () => this.data.set(makeData(200)) stressTest = () => this.data.set(makeData(2_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'column-resizing-performant', + })) + } } diff --git a/examples/angular/column-visibility/package.json b/examples/angular/column-visibility/package.json index f4c20b12ff..cc42f8234a 100644 --- a/examples/angular/column-visibility/package.json +++ b/examples/angular/column-visibility/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/column-visibility/src/app/app.config.ts b/examples/angular/column-visibility/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/column-visibility/src/app/app.config.ts +++ b/examples/angular/column-visibility/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/column-visibility/src/app/app.ts b/examples/angular/column-visibility/src/app/app.ts index 5ae88eff7e..ee5a6862c1 100644 --- a/examples/angular/column-visibility/src/app/app.ts +++ b/examples/angular/column-visibility/src/app/app.ts @@ -11,6 +11,7 @@ import { isFunction, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { makeData } from './makeData' import type { Person } from './makeData' import type { ColumnDef, ColumnVisibilityState } from '@tanstack/angular-table' @@ -100,9 +101,15 @@ export class App { })) readonly stringifiedColumnVisibility = computed(() => { - return JSON.stringify(this.table.store.state.columnVisibility) + return JSON.stringify(this.table.state.columnVisibility) }) refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'column-visibility', + })) + } } diff --git a/examples/angular/composable-tables/package.json b/examples/angular/composable-tables/package.json index a6e11bad5c..60c5ec872f 100644 --- a/examples/angular/composable-tables/package.json +++ b/examples/angular/composable-tables/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/composable-tables/src/app/app.config.ts b/examples/angular/composable-tables/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/composable-tables/src/app/app.config.ts +++ b/examples/angular/composable-tables/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/composable-tables/src/app/components/products-table/products-table.ts b/examples/angular/composable-tables/src/app/components/products-table/products-table.ts index b1808695a8..5d6e4a285a 100644 --- a/examples/angular/composable-tables/src/app/components/products-table/products-table.ts +++ b/examples/angular/composable-tables/src/app/components/products-table/products-table.ts @@ -6,6 +6,7 @@ import { TanStackTableCell, TanStackTableHeader, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { makeProductData } from '../../makeData' import { createAppColumnHelper, injectAppTable } from '../../table' import type { Product } from '../../makeData' @@ -68,4 +69,11 @@ export class ProductsTable { refreshData = () => this.data.set(makeProductData(1_000)) stressTest = () => this.data.set(makeProductData(200_000)) + + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'products-table', + })) + } } diff --git a/examples/angular/composable-tables/src/app/components/table-components.ts b/examples/angular/composable-tables/src/app/components/table-components.ts index d13783f270..c3cca84295 100644 --- a/examples/angular/composable-tables/src/app/components/table-components.ts +++ b/examples/angular/composable-tables/src/app/components/table-components.ts @@ -107,12 +107,8 @@ export class PaginationControls { readonly canPreviousPage = computed(() => this.table().getCanPreviousPage()) readonly canNextPage = computed(() => this.table().getCanNextPage()) - readonly pageIndex = computed( - () => this.table().store.state.pagination.pageIndex, - ) - readonly pageSize = computed( - () => this.table().store.state.pagination.pageSize, - ) + readonly pageIndex = computed(() => this.table().state.pagination.pageIndex) + readonly pageSize = computed(() => this.table().state.pagination.pageSize) readonly pageCount = computed(() => this.table().getPageCount().toLocaleString(), ) diff --git a/examples/angular/composable-tables/src/app/components/users-table/users-table.ts b/examples/angular/composable-tables/src/app/components/users-table/users-table.ts index b0a150513a..430dde604f 100644 --- a/examples/angular/composable-tables/src/app/components/users-table/users-table.ts +++ b/examples/angular/composable-tables/src/app/components/users-table/users-table.ts @@ -7,6 +7,7 @@ import { TanStackTableHeader, flexRenderComponent, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { makeData } from '../../makeData' import { createAppColumnHelper, injectAppTable } from '../../table' import type { Person } from '../../makeData' @@ -79,4 +80,11 @@ export class UsersTable { refreshData = () => this.data.set(makeData(1_000)) stressTest = () => this.data.set(makeData(200_000)) + + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'users-table', + })) + } } diff --git a/examples/angular/custom-plugin/package.json b/examples/angular/custom-plugin/package.json index f9a3357c4e..b29c9e004a 100644 --- a/examples/angular/custom-plugin/package.json +++ b/examples/angular/custom-plugin/package.json @@ -17,7 +17,9 @@ "@angular/forms": "^21.2.13", "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/custom-plugin/src/app/app.config.ts b/examples/angular/custom-plugin/src/app/app.config.ts index d6d1974987..5842a3e348 100644 --- a/examples/angular/custom-plugin/src/app/app.config.ts +++ b/examples/angular/custom-plugin/src/app/app.config.ts @@ -1,7 +1,23 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/custom-plugin/src/app/app.ts b/examples/angular/custom-plugin/src/app/app.ts index 0944e1f6e9..d9d7a2ac15 100644 --- a/examples/angular/custom-plugin/src/app/app.ts +++ b/examples/angular/custom-plugin/src/app/app.ts @@ -8,6 +8,7 @@ import { rowPaginationFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { densityPlugin } from './density/density-feature' import { makeData } from './makeData' import type { DensityState } from './density/density-feature' @@ -79,4 +80,10 @@ export class App { refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'custom-plugin', + })) + } } diff --git a/examples/angular/editable/package.json b/examples/angular/editable/package.json index bf96656a40..c517f84fef 100644 --- a/examples/angular/editable/package.json +++ b/examples/angular/editable/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/editable/src/app/app.config.ts b/examples/angular/editable/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/editable/src/app/app.config.ts +++ b/examples/angular/editable/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/editable/src/app/app.html b/examples/angular/editable/src/app/app.html index 9e8c22936c..338dc9ea84 100644 --- a/examples/angular/editable/src/app/app.html +++ b/examples/angular/editable/src/app/app.html @@ -81,7 +81,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
diff --git a/examples/angular/editable/src/app/app.ts b/examples/angular/editable/src/app/app.ts index d12ca1dbb0..6be73a3ea0 100644 --- a/examples/angular/editable/src/app/app.ts +++ b/examples/angular/editable/src/app/app.ts @@ -14,6 +14,7 @@ import { rowPaginationFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { EditableCell } from './editable-cell/editable-cell' import { makeData } from './makeData' import type { Person } from './makeData' @@ -130,4 +131,10 @@ export class App { refreshData = () => this.data.set(makeData(10_000)) stressTest = () => this.data.set(makeData(200_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'editable', + })) + } } diff --git a/examples/angular/expanding/package.json b/examples/angular/expanding/package.json index 2c10f5b6da..c1097e22da 100644 --- a/examples/angular/expanding/package.json +++ b/examples/angular/expanding/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/expanding/src/app/app.config.ts b/examples/angular/expanding/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/expanding/src/app/app.config.ts +++ b/examples/angular/expanding/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/expanding/src/app/app.html b/examples/angular/expanding/src/app/app.html index 08f2f79685..ddaf8888e6 100644 --- a/examples/angular/expanding/src/app/app.html +++ b/examples/angular/expanding/src/app/app.html @@ -79,7 +79,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -87,13 +87,13 @@ | Go to page: - @for (pageSize of [10, 20, 30, 40, 50]; track pageSize) { } diff --git a/examples/angular/expanding/src/app/app.ts b/examples/angular/expanding/src/app/app.ts index 8670a8e65b..ef7c3c3f57 100644 --- a/examples/angular/expanding/src/app/app.ts +++ b/examples/angular/expanding/src/app/app.ts @@ -16,6 +16,7 @@ import { shallow, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { ReactiveFormsModule } from '@angular/forms' import { makeData } from './makeData' import { @@ -128,4 +129,10 @@ export class App { refreshData = () => this.data.set(makeData(100, 5, 3)) stressTest = () => this.data.set(makeData(10_000, 5, 3)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'expanding', + })) + } } diff --git a/examples/angular/filters/package.json b/examples/angular/filters/package.json index 8364bb341f..b4c47c0eb5 100644 --- a/examples/angular/filters/package.json +++ b/examples/angular/filters/package.json @@ -18,8 +18,10 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", - "@tanstack/angular-pacer": "^0.23.1", + "@tanstack/angular-devtools": "^0.0.4", + "@tanstack/angular-pacer": "^0.23.0", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/filters/src/app/app.config.ts b/examples/angular/filters/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/filters/src/app/app.config.ts +++ b/examples/angular/filters/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/filters/src/app/app.html b/examples/angular/filters/src/app/app.html index 4a9c219806..3b767e20a1 100644 --- a/examples/angular/filters/src/app/app.html +++ b/examples/angular/filters/src/app/app.html @@ -77,7 +77,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -85,13 +85,13 @@ | Go to page: - @for (pageSize of [10, 20, 30, 40, 50]; track pageSize) { } diff --git a/examples/angular/filters/src/app/app.ts b/examples/angular/filters/src/app/app.ts index 7cab3f551f..705a402137 100644 --- a/examples/angular/filters/src/app/app.ts +++ b/examples/angular/filters/src/app/app.ts @@ -19,6 +19,7 @@ import { rowPaginationFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { makeData } from './makeData' import { TableFilter } from './table-filter/table-filter' import type { ColumnFiltersState, Updater } from '@tanstack/angular-table' @@ -120,4 +121,10 @@ export class App { refreshData = () => this.data.set(makeData(1_000)) stressTest = () => this.data.set(makeData(200_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'filters', + })) + } } diff --git a/examples/angular/grouping/package.json b/examples/angular/grouping/package.json index 4eb0b64b7b..c4bc2c0d5d 100644 --- a/examples/angular/grouping/package.json +++ b/examples/angular/grouping/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/grouping/src/app/app.config.ts b/examples/angular/grouping/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/grouping/src/app/app.config.ts +++ b/examples/angular/grouping/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/grouping/src/app/app.html b/examples/angular/grouping/src/app/app.html index 22da76185c..56e14c4bf7 100644 --- a/examples/angular/grouping/src/app/app.html +++ b/examples/angular/grouping/src/app/app.html @@ -121,7 +121,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -129,13 +129,13 @@ | Go to page: - @for (pageSize of [10, 20, 30, 40, 50]; track pageSize) { } diff --git a/examples/angular/grouping/src/app/app.ts b/examples/angular/grouping/src/app/app.ts index 9f5aa4aa07..e36e3d4a89 100644 --- a/examples/angular/grouping/src/app/app.ts +++ b/examples/angular/grouping/src/app/app.ts @@ -5,6 +5,7 @@ import { signal, } from '@angular/core' import { FlexRender, isFunction } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { columns, injectTable } from './columns' import { makeData } from './makeData' import type { GroupingState, Updater } from '@tanstack/angular-table' @@ -53,4 +54,10 @@ export class App { refreshData = () => this.data.set(makeData(1_000)) stressTest = () => this.data.set(makeData(200_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'grouping', + })) + } } diff --git a/examples/angular/kitchen-sink/src/app/app.html b/examples/angular/kitchen-sink/src/app/app.html index 283d69c0e3..86d0f36241 100644 --- a/examples/angular/kitchen-sink/src/app/app.html +++ b/examples/angular/kitchen-sink/src/app/app.html @@ -8,7 +8,7 @@

Kitchen Sink - All Features

[debounce]="300" class="global-filter-input" placeholder="Fuzzy search all columns..." - [value]="table.store.state.globalFilter ?? ''" + [value]="table.state.globalFilter ?? ''" (changeEvent)="onGlobalFilterChange($event)" /> @@ -301,7 +301,7 @@

Kitchen Sink - All Features

Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -309,13 +309,13 @@

Kitchen Sink - All Features

| Go to page: - @for (pageSize of [10, 20, 30, 50, 100]; track pageSize) { } diff --git a/examples/angular/kitchen-sink/src/app/app.ts b/examples/angular/kitchen-sink/src/app/app.ts index aa524204ed..96668a754d 100644 --- a/examples/angular/kitchen-sink/src/app/app.ts +++ b/examples/angular/kitchen-sink/src/app/app.ts @@ -228,7 +228,7 @@ export class App { }) readonly tableState = computed(() => - JSON.stringify(this.table.store.state, null, 2), + JSON.stringify(this.table.state, null, 2), ) refreshData = () => this.data.set(makeData(1_000)) @@ -290,7 +290,7 @@ export class App { } cellClass(cell: Cell) { - const groupingActive = this.table.store.state.grouping.length > 0 + const groupingActive = this.table.state.grouping.length > 0 const hasAggregation = !!cell.column.columnDef.aggregationFn return !groupingActive ? undefined diff --git a/examples/angular/remote-data/package.json b/examples/angular/remote-data/package.json index 2f85956381..93fd69e946 100644 --- a/examples/angular/remote-data/package.json +++ b/examples/angular/remote-data/package.json @@ -12,6 +12,7 @@ "serve:ssr:remote-data": "node dist/remote-data/server/server.mjs" }, "private": true, + "packageManager": "pnpm@11.1.3", "dependencies": { "@angular/common": "^21.2.13", "@angular/compiler": "^21.2.13", @@ -22,7 +23,9 @@ "@angular/platform-server": "^21.2.13", "@angular/router": "^21.2.13", "@angular/ssr": "^21.2.11", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "express": "^5.2.1", "rxjs": "~7.8.2" }, diff --git a/examples/angular/remote-data/src/app/app.config.ts b/examples/angular/remote-data/src/app/app.config.ts index 39627a5e8e..8018fb637d 100644 --- a/examples/angular/remote-data/src/app/app.config.ts +++ b/examples/angular/remote-data/src/app/app.config.ts @@ -3,7 +3,8 @@ import { withEventReplay, withHttpTransferCacheOptions, } from '@angular/platform-browser' -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { @@ -15,5 +16,18 @@ export const appConfig: ApplicationConfig = { includeHeaders: ['X-Total-Count'], }), ), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], ], } diff --git a/examples/angular/remote-data/src/app/app.html b/examples/angular/remote-data/src/app/app.html index 632a612a44..a0a2dac5d0 100644 --- a/examples/angular/remote-data/src/app/app.html +++ b/examples/angular/remote-data/src/app/app.html @@ -98,7 +98,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -106,13 +106,13 @@ | Go to page: - @for (pageSize of [10, 20, 30, 40, 50]; track pageSize) { } diff --git a/examples/angular/remote-data/src/app/app.ts b/examples/angular/remote-data/src/app/app.ts index dd15a8c0c1..f572964af4 100644 --- a/examples/angular/remote-data/src/app/app.ts +++ b/examples/angular/remote-data/src/app/app.ts @@ -18,6 +18,8 @@ import { } from '@tanstack/angular-table' import { map } from 'rxjs' import { rxResource } from '@angular/core/rxjs-interop' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' +import { TanStackDevtools } from '@tanstack/angular-devtools' import type { ColumnDef, PaginationState, @@ -44,7 +46,7 @@ type TodoResponse = { items: Array; totalCount: number } @Component({ selector: 'app-root', - imports: [FlexRender, ReactiveFormsModule], + imports: [FlexRender, ReactiveFormsModule, TanStackDevtools], templateUrl: './app.html', changeDetection: ChangeDetectionStrategy.OnPush, }) @@ -170,6 +172,13 @@ export class App { } }) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'Remote data', + })) + } + onPageInputChange(event: Event): void { const inputElement = event.target as HTMLInputElement const page = inputElement.value ? Number(inputElement.value) - 1 : 0 diff --git a/examples/angular/row-dnd/package.json b/examples/angular/row-dnd/package.json index c0aea2e147..60f73cb349 100644 --- a/examples/angular/row-dnd/package.json +++ b/examples/angular/row-dnd/package.json @@ -19,7 +19,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/row-dnd/src/app/app.config.ts b/examples/angular/row-dnd/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/row-dnd/src/app/app.config.ts +++ b/examples/angular/row-dnd/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/row-dnd/src/app/app.ts b/examples/angular/row-dnd/src/app/app.ts index f5361a670d..bd773fcbb7 100644 --- a/examples/angular/row-dnd/src/app/app.ts +++ b/examples/angular/row-dnd/src/app/app.ts @@ -13,6 +13,7 @@ import { rowPaginationFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { CdkDrag, CdkDropList, moveItemInArray } from '@angular/cdk/drag-drop' import { JsonPipe } from '@angular/common' import { DragHandleCell } from './drag-handle-cell/drag-handle-cell' @@ -94,4 +95,10 @@ export class App { refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'row-dnd', + })) + } } diff --git a/examples/angular/row-selection-signal/package.json b/examples/angular/row-selection-signal/package.json index 802594d65c..f844a7a089 100644 --- a/examples/angular/row-selection-signal/package.json +++ b/examples/angular/row-selection-signal/package.json @@ -10,6 +10,7 @@ "lint": "eslint ./src" }, "private": true, + "packageManager": "pnpm@11.1.3", "dependencies": { "@angular/animations": "^21.2.13", "@angular/common": "^21.2.13", @@ -19,7 +20,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/platform-browser-dynamic": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/row-selection-signal/src/app/app.component.html b/examples/angular/row-selection-signal/src/app/app.component.html index 3a59b083f6..e8644e5c5c 100644 --- a/examples/angular/row-selection-signal/src/app/app.component.html +++ b/examples/angular/row-selection-signal/src/app/app.component.html @@ -99,7 +99,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -107,13 +107,13 @@ | Go to page: - @for (pageSize of [10, 20, 30, 40, 50]; track pageSize) { } diff --git a/examples/angular/row-selection-signal/src/app/app.component.ts b/examples/angular/row-selection-signal/src/app/app.component.ts index 55152adb6b..0711e7a2c1 100644 --- a/examples/angular/row-selection-signal/src/app/app.component.ts +++ b/examples/angular/row-selection-signal/src/app/app.component.ts @@ -17,6 +17,7 @@ import { rowSelectionFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { FilterComponent } from './filter' import { makeData } from './makeData' import { @@ -157,4 +158,10 @@ export class AppComponent { refreshData = () => this.data.set(makeData(1_000)) stressTest = () => this.data.set(makeData(200_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'row-selection-signal', + })) + } } diff --git a/examples/angular/row-selection-signal/src/app/app.config.ts b/examples/angular/row-selection-signal/src/app/app.config.ts index f997e614ac..f654e82bfa 100644 --- a/examples/angular/row-selection-signal/src/app/app.config.ts +++ b/examples/angular/row-selection-signal/src/app/app.config.ts @@ -1,5 +1,21 @@ +import { isDevMode } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [], + providers: [ + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/row-selection/package.json b/examples/angular/row-selection/package.json index fa6013158f..c6d5198fa1 100644 --- a/examples/angular/row-selection/package.json +++ b/examples/angular/row-selection/package.json @@ -19,7 +19,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/row-selection/src/app/app.config.ts b/examples/angular/row-selection/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/row-selection/src/app/app.config.ts +++ b/examples/angular/row-selection/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/row-selection/src/app/app.ts b/examples/angular/row-selection/src/app/app.ts index e495508fc0..f60dfcedea 100644 --- a/examples/angular/row-selection/src/app/app.ts +++ b/examples/angular/row-selection/src/app/app.ts @@ -10,6 +10,7 @@ import { flexRenderComponent, shallow, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { TableFilter } from './table-filter/table-filter' import { makeData } from './makeData' import { @@ -143,4 +144,10 @@ export class App { toggleEnableRowSelection() { this.enableRowSelection.update((value) => !value) } + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'row-selection', + })) + } } diff --git a/examples/angular/signal-input/package.json b/examples/angular/signal-input/package.json index f9301991d3..e6ea8cad5d 100644 --- a/examples/angular/signal-input/package.json +++ b/examples/angular/signal-input/package.json @@ -19,7 +19,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/signal-input/src/app/app.config.ts b/examples/angular/signal-input/src/app/app.config.ts index cbb47d366c..00db520fb7 100644 --- a/examples/angular/signal-input/src/app/app.config.ts +++ b/examples/angular/signal-input/src/app/app.config.ts @@ -1,6 +1,22 @@ -import { provideBrowserGlobalErrorListeners } from '@angular/core' +import { isDevMode, provideBrowserGlobalErrorListeners } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [provideBrowserGlobalErrorListeners()], + providers: [ + provideBrowserGlobalErrorListeners(), + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/signal-input/src/app/person-table/person-table.html b/examples/angular/signal-input/src/app/person-table/person-table.html index ea2246b62c..3d326e3db4 100644 --- a/examples/angular/signal-input/src/app/person-table/person-table.html +++ b/examples/angular/signal-input/src/app/person-table/person-table.html @@ -66,7 +66,7 @@
Page
- {{ (table.store.state.pagination.pageIndex + 1).toLocaleString() }} of + {{ (table.state.pagination.pageIndex + 1).toLocaleString() }} of {{ table.getPageCount().toLocaleString() }}
@@ -74,13 +74,13 @@ | Go to page: - @for (pageSize of [10, 20, 30, 40, 50]; track pageSize) { } diff --git a/examples/angular/signal-input/src/app/person-table/person-table.ts b/examples/angular/signal-input/src/app/person-table/person-table.ts index dfdc308161..a8a8f37af2 100644 --- a/examples/angular/signal-input/src/app/person-table/person-table.ts +++ b/examples/angular/signal-input/src/app/person-table/person-table.ts @@ -7,6 +7,7 @@ import { rowPaginationFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import type { ColumnDef, PaginationState } from '@tanstack/angular-table' import type { Person } from '../makeData' @@ -68,4 +69,10 @@ export class PersonTable { onPageSizeChange(event: any) { this.table.setPageSize(Number(event.target.value)) } + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'signal-input', + })) + } } diff --git a/examples/angular/sub-components/package.json b/examples/angular/sub-components/package.json index 57f769275d..8696c288a0 100644 --- a/examples/angular/sub-components/package.json +++ b/examples/angular/sub-components/package.json @@ -18,7 +18,9 @@ "@angular/platform-browser": "^21.2.13", "@angular/router": "^21.2.13", "@faker-js/faker": "^10.4.0", + "@tanstack/angular-devtools": "^0.0.4", "@tanstack/angular-table": "^9.0.0-alpha.49", + "@tanstack/angular-table-devtools": "^9.0.0-alpha.43", "rxjs": "~7.8.2", "tslib": "^2.8.1" }, diff --git a/examples/angular/sub-components/src/app/app.config.ts b/examples/angular/sub-components/src/app/app.config.ts index f997e614ac..f654e82bfa 100644 --- a/examples/angular/sub-components/src/app/app.config.ts +++ b/examples/angular/sub-components/src/app/app.config.ts @@ -1,5 +1,21 @@ +import { isDevMode } from '@angular/core' +import { provideTanStackDevtools } from '@tanstack/angular-devtools/provider' import type { ApplicationConfig } from '@angular/core' export const appConfig: ApplicationConfig = { - providers: [], + providers: [ + isDevMode() + ? provideTanStackDevtools(() => ({ + plugins: [ + { + name: 'TanStack Table', + render: () => + import('@tanstack/angular-table-devtools').then((m) => + m.TableDevtoolsPanel(), + ), + }, + ], + })) + : [], + ], } diff --git a/examples/angular/sub-components/src/app/app.ts b/examples/angular/sub-components/src/app/app.ts index 23f564c4b5..a45e0e5dae 100644 --- a/examples/angular/sub-components/src/app/app.ts +++ b/examples/angular/sub-components/src/app/app.ts @@ -8,6 +8,7 @@ import { rowExpandingFeature, tableFeatures, } from '@tanstack/angular-table' +import { injectTanStackTableDevtools } from '@tanstack/angular-table-devtools' import { ReactiveFormsModule } from '@angular/forms' import { JsonPipe } from '@angular/common' import { makeData } from './makeData' @@ -121,4 +122,10 @@ export class App { refreshData = () => this.data.set(makeData(20)) stressTest = () => this.data.set(makeData(1_000)) + constructor() { + injectTanStackTableDevtools(() => ({ + table: this.table, + name: 'sub-components', + })) + } } diff --git a/examples/lit/column-resizing/src/main.ts b/examples/lit/column-resizing/src/main.ts index 8236c61756..7c99238d1d 100644 --- a/examples/lit/column-resizing/src/main.ts +++ b/examples/lit/column-resizing/src/main.ts @@ -112,7 +112,7 @@ class LitTableExample extends LitElement { >[number]['headers'][number], ) => { if (this.columnResizeMode === 'onEnd' && header.column.getIsResizing()) { - const delta = table.store.state.columnResizing.deltaOffset ?? 0 + const delta = table.state.columnResizing.deltaOffset ?? 0 const dir = this.columnResizeDirection === 'rtl' ? -1 : 1 return `translateX(${dir * delta}px)` } diff --git a/examples/preact/column-resizing-performant/src/main.tsx b/examples/preact/column-resizing-performant/src/main.tsx index 4993831758..5734c6b0ff 100644 --- a/examples/preact/column-resizing-performant/src/main.tsx +++ b/examples/preact/column-resizing-performant/src/main.tsx @@ -178,7 +178,7 @@ function App() { ))} {/* When resizing any column we will render this special memoized version of our table body */} - {table.store.state.columnResizing.isResizingColumn && enableMemo ? ( + {table.state.columnResizing.isResizingColumn && enableMemo ? ( ) : ( diff --git a/examples/preact/column-resizing/src/main.tsx b/examples/preact/column-resizing/src/main.tsx index 8b1c60fe68..48efc9fbbe 100644 --- a/examples/preact/column-resizing/src/main.tsx +++ b/examples/preact/column-resizing/src/main.tsx @@ -157,8 +157,7 @@ function App() { (table.options.columnResizeDirection === 'rtl' ? -1 : 1) * - (table.store.state.columnResizing - .deltaOffset ?? 0) + (table.state.columnResizing.deltaOffset ?? 0) }px)` : '', }} @@ -219,8 +218,7 @@ function App() { (table.options.columnResizeDirection === 'rtl' ? -1 : 1) * - (table.store.state.columnResizing - .deltaOffset ?? 0) + (table.state.columnResizing.deltaOffset ?? 0) }px)` : '', }} @@ -295,8 +293,7 @@ function App() { (table.options.columnResizeDirection === 'rtl' ? -1 : 1) * - (table.store.state.columnResizing - .deltaOffset ?? 0) + (table.state.columnResizing.deltaOffset ?? 0) }px)` : '', }} diff --git a/examples/preact/column-sizing/src/main.tsx b/examples/preact/column-sizing/src/main.tsx index cae3109dcc..b3f04851fc 100644 --- a/examples/preact/column-sizing/src/main.tsx +++ b/examples/preact/column-sizing/src/main.tsx @@ -94,7 +94,7 @@ function App() { // Don't actually do this to resize columns. This is just for demonstration purposes. // See the Column Resizing Example for how to do this with dedicated resizing APIs efficiently. table.setColumnSizing({ - ...table.store.state.columnSizing, + ...table.state.columnSizing, [column.id]: Number((e.target as HTMLInputElement).value), }) }} diff --git a/examples/preact/custom-plugin/src/main.tsx b/examples/preact/custom-plugin/src/main.tsx index d8d1119060..dfd53b4021 100644 --- a/examples/preact/custom-plugin/src/main.tsx +++ b/examples/preact/custom-plugin/src/main.tsx @@ -288,7 +288,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state.pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -296,7 +296,7 @@ function App() { | Go to page: { const page = (e.target as HTMLInputElement).value ? Number((e.target as HTMLInputElement).value) - 1 @@ -307,7 +307,7 @@ function App() { /> { table.setPageSize(Number((e.target as HTMLSelectElement).value)) }} diff --git a/examples/react/column-dnd/src/main.tsx b/examples/react/column-dnd/src/main.tsx index cf28422cdf..ddd250cadd 100644 --- a/examples/react/column-dnd/src/main.tsx +++ b/examples/react/column-dnd/src/main.tsx @@ -197,7 +197,7 @@ function App() { {table.getHeaderGroups().map((headerGroup) => ( {headerGroup.headers.map((header) => ( @@ -213,7 +213,7 @@ function App() { {row.getAllCells().map((cell) => ( diff --git a/examples/react/column-resizing-performant/src/main.tsx b/examples/react/column-resizing-performant/src/main.tsx index 3f9692ab4e..7b577245a4 100644 --- a/examples/react/column-resizing-performant/src/main.tsx +++ b/examples/react/column-resizing-performant/src/main.tsx @@ -181,7 +181,7 @@ function App() { ))} {/* When resizing any column we will render this special memoized version of our table body */} - {table.store.state.columnResizing.isResizingColumn && enableMemo ? ( + {table.state.columnResizing.isResizingColumn && enableMemo ? ( ) : ( diff --git a/examples/react/column-resizing/src/main.tsx b/examples/react/column-resizing/src/main.tsx index dfa2822178..f375ca8234 100644 --- a/examples/react/column-resizing/src/main.tsx +++ b/examples/react/column-resizing/src/main.tsx @@ -158,8 +158,7 @@ function App() { (table.options.columnResizeDirection === 'rtl' ? -1 : 1) * - (table.store.state.columnResizing - .deltaOffset ?? 0) + (table.state.columnResizing.deltaOffset ?? 0) }px)` : '', }} @@ -220,8 +219,7 @@ function App() { (table.options.columnResizeDirection === 'rtl' ? -1 : 1) * - (table.store.state.columnResizing - .deltaOffset ?? 0) + (table.state.columnResizing.deltaOffset ?? 0) }px)` : '', }} @@ -296,8 +294,7 @@ function App() { (table.options.columnResizeDirection === 'rtl' ? -1 : 1) * - (table.store.state.columnResizing - .deltaOffset ?? 0) + (table.state.columnResizing.deltaOffset ?? 0) }px)` : '', }} diff --git a/examples/react/column-sizing/src/main.tsx b/examples/react/column-sizing/src/main.tsx index d41d3ce5f8..afa1d3a0fc 100644 --- a/examples/react/column-sizing/src/main.tsx +++ b/examples/react/column-sizing/src/main.tsx @@ -99,7 +99,7 @@ function App() { // Don't actually do this to resize columns. This is just for demonstration purposes. // See the Column Resizing Example for how to do this with dedicated resizing APIs efficiently. table.setColumnSizing({ - ...table.store.state.columnSizing, + ...table.state.columnSizing, [column.id]: Number(e.target.value), }) }} diff --git a/examples/react/composable-tables/package.json b/examples/react/composable-tables/package.json index 4302602f9c..94d2298a78 100644 --- a/examples/react/composable-tables/package.json +++ b/examples/react/composable-tables/package.json @@ -19,6 +19,8 @@ "devDependencies": { "@rolldown/plugin-babel": "^0.2.3", "@rollup/plugin-replace": "^6.0.3", + "@tanstack/react-devtools": "^0.10.5", + "@tanstack/react-table-devtools": "^9.0.0-alpha.49", "@types/react": "^19.2.15", "@types/react-dom": "^19.2.3", "@vitejs/plugin-react": "^6.0.2", diff --git a/examples/react/composable-tables/src/main.tsx b/examples/react/composable-tables/src/main.tsx index 63239f86f5..07af91adb2 100644 --- a/examples/react/composable-tables/src/main.tsx +++ b/examples/react/composable-tables/src/main.tsx @@ -5,6 +5,11 @@ import { createAppColumnHelper, useAppTable } from './hooks/table' import { makeData, makeProductData } from './makeData' import type { Person, Product } from './makeData' import './index.css' +import { TanStackDevtools } from '@tanstack/react-devtools' +import { + tableDevtoolsPlugin, + useTanStackTableDevtools, +} from '@tanstack/react-table-devtools' // Import cell components directly - they use useCellContext internally // Create column helpers with TFeatures already bound - only need TData! @@ -80,6 +85,8 @@ function UsersTable() { (state) => state, // default selector ) + useTanStackTableDevtools(table, 'Users table') + return ( // Main selector on AppTable - selects all needed state in one place state, // default selector ) + useTanStackTableDevtools(table, 'Products table') + return ( ({ @@ -436,5 +445,6 @@ if (!rootElement) throw new Error('Failed to find the root element') ReactDOM.createRoot(rootElement).render( + , ) diff --git a/examples/react/custom-plugin/src/main.tsx b/examples/react/custom-plugin/src/main.tsx index cb18a3693f..d6d2a66c09 100644 --- a/examples/react/custom-plugin/src/main.tsx +++ b/examples/react/custom-plugin/src/main.tsx @@ -293,7 +293,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state.pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -301,7 +301,7 @@ function App() { | Go to page: { const page = e.target.value ? Number(e.target.value) - 1 : 0 table.setPageIndex(page) @@ -310,7 +310,7 @@ function App() { /> { table.setPageSize(Number(value)) }} > - + {pageSizeOptions.map((pageSize) => ( @@ -57,8 +55,8 @@ export function DataTablePagination({
- Page {(table.store.state.pagination.pageIndex + 1).toLocaleString()}{' '} - of {table.getPageCount().toLocaleString()} + Page {(table.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {table.getPageCount().toLocaleString()}
) } diff --git a/examples/solid/filters-faceted/src/App.tsx b/examples/solid/filters-faceted/src/App.tsx index bd42b0d89b..c887496f8f 100644 --- a/examples/solid/filters-faceted/src/App.tsx +++ b/examples/solid/filters-faceted/src/App.tsx @@ -116,7 +116,7 @@ function App() { globalFilterDebouncer.maybeExecute(e.currentTarget.value) } @@ -200,7 +200,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state().pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -210,7 +210,7 @@ function App() { type="number" min="1" max={table.getPageCount()} - value={table.store.state.pagination.pageIndex + 1} + value={table.state().pagination.pageIndex + 1} onInput={(e) => { const page = e.currentTarget.value ? Number(e.currentTarget.value) - 1 @@ -221,7 +221,7 @@ function App() { /> { const page = e.currentTarget.value ? Number(e.currentTarget.value) - 1 @@ -240,7 +240,7 @@ function App() { /> globalFilterDebouncer.maybeExecute(e.currentTarget.value) } @@ -203,7 +203,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state().pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -213,7 +213,7 @@ function App() { type="number" min="1" max={table.getPageCount()} - value={table.store.state.pagination.pageIndex + 1} + value={table.state().pagination.pageIndex + 1} onInput={(e) => { const page = e.currentTarget.value ? Number(e.currentTarget.value) - 1 @@ -224,7 +224,7 @@ function App() { /> table.setPageSize(Number(e.currentTarget.value))} > @@ -234,7 +234,7 @@ function App() {
{table.getRowModel().rows.length.toLocaleString()} Rows
-
{JSON.stringify(table.store.state, null, 2)}
+
{JSON.stringify(table.state(), null, 2)}
) } diff --git a/examples/solid/kitchen-sink/src/App.tsx b/examples/solid/kitchen-sink/src/App.tsx index 80ca9c6381..2a6c14d065 100644 --- a/examples/solid/kitchen-sink/src/App.tsx +++ b/examples/solid/kitchen-sink/src/App.tsx @@ -355,7 +355,7 @@ function TableCell(props: { table: AppTable }) { const className = () => { - const groupingActive = props.table.store.state.grouping.length > 0 + const groupingActive = props.table.state().grouping.length > 0 const hasAggregation = !!props.cell.column.columnDef.aggregationFn return !groupingActive ? undefined @@ -551,8 +551,8 @@ function App() { ) const columnSizeVars = createMemo(() => { - void table.store.state.columnResizing - void table.store.state.columnSizing + void table.state().columnResizing + void table.state().columnSizing const colSizes: Record = {} for (const header of table.getFlatHeaders()) { colSizes[`--header-${header.id}-size`] = header.getSize() @@ -577,7 +577,7 @@ function App() {
table.setGlobalFilter(String(value))} class="global-filter-input" placeholder="Fuzzy search all columns..." @@ -714,7 +714,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state().pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -724,7 +724,7 @@ function App() { type="number" min="1" max={table.getPageCount()} - value={table.store.state.pagination.pageIndex + 1} + value={table.state().pagination.pageIndex + 1} onInput={(e) => { const page = e.currentTarget.value ? Number(e.currentTarget.value) - 1 @@ -735,7 +735,7 @@ function App() { /> { table.setPageSize(Number(e.currentTarget.value)) }} @@ -181,7 +181,7 @@ function MyTable(props: { Showing {table.getRowModel().rows.length.toLocaleString()} of{' '} {table.getRowCount().toLocaleString()} Rows
-
{JSON.stringify(table.store.state, null, 2)}
+
{JSON.stringify(table.state(), null, 2)}
) } diff --git a/examples/solid/row-pinning/src/App.tsx b/examples/solid/row-pinning/src/App.tsx index 128a4fb3de..62809a5c9b 100644 --- a/examples/solid/row-pinning/src/App.tsx +++ b/examples/solid/row-pinning/src/App.tsx @@ -250,7 +250,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state().pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -260,7 +260,7 @@ function App() { type="number" min="1" max={table.getPageCount()} - value={table.store.state.pagination.pageIndex + 1} + value={table.state().pagination.pageIndex + 1} onInput={(e) => { const page = e.currentTarget.value ? Number(e.currentTarget.value) - 1 @@ -271,7 +271,7 @@ function App() { /> table.setGlobalFilter(e.target.value)} class="summary-panel" placeholder="Search all columns..." @@ -233,7 +233,7 @@ function App() {
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state().pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -243,7 +243,7 @@ function App() { type="number" min="1" max={table.getPageCount()} - value={table.store.state.pagination.pageIndex + 1} + value={table.state().pagination.pageIndex + 1} onInput={(e) => { const page = e.target.value ? Number(e.target.value) - 1 : 0 table.setPageIndex(page) @@ -252,7 +252,7 @@ function App() { /> { table.setPageSize(Number(e.currentTarget.value)) }} diff --git a/examples/solid/with-tanstack-router/src/components/table.tsx b/examples/solid/with-tanstack-router/src/components/table.tsx index 471d9c545a..6c1f058b0b 100644 --- a/examples/solid/with-tanstack-router/src/components/table.tsx +++ b/examples/solid/with-tanstack-router/src/components/table.tsx @@ -195,7 +195,7 @@ export default function Table>(
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state().pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -203,7 +203,7 @@ export default function Table>( | Go to page: { const page = e.currentTarget.value ? Number(e.currentTarget.value) - 1 @@ -214,7 +214,7 @@ export default function Table>( /> { table.setPageSize(Number(e.currentTarget.value)) }} diff --git a/examples/svelte/composable-tables/src/components/ProductsTable.svelte b/examples/svelte/composable-tables/src/components/ProductsTable.svelte index eba8efbdf6..596db98a56 100644 --- a/examples/svelte/composable-tables/src/components/ProductsTable.svelte +++ b/examples/svelte/composable-tables/src/components/ProductsTable.svelte @@ -62,14 +62,14 @@ }) // Reactive derived values from table state - let sorting = $derived(table.store.state.sorting) - let columnFilters = $derived(table.store.state.columnFilters) + let sorting = $derived(table.state.sorting) + let columnFilters = $derived(table.state.columnFilters) // IMPORTANT: Derive rows from table state so Svelte tracks the dependency. // We must read a $state value that changes on every table update. // JSON.stringify forces a deep read, ensuring Svelte sees the dependency. const rows = $derived.by(() => { - JSON.stringify(table.store.state) + JSON.stringify(table.state) return table.getRowModel().rows }) diff --git a/examples/svelte/composable-tables/src/components/UsersTable.svelte b/examples/svelte/composable-tables/src/components/UsersTable.svelte index ed85bff648..a83910e657 100644 --- a/examples/svelte/composable-tables/src/components/UsersTable.svelte +++ b/examples/svelte/composable-tables/src/components/UsersTable.svelte @@ -72,16 +72,16 @@ }) // Reactive derived values from table state. - // Reading table.store.state creates a $state dependency (via the notifier) + // Reading table.state creates a $state dependency (via the notifier) // that triggers re-renders when any table state changes. - let sorting = $derived(table.store.state.sorting) - let columnFilters = $derived(table.store.state.columnFilters) + let sorting = $derived(table.state.sorting) + let columnFilters = $derived(table.state.columnFilters) // IMPORTANT: Derive rows from table state so Svelte tracks the dependency. // We must read a $state value that changes on every table update. // JSON.stringify forces a deep read, ensuring Svelte sees the dependency. const rows = $derived.by(() => { - JSON.stringify(table.store.state) + JSON.stringify(table.state) return table.getRowModel().rows }) diff --git a/examples/svelte/filters-fuzzy/src/App.svelte b/examples/svelte/filters-fuzzy/src/App.svelte index 6034180890..e562313191 100644 --- a/examples/svelte/filters-fuzzy/src/App.svelte +++ b/examples/svelte/filters-fuzzy/src/App.svelte @@ -107,8 +107,8 @@ ) $effect(() => { - if (table.store.state.columnFilters[0]?.id === 'fullName') { - if (table.store.state.sorting[0]?.id !== 'fullName') { + if (table.state.columnFilters[0]?.id === 'fullName') { + if (table.state.sorting[0]?.id !== 'fullName') { table.setSorting([{ id: 'fullName', desc: false }]) } diff --git a/examples/vue/column-visibility/src/App.tsx b/examples/vue/column-visibility/src/App.tsx index 0d400685be..faca800839 100644 --- a/examples/vue/column-visibility/src/App.tsx +++ b/examples/vue/column-visibility/src/App.tsx @@ -182,7 +182,7 @@ export default defineComponent({
-
{JSON.stringify(table.store.state, null, 2)}
+
{JSON.stringify(table.state, null, 2)}
) }, diff --git a/examples/vue/expanding/src/App.tsx b/examples/vue/expanding/src/App.tsx index 4bad74a9ba..a72af6bb64 100644 --- a/examples/vue/expanding/src/App.tsx +++ b/examples/vue/expanding/src/App.tsx @@ -294,7 +294,7 @@ export default defineComponent({
Page
- {(table.store.state.pagination.pageIndex + 1).toLocaleString()} of{' '} + {(table.state.pagination.pageIndex + 1).toLocaleString()} of{' '} {table.getPageCount().toLocaleString()}
@@ -304,7 +304,7 @@ export default defineComponent({ type="number" min="1" max={table.getPageCount()} - value={table.store.state.pagination.pageIndex + 1} + value={table.state.pagination.pageIndex + 1} onInput={(event: Event) => { const target = event.currentTarget as HTMLInputElement const page = target.value ? Number(target.value) - 1 : 0 @@ -314,7 +314,7 @@ export default defineComponent({ />
{table.getRowModel().rows.length.toLocaleString()} Rows
-
{JSON.stringify(table.store.state, null, 2)}
+
{JSON.stringify(table.state, null, 2)}
) }, diff --git a/packages/angular-table-devtools/eslint.config.js b/packages/angular-table-devtools/eslint.config.js new file mode 100644 index 0000000000..892f5314df --- /dev/null +++ b/packages/angular-table-devtools/eslint.config.js @@ -0,0 +1,8 @@ +// @ts-check + +import rootConfig from '../../eslint.config.js' + +/** @type {any} */ +const config = [...rootConfig] + +export default config diff --git a/packages/angular-table-devtools/package.json b/packages/angular-table-devtools/package.json new file mode 100644 index 0000000000..6d5d25e4c4 --- /dev/null +++ b/packages/angular-table-devtools/package.json @@ -0,0 +1,54 @@ +{ + "name": "@tanstack/angular-table-devtools", + "version": "9.0.0-alpha.43", + "description": "Angular devtools for TanStack Table.", + "license": "MIT", + "repository": { + "type": "git", + "url": "https://github.com/TanStack/table.git", + "directory": "packages/angular-table-devtools" + }, + "homepage": "https://tanstack.com/table", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "keywords": [ + "angular", + "tanstack", + "table", + "devtools" + ], + "scripts": { + "clean": "rimraf ./build && rimraf ./dist", + "test:eslint": "eslint ./src", + "test:lib": "vitest --passWithNoTests", + "test:lib:dev": "pnpm test:lib --watch", + "test:types": "tsc", + "test:build": "publint --strict", + "build": "tsdown" + }, + "type": "module", + "types": "dist/index.d.ts", + "exports": { + ".": "./dist/index.js", + "./production": "./dist/production.js", + "./package.json": "./package.json" + }, + "sideEffects": false, + "engines": { + "node": ">=20" + }, + "files": [ + "dist", + "src" + ], + "dependencies": { + "@tanstack/devtools-utils": "^0.5.0", + "@tanstack/table-core": "workspace:*", + "@tanstack/table-devtools": "workspace:*" + }, + "peerDependencies": { + "@angular/core": ">=21.0.0" + } +} diff --git a/packages/angular-table-devtools/src/TableDevtools.ts b/packages/angular-table-devtools/src/TableDevtools.ts new file mode 100644 index 0000000000..f8c9ff90d7 --- /dev/null +++ b/packages/angular-table-devtools/src/TableDevtools.ts @@ -0,0 +1,34 @@ +import { TableDevtoolsCore } from '@tanstack/table-devtools' +import { createAngularPanel } from '@tanstack/devtools-utils/angular' +import type { DevtoolsPanelProps } from '@tanstack/devtools-utils/angular' + +export interface TableDevtoolsAngularInit extends Partial {} + +const [TableDevtoolsPanelBase, TableDevtoolsPanelNoOpBase] = + createAngularPanel(TableDevtoolsCore) + +function resolvePanelProps( + props?: TableDevtoolsAngularInit, +): DevtoolsPanelProps { + return { + theme: props?.theme ?? 'dark', + devtoolsOpen: props?.devtoolsOpen ?? false, + } +} + +type TableDevtoolsPanelComponent = () => ( + inputs: () => TableDevtoolsAngularInit, + hostElement: HTMLElement, +) => () => void + +export const TableDevtoolsPanel: TableDevtoolsPanelComponent = + () => (props, host) => { + const panel = TableDevtoolsPanelBase() + return panel(() => resolvePanelProps(props()), host) + } + +export const TableDevtoolsPanelNoOp: TableDevtoolsPanelComponent = + () => (props, host) => { + const panel = TableDevtoolsPanelNoOpBase() + return () => panel + } diff --git a/packages/angular-table-devtools/src/index.ts b/packages/angular-table-devtools/src/index.ts new file mode 100644 index 0000000000..224ae9fee8 --- /dev/null +++ b/packages/angular-table-devtools/src/index.ts @@ -0,0 +1,20 @@ +import { isDevMode } from '@angular/core' +import * as plugin from './plugin' +import * as Devtools from './TableDevtools' +import * as inject from './injectTanStackTableDevtools' + +export const TableDevtoolsPanel = isDevMode() + ? Devtools.TableDevtoolsPanel + : Devtools.TableDevtoolsPanelNoOp + +export const tableDevtoolsPlugin = isDevMode() + ? plugin.tableDevtoolsPlugin + : plugin.tableDevtoolsNoOpPlugin + +export type { TableDevtoolsAngularInit } from './TableDevtools' + +export type { InjectTanStackTableDevtoolsOptions } from './injectTanStackTableDevtools' + +export const injectTanStackTableDevtools = isDevMode() + ? inject.injectTanStackTableDevtools + : inject.injectTanStackTableDevtoolsNoOp diff --git a/packages/angular-table-devtools/src/injectTanStackTableDevtools.ts b/packages/angular-table-devtools/src/injectTanStackTableDevtools.ts new file mode 100644 index 0000000000..d21be1abf6 --- /dev/null +++ b/packages/angular-table-devtools/src/injectTanStackTableDevtools.ts @@ -0,0 +1,68 @@ +import { + removeTableDevtoolsTarget, + upsertTableDevtoolsTarget, +} from '@tanstack/table-devtools' +import { + APP_ID, + DestroyRef, + Injector, + assertInInjectionContext, + effect, + inject, +} from '@angular/core' +import type { Table } from '@tanstack/table-core' + +function normalizeName(name?: string) { + const trimmedName = name?.trim() + return trimmedName ? trimmedName : undefined +} + +let autoId = 0 +function generateId(): string { + const appId = inject(APP_ID) + return `tanstacktable-${appId}_${autoId++}${Date.now().toString(36)}` +} + +export interface InjectTanStackTableDevtoolsOptions { + table: Table | undefined + name: string + enabled?: () => boolean + injector?: Injector +} + +export function injectTanStackTableDevtools( + options: () => InjectTanStackTableDevtoolsOptions, +): void { + const registrationId = generateId() + const enabled = () => options().enabled?.() ?? true + assertInInjectionContext(injectTanStackTableDevtools) + const injector = options().injector ?? inject(Injector) + const destroyRef = inject(DestroyRef) + + effect( + (onCleanup) => { + const { table, name } = options() + const enabledValue = enabled() + if (!enabledValue || !table) { + removeTableDevtoolsTarget(registrationId) + } + upsertTableDevtoolsTarget({ + id: registrationId, + table: table, + name: normalizeName(name), + }) + onCleanup(() => { + removeTableDevtoolsTarget(registrationId) + }) + }, + { injector }, + ) + + destroyRef.onDestroy(() => { + removeTableDevtoolsTarget(registrationId) + }) +} + +export function injectTanStackTableDevtoolsNoOp( + options: () => InjectTanStackTableDevtoolsOptions, +): void {} diff --git a/packages/angular-table-devtools/src/plugin.ts b/packages/angular-table-devtools/src/plugin.ts new file mode 100644 index 0000000000..4db67c28b9 --- /dev/null +++ b/packages/angular-table-devtools/src/plugin.ts @@ -0,0 +1,13 @@ +import { createAngularPlugin } from '@tanstack/devtools-utils/angular' +import { TableDevtoolsPanel } from './TableDevtools' + +type TableDevtoolsPluginFactory = ReturnType[0] + +const plugins = createAngularPlugin({ + name: 'TanStack Table', + render: TableDevtoolsPanel, +}) + +export const tableDevtoolsPlugin: TableDevtoolsPluginFactory = plugins[0] +export const tableDevtoolsNoOpPlugin: TableDevtoolsPluginFactory = + plugins[1] as any diff --git a/packages/angular-table-devtools/src/production.ts b/packages/angular-table-devtools/src/production.ts new file mode 100644 index 0000000000..f3e96534ef --- /dev/null +++ b/packages/angular-table-devtools/src/production.ts @@ -0,0 +1,5 @@ +export { TableDevtoolsPanel } from './TableDevtools' +export type { TableDevtoolsAngularInit } from './TableDevtools' +export { tableDevtoolsPlugin } from './plugin' +export { injectTanStackTableDevtools } from './injectTanStackTableDevtools' +export type { InjectTanStackTableDevtoolsOptions } from './injectTanStackTableDevtools' diff --git a/packages/angular-table-devtools/tsconfig.json b/packages/angular-table-devtools/tsconfig.json new file mode 100644 index 0000000000..7cd68e0598 --- /dev/null +++ b/packages/angular-table-devtools/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "../../tsconfig.json", + "compilerOptions": { + "useDefineForClassFields": false, + "forceConsistentCasingInFileNames": true, + "strict": true, + "noImplicitOverride": true, + "noPropertyAccessFromIndexSignature": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true + }, + "include": [ + "src", + "tests", + "eslint.config.js", + "vite.config.ts", + "tsdown.config.ts" + ] +} diff --git a/packages/angular-table-devtools/tsdown.config.ts b/packages/angular-table-devtools/tsdown.config.ts new file mode 100644 index 0000000000..63b0b0bd20 --- /dev/null +++ b/packages/angular-table-devtools/tsdown.config.ts @@ -0,0 +1,17 @@ +import { defineConfig } from 'tsdown' + +export default defineConfig({ + plugins: [], + entry: ['./src/index.ts', './src/production.ts'], + format: ['esm'], + unbundle: true, + dts: true, + sourcemap: true, + clean: true, + minify: false, + fixedExtension: false, + exports: true, + publint: { + strict: true, + }, +}) diff --git a/packages/angular-table-devtools/vite.config.ts b/packages/angular-table-devtools/vite.config.ts new file mode 100644 index 0000000000..8feed8cff3 --- /dev/null +++ b/packages/angular-table-devtools/vite.config.ts @@ -0,0 +1,15 @@ +import { defineConfig, mergeConfig } from 'vitest/config' +import packageJson from './package.json' + +const config = defineConfig({ + plugins: [], + test: { + name: packageJson.name, + dir: './', + watch: false, + environment: 'jsdom', + globals: true, + }, +}) + +export default config diff --git a/packages/angular-table/skills/angular/compose-with-tanstack-store/SKILL.md b/packages/angular-table/skills/angular/compose-with-tanstack-store/SKILL.md index ef5391d9fd..4ce220dcb8 100644 --- a/packages/angular-table/skills/angular/compose-with-tanstack-store/SKILL.md +++ b/packages/angular-table/skills/angular/compose-with-tanstack-store/SKILL.md @@ -60,7 +60,7 @@ tracks the dependency. ```ts this.table.atoms.pagination.get() // current value (reactive) this.table.atoms.pagination.subscribe(obs) // RxJS observer form -this.table.store.state.pagination // flat snapshot read +this.table.state.pagination // flat snapshot read this.table.baseAtoms.pagination.set(...) // direct internal write (avoid) ``` diff --git a/packages/angular-table/skills/angular/migrate-v8-to-v9/SKILL.md b/packages/angular-table/skills/angular/migrate-v8-to-v9/SKILL.md index 3d0603c35c..35e9269a50 100644 --- a/packages/angular-table/skills/angular/migrate-v8-to-v9/SKILL.md +++ b/packages/angular-table/skills/angular/migrate-v8-to-v9/SKILL.md @@ -3,7 +3,7 @@ name: angular/migrate-v8-to-v9 description: > Mechanical v8 → v9 migration for `@tanstack/angular-table`: `createAngularTable` → `injectTable`, `get*RowModel()` options → `_rowModels` factories with explicit `*Fns`, - required `_features` via `tableFeatures()`, `state` access via `table.store.state` instead + required `_features` via `tableFeatures()`, `state` access via `table.state` instead of `table.getState()`, `createColumnHelper()` generic-order flip, every type now requires `TFeatures`, `enablePinning` split into `enableColumnPinning` / `enableRowPinning`, `sortingFn` → `sortFn` rename pile, `ColumnSizingInfo` → `ColumnResizing` @@ -124,21 +124,21 @@ Row-model and feature lookup tables → [`references/v8-to-v9-mapping.md`](refer --- -## 3. State access: `getState()` → `table.store.state` (and atoms) +## 3. State access: `getState()` → `table.state` (and atoms) ```ts // v8 const { sorting, pagination } = table.getState() // v9 — flat snapshot -const { sorting, pagination } = table.store.state +const { sorting, pagination } = table.state // v9 — per slice (signal-backed in Angular) const sorting = table.atoms.sorting.get() const pagination = table.atoms.pagination.get() ``` -In Angular, all three (`table.atoms.`, `table.store.state`, +In Angular, all three (`table.atoms.`, `table.state`, `table.baseAtoms.`) are signal-backed — reading them inside a template, `computed(...)`, or `effect(...)` registers an Angular dependency automatically. No `toSignal(...)` wrappers needed. @@ -275,7 +275,7 @@ v8 backed reactivity with manual memoized getters. v9's adapter `computed` and every writable atom with an Angular `signal`. Consequences: - **No `toSignal(...)` adapters around table state.** Read `table.atoms.x.get()` - / `table.store.state.x` directly inside templates, `computed`, `effect`. + / `table.state.x` directly inside templates, `computed`, `effect`. - **`computed(...)` is for derivation / equality, not for "make it reactive".** Use `{ equal: shallow }` from `@tanstack/angular-table` on object/array slices to skip downstream work on no-op updates. @@ -306,7 +306,7 @@ v8 backed reactivity with manual memoized getters. v9's adapter - [ ] Update `createColumnHelper()` → `createColumnHelper()`. - [ ] Update every `ColumnDef` / `Cell` etc. to include `TFeatures`. -- [ ] Replace `table.getState()` reads with `table.store.state` (or +- [ ] Replace `table.getState()` reads with `table.state` (or `table.atoms..get()` for per-slice reactivity). - [ ] Remove any usage of the v8 single `onStateChange` — split into per-slice `on[State]Change`. @@ -366,9 +366,9 @@ _rowModels: { Same for sorting, pagination, expanding, grouping, faceting. Selection, visibility, ordering, pinning, sizing, resizing do **not** need a row model. -### 4. (HIGH) `getState()` → `table.store.state` text replacement loses reactivity +### 4. (HIGH) `getState()` → `table.state` text replacement loses reactivity -Bulk-replacing `table.getState().x` with `table.store.state.x` works for _current +Bulk-replacing `table.getState().x` with `table.state.x` works for _current value_ reads, but if you used a `computed`/`memo` around `getState()` for reactivity, switch to `table.atoms.x.get()` — it's already signal-backed and needs no wrapper. diff --git a/packages/angular-table/skills/angular/production-readiness/SKILL.md b/packages/angular-table/skills/angular/production-readiness/SKILL.md index 8f0b5764c8..a5caaa42a2 100644 --- a/packages/angular-table/skills/angular/production-readiness/SKILL.md +++ b/packages/angular-table/skills/angular/production-readiness/SKILL.md @@ -6,7 +6,7 @@ description: > stable references OUTSIDE the `injectTable` initializer; pass only the `*Fns` your data needs to `createSortedRowModel` / `createFilteredRowModel` / `createGroupedRowModel`; use `ChangeDetectionStrategy.OnPush`; lean on signal-backed atoms (`table.atoms..get()`) - instead of broad `table.store.state` reads where granularity matters; use `{ equal: shallow }` + instead of broad `table.state` reads where granularity matters; use `{ equal: shallow }` on object/array `computed` selectors; set `getRowId` for stable identity; track by `id` in every `@for`; defer cell components with `flexRenderComponent` only when you need its options; scope DI tokens via `[tanStackTable*]` directives to kill prop drilling. @@ -148,13 +148,13 @@ All `examples/angular/*` use `OnPush`. Match that. --- -## 4. Read narrowly — `table.atoms..get()` over `table.store.state` +## 4. Read narrowly — `table.atoms..get()` over `table.state` Both surfaces are signal-backed. The difference is _which signal_ gets read. ```ts // Wider — depends on the flat snapshot signal (recomputes when ANY registered slice changes) -const pageIndex = computed(() => this.table.store.state.pagination.pageIndex) +const pageIndex = computed(() => this.table.state.pagination.pageIndex) // Narrower — depends only on the pagination atom const pageIndex = computed(() => this.table.atoms.pagination.get().pageIndex) diff --git a/packages/angular-table/skills/angular/table-state/SKILL.md b/packages/angular-table/skills/angular/table-state/SKILL.md index 441a19ddfa..4c09c5a000 100644 --- a/packages/angular-table/skills/angular/table-state/SKILL.md +++ b/packages/angular-table/skills/angular/table-state/SKILL.md @@ -145,7 +145,7 @@ A table instance has three ways to look at its state: | ------------------------- | ------------------------------------------------------------------------------ | ------------------------------------------- | | `table.baseAtoms.` | writable TanStack Store atom (always exists for registered slices) | low-level direct write; rare | | `table.atoms.` | **readonly** derived atom per registered feature; backed by Angular `computed` | reading current value or driving reactivity | -| `table.store.state` | flat snapshot object of every registered slice; backed by Angular `computed` | reading multiple slices at once, devtools | +| `table.state` | flat snapshot object of every registered slice; backed by Angular `computed` | reading multiple slices at once, devtools | All three are signal-backed in Angular. Reading any of them inside a template, `computed(...)`, or `effect(...)` registers an Angular dependency. @@ -155,7 +155,7 @@ All three are signal-backed in Angular. Reading any of them inside a template, const pagination = this.table.atoms.pagination.get() // Same value, flat shape -const pagination2 = this.table.store.state.pagination +const pagination2 = this.table.state.pagination // Reactive derivation with custom equality import { computed } from '@angular/core' diff --git a/packages/angular-table/src/injectTable.ts b/packages/angular-table/src/injectTable.ts index a60e18910d..85dd1fb569 100644 --- a/packages/angular-table/src/injectTable.ts +++ b/packages/angular-table/src/injectTable.ts @@ -6,6 +6,7 @@ import { inject, untracked, } from '@angular/core' +import { injectSelector } from '@tanstack/angular-store' import { constructTable } from '@tanstack/table-core' import { lazyInit } from './lazySignalInitializer' import { angularReactivity } from './reactivity' @@ -20,6 +21,7 @@ import type { Table, TableFeatures, TableOptions, + TableState, } from '@tanstack/table-core' export type SubscribeSource = @@ -31,7 +33,19 @@ export type SubscribeSource = export type AngularTable< TFeatures extends TableFeatures, TData extends RowData, -> = Table +> = Table & { + /** + * @deprecated Prefer `table.state` for template/render reads, + * `table.atoms..get()` for slice snapshots, or Angular computed values + * around explicit selectors. `table.state` is a current-value snapshot + * and is easy to misuse in render code. + */ + readonly store: Table['store'] + /** + * The current table state exposed for template/render reads. + */ + readonly state: Readonly> +} /** * Creates and returns an Angular-reactive table instance. @@ -107,6 +121,15 @@ export function injectTable< coreReativityFeature: angularReactivity(injector), ...options()._features, }, + }) as AngularTable + const stateSignal = injectSelector(table.store, undefined, { injector }) + + Object.defineProperty(table, 'state', { + get() { + return stateSignal() + }, + configurable: true, + enumerable: true, }) let isMount = true diff --git a/packages/angular-table/src/reactivity.ts b/packages/angular-table/src/reactivity.ts index ad6907c124..09834cdab6 100644 --- a/packages/angular-table/src/reactivity.ts +++ b/packages/angular-table/src/reactivity.ts @@ -1,5 +1,6 @@ -import { NgZone, computed, signal, untracked } from '@angular/core' +import { DestroyRef, NgZone, computed, signal, untracked } from '@angular/core' import { toObservable } from '@angular/core/rxjs-interop' +import { batch, createAtom } from '@tanstack/angular-store' import type { Atom, Observer, ReadonlyAtom } from '@tanstack/angular-store' import type { TableAtomOptions, @@ -7,6 +8,8 @@ import type { } from '@tanstack/table-core/reactivity' import type { Injector, Signal, WritableSignal } from '@angular/core' +const optionsStoreDebugName = 'table/optionsStore' + function signalToReadonlyAtom( signal: Signal, injector: Injector, @@ -14,9 +17,13 @@ function signalToReadonlyAtom( return Object.assign(signal, { get: () => signal(), subscribe: (observer: Observer) => { - return toObservable(computed(signal), { injector: injector }).subscribe( - observer, - ) + const subscription = toObservable(computed(signal), { + injector: injector, + }).subscribe(observer) + + return { + unsubscribe: () => subscription.unsubscribe(), + } }, }) } @@ -33,9 +40,13 @@ function signalToWritableAtom( }, get: () => signal(), subscribe: (observer: Observer) => { - return toObservable(computed(signal), { injector: injector }).subscribe( - observer, - ) + const subscription = toObservable(computed(signal), { + injector: injector, + }).subscribe(observer) + + return { + unsubscribe: () => subscription.unsubscribe(), + } }, }) } @@ -43,34 +54,59 @@ function signalToWritableAtom( /** * Creates the table-core reactivity bindings used by the Angular adapter. * - * Readonly table atoms are backed by Angular `computed` signals and writable - * atoms by Angular `signal`. Subscriptions bridge through `toObservable` with - * the caller's injector so table APIs can be consumed from Angular `computed` - * and `effect` calls. + * Table state atoms are backed by TanStack Store atoms. The options store stays + * framework-native because row-model APIs read `table.options` directly during + * render. Readonly table atoms bridge Store dependency tracking into Angular + * computed signals. */ export function angularReactivity(injector: Injector): TableReactivityBindings { const ngZone = injector.get(NgZone) + const destroyRef = injector.get(DestroyRef) + return { createOptionsStore: true, schedule: (fn) => ngZone.runOutsideAngular(() => queueMicrotask(fn)), createReadonlyAtom: (fn: () => T, options?: TableAtomOptions) => { - const signal = computed(() => fn(), { - equal: options?.compare, - debugName: options?.debugName, + const storeAtom = createAtom(() => fn(), { + compare: options?.compare, }) - return signalToReadonlyAtom(signal, injector) + const version = signal(0, { + equal: () => false, + }) + const subscription = storeAtom.subscribe(() => { + version.update((value) => value + 1) + }) + destroyRef.onDestroy(() => subscription.unsubscribe()) + + const value = computed( + () => { + version() + return storeAtom.get() + }, + { + equal: options?.compare, + debugName: options?.debugName, + }, + ) + return signalToReadonlyAtom(value, injector) }, createWritableAtom: ( value: T, options?: TableAtomOptions, ): Atom => { - const writableSignal = signal(value, { - equal: options?.compare, - debugName: options?.debugName, + if (options?.debugName === optionsStoreDebugName) { + const writableSignal = signal(value, { + equal: options.compare, + debugName: options.debugName, + }) + return signalToWritableAtom(writableSignal, injector) + } + + return createAtom(value, { + compare: options?.compare, }) - return signalToWritableAtom(writableSignal, injector) }, untrack: untracked, - batch: (fn) => fn(), + batch, } } diff --git a/packages/angular-table/tests/angularReactivityFeature.test.ts b/packages/angular-table/tests/angularReactivityFeature.test.ts index 35f381d716..44657345da 100644 --- a/packages/angular-table/tests/angularReactivityFeature.test.ts +++ b/packages/angular-table/tests/angularReactivityFeature.test.ts @@ -1,8 +1,9 @@ import { describe, expect, test, vi } from 'vitest' import { computed, effect, signal } from '@angular/core' import { TestBed } from '@angular/core/testing' +import { createAtom } from '@tanstack/angular-store' import { injectTable, stockFeatures } from '../src' -import type { ColumnDef } from '../src' +import type { ColumnDef, RowSelectionState } from '../src' import type { WritableSignal } from '@angular/core' describe('angularReactivityFeature', () => { @@ -102,5 +103,43 @@ describe('angularReactivityFeature', () => { [false], ]) }) + + test('methods within effect react to external atom changes', () => { + const rowSelectionAtom = createAtom({}) + const table = TestBed.runInInjectionContext(() => + injectTable(() => ({ + data: data(), + _features: { ...stockFeatures }, + columns: columns, + getRowId: (row) => row.id, + atoms: { + rowSelection: rowSelectionAtom, + }, + })), + ) + const isSelectedRow1Captor = vi.fn<(val: boolean) => void>() + const tableStateCaptor = vi.fn<(val: RowSelectionState) => void>() + + TestBed.runInInjectionContext(() => { + effect(() => { + isSelectedRow1Captor(table.getRow('1').getIsSelected()) + }) + effect(() => { + tableStateCaptor(table.state.rowSelection) + }) + }) + + TestBed.tick() + expect(isSelectedRow1Captor).toHaveBeenCalledTimes(1) + expect(tableStateCaptor).toHaveBeenCalledTimes(1) + + rowSelectionAtom.set({ 1: true }) + TestBed.tick() + + expect(isSelectedRow1Captor).toHaveBeenCalledTimes(2) + expect(tableStateCaptor).toHaveBeenCalledTimes(2) + expect(isSelectedRow1Captor.mock.calls).toEqual([[false], [true]]) + expect(tableStateCaptor.mock.calls).toEqual([[{}], [{ 1: true }]]) + }) }) }) diff --git a/packages/lit-table/skills/lit/lit-table-controller/SKILL.md b/packages/lit-table/skills/lit/lit-table-controller/SKILL.md index 70d2aea1ba..9062252303 100644 --- a/packages/lit-table/skills/lit/lit-table-controller/SKILL.md +++ b/packages/lit-table/skills/lit/lit-table-controller/SKILL.md @@ -210,12 +210,12 @@ class DashboardElement extends LitElement { ## Reading State Off the Controller -The controller's `.table(...)` return value carries everything you usually need: feature methods, `FlexRender`, `Subscribe`, and the `state` projection. Direct reads off `table.atoms..get()` and `table.store.state.` are current-value reads; reactivity comes from the host invalidation subscriptions the controller already wires up. +The controller's `.table(...)` return value carries everything you usually need: feature methods, `FlexRender`, `Subscribe`, and the `state` projection. Direct reads off `table.atoms..get()` and `table.state.` are current-value reads; reactivity comes from the host invalidation subscriptions the controller already wires up. ```ts // Inside render(): const pagination = table.atoms.pagination.get() // current value -const snapshot = table.store.state // current full state +const snapshot = table.state // current full state const selected = table.state // projected via the selector you passed to .table() ``` diff --git a/packages/lit-table/skills/lit/table-state/SKILL.md b/packages/lit-table/skills/lit/table-state/SKILL.md index 8c46af79d0..cb7f17489e 100644 --- a/packages/lit-table/skills/lit/table-state/SKILL.md +++ b/packages/lit-table/skills/lit/table-state/SKILL.md @@ -161,7 +161,7 @@ Direct atom / store reads return the current value without subscribing to change ```ts const pagination = table.atoms.pagination.get() const sorting = table.atoms.sorting.get() -const snapshot = table.store.state +const snapshot = table.state ``` ### 4. `table.Subscribe` in templates diff --git a/packages/lit-table/src/TableController.ts b/packages/lit-table/src/TableController.ts index 44c84e397a..447b30be9f 100644 --- a/packages/lit-table/src/TableController.ts +++ b/packages/lit-table/src/TableController.ts @@ -31,7 +31,14 @@ export type LitTable< TFeatures extends TableFeatures, TData extends RowData, TSelected = TableState, -> = Table & { +> = Omit, 'store'> & { + /** + * @deprecated Prefer `table.state` for render reads, + * `table.atoms..get()` for slice snapshots, or `table.Subscribe` for + * explicit subscriptions. `table.store.state` is a current-value snapshot and + * is easy to misuse in render code. + */ + readonly store: Table['store'] /** * Subscribe to a selected slice of table state, or to a single source (atom or store). * @@ -74,7 +81,7 @@ export type LitTable< } /** * The selected state of the table. This state may not match the structure of - * `table.store.state` because it is selected by the `selector` function that + * the full table state because it is selected by the selector function that * you pass as the 2nd argument to `controller.table()`. * * @example @@ -224,7 +231,7 @@ export class TableController< return (selector?.(tableInstance.store.state) ?? tableInstance.store.state) as TSelected }, - } + } as unknown as LitTable } private _setupSubscriptions() { diff --git a/packages/preact-table/skills/preact/getting-started/SKILL.md b/packages/preact-table/skills/preact/getting-started/SKILL.md index 5f6f1d28ec..38a73a1997 100644 --- a/packages/preact-table/skills/preact/getting-started/SKILL.md +++ b/packages/preact-table/skills/preact/getting-started/SKILL.md @@ -200,7 +200,7 @@ Source: `examples/preact/basic-use-table/src/main.tsx`. ## Step 5 — Drive features with feature APIs -Reach for `table.setSorting(...)`, `table.setPageIndex(...)`, `table.nextPage()`, `column.toggleVisibility()`, `row.toggleSelected()`, etc. — never edit `table.store.state` directly. +Reach for `table.setSorting(...)`, `table.setPageIndex(...)`, `table.nextPage()`, `column.toggleVisibility()`, `row.toggleSelected()`, etc. — never edit `table.state` directly. ```tsx diff --git a/packages/preact-table/skills/preact/table-state/SKILL.md b/packages/preact-table/skills/preact/table-state/SKILL.md index a9d09073b3..2abd73ba0f 100644 --- a/packages/preact-table/skills/preact/table-state/SKILL.md +++ b/packages/preact-table/skills/preact/table-state/SKILL.md @@ -252,7 +252,7 @@ function Pager({ table }) { } ``` -`.get()` and `table.store.state` are current-value reads, not subscriptions. The component never re-renders when the atom changes. +`.get()` and `table.state` are current-value reads, not subscriptions. The component never re-renders when the atom changes. Source: `docs/framework/preact/guide/table-state.md`. ### HIGH Passing both `atoms.X` and `state.X` for the same slice diff --git a/packages/preact-table/src/useTable.ts b/packages/preact-table/src/useTable.ts index 2e61faefa1..ddaf2919ab 100644 --- a/packages/preact-table/src/useTable.ts +++ b/packages/preact-table/src/useTable.ts @@ -20,7 +20,15 @@ export type PreactTable< TFeatures extends TableFeatures, TData extends RowData, TSelected = TableState, -> = Table & { +> = Omit, 'store'> & { + /** + * @deprecated Prefer `table.state` for render reads, + * `table.atoms..get()` for slice snapshots, or + * `table.Subscribe` / `useSelector(table.store, selector)` for explicit + * subscriptions. `table.store.state` is a current-value snapshot and is easy + * to misuse in render code. + */ + readonly store: Table['store'] /** * A Preact HOC (Higher Order Component) that allows you to subscribe to the table state. * @@ -71,7 +79,9 @@ export type PreactTable< props: FlexRenderProps, ) => ComponentChildren /** - * The selected state of the table. This state may not match the structure of `table.store.state` because it is selected by the `selector` function that you pass as the 2nd argument to `useTable`. + * The selected state of the table. This state may not match the structure of + * the full table state because it is selected by the selector function that + * you pass as the 2nd argument to `useTable`. */ readonly state: Readonly } @@ -115,7 +125,7 @@ export function useTable< coreReativityFeature: preactReactivity(), ...tableOptions._features, }, - }) as PreactTable + }) as unknown as PreactTable tableInstance.Subscribe = ((props: any) => { const source = props.source ?? tableInstance.store diff --git a/packages/react-table-devtools/src/useTanStackTableDevtools.ts b/packages/react-table-devtools/src/useTanStackTableDevtools.ts index 456f5d8f66..f880651ca5 100644 --- a/packages/react-table-devtools/src/useTanStackTableDevtools.ts +++ b/packages/react-table-devtools/src/useTanStackTableDevtools.ts @@ -5,6 +5,7 @@ import { removeTableDevtoolsTarget, upsertTableDevtoolsTarget, } from '@tanstack/table-devtools' +import { useEffect } from 'react' import type { RowData, Table, TableFeatures } from '@tanstack/table-core' export interface UseTanStackTableDevtoolsOptions { @@ -25,24 +26,32 @@ export function useTanStackTableDevtools< options?: UseTanStackTableDevtoolsOptions, ): void { const registrationId = React.useId() + const normalizedName = normalizeName(name) + + const instanceId = + // instanceId from react table adapter (if it exists) allows for stable devtools registration even if the table instance changes + (table as unknown as { instanceId?: string }).instanceId || + `${registrationId}${normalizedName ? `-${normalizedName}` : ``}` + const enabled = options?.enabled ?? true - React.useEffect(() => { + useEffect(() => { if (!enabled || !table) { - removeTableDevtoolsTarget(registrationId) + removeTableDevtoolsTarget(instanceId) return } upsertTableDevtoolsTarget({ - id: registrationId, + id: instanceId, table, - name: normalizeName(name), + name: normalizedName, }) return () => { - removeTableDevtoolsTarget(registrationId) + removeTableDevtoolsTarget(instanceId) } - }, [enabled, name, registrationId, table]) + // eslint-disable-next-line @eslint-react/exhaustive-deps,react-hooks/exhaustive-deps + }, [enabled, registrationId, instanceId]) } export function useTanStackTableDevtoolsNoOp< diff --git a/packages/react-table/skills/react/compose-with-tanstack-store/SKILL.md b/packages/react-table/skills/react/compose-with-tanstack-store/SKILL.md index ae658f6001..924c7e4284 100644 --- a/packages/react-table/skills/react/compose-with-tanstack-store/SKILL.md +++ b/packages/react-table/skills/react/compose-with-tanstack-store/SKILL.md @@ -179,7 +179,7 @@ function Table({ data, filter }) { | `` / `` | ✓ | Surgical re-render boundaries inside the tree | | `useSelector(table.atoms.X)` | ✓ | Narrowest possible subscription to one slice | | `table.atoms.X.get()` | ✗ current-value read | Inside event handlers / effects | -| `table.store.state` | ✗ current-value read | Debugging / one-shot reads | +| `table.state` | ✗ current-value read | Debugging / one-shot reads | | Write path | Owner | Effect | | ------------------------------- | ----------------- | ---------------------------------------------------------------------------------- | diff --git a/packages/react-table/skills/react/migrate-v8-to-v9/SKILL.md b/packages/react-table/skills/react/migrate-v8-to-v9/SKILL.md index 1eb711865a..c03616f1d0 100644 --- a/packages/react-table/skills/react/migrate-v8-to-v9/SKILL.md +++ b/packages/react-table/skills/react/migrate-v8-to-v9/SKILL.md @@ -6,7 +6,7 @@ description: > memory has a v9 equivalent enumerated below: `useReactTable` → `useTable`, root `get*RowModel` options → `_rowModels` with factory + *Fns parameter, `createColumnHelper` → `createColumnHelper`, - `table.getState()` → `table.store.state` / `table.state` / `table.atoms.X.get()`, + `table.getState()` → `table.state` / `table.state` / `table.atoms.X.get()`, `sortingFn` → `sortFn`, `enablePinning` → split, `_`-prefixed APIs unprefixed, `ColumnSizing` split into `columnSizingFeature` + `columnResizingFeature`. For incremental migration, `useLegacyTable` from `@tanstack/react-table/legacy` @@ -120,12 +120,12 @@ const state = table.getState() const cells = row._getAllCellsByColumnId() // v9 -const all = table.store.state // flat snapshot +const all = table.state // flat snapshot const sorting = table.atoms.sorting.get() // per-slice atom const cells = row.getAllCellsByColumnId() // no underscore — APIs unprefixed ``` -In components, prefer `` over `table.store.state` for reactivity (see `tanstack-table/react/table-state`). +In components, prefer `` over `table.state` for reactivity (see `tanstack-table/react/table-state`). ### Renames @@ -329,7 +329,7 @@ function Toolbar({ table }) { } ``` -`getState` was removed. Use `table.store.state` for a flat snapshot, `table.state` if you passed a `useTable` selector, or `` for reactive reads. +`getState` was removed. Use `table.state` for a flat snapshot, `table.state` if you passed a `useTable` selector, or `` for reactive reads. Source: `docs/framework/react/guide/migrating.md`; `examples/react/basic-subscribe/src/main.tsx`. ### HIGH `enablePinning: true` on v9 diff --git a/packages/react-table/skills/react/production-readiness/SKILL.md b/packages/react-table/skills/react/production-readiness/SKILL.md index 31151548b1..e20a948c93 100644 --- a/packages/react-table/skills/react/production-readiness/SKILL.md +++ b/packages/react-table/skills/react/production-readiness/SKILL.md @@ -269,7 +269,7 @@ function SelectedCount({ table }) { } ``` -`` still selects from `table.store.state` (the full state). For a single slice, `useSelector(table.atoms.X)` skips even constructing the snapshot. +`` still selects from `table.state` (the full state). For a single slice, `useSelector(table.atoms.X)` skips even constructing the snapshot. Source: `docs/framework/react/guide/table-state.md`. ### MEDIUM Hoisting heavy table state reads above virtualizers diff --git a/packages/react-table/skills/react/table-state/SKILL.md b/packages/react-table/skills/react/table-state/SKILL.md index d2de2f220a..3ffb6ac58b 100644 --- a/packages/react-table/skills/react/table-state/SKILL.md +++ b/packages/react-table/skills/react/table-state/SKILL.md @@ -258,7 +258,7 @@ function Pager({ table }) { } ``` -`.get()` and `table.store.state` are current-value reads, not subscriptions. The component never re-renders when the atom changes. +`.get()` and `table.state` are current-value reads, not subscriptions. The component never re-renders when the atom changes. Source: `docs/framework/react/guide/table-state.md`; `examples/react/basic-subscribe/src/main.tsx`. ### HIGH Passing both `atoms.X` and `state.X` for the same slice diff --git a/packages/react-table/src/useLegacyTable.ts b/packages/react-table/src/useLegacyTable.ts index daa0ad7474..989f916624 100644 --- a/packages/react-table/src/useLegacyTable.ts +++ b/packages/react-table/src/useLegacyTable.ts @@ -279,7 +279,7 @@ export type LegacyReactTable = ReactTable< > & { /** * Returns the current table state. - * @deprecated In v9, access state directly via `table.state` or use `table.store.state` for the full state. + * @deprecated In v9, access state directly via `table.state` or use `table.state` for the full state. */ getState: () => TableState /** diff --git a/packages/react-table/src/useTable.ts b/packages/react-table/src/useTable.ts index 8272983306..5ac76f1f55 100644 --- a/packages/react-table/src/useTable.ts +++ b/packages/react-table/src/useTable.ts @@ -1,6 +1,6 @@ 'use client' -import { useMemo, useState } from 'react' +import { useId, useMemo, useRef, useState } from 'react' import { constructTable } from '@tanstack/table-core' import { shallow, useSelector } from '@tanstack/react-store' import { reactReactivity } from './reactivity' @@ -22,7 +22,19 @@ export type ReactTable< TFeatures extends TableFeatures, TData extends RowData, TSelected = TableState, -> = Table & { +> = Omit, 'store'> & { + /** + * @deprecated Prefer `table.state` for render reads, + * `table.atoms..get()` for slice snapshots, or + * `table.Subscribe` / `useSelector(table.store, selector)` for explicit + * subscriptions. `table.store.state` is a current-value snapshot and is easy + * to misuse in render code. + */ + readonly store: Table['store'] + /** + * A stable id reference for table instance + */ + instanceId?: string /** * A React HOC (Higher Order Component) that allows you to subscribe to the table state. * @@ -95,7 +107,9 @@ export type ReactTable< props: FlexRenderProps, ) => ReactNode /** - * The selected state of the table. This state may not match the structure of `table.store.state` because it is selected by the `selector` function that you pass as the 2nd argument to `useTable`. + * The selected state of the table. This state may not match the structure of + * the full table state because it is selected by the selector function that + * you pass as the 2nd argument to `useTable`. * * @example * const table = useTable(options, (state) => ({ globalFilter: state.globalFilter })) // only globalFilter is part of the selected state @@ -105,6 +119,7 @@ export type ReactTable< readonly state: Readonly } +let tableId = 0 /** * Creates a React table instance backed by TanStack Store atoms. * @@ -137,6 +152,13 @@ export function useTable< tableOptions: TableOptions, selector?: (state: TableState) => TSelected, ): ReactTable { + const instanceIdRef = useRef(undefined) + if (!instanceIdRef.current) { + instanceIdRef.current = + 'randomUUID' in globalThis.crypto + ? globalThis.crypto.randomUUID() + : `table-${++tableId}` + } const [table] = useState(() => { const tableInstance = constructTable({ ...tableOptions, @@ -144,7 +166,7 @@ export function useTable< coreReativityFeature: reactReactivity(), ...tableOptions._features, }, - }) as ReactTable + }) as unknown as ReactTable tableInstance.Subscribe = ((props: any) => { const source = props.source ?? tableInstance.store @@ -156,6 +178,7 @@ export function useTable< }) as ReactTable['Subscribe'] tableInstance.FlexRender = FlexRender + tableInstance.instanceId = instanceIdRef.current return tableInstance }) diff --git a/packages/solid-table/skills/solid/production-readiness/SKILL.md b/packages/solid-table/skills/solid/production-readiness/SKILL.md index 4a56e7b84e..52383cf5bb 100644 --- a/packages/solid-table/skills/solid/production-readiness/SKILL.md +++ b/packages/solid-table/skills/solid/production-readiness/SKILL.md @@ -238,10 +238,11 @@ A clear "didn't think about the bundle" tell. Use only the features you render. Keep `createVirtualizer` in the component that owns the scroll container, not high up in the tree. Otherwise scroll-driven recompute fires across the page. -### MEDIUM — re-reading `table.store.state` in JSX when an atom would do +### MEDIUM — re-reading `table.state` in JSX -`table.store.state.pagination` works, but `table.atoms.pagination.get()` or -`useSelector(table.atoms.pagination)` is the per-slice path. Prefer the slice. +Use `table.state()` for component-level reactive reads, or +`table.atoms.pagination.get()` / `useSelector(table.atoms.pagination)` for +per-slice reads. Avoid direct `table.state` reads in JSX. ### MEDIUM — `autoResetPageIndex: true` on a server-driven table diff --git a/packages/solid-table/skills/solid/table-state/SKILL.md b/packages/solid-table/skills/solid/table-state/SKILL.md index adc5252fd7..bf1dd15f0b 100644 --- a/packages/solid-table/skills/solid/table-state/SKILL.md +++ b/packages/solid-table/skills/solid/table-state/SKILL.md @@ -37,14 +37,14 @@ state directly through table APIs inside reactive scopes and never need A `createTable(...)` call produces a `SolidTable` with several state surfaces: -- `table.baseAtoms.` — internal writable atoms (signals). -- `table.atoms.` — readonly derived atoms (memos). One per registered feature slice. -- `table.store` — flat readonly TanStack Store snapshot. `table.store.state.pagination` reads the current value. +- `table.baseAtoms.` — internal writable TanStack Store atoms. Treat these as write plumbing, not a render read surface. +- `table.atoms.` — readonly derived atoms (memos). One per registered feature slice. Use `table.atoms.pagination.get()` for slice-level reactive reads. +- `table.store` — flat readonly TanStack Store snapshot for explicit subscriptions. Prefer `table.state()` or `table.atoms..get()` in JSX. - `table.state()` — **a Solid accessor**, not a value. Returns the result of the selector passed as the second argument to `createTable`. Default selector is identity. State slices only exist for features registered through `_features`. If `rowSortingFeature` is not in `_features`, then `table.atoms.sorting`, -`table.store.state.sorting`, and `state.sorting` are all absent (TS error + missing at runtime). +`table.state().sorting`, and `state.sorting` are all absent (TS error + missing at runtime). ## Creating a table — native signals diff --git a/packages/solid-table/src/createTable.ts b/packages/solid-table/src/createTable.ts index 266cbb74c9..f29ce6c75d 100644 --- a/packages/solid-table/src/createTable.ts +++ b/packages/solid-table/src/createTable.ts @@ -28,7 +28,15 @@ export type SolidTable< TFeatures extends TableFeatures, TData extends RowData, TSelected = TableState, -> = Table & { +> = Omit, 'store'> & { + /** + * @deprecated Prefer `table.state()` for component-level reactive reads, + * `table.atoms..get()` for slice-level reactive reads, or + * `table.Subscribe` / `useSelector(table.store, selector)` for explicit + * subscriptions. Reading `table.state` directly does not follow Solid's + * accessor convention and may not update render code as expected. + */ + readonly store: Table['store'] /** * Subscribe to the store (selector required) or a single source (atom or store). * Source **without** `selector` is a separate overload so children receive @@ -52,7 +60,9 @@ export type SolidTable< }): JSX.Element } /** - * The selected state of the table. This state may not match the structure of `table.store.state` because it is selected by the `selector` function that you pass as the 2nd argument to `createTable`. + * The selected state of the table. This state may not match the structure of + * the full table state because it is selected by the selector function that + * you pass as the 2nd argument to `createTable`. * * @example * const table = createTable(options, (state) => ({ globalFilter: state.globalFilter })) // only globalFilter is part of the selected state @@ -125,7 +135,7 @@ export function createTable< mergedOptions, ) as TableOptions - const table = constructTable(resolvedOptions) as SolidTable< + const table = constructTable(resolvedOptions) as unknown as SolidTable< TFeatures, TData, TSelected diff --git a/packages/solid-table/src/reactivity.ts b/packages/solid-table/src/reactivity.ts index 66571918cd..1d21f0825e 100644 --- a/packages/solid-table/src/reactivity.ts +++ b/packages/solid-table/src/reactivity.ts @@ -1,11 +1,12 @@ import { - batch, createMemo, createSignal, observable, + onCleanup, runWithOwner, untrack, } from 'solid-js' +import { batch, createAtom } from '@tanstack/solid-store' import type { Accessor, Owner, Setter } from 'solid-js' import type { TableAtomOptions, @@ -13,6 +14,8 @@ import type { } from '@tanstack/table-core/reactivity' import type { Atom, Observer, ReadonlyAtom } from '@tanstack/solid-store' +const optionsStoreDebugName = 'table/optionsStore' + function signalToReadonlyAtom( signal: Accessor, owner: Owner, @@ -26,10 +29,10 @@ function signalToReadonlyAtom( } function signalToWritableAtom( - signalTuple: [Accessor, Setter], + signal: Accessor, + setSignal: Setter, owner: Owner, ): Atom { - const [signal, setSignal] = signalTuple return Object.assign(signal, { set: (updater: T | ((prevVal: T) => T)) => { typeof updater === 'function' @@ -46,30 +49,54 @@ function signalToWritableAtom( /** * Creates the table-core reactivity bindings used by the Solid adapter. * - * Readonly table atoms are backed by Solid memos and writable table atoms are - * backed by Solid signals. Subscriptions run with the captured owner so table - * APIs can safely participate in Solid computations. + * Table state atoms are backed by TanStack Store atoms. The options store stays + * framework-native because row-model APIs read `table.options` directly during + * render. Readonly table atoms bridge Store dependency tracking into Solid memos. */ export function solidReactivity(owner: Owner): TableReactivityBindings { return { createOptionsStore: true, schedule: (fn) => queueMicrotask(() => fn()), createReadonlyAtom: (fn: () => T, options?: TableAtomOptions) => { - const signal = createMemo(() => fn(), { - equals: options?.compare, - name: options?.debugName, + const storeAtom = createAtom(() => fn(), { + compare: options?.compare, + }) + const [version, setVersion] = createSignal(0, { equals: false }) + runWithOwner(owner, () => { + const subscription = storeAtom.subscribe(() => { + setVersion((value) => value + 1) + }) + onCleanup(() => subscription.unsubscribe()) }) + + const signal = createMemo( + () => { + version() + return storeAtom.get() + }, + undefined, + { + equals: options?.compare, + name: options?.debugName, + }, + ) return signalToReadonlyAtom(signal, owner) }, createWritableAtom: ( value: T, options?: TableAtomOptions, ): Atom => { - const writableSignal = createSignal(value, { - equals: options?.compare, - name: options?.debugName, + if (options?.debugName === optionsStoreDebugName) { + const [signal, setSignal] = createSignal(value, { + equals: options.compare, + name: options.debugName, + }) + return signalToWritableAtom(signal, setSignal, owner) + } + + return createAtom(value, { + compare: options?.compare, }) - return signalToWritableAtom(writableSignal, owner) }, untrack: untrack, batch: batch, diff --git a/packages/solid-table/tests/unit/reactivity.test.ts b/packages/solid-table/tests/unit/reactivity.test.ts new file mode 100644 index 0000000000..36bfa4dcfa --- /dev/null +++ b/packages/solid-table/tests/unit/reactivity.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, test } from 'vitest' +import { createRoot, getOwner } from 'solid-js' +import { createAtom } from '@tanstack/solid-store' +import { solidReactivity } from '../../src/reactivity' + +describe('solidReactivity', () => { + test('readonly atoms update when they read external TanStack Store atoms', () => { + createRoot((dispose) => { + const owner = getOwner()! + const reactivity = solidReactivity(owner) + const external = createAtom(1) + const doubled = reactivity.createReadonlyAtom(() => external.get() * 2, { + debugName: 'doubled', + }) + + expect(doubled.get()).toBe(2) + + external.set(2) + + expect(doubled.get()).toBe(4) + dispose() + }) + }) +}) diff --git a/packages/svelte-table/skills/svelte/compose-with-tanstack-store/SKILL.md b/packages/svelte-table/skills/svelte/compose-with-tanstack-store/SKILL.md index 9a9a255c41..6a353ea38d 100644 --- a/packages/svelte-table/skills/svelte/compose-with-tanstack-store/SKILL.md +++ b/packages/svelte-table/skills/svelte/compose-with-tanstack-store/SKILL.md @@ -71,7 +71,7 @@ function logSort() { } ``` -`table.store.state` is the full snapshot equivalent. +`table.state` is the full snapshot equivalent. ## Pattern 2 — Reactive selector via `createTable` diff --git a/packages/svelte-table/skills/svelte/production-readiness/SKILL.md b/packages/svelte-table/skills/svelte/production-readiness/SKILL.md index 8832e88107..466fa22173 100644 --- a/packages/svelte-table/skills/svelte/production-readiness/SKILL.md +++ b/packages/svelte-table/skills/svelte/production-readiness/SKILL.md @@ -160,7 +160,7 @@ function exportSelected() { } ``` -`table.store.state` is the same idea for a full snapshot. +`table.state` is the same idea for a full snapshot. ## 6. Key every `{#each}` block on a stable id diff --git a/packages/svelte-table/skills/svelte/table-state/SKILL.md b/packages/svelte-table/skills/svelte/table-state/SKILL.md index 50f0cff4f7..63d6de8f56 100644 --- a/packages/svelte-table/skills/svelte/table-state/SKILL.md +++ b/packages/svelte-table/skills/svelte/table-state/SKILL.md @@ -109,7 +109,7 @@ Read the atom directly. Cheapest path; only reactive when called inside a rune-t ```ts const sorting = table.atoms.sorting.get() const pagination = table.atoms.pagination.get() -const flat = table.store.state +const flat = table.state ``` ### Reactive read inside markup — `table.state` selector diff --git a/packages/svelte-table/src/createTable.svelte.ts b/packages/svelte-table/src/createTable.svelte.ts index 283b161337..5a8451ac8a 100644 --- a/packages/svelte-table/src/createTable.svelte.ts +++ b/packages/svelte-table/src/createTable.svelte.ts @@ -15,9 +15,19 @@ export type SvelteTable< TFeatures extends TableFeatures, TData extends RowData, TSelected = TableState, -> = Table & { +> = Omit, 'store'> & { /** - * The selected state of the table. This state may not match the structure of `table.store.state` because it is selected by the `selector` function that you pass as the 2nd argument to `createTable`. + * @deprecated Prefer `table.state` for render reads, + * `table.atoms..get()` for slice snapshots, or + * `useSelector(table.store, selector)` for explicit subscriptions. + * `table.store.state` is a current-value snapshot and is easy to misuse in + * render code. + */ + readonly store: Table['store'] + /** + * The selected state of the table. This state may not match the structure of + * the full table state because it is selected by the selector function that + * you pass as the 2nd argument to `createTable`. * * @example * const table = createTable(options, (state) => ({ globalFilter: state.globalFilter })) // only globalFilter is part of the selected state @@ -82,7 +92,7 @@ export function createTable< ) as TableOptions // 3. Construct table - const table = constructTable(resolvedOptions) as SvelteTable< + const table = constructTable(resolvedOptions) as unknown as SvelteTable< TFeatures, TData, TSelected diff --git a/packages/svelte-table/src/reactivity.svelte.ts b/packages/svelte-table/src/reactivity.svelte.ts index 37887d6e2c..ae229e60f5 100644 --- a/packages/svelte-table/src/reactivity.svelte.ts +++ b/packages/svelte-table/src/reactivity.svelte.ts @@ -1,10 +1,13 @@ -import { flushSync, untrack } from 'svelte' +import { untrack } from 'svelte' +import { batch, createAtom } from '@tanstack/svelte-store' import type { TableAtomOptions, TableReactivityBindings, } from '@tanstack/table-core/reactivity' import type { Atom, Observer, ReadonlyAtom } from '@tanstack/svelte-store' +const optionsStoreDebugName = 'table/optionsStore' + function observerToCallback( observerOrNext: Observer | ((value: T) => void), ): (value: T) => void { @@ -28,19 +31,52 @@ function subscribeToRune( return { unsubscribe } } +function createRuneWritableAtom(initialValue: T): Atom { + let value = $state(initialValue) + + return { + set: (updater: T | ((prevVal: T) => T)) => { + value = + typeof updater === 'function' + ? (updater as (prevVal: T) => T)(value) + : updater + }, + get: () => value, + subscribe: ((observerOrNext: Observer | ((value: T) => void)) => { + return subscribeToRune(() => value, observerOrNext) + }) as Atom['subscribe'], + } +} + /** * Creates the table-core reactivity bindings used by the Svelte adapter. * - * Readonly table atoms are backed by `$derived.by`, writable atoms by `$state`, - * and subscriptions bridge through rune effects so table APIs participate in - * Svelte dependency tracking. + * Table state atoms are backed by TanStack Store atoms. The options store stays + * framework-native because row-model APIs read `table.options` directly during + * render. Readonly table atoms bridge Store dependency tracking into `$derived.by`. */ export function svelteReactivity(): TableReactivityBindings { return { createOptionsStore: true, schedule: (fn) => queueMicrotask(() => fn()), createReadonlyAtom: (fn: () => T, _options?: TableAtomOptions) => { - const value = $derived.by(fn) + const storeAtom = createAtom(() => fn(), { + compare: _options?.compare, + }) + let version = $state(0) + + $effect(() => { + const subscription = storeAtom.subscribe(() => { + version += 1 + }) + + return () => subscription.unsubscribe() + }) + + const value = $derived.by(() => { + version + return storeAtom.get() + }) return { get: () => value, @@ -53,22 +89,15 @@ export function svelteReactivity(): TableReactivityBindings { initialValue: T, _options?: TableAtomOptions, ): Atom => { - let value = $state(initialValue) - - return { - set: (updater: T | ((prevVal: T) => T)) => { - value = - typeof updater === 'function' - ? (updater as (prevVal: T) => T)(value) - : updater - }, - get: () => value, - subscribe: ((observerOrNext: Observer | ((value: T) => void)) => { - return subscribeToRune(() => value, observerOrNext) - }) as Atom['subscribe'], + if (_options?.debugName === optionsStoreDebugName) { + return createRuneWritableAtom(initialValue) } + + return createAtom(initialValue, { + compare: _options?.compare, + }) }, untrack: untrack, - batch: (fn) => flushSync(fn), + batch, } } diff --git a/packages/table-devtools/eslint.config.js b/packages/table-devtools/eslint.config.js index 5880eb7bfa..9fb656d60d 100644 --- a/packages/table-devtools/eslint.config.js +++ b/packages/table-devtools/eslint.config.js @@ -1,13 +1,9 @@ // @ts-check +import solid from 'eslint-plugin-solid/configs/recommended' import rootConfig from '../../eslint.config.js' /** @type {any} */ -const config = [ - ...rootConfig, - { - rules: {}, - }, -] +const config = [...rootConfig, solid] export default config diff --git a/packages/table-devtools/package.json b/packages/table-devtools/package.json index b1528fcaef..d81b2890b8 100644 --- a/packages/table-devtools/package.json +++ b/packages/table-devtools/package.json @@ -59,6 +59,7 @@ }, "devDependencies": { "@tanstack/table-core": "workspace:*", + "eslint-plugin-solid": "^0.14.5", "vite-plugin-solid": "^2.11.12" } } diff --git a/packages/table-devtools/src/TableContextProvider.tsx b/packages/table-devtools/src/TableContextProvider.tsx index 5b333f30cf..26aa5119fb 100644 --- a/packages/table-devtools/src/TableContextProvider.tsx +++ b/packages/table-devtools/src/TableContextProvider.tsx @@ -15,7 +15,7 @@ import type { RowData, Table, TableFeatures } from '@tanstack/table-core' import type { TableDevtoolsRegistration } from './tableTarget' type TableDevtoolsTabId = 'features' | 'state' | 'options' | 'rows' | 'columns' -type AnyTable = Table +type AnyTable = Table<{}, RowData> interface TableDevtoolsContextValue { targets: Accessor> @@ -31,12 +31,12 @@ const TableDevtoolsContext = createContext< >(undefined) export const TableContextProvider: ParentComponent = (props) => { - const [targets, setTargets] = createSignal>( - getTableDevtoolsTargets(), - ) + const initialTargets = getTableDevtoolsTargets() + const [targets, setTargets] = + createSignal>(initialTargets) const [selectedTargetId, setSelectedTargetId] = createSignal< string | undefined - >(targets()[0]?.id) + >(initialTargets[0]?.id) const [activeTab, setActiveTab] = createSignal('features') const selectedTarget = createMemo(() => diff --git a/packages/table-devtools/src/components/ColumnsPanel.tsx b/packages/table-devtools/src/components/ColumnsPanel.tsx index bd168f12af..8395b6d400 100644 --- a/packages/table-devtools/src/components/ColumnsPanel.tsx +++ b/packages/table-devtools/src/components/ColumnsPanel.tsx @@ -1,4 +1,4 @@ -import { For } from 'solid-js' +import { For, Show, createMemo } from 'solid-js' import { useTableDevtoolsContext } from '../TableContextProvider' import { useTableStore } from '../useTableStore' import { useStyles } from '../styles/use-styles' @@ -32,65 +32,61 @@ export function ColumnsPanel() { const styles = useStyles() const { table } = useTableDevtoolsContext() - const tableInstance = table() const tableState = useTableStore( - tableInstance ? tableInstance.store : undefined, + () => table()?.store, (state) => state, ) - if (!tableInstance) { - return - } - - const getColumns = (): Array => { - tableState?.() - const tableWithColumnFns = tableInstance as unknown as { - getAllFlatColumns?: () => Array - getAllLeafColumns?: () => Array + const columns = createMemo>(() => { + const tableInstance = table() + if (!tableInstance) { + return [] } + tableState() + return ( - tableWithColumnFns.getAllFlatColumns?.() ?? - tableWithColumnFns.getAllLeafColumns?.() ?? + tableInstance.getAllFlatColumns?.() ?? + tableInstance.getAllLeafColumns?.() ?? [] ) - } - - const columns = getColumns() + }) return ( -
-
Columns ({columns.length})
-
- - - - - - - - - - - - - {(column, index) => ( - - - - - - - - )} - - -
#iddepthaccessorcolumnDef
{index() + 1}{column.id}{column.depth} - {column.accessorFn ? '✓' : '○'} - - {getColumnDefSummary(column)} -
+ } when={table()}> +
+
Columns ({columns().length})
+
+ + + + + + + + + + + + + {(column, index) => ( + + + + + + + + )} + + +
#iddepthaccessorcolumnDef
{index() + 1}{column.id}{column.depth} + {column.accessorFn ? '✓' : '○'} + + {getColumnDefSummary(column)} +
+
-
+ ) } diff --git a/packages/table-devtools/src/components/FeaturesPanel.tsx b/packages/table-devtools/src/components/FeaturesPanel.tsx index 2deecafbe7..b8eb23ebe3 100644 --- a/packages/table-devtools/src/components/FeaturesPanel.tsx +++ b/packages/table-devtools/src/components/FeaturesPanel.tsx @@ -1,4 +1,4 @@ -import { For } from 'solid-js' +import { For, Show, createMemo } from 'solid-js' import { coreFeatures, stockFeatures } from '@tanstack/table-core' import { useTableDevtoolsContext } from '../TableContextProvider' import { useTableStore } from '../useTableStore' @@ -6,6 +6,8 @@ import { useStyles } from '../styles/use-styles' import { NoTableConnected } from './NoTableConnected' import { ResizableSplit } from './ResizableSplit' +import type { RowData, Table } from '@tanstack/table-core' + type FnBuckets = Partial< Record<'filterFns' | 'sortFns' | 'aggregationFns', Record> > @@ -101,12 +103,16 @@ const ROW_MODEL_TO_GETTER: Record< } function getRowCountForModel( - tableInstance: { [key: string]: unknown } | undefined, + tableInstance: Table<{}, RowData> | undefined, rowModelName: string, ): number { const getter = ROW_MODEL_TO_GETTER[rowModelName] - if (!getter || typeof tableInstance?.[getter] !== 'function') return 0 - const result = (tableInstance[getter] as () => { rows?: Array })() + if (!getter || !tableInstance) return 0 + + const tableRecord = tableInstance as unknown as Record + if (typeof tableRecord[getter] !== 'function') return 0 + + const result = (tableRecord[getter] as () => { rows?: Array })() return result.rows?.length ?? 0 } @@ -126,43 +132,58 @@ export function FeaturesPanel() { const styles = useStyles() const { table } = useTableDevtoolsContext() - const tableInstance = table() const tableState = useTableStore( - tableInstance ? tableInstance.store : undefined, + () => table()?.store, (state) => state, ) + const tableOptions = useTableStore( + () => { + const tableInstance = table() + return tableInstance?.optionsStore ?? tableInstance?.store + }, + () => table()?.options as unknown, + ) - if (!tableInstance) { - return - } + const tableFeatures = createMemo((): Set => { + const tableInstance = table() + if (!tableInstance) return new Set() - const getTableFeatures = (): Set => { - tableState?.() - return new Set(Object.keys(tableInstance?._features ?? {})) - } + tableState() + return new Set(Object.keys(tableInstance._features ?? {})) + }) - const getRowModelNames = (): Array => { - tableState?.() - return Object.keys(tableInstance?.options._rowModels ?? {}) - } + const rowModelNames = createMemo((): Array => { + const tableInstance = table() + if (!tableInstance) return [] + + tableState() + tableOptions() + + return Object.keys(tableInstance.options._rowModels ?? {}) + }) const getFnNames = ( kind: 'filterFns' | 'sortFns' | 'aggregationFns', ): Array => { - tableState?.() - const rowModelFns = toFnBuckets(tableInstance?._rowModelFns) - const optionFns = toFnBuckets(tableInstance?.options) + const tableInstance = table() + if (!tableInstance) return [] + + tableState() + tableOptions() + + const rowModelFns = toFnBuckets(tableInstance._rowModelFns) + const optionFns = toFnBuckets(tableInstance.options) return Object.keys(rowModelFns[kind] ?? optionFns[kind] ?? {}) } - const getAdditionalPlugins = (): Array => { - const tableFeatures = getTableFeatures() + const additionalPlugins = createMemo((): Array => { + const currentFeatures = tableFeatures() const knownFeatures = new Set([ ...CORE_FEATURE_NAMES, ...STOCK_FEATURE_NAMES, ]) - return [...tableFeatures].filter((f) => !knownFeatures.has(f)).sort() - } + return [...currentFeatures].filter((f) => !knownFeatures.has(f)).sort() + }) const getRowModelFunctions = (rowModelName: string): Array => { const fnKind = ROW_MODEL_TO_FN_KIND[rowModelName] @@ -170,22 +191,46 @@ export function FeaturesPanel() { return getFnNames(fnKind) } - const tableFeatures = getTableFeatures() - const rowModelNames = getRowModelNames() - const enabledFeatureEstimate = [...tableFeatures].reduce( - (total, featureName) => { + const enabledFeatureEstimate = createMemo(() => + [...tableFeatures()].reduce((total, featureName) => { return total + (FEATURE_SIZE_ESTIMATES_BYTES[featureName] ?? 0) - }, - 0, + }, 0), + ) + const enabledRowModelEstimate = createMemo(() => + [...new Set(rowModelNames())] + .map((rowModelName) => normalizeRowModelEstimateKey(rowModelName)) + .filter((rowModelName, index, all) => all.indexOf(rowModelName) === index) + .reduce((total, rowModelName) => { + return total + (ROW_MODEL_SIZE_ESTIMATES_BYTES[rowModelName] ?? 0) + }, 0), + ) + const totalEstimatedBundleSize = createMemo( + () => enabledFeatureEstimate() + enabledRowModelEstimate(), ) - const enabledRowModelEstimate = [...new Set(rowModelNames)] - .map((rowModelName) => normalizeRowModelEstimateKey(rowModelName)) - .filter((rowModelName, index, all) => all.indexOf(rowModelName) === index) - .reduce((total, rowModelName) => { - return total + (ROW_MODEL_SIZE_ESTIMATES_BYTES[rowModelName] ?? 0) - }, 0) - const totalEstimatedBundleSize = - enabledFeatureEstimate + enabledRowModelEstimate + + const rowModels = createMemo(() => { + const tableInstance = table() + if (!tableInstance) return [] + + tableState() + + return rowModelNames().map((rowModelName) => { + const sharedLabel = ROW_MODEL_SHARED_SIZE_LABELS[rowModelName] + + return { + rowModelName, + fns: getRowModelFunctions(rowModelName), + rowCount: getRowCountForModel(tableInstance, rowModelName), + estimateLabel: + sharedLabel ?? + formatEstimatedSize( + ROW_MODEL_SIZE_ESTIMATES_BYTES[ + normalizeRowModelEstimateKey(rowModelName) + ], + ), + } + }) + }) const renderFeatureItem = ( name: string, @@ -202,142 +247,139 @@ export function FeaturesPanel() { ) return ( -
- -
Features
-
-
- Estimated table-core package -
-
- Registered features - {formatEstimatedSize(enabledFeatureEstimate)} -
-
- Client row models - {formatEstimatedSize(enabledRowModelEstimate)} -
-
- Total - {formatEstimatedSize(totalEstimatedBundleSize)} + } when={table()}> +
+ +
Features
+
+
+ Estimated table-core package +
+
+ Registered features + {formatEstimatedSize(enabledFeatureEstimate())} +
+
+ Client row models + {formatEstimatedSize(enabledRowModelEstimate())} +
+
+ Total + {formatEstimatedSize(totalEstimatedBundleSize())} +
+
+ Allocated from the current `size-limit` metric: minified and + brotlied. +
-
- Allocated from the current `size-limit` metric: minified and - brotlied. + +
+
Core Features
+ + {(name) => + renderFeatureItem( + name, + tableFeatures().has(name), + formatEstimatedSize(FEATURE_SIZE_ESTIMATES_BYTES[name]), + ) + } +
-
- -
-
Core Features
- - {(name) => - renderFeatureItem( - name, - tableFeatures.has(name), - formatEstimatedSize(FEATURE_SIZE_ESTIMATES_BYTES[name]), - ) - } - -
- -
-
Stock Features
- - {(name) => - renderFeatureItem( - name, - tableFeatures.has(name), - formatEstimatedSize(FEATURE_SIZE_ESTIMATES_BYTES[name]), - ) - } - -
- {getAdditionalPlugins().length > 0 && (
- Additional Plugins + Stock Features
- - {(name) => renderFeatureItem(name, true, 'custom')} + + {(name) => + renderFeatureItem( + name, + tableFeatures().has(name), + formatEstimatedSize(FEATURE_SIZE_ESTIMATES_BYTES[name]), + ) + }
- )} - - } - right={ - <> -
- Client Side Row Models and Fns -
- - {(rowModelName) => { - const fns = getRowModelFunctions(rowModelName) - const rowCount = getRowCountForModel( - tableInstance, - rowModelName, - ) - const sharedLabel = ROW_MODEL_SHARED_SIZE_LABELS[rowModelName] - const estimateLabel = - sharedLabel ?? - formatEstimatedSize( - ROW_MODEL_SIZE_ESTIMATES_BYTES[ - normalizeRowModelEstimateKey(rowModelName) - ], - ) - return ( + + {additionalPlugins().length > 0 && ( +
+
+ Additional Plugins +
+ + {(name) => renderFeatureItem(name, true, 'custom')} + +
+ )} + + } + right={ + <> +
+ Client Side Row Models and Fns +
+ + {(rowModel) => (
- {rowModelName} + + {rowModel.rowModelName} + - {rowCount} rows, {estimateLabel} + {rowModel.rowCount} rows, {rowModel.estimateLabel}
- + {(fnName) => (
{fnName}
)}
- ) - }} -
- {rowModelNames.length === 0 && ( -
No row models configured
- )} -
- Full package reference:{' '} - {formatEstimatedSize(PACKAGE_SIZE_LIMIT_BYTES)} -
-
-
Execution Order
- - {(getter, index) => { - const rowModelKey = getterToRowModelKey(getter) - const isPresent = - rowModelKey !== null && rowModelNames.includes(rowModelKey) - return ( - <> - {index() > 0 && ' → '} - - {getter} - - - ) - }} + )} -
- - } - /> -
+ {rowModelNames().length === 0 && ( +
+ No row models configured +
+ )} +
+ Full package reference:{' '} + {formatEstimatedSize(PACKAGE_SIZE_LIMIT_BYTES)} +
+
+
+ Execution Order +
+ + {(getter, index) => { + const rowModelKey = getterToRowModelKey(getter) + const isPresent = + rowModelKey !== null && + rowModelNames().includes(rowModelKey) + + return ( + <> + {index() > 0 && ' → '} + + {getter} + + + ) + }} + +
+ + } + /> +
+ ) } diff --git a/packages/table-devtools/src/components/OptionsPanel.tsx b/packages/table-devtools/src/components/OptionsPanel.tsx index ab1c6165d6..243b37f8ba 100644 --- a/packages/table-devtools/src/components/OptionsPanel.tsx +++ b/packages/table-devtools/src/components/OptionsPanel.tsx @@ -1,5 +1,5 @@ import { JsonTree } from '@tanstack/devtools-ui' -import { useSelector } from '@tanstack/solid-store' +import { Show, createMemo } from 'solid-js' import { useTableDevtoolsContext } from '../TableContextProvider' import { useTableStore } from '../useTableStore' import { useStyles } from '../styles/use-styles' @@ -21,37 +21,42 @@ export function OptionsPanel() { const styles = useStyles() const { table } = useTableDevtoolsContext() - const tableInstance = table() - const tableState = tableInstance - ? tableInstance.optionsStore - ? useSelector(tableInstance.optionsStore, (state: unknown) => - projectOptionsForTree(state), - ) - : useTableStore(tableInstance.store, () => - projectOptionsForTree(tableInstance.options as unknown), - ) - : undefined + const tableOptions = useTableStore( + () => { + const tableInstance = table() + return tableInstance?.optionsStore ?? tableInstance?.store + }, + () => { + const tableInstance = table() + return tableInstance + ? projectOptionsForTree(tableInstance.options as unknown) + : undefined + }, + ) - if (!tableInstance) { - return - } + const options = createMemo(() => { + const tableInstance = table() + if (!tableInstance) { + return undefined + } - const getState = (): unknown => { - tableState?.() - return tableState?.() - } + tableOptions() + return projectOptionsForTree(tableInstance.options as unknown) + }) return ( -
- -
Options
- - - } - right={<>} - /> -
+ } when={table()}> +
+ +
Options
+ + + } + right={<>} + /> +
+
) } diff --git a/packages/table-devtools/src/components/RowsPanel.tsx b/packages/table-devtools/src/components/RowsPanel.tsx index 29d3f48717..af45649ae9 100644 --- a/packages/table-devtools/src/components/RowsPanel.tsx +++ b/packages/table-devtools/src/components/RowsPanel.tsx @@ -1,4 +1,4 @@ -import { For, createSignal } from 'solid-js' +import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' import { JsonTree } from '@tanstack/devtools-ui' import { useTableDevtoolsContext } from '../TableContextProvider' import { useTableStore } from '../useTableStore' @@ -47,35 +47,52 @@ function stringifyValue(value: unknown): string { export function RowsPanel() { const styles = useStyles() const { table } = useTableDevtoolsContext() - const tableInstance = table() const tableState = useTableStore( - tableInstance ? tableInstance.store : undefined, + () => table()?.store, (state) => state, ) + const tableOptions = useTableStore( + () => { + const tableInstance = table() + return tableInstance?.optionsStore ?? tableInstance?.store + }, + () => table()?.options as unknown, + ) const [selectedRowModel, setSelectedRowModel] = createSignal<(typeof ROW_MODEL_GETTERS)[number]>('getRowModel') - if (!tableInstance) { - return - } + const rawData = createMemo((): unknown => { + const tableInstance = table() + if (!tableInstance) return undefined + + tableState() + tableOptions() - const getRawData = (): unknown => { - tableState?.() const data = tableInstance.options.data as ReadonlyArray if (!Array.isArray(data)) return data if (data.length <= ROW_LIMIT) return data as unknown return data.slice(0, ROW_LIMIT) as unknown - } + }) + + const rawDataTotalCount = createMemo((): number => { + const tableInstance = table() + if (!tableInstance) return 0 + + tableState() + tableOptions() - const getRawDataTotalCount = (): number => { - tableState?.() const data = tableInstance.options.data as ReadonlyArray return Array.isArray(data) ? data.length : 0 - } + }) + + const columns = createMemo((): Array => { + const tableInstance = table() + if (!tableInstance) return [] + + tableState() + tableOptions() - const getColumns = (): Array => { - tableState?.() const tableWithColumnFns = tableInstance as unknown as { getVisibleLeafColumns?: () => Array getAllLeafColumns?: () => Array @@ -86,119 +103,144 @@ export function RowsPanel() { tableWithColumnFns.getAllLeafColumns?.() ?? [] ) - } + }) + + const availableGetters = createMemo( + (): Array<(typeof ROW_MODEL_GETTERS)[number]> => { + const tableInstance = table() + if (!tableInstance) return [] + + const tableRecord = tableInstance as unknown as Record + + return ROW_MODEL_GETTERS.filter( + (name) => typeof tableRecord[name] === 'function', + ) + }, + ) + + createEffect(() => { + const getters = availableGetters() + if (getters.length === 0) return - const getAllRows = (): Array => { - tableState?.() - selectedRowModel() - const getter = tableInstance?.[selectedRowModel()] as + const currentGetter = selectedRowModel() + if (!getters.includes(currentGetter)) { + setSelectedRowModel(getters[0]!) + } + }) + + const allRows = createMemo((): Array => { + const tableInstance = table() + if (!tableInstance) return [] + + tableState() + + const tableRecord = tableInstance as unknown as Record + const getter = tableRecord[selectedRowModel()] as | (() => { rows: Array }) | undefined + return getter?.().rows ?? [] - } + }) - const getRows = (): Array => { - const rows = getAllRows() - return rows.length <= ROW_LIMIT ? rows : rows.slice(0, ROW_LIMIT) - } + const rows = createMemo((): Array => { + const nextRows = allRows() + if (nextRows.length <= ROW_LIMIT) return nextRows + return nextRows.slice(0, ROW_LIMIT) + }) - const getRowsTotalCount = (): number => getAllRows().length + const rowsTotalCount = createMemo(() => allRows().length) const getCells = (row: AnyRow): Array => { - tableState?.() const rowWithMaybeVisibleCells = row as unknown as { getVisibleCells?: () => Array } return rowWithMaybeVisibleCells.getVisibleCells?.() ?? row.getAllCells() } - const getAvailableGetters = (): Array<(typeof ROW_MODEL_GETTERS)[number]> => { - return ROW_MODEL_GETTERS.filter( - (name) => typeof tableInstance[name] === 'function', - ) - } - return ( -
- -
- Raw Data - {getRawDataTotalCount() > ROW_LIMIT && ( - - {' '} - (First {ROW_LIMIT} rows) - - )} -
- - - } - right={ - <> -
- Rows ({getRows().length} - {getRowsTotalCount() > ROW_LIMIT && ` of ${getRowsTotalCount()}`}) - {getRowsTotalCount() > ROW_LIMIT && ( - - {' '} - — First {ROW_LIMIT} rows - - )} -
-
- - -
-
- - - - - - {(column) => ( - - )} - - - - - - {(row) => ( - - - - {(cell) => ( - - )} - - + } when={table()}> +
+ +
+ Raw Data + {rawDataTotalCount() > ROW_LIMIT && ( + + {' '} + (First {ROW_LIMIT} rows) + + )} +
+ + + } + right={ + <> +
+ Rows ({rows().length} + {rowsTotalCount() > ROW_LIMIT && ` of ${rowsTotalCount()}`}) + {rowsTotalCount() > ROW_LIMIT && ( + + {' '} + — First {ROW_LIMIT} rows + + )} +
+
+ +
-
#{column.id}
{row.id} - {stringifyValue(cell.getValue())} -
-
- - } - /> -
+ +
+
+ + + + + + {(column) => ( + + )} + + + + + + {(row) => ( + + + + {(cell) => ( + + )} + + + )} + + +
#{column.id}
{row.id} + {stringifyValue(cell.getValue())} +
+
+ + } + /> +
+ ) } diff --git a/packages/table-devtools/src/components/Shell.tsx b/packages/table-devtools/src/components/Shell.tsx index 13f4e19fa6..c321e30d4f 100644 --- a/packages/table-devtools/src/components/Shell.tsx +++ b/packages/table-devtools/src/components/Shell.tsx @@ -1,4 +1,4 @@ -import { Match, Show, Switch } from 'solid-js' +import { For, Match, Show, Switch } from 'solid-js' import { Header, HeaderLogo, MainPanel, Select } from '@tanstack/devtools-ui' import { useTableDevtoolsContext } from '../TableContextProvider' import { useStyles } from '../styles/use-styles' @@ -49,31 +49,35 @@ export function Shell() {
- 0}> - - {(_selectedTargetId) => ( - setSelectedTargetId(value)} + /> + )} + + )}
- {tabs.map((tab) => ( - - ))} + + {(tab) => ( + + )} +
diff --git a/packages/table-devtools/src/components/StatePanel.tsx b/packages/table-devtools/src/components/StatePanel.tsx index 2b03b5320c..0f47ccde97 100644 --- a/packages/table-devtools/src/components/StatePanel.tsx +++ b/packages/table-devtools/src/components/StatePanel.tsx @@ -1,6 +1,6 @@ -import { For, createSignal } from 'solid-js' +import { For, Show, createEffect, createMemo, createSignal } from 'solid-js' import { JsonTree } from '@tanstack/devtools-ui' -import { batch, useSelector } from '@tanstack/solid-store' +import { batch } from '@tanstack/solid-store' import { useTableDevtoolsContext } from '../TableContextProvider' import { useTableStore } from '../useTableStore' import { useStyles } from '../styles/use-styles' @@ -22,41 +22,49 @@ export function StatePanel() { const [storeCopied, setStoreCopied] = createSignal(false) const [pasteError, setPasteError] = createSignal(null) - const tableInstance = table() // Subscribe to both stores so the panel re-renders when either the table // state or the options (e.g. options.atoms / options.state) change. const tableState = useTableStore( - tableInstance ? tableInstance.store : undefined, + () => table()?.store, (state) => state, ) - const tableOptions = tableInstance - ? tableInstance.optionsStore - ? useSelector(tableInstance.optionsStore, (opts) => opts) - : useTableStore(tableInstance.store, () => tableInstance.options) - : undefined - - if (!tableInstance) { - return - } + const tableOptions = useTableStore( + () => { + const tableInstance = table() + return tableInstance?.optionsStore ?? tableInstance?.store + }, + () => table()?.options as unknown, + ) - const getInitialState = (): unknown => { - tableState?.() - tableOptions?.() - return tableInstance.initialState as unknown - } + const initialState = createMemo((): unknown => { + const tableInstance = table() + if (!tableInstance) return undefined - const getStoreState = (): unknown => { - tableState?.() - tableOptions?.() - return tableInstance.store.state as unknown - } + tableState() + tableOptions() + + return tableInstance.initialState + }) + + const storeState = createMemo((): unknown => { + const tableInstance = table() + if (!tableInstance) return undefined + + tableState() + tableOptions() + + return tableInstance.store.state + }) + + const atomSlices = createMemo((): Array => { + const tableInstance = table() + if (!tableInstance) return [] - const getAtomSlices = (): Array => { // Touch subscriptions so this recomputes on state or option change. - tableState?.() - tableOptions?.() + tableState() + tableOptions() - const options = tableInstance.options as Record + const options = tableInstance.options as unknown as Record const externalAtoms = (options.atoms as Record | undefined) ?? {} const externalState = @@ -82,7 +90,7 @@ export function StatePanel() { source, } }) - } + }) const copyToClipboard = async ( value: unknown, @@ -98,8 +106,11 @@ export function StatePanel() { } const handlePaste = async () => { + const tableInstance = table() if (!tableInstance) return + setPasteError(null) + try { const text = await navigator.clipboard.readText() const parsed = JSON.parse(text) @@ -130,77 +141,75 @@ export function StatePanel() { } const handleReset = () => { - tableInstance.reset() + table()?.reset() } return ( -
- -
initialState
-
- -
- - - } - middle={ - <> -
Atoms
-
- -
- - {(slice) => } - - - } - right={ - <> -
Store
-
- - -
- {pasteError() && ( -
{pasteError()}
- )} - - - } - /> -
+ } when={table()}> +
+ +
initialState
+
+ +
+ + + } + middle={ + <> +
Atoms
+
+ +
+ + {(slice) => } + + + } + right={ + <> +
Store
+
+ + +
+ {pasteError() && ( +
{pasteError()}
+ )} + + + } + /> +
+
) } diff --git a/packages/table-devtools/src/components/ThreeWayResizableSplit.tsx b/packages/table-devtools/src/components/ThreeWayResizableSplit.tsx index fb629a230e..3a5803172e 100644 --- a/packages/table-devtools/src/components/ThreeWayResizableSplit.tsx +++ b/packages/table-devtools/src/components/ThreeWayResizableSplit.tsx @@ -20,6 +20,7 @@ export function ThreeWayResizableSplit(props: ThreeWayResizableSplitProps) { const makeDragHandler = (which: 'left' | 'right'): ((e: MouseEvent) => void) => + // eslint-disable-next-line solid/reactivity (e) => { e.preventDefault() const handleEl = e.currentTarget as HTMLElement diff --git a/packages/table-devtools/src/tableTarget.ts b/packages/table-devtools/src/tableTarget.ts index 0811d957a9..12e86b9646 100644 --- a/packages/table-devtools/src/tableTarget.ts +++ b/packages/table-devtools/src/tableTarget.ts @@ -1,3 +1,4 @@ +import { createEffect, createRoot, createSignal } from 'solid-js' import type { RowData, Table, TableFeatures } from '@tanstack/table-core' type AnyTable = Table @@ -18,18 +19,11 @@ export interface UpsertTableDevtoolsTargetOptions { name?: string } -const registrations = new Map() -const listeners = new Set() +const [registrationsMap, setRegistrationsMap] = createSignal< + Map +>(new Map()) let fallbackNameCounter = 1 -function emitTargets() { - const targets = getTableDevtoolsTargets() - - for (const listener of listeners) { - listener(targets) - } -} - function normalizeName(name?: string) { const trimmedName = name?.trim() return trimmedName ? trimmedName : undefined @@ -38,15 +32,13 @@ function normalizeName(name?: string) { export function upsertTableDevtoolsTarget( options: UpsertTableDevtoolsTargetOptions, ) { + const registrations = registrationsMap() const existingRegistration = registrations.get(options.id) const name = normalizeName(options.name) if (existingRegistration) { - registrations.set(options.id, { - ...existingRegistration, - table: options.table, - name, - }) + existingRegistration.table = options.table + existingRegistration.name = name } else { registrations.set(options.id, { id: options.id, @@ -56,27 +48,31 @@ export function upsertTableDevtoolsTarget( }) } - emitTargets() + setRegistrationsMap(new Map(registrations.entries())) } export function removeTableDevtoolsTarget(id: string) { + const registrations = registrationsMap() if (!registrations.delete(id)) { return } - emitTargets() + setRegistrationsMap(new Map(registrations.entries())) } export function getTableDevtoolsTargets(): Array { - return Array.from(registrations.values()) + return Array.from(registrationsMap().values()) } export function subscribeTableDevtoolsTargets(listener: Listener) { - listeners.add(listener) - - return () => { - listeners.delete(listener) - } + let disposeRoot = () => {} + createRoot((dispose) => { + disposeRoot = dispose + createEffect(() => { + listener(getTableDevtoolsTargets()) + }) + }) + return disposeRoot } export function setTableDevtoolsTarget(table: Table | undefined) { diff --git a/packages/table-devtools/src/useTableStore.ts b/packages/table-devtools/src/useTableStore.ts index 43c2fe748e..70fbfa2ec4 100644 --- a/packages/table-devtools/src/useTableStore.ts +++ b/packages/table-devtools/src/useTableStore.ts @@ -1,4 +1,6 @@ -import { createSignal, onCleanup } from 'solid-js' +import { createEffect, createSignal, onCleanup } from 'solid-js' +import type { Accessor } from 'solid-js' +import type { Readable } from '@tanstack/solid-store' /** * Subscribes to a table store and returns a reactive signal. @@ -6,28 +8,25 @@ import { createSignal, onCleanup } from 'solid-js' * { unsubscribe } object return (store 0.9.x). */ export function useTableStore( - store: - | { state: T; subscribe: (listener: () => void) => unknown } - | null - | undefined, + storeAccessor: Accessor | null | undefined>, selector: (state: T) => U = (s) => s as unknown as U, -): (() => U) | undefined { - if (!store) return undefined +): Accessor { + const initialValue = storeAccessor()?.get() + const [signal, setSignal] = createSignal( + initialValue ? selector(initialValue) : undefined, + ) - const [signal, setSignal] = createSignal(selector(store.state)) - const result = store.subscribe(() => { - setSignal(() => selector(store.state)) - }) + createEffect(() => { + const store = storeAccessor() + if (!store) return + + const subscription = store.subscribe(() => { + setSignal(() => selector(store.get())) + }) - onCleanup(() => { - if (typeof result === 'function') { - ;(result as () => void)() - } else if ( - result && - typeof (result as { unsubscribe?: () => void }).unsubscribe === 'function' - ) { - ;(result as { unsubscribe: () => void }).unsubscribe() - } + onCleanup(() => { + subscription.unsubscribe() + }) }) return signal diff --git a/packages/vue-table/skills/vue/compose-with-tanstack-store/SKILL.md b/packages/vue-table/skills/vue/compose-with-tanstack-store/SKILL.md index 44a82817cc..ddfa0696ba 100644 --- a/packages/vue-table/skills/vue/compose-with-tanstack-store/SKILL.md +++ b/packages/vue-table/skills/vue/compose-with-tanstack-store/SKILL.md @@ -117,8 +117,8 @@ useSelector(table.atoms.sorting) // reactive ref-like computed(() => table.atoms.sorting.get()) // alternative // (b) Flat store — full snapshot. -table.store.state // readonly -table.store.state.sorting // current value +table.state // readonly +table.state.sorting // current value // (c) useTable selector — typed reactive projection. const table = useTable(opts, (s) => ({ sorting: s.sorting })) @@ -285,7 +285,7 @@ const sorting = computed(() => sortingAtom.get()) ### Hallucinating pre-v9 API names (CRITICAL) -`useVueTable`, `table.getState()` — both v8. v9 uses `useTable` and `table.store.state` / +`useVueTable`, `table.getState()` — both v8. v9 uses `useTable` and `table.state` / `table.state` / `table.atoms..get()`. See `tanstack-table/vue/migrate-v8-to-v9`. ### "API missing" because feature not in `_features` (CRITICAL — v9-specific) diff --git a/packages/vue-table/skills/vue/migrate-v8-to-v9/SKILL.md b/packages/vue-table/skills/vue/migrate-v8-to-v9/SKILL.md index 1b96c40688..47b2c6d186 100644 --- a/packages/vue-table/skills/vue/migrate-v8-to-v9/SKILL.md +++ b/packages/vue-table/skills/vue/migrate-v8-to-v9/SKILL.md @@ -5,7 +5,7 @@ description: > → `useTable`, move `getCoreRowModel`/`getSortedRowModel`/etc. options into `_rowModels` factories, add the mandatory `_features` via `tableFeatures({...})`, update `createColumnHelper()` → `createColumnHelper()`, rename - `sortingFn`/`sortingFns` → `sortFn`/`sortFns`, swap `table.getState()` for `table.store.state` + `sortingFn`/`sortingFns` → `sortFn`/`sortFns`, swap `table.getState()` for `table.state` / `table.state` / `table.atoms..get()`, and prefer `` over the legacy `:render`/`:props` shape. Vue has NO `/legacy` entrypoint — migration is a direct rewrite. The Vue adapter installs `vueReactivity()` automatically. @@ -133,7 +133,7 @@ const table = useTable({ | `state.columnSizingInfo` | `state.columnResizing` | | `onColumnSizingInfoChange` | `onColumnResizingChange` | | `ColumnSizing` feature | `columnSizingFeature` + `columnResizingFeature` (split) | -| `table.getState()` | `table.store.state` (full) / `table.state` (selector) / `table.atoms..get()` | +| `table.getState()` | `table.state` (full) / `table.state` (selector) / `table.atoms..get()` | | `row._getAllCellsByColumnId()` | `row.getAllCellsByColumnId()` (underscore removed) | | `table._getFacetedRowModel()` / `_getFacetedMinMaxValues()` / `_getFacetedUniqueValues()` | Same names without leading underscore | | `` | `` / `:header` / `:footer` (preferred; legacy still works) | @@ -193,7 +193,7 @@ const sorting = table.getState().sorting // v9 — pick the narrowest read. const sorting = table.atoms.sorting.get() // narrowest, no full state object built -const snapshot = table.store.state // full readonly view +const snapshot = table.state // full readonly view const table = useTable(opts, (s) => ({ sorting: s.sorting })) // selected reactive state table.state.sorting // typed selector output ``` diff --git a/packages/vue-table/skills/vue/table-state/SKILL.md b/packages/vue-table/skills/vue/table-state/SKILL.md index 510c57d38c..bcfa69f9ef 100644 --- a/packages/vue-table/skills/vue/table-state/SKILL.md +++ b/packages/vue-table/skills/vue/table-state/SKILL.md @@ -127,7 +127,7 @@ The Vue adapter calls `vueReactivity()` and installs it as `coreReativityFeature const sorting = table.atoms.sorting.get() // (b) Flat readonly store — every registered slice as one object -const snapshot = table.store.state +const snapshot = table.state // (c) Vue selected state — the value returned from useTable's 2nd arg const table = useTable( diff --git a/packages/vue-table/src/reactivity.ts b/packages/vue-table/src/reactivity.ts index e04475636d..2f27ddaecf 100644 --- a/packages/vue-table/src/reactivity.ts +++ b/packages/vue-table/src/reactivity.ts @@ -1,4 +1,11 @@ -import { computed, shallowRef, watch } from 'vue' +import { + computed, + getCurrentScope, + onScopeDispose, + shallowRef, + watch, +} from 'vue' +import { batch, createAtom } from '@tanstack/vue-store' import type { TableAtomOptions, TableReactivityBindings, @@ -6,6 +13,8 @@ import type { import type { Atom, Observer, ReadonlyAtom } from '@tanstack/vue-store' import type { ComputedRef, ShallowRef } from 'vue' +const optionsStoreDebugName = 'table/optionsStore' + function observerToCallback( observerOrNext: Observer | ((value: T) => void), ): (value: T) => void { @@ -49,24 +58,47 @@ function refToWritableAtom(source: ShallowRef): Atom { /** * Creates the table-core reactivity bindings used by the Vue adapter. * - * Readonly table atoms are backed by Vue `computed` refs and writable atoms by - * `shallowRef`. Subscriptions use synchronous `watch` callbacks so table store - * updates are visible to Vue render and computed work immediately. + * Table state atoms are backed by TanStack Store atoms. The options store stays + * framework-native because row-model APIs read `table.options` directly during + * render. Readonly table atoms bridge Store dependency tracking into Vue computed + * refs. */ export function vueReactivity(): TableReactivityBindings { return { createOptionsStore: true, schedule: (fn) => queueMicrotask(() => fn()), createReadonlyAtom: (fn: () => T, _options?: TableAtomOptions) => { - return refToReadonlyAtom(computed(fn)) + const storeAtom = createAtom(() => fn(), { + compare: _options?.compare, + }) + const version = shallowRef(0) + const subscription = storeAtom.subscribe(() => { + version.value += 1 + }) + if (getCurrentScope()) { + onScopeDispose(() => subscription.unsubscribe()) + } + + return refToReadonlyAtom( + computed(() => { + version.value + return storeAtom.get() + }), + ) }, createWritableAtom: ( value: T, _options?: TableAtomOptions, ): Atom => { - return refToWritableAtom(shallowRef(value) as ShallowRef) + if (_options?.debugName === optionsStoreDebugName) { + return refToWritableAtom(shallowRef(value) as ShallowRef) + } + + return createAtom(value, { + compare: _options?.compare, + }) }, untrack: (fn) => fn(), - batch: (fn) => fn(), + batch, } } diff --git a/packages/vue-table/src/useTable.ts b/packages/vue-table/src/useTable.ts index dc25973de1..3c12f30c62 100644 --- a/packages/vue-table/src/useTable.ts +++ b/packages/vue-table/src/useTable.ts @@ -62,7 +62,15 @@ export type VueTable< TFeatures extends TableFeatures, TData extends RowData, TSelected = TableState, -> = Table & { +> = Omit, 'store'> & { + /** + * @deprecated Prefer `table.state` for render reads, + * `table.atoms..get()` for slice snapshots, or + * `table.Subscribe` / `useSelector(table.store, selector)` for explicit + * subscriptions. `table.store.state` is a current-value snapshot and is easy + * to misuse in render code. + */ + readonly store: Table['store'] /** * Store mode: `selector` required. Source mode: pass `source` (atom or store); omit * `selector` for the whole value (identity), or pass `selector` to project. Split @@ -94,7 +102,9 @@ export type VueTable< }): VNode | Array } /** - * The selected state of the table. This state may not match the structure of `table.store.state` because it is selected by the `selector` function that you pass as the 2nd argument to `useTable`. + * The selected state of the table. This state may not match the structure of + * the full table state because it is selected by the selector function that + * you pass as the 2nd argument to `useTable`. * * @example * const table = useTable(options, (state) => ({ globalFilter: state.globalFilter })) // only globalFilter is part of the selected state @@ -147,18 +157,15 @@ export function useTable< ) } - const mergedOptions = { - ...tableOptions, + const mergedOptions = mergeProxy(tableOptions, { _features: { coreReativityFeature: vueReactivity(), ...tableOptions._features, }, - } + }) as TableOptionsWithReactiveData const resolvedOptions = mergeProxy( - getOptionsWithReactiveValues( - mergedOptions as TableOptionsWithReactiveData, - ), + getOptionsWithReactiveValues(mergedOptions), { // Remove state and onStateChange - store handles it internally mergeOptions: ( @@ -170,19 +177,13 @@ export function useTable< }, ) as TableOptions - const table = constructTable(resolvedOptions) as VueTable< - TFeatures, - TData, - TSelected - > + const coreTable = constructTable(resolvedOptions) + const table = coreTable as unknown as VueTable watch( - () => - getReactiveOptionDeps( - mergedOptions as TableOptionsWithReactiveData, - ), + () => getReactiveOptionDeps(mergedOptions), () => { - syncTableOptions(table, mergedOptions) + syncTableOptions(coreTable, mergedOptions) }, { immediate: true }, ) @@ -216,7 +217,7 @@ export function useTable< }, (controlledValues) => { if (controlledValues.length > 0) { - syncTableOptions(table, mergedOptions) + syncTableOptions(coreTable, mergedOptions) } }, { immediate: true }, diff --git a/packages/vue-table/tests/unit/signals.test.ts b/packages/vue-table/tests/unit/signals.test.ts index 49698eb2ae..31f58d8402 100644 --- a/packages/vue-table/tests/unit/signals.test.ts +++ b/packages/vue-table/tests/unit/signals.test.ts @@ -1,5 +1,6 @@ import { describe, expect, test } from 'vitest' import { nextTick } from 'vue' +import { createAtom } from '@tanstack/vue-store' import { vueReactivity } from '../../src/reactivity' describe('vueReactivity', () => { @@ -19,4 +20,19 @@ describe('vueReactivity', () => { expect(count.get()).toBe(2) expect(doubled.get()).toBe(4) }) + + test('readonly atoms update when they read external TanStack Store atoms', async () => { + const reactivity = vueReactivity() + const external = createAtom(1) + const doubled = reactivity.createReadonlyAtom(() => external.get() * 2, { + debugName: 'doubled', + }) + + expect(doubled.get()).toBe(2) + + external.set(2) + await nextTick() + + expect(doubled.get()).toBe(4) + }) }) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2c0f80805b..4c9e9e7dcb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -110,16 +110,22 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -129,7 +135,99 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(cecadd392a942552ae77620125a392a2) + version: 21.2.11(f1b49c3396fc48362dec3cc25ee66e93) + '@angular/cli': + specifier: ^21.2.11 + version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) + '@angular/compiler-cli': + specifier: ^21.2.13 + version: 21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3) + typescript: + specifier: 6.0.3 + version: 6.0.3 + + examples/angular/basic-external-atoms: + dependencies: + '@angular/common': + specifier: ^21.2.13 + version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/compiler': + specifier: ^21.2.13 + version: 21.2.13 + '@angular/core': + specifier: ^21.2.13 + version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) + '@angular/forms': + specifier: ^21.2.13 + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/platform-browser': + specifier: ^21.2.13 + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@faker-js/faker': + specifier: ^10.4.0 + version: 10.4.0 + '@tanstack/angular-store': + specifier: ^0.11.0 + version: 0.11.0(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@tanstack/angular-table': + specifier: workspace:* + version: link:../../../packages/angular-table + rxjs: + specifier: ~7.8.2 + version: 7.8.2 + tslib: + specifier: ^2.8.1 + version: 2.8.1 + devDependencies: + '@angular/build': + specifier: ^21.2.11 + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) + '@angular/cli': + specifier: ^21.2.11 + version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) + '@angular/compiler-cli': + specifier: ^21.2.13 + version: 21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3) + typescript: + specifier: 6.0.3 + version: 6.0.3 + + examples/angular/basic-external-state: + dependencies: + '@angular/common': + specifier: ^21.2.13 + version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) + '@angular/compiler': + specifier: ^21.2.13 + version: 21.2.13 + '@angular/core': + specifier: ^21.2.13 + version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) + '@angular/forms': + specifier: ^21.2.13 + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/platform-browser': + specifier: ^21.2.13 + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@faker-js/faker': + specifier: ^10.4.0 + version: 10.4.0 + '@tanstack/angular-store': + specifier: ^0.11.0 + version: 0.11.0(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@tanstack/angular-table': + specifier: workspace:* + version: link:../../../packages/angular-table + rxjs: + specifier: ~7.8.2 + version: 7.8.2 + tslib: + specifier: ^2.8.1 + version: 2.8.1 + devDependencies: + '@angular/build': + specifier: ^21.2.11 + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -153,19 +251,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -175,7 +279,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -199,19 +303,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -221,7 +331,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -245,19 +355,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -267,7 +383,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -291,19 +407,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -313,7 +435,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -337,19 +459,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -359,7 +487,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -383,19 +511,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -405,7 +539,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -429,19 +563,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -451,7 +591,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -475,16 +615,22 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -494,7 +640,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -518,19 +664,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -540,7 +692,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -564,19 +716,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -586,7 +744,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -610,22 +768,28 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-pacer': - specifier: ^0.23.1 - version: 0.23.1(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + specifier: ^0.23.0 + version: 0.23.0(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -635,7 +799,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -659,19 +823,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -681,7 +851,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -705,13 +875,13 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 @@ -730,7 +900,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -754,25 +924,31 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/platform-browser-dynamic': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))) + version: 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))) '@angular/platform-server': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/ssr': specifier: ^21.2.11 - version: 21.2.11(aaf98f824a420c61f375c423727f535f) + version: 21.2.11(d5e6282e718d55cda9fee26f6d40013e) + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools express: specifier: ^5.2.1 version: 5.2.1 @@ -782,7 +958,7 @@ importers: devDependencies: '@angular-devkit/build-angular': specifier: ^21.2.11 - version: 21.2.11(aff9692e0c8c598827aceb4d4649fd76) + version: 21.2.11(7edd5992cb4b0d410bccfca7120e4dc7) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -806,7 +982,7 @@ importers: dependencies: '@angular/cdk': specifier: ^21.2.12 - version: 21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/common': specifier: ^21.2.13 version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) @@ -818,19 +994,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -840,7 +1022,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -855,7 +1037,7 @@ importers: dependencies: '@angular/cdk': specifier: ^21.2.12 - version: 21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/common': specifier: ^21.2.13 version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) @@ -867,19 +1049,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -889,7 +1077,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -904,7 +1092,7 @@ importers: dependencies: '@angular/animations': specifier: ^21.2.13 - version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/common': specifier: ^21.2.13 version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) @@ -916,19 +1104,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/platform-browser-dynamic': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))) + version: 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -938,7 +1132,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -953,7 +1147,7 @@ importers: dependencies: '@angular/cdk': specifier: ^21.2.12 - version: 21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/common': specifier: ^21.2.13 version: 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) @@ -965,19 +1159,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -987,7 +1187,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -1011,19 +1211,25 @@ importers: version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/forms': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@angular/router': specifier: ^21.2.13 - version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + version: 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@faker-js/faker': specifier: ^10.4.0 version: 10.4.0 + '@tanstack/angular-devtools': + specifier: ^0.0.4 + version: 0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13) '@tanstack/angular-table': specifier: workspace:* version: link:../../../packages/angular-table + '@tanstack/angular-table-devtools': + specifier: ^9.0.0-alpha.43 + version: link:../../../packages/angular-table-devtools rxjs: specifier: ~7.8.2 version: 7.8.2 @@ -1033,7 +1239,7 @@ importers: devDependencies: '@angular/build': specifier: ^21.2.11 - version: 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + version: 21.2.11(80151f06bb48b510832a92a42ff06e0e) '@angular/cli': specifier: ^21.2.11 version: 21.2.11(@types/node@25.9.1)(chokidar@5.0.0) @@ -3070,6 +3276,12 @@ importers: '@rollup/plugin-replace': specifier: ^6.0.3 version: 6.0.3(rollup@4.60.4) + '@tanstack/react-devtools': + specifier: ^0.10.5 + version: 0.10.5(@types/react-dom@19.2.3(@types/react@19.2.15))(@types/react@19.2.15)(react-dom@19.2.6(react@19.2.6))(react@19.2.6)(solid-js@1.9.13) + '@tanstack/react-table-devtools': + specifier: workspace:* + version: link:../../../packages/react-table-devtools '@types/react': specifier: ^19.2.15 version: 19.2.15 @@ -7771,16 +7983,16 @@ importers: devDependencies: '@analogjs/vite-plugin-angular': specifier: ^2.5.1 - version: 2.5.1(@angular-devkit/build-angular@21.2.11(04a67e479a2bb1bca690f1ad5001487a))(@angular/build@21.2.11(781551a2b6e76a8d45f5b309e4a44022))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + version: 2.5.1(@angular-devkit/build-angular@21.2.11(6632dea4189d57381d3e840b50b7e46f))(@angular/build@21.2.11(f7a44c5fa4b8fa5685489f8820c015ae))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) '@analogjs/vitest-angular': specifier: ^2.5.1 - version: 2.5.1(@analogjs/vite-plugin-angular@2.5.1(@angular-devkit/build-angular@21.2.11(04a67e479a2bb1bca690f1ad5001487a))(@angular/build@21.2.11(781551a2b6e76a8d45f5b309e4a44022))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.11(chokidar@5.0.0))(@angular-devkit/schematics@21.2.11(chokidar@5.0.0))(vitest@4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0))) + version: 2.5.1(@analogjs/vite-plugin-angular@2.5.1(@angular-devkit/build-angular@21.2.11(6632dea4189d57381d3e840b50b7e46f))(@angular/build@21.2.11(f7a44c5fa4b8fa5685489f8820c015ae))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.11(chokidar@5.0.0))(@angular-devkit/schematics@21.2.11(chokidar@5.0.0))(vitest@4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0))) '@angular/core': specifier: ^21.2.13 version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@angular/platform-browser': specifier: ^21.2.13 - version: 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + version: 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) ng-packagr: specifier: ^21.2.3 version: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) @@ -7788,6 +8000,21 @@ importers: specifier: 6.0.3 version: 6.0.3 + packages/angular-table-devtools: + dependencies: + '@angular/core': + specifier: '>=21.0.0' + version: 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) + '@tanstack/devtools-utils': + specifier: ^0.5.0 + version: 0.5.0(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@types/react@19.2.15)(preact@10.29.2)(react@19.2.6)(solid-js@1.9.13)(vue@3.5.34(typescript@6.0.3)) + '@tanstack/table-core': + specifier: workspace:* + version: link:../table-core + '@tanstack/table-devtools': + specifier: workspace:* + version: link:../table-devtools + packages/lit-table: dependencies: '@tanstack/store': @@ -8003,6 +8230,9 @@ importers: '@tanstack/table-core': specifier: workspace:* version: link:../table-core + eslint-plugin-solid: + specifier: ^0.14.5 + version: 0.14.5(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) vite-plugin-solid: specifier: ^2.11.12 version: 2.11.12(@testing-library/jest-dom@6.9.1)(solid-js@1.9.13)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) @@ -8229,11 +8459,11 @@ packages: resolution: {integrity: sha512-69CWZ5/ftLdpUPAwwdAxTNosiGXUyvwdnOfmHsd9NvCT0OSTeq0eQ0UfnGcHASrXIVmnyWiNfBWM1DLqsgBXmw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} - '@angular/animations@21.2.13': - resolution: {integrity: sha512-bOztfduqo6PPgWTJcmZ402mPZEXCaeODZcNUqkSz76LibS7uyiT2kuvk2duw7EOFi3LIptxCLQe0ofnB+njiOw==} + '@angular/animations@21.2.14': + resolution: {integrity: sha512-9WLnsJE0xqtd1rVtHMvsAUxFy3OdPks4bdmUIqyw23X/je7ytUALAGWNadffcZBwRpa1A6TUnLr9X4+Draz3kw==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/core': 21.2.13 + '@angular/core': 21.2.14 '@angular/build@21.2.11': resolution: {integrity: sha512-2afR6VKkP0HH2u6OuijSMgSHsL5tU4CBCixgQtY677mlvS8TOZg/kOksJIUlz0EvDVCJZBK8WLH9cPJ6mC/Qdg==} @@ -8338,14 +8568,14 @@ packages: '@angular/platform-browser': 21.2.13 rxjs: ^6.5.3 || ^7.4.0 - '@angular/platform-browser-dynamic@21.2.13': - resolution: {integrity: sha512-VltLjoKi7lOIGtwkBy9jauV+JLU9PAaLU7/iIVxZBgucvV85xj7CA+//KOBzneQ5V+XtnpgVrdE9bHMFIhiH5Q==} + '@angular/platform-browser-dynamic@21.2.14': + resolution: {integrity: sha512-m5U4zX8JFnxTAIGpsBXIAyefSmYqdORY/OfHC0aMmZovuFCbXXIYqYRQDBB7+YVNpSDSHllCrKEZFu/CC6dq3g==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.13 - '@angular/compiler': 21.2.13 - '@angular/core': 21.2.13 - '@angular/platform-browser': 21.2.13 + '@angular/common': 21.2.14 + '@angular/compiler': 21.2.14 + '@angular/core': 21.2.14 + '@angular/platform-browser': 21.2.14 '@angular/platform-browser@21.2.13': resolution: {integrity: sha512-96rcwLHsklqAYRuS2SEBOUdQS5PLkuUIEEIjpYu4rxU2PVvOMapJEImM/QBxrbwjnCgRbj/CivkgfjiR0R0wSA==} @@ -8358,14 +8588,14 @@ packages: '@angular/animations': optional: true - '@angular/platform-server@21.2.13': - resolution: {integrity: sha512-DVY3URcQFfax5AQZE0DRNjLqH1m3JRBFvN3Kl3JI7YAL6zvPnUfX2L+vZIBc5Z6a1jKtKTc37MGVTtxCz96f1w==} + '@angular/platform-server@21.2.14': + resolution: {integrity: sha512-NRaaZ0gvXA9C60Y610MaFp921gB81Uffqk0gJxaPTYQ887/b1of21UZvFOZo0unMaislSrx+KQ3yhRB74DqcKg==} engines: {node: ^20.19.0 || ^22.12.0 || >=24.0.0} peerDependencies: - '@angular/common': 21.2.13 - '@angular/compiler': 21.2.13 - '@angular/core': 21.2.13 - '@angular/platform-browser': 21.2.13 + '@angular/common': 21.2.14 + '@angular/compiler': 21.2.14 + '@angular/core': 21.2.14 + '@angular/platform-browser': 21.2.14 rxjs: ^6.5.3 || ^7.4.0 '@angular/router@21.2.13': @@ -12702,8 +12932,14 @@ packages: peerDependencies: vite: ^5.2.0 || ^6 || ^7 || ^8 - '@tanstack/angular-pacer@0.23.1': - resolution: {integrity: sha512-l6GlzHJzeeS1dHlFhYE+Gib9BomzUouq5wkJK5GuiVZKJ3gI1IxUv7GeWIB9yEj+Hx1EI4eCYD6QkI3kXonqsw==} + '@tanstack/angular-devtools@0.0.4': + resolution: {integrity: sha512-kaC+1oEAU6tSaoLETssS9HLuXI8XHtbRYYvIWKVQQrUsp2YWCdFVcq9ghzDJ82yp4U7kbCkGDCVJS4K+Ut4Jzg==} + engines: {node: '>=18'} + peerDependencies: + '@angular/core': '>=21.0.0' + + '@tanstack/angular-pacer@0.23.0': + resolution: {integrity: sha512-ejhXrN4xmdS01ubTotq5AuAcEsZVXjX2HgW8QaeE2f7mMhLqfGeY1tCBtUkdfgdboHAv+oG/SQtj7SmfIJIw/Q==} engines: {node: '>=18'} peerDependencies: '@angular/core': '>=17.0.0' @@ -12791,6 +13027,10 @@ packages: resolution: {integrity: sha512-y/xtNPNt/YeyoVxE/JCx+T7yjEzpezmbb+toK8DDD1P4m7Kzs5YR956+7OKexG3f8aXgC3rLZl7b1V+yNUSy5w==} engines: {node: '>=18'} + '@tanstack/pacer@0.21.0': + resolution: {integrity: sha512-EZyU3fQvdz7faj0vBVrPd5ejkSS9pbGKtrGZI56dLJgotca6iZKhaNDRv7dweG4dnWx0LovE9YYf1MAErGpbLQ==} + engines: {node: '>=18'} + '@tanstack/pacer@0.21.1': resolution: {integrity: sha512-hB01dd4rlsYcTCNP7wK186jgAe6K5qimgM1Y5Jtvz+9PUaILvpmeLLjmQNUNSO1l23lIt+CeQR6mO1mjlPvRtQ==} engines: {node: '>=18'} @@ -14551,6 +14791,13 @@ packages: eslint: ^10.3.0 typescript: '*' + eslint-plugin-solid@0.14.5: + resolution: {integrity: sha512-nfuYK09ah5aJG/oEN6P1qziy1zLgW4PDWe75VNPi4CEFYk1x2AEqwFeQfEPR7gNn0F2jOeqKhx2E+5oNCOBYWQ==} + engines: {node: '>=18.0.0'} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 || ^9.0.0 + typescript: '>=4.8.4' + eslint-plugin-svelte@3.17.1: resolution: {integrity: sha512-NyiXHtS3Ni7e532RBwS9OXlMKDIrENg3gY+/+ODjZzQx2xhU3NlJ+nIl1a93iUUQeiJL3lS8KLmY+W8hklzweQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -14969,6 +15216,10 @@ packages: html-link-extractor@1.0.5: resolution: {integrity: sha512-ADd49pudM157uWHwHQPUSX4ssMsvR/yHIswOR5CUfBdK9g9ZYGMhVSE6KZVHJ6kCkR0gH4htsfzU6zECDNVwyw==} + html-tags@3.3.1: + resolution: {integrity: sha512-ztqyC3kLto0e9WbNp0aeP+M3kTt+nbaIveGmUxAtZa+8iFgKLUOD4YKM5j+f3QD89bra7UeumolZHKuOXnTmeQ==} + engines: {node: '>=8'} + htmlparser2@10.1.0: resolution: {integrity: sha512-VTZkM9GWRAtEpveh7MSF6SjjrpNVNNVJfFup7xTY3UpFtm67foy9HDVXneLtFVt4pMz5kZtgNcvCniNFb1hlEQ==} @@ -15085,6 +15336,9 @@ packages: injection-js@2.6.1: resolution: {integrity: sha512-dbR5bdhi7TWDoCye9cByZqeg/gAfamm8Vu3G1KZOTYkOif8WkuM8CD0oeDPtZYMzT5YH76JAFB7bkmyY9OJi2A==} + inline-style-parser@0.2.7: + resolution: {integrity: sha512-Nb2ctOyNR8DqQoR0OwRG95uNWIC0C1lCgf5Naz5H6Ji72KZ8OcFZLz2P5sNgwlyoJ8Yif11oMuYs5pBQa86csA==} + input-otp@1.4.2: resolution: {integrity: sha512-l3jWwYNvrEa6NTCt7BECfCm48GvwuZzkoeG3gBL2w4CHeOXW3eKFmf9UNYkNfYc3mxMrthMnxjIE07MT0zLBQA==} peerDependencies: @@ -15143,6 +15397,10 @@ packages: resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} engines: {node: '>=0.10.0'} + is-html@2.0.0: + resolution: {integrity: sha512-S+OpgB5i7wzIue/YSE5hg0e5ZYfG3hhpNh9KGl6ayJ38p7ED6wxQLd1TV91xHpcTvw90KMJ9EwN3F/iNflHBVg==} + engines: {node: '>=8'} + is-in-ssh@1.0.0: resolution: {integrity: sha512-jYa6Q9rH90kR1vKB6NM7qqd1mge3Fx4Dhw5TVlK1MUBqhEOuCagrEHMevNuCcbECmXZ0ThXkRm+Ymr51HwEPAw==} engines: {node: '>=20'} @@ -15317,6 +15575,9 @@ packages: karma-source-map-support@1.4.0: resolution: {integrity: sha512-RsBECncGO17KAoJCYXjv+ckIz+Ii9NCi+9enk+rq6XC81ezYkb4/RHE6CTXdA7IOJqoF3wcaLfVG0CPmE5ca6A==} + kebab-case@1.0.2: + resolution: {integrity: sha512-7n6wXq4gNgBELfDCpzKc+mRrZFs7D+wgfF5WRFLNAr4DA/qtr9Js8uOAVAfHhuLMfAcQ0pRKqbpjx+TcJVdE1Q==} + keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} @@ -15333,6 +15594,9 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true + known-css-properties@0.30.0: + resolution: {integrity: sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==} + known-css-properties@0.37.0: resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} @@ -16909,6 +17173,9 @@ packages: resolution: {integrity: sha512-1tB5mhVo7U+ETBKNf92xT4hrQa3pm0MZ0PQvuDnWgAAGHDsfp4lPSpiS6psrSiet87wyGPh9ft6wmhOMQ0hDiw==} engines: {node: '>=14.16'} + style-to-object@1.0.14: + resolution: {integrity: sha512-LIN7rULI0jBscWQYaSswptyderlarFkjQ+t79nzty8tcIAceVomEVlLzH5VP4Cmsv6MtKhs7qaAiwlcp+Mgaxw==} + stylis@4.2.0: resolution: {integrity: sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==} @@ -17908,7 +18175,7 @@ snapshots: '@jridgewell/gen-mapping': 0.3.13 '@jridgewell/trace-mapping': 0.3.31 - '@analogjs/vite-plugin-angular@2.5.1(@angular-devkit/build-angular@21.2.11(04a67e479a2bb1bca690f1ad5001487a))(@angular/build@21.2.11(781551a2b6e76a8d45f5b309e4a44022))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0))': + '@analogjs/vite-plugin-angular@2.5.1(@angular-devkit/build-angular@21.2.11(6632dea4189d57381d3e840b50b7e46f))(@angular/build@21.2.11(f7a44c5fa4b8fa5685489f8820c015ae))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0))': dependencies: magic-string: 0.30.21 obug: 2.1.1 @@ -17916,16 +18183,16 @@ snapshots: tinyglobby: 0.2.16 ts-morph: 21.0.1 optionalDependencies: - '@angular-devkit/build-angular': 21.2.11(04a67e479a2bb1bca690f1ad5001487a) - '@angular/build': 21.2.11(781551a2b6e76a8d45f5b309e4a44022) + '@angular-devkit/build-angular': 21.2.11(6632dea4189d57381d3e840b50b7e46f) + '@angular/build': 21.2.11(f7a44c5fa4b8fa5685489f8820c015ae) vite: 8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' - '@analogjs/vitest-angular@2.5.1(@analogjs/vite-plugin-angular@2.5.1(@angular-devkit/build-angular@21.2.11(04a67e479a2bb1bca690f1ad5001487a))(@angular/build@21.2.11(781551a2b6e76a8d45f5b309e4a44022))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.11(chokidar@5.0.0))(@angular-devkit/schematics@21.2.11(chokidar@5.0.0))(vitest@4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)))': + '@analogjs/vitest-angular@2.5.1(@analogjs/vite-plugin-angular@2.5.1(@angular-devkit/build-angular@21.2.11(6632dea4189d57381d3e840b50b7e46f))(@angular/build@21.2.11(f7a44c5fa4b8fa5685489f8820c015ae))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)))(@angular-devkit/architect@0.2102.11(chokidar@5.0.0))(@angular-devkit/schematics@21.2.11(chokidar@5.0.0))(vitest@4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)))': dependencies: - '@analogjs/vite-plugin-angular': 2.5.1(@angular-devkit/build-angular@21.2.11(04a67e479a2bb1bca690f1ad5001487a))(@angular/build@21.2.11(781551a2b6e76a8d45f5b309e4a44022))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + '@analogjs/vite-plugin-angular': 2.5.1(@angular-devkit/build-angular@21.2.11(6632dea4189d57381d3e840b50b7e46f))(@angular/build@21.2.11(f7a44c5fa4b8fa5685489f8820c015ae))(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) '@angular-devkit/schematics': 21.2.11(chokidar@5.0.0) vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) @@ -17937,13 +18204,13 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular-devkit/build-angular@21.2.11(04a67e479a2bb1bca690f1ad5001487a)': + '@angular-devkit/build-angular@21.2.11(6632dea4189d57381d3e840b50b7e46f)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.11(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)))(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) '@angular-devkit/core': 21.2.11(chokidar@5.0.0) - '@angular/build': 21.2.11(3d915822a5de3b4d32e3051d98e1e0a0) + '@angular/build': 21.2.11(9f4d19c81376893989e52892510c1f8c) '@angular/compiler-cli': 21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3) '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -17997,9 +18264,9 @@ snapshots: webpack-subresource-integrity: 5.1.0(webpack@5.105.2(esbuild@0.27.3)(lightningcss@1.32.0)(postcss@8.5.12)) optionalDependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/ssr': 21.2.11(aaf98f824a420c61f375c423727f535f) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) esbuild: 0.27.3 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) tailwindcss: 4.3.0 @@ -18036,13 +18303,13 @@ snapshots: - yaml optional: true - '@angular-devkit/build-angular@21.2.11(aff9692e0c8c598827aceb4d4649fd76)': + '@angular-devkit/build-angular@21.2.11(7edd5992cb4b0d410bccfca7120e4dc7)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) '@angular-devkit/build-webpack': 0.2102.11(chokidar@5.0.0)(webpack-dev-server@5.2.3(tslib@2.8.1)(webpack@5.105.2(esbuild@0.27.3)(postcss@8.5.12)))(webpack@5.105.2(esbuild@0.27.3)(postcss@8.5.12)) '@angular-devkit/core': 21.2.11(chokidar@5.0.0) - '@angular/build': 21.2.11(9eac46373a0e91cfc766e180f2169949) + '@angular/build': 21.2.11(94994a3b1ee448220f2098b556cf1027) '@angular/compiler-cli': 21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3) '@babel/core': 7.29.0 '@babel/generator': 7.29.1 @@ -18096,9 +18363,9 @@ snapshots: webpack-subresource-integrity: 5.1.0(webpack@5.105.2(esbuild@0.27.3)(postcss@8.5.12)) optionalDependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/ssr': 21.2.11(aaf98f824a420c61f375c423727f535f) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) esbuild: 0.27.3 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) tailwindcss: 4.3.0 @@ -18174,12 +18441,12 @@ snapshots: transitivePeerDependencies: - chokidar - '@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))': + '@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))': dependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) tslib: 2.8.1 - '@angular/build@21.2.11(3d915822a5de3b4d32e3051d98e1e0a0)': + '@angular/build@21.2.11(80151f06bb48b510832a92a42ff06e0e)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) @@ -18189,7 +18456,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@25.9.1) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -18210,17 +18477,17 @@ snapshots: tslib: 2.8.1 typescript: 6.0.3 undici: 7.24.4 - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/ssr': 21.2.11(aaf98f824a420c61f375c423727f535f) - less: 4.4.2 + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) + less: 4.6.4 lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) - postcss: 8.5.12 + postcss: 8.5.15 tailwindcss: 4.3.0 vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) transitivePeerDependencies: @@ -18237,9 +18504,8 @@ snapshots: - terser - tsx - yaml - optional: true - '@angular/build@21.2.11(781551a2b6e76a8d45f5b309e4a44022)': + '@angular/build@21.2.11(94994a3b1ee448220f2098b556cf1027)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) @@ -18249,7 +18515,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@25.9.1) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -18270,19 +18536,19 @@ snapshots: tslib: 2.8.1 typescript: 6.0.3 undici: 7.24.4 - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/ssr': 21.2.11(aaf98f824a420c61f375c423727f535f) - less: 4.6.4 + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) + less: 4.4.2 lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) - postcss: 8.5.15 + postcss: 8.5.12 tailwindcss: 4.3.0 - vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.4.2)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.0)) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -18298,7 +18564,7 @@ snapshots: - tsx - yaml - '@angular/build@21.2.11(9eac46373a0e91cfc766e180f2169949)': + '@angular/build@21.2.11(9f4d19c81376893989e52892510c1f8c)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) @@ -18308,7 +18574,7 @@ snapshots: '@babel/helper-annotate-as-pure': 7.27.3 '@babel/helper-split-export-declaration': 7.24.7 '@inquirer/confirm': 5.1.21(@types/node@25.9.1) - '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.0)) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) beasties: 0.4.1 browserslist: 4.28.2 esbuild: 0.27.3 @@ -18329,19 +18595,19 @@ snapshots: tslib: 2.8.1 typescript: 6.0.3 undici: 7.24.4 - vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.0) + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.4.2)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/ssr': 21.2.11(aaf98f824a420c61f375c423727f535f) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) less: 4.4.2 lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) postcss: 8.5.12 tailwindcss: 4.3.0 - vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.4.2)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.12))(terser@5.46.0)(yaml@2.9.0)) + vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) transitivePeerDependencies: - '@emnapi/core' - '@emnapi/runtime' @@ -18356,8 +18622,9 @@ snapshots: - terser - tsx - yaml + optional: true - '@angular/build@21.2.11(cecadd392a942552ae77620125a392a2)': + '@angular/build@21.2.11(f1b49c3396fc48362dec3cc25ee66e93)': dependencies: '@ampproject/remapping': 2.3.0 '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) @@ -18392,9 +18659,9 @@ snapshots: watchpack: 2.5.1 optionalDependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) - '@angular/ssr': 21.2.11(aaf98f824a420c61f375c423727f535f) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) less: 4.6.4 lmdb: 3.5.1 ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) @@ -18416,11 +18683,71 @@ snapshots: - tsx - yaml - '@angular/cdk@21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/build@21.2.11(f7a44c5fa4b8fa5685489f8820c015ae)': + dependencies: + '@ampproject/remapping': 2.3.0 + '@angular-devkit/architect': 0.2102.11(chokidar@5.0.0) + '@angular/compiler': 21.2.13 + '@angular/compiler-cli': 21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3) + '@babel/core': 7.29.0 + '@babel/helper-annotate-as-pure': 7.27.3 + '@babel/helper-split-export-declaration': 7.24.7 + '@inquirer/confirm': 5.1.21(@types/node@25.9.1) + '@vitejs/plugin-basic-ssl': 2.1.4(vite@7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + beasties: 0.4.1 + browserslist: 4.28.2 + esbuild: 0.27.3 + https-proxy-agent: 7.0.6 + istanbul-lib-instrument: 6.0.3 + jsonc-parser: 3.3.1 + listr2: 9.0.5 + magic-string: 0.30.21 + mrmime: 2.0.1 + parse5-html-rewriting-stream: 8.0.0 + picomatch: 4.0.4 + piscina: 5.1.4 + rolldown: 1.0.0-rc.4(@emnapi/core@1.10.0)(@emnapi/runtime@1.10.0) + sass: 1.97.3 + semver: 7.7.4 + source-map-support: 0.5.21 + tinyglobby: 0.2.15 + tslib: 2.8.1 + typescript: 6.0.3 + undici: 7.24.4 + vite: 7.3.2(@types/node@25.9.1)(jiti@2.7.0)(less@4.6.4)(lightningcss@1.32.0)(sass@1.97.3)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) + watchpack: 2.5.1 + optionalDependencies: + '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/ssr': 21.2.11(d5e6282e718d55cda9fee26f6d40013e) + less: 4.6.4 + lmdb: 3.5.1 + ng-packagr: 21.2.3(@angular/compiler-cli@21.2.13(@angular/compiler@21.2.13)(typescript@6.0.3))(tailwindcss@4.3.0)(tslib@2.8.1)(typescript@6.0.3) + postcss: 8.5.15 + tailwindcss: 4.3.0 + vitest: 4.1.7(@types/node@25.9.1)(jsdom@29.1.1)(vite@8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0)) + transitivePeerDependencies: + - '@emnapi/core' + - '@emnapi/runtime' + - '@types/node' + - chokidar + - jiti + - lightningcss + - sass-embedded + - stylus + - sugarss + - supports-color + - terser + - tsx + - yaml + optional: true + + '@angular/cdk@21.2.12(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) parse5: 8.0.1 rxjs: 7.8.2 tslib: 2.8.1 @@ -18484,57 +18811,57 @@ snapshots: optionalDependencies: '@angular/compiler': 21.2.13 - '@angular/forms@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/forms@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) '@standard-schema/spec': 1.1.0 rxjs: 7.8.2 tslib: 2.8.1 - '@angular/platform-browser-dynamic@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))': + '@angular/platform-browser-dynamic@21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/compiler': 21.2.13 '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) tslib: 2.8.1 - '@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))': + '@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) tslib: 2.8.1 optionalDependencies: - '@angular/animations': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/animations': 21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@angular/platform-server@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/platform-server@21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/compiler': 21.2.13 '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) rxjs: 7.8.2 tslib: 2.8.1 xhr2: 0.2.1 - '@angular/router@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': + '@angular/router@21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2)': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/platform-browser': 21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) + '@angular/platform-browser': 21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) rxjs: 7.8.2 tslib: 2.8.1 - '@angular/ssr@21.2.11(aaf98f824a420c61f375c423727f535f)': + '@angular/ssr@21.2.11(d5e6282e718d55cda9fee26f6d40013e)': dependencies: '@angular/common': 21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2) '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) - '@angular/router': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/router': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) tslib: 2.8.1 optionalDependencies: - '@angular/platform-server': 21.2.13(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) + '@angular/platform-server': 21.2.14(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/compiler@21.2.13)(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(@angular/platform-browser@21.2.13(@angular/animations@21.2.14(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)))(rxjs@7.8.2) '@asamuzakjp/css-color@5.1.11': dependencies: @@ -22586,11 +22913,22 @@ snapshots: tailwindcss: 4.3.0 vite: 8.0.13(@types/node@25.9.1)(esbuild@0.28.0)(jiti@2.7.0)(less@4.6.4)(sass@1.99.0)(sugarss@5.0.1(postcss@8.5.15))(terser@5.46.0)(yaml@2.9.0) - '@tanstack/angular-pacer@0.23.1(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))': + '@tanstack/angular-devtools@0.0.4(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(solid-js@1.9.13)': + dependencies: + '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) + '@tanstack/devtools': 0.12.2(csstype@3.2.3)(solid-js@1.9.13) + tslib: 2.8.1 + transitivePeerDependencies: + - bufferutil + - csstype + - solid-js + - utf-8-validate + + '@tanstack/angular-pacer@0.23.0(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))': dependencies: '@angular/core': 21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2) '@tanstack/angular-store': 0.11.0(@angular/common@21.2.13(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2))(rxjs@7.8.2))(@angular/core@21.2.13(@angular/compiler@21.2.13)(rxjs@7.8.2)) - '@tanstack/pacer': 0.21.1 + '@tanstack/pacer': 0.21.0 transitivePeerDependencies: - '@angular/common' @@ -22685,6 +23023,11 @@ snapshots: '@tanstack/pacer-lite@0.1.1': {} + '@tanstack/pacer@0.21.0': + dependencies: + '@tanstack/devtools-event-client': 0.4.3 + '@tanstack/store': 0.11.0 + '@tanstack/pacer@0.21.1': dependencies: '@tanstack/devtools-event-client': 0.4.3 @@ -23063,7 +23406,7 @@ snapshots: '@types/connect-history-api-fallback@1.5.4': dependencies: - '@types/express-serve-static-core': 4.19.8 + '@types/express-serve-static-core': 5.1.1 '@types/node': 25.9.1 '@types/connect@3.4.38': @@ -24810,6 +25153,19 @@ snapshots: transitivePeerDependencies: - supports-color + eslint-plugin-solid@0.14.5(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3): + dependencies: + '@typescript-eslint/utils': 8.59.4(eslint@10.4.0(jiti@2.7.0))(typescript@6.0.3) + eslint: 10.4.0(jiti@2.7.0) + estraverse: 5.3.0 + is-html: 2.0.0 + kebab-case: 1.0.2 + known-css-properties: 0.30.0 + style-to-object: 1.0.14 + typescript: 6.0.3 + transitivePeerDependencies: + - supports-color + eslint-plugin-svelte@3.17.1(eslint@10.4.0(jiti@2.7.0))(svelte@5.55.9(@typescript-eslint/types@8.59.4)): dependencies: '@eslint-community/eslint-utils': 4.9.1(eslint@10.4.0(jiti@2.7.0)) @@ -25288,6 +25644,8 @@ snapshots: dependencies: cheerio: 1.2.0 + html-tags@3.3.1: {} + htmlparser2@10.1.0: dependencies: domelementtype: 2.3.0 @@ -25414,6 +25772,8 @@ snapshots: dependencies: tslib: 2.8.1 + inline-style-parser@0.2.7: {} + input-otp@1.4.2(react-dom@19.2.6(react@19.2.6))(react@19.2.6): dependencies: react: 19.2.6 @@ -25458,6 +25818,10 @@ snapshots: dependencies: is-extglob: 2.1.1 + is-html@2.0.0: + dependencies: + html-tags: 3.3.1 + is-in-ssh@1.0.0: {} is-inside-container@1.0.0: @@ -25604,6 +25968,8 @@ snapshots: dependencies: source-map-support: 0.5.21 + kebab-case@1.0.2: {} + keyv@4.5.4: dependencies: json-buffer: 3.0.1 @@ -25632,6 +25998,8 @@ snapshots: - '@emnapi/core' - '@emnapi/runtime' + known-css-properties@0.30.0: {} + known-css-properties@0.37.0: {} kolorist@1.8.0: {} @@ -27660,6 +28028,10 @@ snapshots: strip-json-comments@5.0.3: {} + style-to-object@1.0.14: + dependencies: + inline-style-parser: 0.2.7 + stylis@4.2.0: {} sugarss@5.0.1(postcss@8.5.12):