@xwink/ui

ColorPicker

取色面板。色盘、色相条与透明度条是 XSlider(二维面 + 一维条),透明度数字框是 XNumberField,吸管用浏览器的 EyeDropper(Chromium 系才有,没有就不显示按钮)。多数时候不单独用,而是经 XColorField 的色块点开;自己配触发器时放进 XPopover。

值

v-model 是 CSS 十六进制串:#rrggbb,不是不透明时 #rrggbbaa(小写,同品牌色 useBrandColor)。传进来的还认 3 / 4 位十六进制与 rgb() / rgba(),发出去的一律归一成上面两种写法。文档里存 [r, g, b, a] 的编辑器类宿主用导出的 parseColor / rgbaToHex 互转——十六进制对 0–255 的 RGBA 无损,往返不变。

输入框在 HEX 与 RGB 两种写法之间切换,回车或失焦提交;没写透明度的沿用现在的。alpha 关掉后没有透明度条与数字框。

带透明度 / 不带透明度

#3b82f6cc · input 0 次 / commit 0 次

#16a34a

内部状态

面板内部按 HSV 持有状态,不每步从 RGB 反算:灰色没有色相、黑色连饱和度也没有,反算就丢——拖到黑色再拖回来,色相跳回红色、圆点跳到左边。所以两条讲究:

  • 反算时退化的分量沿用上一个状态(黑色沿用色相与饱和度,灰色沿用色相)。
  • 外面传回的颜色与内部状态画出来的相同就不换状态:拖动中宿主回传的是取整过的颜色,拿它反算圆点会在像素之间抖。

v-model:state 让宿主替面板留着这份状态:面板关了再开,颜色没被别处改过就接着用。

拖到黑色、关了再开,色相还在

提交节奏与最近使用

色盘、色相条、透明度条与透明度数字框拖动或微调中逐帧发 input,停手发一次 commit;打字、点最近使用、吸管只发 commit。宿主拿 input 实时改文档,按 commit 把一次调整并成一步撤销。

每次 commit 记进最近使用。缺省整页共享一份、存 localStorage(键 ui:recent-colors),存储不可用时按空处理;recents 传 false 不显示也不记,传 createColorRecents({ key, storage }) 换键或存储,也可以自己实现 ColorRecents(如换成文档里用过的颜色)。

Esc 两段式:输入框里有没提交的字时先撤回并标 defaultPrevented,外面的浮层不跟着关;没有时照常冒泡关浮层。

API

Props

名称类型默认值说明
alphaboolean | undefinedtrue能不能改透明度:关掉后不显示透明度条与数字框,输入框里的透明度也不认
mixedboolean | undefinedfalse多选时各不相同:值给 undefined 并带上它,输入框为空、占位「多个值」,色盘从黑色(或留着的状态)起步, 改了就是一个颜色。同 `XNumberField` 的 `mixed`,是显式状态
eyedropperboolean | undefinedtrue显示吸管(浏览器有 `EyeDropper` 才显示,Chromium 系)
recentsfalse | ColorRecents | undefinedundefined最近使用的来源:缺省整页共享一份、存 localStorage(`ui:recent-colors`,见 `useColorRecents`); `false` 不显示也不记;宿主可以传自己的(`createColorRecents` 换键或存储,或自己实现 `ColorRecents`)
disabledboolean | undefinedfalse—
size"mini" | "small" | "medium" | "large" | "super" | undefined"small"尺寸:mini / small / medium(默认) / large / super;不传则跟随环境 data-size
modelValuestring | undefined——
stateHsva | undefined—面板的内部状态:宿主替面板留着,关了再开颜色没被别处改过就接着用,黑色 / 灰色上的色相不会因重新打开丢掉

Emits

事件载荷说明
update:modelValue[value: string | undefined]—
input[value: string]—
commit[value: string]—
update:state[value: Hsva | undefined]—