diff --git a/docs/float_window_design.md b/docs/float_window_design.md index 8ece51e8..1f33018b 100644 --- a/docs/float_window_design.md +++ b/docs/float_window_design.md @@ -8,7 +8,8 @@ 1. **命名**:该功能正式名称为「**快捷窗口**」(quick dock / quick window)。 2. **布局:占位而非悬浮**:快捷窗口**不是** `position: fixed` 悬浮,而是在**对话区域右侧空白区域占位显示**的一列,常驻时会**把对话区域向左挤压**(与 git/终端 right-panels 同为 `chat-container` 的 flex 兄弟节点,位于 `` 之后、right-panels 之前)。有内容时才显示该列。 -3. **设置项**:个人空间(PersonalizationDrawer)新增「**隐藏快捷窗口**」开关,**默认关闭**(即默认显示)。字段 `hide_quick_dock: boolean` 存 personalization form。 +3. **设置项**:个人空间(PersonalizationDrawer)新增「**隐藏快捷窗口**」开关,**默认关闭**(即默认显示)。字段 `hide_quick_dock: boolean` 存 personalization form。(注:2026-07-28 核查该字段前端未消费,仅后端存在。) +3.1 **设置项**(2026-07-28):「外观与显示」新增「**快捷窗口自动展开**」开关,**默认是**(有内容时自动展开);切换为否后只能通过右侧悬浮按钮手动展开。字段 `quick_dock_auto_expand: boolean`(默认 true)存 personalization form。行为语义:QuickDock.vue `watch(hasContent, ..., {immediate:true})` 按模式校正 `userCollapsed = !autoExpand`——手动模式下内容集合变化(出现/清空)后保持收起等手动点击,用户手动展开后只要内容不完全清空就保持展开;`watch(autoExpand)` 让设置切换立即生效(切否收起 / 切是有内容即展开)。 4. 详情面板(子智能体/后台指令)保持 fixed 悬浮,从快捷窗口列左侧滑出;文件预览侧边栏在快捷窗口列右侧(git/终端面板左侧)占位/滑出。 5. 移动端(isMobileViewport)第一版先隐藏。 @@ -103,6 +104,8 @@ 4. `overflow` 裁剪窗口阴影 → 滚动容器 `padding + 负 margin` 扩大滚动盒。 5. 菜单 fixed 定位不随栈滚动 → 栈滚动时主动关闭菜单。 6. 两个 ⋯ 菜单 + Esc 多层浮层:菜单互斥;Esc 按 菜单 → 详情面板 → 预览栏 顺序逐个关(用 `e.preventDefault()` + `e.defaultPrevented` 串联)。 +7. **占位列展开/收起过渡中 `padding` 必须保持上下值一致**(2026-07-28 踩坑):`.quick-dock--empty` 若 `padding: 0`,展开时 `padding-top 0→44px` 参与过渡会让内容垂直下移 44px,叠加 `translateX(24px)→0` 形成「从右上角斜向出现」观感;收起态写 `padding: 44px 0 20px`(仅水平 padding 归零)后动画才是纯横向从右到左。 +8. 展开/收起悬浮按钮(`.qd-toggle`,App.vue 零宽锚点)**无内容时也常显**(2026-07-28 用户要求):`v-if="!isMobileViewport"` 不含 `qdHasContent`;配套 `watch(hasContent)` 任一方向变化都重置 `userCollapsed`(否则「无内容点收起 → 新内容到达」路径 dock 不自动展开)。按钮线条色与左侧对话记录侧边栏导航图标一致用 `var(--claude-text)`,**恒定不变**——无 hover 变色,展开态也不变色(is-active 样式已移除)。 ## 6. 正式接入任务清单(2026-07-21 已全部完成) diff --git a/modules/personalization_manager.py b/modules/personalization_manager.py index 7f0dc517..2d621bcc 100644 --- a/modules/personalization_manager.py +++ b/modules/personalization_manager.py @@ -106,6 +106,7 @@ DEFAULT_PERSONALIZATION_CONFIG: Dict[str, Any] = { "new_chat_button_behavior": "route", # 新建对话按钮行为:route-跳转空白新对话页 / blank-立即创建空对话 "default_hide_workspace": False, # 默认隐藏工作区 "hide_quick_dock": False, # 隐藏快捷窗口(对话区右侧的待办/子智能体/后台指令/文件窗口列) + "quick_dock_auto_expand": True, # 快捷窗口自动展开:True-有内容时自动展开 / False-只能手动点击按钮展开 "group_sidebar_by_workspace": False, # 侧边栏按工作区/项目分组显示对话 "sidebar_pinned_workspaces": [], # 分组侧边栏中永久置顶的工作区ID列表 "sidebar_workspace_order": [], # 分组侧边栏中非置顶工作区的显示顺序 @@ -536,6 +537,12 @@ def sanitize_personalization_payload( else: base["hide_quick_dock"] = bool(base.get("hide_quick_dock", False)) + # 快捷窗口自动展开 + if "quick_dock_auto_expand" in data: + base["quick_dock_auto_expand"] = bool(data.get("quick_dock_auto_expand")) + else: + base["quick_dock_auto_expand"] = bool(base.get("quick_dock_auto_expand", True)) + # 侧边栏按工作区/项目分组显示对话 if "group_sidebar_by_workspace" in data: base["group_sidebar_by_workspace"] = bool(data.get("group_sidebar_by_workspace")) diff --git a/static/src/App.vue b/static/src/App.vue index 04721855..594f3ae2 100644 --- a/static/src/App.vue +++ b/static/src/App.vue @@ -357,15 +357,15 @@ :host-mode="versioningHostMode" /> + 按钮绝对定位悬浮在原处,不随面板挤压移动; + 无内容时也常显(不随 qdHasContent 隐藏),避免按钮时隐时现 -->