The PR's commits are next's merged ones rebased onto main; next keeps its tree.
apps/designcraft/src/main.rs: keep next's startup block (status_line, catch_unwind app creator); portable_note set after load_prefs.
README.md: keep next's Portable mode section, then Graphics backend and processor.
crates/engine/src/cmd/object.rs: next's side with 069fe47b's auto-size guard, plus the PR's object.fit locked-objects note and the bottom-on-the-last-baseline fit; the reapplied fit_text_frame_tests module dropped, its baseline assertion added to next's copy.
crates/tools/src/select.rs, crates/tools/src/tests.rs: keep next's side.
crates/ui-egui/src/canvas.rs: drop the reapplied duplicate of the handle double-click test.
ROADMAP.md: next's line with the locked-objects note; no second copy.
The PR's commits are next's merged ones rebased onto main; next keeps its tree.
ROADMAP.md: the font menu line was already there; keep one.
crates/ui-egui/src/i18n.rs: keep next's New Document rows next to the font menu rows.
crates/ui-egui/src/lib.rs: keep next's UiState fields (recent documents, preview) with the font sample ones.
crates/ui-egui/src/panels/mod.rs: keep next's swatch_picker return value.
docs/ui-parity.md: keep next's IME row.
The server refuses arguments a tool's schema doesn't list (#803), so keys a
tool passes on must be in its schema. new_document lacked intent, units,
startPage, slug and primaryTextFrame (and bleed's edge array); ui_set lacked
status, documentGrid, controlBar, closePanel and dockExpanded; drag lacked
button and ctrl, and click and drag forwarded each other's keys. A test checks
forwarded keys against the schemas, file.new's params and ui.set's handler.
main (#731) and next fixed the same panic separately; main reads null as no
options and tests that the export succeeds, next's test listed null among the
errors. The CLI keeps main's reading.
next writes the document's ruler origin (Spread, Page or Spine) to IDML; main
measured guide locations from the spread's left edge, as for SpreadOrigin only.
A page-origin document's guides came back one page width to the right. The
round-trip test covers all three origins.
main's file guard requires reads to pass the automation roots. Loading styles
from a path, the recent-files check and sniffing a dropped file without an
extension read with std::fs directly; they use the engine's io module.
The merge took main's 236 pt test frame (19 lines whatever the last line's
descent) with next's 7/3 expectations, which belong to next's 240 pt frame.
With main's frame the paragraph splits 6/4, as main's tests said.
main rolls a half-run script back (#709); next's #406 test expected the
successful prefix to stay as an undo step. Both keep a partial edit from being
stranded; the script keeps main's rollback, and the test checks that. The
generic partial-failure undo step stays covered by the fillWithPlaceholder test.
next converts InDesign files (#808); main's #21 check refused them by extension
before the converter ran. The check goes, and a converter error carries #21's
advice to export IDML.
The Find/Change dialog and main's find-scope tests send one parameter set
(with change, first, attrs) to Find, Find Next and Change. next's strict
parameter check refused those keys on find.find and find.next, so Find
failed in the dialog. The two commands now name the keys as ignored.
next's extract fills missing payloads with empty notes so the slice is a valid
story; main's test expected the slice to hold only the payloads the source had.
The pasted result is the same either way.
Reject page selections that cannot fit the target index type before conversion, and return an error for the largest direct PPTX page index.
Validated the combined main and PR tree with all seven cargo xtask ci stages (1,967 passing tests), four actual WASM export-page regressions, and successful FreeBSD, Windows ARM64, and packaging workflows.