Opium.Fill - padronização do esquema de cores através dos olhos do programador

Rosto azul, cogumelos crescem dos olhos

Ei. Hoje vou mostrar o esquema de cores que tenho usado nos últimos 2 anos. Foi inventado para se livrar de um grande número de variáveis ​​em CSS em um projeto problemático. E então descobriu-se que esses princípios podem ser aplicados a quase qualquer projeto.

Em geral, tentarei explicar como os designers usam cores na interface do usuário e como tudo isso pode ser "digitado" sem empurrar os designers para quadros apertados. Vou dar exemplos de implementação no React JS (para o desenvolvedor) e na Figma (para o designer). O esquema não tem ligações com React e Figma, é só que eu estou mais familiarizado com eles.

Não há nada de astuto e único no esquema (talvez apenas um nome). Todas as idéias estão no ar. Você pode adotá-lo como minha melhor prática para trabalhar com cores em aplicativos. Opium.Fill - estes são princípios gerais combinados com o amor para dar nomes a tudo.

O sistema pode ser usado em conjunto com o Material Design.

O artigo foi escrito para o desenvolvedor front-end e um pouco para o designer.

Índice


  1. Que problemas resolvemos
  2. Ideologia Opium.Fill
  3. Suposições básicas
  4. Bloco nº 1. Cores pai
  5. Bloco No. 2. Substituição
  6. Bloco No. 3. Turnos
  7. Inversão de cores
  8. Usando
  9. Quando não faz sentido usar
  10. Crítica
  11. Conclusão

Todas as imagens são clicáveis

1. Que problemas resolvemos?


1.1 50 tons de cinza


Provavelmente todos estão familiarizados com esse problema. Na maioria das vezes, pode ser visto em tons de cinza, mas com outras cores (por exemplo, azul) isso acontece. Onde colocar, onde usar? Até os designers estão confusos sobre isso.

1.2 Designer brinca com flores


Às vezes, um designer pode entregar uma nova cor simplesmente porque a antiga está cansada e detestada (ou porque perdeu uma pipeta). Não há nada de errado nisso, você não precisa culpar o designer. Mas o problema é que o desenvolvedor nem sempre está ciente das mudanças.

Nesse caso, muitas variáveis ​​de cores se acumulam. Afinal, o desenvolvedor não entende se é necessário remover cores antigas ou se elas ainda são usadas em algum lugar. Dos projetos que vi, o registro é de 273 variáveis ​​somente de cores.

Uma situação semelhante pode ocorrer em todos os projetos em que o trabalho é feito no Agile e o design muda simultaneamente com o desenvolvimento.

1.3 Temas noturnos e design de marca


Esse problema decorre do anterior. Se o projeto possui muitas variáveis ​​desordenadas, é difícil introduzir novos esquemas de cores.

Por exemplo, você está trabalhando na criação do CRM. E o seu CRM oferece ao cliente a oportunidade de ajustar seu esquema de cores à identidade corporativa do cliente. Se você não tiver um esquema de cores claro, será difícil fazer isso.

Mas e se você precisar de um tema sombrio para o aplicativo? Em seguida, a frase "Vasily, vamos pegar nossas 273 variáveis ​​e sistematizá-las" leva ao fato de que Vasily quebrou o formulário na 10ª etapa do preenchimento do aplicativo, brigou com o desenvolvedor do departamento vizinho e enlouqueceu uma semana depois.

2. A ideologia do ópio.


2.1 Não incomode o designer para trabalhar


O Opium.Fill foi inventado para "decifrar" o design e não para carregar o designer. O designer não precisa saber sobre a existência do ópio. Preencha para fazer tudo de acordo com o esquema.

Você não deve impor um esquema de cores ao designer e é melhor esperar até que ele termine de desenhar o conceito principal do aplicativo. Somente depois disso é útil mostrar a ele se algo não se encaixa no esquema de cores e esclarecer se esses locais podem ser corrigidos. Em 9 de 10 perguntas desse tipo, os designers dizem "Pf, isso não é um problema, vamos substituí-lo" ou "Ah, e isso geralmente não é possível, obrigado por perceber".

2.2 Definir cores "a olho"


