AdaptTable for Tailwind

Row and column virtualization in Tailwind

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 Tailwind table, with the rows outside the window absent rather than hidden.

The map paints the header and pinned cells opaque per element rather than through a token, which is what stops scrolled rows showing through them, and the scroll box contains its own overscroll.

The code

import { DataTable } from "@adapttable/unstyled";
import { virtualize } from "@adapttable/unstyled/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/unstyled @adapttable/core

The same feature in the other kits

More Tailwind features

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