Touch Grass: design system brutalista open source

Categoria:
Design de produto
Papel:
Autor do projeto (design e implementação)
Período:
2026

No Touch Grass, parti de uma direção visual para construir componentes e tokens que pudesse implementar e verificar. O sistema conecta CSS, Tailwind, Figma e JavaScript/TypeScript, com testes e documentação pública.

Fonte: repositório, pacotes publicados no npm e auditoria automatizada de 14/04/2026. Repositório (github.com) Abre em nova abaPacote React (npmjs.com) Abre em nova abaPacote de tokens (npmjs.com) Abre em nova aba

Documentação do Touch Grass: o padrão FocusTimerDisplay, tela principal do Timeouts, com o tempo longe da tela naquele dia, a comparação com ontem, a sequência de dias, a posição no ranking e o botão para começar o foco

Desafio

Construir um design system com identidade visual própria, tokens compartilhados entre CSS, Tailwind, Figma e JS/TS, testes e documentação pública. A direção visual adotou cantos retos, tipografia em duas famílias (Geist Sans e Geist Mono) e restrições explícitas para guiar a implementação.

Solução

Decisões de design: cantos retos em todos os componentes, duas famílias tipográficas, Geist Sans para texto e Geist Mono para números, rótulos e dados, e carregamento com bloco de caractere em vez de spinner. Os tokens saem de uma fonte única em JSON, e o Style Dictionary gera variáveis CSS, tema Tailwind, JSON para o Figma e constantes JS/TS. A governança fica no código, com um teste de contrato de contraste e um plugin de ESLint próprio. Na execução, usei Claude Code com especificação curta, plano em etapas, testes escritos antes dos componentes e revisão por um agente separado. As decisões de design acima foram minhas.

Resultados

10 componentes básicos e 9 padrões compostos, 23 arquivos de teste e dois fluxos de CI. Na auditoria automática de 14/04/2026 com axe-core, as 27 páginas de documentação tiveram 0 violações e 687 verificações aprovadas; o resultado vale para aquela execução, feita em ambiente local. Os pacotes @touch-grass-ds/react e @touch-grass-ds/tokens estão publicados no npm com licença MIT. Limite: é um projeto autoral, sem equipes usando o sistema nem métrica de adoção.

Galeria

Recortes da documentação pública, capturados em outubro de 2026.

Cor: preto, branco, verde-limão e vermelho, com o contraste medido de cada combinação, inclusive as que não atingem o mínimo exigido
Tipografia: Geist Sans para títulos e texto corrido, Geist Mono para números, rótulos e dados, e a escala de pesos
Bordas: fina para a estrutura, branca para limites importantes, verde-limão para o estado ativo, vermelha para perigo e tracejada para o estado desabilitado
Movimento: duração zero, sem transições nem animações, e uma exceção registrada para o flash da câmera
PatternInterruptModal: as regras de texto do aviso, como nomear a perda, falar direto com a pessoa, escrever a ação principal como frase e nunca chamar a saída de "Cancelar"

Principais aprendizados

O agente seguiu o que estava escrito na especificação, como o carregamento com bloco de caractere. O que eu não escrevi apareceu na revisão: o agente revisor notou que o Button não definia type="button" por padrão, e um clique dentro de um formulário acabava enviando o formulário.

Precisa transformar um problema de produto em uma experiência implementável?

Posso ajudar a conectar estratégia, interface e engenharia em uma entrega que continua legível depois do handoff.