4.4 KiB
4.4 KiB
Wolai 深度复刻计划 (Wolai Deep Replication Plan)
目标:深度复刻 Wolai 的核心体验,重点解决左侧树状侧边栏的 Bug,并完善右侧编辑器的块交互(特别是「转为页面」功能)。
基准:严格遵循 design/ui_react.md 和 design/PHASE_1.5_TURN_TO_PAGE_EXACT_CLONE.md。
1. 现状分析 & 问题定位
当前项目已具备基础骨架(Next.js + Supabase + BlockNote),但在精细度和交互上仍有差距:
- 侧边栏 (Sidebar):
- 存在 Bug:拖拽抖动、状态同步延迟、无限嵌套渲染可能出错。
- 缺失细节:右键菜单(重命名/删除)、多选操作、精确的 Hover/Active 样式。
- 编辑器 (Editor):
- 缺失核心功能:「转为页面」互转逻辑。
- 样式细节:BlockNote 默认样式需定制为 Wolai 的蓝色系 (#2563eb)。
2. 实施路线图
阶段 A: 侧边栏重构与修复 (Sidebar Overhaul)
目标:打造丝滑、无 Bug 的无限嵌套文件树。
- 数据层优化:
- 确保
documents表的parent_id递归查询高效(使用 Supabase recursive CTE)。 - 实现
useSidebarHook,统一管理展开/折叠状态(持久化到 localStorage)。
- 确保
- 交互层重写 (dnd-kit):
- 使用
@dnd-kit/core替换现有的拖拽逻辑(如果现有不稳定)。 - 解决抖动:实现
DragOverlay,确保拖拽时有清晰的半透明快照。 - 精确落点:实现 "Drop Indicator"(蓝色横线),明确显示是「插入中间」还是「变为子节点」。
- 使用
- UI 细节复刻:
- 样式:行高 28px,字体 14px Inter,Hover 背景
#f5f5f5,选中背景#eef2ff+ 左侧蓝条。 - 图标:使用
lucide-react,文件夹折叠/展开箭头动画(90度旋转)。 - 右键菜单:实现自定义 Context Menu,包含:重命名、删除、在下方新建页面、复制链接。
- 样式:行高 28px,字体 14px Inter,Hover 背景
阶段 B: 编辑器深度定制 (Editor Refinement)
目标:实现 Wolai 的「块即页面」核心体验。
- 样式定制:
- 覆盖 BlockNote 默认 CSS 变量,使用 Wolai 蓝色
#2563eb作为主色(光标、选区、链接)。 - 调整块间距(margin-bottom: 8px)和内边距。
- 覆盖 BlockNote 默认 CSS 变量,使用 Wolai 蓝色
- 功能:转为页面 (Turn to Page):
- 后端 API:实现
POST /api/documents/create-child,接收块内容,创建子文档。 - 自定义块:注册
PageReference块,渲染为蓝色带图标的链接块。 - 菜单集成:
- Side Menu (:::):添加「转换为 -> 页面」选项。
- Slash Menu (/):添加「页面」选项。
- 双向同步:确保在编辑器中创建子页面后,左侧侧边栏实时更新显示。
- 后端 API:实现
阶段 C: 全局交互与细节
- 面包屑导航:确保点击面包屑能正确跳转,并与侧边栏选中状态同步。
- Loading 状态:页面切换时的顶部进度条(NProgress 风格,蓝色)。
- 空状态:新页面显示「无标题」占位符和「按 / 输入命令」提示。
3. 技术规范 (Strict Guidelines)
- CSS 框架:Tailwind CSS (v4)。
- 图标库:
lucide-react(通用),react-icons(特定品牌)。 - 状态管理:
zustand(全局 UI 状态),swr/react-query(数据获取)。 - 拖拽库:
@dnd-kit/core,@dnd-kit/sortable(推荐,比 react-dnd 更现代且易于控制样式)。
4. 验证计划
自动化测试
- (暂无,依赖手动验证)
手动验证清单
- 侧边栏测试:
- 创建 3 层嵌套页面,确认缩进正确。
- 拖拽页面 A 到页面 B 内部,确认无刷新实时更新。
- 快速展开/折叠多个节点,确认无卡顿。
- 右键重命名页面,确认编辑器顶部标题同步更新。
- 编辑器测试:
- 输入文本,点击左侧
:::,选择「转换为页面」。 - 确认原文本块变为蓝色链接块。
- 点击链接块,跳转到新页面,内容已迁移。
- 检查左侧侧边栏,确认新页面出现在原页面下方。
- 输入文本,点击左侧
5. 下一步行动 (Next Steps)
建议优先执行 阶段 A (侧边栏),因为它是整个应用的导航骨架,Bug 最影响体验。 然后执行 阶段 B,打通「块 <-> 页面」的流转。