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。 适合需要最大化对话区域并快速切换会话的桌面端用户。

패키지
dsh-sidebar-overlay
호환성
미검증
버전
0.1.0
라이선스
MIT
최근 업데이트
2026. 10. 19.

설치

$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))
102068017068
1440920260104
1920920500200
2400920740296
30009201040416

也就是「对话区域左侧、从左边缘开始、从左往右 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 下,刷新后保留。