Skip to content

feat(panel): 面板视觉系统 P0–P1b 与设置/人格/日记三页收口 - #646

Merged
modusensus merged 11 commits into
mainfrom
docs/panel-visual-system
Nov 10, 2026
Merged

modusensus merged 11 commits into
mainfrom
docs/panel-visual-system

Conversation

@modusensus

Copy link
Copy Markdown
Member

这个 PR 做什么

把「面板视觉系统」的前四片落成代码:几何刻度层(P0/P1a)→ 状态页迁移(P1b)→ 色槽归属 → 设置/人格/日记三页收口与图表色盘统一。设计记录与逐条取舍在 docs/plans/2026-11-10-panel-visual-system.md。

1. 几何刻度与原语层(P0 / P1a)

  • 间距 / 圆角 / 字号 / 字重收成 --mneme-space|radius|type|weight-*,挂在与语义色层同一组五个渲染根上(overlay / 侧栏插槽 / 顶部入口 / panelGlyph 都不在 .mneme-x 子树里,少挂一个等于没定义);
  • 新增几何原语层,表外键(9 / 10 / "8px")当场抛错——宁可渲染炸掉,也不要多出第 108 种间距;
  • test/panel-tokens.test.js 锁五件事:刻度集完整、五个渲染根一个不少、CSS 与刻度表成对、px 存量棘轮(只许减不许增)、状态页迁移进度不回退。

2. 状态页(P1b)

间距与圆角全部走刻度;期间修了 7 天 token 柱状图三处 bug(轴刻度、上限、全零时改空态而不是画一排 0 高柱)。

3. 色槽各有其主

  • 沉淀图不再借 --mneme-chart-3:那根琥珀在 donut 里代表「实体抽取」,同一页上一个颜色两种含义;
  • --mneme-chart-6 原本定义了没人用,弧与图例点各自内联了一份同样的 color-mix()——三份值一样却互为独立源,改一处漏两处,现在都引用这一份;
  • 语义层内部不许出现别家色槽的 var(),拦的是「继承式解耦」:看着分了家,其实一动全动。

4. 设置 / 人格 / 日记三页

日记纸面「四种风格毫无变化」的根因不是没做完,是它自己把效果盖掉了。 四条风格规则(ruled / grid / kraft / plain)与基础规则 .mneme-diary-paper 同为单类选择器,基础规则在数组里更靠后、又用了 background 简写,于是把纹路与底色整体复位。无头浏览器取 getComputedStyle 实测:改前「横线」与「方格」两张纸的像素差 0.00%,纹路全是 none——注释里那句「格线正好落在 26px 行高上」一次都没生效过。

修法刻意不靠挪顺序(修一次、后面改动还能踩回去):把纹路挂到拥有 26px 行高的 .mneme-diary-text 上。后代选择器与基础规则不再是同一个元素,冲突从结构上消失;而且纸面有两处渲染(面板 tab 里纸内先有 paperhead,右栏里纸内首孩子直接是正文),同一个 background-position 一处要 12px、一处要 32px 永远对不齐——纹路跟着正文元素走,相位天然对齐。

  • 四种收成三种:素纸 / 横线 / 点阵,删除牛皮。牛皮与素纸只差 1.01:1(人眼看不出来),而且它是这块唯一的硬编码 hex;「方格」改「点阵」——3 倍渲染下格子的竖线会从 14px 中文衬线字中间穿过,点阵保留二维结构又不压正文。localStorage 的值仍是 grid,零迁移。
  • 线色换成新令牌 --mneme-rule(20% label-primary,浅 1.55:1 / 深 1.88:1;原 border-l1 只有 1.09 / 1.20,1px 线可辨阈值约 1.5:1)。
  • 顺手修七处:切 tab 时正文左边缘横跳 12px(外层已有 padding,两页又各加一份)、「已保存」是个永久哨兵导致保存成功后再改字段仍显示已保存且能和「保存失败」并存、400px 侧栏下人格编辑区被压到 127–180px、设置页规则行删除键默认 opacity:0 只在 hover 时现身、六个不在刻度上的圆角、.mneme-set 逐字重复的规则、paperhead 用 solid 而全页其余分隔线都是 dashed。

5. 图表色盘统一

