Skip to content

Tokens ​

Os tokens de design fazem parte do design system e servem para padronizar informações referente ao design do projeto. Essas informações normalmente são cores, espaçamentos, tamanhos, fontes e bordas. Um conjunto de tokens pode ser utilizado para crianção de componentes e páginas inteiras. Esses tokens são criados pelos designers, porém isso deve ser feito em conjunto com o time de desenvolvedores pelo fato de que esses mesmos tokens são utilizados na forma de variáveis dentro do CSS e ajudam na organização e padronização do projeto. Também tornam a sincronização entre equipes de design e desenvolvedores muito mais simples.

Podemos classificar os tokens em três categorias: ​

  • Core: Tokens que armazenam os valores brutos e normalmente não são utilizados diretamente no layout do projeto.
  • Layout: São tokens que possuem como valor os tokens core, elas são necessárias para facilitar a manutenção do código. O principal objetivo é reduzir a quantidade de modificações feitas no código CSS, focando as alterações apenas nos valores utilizados pelos tokens. Também são ótimos para projetos que possuem temas variados.
    • Alguns tokens core podem ser utilizados diretamente no layout sem a necessidade de um token de layout, pois seria algo redundante.
  • Components: São exatamente como os tokens de layout, porém são exclusivos para componentes.

Cada uma das categorias tem suas particularidades e isso será explicado com o decorrer da documentação.

Nomenclatura ​

Para que os tokens tenham um mesmo padrão nos nomes é indicado que seja criada uma estrutura de nomenclatura para os tokens. Muitas pessoas se perdem aqui e criam nomes super longos pensando apenas na parte de design, mas esquecem que cada um desses tokens vai ser escrito centenas de vezes no código, então eles precisam ser simples.

A forma que eu considero ideal é criar o nome pensando principalmente no tipo de propriedade que ele representa (cor, fonte, espaçamento, borda etc...), normalmente essa é a primeira coisa que vem ca cabeça quando alguém esta procurando um token especifico.

Um ponto importante que temos que levar em conta é que os tokens não possuem as mesmas especificações. Então alguns tokens acabam ficando um pouco diferentes, menores ou maiores do que outros e isso é normal. O que se deve fazer nesses casos é tentar deixar eles "logicamente" semelhantes, e para isso devemos primeiro criar uma estrutura que contemple todas as variações de nomenclatura.

Estrutura completa ​

Essa estrutura representa todas as especificações que um token pode ter, porém quase nunca todas estarão presente em um mesmo token.

component -> type -> property -> category -> variation -> scale -> unit -> condition

componente -> tipo -> propriedade -> categoria -> variação -> escala -> unidade -> condição

  • component - Qualquer nome que represente o componente que está sendo construído. Obviamente utilizado apenas para tokens da categoria components.
    • Ex: button input link card title accordion
  • type - É tipo de valor que o token representa e sempre vai ser utilizado.
    • Mais comuns:
      • color - Todas as cores do projeto
      • font - size, weight e family das fontes
      • line - Utilizado para altura de linhas de textos, pode ficar junto com as fontes
      • spacing - Todos os tamanhos de espaçamentos utilizados para margin e padding
      • border - width, color e radius das bordas
      • screen - Utilizado para determinar todos os tamanhos de tela que o projeto deve atender
      • container - Utilizado para determinar os tamanhos de container do layout
      • speed - Utilizado para determinar a velocidade das animações de interação (hover, focus)
  • property - Representa a propriedade que o token vai estilizar.
    • Mais comuns: width size weight radius color background text
  • category - Utilizado para criar diferentes categorias de um mesmo tipo de token.
    • Cores
      • primary - Principal cor da marca
      • secondary - Cor secundária da marca
      • tertiary - Terceira cor da marca, porém raramente utilizada.
      • low - Cores neutras escuras
      • high - Cores neutras claras
      • feedback - Cores para mensagens de feedback. Neste caso podemos usar as variações como categoria e não utilizar a palavra feedback.
        • Cores de feedback normalmente são utilizadas diretamente no layout, sem a necessidade de um token de layout, pois já são feitas exclusivamente para mensagens de feedback.
      • cta - Cores exclusivas para links e botões, não muito utilizadas. Normalmente as cores primary e secondary exercem essa função.
  • variation - É um complemento da categoria e é utilizado para criar diferentes variações de uma mesma categoria do token.
    • Cores
      • transparent - Versão com opacidade de uma categoria de cor.
      • Essas são as variações de feedback. Mas também podem ser utilizadas como categoria de cor
        • success - Normalmente tons de verde
        • info - Normalmente tons de azul
        • warning - Normalmente tons de amarelo
        • danger - Normalmente tons de vermelho
  • scale - Representa diferentes escalas de um mesmo token.
    • Cores
      • base - Utilizado para a principal cor da categoria. Pode ter outros nomes como main pure default e core
      • darkest - Escala mais escura
      • dark - Escala escura
      • medium - Escala mediana. Pode ser mais escura ou mais clara do que a base, porém mais escura do que o light e mais clara do que o dark.
      • light - Escala clara
      • lightest - Escala mais clara
    • Espaçamentos, font-size
      • Nessa ordem - nano xxxs xxs xs sm md lg xl xxl xxxl ul
    • border-radius, border-width
      • Nessa ordem - base small medium large
      • Radius também tem o rounded para bordas arredondadas
    • font-weight
      • Segue o padrão das fontes - thin light regular medium semiBold bold black
  • unit - Normalmente utilizado para espaçamentos e fontes. Normalmente na parte de design tudo é trabalhado em pixels, então esse parâmetro não é utilizado por ser óbvio. Mas no desenvolvimento podemos converter um mesmo token para diferentes unidades, então é muito bom utilizar para não se perder nos nomes.
    • Para fontes:
      • rem
    • Para espaçamentos
      • px percent vh vw
  • condition - Indica a condição na qual o token vai ser utilizado.
    • Os mais comuns são: hover focus interaction disabled

