Opium.Fill: estandarización del esquema de color a través de los ojos del programador.

Cara azul, hongos crecen de los ojos

Oye. Hoy les mostraré la combinación de colores que he estado usando durante los últimos 2 años. Fue inventado para deshacerse de una gran cantidad de variables en CSS en un proyecto problemático. Y luego resultó que estos principios se pueden aplicar a casi cualquier proyecto.

En general, trataré de explicar cómo los diseñadores usan el color en la interfaz de usuario y cómo se puede "tipear" todo esto sin empujar a los diseñadores a cuadros ajustados. Daré ejemplos de implementación en React JS (para el desarrollador) y en Figma (para el diseñador). El esquema no tiene enlaces para React y Figma, es solo que estoy más familiarizado con ellos.

No hay nada astuto y único en el esquema (tal vez solo un nombre). Todas las ideas cuelgan en el aire. Puede tomarlo como mi mejor práctica para trabajar con color en aplicaciones. Opium.Fill: estos son principios generales combinados con amor para dar nombres a todo.

El sistema se puede usar junto con el diseño de materiales.

El artículo está escrito para el desarrollador front-end y un poco para el diseñador.

Tabla de contenido


  1. ¿Qué problemas resolvemos?
  2. Ideología Opium.Fill
  3. Supuestos básicos
  4. Bloque No. 1. Colores principales
  5. Bloque No. 2. Sustitución
  6. Bloque No. 3. Turnos
  7. Inversión de color
  8. Utilizando
  9. Cuando no tiene sentido usar
  10. Crítica
  11. Conclusión

Todas las imágenes son clicables

1. ¿Qué problemas resolvemos?


1.1. 50 sombras de Grey


Probablemente todos estén familiarizados con este problema. Muy a menudo se puede ver en tonos de gris, pero con otros colores (por ejemplo, azul) esto sucede. ¿Dónde poner, dónde usar? Incluso los diseñadores están confundidos acerca de esto.

1.2. Diseñador juega con flores


A veces, un diseñador puede entregar un nuevo color simplemente porque el viejo está cansado y no le gusta (o porque se perdió una pipeta). No hay nada de malo en esto; no es necesario culpar al diseñador. Pero el problema es que el desarrollador no siempre es consciente de los cambios.

En este caso, se acumulan muchas variables de color. Después de todo, el desarrollador no comprende si es necesario eliminar colores antiguos o si todavía se usan en algún lugar. De los proyectos que he visto, el registro es de 273 variables de solo color.

Una situación similar puede ocurrir en todos los proyectos en los que se trabaja en Agile y el diseño cambia simultáneamente con el desarrollo.

1.3. Temas nocturnos y diseño de marca


Este problema se deriva del anterior. Si el proyecto tiene muchas variables desordenadas, es difícil introducir nuevos esquemas de color.

Por ejemplo, está trabajando en la creación de CRM. Y su CRM le da al cliente la oportunidad de ajustar su esquema de color a la identidad corporativa del cliente. Si no tiene un esquema de color claro, será difícil hacerlo.

Pero, ¿y si necesita un tema oscuro para la aplicación? Luego, la oración "Vasily, tomemos nuestras 273 variables y sistematícelas" lleva al hecho de que Vasily rompió el formulario en el décimo paso de completar la solicitud, tuvo una pelea con el desarrollador del departamento vecino y se volvió loco una semana después.

2. La ideología del opio. Relleno


2.1. No molestes al diseñador para trabajar


Opium.Fill fue inventado para "descifrar" el diseño y no para cargar al diseñador. El diseñador no necesita saber acerca de la existencia de Opium.Fill para hacer todo de acuerdo con el esquema.

No debe imponer un esquema de color al diseñador y es mejor esperar hasta que termine de dibujar el concepto principal de la aplicación. Solo después de eso es útil mostrarle si algo no encaja con el esquema de color y aclarar si estos lugares pueden corregirse. En 9 de cada 10 preguntas de este tipo, los diseñadores dicen "Pf, esto no es un problema, vamos a reemplazarlo" o "Oh, y esto es generalmente mi problema, gracias por notarlo".

2.2. Definir colores "a ojo"


Según la tabla periódica, es posible predecir la existencia de elementos aún no descubiertos. Para esto, las celdas vacías se asignaron previamente. Usaremos este principio para nuestro esquema de color. Haga una tabla y deje algunas celdas en blanco. Pero para el resto de los parámetros, comprenderá incluso a simple vista de qué color debe estar allí.

