Data Table
Sortable, searchable, paginated table built on top of the `Table` primitive — with row selection, column visibility, and a sticky header variant.
Minimal
Just rows, columns, and pagination. No toolbar.
| Edifício Aurora #100 | Ana Souza | Active | R$ 2.500 | 2026-01-15 |
| Torre Estrela #101 | Bruno Pereira | Pending | R$ 2.850 | 2026-02-15 |
| Bloco Sol #102 | Carla Oliveira | Inactive | R$ 3.200 | 2026-03-15 |
| Residencial Mar #103 | Diego Santos | Active | R$ 3.550 | 2026-04-15 |
| Condomínio Atlântico #104 | Eduarda Lima | Pending | R$ 3.900 | 2026-05-15 |
<DataTableRoot items={rows} columns={columns} defaultPageSize={5}>
<DataTableContent />
<DataTablePagination />
</DataTableRoot>With toolbar
Search, column visibility, sortable headers, and the pagination footer.
| Alto da Serra #113 | Nícolas Barros | Pending | R$ 3.900 | 2026-02-15 |
| Alto da Serra #128 | Nícolas Barros | Pending | R$ 2.850 | 2026-05-15 |
| Bloco Sol #102 | Carla Oliveira | Inactive | R$ 3.200 | 2026-03-15 |
| Bloco Sol #117 | Carla Oliveira | Inactive | R$ 5.300 | 2026-06-15 |
| Cidade Nova #112 | Mariana Mendes | Active | R$ 3.550 | 2026-01-15 |
| Cidade Nova #127 | Mariana Mendes | Active | R$ 2.500 | 2026-04-15 |
| Condomínio Atlântico #104 | Eduarda Lima | Pending | R$ 3.900 | 2026-05-15 |
| Condomínio Atlântico #119 | Eduarda Lima | Pending | R$ 2.850 | 2026-02-15 |
| Edifício Aurora #100 | Ana Souza | Active | R$ 2.500 | 2026-01-15 |
| Edifício Aurora #115 | Ana Souza | Active | R$ 4.600 | 2026-04-15 |
<DataTableRoot items={rows} columns={columns}>
<DataTableToolbar>
<DataTableSearch />
<DataTableViewOptions />
</DataTableToolbar>
<DataTableContent />
<DataTablePagination />
</DataTableRoot>Sticky header + selection
Bounded `maxHeight` so the header pins on vertical scroll. Each row has a selection checkbox; the footer shows the running count.
| Edifício Aurora #100 | Ana Souza | Active | R$ 2.500 | 2026-01-15 | ||
| Torre Estrela #101 | Bruno Pereira | Pending | R$ 2.850 | 2026-02-15 | ||
| Bloco Sol #102 | Carla Oliveira | Inactive | R$ 3.200 | 2026-03-15 | ||
| Residencial Mar #103 | Diego Santos | Active | R$ 3.550 | 2026-04-15 | ||
| Condomínio Atlântico #104 | Eduarda Lima | Pending | R$ 3.900 | 2026-05-15 | ||
| Vila Jardim #105 | Felipe Costa | Inactive | R$ 4.250 | 2026-06-15 | ||
| Mirante Ipê #106 | Gabriela Alves | Active | R$ 4.600 | 2026-01-15 | ||
| Mont Blanc #107 | Henrique Dias | Pending | R$ 4.950 | 2026-02-15 | ||
| Parque das Flores #108 | Isabela Rocha | Inactive | R$ 5.300 | 2026-03-15 | ||
| Villa Bela #109 | João Almeida | Active | R$ 2.500 | 2026-04-15 | ||
| Recanto Verde #110 | Karine Ribeiro | Pending | R$ 2.850 | 2026-05-15 | ||
| Solar dos Pinhais #111 | Lucas Carvalho | Inactive | R$ 3.200 | 2026-06-15 | ||
| Cidade Nova #112 | Mariana Mendes | Active | R$ 3.550 | 2026-01-15 | ||
| Alto da Serra #113 | Nícolas Barros | Pending | R$ 3.900 | 2026-02-15 | ||
| Lagoa Azul #114 | Olivia Castro | Inactive | R$ 4.250 | 2026-03-15 | ||
| Edifício Aurora #115 | Ana Souza | Active | R$ 4.600 | 2026-04-15 | ||
| Torre Estrela #116 | Bruno Pereira | Pending | R$ 4.950 | 2026-05-15 | ||
| Bloco Sol #117 | Carla Oliveira | Inactive | R$ 5.300 | 2026-06-15 | ||
| Residencial Mar #118 | Diego Santos | Active | R$ 2.500 | 2026-01-15 | ||
| Condomínio Atlântico #119 | Eduarda Lima | Pending | R$ 2.850 | 2026-02-15 |
<DataTableRoot items={rows} columns={columns} enableSelection>
<DataTableToolbar>
<DataTableSearch />
<DataTableViewOptions />
</DataTableToolbar>
<DataTableContent stickyHeader maxHeight="24rem" />
<DataTablePagination />
</DataTableRoot>Single-row selection
Use `selectionStrategy="single"` when at most one row should be selectable — the header checkbox renders disabled and clicking a row replaces the prior selection.
| Edifício Aurora #100 | Ana Souza | Active | R$ 2.500 | 2026-01-15 | ||
| Torre Estrela #101 | Bruno Pereira | Pending | R$ 2.850 | 2026-02-15 | ||
| Bloco Sol #102 | Carla Oliveira | Inactive | R$ 3.200 | 2026-03-15 | ||
| Residencial Mar #103 | Diego Santos | Active | R$ 3.550 | 2026-04-15 | ||
| Condomínio Atlântico #104 | Eduarda Lima | Pending | R$ 3.900 | 2026-05-15 |
<DataTableRoot
items={rows}
columns={columns}
enableSelection
selectionStrategy="single"
>
<DataTableContent />
<DataTablePagination />
</DataTableRoot>Select all across pages
Use `selectionStrategy="all"` so the header checkbox toggles every filtered row, not just the visible page. Internally it flips a virtual flag plus an exclusion set, so it works the same way against backend-paginated data.
| Edifício Aurora #100 | Ana Souza | Active | R$ 2.500 | 2026-01-15 | ||
| Torre Estrela #101 | Bruno Pereira | Pending | R$ 2.850 | 2026-02-15 | ||
| Bloco Sol #102 | Carla Oliveira | Inactive | R$ 3.200 | 2026-03-15 | ||
| Residencial Mar #103 | Diego Santos | Active | R$ 3.550 | 2026-04-15 | ||
| Condomínio Atlântico #104 | Eduarda Lima | Pending | R$ 3.900 | 2026-05-15 | ||
| Vila Jardim #105 | Felipe Costa | Inactive | R$ 4.250 | 2026-06-15 | ||
| Mirante Ipê #106 | Gabriela Alves | Active | R$ 4.600 | 2026-01-15 | ||
| Mont Blanc #107 | Henrique Dias | Pending | R$ 4.950 | 2026-02-15 | ||
| Parque das Flores #108 | Isabela Rocha | Inactive | R$ 5.300 | 2026-03-15 | ||
| Villa Bela #109 | João Almeida | Active | R$ 2.500 | 2026-04-15 |
<DataTableRoot
items={rows}
columns={columns}
enableSelection
selectionStrategy="all"
onSelectAllChange={({ allSelected, excludedIds }) => {
// Gmail-style: act on the whole filtered set minus exclusions.
}}
>
<DataTableToolbar>
<DataTableSearch />
<DataTableViewOptions />
</DataTableToolbar>
<DataTableContent />
<DataTablePagination />
</DataTableRoot>Built on the design-system `Table` primitive — see also: shadcn/ui — Data Table