ColorWheel
ColorWheels allow users to adjust the hue of an HSL or HSB color value on a circular track.
| install | yarn add @react-spectrum/color |
|---|---|
| version | 3.0.0-beta.4 |
| usage | import {ColorWheel} from '@react-spectrum/color' |
Example#
<ColorWheel defaultValue="hsl(30, 100%, 50%)" /><ColorWheel defaultValue="hsl(30, 100%, 50%)" /><ColorWheel defaultValue="hsl(30, 100%, 50%)" />Value#
A ColorWheel's value specifies the position of the ColorWheel's thumb on the track, and accepts a string or Color object.
It is initialized as hsl(0, 100%, 50%) by default, but an alternative initial uncontrolled value can be provided using the defaultValue prop.
Alternatively, a controlled value can be provided using the value prop. Note that only HSB(A) values are supported as valid values.
In the example below, the parseColor function is used to parse the initial color from a HSL string
so that value's type remains consistent.
import {parseColor} from '@react-stately/color';
function Example() {
let [value setValue] = ReactuseState(parseColor('hsl(30, 100%, 50%)'));
return (
<Flex gap="size-300" wrap>
<Flex direction="column" alignItems="center">
<label id="label-1">Hue (uncontrolled)</label>
<ColorWheel
defaultValue="hsl(30, 100%, 50%)"
aria-labelledby="label-1"
/>
</Flex>
<Flex direction="column" alignItems="center">
<label id="label-2">Hue (controlled)</label>
<ColorWheel
value=value
onChange=setValue
aria-labelledby="label-1"
/>
</Flex>
</Flex>
);
}
import {parseColor} from '@react-stately/color';
function Example() {
let [value setValue] = ReactuseState(
parseColor('hsl(30, 100%, 50%)')
);
return (
<Flex gap="size-300" wrap>
<Flex direction="column" alignItems="center">
<label id="label-1">Hue (uncontrolled)</label>
<ColorWheel
defaultValue="hsl(30, 100%, 50%)"
aria-labelledby="label-1"
/>
</Flex>
<Flex direction="column" alignItems="center">
<label id="label-2">Hue (controlled)</label>
<ColorWheel
value=value
onChange=setValue
aria-labelledby="label-1"
/>
</Flex>
</Flex>
);
}
import {parseColor} from '@react-stately/color';
function Example() {
let [
value
setValue
] = ReactuseState(
parseColor(
'hsl(30, 100%, 50%)'
)
);
return (
<Flex
gap="size-300"
wrap>
<Flex
direction="column"
alignItems="center">
<label id="label-1">
Hue
(uncontrolled)
</label>
<ColorWheel
defaultValue="hsl(30, 100%, 50%)"
aria-labelledby="label-1"
/>
</Flex>
<Flex
direction="column"
alignItems="center">
<label id="label-2">
Hue
(controlled)
</label>
<ColorWheel
value=value
onChange=
setValue
aria-labelledby="label-1"
/>
</Flex>
</Flex>
);
}
Labeling#
By default, a localized string for the "hue" channel name is used as the aria-label for the ColorWheel. When a custom aria-label or aria-labelledby
is provided, it should be localized accordingly.
Step values#
The step prop can be used to snap the ColorWheel's value to specific increments. The value provided should the number of degrees that each step should span,
ranging from 0 to 360. Note that the steps are calculated starting from 0˚ and that the final step will always snap back to 0˚, regardless of how much
remaining track distance there is from the step prior.
<ColorWheel step=60 /><ColorWheel step=60 /><ColorWheel
step=60
/>Events#
ColorWheel supports two events: onChange and onChangeEnd. onChange is triggered whenever the ColorWheel's handle is dragged, and onChangeEnd
is triggered when the user stops dragging the handle. Both events receive a Color object
as a parameter.
The example below uses onChange and onChangeEnd to update two separate elements with the ColorWheel's value.
function Example() {
let [currentValue setCurrentValue] = ReactuseState(
parseColor('hsl(50, 100%, 50%)')
);
let [finalValue setFinalValue] = ReactuseState(
parseColor('hsl(50, 100%, 50%)')
);
return (
<div>
<ColorWheel
value=currentValue
onChange=setCurrentValue
onChangeEnd=setFinalValue
/>
<pre>Current value: currentValuetoString('hsl')</pre>
<pre>Final value: finalValuetoString('hsl')</pre>
</div>
);
}
function Example() {
let [currentValue setCurrentValue] = ReactuseState(
parseColor('hsl(50, 100%, 50%)')
);
let [finalValue setFinalValue] = ReactuseState(
parseColor('hsl(50, 100%, 50%)')
);
return (
<div>
<ColorWheel
value=currentValue
onChange=setCurrentValue
onChangeEnd=setFinalValue
/>
<pre>
Current value: currentValuetoString('hsl')
</pre>
<pre>Final value: finalValuetoString('hsl')</pre>
</div>
);
}
function Example() {
let [
currentValue
setCurrentValue
] = ReactuseState(
parseColor(
'hsl(50, 100%, 50%)'
)
);
let [
finalValue
setFinalValue
] = ReactuseState(
parseColor(
'hsl(50, 100%, 50%)'
)
);
return (
<div>
<ColorWheel
value=
currentValue
onChange=
setCurrentValue
onChangeEnd=
setFinalValue
/>
<pre>
Current value:' '
currentValuetoString(
'hsl'
)
</pre>
<pre>
Final value:' '
finalValuetoString(
'hsl'
)
</pre>
</div>
);
}
Props#
| Name | Type | Default | Description |
size | DimensionValue | — | The outer diameter of the ColorWheel. |
isDisabled | boolean | — | Whether the ColorWheel is disabled. |
step | number | 1 | The ColorWheel's step value. |
defaultValue | string | Color | 'hsl(0, 100%, 50%)' | The default value (uncontrolled). |
value | string | Color | — | The current value (controlled). |
Events
| Name | Type | Default | Description |
onChange | (
(value: Color
)) => void | — | Handler that is called when the value changes, as the user drags. |
onChangeEnd | (
(value: Color
)) => void | — | Handler that is called when the user stops dragging. |
Layout
| Name | Type | Default | Description |
flex | Responsive<string
| number
| boolean> | — | When used in a flex layout, specifies how the element will grow or shrink to fit the space available. See MDN. |
flexGrow | Responsive<number> | — | When used in a flex layout, specifies how the element will grow to fit the space available. See MDN. |
flexShrink | Responsive<number> | — | When used in a flex layout, specifies how the element will shrink to fit the space available. See MDN. |
flexBasis | Responsive<number | string> | — | When used in a flex layout, specifies the initial main size of the element. See MDN. |
alignSelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'center'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'stretch'> | — | Overrides the alignItems property of a flex or grid container. See MDN. |
justifySelf | Responsive<'auto'
| 'normal'
| 'start'
| 'end'
| 'flex-start'
| 'flex-end'
| 'self-start'
| 'self-end'
| 'center'
| 'left'
| 'right'
| 'stretch'> | — | Specifies how the element is justified inside a flex or grid container. See MDN. |
order | Responsive<number> | — | The layout order for the element within a flex or grid container. See MDN. |
gridArea | Responsive<string> | — | When used in a grid layout, specifies the named grid area that the element should be placed in within the grid. See MDN. |
gridColumn | Responsive<string> | — | When used in a grid layout, specifies the column the element should be placed in within the grid. See MDN. |
gridRow | Responsive<string> | — | When used in a grid layout, specifies the row the element should be placed in within the grid. See MDN. |
gridColumnStart | Responsive<string> | — | When used in a grid layout, specifies the starting column to span within the grid. See MDN. |
gridColumnEnd | Responsive<string> | — | When used in a grid layout, specifies the ending column to span within the grid. See MDN. |
gridRowStart | Responsive<string> | — | When used in a grid layout, specifies the starting row to span within the grid. See MDN. |
gridRowEnd | Responsive<string> | — | When used in a grid layout, specifies the ending row to span within the grid. See MDN. |
Spacing
| Name | Type | Default | Description |
margin | Responsive<DimensionValue> | — | The margin for all four sides of the element. See MDN. |
marginTop | Responsive<DimensionValue> | — | The margin for the top side of the element. See MDN. |
marginBottom | Responsive<DimensionValue> | — | The margin for the bottom side of the element. See MDN. |
marginStart | Responsive<DimensionValue> | — | The margin for the logical start side of the element, depending on layout direction. See MDN. |
marginEnd | Responsive<DimensionValue> | — | The margin for the logical end side of an element, depending on layout direction. See MDN. |
marginX | Responsive<DimensionValue> | — | The margin for both the left and right sides of the element. See MDN. |
marginY | Responsive<DimensionValue> | — | The margin for both the top and bottom sides of the element. See MDN. |
Sizing
| Name | Type | Default | Description |
minWidth | Responsive<DimensionValue> | — | The minimum width of the element. See MDN. |
maxWidth | Responsive<DimensionValue> | — | The maximum width of the element. See MDN. |
minHeight | Responsive<DimensionValue> | — | The minimum height of the element. See MDN. |
maxHeight | Responsive<DimensionValue> | — | The maximum height of the element. See MDN. |
Positioning
| Name | Type | Default | Description |
position | Responsive<'static'
| 'relative'
| 'absolute'
| 'fixed'
| 'sticky'> | — | Specifies how the element is positioned. See MDN. |
top | Responsive<DimensionValue> | — | The top position for the element. See MDN. |
bottom | Responsive<DimensionValue> | — | The bottom position for the element. See MDN. |
left | Responsive<DimensionValue> | — | The left position for the element. See MDN. Consider using start instead for RTL support. |
right | Responsive<DimensionValue> | — | The right position for the element. See MDN. Consider using start instead for RTL support. |
start | Responsive<DimensionValue> | — | The logical start position for the element, depending on layout direction. See MDN. |
end | Responsive<DimensionValue> | — | The logical end position for the element, depending on layout direction. See MDN. |
zIndex | Responsive<number> | — | The stacking order for the element. See MDN. |
isHidden | Responsive<boolean> | — | Hides the element. |
Accessibility
| Name | Type | Default | Description |
id | string | — | The element's unique identifier. See MDN. |
aria-label | string | — | Defines a string value that labels the current element. |
aria-labelledby | string | — | Identifies the element (or elements) that labels the current element. |
aria-describedby | string | — | Identifies the element (or elements) that describes the object. |
aria-details | string | — | Identifies the element (or elements) that provide a detailed, extended description for the object. |
Advanced
| Name | Type | Default | Description |
UNSAFE_className | string | — | Sets the CSS className for the element. Only use as a last resort. Use style props instead. |
UNSAFE_style | CSSProperties | — | Sets inline style for the element. Only use as a last resort. Use style props instead. |
Visual options#
Disabled#
<ColorWheel isDisabled /><ColorWheel isDisabled /><ColorWheel
isDisabled
/>Size#
<ColorWheel size="size-1600" /><ColorWheel size="size-1600" /><ColorWheel size="size-1600" />Represents a color value.
| Method | Description |
toFormat(
(format: ColorFormat
)): Color | Converts the color to the given color format, and returns a new Color object. |
toHexInt(): number | Converts the color to hex, and returns an integer representation. |
getChannelValue(
(channel: ColorChannel
)): number | Returns the numeric value for a given channel. Throws an error if the channel is unsupported in the current color format. |
withChannelValue(
(channel: ColorChannel,
, value: number
)): Color | Sets the numeric value for a given channel, and returns a new Color object. Throws an error if the channel is unsupported in the current color format. |
getChannelRange(
(channel: ColorChannel
)): ColorChannelRange | Returns the minimum, maximum, and step values for a given channel. |
getChannelName(
(channel: ColorChannel,
, locale: string
)): string | Returns a localized color channel name for a given channel and locale, for use in visual or accessibility labels. |
formatChannelValue(
(channel: ColorChannel,
, locale: string
)): string | Formats the numeric value for a given channel for display according to the provided locale. |
A list of supported color formats.
'hex'
| 'hexa'
| 'rgb'
| 'rgba'
| 'hsl'
| 'hsla'
| 'hsb'
| 'hsba'A list of color channels.
'hue'
| 'saturation'
| 'brightness'
| 'lightness'
| 'red'
| 'green'
| 'blue'
| 'alpha'| Name | Type | Description |
minValue | number | The minimum value of the color channel. |
maxValue | number | The maximum value of the color channel. |
step | number | The step value of the color channel, used when incrementing and decrementing. |
Parses a color from a string value. Throws an error if the string could not be parsed.
parseColor(
(value: string
)): Color