dsh-eva-skin:給 DSH Web UI 換一套 EVA 賽璐璐皮

前言

DSH 的理念是「一切皆插件」,插件數量多了之後,界面本身的觀感就變得不太可控:控制台是深色,Web UI 是另一套令牌,左邊會話列表和右側跳轉條的狀態全靠顏色區分,長期用下來很難一眼看出哪個會話在跑、哪個在等人回覆。想改外觀,又怕改主題把官方改版後的界面弄壞。

dsh-eva-skin 就是爲這個場景做的一套純客戶端皮膚:墨線描邊、硬投影、CRT 掃描線、會話狀態軌,全部靠覆蓋官方設計令牌實現,不渲染組件、不註冊服務、不碰官方類名。它由 luwendi-qq 維護,npm 包名爲 @winstonlu/dsh-eva-skin,當前版本 1.0.56,許可證 MIT。

下面介紹它的能力邊界、安裝方式、配置項和自定義底圖的做法。

它能做什麼

插件只往 <head> 裏放一張樣式表,通過覆蓋官方 --dsw-* 設計令牌生效。因爲不依賴 CSS-in-JS 哈希類名,官方改版、換類名、加頁面,最壞情況是一條裝飾失效,不會把界面改壞。實際效果:

  • 配色固定爲 EVA 色板:初號機紫 #7B4BD8、零號機藍 #2E6BE6、二號機紅 #E8322D、熒光綠 #B4FF39、警示黃 #FFD400,墨黑描邊 #04040A。
  • 形狀統一爲方角 + 墨線,投影用無模糊硬投影(box-shadow: n n 0),不做模糊暈染。
  • 全屏 CRT 掃描線,可以關掉;選中標籤頁改成墨底熒光字。
  • 左欄會話行加 3px 狀態軌:綠=運行中(帶呼吸動畫)、黃=已完成、紅=等你回覆。
  • 右側跳轉條用熒光綠刻度,懸停變亮,當前條爲警示黃。
  • 底圖可選一張壓暗的背景圖,默認關閉。

需要說明的是,插件不覆蓋任何組件結構,只用到兩個錨點:側欄會話行的 data-row-key^="session:" 和跳轉條的官方語義錨點。其他樣式都是令牌級別的替換。

安裝與啓用

插件市場裏搜 dsh-eva-skin 即可,或讓 agent 直接裝:

plugin_manager install_bundle @winstonlu/dsh-eva-skin

如果沒有 npm 包,走 git:

plugin_manager install_bundle git+https://github.com/luwendi-qq/dsh-eva-skin#<commit>

本地開發用的裝法:

plugin_manager install_bundle file:/絕對路徑/winstonlu-dsh-eva-skin-1.0.0.tgz

裝完在插件頁啓用,刷新一次頁面就能看到效果。純 CSS 改動只需刷新,不必重啓。卸載走插件頁按鈕,或者:

plugin_manager remove_bundle @winstonlu/dsh-eva-skin

dispose() 會移除樣式表、開關屬性、底圖層和角標,不殘留。

配置項

在 profile 的 cordis.patch.yml 裏給 dsh-eva-skin 那一行加 config,全部可選:

- id: dsh-eva-skin
  config:
    scanlines: true    # 掃描線,默認 true
    hardShadow: true   # 無模糊硬投影,默認 true
    forceDark: false   # 強制暗色,默認 false
    backdrop: false    # 背景圖,默認 false

如果打算自己寫插件,有個坑要提前避開:配置要從 apply(ctx, config) 的第二個參數拿。cordis 裏 config 是服務,沒在 inject 裏聲明就讀 ctx.config 會拋 cannot get property "config" without inject;apply 拋錯後條目永遠停在 loading,桌面端啓動審計會把非 active 條目當致命錯誤,直接重啓 app。

自定義底圖

插件包內默認內嵌一張本地 AI 生成的同人風格插畫(WebP 數據存在 lib/client.js 裏)。想換圖就跑倉庫裏的腳本:

./tools/set-background.sh 你的圖.png 0.95   # 第二個參數是亮度,省略默認 0.62
# 輸出 ~/.dsh/backups/pkgs/dsh-eva-skin-<version>.tgz
plugin_manager install_bundle file:~/.dsh/backups/pkgs/dsh-eva-skin-<version>.tgz

腳本會把圖壓到 1536 寬、轉 WebP q74,內嵌進 lib/client.js 再打進包裏。如果不打算內嵌圖片(比如要發佈到公共 npm),先跑 ./tools/strip-background.sh,它會把 data URI 換回純 CSS 漸變底,包體從約 130KB 降到約 25KB。

開發流程用這三行:

node --check lib/client.js
node ~/.dsh/dsh-runtimes/dsh-primary-runtime/dependencies/pnpm/bin/pnpm.cjs pack --pack-destination ~/.dsh/backups/pkgs
plugin_manager install_bundle file:$HOME/.dsh/backups/pkgs/winstonlu-dsh-eva-skin-<ver>.tgz

改完刷新頁面即可(unlag 刷新按鈕,或在右鍵菜單裏允許 agent 自己刷新)。

兼容性與注意事項

  • 需要 DSH >=0.2.0-rc.2(engines.dsh)。
  • 僅 Web 客戶端(dsh.client.platform: "web");桌面端和瀏覽器端共用同一份 UI。
  • 插件以當前 dsh 進程權限運行,安裝前建議先讀一遍源碼和 LICENSE。許可證是 MIT,但 EVA / 新世紀福音戰士的角色與機體版權歸 khara / 庵野秀明所有,本項目只是配色致敬,不包含任何官方素材。
  • 純外觀插件,不改行爲、不註冊服務,如果只是想換風格可以裝;對狀態軌、跳轉條顏色有強依賴的自動化腳本,改之前先確認語義錨點沒變。

如果你的需求只是讓 Web UI 看起來更接近 EVA 的賽璐璐質感,這套皮膚的實現方式和代價都比較透明:一個樣式表、幾個可選開關、一條可選的底圖流程。目錄頁在 https://www.skillhub.cn/plugins/luwendi-qq/dsh-eva-skin,源碼在 https://github.com/luwendi-qq/dsh-eva-skin。

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