TanStack Table
Reference Repositories
- TanStack Table - Headless table state and row models
- Svelte - Svelte 5 component and reactivity model
Upstream Grounding
When TanStack Table adapter APIs, row models, controlled state, sorting, filtering, pagination, or Svelte rendering helpers affect correctness, ask DeepWiki a narrow question against TanStack/table. Verify against the installed @tanstack/svelte-table and @tanstack/table-core versions.
This skill is for UI table state. Use workspace-api for Epicenter CRDT table storage and migrations.
Local API Baseline
Epicenter currently uses @tanstack/svelte-table with:
import {
createTable as createSvelteTable,
FlexRender,
renderComponent,
} from '@tanstack/svelte-table';
import type { ColumnDef } from '@tanstack/table-core';
Table Construction Rules
- Always set
getRowIdfor persisted or local-first rows. Do not rely on array index identity. - Keep
datareferentially stable. Avoid creating a fresh array in the table options getter unless the table is intentionally rebuilt. - Define columns with
satisfies ColumnDef<Row>[]. - Give accessor columns stable ids, especially when sorting, hiding, or persisted preferences are involved.
- Use
renderComponentfor reusable header and cell components. - Include only row models the UI uses: core always, sorted/filter/pagination only when the surface needs them.
Controlled State
- Control only state Epicenter owns externally, such as sorting, global filter, column visibility, row selection, or pagination.
- If an
onXChangehandler is present, the matchingstate.get x()must also be present. - Keep state ownership in one component or handle. Do not split sorting, filters, and pagination across unrelated stores without a reason.
Rendering
- TanStack Table owns row, column, and cell state.
@epicenter/ui/tableowns semantic table markup and styling. - Render headers and cells with
FlexRender. - Key rows by
row.idand cells bycell.id. - Empty states stay in
epicenter-ui: when row count is zero, renderEmpty.Rootin the table body or surrounding panel. - Add explicit keyboard behavior for clickable rows. A click handler alone is not a row interaction model.
- Use TanStack Virtual separately for large lists. Do not treat virtualization as a built-in table feature.