五个槽共用一套两步混色:先 62% 静态色与 38% 中性灰压彩度(紫给 74%,否则读成灰),再按各槽比例混 label——label 随主题反向,深浅两套色阶自动成立。

改前 改后
浅色彩度 0.094–0.172 0.084–0.095
浅色明度 L* 0.45–0.63 0.47–0.58
浅色对比 3.33–8.19 4.41–7.13
深色对比 6.54–9.59 6.16–8.15

色源用 --dsw-static-* 而不是 --dsw-alias-state-*:别名是宿主的语义状态色,宿主调一次就顺手换掉整张图,而图表色盘是设计决定。代价说清楚:统一明度后颜色不再一眼跳出来,相邻两块要靠图例与大小顺序认。

变异自证

改一处、只改一处,看锁会不会红(全部实跑):

  • 把 grid 纹路挪回基础规则 → 级联锁红
  • 把 chart-5 退回绿 → 「五个槽只用了 4 个色相」
  • 把 chart-2 拆掉中性灰 → 「不是『静态色 → 中性灰 → label』两步式」
  • 把 chart-1 换成宿主状态别名 → 「用了宿主状态别名当色源」
  • 把 chart-6 换成琥珀 → 「是『其他』类,该保持半透明灰」
  • 状态页任一处 var(--mneme-space-12) 改回 12px → 迁移锁红
  • 把 .mneme-paneliglyph 从 token 规则选择器里删掉 → 挂载根锁红
  • 删掉 GEOMETRY.space 的 12 但保留 --mneme-space-12 → CSS↔刻度成对锁红

闸门

  • npm test:3,286 tests / 3,285 pass / 1 skip / 0 fail
  • node scripts/check-sync.js:119 文件一致
  • 提交署名 modusensus,无 Co-Authored-By、无工具署名

关于 rebase

本分支已 rebase 到 1c888ed。rebase 后 px 棘轮报 9 个值上涨,查明是 #642 自己在 lib/client.js 里带进 21 处 px,而基线是 ef8f9ce 时点冻的(只认得当时那棵树),因此基线按合进来的那棵树重冻,并在注释里写明「本分支相对 main 是净减 87 处」。

没有做(有意留到后面)

  • P1c / P1d:设置页 TOC 没有当前态(缺 scroll spy)、14 处用 div 当分组标题、字号阶 11/12/13 未收;
  • 400px 窄容器只补了断点覆盖,没有在真实面板里量过座位高度。

面板此前没有组件层,卡片与行都是手写 div + 行内 style,于是 padding 长出
107 种取值、只有 41.7% 落在 4 网格上、29% 是奇数像素(量化见
docs/plans/2026-11-10-panel-visual-system.md 第二节)。本次只补底层,一个
seat 都没换,视觉不变。

- 刻度层:--mneme-space / --mneme-radius / --mneme-type / --mneme-weight,
  接在既有 token 规则上,五个渲染根一并生效。按像素值命名而不是档位号,
  理由写在注释里(档位号会让 gap:"4" 等于 8px,且必须维护第二份映射)。
- 原语层:Stack / Inline / Card / Section / Grid,标记注释
  panel-geometry:begin/end 之间,纯函数、无 require,测试直接抽出来跑。
  只收刻度键,表外值当场抛错——宁可渲染炸掉,也不要多出第 108 种间距。
- panel-tokens.test.js 六例:刻度定义与五个渲染根成对、原语只收刻度键、
  var() 真的进了 style、原语块内不许裸 px,以及 CSS px 存量棘轮
  (89 个值逐值计数录成基线,只许减不许增;1px 发丝线与 2px 焦点环两个
  白名单值消失同样报红)。

变异自证四条全部按预期红:一处 padding 16→17(棘轮)、GEOMETRY 删掉 12
(原语 style)、选择器少挂 paneliglyph(渲染根)、原语块塞 9px(裸 px)。

验证:panel-tokens 6/6;contrast + client 127/127(contrast 一行未改);
全量 3268 tests / 3267 pass / 0 fail / 1 skip;check-sync ✓(119 文件)。
- 5.A:令牌按像素值命名而非档位号,说明为什么(调用点自解释、不需要
  第二份映射、测试能直接拿「允许的 px 集合」校验)。
