DataTable
A sortable, typed table that keeps native table semantics and nulls in their place.
Live — this one is real
| WaveText | 4.2 |
| Button | 1.8 |
| Signal | 3.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.
Props
| Prop | Type | Default | Description |
|---|---|---|---|
| rows | T[] | — | Your rows; pagination and fetching remain outside. |
| columns | DataColumn<T>[] | — | Stable id, header, render, optional sortValue and alignment. |
| getRowId | (row: T) => string | — | Stable row identity. |
| label / loading / empty | string / 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.