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.
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
<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.
.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.