De acordo com a tabela periódica, é possível prever a existência de elementos ainda não descobertos. Para isso, células vazias foram pré-alocadas. Usaremos esse princípio para o nosso esquema de cores. Faça uma mesa e deixe algumas células em branco. Mas, para o restante dos parâmetros, você entenderá, mesmo a olho, que cor deve estar lá.

tabela periódica


2.3 Não desanime se nem tudo acontecer


Nossa tarefa é otimizar a maior parte rotineira do trabalho com cores. Se, indicando a cor ao desenvolver o aplicativo, 1 em cada 100 vezes você encontrar algo que não se encaixa no circuito, isso não é considerado um problema.

3. Premissas básicas


3.1 Para cada cor - um par


Acreditamos que cada cor tem duas "encarnações". O primeiro é saturado (condicionalmente forte). O segundo é insaturado (condicionalmente fraco). Se virmos azul, além de ser azul, devemos defini-lo como Forte ou Fraco. É saturado ou insaturado?

3.2 Divida cores por funcionalidade


Esqueça "azul-céu", "ouro", "preto-azeviche" e coisas semelhantes nos nomes das cores. O nome da cor deve refletir sua funcionalidade, não seu hexadecimal. Agora, estamos trabalhando com os seguintes nomes: Base, Fraco, Sotaque, Complemento, Crítico, Aviso, Sucesso.

3.3 Três blocos


O bloco número 1 é o mais importante. O bloco número 3 é o mais sem importância. Abaixo vou descrever cada um dos blocos. Essa separação é necessária para que as cores menos significativas para desenhar a interface nos distraiam menos.

4. Número do bloco 1. Cores dos pais


4.1 Nomes


De volta aos nossos novos nomes de cores. Base, Fraco, Sotaque, Complemento, Crítico, Aviso, Sucesso. Vamos levá-lo um de cada vez.

Base


Isso é preto e branco. Ou aquelas cores que são semelhantes a elas em certo grau de confusão. Eles são básicos para texto e plano de fundo.

Cores preto e branco


Desmaiar


Então, chamamos tons de cinza. Algum texto em segundo plano ou um fundo acinzentado é Fraco. Preto com transparência (se for percebido como cinza) também está incluído aqui.

Cor cinza adicionada


Sotaque


Essa é a principal cor corporativa ou a cor que destaca os elementos mais importantes da interface. Por exemplo, se você olhar para os bancos russos, então: Sberbank é verde, VTB é azul (ou vermelho, como você pode ver), Tinkoff é amarelo, Alpha é vermelho. Por conveniência, vamos nos referir a tons de azul em nossa tabela em Accent.

Cor azul adicionada


Complemento


Essa é uma cor de destaque opcional. Nem todo mundo tem. Vamos dar uma olhada no Airbnb - eu diria que é verde escuro: para nossa conveniência, indicarei Complemento em roxo, será útil para nós nos exemplos de design que mostrarei abaixo.

Roxo adicionado




Screen Airbnb


Crítico


Cor para destacar erros e outras informações extremamente significativas. Geralmente algo vermelho.

Cor vermelha adicionada



Atenção


Se você deseja compartilhar informações críticas com outra pessoa, também importante, mas não mortal, é necessário Aviso. Geralmente este é um tipo de amarelo-laranja.

Adicionado cor laranja


Sucesso


Às vezes, uma ação bem-sucedida é suficiente para mostrar a cor Accent. Mas se o Accent é de uma cor incomum (vermelho) ou por algum motivo você deseja introduzir uma nova cor, aqui está o Sucesso. Muito provavelmente, será esverdeado. 7 nomes básicos de cores foram lançados. Não é necessário usar todos eles. E, é claro, você pode complementar o aparelho se tiver um motivo sério para isso.

Verde adicionado




4.2 Famílias de cores


Você provavelmente já percebeu que quando falo de cor, não indico um significado específico, mas uso as palavras "tons de cinza", "algo vermelho", "esverdeado" etc. Isso não é exatamente assim. Vamos apresentar o conceito de "Família de cores".

