Convenções
As regras que todo componente do DS segue, e como ele ganha uma página aqui.
design-system/CONVENTIONS.md
O guia de convenções da lane líder do DS ainda não existe no repositório.
Quando chegar, ele passa a ser a referência e esta página aponta pra ele. Até
lá, valem design-system/contract.md e code-plan.md §3, resumidos abaixo.
Código
- Um arquivo por componente em
packages/ui/src/<família>/<kebab>.tsx, comindex.tsda família (sem"use client"),<kebab>.examples.tsx,<kebab>.test.tsxe<kebab>.figma.tsx. - Autocontido: só imports relativos,
_lib/*e@base-ui/react,class-variance-authority,clsx,tailwind-merge,motion,lucide-react,react. Nada de@/,next/*,next-intlou store. É isso que deixa o docs importar o componente sem cópia. - API = propriedades do Figma:
variant,size,toneem camelCase;Statenão é prop (hover, foco e pressionado são interação;disabled,loading,invalid,selectedsão props). Ícones sãoleadingIcon/trailingIcon(um elemento lucide). - Polimorfismo pelo
renderdo base-ui. SemasChild, sem Radix. - Estados forçados: use
ds-hover:,ds-focus:,ds-pressed:em vez dehover:,focus-visible:,active:. Eles também disparam comdata-ds-state, o que permite mostrar todos os estados lado a lado. - Proibido: hex/rgb literais,
opacity-50pra desabilitado, cor de texto sem token semântico.
Marca e acessibilidade
- Roxo é ação primária e identidade; amarelo é atenção; lilás é superfície calma; vermelho só pra falha que para a proteção ou confirmação destrutiva.
- Foco visível: anel de 2 px na cor
color/focus-ring, com 2 px de folga. - Alvo ≥ 44 px nos tamanhos de celular. Status nunca só por cor.
- Copy de exemplo em pt-BR, sem vocabulário de vigilância.
Responsivo
- Duas larguras de referência: celular 390 e desktop 1440. A rota
/__dsdo platform renderiza cada matriz nas duas, em iframes, porque media query precisa de viewport de verdade. - Tamanhos de toque: no celular, controles usam os tamanhos 44 e 48 (alvo
≥ 44 px). 32–40 e a escada densa
xs–lgsão pra desktop e backoffice. - Espaçamento:
px-gutter(16 px) é a margem lateral no celular;gap-sectionsepara seções (64 px no desktop, 48 px no celular, pelospacing/12do Figma). - Raio dos painéis:
rounded-panel-phone(28 px) erounded-panel(40 px).
Como um componente ganha página aqui
Sozinho. Cada matriz registrada no examples.ts da família vira uma página em
Componentes, na pasta da família, com a descrição tirada do doc comment do
componente, um playground (Fumadocs Story), todas as células da matriz e a
tabela de props tirada dos tipos. A lane só precisa:
- registrar a matriz no
examples.ts(já faz parte do trabalho, por causa do/__ds); - escrever o doc comment do componente e das props, em inglês.
Notas de uso opcionais vão em apps/docs/content/ds-notes/<família>/<componente>.mdx.
Detalhes no README.md de apps/docs.
