📊 Cenário: dados que querem ser história
Você tem uma planilha: país, ano, população. São apenas números até que D3 os converta em barras que crescem, trocam de posição e revelam o drama geopolítico de quatro décadas. O espectador não lê a tabela — ele assiste a ela acontecer.
Por que D3 para este projeto?
D3 é a única lib da stack com escalas nativas (linear, band, time) e gerenciamento de transições de dados. Você não calcula pixels manualmente — você define domínio e range, e D3 resolve a geometria. GSAP animaria o visual, mas não entenderia os dados.
✓ D3 é ideal quando…
✗ D3 não é a melhor escolha quando…
🏃 Bar Race: o coração do projeto
A cada frame do Remotion, o dataset do ano correspondente é lido, as barras são reordenadas e as posições Y interpoladas suavemente. Quando a China e a Índia trocam de lugar, o bar race pausa por 12 frames — o momento dramático.
💡 A pausa dramática
Quando ocorre mudança de liderança, adicione 12 frames de pausa antes de reordenar. É o equivalente cinematográfico de um close-up — dá ao espectador tempo para processar o que acabou de acontecer.
📐 Escalas D3 no contexto Remotion
A integração D3+Remotion funciona porque D3 calcula geometria e Remotion avança no tempo. A cada chamada de useCurrentFrame(), você computa o frame de dados correspondente e deixa D3 mapear pixels.
const frame = useCurrentFrame(); const fps = useVideoConfig().fps; const year = Math.floor(interpolate(frame, [0, durationInFrames], [1990, 2030])); const data = getDataForYear(year); const xScale = scaleLinear().domain([0, maxPop]).range([0, width]); const yScale = scaleBand().domain(data.map(d => d.country)).range([0, height]);
🏷️ Labels, Ano e Legibilidade em Movimento
Labels que seguem as barras são a alma do bar race. O contador de ano no canto inferior direito ancora o espectador no tempo. Ambos precisam ser calculados no mesmo frame — sem estado separado.
✓ Boas práticas de label
✗ Erros comuns
💡 Contador de ano como âncora
O ano grande no canto é a bússola do espectador. Tamanho mínimo: 64px, opacidade 0.5–0.7 para não competir com as barras. Use font-variant-numeric: tabular-nums para evitar que os dígitos "pulem" ao mudar.
💬 O Prompt Completo
Este é o prompt literal que você dá ao Claude Code. Cada instrução mapeia para um comportamento específico do bar race — o Claude gera a composição Remotion com D3 integrado em uma resposta.
Create an animated bar race showing the ten most populous countries from 1990 to 2030. Animate transitions smoothly. Display ranking changes in real time. Pause briefly when leadership changes.
💡 Por que "Pause briefly when leadership changes"?
Esta instrução específica faz o Claude implementar a pausa dramática. Sem ela, a reordenação ocorre em tempo contínuo e passa despercebida. Com ela, o espectador tem o momento cinematográfico de "espera, a Índia passou a China!"
♻️ Deliverable e Reusabilidade
O deliverable é um vídeo infográfico estilo YouTube — mas o componente é um template parametrizado que funciona com qualquer dataset de ranking temporal. Troque a planilha, mude o título, renderize outro vídeo.
Build order: da planilha ao vídeo
Preparar o dataset
JSON array de objetos {country, year, population}. Dados para 1990, 2000, 2010, 2020, 2030. Interpolar anos intermediários.
Montar escalas e estático
Valide que as barras aparecem no tamanho correto sem animação. Confirme que o ranking do ano 1990 está certo.
Conectar frame ao tempo
Use interpolate() para mapear frame → ano. Adicione a pausa nos anos de mudança de liderança.
Polish: cores, tipografia, música
Adicione identidade visual por país, fonte bold para os números, e trilha sonora dramática (Trilha 4).
📋 Resumo do Módulo 3.2
- ✓D3 transforma dados em história — escalas automáticas, sort dinâmico, transições
- ✓Pausa dramática na mudança de liderança = momento cinematográfico do bar race
- ✓Labels seguem as barras; contador de ano é a âncora temporal do espectador
- ✓Cor por país persistente permite acompanhar um país pelo vídeo inteiro
- ✓Deliverable: template reutilizável para Finanças, Esportes, Política, Economia
Próximo módulo:
🏍️ Módulo 3.3 — Motorcycle Commercial (Three.js) →