corpus/attachment-edit/README.md | 23 +++ corpus/attachment-edit/icon/candidate/Open Notebook.onetoc2 | Bin 0 -> 1604 bytes corpus/attachment-edit/icon/candidate/files.one | Bin 0 -> 8288 bytes corpus/attachment-edit/icon/cold/commands.jsonl | 3 + corpus/attachment-edit/icon/cold/machine.json | 1 + corpus/attachment-edit/icon/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/attachment-edit/icon/cold/notebook/files.one | Bin 0 -> 9784 bytes corpus/attachment-edit/icon/cold/read/b20a14e044e33eac39b4665e7d79813b8a3672dbbd27ed9d2e4ac866c13ec4b6.attachment | 1 + corpus/attachment-edit/icon/cold/read/environment.json | 7 + corpus/attachment-edit/icon/cold/read/hierarchy.xml | 2 + corpus/attachment-edit/icon/cold/read/page-000.xml | 2 + corpus/attachment-edit/icon/cold/read/payloads.json | 10 ++ corpus/attachment-edit/icon/cold/run.json | 18 +++ corpus/attachment-edit/icon/cold/scripts/cold.ps1 | 27 ++++ corpus/attachment-edit/icon/cold/scripts/read.ps1 | 142 +++++++++++++++++ corpus/attachment-edit/icon/cold/source.json | 14 ++ corpus/attachment-edit/icon/cold/teardown.json | 1 + corpus/attachment-edit/plain/candidate/Open Notebook.onetoc2 | Bin 0 -> 1604 bytes corpus/attachment-edit/plain/candidate/files.one | Bin 0 -> 7160 bytes corpus/attachment-edit/plain/cold/commands.jsonl | 3 + corpus/attachment-edit/plain/cold/machine.json | 1 + corpus/attachment-edit/plain/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/attachment-edit/plain/cold/notebook/files.one | Bin 0 -> 7160 bytes corpus/attachment-edit/plain/cold/read/b20a14e044e33eac39b4665e7d79813b8a3672dbbd27ed9d2e4ac866c13ec4b6.attachment | 1 + corpus/attachment-edit/plain/cold/read/environment.json | 7 + corpus/attachment-edit/plain/cold/read/hierarchy.xml | 2 + corpus/attachment-edit/plain/cold/read/page-000.xml | 2 + corpus/attachment-edit/plain/cold/read/payloads.json | 10 ++ corpus/attachment-edit/plain/cold/run.json | 18 +++ corpus/attachment-edit/plain/cold/scripts/cold.ps1 | 27 ++++ corpus/attachment-edit/plain/cold/scripts/read.ps1 | 142 +++++++++++++++++ corpus/attachment-edit/plain/cold/source.json | 14 ++ corpus/attachment-edit/plain/cold/teardown.json | 1 + corpus/picture-edit/README.md | 20 +++ corpus/picture-edit/candidate/Open Notebook.onetoc2 | Bin 0 -> 1604 bytes corpus/picture-edit/candidate/pictures.one | Bin 0 -> 7064 bytes corpus/picture-edit/cold/commands.jsonl | 3 + corpus/picture-edit/cold/machine.json | 1 + corpus/picture-edit/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/picture-edit/cold/notebook/pictures.one | Bin 0 -> 7064 bytes corpus/picture-edit/cold/read/environment.json | 7 + corpus/picture-edit/cold/read/hierarchy.xml | 2 + corpus/picture-edit/cold/read/page-000.xml | 4 + corpus/picture-edit/cold/read/payloads.json | 3 + corpus/picture-edit/cold/run.json | 18 +++ corpus/picture-edit/cold/scripts/cold.ps1 | 27 ++++ corpus/picture-edit/cold/scripts/read.ps1 | 142 +++++++++++++++++ corpus/picture-edit/cold/source.json | 14 ++ corpus/picture-edit/cold/teardown.json | 1 + crates/canvas/src/document.rs | 6 +- crates/canvas/src/editor.rs | 13 +- crates/canvas/src/gpu/page.rs | 4 + crates/canvas/src/outline.rs | 6 +- crates/notebook/README.md | 2 +- crates/onestore/README.md | 2 +- crates/onestore/src/document.rs | 5 + crates/onestore/src/page/mod.rs | 152 +++++++++++++++--- crates/onestore/src/page/write.rs | 270 +++++++++++++++++++++++++++++++- crates/onestore/src/write.rs | 160 ++++++++++++++++++- crates/onestore/tests/page_attachments.rs | 203 ++++++++++++++++++++++++ crates/onestore/tests/page_images.rs | 190 ++++++++++++++++++++++ crates/onestore/tests/page_model.rs | 2 + crates/onestore/tests/page_tables.rs | 4 +- crates/onestore/tests/support/page_edits.rs | 6 + tools/test_attachment_edit.py | 36 +++++ tools/test_picture_edit.py | 34 ++++ 66 files changed, 1768 insertions(+), 48 deletions(-)