Цвета Tailwind CSS: палитра v4 в OKLCH, свои цвета и оттенки
В Tailwind CSS v4 есть 26 цветовых шкал по 11 ступеней, от 50 до 950, всего 286 цветов в OKLCH, доступных как CSS-переменные вида --color-blue-500. Свой цвет добавляется через @theme { --color-brand-500: oklch(...) }. Одинаковый номер ступени не означает одинаковую светлоту: у синего текст на белом проходит порог 4.5:1 уже с 600, а жёлтому нужна 700.
Читать 6 мин
Как устроена палитра Tailwind
В стандартной палитре Tailwind v4.3 двадцать шесть именованных шкал. Семнадцать из них хроматические: red, orange, amber, yellow, lime, green, emerald, teal, cyan, sky, blue, indigo, violet, purple, fuchsia, pink и rose. Ещё девять нейтральные: slate, gray, zinc, neutral и stone остались с v3, а mauve, olive, mist и taupe появились уже в v4. Сверху идут black и white.
У каждой шкалы одни и те же ступени: 50, 100, 200 и так далее до 900, плюс 950. Ступень 50 почти белая, 950 почти чёрная. Класс складывается из утилиты, названия цвета и ступени: bg-blue-500, text-rose-700, border-zinc-200.
Номер ступени задаёт место в шкале, а не светлоту. У ступени 500 светлота OKLCH колеблется от 55.1% у gray до 79.5% у yellow, поэтому yellow-500 и blue-500 ведут себя в тексте совсем по-разному.
| Класс | Значение OKLCH | HEX-запас | Контраст на белом |
|---|---|---|---|
| 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 |
Синий Tailwind: все оттенки с OKLCH, HEX и контрастом
Ниже вся шкала blue в том виде, в каком её задаёт Tailwind v4. HEX в таблице это ближайший цвет sRGB, найденный снижением насыщенности при сохранении светлоты и тона. Контраст посчитан по WCAG 2 именно для этого HEX.
Blue-600 это первая ступень, которая даёт 4.5:1 для основного текста на белом. Blue-500 на чёрном проходит с 5.58:1, а на белом нет, там всего 3.76:1. Ни одна ступень синего не проходит 4.5:1 сразу на белом и на чёрном, так что светлой и тёмной теме нужны разные ступени.
| Класс | Значение OKLCH | HEX-запас | На белом | На чёрном |
|---|---|---|---|---|
| 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 |
Какие оттенки Tailwind проходят WCAG AA на белом
Самая светлая подходящая ступень зависит от тона. Orange, amber, yellow, lime, а также зелёные, бирюзовые и голубые шкалы на ступени 500 ещё светлые, для основного текста им нужна 700. Red, blue, violet, purple, fuchsia, pink и rose проходят с 600, indigo уже с 500. Особняком стоит жёлтый: даже yellow-600 не дотягивает до 3:1 для крупного текста, у него 2.93:1.
Светлота предсказывает результат лучше номера ступени. Среди всех 286 цветов любой оттенок со светлотой OKLCH ниже 58% проходит 4.5:1 на белом, а любой светлее 59.2% не проходит. Посмотрите на L в значении класса, и ответ известен ещё до проверки.
| Цвет | Первая ступень для 4.5:1 | HEX | Контраст | Первая ступень для 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 |
Все нейтральные шкалы, кроме olive, проходят уже на 500. У olive-500 светлота 58% и желтоватый тон, контраст всего 4.25:1, поэтому текст gray-500 и olive-500 нельзя менять один на другой без проверки.
Цвета Tailwind v3 и v4: в чём разница
В v3 цвета задавались HEX-значениями в tailwind.config.js, в разделе theme.extend.colors. В v4 настройка переехала в CSS: цвета стали переменными темы внутри @theme, записаны в OKLCH и доступны как CSS-переменные, так что var(--color-blue-500) работает в обычном CSS и в inline-стилях.
Саму палитру не перерисовали, а подкрутили. Если перевести blue-500 из v3 (#3b82f6) в OKLCH, светлота и тон совпадут с blue-500 из v4 до третьего знака. Выросла только насыщенность: с 0.188 до 0.214. Так же устроена вся шкала синего, кроме blue-400, который вдобавок стал темнее на 0.7 пункта. Контраст почти не изменился, а цвета стали сочнее.
Добавленная насыщенность выходит за пределы sRGB. Из 286 цветов v4 ровно 94 лежат вне sRGB, но внутри Display P3, и все они хроматические. У orange за охват sRGB выходят 9 ступеней из 11, у blue четыре, с 200 по 500. На экране с P3 виден полный цвет, на экране sRGB браузер показывает близкий к нему. v4 рассчитан на Safari 16.4, Chrome 111 и Firefox 128 и новее, и все они понимают oklch().
| Класс | HEX в v3 | HEX-запас в v4 | Насыщенность v3 и v4 | На белом v3 и v4 |
|---|---|---|---|---|
| blue-400 | #60a5fa | #51a2ff | 0.143 и 0.165 | 2.54 и 2.64 |
| blue-500 | #3b82f6 | #2b7fff | 0.188 и 0.214 | 3.68 и 3.76 |
| blue-600 | #2563eb | #155dfc | 0.215 и 0.245 | 5.17 и 5.25 |
| blue-700 | #1d4ed8 | #1447e6 | 0.217 и 0.243 | 6.70 и 6.83 |
CSS
@theme {
--color-blue-500: oklch(62.3% 0.214 259.815);
}
.card {
border-color: var(--color-blue-500);
}Как добавить свой цвет в Tailwind v4
Объявите переменную в пространстве --color- внутри @theme. Всё, что стоит после --color-, становится именем в классе: --color-brand даёт bg-brand, text-brand, border-brand, ring-brand и остальные цветовые утилиты, а в CSS доступен var(--color-brand). Подходят HEX, rgb(), hsl() и oklch().
Чтобы заменить стандартную палитру целиком, а не дополнить её, сначала сбросьте пространство строкой --color-*: initial и затем объявите только нужные цвета. Утилиты генерируются только для классов, которые вы используете, поэтому стандартную палитру обычно оставляют.
CSS
@import 'tailwindcss';
@theme {
--color-brand: #e4572e;
--color-ink: oklch(21% 0.02 260);
}Одного --color-brand хватает для единственного акцента. Как только нужны hover-состояния, подложки и тёмная тема, заведите полную шкалу с номерами ступеней.
Как собрать свою шкалу от 50 до 950
Шкала ниже построена из #e4572e. Его светлота 63.7% соответствует ступени 500, поэтому фирменный цвет остаётся ровно на 500. Остальные ступени идут по кривой светлоты Tailwind, сохраняют тон, насыщенность максимальна на 500 и 600 и плавно убывает к краям, и все значения помещаются в sRGB, так что HEX точный.
Как и тёплым цветам самого Tailwind, этой шкале для основного текста на белом нужна ступень 600. У brand-500 контраст 3.68:1, этого хватает только для крупного текста и иконок.
| Класс | HEX | На белом |
|---|---|---|
| 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);
}Копируйте значения с полной точностью. Если округлить светлоту до 0.1%, а насыщенность до трёх знаков, brand-600 чуть выйдет за охват sRGB: ничего не сломается, но цвет перестанет точно совпадать с HEX.
Как работает прозрачность вида bg-blue-500/50
Число после косой черты задаёт альфу: bg-blue-500/50 это blue-500 с прозрачностью 50%. В v3 это компилировалось в rgb(59 130 246 / 0.5) и работало только для цветов, которые Tailwind мог разложить на каналы. Для своих цветов в CSS-переменных приходилось писать особый формат rgb(var(--brand) / <alpha-value>).
В v4 модификатор превращается в color-mix() в пространстве Oklab: цвет смешивается с transparent. Так работает любой цвет: переменные темы, произвольные значения вроде bg-[#e4572e]/50 и ваши собственные CSS-переменные.
Прозрачность меняет контраст. На белом blue-500/50 выглядит как #95bfff, а blue-500/10 как #eaf2ff. Текст blue-600 даёт 5.25:1, а text-blue-600/60 падает до 2.62:1 и не проходит даже для крупного текста.
CSS
.bg-blue-500\/50 {
background-color: color-mix(in oklab, var(--color-blue-500) 50%, transparent);
}Как найти ближайший класс Tailwind для любого HEX
Сравните HEX со всеми 286 оттенками по воспринимаемому расстоянию в Oklab (ΔEOK). Ниже примерно 0.02 разницу трудно заметить даже рядом, и класс Tailwind может заменить ваш цвет. Выше примерно 0.04 лучше добавить свой цвет.
В таблице настоящие совпадения. Старые HEX из v3 возвращаются к тому же классу v4, а типичный фирменный оранжевый вроде #ff5733 попадает между orange-600 и red-400. Страница Tailwind в PickShade делает такой поиск для любого цвета и показывает три ближайших класса.
| Ваш цвет | Ближайший класс v4 | HEX класса | Δ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 |
Вопросы и ответы
Сколько цветов в Tailwind CSS?
В Tailwind CSS v4.3 двадцать шесть цветовых шкал по 11 ступеней, от 50 до 950, то есть 286 цветов плюс black и white. Семнадцать шкал хроматические, девять нейтральные: slate, gray, zinc, neutral, stone, mauve, olive, mist и taupe.
Какой HEX у blue-500 в Tailwind?
В Tailwind v4 blue-500 задан как oklch(62.3% 0.214 259.815) и немного выходит за sRGB, ближайший HEX это #2b7fff. В Tailwind v3 blue-500 был #3b82f6: светлота и тон те же, насыщенность ниже.
Как добавить свой цвет в Tailwind v4?
Добавьте в CSS переменную из пространства --color- внутри @theme, например @theme { --color-brand-500: oklch(63.7% 0.184 36.48); }. Tailwind сгенерирует bg-brand-500, text-brand-500 и остальные цветовые утилиты, а значение будет доступно как var(--color-brand-500).
Какие цвета Tailwind подходят для текста на белом фоне?
Для основного текста с контрастом 4.5:1 на белом берите 600 у red, blue, violet, purple, fuchsia, pink и rose, 700 у orange, amber, yellow, lime, green, emerald, teal, cyan и sky, и 500 у indigo и большинства нейтральных. Среди нейтральных исключение olive, ему нужна 600.
Почему цвета Tailwind v4 ярче, чем в v3?
Tailwind v4 записал цвета в OKLCH и поднял их насыщенность. Например, в шкале синего светлота и тон почти не изменились по сравнению с v3, а насыщенность средних ступеней выросла на 0.02 или 0.03. Теперь 94 цвета из 286 выходят за sRGB и используют более широкий охват Display P3, поэтому на экранах с P3, например у свежих iPhone и Mac, они выглядят сочнее.
Можно ли писать HEX в @theme Tailwind v4?
Да. Переменные темы принимают любой цвет CSS: HEX, rgb(), hsl() и oklch(). Модификаторы прозрачности работают со всеми, потому что v4 строит их через color-mix().