AdaptTable for shadcn

Row and column virtualization in shadcn

Compose virtualize() and the table renders the rows in view plus a small overscan, whatever the dataset's size. virtualize({ virtualizeColumns: true }) does the same across, for column sets far wider than the window.

The header stays pinned, pinned columns stay put, and the scroll box scrolls — never the page. Sorting, filtering and selection keep working on the whole dataset rather than on what is drawn.

Nothing about the markup changes: it is the same shadcn table, with the rows outside the window absent rather than hidden.

Sticky and pinned cells stay opaque because the preset paints them bg-card — a transparent pinned cell would show the rows sliding under it — and a windowed-out row is a real table row with a height and nothing in it.

The code

import { DataTable } from "@adapttable/shadcn";
import { virtualize } from "@adapttable/shadcn/virtualize";

export function Ledger({ rows, columns }) {
  return (
    <DataTable
      data={rows}
      columns={columns}
      rowKey={(row) => row.id}
      features={[virtualize({ virtualizeColumns: true })]}
      maxHeight={600}
      defaultColumnLayout={{ pinned: { name: "start" } }}
    />
  );
}

Install

pnpm add @adapttable/shadcn @adapttable/core

The same feature in the other kits

More shadcn features

Reference: virtualization. More of this kit: AdaptTable for shadcn, or the live demo.