Skip to content

Sistema de Tokens

Los tokens de diseño son los valores nombrados del sistema. No se escribe #FF7043 en un componente. Se escribe primary. No se escribe 16px directamente. Se escribe space-4. Cada valor con nombre es una decisión de diseño capturada como vocabulario compartido entre equipos.

Los tokens son independientes de la plataforma: el mismo nombre se resuelve al valor correcto en Flutter, en CSS, en React Native o en cualquier otro sistema de implementación. Cuando un token cambia, el cambio se propaga automáticamente a todo el sistema.

Categorías de tokens

El sistema define seis categorías de tokens. Cada categoría cubre un dominio visual distinto.

graph LR
  A["Tokens"] --> B["Color"]
  A --> C["Tipografía"]
  A --> D["Espaciado"]
  A --> E["Elevación"]
  A --> F["Bordes"]
  A --> G["Motion"]

Tokens de color

Jerarquía de color

El sistema usa dos niveles de tokens de color. Los tokens de nivel primitivo son los valores hexadecimales sin semántica. Los tokens de nivel semántico asignan significado a los primitivos y son los únicos que se usan en componentes.

En código no se hace referencia nunca a un primitivo directamente. Siempre se usa el token semántico.

Primitivo: orange-600 = #FF7043
Semántico: primary = orange-600
Uso: background = primary ✓
background = #FF7043 ✗

Tokens primarios

TokenValor primitivoHexUso
primaryorange-600#FF7043Acciones principales, botones CTA, íconos activos
onPrimarywhite#FFFFFFTexto e íconos sobre primary
primaryContainerorange-50#FFF2E8Fondos de secciones destacadas, chips activos
onPrimaryContainerorange-800#E64A19Texto sobre primaryContainer
primaryHoverorange-700#F4511EEstado hover del color primario (solo web)
primaryPressedorange-800#E64A19Estado pressed del color primario
primaryDisabledorange-200#FFCCBCEstado deshabilitado de elementos primarios

Tokens secundarios

TokenValor primitivoHexUso
secondaryblue-700#1976D2Acciones secundarias, información, enlaces
onSecondarywhite#FFFFFFTexto e íconos sobre secondary
secondaryContainerblue-50#E1F4FFFondos informativos
onSecondaryContainerblue-900#0D47A1Texto sobre secondaryContainer

Tokens terciarios

TokenValor primitivoHexUso
tertiarygreen-700#388E3CConfirmaciones, estados exitosos
onTertiarywhite#FFFFFFTexto e íconos sobre tertiary
tertiaryContainergreen-50#E8F5E8Fondos de estado correcto
onTertiaryContainergreen-900#1B5E20Texto sobre tertiaryContainer

Tokens de superficie

Las superficies son la base sobre la que se construye todo el contenido. Son blancas o gris muy claro y nunca llevan color de marca saturado.

TokenHexUso
surface#FFFFFFFondo base de pantallas, tarjetas, modales
surfaceDim#F8F9FAFondo de listas, secciones alternadas
surfaceContainer#F5F6F7Fondo de inputs, chips, elementos neutros
surfaceContainerHighest#EEF0F2Secciones con mayor jerarquía visual neutra
surfaceTint#FFF8F6Superficie con subtono naranja muy sutil (uso mínimo)
scrimrgba(0,0,0,0.30)Overlay detrás de modales y bottom sheets

Tokens de texto

TokenHexUso
onSurface#1A1C1ETexto primario: títulos, valores, etiquetas
onSurfaceVariant#6C7075Texto secundario: subtítulos, metadatos, hints
onSurfaceDisabled#ADADADTexto en estado deshabilitado
outline#D4D7DABordes de inputs, divisores, separadores
outlineVariant#EAECEFBordes sutiles, fondos de hover neutros

Tokens de estado semántico

Los estados semánticos tienen siempre dos tokens: el color base (para texto, íconos, bordes) y el contenedor (para fondos sutiles). Nunca se mezclan con tokens de otro estado.

