data-table
Build virtualized data tables with @virtuoso.dev/data-table. Use this skill when (1) building…
Build virtualized lists, grids, and tables with react-virtuoso. Use this skill when (1) rendering large or infinite lists, (2) building grouped lists with sticky headers, (3) virtualizing HTML tables, (4) laying out same-sized items in a responsive grid, (5) building feeds or
$ npx -y skills add petyosi/react-virtuoso --skill react-virtuoso --agent claude-codeHow it fires
How this skill gets triggered: by you, by Claude, or both.
/react-virtuosoContext preview
The summary Claude sees to decide when to auto-load this skill.
Build virtualized lists, grids, and tables with react-virtuoso. Use this skill when (1) rendering large or infinite lists, (2) building grouped lists with sticky headers, (3) virtualizing HTML tables, (4) laying out same-sized items in a responsive grid, (5) building feeds or
name: react-virtuoso description: >- Build virtualized lists, grids, and tables with react-virtuoso. Use this skill when (1) rendering large or infinite lists, (2) building grouped lists with sticky headers, (3) virtualizing HTML tables, (4) laying out same-sized items in a responsive grid, (5) building feeds or logs that follow new items at the bottom, (6) diagnosing virtualization symptoms such as jumpy scrolling, a list that does not scroll to the bottom, items overlapping, blank items, or "zero-sized element" errors, or (7) any task involving Virtuoso, GroupedVirtuoso, VirtuosoGrid, TableVirtuoso, VirtuosoHandle, itemContent, followOutput, or firstItemIndex.
`react-virtuoso` renders only the visible portion of large lists, grids, and tables. It measures item sizes automatically with ResizeObserver — variable item heights work out of the box, with no size configuration.
import { Virtuoso } from 'react-virtuoso'
;<Virtuoso style={{ height: '100%' }} data={users} itemContent={(index, user) => <div>{user.name}</div>} />| Need | Use | | ----------------------------------------------------------------------- | ------------------------------------------------------------------- | | Flat list, variable or fixed item heights | `Virtuoso` | | Groups with sticky group headers | `GroupedVirtuoso` | | HTML table with virtualized rows | `TableVirtuoso` | | Table with grouped rows and sticky group headers | `GroupedTableVirtuoso` | | Same-sized items in a responsive multi-column grid | `VirtuosoGrid` | | Chat / AI conversation UI (streaming, stick-to-bottom, prepend history) | `@virtuoso.dev/message-list` — use the `message-list` skill instead | | Data grid with columns, sorting, filtering, column features | `@virtuoso.dev/data-table` — use the `data-table` skill instead |
All components share the same core props (`data`/`totalCount`, `itemContent`, `components`, scroll callbacks, ref methods).
Unlike TanStack Virtual or react-window, react-virtuoso measures items itself. Do not carry those libraries' patterns over:
<Virtuoso data={items} endReached={() => loadMore()} itemContent={(index, item) => <Item item={item} />} />`endReached` fires at the bottom; render a spinner via `components.Footer`. For "load more" on click, put the button in `Footer`.
Prepending naively makes the list jump. Instead, keep a `firstItemIndex` that you decrease by the number of prepended items:
const [firstItemIndex, setFirstItemIndex] = useState(START)
const prepend = async () => {
const older = await fetchOlderItems()
setFirstItemIndex((i) => i - older.length)
setItems((current) => [...older, ...current])
}
<Virtuoso
computeItemKey={(_, item) => item.id}
data={items}
firstItemIndex={firstItemIndex}
initialTopMostItemIndex={{ index: 'LAST' }}
startReached={() => void prepend()}
...
/>`firstItemIndex` must stay a positive number, so start it large (e.g. `100000`). For `GroupedVirtuoso`, decrease it by the number of new items only, excluding the group headers. See [endless-scrolling](references/1.virtuoso/endless-scrolling.md).
<Virtuoso followOutput="smooth" data={messages} ... />`followOutput` scrolls to new bottom items only when the user is already at the bottom. It accepts `'auto' | 'smooth' | false` or a function `(isAtBottom) => ...` for custom logic. For full chat UIs prefer `@virtuoso.dev/message-
The most complete React virtualization rendering family of components. Variable sized items out of the box; no manual measurements or hard-coding item heights is necessary; Chat message list UI; Grouped mode with sticky headers; Responsive grid layout;
Repo: petyosi/react-virtuoso
Build virtualized data tables with @virtuoso.dev/data-table. Use this skill when (1) building…
Build chat, messaging, and AI conversation UIs with @virtuoso.dev/message-list. Use this…
Manage application state with the @virtuoso.dev/reactive-engine-* package family. Use this…