把项目从「手写 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 处引用自包含。
3.8 KiB
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 现在出两张——面板本体与取色器。