dsh-ui-web/packages/skins/xp

34Star2Fork0Issue0Watching

为 DSH Web GUI 提供 Windows XP Luna 蓝复古皮肤:蓝色窗口条、四色旗标、米色状态栏、绿色开始按钮和 Bliss 蓝天桌面,仅改动浏览器外观。

语言
TypeScript
License
Apache-2.0
分支
main
dsh-plugindsh-plugin-marketdsh-plugins

安装

$ dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/skins/xp

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

一句话定位

XP(Luna)皮肤是 DSH Web GUI 的一款复古外观替换:把默认界面变成 Windows XP 的 Luna 蓝窗口条、四色旗标、绿色「开始」按钮和 Bliss 蓝天桌面,仅改动浏览器外观,不影响任何业务功能。

核心能力

  • 注入 Luna 蓝渐变标题栏:固定顶部、带四色窗口旗标图标和最小化/最大化/关闭三个窗口按钮
  • 注入米色状态栏:左侧显示「就绪」「DeepSeek 在线」,右侧保留「大写/数字/滚动」三个凹陷指示灯
  • 侧边栏底部加挂绿色「开始」按钮:点击会触发原生设置入口的同一段逻辑
  • 资源管理器风格树行:浅蓝悬停态 + #316ac5 蓝色选中态
  • Bliss 蓝天桌面背景 + 全局直角:基于 body[data-dsh-xp] 作用域渲染
  • 标题与 favicon:固定文档标题为「Windows XP · DeepSeek 在线」,并注入四色旗标 favicon

技术实现

  • 语言: TypeScript
  • 关键依赖: @deepseek-ai/cordis(dsh 插件运行时,devDependencies 中显式声明)、CSS Modules(xp.module.css,随 bundle 自动注入)
  • 架构模式: 纯客户端皮肤插件——宿主侧 apply() 是空实现,皮肤逻辑全在 src/client/index.tsapply(ctx) 里:通过 body.dataset.dshXp = '' 打开作用域、用 document.createElement 直接拼出标题栏/状态栏/开始按钮、用 MutationObserver 在侧边栏重渲染后重新挂载开始按钮、用 ctx.effect(..., 'ui-skin-xp: window chrome') 注册 disposer 把所有写入撤回
  • 入口文件: 宿主 src/index.ts,浏览器 src/client/index.ts,样式 src/client/xp.module.css,注册清单 cordis.patch.yml

适用场景

怀念 Windows XP 时代外观、想让 DSH Web GUI 看起来像经典桌面系统的用户;或者团队演示、教学场景里希望界面更有辨识度、又不想改任何业务逻辑的人。它只动皮肤,不影响对话、模型调用、KV 缓存。

前置依赖与兼容性

依赖最低版本说明
DSH未声明package.json 的 peerDependencies 为空,未显式声明 SDK 版本要求
Node未声明package.json 未设置 engines 字段
平台跨平台仅修改浏览器 DOM 与 CSS,无 os/cpu 限制
原生模块纯前端 DOM/CSS 工作,不依赖任何原生模块

安装方式

dsh plugin --profile web add github:CAPTAIN1275/dsh-ui-web/packages/skins/xp

配置项

本插件无需额外配置。安装后通过 monorepo 提供的 dsh-skin use xp 命令激活皮肤;同一时刻只允许一个皮肤处于激活状态,不需要任何开关或参数。

常见问题

Q: 启用 XP 皮肤会影响对话或模型请求吗?

A: 不会。皮肤只改动浏览器 DOM 与文档标题,不注入任何 Cordis 服务、不发送任何事件,也不会触及模型请求;卸载后 effect disposer 会逐一回滚全部写入。

Q: 皮肤中心「开始」按钮能弹出开始菜单吗?

A: 不能。它只是把点击事件转发给侧边栏底部已有的设置触发按钮(button[aria-haspopup="dialog"]),相当于复用原生设置入口,并不是真的开始菜单。

Q: 多个皮肤能同时启用吗?

A: 不能。同一时刻只允许一个皮肤激活,皮肤之间的互斥由 monorepo 的 scripts/dsh-skin 脚本(dsh-skin use xp)管理,切换到新皮肤时旧皮肤的 effect 会自动撤销。

Q: 加载页面(boot page)也会被换皮吗?

A: 启动页在外壳渲染时插件 bundle 还没就绪,整体仍走默认外观;属性一旦设置好,外壳会获得窗口边框,但启动页内部的卡片保留现代风格,皮肤只接管 UI 稳定后的区域。

Q: 切换深浅主题会回到非皮肤外观吗?

A: 不会。皮肤在浅色 data-dsh-xp 下渲染 Luna 蓝,在 body[data-dsh-xp][data-ds-dark-theme] 下渲染 Zune 风格黑色变体;切换外观主题只会在两套皮肤配色之间翻转,不会脱离皮肤。

Q: 卸载皮肤会留下残留 DOM 吗?

A: 不会。effect disposer 会逐一撤回写入:移除 data-dsh-xp 属性、删除标题栏和状态栏、移除「开始」按钮和任务栏样式、移除注入的 favicon;如果标题仍是皮肤自己写入的,还会一并恢复成原标题。

上手难度

入门 — 安装并执行一条激活命令即可使用,皮肤仅在浏览器端生效,没有配置项、没有副作用,卸载后无残留。

已知问题与限制

  • 加载页保持原样:外壳的启动页在插件 bundle 就绪之前就已渲染,皮肤从 UI 稳定后才生效,属性设置后启动页获得窗口边框,但内部卡片保留现代风格(README.md:42)
  • 主题切换被锁定在皮肤内部:皮肤同时固定浅色 Luna 和深色 Zune 两套配色,切换外观主题只会在两者之间翻转,不会回到非皮肤外观(README.md:43)
  • 「开始」按钮只打开设置:它把点击转发给侧边栏底部的设置入口,并不承载真正的开始菜单(README.md:44 / src/client/index.ts:125-127)
  • 四色旗标是平面近似:飘扬的 Windows 旗标以平面 2×2 色块呈现(内联 SVG),并非真实的波浪形 Logo(README.md:45 / src/client/index.ts:39-47)
  • 面板级装饰依赖 data-pane 属性:侧边栏标题带、资源管理器树行、任务栏底部、会话/详情面板的表面装饰依赖 ui-layout 中 AppFrame 列携带的 data-pane 属性;属性缺失时皮肤仍生效,只是缺少各面板专属表面(README.md:32)
dsh-ui-web/packages/skins/xp — DeepSeek Harness 插件 | deepseek-plugin.org