README.md

September 15, 2026 · View on GitHub

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-familyUI 字体(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.patchdsh plugin add 成功后 reconcile 会自动把它登记进 profile 的 bundle 层(dsh.profile.bundles),无需手动编辑配置;重启 dsh web 即生效。

本地开发安装(同一目录即本仓库 checkout):dsh plugin --profile web add <本仓库路径>

使用

  1. 重启 dsh web 后刷新 GUI 页面(新 client bundle 自动生效)。
  2. 打开侧栏 设置 → 字体,选择或自定义字体;选择立即全局生效并保存。
  3. 想恢复默认,点「还原默认」即可。

配置与持久化

  • 面板选择(0.1.2 起):保存到 dsh 设置命名空间 dsh-global-font——即 $DSH_HOME/settings.yamldsh-global-font: 节(与其他设置节并列,重启 dsh web 后保持,且跨浏览器同步)。Node half 在设置服务可用时注册该节(schema 与 config.json 同结构)。
  • 读取优先级:settings.yaml 用户覆盖值 → localStorage(0.1.1 及更早版本保存的历史值,只读兼容、不再写入新值)→ 基线(config.json)。
  • 服务器基线:包内 config.jsonuiFont/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 组合直接用真实包),不改动被测代码。

还原 / 卸载

  1. 设置页「还原默认」:清 localStorage(key dsh-global-font.config)旧值;设置服务可用时 unset dsh-global-font 节的 uiFont/codeFont(回到 config.json 基线),否则回读 /api 应答中的 base(出厂基线)。
  2. 完全卸载: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