跳转到内容

ColorPicker 颜色选择器 ​

在色域中自由选取一个颜色:触发按钮显示当前色,浮层内包含取色面、色相与透明度两条滑块、数值框、屏幕取色与预设色板。它是颜色家族的组合件:两条滑块是颜色滑块,预设色板是颜色色块选择器,触发按钮内的色块与颜色色块同族;只需要其中一件时不使用完整的选择器。

用法 ​

取色面选择饱和度与明度,下方一条色相滑块;滑块是内嵌的颜色滑块组件,Vue / React 的挂载点不写子节点即自动铺开

组件结构 ​

加粗的是必需部件。

data-scope="color-picker":root · label · control · trigger · value-text · swatch · positioner · content · saturation-area · area-thumb · hue-slider · alpha-slider · channel-input · eye-dropper-trigger · swatch-picker · hidden-input

示例 ​

预设色板 ​

swatches 提供一组常用颜色,浮层中内嵌一台色块选择器:方向键在格子间移动、按颜色比较选中

禁用 ​

禁止更改颜色

透明度 ​

alpha 开启后值串带透明度,浮层中多一条透明度滑块;两条滑块共用同一份工作色,调节色相不会把透明度归 1

精确输入 ​

输入色值或使用屏幕取色

设计指引 ​

何时使用 ​

  • 用户需要自定义主题色、标注色或画布颜色,且不限于固定选项。
  • 既需要可视化挑选(取色面、滑块)也需要精确输入(十六进制、分量框)。
  • 需要从屏幕取色。

何时不用 ​

特性 ​

  • 工作色始终是 HSVA:取色面两轴是饱和度与明度,纯黑与灰度处的色相由锚点保持,拖到黑色再拉回时色相不丢失。
  • format 决定值串写法(hex / rgba / hsla),alpha 决定是否带透明度;关闭时透明度滑块与输入框整体禁用。
  • 色相与透明度两条滑块是内嵌的颜色滑块:整份工作色交给它们,调整色相不会把透明度归 1;键盘(方向键、PageUp / PageDown、Home / End、Shift 大步)与拖动都由滑块自身处理。
  • 预设色板是内嵌的色块选择器:方向键在格子间移动并选中,当前颜色所在格按颜色比较(写法不同也能匹配)。
  • 数值框输入只保留草稿,可解析时立即取值;不可解析时保留原文并报输入错误,回车同时拦截表单提交。
  • 屏幕取色通过浮层内的按钮触发,环境不提供 EyeDropper 时始终禁用;取到的颜色与色板、外部 setValue 走同一条取值路径。
  • 格式、输入、颜色解析与屏幕取色四路错误相互独立,修正一路不影响其他路。
  • 受控 value 与 open:宿主不写回时界面不变化,回调照常发出;表单出口经 hidden-input 提交当前值串。

组合 ​

  • 三个挂载点 hue-slider / alpha-slider / swatch-picker 同时充当内嵌组件的根节点,内部放置的是颜色滑块与颜色色块选择器自己的部件;不写子节点时自动铺开最简结构。
  • 放入表单字段承接标题、说明与错误信息,disabled / readOnly 随字段下发。
  • 与颜色字段并排:选择器挑颜色,字段显示并微调该值。

最佳实践 ​

  • 通过 swatches 提供常用色,多数用户从这里即可完成选择。
  • 触发按钮内同时放色块与值串,读屏与视觉各有一路。
  • 需要精确输入时放数值框;一个十六进制框比四个分量框更节省空间。

反模式 ​

  • 只显示颜色不显示数值,颜色不能是唯一的信息通道。
  • 有对比度要求的场景不提供校验反馈。
  • 关闭 alpha 后仍保留透明度滑块,整条禁用的控件只会造成困惑。

API 参考 ​

产物 ​

层值
自定义元素<xh-color-picker>
Vue 组件XhColorPickerAlphaSlider XhColorPickerAreaThumb XhColorPickerChannelInput XhColorPickerContent XhColorPickerControl XhColorPickerEyeDropperTrigger XhColorPickerHiddenInput XhColorPickerHueSlider XhColorPickerLabel XhColorPickerPositioner XhColorPickerRoot XhColorPickerSaturationArea XhColorPickerSwatch XhColorPickerSwatchPicker XhColorPickerTrigger XhColorPickerValueText
组合式函数useColorPicker
状态机colorPickerMachine
皮肤@xihan-ui/styles/color-picker.css

