Relaciones
Semánticos de color
Cómo pasar de la lista de usos a tokens semánticos de color, los de DesignToken101 con su primitivo en Light y en Dark, por qué varios semánticos pueden apuntar al mismo primitivo y cuándo se añade uno nuevo.
Última revisión:
El color es la capa semántica más grande de DesignToken101 y la que mejor muestra para qué sirven los alias. En esta lección verás cómo se pasa de una lista de usos a tokens semánticos, cuáles tiene esta web y a qué primitivo apunta cada uno, y qué decide ese primitivo.
En esta página
- Del uso al token
- Fondo, texto y borde
- Light y Dark, lo justo
- Los semánticos de color de DesignToken101
- El contraste decide el paso
- Varios semánticos, un primitivo
- Un token nuevo cuando hace falta
- En Figma
- Lo que te llevas
Del uso al token
En el ejercicio del módulo 2 anotaste qué primitivo usa cada elemento de tu diseño. Esa lista es el punto de partida. Así sería un fragmento de la de DesignToken101:
| Dónde aparece | Primitivo |
|---|---|
| Fondo de la página | color/white |
| Fondo de los bloques de código | color/neutral/50 |
| Fondo de las tarjetas | color/neutral/50 |
| Texto del cuerpo | color/neutral/900 |
| Texto de los enlaces | color/emerald/700 |
Un token semántico no nombra un elemento, sino una función. Los bloques de código y las tarjetas comparten función (una superficie un poco distinta del fondo de la página), así que comparten token: color/background/neutral/subtle. Si dos usos tienen el mismo primitivo y la misma función, son un solo token. Si tienen el mismo primitivo y funciones distintas, son dos tokens: lo verás en Varios semánticos, un primitivo.
Nota
En esta lección usamos los nombres de DesignToken101 sin explicar cómo se construyen. Por qué empiezan por la propiedad y qué significa cada nivel lo verás en el módulo Nombrar, en Dos escuelas y La convención de DesignToken101.
Fondo, texto y borde
Cada semántico de color dice a qué propiedad se aplica: background (fondo), text (texto) o border (borde). Los iconos usan los tokens de texto de su contexto; no hay propiedad icon.
Separar la propiedad tiene dos consecuencias prácticas:
- En Figma, cada propiedad tiene su scope. Un token de texto aparece al elegir el color de un texto o de una forma, y no al elegir el relleno de un marco. Lo verás en Las colecciones semánticas.
- El contraste se comprueba por pares. Un texto se mide contra el fondo sobre el que va. Con la propiedad en el nombre, cada par se lee directamente:
text/neutral/defaultsobrebackground/neutral/default.
Light y Dark, lo justo
La colección de los semánticos de color tiene dos modos, Light y Dark. Cada modo puede apuntar a un primitivo distinto:
| Token | Light | Dark |
|---|---|---|
color/text/neutral/default | neutral/900 | neutral/50 |
El nombre que aplicas al diseño es el mismo en los dos modos. Lo que cambia es el destino del alias. Es la razón de ser de la capa semántica: sin ella, cambiar de tema sería cambiar cada elemento del diseño. Cómo se crean y se aplican los modos lo verás en el módulo Modos y temas, en Crear los modos en Figma y Aplicar los modos al diseño. En este módulo, basta con leer las dos columnas de las tablas.
Los semánticos de color de DesignToken101
Son 33 tokens en la colección Semantic color de Figma. En esta lección están los de base. Los de estado (hover, active, seleccionado y foco) los verás en Estados, y dos tokens con transparencia, en Cuando un semántico no es alias.
Neutros: la estructura de la página.
| Token | Light | Dark | Uso |
|---|---|---|---|
color/background/neutral/default | white | neutral/950 | Fondo de la página |
color/background/neutral/subtle | neutral/50 | neutral/900 | Tarjetas, bloques de código, Callout pendiente |
color/background/neutral/strong | neutral/100 | neutral/800 | Superficies con más énfasis, como el grupo del selector de tema de la cabecera |
color/text/neutral/default | neutral/900 | neutral/50 | Texto principal |
color/text/neutral/subtle | neutral/600 | neutral/400 | Texto secundario |
color/border/neutral/default | neutral/200 | neutral/800 | Separadores y bordes decorativos |
color/border/neutral/strong | neutral/500 | neutral/500 | Bordes que identifican algo y necesitan contraste |
Acento: el color de la marca.
| Token | Light | Dark | Uso |
|---|---|---|---|
color/text/accent/default | emerald/700 | emerald/400 | Enlaces; icono y etiqueta del Callout de recomendación |
color/background/accent/subtle | emerald/50 | emerald/950 | Fondo tintado: Callout de recomendación, pasos de los gráficos |
color/background/accent/strong/default | emerald/500 | emerald/500 | Botón principal |
color/text/on-accent | neutral/950 | neutral/950 | Texto sobre el botón principal |
color/border/accent/default | emerald/300 | emerald/700 | Borde del Callout de recomendación (decorativo) |
Mensajes: información, éxito, aviso y error. Los cuatro roles siguen el mismo patrón de tres tokens (fondo, borde y texto):
| Token | Light | Dark | Uso |
|---|---|---|---|
color/background/info/subtle | blue/50 | blue/950 | Fondo del Callout de nota |
color/border/info/default | blue/300 | blue/700 | Borde del Callout de nota |
color/text/info/default | blue/700 | blue/300 | Icono y etiqueta del Callout de nota |
color/background/success/subtle | emerald/50 | emerald/950 | Sin uso todavía |
color/border/success/default | emerald/300 | emerald/700 | Sin uso todavía |
color/text/success/default | emerald/700 | emerald/300 | Mensaje "Copiado" del bloque de código |
color/background/warning/subtle | amber/50 | amber/950 | Fondo del Callout de aviso |
color/border/warning/default | amber/300 | amber/700 | Borde del Callout de aviso |
color/text/warning/default | amber/700 | amber/300 | Icono y etiqueta del Callout de aviso |
color/background/danger/subtle | red/50 | red/950 | Sin uso todavía |
color/border/danger/default | red/300 | red/700 | Sin uso todavía |
color/text/danger/default | red/700 | red/300 | Sin uso todavía |
El rol de error se llama danger, como en el SDS de Figma (SDS: theme.css) y en Atlassian (Atlassian: Design tokens). El éxito usa la escala emerald, la de la marca; viste por qué en Escalas de estado.
Nota
Los valores completos, con su hex, están en la especificación del sistema, que es la fuente de esta tabla. Las tres decisiones más visibles (el tratamiento del botón principal, el fondo de Light y el de Dark) se cerraron al ver el diseño, y se pueden reabrir cambiando un alias y volviendo a comprobar el contraste.
El contraste decide el paso
En el módulo 2 viste qué pasos de cada escala sirven para texto (Lo que la escala dice sobre su uso). La capa semántica es donde se toma la decisión. Un ejemplo, el texto de los enlaces:
- 50, #F2FCF7
- 100, #E1F9EE
- 200, #C4F3DD
- 300, #93EAC5
- 400, #4FD7A6
- 500, #33CC99
- 600, #0EA075
- 700, #1A7D5C, text/accent/default en Light
- 800, #1F624A
- 900, #1F503E
- 950, #0D2C20
- El color de marca,
emerald/500, no sirve para texto sobre blanco: 2,05:1. WCAG 2.2 pide 4,5:1 para el texto normal (Understanding 1.4.3). emerald/700sí: 5,08:1 sobre blanco. Por esocolor/text/accent/defaultapunta a él en Light.- En Dark se invierte: sobre
neutral/950el700se queda en 3,89:1, y el400llega a 10,92:1. Por eso Dark apunta al400.
El botón principal hace lo contrario: mantiene el color de marca de fondo y cambia el texto. Con texto blanco no llegaría a 4,5:1; con color/text/on-accent (neutral/950), llega a 9,63:1. Los tokens on- existen para eso: nombran el texto que va sobre un fondo de color fuerte, y cada par se comprueba junto.
Recomendación
En DesignToken101, cada alias de texto se elige comprobando su contraste con el fondo con el que se usa, en Light y en Dark. Si cambias un alias, vuelves a comprobar el par. Es una regla nuestra; los umbrales son de WCAG 2.2. Cómo se comprueba con detalle lo verás en el módulo Accesibilidad (Contraste de texto).
Varios semánticos, un primitivo
emerald/700 aparece en cuatro tokens:
| Primitivo | Token | Modo |
|---|---|---|
emerald/700 | color/text/accent/default | Light |
emerald/700 | color/text/success/default | Light |
emerald/700 | color/border/accent/default | Dark |
emerald/700 | color/border/success/default | Dark |
No es una repetición: son cuatro decisiones que hoy coinciden. Si mañana el éxito necesita otro verde, cambias los alias de success y el acento no se mueve. Si los fundieras en un solo token, separarlos después obligaría a revisar cada elemento del diseño que lo usa.
La regla de la primera sección, en una frase: un token por función, aunque el valor coincida.
Un token nuevo cuando hace falta
Los semánticos de color no salieron todos a la vez. color/border/accent/default se añadió al diseñar el Callout de recomendación: los demás Callout tenían borde de su color, y este no tenía token. Se creó cuando el componente lo pidió, no antes.
Hay una excepción, decidida a sabiendas. Hoy, los tokens de danger y el fondo y el borde de success no tienen ningún uso en la web: se crearon con el resto de la tabla, como un juego completo de mensajes. Se mantienen porque la web los usará más adelante. Es una excepción al criterio, y está registrada como tal.
Recomendación
Crea un semántico cuando un uso real lo necesita, como viste con el espaciado en el módulo 2 (un sistema tan grande como lo que resuelve). Una matriz completa (todas las propiedades por todos los roles y todos los énfasis) da tokens que nadie usa y que alguien tiene que mantener.
En Figma
En DesignToken101, los semánticos de color están en su propia colección, Semantic color, con los modos Light y Dark. Cada variable se crea así (Figma: Create and manage variables):
- Crea una variable Color con el nombre completo, por ejemplo
color/text/accent/default. - En la columna Light, haz clic derecho sobre el valor, elige Create alias y busca
color/emerald/700. - Repite en la columna Dark con
color/emerald/400. - Escribe en la descripción para qué se usa. En DesignToken101, "Enlaces y texto de acento". La descripción llega a la exportación como
$description.
El scope y la visibilidad de estas variables los verás en Las colecciones semánticas. Las crearás para tu sistema en el módulo Nombrar, ya con su nombre definitivo (Crear las variables en Figma).
Lo que te llevas
- Un semántico nombra una función, no un elemento: un token por función, aunque el valor coincida.
- Cada modo puede apuntar a un primitivo distinto; el nombre que aplicas no cambia.
- El contraste decide a qué paso apunta cada texto.