Informações úteis

  • color pode ser tanto um type quando uma property
  • Tokens relacionados ao border-color são tokens de layout, pois utilizam os tokens de cor do core como valor.

Agora que já vimos a estrutura completa, vamos ver como essa estrutura é utilizada em diferentes categorias de tokens.

Estrutura Core ​

  • A estrutura normalmente utiliza os seguintes parâmetros:
    • type -> category -> variation -> scale -> unit
scss
// type -> category -> scale
$color-primary-base: #4b1eb6; 
$color-primary-dark: #36138a;
$color-primary-darkest: #270b68;
$color-primary-medium: #4317aa;
$color-primary-light: #5b29cf;
$color-primary-lightest: #7644ec;

$color-low-base: #000000;
$color-high-base: #FFFFFF;

$color-success-pure: #3eac30;
$color-success-dark: #238017;
$color-success-light: #66ce58;	

$color-cta-base: #d438b3;

// type -> category -> variation -> scale
$color-low-transparent-base: rgba(0,0,0, 0.5);

// type -> property -> scale -> unit
$font-size-xs-px: 16px;
$font-size-xs-rem: 1rem;

// type -> property -> scale
$border-radius-base: 4px;

$border-width-sm: 1px;

// type -> scale -> unit
$spacing-xs-px: 16px;
$spacing-sm-px: 20px;

Estrutura Layout ​

  • Normalmente utiliza os seguintes parâmetros:
    • Mais comum: type -> property -> category
    • Ocasionalmente: variation scale condition
  • A nomenclatura desses tokens não deve ter ligação com o nome do token core que esta sendo utilizado como valor, pois ele pode mudar.
  • property mais comuns para tokens de layout são:
    • text - Cor utilizada nos textos do layout
    • background - Cor de fundo utilizada em contraste com o texto
  • text e background sempre trabalham em conjunto, um depende do outro. Sempre existe contraste entre essas duas propriedades.
  • As variações mais comuns são:
    • foreground - Variação de contraste utilizada por cima do token base
    • reverse - Variação inversa do token
scss
// type -> property -> category
$color-text: $color-low-base;
$color-background: $color-primary-lightest;

$color-text-foreground: $color-primary-lightest;
$color-background-foreground: $color-primary-base;

$color-text-reverse: $color-high-base;
$color-background-reverse: $color-primary-darkest;

// type -> property -> variation -> scale
$color-background-transparent-base: $color-low-transparent-base;

// type -> property -> condition
$color-background-hover: $color-primary-light;

// type -> property -> scale
$border-color-base: $color-primary-medium;

Estrutura Components ​

  • Sempre iniciam com o nome do componente
  • Normalmente possui a seguinte estrutura:
    • component -> type -> property -> condition
    • component -> property -> condition
  • Tudo que é utilizado em mais de um lugar no projeto normalmente se torna um componente e os mais comuns são:
    • button
    • link
    • input
    • textarea
    • select - Inputs com dropdown
    • choose - Inputs de radio e checkbox
    • form
    • header
    • footer
    • title
    • icon
scss
// component -> property
$button-color: $color-high-base;
$button-background: $color-primary-base;
$button-padding: $spacing-px-xs $spacing-px-sm;

// component -> property -> condition
$button-color-hover: $color-primary-base;
$button-background-hover: $color-high-base;