Como eu disse acima, dividimos as cores em pares. Apenas Accent não pode existir. Certifique-se de ter Sotaque forte e Sotaque fraco. Essas são sempre exatamente as duas cores que formam a base da família. Como pai e mãe. Vamos imaginar por um tempo que nossas cores são um casal. Suponha que não importa qual seja o sexo dos pais, o principal é que um seja forte (forte) e o segundo - fraco (fraco). E também aceitaremos que força e fraqueza são traços de caráter, como temperamento rápido e calma.

Esquerda Forte, Direita Fraca




Então aqui. Papai é de temperamento quente. Ele geralmente fica nervoso em engarrafamentos e chuta ouriços na floresta. Mamãe está calma. Ela trabalha como psicóloga e joga pôquer. Esta é a base do nosso esquema de cores.

As cores base já estão divididas (preto e branco). Divida o restante em famílias:

Todas as cores são divididas em 2. Uma é saturada, a segunda quase imperceptível.


5. Bloco No. 2. Substituição


5.1 Contexto


Dê uma olhada no Bitbucket. Em seguida, o designer considerou que a cor azul, que fica na parte traseira esquerda, é um pouco escura para o texto. E então ele o iluminou. Agora, todo o texto, embora pareça azul (como um menu lateral), na verdade tem um significado diferente em hexadecimal: qualquer cor tem um contexto no qual é usada. A cor pode ser aplicada ao plano de fundo, texto, linhas, ícones. Isso é o que chamamos de contexto. Em qualquer um desses casos, a cor pode precisar ser alterada de alguma forma, para melhor se adequar ao contexto. Chamamos essa mudança de Substituição . Selecionamos um lugar na tabela para substituições. Cada nova linha é um contexto para o qual podemos adicionar substituições. Por padrão, haverá células vazias:

Screen Bitbucket






A mesma lista de cores, dividida em duas, mas foram adicionadas linhas adicionais.  Vamos chamar de mesa.


Adicionamos células de substituição apenas para cores fortes. As cores Fracas no bloco 2 mostram como essa cor fica em um fundo escuro. Enquanto não vamos tocá-los, mas no final retornaremos a eles.

Se a substituição não for preenchida, a cor do texto, ícones e tudo mais
será retirada do bloco nº 1.
Nota. Só podemos substituir cores em elementos de design primitivos. Esse conjunto é obtido quase 1: 1 dos editores gráficos usados ​​pelos designers. Lá, você pode desenhar um retângulo (plano de fundo), adicionar um bloco de texto, desenhar uma linha ou adicionar uma forma incomum, como um asterisco (leia o ícone).

5.2 Chique


Existe outro tipo especial de substituição - substituição pelo gradiente. Chamamos gradientes a palavra fantasia - contexto para uma "ocasião especial". A fantasia é uma para todos. Não pode haver gradiente separado para texto, ícones etc. (em teoria, é claro, pode, mas não vale a pena tornar a tabela mais difícil devido a um caso tão raro). Vamos destacar o lugar na parte inferior da tabela para o Fancy: preparamos as mudanças dependendo do contexto, os designers fazem 100%. Células vazias nos dão alguma flexibilidade. Às vezes, as substituições precisam ser feitas com mais frequência, às vezes com menos frequência. Se o bloco número 2 permanecer quase vazio, isso é normal (o designer também tenta reduzir o número de cores).

Outra linha adicionada à tabela




6. Número do bloco 3. Turnos


Às vezes, a cor precisa ser ligeiramente escurecida ou iluminada. Mas isso não ocorre porque o contexto mudou, mas simplesmente que cada cor tem dois estados adicionais: "mais escuro" e "mais claro". Na maioria das vezes, os designers usam isso para fazer uma reação do mouse. Chamamos essa mudança de cor de Shift. Você pode mudar para cima (mais escuro) ou para baixo (mais claro). Uma tabela vazia agora se parece com isso:

Acima é uma cor escura.  Down - luz




Tabela, mas agora cada cor tem células extras na parte superior e inferior


7. Inversão de cores


