Vercel の UI SDK 0.1.0-beta.1 上に構築。API は変わる可能性があります。
Color picker
Vercel の UI SDK 上に作ったカラーピッカー。彩度エリア、色相とアルファのスライダー、入力できる CSS カラー、プリセット、スポイトを備えます。
- フォームのコンポーネント
- 15 個のパーツ
- 11 個の例
@tabler/icons-react@ui-sdk/core@ui-sdk/react
pnpm dlx shadcn@latest add https://hextaui.com/r/ui-sdk-color-picker.jsonコンポーネント、HextaUIのテーマトークン、依存するHextaUIコンポーネントを追加します。
まだ追加していない場合は、グローバルCSSにテーマトークンを追加してください。
依存関係をインストールします。
pnpm add @ui-sdk/react@0.1.0-beta.1 @ui-sdk/core@0.1.0-beta.1 @tabler/icons-react cn次のコードをコピーしてプロジェクトに貼り付けてください。
components/ui/ui-sdk-color-picker.tsx インポートパスは、お使いのプロジェクト構成に合わせて更新してください。
UI SDK は ui-sdk というカスケードレイヤーに少しだけ独自の CSS を追加します。自分のクラスが優先されるよう、グローバルスタイルシートの先頭、Tailwind の import より上でこのレイヤーを宣言してください。
値は CSS のカラー文字列です。すべてのパーツが同じ色を編集するので、必要なパーツだけ使ってください。ColorPickerArea と ColorPickerSlider はつまみを自動で描画します。ピッカーには aria-label か、周りのフィールドのラベルで名前を付けます。
設定ページやサイドバー向けに、ポップオーバーなしでパーツをその場に表示します。
channel="alpha" のスライダーは不透明度を編集します。トラックとスウォッチは色の下に市松模様を描くので、透ける色は透けて見えます。
space="oklch" では ColorPickerAreaCanvas を追加してエリアを描きます。画面の色域外の色は空白のままで、そこへドラッグしたつまみは離すと色域内の最も近い色に収まります。
ColorPickerSwatches はタブ移動 1 回分で、プリセット間は矢印キーで移動します。値の書き方が違ってもプリセットは選択されたままです。ColorPickerChannelInput は 1 つのチャンネルを数値で編集します。スポイトは画面から色を取れないブラウザでは自動で隠れます。
スライダーに orientation="vertical" を指定すると、エリアの横に縦に並べられます。
onValueChange はドラッグの各ステップで、onValueCommit は終了時に 1 回実行されるので、保存は後者で行います。createColorPickerController() のコントローラーを使えば、どこからでも色を設定できます。
隠し input が name で値を送信し、フォームをリセットすると defaultValue に戻ります。
readOnly ではつまみにフォーカスでき値も送信されますが、ドラッグ、キー、入力では色は変わりません。
UI SDK はページから文字の方向を読み取るので、エリア、スライダー、矢印キーは左右反転します。input は自分で方向を決めるため、hex 値は左から右に読めます。
| キー | アクション |
|---|---|
| ←→↑↓ | つまみを 1 ステップ動かします。エリアでは左右キーで横に、上下キーで縦に動きます。 |
| Shift + arrow | 10 ステップ動かします。 |
| Page UpPage Down | 範囲の 10 分の 1 だけ、エリアでは上下に、スライダーでは軸に沿って動かします。 |
| HomeEnd | 先頭または末尾へ動かします。 |
| Enter | input のテキストを読み取るか、フォーカス中のプリセットを選びます。 |
| Esc | input のテキストを値に戻すか、ポップオーバーを閉じます。 |
カラーピッカーに当てはまる WAI-ARIA パターンはないため、UI SDK は既存のパターンを組み合わせて作ります。ピッカーはグループです。エリアのつまみと各スライダーのつまみはスライダーで、エリアのつまみは「彩度 76%、明度 96%」のように 2 つのチャンネルを読み上げます。プリセットはリストボックスで、各プリセットとスウォッチは「鮮やかな青」のように色で名前が付きます。
ポップオーバーの例のトリガーは、名前に現在の色を含みます。つまみはモーションが許可されているときだけドラッグ中に大きくなり、市松模様、リング、フォーカス枠は強制カラーモードでシステムカラーに切り替わります。
各パーツは同名の UI SDK パーツをラップし、render やパーツの状態を受け取る関数にもできる className を含むすべての props を受け付けます。
| プロパティ | 型 | デフォルト |
|---|---|---|
value | string | – |
defaultValue | string | "black" |
onValueChangeドラッグの各ステップ、キー操作、入力した色、プリセットのたびに実行されます。 | (value: string, details: ChangeDetails) => void | – |
onValueCommitドラッグ、キー操作、色の入力が終わったときに 1 回実行されます。 | (value: string, details: ChangeDetails) => void | – |
spaceパーツが編集するチャンネル。 | "hsv" | "hsl" | "srgb" | "oklch" | "hsv" |
format値の書き方。hsv では hex、それ以外はその色空間の CSS 構文です。 | ColorFormat | – |
gamut | "srgb" | "p3" | false | "srgb" |
disabled | boolean | false |
readOnly | boolean | false |
required | boolean | false |
name | string | – |
form | string | – |
controllercreateColorPickerController() で作成します。 | ColorPickerController | – |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="color-picker" | CSSでルートを指定します。 |
data-disabled | 無効のときに存在します。 |
data-readonly | 読み取り専用のときに付与されます。 |
data-required | 必須のときに付与されます。 |
data-out-of-gamut | ドラッグで色域外の色を指している間、すべてのパーツに付きます。 |
--color-picker-color | CSS の色。つまみとスウォッチはこの色で塗られます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
x横方向のチャンネル。色空間により彩度、赤、またはクロマです。 | ColorChannel | – |
y縦方向のチャンネル。色空間により明度、輝度、または緑です。 | ColorChannel | – |
children | ReactNode | <ColorPickerAreaThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="color-picker-area" | CSS でエリアを指定するときに使います。 |
--color-area-background | エリアを描くグラデーション。canvas で描く場合は未設定です。 |
--color-picker-radius | エリアの角の半径。角が同心になるよう ColorPickerContent が設定します。 |
| 属性 | 説明 |
|---|---|
data-slot="color-picker-area-thumb" | CSS でつまみを指定するときに使います。 |
--area-x | エリア内のつまみの横位置。0 から 1。 |
--area-y | エリア内のつまみの縦位置。0 から 1。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
channel既定は色相、sRGB では青です。 | ColorChannel | – |
orientation | "horizontal" | "vertical" | "horizontal" |
children | ReactNode | <ColorPickerSliderThumb /> |
render | ReactElement | (props, state) => ReactElement | <div> |
| 属性 | 説明 |
|---|---|
data-slot="color-picker-slider" | CSS でスライダーを指定するときに使います。 |
data-channel | 編集するチャンネル。色相やアルファなど。 |
data-orientation | horizontal または vertical。 |
--color-slider-background | チャンネルに沿ったグラデーション。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
channel編集するチャンネル。人が読む単位で表示します。 | ColorChannel | – |
render | ReactElement | (props, state) => ReactElement | <input> |
| プロパティ | 型 | デフォルト |
|---|---|---|
value必須。プリセットの色です。 | string | – |
render | ReactElement | (props, state) => ReactElement | <button> |
| 属性 | 説明 |
|---|---|
data-slot="color-picker-swatch-item" | CSS でプリセットを指定するときに使います。 |
data-selected | 値がこのプリセットの色である間に付きます。 |
| プロパティ | 型 | デフォルト |
|---|---|---|
children | ReactNode | <IconColorPicker /> |
render | ReactElement | (props, state) => ReactElement | <button> |
| 属性 | 説明 |
|---|---|
data-unsupported | ブラウザに EyeDropper がない場合に付きます。そのときボタンは隠れます。 |
ColorPickerPopover、ColorPickerTrigger、ColorPickerContent は UI SDK のポップオーバーをラップします。コンテンツはブラウザのトップレイヤーに開くため、ポータルは不要です。
| プロパティ | 型 | デフォルト |
|---|---|---|
side | "top" | "bottom" | "left" | "right" | "start" | "end" | "bottom" |
align | "start" | "center" | "end" | "start" |
sideOffset | number | 6 |
| 属性 | 説明 |
|---|---|
data-slot="popover-content" | UI SDK がポップアップに付けます。CSS で指定するときに使います。 |
data-starting-style | ポップアップが表示アニメーション中に付きます。 |
data-ending-style | ポップアップが非表示アニメーション中に付きます。 |
- Calendar単一、範囲、複数選択に対応する日付グリッドです。月のスライド、範囲のプレビュー、タッチしやすいサイズの日付セルを備えています。
- Checkboxチェックが描かれるように表示されるチェックボックスです。中間状態の親、グループ、ホバーを共有するラベルに対応します。
- Comboboxチップ、グループ、非同期の結果に対応した、絞り込み可能なセレクトです。入力に合わせてポップアップのサイズが変わります。
- Date picker押すとポップオーバーでカレンダーを開くボタンです。スマートフォンではボトムシートになり、単一の日付も範囲も選べます。
- Fieldコントロールに紐付いたラベル、説明、エラーです。バリデーション状態とフォーム向けのレイアウトを備えています。
- Input3つのサイズ、無効状態と読み取り専用状態、ネイティブのバリデーションスタイル、スマートフォンでズームされない16pxのタッチ用フォントを備えたテキスト入力です。