https://framer.com/m/VirtulList-G1tWnr.js
VirtualList
VirtualList scrolls a million rows by rendering only the ones in view. Rows come from generated mock data, a static JSON, NDJSON or CSV file, or a paged range API, and search, sort and filtering run in a Web Worker so the page never blocks. Every colour resolves from the project tokens, so the list follows light and dark mode.
Examples
Live specimens for every control the component exposes.
One million rows
Mock Rows is set to 1,000,000. The rows are generated once in a worker and the DOM only ever holds the visible rows plus overscan, so scrolling stays smooth at any size. The Framer canvas caps its preview at 500 rows; the published page scrolls the full million.
Selection
selection is none, single or multiple. Multiple takes Shift for a range and Cmd/Ctrl to toggle a row. Arrow keys, Page Up/Down, Home and End move focus, Enter or Space selects, and the footer counts the selection.
Columns and sorting
columns picks, orders and sizes the columns by key: label, width (0 is flexible) and align. Left empty, every column in the data appears. Click a header to sort ascending, again for descending, a third time to clear.
Filter
filterJSON narrows the rows before search and sort run. Nodes nest with and / or; leaf ops are eq, ne, in, gte, lte and contains. This one keeps Active rows with an amount of 5,000 or more. Invalid JSON is ignored and flagged in the footer.
Density and frame
cellPadding and rowHeight set the density from the theme padding scale; radius, border and shadow set the frame. autoHeight lets rows grow to fit wrapped text instead of truncating to one line.
cellPadding XS · rowHeight 32 · search and footer off
cellPadding Large · rowHeight 48 · radius Large · shadow Normal
Data sources
source picks where rows come from. Static URL loads one file and parses it in a worker. Paged API speaks a small range protocol, below, so the server only ever sends the block being scrolled to. In both modes the canvas preview shows sample data.
Props
The 34 controls exposed on the instance panel. URL, API and Auth controls appear only when their source is selected.
Usage
Guidance carried over from the component definition.
Reach for VirtualList
Tens of thousands to millions of rows that scroll as one list.
The data is a static JSON, NDJSON or CSV file, or a server that pages by range.
Readers need instant search, column sort and a structured filter.
Rows need single or range selection with full keyboard support.
Reach for something else
A few hundred rows, or cells need badge, currency or percentage rendering: use TableX.
Cells need inline editing, grouping or tree rows.
The items are cards or media rather than tabular records.
Io — UI Basics
Every list above is a live VirtualList instance running on generated mock rows, not real data. Colour, type and radius resolve from the project theme tokens.