Skip to main content
tally-react renders a grid from tally-core. It is the only package that ships the full component: virtualized rows and columns, the filter bar, menus, editors, cards and the detail sheet. The Vue, Svelte and Solid packages bind the engine and render nothing.
React 19 or newer.

Usage

accounts.tsx
useGrid creates a Grid from tally-core, loads it on mount and disposes it on unmount. It recreates the grid when schema or source change identity, and when the format context changes. The current view carries over. Keep the source stable. Create it once with useState or useMemo, or the grid is rebuilt on every render.

<Tally>

Hooks

Pass a selector to useGridState or useView so a component re-renders only when the selected value changes.
status.tsx
<Tally> provides its grid to everything it renders, so useGridContext works inside a custom toolbar or a renderer. Wrap other parts of your page in GridProvider to share a grid with them.

Composition

The default toolbar is made of exported parts: Toolbar, FilterBar, Chip, DisplayMenu, AiMenu, Pager, HeaderMenu, RulesPopover and RowMenu. Pass a node as toolbar to arrange them yourself.
accounts.tsx
The parts read the shell of the <Tally> they render in, so render them through toolbar or children, not outside the component.

Styles and fonts

Import the stylesheet once. fonts.css self-hosts Onest and JetBrains Mono. Leave it out and the system stack takes over.
Every selector is scoped under .tally and the stylesheet is unlayered, so it survives Tailwind’s preflight and other resets. See Theming for tokens, layers and data attributes.

Bundle

Own code is under 23 kB brotli. With Base UI, TanStack Virtual, Pragmatic drag and drop and Lucide it is under 101 kB. tally-core, react and react-dom are not included in those numbers.