wangxilhy23
dsh-wx-skin
No description
- Stars
- 1
- Language
- TypeScript
- Created
- Aug 14, 2026
- Updated
- Aug 14, 2026
Introduction
🎨 dsh-wx-skin
DeepSeek Harness(DSH)Web GUI 皮肤插件 —— 侧栏「皮肤」面板,自选本地图片或图片 URL 作为全屏磨砂背景,支持预设、暗化、模糊与透出调节,明暗主题自动适配,跨刷新持久化。

上图为本插件实际效果演示(深蓝渐变壁纸透过半透明表面)。
assets/demo.html是自包含的演示源,可直接用浏览器打开预览。
✨ 功能特性
- 侧栏「皮肤」入口,点击弹出设置面板(浮层,不遮挡聊天内容)。
- 本地图片:浏览器原生文件对话框选择 PNG / JPEG / WebP / GIF / BMP,不限文件大小;按显示需要编码(≤4096px 保持原始分辨率,更大的自动缩放以保证浏览器可绘制、可持久化),选中后点「应用」生效。
- 图片 URL:粘贴
http(s)://图片地址直接应用。 - 预设皮肤:墨蓝 / 石板 / 暖沙 / 落日渐变 / 深海渐变 / 极光渐变。
- 效果调节:
- 暗化 0–80%(黑色遮罩,保证文字可读);
- 模糊 0–24px(背景毛玻璃);
- 透出 50–100%(表面不透明度,越低背景越明显,默认 72%)。
- 启用开关 + 恢复默认,一键关闭皮肤。
- 持久化:设置存于
localStorage['dsh-wx-skin.settings'],刷新、重启后自动恢复。 - 明暗主题适配:随
body[data-ds-dark-theme]自动切换两套半透明配色。 - 完全独立:纯浏览器端 client 插件,不修改 DSH 仓库,不影响主界面与其它插件。
📦 安装
前置条件:已安装 deepseek-harness 并初始化 web profile。
方式一:从 npm 安装(推荐)
插件已发布到 npm,一条命令装齐(在 DSH 源码 checkout 目录执行):
pnpm dsh plugin --profile web add dsh-wx-skin@0.1.0
# 若 `dsh` 已加入 PATH,也可直接:
dsh plugin --profile web add dsh-wx-skin@0.1.0
方式二:使用发布包(tarball)
下载 dsh-wx-skin-0.1.0.tgz(或通过 GitHub Releases 获取):
pnpm dsh plugin --profile web add file:<tgz 的绝对路径>
# 例如:
pnpm dsh plugin --profile web add file:C:/Users/you/Downloads/dsh-wx-skin-0.1.0.tgz
方式三:克隆源码构建(开发者)
git clone <本仓库地址>
cd dsh-wx-skin
npm install
npm run build
# 装进 web profile(从 DSH 源码 checkout 目录执行)
pnpm dsh plugin --profile web add link:<本目录绝对路径>
完成安装后
重启 dsh web,刷新 http://127.0.0.1:3080,侧栏出现「皮肤」入口即可使用。
验证是否挂载:
pnpm dsh --profile web --dump-config # 应看到 "# == dsh-wx-skin" 层
🚀 使用
- 点击侧栏「皮肤」打开面板。
- 选背景:
- 点「选择图片」→ 选择本地图片 → 显示缩略图 → 点「应用」;
- 或粘贴图片 URL → 点「应用」;
- 或直接点一个预设色板。
- 调效果:拖动「暗化」「模糊」「透出」滑杆实时预览。
- 「启用皮肤」开关控制总开关;「恢复默认」一键还原。
🗑️ 卸载
pnpm dsh plugin --profile web remove dsh-wx-skin
重启 dsh web 后入口消失,皮肤设置一并清除。
⚙️ 工作原理
- 形态:外部 client 插件(参考 dsh-web-ui 模式)——
package.json声明dsh.client(浏览器半区)+dsh.bundle.patch(cordis.patch.yml插入加载行),构建产物经 tsdown 输出为lib/client.js,由 DSH 的 client-modules 在/plugins/dsh-wx-skin/client.js提供。 - 背景层:注入全屏
div[data-wx-skin-layer](position: fixed; z-index: 0; pointer-events: none),并将应用根#root抬到z-index: 1。⚠️ 实测z-index: -1的 fixed 图层在 DSH shell 中不绘制(落在 canvas 背景之下),这是早期版本"能选图但背景不显示"的根因,故采用z-index: 0+#root抬升方案。 - 半透明表面:以独立
<style>+!important覆盖十余个 alias 表面 token(--dsw-alias-bg-*、--dsw-specific-*、--dsw-alias-markdown-*等),明暗两套值;透明度由--wx-skin-surface变量统一控制(不依赖color-mix(),任意现代浏览器可用)。 - 图片管线:canvas 解码 → 编码为 JPEG data URL;原始分辨率 ≤4096px 时保持原样,更大或超出浏览器存储容量时静默缩小;编码结果做有效性校验,异常自动降档重编——永不因图片大小报错。
- 不依赖
ctx.theme服务:皮肤完全独立于 DSH 主题系统,关闭时样式惰性、默认主题不受影响。
🛠️ 开发
npm install # 安装依赖
npm run typecheck # tsc 类型检查(宿主 + 客户端)
npm run test # vitest 单元测试(skin-store / image-pipeline)
npm run build # tsc 宿主 lib + tsdown client bundle
npm pack # 产出发布包 dsh-wx-skin-0.1.0.tgz
改完源码:npm run build → 重启 dsh web → 刷新页面。
📁 项目结构
dsh-wx-skin/
├── assets/
│ ├── demo.png # README 效果截图
│ └── demo.html # 自包含演示页(浏览器直接打开)
├── src/
│ ├── index.ts # 宿主半区:空 apply(占加载行)
│ ├── core/types.ts # 共享类型(SkinSettings)
│ └── client/
│ ├── index.ts # 浏览器半区入口(apply)
│ ├── mount.tsx # 侧栏入口 + 弹出面板的 DOM 注入(自愈挂载)
│ ├── SkinPanel.tsx # 设置面板(选图 / URL / 预设 / 滑杆 / 恢复默认)
│ ├── skin-store.ts # 纯逻辑:默认值、持久化、预设、CSS 变量映射
│ ├── image-pipeline.ts # 图片 → 降采样 → data URL(依赖注入,可测)
│ ├── skin-dom.ts # 全局样式 / 背景层 / 应用到文档
│ ├── global-skin-css.ts # 皮肤全局样式表(背景层 + 半透明表面 + 明暗适配)
│ └── skin.module.css # 面板 / 侧栏入口样式
├── tests/ # vitest 测试
├── cordis.patch.yml # 插件加载行补丁
└── package.json # dsh.client / dsh.bundle.patch 声明
📋 兼容性与注意事项
- DSH 版本:插件为纯浏览器端 + 单个 cordis 行,对 DSH 版本不敏感;但侧栏入口依赖 shell 的 DOM 结构(
[data-pane="sidebar"]/[class*="logoRow"]/[class*="newSession"])。若 DSH 版本变更导致入口未出现,只会记录日志、不影响 GUI,可反馈后调整选择器。 - 存储:本地图片以 data URL 存于
localStorage(单浏览器场景,足够背景图使用);超大图会自动缩放至可持久化尺寸。 - 格式:仅接受位图(PNG / JPEG / WebP / GIF / BMP);SVG 等矢量格式不支持(canvas 管线只处理位图,安全可预测)。
- 依赖
#root:皮肤通过将应用根#root抬升到z-index: 1使背景层位于应用之下,请确保 shell 的挂载根仍为#root(DSH 默认如此)。