EstadoToken baseHex baseToken contenedorHex contenedor
Errorerror#D32F2FerrorContainer#FFEBEE
Éxitosuccess#2E7D32successContainer#E8F5E8
Advertenciawarning#F57C00warningContainer#FFF3E0
Informacióninfo#1976D2infoContainer#E1F4FF
Pendientepending#EC407ApendingContainer#FCE4EC
Canceladocancelled#90A4AEcancelledContainer#F5F5F5

Tokens de tipografía

El sistema usa dos familias tipográficas con roles estructurales diferenciados. Poppins para jerarquía y acción. Inter para lectura y datos.

Escala tipográfica

La escala sigue cinco rangos semánticos. Cada nivel define familia, peso, tamaño y altura de línea como un bloque indivisible. No se combina el tamaño de un nivel con el peso de otro.

Display — pantallas de impacto y dashboards

TokenFamiliaPesoTamañoAlto de línea
display-largePoppins60057px/sp64px
display-mediumPoppins60045px/sp52px
display-smallPoppins50036px/sp44px

Uso: números de estado en dashboards, métricas de gran tamaño, pantallas de confirmación de impacto.

Headline — encabezados de sección y pantalla

TokenFamiliaPesoTamañoAlto de línea
headline-largePoppins60032px/sp40px
headline-mediumPoppins60028px/sp36px
headline-smallPoppins50024px/sp32px

Uso: título principal de pantalla (headline-large en mobile, headline-medium en desktop), título de sección.

Title — encabezados de tarjeta y lista

TokenFamiliaPesoTamañoAlto de línea
title-largePoppins50022px/sp28px
title-mediumPoppins50016px/sp24px
title-smallPoppins50014px/sp20px

Uso: título de tarjeta (title-medium), nombre de ítem en lista, encabezado de columna de tabla.

Body — texto de contenido y datos

TokenFamiliaPesoTamañoAlto de línea
body-largeInter40016px/sp24px
body-mediumInter40014px/sp20px
body-smallInter40012px/sp16px

Uso: texto de párrafo, valores en campos, contenido de celdas de tabla, descripciones.

Label — etiquetas de interfaz y botones

TokenFamiliaPesoTamañoAlto de línea
label-largePoppins50014px/sp20px
label-mediumPoppins50012px/sp16px
label-smallPoppins50011px/sp16px

Uso: texto de botones (label-large), etiquetas de input, chips, tabs, badges.

Tokens de espaciado

El sistema usa una escala de espaciado basada en múltiplos de 4px. Cada valor de espaciado tiene un nombre que indica el número de unidades de 4px.

TokenValorUso típico
space-14pxMicroajustes, iconos internos, gaps mínimos
space-28pxPadding interno de badges y chips
space-312pxPadding de botones pequeños, separación de ítems
space-416pxPadding base de componentes (botones, inputs)
space-520pxSeparación entre grupos de elementos
space-624pxPadding base de tarjetas, margen de sección
space-832pxSeparación entre secciones de una pantalla
space-1040pxMargen entre componentes de alto nivel
space-1248pxAltura mínima de área táctil, separación de bloques
space-1664pxEspaciado estructural, top bars, footers
space-2080pxSeparación entre secciones de alto impacto visual
space-2496pxEspaciado de layouts de landing y dashboards

Los valores fuera de esta escala (3px, 5px, 11px, 17px) no existen en el sistema y no se aceptan en implementación.

Tokens de elevación

La elevación comunica la jerarquía de capas de la interfaz. Cada nivel tiene una sombra box-shadow que produce la sensación correcta de profundidad sin saturar visualmente la pantalla.

Tokenbox-shadow (CSS)Uso
elevation-0noneSuperficies sin elevación (fondos planos)
elevation-10 1px 3px rgba(0,0,0,0.08)Tarjetas en reposo, inputs
elevation-20 2px 8px rgba(0,0,0,0.10)Dropdowns, tooltips, tarjetas elevadas
elevation-30 4px 16px rgba(0,0,0,0.12)Bottom sheets, popovers, modales ligeros
elevation-40 8px 32px rgba(0,0,0,0.16)Modales, diálogos, drawers

Las sombras siempre son negras con opacidad. No existen sombras de color. No se mezclan niveles de elevación en el mismo nivel visual de la interfaz.

