Colores de Tailwind CSS: la paleta v4 en OKLCH, colores propios y tonos
Tailwind CSS v4 trae 26 escalas de color con 11 tonos cada una, de 50 a 950: 286 colores definidos en OKLCH como variables CSS del tipo --color-blue-500. Los tuyos se añaden con @theme { --color-brand-500: oklch(...) }. El mismo número de tono no significa la misma luminosidad: blue-600 es el azul más claro que alcanza 4.5:1 sobre blanco, mientras que el amarillo necesita el 700.
Lectura: 7 min
Cómo está organizada la paleta de colores de Tailwind
La paleta por defecto de Tailwind v4.3 tiene 26 escalas con nombre. Diecisiete son cromáticas: red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink y rose. Nueve son neutras: slate, gray, zinc, neutral y stone, que vienen de v3, y mauve, olive, mist y taupe, añadidas durante v4. A esto se suman black y white.
Todas las escalas tienen los mismos 11 tonos: 50, 100, 200 y así hasta 900, y 950. El 50 es casi blanco y el 950 casi negro. Una clase es la utilidad más el color y el tono: bg-blue-500, text-rose-700, border-zinc-200.
El número de tono es una posición en la escala, no un valor de luminosidad. El tono 500 va desde un 55.1 % de luminosidad OKLCH en gray hasta un 79.5 % en yellow, y por eso yellow-500 y blue-500 se comportan de forma muy distinta como colores de texto.
| Clase | Valor OKLCH | HEX de respaldo | Contraste sobre blanco |
|---|---|---|---|
| yellow-500 | oklch(79.5% 0.184 86.047) | #efb100 | 1.92:1 |
| amber-500 | oklch(76.9% 0.188 70.08) | #fd9a00 | 2.14:1 |
| green-500 | oklch(72.3% 0.219 149.579) | #00c950 | 2.22:1 |
| cyan-500 | oklch(71.5% 0.143 215.221) | #00b8db | 2.37:1 |
| orange-500 | oklch(70.5% 0.213 47.604) | #ff6900 | 2.89:1 |
| red-500 | oklch(63.7% 0.237 25.331) | #fb2c36 | 3.81:1 |
| blue-500 | oklch(62.3% 0.214 259.815) | #2b7fff | 3.76:1 |
| indigo-500 | oklch(58.5% 0.233 277.117) | #615fff | 4.58:1 |
| gray-500 | oklch(55.1% 0.027 264.364) | #6a7282 | 4.84:1 |
Azul de Tailwind: todos los tonos con OKLCH, HEX y contraste
Esta es la escala azul completa tal como la define Tailwind v4. La columna HEX es el color sRGB más cercano, obtenido bajando el croma y manteniendo la luminosidad y el matiz. Los ratios de contraste son valores WCAG 2 medidos sobre ese HEX.
Blue-600 es el primer tono que alcanza 4.5:1 para texto de cuerpo sobre blanco. Blue-500 pasa sobre negro con 5.58:1, pero falla sobre blanco con 3.76:1. Ningún tono azul alcanza 4.5:1 sobre ambos, así que los temas claro y oscuro necesitan tonos distintos.
| Clase | Valor OKLCH | HEX de respaldo | Sobre blanco | Sobre negro |
|---|---|---|---|---|
| blue-50 | oklch(97% 0.014 254.604) | #eff6ff | 1.09:1 | 19.30:1 |
| blue-100 | oklch(93.2% 0.032 255.585) | #dbeafe | 1.22:1 | 17.21:1 |
| blue-200 | oklch(88.2% 0.059 254.128) | #bedbff | 1.42:1 | 14.77:1 |
| blue-300 | oklch(80.9% 0.105 251.813) | #8ec5ff | 1.81:1 | 11.58:1 |
| blue-400 | oklch(70.7% 0.165 254.624) | #51a2ff | 2.64:1 | 7.96:1 |
| blue-500 | oklch(62.3% 0.214 259.815) | #2b7fff | 3.76:1 | 5.58:1 |
| blue-600 | oklch(54.6% 0.245 262.881) | #155dfc | 5.25:1 | 4.00:1 |
| blue-700 | oklch(48.8% 0.243 264.376) | #1447e6 | 6.83:1 | 3.07:1 |
| blue-800 | oklch(42.4% 0.199 265.638) | #193cb8 | 8.82:1 | 2.38:1 |
| blue-900 | oklch(37.9% 0.146 265.522) | #1c398e | 10.37:1 | 2.03:1 |
| blue-950 | oklch(28.2% 0.091 267.935) | #162456 | 14.78:1 | 1.42:1 |
Qué tonos de Tailwind pasan WCAG AA sobre blanco
El tono más claro que pasa depende del matiz. Orange, amber, yellow, lime y los verdes, teal, cyan y sky siguen siendo claros en el 500, así que necesitan el 700 para texto de cuerpo. Red, blue, violet, purple, fuchsia, pink y rose pasan en el 600, e indigo ya en el 500. Yellow es la excepción: incluso yellow-600 falla para texto grande con 2.93:1.
La luminosidad predice el resultado mejor que el número de tono. Entre los 286 colores, todos los tonos con luminosidad OKLCH por debajo del 58 % alcanzan 4.5:1 sobre blanco, y todos los que superan el 59.2 % fallan. Lee la L en el valor de la clase y sabrás la respuesta antes de probarlo.
| Color | Tono más claro con 4.5:1 | HEX | Ratio | Tono más claro con 3:1 |
|---|---|---|---|---|
| red | 600 | #e7000b | 4.77:1 | 500 |
| orange | 700 | #ca3500 | 5.22:1 | 600 |
| amber | 700 | #bb4d00 | 5.03:1 | 600 |
| yellow | 700 | #a65f00 | 4.93:1 | 700 |
| lime | 700 | #497d00 | 4.98:1 | 600 |
| green | 700 | #008236 | 4.95:1 | 600 |
| emerald | 700 | #007a55 | 5.36:1 | 600 |
| teal | 700 | #00786f | 5.36:1 | 600 |
| cyan | 700 | #007595 | 5.28:1 | 600 |
| sky | 700 | #0069a8 | 5.86:1 | 600 |
| blue | 600 | #155dfc | 5.25:1 | 500 |
| indigo | 500 | #615fff | 4.58:1 | 400 |
| violet | 600 | #7f22fe | 5.89:1 | 500 |
| purple | 600 | #9810fa | 5.54:1 | 500 |
| fuchsia | 600 | #c800de | 4.66:1 | 500 |
| pink | 600 | #e60076 | 4.54:1 | 500 |
| rose | 600 | #ec003f | 4.53:1 | 500 |
| gray | 500 | #6a7282 | 4.84:1 | 500 |
| olive | 600 | #5b5b4b | 6.90:1 | 500 |
Todos los neutros salvo olive pasan en el 500. Olive-500 tiene un 58 % de luminosidad con un matiz amarillento y solo llega a 4.25:1, así que el texto en gray-500 y en olive-500 no es intercambiable.
Colores de Tailwind v3 frente a v4
v3 definía los colores como valores HEX en tailwind.config.js, dentro de theme.extend.colors. v4 lleva la configuración al CSS: los colores son variables de tema dentro de @theme, escritas en OKLCH y expuestas como variables CSS, así que var(--color-blue-500) funciona en CSS normal y en estilos en línea.
La paleta se reajustó, no se rediseñó. Convertido a OKLCH, el blue-500 de v3 (#3b82f6) tiene exactamente la misma luminosidad y el mismo matiz que el blue-500 de v4. Solo subió el croma, de 0.188 a 0.214. El resto de la escala azul sigue el mismo patrón, salvo blue-400, que además se oscureció 0.7 puntos. El contraste apenas cambia, mientras que los colores se ven más vivos.
Ese croma extra va más allá de sRGB. 94 de los 286 colores de v4 están fuera de sRGB y dentro de Display P3, y todos son cromáticos. Orange tiene fuera 9 de sus 11 tonos, blue tiene 4 (del 200 al 500). En una pantalla P3 ves el color completo; en una sRGB, el navegador muestra uno cercano. v4 apunta a Safari 16.4, Chrome 111 y Firefox 128 o posteriores, que entienden oklch().
| Clase | HEX en v3 | HEX de respaldo en v4 | Croma de v3 a v4 | Sobre blanco de v3 a v4 |
|---|---|---|---|---|
| blue-400 | #60a5fa | #51a2ff | 0.143 a 0.165 | 2.54 a 2.64 |
| blue-500 | #3b82f6 | #2b7fff | 0.188 a 0.214 | 3.68 a 3.76 |
| blue-600 | #2563eb | #155dfc | 0.215 a 0.245 | 5.17 a 5.25 |
| blue-700 | #1d4ed8 | #1447e6 | 0.217 a 0.243 | 6.70 a 6.83 |
CSS
@theme {
--color-blue-500: oklch(62.3% 0.214 259.815);
}
.card {
border-color: var(--color-blue-500);
}Cómo añadir colores propios en Tailwind v4
Declara una variable en el espacio de nombres --color- dentro de @theme. Lo que va después de --color- se convierte en el nombre de la clase, así que --color-brand te da bg-brand, text-brand, border-brand, ring-brand y todas las demás utilidades de color, además de var(--color-brand) en CSS. Se aceptan HEX, rgb(), hsl() y oklch().
Para sustituir la paleta por defecto en lugar de ampliarla, primero reinicia el espacio de nombres con --color-*: initial y luego define solo los colores que quieras. Las utilidades solo se generan para las clases que usas de verdad, así que la mayoría de los proyectos conserva los colores por defecto.
CSS
@import 'tailwindcss';
@theme {
--color-brand: #e4572e;
--color-ink: oklch(21% 0.02 260);
}Un solo --color-brand basta para un color de acento. En cuanto necesites estados hover, fondos tintados o modo oscuro, define una escala completa con tonos numerados.
Cómo crear una escala propia completa de 50 a 950
La escala de abajo se generó a partir de #e4572e. Su luminosidad del 63.7 % corresponde al tono 500, así que el color de marca queda exactamente en el 500. Los demás tonos siguen la curva de luminosidad de Tailwind y mantienen el mismo matiz; el croma alcanza su máximo en el 500 y el 600 y se reduce hacia los extremos, y todos caben en sRGB, así que los valores HEX son exactos.
Como los matices cálidos del propio Tailwind, esta escala necesita el 600 para texto de cuerpo sobre blanco. Brand-500 da 3.68:1, suficiente solo para texto grande e iconos.
| Clase | HEX | Sobre blanco |
|---|---|---|
| brand-50 | #fcf3f0 | 1.09:1 |
| brand-100 | #fae4de | 1.22:1 |
| brand-200 | #f8cec3 | 1.44:1 |
| brand-300 | #f3ae9a | 1.85:1 |
| brand-400 | #ed7d5e | 2.73:1 |
| brand-500 | #e4572e | 3.68:1 |
| brand-600 | #ce3a00 | 4.97:1 |
| brand-700 | #ae3000 | 6.52:1 |
| brand-800 | #912600 | 8.46:1 |
| brand-900 | #77260e | 10.15:1 |
| brand-950 | #441508 | 15.48:1 |
CSS
@theme {
--color-brand-50: oklch(97% 0.01103 36.478);
--color-brand-100: oklch(93.477% 0.02574 36.478);
--color-brand-200: oklch(88.485% 0.04964 36.478);
--color-brand-300: oklch(81.145% 0.08641 36.478);
--color-brand-400: oklch(71.064% 0.14524 36.478);
--color-brand-500: oklch(63.723% 0.18385 36.478);
--color-brand-600: oklch(56.583% 0.19167 36.478);
--color-brand-700: oklch(49.952% 0.16921 36.478);
--color-brand-800: oklch(43.729% 0.14814 36.478);
--color-brand-900: oklch(38.935% 0.11766 36.478);
--color-brand-950: oklch(27% 0.07538 36.478);
}Conserva toda la precisión al pegar. Redondear la luminosidad a 0.1 % y el croma a tres decimales saca a brand-600 justo fuera de sRGB, lo que no causa problemas, pero ya no coincide exactamente con el HEX.
Cómo funcionan los modificadores de opacidad como bg-blue-500/50
Una barra después del color fija su canal alfa: bg-blue-500/50 es blue-500 al 50 %. v3 lo compilaba a rgb(59 130 246 / 0.5), lo que solo funcionaba con colores que Tailwind podía separar en canales. Los colores propios definidos como variables CSS necesitaban un formato especial, rgb(var(--brand) / <alpha-value>).
v4 compila el modificador a color-mix() en Oklab, mezclando el color con transparent. Eso funciona con cualquier color: variables de tema, valores arbitrarios como bg-[#e4572e]/50 y tus propias variables CSS.
La opacidad cambia el contraste. Sobre blanco, blue-500/50 se ve como #95bfff y blue-500/10 como #eaf2ff. El texto en blue-600 se lee con 5.25:1, pero text-blue-600/60 baja a 2.62:1 y falla incluso para texto grande.
- blue-500#2b7fff
- blue-500/50 sobre blanco#95bfff
- blue-500/20 sobre blanco#d5e5ff
- blue-500/10 sobre blanco#eaf2ff
CSS
.bg-blue-500\/50 {
background-color: color-mix(in oklab, var(--color-blue-500) 50%, transparent);
}Cómo encontrar la clase de Tailwind más cercana a cualquier HEX
Compara el HEX con los 286 tonos por distancia perceptual en Oklab (ΔEOK). Por debajo de unos 0.02 la diferencia cuesta verla lado a lado, así que la clase de Tailwind puede sustituir a tu color. Por encima de unos 0.04, mejor añade un color propio.
La tabla muestra coincidencias reales. Los antiguos valores HEX de v3 vuelven a la misma clase de v4, mientras que un naranja de marca típico como #ff5733 cae entre orange-600 y red-400. La página de Tailwind de PickShade hace esta búsqueda para cualquier color y muestra las tres clases más cercanas.
| Tu color | Clase v4 más cercana | HEX de la clase | ΔEOK |
|---|---|---|---|
| #635bff | indigo-500 | #615fff | 0.008 |
| #1da1f2 | sky-500 | #00a6f4 | 0.020 |
| #10b981 | emerald-500 | #00bc7d | 0.021 |
| #3b82f6 | blue-500 | #2b7fff | 0.026 |
| #e4572e | orange-600 | #f54900 | 0.042 |
| #ff5733 | orange-600 | #f54900 | 0.046 |
Preguntas y respuestas
¿Cuántos colores tiene Tailwind CSS?
Tailwind CSS v4.3 tiene 26 escalas de color con 11 tonos cada una, de 50 a 950, lo que suma 286 colores más el negro y el blanco. Diecisiete escalas son cromáticas y nueve son neutras: slate, gray, zinc, neutral, stone, mauve, olive, mist y taupe.
¿Cuál es el código HEX de blue-500 en Tailwind?
En Tailwind v4, blue-500 es oklch(62.3% 0.214 259.815), que queda ligeramente fuera de sRGB; su HEX más cercano es #2b7fff. En Tailwind v3, blue-500 era #3b82f6, con la misma luminosidad y el mismo matiz, pero menos croma.
¿Cómo añado colores propios en Tailwind v4?
Añade una variable en el espacio de nombres --color- dentro de @theme en tu CSS, por ejemplo @theme { --color-brand-500: oklch(63.7% 0.184 36.48); }. Tailwind genera entonces bg-brand-500, text-brand-500 y todas las demás utilidades de color, y el valor queda disponible como var(--color-brand-500).
¿Qué colores de Tailwind son accesibles sobre fondo blanco?
Para texto de cuerpo con 4.5:1 sobre blanco, usa el 600 en red, blue, violet, purple, fuchsia, pink y rose; el 700 en orange, amber, yellow, lime, green, emerald, teal, cyan y sky; y el 500 en indigo y en la mayoría de los neutros. Olive es la excepción entre los neutros y necesita el 600.
¿Por qué los colores de Tailwind v4 se ven más saturados que los de v3?
Tailwind v4 define los colores en OKLCH y subió su croma. En la escala azul, por ejemplo, la luminosidad y el matiz se mantuvieron casi exactamente como en v3, mientras que el croma de los tonos intermedios subió entre 0.02 y 0.03. 94 de los 286 colores están ahora fuera de sRGB y usan la gama más amplia de Display P3, así que se ven más vivos en pantallas P3 como los iPhone y Mac recientes.
¿Puedo usar colores HEX en @theme de Tailwind v4?
Sí. Las variables de tema aceptan cualquier color CSS, incluidos HEX, rgb(), hsl() y oklch(). Los modificadores de opacidad funcionan con todos ellos porque v4 los construye con color-mix().