Props ​

属性类型必填说明
valuestring颜色值串。提供即受控:cell 直读 prop,写入只发 onValueChange 不落内部值。
defaultValuestring
formatColorFormat值串的写法,默认 hex。修改它只改变对外的序列化,工作色恒为 HSVA。
openboolean展开态。提供即受控:内部不再自行修改,只发 onOpenChange。
defaultOpenboolean
disabledboolean整个控件禁用:trigger 与两个按钮使用原生 disabled,取色区与滑杆退出 Tab 序列。
readOnlyboolean只读:浮层照常展开(可查看当前颜色),但任何改值的动作都不发生。
swatchesstring[]预设色板:交给内嵌的色块选择器铺格,选中的格按颜色比较。
namestring表单字段名;提供后表单影子才带 name 并参与提交。
alphaboolean带透明度,默认关闭。关闭时值串恒为不透明,透明度滑杆与输入框整条禁用。
sizeSize尺寸:sm / md / lg。
dirDirection文字方向。只改写横轴(取色区的饱和度、通道滑杆)上左右两键与指针的语义。
placementPlacement
offsetnumber
translationsPartial<ColorPickerTranslations>
onValueChange(details: ColorPickerValueChangeDetails) => voidvalue 变化意图回调;受控时是唯一出口,非受控时随内部写入一并通知。
onOpenChange(details: ColorPickerOpenChangeDetails) => voidopen 变化意图回调;受控时是唯一出口,非受控时随内部转移一并通知。
onColorError(details: ColorPickerErrorDetails) => void格式、文本、颜色解析或屏幕取色失败;与 value / open 事件独立。

事件 ​

自定义元素将载荷放在 detail;Vue 使用同名 emit。

事件载荷说明
value-changeColorPickerValueChangeDetails颜色变化;detail 为 { value: string }
open-changeColorPickerOpenChangeDetailsopen 状态变化;detail 为 { open: boolean }
color-errorColorPickerErrorDetails格式、输入、颜色解析或屏幕取色失败;detail 为判别式错误对象

插槽 ​

仅列出带载荷的插槽。

Vue 组件插槽载荷说明
XhColorPickerRootdefaultColorPickerRootSlotProps

React 适配器 props ​

只列各组件自己声明的那些:继承自 ComponentPropsWithRef 的 DOM 属性不在其中,根组件上与上面 Props 表同名的也不重复列。Vue 的对应物是上面的插槽表。

React 组件属性类型必填说明
XhColorPickerChannelInputchannelColorPickerInputChannel该输入框编辑的通道:hex 是整串,r/g/b 是分量,a 是透明度百分数;默认或无法识别时按 hex 处理。
XhColorPickerPositionercontainer() => Element | null浮层挂载的容器;未提供时按全局配置,再未提供时挂载到 body。
XhColorPickerRootchildrenSlotChildren<ColorPickerRootSlotProps>

状态 ​

公开状态写入 data-state。

部件取值
root'open' | 'closed'
label'open' | 'closed'
control'open' | 'closed'
trigger'open' | 'closed'
value-text'open' | 'closed'
swatch'open' | 'closed'
positioner'open' | 'closed'
content'open' | 'closed'
saturation-area'open' | 'closed'
area-thumb'open' | 'closed'
channel-input'open' | 'closed'
eye-dropper-trigger'picking' | 'open' | 'closed'

以下名称仅用于内部状态机。

状态:closed · open · open.idle · open.dragging · open.picking

事件:OPEN · TOGGLE · CLOSE · CONTROLLED.OPEN · CONTROLLED.CLOSE · VALUE.SET · AREA.SET · AREA.STEP · AREA.TO_EDGE · HSVA.SET · INPUT.CHANGE · INPUT.COMMIT · DRAG.START · DRAG.MOVE · DRAG.END · EYE_DROPPER.OPEN · EYE_DROPPER.RESULT · EYE_DROPPER.CANCEL · EYE_DROPPER.ERROR · ERROR.CLEAR · FORM.RESET · PRESS.START · PRESS.END

判据:isOpenControlled · canInteract · canPick

connect API ​

getXxxProps() 返回对应部件的宿主属性。

