Skip to content

feat(client): 设置页「手机访问」导航图标换成手机图标 - #127

Open
Fishquito7 wants to merge 2 commits into
shaobeichen:mainfrom
Fishquito7:feat/settings-nav-phone-icon
Open

Fishquito7 wants to merge 2 commits into
shaobeichen:mainfrom
Fishquito7:feat/settings-nav-phone-icon

Conversation

@Fishquito7

@Fishquito7 Fishquito7 commented Sep 12, 2026 •

Copy link
Copy Markdown

概述

设置页左侧「手机访问」的图标,从外壳兜底的齿轮换成手机图标(设计稿:圆角机身 + 顶部听筒 + 底部 Home 键)。

现在「通用设置」和「手机访问」共用同一个兜底齿轮,扫一眼分不出来。

背景:为什么不能直接给 settings.section 传个 icon

DSH 0.1.x 的设置外壳(@deepseek-ai/dsh-client-ui-settings-general)把导航图标写死在内部的 navIcon(id) 里——只认 models / agent-presets / plugins 三个内置 id,其余一律兜底齿轮;而 settings.section 的注册项由外壳只投影 id / order / label(见 @deepseek-ai/dsh-client-ui-settings 的 slots 契约与运行时 slot 清单),没有 icon 字段可传。所以插件侧目前拿不到扩展点,只能在外壳渲染出来之后自己认领那一行。

做法

按社区通行做法补上(dsh-better-sidebar、dsh-skill-mcp-panel 是同样路子):

  1. 设置弹层挂载后,在 [role="dialog"] nav button 里按「自己那一行的可见文案」认行(文案走 translate('section'),即词典里的 手机访问 / Phone access);
  2. 给该行打 data-dsh-pocket-nav-icon 标记;
  3. 注入一条只认该标记的样式:隐藏外壳兜底的齿轮 svg,用 CSS mask 画出 16×16 手机图标。颜色用 background-color: currentColor,跟随主题与选中态;窄屏跟随 mobile.css.ts 缩到 14px。

只认自己那一行,不碰外壳结构;标记与样式随 ctx.effect 释放一起回收;locale 切换后由 MutationObserver 重新认行。样式标签按生态惯例标注 data-plugin="dsh-pocket" / data-plugin-css="dsh-pocket/nav-icon",会被 dsh-client-modules 认作本插件的样式,参与 HMR 清理。

上游若给 settings.section 增加 icon 字段,client/pocket-nav-icon.mjs 可整个删掉。

图标为什么不能直接等比缩放

设计稿(1254px)等比缩到 16px 会丢细节,因此按 16px 网格重新落点:

  • 设计稿描边只占机身宽的 7.8%,等比缩到 16px 是 0.78px,与 DSH 图标族 1.5px 的描边不一致 → 描边统一取 1.5px;
  • 描边变粗后,听筒与 Home 键若仍按比例落点,会和机身边框糊成一条 → 改为「按留白落点」,留出与边框的间隙;
  • Home 键在设计稿里是壁厚 19px 的圆环,缩到 16px 只剩 0.53px,无法成环 → 落成同直径实心点。

机身宽高比仍按设计稿的 0.645 保留。

改动清单

文件 说明
client/pocket-nav-icon.mjs 新增:认行判定(纯函数)、mask 样式、effect 安装与回收
client/index.jsx +5 行:import 与调用
test/pocket-nav-icon.test.js 新增 11 个用例
client/client.js 重新打包

验证

  • node --test test/pocket-nav-icon.test.js → 11/11 通过
  • npm test:合并最新 main 后 189 个用例,本分支失败集合与 main 完全一致——都是 Windows 环境下的 cloudflared/隧道相关用例(假 cloudflared 无法 spawn、一个 Linux 专用缓存用例超时),与本次改动无关;CI 的 ubuntu-latest 不受影响。
  • 浏览器端到端(真实构建产物 + mock 的 __ModuleLoader__)21/21:只标记自己一行、兜底齿轮被隐藏、mask 生效且颜色跟随 currentColor、切英文后旧的中文行不再命中、弹层重开重新认行、卸载后标记与样式一起回收。
  • 仓库里没有 jsdom,所以认行判定做成不碰 DOM 的纯函数,测试按现有做法(nav-targets.mjs / layout-mode.mjs)用字符串桩覆盖;另含图标几何(机身比例、与边框留白)、样式(断点与 14px 与 mobile.css.ts 对齐的防漂移断言)、以及「产物是否已重新打包」的断言。

风险与说明

  • 认行依据是导航行的可见文案,与 dsh-skill-mcp-panel、dsh-better-sidebar 现状一致。文案本身改动不影响(代码跟着词典走),但若外壳将来不再按文案渲染导航,需要同步调整认行方式。
  • client/client.js 按仓库流程(node client/build.mjs)从 client/ 源码重新打包。这个 PR 相对 main 是纯新增(+382 / −0),没有改动既有代码路径。

DSH 0.1.x 的设置外壳把导航图标写死在 navIcon(id) 里(只认 models /
agent-presets / plugins),settings.section 的注册项也只投影 id / order /
label,没有 icon 字段可传,所以 dsh-pocket 一直显示外壳兜底的齿轮。

按社区通行做法补上:设置弹层挂载后按「自己那一行的可见文案」认行(文案走
translate('section'),locale 切换后由 MutationObserver 重新认行),给该行打
data 标记,再用一条只认该标记的样式隐藏兜底齿轮、以 CSS mask 画出 16×16
手机图标(background-color: currentColor,随主题与选中态)。标记与样式随
ctx.effect 释放一起回收。

图标按 16px 网格重新落点:设计稿描边只占机身宽 7.8%,等比缩到 16px 是
0.78px,与 DSH 图标族 1.5px 不一致,故描边统一取 1.5px;听筒与 Home 键改为
按留白落点,避免在 16px 下与机身边框糊成一条;Home 键壁厚缩到 0.53px 无法
成环,落成同直径实心点。窄屏跟随 mobile.css.ts 把图标缩到 14px。

认行判定 isOwnNavRow 是不碰 DOM 的纯函数,按仓库现有做法(nav-targets.mjs /
layout-mode.mjs)用字符串桩覆盖:非本行不命中、文案缺失不撒网、切语言后旧行
失效、图标几何留白与设计稿比例、产物是否已重新打包。

上游若给 settings.section 增加 icon 字段,client/pocket-nav-icon.mjs 可整个删掉。

client/client.js 用仓库锁定的 esbuild(npm ci)重新打包,顺带对齐了产物与依赖
锁之间的 3 处 esbuild 版本格式差异(2 行非 ASCII 转义 + 1 处箭头函数体)。
@Fishquito7
Fishquito7 marked this pull request as ready for review September 18, 2026 11:37
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.

1 participant