前言¶
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或發送消息均可收起,不支持點擊外部區域收起。