Skip to content
Lenso UI

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类型默认值描述
valuestring | Color-当前颜色值(受控)
defaultValuestring | Color-默认颜色值(非受控)
onChange(color: Color) => void-拖拽过程中颜色变化时的回调
onChangeEnd(color: Color) => void-用户停止拖拽时的回调
xChannelColorChannel"saturation"水平轴的颜色通道
yChannelColorChannel"brightness"垂直轴的颜色通道
colorSpaceColorSpace-通道使用的颜色空间
isDisabledbooleanfalse是否禁用
showDotsbooleanfalse是否显示点阵网格覆盖层
classNamestring-附加 CSS 类
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, ColorAreaRenderProps>-使用自定义 render 函数覆盖默认 DOM 元素

ColorArea.Thumb

Prop类型默认值描述
classNamestring-附加 CSS 类
styleCSSProperties | ((renderProps) => CSSProperties)-内联样式或 render props 函数
renderDOMRenderFunction<keyof React.JSX.IntrinsicElements, ColorThumbRenderProps>-使用自定义 render 函数覆盖默认 DOM 元素

相关组件