Files
mnote/wolaiplan copy.md
T
2025-11-23 10:55:04 +08:00

4.4 KiB
Raw Blame History

Wolai 深度复刻计划 (Wolai Deep Replication Plan)

目标:深度复刻 Wolai 的核心体验,重点解决左侧树状侧边栏的 Bug,并完善右侧编辑器的块交互(特别是「转为页面」功能)。 基准:严格遵循 design/ui_react.mddesign/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 的无限嵌套文件树。

  1. 数据层优化
    • 确保 documents 表的 parent_id 递归查询高效(使用 Supabase recursive CTE)。
    • 实现 useSidebar Hook,统一管理展开/折叠状态(持久化到 localStorage)。
  2. 交互层重写 (dnd-kit)
    • 使用 @dnd-kit/core 替换现有的拖拽逻辑(如果现有不稳定)。
    • 解决抖动:实现 DragOverlay,确保拖拽时有清晰的半透明快照。
    • 精确落点:实现 "Drop Indicator"(蓝色横线),明确显示是「插入中间」还是「变为子节点」。
  3. UI 细节复刻
    • 样式:行高 28px,字体 14px InterHover 背景 #f5f5f5,选中背景 #eef2ff + 左侧蓝条。
    • 图标:使用 lucide-react,文件夹折叠/展开箭头动画(90度旋转)。
    • 右键菜单:实现自定义 Context Menu,包含:重命名、删除、在下方新建页面、复制链接。

阶段 B: 编辑器深度定制 (Editor Refinement)

目标:实现 Wolai 的「块即页面」核心体验。

  1. 样式定制
    • 覆盖 BlockNote 默认 CSS 变量,使用 Wolai 蓝色 #2563eb 作为主色(光标、选区、链接)。
    • 调整块间距(margin-bottom: 8px)和内边距。
  2. 功能:转为页面 (Turn to Page)
    • 后端 API:实现 POST /api/documents/create-child,接收块内容,创建子文档。
    • 自定义块:注册 PageReference 块,渲染为蓝色带图标的链接块。
    • 菜单集成
      • Side Menu (:::):添加「转换为 -> 页面」选项。
      • Slash Menu (/):添加「页面」选项。
    • 双向同步:确保在编辑器中创建子页面后,左侧侧边栏实时更新显示。

阶段 C: 全局交互与细节

  1. 面包屑导航:确保点击面包屑能正确跳转,并与侧边栏选中状态同步。
  2. Loading 状态:页面切换时的顶部进度条(NProgress 风格,蓝色)。
  3. 空状态:新页面显示「无标题」占位符和「按 / 输入命令」提示。

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. 验证计划

自动化测试

  • (暂无,依赖手动验证)

手动验证清单

  1. 侧边栏测试
    • 创建 3 层嵌套页面,确认缩进正确。
    • 拖拽页面 A 到页面 B 内部,确认无刷新实时更新。
    • 快速展开/折叠多个节点,确认无卡顿。
    • 右键重命名页面,确认编辑器顶部标题同步更新。
  2. 编辑器测试
    • 输入文本,点击左侧 :::,选择「转换为页面」。
    • 确认原文本块变为蓝色链接块。
    • 点击链接块,跳转到新页面,内容已迁移。
    • 检查左侧侧边栏,确认新页面出现在原页面下方。

5. 下一步行动 (Next Steps)

建议优先执行 阶段 A (侧边栏),因为它是整个应用的导航骨架,Bug 最影响体验。 然后执行 阶段 B,打通「块 <-> 页面」的流转。