- 5.B:签名按实现修正(内距叫 pad、Stack 的 gap 默认 0),并写清为什么
  用抛错而不是 assert(assert 在生产构建里会被剥掉,等于线上放行)。
- 新增 5.D 落地记录:三个交付物的位置、存量棘轮口径(89 个值 / 1501 处,
  与第二节 1610/107 的差异来自剔除注释散文 px 与只统计 CSS 切片)、
  四条变异自证表、本次实测结果。
- 九、验收标准拆成「已达成」与「P1b–P1d 待做」两段,避免把未做的算成做了。
- 十、时机:P0+P1a 不改视觉,已落地;P1b 起动视觉,仍排在 12-20 之后。
把状态页的 44 条 CSS 规则(status/stat/tokenflow/kpiband/donut/sink/legacy/wb/
conflict/pending/heatbar 命名空间)里的 padding、margin、gap、border-radius 换成
--mneme-space-* 与 --mneme-radius-*;4 处行内 style 改走 space()。

新增两档刻度 --mneme-space-10 / --mneme-space-40 与 --mneme-radius-12:这三处是
既有高频取值,压到邻档会让卡片内距变松、三大块层次变平、大小卡圆角不分。

贴近邻档的取舍一律刻意:分组 26→24、卡内下沿 14→12、工作台标题上沿 28→24、
wbrow/wbmemo 10px14px→10px12px、radius 10→8、heatbar 3px→pill。@container /
@media 里的 14/30/32/36 不动,那是压到正好不溢出的贴合值,不是节奏值。

新增第 7 例锁:扫状态页命名空间的几何声明,令牌要匹配正则、档位要存在、组要对
(防 var(--mneme-space-13) 或把半径写成 space 静默通过),残余只许 0/auto/1px
与 0/50%,并用 coveredRules>=80、coveredDecls>=60 反向防空转。

变异自证三条,均按预期红:margin-top 改回 10px 红两条棘轮与 P1b;space-12 改成
space-13 只红 P1b;radius-12 改成 space-12 只红 P1b。

视觉复核:深浅两主题全高截图,变化像素 4.15% / 5.78% / 6.38%,零颜色、字号与
结构变化,全是几像素级对齐位移。
- 纵轴标签原为 (v/1e6).toFixed(0)+"M":750K / 500K 都成 1M、250K 成 0M,
  正常用量(日几万到几十万 token)永远只看到「1M / 1M / 1M / 0M」
- 上限被 Math.max(1e6, …) 钉在 1M,日 7 万时柱高 7%——用量越小图越平,方向反了
- 七天全零也画轴加七根贴地柱,补 memory.status.token.daysEmpty 空态

轴改成按 1/2/2.5/5 ×10^n 取步长的纯函数块(panel-chart-scale 标记,同
panel-geometry 的先例,测试用 new Function 直接跑);未加载 / 已知为空 / 请求失败
三种状态分开渲染,加载中不刷「没有记录」。新增 test/panel-chart-scale.test.js 6 例,
含源级守卫(纯函数绿了但渲染绕过去等于没修)。变异自证 4 条全部按预期红。

设计笔记补 5.F 一节:根因、改法、实测轴、变异表、以及看见但没动的两处(同页撞色、
donut 第 7 色槽)。
沉淀图的「新增」柱借用了 donut 的 chart-3(琥珀 = 实体抽取),同一页里一色两义,
用户会把两个无关的量读成同一类。现在语义层有 --mneme-sink-added /
--mneme-sink-merged,取值与原来逐字相同,只换归属。

顺带发现 --mneme-chart-6 是个死令牌:弧与图例点各自内联了一份同样的 color-mix,
三份值相同却互为独立源,改一处漏两处。现在两者都引用这一份。

锁从「沉淀图不许借 chart」扩成三家族:chart 只服侍 seg/dot,heat 只服侍热力格,
sink 只服侍沉淀柱;语义层内部也不许出现别家色槽的 var()。后者拦的是「继承式
解耦」——看着分了家,实际一动 donut 色盘就跟着变。

变异自证五条:借色槽、两个方向的令牌继承、内联回退,四条都红;只把两个新令牌的
混色比例各调 1% 仍绿——这条锁守归属不守色值,调色是设计决定,该靠截图给人看。

