|
| 1 | +# 笔记页布局头脑风暴与重新设计方案 |
| 2 | + |
| 3 | +> **状态**: 已澄清并部分实施(2026-08-09 澄清:目标页面为**笔记页 NotesPage**,左栏=文件组,右栏=浏览区) |
| 4 | +> **日期**: 2026-08-09 |
| 5 | +> **模块**: 笔记(Notes)— 布局与交互子系统(三栏式:文件夹 / 笔记列表 / 预览) |
| 6 | +> **参考**: [sop-custom-design.md](./sop-custom-design.md)(三栏式布局概念)、[tipTapConverter.ts](../../client/src/features/classroom/utils/tipTapConverter.ts)(结构化数据流模式) |
| 7 | +> **澄清说明**: 需求最初指向 WikiPage,实施后经用户澄清实际针对笔记页 NotesPage(左栏=文件组、右栏=浏览区);WikiPage 的侧边栏改动已回滚(保留自动保存优化),布局方案落地到 NotesPage。 |
| 8 | +
|
| 9 | +--- |
| 10 | + |
| 11 | +## 一、当前布局分析 |
| 12 | + |
| 13 | +### 1.1 现状诊断 |
| 14 | + |
| 15 | +当前 WikiPage 使用 `grid md:grid-cols-[260px_1fr]` 双栏布局: |
| 16 | + |
| 17 | +``` |
| 18 | +┌──────────────────────────────────────────────────────┐ |
| 19 | +│ ModuleRitualHeader (标题 + 仪式感印章) │ |
| 20 | +├───────────────┬──────────────────────────────────────┤ |
| 21 | +│ 左侧面板 │ 编辑器主区域 │ |
| 22 | +│ (260px) │ │ |
| 23 | +│ │ ┌─ 页面标题 + 版本号 ─────────────┐ │ |
| 24 | +│ [输入框][+] │ │ 标题文本 v1 │ │ |
| 25 | +│ │ ├─ ContributionLegend ────────────┤ │ |
| 26 | +│ ┌─────────┐ │ │ 贡献者颜色图例 │ │ |
| 27 | +│ │ 页面 A │ │ ├─ WikiQualityBadge ─────────────┤ │ |
| 28 | +│ │ 页面 B │ │ │ 质量徽章 + 投票 │ │ |
| 29 | +│ │ 页面 C │ │ ├────────────────────────────────┤ │ |
| 30 | +│ └─────────┘ │ │ textarea (Markdown 编辑器) │ │ |
| 31 | +│ │ │ │ │ |
| 32 | +│ │ │ (自动保存说明) │ │ |
| 33 | +│ └──┴───────────────────────────────────┘ │ |
| 34 | +└──────────────────────────────────────────────────────┘ |
| 35 | +``` |
| 36 | + |
| 37 | +### 1.2 现有问题 |
| 38 | + |
| 39 | +| 问题 | 严重度 | 描述 | |
| 40 | +|------|--------|------| |
| 41 | +| **左侧面板不可折叠** | 高 | 页面列表始终占据 260px 宽度,在小屏或需要专注编辑时占用空间 | |
| 42 | +| **无右侧详情面板** | 中 | 页面元数据(创建时间、投票数、贡献者详情)与编辑器内容混排,信息密度低 | |
| 43 | +| **布局缺乏弹性** | 中 | 固定 grid 布局无法适应不同任务场景(浏览 vs 编辑 vs 审阅) | |
| 44 | +| **信息层级扁平** | 低 | 元数据与编辑器在同一个垂直流中,缺乏视觉分区 | |
| 45 | + |
| 46 | +--- |
| 47 | + |
| 48 | +## 二、参考设计分析 |
| 49 | + |
| 50 | +### 2.1 sop-custom-design.md 的三栏式布局 |
| 51 | + |
| 52 | +SOP 编辑器采用三栏式结构,核心设计理念是"**左导航 → 中画布 → 右配置**": |
| 53 | + |
| 54 | +``` |
| 55 | +┌──────────────────────────────────────────────────────┐ |
| 56 | +│ SOP 名称: [________________] 标签: [数学] [课前] [+] │ |
| 57 | +├──────────┬───────────────────────┬───────────────────┤ |
| 58 | +│ 步骤面板 │ 步骤画布 │ 步骤配置面板 │ |
| 59 | +│ │ │ │ |
| 60 | +│ 拖拽添加 →│ [步骤卡片] [步骤卡片] │ 配置参数 │ |
| 61 | +│ │ [步骤卡片] │ 检查子项 │ |
| 62 | +│ 步骤列表 │ [+ 添加步骤] │ │ |
| 63 | +├──────────┴───────────────────────┴───────────────────┤ |
| 64 | +│ 预估总时长: 65 分钟 [保存] [另存为模板] [删除] │ |
| 65 | +└──────────────────────────────────────────────────────┘ |
| 66 | +``` |
| 67 | + |
| 68 | +**可借鉴的设计原则**: |
| 69 | +- **左栏导航**:可折叠的步骤面板(类比 Wiki 的页面列表) |
| 70 | +- **中栏画布**:主内容区(类比 Wiki 的编辑器) |
| 71 | +- **右栏配置**:上下文配置面板(类比 Wiki 的页面详情/元数据) |
| 72 | +- **三栏互斥**:左栏展开时右栏自动收起,反之亦然 |
| 73 | + |
| 74 | +### 2.2 tipTapConverter.ts 的结构化数据流 |
| 75 | + |
| 76 | +tipTapConverter.ts 展示了一种**管道式数据流**模式: |
| 77 | + |
| 78 | +``` |
| 79 | +输入(Markdown 文本)→ 解析(逐行遍历)→ 加工(stripInlineMd)→ 输出(TipTap JSON) |
| 80 | +``` |
| 81 | + |
| 82 | +这种模式映射到布局设计中可以理解为: |
| 83 | +- **输入层**:页面列表(用户选择要编辑的页面) |
| 84 | +- **处理层**:编辑器(用户编写/修改内容) |
| 85 | +- **输出/展示层**:页面详情面板(展示结果、元数据、质量评估) |
| 86 | + |
| 87 | +--- |
| 88 | + |
| 89 | +## 三、重新布局设计方案 |
| 90 | + |
| 91 | +### 3.1 总体布局架构 |
| 92 | + |
| 93 | +采用**三栏弹性布局**,左右侧边栏均可独立展开/收起,互斥逻辑确保主编辑区始终有足够空间: |
| 94 | + |
| 95 | +``` |
| 96 | +┌──────────────────────────────────────────────────────────────┐ |
| 97 | +│ ModuleRitualHeader (标题 + 保存状态指示器 + 操作按钮) │ |
| 98 | +├──────┬──┬──────────────────────────┬──┬──────────────────────┤ |
| 99 | +│ │ │ │ │ │ |
| 100 | +│ 左栏 │←→│ 主编辑区 │→│ 右栏(页面详情) │ |
| 101 | +│ │ │ │ │ │ |
| 102 | +│ 页面 │ │ ┌─ 标题 + 版本号 ────┐ │ │ ┌─ 页面详情 ──────┐ │ |
| 103 | +│ 列表 │ │ │ 标题文本 v1 │ │ │ │ 📄 创建时间 │ │ |
| 104 | +│ │ │ ├─ 贡献者/质量 ─────┤ │ │ │ 🕐 更新时间 │ │ |
| 105 | +│ 可 │ │ │ 图例 + 徽章 │ │ │ │ 📋 版本号 │ │ |
| 106 | +│ 折 │ │ ├──────────────────┤ │ │ │ 👍 投票数 │ │ |
| 107 | +│ 叠 │ │ │ textarea 编辑器 │ │ │ │ 👥 贡献者数 │ │ |
| 108 | +│ │ │ │ │ │ │ ├─ 贡献者图例 ────┤ │ |
| 109 | +│ 260px│ │ │ │ │ │ │ 颜色图例 │ │ |
| 110 | +│ │ │ │ │ │ │ ├─ 质量徽章 ─────┤ │ |
| 111 | +│ │ │ │ 自动保存说明 │ │ │ │ 质量评估 + 投票 │ │ |
| 112 | +│ │ │ └──────────────────┘ │ │ └─────────────────┘ │ |
| 113 | +│ │ │ 保存状态: 已保存 │ │ │ |
| 114 | +├──────┴──┴──────────────────────────┴──┴──────────────────────┤ |
| 115 | +│ 底部操作栏(可选) │ |
| 116 | +└──────────────────────────────────────────────────────────────┘ |
| 117 | + ↑ ↑ ↑ ↑ |
| 118 | + 左按钮 左栏展开 主编辑区 右栏展开 右按钮 |
| 119 | +``` |
| 120 | + |
| 121 | +### 3.2 布局状态矩阵 |
| 122 | + |
| 123 | +| 左栏 | 右栏 | 主编辑区宽度 | 适用场景 | |
| 124 | +|------|------|-------------|----------| |
| 125 | +| 展开 | 收起 | `100% - 260px` | 浏览页面列表 + 编辑 | |
| 126 | +| 收起 | 展开 | `100% - 220px` | 专注编辑 + 查看详情 | |
| 127 | +| 展开 | 展开 | ❌ 互斥禁止 | — | |
| 128 | +| 收起 | 收起 | `100%` | 全屏编辑(专注模式) | |
| 129 | + |
| 130 | +### 3.3 布局切换动画 |
| 131 | + |
| 132 | +采用 Tailwind `transition-all duration-300 ease-kb-default` 实现平滑过渡: |
| 133 | + |
| 134 | +```tsx |
| 135 | +// 左侧边栏动画 |
| 136 | +<div className={cn( |
| 137 | + 'transition-all duration-300 ease-kb-default flex-shrink-0', |
| 138 | + leftSidebarOpen ? 'w-[260px] opacity-100' : 'w-0 opacity-0 overflow-hidden', |
| 139 | +)}> |
| 140 | + |
| 141 | +// 右侧边栏动画 |
| 142 | +<div className={cn( |
| 143 | + 'transition-all duration-300 ease-kb-default flex-shrink-0', |
| 144 | + rightSidebarOpen ? 'w-[220px] opacity-100' : 'w-0 opacity-0 overflow-hidden', |
| 145 | +)}> |
| 146 | +``` |
| 147 | + |
| 148 | +### 3.4 控制按钮设计 |
| 149 | + |
| 150 | +左右侧边栏控制按钮采用**圆形浮动按钮**,位于侧边栏与主编辑区之间的边界: |
| 151 | + |
| 152 | +``` |
| 153 | +左按钮(贴在左栏右侧边缘): |
| 154 | + ┌──────────────┬────┬─────────────────────┐ |
| 155 | + │ 左栏内容 │ ◀ │ 主编辑区 │ |
| 156 | + │ │ │ │ |
| 157 | + └──────────────┴────┴─────────────────────┘ |
| 158 | + 展开时:← 收起 展开时:→ 展开 |
| 159 | + |
| 160 | +右按钮(贴在右栏左侧边缘): |
| 161 | + ┌─────────────────────┬────┬──────────────┐ |
| 162 | + │ 主编辑区 │ ▶ │ 右栏内容 │ |
| 163 | + │ │ │ │ |
| 164 | + └─────────────────────┴────┴──────────────┘ |
| 165 | + 展开时:→ 收起 展开时:← 展开 |
| 166 | +``` |
| 167 | + |
| 168 | +--- |
| 169 | + |
| 170 | +## 四、实施建议 |
| 171 | + |
| 172 | +### 4.1 分阶段实施 |
| 173 | + |
| 174 | +| 阶段 | 范围 | 内容 | |
| 175 | +|------|------|------| |
| 176 | +| **P0** | NotesPage | 左右侧边栏独立控制按钮 + 互斥逻辑(**已实施**,见下方落地说明) | |
| 177 | +| **P1** | 全页面模板 | 将侧边栏模式抽象为通用布局组件,供其他页面复用 | |
| 178 | +| **P2** | 响应式 | 窄屏自动收起侧边栏,改为抽屉式覆盖 | |
| 179 | + |
| 180 | +### 4.1.1 P0 落地说明(2026-08-09 澄清后实施) |
| 181 | + |
| 182 | +- **目标页面**:`client/src/features/notes/pages/NotesPage.tsx`(左栏=文件夹/文件组,右栏=浏览区/预览) |
| 183 | +- **互斥机制**:保留既有 `sideMode: 'left' | 'right' | 'none'` 单值三态——天然互斥(一个展开时另一个必为收起态) |
| 184 | +- **控制按钮**:由单一循环切换按钮(`cycleSideMode`)改为**两个独立按钮**: |
| 185 | + - 左按钮(工具栏首部,`PanelLeftClose/PanelLeft`):展开/收起左栏文件组,展开时自动把 sideMode 置为 'left'(右栏随之收起) |
| 186 | + - 右按钮(搜索栏右侧,`PanelRightClose/PanelRight`):展开/收起右栏预览区,展开时自动把 sideMode 置为 'right'(左栏随之收起) |
| 187 | + - 展开态按钮以品牌色高亮(`text-brand-600 bg-brand-50/60`),展开/收起状态一目了然 |
| 188 | +- **断点对齐**:左按钮 `hidden md:flex`(与左栏 `md:flex` 一致),右按钮 `hidden lg:flex`(与右栏 `lg:flex` 一致) |
| 189 | +- **WikiPage 回滚**:需求澄清前的 WikiPage 侧边栏改动已恢复为原 `grid md:grid-cols-[260px_1fr]` 双栏布局,仅保留自动保存优化(2s idle debounce + 内容变更检测 + blur/visibilitychange 即时落盘 + 保存状态指示) |
| 190 | + |
| 191 | +### 4.2 与现有设计系统的一致性 |
| 192 | + |
| 193 | +- 侧边栏控制按钮的样式与 `CaptureSidebar.tsx` 的折叠按钮保持一致(圆形、阴影、hover 效果) |
| 194 | +- 图标使用 `lucide-react` 的 `PanelLeftClose/PanelLeft` 和 `PanelRightClose/PanelRight`(折叠/展开图标随状态切换) |
| 195 | +- 动画使用项目中已有的 `duration-kb-fast` 和 `ease-kb-default` 时间函数 |
| 196 | + |
| 197 | +### 4.3 布局与 sop-custom-design.md 的三栏式概念对照 |
| 198 | + |
| 199 | +| SOP 三栏 | NotesPage 三栏 | 功能对应 | |
| 200 | +|----------|----------------|----------| |
| 201 | +| 步骤面板(左) | 文件夹/文件组(左) | 导航与选择 | |
| 202 | +| 步骤画布(中) | 笔记列表(中) | 主内容浏览 | |
| 203 | +| 步骤配置面板(右) | 预览/浏览区(右) | 内容详情预览 | |
| 204 | +| 底部预估时长 + 操作 | 工具栏操作按钮 | 状态反馈与操作 | |
| 205 | + |
| 206 | +--- |
| 207 | + |
| 208 | +## 五、总结 |
| 209 | + |
| 210 | +本次重新布局方案的核心改进: |
| 211 | + |
| 212 | +1. **弹性三栏架构**:从固定 grid 布局改为弹性 flex 布局,左右侧边栏可独立展开/收起 |
| 213 | +2. **互斥逻辑**:左右侧边栏互斥展开,确保主编辑区始终有足够显示空间 |
| 214 | +3. **新增右侧详情面板**:将页面元数据从编辑器内分离到独立面板,提升信息组织清晰度 |
| 215 | +4. **平滑动画过渡**:使用 CSS transition 实现侧边栏折叠/展开的流畅动画 |
| 216 | +5. **与现有设计一致**:控制按钮样式与 `CaptureSidebar.tsx` 保持一致,图标使用 lucide-react 标准图标 |
0 commit comments