# dsh-font-settings [English](README.md) | 中文 一个 [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) Web 插件:把**设置 → 通用**里的字体设置换成可搜索的选择器——正文、代码、终端字体各自独立,并可按需列出本机已装字体。 自带那几行要求你凭记忆手打逗号分隔的字体名;这个插件把列表给你看,而且每一项都用它自己的字形渲染——靠眼睛选,而不是靠名字。 ## 功能 - **可搜索的字体选择器**,正文、代码、终端三个角色各一个。聚焦或输入即展开列表;↑/↓ 环回移动、Enter 应用、Esc 取消编辑、点击外部关闭。 - **每一项都用它将要应用的字形渲染**,所以是按外观认字体,而不是按名字猜。 - **手输照旧可用**。列表里没有的字体直接敲进去即可,Harness 会规范化(给字体名加引号、通用字体族保持裸写)并作为字段值。 - **一键加载本机字体**(Chromium 系浏览器通过 `queryLocalFonts` 暴露列表;不支持或未授权时按钮会说明,其余功能不受影响)。 - **每个角色的字号**就在它的字体选择器旁边。 - **默认折叠**成一条「字体设置」行,右侧 chevron 展开/收起,通用列表保持紧凑;折叠态上会摘要当前正文字体。 - **系统默认始终一点可达**——每个列表的第一项就是清除覆盖。 ## 安装 本插件以 profile bundle 的形式安装,用 Web 侧栏的**插件**页,或 `plugin_manager` 工具的 `install_bundle`(需要 `danger-full-access`)。spec 可以是 git 地址、本地路径或 registry 包名: - **从 GitHub 装**:`https://github.com/yiqiuacc/dsh-font-settings.git`(安装前管理器会先对 GitHub 跑 `git ls-remote`;pnpm 的 `github:yiqiuacc/dsh-font-settings` 简写同样可用)。 - **装本地检出**:`link:<本目录的绝对路径>`。 - **从 registry 装**(发布后):`@styiqiu/dsh-font-settings`。 安装会默认启用该 bundle。之后打开**设置 → 通用**,原本自带字体设置组的位置就是这条「字体设置」。 ## 选择存在哪里 插件不拥有任何存储,也不注入样式表。所有读写都走 Harness 的主题服务(`ctx.theme`),其余交给自带机制: - **持久化**——settings 作用域保存每个列表与字号;profile 把它们记录在 `cordis.patch.yml` 的 `ui-theme` 配置行里。 - **首屏**——Harness 的 boot 脚本把已存列表嵌进所服务的 index HTML,因此页面不会先闪一下默认字体再应用你的选择。 - **应用**——主题 presenter 把 `--dsh-font-family-` 写成 `body` 上的内联样式,token 表再由它们组合出界面与代码字体栈。 因为两个入口读的是同一份存储,本插件的选择与自带的字体行始终是同一份数据。(安装后自带那几行不再渲染——它们被阴影掉了,见下。) ## 工作原理 - `client.js` 就是插件的全部。它往通用分区的 item 槽位注册一条条目,**使用自带条目的 id 但优先级更低**,从而阴影掉那条——list 槽按 id 只渲染一行,优先级最低者胜出。于是这一组是**取代**自带那几行,而不是并排。 - `theme` 服务通过作用域注入取得(`ctx.inject(['theme'], …)`)。该服务缺席时插件**不注册任何东西**:自带字体设置原样保留,插件等于没装。外层插件不等待该服务,所以没有它的组合也能正常启动。 - `index.js` 是一个**空的挂载壳**(`export function apply() {}`)。profile bundle 需要一个可挂载的 Host plugin 才能产生 Loader 行,浏览器 bundle 是从这个活着的 entry 发现的——但本插件已经没有任何 Host 侧行为。 - 无构建步骤、无依赖:纯 ES 模块,React 由客户端模块加载器提供。 ## 兼容性 - DeepSeek Harness `0.2.x` 的 Web(Desktop 复用同一套 web profile 模板,同样可用)。 - 「加载本机字体」需要 Chromium 系浏览器;其余功能与引擎无关。 - `ctx.theme` 是 **pre-stable API**:Harness 明确说明公开 API 可变,因此升级 Harness 后可能需要更新本插件。 ## 已知限制 - **这一组排在「外观」之前。** 阴影要求槽位优先级更低,而 list 槽按优先级排序,所以它必然排在通用分区最前面。只要选择「取代自带那几行」,这个位置就无法避免。 - **它依赖自带条目的 id `font-size`。** 若将来 Harness 改了这个 id,阴影失效,这一组会**与**自带字体行**并排**出现——控件重复,但不崩、不报错。 - **三个角色相互独立。** 没有「同时替换等宽字体」这类联动开关:代码与终端各有自己的选择器。 - **没有独立的预览块**——列表项本身就已经用各自字形渲染。 - **字号受 Harness 范围约束**(正文 10–22、代码 10–16、终端 10–20 px),步进器会 clamp 到范围内。 ## 开发 没有需要构建或安装的东西。 - 改 `client.js` 后刷新页面即可——客户端 bundle 每次页面加载时拉取。 - 只有改 `index.js`(挂载壳)才需要重启服务。 - `README.md` 是本文件的英文对照。 ## 许可证 [MIT](LICENSE)