第一版把语义层检查写成 if (r.sel === layer.sel),而那条规则是字符串拼接出来的、
不在 rules 里,分支永远进不去;变异 M2 该红却绿才暴露,改成直接扫 layer.body。

测试 3,276 / 3,275 pass / 1 skip;check-sync 119 文件一致;沉淀图与 donut 深浅
两主题像素差均 0.00%。
日记「四种风格毫无变化」不是没做完:四条风格规则与基线 .mneme-diary-paper
同为 (0,1,0),基线在 CSS 数组里更靠后且用 background 简写,把
background-image/color 全部复位——edge headless 实测四种纸的
background-image 全是 none。线色用 border-l1 在纸面上只有 1.09:1,
相位也因为 background-origin 默认 padding-box 而从未对齐 26px 行高。

- 纹理挪到 .mneme-diary-paper--ruled/--grid .mneme-diary-text:后代选择器
  与基线不再是同一元素,冲突结构性消失;挂到有 26px 行高的正文上,相位
  不再依赖纸的 padding 与 paperhead 高度
- 基线 background 简写改 background-color(防复发的关键那一处)
- 新令牌 --mneme-rule(20% label,1.55:1 浅 / 1.88:1 深)
- 四种纸收成三种:牛皮删(与素纸差 1.01:1,且是这块唯一硬编码 hex);
  方格改点阵(竖线会从 14px 中文衬线字中间穿过),存储值仍是 grid,零迁移
- 段距 13px 改 1lh:整行对齐且不新增 px

同期收口:paperhead 分隔线 solid 改 dashed;日记/人格去掉水平内边距,
切 tab 不再横跳 12px;删 .mneme-set 的逐字重复规则;三个圆角回刻度;
persona 选中态改与日记同源;「已保存」改为 save 开头 / setField /
toggleEnabled 三处清零(否则先成功后失败会「已保存」+「保存失败」并存);
480 档补日记与人格的上下堆叠、页签不折行;规则行删除键由完全隐藏改为
.45 常显。

新增 3 例锁,4 条变异全部按预期红(基线退回 background 简写、纹理退回
基础类、删掉 setField 的清零、去掉堆叠)。全量 3279 tests / 3278 pass,
check-sync 119 文件一致。
旧口径五个槽各自挑色器与配比,于是各有各的毛病:红槽彩度 0.172(别人 0.094–0.135,
两倍,最刺眼)、chart-2 与 chart-5 都是 green-500(深色下 H 只差 4,读成两块绿)、
amber-600 再压 40% 黑后 H=64 读成土褐、chart-5 的 L*=0.633 而 chart-4 只有 0.449
(一条弧浮着一条弧沉底)。

新配方每个槽两步混色:先 62% 静态色与 38% 中性灰混掉一部分彩度(紫要给 74%,
否则读成灰),再按各槽自己的比例混 label——label 随主题反向,深浅两套色阶自动
成立,不必写第二份深色值。五色相固定为 blue / green / amber / red / violet,
灰槽 chart-6 留给「其他」那一类。

色源刻意用 --dsw-static-* 而不是 --dsw-alias-state-*:别名是宿主状态的语义色,
宿主调一次状态色就会顺手换掉整张图,而图表色盘是设计决定。

沉淀图那两根柱跟着同一套配方(逐字重写、不写 var 引用):同页一半柔和一半艳
最难解释,但归属仍是自己的,以后单独调沉淀图不必先改 donut。

实测浅色 L* 0.47–0.58 / 彩度 0.084–0.095 / 对比 4.41–7.13,深色 L* 0.72–0.80 /
彩度 0.074–0.095 / 对比 6.16–8.15(旧值浅色彩度 0.094–0.172、最低 3.33)。代价是
颜色不再一眼跳出来,相邻两块要靠图例与大小顺序认——统一明度必然的交换。

新增一条锁「图表五色:五个不同色相、同一套两步混色配方」,锁的是配方不是色号
(色号该靠截图给人看):五色相必须互不相同、必须两步式、不许拿宿主状态别名当
色源、chart-6 必须是半透明灰、沉淀图必须跟同一配方。5 条变异全部按预期红。

