前言¶
DeepSeek Harness(DSH)默认的输入框高度受限,写字区仅 36px,且上限定死为 336px。在需要撰写长文本时,这种高度会压缩视线,导致输入体验不佳。
dsh-plugin-composer-expand 插件在输入框右上角增加了一个展开按钮。点击后,输入卡片会从文档流中脱离,变为一个浮层,高度设定为对话区高度的 50%。在这个展开态下,输入框获得独立滚动能力,且键盘行为从“发送”变为“换行”,只有发送按钮会提交消息。
核心功能¶
- 展开入口:在输入卡片右上角添加常驻的展开按钮。
- 浮层交互:展开后,输入卡片高度变为对话区高度的 50%(最小 200px,最大为对话区高度减 48px),以绝对定位贴底,不挤压或压缩下方的消息区。
- 键盘行为变更:展开态下,
Enter键变为换行(走官方 Shift+Enter 路径),Ctrl/Cmd+Enter保持发送语义,Esc键收起浮层。 - 滚动隔离:展开态下,面板内独立滚动,不带动对话列表,且支持滚轮事件拦截。
- 动画效果:使用 FLIP 动画技术实现高度过渡,过渡时长 250ms,系统开启“减弱动态效果”时自动跳过。
技术实现要点¶
- 布局策略:将输入座位设为绝对定位,同时将消息区的滚动容器
[data-conversation-scroll]保持为position: static。这是为了避免官方预设的position: relative钩子导致滚动容器高度为 0,从而保证消息区始终可滚。 - 动画原理:由于折叠态的高度是
auto,无法直接使用 CSStransition。插件通过 FLIP 技术(先读当前高度,施加新布局,再读新高度,最后在两者之间补间)实现动画。 - 按键拦截:在
document捕获阶段拦截Enter键事件,阻止默认的发送行为,并通过 Lexical 的命令系统派发换行命令。 - 按钮定位:按钮中心与输入框第一行文字(placeholder)垂直居中,且按钮上、右留白相等,通过 CSS 变量
--dsh-content-font-delta适配不同字号。 - 选择器依赖:依赖 Chrome 105+ 的
:has()选择器来定位目标元素。
安装与启用¶
通过命令行安装该插件。安装后需重启 App 以生效。
dsh plugin --profile desktop add github:d
典型用法¶
- 展开:在输入框右上角点击图标按钮,输入卡片展开为浮层。
- 输入:在展开态下,按下
Enter键进行换行,按下Ctrl/Cmd+Enter发送消息。 - 收起:点击发送按钮,或直接按下
Esc键,浮层收回到默认高度。
适用场景与注意¶
该插件适合需要撰写较长文本的会话场景。插件仅修改视觉层与键盘语义,不接管官方组件。展开后,卡片会覆盖下方部分消息内容,需按 Esc 收起才能阅读被遮挡的消息。
已知取舍¶
- 高度记忆:展开后的高度仅在当前会话内存中有效,刷新页面或重启 App 后恢复默认。
- 真机位移:在真机上展开时,消息区会有约 55px 的上移,收回后可精确复原。该位移来自应用自身的滚动管理机制,并非插件补偿造成。
- 收起方式:展开态下,点击按钮、
Esc或发送消息均可收起,不支持点击外部区域收起。