随身工具箱 · 重设计 v1
设计稿 v1 · 只出方案,未改工程代码 · 6 屏 · 2026

把 10 屏压成 6 屏,
把 86 处微信绿换成能当文字用的青墨。

结论先给:界面不是「不够现代」,是层级重复、颜色不达标、暗色写了但不生效。 这一版换主色、砍层级、删 4 个死页,功能语义一条不动。

2.5:1现主色 #07c160 对白底,且 35 处拿来当文字色
6.0:1青墨 #0E6E75 对白底,AA 正文达标
0 屏暗色实际生效数(app.json 缺 darkmode:true,9 处 @media 全是死码)
38处 emoji 当图标(📋29 / ✗4 / 🔐3 / ✓2)
10 → 6屏,删 4 个死页省 114 KB
这份稿子怎么来的:设计语言 / token / 字号 / 6 屏保命线来自 Sol(design-language-v1、page-layout-skeleton); 信息架构、命名、空态与文案口径来自 Quill(ia-redesign-spec、ia-decisions);crypto 三屏的每一条高度与默认值来自 Cipher。 两处打架的地方我按「产品口径归 Quill、crypto 数字归 Cipher」出图,并在对应屏下写明。 我这边只负责主包 2 屏 + 扫一扫,以及组装/部署。
01 设计语言

一套 token,两套主题,一个 signature

全部数值可直接抄进 app.wxss(该文件现在 0 字节,等于全站没有变量)。单位 rpx,375pt 设计宽下 1rpx = 0.5px。

1.1 色板 浅色 / 深色 两套,括号里是对白底、对页面底的对比度

6.0
brand 青墨#0E6E75
8.3
brand-press#0A575D
5.2
brand-tint#E4F1F2
底
bg#F4F6F7
卡
surface#FFFFFF
槽
sunken#EDF1F2
line#DFE5E7
line-strong#C9D2D5
18.0
ink-1 正文#10181A
7.8
ink-2 次要#43555A
5.1
ink-3 说明#5E7278
2.4
ink-4 仅非文本#9AA9AE
5.4
success#0B7A46
6.0
warn#8F5600
6.5
danger#B3261E

深色:brand #3FA8AF(宿面 6.1 / 页底 6.7)· surface #151C1F · bg #0D1214 · sunken #1D262A · ink-1 #E8EFF1(16.2)· ink-3 #86979C(5.7)。暗色零阴影,只用 1rpx 描边分层。

1.2 旧绿 86 处怎么分 #07c160 不能当文字色,先分类再替换

旧用法处数换成为什么
color 文字/图标35交互态 brand;状态文案 success2.5:1 当文字读不清
background 填充22按钮/进度 brand;在线圆点可留 success填充不受对比度约束
border-color / border-left21brand描边同族
border(1rpx×2)2success验签通过的语义色
border-left:6rpx solid5删除,由刻度线替代粗竖条是装饰,不是信息

1.3 字号阶梯 7 档,字重只有 400 / 500 / 600

64rpx · 32pt123 456TOTP 主码
48rpx · 24pt页面主标题少用
40rpx · 20pt区块标题section
36rpx · 18pt卡片标题 / 工具名500
32rpx · 16pt正文 / 输入内容默认
28rpx · 14pt说明 / 副标题下限
24rpx · 12pt标签 / 单位 / 时间最小
mono 28rpxaGVsbG8gd29ybGQ=等宽读数

700 禁用;30 / 34 / 42 / 100 / 120rpx 全废(现在这几档满仓都是)。

1.4 间距与圆角 8rpx 基准,禁 10/14/30/50/60/70

8 图标与文字之间
16 行内上下
24 卡内边距
32 页面左右(唯一默认)
48 区块之间
80 hero
10 / 14 / 30 / 50 / 60 / 70 废弃
8 小
12 输入/按钮/槽
16 卡片
24 弹层
999 pill

列表行 ≥104rpx(现在 88),按钮高 88rpx,触控目标 ≥88。阴影只给浮层:0 2rpx 8rpx rgba(16,24,26,.04)。

1.5 signature:刻度线 + 读数槽 一条既当分隔又当秒表

