Product Craft Bible
Design Tokens & Theming Systems
Inicio Design Systems Design Tokens & Theming Systems
Design Systems

Design Tokens & Theming Systems

8 reglas Material Design 3 (Reference / System / Component tokens) · IBM Carbon (Global / Alias / Component) · netguru "Design token naming"Ava Morgan "Stop treating tokens as variables" · Nathan Curtis (EightShapes) "Naming tokens" · goodpractices.designMaterial 3 (decisiones de tema en system tokens) · IBM Carbon (aliases para remapear) · netguru · fourzerothree.inDTCG v2025.10 (tipos color/dimensión/duration/typography/shadow) · Nathan Curtis (EightShapes) · goodpractices.design
19

Design Tokens & Theming Systems

8 reglas
205

Adopta los tres niveles de token: primitivo, semántico y de componente

Un sistema de tokens robusto opera en tres capas jerarquizadas. Los tokens primitivos (referencia) almacenan valores brutos sin contexto, como un hex. Los tokens semánticos (alias) mapean esos valores a roles de UI con significado. Los tokens de componente son sobreescrituras específicas de un componente. Esta separación permite que un cambio de marca se propague desde un solo punto sin tocar el código de los componentes: cambias el primitivo y la cascada llega sola hasta el botón.

Material Design 3 (Reference / System / Component tokens) · IBM Carbon (Global / Alias / Component) · netguru "Design token naming"
Preferir
Primitivo
blue-600
Semántico
action-primary
Componente
button-bg
Evitar
color: #1A73E8
color2: #0D47A1
color3: #1A73E8
206

Nombra tokens por intención semántica, nunca por su valor

Un token nombrado por su valor literal (color-blue-600) crea una mentira en el codebase en el instante en que ese valor cambia. El nombre debe comunicar proposito, contexto e intención: no el color, tamaño ni peso concreto. Cuando la marca pasa de azul a indigo, el nombre semántico color-action-primary sigue siendo verdadero y solo se reapunta la capa primitiva. Incluye solo los niveles necesarios para distinguir la intención, sin sobre-especificar.

Ava Morgan "Stop treating tokens as variables" · Nathan Curtis (EightShapes) "Naming tokens" · goodpractices.design
Preferir
color-feedback-errorred-500estable
En el rebrand solo se reapunta el primitivo. El nombre semántico sigue describiendo el rol, no el matiz.
Evitar
color-red=#e53935mentira
La marca cambia a naranja: el nombre color-red ahora describe un color que ya no es rojo.
207

Realiza el theming intercambiando solo la capa semántica

Soportar light, dark y marcas no requiere duplicar componentes ni crear tokens por tema (button-dark-background, button-light-background). Basta con un archivo de tokens semánticos por tema, todos exportando exactamente los mismos nombres apuntando a primitivos distintos. El código de los componentes nunca cambia: solo se carga otro mapa semántico-a-primitivo. La correspondencia entre temas es 1:1 por nombre.

Material 3 (decisiones de tema en system tokens) · IBM Carbon (aliases para remapear) · netguru · fourzerothree.in
Preferir
light.tokens
action → blue-600
surface → white
dark.tokens
action → blue-400
surface → slate-900
brand.tokens
action → orange-600
surface → orange-50
Evitar
button-light-background: white
button-dark-background: slate-900
El componente debe ramificar por tema. Cada tema nuevo duplica tokens.
208

Cubre las seis categorías canonicas, no solo color

Un sistema completo debe tokenizar las seis dimensiones de la UI: color, tipografía, espaciado, radii, sombra y motion. Limitar los tokens al color deja decisiones hardcodeadas dispersas por los componentes, lo que imposibilita el theming sistemico y los cambios de escala por plataforma. Cada categoría usa una taxonomia consistente (space/4, radius/md, motion/duration/fast) en lugar de nombres ad-hoc como bigPadding o myFont.

DTCG v2025.10 (tipos color/dimensión/duration/typography/shadow) · Nathan Curtis (EightShapes) · goodpractices.design
Preferir
color
action/primary
surface/base
type
body-md
heading-lg
space
space/2
space/4
radius
radius/md
radius/full
shadow
shadow/card
shadow/popover
motion
duration/fast
easing/standard
Evitar
bigPadding: 24px
myFont: Inter
redColor: #e53
round: 8px
209

