dsh-sidebar-fold-zxp
把 DSH 左侧那排插件入口折起来、按组归类、按你定的顺序排,把高度还给工作区与会话列表。
装上之后左栏大致是这样:
▾ 插件列表 ← 点一下,下面全部收起
▾ 日常 2
│ 打开工作台(任务 / 日历 / 知识库 / 点子)
│ 插件市场
▾ 开发 2
│ 任务看板
│ 自动化任务
▸ 统计与记忆 2 ← 收起状态,箭头朝右
(「更多」这类外壳自己的入口会被隐藏)
为什么需要它
DSH 的 sidebar.panellist 是一个列表槽:每装一个带入口的插件就多一行,每行约 46px。装到七八个之后,光这排入口就吃掉三分之一的高度,下面的工作区/会话列表被压得只剩一点。
外壳对这批入口没有任何折叠或溢出逻辑——panels.map() 有几个排几个,也没有「隐藏他人」的接口。所以只能由插件自己做。
怎么用
侧栏:点「插件列表」收起整块;点某个组标题收起/展开那个组。
设置 → 插件列表:
- 新建分组、改名、删除、调整组顺序
- 把条目拖到别的组,或拖到某一行前面换位置
- 也可以用下拉框和 ↑ ↓ 精确调整(键盘更顺手)
- 每行还有一个三态选择:跟随折叠(默认,折叠时一起收起)/ 折叠时仍显示(折叠后它还在)/ 始终隐藏(一直不出现)
它是怎么做到的
外壳用 React 渲染那些行,所以:
- 排序用 CSS
order,不移动 DOM 节点——移动会被下一次渲染复原; - 隐藏用内联
display,不用hidden属性——行上的类设了display: flex,会盖掉浏览器对[hidden]的默认样式; - 组标题是本插件自己创建的节点,插进外壳的
nav里;外壳重渲染把它冲掉时,观察者会补回来; - 点组标题在捕获阶段拦截并
stopPropagation,否则外壳会拿本插件的 id 去selectPanel,而它没有对应的面板; - 折叠状态先存本地再往宿主保存——保存失败不该让一次点击看起来毫无反应。
配置存在 ~/.dsh/dsh-sidebar-fold-zxp/settings.json(分组与顺序),折叠状态和设置页的交互状态存在当前页面。
接口
宿主侧只有三个:
GET /api/dsh-sidebar-fold-zxp/settings 读配置
PUT /api/dsh-sidebar-fold-zxp/settings 写配置(原子写)
GET /api/dsh-sidebar-fold-zxp/plan?entryIds= 按当前条目算布局
排序规则全部在 src/plan.js 与 src/edits.js 里,是纯函数,node --test 覆盖(40 项)。
边界与已知限制
- 需要 DSH ≥ 0.2.1-rc.1。
- 改完代码要彻底退出桌面端再打开,只刷新页面不够:客户端插件按
?rev=<文件元数据哈希>加载,响应头是immutable(缓存一年),桌面端会一直吃旧缓存。 - 它只动自己之外的兄弟行的样式,不改任何插件的注册、图标或点击行为;卸载时把改过的行原样还回去。
- 如果 DSH 换了左栏的 DOM 结构(行不再是
nav > button),折叠会失效——失效方式是「什么都不做」,不会弄坏界面。
许可
MIT