刻度线:1rpx 基线 + 每 12rpx 一根 1rpx 竖刻度,高 8rpx。只用在 3 处——页面标题下、区块标题下、TOTP 倒计时条。每屏 ≤2 条,多了就是装饰。 读数槽:sunken 底 / 圆角 12 / 内距 24,标签 24rpx ink-3,值 mono 28rpx(长值 break-all,不横滚、不省略),右侧 copy 热区 ≥88。

读数槽 + 刻度线(倒计时在跑,30s 一轮)
123 456
28 秒后刷新 · 点码即复制

1.6 组件样例 卡片 / 列表行 / 输入槽 / segmented / 按钮

列表行(扫一扫 / 首页工具行)高 112rpx · icon 48 · 圆角 12
▣
扫一扫
只显示内容,不直接打开
›
读数槽 + 复制内距 24 · 值 mono 28 · copy 88 热区
https://example.com/very/long/value/that/should/break/all
segmented(页面内切换,不用跳页)高 72rpx · 轨道 sunken · 选中 surface
编码哈希解码
主按钮高 88 · 圆角 12 · 文字 32/600
添加口令

1.7 emoji → 图标(38 处工单)数字是我数出来的,与 Sol 一致

原处替代尺寸 / 颜色
📋29copy glyph(复用原生 icon)48rpx,ink-3;成功后 1.2s 换 ✓ + success
✓ ✗6不用图标:改文案「签名验证通过 / 失败」+ 状态 pillpill 高 40,tint 底 + 实色字 24rpx
🔐3lock glyph(空态用)96rpx,ink-4
原生 icon5search / close / chevron-right / copy32–48rpx,ink-4 或 brand

分布:📋 在 encoding 7 处、gm 11 处、sm2 3、sm3 2、sm4 3、sm9 3。删掉 4 个死页后会自动消失约 14–16 处,「38 → 29」这个说法对不上,出图按 38 全量算。

1.8 浅色 / 深色 对照 同一张卡,两套变量

浅色 bg #F4F6F7

▣
扫一扫
只显示内容,不直接打开
›
123 456
28s

深色 bg #0D1214

▣
扫一扫
只显示内容,不直接打开
›
123 456
28s
暗色升 P0 的前提:现在 app.json 没有 "darkmode": true,全仓 9 处 @media (prefers-color-scheme: dark) 真机一行不生效 = 实际 0 屏。 要落地必须先加 darkmode + themeLocation + theme.json,否则这两张卡只是纸面效果。
02 逐屏

六屏:现状问题 → 新布局 → 为什么这么改

手机稿按真实尺寸画(375px = 750rpx,1rpx = 0.5px)。右上角青色小签是尺寸,点顶栏「标注」可隐藏。 每屏下方是高度账本,一屏可用内容高按 1246rpx ≈ 623pt 算。

屏 1 · 首页

pages/index主包 · Lynx

现状问题

  • 工具总共只有 4 个,却配了搜索框 + 分类 tab + 金刚位 + 列表四套入口,全展开要滚一屏才看得全。
  • 扫一扫出现 两次(金刚位 + 列表),两个点击路径,金刚位还比列表高 100rpx。
  • 顶部 global-toolbar 70rpx 灰色长条(在线 / 点击登录)+ 页面白 container + 灰页底,三层底色叠在一起,没有任何内容承载。
9:41··· ○
本地计算 · 不上传4 个工具
112 扫一扫只显示内容,不直接打开 ›
动态口令TOTP 手机令牌 ›
编码转换Base64、MD5、SHA 哈希 ›
国密算法SM2 / SM3 / SM4 / SM9 ›
最近使用待拍板
动态口令 · 3 分钟前扫一扫 · 昨天
4 个工具 · 全部本地计算 · v2
尺寸账本可用 1246rpx
状态栏(系统)88
nav:标题 40/600 + 头像 64 圆88
meta 24/ink-348
刻度线8
工具行 ×4(icon 48 / 主 36 / 副 24 / chevron)448
最近使用(标题 40 + chips 56)112
页脚 24/ink-488
内容合计 ≈ 396pt792
64% 一屏余 454rpx

