Bundle
dsh-chat-collapse
聊天组件一键收缩:输入框工具行加一枚收缩按钮,收起后角落浮出恢复球,点击即还原。纯浏览器侧,零 DSH 源码改动。
- Source
- cx2002302-lang
- License
- MIT
- Updated
- Updated 4 days ago
Readme
<h1 align="center">dsh-chat-collapse</h1> <p align="center"> <b>给 DSH Web GUI 的聊天组件加一枚「一键收缩」</b><br> 点一下把组件藏起来,角落浮出恢复球;点球即还原,球自己消失。 </p> <p align="center"> <a href="README.en.md">English</a> | 中文 </p> <p align="center"> <a href="https://github.com/awesome-dsh-plugin/awesome-dsh-plugin"><img src="https://img.shields.io/badge/awesome--dsh--plugin-orange" alt="awesome dsh plugin"></a> <img src="https://img.shields.io/badge/dsh-%3E%3D0.1.2--rc.1-blue" alt="dsh version"> <img src="https://img.shields.io/badge/platform-web-4c9aff" alt="platform web"> <a href="LICENSE"><img src="https://img.shields.io/badge/license-MIT-green" alt="license MIT"></a> <img src="https://img.shields.io/badge/network-none-lightgrey" alt="no network"> </p> > 纯浏览器侧插件,**零 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 重渲染抹不掉。 ## 安装 ```bash dsh plugin --profile web add github:cx2002302-lang/dsh-chat-collapse ``` 装完**重启一次 dsh web**(新 bundle 要进客户端启动图),再刷新页面: ```bash # 服务名按你自己的部署改;下面是 systemd 用户服务的写法 systemctl --user restart dsh-web.service ``` 刷新后:输入框工具行最右侧即出现 ⌄ 按钮。 本地开发时也可以直接指向目录: ```bash dsh plugin --profile web add /path/to/dsh-chat-collapse ``` ## 卸载 ```bash 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 看收起态) ``` ## 自测 ```bash # 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** —— 比基准抬高半个球高, 避开收起后右下角本来就有的常驻控件;要再挪改这两个常量即可。 ## License [MIT](LICENSE)
Install
dsh plugin --profile web add github:cx2002302-lang/dsh-chat-collapse
Profile: web
With the hub plugin installed, ask your agent to install it by name — it resolves the same plan shown here.
dsh plugin --profile web add github:stvlynn/dsh.fish#path:packages/dsh-plugin-hub
install dsh-chat-collapse from the hub
- This source has no pinned commit, so a later push upstream changes what installs. Prefer pinning a commit.