---
name: rezi-data-table
description: Add a data table with sorting, selection, and keyboard navigation. Use when displaying tabular data.
user-invocable: true
allowed-tools: Read, Glob, Grep, Edit, Write
argument-hint: "[data-source]"
metadata:
  short-description: Add data table
---

## When to use

Use this skill when:

- Displaying tabular data with rows and columns
- Need sorting, selection, or keyboard navigation on data
- Building dashboards or data-heavy screens

## Source of truth

- `packages/core/src/widgets/useTable.ts` — `useTable()` hook
- `packages/core/src/widgets/types.ts` — `TableProps`
- `packages/core/src/widgets/ui.ts` — `ui.table()`
- `packages/core/src/ui/recipes.ts` — `recipe.table()` for design-system-consistent table styling

## Steps

1. **Use the `useTable()` hook** inside a `defineWidget`:
   ```typescript
   import { defineWidget, ui, useTable } from "@rezi-ui/core";

   const DataTable = defineWidget<{ items: Item[] }>((props, ctx) => {
     const table = useTable(ctx, {
       rows: props.items,
       columns: [
         { key: "name", header: "Name", flex: 1 },
         { key: "size", header: "Size", width: 10, align: "right" },
       ],
       getRowKey: (row) => row.id,
       selectable: "multi",
      });
     return ui.table({
       ...table.props,
       dsSize: "md",
       dsTone: "default",
     });
   }, { name: "DataTable" });
   ```

2. **Handle selection** via `table.selection` (array of selected row keys)

3. **Handle sorting** via `table.sortColumn` and `table.sortDirection`

4. **For large datasets**, consider `ui.virtualList()` instead

## Design system note

Tables are recipe-styled by default when a `ThemeDefinition` preset is active.
Use `dsSize` / `dsTone` for explicit DS tuning when needed.

## Verification

- Correct columns render with headers
- Selection updates on keyboard/mouse interaction
- Sorting works in both directions
