Color
Dos capas. Las primitivas guardan los valores; los tokens semánticos guardan el significado. Un componente nunca referencia una primitiva, y esa regla la impone la herramienta, no la disciplina.
Por qué dos capas
En Tailwind v4, un token declarado dentro de @theme genera sus utilidades: --color-card produce bg-card, text-card y border-card. Las primitivas se declaran fuera de @theme, así que no generan ninguna.
La consecuencia es la que buscábamos: no existe ninguna utilidad de Tailwind que apunte a un valor crudo. No hace falta acordarse de la regla, porque la clase directamente no existe.
/* capa 1 — primitivas, en :root, sin utilidades */
:root {
--orbit-neutral-950: oklch(15.5% 0.004 285);
--orbit-indigo-600: oklch(54.6% 0.204 278);
}
/* capa 2 — semánticos, dentro de @theme, con utilidades */
@theme {
--color-fg: var(--orbit-neutral-950);
--color-accent: var(--orbit-indigo-600);
}
/* dark mode: solo se redefine la capa semántica */
html.dark {
--color-fg: var(--orbit-neutral-50);
}Superficies
surfaceFondo de páginabg-surfacesurface-subtleZona diferenciada dentro de la páginabg-surface-subtlecardSuperficie de tarjetabg-cardcard-hoverTarjeta bajo el cursorbg-card-hoverraisedMenús, popovers, cualquier cosa que flotebg-raisedinsetHundido: rieles, campos de código, fondos de barrabg-inset
Texto e iconos
fgTexto principalbg-fgfg-mutedSecundario: descripciones, etiquetasbg-fg-mutedfg-subtleTerciario: unidades, marcas de ejebg-fg-subtlefg-disabledDeshabilitadobg-fg-disabledfg-inverseSobre fondo oscuro en tema clarobg-fg-inversefg-on-accentSobre el color de acentobg-fg-on-accent
Bordes
borderBorde por defectobg-borderborder-subtleSeparadores internosbg-border-subtleborder-strongBorde con más presenciabg-border-strongringAnillo de focobg-ring
Acento y estado
accentAcción primariabg-accentaccent-subtleFondo teñido de acentobg-accent-subtleaccent-fgTexto de acentobg-accent-fgsuccessConfirmaciónbg-successdangerError o destrucciónbg-dangerwarningAtenciónbg-warning
Paleta de series
8 · OKLCHValidada con contraste contra el fondo de tarjeta en ambos temas, y con distancia perceptual mínima entre series contiguas. En modo oscuro no se usan los mismos valores: se sustituyen por versiones más claras del mismo matiz.
chart-1chart-2chart-3chart-4chart-5chart-6chart-7chart-8
La regla, en una línea
Si estás por escribir un hex, un oklch() o una clase de paleta cruda, parate: hay un token semántico para eso. Si no lo hay, el que falta es el token, no el literal.