Skip to content

DataTable

A sortable, typed table that keeps native table semantics and nulls in their place.

Live — this one is real

Illustrative module records
WaveText4.2
Button1.8
Signal3.1

Usage

import { DataTable } from "mizu-ui";

export function Example() {
  const rows = [
    { id: "a", name: "WaveText", size: 4.2 },
    { id: "b", name: "Button", size: 1.8 },
    { id: "c", name: "Signal", size: 3.1 },
  ];
  return (
    <DataTable
      label="Illustrative module records"
      rows={rows}
      getRowId={(r) => r.id}
      columns={[
        {
          id: "name",
          header: "Name",
          render: (r) => r.name,
          sortValue: (r) => r.name,
        },
        {
          id: "size",
          header: "Example KiB",
          render: (r) => r.size,
          sortValue: (r) => r.size,
          align: "right",
        },
      ]}
    />
  );
}

Source & setup

Import mizu-ui/styles.css once. Fonts are optional via mizu-ui/fonts.css. Override --mizu-* tokens or use className for local styling. Uses native React and CSS; install the package peers for root imports.

Inspect data/DataTable.tsx

Source is included in the npm package under src/data/DataTable.tsx.

Open full source ↗

Props

PropTypeDefaultDescription
rowsT[]—Your rows; pagination and fetching remain outside.
columnsDataColumn<T>[]—Stable id, header, render, optional sortValue and alignment.
getRowId(row: T) => string—Stable row identity.
label / loading / emptystring / boolean / ReactNode—Caption, busy state and empty content.

Accessibility

Native caption, headers and cells. Sort controls expose aria-sort. Overflow is focusable; null sort values stay last in either direction.

Motion

CSS transitions explain state changes. Reduced motion removes travel.

Works alongside