@weniatall/dsh-mobile-adapter
v0.1.67
Published
Zero-intrusion mobile drawer and responsive layout adapter for DeepSeek Harness Web
Maintainers
Readme
dsh-mobile-adapter
DeepSeek Harness (DSH) Web 移动端全量体验优化与响应式适配插件。
无需修改 DSH 源码,零侵入通过前端扩展注入实现手机/移动端浏览器的极致体验。
功能特性
- 📱 响应式布局与视口自适应:自适应手机屏幕高度(100dvh / safe-area),彻底消除底部导航栏/工具栏遮挡与抖动。
- 👑 顶部 3 层极致融合成单层(释放近 100px 屏幕净高度):针对移动端原宿主「插件顶栏 + 会话标题栏 + 对话/轨迹 Tabs 栏」3 层臃肿堆叠的痛点,进行全面去重与功能深度整合。彻底隐藏重复占位的第 3 层原生 Tabs 栏(由顶栏「⌁ 轨迹 / ← 对话」药丸按钮单行双向切换),并将第 2 层 Header 移出普通流(0 占据纵向高度);单层顶栏(48px)集成了:
☰侧栏汉堡、真实会话标题(带点击改名/查看层级)、运行状态小光标、[⌁ 轨迹]视图切换、[···]会话更多操作、[◫]右侧栏开关以及[⛶]全屏按钮。去除了重复展示,保留了全部交互能力,聊天正文可视面积提升 25% 以上。 - 📷 移动端原生文件与图片上传:输入框支持一键调用手机原生相册与文件选择器,自动注入为多模态图片附件。
- 🧰 工作区工具箱 (Mobile Toolbox):移动端在输入框右侧或底部集成统一折叠工具箱,无缝集合文件查看器、本地终端、提示词历史等插件入口。
- 🔘 全操作按钮规范化与去冗余:对话框底部全操作按钮圆形统一设计,触控点击更舒适,防误触。权限模式选择器在移动端收成 32px 圆钮(隐藏文字与下拉箭头),选择器哈希同时覆盖
dsh 0.1.x的Sh0Q9G_*与0.2.1-rc.2的iWlSmW_*。模型选择器不再按构建哈希写死,改为锚定宿主写死的语义属性([data-composer-card] button[aria-haspopup="menu"][aria-label*="模型"]),因此宿主换哈希(_7KE1Ra_*→_9r0rkG_*→ …)当天按钮仍收成 32px 圆钮;悬浮窗同理按[role="menu"][aria-label*="模型"]强制position:fixed停靠在底部操作栏上方,并带:not(:has([role="menuitem"]))排除内层滚动区,避免把列表区一起改成 fixed 导致滚不动。移动端隐藏原生冗余的「+」快捷指令按钮(移动端直接键入/即可触发指令,省出单行空间避免挤压换行,多层覆盖.uV2eYG_add、.ccegLa_add与[class*="_add"]、button[aria-haspopup="listbox"]语义选择器)。 - 🧭 输入框下方的统计行固定单行三列、且不掉出卡片:宿主把「N 轮 M 步 · tok/s」「用量 · 缓存命中」统计行和上下文用量圆环一起渲染在输入卡片下方的 dock 里(两个药丸装在
conversation.composer.dock槽位内)。移动端固定为单行三列——[轮次/速度] [用量/缓存] [上下文圆环]:槽位与 dock 都强制row/nowrap(曾因槽位是column导致统计行堆成多行),不折行也不横向滚动;两列统计等分宽度,收缩压力只落在每段的末位文字(速度、缓存命中率)上走省略号,轮次/步数与总量保持完整;≤360px超窄屏进一步隐藏末位文字与分隔符,只留「N 轮 M 步」和总量,完整数值仍可从药丸点击面板查看。整块内容由脚本按实测 dock 高度动态配平(卡片补同样的底部内边距 + dock 等量负边距)收进卡片圆角内。旧实现用:has(+dock …)加固定 40px/-38px 魔法数,在 Safari < 15.4、Chrome < 105 等不支持:has()的内核上会整条静默失效,表现就是「输入框下方的内容缺失」——现在不再依赖:has()。 - 📑 抽屉与弹窗防溢出:对侧边栏会话抽屉、历史记录抽屉等全部进行移动端全屏/半屏底部抽屉(Bottom Sheet)自适应改造。
- 📂 工作区目录可正常展开/收起:宿主把工作区行的展开三角藏在
:hover里(.YDXeBa_projectRow .YDXeBa_chevron{display:none},仅:hover显示),触屏设备既没有 hover 也没有指针,展开状态完全不可见;同时宿主 hover 时用三角顶替文件夹图标(.YDXeBa_projectRow:hover .YDXeBa_folder{display:none}),触屏一按下图标就互相乱跳。移动端现固定为:三角常显并独占槽位、文件夹图标保持常显、旋转方向由宿主的aria-expanded驱动、行高抬到 40px 便于点按。并修正点击行为——工作区行是展开/收起控件而非会话选择,点它不再关闭侧边抽屉(此前宿主刚展开的会话列表会被立刻关掉,表现为「点文件夹毫无反应」),只有真正选中会话行才收起抽屉。 - ↩️ 右侧栏(文件/终端)避让与一键返回:右侧栏在移动端展开时自动避开顶部导航栏并放大 tab 与收起按钮触控区,顶栏右上角变为「← 对话」一键收起面板回到会话;冷启动恢复页面时若右侧栏曾处于展开态,自动收起,不再出现刷新或重开网页后被锁在文件栏、回不到对话的问题。
- 🔍 聚焦输入不再整页放大:iOS Safari 会对计算字号小于 16px 的可编辑元素(输入框已是 contenteditable)聚焦时强制放大整个视口,顶栏按钮随之被挤出屏幕。输入区字号现统一抬到 16px 下限(用户在设置里选定的更大字号照常生效),聚焦时页面保持原有缩放,按钮不再消失。
- 🎨 模型和推理强度条完全跟随状态条效果,不跟主题:输入框上方的「模型 · 推理强度」条完全跟随
dsh-theme-studio的「状态条效果」(流光文字、呼吸光环、极光流动、双色霓虹、终端扫描、糖果气泡、故障闪烁、环形光晕、条形律动等 10 档),由<html data-ts-status="...">纯 CSS 驱动,设置切换 0ms 瞬间响应。不跟主题:无条件压过任何特定主题(如极光的静态极光环、毛玻璃等)的样式干扰,确保该条纯粹展现状态条本身的胶囊与动效;零侵入:当设置为「原生」(或未安装主题工作室)时保持移动端默认的居中轻量纯文本。两个插件独立发布、零耦合。 - ⛶ 一键全屏(只收起浏览器 chrome):顶栏右侧提供全屏切换按钮,调用 Fullscreen API(
requestFullscreen({ navigationUI: 'hide' }))收起浏览器自身的地址栏与底部工具栏。应用自己的「新会话」顶栏、会话标题栏、对话/轨迹 tabs 全部保留——全屏后仍需它们导航。全屏按钮始终留在顶栏原位,前后位置无跳变;浏览器全屏后视口变高,根容器与滚动区跟随100dvh重铺,并用:fullscreen伪类兜底覆盖「通过浏览器菜单进入全屏」的场景。用户按 Esc / 系统手势退出时同步按钮的 aria 状态;进入前自动收起侧边抽屉,旋转到平板/桌面宽度时静默退回普通模式;状态只存内存不落盘,刷新后回到正常界面。
安装
# 1. 使用 GitHub Release 在线安装
dsh plugin --profile web add https://github.com/veildawn/dsh-plugins/releases/download/[email protected]/dsh-mobile-adapter-0.1.67.tgz
# 2. 或在本地打包安装
dsh plugin --profile web add ./plugins/dsh-mobile-adapter/dsh-mobile-adapter-0.1.67.tgz选择器契约
移动端样式同样只能依附宿主运行时真实存在的 CSS Modules 类名。宿主每次构建都会换
哈希(ccegLa_* → uV2eYG_*),所以这里的规则分四层,越靠后越稳:
- 语义钩子优先:
[data-slot=…]、[data-composer-card]、[data-conversation-scroll]、[role="dialog"]、[data-shell-overlay]——宿主渲染时写死的属性,不随构建变化。 - 去哈希兜底:
:is(.H0stHa_details,[class$="_details"]),在保留当前哈希的同时 按局部名后缀匹配,宿主换 hash 后仍然命中。用node scripts/add-host-local-fallbacks.mjs生成;它只在规则已带语义作用域时加兜底——_root在宿主里有 37 个组件共用、_row29 个,裸写[class$="_root"]会把侧栏内边距糊到整个应用上。个别关键面板 改用元素类型收窄(轨迹详情面板是aside[class$="_details"])。 - 历史版本兼容:
Sh0Q9G_*、ccegLa_*等旧宿主哈希保留,并登记在test/mobile-adapter.test.mjs;一旦某个类名重新出现在宿主中,测试会要求把它删掉。 - 跨元素布局交给脚本配平:需要「卡片补内边距 + 兄弟节点负边距」才能对齐的布局
(输入卡片下方的统计行与上下文圆环),不要写
:has()或固定像素魔法数。:has()在 Safari < 15.4、Chrome < 105、部分移动端内核上整条失效,固定像素在宿主换代后 失准——两种失效都是静默的,表现就是内容掉出输入框。改由脚本测量真实高度写入--dsh-dock-reserve,并用自己的data-dsh-dock*标记驱动样式(见balanceComposerDock()),宿主类名/属性怎么换都不影响。
仓库根 test/fixtures/host-classes.json 是宿主类名快照(桌面版 + Web 版,与
dsh-zcode-theme 共用),宿主升级后重新采集:
node scripts/harvest-host-classes.mjs --all # 桌面版 + Web 版一起采,推荐
node scripts/harvest-host-classes.mjs --web # 只采 `dsh web` 的前端
node scripts/add-host-local-fallbacks.mjs # 给新出现的类名补去哈希兜底
node scripts/add-host-local-fallbacks.mjs --check # 只检查,有未兜底项则以非零退出重启生效
- macOS / Linux 用户:
./scripts/dsh-web.sh restart - Windows 用户:
.\scripts\dsh-web.ps1 restart # 或 cmd: scripts\dsh-web.cmd restart
License
MIT