新布局 一层

  • nav(工具箱 + 头像 40rpx)→ meta 行 → 刻度线 → 单列四行工具 → 最近使用 → 页脚。
  • 行高 112rpx:icon 48 圆角 12 + 主行 36/500 + 副行 24/ink-3(≤14 字单行)+ 右侧 chevron。
  • 金刚位、分类 tab、搜索框、分组标题一起删;扫一扫只留一份。

为什么

  • 4 个工具的目录不需要检索,搜索框是空转;删掉后首屏从「露出 2 个工具」变成「4 个全见 + 留白」。
  • 单列一行一个工具,副行给「不打开 / 本地算」这种安全承诺,比金刚位图标更能解释「这个工具干什么」。
  • 层级压到一层,配色和字号才有地方生效——现在的四种入口各自一套字号。

保命线

  • index.js 的 path / package 双分支跳转不改(totp 与 encoding 靠 package 拼 URL)。
  • app.js 的 tools 数组只许改 name / description,id、path、package、顺序不许动。
砍搜索 + 分类工具改名新增最近使用
两处冲突已按口径裁定:Sol 骨架给的是 2×2 瓦片(335×200rpx),Quill 的 IA 是单列四行 → 按 Quill 出图,瓦片作废。 命名以 Quill 为准:扫一扫 / 动态口令 / 编码转换 / 国密算法,首页不出现括号,「TOTP」只作副行。

屏 2 · 个人资料

pages/profile-edit主包 · Lynx

现状问题

  • 整页只有「头像 + 一栏昵称 + 保存」,下半屏 500px 空白;没有页面标题,靠系统 nav 的黑底白字,和页面白底直接断开。
  • 头像用了 <button open-type="chooseAvatar">,小程序 button 默认样式带 5px 圆角和 ::after 边框,真机上看是一个能点的方框。
  • 暗色只写了 2 条 [data-weui-theme="dark"](文字色 + 头像提示),页面没有暗底 → 深色模式仍是白屏;且 weui 的 theme 变量和全站暗色两套并存。
9:41··· ○
240
点头像更换
88昵称阿 spencer
104登录方式微信 · 只读
账号退出登录
88+34保存修改
尺寸账本可用 1246rpx
nav:返回 + 页面标题88
头像区:头像 160 圆 + 相机角标 40 + 提示240
昵称 field(weui cell,textarea 语义不变)88
账号组 ×2(登录方式只读 / 退出登录 danger)208
吸底保存 88 + 安全区 34122
内容合计 ≈ 373pt746
60% 一屏余 500rpx

新布局 分组

  • nav → 头像区 240 → 昵称 88 → 账号组(登录方式只读 / 退出登录 danger 文本)→ 吸底保存 88 + 安全区。
  • 未登录态:头像与昵称置灰不可编辑,吸底按钮从「保存」换成「登录」主按钮,账号组不显示退出。
  • global-toolbar 只留网络状态 + 头像 40 圆,删掉「在线 / 点击登录」文字;点头像进本页。

为什么

  • 退出登录从全局工具条搬进「账号组」,全局条才可能从 70rpx 灰条缩成一个头像——现在它是全站最显眼却最没用的 70rpx。
  • 页面标题 + 返回放回页面内,才和其余 5 屏一致;系统 nav 与页面底色的断层由 window.navigationBarTextStyle 那套统一处理。
  • 吸底按钮解决「下半屏 500px 空白 + 保存按钮飘在半空」。

保命线

  • open-type="chooseAvatar" 与 type="nickname" 两个能力点不动(改了就触发不了微信头像/昵称填写)。
  • updateUserInfo → eventChannel 回传流程不动;默认头像远程 URL 不换。
  • 头像按钮的尺寸改成 ::after{border:none} + 圆形容器,只改样式不改结构。
退出登录迁位

屏 3 · 扫一扫

packages/scan/pages/scanscan 分包 · Lynx

现状问题

  • 结果卡标题 36rpx 加粗、内容 32rpx 灰字,没有一句「不会打开链接」——用户不敢点也不放心。
  • 「复制 / 重新扫描」是两个 size="mini" 按钮右对齐,命中区不到 88rpx;历史列表用 max-height: calc(100vh - 480rpx) 硬算,小屏溢出、大屏留白。
  • 空态是白卡里 200rpx 空槽 + 一句「暂无」,没有任何下一步动作。
