AdaptTable for Tailwind

Row reordering in Tailwind

Compose rowReorder from @adapttable/unstyled/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 Tailwind.

The grip and the confirmation menu carry the map's classes; the announcer is a live region, so a keyboard move is heard even when the handle is only a native button.

The code

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

The same feature in the other kits

More Tailwind features

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