← Todos os cases

Design system · Código · 2022

Um design system multimarca em Vue

O teste técnico do processo seletivo da Meiuca, em janeiro de 2022. A Meiuca mandou o layout no Figma, e eu construí o sistema inteiro em código: tokens, componentes que mudam de marca por configuração, documentação no Storybook e testes visuais.

Empresa
Processo seletivo da Meiuca
Papel
Tokens, componentes, documentação e testes visuais
Time
Só eu
Período
Janeiro de 2022
Ferramentas
Style Dictionary, Vue, TypeScript, Storybook, Loki
Resultado
Levou à contratação pela Meiuca, consultoria de design systems

Contexto

O teste técnico do processo seletivo da Meiuca, consultoria de design systems de clientes como Itaú e Banco BV. A Meiuca mandou um arquivo do Figma com o layout, e o teste era transformá-lo num design system em código. O projeto já tinha duas ideias que uso até hoje: tokens como fonte única e componentes que mudam de marca por configuração.

Problema

Montar um conjunto pequeno de componentes que servisse a mais de uma marca sem ser copiado, e documentado de um jeito que outra pessoa conseguisse usar sozinha.

Meu papel

A partir do Figma da Meiuca, fiz tudo sozinha: os tokens, os componentes, a documentação no Storybook e os testes visuais. O código está no repositório meiuca-test, no GitHub.

Processo

O sistema tem um caminho só, do valor ao componente:

  1. 1. Tokens em JSON86 valores em 12 categorias, num arquivo só (properties/tokens.json).
  2. 2. Style DictionaryTransforma o JSON em variáveis CSS e num enum TypeScript. O mesmo valor serve ao estilo e ao código.
  3. 3. Componentes baseBotão, título, subtítulo, parágrafo e forma. Só leem tokens.
    4. Componente compostoO cartão de conteúdo, montado só com os componentes base.
    5. MultimarcaO que muda entre marcas entra por propriedade. Mesmo componente, outra marca.
  4. 6. Storybook + LokiCada estado documentado como história, e cada história comparada com uma imagem de referência para acusar mudança visual antes do merge.
Categoria de tokenQuantos
Sombra16
Espaço (inset e squish)25
Tamanho, peso e família de fonte, altura de linha19
Cor de marca e neutra10
Raio, borda e opacidade16
Storybook ao vivo: navegue pelos componentes e mude as propriedades Abrir o Storybook em tela cheia ↗
O Storybook original, compilado a partir do código de 2022.

Decisões

  1. Um arquivo de tokens como fonte única O que vi

    O mesmo valor de cor, espaço ou fonte precisava servir ao CSS e ao código TypeScript.

    O que decidi

    Colocar os 86 valores, em 12 categorias, num único properties/tokens.json, e deixar o Style Dictionary gerar as variáveis CSS e o enum TypeScript.

    Por quê

    Cada valor existe num lugar só, e uma mudança chega ao estilo e ao código ao mesmo tempo.

  2. A marca entra por propriedade O que vi

    Os componentes precisavam servir a mais de uma marca sem ser copiados.

    O que decidi

    O que muda de uma marca para outra, como a cor do botão, entra por props. Os componentes base só leem tokens, e o cartão de conteúdo é montado só com eles.

    Por quê

    É o mesmo componente em outra marca, sem duplicar código.

  3. Teste visual no Storybook O que vi

    Num sistema compartilhado, uma mudança pequena pode alterar a aparência de vários componentes sem que ninguém perceba.

    O que decidi

    Documentar cada estado como uma história e comparar cada história com uma imagem de referência, com o Loki.

    Por quê

    Qualquer mudança visual aparece antes do merge.

Resultado

O teste levou à contratação pela Meiuca. Revendo o projeto hoje, faria três coisas diferentes.

  • Contraste: o botão padrão usa texto branco sobre o laranja #F04E23, com 3,6:1, abaixo do mínimo de 4,5:1. Hoje todo par de cor de texto passa por uma checagem automática, como no sistema deste portfólio.
  • Marca como tema: passar a cor em cada componente funciona, mas espalha a decisão por todos eles. Hoje eu usaria tokens semânticos com um modo por marca, como fiz com o tema escuro no design system da Appmax.
  • Fonte no Storybook: a Archivo estava nos tokens, mas não era carregada, e o Storybook mostrava tudo em Times. Corrigi para esta publicação.