- Главная
- Плагины
- Улучшения UI
- dsh-pull-to-send
dsh-pull-to-send
dhdkfkfkf/dsh-pull-to-send
Send by dragging instead of clicking. Press the composer and pull up to arm the gesture; releasing sends, dragging back into the composer cancels, and dragging outside the conversation area cancels on the spot. Mouse and pen only.
Установка
dsh plugin --profile web add github:dhdkfkfkf/dsh-pull-to-sendREADME
PULLTOSEND
按住 DSH 输入框、向上拉、松手 —— 消息飞出去。不松手可以拖回来取消,拖出对话区同样作废。
三次拖拽,把发送变成肌肉记忆:
- 拖出去发送 —— 从输入框向上拉,消息拎在半空,松手即飞。
- 拖回来取消 —— 反悔了就把指针拖回输入框,一切归位,草稿还在。
- 拖出界取消 —— 甩到屏幕边缘、任务栏或别的窗口上,直接作废,绝不误发。
安装
dsh plugin --profile desktop add "github:dhdkfkfkf/dsh-pull-to-send"
装完重启一次 DSH(添加 bundle 本身需要重启;之后改代码走 dsh-hmr 热更)。
三种拖拽
| 你做什么 | 会发生什么 |
|---|---|
| 拖出去:在输入框卡片(含周边 12px 缓冲区)上按下,向上拉出卡片上边缘 ≥24px | 武装:输入框副本被拎起,跟随指针(阻尼跟随、微放大、阴影加深),真输入框缩小变暗;悬停时是 grab 光标,拖动中全程 grabbing |
| 武装后松手 | 触发发送按钮当前的主行为(空闲=发送,生成中=排队/插话),副本 FLIP 飞入新消息气泡,真气泡交叉淡入 |
| 拖回来:武装后把指针拖回输入框卡片内 | 解除武装:副本 150ms 短回位消失,卡片恢复正常,草稿原样保留;同一按压里再拉出去可以重新武装,可反复反悔 |
| 拖出界:武装后把指针拖出对话区可投放范围 | 立即取消:副本当场沿原路弹回消失,光标恢复,本次按压作废,松手不会发出任何东西,必须重新从输入框起手 |
| 未拉出阈值 / 横向拖拽占优 / 松手时指针停在卡片内 / 按 Esc / pointercancel | 取消:副本沿原路 320ms 弹回 |
可投放范围
拖出去的落点必须落在这块范围里,才算一次有效的发送:
| 边界 | 位置 |
|---|---|
| 左边 | 输入框卡片的左缘 |
| 右边 | 对话区背景的右缘 |
| 上边 | 对话区顶格 |
| 下边 | 输入框卡片的顶缘 |
范围之外一律判为取消 —— 屏幕边缘、任务栏、别的应用程序上都算。为了让「贴着屏幕边」也能被识别为越界,右边界还额外内缩了 8px 的安全余量。
界面全程零文字提示,只靠视觉反馈:副本拎起即为武装。
不打断你
| 场景 | 说明 |
|---|---|
| 框内拖选 | 手势只在指针越出上边缘并达到 24px 后才武装,框内选择 100% 原生 |
| 空输入 / 发送按钮禁用 | 不武装,松手无事发生 |
| IME 组合中 | 组合一开始就取消手势,不会发出半截拼音 |
| 触屏 | 仅响应鼠标和笔,手指滚动永远不会误发 |
| 卡片上的按钮 / 链接 / 菜单 | 归它们自己,不会拉出消息 |
| 拖到窗口外松手 | 视为取消,不会误发 |
动画参数
零构建、单文件 client.js,所有参数是文件顶部的具名常量(v1 没有设置面板):
| 常量 | 默认 | 含义 |
|---|---|---|
ARM_DISTANCE | 24px | 越过输入框上边缘多少距离才武装 |
EDGE_MARGIN | 8px | 可投放范围与窗口边缘之间保留的安全余量 |
DISARM_RETURN_MS | 150ms | 拖回卡片内时副本的回位时长 |
HIT_PAD | 12px | 卡片四周的隐形响应缓冲区 |
DAMPING | 0.95 | 副本跟随指针的每帧插值系数(越大越跟手) |
MAX_SCALE | 1.02 | 拎起时最大放大 |
FLIP_MS | 400ms | 松手后副本飞入气泡的时长 |
BUBBLE_LEAD_MS | 80ms | 真气泡提前淡入的提前量 |
RETURN_MS | 200ms | 真输入框回位时长(不等飞行结束) |
CANCEL_MS | 320ms | 取消回弹时长 |
出问题怎么办
打开控制台输入:
window.__DSH_PULLTOSEND__.disable() // 立刻停用手势(不用重启、不用卸载)
window.__DSH_PULLTOSEND__.version // 确认插件确实加载了
disable() 会摘掉全部监听器并把已拎起的副本收回;刷新页面即恢复。
兼容性
同时兼容 claude-style 与原生界面(两者共用同一套 data-composer-* 锚点);多个会话窗格各自绑定各自的手势。已验证发送路径:对发送按钮的程序化 .click() 在 React/Lexical 下真实触发发送(CDP 探针实测)。
锚点查找是三层降级:先找 data-composer-* 语义属性,找不到再按 aria-label / contenteditable 判断,最后才用类名模糊匹配 —— 任意一层命中都能工作。
License
MIT
Похожие плагины
dsh-web (dsh-task-board)
zhu1090093659/dsh-web
dsh-web (dsh-web-all)
zhu1090093659/dsh-web
dsh-web-ui (dsh-task-board)
zhu1090093659/dsh-web-ui
dsh-web-ui (dsh-web-ui-all)
zhu1090093659/dsh-web-ui