Table
Tabela responsiva para exibir dados tabulares com cabeçalhos, corpo e rodapé
Table é o bloco de apresentação mais denso do design system. Use para dados genuinamente tabulares — onde as colunas representam atributos comparáveis e as linhas representam registros. Para listas simples, prefira um layout em cards ou itens.
| Fatura | Status | Método | Valor |
|---|---|---|---|
| INV-001 | Pago | Cartão de crédito | R$ 2.500,00 |
| INV-002 | Pendente | Pix | R$ 1.200,00 |
| INV-003 | Atrasado | Boleto | R$ 890,00 |
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@uranus-workspace/design-system';
const invoices = [
{ id: 'INV-001', status: 'Pago', method: 'Cartão de crédito', amount: 'R$ 2.500,00' },
{ id: 'INV-002', status: 'Pendente', method: 'Pix', amount: 'R$ 1.200,00' },
{ id: 'INV-003', status: 'Atrasado', method: 'Boleto', amount: 'R$ 890,00' },
];
export default function TableDefault() {
return (
<Table className="w-[560px]">
<TableCaption>Faturas recentes do projeto Apollo.</TableCaption>
<TableHeader>
<TableRow>
<TableHead>Fatura</TableHead>
<TableHead>Status</TableHead>
<TableHead>Método</TableHead>
<TableHead className="text-right">Valor</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{invoices.map((invoice) => (
<TableRow key={invoice.id}>
<TableCell className="font-medium">{invoice.id}</TableCell>
<TableCell>{invoice.status}</TableCell>
<TableCell>{invoice.method}</TableCell>
<TableCell className="text-right">{invoice.amount}</TableCell>
</TableRow>
))}
</TableBody>
</Table>
);
}
Anatomia
- Table — o
<table>wrapado em um contêineroverflow-autopara rolagem horizontal em telas estreitas. - TableHeader / TableBody / TableFooter —
<thead>,<tbody>,<tfoot>respectivamente. UseTableFooterpara totais e subtotais. - TableRow — uma linha. Tem hover e suporta
data-state="selected"para destacar linhas selecionadas. - TableHead — célula de cabeçalho (
<th>). Alinhada à esquerda por padrão. - TableCell — célula de dados (
<td>). - TableCaption — legenda semântica
<caption>posicionada abaixo da tabela por padrão.
Uso
import {
Table,
TableBody,
TableCaption,
TableCell,
TableHead,
TableHeader,
TableRow,
} from '@uranus-workspace/design-system';
<Table>
<TableCaption>Faturas do último trimestre.</TableCaption>
<TableHeader>
<TableRow>
<TableHead>Fatura</TableHead>
<TableHead className="text-right">Valor</TableHead>
</TableRow>
</TableHeader>
<TableBody>
<TableRow>
<TableCell>INV-001</TableCell>
<TableCell className="text-right">R$ 2.500,00</TableCell>
</TableRow>
</TableBody>
</Table>Faça
- Alinhe colunas numéricas à direita com
className="text-right"— facilita a comparação de magnitudes. - Use
TableCaptionou umaria-labeldescritivo para que leitores de tela anunciem o propósito da tabela. - Para tabelas com muitas colunas, mantenha a primeira coluna "sticky" ou forneça busca e filtros.
Não faça
- Não use tabela para layout. Use
gridouflex. - Não misture tipos de conteúdo em uma mesma coluna — quebra a varredura visual.
- Não omita o cabeçalho. Leitores de tela dependem dele para associar células a colunas.
Acessibilidade
- O wrapper externo é um
<div class="overflow-auto">, então o foco de teclado continua dentro da tabela para rolagem. - Sempre inclua um
TableCaptionou umaria-labelnoTable— o componente não adiciona um por você. - Para tabelas interativas (seleção, expansão), combine com
aria-sort,aria-selectedearia-expandedconforme o padrão WAI-ARIA. - Para conjuntos de dados grandes, considere paginar via Pagination ou virtualizar as linhas.