Eu deliberadamente não falei sobre isso imediatamente, porque é raro e nem todos precisam. Às vezes, você deseja escrever algo em um substrato escuro, mas nem todas as cores são adaptadas para isso. Vejamos um exemplo de um de nossos projetos: Há texto em uma placa azul, que é subjetivamente percebida como Fraca. E existem círculos sob os ícones que eu também definiria na família Faint.  Se o dado fosse leve, esses dois elementos provavelmente seriam cinzentos. Mas o dado está escuro. Não há cores correspondentes em nossa tabela, você pode adicioná-las. Para isso, você precisa da coluna Fraca no bloco No. 2. Para esse layout, a tabela se parece com isso:

Design de aplicativo de banco móvel








Na tabela, outra parte das células é preenchida, a maioria permanece vazia


Observe que agora as linhas serão desenhadas com um leve fraco forte, isso também é refletido na tabela. Também foram adicionados gradientes para Accent e turnos para o pai Fraco (eles são úteis para desenhar um campo de pesquisa).
Nota. Não há necessidade de confundir inversão e tema noturno. O tema noturno tem muitas de suas nuances em cores. Portanto, é melhor criar uma tabela separada para ela.

8. Use


8.1 CSS, React


Vamos tentar desenhar esse botão.No CSS puro, as variáveis ​​podem ser organizadas da seguinte maneira:

Botão




:root {
  /*   */

  --base-strong: #000;
  --base-weak: #fff;

  --faint-strong: #8994A6;
  --faint-weak: #F6F8FB;

  --accent-strong: #0070FF;
  --accent-weak: #EBF4FF;

  --complement-strong: #8889E2;
  --complement-weak: #EEECFD;

  --critic-strong: #F74545;
  --critic-weak: #FDEDED;

  --warning-strong: #F8AE4F;
  --warning-weak: #FCEBCF;

  --success-strong: #27AE60;
  --success-weak: #DEF8E9;

  /* C   */
  --faint-strong-down: #A5ADBB;
  --faint-weak-up: #ECEEF5;
}

/*  */
/*      */

.back {
  --faint-weak: rgba(255, 255, 255, 0.15);
}

.text {
  --faint-weak: rgba(237, 241, 247, 0.5);
}

.line {
  --faint-strong: #EDEFF2;
}

.icon {}

