FelixJiashengFu/dsh-preview-theme

FelixJiashengFu/dsh-preview-theme

为 DSH 内置侧边栏的 PDF、转为 PDF 的 Office 文档及表格预览提供配色预设与自定义纸张底色,支持深色模式亮度调节和本地保存偏好;只改变显示,不修改文件。

主题与外观

预览配色(dsh-preview-theme)

给 DeepSeek Harness 的侧边栏文档预览换纸张底色:PDF、Word(docx/doc,经 LibreOffice 转 PDF)和 Excel(xlsx/xls/csv/tsv)都能一键变成「黑底白字」,也可以选护眼米黄、豆沙绿、淡蓝、午夜蓝等, 或者用取色器调任意颜色。只改显示,不改文件——所有改动都是浏览器里的 CSS,原文件一个字节都不会动。

纯黑(黑底白字) · 护眼米黄 ·

Excel 黑色 · Excel 淡蓝 ·

支持的文件类型

格式 · 预览方式 · 是否支持 .pdf · 内置 pdf.js 画布 · 支持 .doc / .docx · Host 用 LibreOffice 转成 PDF 后走 PDF 预览 · 支持 .ppt / .pptx · 同上(转 PDF) · 支持 .xlsx / .xls · FortuneSheet 表格(浏览器内解析) · 支持 .csv / .tsv · 表格预览(切到纯文本时不套用配色) · 支持 图片 / Markdown / 代码 / HTML · 其它预览器 · 不在本插件范围

安装

从 npm 安装

在 DSH 的「插件」页面选择「添加插件」/「安装第三方插件」,输入 dsh-preview-theme 并安装、启用。 如果界面没有立即变化,刷新页面。也可以在完全退出 DSH 后,用其 CLI 安装:

dsh plugin --profile desktop add dsh-preview-theme

然后重新启动 DSH。Web 配置请把 desktop 换成 web。卸载时使用 dsh plugin --profile desktop remove dsh-preview-theme。

从本地源码安装

将仓库克隆到一个稳定位置,例如 ~/.dsh/plugins/dsh-preview-theme,然后在插件页面输入该目录的 绝对路径,或用 CLI 执行 dsh plugin --profile desktop add /绝对路径/dsh-preview-theme。 本地路径安装会链接该目录,因此安装后不要移动或删除它。

使用

打开右侧边栏里的 PDF / Word / Excel 预览,预览标题栏(路径那一行)最右边会多一个调色盘按钮:

  • 点开就是配色面板:原色 / 纯黑 / 墨黑 / 深灰 / 午夜蓝 / 墨绿 / 护眼米黄 / 豆沙绿 / 淡蓝 / 淡粉 / 自定义;
  • 「自定义」用系统取色器选任意颜色,深色自动变黑底白字、浅色自动变浅底深字;
  • 深色方案多一个亮度滑杆(70%–120%),觉得白字太亮可以调暗;
  • 选过的配色会记住(localStorage),重启/刷新后仍然生效;
  • 点「原色」或「恢复默认」就完全还原成默认外观。

改动是全局预览配色:换一个文件、换一个标签页都沿用;想只临时看一个文件时,看完点回「原色」即可。

配色表

名称 · 色值 · 效果 原色 · — · 关闭插件效果(白色纸张 + 浅灰底) 纯黑 · #000000 · 纯黑纸、白字 墨黑 · #0b0f14 · 近黑(偏冷) 深灰 · #1f2126 · 炭灰纸、浅字 午夜蓝 · #101b2d · 深蓝纸、白字 墨绿 · #101f17 · 深绿纸、白字 护眼米黄 · #f4ecd8 · 米黄纸、黑字 豆沙绿 · #cce8cf · 护眼绿纸、黑字 淡蓝 · #dbe7f5 · 淡蓝纸、黑字 淡粉 · #f6e3e5 · 淡粉纸、黑字 自定义 · 任意 · 按亮度自动选深色/浅色方案

原理(为什么不用改预览器)

内置预览包 @deepseek-ai/dsh-client-ui-sidebar-documentpreview 在 DOM 上留了稳定的 data-* 钩子:

  • [data-textpreview-body]:预览滚动区;
  • [data-pdf-preview]:PDF / Word / PPT 的页面容器(每页是一个 canvas + 透明文字层);
  • [data-excel-preview]:表格容器(FortuneSheet 画布 + 公式栏 + 工作表标签)。

本插件做两件事:

  1. 纸色:覆盖主题 token --dsw-alias-bg-document-preview(通过 ctx.theme.overrideTokens,

官方扩展点,写成 body 内联变量,不跟内置样式抢优先级);

  1. 页面内容:
  • 浅色纸:给 canvas(PDF)/ 表格子元素(Excel)加 mix-blend-mode: multiply —— 白纸乘上纸色变成纸色,黑字仍是黑字;
  • 深色纸:先 filter: invert(1) hue-rotate(180deg) 把白纸/黑字翻成黑纸/白字,再 mix-blend-mode: screen

把页面底色染成所选深色(白色文字保持不变)。hue-rotate(180deg) 让图表和图片的颜色尽量保持原色相。

插件只注册一个标题栏按钮(文档预览的 sidebar.right.tab.document.actions 槽位)和一段样式表, 关掉/卸载后样式与 token 覆盖都会被清理干净。

限制

  • 只影响内置预览。「近期成品」等其它位置里用系统 PDF 查看器 iframe 显示的 PDF 不在可样式化范围内。
  • 深色方案会反转文档里的图片/图表颜色(hue-rotate 只能近似还原色相),这是所有「反色阅读模式」的通病。
  • Excel 是整块画布渲染,深色模式下公式栏、工作表标签会跟着一起反色(通常正是想要的效果);不支持只改单元格区域。
  • 预览的 data-* 属性属于 DSH 内部实现,升级 DSH 大版本后如失效,重新适配即可(test/check-bundle.mjs 可做冒烟检查)。

开发与验证

node test/check-bundle.mjs # 无需浏览器:校验 bundle 契约、样式选择器、槽位注册 node --check lib/client.js # 语法检查

客户端半边修改后是热重载的(安装后 <1s 生效);Host 半边是空实现,不需要重启。

目录

dsh-preview-theme/ package.json # dsh.bundle.patch + dsh.client(无构建步骤) cordis.patch.yml # Host 行(空实现,只为让 Loader 挂载并下发 client bundle) lib/index.js # Host 半边:空 apply lib/client.js # 全部功能:样式、token、标题栏按钮、配色面板(纯 React.createElement) locale/{zh,en}.json # 插件管理里显示的名称/描述 icon.svg # 插件图标 docs/*.png # 效果图 test/check-bundle.mjs # 静态冒烟测试 README.md # 本文件