成员类型说明
openboolean
valuestring当前值串(与 onValueChange 发出的是同一个)。
rgbaColorRgba
hsvaColorHsva工作色。取色区与色相滑杆读取的都是它。
formatColorFormat
alphaboolean
disabledboolean
readOnlyboolean
draggingboolean指针正在拖动某一部位。
pickingboolean屏幕取色正在进行。
eyeDropperSupportedboolean
errorsColorPickerErrors格式、文本、颜色解析与屏幕取色四路互不覆盖的错误。
swatchesstring[]预设色板(原样透传 swatches prop,默认为空数组)。
hueSliderColorSliderApi<T>色相颜色滑块的 api:部件属性与取值都从这里获取,DOM 带 data-scope="color-slider"。
alphaSliderColorSliderApi<T>透明度颜色滑块的 api。
swatchPickerColorSwatchPickerApi<T>预设色板的 api,DOM 带 data-scope="color-swatch-picker"。
inputText(channel: ColorPickerInputChannel) => string某个数值框当前应显示的文字(有草稿显示草稿,否则显示规范文本)。
setOpen(next: boolean) => void
setValue(next: string) => void
clearError() => void清除四路显式错误;屏幕取色重试也会先清除自己那一路。
getRootProps() => T['element']
getLabelProps() => T['label']
getControlProps() => T['element']
getTriggerProps() => T['button']
getValueTextProps() => T['element']
getSwatchProps() => T['element']
getPositionerProps() => T['element']
getContentProps() => T['element']
getSaturationAreaProps() => T['element']
getAreaThumbProps() => T['element']
getHueSliderProps() => T['element']色相滑块的挂载点,同时充当该滑块的根节点:滑块 root 的状态标记同步写在它身上。
getAlphaSliderProps() => T['element']透明度滑块的挂载点,同上。
getChannelInputProps(props: ColorPickerInputProps) => T['input']
getEyeDropperTriggerProps() => T['button']
getSwatchPickerProps() => T['element']预设色板的挂载点,同时充当色板的根节点(role=radiogroup 与键盘处理都在它身上)。
getHiddenInputProps() => T['input']表单影子:值随表单提交。提供 name 后才带 name,未提供时不参与提交。

无障碍 ​

键盘 ​

规格出处:W3C APG

按键生效条件行为
ArrowRight / ArrowLeftfocus in area-thumb, not disabled/readOnly按 1 调饱和度;RTL 下左右对调,语义恒是"朝饱和走一格"
ArrowUp / ArrowDownfocus in area-thumb, not disabled/readOnly按 1 调明度,屏幕向上恒是变亮,与 dir 无关
Shift+ArrowRight / Shift+ArrowLeft / Shift+ArrowUp / Shift+ArrowDownfocus in area-thumb, not disabled/readOnly同上,但一步走 10
Home / Endfocus in area-thumb, not disabled/readOnly饱和度取 0 / 100(与 aria-valuenow 报的是同一条轴)
Enterfocus in channel-input收下框里的字;收不了就保留草稿并报告输入错误。一并拦住表单提交
Escapeopen(本层在层栈顶)收起浮层,焦点归还触发器
Enter / Spaceheld on eye-dropper-trigger, not disabled按住期间取色按钮投影 data-pressed,与指针 :active 同一副按压面;抬起或失焦撤下,屏幕取色一开(窗口随即失焦)或浮层收起时一并撤下

ARIA ​

以下属性由 connect 生成。

