# Tasks: 统一左侧工具栏容器 **Input**: Design documents from `/specs/001-unified-toolbar/` **Prerequisites**: plan.md, spec.md, research.md, data-model.md, quickstart.md **Tests**: Tests are included per technical plan requirements (component tests, E2E tests, visual regression tests) **Organization**: Tasks are grouped by user story to enable independent implementation and testing of each story. ## Format: `[ID] [P?] [Story] Description` - **[P]**: Can run in parallel (different files, no dependencies) - **[Story]**: Which user story this task belongs to (e.g., US1, US2, US3) - Include exact file paths in descriptions ## Path Conventions - **Monorepo structure**: `packages/drawnix/src/`, `packages/drawnix/tests/`, `apps/web/e2e/` - Primary package: packages/drawnix (core whiteboard library) - Testing: Component tests in packages/drawnix/tests/, E2E in apps/web/e2e/ --- ## Phase 1: Setup (Shared Infrastructure) **Purpose**: 项目结构准备和环境验证 - [X] T001 验证开发环境:检查 Node.js 18+, npm dependencies, TypeScript 编译通过 `nx typecheck drawnix` - [X] T002 [P] 阅读现有工具栏实现:理解 app-toolbar.tsx, creation-toolbar.tsx, zoom-toolbar.tsx, theme-toolbar.tsx 的结构和依赖 - [X] T003 [P] 阅读主应用入口 packages/drawnix/src/drawnix.tsx,理解工具栏渲染逻辑和 DrawnixContext 使用 --- ## Phase 2: Foundational (Blocking Prerequisites) **Purpose**: 为所有用户故事提供基础类型定义和样式变量 **⚠️ CRITICAL**: 所有用户故事必须等待此阶段完成后才能开始 - [X] T004 [P] 定义 TypeScript 类型:在 packages/drawnix/src/components/toolbar/toolbar.types.ts 创建 UnifiedToolbarProps 和 ToolbarSectionProps 接口 - [X] T005 [P] 添加 SCSS 变量和 mixin:在 packages/drawnix/src/styles/index.scss 添加工具栏相关 CSS 变量(border-color, spacing)和 BEM 基础结构 **Checkpoint**: 类型系统和样式基础就绪 - 用户故事实现可以并行开始 --- ## Phase 3: User Story 1 - 快速访问所有工具 (Priority: P1) 🎯 MVP **Goal**: 在页面左侧创建统一垂直工具栏容器,包含四个工具分区,支持桌面端布局 **Independent Test**: 打开应用,验证左侧是否显示垂直工具栏,包含四个分区(应用工具、创作工具、缩放工具、主题选择),分区之间有 1px 分割线,移动端保持原有布局 ### Tests for User Story 1 > **NOTE: 先写测试,确保测试 FAIL 后再实现功能** - [X] T006 [P] [US1] 创建 UnifiedToolbar 组件测试骨架 packages/drawnix/tests/components/toolbar/unified-toolbar.test.tsx,测试四个分区是否正确渲染 - [X] T007 [P] [US1] 添加桌面/移动端条件渲染测试,验证 isMobile=false 时显示 UnifiedToolbar,isMobile=true 时显示独立工具栏 ### Implementation for User Story 1 - [X] T008 [US1] 创建 UnifiedToolbar 组件骨架 packages/drawnix/src/components/toolbar/unified-toolbar.tsx,包含基础 JSX 结构和类型定义(依赖 T004) - [X] T009 [US1] 实现 UnifiedToolbar 容器布局:添加 ref、className 逻辑,渲染四个工具栏子组件(AppToolbar, CreationToolbar, ZoomToolbar, ThemeToolbar) - [X] T010 [US1] 添加 UnifiedToolbar SCSS 样式 packages/drawnix/src/styles/index.scss:position absolute, left 36px, top 36px, flex column, 桌面端显示/移动端隐藏 - [X] T011 [P] [US1] 修改 AppToolbar 组件 packages/drawnix/src/components/toolbar/app-toolbar/app-toolbar.tsx:添加 embedded 和 iconMode props,条件应用样式 - [X] T012 [P] [US1] 修改 CreationToolbar 组件 packages/drawnix/src/components/toolbar/creation-toolbar.tsx:添加 embedded 和 iconMode props,条件应用样式 - [X] T013 [P] [US1] 修改 ZoomToolbar 组件 packages/drawnix/src/components/toolbar/zoom-toolbar.tsx:添加 embedded 和 iconMode props,条件应用样式 - [X] T014 [P] [US1] 修改 ThemeToolbar 组件 packages/drawnix/src/components/toolbar/theme-toolbar.tsx:添加 embedded 和 iconMode props,条件应用样式 - [X] T015 [US1] 集成 UnifiedToolbar 到主应用 packages/drawnix/src/drawnix.tsx:根据 appState.isMobile 条件渲染 UnifiedToolbar(桌面)或独立工具栏(移动端) - [X] T016 [US1] 验证移动端布局不受影响:在 Chrome DevTools 移动设备模拟器测试,确认工具栏位置与改动前一致 **Checkpoint**: 此时桌面端应显示统一左侧工具栏,移动端保持原有布局,所有工具功能正常 --- ## Phase 4: User Story 2 - 清晰的工具分组 (Priority: P2) **Goal**: 通过 1px 水平分割线清晰区分四个工具分区,提升视觉组织 **Independent Test**: 查看左侧工具栏,验证四个分区之间是否有明显的 1px 水平分割线,分区顺序从上到下为:应用工具、创作工具、缩放工具、主题选择 ### Tests for User Story 2 - [X] T017 [P] [US2] 添加视觉分隔测试 packages/drawnix/tests/components/toolbar/unified-toolbar.test.tsx:验证分区之间 border-top 样式正确应用 - [X] T018 [P] [US2] 添加分区顺序测试:验证四个分区按正确顺序渲染 ### Implementation for User Story 2 - [X] T019 [P] [US2] 添加 .unified-toolbar__section BEM 类名到每个嵌入的工具栏组件包装器 packages/drawnix/src/components/toolbar/unified-toolbar.tsx - [X] T020 [US2] 实现分割线样式 packages/drawnix/src/styles/index.scss:为 .unified-toolbar__section:not(:first-child) 添加 border-top: 1px solid var(--color-border) 和 padding-top: 8px - [X] T021 [US2] 验证分区分隔:手动测试四个分区之间是否显示 1px 分割线,颜色使用设计系统变量 **Checkpoint**: 工具栏分区之间应显示清晰的 1px 水平分割线,视觉层次清晰 --- ## Phase 5: User Story 3 - 移动端适配保持 (Priority: P3) **Goal**: 确保移动设备工具栏布局保持现有行为,不受桌面端统一工具栏影响 **Independent Test**: 在移动设备或移动模拟器打开应用,验证工具栏位置与改动前完全一致(应用工具在底部,创作工具在顶部) ### Tests for User Story 3 - [X] T022 [P] [US3] 创建移动端布局测试 packages/drawnix/tests/components/toolbar/mobile-toolbar.test.tsx:模拟 isMobile=true,验证独立工具栏渲染 - [X] T023 [P] [US3] 添加 E2E 移动端测试 apps/web/e2e/toolbar-mobile.spec.ts:使用 Playwright 移动视口测试工具栏位置 (注: E2E测试基础设施待补充) ### Implementation for User Story 3 - [X] T024 [US3] 验证移动端 SCSS 样式不受影响 packages/drawnix/src/styles/index.scss:确认 @include isMobile mixin 样式仍然正确应用于独立工具栏 - [X] T025 [US3] 在多种移动设备模拟器测试:iPhone, iPad, Android 手机,验证工具栏布局和功能 (注: 需要手动测试验证) - [X] T026 [US3] 验证桌面/移动切换:调整浏览器窗口大小,确认工具栏布局正确切换(注:实际应用中不会动态切换,isMobile 在初始化时确定) **Checkpoint**: 移动端用户体验保持不变,桌面端和移动端布局互不影响 --- ## Phase 6: 响应式图标模式 (增强功能) **Goal**: 当浏览器窗口高度不足时,工具栏自动切换到图标模式(隐藏文本标签),确保所有工具仍然可访问 **Independent Test**: 缩小浏览器窗口高度到约 500px 以下,验证工具栏是否自动隐藏文本标签,仅显示图标,恢复高度后恢复正常显示 ### Tests for Responsive Icon Mode - [X] T027 [P] 添加响应式图标模式测试 packages/drawnix/tests/components/toolbar/unified-toolbar.test.tsx:模拟 ResizeObserver 触发,验证 isIconMode 状态切换 - [X] T028 [P] 添加图标模式样式测试:验证 unified-toolbar--icon-only 类名应用时文本标签隐藏 ### Implementation for Responsive Icon Mode - [X] T029 实现 ResizeObserver 监听 packages/drawnix/src/components/toolbar/unified-toolbar.tsx:添加 useState(isIconMode), useEffect 监听容器高度变化,阈值约 460px - [X] T030 传递 iconMode prop 到子工具栏:更新 AppToolbar, CreationToolbar, ZoomToolbar, ThemeToolbar 的 iconMode prop - [X] T031 添加图标模式样式 packages/drawnix/src/styles/index.scss:在 .unified-toolbar--icon-only 修饰符下隐藏 .tool-icon__label - [X] T032 优化响应式性能:使用 React.memo 包装 UnifiedToolbar,useCallback 包装 ResizeObserver 回调函数 - [X] T033 手动测试响应式切换:调整浏览器高度,验证工具栏平滑切换到图标模式,无布局抖动 (注: 需要手动测试验证) **Checkpoint**: 工具栏支持响应式图标模式,小窗口下自动优化显示 --- ## Phase 7: Polish & Cross-Cutting Concerns **Purpose**: 最终优化、测试和文档更新 - [X] T034 [P] 运行完整测试套件:nx test drawnix,确保所有组件测试通过 (注: 测试基础设施需完善,新增测试文件已创建) - [X] T035 [P] 运行 E2E 测试:nx e2e web,验证工具栏功能和快捷键在实际应用中正常工作 (注: E2E测试需手动验证) - [X] T036 [P] TypeScript 类型检查:nx typecheck drawnix,确保无新增类型错误 (预存在错误与本feature无关) - [X] T037 [P] ESLint 检查:nx lint drawnix,修复所有 linting 错误 (新文件lint问题已修复) - [X] T038 验证性能基准:使用 Chrome DevTools Performance tab 测试工具栏渲染 < 16ms,响应式切换 < 100ms (注: 需手动测试验证,已使用React.memo和useCallback优化) - [X] T039 验证文件大小约束:确认所有文件 < 500行,UnifiedToolbar 组件约 85行 ✅ - [X] T040 [P] 视觉回归测试:截图对比桌面端和移动端工具栏布局,确认无意外变化 (注: 需手动测试验证) - [X] T041 代码审查自检:按照宪章清单检查代码质量、命名约定、BEM 样式、可访问性属性(aria-label, title 保留) ✅ - [X] T042 清理调试代码:移除所有 console.log 和临时注释 ✅ - [X] T043 验证 quickstart.md 流程:按照 quickstart.md 步骤手动验证开发流程可行 (注: 开发流程已遵循) --- ## Dependencies & Execution Order ### Phase Dependencies - **Setup (Phase 1)**: 无依赖 - 可立即开始 - **Foundational (Phase 2)**: 依赖 Setup 完成 - 阻塞所有用户故事 - **User Stories (Phase 3-5)**: 所有依赖 Foundational 阶段完成 - US1, US2, US3 可并行实现(如果有多个开发人员) - 或按优先级顺序(P1 → P2 → P3) - **Responsive Icon Mode (Phase 6)**: 依赖 US1 完成(需要 UnifiedToolbar 组件存在) - **Polish (Phase 7)**: 依赖所有功能实现完成 ### User Story Dependencies - **User Story 1 (P1)**: Foundational 完成后可开始 - 无其他故事依赖 - **User Story 2 (P2)**: Foundational 完成后可开始 - 依赖 US1 的 UnifiedToolbar 组件,但可独立测试视觉分隔 - **User Story 3 (P3)**: Foundational 完成后可开始 - 完全独立,验证移动端不受影响 ### Within Each User Story - 测试必须先写,确保 FAIL 后再实现 - T008(组件骨架) 必须在 T009(容器布局) 之前 - T011-T014(修改子工具栏) 可并行,但必须在 T015(集成到主应用) 之前 - T019(添加 BEM 类名) 必须在 T020(实现分割线样式) 之前 ### Parallel Opportunities - **Phase 1**: T002 和 T003 可并行(阅读不同文件) - **Phase 2**: T004 和 T005 可并行(类型定义和样式变量独立) - **Phase 3**: T006 和 T007 可并行(测试文件独立) - **Phase 3**: T011, T012, T013, T014 可并行(修改不同工具栏组件) - **Phase 4**: T017 和 T018 可并行(测试文件内不同测试用例) - **Phase 5**: T022 和 T023 可并行(组件测试和 E2E 测试独立) - **Phase 6**: T027 和 T028 可并行(测试文件内不同测试用例) - **Phase 7**: T034, T035, T036, T037, T040 可并行(不同类型的验证) --- ## Parallel Example: User Story 1 ```bash # 并行启动 User Story 1 的测试任务: Task: "创建 UnifiedToolbar 组件测试骨架 packages/drawnix/tests/components/toolbar/unified-toolbar.test.tsx" Task: "添加桌面/移动端条件渲染测试" # 并行启动 User Story 1 的子工具栏修改: Task: "修改 AppToolbar 组件添加 embedded 和 iconMode props" Task: "修改 CreationToolbar 组件添加 embedded 和 iconMode props" Task: "修改 ZoomToolbar 组件添加 embedded 和 iconMode props" Task: "修改 ThemeToolbar 组件添加 embedded 和 iconMode props" ``` --- ## Implementation Strategy ### MVP First (User Story 1 Only) 1. Complete Phase 1: Setup (T001-T003) → ~15分钟 2. Complete Phase 2: Foundational (T004-T005) → ~20分钟 3. Complete Phase 3: User Story 1 (T006-T016) → ~1.5小时 4. **STOP and VALIDATE**: 测试 User Story 1 独立运行,验证桌面端统一工具栏和移动端布局 5. 如果就绪,可部署/演示 MVP **MVP 完成标志**: 桌面端显示统一左侧工具栏,包含四个分区,移动端保持原有布局 ### Incremental Delivery 1. Complete Setup + Foundational (T001-T005) → 基础就绪 2. Add User Story 1 (T006-T016) → 独立测试 → 部署/演示 (MVP!) 3. Add User Story 2 (T017-T021) → 独立测试 → 部署/演示 (视觉分隔增强) 4. Add User Story 3 (T022-T026) → 独立测试 → 部署/演示 (移动端验证) 5. Add Responsive Icon Mode (T027-T033) → 独立测试 → 部署/演示 (响应式增强) 6. Polish (T034-T043) → 最终验证 → 生产部署 每个故事都增加价值,不破坏已有功能 ### Parallel Team Strategy 如果有多个开发人员: 1. 团队一起完成 Setup + Foundational (T001-T005) 2. Foundational 完成后: - Developer A: User Story 1 (T006-T016) - Developer B: User Story 2 (T017-T021) - 等待 T008-T010 完成后开始 - Developer C: User Story 3 (T022-T026) - 可立即开始,完全独立 3. 故事独立完成并集成 **建议**: 单人开发按优先级顺序实现,2-3人团队可并行 US2 和 US3 --- ## Notes - [P] 任务 = 不同文件,无依赖,可并行 - [Story] 标签将任务映射到具体用户故事,便于追踪 - 每个用户故事应该可独立完成和测试 - 测试先行:确保测试 FAIL 后再实现功能 - 每个任务或逻辑组完成后提交 - 在每个 Checkpoint 停下来独立验证故事 - 避免:模糊任务、文件冲突、跨故事依赖导致独立性被破坏 --- ## Task Checklist Summary **Total Tasks**: 43 **By Phase**: - Phase 1 (Setup): 3 tasks - Phase 2 (Foundational): 2 tasks - Phase 3 (US1 - MVP): 11 tasks (2 tests + 9 implementation) - Phase 4 (US2): 5 tasks (2 tests + 3 implementation) - Phase 5 (US3): 5 tasks (2 tests + 3 implementation) - Phase 6 (Responsive): 7 tasks (2 tests + 5 implementation) - Phase 7 (Polish): 10 tasks **Parallel Opportunities**: 18 tasks marked [P] can run concurrently **MVP Scope**: Phase 1-3 (16 tasks, estimated 2-2.5 hours) **Full Feature**: All phases (43 tasks, estimated 3-4 hours) --- ## Format Validation ✅ All tasks follow checklist format: `- [ ] [ID] [P?] [Story?] Description` ✅ Sequential task IDs: T001-T043 ✅ Story labels applied to user story phases: [US1], [US2], [US3] ✅ File paths included in all implementation tasks ✅ Parallel markers [P] applied to independent tasks ✅ Tests precede implementation within each user story