Заметил, что большинство готовых color picker-ов для фронтенда либо урезаны до простого выбора цвета, либо не умеют работать с реальными CSS-градиентами и сложными цветами вроде oklch. Особенно когда речь про редакторы шаблонов, где дизайнеры и маркетологи требуют сохранить фирменные цвета и копировать/вставлять любые CSS-строчки без багов, это начинает сильно напрягать.
В нашем проекте Orshot тоже столкнулся с этим: стандартный пикер валидировал цвета слишком строго и ломался на валидных CSS-градиентах. В итоге написал свой — ColorShot, и недавно залил в open source. В статье расскажу, как он устроен и где реально помогает, а где всё ещё есть нюансы.
Почему обычные color picker-ы не работают с реальным CSS
Большинство популярных библиотек — будь то react-color, react-spectrum и подобные — заточены под простые форматы: hex, rgb(a), hsl(a). Они либо не парсят CSS-градиенты вообще, либо делают это криво. В итоге:
- Если вставить в инпут сложный линейный градиент с несколькими стопами, пикер просто сломается.
- Нельзя сохранить фирменные цвета или недавно использованные — приходится каждый раз копировать вручную.
- Нет поддержки новых цветовых моделей вроде oklch, которые сейчас активно используют для более точной цветокоррекции.
- Слишком много зависимостей и большая бандла — не хочется грузить 60+ КБ ради одного инпута.
В нашем редакторе шаблонов нужен был именно picker, который бы принимал любой валидный CSS цвет или градиент, не менял то, что не нужно, но при этом давал UI для удобного выбора и сохранения цветов.
Что умеет ColorShot
ColorShot — это минималистичный, zero-dep модуль (~14 КБ gzipped), который умеет:
- Парсить любые CSS-цвета и градиенты: hex, rgb, hsl, oklch, линейные, радиальные, конические и повторяющиеся градиенты.
- Работать как с React, так и с Vue — встроенные обертки.
- Позволяет вставлять цвет через Cmd+V, а также выбирать с помощью eye-dropper.
- Поддерживает свотчи: брендовые цвета, сохранённые и недавно использованные.
- Имеет базовую поддержку клавиатуры и скринридеров — важно для доступности.
- При этом core — без внешних зависимостей, что облегчает интеграцию.
Самое крутое — если вбить в инпут сложный CSS-градиент, ColorShot его не “перепишет” и не сломает. Он рендерит визуальный редактор для стопов, но при этом сохраняет остальные параметры, как были.
Как это работает на практике: разбираем пример
Вот упрощённый пример использования в React:
import { ColorShot } from "colorshot";
const brandColors = [
"#0052cc",
"rgb(255, 87, 51)",
"oklch(0.6 0.3 120)",
];
export function GradientEditor() {
const [color, setColor] = React.useState("linear-gradient(90deg, #0052cc 0%, #ff5733 100%)");
return (
<ColorShot
value={color}
onChange={setColor}
swatches={{
brand: brandColors,
recent: [],
saved: [],
}}
enableEyeDropper={true}
accessibleLabels={{
colorInput: "Введите цвет или градиент",
swatchGroup: "Группа цветов",
}}
/>
);
}
Что здесь важно:
- Передаём строку с любым CSS цветом/градиентом в
value. Можно сразу работать с линейным градиентом. - В
swatchesпередаём наши брендовые цвета — удобно, когда надо быстро выбрать фирменный цвет. - Включаем eye-dropper — если браузер поддерживает, можно просто выбирать цвет с экрана.
- Есть события
onChange— возвращается обновлённая строка с цветом или градиентом, готовая к вставке в CSS.
В UI вы увидите визуальные маркеры для каждого цвета в градиенте, сможете перетаскивать стопы, менять прозрачность и т.д. При этом все незначимые части градиента (например, углы, повторения) сохраняются, даже если UI их не отображает напрямую.
Где ColorShot реально полезен, а где стоит быть осторожным
Плюсы на практике
- Если у вас редактор шаблонов или сайт, где пользователи могут вставлять сложные CSS цвета и градиенты — ColorShot не сломает валидные значения и даст базовый удобный UI.
- Поддержка oklch и новых моделей — редкое преимущество, особенно если вы работаете с продвинутой цветокоррекцией.
- Лёгкий вес и отсутствие зависимостей — не увеличивает бандл, легко интегрируется в любые проекты.
- Хорошая доступность — для крупных продуктов это важно.
- Кросс-фреймворк — не надо выбирать между React и Vue.
Ограничения и что стоит учесть
- UI для градиентов пока базовый и не покрывает всех нюансов. Например, сложные повторяющиеся градиенты с множеством стопов работают, но интерфейс с ними не очень удобен.
- Drag & drop для стопов работает, но иногда чувствуется “грубоватым” — API и UX ещё в разработке, автор просит фидбек.
- Нет пока поддержки alpha-канала для всех моделей на одном уровне — иногда приходится вручную править строку.
- Eye-dropper работает только в браузерах с поддержкой, и на некоторых платформах может быть отключён.
- В проектах с очень кастомным UI picker может не вписаться из коробки — придётся кастомизировать.
Итоги и что попробовать дальше
Если вы делаете редактор, где нужны реальные CSS цвета и градиенты, и вас раздражают ограничения популярных библиотек — загляните в ColorShot. Он не панацея, но решает реальную боль с валидацией и поддержкой новых цветовых моделей.
Попробуйте интегрировать в небольшой проект, поиграйте с градиентами, попробуйте drag & drop для стопов и eye-dropper. Если что-то не нравится, можно подать пулл-реквест или обсудить UX с автором.
Мне кажется, такой подход — open-source, zero-dep, с фокусом на реальные CSS свойства — будет всё важнее, особенно когда фронтендеры начинают тесно работать с дизайнерами, а не просто перекладывают готовый цвет из Figma.
В ближайших планах — улучшить поддержку drag & drop, добавить больше кастомизации UI и расширить accessibility. Если вы в теме vibe coding и agentic workflows, где UI подстраивается под контекст и задачи пользователя, ColorShot может стать хорошей базой для создания гибких интерфейсов выбора цвета.
GitHub и демки:
Если вам интересно, как делают кастомные инструменты под реальные задачи в фронтенде — рекомендую попробовать и поделиться впечатлениями.
Попробуй сам: Cursor — AI-редактор для разработчиков.
Источник: https://orshot.com/open-source/colorshot