This commit is contained in:
2026-07-12 21:26:08 +08:00
commit 9dd41afd48
502 changed files with 129901 additions and 0 deletions
@@ -0,0 +1,165 @@
# 可拖动预览区与侧栏折叠设计
状态:已实现并验证
创建日期:2026-05-28
实现日期:2026-05-28
## 背景
当前界面是左侧知识库导航、中间对话、右侧预览的三段式布局。左侧栏固定 270px,右侧预览打开后固定 420px。这个设计稳定,但在直接预览 HTML/PDF/页面产物时,右侧区域偏窄,用户常常需要全屏才能看清内容;全屏又会完全遮住对话上下文。
本设计补强现有产品方向:对话仍是主屏,右侧预览仍是辅助面板,但允许用户在“边聊边看”和“重点看预览”之间快速调整空间。
## 目标
- 右侧预览区可以通过鼠标拖动左边缘变宽或变窄。
- 左侧知识库栏可以折叠成窄图标栏,释放更多横向空间。
- 窄图标栏的每个按钮都有悬停文字提示。
- 用户调整后的侧栏状态和预览宽度会被记住。
- 保留现有全屏预览按钮,作为只看产物的极端模式。
## 不做什么
- 不把三栏全部做成自由拖动。左侧栏是导航区,折叠已经能解决占空间问题。
- 不新增 npm 依赖。
- 不改变知识库、对话、产物的数据结构。
- 不改变右侧预览的内容渲染方式。
## 方案选择
采用“右侧预览可拖动 + 左侧栏折叠为窄图标栏”。
对比过三个方向:
- 只让右侧预览可拖动:最稳,改动集中,但左侧仍占固定空间。
- 三栏都可拖动:自由度最高,但容易拖乱界面,状态和边界复杂度更高。
- 预设宽度 + 全屏:简单,但不如拖动自然。
最终方案在第一个方向上补上左侧栏折叠,既保留清晰心智,又能明显释放预览空间。
## 交互设计
### 左侧栏
完整侧栏保持当前结构:顶部品牌和操作按钮,下面是知识库与对话列表,底部是新建和添加入口。
新增一个“切换侧栏”按钮,放在侧栏顶部,与刷新、设置同级。点击后侧栏在两种状态间切换:
- 完整侧栏:显示知识库、对话、按钮文字。
- 窄图标栏:只显示核心图标,不显示长文字。
窄图标栏至少包含:
- 展开侧栏
- 当前知识库入口
- 新建知识库
- 添加现有库
- 设置
所有图标按钮都需要悬停提示,例如“展开侧栏”“当前知识库”“新建知识库”“添加现有库”“设置”。
折叠状态不应该让用户迷路:窄栏始终保留展开按钮,且当前知识库入口要能表达“当前仍在某个库里”。
### 右侧预览
右侧预览打开时,在它的左边缘显示一条细拖动把手。
交互规则:
- 按住把手向左拖,预览区变宽。
- 按住把手向右拖,预览区变窄。
- 双击把手,恢复默认宽度。
- 关闭预览区后释放空间。
- 再次打开预览区时使用上次宽度。
- 全屏按钮保留,进入全屏后不显示拖动把手。
### 宽度边界
右侧预览宽度需要限制在合理范围内:
- 默认宽度:420px。
- 最小宽度:360px,保证预览和标签仍可用。
- 最大宽度:视口宽度的 70%,但必须给中间对话保留至少 420px。
当窗口太窄时,优先保证对话区可用;移动端沿用现有逻辑,右侧预览占满屏幕,不启用拖动。
### 状态记忆
使用本地浏览器存储记住:
- 侧栏是否折叠。
- 右侧预览宽度。
刷新页面后恢复上次状态。异常值需要自动回到默认值,避免用户因为窗口变化进入不可用布局。
## 页面结构
整体仍是三段式:
- 左:导航区,完整侧栏或窄图标栏。
- 中:对话区,占用剩余空间。
- 右:预览区,打开时显示,宽度可调整。
中间对话区不设置固定宽度,而是随左右两侧变化自动伸缩。这样右侧拉宽时,对话区自然变窄;右侧收窄或关闭时,对话区自然变宽。
## 实现边界
预计改动集中在:
- `web/src/App.tsx`:保存侧栏状态、预览宽度,并传给组件。
- `web/src/components/Sidebar.tsx`:支持完整侧栏和窄图标栏两种形态。
- `web/src/components/RightDrawer.tsx`:增加拖动把手和宽度回调。
- `web/src/index.css`:增加折叠侧栏、拖动把手、宽度状态的样式。
不需要改后端。
## 可访问性与细节
- 侧栏切换按钮需要有明确的 `aria-label`
- 拖动把手需要可聚焦,并提供键盘兜底:左右方向键调整宽度,Home 或双击恢复默认宽度。
- 拖动中避免选中文本。
- 拖动中给把手明确的 hover/active 状态。
- 窄图标栏的提示文案使用现有 tooltip 样式。
## 验收标准
1. 点击侧栏切换按钮,侧栏能在完整侧栏和窄图标栏之间切换。
2. 窄图标栏按钮悬停时都有清楚提示。
3. 打开右侧预览后,拖动左边缘能改变宽度。
4. 双击拖动把手能恢复默认预览宽度。
5. 预览区拉宽时,中间对话不会被挤到无法使用。
6. 刷新页面后,侧栏折叠状态和预览宽度仍保持。
7. 移动端或窄屏下不启用拖动,预览继续按现有方式占满屏幕。
## 验证计划
- 运行前端检查。
- 启动应用。
- 打开已有 HTML 产物预览。
- 手动切换侧栏折叠状态。
- 手动拖动右侧预览宽度并双击恢复。
- 刷新页面确认状态保持。
- 缩小窗口确认不会出现不可用布局。
## 实施结果
已按本文档方案实现:
- 左侧栏支持完整侧栏与窄图标栏切换。
- 窄图标栏保留展开、当前知识库、刷新、新建、添加、设置入口。
- 窄图标栏按钮均有悬停提示。
- 右侧预览支持拖动左边缘调整宽度。
- 双击拖动边缘恢复默认宽度。
- 侧栏折叠状态和预览宽度会在本地保留。
- 移动端沿用全屏预览,不显示拖动边缘。
验证结果:
- `npm run typecheck` 通过。
- 受控浏览器验证默认预览宽度为 420px。
- 受控浏览器验证拖动后预览区可变宽,并保持对话区可用。
- 受控浏览器验证双击拖动边缘可恢复默认宽度。
- 受控浏览器验证侧栏可折叠为 52px 窄图标栏,刷新后仍保持。
- 受控浏览器验证移动端预览占满屏幕,拖动边缘隐藏。