AdaptTable for Mantine

Row and column virtualization in Mantine

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

Virtualization happens inside Mantine's own scroll box — the sticky header and pinned cells are the adapter's, so the 100,000th row is styled exactly like the first.

The code

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

The same feature in the other kits

More Mantine features

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