Cargo.lock | 2 + apps/ios/Snowbound/CanvasView.swift | 9 + corpus/page-date/README.md | 19 + corpus/page-date/candidate/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/page-date/candidate/pictures.one | Bin 0 -> 24184 bytes corpus/page-date/cold/commands.jsonl | 3 + corpus/page-date/cold/machine.json | 1 + corpus/page-date/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/page-date/cold/notebook/pictures.one | Bin 0 -> 24184 bytes corpus/page-date/cold/read/environment.json | 7 + corpus/page-date/cold/read/hierarchy.xml | 2 + corpus/page-date/cold/read/page-000.navigation.json | 13 + corpus/page-date/cold/read/page-000.png | Bin 0 -> 38370 bytes corpus/page-date/cold/read/page-000.xml | 2 + corpus/page-date/cold/read/page-001.navigation.json | 13 + corpus/page-date/cold/read/page-001.png | Bin 0 -> 38046 bytes corpus/page-date/cold/read/page-001.xml | 2 + corpus/page-date/cold/read/page-002.navigation.json | 13 + corpus/page-date/cold/read/page-002.png | Bin 0 -> 38352 bytes corpus/page-date/cold/read/page-002.xml | 6 + corpus/page-date/cold/read/payloads.json | 3 + corpus/page-date/cold/run.json | 18 + corpus/page-date/cold/scripts/cold.ps1 | 27 ++ corpus/page-date/cold/scripts/read.ps1 | 142 ++++++ corpus/page-date/cold/source.json | 14 + corpus/page-date/cold/teardown.json | 1 + corpus/page-date/native/after.xml | 2 + corpus/page-date/native/before.xml | 2 + corpus/page-date/native/commands.jsonl | 4 + corpus/page-date/native/kept.xml | 2 + corpus/page-date/native/machine.json | 1 + corpus/page-date/native/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/page-date/native/notebook/pictures.one | Bin 0 -> 23208 bytes corpus/page-date/native/read/environment.json | 7 + corpus/page-date/native/read/hierarchy.xml | 2 + corpus/page-date/native/read/page-000.xml | 2 + corpus/page-date/native/read/page-001.xml | 2 + corpus/page-date/native/read/page-002.xml | 6 + corpus/page-date/native/read/payloads.json | 3 + corpus/page-date/native/run.json | 19 + corpus/page-date/native/scripts/author.ps1 | 46 ++ corpus/page-date/native/scripts/cold.ps1 | 27 ++ corpus/page-date/native/scripts/read.ps1 | 142 ++++++ corpus/page-date/native/source.json | 14 + corpus/page-date/native/teardown.json | 1 + corpus/page-date/native/update.xml | 1 + crates/canvas/src/editor.rs | 394 +++++++++++++++-- crates/canvas/src/editor/ops.rs | 743 ++++++++++++++++++++++++++++++++ crates/canvas/src/gpu/page.rs | 27 ++ crates/canvas/src/gpu/page/background.rs | 5 + crates/canvas/src/gpu/page/picture.rs | 5 + crates/canvas/src/interaction/mod.rs | 15 + crates/canvas/tests/ops_differential.rs | 670 ++++++++++++++++++++++++++++ crates/canvas/tests/structural_roundtrip.rs | 47 +- crates/mobile/Cargo.toml | 1 + crates/mobile/include/snowbound.h | 1 + crates/mobile/src/lib.rs | 60 ++- crates/notebook/README.md | 4 + crates/notebook/examples/open_probe.rs | 236 ++++++++++ crates/notebook/src/lib.rs | 22 +- crates/notebook/src/merge.rs | 5 + crates/notebook/src/working.rs | 579 +++++++++++++++++-------- crates/notebook/tests/session.rs | 7 +- crates/onestore/src/edit.rs | 71 ++- crates/onestore/src/op/apply.rs | 22 + crates/onestore/src/op/lower.rs | 28 +- crates/onestore/src/op/mod.rs | 9 + crates/onestore/src/op/model.rs | 36 +- crates/onestore/src/op/tests.rs | 98 +++++ crates/onestore/src/page/write.rs | 3 + crates/snowbound/src/macos.rs | 14 + crates/snowbound/src/main.rs | 452 ++++++++++++++----- tools/native/page-date.ps1 | 46 ++ tools/test_page_date.py | 39 ++ 74 files changed, 3857 insertions(+), 362 deletions(-)