Repository navigation
feat(panel): 面板视觉系统 P0–P1b 与设置/人格/日记三页收口 - #646
Conversation
面板此前没有组件层,卡片与行都是手写 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 文件一致。
|
Warning Review limit reachedYou'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. View limit details
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. |
There was a problem hiding this comment.
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 Report✅ All modified and coverable lines are covered by tests. 📢 Thoughts on this report? Let us know! |
There was a problem hiding this comment.
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.
#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 页刻度化是地志车道的跟进任务,下一只动基线的手必须先证明自己在做迁移。
There was a problem hiding this comment.
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.
这个 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子树里,少挂一个等于没定义);"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 永远对不齐——纹路跟着正文元素走,相位天然对齐。localStorage的值仍是grid,零迁移。--mneme-rule(20% label-primary,浅 1.55:1 / 深 1.88:1;原border-l1只有 1.09 / 1.20,1px 线可辨阈值约 1.5:1)。opacity:0只在 hover 时现身、六个不在刻度上的圆角、.mneme-set逐字重复的规则、paperhead 用 solid 而全页其余分隔线都是 dashed。5. 图表色盘统一
五个槽共用一套两步混色:先 62% 静态色与 38% 中性灰压彩度(紫给 74%,否则读成灰),再按各槽比例混 label——label 随主题反向,深浅两套色阶自动成立。
色源用
--dsw-static-*而不是--dsw-alias-state-*:别名是宿主的语义状态色,宿主调一次就顺手换掉整张图,而图表色盘是设计决定。代价说清楚:统一明度后颜色不再一眼跳出来,相邻两块要靠图例与大小顺序认。变异自证
改一处、只改一处,看锁会不会红(全部实跑):
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 failnode scripts/check-sync.js:119 文件一致Co-Authored-By、无工具署名关于 rebase
本分支已 rebase 到
1c888ed。rebase 后 px 棘轮报 9 个值上涨,查明是 #642 自己在lib/client.js里带进 21 处 px,而基线是ef8f9ce时点冻的(只认得当时那棵树),因此基线按合进来的那棵树重冻,并在注释里写明「本分支相对 main 是净减 87 处」。没有做(有意留到后面)
div当分组标题、字号阶 11/12/13 未收;