Design Tokens — colores, espaciado, tipografía como propiedades CSS
13 min read

Design Tokens: La Base de Todo Sistema de Diseño

#CSS #Design Tokens #Design Systems

Nunca hardcodearías una cadena de conexión a base de datos en 47 archivos diferentes. Entonces, por que los equipos frontend siguen hardcodeando #3b82f6 en 200 lugares de sus hojas de estilo? Los design tokens resuelven este problema de la misma manera que la configuración lo resuelve en el backend: una única fuente de verdad, referenciada en todas partes, cambiada en un solo lugar.

Los design tokens son los átomos visuales de un sistema de diseño. Almacenan decisiones — no solo valores — sobre color, tipografia, espaciado, sombras, bordes y animaciones en un formato que cualquier componente puede consumir. Junto con la metodologia Atomic Design, forman la base de toda arquitectura de componentes escalable.

Los design tokens son los átomos visuales de diseno del sistema de diseno — especificamente, son entidades con nombre que almacenan atributos de diseño visual.

Jina Anne Creadora del Design Tokens Community Group

Por que los Design Tokens importan

6
Categorías de Tokens
2
Variantes de Tema
100%
Objetivo de Consistencia
0
Valores Hardcodeados

Sin tokens, las decisiones de diseño están dispersas en archivos CSS, estilos de componentes y estilos inline. Un “azul de marca” podria ser #2563eb en el header, #3b82f6 en botones y #1d4ed8 en enlaces — tres azules diferentes que deberían ser el mismo. Los tokens eliminan esta deriva estableciendo un único valor canónico.

Cuando actualizas un token, cada componente que lo referencia se actualiza automáticamente. Cambia --color-primary una vez, y tus botones, enlaces, encabezados, anillos de focus y estados activos siguen. Esta es la promesa fundamental de un sistema de diseño — y puedes ver este principio aplicado en la práctica en nuestro artículo sobre Atomic Design con mas de 45 componentes.

La evolución de los sistemas de diseño

Estilos inline y caos

Cada desarrollador elegia colores y espaciados a ojo. Sin fuente central, sin consistencia. Los rediseños significaban semanas de buscar y reemplazar.

Variables SCSS como primer paso

Las variables del preprocesador trajeron cierta centralización. Pero solo en build-time: sin theming sin recompilar. Sin modo oscuro sin duplicación.

CSS-in-JS y Theme Providers

styled-components y Emotion trajeron objetos de tema. Costos de runtime y dependencia del framework fueron el precio del theming dinámico.

CSS Custom Properties como estandar

Soporte nativo del navegador, cero costo de runtime, cascadeantes y sobrescribibles por contexto. Los design tokens como CSS custom properties son la mejor práctica actual.

Categorías de Tokens

Visualizacion de paleta de tokens de color
Tokens de Color

Tu paleta completa de colores — desde primarios de marca y neutros hasta colores semanticos para estados de éxito, advertencia, error e información. Los tokens semánticos como --color-text y --color-bg se adaptan entre modos claro y oscuro sin cambiar código de componentes. Define tokens primitivos (la paleta cruda) y tokens semanticos (el significado) por separado.

Visualizacion del sistema de rejilla de espaciado
Tokens de Espaciado

Un sistema de rejilla de 8 puntos asegura un ritmo espacial consistente. Valores como --space-1 (4px) hasta --space-12 (96px) crean layouts armoniosos. Los componentes nunca usan valores de pixeles arbitrarios — cada margin, padding y gap referencia un token de espaciado. Esto elimina el debate de si son 14px o 16px para siempre.

Demostracion de escala tipografica
Tokens de Tipografía

Familias de fuentes, tamaños, pesos, alturas de línea y espaciado de letras — todo tokenizado. Las escalas de tipografia fluida usan clamp() para asegurar texto legible desde movil hasta ultrawide. Un encabezado que mide 2rem en movil crece suavemente a 3rem en escritorio sin media queries.

Ejemplos de tokens de sombra y movimiento
Efectos y Movimiento

Sombras, radios de borde, transiciones y animaciones. Sombras consistentes (--shadow-sm, --shadow-md, --shadow-lg) crean jerarquía de profundidad. Tokens de transicion (--transition-fast: 150ms, --transition-base: 300ms) aseguran una sensacion de animacion uniforme. Los tokens de border-radius previenen el problema de que algunos botones tienen 4px y otros 8px.

Arquitectura de Tokens: Tres Capas

Los design tokens funcionan mejor organizados en tres capas: primitiva, semántica y de componente. Cada capa anade significado.

Los tokens primitivos son los valores crudos — tu paleta. No tienen significado adjunto, solo nombres y valores. --blue-500: #3b82f6, --gray-100: #f3f4f6, --space-4: 1rem. Nunca los usas directamente en componentes. Son los bloques de construccion para los tokens semanticos.

Los tokens semánticos asignan significado a los primitivos. --color-primary: var(--blue-500), --color-bg: var(--gray-100), --color-text: var(--gray-900). Los componentes usan tokens semanticos exclusivamente. Así funciona el modo oscuro: intercambias los valores primitivos detrás de los tokens semánticos, y cada componente se adapta.

Los tokens de componente (opcionales) son alias para componentes especificos. --btn-bg: var(--color-primary), --btn-text: var(--color-on-primary), --card-radius: var(--radius-md). Añaden una capa extra de flexibilidad: puedes cambiar todos los fondos de botones sin afectar otros componentes que usan --color-primary.

Implementación en CSS

/* tokens/primitives.css — paleta cruda, nunca usar directamente */
:root {
  --blue-50: #eff6ff;
  --blue-500: #3b82f6;
  --blue-600: #2563eb;
  --blue-700: #1d4ed8;
  --gray-50: #f9fafb;
  --gray-100: #f3f4f6;
  --gray-700: #374151;
  --gray-900: #111827;
  --space-1: 0.25rem;   /* 4px */
  --space-2: 0.5rem;    /* 8px */
  --space-4: 1rem;      /* 16px */
  --space-6: 1.5rem;    /* 24px */
  --space-8: 2rem;      /* 32px */
}
/* tokens/semantic.css — nombres con significado, usados en componentes */
:root {
  --color-primary: var(--blue-600);
  --color-primary-hover: var(--blue-700);
  --color-bg: var(--gray-50);
  --color-bg-alt: var(--gray-100);
  --color-text: var(--gray-900);
  --color-text-light: var(--gray-700);
  --font-size-base: 1rem;
  --font-size-lg: 1.25rem;
  --font-size-xl: 1.5rem;
  --radius-sm: 0.25rem;
  --radius-md: 0.5rem;
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.05);
  --shadow-md: 0 4px 6px rgba(0,0,0,0.1);
  --transition-fast: 150ms ease;
  --transition-base: 300ms ease;
}
/* Modo oscuro — intercambia primitivos detrás de tokens semánticos */
[data-theme="dark"] {
  --color-primary: var(--blue-500);
  --color-primary-hover: var(--blue-600);
  --color-bg: var(--gray-900);
  --color-bg-alt: var(--gray-700);
  --color-text: var(--gray-50);
  --color-text-light: var(--gray-100);
  --shadow-sm: 0 1px 2px rgba(0,0,0,0.3);
  --shadow-md: 0 4px 6px rgba(0,0,0,0.4);
}
/* Los componentes usan los mismos tokens — cero cambios de codigo */

Tokens vs. Alternativas

Enfoque Mantenibilidad Recommended Modo Oscuro Rendimiento
CSS Custom Properties Excelente Intercambio nativo Cero runtime
Tailwind Utility Classes Buena Basado en config Purge necesario
CSS-in-JS (styled-components) Moderada Theme provider Coste runtime
Variables SCSS Moderada Duplicacion manual Solo build-time
Valores hardcodeados Terrible Imposible N/A

Configurar tu sistema de tokens

Guía de implementación de tokens

  1. Auditar estilos existentes

    Busca en tu código valores de color hardcodeados, espaciados en pixeles y declaraciones de fuentes. Lista cada valor único — probablemente encontrarás duplicados y casi-duplicados que deberian consolidarse.

  2. Definir tokens primitivos

    Crea tu paleta cruda en tokens/primitives.css. Colores (escalas completas como blue-50 hasta blue-900), espaciado (incrementos de 4px), tamaños de fuente, familias y pesos.

  3. Crear tokens semánticos

    Mapea primitivos a nombres significativos en tokens/semantic.css. --color-primary, --color-text, --color-bg, --color-error, --color-success. Estos son los que tus componentes usarán realmente.

  4. Reemplazar valores hardcodeados

    Recorre cada componente y reemplaza valores crudos con referencias a tokens. color: #3b82f6 se convierte en color: var(--color-primary). padding: 16px se convierte en padding: var(--space-4).

  5. Añadir modo oscuro

    Crea un bloque [data-theme="dark"] que reasigne tokens semanticos a diferentes primitivos. Alterna el atributo data-theme en <html> con un pequeño script. Cada componente se adapta automáticamente.

Estructura de archivos de tokens

src/styles/
├── global.css              → Importa todos los archivos de tokens, resets base
└── tokens/
    ├── primitives.css      → Paleta cruda (colores, escalas)
    ├── semantic.css        → Nombres con significado (modo claro por defecto)
    ├── dark.css            → Overrides de modo oscuro
    ├── typography.css      → Familias, tamaños, pesos, alturas de línea
    ├── spacing.css         → Valores de rejilla de 8 puntos
    └── effects.css         → Sombras, radios, transiciones

El poder de los tokens en cascada

Uno de los patrones más poderosos son los overrides contextuales de tokens. Como las CSS custom properties cascadean, puedes sobrescribir tokens en contextos especificos:

/* Una card oscura sobrescribe tokens para sus hijos */
.card--dark {
  --color-bg: var(--gray-900);
  --color-text: var(--gray-50);
  --color-primary: var(--blue-400);
}
/* Todos los hijos (encabezados, texto, enlaces) se adaptan automáticamente */
/* Ajustar tokens de espaciado para movil */
@media (max-width: 768px) {
  :root {
    --space-section: var(--space-6);  /* 24px en lugar de 48px */
    --font-size-hero: var(--font-size-xl); /* texto hero más pequeño */
  }
}
/* Una seccion hero con tratamiento visual diferente */
.hero {
  --color-bg: var(--color-primary);
  --color-text: white;
}
/* Todos los organismos dentro del hero heredan estos overrides */

Beneficios a escala

Consistencia de marca

Cada componente dibuja de la misma paleta. No mas conversaciones de cuál azul era ese?

Modo oscuro gratis

Intercambia valores de tokens en un archivo. Cada componente se adapta sin modificaciones.

Accesibilidad incorporada

Aplica ratios de contraste a nivel de token. --color-text sobre --color-bg siempre cumple WCAG 4.5:1.

Armonía espacial

La rejilla de 8 puntos elimina espaciados arbitrarios. Cada layout tiene ritmo consistente y espacio para respirar.

Rebranding fácil

Cambiar toda la identidad visual significa actualizar un archivo de tokens. Sin cambios en componentes necesarios.

Sincronización diseño-dev

Los nombres de tokens en código coinciden con los de Figma. Diseñadores y desarrolladores hablan el mismo idioma.

Errores comunes

Frequently Asked Questions