Move a note in one press, and stop Draw inventing a page

Moving lived under a right-click, behind a submenu: two steps before the
list of places appeared at all, and on a phone a long press followed by a
flyout. There is a button on the row now, and it opens one screen with
the chapters of this notebook and the other notebooks together, marking
where the note already is.

The spare sheet in Draw mode was drawn as solid paper, so pressing Draw
on a one-page note made a second page appear from nowhere while the count
still said "of 1". It exists for a good reason — pages otherwise come
only from how far the writing runs, so drawing on page two would mean
writing two pages first — but it should look like the offer it is. Dashed
outline, half opacity, and it says what it is for. It counts once
something is on it.

And the two buttons above the list did not match: the one I added last
round was larger and bolder than the one it sat beside, and the older
one's target was nineteen pixels tall, which a finger misses. Both are
one shape now. A separator's label matches a chapter's name in size for
the same reason — two type treatments in one list is noise, and the
difference was not saying anything.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-12 13:43:51 +02:00
1 parent 9d5ac1db27
commit 632ea5dcd9
7 files changed
+329 -29

No files matched your search

+12 -5
View File
@@ -31,12 +31,14 @@ try {
await p.getByRole("button", { name: "Create", exact: true }).click();
await p.waitForTimeout(2000);
};
/* One press of the button on the row, then choose. It used to be a
right-click into a submenu — two steps before the places even appeared, and
on a phone a long press followed by a flyout. */
const moveTo = async (noteTitle, target) => {
await p.locator("[data-note-row]").filter({ hasText: noteTitle }).first().click({ button: "right", force: true });
await p.waitForTimeout(600);
await p.locator("[data-submenu-toggle]").first().click();
await p.waitForTimeout(500);
await p.locator("[data-submenu] button").filter({ hasText: target }).first().click();
const row = p.locator("[data-note-row]").filter({ hasText: noteTitle }).first();
await row.locator("xpath=preceding-sibling::button[@data-move-note]").first().click();
await p.waitForTimeout(700);
await p.locator("[data-move-target]").filter({ hasText: target }).first().click();
await p.waitForTimeout(2500);
};
@@ -59,6 +61,11 @@ try {
check(server.length === 1 && server[0].name === "Rechnungen", "the server has it", JSON.stringify(server));
/* ── filing a note ── */
check(
(await p.locator("[data-move-note]").count()) === 2,
"every note has a move button, without a right-click",
String(await p.locator("[data-move-note]").count())
);
await moveTo("Stromrechnung", "Rechnungen");
check(
(await titles()).join(",") === "Zählerstand",
+13
View File
@@ -149,6 +149,19 @@ try {
(await p.locator('canvas[data-draw-page="2"]').count()) === 1,
"there is a blank page past the end to draw on, before anything is written"
);
/* It has to read as an offer, not as a page that appeared by itself. Drawn
solid, a second sheet turned up the moment Draw was pressed while the count
still said "of 1", which looks like the app inventing a page. */
check(
(await p.locator("[data-spare-page]").count()) === 1,
"and it is marked as the spare rather than drawn as paper",
String(await p.locator("[data-spare-page]").count())
);
check(
(await p.locator("[data-note-position]").innerText()).includes("of 1"),
"so the count still says one page until something is on it",
await p.locator("[data-note-position]").innerText()
);
await draw(p, 1);
const first = await inkGrid(p, 1);