// componente -> type -> property
$button-border-size: $border-width-sm;
$button-border-color: $color-high-base;
$button-font-size: $font-size-xs-rem;

// componente -> type -> property -> condition
$button-border-color-hover: $color-primary-base;

Não faça isso! ​

  • Não crie tokens com nomes relacionados ao valor do token, pois se em algum momento o valor do token precisar ser alterado o nome do token também terá que mudar e isso acaba demandando muito mais trabalho.

❌ Errado

scss
$color-primary-purple: purple;
$color-primary-red: red;
$color-primary-green: green;
$color-primary-blue: blue;

// Em outro tema
$color-primary-purple: red;
$color-primary-red: blue;
$color-primary-green: yellow;
$color-primary-blue: green;

✔️ Correto

scss
$color-primary-main: purple;
$color-primary-base: red;
$color-primary-pure: green;
$color-primary-default: blue;

// Em outro tema
$color-primary-main: red;
$color-primary-base: blue;
$color-primary-pure: yellow;
$color-primary-default: green;
  • NÃO crie tokens com nomes relacionados ao tema ou marca do projeto. Isso cria múltiplas variações de um mesmo token de forma desnecessária e torna mais difícil a manutenção do projeto, pois serão muito mais tokens para manter e organizar.

  • NÃO crie muitas variações de tokens de cores, tamanhos, fontes e etc... Como no caso anterior, isso também dificulta a manutenção e prejudica a consistência do projeto. Isso também dificulta ao criar um novo tema ou utilizar os tokens em outra marca, pois se foram criados 100 tokens no core, será necessário alterar o valor desses 100 tokens para cada novo tema e/ou marca que for criada.

Exemplos ​

Vou deixar aqui um exemplo completo com vários tokens que podem existir em um projeto

Cores ​

Os valores são apenas ilustrar os exemplos.

scss
$color-primary-base: #4b1eb6; 
$color-primary-dark: #36138a;
$color-primary-darkest: #270b68;
$color-primary-medium: #4317aa;
$color-primary-light: #5b29cf;
$color-primary-lightest: #7644ec;

$color-low-pure: #242424;
$color-low-dark: #1b1b1b;
$color-low-darkest: #000000;
$color-low-medium: #303030;
$color-low-light: #4b4b4b;
$color-low-lightest: #666666;

$color-high-pure: #c0c0c0;
$color-high-dark: #a0a0a0;
$color-high-darkest: #8d8d8d;
$color-high-medium: #d1d1d1;
$color-high-light: #eeeeee;
$color-high-lightest: #ffffff;

// São tokens `core` que podem ser utilizados como tokens de `layout`
$color-success-pure: #2fac1e;
$color-success-dark: #1b6412;
$color-success-medium: #1e8a10;
$color-success-light: #56cf46;

$color-info-pure: #434cc7;
$color-info-dark: #262c81;
$color-info-medium: #3139aa;
$color-info-light: #7880ee;

$color-warning-pure: #dbc12c;
$color-warning-dark: #96810d;
$color-warning-medium: #bba213;
$color-warning-light: #ecda71;

$color-danger-pure: #c52929;
$color-danger-dark: #7e0a0a;
$color-danger-medium: #b31313;
$color-danger-light: #f35d5d;

Espaçamentos ​

  • Espaçamentos escalam de forma diferente na medida que os valores ficam maiores
    • Em espaçamentos menores qualquer diferença de valor é perceptível no layout 4 para 8 é o dobro do valor
    • Em espaçamentos maiores a diferença precisa ser maior para que haja percepção da diferença de tamanhos no layout 24 para 32
scss
// No lado de design esses valores estarão em pixels 4px, 8px...
$spacing-nano: 4;
$spacing-xxxs: 8;
$spacing-xxs: 12;
$spacing-xs: 16;
$spacing-sm: 20;
$spacing-md: 24;
$spacing-lg: 32;
$spacing-xl: 40;
$spacing-xxl: 52;
$spacing-xxxl: 64;
$spacing-ul: 88;

// Tokens de layout, utilizados apenas no desenvolvimento

// Valores em px 
$spacing-nano-px: #{$spacing-nano}px;

// Valores convertidos para vh (Altura da viewport)
$spacing-nano-vh: convertPxToVh($spacing-nano);

Fontes ​

Fontes menores que 12px não são acessíveis, mas 12 ainda é muito pequeno, tente começar em 14px.

scss
// No lado de design esses valores estarão em pixels 14px, 16px...
$font-size-xxs: 14;
$font-size-xs: 16;
$font-size-sm: 18;
$font-size-md: 24;
$font-size-lg: 28;
$font-size-xl: 36;
$font-size-xxl: 44;
$font-size-xxxl: 52;
$font-size-ul: 64;

