blockman0321/dsh-sidebar-overlay ↗★ 0
dsh-sidebar-overlay
Floating sidebar overlay for DSH: an independently rendered workspace/session browser mounted in the official shell.overlay seat, without touching the official sidebar or grid. 独立渲染的 DSH 浮动侧边栏:不碰官方侧边栏与 grid。 适合需要最大化对话区域并快速切换会话的桌面端用户。
설치
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:blockman0321/dsh-sidebar-overlay使用
折叠侧边栏(Ctrl+B 或点标题栏左侧按钮),把鼠标移到窗口左侧
(对话区 header 下方那一段)即可浮出。
热区是一个矩形:
- 上边界:对话内容容器的顶边 —— 也就是对话区 header 的底边。
「对话 / 轨迹」tab、会话标题、面包屑那一条(官方
min-height: 76px) 以及更上方的窗口标题栏都不在热区内,点它们不会浮出侧边栏。 - 右边界:「窗口左边缘 → 对话内容列左边缘」这段留白的 40% (向上取整到整像素):
| 窗口宽 | 内容列宽(官方 clamp(680, 宽×.64, 920)) | 内容列左边缘 | 热区右边界(ceil(左边缘×0.4)) |
|---|---|---|---|
| 1020 | 680 | 170 | 68 |
| 1440 | 920 | 260 | 104 |
| 1920 | 920 | 500 | 200 |
| 2400 | 920 | 740 | 296 |
| 3000 | 920 | 1040 | 416 |
也就是「对话区域左侧、从左边缘开始、从左往右 40% 都能触发」。指针移出热区 (右侧 60%)或离开窗口才收回。
为什么要
ceil:按比例算可能得到x.999999…(例如 0.7 时170 × 0.7在 IEEE754 下是118.99999999999999),不取整的话整数阈值会落在热区外, 与文档写的数字差 1px、边界不可预测。取整后「表里写的数字」就是「实际能触发 的最后一像素」。0.4 下这些值恰好都是整数,但ceil仍是在位保险。
上边界为什么要读对话内容容器的顶边,而不是写死「标题栏 40 + header 76」: 官方 header 的高度不是常量 —— 有 tab 时
min-height: 76px,无 tab 的变体 (headerBlank)是min-height: 0; padding-bottom: 0,darwin 与 Windows 的 顶部 clearance 也不同。直接读 body 的实际顶边,头部长什么样都自动适配。
热区几何不是死的:对话内容列宽度会随中栏宽度与用户拖拽变化,对话区 header 的
高度也会随「有没有 tab」变化。本插件在 冷路径(初始、resize、开合瞬间、
指针在热区外时最多每 500ms 一次)重新测量右边界与上边界,热路径只读缓存。
总开关(默认 Ctrl+Alt+L):
window.__dshFloatingSidebarOverlay.toggle() // 切换
window.__dshFloatingSidebarOverlay.disable() // 停用(回到官方行为)
window.__dshFloatingSidebarOverlay.enable()
window.__dshFloatingSidebarOverlay.isEnabled()
window.__dshFloatingSidebarOverlay.isOpen()
配置
在 profile 的 cordis.patch.yml 里覆盖默认值(Desktop 的 profile 是
~/.dsh/profiles/desktop/cordis.patch.yml;Web profile 把 desktop 换成
web):
- id: sidebar-overlay
name: 'dsh-sidebar-overlay'
config:
enabled: true # 总开关
width: 280 # 卡片宽度(px),最小 120
gap: 8 # 卡片四周留白
radius: 16 # 卡片圆角
trigger: 'content' # 热区模式:'content' 按对话内容列算 | 数值 = 固定 px | 'auto' = 官方列宽
triggerRatio: 0.4 # trigger='content' 时:占「窗口左边缘→对话内容列左边缘」留白的比例
closeSlack: 8 # 指针离开多少 px 后收回
animationMs: 180 # 动画时长(ms);0 = 瞬时
fill: 'sidebar' # 'sidebar' 官方填充 | 'base' 页面底色
shadow: true # 官方 elevation 投影
border: true # 未投影时的发丝描边
onlyWhenCollapsed: true # 只在侧边栏折叠时浮出
groupBy: 'workspace' # 'workspace' | 'workspace-tree' | 'flat'
orderBy: 'updated' # 'updated' | 'manual'
archivedFilter: 'default' # 'default' | 'show' | 'only'
showNewSession: true # 顶部「新会话」按钮
showProfile: true # 顶部「个人信息」(官方账户入口)按钮
hotkey: true
hotkeyBinding: { code: 'KeyL', modifiers: ['primary', 'alt'] }
debug: false
视图状态(分组方式 / 排序方式 / 筛选 / 展开态 / 手动顺序)存在浏览器
localStorage 的 dsh.floatingSidebarOverlay.view.v1 下,刷新后保留。