AdaptTable for Base UI

Row reordering in Base UI

Compose rowReorder from @adapttable/base-ui/row-reorder and a grip appears. Space lifts a row, arrows move it, Space drops it. The table never mutates your array: onRowReorder asks the host, and the host writes.

movePolicy: "confirm" opens the kit's own move menu before a drop lands. Grouped moves stay inside a group unless onGroupMove says otherwise; tree moves stay under the same parent unless onTreeMove accepts a new one. A second move cannot start while a host confirmation is still pending.

Row identity is the row key, not the visual index — a virtual window or a later page does not lie about where the row sat. The grip, the move buttons and the confirmation menu are Base UI.

The grip is a Base UI Button and the confirmation is a Base UI Menu; the announcer sits beside them so a keyboard move is heard once.

The code

import { DataTable } from "@adapttable/base-ui";
import { applyRowReorder } from "@adapttable/react";
import { rowReorder } from "@adapttable/base-ui/row-reorder";

export function Tasks({ rows, setRows, columns }) {
  return (
    <DataTable
      data={rows}
      columns={columns}
      rowKey={(row) => row.id}
      features={[
        rowReorder((from, to) => {
          setRows((current) => applyRowReorder(current, from, to));
        }, { movePolicy: "confirm" }),
      ]}
    />
  );
}

Install

pnpm add @adapttable/base-ui @adapttable/core @base-ui/react

The same feature in the other kits

More Base UI features

Reference: row-reordering. More of this kit: AdaptTable for Base UI, or the live demo.