Tabela
Em andamentoDado em linhas e colunas: a grade de um curso, a carga horária por módulo, a lista de inscritos de uma turma. A legenda é obrigatória e dá nome à tabela; o cabeçalho que ordena é um botão; a tabela larga rola dentro da própria caixa.
- Função
- Conteúdo
- Também chamado de
- table, tabela de dados, grade, data table, lista de inscritos
- Mora em
- app/components/molecules/Tabela.tsx
- Última mudança
- 2026-09-30
Prévia
A peça ao vivo, vinda da ficha, na largura escolhida. Em larguras fixas, ela roda num quadro do tamanho de uma tela de verdade.
Na largura da página: 0px
Variantes na ficha
Lidas da ficha no build, na ordem do palco. Cada uma abre sozinha, sem o styleguide em volta — é o endereço que o palco carrega.
Quando usar
Quando a pessoa compara valores entre linhas pela mesma coluna: carga horária, datas, situação de inscrição, notas.
Faça
- Escreva uma
legendaque diga de quê é a tabela ("Grade do MBA em Fisiologia do Exercício"); com o título da seção dizendo o mesmo,legendaOculta. - Marque o
cabecalhoDaLinha: a coluna que nomeia a linha (o módulo, a pessoa) vira<th scope="row">, e o leitor diz o nome junto de cada valor. - Número, preço e carga horária com
alinhamento: "fim": alinhados à direita, com algarismos de mesma largura. - Célula com Badge ou link e coluna ordenável: passe
valorParaOrdenar, para comparar o valor e não o desenho. - Numa página de servidor (Server Component), não passe função (
chaveDaLinha,valorParaOrdenar): a Tabela é de cliente, e o Next não serializa função. Sem elas, a tabela funciona; com elas, monte-a num componente de cliente (achado da E120).
Evite
- Tabela para o que tem uma coluna só: é uma lista.
- Ordenar tudo: só a coluna em que a ordem ajuda a decidir.
- Estado só por cor na célula: use o Badge, que tem texto.
Quando não usar. Para comparar planos lado a lado, com preço e chamada: os cartões do PricingCards. Para uma lista de itens com ação em cada um (cursos, eventos): cartões. Para diagramar a página: nunca — tabela é dado, não grade de layout.
Anatomia
As partes, na ordem em que o olho — e o teclado — passam.
- Legenda — O `<caption>`: nome da tabela e da região que rola. Visível por padrão, em negrito.
- Cabeçalho — Rótulos em 12px, caixa alta, `--muted-foreground`; o ordenável é um botão com o ícone da ordem.
- Linhas — Separadas por `--border`; listradas em `--muted` por padrão. A primeira coluna pode ser o cabeçalho da linha, em semibold.
- Caixa — Borda e raio da superfície; rola na horizontal quando a tabela não cabe.
Estados
Os estados que a peça tem no código, e o que muda em cada um.
| Estado | O que muda |
|---|---|
| Sem ordem | O ordenável mostra as duas setas pequenas. |
| Ordenada | A coluna mostra a seta da direção, o rótulo em --ink e aria-sort no cabeçalho. |
| Vazia | Uma linha com a mensagemVazia, centralizada, ocupando todas as colunas. |
| Rolável | A caixa entra no Tab e mostra o anel de foco; sem transbordar, não entra. |
Comportamento
| Situação | O que acontece |
|---|---|
| Clique ou Enter num cabeçalho ordenável | Ordena crescente; de novo, decrescente. A troca é anunciada ("Ordenado por Carga horária, crescente") — testado na ficha. |
| Ordenação controlada | Com ordenacao, a tabela mostra a ordem que recebe e só avisa por onOrdenar: quem ordena é quem chama (no servidor, por exemplo). |
| Tabela mais larga que a caixa | Rola dentro dela; a caixa vira parada de Tab e rola pelas setas — testado na ficha. |
Relacionados
Como usar no código
A importação e o menor uso, lidos do arquivo. O … marca as props obrigatórias.
import { Tabela } from '@/app/components/molecules/Tabela';
<Tabela legenda={…} colunas={…} linhas={…}>…</Tabela>Propriedades
Lidas do código da peça no build — não escritas à mão.
| Prop | Tipo | Padrão | Obrigatória | Descrição |
|---|---|---|---|---|
densidade | 'padrao' | 'compacta' | 'padrao' | não | Variante do cva. |
legenda | string | — | sim | Obrigatória: é o <caption>, o nome da tabela e da região que rola. Sem ele, quem usa leitor de tela ouve "tabela, 4 colunas" e não sabe de quê. |
legendaOculta | boolean | false | não | Esconde a legenda da tela (continua para o leitor). Use quando o título da seção já diz o mesmo. |
colunas | ColunaDaTabela[] | — | sim | — |
linhas | LinhaDaTabela[] | — | sim | — |
chaveDaLinha | (linha: LinhaDaTabela, indice: number) => string | — | não | A chave de cada linha para o React. Sem ela, a posição — que muda ao ordenar. |
cabecalhoDaLinha | string | — | não | A coluna que dá nome à linha (o curso, a turma): vira <th scope="row">. |
listrada | boolean | true | não | Linhas alternadas em --muted (padrão). |
ordenacao | OrdenacaoDaTabela | null | — | não | Ordenação controlada. Sem ela, a tabela ordena sozinha a partir de ordenacaoInicial. |
ordenacaoInicial | OrdenacaoDaTabela | null | null | não | — |
onOrdenar | (ordenacao: OrdenacaoDaTabela) => void | — | não | Chamado a cada clique num cabeçalho ordenável, com a ordenação nova. |
mensagemVazia | React.ReactNode | 'Nada para mostrar.' | não | O que aparece no corpo quando não há linha. |
Aceita também: Omit<React.HTMLAttributes<HTMLDivElement>, 'children'>.
Tokens de cor
Os tokens semânticos que o código da peça usa, com o valor de hoje em app/globals.css.
| Token | Valor | Usado como |
|---|---|---|
--border | #E5E5E5 | border-border |
--card | #FFFFFF | bg-card |
--foreground | #1A1A1A | text-ink |
--muted | #F4F6F9 | bg-muted |
--muted-foreground | #595959 | text-muted-foreground |
Teclado
| Tecla | Faz |
|---|---|
| Tab | Entra na caixa, se ela rola, e passa pelos botões de ordenar do cabeçalho. |
| EnterEspaço | No cabeçalho, ordena pela coluna; de novo, inverte. |
| ←→ | Com a caixa em foco, rola a tabela na horizontal. |
Leitor de tela
O que é anunciado, e por quê.
- A legenda nomeia a tabela e a região que rola: "Grade do MBA…, tabela".
- Com
cabecalhoDaLinha, cada valor é lido com o nome da linha e o da coluna. - A ordem está no
aria-sortdo cabeçalho, e a troca é dita uma vez numa região viva.
O que sustenta o estado
Esta peça usa regiaoViva. O estado dela é o de quem já foi ouvido com leitor de tela nesses padrões — e não uma passada sobre esta peça em específico.
Falta ouvir: regiaoViva — ver docs/a11y-screen-reader-checklist.md.
Status e recursos
| Tipo | Recurso | Status |
|---|---|---|
| Código | app/components/molecules/Tabela.tsx | Disponível |
| Ficha | Storybook (abre em outra aba) | Disponível |
| Teste de acessibilidade | axe em npm run test | No gate de todo commit |
| Leitor de tela | Passada da E33 | Falta ouvir |
| Design | Figma | Desativado até a Fase 2 |
Histórico
Os últimos commits que tocaram o arquivo, lidos do git no build.
0298af82026-09-30E147: fechamento da Entrega 11 — REPORT.md, verificação cross-agent e o gate estático estrito
O histórico completo está no GitHub (abre em outra aba).