dsh-skin-win2000
给 DSH Web GUI 换上 Windows 2000 桌面外观:按度量表还原的灰色控件、双色渐变标题栏、1px 立体边框、直角、16px 滚动条,以及由插件自身路由提供的点阵字体。
安装
dsh plugin --profile web add dsh-skin-win2000
沙箱测试结果
| 阶段 | 结果 |
|---|---|
| 1 安装 | ✓ |
| 2 列装 | ✓ |
| 3 挂载 | ✓ |
| 4 启动 | — |
四阶段在隔离沙箱里跑:安装(有网)→ 列装 → 挂载 → 启动(后三步断网)。
README
<div align="center">
dsh-skin-win2000
给 DeepSeek Harness Web GUI 换上一身 Windows 2000 的皮。
经典中性灰控件、双色渐变标题栏、1px 立体浮雕、绝对直角、16px 经典滚动条。





简体中文 · [English](README.en.md)
</div>
界面预览
整体界面 —— 灰底、深蓝选中、右下角皮肤面板
经典窗口 —— 渐变标题栏、菜单栏、凹陷输入框与状态栏
设置界面 —— 表单控件、开关与列表上的皮肤
暗色界面 —— 面板里打开「暗色模式」,度量表和立体边框原样保留
这是什么
一个 DSH(DeepSeek Harness)的客户端插件,把 Web GUI 的画布整体换成 Windows 2000 的视觉语言。装上即生效,右下角会出现一个可拖动、可折叠的控制面板;点一下就能关掉皮肤,界面立刻恢复 DSH 原样。
它不做"大概像那个年代",而是按度量表逐项取值:控件表面、标题栏两端的渐变色、失焦渐变色、三级投影灰、选中高亮——每一项都能在那个年代的 System Metrics 表里找到对应行。仓库里的 verify-metrics.mjs 会拿代码里的实际取值去比对这张表,对不上就报错。
特性
- 度量表级配色 —— 控件表面
#D4D0C8、活动标题栏#0A246A → #A6CAF0、失焦标题栏#808080 → #C0C0C0、投影三级#F5F5F5 / #808080 / #404040、选中高亮#0A246A - 绝对直角 —— 全表
border-radius归零,并把 6 个--dsw-radius-*token 直接压成0px。DSH 各组件里 394 处圆角都读这几个 token,所以这是从源头掐断,不靠逐个追选择器 - 1px 立体浮雕 —— 所有凸起/凹陷都是阶梯式
inset box-shadow:按钮凸起、输入框与代码块凹陷、按下换成凹陷并位移 1px - 无纯白 —— 度量表里的
#FFFFFF(ButtonHighlight)换成#F5F5F5,工作区白底换成#D4D0C8。整个皮肤不含任何纯白像素 - 16px 直角滚动条 —— 灰槽 + 白点阵纹 + 凸起滑块,滑块按下变凹陷
- 停止生成是红的 —— 发送与停止共用同一个按钮类,皮肤按
aria-label精确区分,暂停时是大红底#CC0000 - 皮肤面板 —— 右下角,标题栏可拖动(位置记忆)、可折叠、开关皮肤、切换配色、开关暗色模式、弹出经典窗口示例;窗口本身也能拖动,双击标题栏最大化或还原
- 暗色模式(默认关闭) —— 面板里一行开关。同一套几何、同一套立体边框,只把漆面换成比纯黑亮一档的暖灰
#1A1815(表面亮度恰好是亮色的镜像),凹陷输入落到#090909、卡片与代码块抬到#201E1A、标题栏仍是大航海蓝渐变、选中仍是深蓝配浅字;同时把color-scheme切成dark,让原生控件与滚动条随之改变 - 不动你的字体 —— 皮肤自身没有任何
font-family覆盖(唯一例外是窗口标题按钮的 Marlett 符号字形),字号、字体完全由你的 DSH 字体设置决定 - 零构建 —— 纯 JavaScript,单文件实现,改完刷新即生效
安装
皮肤是一个标准的 DSH 组合包(bundle):包里有 dsh.bundle.patch 指向 cordis.patch.yml,有 dsh.client 声明浏览器半侧。DSH 的插件管理器接受包名、Git 地址、压缩包或本地路径四种来源,所以下面三种装法任选。
方式一:npm 包(推荐,插件市场可搜到)
dsh plugin --profile web add dsh-skin-win2000
包地址:<https://www.npmjs.com/package/dsh-skin-win2000>
方式二:Git 仓库(无需 npm 账号)
dsh plugin --profile web add github:lildanger/dsh-skin-win2000
仓库需要是公开的,且仓库根就是包本体(根目录下能读到 package.json 里的 dsh.bundle.patch)。
方式三:本地路径(开发用)
dsh plugin --profile web add link:/path/to/dsh-skin-win2000
DSH 0.2.0 起:必须登记在 profile 依赖里
这一步不做,皮肤装了也不会出现 —— 配置里能看到它,界面上毫无变化。
DSH 0.2.0 之前,插件可以只用 node_modules 里的链接 + 一条 patch 行挂载;0.2.0 起宿主端先查 profile 的 dependencies,没登记的行会被静默跳过(客户端清单里根本没有它)。
上面三种方式用的都是 dsh plugin add,它会自动登记依赖。如果你是手工挂载的(比如直接建 junction/symlink 再往 patch 里加行),要补上登记:
dsh plugin --profile web add link:/path/to/dsh-skin-win2000
确认登记成功:
dsh --profile web --dump-config | grep skin-win2000 # 配置里有 # 再确认客户端清单里有它(清单是启动时算的,改完依赖要重启 DSH)
还要一条 patch 行
依赖登记之外,bundle 行仍要插进 profile 的 cordis.patch.yml:
- insert:
- id: skin-win2000
name: dsh-skin-win2000
图形界面里也可以走「侧栏 → 插件 → 添加插件」,把上面的包名或 Git 地址填进去,装完点立即启用。
刷新页面即可。如果界面没变化,请 Ctrl+Shift+R 强制刷新 —— 客户端 bundle 带一年强缓存,普通刷新拿不到新版本。
关于字体
皮肤自带它渲染文字用的点阵字体:fonts/unsciiCJKV18.woff2(1.42 MB,由 6.37 MB 的 OTF 无损转换而来)随包分发,由宿主半侧在 /api/dsh-skin-win2000/fonts/unsciiCJKV18.woff2 提供。
@font-face以包内url()打头,后面跟一个local()兜底(本机恰好装了同名字体时省一次下载);包内那份永远优先,渲染结果与机器无关- 字体栈为
"unsciiCJKV18", monospace,不引用包里没有的字体 - 代码块另用一副字体:
pre/code/kbd/samp里走unscii-8-tall(8 像素高的等宽变体,59 KB → WOFF2 40 KB),它把unicode-range覆盖到拉丁、标点、箭头、数学、制表、方块、几何图形与 PUA 私用区(tall 能提供的全部非 CJK 字符都归它),所以代码里的目录树├──、方块██▒░、箭头→都与英文同为 8 像素高,不再与 16 像素的 CJKV18 混排;汉字、假名与全角标点仍留在 CJKV18。正文中英混排统一用 CJKV18,共用一条基线 - 粗体不合成:unscii 全家族都只有单一字重,没有 bold 变体,而点阵字被引擎拉伸伪造粗体会发糊 —— 所以
b/strong/bold 类这些强调元素按正体字重(400)渲染。应用自己用命名类设的 500/600(例如设置页的栏目标题)不在此列,保持原样 - 响应带
cache-control: public, max-age=604800, immutable,浏览器每周最多下载一次;font-display: swap保证字体到达前文字可见 - 字体许可是 GPL:本字体衍生自
unscii-16-full,而 Viznut 官方页面明确把它单独列为「因 Unifont 而受 GPL 约束」(其余变体才是公有领域)。字体自带的name表也记着这层关系,fonts/COPYING附了许可全文。皮肤本身仍是 MIT —— 字体是被样式表引用的数据,不是链接进插件的代码。详见 [fonts/README.md](fonts/README.md)
皮肤其余部分不设置字体:唯一例外是窗口标题按钮的 Marlett 符号字形。如果你关掉面板里的「点阵字体」开关,界面就完全用你自己的字体设置。
使用
右下角面板:
控件 · 作用
标题栏 · 按住即可拖动整个面板,位置记在 localStorage,可以一直拖到屏幕右/下边缘贴边;双击回到右下角
右上角按钮 · 三档循环:完整面板 → 只剩标题栏 → 一个小 + → 回到完整面板;切换时那个开关停在鼠标点击的位置,面板围着它缩放
启用皮肤 · 开关皮肤。关掉后界面恢复 DSH 原样,面板本身仍保持 2000 外观,方便随时开回来
点阵字体 · 开关随包分发的点阵字体;关掉就用你自己的字体设置
暗色模式 · 开关深色漆面,默认关闭。只换颜色不换几何:表面 #1A1815、凹陷控件 #090909、卡片 #201E1A,标题栏渐变、深蓝选中和三级立体边框都照旧;选择记在 dsh.skin.win2000 里,和「点阵字体」共用一条记录
窗口示例 · 弹出一个完整复刻的经典对话框:标题栏 + 三个标题按钮 + 菜单栏 + 凹陷客户区 + 三段状态栏 + 操作按钮行,点标题栏的 × 可看失焦渐变
窗口本身 · 按住标题栏可拖到屏幕任意位置(位置记忆在 dsh.skin.win2000.window);双击标题栏或点 □ 最大化铺满视口,再双击或点一次还原——还原回到原来拖到的位置
最小档那个小 + 本身也能拖动 —— 它是收起来之后唯一还能抓的地方。拖它不会误触发展开。
窗口示例的拖动位置单独存一个 key,和面板位置互不影响;最大化时拖动标题栏不会有反应,避免把铺满的窗口又拖歪。
配色表
界面元素 · 取值 · 落地 token
3D 控件表面 / 任务栏 / 菜单栏 · #D4D0C8 · --dsw-alias-bg-base
活动标题栏 起点 → 终点 · #0A246A → #A6CAF0 · --dsh-skin-titlebar-active
失焦标题栏 起点 → 终点 · #808080 → #C0C0C0 · --dsh-skin-titlebar-inactive
3D 高光 · #F5F5F5 · --dsh-skin-shadow-raised
3D 投影 · #808080 · 同上
…(truncated)
以上内容来自 npm 上的 README,我们只做格式化,不改内容。
版本
npm 上共发布:12,最后更新 2026-10-20