9:41··· ○
仅显示内容,不会打开链接40
≥200
https://api.fcy.zj.cn/auth?token=eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiIxMjM0NTY3ODkwIn0.dBjftJeZ4CVPmB92K27uhbUJU1p1r_wW1gFWFOEjXk
已选中 · 长按可全选128 字
88复制重扫
近期扫描清空
14:02https://api.fcy.zj.cn/auth?token=…
昨天WIFI:S:Office;T:WPA;P:••••
最多保留 20 条 · 本机
尺寸账本可用 1246rpx
nav88
常驻提示 24/ink-3(含 info 图标 24)40
读数槽(mono 28 · 6 行起,内部不滚)≥240
操作行:复制 主 / 重扫 次88
刻度线8
历史头(标题 40 + 清空 88 热区)56
历史列表(flex:1,不再 calc)自适应
固定部分 ≈ 260pt + 列表520+
列表吃掉剩余 726rpx

新布局 结果优先

  • nav → 常驻提示「仅显示内容,不会打开链接」→ 读数槽(mono 28 / break-all / 右下角字数)→ 操作行「复制 + 重扫」→ 刻度 → 历史(flex:1)。
  • 清空历史要二次确认:showModal,确认键「清空」用 danger 色,只清当前工具。
  • 空态:lock/code glyph 96 + 「还没有扫描记录」+ 一句下一步 + 主按钮 88。

为什么

  • 扫一扫在 spencer 手里是高频第一入口,结果必须一屏不滚就能读完、复制;历史上限 20 条不变。
  • 「不打开」是本项目最大的信任点,做成常驻灰字而不是一次性 toast。
  • 把 calc(100vh - 480rpx) 换成 flex,才不会在小屏上把操作行顶出去。

保命线

  • onlyFromCamera:true 不改;用户取消不弹错。
  • 历史上限 20 条、storage 键 scan_history 不改。
  • 结果不给任何打开/跳转按钮,文本保持可选中。

屏 4 · 动态口令

packages/crypto/pages/totpcrypto · Cipher

现状问题

  • 每个令牌嵌 3 个可点区(编辑 / 删除 / 复制),编辑与删除是 28rpx 字 + 8/16 内距 ≈ 44rpx,不到 88rpx 触控线的一半。
  • 倒计时 28rpx #888 于白底 3.5:1,空态 #999 于 #f8f8f8 仅 2.7:1。
  • 常驻说明卡 238rpx;4 个令牌 = 约 1440rpx ≈ 720pt,超一屏,「添加令牌」被挤出首屏。另:令牌码当前全显示「错误」(P0,见第 04 节)。
9:41··· ○
刷新中28s72
178 GitHub30s · SHA1123 456
阿里云30s · SHA1884 201
内网 VPN30s · SHA1093 774
为什么只显示不发出去▾56
96添加口令
尺寸账本可用 1246rpx
nav + 添加入口 88 热区88
状态条:进度条 4 + 剩余秒数 2472
令牌行 ×3(名称 28 / 次行 22 / 码 48 等宽)534
说明折叠为单行56
吸底主按钮 9696
3 个令牌 ≈ 379pt(5 个 ≈ 557pt 仍一屏)846
68% · 一屏可放 5 个令牌

新布局 看一眼就走

  • 状态条 72(进度条贴底 + 24rpx 剩余秒)→ 令牌行 178 ×N,整行即复制 → 说明折叠 56 → 吸底「添加口令」96。
  • 编辑与删除收进长按菜单,常驻控件从 3 个降到 0 个。
  • 码 48rpx 等宽分组显示「123 456」,但复制出去仍是纯 6 位。

为什么

  • 令牌是「看一眼就走」的场景,字号与命中区优先,管理是低频动作——低频动作不该占常驻位置。
  • 说明卡吃掉首屏 1/5,折叠成一行;添加入口放吸底,滚到哪都能加。
  • 整行点击 + 短暂高亮,比原来「只有 toast」的反馈更明确,也顺带减少误触编辑。

