ColorSwatchPicker
A ColorSwatchPicker displays a list of color swatches and allows a user to select one of them.
install | yarn add react-aria-components |
---|---|
version | 1.4.0 |
usage | import {ColorSwatchPicker} from 'react-aria-components' |
Example#
import {ColorSwatch, ColorSwatchPicker, ColorSwatchPickerItem} from 'react-aria-components';
<ColorSwatchPicker>
<ColorSwatchPickerItem color="#A00">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#f80">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#080">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#08f">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#088">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#008">
<ColorSwatch />
</ColorSwatchPickerItem>
</ColorSwatchPicker>
import {
ColorSwatch,
ColorSwatchPicker,
ColorSwatchPickerItem
} from 'react-aria-components';
<ColorSwatchPicker>
<ColorSwatchPickerItem color="#A00">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#f80">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#080">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#08f">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#088">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#008">
<ColorSwatch />
</ColorSwatchPickerItem>
</ColorSwatchPicker>
import {
ColorSwatch,
ColorSwatchPicker,
ColorSwatchPickerItem
} from 'react-aria-components';
<ColorSwatchPicker>
<ColorSwatchPickerItem color="#A00">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#f80">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#080">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#08f">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#088">
<ColorSwatch />
</ColorSwatchPickerItem>
<ColorSwatchPickerItem color="#008">
<ColorSwatch />
</ColorSwatchPickerItem>
</ColorSwatchPicker>
Show CSS
@import "@react-aria/example-theme";
.react-aria-ColorSwatchPicker {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.react-aria-ColorSwatchPickerItem {
position: relative;
outline: none;
border-radius: 4px;
width: fit-content;
forced-color-adjust: none;
&[data-focus-visible] {
outline: 2px solid var(--focus-ring-color);
outline-offset: 2px;
}
&[data-selected]::after {
content: '';
position: absolute;
inset: 0;
border: 2px solid black;
outline: 2px solid white;
outline-offset: -4px;
border-radius: inherit;
}
}
@import "@react-aria/example-theme";
.react-aria-ColorSwatchPicker {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.react-aria-ColorSwatchPickerItem {
position: relative;
outline: none;
border-radius: 4px;
width: fit-content;
forced-color-adjust: none;
&[data-focus-visible] {
outline: 2px solid var(--focus-ring-color);
outline-offset: 2px;
}
&[data-selected]::after {
content: '';
position: absolute;
inset: 0;
border: 2px solid black;
outline: 2px solid white;
outline-offset: -4px;
border-radius: inherit;
}
}
@import "@react-aria/example-theme";
.react-aria-ColorSwatchPicker {
display: flex;
gap: 8px;
flex-wrap: wrap;
}
.react-aria-ColorSwatchPickerItem {
position: relative;
outline: none;
border-radius: 4px;
width: fit-content;
forced-color-adjust: none;
&[data-focus-visible] {
outline: 2px solid var(--focus-ring-color);
outline-offset: 2px;
}
&[data-selected]::after {
content: '';
position: absolute;
inset: 0;
border: 2px solid black;
outline: 2px solid white;
outline-offset: -4px;
border-radius: inherit;
}
}
Features#
A ColorSwatchPicker
wraps the ListBox component to simplify building color swatch pickers that work with a ColorPicker.
- Item selection – A single color value can be selected from a list of unique colors. Color swatches are automatically matched with the value no matter the color space they are defined in.
- Keyboard navigation – Color swatches can be navigated using the arrow keys, along with page up/down, home/end, etc.
- Layout options – Items can be arranged in a vertical or horizontal stack, or as a two-dimensional grid.
- Accessible – Follows the ARIA listbox pattern. Each swatch includes a localized color description for screen reader users (e.g. "dark vibrant blue").
- Styleable – Items include builtin states for styling, such as hover, press, focus, selected, and disabled.
Anatomy#
A ColorSwatchPicker consists of a container element, with a list of color swatches inside. Users can select a color by clicking, tapping, or navigating with the keyboard.
import {ColorSwatch, ColorSwatchPicker, ColorSwatchPickerItem} from 'react-aria-components';
<ColorSwatchPicker>
<ColorSwatchPickerItem>
<ColorSwatch />
</ColorSwatchPickerItem>
</ColorSwatchPicker>
import {
ColorSwatch,
ColorSwatchPicker,
ColorSwatchPickerItem
} from 'react-aria-components';
<ColorSwatchPicker>
<ColorSwatchPickerItem>
<ColorSwatch />
</ColorSwatchPickerItem>
</ColorSwatchPicker>
import {
ColorSwatch,
ColorSwatchPicker,
ColorSwatchPickerItem
} from 'react-aria-components';
<ColorSwatchPicker>
<ColorSwatchPickerItem>
<ColorSwatch />
</ColorSwatchPickerItem>
</ColorSwatchPicker>
ColorSwatchPicker is a convenience wrapper around the ListBox component. If you need additional flexibility, such as support for multiple selection, duplicate colors, drag and drop, etc., you can use the ListBox component directly.
Starter kits#
To help kick-start your project, we offer starter kits that include example implementations of all React Aria components with various styling solutions. All components are fully styled, including support for dark mode, high contrast mode, and all UI states. Each starter comes with a pre-configured Storybook that you can experiment with, or use as a starting point for your own component library.
Reusable wrappers#
If you will use a ColorSwatchPicker in multiple places in your app, you can wrap all of the pieces into a reusable component. This way, the DOM structure, styling code, and other logic are defined in a single place and reused everywhere to ensure consistency.
This example wraps ColorSwatchPicker
and ColorSwatchPickerItem
, reusing the MyColorSwatch
component from the ColorSwatch docs.
import type {ColorSwatchPickerItemProps, ColorSwatchPickerProps} from 'react-aria-components';
import {MyColorSwatch} from './ColorSwatch';
export function MyColorSwatchPicker(
{ children, ...props }: ColorSwatchPickerProps
) {
return (
<ColorSwatchPicker {...props}>
{children}
</ColorSwatchPicker>
);
}
export function MyColorSwatchPickerItem(props: ColorSwatchPickerItemProps) {
return (
<ColorSwatchPickerItem {...props}>
<MyColorSwatch />
</ColorSwatchPickerItem>
);
}
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
import type {
ColorSwatchPickerItemProps,
ColorSwatchPickerProps
} from 'react-aria-components';
import {MyColorSwatch} from './ColorSwatch';
export function MyColorSwatchPicker(
{ children, ...props }: ColorSwatchPickerProps
) {
return (
<ColorSwatchPicker {...props}>
{children}
</ColorSwatchPicker>
);
}
export function MyColorSwatchPickerItem(
props: ColorSwatchPickerItemProps
) {
return (
<ColorSwatchPickerItem {...props}>
<MyColorSwatch />
</ColorSwatchPickerItem>
);
}
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
import type {
ColorSwatchPickerItemProps,
ColorSwatchPickerProps
} from 'react-aria-components';
import {MyColorSwatch} from './ColorSwatch';
export function MyColorSwatchPicker(
{ children, ...props }:
ColorSwatchPickerProps
) {
return (
<ColorSwatchPicker
{...props}
>
{children}
</ColorSwatchPicker>
);
}
export function MyColorSwatchPickerItem(
props:
ColorSwatchPickerItemProps
) {
return (
<ColorSwatchPickerItem
{...props}
>
<MyColorSwatch />
</ColorSwatchPickerItem>
);
}
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
Value#
ColorSwatchPicker accepts either an uncontrolled default value or a controlled value, provided using the defaultValue
or value
props respectively. The value provided to either of these props should be a color string or Color
object. The value is matched against the color of each ColorSwatch, including equivalent colors in different color spaces.
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-aria-components';
function Example() {
let [color, setColor] = React.useState(parseColor('hsl(0, 100%, 33.33%)'));
return (
<MyColorSwatchPicker value={color} onChange={setColor}>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
);
}
import {parseColor} from 'react-aria-components';
function Example() {
let [color, setColor] = React.useState(
parseColor('hsl(0, 100%, 33.33%)')
);
return (
<MyColorSwatchPicker value={color} onChange={setColor}>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
);
}
import {parseColor} from 'react-aria-components';
function Example() {
let [color, setColor] =
React.useState(
parseColor(
'hsl(0, 100%, 33.33%)'
)
);
return (
<MyColorSwatchPicker
value={color}
onChange={setColor}
>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
);
}
Note: ColorSwatches rendered inside a ColorSwatchPicker must have unique colors, even between different color spaces. For example, the values #f00
, hsl(0, 100%, 50%)
, and hsb(0, 100%, 100%)
are all equivalent and considered duplicates. This is required so that selection behavior works properly.
Labeling#
By default, ColorSwatchPicker
has an aria-label
with the localized string "Color swatches". This can be overridden with a more specific accessibility label using the aria-label
or aria-labelledby
props. All labels should be localized.
<MyColorSwatchPicker aria-label="Fill color">
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
<MyColorSwatchPicker aria-label="Fill color">
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
<MyColorSwatchPicker aria-label="Fill color">
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
Events#
ColorSwatchPicker accepts an onChange
prop which is triggered whenever the value is edited by the user. It receives a Color
object as a parameter.
The example below uses onChange
to update a separate element with the color value as a string.
import {parseColor} from 'react-aria-components';
function Example() {
let [value, setValue] = React.useState(parseColor('#A00'));
return (
<div>
<MyColorSwatchPicker value={value} onChange={setValue}>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
<p>Selected color: {value.toString('rgb')}</p>
</div>
);
}
import {parseColor} from 'react-aria-components';
function Example() {
let [value, setValue] = React.useState(
parseColor('#A00')
);
return (
<div>
<MyColorSwatchPicker
value={value}
onChange={setValue}
>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
<p>Selected color: {value.toString('rgb')}</p>
</div>
);
}
import {parseColor} from 'react-aria-components';
function Example() {
let [value, setValue] =
React.useState(
parseColor('#A00')
);
return (
<div>
<MyColorSwatchPicker
value={value}
onChange={setValue}
>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
<p>
Selected color:
{' '}
{value.toString(
'rgb'
)}
</p>
</div>
);
}
Disabled#
A ColorSwatchPickerItem
can be disabled using the isDisabled
prop. Disabled swatches cannot be selected, and are not focusable or interactive.
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" isDisabled />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" isDisabled />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem
color="#f80"
isDisabled
/>
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
Show CSS
.react-aria-ColorSwatchPickerItem {
&[data-disabled] {
opacity: 0.2;
}
}
.react-aria-ColorSwatchPickerItem {
&[data-disabled] {
opacity: 0.2;
}
}
.react-aria-ColorSwatchPickerItem {
&[data-disabled] {
opacity: 0.2;
}
}
Stack layout#
By default, ColorSwatchPicker expects items to be arranged horizontally, optionally wrapping to form a grid, and implements keyboard navigation and drag and drop accordingly. The layout
prop can be used to display the swatches as a vertical stack instead.
<MyColorSwatchPicker layout="stack">
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
<MyColorSwatchPicker layout="stack">
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
<MyColorSwatchPicker layout="stack">
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
<MyColorSwatchPickerItem color="#08f" />
<MyColorSwatchPickerItem color="#088" />
<MyColorSwatchPickerItem color="#008" />
</MyColorSwatchPicker>
Show CSS
.react-aria-ColorSwatchPicker {
&[data-layout=stack] {
flex-direction: column;
}
}
.react-aria-ColorSwatchPicker {
&[data-layout=stack] {
flex-direction: column;
}
}
.react-aria-ColorSwatchPicker {
&[data-layout=stack] {
flex-direction: column;
}
}
Props#
ColorSwatchPicker#
Name | Type | Default | Description |
children | ReactNode | — | The children of the ColorSwatchPicker. |
layout | 'grid' | 'stack' | 'grid' | Whether the items are arranged in a stack or grid. |
value | string | Color | — | The current value (controlled). |
defaultValue | string | Color | — | The default value (uncontrolled). |
className | string | (
(values: ColorSwatchPickerRenderProps
& & {}
)) => string | — | The CSS className for the element. A function may be provided to compute the class based on component state. |
style | CSSProperties | (
(values: ColorSwatchPickerRenderProps
& & {}
)) => CSSProperties | undefined | — | The inline style for the element. A function may be provided to compute the style based on component state. |
Events
Name | Type | Description |
onChange | (
(value: Color
)) => void | Handler that is called when the value changes. |
Accessibility
Name | Type | Description |
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. |
ColorSwatchPickerItem#
A <ColorSwatchPickerItem>
represents an individual item within a <ColorSwatchPicker>
. It should contain a <ColorSwatch>
.
Name | Type | Description |
color | string | Color | The color of the swatch. |
isDisabled | boolean | Whether the color swatch is disabled. |
children | ReactNode | (
(values: ColorSwatchPickerItemRenderProps
& & {}
)) => ReactNode | The children of the component. A function may be provided to alter the children based on component state. |
className | string | (
(values: ColorSwatchPickerItemRenderProps
& & {}
)) => string | The CSS className for the element. A function may be provided to compute the class based on component state. |
style | CSSProperties | (
(values: ColorSwatchPickerItemRenderProps
& & {}
)) => CSSProperties | undefined | The inline style for the element. A function may be provided to compute the style based on component state. |
Events
Name | Type | Description |
onHoverStart | (
(e: HoverEvent
)) => void | Handler that is called when a hover interaction starts. |
onHoverEnd | (
(e: HoverEvent
)) => void | Handler that is called when a hover interaction ends. |
onHoverChange | (
(isHovering: boolean
)) => void | Handler that is called when the hover state changes. |
Styling#
React Aria components can be styled in many ways, including using CSS classes, inline styles, utility classes (e.g. Tailwind), CSS-in-JS (e.g. Styled Components), etc. By default, all components include a builtin className
attribute which can be targeted using CSS selectors. These follow the react-aria-ComponentName
naming convention.
.react-aria-ColorSwatchPicker {
/* ... */
}
.react-aria-ColorSwatchPicker {
/* ... */
}
.react-aria-ColorSwatchPicker {
/* ... */
}
A custom className
can also be specified on any component. This overrides the default className
provided by React Aria with your own.
<ColorSwatchPicker className="my-color-swatch-picker">
{/* ... */}
</ColorSwatchPicker>
<ColorSwatchPicker className="my-color-swatch-picker">
{/* ... */}
</ColorSwatchPicker>
<ColorSwatchPicker className="my-color-swatch-picker">
{/* ... */}
</ColorSwatchPicker>
In addition, some components support multiple UI states (e.g. focused, placeholder, readonly, etc.). React Aria components expose states using data attributes, which you can target in CSS selectors. For example:
.react-aria-ColorSwatchPickerItem[data-selected] {
/* ... */
}
.react-aria-ColorSwatchPickerItem[data-selected] {
/* ... */
}
.react-aria-ColorSwatchPickerItem[data-selected] {
/* ... */
}
The className
and style
props also accept functions which receive states for styling. This lets you dynamically determine the classes or styles to apply, which is useful when using utility CSS libraries like Tailwind.
<ColorSwatchPickerItem
className={({ isSelected }) =>
isSelected ? 'border-black' : 'border-transparent'}
/>
<ColorSwatchPickerItem
className={({ isSelected }) =>
isSelected ? 'border-black' : 'border-transparent'}
/>
<ColorSwatchPickerItem
className={(
{ isSelected }
) =>
isSelected
? 'border-black'
: 'border-transparent'}
/>
The states, selectors, and render props for each component used in a ColorSwatchPicker
are documented below.
ColorSwatchPicker#
The ColorSwatchPicker
component can be targeted with the .react-aria-ColorSwatchPicker
CSS selector, or by overriding with a custom className
. It supports the following states:
Name | CSS Selector | Description |
isEmpty | [data-empty] | Whether the listbox has no items and should display its empty state. |
isFocused | [data-focused] | Whether the listbox is currently focused. |
isFocusVisible | [data-focus-visible] | Whether the listbox is currently keyboard focused. |
layout | [data-layout="stack | grid"] | Whether the items are arranged in a stack or grid. |
state | — | State of the listbox. |
ColorSwatchPickerItem#
The ColorSwatchPickerItem
component can be targeted with the .react-aria-ColorSwatchPickerItem
CSS selector, or by overriding with a custom className
. It supports the following states:
Name | CSS Selector | Description |
color | — | The color of the swatch. |
isHovered | [data-hovered] | Whether the item is currently hovered with a mouse. |
isPressed | [data-pressed] | Whether the item is currently in a pressed state. |
isSelected | [data-selected] | Whether the item is currently selected. |
isFocused | [data-focused] | Whether the item is currently focused. |
isFocusVisible | [data-focus-visible] | Whether the item is currently keyboard focused. |
isDisabled | [data-disabled] | Whether the item is non-interactive, i.e. both selection and actions are disabled and the item may
not be focused. Dependent on |
ColorSwatch#
The ColorSwatch
component can be targeted with the .react-aria-ColorSwatch
CSS selector, or by overriding with a custom className
. It supports the following states:
Name | Description |
color | The color of the swatch. |
Advanced customization#
Composition#
If you need to customize one of the components within a ColorSwatchPicker
, such as ColorSwatchPickerItem
or ColorSwatch
, in many cases you can create a wrapper component. This lets you customize the props passed to the component.
function MyColorSwatchPickerItem(props) {
return <ColorSwatchPickerItem {...props} className="my-swatch" />
}
function MyColorSwatchPickerItem(props) {
return (
<ColorSwatchPickerItem
{...props}
className="my-swatch"
/>
);
}
function MyColorSwatchPickerItem(
props
) {
return (
<ColorSwatchPickerItem
{...props}
className="my-swatch"
/>
);
}
Contexts#
All React Aria Components export a corresponding context that can be used to send props to them from a parent element. This enables you to build your own compositional APIs similar to those found in React Aria Components itself. You can send any prop or ref via context that you could pass to the corresponding component. The local props and ref on the component are merged with the ones passed via context, with the local props taking precedence (following the rules documented in mergeProps).
Component | Context | Props | Ref |
ColorSwatchPicker | ColorSwatchPickerContext | ColorSwatchPickerProps | HTMLDivElement |
This example shows how to synchronize a ColorSwatchPicker and a ColorField via context.
import {ColorSwatchPickerContext} from 'react-aria-components';
import {MyColorField} from './ColorField';
function ColorSelector({children}) {
let [value, setValue] = React.useState(parseColor('#A00'));
return (
<div style={{display: 'flex', flexDirection: 'column', gap: 8}}>
<MyColorField label="Color" value={value} onChange={setValue} />
<ColorSwatchPickerContext.Provider value={{value, onChange: setValue}}>
{children}
</ColorSwatchPickerContext.Provider> </div>
);
}
<ColorSelector>
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
</ColorSelector>
import {ColorSwatchPickerContext} from 'react-aria-components';
import {MyColorField} from './ColorField';
function ColorSelector({ children }) {
let [value, setValue] = React.useState(
parseColor('#A00')
);
return (
<div
style={{
display: 'flex',
flexDirection: 'column',
gap: 8
}}
>
<MyColorField
label="Color"
value={value}
onChange={setValue}
/>
<ColorSwatchPickerContext.Provider
value={{ value, onChange: setValue }}
>
{children}
</ColorSwatchPickerContext.Provider> </div>
);
}
<ColorSelector>
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
</ColorSelector>
import {ColorSwatchPickerContext} from 'react-aria-components';
import {MyColorField} from './ColorField';
function ColorSelector(
{ children }
) {
let [value, setValue] =
React.useState(
parseColor('#A00')
);
return (
<div
style={{
display: 'flex',
flexDirection:
'column',
gap: 8
}}
>
<MyColorField
label="Color"
value={value}
onChange={setValue}
/>
<ColorSwatchPickerContext.Provider
value={{
value,
onChange:
setValue
}}
>
{children}
</ColorSwatchPickerContext.Provider> </div>
);
}
<ColorSelector>
<MyColorSwatchPicker>
<MyColorSwatchPickerItem color="#A00" />
<MyColorSwatchPickerItem color="#f80" />
<MyColorSwatchPickerItem color="#080" />
</MyColorSwatchPicker>
</ColorSelector>