Tokens de radio de borde

El sistema define seis valores de radio de borde. El radio transmite personalidad: un radio mayor comunica modernidad y suavidad; el radio cero comunica sobriedad técnica. El sistema usa valores intermedios que equilibran modernidad con funcionalidad.

TokenValorUso
radius-none0pxTablas, separadores, elementos de lista en ERP
radius-sm4pxChips, badges, inputs en contexto ERP
radius-md8pxBotones en desktop, inputs estándar
radius-lg12pxBotones en mobile, tarjetas compactas
radius-xl16pxTarjetas de contenido, bottom sheets
radius-2xl24pxModales, paneles flotantes
radius-full9999pxAvatares, indicadores circulares, FAB

Tokens de motion

El motion tiene su propio sistema de tokens. Las animaciones sin tokens de duración y curva producen interfaces inconsistentes aunque visualmente correctas en aislado.

Duración

TokenValorUso
duration-instant50msFeedback táctil inmediato (cambio de color en pressed)
duration-fast100msEstados de hover, transiciones de color
duration-normal200msTransiciones de componentes: expand, collapse, fade
duration-slow300msEntrada/salida de elementos de UI (modal, sheet)
duration-xslow500msAnimaciones de impacto, transiciones de pantalla

Curva de animación

TokenValorUso
easing-standardcubic-bezier(0.2, 0, 0, 1)Movimientos de transición estándar
easing-entercubic-bezier(0, 0, 0, 1)Elementos que entran a la pantalla
easing-exitcubic-bezier(0.3, 0.1, 1, 1)Elementos que salen de la pantalla
easing-linearlinearIndicadores de progreso, loaders

Reglas de motion

  • Nada se anima si no sirve a la comprensión del cambio de estado. El motion que no comunica es ruido.
  • Las transiciones de pantalla completa usan duration-xslow con easing-standard. Es la transición más lenta del sistema y se usa raramente.
  • Los estados de hover y press usan duration-fast para que la interfaz sienta respuesta inmediata.
  • En contextos de alto rendimiento (listas largas, tablas de ERP), las animaciones se reducen o eliminan.

Cómo implementar tokens

Los tokens son agnósticos de tecnología. Cada plataforma los implementa en su formato nativo.

/* CSS Custom Properties */
:root {
--color-primary: #ff7043;
--color-on-primary: #ffffff;
--color-surface: #ffffff;
--color-on-surface: #1a1c1e;
--space-4: 16px;
--radius-lg: 12px;
--duration-normal: 200ms;
--easing-standard: cubic-bezier(0.2, 0, 0, 1);
}
// Flutter — ThemeData tokens
static const Color primary = Color(0xFFFF7043);
static const Color onPrimary = Color(0xFFFFFFFF);
static const Color surface = Color(0xFFFFFFFF);
static const Color onSurface = Color(0xFF1A1C1E);
static const double space4 = 16.0;
static const double radiusLg = 12.0;
static const Duration durationNormal = Duration(milliseconds: 200);
// TypeScript / React
export const tokens = {
color: {
primary: "#FF7043",
onPrimary: "#FFFFFF",
surface: "#FFFFFF",
onSurface: "#1A1C1E",
},
space: {
4: "16px",
6: "24px",
},
radius: {
lg: "12px",
},
duration: {
normal: "200ms",
},
};

Resumen

  • Los tokens son los valores nombrados del sistema; nunca se usan valores en crudo en componentes.
  • El color tiene dos niveles: primitivos (hex) y semánticos (significado); se usan siempre los semánticos.
  • El naranja primario (#FF7043) define la acción; las superficies son blancas o gris muy claro; azul y verde solo para estados informacionales y de éxito.
  • El espaciado usa una escala de múltiplos de 4px con trece niveles definidos; no se usan valores fuera de la escala.
  • Motion tiene tokens de duración (50ms a 500ms) y curva; sin tokens de motion no hay animaciones en el sistema.
  • Los tokens se implementan como Custom Properties en CSS, constantes en Flutter y objetos en TypeScript; el formato cambia, el valor no.