dsh-panellist-collapse:摺疊左側欄「全局面板」列表,且不動皮膚動圖

前言

DSH 的左側欄上部是一塊區塊:orca-link 皮膚的動圖,下面是「全局面板」列表(插件 / 任務看板 / 技能中心 / 智能體 / Git / SSH / 更多)。列表固定 7 項,內容多了之後側欄縱向空間被喫掉不少,工作區往下推。

常見的改法是直接收起整列,或者改皮膚樣式。前者一刀切,展開要再點一次;後者改的是皮膚文件,動圖舞臺的 margin-top 很容易被連帶刪掉,工作區頂上去蓋住動圖。下面介紹的 asdw159632/dsh-panellist-collapse 走的是第三條路:在列表後面插一條很薄的摺疊條,摺疊時只隱藏多餘行、只收高度,動圖位置完全不動。


這是什麼

一個本地 harness 插件 bundle,包名 @local/dsh-panellist-collapse,維護者 asdw159632,分類爲客戶端。Host 半區是空的 apply(),Client 半區實現全部邏輯:摺疊條的 DOM、摺疊樣式、body 屬性同步、locale 字典,以及用 MutationObserver 維持注入節點位置。

解決的問題只有一個:側欄「全局面板」列表太長,要一個展開/收起入口,按鈕放在「工作區」上方,且摺疊時不要動它上方的皮膚動圖。

核心功能

摺疊目標不是列表容器,而是列表內的行。摺疊時只保留前 KEEP_ROWS 行,默認 1 行,也就是隻剩「插件」按鈕;其餘 6 行隱藏。列表容器和它的 margin-top 完全不動。

摺疊條插在面板列表之後、工作區之前。這個位置沒有官方槽位,所以用 DOM 插入加 MutationObserver 觀察 document.body:宿主重渲染把節點移除後自動重新插回,自身插入不會觸發無變化循環。

保留列表的 margin-top 是這個插件最關鍵的一點。orca-link 皮膚的動圖舞臺靠列表這條 margin 撐出來:

margin-top: calc(var(--orca-stage) - 116px)

如果用 display:none 摺疊列表,margin 會一起被刪掉,動圖舞臺塌掉、工作區頂上去蓋住動圖。因此摺疊改用 height: 0 + overflow: hidden 收高度,margin 保留,動圖停留在原處。

摺疊狀態寫入 localStorage['dsh.panellist.collapsed'],刷新或重啓後保持。文案通過 Client locale 服務註冊 zh / en 兩種,tooltip 分別是「收起面板列表」「展開面板列表」。側欄窄條(rail)模式下列表本就不可見,摺疊條按列表寬度判斷後自動隱藏。

想只放幾個按鈕時改 client.js 頂部的常量即可,刷新頁面即生效:

const KEEP_ROWS = 1; // 1 = 只留「插件」;2 = 插件 + 任務看板;3 = 再加技能中心

目錄內容

文件 作用
package.json bundle 清單:dsh.bundle.patch + dsh.client(platform: web、immediately)
cordis.patch.yml 插入一行 panellist-collapse(bundle 身份)
index.js Host 半區:export function apply() {}
client.js 全部實現:摺疊條 DOM、摺疊樣式、body 屬性同步、locale 字典、MutationObserver 維護位置
locale/en.json / locale/zh.json 插件管理界面裏的標題/描述(meta.title / meta.description)
icon.svg 原創圖標

package.json 中與運行相關的字段:

"dsh": {
  "bundle": { "patch": "./cordis.patch.yml" },
  "client": {
    "platform": "web",
    "immediately": true,
    "inject": ["@deepseek-ai/dsh-client-ui-sidebar"]
  }
}

安裝與啓用

README 提供的安裝與卸載命令如下。注意這裏 target 填的是本倉庫目錄的絕對路徑,不是倉庫名:

plugin_manager install_bundle target="<本倉庫目錄的絕對路徑>"
plugin_manager remove_bundle target="@local/dsh-panellist-collapse"

