dsh-global-font
DSH 全局字体插件:设置页提供字体选择面板(预设 + 自定义 + 预览),选择立即全局生效(含代码块与插件界面)并持久保存。
github.com/ErrorLst/dsh-global-font
功能
| 能力 | 说明 |
|---|
| 设置页「字体」面板 | 侧栏设置 → 字体:UI 字体 / 代码字体两个下拉选择器 |
| 预设字体 | 系统默认、system-ui、霞鹜文楷、思源黑体、微软雅黑、衬线;代码字体含 JetBrains Mono / Cascadia Code / Fira Code / Consolas |
| 自定义字体栈 | 下拉选「自定义字体…」,输入完整 CSS font-family 栈 |
| 实时预览 | 选择后立即应用到整个 UI(含 markdown、代码块、插件界面),面板内同步预览两种字体 |
| 还原默认 | 一键恢复出厂基线(config.json) |
| 持久保存 | 0.1.2 起写入 dsh 设置文档(settings.yaml,跨浏览器);旧版 localStorage 值仅作历史兼容读取 |
原理
DSH 主题把字体收敛在两个 CSS 变量(@deepseek-ai/dsh-client-ui-theme):
| 变量 | 作用 |
|---|
--dsw-font-family | UI 字体(body、按钮、输入框、markdown、插件 UI) |
--ds-font-family-code | 代码字体(行内代码、代码块、终端、JSON 树) |
client half 注入一条 <style>,以 !important 覆盖这两个变量并强制 body/button/input/select/textarea 继承——宿主 UI 和使用主题变量/继承字体的插件 UI 都会统一换字体。
已核验(DSH 0.1.6-alpha.1):这两个变量仍定义在 DSH 的 packages/client/ui-theme/src/styles/base.css(--dsw-font-family 第 7 行、--ds-font-family-code 第 9 行),本插件引用的变量名与原文一致。
安装
dsh plugin --profile web add github:ErrorLst/dsh-global-font
本包声明了 dsh.bundle.patch:dsh plugin add 成功后 reconcile 会自动把它登记进 profile 的 bundle 层(dsh.profile.bundles),无需手动编辑配置;重启 dsh web 即生效。
本地开发安装(同一目录即本仓库 checkout):dsh plugin --profile web add <本仓库路径>。
使用
- 重启 dsh web 后刷新 GUI 页面(新 client bundle 自动生效)。
- 打开侧栏 设置 → 字体,选择或自定义字体;选择立即全局生效并保存。
- 想恢复默认,点「还原默认」即可。
配置与持久化
- 面板选择(0.1.2 起):保存到 dsh 设置命名空间
dsh-global-font——即 $DSH_HOME/settings.yaml 的 dsh-global-font: 节(与其他设置节并列,重启 dsh web 后保持,且跨浏览器同步)。Node half 在设置服务可用时注册该节(schema 与 config.json 同结构)。
- 读取优先级:settings.yaml 用户覆盖值 →
localStorage(0.1.1 及更早版本保存的历史值,只读兼容、不再写入新值)→ 基线(config.json)。
- 服务器基线:包内
config.json(uiFont/codeFont 两个 CSS font-family 栈)作为出厂基线:设置节注册时作为组合 base 层快照;设置服务不可用时路由 /api/dsh-global-font/config 每次请求读盘。当前内容即 DSH 原始字体栈,可改为你偏好的默认。
- 路由应答:
/api/dsh-global-font/config 同时下发 { uiFont, codeFont, base: { uiFont, codeFont } }——uiFont/codeFont 为有效值(settings.yaml 用户覆盖 → config.json 基线),base 为 config.json 出厂基线。无可写设置域(memory 模式 / 旧浏览器组合)的 client 在「还原默认」时应用 base,不会把 settings.yaml 用户值当基线重新应用;旧版服务器不下发 base 时保持原行为。
- 改动生效提示:设置服务挂载时基线取启动(注册)时快照,改
config.json 需重启;设置服务不可用的回退路径仍逐请求读盘(刷新页面即生效)。
settings.yaml 示例:
dsh-global-font:
uiFont: "'LXGW WenKai', 'Microsoft YaHei', 'PingFang SC', sans-serif"
codeFont: "'JetBrains Mono', Consolas, 'Courier New', monospace"
测试
零依赖(无需 node_modules、无需构建),直接用系统 node 运行宿主侧(Node half)回归测试:
node --test test/index.test.js
覆盖:路由注册({ kind: 'exact', path: '/api/dsh-global-font/config' },经 ctx.effect 托管并可注销)、无 settings 服务时返回 config.json 出厂基线(默认字体栈与 DSH base.css 同源)、installSection(owner, ns, schema, entry, hooks) 实参、setSource 后 GET 返回解析值而 base 保持出厂基线、非 GET/HEAD 返回 405。@deepseek-ai/schemastery 仅用于 schema 声明:未安装该依赖时测试用最小等价 stub 顶替(未安装依赖时需 Node >= 22.15,经 node:module registerHooks;已安装依赖的 Node 20 组合直接用真实包),不改动被测代码。
还原 / 卸载
- 设置页「还原默认」:清
localStorage(key dsh-global-font.config)旧值;设置服务可用时 unset dsh-global-font 节的 uiFont/codeFont(回到 config.json 基线),否则回读 /api 应答中的 base(出厂基线)。
- 完全卸载:
dsh plugin --profile web remove @dsh-external/dsh-global-font(仅旧版本 dsh 才需手动删除 profile 的 insert 行)。
已知边界
- 插件若在具体元素上硬编码
font-family(如内联样式),不会被强制覆盖;绝大多数插件 UI 走继承或主题变量,均在覆盖范围内。
- 持久化首选 dsh 设置文档(settings.yaml);设置服务缺失的极端组合回落浏览器级
localStorage——两者都只作用于当前页面外观,且 settings.yaml 优先于 localStorage 历史值。
插件管理
已装插件用 plugin-registry 的薄控制台管理(浏览器面板):管理 profile 插件安装态(bundle 层栈 + insert 行 + 启停),无需手改配置。安装:dsh plugin --profile web add <plugin-registry>/packages/plugin/console