tabla periódica


2.3. No se desanime si no todo resulta


Nuestra tarea es optimizar la parte más grande y rutinaria del trabajo con color. Si, indicando el color al desarrollar la aplicación, 1 de cada 100 veces se encontrará con algo que no encaja en el circuito, esto no se considera un problema.

3. Suposiciones básicas


3.1. Para cada color: un par


Creemos que cada color tiene dos "encarnaciones". El primero está saturado (condicionalmente fuerte). El segundo es insaturado (condicionalmente débil). Si vemos azul, además de ser azul, debemos definirlo como Fuerte o Débil. ¿Está saturado o insaturado?

3.2. Divide colores por funcionalidad


Olvídate de "azul celeste", "dorado", "negro azabache" y similares en los nombres de los colores. El nombre del color debe reflejar su funcionalidad, no su hexadecimal. Ahora estamos trabajando con los siguientes nombres: Base, Débil, Acento, Complemento, Crítica, Advertencia, Éxito.

3.3. Tres bloques


El bloque No. 1 es el más importante. El bloque número 3 es el más sin importancia. A continuación describiré cada uno de los bloques. Esta separación es necesaria para que los colores menos significativos para dibujar la interfaz nos distraigan menos.

4. Número de bloque 1. Colores principales


4.1. Nombres


De vuelta a nuestros nuevos nombres de color. Base, débil, acento, complemento, crítico, advertencia, éxito. Tomémoslo uno a la vez.

Base


Es blanco y negro. O esos colores que son similares a ellos hasta cierto punto de confusión. Son básicos para el texto y el fondo.

Colores blanco y negro


Desmayarse


Entonces llamamos sombras de gris. Algún texto de fondo o un fondo grisáceo es débil. El negro con transparencia (si se percibe como gris) también se incluye aquí.

Color gris agregado


Acento


Este es el color corporativo principal o el color que resalta los elementos más importantes de la interfaz. Por ejemplo, si observa los bancos rusos, entonces: Sberbank es verde, VTB es azul (o rojo, como puede ver), Tinkoff es amarillo, Alpha es rojo. Para mayor comodidad, veamos los tonos de azul en nuestra tabla debajo de Acento.

Color azul agregado


Complemento


Este es un color de acento opcional. No todos lo tienen. Echemos un vistazo a Airbnb: diría que es de color verde oscuro: en nuestra tabla, por conveniencia, indicaré Complemento en morado, nos será útil en los ejemplos de diseño que mostraré a continuación.

Púrpura agregada




Screen Airbnb


Crítico


Color para resaltar errores y otra información extremadamente importante. Por lo general, algo rojo.

Color rojo agregado



Advertencia


Si desea compartir información crítica con otra persona, también importante, pero no mortal, se necesita Advertencia. Por lo general, este es un tipo de amarillo-naranja.

Color naranja agregado


Éxito


A veces, una acción exitosa es suficiente para mostrar el acento de color. Pero si el acento es de un color inusual (rojo) o por alguna razón desea introducir un nuevo color, aquí está el éxito. Lo más probable es que resulte verdoso. Se han lanzado 7 nombres de colores básicos. No es necesario usarlos todos. Y, por supuesto, puede complementar el conjunto si tiene una razón seria para esto.

Verde añadido




4.2. Familias de colores


Probablemente ya haya notado que cuando hablo de color, no indico un significado específico, pero uso las palabras "sombras de gris", "algo rojo", "verdoso", etc. Esto no es así. Vamos a presentar el concepto de "familia de colores".

Como dije anteriormente, dividimos los colores en pares. El acento justo no puede existir. Asegúrese de tener un acento fuerte y un acento débil. Estos son siempre exactamente los dos colores que forman la base de la familia. Como papá y mamá. Imaginemos por un tiempo que nuestros colores son una pareja casada. Supongamos que no importa de qué género sean los padres, lo principal es que uno es fuerte (Fuerte) y el segundo, débil (Débil). Y también aceptaremos que la fuerza y ​​la debilidad son rasgos de carácter, como el genio rápido y la calma.

Izquierda fuerte, derecha débil




Entonces aquí. Papá tiene mal genio. A menudo está nervioso por los atascos y patea a los erizos en el bosque. Mamá está tranquila Ella trabaja como psicóloga y juega al póker. Esta es la base de nuestro esquema de color.

