前言¶
在 DeepSeek Harness(DSH)的客戶端界面中,側邊欄頂部的「全局面板條目」會佔用固定高度。宿主 @deepseek-ai/dsh-client-ui-sidebar 的渲染結構裏,nav.panelList 使用 flex:none,條目越多它越高,下方的工作區 div.regionArea 就會被擠壓。手機端抽屜本身很矮,條目一多直接把工作區擠沒了;桌面端條目數一樣,只是相對沒那麼明顯。爲了在不改動核心、不覆蓋其他插件的前提下解決這個問題,出現了 dsh-sidebar-panels-fold 插件。
這是什麼¶
dsh-sidebar-panels-fold 是一個客戶端插件,把側邊欄左上角的全局面板條目摺疊成一行,並提供勾選「只顯示哪幾個」的能力。手機端與桌面端使用同一套規則。插件通過 slot 數據與 DOM 屬性工作,不註冊、不覆蓋任何 slot,只控制顯示狀態——被收起的條目仍然註冊、仍然可以按 id 選中,插件功能完全不變。
核心功能¶
- 摺疊顯示:把側邊欄的全局面板條目收起到一行,減少佔用高度。
- 篩選面板:通過勾選方式指定只顯示哪些面板,其餘隱藏。
- 自動模式:根據側邊欄寬度自動保留前 N 條,無需手動配置。
- 持久化存儲:選擇保存在
localStorage['dsh.sidebar-panels-fold.v1'],下次打開保持狀態。 - 多端統一:手機端與桌面端使用同一套規則和存儲。
工作機制¶
插件通過五層機制實現上述功能:
數據面:讀取權威清單 ctx.slots.entriesOfSlot('sidebar.panellist'),返回 [{ id, order, label }],其中 label 支持 thunk,跟隨語言。
定位面:通過三級策略定位目標 DOM 元素:
- L1:命中 nav[data-dsh-pf-nav] 標記
- L2:直接子 <button> 的 aria-label 與槽位 label 集合匹配
- L3:結構兜底,父級 flex 且 flex-direction:column、自身 ≥2 個直接 button 子節點、且存在 overflow:hidden 的兄弟
呈現面:給每個行 <button> 打上 data-dsh-pf-row、data-dsh-pf-id、data-dsh-pf-shown="0|1" 屬性,插件自身的 <style> 用 [data-dsh-pf-row][data-dsh-pf-shown="0"]{display:none!important} 收起。
交互面:在 nav 末尾掛一個自有觸發器(data-dsh-pf-trigger),點擊後彈出自建彈層,提供全部顯示/全部收起/恢復默認/逐項勾選選項,選擇存入 localStorage。
守護面:使用 MutationObserver(React 重渲染會抹掉屬性)、ResizeObserver、matchMedia 監聽變化。手機抽屜↔桌面常駐列、寬態↔56px 軌道、語言切換、面板動態註冊後都會重新收斂。
策略與默認值¶
自動模式下(未做顯式選擇),插件會根據形態保留前 N 條:
| 形態 | 判定 | 保留 |
|---|---|---|
| 軌道(rail) | nav 寬度 ≤ 72px |
3 |
| 窄屏 | matchMedia('(max-width: 1023px)') 命中 |
2 |
| 寬屏 | 其餘 | 4 |
當前正在使用的面板(aria-current="page")永遠可見,避免「面板在用、行卻不見了」。
存儲¶
localStorage['dsh.sidebar-panels-fold.v1'] = { pinned: string[] \| null, showAll: boolean }
pinned: null→ 自動模式pinned: string[]→ 只顯示這些 idshowAll: true→ 全部顯示
讀失敗(隱私模式/髒數據)一律回落默認,不影響頁面。
降級策略¶
- 4 秒內找不到
nav:不隱藏任何條目(頁面行爲 = 原樣),期間低頻重試。 - 超過寬限期仍找不到:
console.warn一次,說明「摺疊能力暫不可用,其餘不受影響」。 localStorage不可用:選擇只在本次會話生效。
卸載¶
移除觸發器/彈層/<style>,並摘掉所有 data-dsh-pf-* 屬性,側邊欄回到宿主原樣。
安裝與啓用¶
在命令行中執行:
dsh plugin add github:xintingcui/dsh-sidebar-panels-fold
或在插件市場的 UI / 界面增強分類裏直接安裝。倉庫是純 JS,無構建步驟、無運行時依賴。
適用場景與注意¶
適合需要精簡側邊欄、避免面板條目過多擠壓工作區的 DSH 用戶。插件以當前 dsh 進程權限運行,安裝前應檢查源碼與許可證。
短結尾¶
dsh-sidebar-panels-fold 通過數據面、定位面、呈現面、交互面、守護面五層機制,在不改動核心、不覆蓋其他插件的前提下實現側邊欄面板摺疊與篩選功能,幫助在手機和桌面端都獲得更充裕的工作區空間。目錄頁:https://www.skillhub.cn/plugins/xintingcui/dsh-sidebar-panels-fold
GitHub:https://github.com/xintingcui/dsh-sidebar-panels-fold