花色选取器
美丽的花朵花朵 网络取色器。 作为独立的"香草"JS类,或作为一薄回放/Vue/Svelte/Angular包装.
https://github.com/user-attachments/assets/553ee0ff-1f52-497f-bc8f-cee9a7b91d66 页面存档备份,存于互联网档案馆
软件包
| 软件包 | 说明 | 版本 |
|---|---|---|
@dayflow/blossom-color-picker | 香草联署材料核心(零依赖性) | 2.0.0 (韩语) |
@dayflow/blossom-color-picker-react | 反应包装 | 1.0.0 (单位:千美元) |
@dayflow/blossom-color-picker-vue | Vue 3 包装 | 1.0.0 (单位:千美元) |
@dayflow/blossom-color-picker-svelte | 斯维尔特包装器 | 1.0.0 (单位:千美元) |
@dayflow/blossom-color-picker-angular | 角包装器 | 1.0.0 (单位:千美元) |
安装
# Vanilla JS (core)
npm install @dayflow/blossom-color-picker
# React
npm install @dayflow/blossom-color-picker-react
# Vue 3
npm install @dayflow/blossom-color-picker-vue
# Svelte
npm install @dayflow/blossom-color-picker-svelte
# Angular
npm install @dayflow/blossom-color-picker-angular
使用量
香草联署材料
import { BlossomColorPicker } from '@dayflow/blossom-color-picker';
import '@dayflow/blossom-color-picker/styles.css';
const picker = new BlossomColorPicker(document.getElementById('picker'), {
onChange: color => console.log(color.hex),
});
// Programmatic control
picker.expand();
picker.collapse();
picker.toggle();
picker.setValue({ hue: 200, saturation: 50, alpha: 100, layer: 'outer' });
picker.setOptions({ disabled: true });
picker.destroy();
反应
import { BlossomColorPicker } from '@dayflow/blossom-color-picker-react';
function App() {
const [color, setColor] = useState({
hue: 330,
saturation: 70,
alpha: 100,
layer: 'outer' as const,
});
return <BlossomColorPicker value={color} onChange={c => setColor(c)} />;
}
第3组
<script setup>
import { ref } from 'vue';
import { BlossomColorPicker } from '@dayflow/blossom-color-picker-vue';
const color = ref({
hue: 330,
saturation: 70,
alpha: 100,
layer: 'outer',
});
function handleChange(c) {
color.value = c;
}
</script>
<template>
<BlossomColorPicker :value="color" @change="handleChange" />
</template>
丝绒
<script>
import { BlossomColorPicker } from '@dayflow/blossom-color-picker-svelte';
let color = $state({
hue: 330, saturation: 70, alpha: 100, layer: 'outer',
});
function handleChange(newColor) {
color = newColor;
}
</script>
<BlossomColorPicker value={color} onchange={handleChange} />
角质
import { Component } from '@angular/core';
import {
BlossomColorPickerComponent,
type BlossomColorPickerColor,
} from '@dayflow/blossom-color-picker-angular';
@Component({
selector: 'app-root',
imports: [BlossomColorPickerComponent],
template: `
<blossom-color-picker
[value]="color"
(colorChange)="onColorChange($event)"
/>
`,
})
export class App {
color = { hue: 330, saturation: 70, alpha: 100, layer: 'outer' as const };
onColorChange(c: BlossomColorPickerColor) {
this.color = c;
}
}
选项/ 道具
所有软件包共享相同的一组选项. 在反应中,它们作为JSX道具被传递;在Vue作为组件道具被传递(与事件通过 @change 编号 : @collapse);在斯维尔特语中作为回调道具(Svelte)onchange 编号 : oncollapse; 以角为单位 @Input() 绑定( 通过 (colorChange) 编号 : (colorCollapse)) (中文(简体) ).
| 选项 | 类型 | 默认 | 说明 |
|---|---|---|---|
value | BlossomColorPickerValue | - 说吧 | 已控制采取器的值 . |
defaultValue | BlossomColorPickerValue | { hue: 330, saturation: 70, alpha: 100, layer: 'outer' } | 非控制模式的初始值 . |
colors | ColorInput[] | (18-颜色套装) | 颜色列表, 自动排序并分层分布 . |
onChange | (color: BlossomColorPickerColor) => void | - 说吧 | 颜色变化时调用. 阴: @change。斯维尔特: onchange角 : (colorChange)。 。 。 . |
onChangeComplete | (color: BlossomColorPickerColor) => void | - 说吧 | 在花瓣活化或阴暗的姿态结束后召回一次. 阴: @change-complete。斯维尔特: onchangecomplete角 : (colorChangeComplete)。 。 。 . |
onCollapse | (color: BlossomColorPickerColor) => void | - 说吧 | 取者倒地时召入. 阴: @collapse。斯维尔特: oncollapse角 : (colorCollapse)。 。 。 . |
onHover | (color: BlossomColorPickerColor | null) => void | - 说吧 | 用花瓣的颜色调用它会选择它被徘徊或键盘聚焦时,并使用 null 当它结束。 阴: @hover。斯维尔特: onhover角 : (colorHover)。 。 。 . |
disabled | boolean | false | 采取器是否被禁用 . |
openOnHover | boolean | false | 如果选中的话, 请在盘旋时打开拾取器, 而不是点击 . |
initialExpanded | boolean | false | 采取器是否开始扩展 . |
animationDuration | number | 280 | 花开动画的基时间用ms;每个相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相相. |
showShadeSlider | boolean | true | 是否显示阴影( 光滑) 弧滑动 . |
showAlphaSlider | boolean | true | 折旧的别名 showShadeSlider;在提供两者时,新名称优先. |
coreSize | number | 32 | 以px表示的中央圆相径. |
petalSize | number | 32 | Px中单色花瓣的相位. |
showCoreColor | boolean | false | 当为真时,核心在扩展时显示所选颜色;否则为白色. |
hoverPreview | boolean | false | 当真的,戒指,核心(与 showCoreColor),并背景显示被取出之前被徘徊或被聚焦的花瓣颜色. |
petalShape | 'circle' | 'sakura' | 'lotus' | 'pinwheel' | 'circle' | 花瓣轮廓. sakura:有被子尖的宽花瓣. lotus:被打成尖尖的圆形基座. pinwheel:尖端被扫到一面,所以花朵看起来像是在转动. 外形花瓣离核心较远,从基部到尖端有轻度遮蔽并被忽略 --bcp-petal-shadow。 。 。 . |
petalStyle | 'flat' | 'veined' | 'flat' | 外形花瓣上的表面细节. veined 每个花瓣上画出一条中肋和侧脉. 忽略当 petalShape 实值 circle。 。 。 . |
sliderPosition | 'top' | 'bottom' | 'left' | 'right' | 'right' | 弧形滑轮固定位置. |
adaptivePositioning | boolean | true | 智能移动器: 自动将取取取器移到取取取器内,并重新定位取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取. |
className 编号 : class | string | "" | 额外的 CSS 类( 反应 : className斯维尔特: class) (中文(简体) ). |
CSS 变量
把这些放在 .bcp-root 或任何以取取者为主题的祖先. 每一个都回到默认的外观,所以让它们未设置会改变什么.
| 变量 | 默认 | 样式 |
|---|---|---|
--bcp-surface | #FFFFFF | 花瓣后的背景盘. |
--bcp-surface-shadow | 软投影 | 背景盘的阴影. |
--bcp-tint-opacity | 0.15 | 磁盘上所选取的彩色锡的强度 . |
--bcp-track | rgba(0, 0, 0, 0.06) | 环和荫滑道的未填轨. |
--bcp-petal-shadow | none | 每花瓣下有阴影. |
--bcp-petal-shadow-hover | --bcp-petal-shadow | 花瓣下有阴影. |
--bcp-petal-hover-scale | 1.1 | 徘徊花瓣长出多少. |
--bcp-petal-hover-brightness | 1.1 | 有多少花瓣的亮度. |
--bcp-petal-vein-color | #fff | 静脉线的颜色 petalStyle: 'veined'。 。 。 . |
--bcp-petal-vein-opacity | 0.5 | 脉行不通. |
--bcp-core-bg | #FFFFFF | 扩展时的核心颜色 showCoreColor 关闭. |
--bcp-core-shadow | 微妙的环 + 阴影 | 扩张后核心的影子. |
--bcp-trigger-shadow | 0 2px 8px rgba(0, 0, 0, 0.12) | 崩溃的扳机的阴影. |
--bcp-trigger-shadow-hover | 0 4px 14px rgba(0, 0, 0, 0.18) | 悬回扳机的阴影. |
--bcp-handle-border | white | 阴影滑动手柄的外观 . |
--bcp-focus-ring | #3b82f6 | 键盘焦点大纲. |
--bcp-focus-ring-gap | white | 核心与重点纲要之间的差距. |
.my-dark-theme .bcp-root {
--bcp-surface: #1e1b2e;
--bcp-core-bg: #1e1b2e;
--bcp-track: rgba(255, 255, 255, 0.12);
--bcp-handle-border: #1e1b2e;
--bcp-focus-ring-gap: #1e1b2e;
}
香草联署材料方法
核心类暴露出这些额外的方法:
| 方法 | 说明 |
|---|---|
setValue(value) | 设置当前颜色值 . |
getValue() | 获取当前颜色为 BlossomColorPickerColor。 。 。 . |
expand() | 开取者. |
collapse() | 关取取者. |
toggle() | 切换打开/ 关闭 . |
setOptions(opts) | 运行时更新任何选项 . |
destroy() | 删除所有 DOM 元素和事件听众 . |
特征
智能移位器和可适应UI
取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取取 何时 adaptivePositioning 启用 :
- 查看端口移动:如果被扩展的拾取器会溢出屏幕边缘(在移动上常见),它会自动转向视图.
- 自动滑动器定位: Arc滑块会自动移动到最可用的空间(Top, Bottom, Left, or Right)的一侧.
- 暗模式准备: 背景会自动适应您的主题, 使用当前所选颜色的软而有锡的覆盖 .
几何叠接
我们的"Bloom"算法使用三角计算来保证:
- 零差距: Petals 积极"拥抱" 核心和巢穴深入到前几层的"valleys".
- 错位布局:相邻地层自动交错以产生密集而自然的花卉效应而不论颜色计数.
类型参考
BlossomColorPickerValue
用于被控制/不受控制状态的值对象 .
| 外地 | 类型 | 说明 |
|---|---|---|
hue | number | 色角 (0-360). |
saturation | number | 滑子位置 (0-100). 0=亮相,100=暗相. |
lightness | number? | HSL 轻度( 如果省略, 自动从滑块计算) . |
originalSaturation | number? | 所选花瓣的基部饱和. |
colorIndex | number? | 原始输入调色板中的索引;在整个布局排序中保存花瓣身份. 更换调色板时重置. |
alpha | number | 阿尔法值 (0-100). |
layer | 'inner' | 'outer' | 选择的花瓣属于哪一层 . |
BlossomColorPickerColor
扩展 BlossomColorPickerValue ——归来 onChange 财务报告和审定财务报表 onCollapse。 。 。 .
| 外地 | 类型 | 说明 |
|---|---|---|
hex | string | 螺旋颜色字符串,例如:. "#6586E5"。 。 。 . |
hsl | string | HSL 字符串, 例如 . "hsl(225, 71%, 65%)"。 。 。 . |
hsla | string | HSLA弦与α. |
ColorInput
type ColorInput = string | { h: number; s: number; l: number };
颜色格式
这个 colors 选项接受以下任何一种格式,它们可以混合:
// Vanilla JS
const picker = new BlossomColorPicker(el, {
colors: [
'#FF6B6B', // hex
'rgb(107, 203, 119)', // rgb()
'rgba(65, 105, 225, 0.9)', // rgba()
'hsl(280, 70%, 55%)', // hsl()
'hsl(200 80% 60%)', // hsl() space-separated
{ h: 45, s: 90, l: 65 }, // HSL object
],
});
// React
<BlossomColorPicker
colors={['#FF6B6B', 'rgb(107, 203, 119)', { h: 45, s: 90, l: 65 }]}
/>
项目结构
这是一个单曲,有五个包:
packages/
core/ @dayflow/blossom-color-picker — standalone vanilla JS class
react/ @dayflow/blossom-color-picker-react — thin React wrapper
vue/ @dayflow/blossom-color-picker-vue — thin Vue 3 wrapper
svelte/ @dayflow/blossom-color-picker-svelte — thin Svelte 5 wrapper
angular/ @dayflow/blossom-color-picker-angular — thin Angular wrapper
React,Vue,Svelte和Angular适配器是轻量级包装器(~2 KB各一),将核心实例挂入容器元素并同步框架道具/活动.
由 贾斯李从 @lichinlin (英语)。 。 。 .
键盘交互和状态相容性
Tab在一个可聚焦的花瓣上进入花瓣组. 向左/向右方向逆时针移动/向右方向移动在当前环中; 向上向下移动, 选择最近的角位置 。 Enter/Space 选择焦点花瓣. 逃出会关闭可折叠取出器并恢复触发焦点. 一个选手 collapsible: false 保持开放.
阴影滑动器暴露 role="slider" 及其当前值。 箭头键修改为 1, Shift+Arrow 和 PageUp/PageDown 修改为 10; Home/End 选择 0/100. 增加阴影会变暗. onChange 互动期间运行; onChangeComplete 运行一次在指针放出/取消,或按键放出/blur上,并带有最后拟议颜色. 已取消的指针手势保留了最后的更改 。 在没有变化或拾取器被销毁时,没有释放完成.
在受控模式下,花瓣和花荫相互作用只能通过回调来提议颜色. 提供已接受的价值 setValue 或者说 setOptions({ value })。通过 setOptions({ value: undefined }) 返回到无控制模式,同时保留当前接受的值.
为了兼容性, value.saturation 仍然存储 阴影位置,而不是 HSL 饱和度. originalSaturation 存储花瓣的 HSL 饱和度. showAlphaSlider 仍为阴影弧的变质名称; 使用 showShadeSlider 在新代码。 取花者保留了明确供应的 alpha 没有不透明控制; 使用 ChromePicker 因为它的不透明滑道。 默认的α现在为100(opaque);通过50明确保留了之前的半透明默认.