Files
SpineWallpaper/.scratch/build-pipeline/issues/11-color-picker-palette-and-eyedropper.md
Shuery 3f11426964 feat: TS 构建管线、Spine 抓取器与 wallpapers/ 唯一真相来源
把项目从「手写 dist/」改成「wallpapers/ 是唯一真相来源,dist/ 由 pnpm build 生成」,
并补上配套的类型、门禁与抓取器。一次提交落地整条管线,因为拆开会留下不能构建的中间态。

- src/:运行时与模拟器源码(TS,strict),编译到 build/ 再拷进各分发
- tools/:build / dev / check-{syntax,paths,dist},以及抓取器与回归门禁 tools/checks/
  (.scratch/ 下那批一次性脚本移入 tools/checks/ 并入库为长期门禁)
- wallpapers/:七档壁纸的源数据 + README.md(id/音频/预设的完整规范)
- docs/adr/0005-0008:构建管线与分发拓扑、模拟器契约、自包含 sim、每骨架资源布局
- .gitignore:排除 .scratch/ 的参考资料副本(上游 spine 整仓克隆 ~1.2 GB、
  抓取侦查数据 ~680 MB)与调试转储;这些是本地调查材料,补偿会让仓库无法克隆
- 归一化 .gitignore/CONTEXT.md 行尾(工作区 CRLF、索引 LF 造成的整文件假 diff)

同时修掉三档卡住构建的未完工壁纸:
- kv45 的 meta.json 里 id 还是抓取期场景名 scene_main,经 downloader promote 正名为 kv45
- shajin / zhigengniao_juheye 的 meta.json 误用了骨架描述文件(name/spine/animations/pages)、
  且都缺 preset.template.json;现按规范重建:骨架沉到 spines/<名>/(spine-ts 按 atlas 所在
  目录解析贴图页)、补上元数据与单骨架预设,并清掉 zhigengniao 骨架里指向作者机的绝对路径
- 顺带 promote 已在 sources.yml 里的 kv46(月升之前,与兽共舞)

pnpm check 五道门全绿:10 个分发 / 7 档壁纸 / 141 处引用自包含。
2026-10-02 01:27:02 +08:00

3.8 KiB
Raw Permalink Blame History

11 — 取色器的调色板、对勾与吸管

Status: resolved Type: task

需求(用户原话)

吸管是手动从当前屏幕的任一点取色,勾选是选择指定的预设颜色,补充各个预设颜色信息图片,最后一张图是使用吸管取色时,会自动在最后一行给出两个邻近颜色,另外最后一行第一个是当前吸管所在的颜色。关于颜色选择的其他信息,可查找官方文档查看

附 17 张图:15 个预设色各一张(对勾 + 十六进制值),以及吸管取色时的一张。

官方文档查证

User Properties 确认了取值格式: "The color property will return three numeric values, separated by a space character (1.0 0.1 0.25 for example)" ——与 colorToCss / cssToColor 的实现一致。

Display Conditions 确认了 condition 的写法就是 showclock.value == true,与 conditionMet 的实现一致(文档称其为 "JavaScript-compatible if condition")。

但文档没有描述取色器的界面(调色板、吸管、对勾都不在文档里)。所以那 17 张截图就是规格。

① 调色板:15 个预设色的准确值

原来是我按视觉估的,好几个不对。对着截图逐个改成官方值:

行 列 1 列 2 列 3
1 #ffffff #c0c0c0 #000000
2 #ff0000 #ffa500 #ffff00
3 #00ff00 #008000 #254117
4 #add8e6 #0000ff #00008b
5 #00ffff #800080 #ff00ff

原来错的地方:#c8c8c8→#c0c0c0、#ff8000→#ffa500、#004000→#254117、 #000080→#00008b,以及整行 #c0c0ff/#8000ff/#ff00ff → #00ffff/#800080/#ff00ff。

② 对勾 = 当前颜色命中了某个预设

当前颜色与某个预设色完全相等时,那个色块上加对勾。对勾颜色按色块亮度选黑或白 (luminance < 0.5 用白),否则深色块上根本看不见。

③ 吸管 = 从屏幕任意位置取色

用浏览器原生的 EyeDropper API(new EyeDropper().open())。WE 是原生程序,自带屏幕取色; 浏览器里这是唯一的官方途径。本机 CEF 146 支持它(测试实测 dropper.disabled === false)。 不支持时按钮禁用并把原因写进 title,而不是静默失效。

取到的颜色作为新的一行加在调色板末尾,第一个就是取到的颜色,后面跟两个邻近的预设色。

一处推断,需要你确认

"两个邻近颜色"我按 RGB 欧氏距离最近的两个预设色实现。但你那张图给的是 #3c3c3c → 邻近显示 #ffffff 与 #000000,而按 RGB 距离算,离 #3c3c3c 最近的是 #000000 与 #c0c0c0,对不上。所以这条规则我猜错了,图省事写成了最近邻。

图里是白与黑,看起来更像"亮度轴的两端"或别的规则。等你说明真实规则再改。

另:WE 的吸管在移动过程中就能实时预览当前颜色(原生程序可以持续采样屏幕); 浏览器的 EyeDropper 是一次性模态选择,没有实时回调,所以那一行是在取色完成后才出现。

验证

tools/checks/verify-panel.mts 新增断言,全部通过:

  • 15 个预设色与官方逐个一致(逐字比对数组)
  • 初始颜色 #63269e 不是预设色 → 没有对勾
  • 把颜色改成 #ff0000 → 对勾落到那个色块上
  • 吸管按钮存在;可用/禁用两种状态都算通过,但会把实际状态与原因打出来

其余回归全绿:pnpm check、调试服与浏览器冒烟、四档自包含包 file://、静态托管预览、 6 组渲染与重构前逐像素相同。

出图:tools/checks/shot-panel.mts 现在出两张——面板本体与取色器。