Pular para o conteúdo
caua.tolentino
Todos os projetos
Front-End

Este portfólio

O site que você está vendo. Construí uma base em que cada projeto e cada case é um arquivo MDX validado por schema: o card, a página, a ficha técnica e o índice saem do arquivo, sem mexer em código.

Papel
Design e desenvolvimento
Contexto
Projeto pessoal
Stack
Next.js 16, React 19, TypeScript, Tailwind CSS 4, MDX, Zod, next-intl
Time
Solo
Período
2026
Pagina inicial do portfólio

01. Objetivo

Um portfólio que cresce sem mexer em código

Eu queria mostrar projetos e casos reais de trabalho com profundidade: o problema, a investigação, as decisões e o resultado. Um portfólio assim só se mantém vivo se publicar algo novo for uma tarefa de escrita, não de programação.

Por isso desenhei o site em torno do conteúdo. Cada projeto e cada case é um arquivo .mdx. Criou o arquivo, a página existe: card na listagem e na Home, ficha técnica, índice "Nesta página" e link para o próximo.

  1. Arquivo .mdx
  2. Frontmatter validado
  3. Página gerada no build
  4. Card, ficha e índice automáticos
  5. campo obrigatório faltando: o build falha e diz qual arquivo e qual campo

02. Conteúdo

O schema decide o que cada página pode ter

Defini os metadados com Zod, usando uniões discriminadas: o valor de um campo decide quais outros são obrigatórios. Um projeto feito para alguém exige o cliente e a stack. Um case anonimizado exige um contexto genérico e proíbe o nome da empresa: se alguém colocar, o build falha antes de o texto ir para o ar.

schema.ts
export const caseSchema = z.discriminatedUnion("anonimizado", [
  base.extend({ anonimizado: z.literal(true), contexto: texto }).strict(),
  base.extend({ anonimizado: z.literal(false), empresa: texto }).strict(),
]);

A ficha técnica mostra só os campos que existem em cada arquivo, e as categorias viram os filtros da listagem. Para destacar tecnologias no card sem poluir os filtros, criei um campo separado de etiquetas.

03. Componentes

Blocos próprios para contar um problema técnico

Texto corrido não basta para explicar uma investigação. Criei componentes que podem ser usados direto no MDX: métricas, fluxos com caminho de falha, janelas de código com abas, abas de hipóteses, cards de decisão e notas de destaque. Todos os desta página são eles.

Cada título de capítulo segue o formato "Rótulo | Título": o rótulo vai para o índice lateral e para a numeração, e o título vira uma frase que já diz a conclusão. Por segurança, o MDX aceita só atributos de texto, sem expressões JavaScript.

04. Identidade

Um visual que fala de investigação

Em vez de foto e frase de efeito, o topo da Home conta uma investigação em formato de log, linha a linha, e a seção "Quem sou eu" responde como uma API, com uma requisição e um JSON. É a forma mais direta que encontrei de mostrar como eu trabalho.

Cor

Uma cor para cada tipo de conteúdo

Âmbar sobre azul escuro na identidade e nos projetos, verde azulado nos cases. Quem navega sabe onde está sem ler o título.

Tema

Claro e escuro desde o início

Todas as cores são tokens, definidos uma vez para cada tema.

Tipografia

Manrope e IBM Plex Mono

Uma fonte para leitura e uma monoespaçada para tudo que é código, log ou dado técnico.

Cases

Relatos de trabalho sem capa

Um case é uma situação real, não um produto. Os cards mostram as tecnologias envolvidas no lugar de uma imagem.

05. Decisões

Simples de manter, pronto para crescer

Desempenho

Páginas estáticas

Todas as páginas são geradas no build. Um endereço que não corresponde a um arquivo responde 404, sem consulta nenhuma.

Idioma

Pronto para o inglês

Nenhum texto fica fixo nos componentes: a interface lê de um arquivo de mensagens e o conteúdo de uma pasta por idioma. O inglês entra como uma pasta e um arquivo novos.

Contato

Um schema para o cliente e o servidor

O formulário valida no navegador e de novo numa Server Action, com o mesmo schema. Um campo escondido barra robôs sem captcha, e o envio sai pelo Resend.

Imagens

A versão certa para cada lugar

A mesma capa aparece no card e no topo da página com larguras diferentes. Cada lugar informa a sua largura, e o navegador baixa só a resolução necessária.

06. Resultado

Publicar um projeto é escrever um arquivo

linhas de código para publicar um projeto ou case
0
componentes próprios para os capítulos
6
temas, claro e escuro
2

Os cases deste site foram publicados assim: rascunho, revisão e um arquivo novo na pasta. O mesmo vale para este projeto.