// São tokens `core` que podem ser utilizados diretamente no layout, pois seus valores nunca vão mudar
$font-weight-thin: 100;
$font-weight-light: 300;
$font-weight-regular: 400;
$font-weight-medium: 500;
$font-weight-semiBold: 600;
$font-weight-bold: 700;
$font-weight-black: 900;

$font-family-titles: 'Libre Baskerville', serif;
$font-family-texts: 'Roboto', sans-serif;

// No design esses valores normalmente ficam em porcentagem 1.4 = 140%
$line-height-thin: 1;
$line-height-regular: 1.4;
$line-height-medium: 1.6;

// Tokens de layout, utilizados apenas no desenvolvimento
// Valores em rem 
$font-size-xxs-rem: convertPxToRem($font-size-xxs);

Bordas ​

  • São tokens core que podem ser utilizados como tokens de layout
scss
$border-width-base: 2px;
$border-width-small: 1px;
$border-width-medium: 3px;
$border-width-large: 4px;

$border-radius-base: 4px;
$border-radius-small: 2px;
$border-radius-medium: 6px;
$border-radius-large: 10px;
$border-radius-rounded: 50%;

$border-color-pure: $color-low-pure;
$border-color-dark: $color-low-light;
$border-color-darkest: $color-low-darkest;
$border-color-medium: $color-high-darkest;
$border-color-light: $color-high-pure;
$border-color-lightest: $color-high-light;

Tamanhos de tela ​

scss
// No lado de design esses valores estarão em pixels 1600px, 1366px...
// Desktop
$screen-desktop-xl: 1600;
$screen-desktop-lg: 1366;
$screen-desktop-md: 1280;
$screen-desktop-sm: 1080;

// Tablet
$screen-tablet: 962;

// Mobile
$screen-mobile-xl: 768;
$screen-mobile-lg: 640;
$screen-mobile-md: 480;
$screen-mobile-sm: 375;
$screen-mobile-xs: 320;

// Tokens de layout, utilizados apenas no desenvolvimento
// Valores em rem 
$screen-desktop-xl-rem: convertPxToRem($screen-desktop-xl);

Containers ​

  • Dependem do tamanho de tela que o designer utilizou para criação do layout.
  • São tokens core que podem ser utilizados como tokens de layout
scss
$container-base: 1406px; 
$container-small: 1320px;

Velocidade de interação ​

  • São tokens core que podem ser utilizados como tokens de layout
scss
$speed-base: 250ms;
$speed-slow: 350ms;
$speed-fast: 180ms;

Tokens de layout ​

scss
$color-text: $color-low-base;
$color-background: $color-primary-lightest;

$color-text-foreground: $color-primary-lightest;
$color-background-foreground: $color-primary-base;

$color-text-reverse: $color-high-base;
$color-background-reverse: $color-primary-darkest;

$color-background-transparent-base: $color-low-transparent-base;

$color-background-hover: $color-primary-light;

$border-color-base: $color-primary-medium;

Tokens de component ​

scss
// Button
$button-color: $color-primary-base;
$button-color-hover: $color-primary-base;
$button-color-focus: $color-primary-base;
$button-color-disabled: $color-low-medium;

$button-background: $color-primary-darkest;
$button-background-hover: $color-primary-medium;
$button-background-focus: $color-primary-medium;
$button-background-disabled: $color-high-dark;

$button-border-color: $color-primary-darkest;
$button-border-color-hover: $color-primary-medium;
$button-border-color-focus: $color-primary-base;
$button-border-color-disabled: $color-high-dark;

$button-padding: $spacing-xs-vh $spacing-md-vh;
$button-font-size: $font-size-xs-rem;

// Link
$link-color: $color-primary-base;
$link-color-hover: $color-primary-darkest;

// Input
$input-color: $color-primary-base;
$input-color-hover: $color-primary-base;
$input-color-focus: $color-primary-base;
$input-color-disabled: $color-low-medium;

$input-placeholder-color: $color-primary-base;
$input-placeholder-color-hover: $color-primary-base;
$input-placeholder-color-focus: $color-primary-base;
$input-placeholder-color-disabled: $color-low-medium;

$input-background: $color-primary-darkest;
$input-background-hover: $color-primary-medium;
$input-background-focus: $color-primary-medium;
$input-background-disabled: $color-high-dark;

$input-border-color: $color-primary-darkest;
$input-border-color-hover: $color-primary-medium;
$input-border-color-focus: $color-primary-base;
$input-border-color-disabled: $color-high-dark;

$input-padding: $spacing-xs-vh $spacing-md-vh;
$input-font-size: $font-size-xs-rem;

Released under the MIT License.