,
+): React.CSSProperties | undefined {
+ if (!cell.getIsSelected()) return undefined
+
+ const edges = cell.getSelectionEdges()
+ const shadows = [
+ edges.top && 'inset 0 2px 0 var(--landing-accent)',
+ edges.right && 'inset -2px 0 0 var(--landing-accent)',
+ edges.bottom && 'inset 0 -2px 0 var(--landing-accent)',
+ edges.left && 'inset 2px 0 0 var(--landing-accent)',
+ ].filter(Boolean)
+
+ return { boxShadow: shadows.join(', ') }
+}
diff --git a/src/components/landing/codeExamples.ts b/src/components/landing/codeExamples.ts
index 76b725dd0..447aedc91 100644
--- a/src/components/landing/codeExamples.ts
+++ b/src/components/landing/codeExamples.ts
@@ -273,20 +273,21 @@ export default function VirtualRows() {
export const tableCodeExample: LandingCodeExampleData = {
frameworks: ['react'],
- title: 'React table instance',
+ title: 'React TanStack Table instance',
codeByFramework: {
react: {
lang: 'tsx',
- code: `import { useReactTable, getCoreRowModel, flexRender } from '@tanstack/react-table'
+ code: `import { tableFeatures, useTable } from '@tanstack/react-table'
const data = [{ id: 1, name: 'Ada' }]
+const features = tableFeatures({})
const columns = [{ accessorKey: 'name', header: 'Name' }]
export default function SimpleTable() {
- const table = useReactTable({
+ const table = useTable({
+ features,
data,
columns,
- getCoreRowModel: getCoreRowModel(),
})
return (
@@ -296,10 +297,7 @@ export default function SimpleTable() {
{headerGroup.headers.map((header) => (
|
- {flexRender(
- header.column.columnDef.header,
- header.getContext(),
- )}
+
|
))}
@@ -310,7 +308,7 @@ export default function SimpleTable() {
{row.getVisibleCells().map((cell) => (
|
- {flexRender(cell.column.columnDef.cell, cell.getContext())}
+
|
))}
diff --git a/src/libraries/libraries.ts b/src/libraries/libraries.ts
index 92aa984c3..891e25282 100644
--- a/src/libraries/libraries.ts
+++ b/src/libraries/libraries.ts
@@ -292,10 +292,10 @@ export const table: LibrarySlim = {
...categoryStyles.ui,
name: 'TanStack Table',
to: '/table',
- tagline: 'Headless UI for building powerful tables & datagrids',
+ tagline: 'Headless, type-safe table and data-grid infrastructure',
description:
- 'Supercharge your tables or build a datagrid from scratch in any framework while retaining 100% control over markup and styles.',
- badge: undefined,
+ 'Build tables and data grids with feature-level tree shaking, reactive state, fast row models, and complete control over markup and styles.',
+ badge: 'fresh',
repo: 'tanstack/table',
frameworks: [
'angular',
@@ -306,14 +306,13 @@ export const table: LibrarySlim = {
'solid',
'svelte',
'vue',
- 'qwik',
'lit',
'alpine',
'vanilla',
],
- latestVersion: 'v8',
+ latestVersion: 'v9',
latestBranch: 'main',
- availableVersions: ['v8', 'beta'],
+ availableVersions: ['v9', 'v8', 'beta'],
scarfId: 'dc8b39e1-3fe9-4f3a-8e56-d4e2cf420a9e',
defaultDocs: 'overview',
sitemap: {
@@ -400,7 +399,7 @@ export const form: LibrarySlim = {
tagline: 'Headless UI for building performant and type-safe forms',
description:
'Headless, performant, and type-safe form state management for TS/JS, React, Preact, Vue, Angular, Solid, Lit and Svelte.',
- badge: 'new',
+ badge: undefined,
repo: 'tanstack/form',
corePackageName: '@tanstack/form-core',
npmPackageNames: ['@tanstack/form-core'],
diff --git a/src/libraries/maintainers.ts b/src/libraries/maintainers.ts
index 4b384c2d9..be684e229 100644
--- a/src/libraries/maintainers.ts
+++ b/src/libraries/maintainers.ts
@@ -145,7 +145,7 @@ export const allMaintainers: Maintainer[] = [
maintainerOf: ['table', 'store'],
contributorOf: ['virtual'],
consultantOf: ['query'],
- frameworkExpertise: ['react', 'preact', 'solid'],
+ frameworkExpertise: ['react', 'preact', 'solid', 'octane'],
specialties: ['Data Grids', 'Performance', 'Dashboards'],
social: {
twitter: 'https://x.com/kevinvancott',
diff --git a/src/libraries/table.tsx b/src/libraries/table.tsx
index 825d9c28b..fe9b39bed 100644
--- a/src/libraries/table.tsx
+++ b/src/libraries/table.tsx
@@ -1,5 +1,5 @@
import {
- PersonSimpleIcon,
+ BracketsCurlyIcon,
LightningIcon,
GearIcon,
} from '@phosphor-icons/react'
@@ -10,7 +10,7 @@ const textStyles = 'text-category-ui'
export const tableProject = {
...table,
- description: `Supercharge your tables or build a datagrid from scratch for TS/JS, React, Vue, Solid, Svelte, Qwik, Angular, and Lit while retaining 100% control over markup and styles.`,
+ description: `Headless, type-safe table and data-grid infrastructure with feature-level tree shaking, reactive state, fast row models, and adapters for React, Preact, Vue, Solid, Svelte, Angular, Ember, Lit, Alpine, and Octane.`,
latestBranch: 'main',
defaultDocs: 'introduction',
legacyPackages: ['react-table'],
@@ -46,52 +46,54 @@ export const tableProject = {
],
featureHighlights: [
{
- title: 'Designed for zero design',
+ title: '100% Control',
icon: (
),
description: (
- What good is a powerful table if that super hip designer you just
- hired can't work their UI magic on it?{' '}
+ TanStack Table provides the state, row processing, and typed APIs
+ without prescribing your markup or styles. Having 100% control of your
+ code matters more than ever.{' '}
- TanStack Table is headless by design
+ Your semantics, components, design system, interactions, and source
+ code stay yours. Use any component library or design system,
+ including your own.
- , which means 100% control down to the very smallest HTML tag,
- component, class and style. Pixel Perfection? Go for it!
),
},
{
- title: 'Big Power, Small Package',
+ title: 'Reactive by Design',
icon: ,
description: (
- Don't be fooled by the small bundle size. TanStack Table is a
- workhorse. It's built to materialize, filter, sort, group, aggregate,
- paginate and display massive data sets using a very small API surface.
- Wire up your new or existing tables and{' '}
+ Every registered state slice is backed by TanStack Store, whose
+ fine-grained reactivity is built on alien-signals. Read a selected
+ snapshot, subscribe exactly where state is rendered, or own a slice
+ with an external atom.{' '}
- watch your users become instantly more productive
+ Fine-grained reactivity keeps unrelated parts of a large table out
+ of the render path.
- .
),
},
{
- title: 'Extensible',
+ title: 'Built to Extend',
icon: ,
description: (
- TanStack table ships with excellent defaults to get you off the ground
- as fast as possible, but nothing is stopping you from{' '}
+ Custom features use the same extension points as Table's built-ins.
+ Compose shared options with tableOptions, build app-level table
+ systems with createTableHook, and inspect live instances with the
+ supported Devtools integration.{' '}
- customizing and overriding literally everything to your liking
+ Scale from one headless table to a typed table platform for your
+ whole product.
- . Feeling tenacious enough to build your own Sheets/Excel/AirTable
- clone? Be our guest 😉
),
},
diff --git a/src/routes/admin/audit.tsx b/src/routes/admin/audit.tsx
index 5dc8c153e..76b0b0c87 100644
--- a/src/routes/admin/audit.tsx
+++ b/src/routes/admin/audit.tsx
@@ -12,12 +12,12 @@ import {
TableRow,
TableCell,
} from '~/components/TableComponents'
+import { flexRender } from '@tanstack/react-table'
import {
- useReactTable,
getCoreRowModel,
- flexRender,
- type ColumnDef,
-} from '@tanstack/react-table'
+ useLegacyTable as useReactTable,
+} from '@tanstack/react-table/legacy'
+import type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'
import * as v from 'valibot'
import { listAuditLogs } from '~/utils/audit.functions'
import { ShieldIcon, CaretDownIcon, CaretUpIcon } from '@phosphor-icons/react'
diff --git a/src/routes/admin/github-stats.tsx b/src/routes/admin/github-stats.tsx
index bf952b3c7..8a36b7f72 100644
--- a/src/routes/admin/github-stats.tsx
+++ b/src/routes/admin/github-stats.tsx
@@ -10,12 +10,12 @@ import {
TableRow,
TableCell,
} from '~/components/TableComponents'
+import { flexRender } from '@tanstack/react-table'
import {
- useReactTable,
getCoreRowModel,
- flexRender,
- type ColumnDef,
-} from '@tanstack/react-table'
+ useLegacyTable as useReactTable,
+} from '@tanstack/react-table/legacy'
+import type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'
import {
listGitHubStatsCache,
refreshGitHubStats,
diff --git a/src/routes/admin/logins.tsx b/src/routes/admin/logins.tsx
index ae3d072e2..e00e3a38f 100644
--- a/src/routes/admin/logins.tsx
+++ b/src/routes/admin/logins.tsx
@@ -12,13 +12,15 @@ import {
TableRow,
TableCell,
} from '~/components/TableComponents'
+import { flexRender } from '@tanstack/react-table'
import {
- useReactTable,
getCoreRowModel,
- flexRender,
- type ColumnDef,
- type Column,
-} from '@tanstack/react-table'
+ useLegacyTable as useReactTable,
+} from '@tanstack/react-table/legacy'
+import type {
+ LegacyColumn as Column,
+ LegacyColumnDef as ColumnDef,
+} from '@tanstack/react-table/legacy'
import * as v from 'valibot'
import { listLoginHistory } from '~/utils/audit.functions'
import { SignInIcon } from '@phosphor-icons/react'
diff --git a/src/routes/admin/roles.$roleId.tsx b/src/routes/admin/roles.$roleId.tsx
index 27a020fb5..85cd06bad 100644
--- a/src/routes/admin/roles.$roleId.tsx
+++ b/src/routes/admin/roles.$roleId.tsx
@@ -4,12 +4,12 @@ import { useRemoveUsersFromRole } from '~/utils/mutations'
import { useQuery } from '@tanstack/react-query'
import { getRole, getUsersWithRole } from '~/utils/roles.functions'
import { useCurrentUserQuery } from '~/hooks/useCurrentUser'
+import { flexRender } from '@tanstack/react-table'
import {
- useReactTable,
getCoreRowModel,
- flexRender,
- type ColumnDef,
-} from '@tanstack/react-table'
+ useLegacyTable as useReactTable,
+} from '@tanstack/react-table/legacy'
+import type { LegacyColumnDef as ColumnDef } from '@tanstack/react-table/legacy'
import {
ArrowLeftIcon,
LockIcon,
diff --git a/src/routes/admin/roles.index.tsx b/src/routes/admin/roles.index.tsx
index 7bd8b6df7..ded0d002f 100644
--- a/src/routes/admin/roles.index.tsx
+++ b/src/routes/admin/roles.index.tsx
@@ -14,12 +14,12 @@ import { useState, useMemo, useCallback } from 'react'
import { useQuery, keepPreviousData } from '@tanstack/react-query'
import { useCreateRole, useUpdateRole, useDeleteRole } from '~/utils/mutations'
import { listRoles, sendTestModeratorEmail } from '~/utils/roles.functions'
+import { flexRender } from '@tanstack/react-table'
import {
- useReactTable,
getCoreRowModel,
- flexRender,
- type Row,
-} from '@tanstack/react-table'
+ useLegacyTable as useReactTable,
+} from '@tanstack/react-table/legacy'
+import type { LegacyRow as Row } from '@tanstack/react-table/legacy'
import {
PencilSimpleLineIcon,
PlusIcon,
diff --git a/src/routes/admin/users.tsx b/src/routes/admin/users.tsx
index 970386855..65177d8cb 100644
--- a/src/routes/admin/users.tsx
+++ b/src/routes/admin/users.tsx
@@ -12,13 +12,15 @@ import {
TableRow,
TableCell,
} from '~/components/TableComponents'
+import { flexRender } from '@tanstack/react-table'
import {
- useReactTable,
getCoreRowModel,
- flexRender,
- type ColumnDef,
- type Column,
-} from '@tanstack/react-table'
+ useLegacyTable as useReactTable,
+} from '@tanstack/react-table/legacy'
+import type {
+ LegacyColumn as Column,
+ LegacyColumnDef as ColumnDef,
+} from '@tanstack/react-table/legacy'
import {
useUpdateUserCapabilities,
useAdminSetAdsDisabled,