You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| 2.3 | Horizontal container (children in a row) |`note-collab.ts``container.horizontal`|`DisplayNote.vue:flex-row`|**Done**| — |
58
-
| 2.4 | Drag child out to detach |`DisplayNote/Container/Detach.ts`|`useSpatialPage.ts:moveNoteOutOfContainer`|**Done**| — |
59
-
| 2.5 | Drag note into container to attach |`DisplayNote/Container/Attach.ts`|`SpatialPageView.vue:overlap heuristic`|**Done**| — |
58
+
| 2.4 | Drag child out to detach |`DisplayNote/Container/Detach.ts`|`useNoteDrag.ts:onNoteDragEnd` + `useSpatialPage.ts:moveNoteOutOfContainer`|**Done**| — |
59
+
| 2.5 | Drag note into container to attach |`DisplayNote/Container/Attach.ts`|`useNoteDrag.ts:overlap heuristic`|**Done**| — |
60
60
| 2.6 | Container wrap children toggle |`note-collab.ts``container.wrapChildren`|`note-model.ts:container.wrapChildren`|**Done**|`note-model.test.ts`|
61
61
| 2.7 | Container stretch children toggle |`note-collab.ts``container.stretchChildren`|`note-model.ts:container.stretchChildren`|**Done**|`note-model.test.ts`|
62
62
| 2.8 | Container force color inheritance toggle |`note-collab.ts``container.forceColorInheritance`|`note-model.ts:container.forceColorInheritance`|**Done**|`note-model.test.ts`|
@@ -66,8 +66,8 @@
66
66
67
67
| # | Feature | Legacy reference | New file(s) | Status | Test file |
-[x] Schema diff table covers every legacy `INoteCollab` and `IArrowCollab` field.
279
-
-[ ] Every "Done" item has a passing automated test. **VIOLATED.**~35+ UI/interaction rows marked "Done" still have "—" in the Test file column. Progress since last evaluation: `arrow-geometry.test.ts` (5 tests), `useSpatialEditing.test.ts` (4 tests) added. Remaining gaps: `DisplayNote.vue` (basic render tests only), `DisplayArrow.vue` (no component tests), `SpatialPageView.vue` (no component/integration tests), drag/resize interaction, box selection, arrow creation/reconnection, sidebar/toolbar integration.
279
+
-[ ] Every "Done" item has a passing automated test. **VIOLATED.**~30+ UI/interaction rows marked "Done" still have "—" in the Test file column. Progress since last evaluation: `note-geometry.test.ts` (8 tests), `useBoxSelection.test.ts` (6 tests), `arrow-geometry.test.ts` (5 tests), `useSpatialEditing.test.ts` (4 tests) added. Remaining gaps: `DisplayNote.vue` (basic render tests only), `DisplayArrow.vue` (no component tests), `SpatialPageView.vue` (no component/integration tests), drag/resize interaction, arrow creation/reconnection, sidebar/toolbar integration.
280
280
-[ ] Phase 6 is not declared done until ≥ 80% of rows are **Done**. **NOT MET.** Strict enforcement of the test rule would drop the true "Done" count well below 80%.
Copy file name to clipboardExpand all lines: docs/restart-plan/README.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,6 +1,6 @@
1
1
# DeepNotes Restart Plan — Index
2
2
3
-
> **Last updated:** 2026-05-31 (Phase 6 in progress. `useSpatialEditing`, `bringToTop`, line-body arrow geometry, and `useSpatialKeyboard` extracted. See `phase-6-spatial-polish.md` and `SPATIAL_PARITY_CHECKLIST.md` for details. Phase 9 pending.)
3
+
> **Last updated:** 2026-05-31 (Phase 6 in progress. `SpatialPageView.vue` god-component refactored — box selection, arrow drag, arrow reconnect, note drag extracted into dedicated composables. `note-geometry.ts`and `useBoxSelection.test.ts` added. See `phase-6-spatial-polish.md` and `SPATIAL_PARITY_CHECKLIST.md` for details. Phase 9 pending.)
4
4
> **This document replaces `docs/RESTART_PLAN.md`.** If a prior statement conflicts with this one, this version wins.
5
5
6
6
---
@@ -90,14 +90,14 @@ A criterion is **not met** until the verification command or check passes in CI.
90
90
-**No `PageElem` abstraction.** Legacy notes and arrows inherit from `PageElem`, sharing selected/active/editing/visible/region state. New code treats them as completely separate types.
91
91
-**`editing` state management implemented.**`useSpatialEditing.ts` tracks which note/arrow is being edited. Escape stops editing; canvas click stops editing; Delete/Backspace is suppressed while editing to avoid deleting selected elements.
92
92
-**Container rendering lacks legacy depth.**`stretchChildren`, `wrapChildren`, `originOffset`, and overflow detection are in the model but not enforced in rendering. Spatial vs non-spatial container distinction is not fully implemented.
93
-
-**`SpatialPageView.vue` partially refactored.** Keyboard shortcuts (~150 lines) extracted to `useSpatialKeyboard.ts`. Still a large component; further extraction needed for drag, resize, box-select, and arrow-reconnection logic.
93
+
-**`SpatialPageView.vue` partially refactored.** Keyboard shortcuts extracted to `useSpatialKeyboard.ts`. Box selection, arrow drag, arrow reconnect, and note drag extracted to dedicated composables (`useBoxSelection.ts`, `useArrowDrag.ts`, `useArrowReconnect.ts`, `useNoteDrag.ts`). Note geometry utilities extracted to `note-geometry.ts`. Component reduced from ~740 lines to ~365 lines. Remaining inline logic: context menu handlers, canvas double-click, fit-to-screen.
94
94
-**Selection partially improved.**`bringToTop` zIndex bump on selection is now implemented. Formatting integration across selected editors, active element/region keyboard navigation, and `selectAll` including descendant arrows remain missing.
95
95
-**Missing floating UI:** back/forward nav, screenshot, user avatars on canvas.
96
96
97
97
### Other gaps
98
98
99
99
-**Realtime notification toast** — only `/notifications` page exists, no badge/toast.
100
-
-**Composable size** — `useGroupMembersDetail.ts` (103 lines), `usePageCollabEditor.ts` (238 lines), and `useSpatialPage.ts` (195 lines) are all under the 300-line limit. Container logic extracted to `container-ops.ts`. **However, `SpatialPageView.vue`is a 1,070-line god component that violates the spirit of this criterion.**
100
+
-**Composable size** — `useGroupMembersDetail.ts` (103 lines), `usePageCollabEditor.ts` (238 lines), and `useSpatialPage.ts` (195 lines) are all under the 300-line limit. Container logic extracted to `container-ops.ts`. `SpatialPageView.vue`script section reduced from ~740 lines to ~365 lines after extracting `useSpatialKeyboard.ts`, `useBoxSelection.ts`, `useArrowDrag.ts`, `useArrowReconnect.ts`, `useNoteDrag.ts`, and `note-geometry.ts`.
101
101
-**Auth: `rememberDevice` UI missing in login** — `LoginView.vue` has no "Remember this device" checkbox for 2FA login; users are re-prompted every time. API schema already supports it.
102
102
-**Auth: no distributed locking** — Legacy used Redlock (`user-lock:${userId}`) around password change, email change, and 2FA mutations. New code relies on DB transactions only.
Copy file name to clipboardExpand all lines: docs/restart-plan/phase-6-spatial-polish.md
+7-7Lines changed: 7 additions & 7 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -1,7 +1,7 @@
1
1
# Phase 6: Spatial canvas polish
2
2
3
3
> **Prerequisites:** Phase 5 done.
4
-
> **Status:** In progress (2026-05-31 — `useSpatialEditing`, `bringToTop`, line-body arrow geometry, and `useSpatialKeyboard`extracted since last evaluation. Multiple "Done" items were over-reported; see notes below.)
4
+
> **Status:** In progress (2026-05-31 — `SpatialPageView.vue` refactored. Box selection, arrow drag, arrow reconnect, and note drag extracted into dedicated composables. `note-geometry.ts` and `useBoxSelection.test.ts` added. `useSpatialEditing`, `bringToTop`, line-body arrow geometry, and `useSpatialKeyboard` were extracted in prior work.)
5
5
6
6
---
7
7
@@ -17,7 +17,7 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
| Box selection (drag on empty canvas) |**Done**|Threshold-based drag-to-box-select implemented|
20
+
| Box selection (drag on empty canvas) |**Done**|Extracted to `useBoxSelection.ts`; threshold-based drag-to-box-select with world-space intersection. Tested in `useBoxSelection.test.ts`.|
21
21
| Select all (`Ctrl+A`) |**Done**|`onKeyDown` in `SpatialPageView.vue`|
22
22
| Active element / active region tracking |**Partial**|`useSpatialSelection` has `activeId` and `activeRegionId` ref but no real active-region UI or keyboard navigation |
23
23
|`bringToTop` on selection |**Done**|`useSpatialSelection` bumps selected note `zIndex` above other selected notes |
@@ -29,8 +29,8 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
29
29
| Note can contain child notes |**Done**|`container.enabled` and `container.children` wired in Yjs |
30
30
| Spatial container (free child positioning) |**Done**| Children rendered with world offset inside parent |
31
31
| Horizontal container (children in a row) |**Done**|`container.horizontal` flag + `flex-row` class in `DisplayNote.vue`|
32
-
| Drag child out to detach |**Done**|`onNoteDragEnd` + `moveNoteOutOfContainer`|
33
-
| Drag note into container to attach |**Done**| Overlap-area heuristic in `SpatialPageView.vue`|
32
+
| Drag child out to detach |**Done**|`useNoteDrag.ts:onNoteDragEnd` + `moveNoteOutOfContainer`|
33
+
| Drag note into container to attach |**Done**| Overlap-area heuristic in `useNoteDrag.ts`|
34
34
35
35
### 3. Clipboard
36
36
| Item | Status | Notes |
@@ -87,7 +87,7 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
| Drag-to-reconnect |**Done**| Connection zones + `onReconnectPointerMove/Up` in `SpatialPageView.vue` wired|
90
+
| Drag-to-reconnect |**Done**|Extracted to `useArrowReconnect.ts`. Connection zones + world-space note detection on pointer move.|
91
91
| Arrow source/target anchor positioning |**Done**|`DisplayArrow.vue` geometry uses `sourceAnchor`/`targetAnchor` when provided; line body falls back to rectangle-edge intersection |
92
92
| Color matching note color logic |**Partial**| Same hardcoded 10-color map used, but `inherit` logic may not cascade correctly for arrows |
93
93
@@ -110,7 +110,7 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
110
110
111
111
## Verification
112
112
113
-
-[ ] Each deliverable has a test (unit, component, or integration). **Partially improved.** New tests: `arrow-geometry.test.ts` (5 tests), `useSpatialEditing.test.ts` (4 tests). Major gaps remain: `DisplayNote.vue` (only basic render tests), `DisplayArrow.vue` (no component tests), `SpatialPageView.vue` (no component/integration tests), drag/resize interaction tests, box selection tests, arrow creation/reconnection tests, sidebar/toolbar integration tests.
113
+
-[ ] Each deliverable has a test (unit, component, or integration). **Partially improved.** New tests: `note-geometry.test.ts` (8 tests), `useBoxSelection.test.ts` (6 tests), `arrow-geometry.test.ts` (5 tests), `useSpatialEditing.test.ts` (4 tests). Major gaps remain: `DisplayNote.vue` (only basic render tests), `DisplayArrow.vue` (no component tests), `SpatialPageView.vue` (no component/integration tests), drag/resize interaction tests, arrow creation/reconnection tests, sidebar/toolbar integration tests.
114
114
-[ ] Phase 1 checklist is >80% marked done. **NOT MET.** Strict enforcement of the checklist's "Done = implemented + passing test" rule drops the true completion rate well below 80%.
115
115
116
116
---
@@ -127,7 +127,7 @@ Achieve parity with the legacy `/pages/:pageId` immersive spatial canvas experie
127
127
-[x]`MainToolbar`, `LeftSidebar`, `RightSidebar`, and `TableContextMenu` are implemented as standalone shadcn components and visible on `/pages/:pageId`.
128
128
-[x] Sidebar panels (`RecentPages`, `FavoritePages`) display real data from API.
129
129
-[x] Arrow geometry reads actual note heights instead of hardcoding `80px`.
130
-
-[ ]`SpatialPageView.vue` is refactored to avoid god-component anti-pattern. Keyboard shortcuts extracted to `useSpatialKeyboard.ts`; drag, resize, box-select, and arrow-reconnection logic still inline.
130
+
-[ ]`SpatialPageView.vue` is refactored to avoid god-component anti-pattern. **Partial.**Keyboard shortcuts extracted to `useSpatialKeyboard.ts`; box selection extracted to `useBoxSelection.ts`; arrow drag extracted to `useArrowDrag.ts`; arrow reconnect extracted to `useArrowReconnect.ts`; note drag extracted to `useNoteDrag.ts`; note geometry extracted to `note-geometry.ts`. Component reduced from ~740 to ~365 lines. Remaining inline: context menu handlers, fit-to-screen, canvas double-click.
131
131
-[x] Selection implements `bringToTop`. Formatting integration and active element/region navigation remain missing.
132
132
-[ ] Container rendering enforces `stretchChildren`, `wrapChildren`, and spatial vs non-spatial layout modes.
133
133
-[ ] Manual QA session with 3+ users finds no blocking usability issues.
0 commit comments