部件属性值
triggeraria-controlscontent 部件的 id
triggeraria-expanded'true' | 'false'
triggeraria-haspopup'dialog'
triggeraria-labelledbylabel 部件的 id value-text 部件的 id
swatcharia-hidden'true'
contentaria-hidden!open || undefined
contentaria-labelledbylabel 部件的 id
contentaria-modal'false'
contentrole'dialog'
area-thumbaria-disabled'true' | 'false'
area-thumbaria-labellabel.area
area-thumbaria-valuemax'100'
area-thumbaria-valuemin'0'
area-thumbaria-valuenowString(Math.round(hsva.s))
area-thumbaria-valuetextlabel.areaValueText(Math.round(hsva.s), Math.round(hs…
area-thumbrole'slider'
channel-inputaria-invalid'true' | 'false'
channel-inputaria-labellabel.input(channel)
eye-dropper-triggeraria-labellabel.eyeDropperTrigger
  • 触发按钮是原生按钮,aria-haspopup="dialog",名称由标题与当前值串合成;浮层是非模态 role="dialog"。
  • 取色面的拇指是 role="slider":aria-valuenow 报告饱和度,明度写入 aria-valuetext。
  • 两条滑块的名称与带单位的播报文本取自 translations.channel / channelValueText,由内嵌滑块读出。
  • 色板是 role="radiogroup",每格 role="radio";整组名称取 translations.swatchGroup,每格读 translations.swatch(value)。
  • Escape 收起浮层并把焦点归还触发按钮。

样式参考 ​

皮肤 ​

@xihan-ui/styles/color-picker.css 使用 [data-scope="color-picker"][data-part="root"] 部件选择器,位于 xihan.components 层。覆盖样式使用 xihan.overrides。

forced-colors: active 下另有一套规则:颜色交给系统,边框与状态标记改用系统色关键字。

数据属性 ​

由 connect 生成;条件不成立时不输出无值属性。

部件属性值
rootdata-disabled''(条件成立时才出现)
rootdata-readonly''(条件成立时才出现)
rootdata-sizeprops.size
rootdata-state'open' | 'closed'
labeldata-disabled''(条件成立时才出现)
labeldata-readonly''(条件成立时才出现)
labeldata-state'open' | 'closed'
controldata-disabled''(条件成立时才出现)
controldata-readonly''(条件成立时才出现)
controldata-state'open' | 'closed'
triggerdata-disabled''(条件成立时才出现)
triggerdata-readonly''(条件成立时才出现)
triggerdata-state'open' | 'closed'
value-textdata-disabled''(条件成立时才出现)
value-textdata-readonly''(条件成立时才出现)
value-textdata-state'open' | 'closed'
swatchdata-disabled''(条件成立时才出现)
swatchdata-readonly''(条件成立时才出现)
swatchdata-state'open' | 'closed'
swatchdata-valuecontext.get('value')
swatchdata-xh-swatch''
swatchdata-xh-swatch-sizeprops.size
positionerdata-hidden''(条件成立时才出现)
positionerdata-placement定位引擎算出的实际落位
positionerdata-positioned''(条件成立时才出现)
positionerdata-sizeprops.size
positionerdata-state'open' | 'closed'
contentdata-disabled''(条件成立时才出现)
contentdata-placement定位引擎算出的实际落位
contentdata-readonly''(条件成立时才出现)
contentdata-state'open' | 'closed'
saturation-areadata-disabled''(条件成立时才出现)
saturation-areadata-dragging''(条件成立时才出现)
saturation-areadata-readonly''(条件成立时才出现)
saturation-areadata-state'open' | 'closed'
area-thumbdata-disabled''(条件成立时才出现)
area-thumbdata-dragging''(条件成立时才出现)
area-thumbdata-readonly''(条件成立时才出现)
area-thumbdata-state'open' | 'closed'
hue-sliderdata-channel'hue'
alpha-sliderdata-channel'alpha'
alpha-sliderdata-disabled''(条件成立时才出现)
channel-inputdata-channelchannel
channel-inputdata-disabled''(条件成立时才出现)
channel-inputdata-invalid''(条件成立时才出现)
channel-inputdata-readonly''(条件成立时才出现)
channel-inputdata-state'open' | 'closed'
eye-dropper-triggerdata-disabled''(条件成立时才出现)
eye-dropper-triggerdata-pressed''(条件成立时才出现)
eye-dropper-triggerdata-readonly''(条件成立时才出现)
eye-dropper-triggerdata-state'picking' | 'open' | 'closed'

CSS 变量 ​

本组件公开覆盖槽由独立皮肤的实际消费位生成;默认来源、作用部件和状态均与 CSS 同源。

变量部件CSS 属性状态默认来源说明
--xh-color-picker-action-bgeye-dropper-triggerbackgrounddefaulttransparentcolor-picker 的 eye-dropper-trigger 部件 background 覆盖槽。
--xh-color-picker-action-bg-activeeye-dropper-triggerbackgroundis(:active, [data-pressed])
not(:disabled)
pressed
state=picking
--xh-bg-subtle-activecolor-picker 的 eye-dropper-trigger 部件 background 覆盖槽。
--xh-color-picker-action-bg-hovereye-dropper-triggerbackgroundhover
not(:disabled)
--xh-bg-subtle-hovercolor-picker 的 eye-dropper-trigger 部件 background 覆盖槽。
--xh-color-picker-action-bordereye-dropper-triggerborderdefault--xh-border-controlcolor-picker 的 eye-dropper-trigger 部件 border 覆盖槽。
--xh-color-picker-action-border-activeeye-dropper-triggerborder-colorstate=picking--xh-bg-brandcolor-picker 的 eye-dropper-trigger 部件 border-color 覆盖槽。
--xh-color-picker-action-fgeye-dropper-triggercolordefault--xh-fg-mutedcolor-picker 的 eye-dropper-trigger 部件 color 覆盖槽。
--xh-color-picker-action-fg-hovereye-dropper-triggercolorhover
not(:disabled)
--xh-fg-defaultcolor-picker 的 eye-dropper-trigger 部件 color 覆盖槽。
--xh-color-picker-action-font-sizeeye-dropper-triggerfont-sizedefault--xh-text-secondary-sizecolor-picker 的 eye-dropper-trigger 部件 font-size 覆盖槽。
--xh-color-picker-action-radiuseye-dropper-triggerborder-radiusdefault--xh-shape-controlcolor-picker 的 eye-dropper-trigger 部件 border-radius 覆盖槽。
--xh-color-picker-action-sizeeye-dropper-triggerblock-size
inline-size
default--xh-control-action-sizecolor-picker 的 eye-dropper-trigger 部件 block-size、inline-size 覆盖槽。
--xh-color-picker-alpha-slider-gapalpha-slidergapdefault--xh-stack-gap-mdcolor-picker 的 alpha-slider 部件 gap 覆盖槽。
--xh-color-picker-content-bgcontentbackgrounddefault--xh-bg-surfacecolor-picker 的 content 部件 background 覆盖槽。
--xh-color-picker-content-bordercontentborderdefault--xh-border-defaultcolor-picker 的 content 部件 border 覆盖槽。
--xh-color-picker-content-fgcontentcolordefault--xh-fg-defaultcolor-picker 的 content 部件 color 覆盖槽。
--xh-color-picker-content-gapcontentgapdefault--xh-space-3color-picker 的 content 部件 gap 覆盖槽。
--xh-color-picker-content-pxcontentpadding-inlinedefault--xh-space-3color-picker 的 content 部件 padding-inline 覆盖槽。
--xh-color-picker-content-pycontentpadding-blockdefault--xh-space-3color-picker 的 content 部件 padding-block 覆盖槽。
--xh-color-picker-content-radiuscontentborder-radiusdefault--xh-shape-overlaycolor-picker 的 content 部件 border-radius 覆盖槽。
--xh-color-picker-content-shadowcontentbox-shadowdefault--xh-elevation-floatingcolor-picker 的 content 部件 box-shadow 覆盖槽。
--xh-color-picker-content-wcontentinline-sizedefault--xh-overlay-min-wcolor-picker 的 content 部件 inline-size 覆盖槽。
--xh-color-picker-control-bgcontrolbackgrounddefaulttransparentcolor-picker 的 control 部件 background 覆盖槽。
--xh-color-picker-control-bg-disabledcontrolbackgrounddisabled--xh-bg-subtlecolor-picker 的 control 部件 background 覆盖槽。
--xh-color-picker-control-bg-hovercontrolbackgrounddisabled
hover
not([data-disabled], [data-readonly])
readonly
--xh-bg-subtlecolor-picker 的 control 部件 background 覆盖槽。
--xh-color-picker-control-bg-readonlycontrolbackgroundreadonly--xh-bg-subtlecolor-picker 的 control 部件 background 覆盖槽。
--xh-color-picker-control-bordercontrolborderdefault--xh-border-controlcolor-picker 的 control 部件 border 覆盖槽。
--xh-color-picker-control-border-focuscontrolborder-colordisabled
focus-within
not([data-disabled])
--xh-_tonecolor-picker 的 control 部件 border-color 覆盖槽。
--xh-color-picker-control-border-hovercontrolborder-colordisabled
hover
not([data-disabled], [data-readonly])
readonly
--xh-border-control-hovercolor-picker 的 control 部件 border-color 覆盖槽。
--xh-color-picker-control-fgcontrolcolordefault--xh-fg-defaultcolor-picker 的 control 部件 color 覆盖槽。
--xh-color-picker-control-gapcontrolgapdefault--xh-_color-picker-gapcolor-picker 的 control 部件 gap 覆盖槽。
--xh-color-picker-control-hcontrolblock-sizedefault--xh-_color-picker-hcolor-picker 的 control 部件 block-size 覆盖槽。
--xh-color-picker-control-min-wcontrol
root
min-inline-sizedefault--xh-control-min-wcolor-picker 的 control、root 部件 min-inline-size 覆盖槽。
--xh-color-picker-control-pxcontrolpadding-inlinedefault--xh-_color-picker-pxcolor-picker 的 control 部件 padding-inline 覆盖槽。
--xh-color-picker-control-radiuscontrolborder-radiusdefault--xh-shape-controlcolor-picker 的 control 部件 border-radius 覆盖槽。
--xh-color-picker-control-shadowcontrolbox-shadowdefault--xh-elevation-raisedcolor-picker 的 control 部件 box-shadow 覆盖槽。
--xh-color-picker-control-wrootinline-size
min-inline-size
default--xh-control-wcolor-picker 的 root 部件 inline-size、min-inline-size 覆盖槽。
--xh-color-picker-gaprootgapdefault--xh-space-1color-picker 的 root 部件 gap 覆盖槽。
--xh-color-picker-hue-slider-gaphue-slidergapdefault--xh-stack-gap-mdcolor-picker 的 hue-slider 部件 gap 覆盖槽。
--xh-color-picker-input-bgchannel-inputbackgrounddefaulttransparentcolor-picker 的 channel-input 部件 background 覆盖槽。
--xh-color-picker-input-bg-disabledchannel-inputbackgrounddisabled--xh-bg-subtlecolor-picker 的 channel-input 部件 background 覆盖槽。
--xh-color-picker-input-bg-readonlychannel-inputbackgroundreadonly--xh-bg-subtlecolor-picker 的 channel-input 部件 background 覆盖槽。
--xh-color-picker-input-borderchannel-inputborderdefault--xh-border-controlcolor-picker 的 channel-input 部件 border 覆盖槽。
--xh-color-picker-input-border-focuschannel-inputborder-colorfocus-visible--xh-_tonecolor-picker 的 channel-input 部件 border-color 覆盖槽。
--xh-color-picker-input-border-invalidchannel-inputborder-colorinvalid--xh-border-invalidcolor-picker 的 channel-input 部件 border-color 覆盖槽。
--xh-color-picker-input-font-sizechannel-inputfont-sizedefault--xh-text-secondary-sizecolor-picker 的 channel-input 部件 font-size 覆盖槽。
--xh-color-picker-input-hchannel-inputblock-sizedefault--xh-control-h-smcolor-picker 的 channel-input 部件 block-size 覆盖槽。
--xh-color-picker-input-pxchannel-inputpadding-inlinedefault--xh-control-px-smcolor-picker 的 channel-input 部件 padding-inline 覆盖槽。
--xh-color-picker-input-radiuschannel-inputborder-radiusdefault--xh-shape-controlcolor-picker 的 channel-input 部件 border-radius 覆盖槽。
--xh-color-picker-label-fglabelcolordefault--xh-fg-defaultcolor-picker 的 label 部件 color 覆盖槽。
--xh-color-picker-label-font-sizelabelfont-sizedefault--xh-_color-picker-label-font-sizecolor-picker 的 label 部件 font-size 覆盖槽。
--xh-color-picker-label-font-weightlabelfont-weightdefault--xh-text-label-weightcolor-picker 的 label 部件 font-weight 覆盖槽。
--xh-color-picker-layerpositionerz-indexdefault--xh-_layercolor-picker 的 positioner 部件 z-index 覆盖槽。
--xh-color-picker-max-hcontentmax-block-sizedefault--xh-viewport-h-mdcolor-picker 的 content 部件 max-block-size 覆盖槽。
--xh-color-picker-saturation-area-hsaturation-areablock-sizedefault9remcolor-picker 的 saturation-area 部件 block-size 覆盖槽。
--xh-color-picker-saturation-area-radiussaturation-areaborder-radiusdefault--xh-shape-controlcolor-picker 的 saturation-area 部件 border-radius 覆盖槽。
--xh-color-picker-slider-thumb-sizealpha-slider
hue-slider
--xh-_thumb-sizedefault--xh-track-thumb-sizecolor-picker 的 alpha-slider、hue-slider 部件 --xh-_thumb-size 覆盖槽。
--xh-color-picker-slider-track-thicknessalpha-slider
hue-slider
--xh-_track-thicknessdefault--xh-space-3color-picker 的 alpha-slider、hue-slider 部件 --xh-_track-thickness 覆盖槽。
--xh-color-picker-swatch-borderswatch--xh-swatch-borderdefault--xh-border-defaultcolor-picker 的 swatch 部件 --xh-swatch-border 覆盖槽。
--xh-color-picker-swatch-cellswatch-picker--xh-_color-swatch-picker-celldefault--xh-control-h-smcolor-picker 的 swatch-picker 部件 --xh-_color-swatch-picker-cell 覆盖槽。
--xh-color-picker-swatch-gapswatch-pickergapdefault--xh-control-gap-smcolor-picker 的 swatch-picker 部件 gap 覆盖槽。
--xh-color-picker-swatch-icon-sizeswatch-picker--xh-icon-sizedefault--xh-_color-swatch-picker-markcolor-picker 的 swatch-picker 部件 --xh-icon-size 覆盖槽。
--xh-color-picker-swatch-picker-gapswatch-pickergapdefault--xh-_color-swatch-picker-gapcolor-picker 的 swatch-picker 部件 gap 覆盖槽。
--xh-color-picker-swatch-radiusswatch--xh-swatch-radiusdefault--xh-shape-insetcolor-picker 的 swatch 部件 --xh-swatch-radius 覆盖槽。
--xh-color-picker-swatch-sizeswatch--xh-swatch-sizedefault--xh-_swatch-sizecolor-picker 的 swatch 部件 --xh-swatch-size 覆盖槽。
--xh-color-picker-thumb-borderarea-thumbborderdefault--xh-color-neutral-0color-picker 的 area-thumb 部件 border 覆盖槽。
--xh-color-picker-thumb-radiusarea-thumbborder-radiusdefault--xh-shape-circlecolor-picker 的 area-thumb 部件 border-radius 覆盖槽。
--xh-color-picker-thumb-scale-draggingarea-thumbscaledragging--xh-motion-scale-dragcolor-picker 的 area-thumb 部件 scale 覆盖槽。
--xh-color-picker-thumb-shadowarea-thumbbox-shadowdefault--xh-elevation-raisedcolor-picker 的 area-thumb 部件 box-shadow 覆盖槽。
--xh-color-picker-thumb-sizearea-thumbblock-size
inline-size
margin-block-start
margin-inline-start
default14pxcolor-picker 的 area-thumb 部件 block-size、inline-size、margin-block-start、margin-inline-start 覆盖槽。
--xh-color-picker-trigger-fgtriggercolordefault--xh-fg-defaultcolor-picker 的 trigger 部件 color 覆盖槽。
--xh-color-picker-trigger-font-sizetriggerfont-sizedefault--xh-text-body-sizecolor-picker 的 trigger 部件 font-size 覆盖槽。
--xh-color-picker-trigger-gaptriggergapdefault--xh-_color-picker-gapcolor-picker 的 trigger 部件 gap 覆盖槽。
--xh-color-picker-value-fgvalue-textcolordefault--xh-fg-defaultcolor-picker 的 value-text 部件 color 覆盖槽。
--xh-color-picker-value-font-sizevalue-textfont-sizedefault--xh-text-body-sizecolor-picker 的 value-text 部件 font-size 覆盖槽。

动效 ​

动效角色:按压 · 状态 · 切换 · 出现(锚定列表)(见动效规范)。

可覆盖的动效槽:--xh-color-picker-thumb-scale-dragging。

共享关键帧 xh-overlay-slide-in · xh-overlay-slide-out 由 family/motion.css 提供,皮肤 @import 它,单独引入仍成立;background-color · border-color · scale 走 transition 过渡。时长与缓动读动效令牌,改令牌即改全局节奏。

皮肤之外还有一段:退场由适配器的退场闸门把关,动画播完才真收起。

系统开启减弱动效时由令牌层统一收敛,皮肤不另作判断。

响应式 ​

  • 浮层的宽度与高度分别受可用空间约束,窄视口下面板不会超出屏幕,容纳不下时在面板内滚动。
  • 粗指针下命中区是取色面、滑块整条与色板整格。

RTL ​

皮肤用逻辑属性排布(inline-start 一族),dir="rtl" 下自动镜像;另有按 dir 分支的规则。

  • dir="rtl" 只对调横轴(取色面的饱和度、两条滑块)上左右方向键与指针的语义,上下方向键始终是屏幕向上为增大。

Released under The MIT License