.fancy {
  --accent-strong: linear-gradient(132deg, #3F89EE, #5447FF);

  /*  */
  --accent-strong-down: linear-gradient(132deg, #448FF3, #594CFF);
}


/*   */

.button {
  background: var(--accent-strong);
  color: var(--base-weak);
  /*    */
}

.button:hover {
  background: var(--accent-strong-down);
}

E então, para criar um botão em HTML, você precisará adicionar essa marcação:

<button class="fancy button">
  <div class="text">
    Hello Button
  </div>
</button>

Não há meios no CSS para rastrear nativamente um contexto, e você deve especificá-lo manualmente através das classes. É claro que você pode tentar entender o contexto das tags usadas, mas essa decisão não é para todos.

Em React, o código pode ficar assim:

class Button extends React.Component {
  render() {
    return (
      <Box fill="accentStrong" fancy className="button">
        <Font fill="baseWeak">Hello Button</Font>
      </Box>
    )
  }
}

//   
class Button extends React.Component {
  render() {
    return (
      <Box.Accent fancy className="button">
        <Font>Hello Button</Font>
      </Box.Accent>
    )
  }
}

// Box  Font —    ,     

//        Strong  Weak (      )
//       
//      

//    ,   
// ,    
//     ,     Opium.Fill
//       

//   'button'     
//      

Para não ficar vinculado ao CSS (você não cria apenas aplicativos para o navegador), as variáveis ​​de cores podem ser armazenadas no json:

{
  "color": {
    "parents": {
      "baseStrong": "#000",
      "baseWeak": "#fff",

      "faintStrong": {
        "default": "#8994A6",
        "shiftDown": "#A5ADBB"
      },
      "faintWeak": {
        "default": "#F6F8FB",
        "shiftUp": "#EDEFF2"
      },

      "accentStrong": "#0070FF",
      "accentWeak": "#EBF4FF",

      "complementStrong": "#8889E2",
      "complementWeak": "#EEECFD",

      "criticStrong": "#F74545",
      "criticWeak": "#FDEDED",

      "warningStrong": "#F8AE4F",
      "warningWeak": "#FCEBCF",

      "successStrong": "#27AE60",
      "successWeak": "#DEF8E9"
    },

    "context": {
      "back": {
        "faintWeak": "rgba(255, 255, 255, 0.15)"
      },

      "text": {
        "faintWeak": "rgba(237, 241, 247, 0.5)"
      },

      "line": {
        "faintStrong": "#EDEFF2"
      },

      "icon": {},

      "fancy": {
        "accentStrong": {
          "default": "linear-gradient(132deg, #3F89EE, #5447FF)",
          "shiftDown": "linear-gradient(132deg, #448FF3, #594CFF)"
        }
      }
    }
  }
}

8.2 Esquema de cores em Figma


Parece-me que será correto dividir as cores em contextos para que os nomes de contexto sejam visíveis. E adicione turnos ao final desses blocos. Se o turno for realmente usado apenas para o haver, você não deve adicioná-lo à paleta para que não o distraia novamente.

Lista de cores Figma


9. Quando não faz sentido usar o sistema


9.1 Projeto de design incomum


O Opium.Fill foi projetado para que as cores base sejam preto e branco (ou aquelas subjetivamente semelhantes a elas ao ponto de confusão). Se você precisar escrever muito azul e vermelho ou usar constantemente uma variedade de cores em uma interface, o Opium.Fill não é a melhor solução.

9.2 Projeto pequeno


Para um projeto pequeno, simplesmente não faz sentido introduzir algum tipo de sistema. Será mais rápido lançar todas as cores de contador em variáveis ​​assim que estiverem disponíveis, mas é melhor usar a lista recebida do designer. E às vezes tudo é tão simples que você pode definir cores diretamente em estilos para não ficar confuso.

9.3 Você já está usando outra coisa


Se sua equipe usa o Design de materiais (e não apenas) e todos estão satisfeitos com tudo, não faz sentido alterar ou ajustar o que funciona.

10. Crítica


Aqui estão alguns problemas frequentemente expressos com o Opium.Fill. Vou tentar responder a algumas das reivindicações. Você pode considerar isso um tópico aberto. Se alguém encontrar dificuldades, ficarei feliz em compartilhar comigo.

10.1 Ainda existem muitas variáveis


O leitor curioso já calculou que temos células para 252 variáveis. O que é melhor do que o que era no começo?

Posso garantir que todas essas cores nunca serão usadas ao mesmo tempo. Há um lugar para eles, mas essas são células vazias, como elementos não descobertos na tabela periódica. Em projetos reais, conseguimos "abrir" até 30 elementos.

Se mais de 50 peças se acumularem na sua mesa, provavelmente algo está errado e o esquema, infelizmente, não ajuda a corrigi-lo.

10.2 Para preencher os gráficos, você precisa expandir bastante a tabela.


Se você possui muitos gráficos ou precisa colorir categorias de produtos em cores diferentes (e existem, por exemplo, 20 peças), será necessário adicionar novas famílias de cores. Sete peças que descrevi acima não são suficientes.

10.3 Por que adicionar substituições se, em teoria, todas as necessidades podem ser cobertas por turnos?


Eu procedo da ideia de que as substituições contextuais são uma explicação mais "de alto nível" de como um designer usa cores. E, portanto, as substituições são mais fáceis de entender e usar.

Os turnos são úteis para flores raras; é melhor preenchê-las nos casos:

  1. Manipulação de Eventos (como Haver ou Click)
  2. Quando você precisa de um espectro extra de tons de cinza

Conclusão


O conceito apareceu no início de 2018 e não mudou muito desde então. Na minha organização favorita, implementamos o Opium.Fill em design e desenvolvimento. Às vezes era necessário implementar o design feito por outras equipes (de outras organizações), mas isso não interferia no uso do esquema de cores, encontramos dificuldades, mas conseguimos resolvê-las. Alguns projetos já entraram em produção.

Se o tópico sobre gerenciamento de cores em um projeto estiver próximo de você, talvez seja interessante ler sobre outras opções: Design de materiais , Design Atlassian

obrigado


Criamos um esquema e escrevemos um artigo - Denis Elianovsky, equipe do JTC.
Ilustração no cabeçalho - Elena Efimova

All Articles