Pedro Mantovani · Design System
voltar ao portfólio
DESIGN.mdv alpha

O sistema, escrito para pessoas e para a IA que constrói com ele.

Este é o design system do próprio site, no formato DESIGN.md: o documento que captura cor, tipografia, espaçamento, componentes e o raciocínio, para uma pessoa nova e para a IA que constrói, manterem consistência. Não é vitrine, é o arquivo, renderizado. Troque o tema no topo e a página inteira re-tematiza a partir dos tokens.

15 tokens de cor15 espelhados no tema escuro10 componentes renderizados6 estados no botãocontraste AA verificadoversão alpha
##Visão geral

Editorial e técnico. Nada aleatório.

Um canvas de papel quase branco ritmado por zonas full-bleed grafite e preto. A voltagem vem de um azul elétrico usado com restrição, contra tinta preta e uma voz técnica monoespaçada. A tipografia é uma família só, Switzer, em duas vozes: um display fino e um corpo humanista.

##Cores

Um acento, escasso por regra.

Não existe um segundo acento. O azul primary marca a ação principal e o estado ativo, nada além disso. As superfícies carregam o ritmo claro para escuro; o texto corre em três pesos de tinta. O tema escuro espelha cada token e é uma troca na raiz, não uma segunda versão de cada tela.

Marca e acento
primary#2B49FF5,75:1 · texto sobre papel
primary-active#1E38D87,70:1 · texto sobre papel
primary-soft#EDEFFF17,34:1 · tinta sobre ele
Superfície
canvas#FAFAFA18,97:1 · tinta sobre ele
surface-soft#F4F4F618,02:1 · tinta sobre ele
surface-graphite#11111617,14:1 · claro sobre ele
surface-black#06060818,43:1 · claro sobre ele
Texto e semântica
ink#0A0A0A18,97:1 · sobre papel
body#6E6E704,87:1 · sobre papel
success#107C415,05:1 · sobre papel
danger#CD2B315,05:1 · sobre papel
##Arquitetura de token e movimento

Nada pula a fila.

O token vive em três camadas. A interface e a IA consomem o semântico, nunca o primitivo. É isso que faz o tema escuro ser uma troca na camada semântica, e não uma segunda versão de cada tela, e faz uma marca nova herdar o sistema trocando só a base.

Primitivo
blue-600
#2B49FF

O valor cru, sem opinião de uso.

Semântico
primary

O papel que o valor cumpre. Aponta para blue-600. É a camada que a interface consome.

Componente
button-primary-bg

O token amarrado a um lugar. Aponta para primary.

Movimento como token

Duração

fast120ms · press, hover
base220ms · reveal, estado
slow420ms · superfície

Easing e mola

standardcubic-bezier(.32,.72,0,1)
moladamping .82 · response .4
reveal≤16px · interrompível
##Tipografia

Uma família, duas vozes.

Switzer na interface inteira: um display fino em peso 200 com tracking negativo, e um corpo humanista em 400. Uma face monoespaçada carrega eyebrows, números e legendas, a voz de especificação.

Craft como prova
display-xl · Switzer 200 · 60/1.05 · -1.8
Título de seção
display-md · Switzer 200 · 34/1.1 · -0.8
Título de componente
title-lg · Switzer 600 · 22/1.2
O texto que carrega a leitura, em humanista 400 com entrelinha aberta para o conforto em passagens longas.
body-md · Switzer 400 · 15/1.6
Seção · Eyebrow · Rótulo
eyebrow · SF Mono · 11 · +2.2 · caixa alta
Tracking é específico do tamanho. Display grande vai negativo, corpo em zero, eyebrow mono positivo. Nunca um valor único para tudo.
Peso carrega mais hierarquia do que tamanho. O display é fino de propósito; deixá-lo em negrito quebra a voz.
A entrelinha aperta conforme o tamanho cresce. ~1.05 no display, ~1.6 no corpo.
##Layout

Base 4px, nunca número mágico.

A escala de espaçamento parte de 4px. O ritmo de seção e a goteira são fluidos (clamp), então respiram no desktop e apertam no mobile. O espaço em branco é estrutural, não sobra.

xxs · 4px
xs · 8px
sm · 12px
md · 16px
lg · 24px
xl · 40px
xxl · 64px

Grid e contêiner

Conteúdo centralizado, máximo entre 1180 e 1680px. Corpo de texto limita em ~62ch. Uma coluna por padrão; múltiplas só onde a relação é real.

Goteira e seção

Goteira clamp(20px, 4.5vw, 64px), seção clamp(64px, 10vh, 120px). A densidade reduz nas telas menores, não encolhe por igual.

##Elevação e profundidade

Profundidade discreta. Zero ornamento.

