Skip to content

Components

ColorPicker

Turn a colour into a hex string: a swatch trigger, a palette the caller supplies, and the value always available as text.

Examples

A palette and a value

Presets come from the caller — the component ships no default palette, because a colour that means something is a product decision.

#3b6ef5

The value is a normalised `#rrggbb` string — what a form, a CSS variable or a design token stores.

Uncontrolled, and disabled

With `defaultValue` the component keeps its own state; `disabled` keeps the value readable without letting anyone change it.

In a field

Inside a `Field` the visible label is the field's, and the message slot is where a rule about the value belongs.

Used for the primary line on every chart.

Usage

import { ColorPicker } from "@luc/ui";
<ColorPicker value={color} onValueChange={setColor} swatches={swatches} label="Series colour" />

`value` plus `onValueChange` controls it; `defaultValue` leaves the state to the component. Either way the value is a hex string, so a form stores it like any other text field.

API

Read from the published TypeScript API, so a prop that is not listed here does not exist and a default that is listed is the one the compiler sees.

Exported symbols
ExportKindSignature
ColorPicker7 documented props({ value, defaultValue, onValueChange, swatches, label, disabled, className, }: ColorPickerProps) => import("@types/react").JSX.Element

ColorPicker props

Type: ColorPickerProps

Values the compiler reads from the declaration.

ColorPicker props
PropTypeDefaultNotes
className?string | undefined—
defaultValue?string | undefined—
disabled?boolean | undefined—
label?string | undefined—
onValueChange?((value: string) => void) | undefined—
swatches?readonly ColorPickerSwatch[] | undefined—Preset swatches. Supply the product's own palette; there is no default set.
value?string | undefined—

Guidelines

Do

  • Pass the product's own `swatches`: the component ships no default palette, because a colour that means something is the caller's decision.
  • Keep the value a hex string; the component parses what it is given and hands back a normalised `#rrggbb`.
  • Give it a `label` when it stands alone, and let `Field` name it when it sits in a form.

Don't

  • Expect a colour space conversion: hex in, hex out, and nothing is written to the clipboard for you.
  • Use a swatch as the only encoding of a meaning — a colour a reader cannot distinguish carries no state.
  • Reach for it when the colour is fixed by the design system; a swatch row is for a choice, not a setting.

Accessibility

The trigger is a real button whose accessible name is the label plus the current value, and the popover exposes the value as text — a hex field a reader can select and copy — so the control does not depend on seeing a colour. Preset swatches are buttons with their own names, and Escape closes the popover and returns focus to the trigger.

Luc UI v1.0ColorPickerdark theme