# 完整视图的交互设计与 DSH 适配 本页描述 **0.1.6 的实现**;普通提交不会发布。浮层共存需同时升级划词解读到 0.10.2、最近会话到 0.2.3。 ## 参考依据与验证范围 参考了用户提供的两张 Codex 真实截图,以及本机安装版本的浮动聊天、缩放和右面板输入条实现。截图确认了紧凑输入条、展开操作栏、标题和拖动入口的呈现;静态代码确认了状态切换、焦点保护、外部点击、拖动取消、缩放和恢复入口的行为。 当前自动化工具禁止操控 Codex 自身窗口,因此参考检查是**截图与静态实现核对**,不是 Codex 现场交互实测。参考代码没有复制进插件。以下 DSH 行为由本仓库独立实现。2026-10-04 已在真实 DSH macOS Desktop 复测紧凑输入、展开收起、隐藏恢复、草稿保留、鼠标拖动缩放、角落双击复位、原生菜单和返回分栏,并修复其他插件隐藏设置框阻止收起的问题。具体证据及未覆盖项目见 [验证记录](../VALIDATION.md)。 ## 状态与操作 | 参考交互 | DSH 实现 | 适配原因 | | --- | --- | --- | | 默认紧凑输入 | 默认只显示原生输入条 | 遵循用户选择,保留草稿、附件和发送逻辑 | | 聚焦输入框 | 直接展开完整消息区和标题栏;鼠标悬停不展开 | 按用户要求取消只有标题栏和输入条的中间状态;程序归还焦点不触发再次展开 | | 标题拖动、外缘切换 | 标题单击不切换,按住标题或空白拖动;外缘可展开和收起 | 原输入框保持同一实例,收起后再次点击已聚焦的输入框也能展开 | | 紧凑条自动回收 | 默认闲置 90 秒(1 分 30 秒)收成鲸鱼球;点击球直接恢复完整小窗 | 用户操作重新计时,流式回复不延期;菜单、拖动、IME 和待办暂停;完整小窗不自动隐藏,不抢工作区焦点 | | 点击浮窗外部自动收起 | 收回输入条,包含点击预览 iframe | 把空间还给工作内容,保留输入能力 | | Esc 收起展开的聊天 | 最后点击或操作聊天小窗时优先退出聊天;两窗外先退解读 | 原生菜单、输入法及宿主已处理的按键优先 | | 拖动入口、边缘拖动 | 整块标题栏除按钮外可拖动;紧凑条外缘可拖动 | 不劫持文字编辑、选择和原按钮操作 | | 停靠和吸附 | 松手时靠近工作区四边 24px 内吸附 | 保留 DSH 自由摆放,不引入宿主没有的全局停靠服务 | | 拖动取消 | Esc、指针取消、丢失捕获、窗口失焦均恢复起始位置 | 取消时不覆盖已保存的尺寸 / 位置 | | 多方向缩放 | 展开后四边和四角可缩放;紧凑时左右边调宽 | 西 / 北边缩放保留对边锚点,角落不显示角标 | | 复位 | 双击边缘 / 角落恢复配置尺寸,双击标题恢复默认位置 | 直边单击等待 260ms 区分双击;标题单击无切换动作;角落单击不收起 | | 缩小成可恢复入口 | 左上角「−」隐藏整个小窗,工作区保留无文字的鲸鱼尾巴小球 | 入口在隐藏聊天之外,原聊天立即 inert;恢复直接展开完整小窗并聚焦原编辑器 | | 运行状态 | 空输入的占位位置显示“已处理”及本次回合耗时,不增加高度;隐藏后使用 Harness 思考时自带的鲸鱼动画 | 读取 DSH 官方会话状态和回合时间;草稿优先显示;完成与待办切回原生 SVG 静止图,运行 APNG 按原生尺寸显示,不用 DOM 内容变化猜测运行 | | 受限视口内的位置调整 | 观察工作区、导航栏、输入条及 visualViewport | 缩窗、页面缩放或软键盘出现时保持可见,不覆盖原尺寸偏好 | | 滚动与输入对齐 | 隐藏浮窗聊天和长草稿的滚动条,不预留轨道宽度 | 保留原滚动容器、滚轮和触控板滚动;避免紧凑 / 展开切换时输入框横向跳动 | | 形态过渡与减少动态效果 | 完整 / 紧凑切换保留高度与顶部缓动;隐藏 / 恢复使用用户选定的 440ms 连续缩入,外框缩成同一锚点的球,鱼尾末段出现 | 原编辑器不重建,不缩放文字;拖动立即跟随,reduced-motion 下关闭过渡 | | 输入框统计 | 完整视图里始终隐藏输入框底部轮数、步数、速度与用量;分栏恢复 | 只隐藏当前会话输入卡片的 footer,不修改消息内容里的用量 | ## DSH 特有的约束 审批使用 `data-approval-key`,用户提问使用 `data-question-key`,计划确认使用 `data-plan-review-key`。检测到当前会话的这些面板时自动展开,暂时禁止收起 / 隐藏;处理完成后恢复之前状态。宿主用其他组件替换整个输入区时,优先展示完整内容。 `data-conversation-composer-overlay` 属于轨迹视图,不能用它判断待审批。内嵌子会话的输入框和待办也不应抢走当前会话的状态或焦点。 原生模型、权限、附件和其他弹出菜单继续使用宿主组件。检测到可见的原生菜单、对话框等覆盖界面时,暂停自动收起;插件的 Esc 监听在冒泡阶段运行,尊重 `defaultPrevented`、`isComposing` 和输入法兼容键值。 浮窗模型按钮改用脑形线条图标,保留原按钮的名称、当前模型、推理等级及菜单事件,返回分栏时还原。紧凑输入路径的内层背景透明,统一由圆角外框画底色;保留 overflow,避免将原生附件菜单裁切。两项均已在真实 Harness 窗口复测。 不足 320px 宽时,输入框占第一行,原按钮分列到第二行。多行草稿和附件仍会自然增高。命名容器查询避开原生控制行自己的容器定义,防止按钮被输入区域盖住。 ## 键盘与生命周期 外缘按钮支持 Enter / 空格。顶部拖动手柄和隐藏后的恢复入口支持方向键移动;缩放区域支持方向键调整其对应轴;Shift 加大步长。恢复聊天后聚焦原编辑器。收起不重建编辑器,也不写入草稿。 退出分栏、关闭面板、插件停用或热重载会移除工具栏、恢复入口、处理状态、临时属性、计时器、事件监听及观察器;还原宿主原有 inert / aria-hidden。只将几何偏好写入 localStorage,不另外存储消息或草稿。 ## 本轮没有复制的宿主专属功能 跨会话选择、富文本完成预览及系统浮窗穿透尚未适配。运行状态接入 DSH 的 uiSession.sessionStatus,回合起始时间来自当前会话的 eventSource。未知开始时间显示“处理中…”,不编造耗时;普通消息更新不会触发运行指示。动画遵从系统减少动态效果设置。 设计目标是迁移可验证的操作方式,并保持 DSH 的会话和输入能力完整。完整审批 / 提问 / 计划确认流程、所有桌面菜单组合、其他操作系统及其他 Harness 版本仍需继续验证。