diff --git a/.work/todo.jsonl b/.work/todo.jsonl index cd397ac..e2edf24 100644 --- a/.work/todo.jsonl +++ b/.work/todo.jsonl @@ -305,3 +305,6 @@ {"actor":"unknown","ev":"01M1PMWVS4Y84XCEVRHZ9QTNW1","item":"01M1PMS8ZBVHA4KDG1W0AX5CHM","op":"update","set":{"status":"in_progress"},"ts":"2026-09-04T16:44:11Z"} {"actor":"unknown","ev":"01M1PMXW2DFK433MTPNSCT0SDK","item":"01M1PMS8ZBVHA4KDG1W0AX5CHM","op":"close","set":{"resolution":"v0.6.4 changelog, Cargo.toml / Cargo.lock / tauri.conf bump, roadmap snapshot, index plane re-rendered. Tag and GitHub release after merge.","status":"done"},"ts":"2026-09-04T16:44:45Z"} {"actor":"richardhightower","ev":"01M1QN6CE0YV9CWFNA4BF0E0ZS","git":"95b9bae","item":"01M1QN6CE0P31CYJZFG7K9D3K7","op":"create","set":{"body":"Three releases shipped a frontend drag fix that could not work. Tauri 2 gates startDragging() behind core:window:allow-start-dragging, and core:default does not include it: core:window:default is 26 read-only queries plus allow-internal-toggle-maximize. Every drag call was rejected by the access control list and swallowed by an empty catch, so nothing was logged. The OS title bar that used to provide dragging for free went away when titleBarStyle became Overlay. Fix: grant allow-start-dragging and allow-toggle-maximize in the capability file, replace the empty catches with a one-time warning, and unit-test the grants.","discovered_during":"01M1MVB300KXXJPZ2XACH7A64K","kind":"bug","level":"task","milestone":"v0.6.4","priority":"P1","status":"todo","title":"Grant the window capability the overlay title bar needs for dragging","unplanned":true},"ts":"2026-09-05T02:08:38Z"} +{"actor":"unknown","ev":"01M23KYWDKPNTDM17MN8V6PX5B","item":"01M23KYWDKJPH89J1M3TSRM0DB","op":"create","set":{"body":"The format toolbar and the app header ride along when a long note scrolls. Lock the shell to the window, keep the toolbar (and find/Ask AI chrome) above the document, and scroll only the editor surface. Header and sidebar stay put. E2E: a tall note scrolls; toolbar and header Y do not change; window.scrollY stays 0.","discovered_during":"01M1MVB2ZZGP7FHW2TX6CNA6BE","kind":"bug","level":"task","milestone":"v0.6.5","priority":"P1","status":"todo","title":"Keep the format toolbar fixed while the note scrolls","unplanned":true},"ts":"2026-09-09T17:37:57Z"} +{"actor":"unknown","ev":"01M23KYYGPJ964ZQHPNMHYQHWN","item":"01M23KYWDKJPH89J1M3TSRM0DB","op":"update","set":{"status":"in_progress"},"ts":"2026-09-09T17:37:59Z"} +{"actor":"unknown","ev":"01M23M9Q6BPQ24HEJ2G8FRSZX3","item":"01M23KYWDKJPH89J1M3TSRM0DB","op":"close","set":{"resolution":"Shell locked to the viewport. Header and format toolbar stay put; only .editor-zoom scrolls. E2E asserts Y and window.scrollY.","status":"done"},"ts":"2026-09-09T17:43:52Z"} diff --git a/CHANGELOG.md b/CHANGELOG.md index a37d1b8..1a009e1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,12 @@ All notable changes to Motion are recorded here. Dates are UTC. ## Unreleased +### Fixed + +- **Format toolbar stays put.** A long note used to grow the window, so the + header and the Bold/Italic toolbar scrolled away with the document. The + shell is locked to the viewport; only the editor surface scrolls. + ## 0.6.4 — 2026-09-04 Editor fills the window; zoom scales notes not chrome; icon toolbar; header drag diff --git a/docs/.index/_graph.json b/docs/.index/_graph.json index cdef725..a0b39d3 100644 --- a/docs/.index/_graph.json +++ b/docs/.index/_graph.json @@ -905,6 +905,16 @@ "to": "release/v0.6.4", "type": "targets" }, + { + "from": "item/01M23KYWDKJPH89J1M3TSRM0DB", + "to": "pr/60", + "type": "lands-in" + }, + { + "from": "item/01M23KYWDKJPH89J1M3TSRM0DB", + "to": "release/v0.6.5", + "type": "targets" + }, { "from": "plan/2026-07-26-motion-next-phase", "to": "item/01KYFZ6RBH4J746JDANTQKYVSN", @@ -2114,6 +2124,11 @@ "status": "todo", "title": "Grant the window capability the overlay title bar needs for dragging" }, + "item/01M23KYWDKJPH89J1M3TSRM0DB": { + "doc_type": "item", + "status": "done", + "title": "Keep the format toolbar fixed while the note scrolls" + }, "plan/2026-07-26-motion-next-phase": { "doc_type": "plan", "source": "docs/plans/2026-07-26-motion-next-phase.md", @@ -2201,6 +2216,9 @@ "pr/58": { "doc_type": "pr" }, + "pr/60": { + "doc_type": "pr" + }, "release/v0.1.0": { "doc_type": "release" }, @@ -2222,6 +2240,9 @@ "release/v0.6.4": { "doc_type": "release" }, + "release/v0.6.5": { + "doc_type": "release" + }, "roadmap": { "doc_type": "roadmap", "source": "docs/roadmap.md", diff --git a/docs/.index/_inventory.json b/docs/.index/_inventory.json index b823421..7bd3008 100644 --- a/docs/.index/_inventory.json +++ b/docs/.index/_inventory.json @@ -207,10 +207,10 @@ { "canonical_key": "roadmap", "doc_type": "roadmap", - "generated_at": "2026-09-05T02:08:38Z", + "generated_at": "2026-09-09T17:43:52Z", "slug": "roadmap", "source": "docs/roadmap.md", - "source_hash": "c2f509fd", + "source_hash": "e089aeff", "title": "Roadmap", "truth_state": "current", "wiki": "https://github.com/SpillwaveSolutions/motion/wiki/Roadmap", diff --git a/docs/.index/item/01M23KYWDKJPH89J1M3TSRM0DB.yml b/docs/.index/item/01M23KYWDKJPH89J1M3TSRM0DB.yml new file mode 100644 index 0000000..d069975 --- /dev/null +++ b/docs/.index/item/01M23KYWDKJPH89J1M3TSRM0DB.yml @@ -0,0 +1,2 @@ +code: + - {pr: 60} diff --git a/docs/.index/publish-manifest.json b/docs/.index/publish-manifest.json index ad11143..2930b1d 100644 --- a/docs/.index/publish-manifest.json +++ b/docs/.index/publish-manifest.json @@ -44,7 +44,7 @@ "frozen": false, "page_name": "Index-Traceability", "render": "as-is", - "render_hash": "50595a2f3ed5", + "render_hash": "eeeace256963", "source": "docs/.index/rendered/traceability.md", "title": "Traceability Index", "truth_state": "current", @@ -220,6 +220,16 @@ "truth_state": "not tracked", "wiki_key": "pr/58" }, + { + "frozen": false, + "page_name": "PR-60", + "render": "as-is", + "render_hash": "0fdc515063ea", + "source": "docs/.index/rendered/prs/60.md", + "title": "PR #60", + "truth_state": "not tracked", + "wiki_key": "pr/60" + }, { "frozen": false, "page_name": "Release-v0.1.0+dogfood", @@ -290,6 +300,16 @@ "truth_state": "shipped", "wiki_key": "release/v0.6.4" }, + { + "frozen": false, + "page_name": "Release-v0.6.5", + "render": "as-is", + "render_hash": "50c218fec82e", + "source": "docs/.index/rendered/releases/v0.6.5.md", + "title": "Release v0.6.5", + "truth_state": "shipped", + "wiki_key": "release/v0.6.5" + }, { "frozen": false, "page_name": "Ticket-01KYDZ4A5HN1AZ7BN8Q2WV3XVN", @@ -1580,6 +1600,16 @@ "truth_state": "open", "wiki_key": "item/01M1QN6CE0P31CYJZFG7K9D3K7" }, + { + "frozen": false, + "page_name": "Ticket-01M23KYWDKJPH89J1M3TSRM0DB", + "render": "as-is", + "render_hash": "431ad35d7186", + "source": "docs/.index/rendered/tickets/01M23KYWDKJPH89J1M3TSRM0DB.md", + "title": "Keep the format toolbar fixed while the note scrolls", + "truth_state": "done", + "wiki_key": "item/01M23KYWDKJPH89J1M3TSRM0DB" + }, { "banner": "> **Current** \u2014 this is the living version; regenerated at 2026-07-29T23:00:00Z. Historical snapshots are linked from [[Index-Releases]].", "frozen": false, @@ -1669,11 +1699,11 @@ "wiki_key": "plan/2026-09-03-editor-surface-zoom-layout-icons" }, { - "banner": "> **Current** \u2014 this is the living version; regenerated at 2026-09-05T02:08:38Z. Historical snapshots are linked from [[Index-Releases]].", + "banner": "> **Current** \u2014 this is the living version; regenerated at 2026-09-09T17:43:52Z. Historical snapshots are linked from [[Index-Releases]].", "frozen": false, "page_name": "Roadmap", "render": "doc+banner", - "render_hash": "02417f3f7604", + "render_hash": "c0a79b7afa57", "source": "docs/roadmap.md", "title": "Roadmap", "truth_state": "current", diff --git a/docs/.index/rendered/prs/60.md b/docs/.index/rendered/prs/60.md new file mode 100644 index 0000000..2af0451 --- /dev/null +++ b/docs/.index/rendered/prs/60.md @@ -0,0 +1,13 @@ +# PR #60 + +`pr/60` · status: **not tracked** + +Changed files: not tracked. Test/Review status: not tracked (see the deferred PR live-metadata sync item). + +## Linked Tickets + +- [[Ticket-01M23KYWDKJPH89J1M3TSRM0DB]] Keep the format toolbar fixed while the note scrolls — The format toolbar and the app header ride along when a long note scrolls. + +## Related Releases + +- [[Release-v0.6.5]] diff --git a/docs/.index/rendered/releases/v0.6.5.md b/docs/.index/rendered/releases/v0.6.5.md new file mode 100644 index 0000000..8a1f81d --- /dev/null +++ b/docs/.index/rendered/releases/v0.6.5.md @@ -0,0 +1,17 @@ +# Release v0.6.5 + +`release/v0.6.5` · **shipped** + +1 item(s) shipped. + +## Change Log + +- [[Ticket-01M23KYWDKJPH89J1M3TSRM0DB]] Keep the format toolbar fixed while the note scrolls — The format toolbar and the app header ride along when a long note scrolls. + +## Release Tree + +- [[Ticket-01M23KYWDKJPH89J1M3TSRM0DB]] Keep the format toolbar fixed while the note scrolls (task) + +## Related PRs + +- [[PR-60]] diff --git a/docs/.index/rendered/tickets/01M23KYWDKJPH89J1M3TSRM0DB.md b/docs/.index/rendered/tickets/01M23KYWDKJPH89J1M3TSRM0DB.md new file mode 100644 index 0000000..8c2bdde --- /dev/null +++ b/docs/.index/rendered/tickets/01M23KYWDKJPH89J1M3TSRM0DB.md @@ -0,0 +1,13 @@ +# Keep the format toolbar fixed while the note scrolls + +`01M23KYWDKJPH89J1M3TSRM0DB` · task/bug · **done** + +The format toolbar and the app header ride along when a long note scrolls. + +## Linked PRs + +- [[PR-60]] + +## Release + +- [[Release-v0.6.5]] diff --git a/docs/.index/rendered/traceability.md b/docs/.index/rendered/traceability.md index 3a2cf86..8f16166 100644 --- a/docs/.index/rendered/traceability.md +++ b/docs/.index/rendered/traceability.md @@ -2,6 +2,11 @@ _The evidence chain: plan → item → ticket → code → release, forward and backward. Generated from `docs/.index/_graph.json`; do not edit._ +### Keep the format toolbar fixed while the note scrolls +`01M23KYWDKJPH89J1M3TSRM0DB` · status: done +- lands-in: pr/60 +- targets: release/v0.6.5 + ### Grant the window capability the overlay title bar needs for dragging `01M1QN6CE0P31CYJZFG7K9D3K7` · status: todo - targets: release/v0.6.4 diff --git a/docs/roadmap.md b/docs/roadmap.md index 24fe03e..143e78f 100644 --- a/docs/roadmap.md +++ b/docs/roadmap.md @@ -2,8 +2,8 @@ wiki_key: roadmap doc_type: roadmap truth_state: current -source_hash: c2f509fd -generated_at: 2026-09-05T02:08:38Z +source_hash: e089aeff +generated_at: 2026-09-09T17:43:52Z --- diff --git a/e2e/layout.spec.ts b/e2e/layout.spec.ts index 75e0921..959f804 100644 --- a/e2e/layout.spec.ts +++ b/e2e/layout.spec.ts @@ -102,3 +102,41 @@ test("mousedown on the logo does not start a text selection", async ({ page }) = const selected = await page.evaluate(() => window.getSelection()?.toString() ?? ""); expect(selected).toBe(""); }); + +test("scrolling a long note leaves the header and format toolbar in place", async ({ page }) => { + await gotoApp(page); + await page.setViewportSize({ width: 1200, height: 560 }); + const editor = page.locator(".ProseMirror"); + await expect(editor).toBeVisible(); + await editor.click(); + await page.keyboard.insertText( + Array.from({ length: 48 }, (_, i) => `Pad line ${i} so the note is taller than the window.`).join("\n\n"), + ); + + const header = page.locator(".app-header"); + const toolbar = page.locator(".editor-toolbar"); + const surface = page.getByTestId("editor-scroll"); + await expect(toolbar).toBeVisible(); + await expect(surface).toBeVisible(); + + const headerBefore = await header.boundingBox(); + const toolbarBefore = await toolbar.boundingBox(); + expect(headerBefore).toBeTruthy(); + expect(toolbarBefore).toBeTruthy(); + + await expect + .poll(async () => surface.evaluate((el) => el.scrollHeight - el.clientHeight)) + .toBeGreaterThan(200); + + await surface.evaluate((el) => { + el.scrollTop = 360; + }); + + await expect.poll(async () => surface.evaluate((el) => el.scrollTop)).toBeGreaterThan(200); + + const headerAfter = await header.boundingBox(); + const toolbarAfter = await toolbar.boundingBox(); + expect(headerAfter!.y).toBeCloseTo(headerBefore!.y, 0); + expect(toolbarAfter!.y).toBeCloseTo(toolbarBefore!.y, 0); + expect(await page.evaluate(() => window.scrollY)).toBe(0); +}); diff --git a/src/components/Editor/index.tsx b/src/components/Editor/index.tsx index 61989ed..c536ede 100644 --- a/src/components/Editor/index.tsx +++ b/src/components/Editor/index.tsx @@ -994,7 +994,7 @@ function Editor({ {toolbar} {findBar} {askAiPanel} -