caliper uidocs

Virtual table

Pro

A table that renders only the visible rows, so thousands stay fast.

Installs components/ui/virtual-table.tsxDepends on @radix-ui/react-slot, lucide-reactMotion none in component source
pnpm dlx shadcn@latest add @caliper/virtual-table
ORD-100000
Lucas Tanaka
Failed
2025-03-20
$48.00
ORD-100001
Maya Chen
Failed
2025-04-30
$475.12
ORD-100002
Lena Tanaka
Refunded
2025-05-30
$303.42
ORD-100003
Lucas Solberg
Paid
2025-06-06
$71.99
ORD-100004
Ingrid Haddad
Failed
2025-10-03
$59.96
ORD-100005
Ravi Patel
Pending
2025-05-31
$68.80
ORD-100006
Zoe Rivera
Pending
2025-07-19
$109.29
ORD-100007
Omar Rivera
Paid
2025-06-19
$502.16
ORD-100008
Zoe Mensah
Paid
2025-05-06
$220.22
ORD-100009
Kofi Haddad
Paid
2025-07-14
$10.33
ORD-100010
Priya Patel
Pending
2025-08-17
$599.46
ORD-100011
Ingrid Tanaka
Refunded
2025-05-03
$228.39
ORD-100012
Zoe Rivera
Failed
2025-09-17
$61.69
ORD-100013
Omar Haddad
Paid
2025-11-10
$228.44
ORD-100014
Noor Fischer
Refunded
2025-09-08
$133.90

Row 1 of 50,000

50,000 orders. Sort from a header, search, then use the arrow keys and Enter.

When to use #

Use it for

  • Large result sets with sorting, search and keyboard navigation.

Skip it when

  • There are a few dozen rows; use the data table.

Installation #

terminal
pnpm dlx shadcn@latest add @caliper/virtual-table

Adds its 3 files to components/ui/, each with its own stylesheet, and installs their packages. Pro installs with your access token, set up once per project. See Pro access. The first part also adds Caliper UI’s tokens; import them once as in Installation.

Usage #

Import it from your copy of the source. The example behind the preview comes with the source.

example.tsx
import { VirtualTable } from "@/components/ui/virtual-table"

The worked example comes with Pro

The 71-line example behind the preview opens here with a Pro or Team licence.

Checking your licence…

API reference #

VirtualTable

component
PropTypeDefaultDescription
label *string—
rows *readonly T[]—
columns *readonly VirtualColumn<T>[]—
rowKey *(row: T) => string—
search((row: T) => string)—Text to match the search box against. Omit to hide the box.
searchLabelstring"Search"
rowHeightnumber40
heightnumber420
loadingboolean—
errorstring—
onActivate((row: T) => void)—Called on Enter or double click.
classNamestring—

Accessibility #

It exposes grid, row, columnheader, gridcell, rowgroup, alert and status semantics, with aria-hidden, aria-label, aria-rowcount, aria-colcount, aria-multiselectable and aria-busy kept in step with state. Changes that matter are announced through a live region.

KeyBehaviour
↓Moves to the next item or value.
↑Moves to the previous item or value.
PageDownMoves by a larger step, or to the next page.
PageUpMoves by a larger step, or to the previous page.
HomeJumps to the first item or the minimum.
EndJumps to the last item or the maximum.
SpaceActivates the focused control.
EnterActivates the focused control.

Motion #

It declares no animation in its component source. Any transition comes from its stylesheet, which uses the duration tokens that collapse to instant under prefers-reduced-motion.