De Figma al código
Ejercicio: traduce tus tokens
Con las colecciones que exportaste en el módulo 5, revisa scopes y code syntax, traduce cinco tokens a variables CSS y a un tema de Tailwind CSS, lista tus tokens de código y prepara la tabla de pares de color del módulo 7.
Última revisión:
En este ejercicio llevas tus propios tokens al código. Lo haces a mano, con cinco tokens: así ves qué hace cada paso de la cadena antes de dejarlo en manos de una herramienta. Al terminar tendrás un archivo con las dos capas, variables CSS y tema de Tailwind CSS, y la tabla de pares de color con la que empezarás el módulo Accesibilidad.
En esta página
- Qué necesitas
- Paso 1 Revisa tus archivos
- Paso 2 Revisa scopes y code syntax
- Paso 3 Traduce cinco tokens
- Paso 4 Escribe la capa 1
- Paso 5 Escribe la capa 2
- Paso 6 Lista tus tokens de código
- Paso 7 Prepara los pares de color
- Comprueba tu traducción
- Lo que te llevas
Qué necesitas
- Los archivos que exportaste en el ejercicio del módulo 5, una carpeta por colección (Paso 7 Exporta tus colecciones).
- Tu archivo de Figma, por si tienes que corregir algo y volver a exportar.
- Un editor de texto para abrir los archivos
.tokens.jsony escribir un archivo.css. - Entre 60 y 90 minutos.
No necesitas instalar nada. Los bloques En código de los pasos 3 y 4 son opcionales: normalizar tu exportación con el script y generar la capa 1 con Terrazzo.
Paso 1 Revisa tus archivos
Abre cada carpeta y comprueba:
- Hay un archivo por modo:
Light.tokens.jsonyDark.tokens.jsonensemantic-color/, por ejemplo. - Cada archivo tiene todas las variables de su colección, y el nombre del modo en el
$extensionsde la raíz (Los archivos). - Los semánticos llevan el valor resuelto en
$valuey el destino encom.figma.aliasData.
Si un alias tuyo apunta a una variable de su misma colección, mira cómo lo ha escrito Figma y anótalo: DesignToken101 no tiene ninguno, y la normalización de esta web no lo ha probado.
Paso 2 Revisa scopes y code syntax
Son los dos datos de diseño que deciden el código (Para qué sirve cada dato). Recorre tus archivos y busca:
- Números o textos sin
com.figma.scopes, o conALL_SCOPES. Sin un scope concreto no se puede deducir el tipo (El tipo sale del scope). - Un code syntax que no sea la ruta.
var(--más tu prefijo, la ruta con guiones y). Busca sobre todo las variables que renombraste o duplicaste (Los errores de diseño que detecta).
Corrige en Figma lo que encuentres, vuelve a exportar la colección y sustituye su carpeta entera.
Paso 3 Traduce cinco tokens
Elige cinco tokens de tus archivos:
- Un espacio.
- Un peso tipográfico.
- El tamaño de un título de
Layout. - El texto principal de
Semantic color. - Uno que tú elijas: un radio semántico, un fondo, un borde.
Para cada uno, rellena esta tabla con lo que has visto en el módulo:
| Token | $type exportado | Scope | Tipo DTCG | Valor en CSS | Variable CSS |
|---|
- Tipo DTCG: el que sale del scope (El tipo sale del scope).
- Valor en CSS: el hexadecimal en minúsculas para un color; los píxeles entre 16, en
rem, para un tamaño;var()con la variable del destino si es un alias (Los valores). - Variable CSS: tu code syntax sin
var().
Así quedan los cuatro primeros con los tokens de DesignToken101:
| Token | $type exportado | Scope | Tipo DTCG | Valor en CSS | Variable CSS |
|---|---|---|---|---|---|
space/400 | number | GAP | dimension | 1rem | --t101-space-400 |
font-weight/600 | number | FONT_STYLE | fontWeight | 600 | --t101-font-weight-600 |
font-size/heading/1 | number | FONT_SIZE | dimension | Mobile: var(--t101-font-size-06); Desktop: var(--t101-font-size-07) | --t101-font-size-heading-1 |
color/text/neutral/default | color | SHAPE_FILL, TEXT_FILL | color | Light: var(--t101-color-neutral-900); Dark: var(--t101-color-neutral-50) | --t101-color-text-neutral-default |
Si tienes Node.js instalado, puedes pasar tu exportación por la misma normalización que esta web:
- Crea una carpeta de trabajo con dos carpetas dentro:
tools/ytokens/figma/. - Copia en
tokens/figma/las carpetas de tus colecciones, sin cambiarlas. - Copia en
tools/el archivo figma-to-dtcg.mjs del repositorio de DesignToken101. No tiene dependencias. - Desde la carpeta de trabajo, ejecuta:
node tools/figma-to-dtcg.mjsEl script escribe tus archivos normalizados en tokens/dtcg/, con la misma estructura de carpetas. Borra esa carpeta antes de escribirla, así que no guardes nada tuyo en ella.
Lo probamos así el 2026-10-05, con Node.js 22.22.0, en una carpeta nueva con la exportación de DesignToken101: escribe los 6 archivos, y el texto principal de Light queda con "$value": "{color.neutral.900}".
Si el script se detiene, el mensaje nombra el token y su scope. El script conoce los scopes de DesignToken101; si tu sistema usa otro, como OPACITY o FONT_WEIGHT, decide qué tipo DTCG le corresponde y añádelo al script, o corrige el scope en Figma. Esa decisión es tuya: el script no la toma por ti.
Compara tu tabla con los archivos normalizados: el $type y el $value de tus cinco tokens deberían coincidir con lo que escribiste.
Paso 4 Escribe la capa 1
Crea un archivo tokens.css y escribe las variables de tus cinco tokens, con un bloque por modo (Las variables CSS):
- En
:root, todos con el valor de Light y Mobile. - Si tu token es un alias, escribe también el primitivo al que apunta, con su valor. Sin él, el
var()apuntaría a una variable que no existe. - En
[data-theme="dark"], los que cambian con el tema, con su valor de Dark. - En
@media (width >= 64rem), o el corte de tu sistema, los deLayoutcon su valor de Desktop.
Con los cuatro tokens de la tabla de DesignToken101, el archivo queda así. Cada línea es igual a la del CSS generado de esta web:
tokens.css (ejercicio)
:root {
--t101-color-neutral-50: #f9fafa;
--t101-color-neutral-900: #101a15;
--t101-font-size-06: 2rem;
--t101-font-size-07: 2.5rem;
--t101-space-400: 1rem;
--t101-font-weight-600: 600;
--t101-font-size-heading-1: var(--t101-font-size-06);
--t101-color-text-neutral-default: var(--t101-color-neutral-900);
}
[data-theme="dark"] {
--t101-color-text-neutral-default: var(--t101-color-neutral-50);
}
@media (width >= 64rem) {
:root {
--t101-font-size-heading-1: var(--t101-font-size-07);
}
}Si normalizaste tu exportación en el paso 3, puedes generar la capa 1 de todo tu sistema con Terrazzo y compararla con la que has escrito a mano. Necesitas tres archivos más en tu carpeta de trabajo.
1. Las dependencias. Crea un package.json con { "type": "module" } e instala Terrazzo con la versión de este curso:
npm install -D --save-exact @terrazzo/cli@2.7.1 @terrazzo/plugin-css@2.7.12. El Resolver, en tokens/sistema.resolver.json. Un conjunto con tus colecciones de un modo y un modificador por cada colección con modos (DTCG no tiene modos). Este ejemplo es de un sistema inventado, con una colección Base de un modo y una colección Theme con Light y Dark:
tokens/sistema.resolver.json
{
"name": "Mi sistema",
"version": "2025.10",
"sets": {
"base": {
"sources": [{ "$ref": "dtcg/base/Mode 1.tokens.json" }]
}
},
"modifiers": {
"theme": {
"default": "light",
"contexts": {
"light": [{ "$ref": "dtcg/theme/Light.tokens.json" }],
"dark": [{ "$ref": "dtcg/theme/Dark.tokens.json" }]
}
}
},
"resolutionOrder": [{ "$ref": "#/sets/base" }, { "$ref": "#/modifiers/theme" }]
}Usa los nombres de tus carpetas y de tus archivos tal como los dejó Figma: el $ref admite el espacio de Mode 1.tokens.json.
3. La configuración, en terrazzo.config.mjs. Es la de Las variables CSS sin lo propio de DesignToken101: sin tokens de código, sin Layout y sin la capa de Tailwind CSS.
terrazzo.config.mjs
import { defineConfig } from '@terrazzo/cli';
import css from '@terrazzo/plugin-css';
const PREFIX = '--ds-'; // el de tu code syntax
const THEME_TOKENS = ['surface.**', 'ink.**', 'shape.**']; // los grupos de tu colección con modos
export default defineConfig({
tokens: ['./tokens/sistema.resolver.json'],
outDir: './css/',
plugins: [
css({
filename: 'tokens.css',
variableName: (token) => `${PREFIX}${token.id.replace(/\./g, '-')}`,
legacyHex: true,
transform: (token) =>
token.$type === 'dimension' && !token.aliasOf && token.$value.unit === 'px'
? `${token.$value.value / 16}rem`
: undefined,
permutations: [
{
input: { theme: 'light' },
prepare: (contents) => `:root {\n color-scheme: light;\n ${contents}\n}`,
},
{
input: { theme: 'dark' },
include: THEME_TOKENS,
prepare: (contents) => `[data-theme="dark"] {\n color-scheme: dark;\n ${contents}\n}`,
},
],
}),
],
});Genera el CSS con:
npx tz buildLa sesión de desarrollo de DesignToken101 lo probó el 2026-10-05 con una exportación inventada con este formato (prefijo --ds-, sin Layout, con alias distintos en Light y Dark), Node.js 24.11.1 y Terrazzo 2.7.1: el CSS sale con un bloque :root con todos los tokens y un bloque Dark con los de Theme, los tamaños en rem y los alias con var().
Aviso
Revisa a mano el CSS generado, porque Terrazzo no avisa de estos errores:
- El prefijo tiene que ser el de tu code syntax. Si no, el nombre de la variable CSS no es el que ve quien inspecciona tu diseño.
- Los grupos de
THEME_TOKENStienen que ser los de tu colección con modos. Si no coinciden, el build termina sin error y el bloque Dark no aparece en el CSS. - La normalización va antes. Si el Resolver apunta a la exportación sin normalizar, el build también termina sin error, pero los tamaños salen sin unidad y los alias, sin
var().
Si tienes una colección como Layout, añade su modificador al Resolver, ponlo en el input de cada bloque y añade un bloque con su consulta @media, como en la configuración de esta web. La capa 2 escríbela a mano, como en el paso 5: el generador de la capa 2 de esta web tiene una regla por cada nombre de DesignToken101 y se detiene ante el primero que no conoce.
Paso 5 Escribe la capa 2
En el mismo archivo, añade el tema de Tailwind CSS para tus cinco tokens (El tema de Tailwind CSS):
- Empieza con
@theme inliney--*: initial. - Cada token, en el espacio de nombres de su propiedad, apuntando a su variable de la capa 1.
- No expongas los primitivos de color.
- Al lado de cada línea, escribe la clase que daría.
Con los mismos cuatro tokens:
tokens.css (ejercicio, continuación)
@theme inline {
--*: initial;
--spacing-400: var(--t101-space-400); /* p-400, gap-400… */
--font-weight-600: var(--t101-font-weight-600); /* font-600 */
--text-heading-1: var(--t101-font-size-heading-1); /* text-heading-1 (tamaño) */
--text-color-neutral-default: var(--t101-color-text-neutral-default); /* text-neutral-default */
}Revisa tus nombres: ¿alguno de la capa 2 coincide con uno de la capa 1? Si es así, falta el prefijo (Por qué el prefijo).
Paso 6 Lista tus tokens de código
Repasa tu sistema y anota los tokens que necesita el código y que no tienes en Figma (Los tokens de código):
- El interlineado de tus estilos de texto, como multiplicador: 150 % es
1.5. - El corte entre tus modos de
Layout, si los tienes. - Lo que tu diseño use y Figma no guarde como el código lo necesita: espaciado negativo, duraciones, desenfoque.
Para cada uno, anota su nombre, su valor y por qué vive en código. Si alguno podría ser una variable de Figma, créala y sácalo de la lista.
Paso 7 Prepara los pares de color
Este paso prepara el módulo Accesibilidad (Lo que necesitas para este módulo). Allí comprobarás el contraste de cada texto sobre su fondo, y para eso necesitas el color final de cada par en cada modo.
- Haz una lista de los pares de texto y fondo que usa tu diseño: el texto principal sobre el fondo de la página, el texto sobre el botón principal, el texto de un aviso sobre su fondo…
- Busca cada token en
Light.tokens.jsony enDark.tokens.jsony copia elhexde su$value. Es el color final: en la exportación de DesignToken101, elhexde cada semántico es el de su primitivo. - Si un fondo tiene transparencia, anota también su
alpha: su color final depende de lo que haya debajo.
| Texto | Fondo | Light (texto / fondo) | Dark (texto / fondo) |
|---|---|---|---|
color/text/neutral/default | color/background/neutral/default | #101A15 / #FFFFFF | #F9FAFA / #050C09 |
La primera fila es la de DesignToken101. Añade las tuyas.
Comprueba tu traducción
Tu traducción está lista si puedes responder que sí a estas preguntas:
- ¿Cada número y cada texto de tu exportación tiene un scope concreto?
- ¿Cada code syntax es la ruta de su variable, con tu prefijo?
- ¿Cada tamaño de tu
tokens.cssestá enrem, y cada alias es unvar()a una variable que existe en el archivo? - ¿El bloque de Dark tiene los tokens que cambian con el tema, y el de Desktop, los de
Layout? - ¿Ningún nombre de la capa 2 coincide con uno de la capa 1?
- ¿Tienes la lista de tus tokens de código, cada uno con su motivo?
- ¿Tienes la tabla de pares con el color de cada modo?
Lo que te llevas
- Tienes cinco de tus tokens traducidos a variables CSS, con un bloque por modo, y a un tema de Tailwind CSS.
- Has revisado que los scopes y los code syntax de tu exportación permiten generar el código sin adivinar.
- Tienes la lista de tus tokens de código y la tabla de pares de color para el módulo Accesibilidad.
Fuentes
Las de las lecciones del módulo. En especial: