UI

Table

Exibe dados em linhas e colunas, com ordenação, seleção por checkbox e navegação por teclado.

PedidoClienteServiçoValorEntrega
#1042Padaria Pão de OuroSite institucionalR$ 3.200,0010/10/2026
#1043Clínica SorrisoLanding page + Google AdsR$ 4.800,0018/10/2026
#1044Lima AdvocaciaSistema de agendamentoR$ 12.900,0005/11/2026
#1045Pet Shop AmigoLoja virtualR$ 8.600,0022/11/2026

Instalação

npx shadcn@latest add @lenstech/table

Uso

import { Cell, Column, Row, Table, TableBody, TableHeader } from "@/components/ui/table"
<Table aria-label="Pedidos">
  <TableHeader>
    <Column isRowHeader>Cliente</Column>
    <Column>Valor</Column>
  </TableHeader>
  <TableBody items={pedidos}>
    {(pedido) => (
      <Row id={pedido.id}>
        <Cell>{pedido.cliente}</Cell>
        <Cell>{pedido.valor}</Cell>
      </Row>
    )}
  </TableBody>
</Table>

Toda tabela precisa de um nome e de uma coluna principal

Informe aria-label (ou aria-labelledby) no Table e marque a coluna que identifica a linha com isRowHeader — é ela que o leitor de tela anuncia ao navegar pelas linhas.

Exemplos

Ordenação

Marque as colunas com allowsSorting e controle sortDescriptor / onSortChange. A tabela só informa a coluna e a direção pedidas — a ordenação dos dados é feita por você (no cliente ou na API).

ClienteServiçoValor
Lima AdvocaciaSistema de agendamentoR$ 12.900,00
Pet Shop AmigoLoja virtualR$ 8.600,00
Clínica SorrisoLanding page + Google AdsR$ 4.800,00
Padaria Pão de OuroSite institucionalR$ 3.200,00
Studio JMIdentidade visualR$ 2.400,00

Seleção

Com selectionMode="multiple" a coluna de checkboxes aparece sozinha, inclusive o "selecionar todos" no cabeçalho. O valor de selectedKeys é um Set com os id das linhas — ou a string "all".

1 fatura(s) selecionada(s)

FaturaClienteVencimentoValor
NF-2031Padaria Pão de Ouro05/10/2026R$ 890,00
NF-2032Clínica Sorriso08/10/2026R$ 1.490,00
NF-2033Lima Advocacia12/10/2026R$ 2.350,00
NF-2034Pet Shop Amigo15/10/2026R$ 640,00

Estado vazio

Use renderEmptyState no TableBody para explicar por que não há dados e, se possível, o que fazer a seguir.

ClienteServiçoValor

Nenhum orçamento enviado ainda

Os orçamentos aparecem aqui assim que forem enviados ao cliente.

Busca, paginação e status

Para uma tabela completa com busca, paginação e badges de status, use o bloco Data Table.

Quando usar

  • Use para dados tabulares que o usuário compara coluna a coluna: pedidos, faturas, leads, relatórios.
  • Não use para layout de página ou para listas de um único dado por linha — prefira Grid List.
  • Não use para escolher opções em formulários — use Select, ListBox ou Checkbox.
  • Para listas longas, combine com Pagination ou use o bloco Data Table.
  • Alinhe números à direita com className="text-right font-mono tabular-nums" no Column e no Cell.

API

Table

Aceita todas as props do Table do React Aria. As mais usadas:

Prop

Type

Column

Aceita todas as props do Column do React Aria.

Prop

Type

TableBody

Aceita todas as props do TableBody do React Aria.

Prop

Type

Row e Cell

Row aceita as props do Row do React Aria — id é obrigatório para seleção; href transforma a linha em link. Cell aceita as props do Cell do React Aria e className para alinhamento.

On this page