Skip to content

fix(panel): 会话管理面板改走 renderInOverlay 悬浮根,修复被主对话层覆盖且无法交互 - #29

Closed
devil233-ui wants to merge 1 commit into
hkkz9522:mainfrom
devil233-ui:fix/panel-portal-overlay-root
Closed

devil233-ui wants to merge 1 commit into
hkkz9522:mainfrom
devil233-ui:fix/panel-portal-overlay-root

Conversation

@devil233-ui

Copy link
Copy Markdown

问题

Closes #28(含完整根因分析与截图)。

「会话管理」面板浮在主对话层之下:透明画布类主题(壁纸模式)下主对话区的标题、行内代码块直接压在面板上(看起来像"面板背景透明"),并且主对话层吃掉了全部点击——面板上按钮、下拉、行操作均无法交互。

根因

SessionManagerPanel 返回的 fragment 里,面板本体(panelModal)以普通 h("div") 直接渲染在侧栏底部按钮(FooterAction → SafePanel)的 DOM 里,没有像同文件其余 12 个弹窗那样经 renderInOverlay() 送进 #dsh-session-manager-overlay-root(<body> 直属、z-index:1050、.sm-overlayLayer>*{pointer-events:auto})。

于是 position:fixed; z-index:1020 被困在侧栏底部座位的层叠上下文中:z-index 只在该子树内排序,整块面板实际绘制在主对话层之下,命中测试也被主对话层拿走。

修改

与文件内其它弹窗对齐,两处改动:

  • 面板包裹层 className 增加 sm-overlayLayer —— 该类规则 .sm-overlayLayer>* 会为面板本身打开 pointer-events;
  • panelModal 经 renderInOverlay() 送进悬浮根(<body> 直属的顶层层叠上下文,z-index 1050)。
-        className: "sm-nativeDialogLayer",
+        className: "sm-nativeDialogLayer sm-overlayLayer",
...
-      return h(React.Fragment, null, panelModal, annotationDialog, …);
+      return h(React.Fragment, null, renderInOverlay(panelModal), annotationDialog, …);

验证

  • 本机实测:DSH Desktop 2.0.17(内核 @deepseek-ai/dsh 0.2.0-rc.2)+ dsh-vesna-theme 壁纸模式(页面画布透明),Windows 11。
  • 修复前:主对话区文字/行内代码块压在面板上,面板内控件全部点不动。
  • 修复后:面板浮于最上层,搜索、筛选、行操作(打开/归档/移动/删除等)全部正常。
  • 门禁:npm run check 通过(node --check 各文件 + 动态 import('./lib/index.js'))。

已知边界

  • 面板进入悬浮根(z-index:1050)后,层级仍低于 DSH 自己的 tooltip/菜单层(1100),与文件内既有分层约定一致;
  • #28 中提到的另一独立问题(coldSnapshot 单参调用导致每次启动成批警告)不在本 PR 范围。

面板此前以普通 h(div) 直接渲染在侧栏底部按钮(FooterAction → SafePanel)的
DOM 里,没有像同文件其它 12 个弹窗那样走 renderInOverlay() 送进
#dsh-session-manager-overlay-root(<body> 直属、z-index 1050)。后果:

- position:fixed;z-index:1020 被困在侧栏底部座位的层叠上下文里,
  整块面板实际绘制在主对话层之下;
- 透明画布类主题(如壁纸模式把 --dsw-alias-bg-base 设为 transparent)下,
  主对话层与面板同时可见,看起来像面板背景透明;
- 命中测试被主对话层吃掉,面板上所有控件无法交互。

修改:

- 面板包裹层加 sm-overlayLayer 类(该类规则 `.sm-overlayLayer>*` 会为
  面板本身打开 pointer-events);
- panelModal 经 renderInOverlay() 送进悬浮根,与其余弹窗同层。

已在本机(DSH Desktop 2.0.17 / @deepseek-ai/dsh 0.2.0-rc.2 /
dsh-vesna-theme 壁纸模式)实测:面板浮于最上层、全部控件可交互。

Closes hkkz9522#28
@hkkz9522

Copy link
Copy Markdown
Owner

感谢建议,我将在下个版本修复

@hkkz9522 hkkz9522 closed this Oct 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

[Bug] 会话管理面板渲染在主对话层之下:文字压过面板、整个面板无法交互(缺 renderInOverlay/sm-overlayLayer)

2 participants