把 10 屏压成 6 屏,
把 86 处微信绿换成能当文字用的青墨。
结论先给:界面不是「不够现代」,是层级重复、颜色不达标、暗色写了但不生效。 这一版换主色、砍层级、删 4 个死页,功能语义一条不动。
一套 token,两套主题,一个 signature
全部数值可直接抄进 app.wxss(该文件现在 0 字节,等于全站没有变量)。单位 rpx,375pt 设计宽下 1rpx = 0.5px。
1.1 色板 浅色 / 深色 两套,括号里是对白底、对页面底的对比度
深色: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;状态文案 success | 2.5:1 当文字读不清 |
| background 填充 | 22 | 按钮/进度 brand;在线圆点可留 success | 填充不受对比度约束 |
| border-color / border-left | 21 | brand | 描边同族 |
| border(1rpx×2) | 2 | success | 验签通过的语义色 |
| border-left:6rpx solid | 5 | 删除,由刻度线替代 | 粗竖条是装饰,不是信息 |
1.3 字号阶梯 7 档,字重只有 400 / 500 / 600
700 禁用;30 / 34 / 42 / 100 / 120rpx 全废(现在这几档满仓都是)。
1.4 间距与圆角 8rpx 基准,禁 10/14/30/50/60/70
列表行 ≥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。
1.6 组件样例 卡片 / 列表行 / 输入槽 / segmented / 按钮
1.7 emoji → 图标(38 处工单)数字是我数出来的,与 Sol 一致
| 原 | 处 | 替代 | 尺寸 / 颜色 |
|---|---|---|---|
| 📋 | 29 | copy glyph(复用原生 icon) | 48rpx,ink-3;成功后 1.2s 换 ✓ + success |
| ✓ ✗ | 6 | 不用图标:改文案「签名验证通过 / 失败」+ 状态 pill | pill 高 40,tint 底 + 实色字 24rpx |
| 🔐 | 3 | lock glyph(空态用) | 96rpx,ink-4 |
| 原生 icon | 5 | search / close / chevron-right / copy | 32–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
深色 bg #0D1214
app.json 没有 "darkmode": true,全仓 9 处 @media (prefers-color-scheme: dark) 真机一行不生效 = 实际 0 屏。
要落地必须先加 darkmode + themeLocation + theme.json,否则这两张卡只是纸面效果。
六屏:现状问题 → 新布局 → 为什么这么改
手机稿按真实尺寸画(375px = 750rpx,1rpx = 0.5px)。右上角青色小签是尺寸,点顶栏「标注」可隐藏。 每屏下方是高度账本,一屏可用内容高按 1246rpx ≈ 623pt 算。
屏 1 · 首页
pages/index主包 · Lynx现状问题
- 工具总共只有 4 个,却配了搜索框 + 分类 tab + 金刚位 + 列表四套入口,全展开要滚一屏才看得全。
- 扫一扫出现 两次(金刚位 + 列表),两个点击路径,金刚位还比列表高 100rpx。
- 顶部 global-toolbar 70rpx 灰色长条(在线 / 点击登录)+ 页面白 container + 灰页底,三层底色叠在一起,没有任何内容承载。
| 状态栏(系统) | 88 |
| nav:标题 40/600 + 头像 64 圆 | 88 |
| meta 24/ink-3 | 48 |
| 刻度线 | 8 |
| 工具行 ×4(icon 48 / 主 36 / 副 24 / chevron) | 448 |
| 最近使用(标题 40 + chips 56) | 112 |
| 页脚 24/ink-4 | 88 |
| 内容合计 ≈ 396pt | 792 |
新布局 一层
- 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、顺序不许动。
屏 2 · 个人资料
pages/profile-edit主包 · Lynx现状问题
- 整页只有「头像 + 一栏昵称 + 保存」,下半屏 500px 空白;没有页面标题,靠系统 nav 的黑底白字,和页面白底直接断开。
- 头像用了
<button open-type="chooseAvatar">,小程序 button 默认样式带 5px 圆角和::after边框,真机上看是一个能点的方框。 - 暗色只写了 2 条
[data-weui-theme="dark"](文字色 + 头像提示),页面没有暗底 → 深色模式仍是白屏;且 weui 的 theme 变量和全站暗色两套并存。
| nav:返回 + 页面标题 | 88 |
| 头像区:头像 160 圆 + 相机角标 40 + 提示 | 240 |
| 昵称 field(weui cell,textarea 语义不变) | 88 |
| 账号组 ×2(登录方式只读 / 退出登录 danger) | 208 |
| 吸底保存 88 + 安全区 34 | 122 |
| 内容合计 ≈ 373pt | 746 |
新布局 分组
- 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 空槽 + 一句「暂无」,没有任何下一步动作。
| nav | 88 |
| 常驻提示 24/ink-3(含 info 图标 24) | 40 |
| 读数槽(mono 28 · 6 行起,内部不滚) | ≥240 |
| 操作行:复制 主 / 重扫 次 | 88 |
| 刻度线 | 8 |
| 历史头(标题 40 + 清空 88 热区) | 56 |
| 历史列表(flex:1,不再 calc) | 自适应 |
| 固定部分 ≈ 260pt + 列表 | 520+ |
新布局 结果优先
- 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 节)。
| nav + 添加入口 88 热区 | 88 |
| 状态条:进度条 4 + 剩余秒数 24 | 72 |
| 令牌行 ×3(名称 28 / 次行 22 / 码 48 等宽) | 534 |
| 说明折叠为单行 | 56 |
| 吸底主按钮 96 | 96 |
| 3 个令牌 ≈ 379pt(5 个 ≈ 557pt 仍一屏) | 846 |
新布局 看一眼就走
- 状态条 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停表。
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%,哈希段整体被推到第二屏。
| nav | 88 |
| segmented(编码 / 哈希 / 解码待拍板) | 72 |
| 输入卡(mono 28,内部滚动)+ 字数 | 200 |
| 分区标题 + 刻度 | 48 |
| 结果行 ×3:标签 96 / 值 mono 28 / copy 88 | 264 |
| 编码段 ≈ 336pt | 728 |
| 哈希段(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 个字符(含/ → /,不许顺手精简)。 - 复制 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 是随机占位实现却仍从首页暴露。
| nav | 88 |
| 算法 segmented 吸顶(替代底部 tab-bar) | 80 |
| 二级 chip 行(签名 / 验签 · 加密 / 解密) | 64 |
| 输入槽(固定高,内部滚动) | 200 |
| 参数行(格式 / 大小写 / 填充,默认值直接可见) | 88 |
| 主按钮 | 88 |
| 结果读数槽(mono 26 + copy 88 热区) | 120 |
| 更多选项折叠 | 56 |
| 单面板 ≈ 392pt(SM4 双输入槽 984rpx ≈ 492pt) | 784 |
新布局 去第二层 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 不得出现「可用 / 已支持」字样。
七件事只有你能定
都做完了才能进实现;每条我给了默认建议,你说「按建议走」我就照做。
主色离开微信绿
#07c160 → 青墨 #0E6E75,全站 86 处 wxss 要动;退路是只换两个变量(填充留绿、文字换 #0B7A3E)。
影响:全部 6 屏 · 建议:直接换首页砍搜索 + 分类 tab + 金刚位
4 个工具的目录不需要检索;砍完首屏 4 个工具全见。
影响:pages/index · 建议:砍SM9 修还是下线
现为随机数占位实现。留 = 第 4 段 + 常驻 warn 提示 + 按钮 disabled;下线 = 删段删页。
影响:屏 6 / 是否保留 1 个死页 · 建议:先下线,别挂着入口工具改名
TOTP令牌→动态口令、编码工具→编码转换、国密算法保持。「TOTP」只作副行,首页不出现括号。
影响:首页 + 各页标题 · 建议:改新增「最近使用」
四行工具之后、页脚之前,最多 3 条单行 chips,本地 storage 按最近打开倒序去重;无数据整段不渲染。
影响:首页 · 建议:做,但要接受多一次写 storageTOTP 管理改长按
编辑 / 删除收进长按菜单,常驻控件从 3 个降到 0 个,行高才能给码让位。
影响:屏 4 · 风险:可发现性下降 · 建议:做,但首屏加一句一次性提示退出登录迁位
从 global-toolbar 迁到「个人资料 → 账号组」,全局条只留网络状态 + 头像。
影响:屏 2 + 全局组件 · 建议:迁二级待定 影响面小,可与上面合并答复
| 项 | 屏 | 我的默认 |
|---|---|---|
| 编码转换新增「解码」段(utils 里已有 decode 函数,页面没用) | 屏 5 | 本轮不做,标注为灰 |
| 编码结果点击是否仍自动复制 | 屏 5 | 保持自动复制 + toast |
| TOTP 说明默认折叠(新用户可能不知道密钥格式) | 屏 4 | 折叠 |
| SM2 私钥现在明文展示且可复制,是否默认遮蔽 | 屏 6 | 本轮不动,只标风险 |
| SM4 是否要 ECB/CBC 选择(库不支持 CBC = 换实现) | 屏 6 | 不做 |
| 暗色是否本轮一起上(需 app.json 加 darkmode) | 全部 | 一起上,否则 9 处暗色代码继续是死码 |
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 实现(两份并存以后必然对不上)。本任务我一行工程代码没动,只出图。
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 个目录。
这份稿子动了什么、没动什么
- 没有改任何工程代码;本文件单独落在
/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与全站暗色变量二选一,别两套并存(现在就是两套)。
- 青墨没有 50/100/300/700/900 六档阶梯 —— 别自己调亮暗,只给 4 个品牌位。
- copy glyph 的默认色是建议值(ink-3),不是定稿。
- 各区块精确高度由内容撑开;本稿标的都是「最小 / 固定」值。