# dsh-skins · DeepSeek Harness (DSH) 皮肤中心与 Wallpaper Engine 动态主题工坊 [English](README.md) | 中文

Version   DSH   License

DeepSeek Harness(DSH)官方 Web GUI 与桌面客户端专属主题与个性化美化引擎
主题换肤 · Wallpaper Engine 动态壁纸 · 毛玻璃高斯模糊 · 自定义深浅色配色 · 创意工坊即时试穿

`@linxin666/dsh-client-ui-skin-center`(cordis 插件 id `ui-skin-center`)是 dsh Web GUI 唯一的皮肤包:它把皮肤列表 / 试穿 / 应用做成一级设置分区「皮肤中心」(设置 → 皮肤中心,只列已安装皮肤),并且是所有皮肤的唯一加载器与渲染器。皮肤是纯资产目录——没有 package.json、不发 npm、不接 cordis 接线——只与皮肤中心契约(`contracts/`)耦合;皮肤中心把对官方 DSH 的全部耦合吸收在契约之后。卡片自带总开关(关闭即停用试穿、应用与背景控制)。 - 列表:展示「官方默认」加目录册里已安装的皮肤(名称、标语、强调色),当前应用目标带「使用中」标记。目录册合并两个来源:随本包内置的默认皮肤(`skins/blue-fantasy/`)与放进 `$DSH_HOME/skins//` 的用户皮肤(同 id 时用户皮肤遮蔽内置皮肤)。皮肤集中的其余皮肤都是市场条目:在 DSH 市场商店一键按需安装到 `$DSH_HOME/skins//`,即由同一目录册作为用户皮肤管理——无需重启,重开卡片或刷新页面即收录。`skin.json` 校验失败的皮肤按 fail-closed 排除,并作为目录诊断上报。 - 自定义主题:列表末尾提供一张基于官方默认外观派生的用户级主题卡,与「官方默认」及目录册皮肤相互独立。浅色、深色分别编辑强调色、背景色、前景色和对比度(0–100),支持即时试穿、应用、恢复当前模式默认值和刷新持久化。生成的 CSS 只能覆盖经审计的官方 token 白名单,不接收选择器、任意 CSS 或资源 URL;不会修改任何第三方皮肤定义,目录册皮肤激活时自定义主题层自动停用。 - 试穿 / 应用:两者走同一个原子切换引擎(`src/client/runtime/skin-controller.ts`)。一次切换 = 一个新的 activation identity:取回已限定作用域的样式表,安装样式、背景媒体与可选 hooks,翻转 `html[data-dsh-skin=""]`,然后销毁上一个 activation(append-only 效果账本,幂等清理)。最新请求永远胜出;失败或被淘汰的切换完整保留旧皮肤。试穿是同一个切换但不落盘——「退出试穿」恢复已提交的皮肤。应用会持久化选择(`POST /api/skin-center/v2/active`)。不刷新页面、不改写 `cordis.patch.yml`、不重建启动图。 - 首屏:host 半区注册一个 index.html 转换(`webServer.tapIndex`,单一适配模块 `src/tap-index-adapter.ts`),向每份送达的文档盖 `html[data-dsh-skin]` 属性并插入样式表链接,刷新后直接以当前皮肤启动,无官方原貌闪屏。tap 出任何问题都 fail-closed 回官方原貌。 - 皮肤格式(v2):`skin.json`(fail-closed 校验,v1 字段 `package`/`wiring`/`bodyAttr` 忽略并给迁移警告)、`skin.css`(L1 token 重映射 + L2 语义选择器)、可选 `patches.css`(L3 自由选择器,高敏感)、可选 `hooks.mjs`(受信逃逸舱,高敏感)、`assets/`、`preview/`。所有 CSS 经过安全管线(`src/core/css-safety/transform.ts`):每个选择器强制限定在 `html[data-dsh-skin]` 下,`@import` / 远程或协议相对 URL / 越界路径直接报错。见 `contracts/README.md`。 - 覆盖契约:L1 重映射官方 `--dsw-*` 设计 token;L2 样式语义属性(`data-dsh-surface` / `data-dsh-part` / `data-dsh-plugin`,枚举见 `contracts/semantic-attrs-v1.md`),由兼容适配器(`src/client/runtime/semantic-adapter.ts`)从稳定锚点(`data-slot` 出口、`data-chat-flow-kind` 等)为官方壳层 DOM 打标;L3 补丁任意选择器,脆弱性由皮肤作者自负。主动输出语义属性的插件获得完整 L2 覆盖;不输出的只享受 L1。目录皮肤、自定义主题或壁纸激活期间还会启用公共壳层渲染适配器:它清除工作区列表末端 fade,将 composer 占位符固定为不透明的主题次级文本色,并为会话滚动口保留底部安全间距以保证吸底正文不被输入区覆盖(#978),各皮肤无需重复补丁。 - 背景优先级:Wallpaper Engine 壁纸永远优先于用户手动背景遮罩,后者优先于皮肤清单背景媒体;开关壁纸会实时重估优先级。 - 背景控制:背景遮蔽滑杆(0–100%)为画背景的皮肤在面板后加纱,两个按状态的高斯模糊滑杆(0–20 px)分别控制空对话与有内容时的背景,输入卡模糊滑杆(0–20 px)只控制输入卡背后的磨砂区域,气泡不透明度滑杆(0–100%)控制支持气泡 alpha 的皮肤消息气泡。整张壁纸模糊仍是独立的壁纸设置。背景模糊通过外壳之后的固定 `backdrop-filter` 元素施加;0 完全关闭(无元素、无 GPU 开销)。输入卡磨砂由独立的 body 级固定跟随层(`data-dsh-composer-frost` 元素)承担并按输入卡尺寸跟随,**不**挂在卡片本体上:卡片一旦带 `backdrop-filter` 就会成为其中 shell fixed tooltip 的包含块,悬停时整页会话会被顶动。 - Wallpaper Engine 桥:卡片可把本机 Wallpaper Engine 库用作 GUI 背景。host 半区(`src/we-library.ts` + `src/we-routes.ts`)定位 WE 安装(Steam 应用 431960:Windows 注册表、`libraryfolders.vdf` 中的全部库路径、持久的 `appmanifest_431960.acf` 所有权事实与探测路径),扫描项目与创意工坊内容及可选手动文件夹,经同源 `/api/skin-center/we/*` 路由提供清单、媒体(Range 流式)、预览图、web 壁纸项目文件(注入 WE API shim)与场景壁纸主贴图 PNG(由 `src/pkg-extract.ts` 进程内解码 PKG/TEX,磁盘缓存)。视频壁纸用 `