ColorArea 颜色区域
二维颜色选择器,允许用户从渐变区域中选择颜色
用法
import { ColorArea } from '@lenso/ui';此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";
import { ColorArea } from "@lenso/ui";
export function ColorAreaBasic() { return ( <ColorArea aria-label="Color area" defaultValue="rgb(116, 52, 255)"> <ColorArea.Thumb /> </ColorArea> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
组件结构
import { ColorArea } from '@lenso/ui';
export default () => ( <ColorArea> <ColorArea.Thumb /> </ColorArea>);示例
带定位点
此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";/** Adapted from HeroUI v3.2.6. Apache-2.0. */import { ColorArea } from "@lenso/ui";export function ColorAreaWithDots() { return ( <ColorArea aria-label="Color area" showDots defaultValue="hsl(200, 100%, 50%)"> <ColorArea.Thumb /> </ColorArea> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
色彩空间与通道
使用 colorSpace 设置颜色空间(RGB、HSL、HSB),使用 xChannel/yChannel 自定义各轴显示的颜色通道。
此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";/** Adapted from HeroUI v3.2.6. Apache-2.0. Base UI owns the ordinary selects. */import { ColorArea, parseColor } from "@lenso/ui";import { useState } from "react";import * as stylex from "@stylexjs/stylex";import { styles } from "../color-picker/source.stylex";import { ColorDemoSelect } from "../color-picker/source";type Space = "rgb" | "hsl" | "hsb";type Channel = "hue" | "saturation" | "brightness" | "lightness" | "red" | "green" | "blue";const channelsBySpace: Record<Space, Channel[]> = { rgb: ["red", "green", "blue"], hsl: ["hue", "saturation", "lightness"], hsb: ["hue", "saturation", "brightness"],};export function ColorAreaSpaceAndChannels() { const [colorSpace, setColorSpace] = useState<Space>("hsb"); const [color, setColor] = useState(() => parseColor("hsb(219, 58%, 93%)")); const [xChannel, setXChannel] = useState<Channel>("saturation"); const [yChannel, setYChannel] = useState<Channel>("brightness"); function changeSpace(space: Space) { setColorSpace(space); setXChannel(space === "rgb" ? "blue" : "saturation"); setYChannel(space === "rgb" ? "green" : space === "hsl" ? "lightness" : "brightness"); } const channels = channelsBySpace[colorSpace]; return ( <div {...stylex.props(styles.centeredColumn)}> <div {...stylex.props(styles.controls)}> <ColorDemoSelect label="Color Space" value={colorSpace} options={["rgb", "hsl", "hsb"]} onChange={changeSpace} width={128} uppercase /> <ColorDemoSelect label="X Axis" value={xChannel} options={channels.filter((c) => c !== yChannel)} onChange={setXChannel} width={144} /> <ColorDemoSelect label="Y Axis" value={yChannel} options={channels.filter((c) => c !== xChannel)} onChange={setYChannel} width={144} /> </div> <ColorArea aria-label="Color area" colorSpace={colorSpace} value={color} xChannel={xChannel} yChannel={yChannel} onChange={setColor} > <ColorArea.Thumb /> </ColorArea> <div {...stylex.props(styles.row)}> <div {...stylex.props(styles.preview)} style={{ backgroundColor: color.toString("css") }} /> <code {...stylex.props(styles.code)}>{color.toString(colorSpace)}</code> </div> </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
禁用
此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";/** Adapted from HeroUI v3.2.6. Apache-2.0. */import { ColorArea } from "@lenso/ui";export function ColorAreaDisabled() { return ( <ColorArea aria-label="Color area" isDisabled defaultValue="hsl(200, 100%, 50%)"> <ColorArea.Thumb /> </ColorArea> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
受控组件
此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";/** Adapted from HeroUI v3.2.6. Apache-2.0. */import { ColorArea, ColorSwatch, parseColor } from "@lenso/ui";import { useState } from "react";import * as stylex from "@stylexjs/stylex";import { styles } from "../color-picker/source.stylex";export function ColorAreaControlled() { const [color, setColor] = useState(parseColor("#9B80FF")); return ( <div {...stylex.props(styles.column)}> <ColorArea aria-label="Color area" colorSpace="rgb" value={color} xChannel="red" yChannel="green" onChange={setColor} > <ColorArea.Thumb /> </ColorArea> <div {...stylex.props(styles.row, styles.width300)}> <ColorSwatch color={color} size="md" /> <p {...stylex.props(styles.muted)}> Current color: <span {...stylex.props(styles.medium)}>{color.toString("hex")}</span> </p> </div> </div> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
渲染函数
此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";/** Adapted from HeroUI v3.2.6. Apache-2.0. Native RAC render state replaces DOM render interception. */import { ColorArea } from "@lenso/ui";export function RenderFunction() { return ( <ColorArea aria-label="Color area" defaultValue="rgb(116, 52, 255)" data-custom="slider"> {({ isDisabled }) => ( <ColorArea.Thumb data-custom="thumb" data-disabled={isDisabled || undefined} /> )} </ColorArea> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
自定义样式
Tailwind CSS
此预览复用英文版适配,不代表中文源示例已完成本地实现。
"use client";/** Adapted from HeroUI v3.2.6. Apache-2.0. */import { ColorArea } from "@lenso/ui";import { styles } from "../color-picker/source.stylex";export function CustomStyles() { return ( <ColorArea aria-label="Color area" xstyle={styles.areaCustom} defaultValue="rgb(116, 52, 255)"> <ColorArea.Thumb xstyle={styles.areaThumb} /> </ColorArea> );}Local adaptation source above. Derived from HeroUI v3.2.6 source.
全局 CSS
可使用 @layer components 指令自定义 ColorArea 组件类。
了解更多。
@layer components { .color-area { @apply rounded-3xl; }
.color-area__thumb { @apply size-5 border-4; }}样式参考
HeroUI 遵循 BEM 方法论,确保组件变体与状态可复用且易于自定义。
CSS 类
ColorArea 组件使用以下 CSS 类(查看源码样式):
基础类 [!toc]
.color-area- 渐变背景与内阴影的基础样式.color-area--show-dots- 添加点阵网格覆盖层以精确选色
元素类 [!toc]
.color-area__thumb- 可拖拽的滑块指示器
交互状态
组件同时支持 CSS 伪类与 data 属性:
- Disabled:
[data-disabled="true"] - Focus:
[data-focus-visible="true"] - Dragging:
[data-dragging="true"](仅 thumb)
API 参考
ColorArea
继承自 React Aria ColorArea。
| Prop | 类型 | 默认值 | 描述 |
|---|---|---|---|
value | string | Color | - | 当前颜色值(受控) |
defaultValue | string | Color | - | 默认颜色值(非受控) |
onChange | (color: Color) => void | - | 拖拽过程中颜色变化时的回调 |
onChangeEnd | (color: Color) => void | - | 用户停止拖拽时的回调 |
xChannel | ColorChannel | "saturation" | 水平轴的颜色通道 |
yChannel | ColorChannel | "brightness" | 垂直轴的颜色通道 |
colorSpace | ColorSpace | - | 通道使用的颜色空间 |
isDisabled | boolean | false | 是否禁用 |
showDots | boolean | false | 是否显示点阵网格覆盖层 |
className | string | - | 附加 CSS 类 |
render | DOMRenderFunction<keyof React.JSX.IntrinsicElements, ColorAreaRenderProps> | - | 使用自定义 render 函数覆盖默认 DOM 元素 |
ColorArea.Thumb
| Prop | 类型 | 默认值 | 描述 |
|---|---|---|---|
className | string | - | 附加 CSS 类 |
style | CSSProperties | ((renderProps) => CSSProperties) | - | 内联样式或 render props 函数 |
render | DOMRenderFunction<keyof React.JSX.IntrinsicElements, ColorThumbRenderProps> | - | 使用自定义 render 函数覆盖默认 DOM 元素 |