Cargo.lock | 47 +- apps/ios/Snowbound.xcodeproj/project.pbxproj | 12 +- apps/ios/Snowbound/App.swift | 27 + apps/ios/Snowbound/CanvasView.swift | 35 +- apps/ios/Snowbound/Lists.swift | 36 +- apps/ios/Snowbound/Notebooks.swift | 4 + apps/ios/Snowbound/PageViewController.swift | 24 +- arc/canvas.md | 21 + corpus/equation-select/README.md | 26 + corpus/equation-select/candidate/Open Notebook.onetoc2 | Bin 0 -> 1604 bytes corpus/equation-select/candidate/links.one | Bin 0 -> 46824 bytes corpus/equation-select/cold/commands.jsonl | 3 + corpus/equation-select/cold/machine.json | 1 + corpus/equation-select/cold/notebook/Open Notebook.onetoc2 | Bin 0 -> 3764 bytes corpus/equation-select/cold/notebook/links.one | Bin 0 -> 46824 bytes corpus/equation-select/cold/read/environment.json | 7 + corpus/equation-select/cold/read/hierarchy.xml | 2 + corpus/equation-select/cold/read/page-000.navigation.json | 13 + corpus/equation-select/cold/read/page-000.png | Bin 0 -> 45260 bytes corpus/equation-select/cold/read/page-000.xml | 5 + corpus/equation-select/cold/read/payloads.json | 3 + corpus/equation-select/cold/run.json | 18 + corpus/equation-select/cold/scripts/cold.ps1 | 27 + corpus/equation-select/cold/scripts/read.ps1 | 144 +++++ corpus/equation-select/cold/source.json | 14 + corpus/equation-select/cold/teardown.json | 1 + corpus/equation-select/lab/after.xml | 5 + corpus/equation-select/lab/before.xml | 3 + corpus/equation-select/lab/limit-enter.xml | 5 + corpus/equation-select/lab/placeholder-enter.xml | 5 + corpus/equation-select/lab/roots-deleted.xml | 3 + corpus/print/README.md | 33 ++ corpus/print/native/Print.one | Bin 0 -> 47496 bytes corpus/print/native/rules-section.pdf | Bin 0 -> 145613 bytes corpus/print/native/section.pdf | Bin 0 -> 168568 bytes crates/canvas/Cargo.toml | 7 + crates/canvas/examples/print_pdf.rs | 40 ++ crates/canvas/examples/scratch_eqref.rs | 667 +++++++++++++++++++++ crates/canvas/examples/scratch_files.rs | 15 + crates/canvas/examples/scratch_runs.rs | 23 + crates/canvas/src/editor.rs | 67 ++- crates/canvas/src/editor/equation.rs | 122 +++- crates/canvas/src/editor/table.rs | 1 + crates/canvas/src/gpu/mod.rs | 1 + crates/canvas/src/gpu/page.rs | 85 +++ crates/canvas/src/interaction/ink.rs | 10 +- crates/canvas/src/interaction/mod.rs | 74 ++- crates/canvas/src/interaction/tests.rs | 37 +- crates/canvas/src/layout.rs | 3 + crates/canvas/src/lib.rs | 2 + crates/canvas/src/print.rs | 553 ++++++++++++++++++ crates/canvas/tests/links_equations.rs | 187 ++++++ crates/canvas/tests/picture_paste.rs | 196 +++++++ crates/draw/Cargo.toml | 5 + crates/draw/src/render.rs | 5 + crates/draw/src/render/pdf.rs | 1004 ++++++++++++++++++++++++++++++++ crates/draw/src/render/text.rs | 25 +- crates/mobile/src/lib.rs | 26 +- crates/mobile/src/tests.rs | 2 +- crates/notebook/Cargo.toml | 3 + crates/notebook/src/lib.rs | 3 +- crates/notebook/src/session.rs | 28 +- crates/onestore/examples/opts29_dump.rs | 29 + crates/snowbound/Cargo.toml | 6 +- crates/snowbound/assets/icon/Assets.car | Bin 0 -> 36936 bytes crates/snowbound/assets/icon/README.md | 20 + crates/snowbound/linux/README.md | 4 +- crates/snowbound/linux/package.sh | 6 +- crates/snowbound/src/commands.rs | 80 +-- crates/snowbound/src/desktop_linux.rs | 11 +- crates/snowbound/src/guide.rs | 106 ++++ crates/snowbound/src/linux.rs | 46 +- crates/snowbound/src/macos.rs | 82 ++- crates/snowbound/src/main.rs | 143 ++++- crates/snowbound/src/manage.rs | 88 ++- crates/snowbound/src/media_macos.rs | 9 +- crates/snowbound/src/menubar.rs | 7 +- crates/snowbound/src/options.rs | 16 +- crates/snowbound/src/paste.rs | 184 ++++++ crates/snowbound/src/print.rs | 118 ++++ crates/snowbound/src/print_linux.rs | 110 ++++ crates/snowbound/src/print_macos.rs | 153 +++++ crates/snowbound/src/print_windows.rs | 61 ++ crates/snowbound/src/screenshot.rs | 4 +- crates/snowbound/src/screenshot/snow_leopard.rs | 32 +- crates/snowbound/src/settings.rs | 44 +- crates/snowbound/src/sidebar.rs | 8 +- crates/snowbound/src/update.rs | 30 +- crates/snowbound/src/windows.rs | 67 ++- crates/ui/src/layout.rs | 34 ++ crates/ui/src/lib.rs | 7 + crates/ui/src/tests.rs | 11 + crates/ui/src/text.rs | 1 + docs/guide-notebook/Snowbound Guide/.snowbound/tags.json | 8 + docs/guide-notebook/Snowbound Guide/.snowbound/tags/308029094b76e765ca4025c6e8978ff3f1e5f696601ca46fed3803a81c37792c.svg | 14 + docs/guide-notebook/Snowbound Guide/Drawing & Recording.one | Bin 0 -> 92072 bytes docs/guide-notebook/Snowbound Guide/Getting Started.one | Bin 0 -> 89664 bytes docs/guide-notebook/Snowbound Guide/Open Notebook.onetoc2 | Bin 0 -> 6008 bytes docs/guide-notebook/Snowbound Guide/Sharing & Sync.one | Bin 0 -> 26976 bytes docs/guide-notebook/Snowbound Guide/Tags & Search.one | Bin 0 -> 35864 bytes docs/guide-notebook/Snowbound Guide/Writing & Formatting.one | Bin 0 -> 86896 bytes platform/snow-leopard/rt/appkit.c | 8 - tools/RELEASE.md | 37 +- tools/canvas/README.md | 2 +- tools/canvas/build_macos.py | 21 +- tools/native/picture-objects.ps1 | 37 ++ tools/native_runner.py | 2 +- tools/release.py | 8 +- tools/test_equation_select.py | 40 ++ tools/test_release.py | 7 +- 110 files changed, 5106 insertions(+), 310 deletions(-)