ColorPicker

Компонент выбора цвета с палитрой, переключаемыми цветовыми моделями (HEX / RGB / HSV), альфа-каналом и опциональным режимом ручного подтверждения изменений. Уведомляет об изменении полным RawColor-объектом (hex, rgb, rgba, hsl, hsla, hsv, hsva) — пользователь сам решает, в каком формате потреблять.

Когда использовать

  • Когда пользователю нужно выбрать произвольный цвет (брендинг, темы, разметка карт, рисование).
  • Когда требуется поддержка нескольких цветовых моделей.
  • Когда нужен альфа-канал.

Когда не нужен ColorPicker:

  • Выбор из фиксированной палитры — используйте набор Tag/Chip.
  • Только подтверждение одной заранее заданной коррекции — используйте Toggle/Switch.

Анатомия

Size (default m)

Размерный ряд: s / m / l. Меняются размер палитры, handle-указателя, превью и зазоры.

Alpha (default true)

withAlpha — управляет наличием альфа-канала в палитре и поля Alpha (0–100%).

Available modes (default — все)

availableModes — массив ColorMode[]. Перечисляет модели, доступные переключателю. По умолчанию доступны все (hex, rgb, hsv).

Apply mode (default false)

  • autoApply: trueonChange вызывается на каждое изменение, без footer’а.
  • autoApply: false — изменения накапливаются локально; onChange вызывается только по Apply. Cancel восстанавливает значение из value (или из начального, если используется uncontrolled).

Установка

pnpm add @cloud-ru/ds-color-picker

Примеры использования

Базовое использование

Базовое использованиеControlled с локальным state
tsx
import { ColorPicker } from '@cloud-ru/ds-color-picker';
import { useState } from 'react';

export function Basic() {
  const [color, setColor] = useState<string>('#389f74');

  return <ColorPicker value={color} onChange={raw => setColor(raw.hex)} />;
}

Размеры

Размерыs / m / l из Figma-оси size
tsx
import { ColorPicker } from '@cloud-ru/ds-color-picker';
import { useState } from 'react';

export function Sizes() {
  const [color, setColor] = useState<string>('#389f74');
  const handleChange = (raw: { hex: string }) => setColor(raw.hex);

  return (
    <div style={{ display: 'flex', gap: 12, flexWrap: 'wrap', alignItems: 'center' }}>
      <ColorPicker size='s' value={color} onChange={handleChange} autoApply />
      <ColorPicker size='m' value={color} onChange={handleChange} autoApply />
      <ColorPicker size='l' value={color} onChange={handleChange} autoApply />
    </div>
  );
}

Авто-применение

Авто-применениеautoApply убирает footer
tsx
import { ColorPicker } from '@cloud-ru/ds-color-picker';
import { useState } from 'react';

export function AutoApply() {
  const [color, setColor] = useState<string>('#4387e2');

  return <ColorPicker value={color} autoApply onChange={raw => setColor(raw.hex)} />;
}

Без альфа-канала

Без альфа-каналаwithAlpha=false
tsx
import { ColorPicker } from '@cloud-ru/ds-color-picker';
import { useState } from 'react';

export function WithoutAlpha() {
  const [color, setColor] = useState<string>('#d52e33');

  return <ColorPicker value={color} withAlpha={false} autoApply onChange={raw => setColor(raw.hex)} />;
}

Props

Types

PropsColorPickerProps
PropTypeDefaultRequiredDescription
autoApplybooleantruenoПрименять изменения автоматически. Если `false` — появляются кнопки Cancel/Apply. По умолчанию `true` — без футера (паритет с Figma colorPicker, где Cancel/Apply нет).
availableModesColorMode[]['hex', 'hsv', 'rgb']noКакие цветовые модели доступны переключателю.
classNamestringnoCSS-класс корневого элемента.
data-test-idstringno
onChange((rawColor: RawColor) => void)noКолбек на изменение значения. Вызывается на каждое изменение если `autoApply`, иначе только по нажатию Apply.
size"l" | "m" | "s"mnoРазмер компонента.
valueColornoТекущее значение цвета. Если задано — компонент синхронизируется с ним при изменении.
withAlphabooleantruenoУправляет альфа-каналом палитры и наличием поля Alpha.
withColorAreabooleantruenoПоказывать 2D-область (saturation/value квадрат). `false` — только поля и слайдеры (раскладка для узких поверхностей, напр. мобильный BottomSheet).

Unions

Types

ColorPickerProps

Unions

Адаптивность

ColorPicker — презентационная палитра, управляемая пропсами: сам он раскладку из контекста не читает. Переключение поверхности (surface-swap) живёт на уровне поля-обёртки (FieldColor-сценарий): это поле берёт раскладку из AdaptiveProvider (@cloud-ru/ds-adaptive) и на mobile открывает палитру в BottomSheet снизу, на desktop — в popover. Пропа layoutType у ColorPicker нет.

Desktop-first. Поставьте один <AdaptiveProvider> в корне приложения — адаптивное поле включит mobile-поверхность автоматически.

Под узкую mobile-поверхность ColorPicker отдаёт два пропса раскладки:

Пропdesktopmobile (BottomSheet)
withColorArea2D-область saturation/value (true)компактная раскладка без 2D-квадрата, только поля и слайдеры (false)
autoApplyкоммит на каждое изменение (true)коммит по явному Apply (false)

Компактный режим (mobile)

Компактный режим (mobile)`withColorArea={false}` — без 2D-области saturation/value, только поля и слайдеры.
tsx
import { ColorPicker } from '@cloud-ru/ds-color-picker';
import { useState } from 'react';

export function Compact() {
  const [color, setColor] = useState<string>('#389f74');

  return <ColorPicker value={color} withColorArea={false} autoApply={false} onChange={raw => setColor(raw.hex)} />;
}

Подробнее о модели адаптивности — Адаптивность — паттерн.

Storybook

Figma