dsh-rightbar-quicknav:右側欄標籤的常駐豎排快捷導航

前言

DSH 的右側欄承載了大量能力:Files、Git、Tasks、Terminal、Browser、Image Studio、Memory 等,全部收在標籤條後面。想打開某個功能,得先點開「打開右側欄」按鈕,再在彈出的標籤條裏找到目標標籤,至少兩步。如果只是切一次標籤,這個成本並不划算。

dsh-rightbar-quicknav 就是針對這一步的插件。它由 zuoyunlai 維護,分類爲客戶端插件,在社區目錄中的星標數爲 0。下面介紹它的能力、安裝方式與使用邊界。

它做什麼

插件在宿主自己已有的「打開右側欄」按鈕正下方,掛一條常駐的豎排圖標軌。收起狀態只顯示 3 個圖標,需要時懸停即可展開全部標籤:

1、收起時只顯示 3 個圖標,幾乎是隱藏的,鼠標移上去才展開;
2、展開後列出當前可用的全部標籤;
3、懸停某個圖標時,出現一行標題氣泡;
4、點擊圖標直接打開右側欄並切到該標籤,一次點擊代替兩步操作。

標籤列表不是硬編碼的,而是從宿主自身的 tab registry(sidebarRightTabs.guide())讀取,因此任何註冊了標籤的插件都會自動出現在圖標軌裏。

安裝與啓用

通過插件管理器安裝(推薦)的做法是:在 Plugins → Add 中指向該包,可以是 npm tarball 或本地目錄,bundle patch 會把客戶端一半接進 Web / Desktop profile。

手動安裝的命令如下:

cd ~/.dsh/profiles/<your-profile>
pnpm add dsh-rightbar-quicknav

安裝完成後必須完整重啓 DSH。客戶端模塊在啓動時組合,僅刷新頁面不夠。

運行要求寫在 package.json 裏:

  • DSH >= 0.2.1-rc.1,需要 sidebarRightTabs / sidebarRight 客戶端服務;
  • React 由宿主提供,該插件自身沒有運行時依賴,也沒有構建步驟。

行爲細節

插件的幾何位置與交互方式如下表:

位置 視口右邊緣,10px 間距;在宿主「打開右側欄」按鈕下方 50px
收起 3 個圖標
展開 懸停觸發,指針移開後延遲 200 ms 收起
氣泡 單行、自適應寬度,空間不足時翻到另一側
跳轉 調用 sidebarRight.openTab(kind)
隱藏條件 右側欄已打開,或當前沒有會話顯示在屏幕上

設計與實現邊界

幾點值得說明的實現選擇:

  • 只掛載到 additive 的 shell.overlay 槽位,不覆蓋也不替換宿主自帶 UI;
  • 視覺全部使用 inline React 樣式,因爲宿主不提供 styles 服務,基於 class 的 CSS 會靜默失效;
  • 幾何跟隨是事件驅動的(MutationObserver + ResizeObserver),穩態下無輪詢、無強制佈局;
  • 錨點是宿主自己的按鈕,通過穩定屬性 data-sidebar-right-expand 定位,有 aria-label 兜底;兩者都不匹配時圖標軌退回默認位置並打一條 warning,不消失也不掛錯位置;
  • 鍵盤可達:圖標軌是 toolbar,使用 roving tabindex 與方向鍵,Esc 關閉氣泡,焦點輪廓只在鍵盤聚焦時顯示;
  • 尊重 prefers-reduced-motion;渲染期異常由 ErrorBoundary 捕獲,不會讓槽位空白;
  • UI 文案中英雙語,宿主提供 locale 命名空間時註冊在 rightbarQuicknav 下。

倉庫裏還帶了一輪完整審計及後續修復記錄,包括總審計、交互與可訪問性評審、性能與資源評審、逐項修復臺賬四份文檔。

開發與發佈流程

插件自帶零依賴的渲染冒煙測試:

node --check client.js     # 語法檢查
node --test tests/         # 渲染冒煙測試

測試加載真實的 client.js,用最小 React stub 驅動插件自身的 apply() → slots.inject → slots.register 路徑,斷言渲染與副作用不拋異常。README 提到,這個測試存在的直接原因是曾經有一個 effect 裏的未定義變量讓整條圖標軌靜默消失。

發佈只由 CI 執行,流程爲:

1、同時提升 package.json 的 version 與 client.js 的 VERSION 常量,兩者必須一致;
2、在 CHANGELOG.md 增加 ## [x.y.z] 小節;
3、提交到 main;
4、git tag vX.Y.Z && git push origin vX.Y.Z。

推送 tag 後由 .github/workflows/publish.yml 執行版本一致性校驗、語法檢查與測試,並以 npm Trusted Publishing(OIDC)加 provenance 聲明發布,不使用 NPM_TOKEN。工作流還會等待 npm 真正提供該版本後才判定成功,避免 npm publish 返回成功但版本尚在處理隊列裏造成的假綠。本包故意不提供本地 npm publish:其發佈權限要求 2FA 且拒絕繞過 2FA 的 token,本地發佈只會進隊列。

適用場景與注意

適合需要頻繁切換右側欄標籤、且希望少一次點擊的 DSH 使用者,尤其是右側欄被多個插件擴展過的項目。

使用前有兩點需要留意:

1、插件以當前 DSH 進程的權限運行,安裝啓用前應自行檢查源碼與許可證(本包爲 MIT);
2、DSH 低於 0.2.1-rc.1 時所依賴的客戶端服務不可用,插件不會生效。

結語

這個插件的價值很窄:它只解決右側欄標籤切換的一步操作,不做更多事。標籤列表隨宿主註冊動態變化,實現上不侵入宿主 UI,也不引入運行時依賴,是小改動邊界劃得清楚的一個例子。

目錄頁:https://www.skillhub.cn/plugins/zuoyunlai/dsh-rightbar-quicknav

代碼倉庫:https://github.com/zuoyunlai/dsh-rightbar-quicknav

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

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

小夜