dsh-chat-collapse
给 DSH Web GUI 的聊天组件加一枚「一键收缩」
点一下把组件藏起来,角落浮出恢复球;点球即还原,球自己消失。
English | 中文
纯浏览器侧插件,零 DSH 源码改动。不 patch 本体、不注入 bundle、不起宿主服务。
它解决什么
小屏上输入框和工具条常驻,能看的对话就少了那么一截。 本插件在输入框工具行最右侧放一枚 ⌄ 按钮:点一下整条组件收起,纵向空间全给对话; 角落留一颗恢复球,随时点回来。
收起是 CSS 隐藏,DOM 不卸载 —— 草稿、贴的图、光标位置全都留着,展开回来接着写。
交互
| 动作 | 结果 |
|---|---|
| 点输入框工具行最右侧的 ⌄ 按钮 | 目标组件收起(草稿 / 图片 / 光标位置全部保留) |
| 收起后 | 视口角落浮出 恢复球(对话气泡图标) |
| 点恢复球 | 组件放回来,球自己消失 |
| 右键恢复球 | 在「输入框 / 整个对话区」之间切换收缩目标,并弹一条轻提示 |
Alt+H |
键盘切换收起 / 展开 |
状态(是否收起、收缩目标、悬浮球位置)写 localStorage['dsh.chatCollapse.v1'],刷新后保持。
收缩目标
| target | 藏什么 | 靠什么定位 |
|---|---|---|
composer(默认) |
只藏输入框那一条座位 | [data-composer-seat] |
chat |
藏整个对话区(消息 + 输入框 + 会话头) | [data-conversation-scroll] 的父节点 |
显隐由 <html> 上的 data-dsh-cc / data-dsh-cc-target 两个属性 + CSS 选择器驱动 ——
不给官方节点加类名,React 重渲染抹不掉。
安装
dsh plugin --profile web add github:cx2002302-lang/dsh-chat-collapse
装完重启一次 dsh web(新 bundle 要进客户端启动图),再刷新页面:
# 服务名按你自己的部署改;下面是 systemd 用户服务的写法
systemctl --user restart dsh-web.service
刷新后:输入框工具行最右侧即出现 ⌄ 按钮。
本地开发时也可以直接指向目录:
dsh plugin --profile web add /path/to/dsh-chat-collapse
卸载
dsh plugin --profile web remove dsh-chat-collapse
卸载时 ctx.effect 的回收函数会摘掉自己注入的 <style>、按钮、恢复球与 <html> 属性,
不留残留(tests/unit-check.mjs 里有对应断言)。
依赖的官方钩子
| 钩子 | 出处 |
|---|---|
[data-composer-card] |
ui-conversation/skeleton/InputBar.tsx |
[data-composer-seat] |
ui-conversation/skeleton/ConversationRoot.tsx |
[data-conversation-scroll] |
同上 |
三个都是源码里的字面量属性,不是 CSS-module 哈希类名,版本内稳定。 在 dsh 0.1.2-rc.1 上实测存在。
隐私
- 无网络请求、无遥测、无宿主侧服务。
- 唯一落盘的是
localStorage['dsh.chatCollapse.v1'](三个布尔 / 枚举值)。 - 宿主半侧
lib/index.js是空apply(),不注册任何服务、不读任何文件。 - 插件不接触会话内容,不读取草稿文本。
目录
lib/index.js 宿主半侧:空 apply(只为把 dsh.client 声明登记进 web 名册)
lib/client.js 浏览器半侧:全部功能(__ModuleLoader__ bundle,无 JSX、无构建)
cordis.patch.yml 把本插件 insert 进 web profile 的插件名册
tests/unit-check.mjs 纯 Node 检查:断言真正生成的那张样式表(无需浏览器,17 条)
tests/smoke.html 浏览器功能自测:点击 / 还原 / 目标切换 / 快捷键 / 卸载(24 条)
tests/visual.html 展开 / 收起两态的样子(加 ?state=collapsed 看收起态)
自测
# 1) 纯 Node,无浏览器依赖
node tests/unit-check.mjs
# 2) 浏览器功能自测(headless Chrome)
google-chrome --headless=new --no-sandbox --virtual-time-budget=6000 \
--dump-dom "file://$PWD/tests/smoke.html" | grep -E 'PASS|FAIL|passed'
改配置
默认值都在 lib/client.js 顶部的 DEFAULTS:collapsed / target / anchor / ball。
anchor: 'toolRow'(默认)按钮进工具行;改成'corner'则贴输入框卡片右上角。ball: 'br' | 'bl' | 'tr' | 'tl'恢复球落点,默认右下。 底边两档的bottom=BALL_INSET(20) + BALL_SIZE(44)/2= 42px —— 比基准抬高半个球高, 避开收起后右下角本来就有的常驻控件;要再挪改这两个常量即可。
No comments yet. Be the first to write one.