Write on paper: a sheet per page, with a gap between them

The writing surface was a column of text in an empty pane. A sheet was
drawn behind it, but only once you started drawing — so writing looked
like text floating in the middle of nothing, and the space either side of
the column read as a void rather than as a margin.

Now every page is a sheet of its own, centred, with a gap after it: the
same way the PDF reader draws its pages, because a page in a note and a
page in a document should read as the same kind of thing.

The gap is the part that takes work. The browser knows nothing about the
sheets and lays the text out as one flow, putting a line straight across
the gap and cutting it in half. So editor/pagination.js measures the flow
and pushes any block that would straddle a gap onto the next page, with a
spacer of exactly the right height in front of it. A paragraph moves down
entire, which is what a page break means on paper. A block taller than a
page is left to run over, since splitting one would mean laying out its
insides ourselves.

The spacers are decorations, not content: they never enter the document,
never reach the server and never appear in an export. Two checks hold
that down — one asks whether any block sits in a gap, the other reads the
stored body back and looks for them there.

Two things that are easy to get wrong. The spacer's height is not the
distance the text moves: margins that used to collapse into each other no
longer do with something between them, so the layout gains that much for
free and the spacer is made exactly that much shorter. And heights change
with no transaction to announce it — a webfont landing, an image
arriving, the window resizing — which a ResizeObserver on the editor
element catches.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
marcandClaude Opus 5 committed 2026-08-11 20:17:28 +02:00
1 parent 3ce867c6d0
commit 97a3764d92
9 files changed
+492 -47

No files matched your search

+20
View File
@@ -8,6 +8,26 @@ not from the output of `docker push`.
---
## Unreleased
**Added**
- **You write on paper.** Each page is a sheet of its own, centred, with a gap
after it — the same way the PDF reader draws its pages. The sheet used to
appear only once you started drawing, which left the writing mode looking like
text floating in an empty pane, and made the space either side of the column
read as a void rather than as a margin.
- Text is broken against those sheets, so no paragraph is ever cut in half by a
gap. The breaks are decorations: nothing enters the document, reaches the
server, or appears in an export.
**Fixed**
- **A note with a drawing could not be typed in at all.** The box wrapping each
page's ink layer lay over the text and swallowed every click meant for it. The
canvas inside was already deaf to the pointer; its wrapper was not. Introduced
the same day, with per-page drawing.
---
## 2026-08-11 — Drawing on every page, and PDFs findable everywhere
**Images** — web `sha256:dc804f7b…`, server `sha256:0832ee2b…`