保命线

  • 算法参数锁死:6 位 / 30s / HMAC-SHA1 / Base32(去 = 填充、忽略非法字符、大小写不敏感)。
  • storage 键仍是 totp_tokens,字段 id / name / secret 不改名;编辑只改 name。
  • 复制内容是纯 6 位;toast「已复制」;30s 边界刷新、onShow 起表 onHide 停表。
管理改长按说明默认折叠是否加排序
这里有两份并存的画法,只差「第一个令牌加不加大」:Sol 骨架是「hero 卡 + 码 64rpx」;Cipher 给我的文字规格是「逐行 178rpx + 码 48rpx」, 而他另一份视觉稿(outbound/crypto-deck-v1.html)保留了 64rpx 主码卡。本图按 Cipher 的文字规格画成纯列表,其余(状态条、长按管理、吸底按钮、折叠说明)三份完全一致, 拍板时一起定这一处即可。

屏 5 · 编码转换

packages/crypto/pages/encodingcrypto · Cipher

现状问题

  • 结果字号 24rpx = 12px,低于移动端 14px 底线;长值整段折行、无折叠。
  • 📋 复制 7 处(3 编码 + 4 哈希),32rpx + opacity .6 贴在值尾部,与值同一点击区,误触就复制错内容。
  • 页高约 1340rpx ≈ 670pt,比 623pt 可用高多 8%,哈希段整体被推到第二屏。
9:41··· ○
编码哈希解码
200
你好,随身工具箱
输入即算,无转换按钮清空
编码3 项48
Base645L2g5aW977yM6ZqP6Lqr5bel5YW3566x
URL%E4%BD%A0%E5%A5%BD%EF%BC%8C%E9%9A%8F…
HTML&#20320;&#22909;&#65292;…88
哈希段:MD5 / SHA1 / SHA256 / SHA512,一律小写 hex
尺寸账本可用 1246rpx
nav88
segmented(编码 / 哈希 / 解码待拍板)72
输入卡(mono 28,内部滚动)+ 字数200
分区标题 + 刻度48
结果行 ×3:标签 96 / 值 mono 28 / copy 88264
编码段 ≈ 336pt728
哈希段(4 行 = 352rpx 替换上面 264)816
页脚说明56
两段都一屏放完

新布局 分段

  • nav → segmented 72(编码 / 哈希 / 解码=待拍板)→ 输入卡 200 → 「编码」标题 + 刻度 → 3 行 88 → 页脚。
  • 结果行:左标签 24rpx ink-2 / 值 mono 28 单行截断(点开看全文)/ 右 实心 copy 槽 88,不再 opacity .6。
  • 哈希段 4 行,格式一行一个,长值 2 行 clamp + 展开。

为什么

  • 12px 的结果在小程序里读不了,24→28rpx 并改等宽,视觉上才「像数据」。
  • 7 个散点复制改为行尾固定槽,命中区从约 24pt 提到 44pt,且与值解耦。
  • 编码与哈希是两种心智,分段后单屏不再一次堆 7 行。

