Keep the gap blank, and give the writing more of the page

Two things wrong with the paper.

"Start writing..." was printed at the foot of every page that had a break
after it. The placeholder extension styles `[contenteditable]:empty::before`,
and the spacer holding a gap open is exactly that: empty, and not
editable. It inherited a placeholder meant for an empty note.

And the column was too narrow for the sheet it now sits on — about 73
characters, which left 117px of blank paper down each edge and made the
writing look lost. Widened to about 80, a little short of where the eye
stops reliably finding the start of the next line, which leaves roughly
8% of the sheet as margin: a document's margin rather than a picture
frame.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-11 21:26:51 +02:00
1 parent 816cc8e68b
commit d82e72d358
5 files changed
+46 -85

No files matched your search

+11
View File
@@ -211,6 +211,17 @@ try {
(await p.locator(".ne-page-spacer").count()) > 0,
"which takes holding the gap open inside the text itself"
);
/* The placeholder extension styles `[contenteditable]:empty::before`, and a
* spacer is exactly that. "Start writing..." was printed at the foot of every
* page that had a break after it. */
check(
await p.evaluate(() =>
[...document.querySelectorAll(".ne-page-spacer")].every(
(el) => getComputedStyle(el, "::before").content === "none"
)
),
"and the gap stays blank — no placeholder printed at the foot of the page"
);
/* The note is still one document — pages are drawn, not stored. */
const stored = (await api(p, "GET", "/notes")).body[0];
-78
View File
@@ -1,78 +0,0 @@
/* Throwaway: four pages, and what that stray placeholder is. */
import { launch, withFreshUser, createNotebook, createNote, OUT } from "./lib.mjs";
const browser = await launch();
const s = await withFreshUser(browser, "probe");
const p = s.page;
p.on("pageerror", (e) => console.log("PAGEERROR", String(e)));
await p.setViewportSize({ width: 1680, height: 950 });
await createNotebook(p, "Papier");
await createNote(p);
await p.waitForTimeout(1500);
await p.locator(".ProseMirror").click();
// Paste rather than type: typing this much loses keystrokes and says nothing
// about the layout, which is what is being looked at here.
await p.evaluate(() => {
const text = Array.from({ length: 160 }, (_, i) => `Absatz ${i + 1}: Dichtungen altern durch Wärme und Zeit.`).join("\n");
const dt = new DataTransfer();
dt.setData("text/plain", text);
document.querySelector(".ProseMirror").dispatchEvent(
new ClipboardEvent("paste", { clipboardData: dt, bubbles: true, cancelable: true })
);
});
await p.waitForTimeout(4000);
console.log(
JSON.stringify(
await p.evaluate(() => {
const pm = document.querySelector(".ProseMirror");
const pmTop = pm.getBoundingClientRect().top;
const sheets = [...document.querySelectorAll("[data-page-sheet]")];
const gaps = sheets.slice(0, -1).map((el, i) => ({
from: el.getBoundingClientRect().bottom - pmTop,
to: sheets[i + 1].getBoundingClientRect().top - pmTop,
}));
const inGap = [];
for (const el of pm.children) {
if (el.classList.contains("ne-page-spacer")) continue;
const r = el.getBoundingClientRect();
if (r.height === 0) continue;
const top = r.top - pmTop,
bottom = r.bottom - pmTop;
for (const g of gaps) {
if (bottom > g.from + 0.5 && top < g.to - 0.5) inGap.push((el.textContent || "").slice(0, 24));
}
}
const placeholder = [...pm.querySelectorAll("[data-placeholder]")].map((el) => ({
text: (el.textContent || "").slice(0, 20),
first: el === pm.firstElementChild,
top: Math.round(el.getBoundingClientRect().top - pmTop),
}));
return {
blocks: [...pm.children].filter((c) => !c.classList.contains("ne-page-spacer")).length,
height: pm.scrollHeight,
sheets: sheets.length,
spacers: [...document.querySelectorAll(".ne-page-spacer")].map((el) => el.offsetHeight),
inGap,
placeholder,
position: document.querySelector("[data-note-position]")?.textContent,
margins: (() => {
const sheet = sheets[0].getBoundingClientRect();
const col = pm.getBoundingClientRect();
return {
sheetW: Math.round(sheet.width),
colW: Math.round(col.width),
left: Math.round(col.left - sheet.left),
right: Math.round(sheet.right - col.right),
};
})(),
};
}),
null,
1
)
);
await p.screenshot({ path: `${OUT}/probe.png` });
await s.cleanup();
await browser.close();