Bordas de fio mais sombras longas, suaves e de baixa opacidade. O peso do material codifica hierarquia: superfície maior, blur mais forte e sombra mais profunda. Nunca empilhe uma superfície translúcida sobre outra. Profundidade decorativa não existe, por regra.

Fio1px hairline
Cardshadow -22px / .28
Elevadoshadow -40px / .5
##Formas

Raio hierárquico.

O raio de borda cresce com o tamanho do elemento: apertado nos controles, generoso nos painéis, pílula na navegação. Chrome de produto real sobre ilustração abstrata; quando uma imagem não justifica o lugar, vira índice de texto.

sm · 10px
md · 14px
lg · 18px
xl · 24px
pill · 999px
##Componentes

Ao vivo, com o token ao lado.

Cada componente aparece renderizado, com a especificação em mono logo abaixo, referenciando o token. É o mesmo componente que roda no site, re-tematizado com o resto da página.

tema
estado
densidade
primary superfície altura

36px só em superfície de mouse. O alvo de toque mínimo continua 44px, e no celular a densidade compacta não se aplica.

Pílulas flutuantes sobre o conteúdo. O conteúdo rola por baixo do material translúcido, nunca pelos vãos entre as pílulas.
Só existe um botão primário por tela. Excluir nunca usa a cor primária: destrutivo não compete com a ação que a pessoa veio fazer.
O rótulo fica acima do campo e continua visível depois de preenchido. Marca-d’água sozinha não é rótulo.
ConcluídaAgendado
O estado se lê pela palavra, e a cor só reforça. Badge nunca é o único portador da informação.
Duas a quatro opções mutuamente exclusivas, todas visíveis. Mais que quatro vira seletor.
Título do bloco
A linha de apoio cabe em duas linhas e para aqui.
rodapé opcional
Cartão separa objetos, não decora blocos. Se tudo é cartão, nada tem hierarquia.
Alterações salvas
Aviso rotineiro é toast e não bloqueia o fluxo. Modal só quando a decisão precisa parar a pessoa.
Ver extratolink neutro
primeira linha1.240,00
segunda linha320,00
Valor alinhado à direita e em numeral tabular, para a coluna poder ser comparada de cima a baixo.
--acc: #2B49FF;
--radius: 14px;
A janela de código carrega o token de verdade, lido do sistema. Nunca é imagem e nunca é exemplo inventado.
button · especificação, medida nesta página
estadotokenvalora regra
Repouso{colors.primary}#2B49FF · #6E8BFF no escuroBranco sobre primary mede 6,0:1, acima do mínimo AA
Hover{colors.primary-active}#1E38D8Só a superfície muda. Sem deslocar e sem crescer
Foco{colors.primary-soft}anel de 4pxVisível ao teclado, sem depender do mouse
Desabilitadoopacidade45% · dessaturação 25%Não recebe foco, e o rótulo continua legível
Altura padrãoalvo de toque44pxVale em toda superfície. É a regra que a página publica
Altura compactaalvo denso36pxSó em superfície de mouse. No celular não se aplica
Raioraio de controle10pxO controle usa o raio menor da escala
Transiçãoduração curta120ms · ease-outSó cor e anel. Transformação só quando o gesto pede
##Estados

Cada estado, especificado.

Componente sem estado documentado empurra a decisão para quem implementa, e é onde a IA e o júnior mais erram. Todo componente interativo carrega a matriz; toda superfície de dado carrega os estados de tela. Ao vivo.

Botão
defaultSalvar
hoverSalvar
focoSalvar
pressSalvar
desabilitadoSalvar
carregandoSalvar
Campo
default
foco
erro
Falta o domínio depois do @.
Estados de tela
empty
Nenhuma transação ainda.Suas transferências aparecem aqui.Nova transferência
loading
error
Não foi possível carregar.Verifique a conexão e tente de novo.Tentar de novo
##Faça e não faça

As regras que dizem quando.

Os tokens dizem o que as coisas são. Estas regras dizem quando usar cada uma, em português claro, ao lado dos tokens. É a camada que um colega novo, ou uma IA montando uma tela, erra sem ser avisado. Cada regra elimina uma decisão errada; ao lado, a prova do que quebra sem ela.

Regra · Hierarquia

Só existe um botão primário por tela.

Sem ela: a IA cria dois botões cheios disputando a atenção, os dois "certos" pelas cores do sistema, e ninguém sabe qual é a ação principal.

Sem a regra
SalvarPublicar
Com a regra
SalvarPublicar
Regra · Ação destrutiva

Excluir nunca usa a cor primária.

Sem ela: "Excluir conta" ganha o mesmo peso visual de "Salvar", e o erro irreversível fica a um toque de distância.

Sem a regra
Excluir conta
Com a regra
CancelarExcluir conta
Regra · Interrupção

Modal só bloqueia o fluxo. Aviso comum é toast.