保命线

  • 结果随输入即时算,没有「转换」按钮;清空输入即清空全部结果;maxlength 1000。
  • 哈希一律小写 hex;Base64 标准表带 = 填充;URL 用 encodeURIComponent;HTML 转义 6 个字符(含 / → &#x2F;,不许顺手精简)。
  • 复制 toast 文案沿用 data-type:Base64编码 / URL编码 / HTML编码 / MD5 / SHA1 / SHA256 / SHA512。
是否新增解码段点结果是否仍自动复制长值全屏弹层

屏 6 · 国密算法

packages/crypto/pages/gmcrypto · Cipher

现状问题

  • 双层 tab:底部 4 段固占 102rpx + 容器 padding-bottom:140rpx,内层最多再 4 段,同一算法要点两次。
  • 单面板塞了 6 个 section-title / 14 个 textarea / 11 个 📋;SM4 加密面板估算 1650rpx ≈ 2.6 屏。
  • 参数默认值(填充、密钥格式、大小写、hex 显示)全埋在「更多选项」里 → 「结果不对」其实往往是默认值;SM9 是随机占位实现却仍从首页暴露。
9:41··· ○
SM2SM3SM4SM980
签名验签64
200
待签名消息(utf8)
参数HEX 大写utf888
88签名
120
3045022100B7C1…(签名结果)
更多选项▾56
SM9 占位实现,不可用于真实数据待拍板
尺寸账本可用 1246rpx
nav88
算法 segmented 吸顶(替代底部 tab-bar)80
二级 chip 行(签名 / 验签 · 加密 / 解密)64
输入槽(固定高,内部滚动)200
参数行(格式 / 大小写 / 填充,默认值直接可见)88
主按钮88
结果读数槽(mono 26 + copy 88 热区)120
更多选项折叠56
单面板 ≈ 392pt(SM4 双输入槽 984rpx ≈ 492pt)784
63% · 全部一屏放完

新布局 去第二层 tab

  • 顶部 segmented 4 段吸顶(SM2 / SM3 / SM4 / SM9)+ 二级 chip 行;底部仿 tabBar 删除,连同 padding-bottom:140rpx。
  • 参数默认值从「更多选项」提到参数行内联;说明折成 56rpx 单行。
  • SM9 若要留:加常驻 warn 提示条 + 主按钮 disabled;若下线:第 4 段消失,骨架不动。

为什么

  • 页级 segmented 取代底部 tab,层级一次看清;activeTab 语义不变,navigateBack 行为不变。
  • 「结果不对其实是默认值」是这类工具的典型排查成本,把默认值露出来最省事。
  • 每算法 4–5 条常驻说明折掉,省约 250rpx。

保命线

  • 默认值不动:SM2 签名 / 结果 hex 大写 / 消息 utf8;SM3 hex 大写 + 防抖自动算;SM4 pkcs7 / 密钥 hex / 默认密钥 0123456789abcdef123456789abcdef0;SM9 加密 + 验签签名 hex。
  • segmented 四个值仍是 sm2/sm3/sm4/sm9;11 处复制的 data-value / data-type 与 toast 不改。
  • SM4 库只有单块 ECB,无 mode、无 IV —— 图里不许画模式选择。
  • SM9 是占位实现,UI 不得出现「可用 / 已支持」字样。
SM9 修或下线SM2 私钥默认遮蔽SM4 是否要 CBC参数摘要行
03 待 spencer 拍板

七件事只有你能定

都做完了才能进实现;每条我给了默认建议,你说「按建议走」我就照做。

01

主色离开微信绿

#07c160 → 青墨 #0E6E75,全站 86 处 wxss 要动;退路是只换两个变量(填充留绿、文字换 #0B7A3E)。

影响:全部 6 屏 · 建议:直接换
02

首页砍搜索 + 分类 tab + 金刚位

4 个工具的目录不需要检索;砍完首屏 4 个工具全见。

影响:pages/index · 建议:砍
03

SM9 修还是下线

现为随机数占位实现。留 = 第 4 段 + 常驻 warn 提示 + 按钮 disabled;下线 = 删段删页。

影响:屏 6 / 是否保留 1 个死页 · 建议:先下线,别挂着入口
04

工具改名

TOTP令牌→动态口令、编码工具→编码转换、国密算法保持。「TOTP」只作副行,首页不出现括号。

影响:首页 + 各页标题 · 建议:改
05

新增「最近使用」

四行工具之后、页脚之前,最多 3 条单行 chips,本地 storage 按最近打开倒序去重;无数据整段不渲染。

影响:首页 · 建议:做,但要接受多一次写 storage
06

TOTP 管理改长按

编辑 / 删除收进长按菜单,常驻控件从 3 个降到 0 个,行高才能给码让位。

影响:屏 4 · 风险:可发现性下降 · 建议:做,但首屏加一句一次性提示
07

退出登录迁位

从 global-toolbar 迁到「个人资料 → 账号组」,全局条只留网络状态 + 头像。

影响:屏 2 + 全局组件 · 建议:迁

二级待定 影响面小,可与上面合并答复

项屏我的默认
编码转换新增「解码」段(utils 里已有 decode 函数,页面没用)屏 5本轮不做,标注为灰
编码结果点击是否仍自动复制屏 5保持自动复制 + toast
TOTP 说明默认折叠(新用户可能不知道密钥格式)屏 4折叠
SM2 私钥现在明文展示且可复制,是否默认遮蔽屏 6本轮不动,只标风险
SM4 是否要 ECB/CBC 选择(库不支持 CBC = 换实现)屏 6不做
暗色是否本轮一起上(需 app.json 加 darkmode)全部一起上,否则 9 处暗色代码继续是死码
04 红线

TOTP 整条线:改壳可以,验收不行

这一屏的画法已经定了,但「能不能上线」现在锁在「以哪份代码为准」

1 · 基线只有一份,不存在「以哪份为准」

唯一基线 = /worktrees/TB-CRYPT · 分支 toolbox/crypt · commit afa7482 下的 packages/crypto/pages/totp/(totp.js + utils.js)。 四棵 worktree 与 /repo/toolbox 的 packages/crypto 已 diff -rq 为空,逐字节一致,谁再问都引这一句。算法本体(pages/totp/utils.js)实测通过 RFC 6238 向量。

2 · P0 的根因不是 UI,是一行 require

totp.js 第 3 行把 getTOTP 从 packages/crypto/utils.js 解构出来,可那个文件只导出 10 个编码/哈希函数、没有 getTOTP → 拿到 undefined → 每个令牌抛 TypeError → 被 catch 成「错误」。所以现在 4 个令牌全显示「错误」。

3 · 改壳可以(本次设计稿覆盖的范围)

WXML 结构、WXSS、空态、说明折叠、长按菜单、行内复制 —— 只要动不到下面四条保命线:
① 6 位 / 30s / HMAC-SHA1 / Base32;② storage 键 totp_tokens 与字段 id/name/secret 不改名;③ 复制出去是纯 6 位;④ 30s 边界刷新 + onShow 起表 / onHide 停表。

4 · 验收不行(一句话口径)

只美化不修那行 require,令牌依旧显示「错误」,一律不许进验收。 验收口径 = 同一 Base32 密钥下,本页与 Google Authenticator 在同一个 30s 窗口内完全一致 + 跨窗口自动换码 + 复制得纯 6 位 + 重进小程序令牌还在。

5 · 也不许

另造第三份 TOTP 实现(两份并存以后必然对不上)。本任务我一行工程代码没动,只出图。

05 页面账本

10 屏 → 6 屏,−114 KB

现在改后说明
pages/index保留pages/index单列四行
pages/profile-edit保留pages/profile-edit账号组 + 吸底
packages/scan/pages/scan保留同左结果优先
crypto/pages/totp保留同左目录名不能动(index 用 package 拼 URL)
crypto/pages/encoding保留同左同上
crypto/pages/gm保留同左页内 segmented 承接 4 个算法
gm/sm2 · gm/sm3 · gm/sm4 · gm/sm9删 4—全仓 0 处 navigateTo / redirectTo 指向,唯一引用是 app.json 第 21–24 行分包注册

删 4 个死页省 116,555 B ≈ 114 KB(crypto 分包 164 KB → 约 50 KB),整包从 ≈206 KB 降到 ≈92 KB。删了没有跳转残留,但要同步删 app.json 那 4 行 + 4 个目录。

06 边界与前提

这份稿子动了什么、没动什么

没动(硬约束)可核
  • 没有改任何工程代码;本文件单独落在 /previews/。
  • 没碰 project.config.json 的 appid、没删 /docs、没改 packages/crypto/lib/。
  • 没有 commit / push / 建远端仓 / 提 MR;没调 wx-ide(IDE 渲染进程等 hugo 重启)。
落地前必须补的前提否则暗色恒不生效
  • app.json 加 "darkmode": true + "themeLocation": "theme.json"(现在没有 → 9 处暗色 @media 是死码)。
  • app.wxss 现在 0 字节,先落这套 token(1.1–1.4)再改任何单页样式。
  • weui 的 data-weui-theme 与全站暗色变量二选一,别两套并存(现在就是两套)。
本轮仍是「未定」,别当成定了Sol 明确标记
  • 青墨没有 50/100/300/700/900 六档阶梯 —— 别自己调亮暗,只给 4 个品牌位。
  • copy glyph 的默认色是建议值(ink-3),不是定稿。
  • 各区块精确高度由内容撑开;本稿标的都是「最小 / 固定」值。