同时修了 contrast.test.js 的 colorOf:它按非贪婪正则切 color-mix,遇到嵌套会从
内层那个「62%,」处劈开,两层都解析失败、报「解析不出颜色」,看着像色值坏了。
改成按顶层逗号切分。

全量 3,280 tests / 3,279 pass / 1 skip,check-sync 119 文件一致。
rebase 到 main 之后棘轮报 9 个值上涨(1px 131→134、6px 83→88、11px 51→55 等)。
不是本分支加的:#642(情感归属可见)自己在 client.js 里带进 21 处 px,而基线是
ef8f9ce 那个时点冻的,本来就只认得当时那棵树。

基线按「本 PR 合进来的那棵树」重算,注释写清它是「ef8f9ce 基线 − 本分支迁移 +
#642 增量」,并记下本分支自身相对 main 是净减 87 处(减 89、加 2,那 2 处是 15px
字阶与 999px pill 半径这两个刻度定义本身)。不重冻等于把 main 的增量判成本分支的
漂移;而棘轮往上动必须写明是谁涨的,否则下一个人只看到数字变了。

全量 3,286 tests / 3,285 pass / 1 skip(比 rebase 前多 6 条,是 #642 带的),
check-sync 119 文件一致。
Copilot AI lite review requested due to automatic review settings November 10, 2026 21:32
@coderabbitai

coderabbitai Bot commented Nov 10, 2026 •

Copy link
Copy Markdown

Warning

Review limit reached

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

Next included review available in 25 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 2 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 0924976 and fdd1431.

Files selected for processing: 6

  • docs/plans/2026-11-10-panel-visual-system.md
  • dsh-mneme/lib/client.js
  • dsh-mneme/test/client.test.js
  • dsh-mneme/test/contrast.test.js
  • dsh-mneme/test/panel-chart-scale.test.js
  • dsh-mneme/test/panel-tokens.test.js
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@codecov

codecov Bot commented Nov 10, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.

📢 Thoughts on this report? Let us know!

Copilot AI lite review requested due to automatic review settings November 10, 2026 22:20

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

modusensus added a commit that referenced this pull request Nov 10, 2026
#646 与 #647 试验合并零文本冲突(互补层:视觉令牌 vs 信息架构),但 #646 的
px 存量棘轮基线实测于 #618(地志 wiki 页)合入 main 之前——真合并后 14 个值
上涨全来自 #618 的新 CSS,#647 两刀没加过任何 CSS( Beautification 只动
FEATURE_GROUPS/徽标/i18n,不碰样式表)。

按棘轮自己的规矩处理:基线从当前树重新冻结(脚本同款口径重算,89 值
1462 处),注释写明增量出处与「wiki 页刻度化是地志车道的跟进任务,下一只
动基线的手必须先证明自己在做迁移」。迁移时把数字往下改的纪律不变。

全量 3323 tests / 3322 pass / 0 fail / 1 skipped(pipefail,含 #646 全部
token/色槽/图表锁与 #647 全部结构锁——两套锁在同一棵树上同时成立)。
update-branch 补齐 main 后 CI 四腿红:棘轮基线实测于 #618(地志 wiki 页)
合入 main 之前,14 个值上涨全部来自 #618 的新 CSS(1px +3 / 3px +1 / 5px +1 /
6px +7 / 10px +3 / 11px +3 / 12px +3 / 13px +1 / 14px +2 / 16px +4 / 17px +1 /
18px +1 / 11.5px +2 / 10.5px +1)。按棘轮自己的规矩处理:基线从当前树重新
冻结(与 #647 合并验证时同一组数字,脚本同款口径),注释写明增量出处——
wiki 页刻度化是地志车道的跟进任务,下一只动基线的手必须先证明自己在做迁移。
Copilot AI lite review requested due to automatic review settings November 10, 2026 22:40

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has insufficient remaining quota.

An organization owner can choose the repository organization as the billing source for reviews requested by members with a paid Copilot license. Learn about Copilot code review billing.

@modusensus
modusensus merged commit 5cea2ba into main Nov 10, 2026
13 checks passed
@modusensus
modusensus deleted the docs/panel-visual-system branch November 11, 2026 14:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants