DataGrid
Tabela de dados com colunas definidas, ordenação, seleção e vazio.
O DataGrid (do HeroUI Pro) mostra dados em colunas fixas: a lista de Pedidos, o extrato de Créditos, as Fontes. No Admin ele vive dentro de um Widget, sem <table> à mão. Para cartões de métricas use Widget; para listas ricas de uma coluna, ListView.
import { DataGrid, type DataGridColumn } from "@rastreio-x/ui";
Padrão
Informe data, columns, getRowId e um aria-label. A coluna com isRowHeader nomeia a linha para o leitor de tela.
Ordenação
allowsSorting na coluna e defaultSortDescriptor (ou sortDescriptor e onSortChange) ligam a ordenação. Use sortFn para ordenar números e datas.
Seleção
selectionMode e showSelectionCheckboxes ligam as caixas por linha. onSelectionChange recebe as chaves selecionadas.
Células próprias
cell desenha a célula. Estado vai em ícone mais texto (Chip), nunca só cor.
Sem dados
renderEmptyState mostra o que fazer quando não há linhas.
No Admin
O padrão é DataGrid dentro de Widget, com o rodapé do painel para a nota de fuso e o "Carregar Mais".
Anatomia
O DataGrid é uma peça só, configurada por props. Cada coluna é um objeto DataGridColumn (id, header, accessorKey ou cell, align, allowsSorting, width, pinned).
Propriedades
Animações
A grade não anima o conteúdo; linhas mudam de fundo no hover, no foco e na seleção. O cabeçalho ordenável troca a seta de direção. Com prefers-reduced-motion, a folha global da fachada reduz as transições a 0,01 ms.
Acessibilidade
- Tabela do React Aria com papéis
grid,rowegridcell;aria-sortmarca a coluna ordenada. - Teclado: as setas navegam entre células, Home e End vão às pontas da linha, Enter aciona a linha (
onRowAction) e Espaço seleciona. - Dê sempre
aria-labele marque a coluna de identidade comisRowHeader. - Evite
hrefpor linha: no Admin o link do Pedido fica na primeira célula e a linha abre poronRowAction. - Não use
onLoadMoreautomático: rolagem infinita piora o teclado; use o botão "Carregar Mais".
Boas práticas
Faça
Evite
- Colunas fixas e poucas; alinhe números à direita com
tabular-nums. - No celular, a lista vira cartões (
ItemCard); não force a tabela estreita. - Mostre o vazio com
renderEmptyState, não uma tabela só com cabeçalho. - Rolagem horizontal fica dentro do grid (
contentClassName="min-w-[36rem]").
Relacionados
- Widget como contêiner da tabela.
- EmptyState para o vazio da tabela.
- Chip para o estado em célula.