dsh-sidebar-nav-scroll:給側邊欄全局面板列表限高

前言

DSH 的側邊欄裏有一個「全局面板」列表,依次是插件、插件市場、歸檔會話、自動化任務、IM機器人、Worktree Space、記憶系統、更多。列表條目固定展示,不參與滾動,因此條目變多或字體變大時,它會把下方的工作區擠小。想看到工作區內容,只能自己去改瀏覽器樣式。

下面介紹的 dsh-sidebar-nav-scroll 就是把這段列表限制爲自身自然高度的一半,溢出部分內部滾動,省下來的高度讓給工作區。它由 Ghostdu-AI 維護,是一個 DSH 客戶端插件(bundle),只作用於 Web 端。

它做了什麼

工作機制:瀏覽器端在運行時測量每一行的真實高度和真實的 row-gap,再按 fraction 算出上限,不寫死像素值,宿主改樣式時也不會算錯。

實現上有幾點值得說明:

1、自然高度由行元素本身累加得到,不讀 scrollHeight,所以上限生效後測量結果不會自我影響。
2、上限通過注入樣式表裏的自定義屬性 --dsh-sidebar-nav-scroll-cap 傳值,側邊欄摺疊成窄條時,樣式表裏的摺疊保護規則可以穩定覆蓋它。
3、列表定位不依賴宿主的 CSS Module 類名:先找任意 panelRow 行元素,取它最近的 <nav> 就是面板列表,找不到時纔回退到類名匹配。
4、側邊欄摺疊時([data-sidebar-collapsed] 或摺疊態類名)自動不設上限。
5、省下的高度不需要額外佈局補丁。側邊欄面板列表是 flex: none,工作區是 flex: 1,限高後空出的空間自然由工作區接管。

安裝與啓用

這是一個 DSH 客戶端插件,dsh.client.platform = "web"。打開 DSH Web 側邊欄的「插件」→「已安裝插件」→「添加插件」,填入下面任意一種 spec(installBundle 接受 pnpm add 支持的所有寫法):

github:Ghostdu-AI/dsh-sidebar-nav-scroll
https://github.com/Ghostdu-AI/dsh-sidebar-nav-scroll.git
Ghostdu-AI/dsh-sidebar-nav-scroll

安裝並啓用後,側邊欄的全局面板列表立即被限高,不需要重啓 DSH。

如果要改源碼做開發,可以先 clone 到本地,再用 link: 指向目錄:

git clone https://github.com/Ghostdu-AI/dsh-sidebar-nav-scroll.git
# 在「添加插件」裏填 link:/絕對路徑/dsh-sidebar-nav-scroll

開發時修改 client.js 保存,宿主會檢測到變化並給插件推一個新的 revision,瀏覽器端熱重載該插件。

私有倉庫

私有倉庫需要宿主已配置好對應的 git 憑據。installBundle 的連通性預檢(git ls-remote)會禁用憑據助手與交互提示,因此私有倉庫應優先用本地路徑安裝。

配置

在 DSH Web 側邊欄點「插件」,在「已安裝插件」裏找到「側邊欄面板列表限高」,點標題進入它的頁面,就能看到設置卡片:

  • 高度上限(佔自然高度的比例):滑塊,5%–100%
  • 至少保留幾行:數字輸入,0 表示不限制
  • 啓用限高:勾選框
  • 恢復默認:清掉已保存的值

改動即時生效,不需要重載頁面。卡片、控制台 API 和別的標籤頁寫的是同一個鍵,任何一方改動,側邊欄高度上限都會跟着變。

配置爲什麼存放在瀏覽器側

宿主側的 patch 行無法把配置送進瀏覽器,dsh.client 的啓動圖譜只帶 id/url/rev/inject/immediately/external,所以設置存放在瀏覽器側。卡片只是這份存儲的可視化入口,控制台可以直接改:

__DSH_SIDEBAR_SCROLL__.set({ fraction: 0.4, minRows: 3 })  // 改成自然高度的四成,至少三行
__DSH_SIDEBAR_SCROLL__.status()                          // {attached,collapsed,rows,naturalHeight,capHeight}
__DSH_SIDEBAR_SCROLL__.reset()                           // 回到默認值

底層存儲是 localStorage["dsh-sidebar-nav-scroll"],例如:

{"fraction":0.5,"minRows":2,"enabled":true}

取值範圍與優先級:

1、fraction:0.05–1。
2、minRows:至少完整顯示多少行,按測得的行高計算下限。
3、enabled: false:完全停用插件並還原側邊欄。
4、優先級爲 localStorage > 插件 apply(ctx, config) 收到的 config > 內置默認值(fraction: 0.5、minRows: 2、enabled: true)。

設置卡片註冊在插件頁的 plugins.bundle.config 槽位上(鍵是本包的包名),組件是普通 React 組件,不依賴插件的 configForms 服務。宿主版本沒有這個槽位時卡片不會出現,控制台接口照舊可用。

適用場景與注意

適合這些情況:

1、側邊欄全局面板條目變多,工作區被擠到只剩很小一塊,又不想改宿主樣式。
2、需要按自己的字體或縮放比例調整列表高度,而不是寫死像素。
3、想要保守的默認值(自然高度的一半、至少兩行),再按需要調。

需要注意:

1、插件以當前 DSH 進程權限運行,安裝前應檢查源碼與許可證(MIT)。
2、只作用於 Web 端;桌面殼內置的瀏覽器同樣適用。
3、配置存在 localStorage 裏,瀏覽器側 origin 變化時會丟失,與宿主其它瀏覽器端插件一致。
4、設置卡片依賴插件頁的 plugins.bundle.config 槽位,0.1.7 及之後的插件頁提供;更早的版本只有控制台接口。

結尾

這個插件解決的是單點問題:讓側邊欄面板列表收起高度、內部滾動,把工作區還給用戶。運行時測量行高和 row-gap 的做法,讓它對宿主樣式變化比較穩。

目錄頁:https://www.skillhub.cn/plugins/Ghostdu-AI/dsh-sidebar-nav-scroll

GitHub:https://github.com/Ghostdu-AI/dsh-sidebar-nav-scroll

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

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

小夜