Sem ela: qualquer aviso rotineiro vira uma janela no meio da tela e interrompe quem estava no meio de uma tarefa.

Aviso em modal
Salvo com sucessotoque para continuar
Aviso em toast
Salvo com sucesso
O conjunto completo
Faça
Um botão primário por tela. O preenchimento azul marca a única ação principal; o resto é secundário ou ghost.
Ação destrutiva anda com um Cancelar neutro, e usa o estilo danger. Excluir nunca parece Salvar.
Use toast para confirmação rotineira. Reserve o modal para a decisão que bloqueia o fluxo.
Valor monetário é tabular e alinhado à direita. As colunas precisam alinhar para o olho comparar.
Reduza informação nas telas pequenas. Nem tudo precisa viajar para o mobile.
Espace em tokens. Se um valor não está na escala de 4px ou em token nomeado, não entra.
Alterne as bandas: papel, grafite, preto. O claro para escuro é a cadência; use a zona escura como palco do produto ao vivo.
Eyebrows e números em mono, caixa alta. É a voz de especificação que sinaliza sistema em uso.
Não faça
Não coloque dois botões azuis na mesma tela. Dois primários é nenhum primário.
Não pinte de azul uma ação destrutiva. Mesmo peso de Salvar é uma armadilha que o token evita.
Não transforme aviso rotineiro em modal. Um toast informa sem parar a tarefa.
Não use um segundo acento. O azul único é a voltagem da marca; um arco-íris de estados dilui.
Não flutue vidro decorativo ou card órfão. Se não está sobre conteúdo real, não pertence.
Não use travessão na copy de interface. Reescreva com dois-pontos, vírgula ou ponto.
Não repita o mesmo modo de superfície em duas bandas seguidas. O ritmo alterna; duas zonas iguais matam a cadência.
Não encha a tela de movimento. Reveal ≤16px com easing de mola; nada de slide duro ou parallax gratuito.
##Acessibilidade

Número, não intenção.

O sistema documenta o contraste por par de token e não deixa texto significativo abaixo de AA (WCAG 4.5:1). A régua abaixo é o próprio sistema, medido.

ink sobre canvas
19.0:1AAA
primary sobre canvas
5.7:1AA
body e faint sobre canvas
4.9:1AA
body e faint sobre a pílula, a superfície mais escura do tema claro
4.6:1AA
branco sobre primary
6.0:1AA
primary do tema escuro sobre o canvas escuro
6.3:1AA
ok sobre a superfície mais escura do tema claro
4.7:1AA
danger sobre a superfície mais escura do tema claro
4.7:1AA
ok do tema escuro sobre a superfície mais escura
6.4:1AA
danger do tema escuro sobre a superfície mais escura
5.0:1AA
faint-decorative sobre canvas
2.5:1só ornamental

A regra de craft que sai daqui

A hierarquia do texto secundário vem do registro (mono, caixa alta, tracking), não de contraste abaixo de AA. O eyebrow lê como secundário porque muda de voz, não porque some. Os tokens de texto deixaram de ser opacidade e viraram hex: a opacidade resolvia em 4.48:1, meio ponto abaixo do mínimo, enquanto a documentação registrava a aproximação que passava. Medido e documentado passaram a ser o mesmo valor.

Foco, alvo e movimento

Foco visível obrigatório: anel de focus-ring, nunca só cor, via :focus-visible. Alvo de toque ≥44px no mobile. Reduced-motion troca slide e mola por cross-fade; reduced-transparency deixa os materiais sólidos.

##Comportamento responsivo

Reduzir, não encolher por igual.

A informação se adapta por breakpoint. No mobile e tablet, o meta lateral some, o grafo de conhecimento vira texto (ruído quando espremido), e a nav ganha uma borda de rolagem fosca para o conteúdo ler por baixo. Alvos de toque ficam sempre ≥44px.

≥ 1200pxGrid de desktop completo. O herói divide em copy e agente ao vivo.
de 820 a 1199pxTablet. Os itens da pílula de nav colapsam em um único controle Menu.
≤ 767pxMobile. Tudo empilha em uma coluna, o display reduz de tamanho.
≤ 560pxCompacto. Logo e CTA viram círculos de 46px, o texto do CTA cai para o ícone.
##Guia de iteração e lacunas

Vivo, e honesto sobre o que falta.

Como isto evolui

Token antes de valor. Todo componente novo documenta a regra de comportamento, não só a aparência. Movimento é desenhado junto com os pixels. Quando um valor é questionado, ele é defensável a partir deste documento.

Lacunas conhecidas

  • A escala de tipo aqui é fixa; em produção é fluida (clamp) e reduz por breakpoint.
  • Os tokens de texto deixaram de ser opacidade em 02 e 03/11/2026, nos dois temas: documento e tela leem o mesmo hex.
  • Tokens de visualização de dados ainda não formalizados.