DataTable
Tabela de dados montada a partir dos dados e das colunas, com ordenação, seleção de linhas, páginas e estado de carregamento prontos. Para uma tabela fixa escrita à mão, use Table.
| #4821 | Padaria Estrela | R$ 1.240,00 | |
| #4820 | Vila Nova Design | R$ 840,50 | |
| #4819 | Aurora BioTech | R$ 3.120,00 |
Instalação
Configure o Camaleo uma vez (Instalação) e importe a tabela e o tipo das colunas. Ela roda no cliente.
import { DataTable, type ColumnDef } from "@camaleo/react";Anatomia
Uma <table> nativa dentro de uma caixa que rola para o lado quando a tabela não cabe, com um rodapé para o status e as páginas. O rodapé só aparece quando a tabela tem seleção ou mais de uma página.
Exemplos
Todo exemplo é um arquivo de verdade que você pode copiar. Todos usam o estilo, o modo e a marca escolhidos na barra acima.
| #4821 | Padaria Estrela | Pago | R$ 1.240,00 |
| #4820 | Vila Nova Design | Pendente | R$ 840,50 |
| #4819 | Aurora BioTech | Pago | R$ 3.120,00 |
| Pedido | |||
|---|---|---|---|
| #4819 | Aurora BioTech | 19/10/2026 | R$ 3.120,00 |
| #4821 | Padaria Estrela | 24/10/2026 | R$ 1.240,00 |
| #4820 | Vila Nova Design | 22/10/2026 | R$ 840,50 |
| #4818 | Café Serra Azul | 15/10/2026 | R$ 420,00 |
Ordenação
Clique num cabeçalho para ordenar. Números começam pelo maior, texto começa pelo A, e o terceiro clique volta à ordem original. Desligue a ordenação com enableSorting: false onde a ordem não diz nada, como num código.
| #4821 | Padaria Estrela | R$ 1.240,00 | |
| #4820 | Vila Nova Design | R$ 840,50 | |
| #4819 | Aurora BioTech | R$ 3.120,00 |
Seleção de linhas
Use selectable quando a pessoa age sobre várias linhas de uma vez. Dê a cada caixa o nome da linha com selectRowLabel, para o leitor de tela dizer qual pedido ela seleciona, e não "Select row 2".
| #4821 | Padaria Estrela | R$ 1.240,00 |
| #4820 | Vila Nova Design | R$ 840,50 |
| #4819 | Aurora BioTech | R$ 3.120,00 |
Páginas
Quando as linhas passam de uma tela, defina pageSize. Diga quais linhas estão aparecendo em selectionStatus e traduza os botões de página com previousLabel, nextLabel e pageLabel.
| #4821 | Padaria Estrela | R$ 1.240,00 |
| #4820 | Vila Nova Design | R$ 840,50 |
| #4819 | Aurora BioTech | R$ 3.120,00 |
Carregando
Clique em Atualizar. loading troca as linhas por skeletons, mas skeletons não dizem nada ao leitor de tela, então uma mensagem de status avisa quando o carregamento começa e termina.
Nenhum pedido aindaOs pedidos aparecem aqui assim que um cliente paga no checkout. | ||
Ainda sem linhas
Passe um EmptyState em emptyState. Os cabeçalhos continuam, então a pessoa vê o que a tabela vai mostrar, e a mensagem dá o próximo passo.
Nome do cliente ou número do pedido.
| #4821 | Padaria Estrela | R$ 1.240,00 |
| #4820 | Vila Nova Design | R$ 840,50 |
| #4819 | Aurora BioTech | R$ 3.120,00 |
| #4818 | Café Serra Azul | R$ 420,00 |
| #4817 | Livraria Ponto Final | R$ 2.890,00 |
Busca
Digite o nome de um cliente. A tabela filtra o que você passa em data, uma linha de status anuncia quantos pedidos batem, e Limpar busca devolve o foco ao campo.
| #4821 | Padaria Estrela | R$ 1.240,00 | |
| #4820 | Vila Nova Design | R$ 840,50 | |
| #4819 | Aurora BioTech | R$ 3.120,00 |
Ações na linha
Botões só com ícone ganham um nome com a linha, como "Baixar nota fiscal do pedido #4821", porque "Baixar" sozinho é igual em toda linha. O cabeçalho da coluna continua para o leitor de tela com VisuallyHidden.
Em contexto
Uma tabela de dados costuma ser a peça principal de uma página de administração, com ações acima dela. Estes são pedaços inteiros de interface que você pode copiar, no estilo que escolheu.
Pedidos para enviar
| #4821 | Padaria Estrela | Pago | R$ 1.240,00 | |
| #4820 | Vila Nova Design | Pago | R$ 840,50 | |
| #4819 | Aurora BioTech | Enviado | R$ 3.120,00 | |
| #4818 | Café Serra Azul | Pago | R$ 420,00 |
| Aline Prado | Arquiteta de front-end | Ativa | |
| Tiago Costa | Engenheiro de DevOps | Ativa | |
| Helena Lima | Gerente de produto | Convidada | |
| Marcos Silva | Analista de segurança | Suspensa |
| Descrição | |||
|---|---|---|---|
| 24/10/2026 | Mensalidade, Vila Nova Design | Receita | +R$ 4.800,00 |
| 22/10/2026 | Hospedagem em nuvem | Infraestrutura | -R$ 920,40 |
| 20/10/2026 | Licenças de ferramentas de design | Software | -R$ 145,00 |
| 18/10/2026 | Etapa 2, Aurora BioTech | Receita | +R$ 2.200,00 |
Boas práticas
| Produto | Receita |
|---|---|
| Plano anual | R$ 142.850,00 |
| Plano mensal | R$ 38.400,50 |
| Armazenamento extra | R$ 2.190,00 |
Use meta: { align: "end" } nas colunas de números. Os algarismos ficam com a mesma largura, então o maior valor se destaca.
| Produto | Receita |
|---|---|
| Plano anual | R$ 142.850,00 |
| Plano mensal | R$ 38.400,50 |
| Armazenamento extra | R$ 2.190,00 |
Milhares e centenas começam no mesmo lugar, e a pessoa precisa ler cada valor para comparar.
| Telefone | ||
|---|---|---|
| Padaria Estrela | compras@estrela.com.br | (11) 3456-7821 |
| Café Serra Azul | pedidos@serraazul.com.br | (31) 2233-4410 |
Aqui só o nome ordena. Menos botões no cabeçalho são menos paradas de Tab antes dos dados.
| Padaria Estrela | compras@estrela.com.br | (11) 3456-7821 |
| Café Serra Azul | pedidos@serraazul.com.br | (31) 2233-4410 |
Toda coluna com accessor ordena por padrão. Ninguém ordena por telefone, e cada botão a mais é mais uma parada para quem usa teclado.
Props
enableSorting: false; meta: { align: "end" } alinha números à direita.aria-label) e, quando ela não cabe, à área de rolagem. Diga o que são as linhas.{ [id]: true }.{ id, desc }.selectable.Ela também aceita os atributos de uma <div>, como aria-busy e style. As colunas são ColumnDefs do TanStack: accessorKey ou accessorFn, header, cell, enableSorting e meta.align.
Styling hooks
Mude o visual sem copiar o componente: use os atributos ou defina os tokens num elemento pai, num estilo ou na própria tabela.
Atributos
Tokens que ele lê
Cor
Forma e tamanho
Tipografia e movimento
Só deste componente
Acessibilidade
- A prop caption dá nome à tabela. Diga o que são as linhas, como "Pedidos de outubro de 2026"; o padrão "Data table" não diz nada.
- Cabeçalhos ordenáveis ganham aria-sort (ascending, descending ou none), então o leitor de tela diz como as linhas estão ordenadas.
- A caixa do cabeçalho fica indeterminada quando só algumas linhas estão selecionadas, e as linhas selecionadas ganham aria-selected.
- Linhas de skeleton são mudas. Coloque uma mensagem com role="status" para o carregamento e para a contagem de resultados de uma busca.