本地目錄使用 pnpm link。改完 client.js 後刷新頁面即可生效,不需要重裝。

安裝後按 README 的驗證記錄檢查兩點:一條是 plugin_manager install_bundle 返回 application: applied、warnings: [],Host 組合裏出現 include:panellist-collapse;另一條是瀏覽器裏摺疊條落在「更多」行下方、工作區標題上方,居中一個箭頭。

典型用法

README 中記錄了 2026-10-29 的一次實測,宿主 0.2.1-rc.3,皮膚 orca-link,訪問 http://127.0.0.1:1344:

  1. 點擊摺疊條,只保留「插件」一行,其餘 6 行隱藏;
  2. 動圖停在原處不動,工作區緊接在剩餘那一行下方;
  3. 再點一次展開,佈局完全恢復原狀;
  4. 摺疊狀態刷新後保持,控制台沒有本插件的報錯。

日常使用不需要改代碼。默認行爲就是摺疊後只留「插件」一行。想多放一項就改 KEEP_ROWS,改成 2 就是「插件 + 任務看板」,改成 3 再加「技能中心」,以此類推。

實現上的坑

README 的迭代記錄裏記了四點,按發現順序列在這裏,方便評審和二次開發時避雷。

  1. 按鈕位置:初版掛在側欄底部擴展位 sidebar.footer.action,反饋說位置不對、離列表太遠;同時初版用 display:none 摺疊,把列表 margin 一起刪了,動圖舞臺塌掉。後來按鈕移到列表與工作區之間,摺疊改爲 height:0 + overflow:hidden 保留 margin。

  2. 摺疊目標:[data-slot="sidebar.panellist"] 是逐面板項的座位,隱藏它只掉圖標、文字還在,並不是列表容器。摺疊目標改用 [class*="panelList"]。

  3. 導航選擇器:nav[role="navigation"] 匹配不到,「navigation」是 <nav> 的隱式角色,元素上沒有這個屬性。選擇器和 findNav() 都改成實際存在的 [class*="panelList"],兜底用 [data-dsh-surface="sidebar"] nav。

  4. 節點被重渲染移除:宿主 DOM 重渲染可能刪掉注入節點,用 MutationObserver 觀察 document.body,發現摺疊條不在列表後面就重新插回。

適用場景與注意

適合這類情況:皮膚在側欄上部放了一塊依賴列表 margin 撐位置的內容,同時面板列表項多、側欄縱向空間緊張。此時不適合直接收整列,也不適合改皮膚樣式。

需要注意三點:

  1. 依賴宿主 DOM 結構。選擇器用的都是語義片段([class*="panelList"]、[data-dsh-surface="sidebar"]、nav),沒有用 hash 前綴,但上游若大幅調整側欄結構,需要跟着改一行選擇器。換其他皮膚不影響位置,摺疊條跟着列表走。
  2. 動圖不歸它管。摺疊或展開都不會改動畫圖的樣式或位置,這是設計目標,不是遺漏。
  3. 插件以當前 dsh 進程權限運行。安裝前應打開倉庫確認源碼內容,並確認許可證(本倉庫爲 MIT,Copyright (c) 2026 asdw159632)。另外這個倉庫是從開發工作區 DSH-custom/mods/sidebar-panellist-collapse/ 發佈的獨立副本,改動以本倉庫爲準。

結尾

這個插件的價值不在功能多,而在一條邊界處理得乾淨:摺疊面板列表的同時不碰皮膚動圖的舞臺。對側欄縱向空間緊張、又不想改皮膚文件的人來說,是一個可以本地裝上、改一行常量自定義保留項的輕量方案。

  • 目錄頁:https://www.skillhub.cn/plugins/asdw159632/dsh-panellist-collapse
  • GitHub:https://github.com/asdw159632/dsh-panellist-collapse
羽毛球分组比赛记分
小程序二维码

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

小夜