Los colores base ya están divididos (blanco y negro). Divida el resto en familias:

Todos los colores se dividen en 2. Uno está saturado, el segundo apenas se nota.


5. Bloque No. 2. Sustitución


5.1. Contexto


Echa un vistazo a Bitbucket. Luego, el diseñador consideró que el color azul, que se encuentra en la parte posterior izquierda, es un poco oscuro para el texto. Y así lo iluminó. Ahora todo el texto, aunque se ve azul (como un menú lateral), en realidad tiene un significado diferente en hexadecimal: cualquier color tiene un contexto en el que se usa. El color se puede aplicar al fondo, texto, líneas, iconos. Esto es lo que llamamos contexto. En cualquiera de estos casos, es posible que sea necesario cambiar el color de alguna manera, para que se adapte mejor al contexto. A este cambio lo llamamos sustitución . Seleccionamos un lugar en la tabla para las sustituciones. Cada nueva línea es un contexto para el cual podemos agregar sustituciones. Por defecto, habrá celdas vacías:

Screen Bitbucket






La misma lista de colores, dividida en dos, pero se agregaron líneas adicionales debajo.  Lo llamaremos una mesa.


Agregamos celdas de sustitución solo para colores fuertes. Los colores débiles en el bloque # 2 muestran cómo se ve ese color en un fondo oscuro. Si bien no los tocaremos, al final volveremos a ellos.

Si la sustitución no se completa, entonces el color del texto, los iconos y todo lo demás
se toma del bloque No. 1.
Nota. Podemos sustituir los colores solo en elementos de diseño primitivos. Este conjunto se toma casi 1: 1 de los editores gráficos utilizados por los diseñadores. Allí puede dibujar un rectángulo (fondo), agregar un bloque de texto, dibujar una línea o agregar alguna forma inusual, como un asterisco (lea el icono).

5.2. Lujoso


Hay otro tipo especial de sustitución: la sustitución del gradiente. Llamamos a los gradientes la palabra Fantasía: contexto para una "ocasión especial". La fantasía es una para todos. No puede haber un gradiente separado para texto, íconos, etc. (en teoría, por supuesto, puede, pero no vale la pena hacer que la tabla sea más difícil debido a un caso tan raro). Destaquemos el lugar en la parte inferior de la tabla para Fancy: nos preparamos para los cambios según el contexto, los diseñadores lo hacen al 100%. Las celdas vacías nos dan cierta flexibilidad. A veces, las sustituciones deben hacerse con más frecuencia, a veces con menos frecuencia. Si el bloque número 2 permanece casi vacío, esto es normal (el diseñador también intenta reducir la cantidad de colores).

Otra línea agregada a la tabla




6. Número de bloque 3. Turnos


A veces, el color debe oscurecerse o aclararse ligeramente. Pero esto no se debe a que el contexto ha cambiado, sino simplemente a que cada color tiene dos estados adicionales: "más oscuro" y "más claro". Muy a menudo, los diseñadores usan esto para hacer una reacción del mouseover. Llamamos a este cambio de color Shift. Puede hacer un cambio hacia arriba (más oscuro) o hacia abajo (más claro). Una mesa vacía ahora se ve así:

Arriba hay un color oscuro.  Abajo - luz




Tabla, pero ahora cada color tiene celdas adicionales en la parte superior e inferior


7. Inversión de color


Deliberadamente no hablé de eso de inmediato, porque es raro y no todos lo necesitan. A veces quieres escribir algo sobre un sustrato oscuro, pero no todos los colores están adaptados para esto. Veamos un ejemplo de uno de nuestros diseños: hay texto en una placa azul, que se percibe subjetivamente como débil. Y hay círculos debajo de los iconos que también definiría en la familia Faint.  Si el dado fuera ligero, entonces estos dos elementos probablemente serían simplemente grises. Pero el dado es oscuro. No hay colores coincidentes en nuestra tabla, puede agregarlos. Solo para esto necesita la columna Débil en el bloque No. 2. Para este diseño, la tabla se ve así:

Diseño de aplicaciones de banca móvil








En la tabla, se llena otra parte de las celdas, la mayoría permanece vacía


Tenga en cuenta que ahora las líneas se dibujarán con un ligero débil fuerte, esto también se refleja en la tabla. También se agregaron gradientes para acento y turnos para padres débiles (son útiles para dibujar un campo de búsqueda).
Nota. No es necesario confundir inversión y tema nocturno. El tema nocturno tiene muchos de sus matices en color. Por lo tanto, es mejor crear una tabla separada para ello.

