前言¶
在 DSH 里用 @jaychang1989/dsh-webchat 时,面板在全屏与窗口模式之间切换后,有时会出现访客 overlay 仍停在切换前的 left、top、width、height,直到重新加载或关闭再打开访客。原因是 webchat 用 JavaScript 从 .dsh-wc-host 读 getBoundingClientRect() 再写到 overlay 的内联样式上;布局已经变了而拷贝还没跟上时,就会长期错位。下面介绍社区插件 dsh-webchat-anchor-fix:不动上游 webchat 包,只在 DSH Web 文档里加一条样式规则,让浏览器在每次布局时解析几何,而不是靠事件链同步。
这是什么¶
维护者为 GitHub 用户 dhdkfkfkf,分类为客户端插件,当前发布版本 0.1.0,许可证 MIT。插件定位是:针对 dsh-webchat 的几何 bug 做「一条规则」的补丁;上游 webchat 仍独立发版,本包只给 DSH Web 表面自己的 document 注入样式。
目录页:https://www.skillhub.cn/plugins/dhdkfkfkf/dsh-webchat-anchor-fix
源码:https://github.com/dhdkfkfkf/dsh-webchat-anchor-fix
问题从哪来¶
webchat 把访客放在 position: fixed 的 overlay 里,并通过 syncBounds(host) 把面板的盒模型拷进内联的 left、top、width、height。该逻辑在挂载、ResizeObserver 以及 window resize 时运行。overlay 不由 shell 参与布局;全屏切换若快于这次拷贝,overlay 会暂时甚至长期保留旧数值。设计里没有机制保证「面板已移动、overlay 必已更新」,漏掉一次事件就会一直错下去。
核心做法¶
拷贝不再参与循环。插件在支持 CSS Anchor Positioning 的引擎里注入如下规则(节选,与 README 一致):
@supports (anchor-name: --dsh-webchat-anchor) {
.dsh-wc-host {
anchor-name: --dsh-webchat-anchor;
}
body:has(.dsh-wc-host) [data-dsh-webchat-overlay] {
left: anchor(--dsh-webchat-anchor left) !important;
top: anchor(--dsh-webchat-anchor top) !important;
width: anchor-size(--dsh-webchat-anchor width) !important;
height: anchor-size(--dsh-webchat-anchor height) !important;
}
}
浏览器在每次 layout 解析这四个值,全屏、窗口化、侧栏与 resize 时 overlay 跟随面板,无需 listener、定时器、ResizeObserver 或挂载后的 JavaScript。webchat 仍会写内联几何,因此作者样式使用 !important,以便在级联中压过普通内联声明。body:has(.dsh-wc-host) 在没有面板 host 时不生效,避免误伤仍带内联值的孤立 overlay。
边界与失败模式¶
插件只动 DSH Web 文档里的一个 <style>,不读不写 DeepSeek 页面 webview,不用 insertCSS 或 executeJavaScript;无额外网络、Cookie、storage 或 UA 改动,也不改 layout mode、绘制或 stacking,仅上述四个几何属性与 anchor 名。
依赖 webchat 公开约定:类名 .dsh-wc-host 与属性 [data-dsh-webchat-overlay]。上游若改名,规则不匹配,overlay 退回 webchat 原有内联几何(与未装插件时相同),补丁静默失效而非破坏面板。不支持 anchor 的引擎会忽略整段 @supports;客户端会打一条 console 警告以便发现失效。
已知限制:overlay 对齐的是当前存在的 panel 元素。若 shell 层面把 panel 本身排错尺寸,overlay 会忠实跟随错误的盒——那是应用 shell 的问题,不是 webchat 同步漏拷。
安装与启用¶
插件以当前 DSH 进程权限运行;安装前建议自行查看源码与 MIT 许可证。SkillHub 为社区目录,与 DeepSeek、幻方无官方从属关系。
完全退出 DSH 后执行(命令来自 README,勿自行拼接 github:owner/repo 形式):
dsh plugin --profile desktop add https://github.com/dhdkfkfkf/dsh-webchat-anchor-fix/releases/download/v0.1.0/dsh-webchat-anchor-fix-0.1.0.tgz
重启 DSH 一次,让 profile 启动加载新 bundle。中国大陆网络可在 URL 前加 https://gh-proxy.com/ 前缀。
注意: 仅当你确实遇到全屏或窗口切换后面板仍停在旧 bounds 时再装;若面板行为正常,本插件没有可修正的对象。与皮肤无关,也不会顺带安装其他依赖。本地开发可先 npm pack,再 dsh plugin --profile desktop add <path-to-tgz>。
典型验证(维护者仓库)¶
在克隆或下载的源码目录中,维护者提供:
npm test # 样式形状与 bundle 注册
npm run test:anchor # 在 headless Edge/Chromium 中测布局
npm run verify # 两者一起跑
test:anchor 用形似 DSH shell 的 fixture,故意保留过期的内联几何,再移动布局、改视口、隐藏显示 overlay、移除并重建 host,全程不调用本包逻辑,逐步比对 host 的 rect。
结尾¶
dsh-webchat-anchor-fix 用 CSS anchor 把 dsh-webchat 访客 overlay 与面板 host 绑在同一布局周期里,缓解全屏/窗口切换后的 stale geometry,且在上游 DOM 契约或引擎能力不满足时安全退回到 webchat 原行为。详情与 issue:https://github.com/dhdkfkfkf/dsh-webchat-anchor-fix;目录入口:https://www.skillhub.cn/plugins/dhdkfkfkf/dsh-webchat-anchor-fix。非官方项目,与 DeepSeek、Anthropic 无隶属关系。