Frontends com Vibecoding · Capítulo 16 de 33 · 14 min
Dimensionar tabelas e organizar o cálculo das métricas
Você dimensiona a tabela pesada pelo volume medido e decide, pela frequência de consulta, em que momento cada métrica é calculada.
Este capítulo faz parte do curso gratuito Frontends com Vibecoding.
A tabela que roda bem com 30 linhas de teste engasga quando um cliente abre a mesma tela com 30 mil. O degrau certo se escolhe medindo o volume real no computador mais fraco disponível. Quem decide a tela de dados da própria empresa fica com cinco degraus, o momento de calcular cada número e o relatório offline.
O primeiro degrau é a tabela nativa do navegador, o <table> de sempre. Custa quase nada, nasce acessível e aguenta poucos milhares de linhas com algarismos tabulares (dígitos de largura igual, que alinham em coluna) e folha de impressão.
Vem depois a tabela virtualizada, que desenha só as linhas visíveis no momento, como a vitrine que troca de produto conforme você anda. Essa virtualização vai confortável até perto de 100 mil linhas, com o TanStack Virtual. O preço é que a busca do navegador só acha o que está desenhado naquele instante.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Em React, a base desse degrau é a TanStack Table v9. Ela é headless, ou seja, calcula ordenação, filtro e paginação e deixa o desenho com você, como um motor sem carroceria. Paginação é quebrar a lista em páginas de tamanho fixo, para o navegador não carregar tudo de uma vez.
O terceiro degrau é a grade que calcula, a tabela que faz conta dentro da própria célula. O AG Grid trouxe fórmulas e totais por grupo, e vira uma mini-planilha sem passar pelo Excel. MUI X Data Grid e Mantine DataTable resolvem o mesmo quando o design system, a caixa de peças da marca, já é esse.
Milhões de células pedem canvas. O Glide Data Grid desenha em pixels e, por isso, exige uma camada ARIA paralela, as etiquetas que descrevem cada célula ao leitor de tela. O desenho em si devolve nada a quem não enxerga.
Pivô é a tabela que cruza duas dimensões e soma o que cai em cada cruzamento. O AntV S2 monta um com milhões de células em menos de quatro segundos. O VTable faz o mesmo e deixa abrir cada total até a linha que o originou.
Planilha de verdade, com fórmula, tabela dinâmica e edição a várias mãos, é outro produto e outro orçamento. O Univer é o sucessor oficial do Luckysheet, que foi declarado sem manutenção, e o Fortune-sheet é o caminho de migração com menos atrito.
O degrau da tabela pelo volume e pela função
| Degrau | Volume e função | Ferramenta | Preço a pagar |
|---|---|---|---|
| Tabela HTML | Até poucos milhares de linhas, leitura e ordenação simples | <table> nativo, algarismos tabulares e folha de impressão | Quase nenhum; nasce acessível |
| Só o visível na tela | De algumas centenas a cerca de 100 mil linhas | TanStack Table v9 com TanStack Virtual | A busca do navegador só acha o que está desenhado |
| Grade que calcula | Fórmula, agregação e edição na própria célula | AG Grid 35 e 36; MUI X Data Grid ou Mantine DataTable no design system da casa | Licença e peso de pacote |
| Milhões de células | Pivô e rolagem em massa | Glide Data Grid em canvas; AntV S2 (pivô em menos de 4 s); VTable | Camada ARIA paralela obrigatória |
| Planilha embutida | Fórmula, tabela dinâmica e edição a várias mãos | Univer; Fortune-sheet na migração do Luckysheet | Um produto inteiro para manter |
Suba de degrau só depois de medir com o volume real, no computador mais fraco disponível.
A frequência com que o número muda decide quando ele é calculado. Se muda uma vez por dia, calcule antes de publicar e sirva um retrato pronto, leve e imprimível. Se muda com o filtro de quem lê, consulte a fonte a cada visita e aceite que a infraestrutura cresce com a audiência.
Se muda várias vezes por segundo, como cotação ou telemetria, um motor dentro do navegador absorve o fluxo sem redesenhar a tela inteira. Escreva a fórmula de cada indicador uma vez só, no arquivo que todas as telas leem, como a aula anterior mostra. Todo número responde em dois cliques de onde veio: origem, data, responsável e definição.
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
O relatório offline seguro é um arquivo HTML único que carrega o banco de dados dentro do próprio navegador. Wasm é código compilado que roda na página quase na velocidade de um programa instalado, como um motor de aplicativo dentro do navegador.
Com cerca de 400 KB comprimidos, o SQLite Wasm basta para guardar tabelas e consultá-las no aparelho. O PGlite é um Postgres real em Wasm, com cerca de 3,3 MB, e só compensa quando você precisa mesmo dos tipos e das extensões do Postgres.
Já o DuckDB-Wasm segue defasado do núcleo nativo, e por isso não conte com paridade de recursos ao planejar o relatório.
Numa distribuidora, a lista de pedidos do mês roda na tabela nativa, e o histórico de anos pede o TanStack Virtual. A tabela de preço com margem por cliente pede a fórmula do AG Grid. O representante que visita cliente sem sinal leva o relatório de estoque num HTML único com SQLite Wasm, e fecha o pedido na hora.

Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
Antes de aprovar a próxima tela pesada, gere um arquivo de teste com o volume real esperado. Abra a tela no computador mais fraco disponível. Escolha o degrau pela tabela desta aula, nunca pelo nome da biblioteca. Deu certo quando a rolagem não engasga e cada número mostra origem, data e responsável em dois cliques.
Guia prático: tabela como placar, especificada antes de pedir
Tabela pedida por adjetivo volta com colunas a mais, números desalinhados e nenhuma ideia do que aparece quando falta dado. A biblioteca de 648 prompts estudada em 07/10/2026 dá a pista do método: 163 prompts usam "exatamente" para fixar quantidades, e os que desenham placar ou tabela comparativa nomeiam cada coluna e fixam o número de linhas, como cinco colunas com nome e dez linhas num ranking. Se até um modelo de imagem precisa disso para acertar, o agente que escreve a sua tabela também.
O template de painel contábil da galeria, estudado no mesmo dia, mostra o que acontece sem essa especificação. A tabela de contadores tem sete colunas (contador, equipe, clientes, abertas, em atraso, SLA e ações), mas é feita com caixas em grade, sem elemento table: o leitor de tela não sabe que é uma tabela, e o projeto inteiro tem zero atributos aria e zero role. A página não tem nenhuma variação para celular, com 80 pixels fixos de margem lateral e quatro cartões lado a lado. Só a coluna de ações se alinha à direita, e o projeto soma 39 usos de texto de 10 a 12 pixels.
O que o template acerta merece cópia: um estado vazio completo, com título, explicação e duas ações (cadastrar um a um ou importar planilha), e um aviso de configuração incompleta que diz o que fazer. A lição: escreva a tabela como placar antes de pedir, com colunas, alinhamento, formato de cada número e os três estados.
/* Base de uma tabela de números legível, em CSS próprio. */
.placar { border-collapse: collapse; width: 100%; }
.placar caption { text-align: left; font-weight: 600; padding-block: 0.5rem; }
.placar th { text-align: left; font-weight: 600; }
.placar th, .placar td { padding: 0.625rem 0.75rem; border-bottom: 1px solid var(--linha); }
/* Colunas de número: à direita e com dígitos de largura igual. */
.placar .num { text-align: right; font-variant-numeric: tabular-nums; }
/* Destaque nunca só pela cor: a célula também diz "atrasado" em texto. */
.placar .atraso { color: var(--alerta); font-weight: 600; }
/* No celular, a tabela rola dentro do próprio contêiner, não a página. */
.placar-rolagem { overflow-x: auto; }Da tabela pedida por adjetivo ao placar especificado
Cinco passos para a próxima tabela de painel, de preços ou de comparação.
Passo 1: Escreva colunas, linhas e ordem
Liste cada coluna com nome, tipo (texto, número, data, moeda, porcentagem) e unidade. Diga quantas linhas aparecem por padrão e por qual coluna a tabela vem ordenada.
Deu certo quando: O pedido tem a lista de colunas com tipo e a ordenação padrão.
Erro comum: Deixar o agente escolher as colunas e receber oito, das quais você usa quatro.
Passo 2: Peça o elemento table com cabeçalho de verdade
Tabela de dados usa table, caption, th com scope e td. Caixas em grade só servem para layout. Com isso, o leitor de tela anuncia a coluna de cada célula.
Deu certo quando: O leitor de tela lê o nome da coluna junto de cada valor.
Erro comum: Aceitar uma grade de caixas que parece tabela e é invisível para quem não enxerga.
Passo 3: Alinhe números à direita com dígitos iguais
Coluna numérica vai à direita, com font-variant-numeric: tabular-nums, mesmo número de casas decimais e separadores do pt-BR. Assim milhar fica sob milhar.
Deu certo quando: Os valores de uma coluna se comparam de cima a baixo sem esforço.
Erro comum: Números alinhados à esquerda, com casas decimais diferentes em cada linha.
Passo 4: Desenhe os três estados
Carregando, vazio e com erro, além do estado cheio. O vazio diz por que está vazio e oferece a próxima ação; o erro diz o que tentar.
Deu certo quando: Os quatro estados existem e você viu cada um na tela.
Erro comum: Testar só com dados de exemplo e descobrir o vazio no primeiro dia do cliente.
Passo 5: Confira no celular e com dado real antes de publicar
Abra a tabela em 390 pixels com o volume real de linhas. Ela rola dentro do próprio contêiner, a primeira coluna continua legível e o texto respeita o piso do projeto.
Deu certo quando: A página não ganha rolagem lateral e cada linha se lê no celular.
Erro comum: Aprovar a tabela com três linhas de teste e margens fixas pensadas para tela larga.
No fim você tem: Uma tabela especificada como placar: colunas e linhas definidas, estrutura que o leitor de tela entende, números alinhados e os estados que o dia a dia vai mostrar.
Gestor de um escritório de contabilidade em Ribeirão Preto que monta o painel interno de demandas da equipe
Serviços contábeis, operação interna
Dor
O painel gerado listava os contadores numa grade bonita, mas as colunas de atraso e SLA não se comparavam de cima a baixo, e a tela quebrava no notebook pequeno da sócia.
Solução
Ele reescreveu o pedido como placar: seis colunas com tipo e unidade, ordenação por atraso, números à direita com dígitos iguais, elemento table com cabeçalhos e os estados vazio e de erro descritos.
Resultado
A equipe passou a achar o contador com mais atraso na primeira linha, e a tabela ficou legível no notebook e no celular.
Cenário construído para fins didáticos. Números não correspondem a cliente específico.
Aplicar os recursos ao projeto
Se a figura ultrapassar a área visível, deslize para os lados. Pelo teclado, foque a figura e use as setas.
TanStack Table cuida do comportamento da tabela e não encosta na aparência. Ela organiza coluna, linha, ordenação e filtro, e você decide como desenhar cada pedaço na tela. Dá para seguir o visual do seu produto, mas o HTML correto, o foco, os rótulos e os avisos ficam com a sua equipe.
Descreva as colunas de pedidos com accessorKey e entregue os registros ao modelo de linhas. Em React, chame useReactTable e desenhe cabeçalho e célula numa tabela HTML de verdade, com um botão claro para ordenar. Deixe o filtro ativo à vista e escreva o aviso de nenhum pedido encontrado.
Virtualização, memória do filtro e paginação no servidor não vêm de brinde. Decida que fatia dos dados está carregada e evite ordenar só a página atual quando a pessoa espera o conjunto todo. Teste teclado, célula vazia e número negativo; no modo offline, leve todos os registros que você prometeu.
AG Grid entrega uma grade de dados com navegação, ordenação e edição prontas. Compensa quando a tabela é ferramenta de trabalho, e não uma lista para ler. As funções se dividem entre modalidades de licença, então liste exatamente o que o seu produto vai usar antes de fechar a conta.
Defina columnDefs para cliente, data e valor, e passe rowData com identificador que não muda. Libere edição só nos campos permitidos e valide a alteração antes de gravar. Mostre o erro colado na célula e deixe um caminho de desistir que devolva o valor original sem perder o registro.
Recurso Enterprise roda liso na demonstração e ainda assim cobra licença no seu produto. Confira módulo, contrato e versão antes de distribuir qualquer coisa. Teste teclado, exportação, filtro e volta da edição. Para offline, mantenha dados e bibliotecas na pasta e veja se alguma operação ainda chama um servidor de fora.
Filtre os dados e observe a paginação
A tabela mantém os cabeçalhos e mostra somente a página escolhida. Os registros são fictícios e a busca roda nesta demonstração.
| Oficina | Situação |
|---|---|
| Oficina Centro | Confirmada |
| Oficina Jardim | Pendente |
| Oficina Norte | Confirmada |
Paginação limita os registros exibidos por vez. Virtualização limita os elementos montados durante a rolagem; ela exige outra estratégia e não acontece nesta amostra.
Seu caderno neste capítulo
Abrir o caderno completoSelecione um trecho do capítulo para destacar ou anotar. Nos vídeos e áudios, use Anotar este momento. No teclado, selecione com Shift e as setas e use Alt+Shift+D para destacar ou Alt+Shift+N para anotar.
Salvo neste navegador. Entre na sua conta para levar o caderno a outros aparelhos.
Entre na sua conta para compartilhar o que aprendeu e convidar alguém para estudar com você.
Conexões deste capítulo
Veja o que estudar antes e para onde seguir depois, explore os conceitos e compare abordagens em outros cursos. Sugestões marcadas como “sugerido pelo grafo” vêm dos assuntos em comum, não do índice do curso.
Estude antes
- CursoClaude Code CLI: Programação com IA
- Montar vídeo em HTML com HyperFrames e escolher entre ele e o Remotionsugerido pelo grafoApresenta o conceito “HTML”, usado em “Dimensionar tabelas e organizar o cálculo das métricas”.
- CursoVídeo com IA: Claude Code, Codex e ElevenLabssugerido pelo grafo20 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Vídeo com IA: Claude Code, Codex e ElevenLabs”.
- CursoNode.js: JavaScript no Servidorsugerido pelo grafo20 capítulos de “Frontends com Vibecoding” usam conceitos apresentados em “Node.js: JavaScript no Servidor”.
Depois, siga para
- CursoPrompt Engineering para Executivossugerido pelo grafo7 capítulos de “Prompt Engineering para Executivos” usam conceitos apresentados em “Frontends com Vibecoding”.
- CursoLLM FinOps: o custo da IA para quem assina o orçamentosugerido pelo grafo3 capítulos de “LLM FinOps: o custo da IA para quem assina o orçamento” usam conceitos apresentados em “Frontends com Vibecoding”.
Conceitos deste capítulo
O mesmo assunto em outros cursos
- Search Console para decisãoDeclare o que o dado esconde antes que alguém chame de erroExaminar conexões de Declare o que o dado esconde antes que alguém chame de erro
- SO nativo de IATelas que parecem o que o time já usaExaminar conexões de Telas que parecem o que o time já usa
- SEO ProgramáticoTestar o template no pior caso e achar o tetoExaminar conexões de Testar o template no pior caso e achar o teto
- Software e IA para executivosCobrar o desenho das tabelas antes de aprovar o sistemaExaminar conexões de Cobrar o desenho das tabelas antes de aprovar o sistema
Voltar ao capítulo anterior: Projetar gráficos e painéis pela decisão
Leve uma ideia para a prática
Escolha uma atividade no painel e volte a este curso quando quiser.
Atividades e evolução ficam reunidas no painel da sua conta.
Laboratórios ao vivo deste curso
Cada laboratório monta a biblioteca real dentro da aula, com controles para você mexer e o código do exemplo para copiar. O texto de reserva descreve a demonstração para quem lê sem JavaScript. O link abre o capítulo já no ponto do laboratório.
Base UI
Prenda o foco num diálogo sem escrever o comportamento
Abra a janela Agendar visita, percorra os campos com Tab, feche com Esc e acompanhe no painel onde o foco está e para onde ele volta.
Pacote
Abrir no capítuloConstruir componentes, usar o registro e publicar o catálogo@base-ui/reactLucide e Iconify
Mantenha uma família de ícones coerente e nomeie cada botão
Mude tamanho, traço e cor da barra, veja o símbolo do Iconify acompanhar o Lucide e rode a auditoria de nomes acessíveis.
Pacote
Abrir no capítuloProjetar uma linguagem de ícones e ilustraçãolucide-react, @iconify/reactMotion
Testar os três sinais que autorizam o terceiro degrau
Reproduza a entrada em sequência, aperte o botão com mola e arraste o cartão; ajuste rigidez e amortecimento e veja o que muda.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagemmotionVidstack
Ver o que separa um player de um vídeo cru
Dê o play, troque a velocidade e ligue a legenda; o painel ao lado mostra o estado que o player publica e que a etiqueta crua esconde.
Pacote
Abrir no capítuloProjetar movimento, assinatura e narrativas por rolagem@vidstack/reactcmdk
Achar um destino entre quarenta digitando três letras
Abra a paleta, digite fat e escolha um item só pelo teclado; o painel embaixo conta o que o filtro deixou passar e quanto tempo levou.
Pacote
Abrir no capítuloConstruir formulários e estados de interaçãocmdknumber-flow
Animar indicadores que mudam ao vivo com formato pt-BR
Veja três indicadores fictícios rolarem a cada troca e compare com o número em texto puro. Pause, reinicie e observe o separador de milhar.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisão@number-flow/reactApache ECharts
Medir o custo de desenhar 200 mil pontos com o ECharts
Troque o tipo de gráfico e o volume de pontos, leia o tempo de desenho e alterne o eixo em zero. Mude o tema do site e veja as cores refazerem.
Pacote
Abrir no capítuloProjetar gráficos e painéis pela decisãoechartssharp e svgo
Escolher a variante certa da imagem e conferir o teto de 150 KB
Arraste a largura da tela simulada, troque a densidade entre 1x e 2x e veja qual arquivo o navegador escolhe, quanto ele pesa e se cabe no orçamento.
Pacote
Abrir no capítuloValidar desempenho, autenticação e segurançasharp, svgoReact Flow (xyflow)
Disparar um pedido e ver o orquestrador distribuir, conferir e responder
Alterne paralelo e sequencial, ligue e desligue a verificação e use a medição real; observe o tempo de parede em cada combinação.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robô@xyflow/reactGSAP, Web Workers e number-flow
Dividir mil tarefas entre trabalhadores reais e correr três ritmos de geração
Execute com um trabalhador, depois com quatro e oito, e compare o tempo; em seguida percorra a corrida e separe a espera inicial do ritmo.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôgsap, @number-flow/reactThree.js com React Three Fiber, drei, Rapier e XR
Carregar o braço robótico, ver a física trabalhar e entrar na cena com o visor
Carregue a cena pelo botão, inicie o ciclo, mostre os ângulos das juntas, troque a câmera e a velocidade; com visor, entre em realidade virtual.
Pacote
Abrir no capítuloConstruir as cenas do orquestrador, do paralelismo e do robôthree, @react-three/fiber, @react-three/drei, @react-three/rapier, @react-three/xrMotion
Ver quatro agentes em raias trocando mensagens e a revisão devolvendo um trecho
Reproduza os 60 s de modelo, percorra o tempo pelo controle e esconda as mensagens para comparar a leitura; repare no tempo de parede contra a soma.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinamotionMediaRecorder, Canvas 2D e Long Animation Frames (plataforma)
Medir o quadro da cena e gravar seis segundos dela em vídeo
Suba as partículas, force um bloqueio de 300 ms e leia o medidor; depois grave seis segundos, veja o codec escolhido e baixe o arquivo.
Pacote
Abrir no capítuloEspecificar, medir e produzir as cenas da máquinasem pacotesigma.js, graphology com ForceAtlas2 e cosmos.gl
Ver o grafo real do curso e um grafo de milhares de nós se organizarem em aglomerados
Rode o layout no grafo real, passe o mouse pelos nós e busque uma entidade; troque para 20 mil nós e leia o medidor; depois carregue o modo massivo na placa de vídeo.
Pacote
Abrir no capítuloAnimar um grafo de conhecimento amplo em movimentosigma, graphology, graphology-layout-forceatlas2, graphology-generators, @cosmos.gl/graph
Capítulos vizinhos em Frontends com Vibecoding
- 14Publicar conteúdo encontrável em vários idiomas
- 15Projetar gráficos e painéis pela decisão
- 16Dimensionar tabelas e organizar o cálculo das métricas
- 17Escolher mapas, diagramas e cenas espaciais
- 18Comparar direção visual em Stripe e Apple