8. Uso


8.1. CSS, reaccionar


Intentemos dibujar dicho botón. En CSS puro, las variables se pueden organizar de la siguiente manera:

Botón




: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);
}

Y luego, para crear un botón en HTML, deberá agregar dicho marcado:

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

No hay medios en CSS para rastrear de forma nativa un contexto, y luego debe especificarlo manualmente a través de las clases. Por supuesto, puede intentar comprender el contexto de las etiquetas utilizadas, pero esta decisión no es para todos.

En React, el código podría verse así:

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 no estar vinculado a CSS (no solo crea aplicaciones para el navegador), las variables de color se pueden almacenar en 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 color en Figma


Me parece que será correcto dividir los colores en contextos para que los nombres de contexto sean visibles. Y agregue turnos hasta el final de estos bloques. Si el cambio se usa realmente solo para el servidor, ni siquiera debe agregarlo a la paleta para que no lo distraiga nuevamente.

Lista de colores de Figma


9. Cuando no tiene sentido usar el sistema


9.1. Proyecto de diseño inusual


Opium.Fill está diseñado para que los colores base sean blanco y negro (o aquellos que son subjetivamente similares a ellos hasta el punto de confusión). Si necesita escribir mucho azul y rojo o usar constantemente una variedad de colores en una interfaz, Opium.Fill no es la mejor solución.

9.2. Pequeño proyecto


Para un proyecto pequeño, simplemente no tiene sentido introducir algún tipo de sistema. Será más rápido arrojar todos los colores de contador en variables a medida que estén disponibles, pero es mejor usar la lista recibida del diseñador. Y a veces todo es tan simple que puedes establecer colores directamente en los estilos para que no te confundas.

9.3. Ya estás usando otra cosa


Si su equipo usa Diseño de materiales (y no solo) y todos están contentos con todo, entonces no tiene sentido cambiar o ajustar lo que funciona.

10. Críticas


Aquí hay algunos problemas frecuentes con Opium.Fill. Trataré de responder algunas de las afirmaciones. Puedes considerar esto como un tema abierto. Si alguien encuentra dificultades, me alegrará si comparte conmigo.

10.1 Todavía hay muchas variables


El lector curioso ya ha calculado que tenemos celdas para 252 variables. ¿Qué es mejor que lo que era al principio?

Les puedo asegurar que todos estos colores nunca se utilizarán al mismo tiempo. Hay un lugar para ellos, pero estas son celdas vacías, como elementos no descubiertos en la tabla periódica. En proyectos reales, logramos "abrir" hasta 30 elementos.

Si se acumulan más de 50 piezas en su mesa, entonces es probable que algo salga mal y, por desgracia, el esquema no ayuda a solucionarlo.

10.2 Para llenar los gráficos, debe expandir mucho la tabla.


Si tiene muchos gráficos o necesita colorear categorías de productos en diferentes colores (y hay, por ejemplo, 20 piezas), entonces tendrá que agregar nuevas familias de colores. Siete piezas que describí anteriormente no son suficientes.

10.3 ¿Por qué agregar sustituciones si en teoría todas las necesidades pueden ser cubiertas por turnos?


Partimos de la idea de que las sustituciones contextuales son una explicación más "de alto nivel" de cómo un diseñador usa los colores. Y así, las sustituciones son más fáciles de entender y usar.

Los cambios son útiles para flores raras, es mejor llenarlas en casos:

  1. Manejo de eventos (como Haver o Click)
  2. Cuando necesitas un espectro extra de tonos de gris

Conclusión


El concepto apareció a principios de 2018 y no ha cambiado mucho desde entonces. En mi organización favorita, implementamos Opium.Fill tanto en diseño como en desarrollo. A veces era necesario implementar el diseño realizado por otros equipos (de otras organizaciones), pero esto no interfirió con el uso del esquema de colores, tuvimos dificultades, pero logramos resolverlos. Algunos proyectos ya se han puesto en producción.

Si el tema de la gestión del color en un proyecto está cerca de usted, puede ser interesante leer sobre otras opciones: diseño de materiales , diseño clásico

gracias


Se nos ocurrió un esquema y escribimos un artículo: Denis Elianovsky, equipo de JTC
Ilustración en el encabezado: Elena Efimova

All Articles