Adopta el formato DTCG para interoperabilidad entre herramientas

El W3C Design Tokens Community Group publico la versión estable 2025.10 el 28 de octubre de 2025. El estandar define la estructura JSON con las propiedades $value, $type, $description, $deprecated y $extensions, y referencias entre tokens con notación de llaves {group.token}. Adoptar DTCG da portabilidad entre Figma, Tokens Studio, Style Dictionary, Sketch, Framer y Penpot desde una sola fuente de verdad.

DTCG spec 2025.10 (28-oct-2025) · W3C announcement (20+ editores: Adobe, Google, Microsoft, Salesforce) · Style Dictionary v4
Preferir
DTCG 2025.10
{ "action": {
  "$type": "color",
  "$value": "{palette.blue.60}",
  "$description": "Primary action"
} }
Evitar
No DTCG
{ "blue": {
  "value": "#1A73E8"
  } }
sin $type, sin referencias, no portable
210

En dark mode mapea a nuevos primitivos, nunca inviertas valores

Invertir colores (CSS filter: invert(1) o invertir el hex) destruye la coherencia perceptual y arruina imagenes, fotos y gráficos. Un #0070F3 invertido da #FF8F0C (naranja). El dark mode correcto mantiene los mismos nombres semánticos apuntando a primitivos distintos, elegidos por su luminosidad percibida (por ejemplo blue-600 desplaza a blue-700, no se invierte). El modelo de elevación también se invierte: las superficies más altas se aclaran en vez de proyectar sombra.

muz.li "Dark mode complete guide" (#0070F3 → #FF8F0C) · fourzerothree.in (blue-600 → blue-700) · dev.to (prefers-color-scheme)
Preferir
surface/base → #FFFFFF vs → #09111A
Mismo nombre semántico Acción
Foto intacta Acción
Evitar
filter: invert(1) en toda la página
Foto en negativo Acción
211

Verifica el contraste WCAG de forma independiente en cada tema

Un par de colores que cumple 4.5:1 en light mode puede fallar en dark mode si se reasignan los tokens sin reverificar el nuevo par. Cada tema debe tratarse como un sistema de color independiente y auditarse por completo: texto normal ≥ 4.5:1 (SC 1.4.3), texto grande y componentes ≥ 3:1 (SC 1.4.11). La nomenclatura semántica facilita la auditoria, porque el par (text-muted, surface-base) se verifica sistematicamente en todos los temas, idealmente en CI que bloquee PRs bajo el umbral.

WCAG 2.2 SC 1.4.3 (4.5:1 / 3:1) · SC 1.4.11 (3:1 non-text) · fourzerothree.in (#09111A + #FFF = 18.75:1) · aufaitux
Preferir
Par semánticoLightDarkWCAG
text-primary / surface 9.2:1 18.75:1
text-muted / surface 4.7:1 5.1:1
Evitar
Par semánticoLightDarkWCAG
text-secondary / surface 2.85:1 sin auditar
212

Versiona y migra tokens con deprecación explicita y codemods

Renombrar un token sin anunciarlo rompe en silencio a todos los consumidores. El flujo correcto marca el token con $deprecated: true en DTCG, mantiene el nombre antiguo un ciclo de release, documenta el reemplazo en la descripción, y provee un codemod automatizado para la migración. Ambos nombres coexisten un release; el siguiente elimina el antiguo. Style Dictionary v4 publica codemods de su propia migración como referencia de este patrón.

DTCG ($deprecated nativo) · Style Dictionary v4 migration (codemods, ESM-only, Node 18+) · Tokens Studio co-maintainer
Preferir
color-primary$deprecated
"$deprecated": true,
"$description": "Use color-brand-primary"
color-brand-primary
Ambos coexisten un release + codemod automatizado. El siguiente release elimina el antiguo.
Evitar
color-primary → color-brand-primary
Renombrado sin aviso: cada consumidor del nombre antiguo rompe en silencio, sin warning ni ruta de migración.