DeepSeek Harness 插件:dsh-plugin-composer-expand

前言

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,無法直接使用 CSS transition。插件通過 FLIP 技術(先讀當前高度,施加新佈局,再讀新高度,最後在兩者之間補間)實現動畫。
  • 按鍵攔截:在 document 捕獲階段攔截 Enter 鍵事件,阻止默認的發送行爲,並通過 Lexical 的命令系統派發換行命令。
  • 按鈕定位:按鈕中心與輸入框第一行文字(placeholder)垂直居中,且按鈕上、右留白相等,通過 CSS 變量 --dsh-content-font-delta 適配不同字號。
  • 選擇器依賴:依賴 Chrome 105+ 的 :has() 選擇器來定位目標元素。

安裝與啓用

通過命令行安裝該插件。安裝後需重啓 App 以生效。

dsh plugin --profile desktop add github:d

典型用法

  1. 展開:在輸入框右上角點擊圖標按鈕,輸入卡片展開爲浮層。
  2. 輸入:在展開態下,按下 Enter 鍵進行換行,按下 Ctrl/Cmd+Enter 發送消息。
  3. 收起:點擊發送按鈕,或直接按下 Esc 鍵,浮層收回到默認高度。

適用場景與注意

該插件適合需要撰寫較長文本的會話場景。插件僅修改視覺層與鍵盤語義,不接管官方組件。展開後,卡片會覆蓋下方部分消息內容,需按 Esc 收起才能閱讀被遮擋的消息。

已知取捨

  • 高度記憶:展開後的高度僅在當前會話內存中有效,刷新頁面或重啓 App 後恢復默認。
  • 真機位移:在真機上展開時,消息區會有約 55px 的上移,收回後可精確復原。該位移來自應用自身的滾動管理機制,並非插件補償造成。
  • 收起方式:展開態下,點擊按鈕、Esc 或發送消息均可收起,不支持點擊外部區域收起。
羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