Commit Graph
1253 Commits
Author SHA1 Message Date
aiongg fa3a184fad Merge #81 (update): Text: kerning survives a colour change (#29)
#81 with #84's review fixes merged in; tree unchanged against next.

Conflict: crates/idml/src/tests.rs: next's side (#81 carries #83's tests.rs through #84, already merged in 9196a164)
2026-10-12 04:27:05 +00:00
aiongg 6c52cdbc10 Integration: cs/ru/uk Swatches hint for objects or text (#84 × cs/ru/uk catalogs)
#84 renames the Swatches hint key to "Select an object or text to color its fill or stroke." and replaced the old key in uk.rs, where next already had the new key: the Ukrainian catalog had it twice, so #84's line is dropped. The Czech and Russian catalogs carried the old key, now unknown; they get the new key (our own translation, extended from the existing entry).
2026-10-12 04:26:43 +00:00
aiongg d30cefe166 Integration: renaming a swatch reaches endnote text (#84 × #416)
#84's Add to Swatches renamed the colour in footnotes and endnotes through its own helpers; next's Document::rename_swatch_refs (#416), which add_to_swatches calls after the merge, covered footnotes but not endnotes. rename_swatch_refs now walks each story's endnotes too, and #84's test checks an endnote.
2026-10-12 04:23:54 +00:00
aiongg 70fe825045 Integration: autoflow page-break test names its command (#266 × #84)
#84 gives autoflow the id of the command that autoflows, for its errors; #266's odd/even page-break test called autoflow with the old three arguments. The test passes "file.place".
2026-10-12 04:20:54 +00:00
aiongg 89abf6b6c9 Merge #84 (update): Text editing, snapping and text threading (#23)
Review fixes for text editing, paste and threading (fix84-text,
fix84-thread), the Italian/Japanese/Portuguese/Ukrainian Swatches hint
and #83's update merged into the PR branch.

Conflict: ROADMAP.md: header combines #84's threading change with next's 2026-10-11 changes; progress lines and change-log rows both (#84's 2026-10-12 first); stage line #84's (alpha ~5–7 h away)
Conflict: docs/gaps.md: #84's header text plus next's kerning/fonts/print changes
Conflict: docs/roadmap.md: next's M1 row (#186 done), #84's M2 row
Conflict: crates/engine/src/cmd/style.rs: next's side; add_to_swatches calls next's Document::rename_swatch_refs, #84's rename_in_story/rename_in dropped (next's covers text, tables, cells, notes and items); #84's test kept
Conflict: crates/idml/src/tests.rs: next's side (#84 carries #83's tests.rs, already merged in 9196a164)
Conflict: crates/tools/src/select.rs: overlays keeps next's content-move ghosts and live corners, plus #84's snapped loaded-cursor drag frame; a Place click without a drag shows nothing
Conflict: crates/ui-egui/src/i18n/it.rs: next's side (the Swatches hint entry is already further down)
2026-10-12 04:20:34 +00:00
aiongg 9196a1643f Merge #83 (update): Layout: first baselines, Jump Object wrap, drop caps, IDML defaults
Conflict: crates/format/src/lib.rs: next's side (upgrade, merge_duplicate_assets, then mark_differing_margins_local) in both loaders
Conflict: docs/target-app-parity.md: next's RTL and Interface Language lines, plus #83's "IDML Kashidas"
2026-10-12 04:17:58 +00:00
aiongg d2a6dd39a2 Integration: character fill swatch errors go through known_swatch (#403 × #520)
#403 added validate_char_fill with its own message; #520 added known_swatch for object fills and strokes, which also suggests the intended name. validate_char_fill now calls known_swatch with key "fill", so one error path covers both. #403's tests still pass (the message names the fill, swatch.create and the returned name).
2026-10-12 04:17:15 +00:00
aiongg 8f1c60e4fc Merge upstream main 835edae6
Brings #514 (MCP request replay), #523 final (already in next), #403
(character fill must name a swatch), #520 and #521 finals (already in
next as their PR heads).

Conflict: crates/engine/src/cmd/object.rs: next's side throughout (transform.move doc with content?, object.fill with tint alone from #525, move_content, reorder/content_move/group/tint_alone test modules); upstream's copy_ids_tests already in next
Conflict: crates/engine/src/cmd/text.rs: both; #403's validate_char_fill after next's ruby_cmd
Conflict: crates/pdf/src/export.rs: next's side (item/item_guarded cycle guard, frame_objects; upstream's anchored loop dropped as in d11ccad3)
Conflict: crates/render/src/lib.rs: next's side (drawing_items, draw_item/draw_item_inner)
2026-10-12 04:15:40 +00:00
aiongg a993f2ea37 Merge #84 into fix/29-kerning-across-runs 2026-10-12 04:12:25 +00:00
aiongg dd044dd8b1 Merge review fixes: threading 2026-10-12 04:10:06 +00:00
aiongg 237bfb7a2c Merge review fixes: text editing and paste 2026-10-12 04:10:06 +00:00
aiongg 6f55df4370 Canvas: a press right after a drag is not a double click 2026-10-12 04:07:47 +00:00
aiongg 9964025ffb Swatches: Add to Swatches renames the colour in text, tables and notes 2026-10-12 04:04:07 +00:00
aiongg 9d3581929a Threading: progress docs for threading by hand
The alpha gate's threading row and gap 0 shrink to the Primary Text
Frame page fixes (#165). New gaps: autoflow onto the existing following
pages, and threading into a grouped frame with the loaded text cursor.
2026-10-12 04:02:35 +00:00
aiongg 7adc0be491 Threading: Alt-click moves the loaded cursor on only to the frame the click added
The click records the frame it expects to join (the clicked frame, or a
new one in place of the old neighbour). The load moves on only when the
document has that frame there, so a failed thread or an undo leaves the
cursor on the frame it was loaded from; an undo after moving on goes
back to it.
2026-10-12 04:01:20 +00:00
aiongg 52b58c0519 Text: Bold and Italic that change nothing add no undo step 2026-10-12 04:01:12 +00:00
aiongg d163837781 Text: text.selectAt needs a point 2026-10-12 04:00:19 +00:00
aiongg 6a0f0cf386 Text: a quadruple click selects the paragraph with its return 2026-10-12 03:59:53 +00:00
aiongg 45144c5044 Text: moving the caret drops the pending typing format 2026-10-12 03:59:21 +00:00
aiongg aa4f85c8e1 Threading: a frame dragged with the loaded text cursor snaps like frame drawing
The press point and the moving edges snap to guides and smart guides,
and the drag shows the snapped frame and its snap guides.
2026-10-12 03:59:05 +00:00
moppeeer 835edae659 feat(commands): return IDs from move, duplicate and repeat
Return ordered item IDs from Move, Duplicate and Step and Repeat while preserving the existing moved and created counts, selection and undo behavior. Scripts can use the IDs to operate on copies.

Validation: eight independent probes covering both swatch validation and returned IDs, plus all six cargo xtask ci gates on main after #520 (1,188 native tests passed, 3 ignored; all 15 applicable crates passed WASM compilation checks). Both ROADMAP entries and command regression modules are retained.

Task: #521
2026-10-11 21:58:49 -06:00
aiongg 7b803f1ddc Text: double-click word selection keeps grapheme clusters whole 2026-10-12 03:58:28 +00:00
aiongg 710ab70abe Threading: locked frames, locked layers and a locked or hidden active layer refuse threads
check_thread rejects a locked frame or a frame on a locked layer, and
text.thread refuses to make a new frame on a locked or hidden active
layer.
2026-10-12 03:57:41 +00:00
aiongg b6622fd581 Paste: copied text pasted as a new frame keeps its formatting 2026-10-12 03:57:09 +00:00
aiongg ddc93d8457 Threading: autoflow errors name the command that autoflows
text.thread with autoflow reported its autoflow errors as file.place.
2026-10-12 03:57:01 +00:00
aiongg 4fbd867337 Threading: Shift-click autoflow from a frame on a parent spread is an error
Autoflow fell back to the last document page when the story's last
frame was on a parent spread, threading a parent frame to new document
pages. It now refuses a story that ends on a parent spread.
2026-10-12 03:56:14 +00:00
aiongg 0349fcf38b Paste: drop marker characters from text pasted from other apps 2026-10-12 03:56:13 +00:00
moppeeer 5789caaa60 fix(objects): reject unknown fill and stroke swatches
Reject unknown object fill, stroke and gap swatch names before editing the document, and suggest an existing name where possible.

Validation: three independent atomicity and compatibility probes, plus all six cargo xtask ci gates against current main (1,187 native tests passed, 3 ignored; all 15 applicable crates passed WASM compilation checks). ROADMAP progress entries are retained.

Task: #520
2026-10-11 21:54:43 -06:00
aiongg 2738a7bdd0 Merge #84 into fix/29-kerning-across-runs
#84 brings #83 and upstream main.

Conflict: ROADMAP.md: took #84's (main's restructured roadmap); this branch has no roadmap changes of its own
Conflict: crates/idml/src/tests.rs: took #84's (#83's drop cap and table style tests); this branch has no changes of its own there
2026-10-12 03:38:52 +00:00
aiongg 8aab94e74b i18n: Italian, Japanese, Portuguese and Ukrainian Swatches hint for objects or text 2026-10-12 03:38:21 +00:00
aiongg 0fae2e4b5a Merge #83 into feat/text-editing-and-frames
Conflict: ROADMAP.md: took #83's (main's restructured roadmap); the Threading inventory line goes into docs/target-app-parity.md
Conflict: crates/compose/src/lib.rs: kept this branch's undrawn trailing spaces after warichu; comment covers both the spaces and the drop cap
Conflict: crates/idml/src/tests.rs: took #83's (drop cap style as a Dropcap nested style, table style fills through the cascade); this branch has no changes of its own there
2026-10-12 03:31:39 +00:00
KnottyDyes fae9bc84ce fix(text): reject unknown character fill swatches
Reject unknown character fill swatches before modifying text or undo history. Registered swatch names remain valid, including names that resemble hex colours.

Validation: invalid-name atomicity and save/reopen regressions, plus all six cargo xtask ci gates on main after #514 and #523 (1,186 native tests passed, 3 ignored; 15 crates passed WASM compilation checks).

Task: #403
2026-10-11 21:30:21 -06:00
seanth a21e8db14f fix(compose): key parent-page compositions by absolute page index
Parent-page text now uses the absolute page index as its cache key, so repeated page numbers and renumbering do not reuse another page's composition.

Validation: targeted canvas and PDF regressions, plus all six cargo xtask ci gates on main after #514 (1,179 native tests passed, 3 ignored; 15 crates passed WASM compilation checks).

Task: #523
2026-10-11 21:27:52 -06:00
aiongg 978c7a4657 IDML: the default table style test reads fills through the style cascade 2026-10-12 03:24:33 +00:00
aiongg 0032d57525 Merge upstream main into feat/layout-parity
Conflict: ROADMAP.md: took main's restructured roadmap; this branch's inventory changes (Keep Lines Together default, IDML defaults, drop caps, IDML Kashidas) go into docs/target-app-parity.md, where the inventory lives now
Conflict: crates/format/src/lib.rs: load runs the format upgrade, then merges duplicate assets; kept both sets of tests
2026-10-12 03:24:27 +00:00
KnottyDyes 80c2904681 fix(mcp): prevent request replay after lost replies
Do not resend a request after a transport failure. Report the uncertain outcome and reconnect on the next explicit request.

Validation: all six cargo xtask ci gates passed on the merge candidate; 1,177 native tests passed and all 15 WASM packages checked. Lost-reply, invalid UTF-8 and timeout probes reproduced duplicate edits before the fix and one edit afterward.

Task: #514
2026-10-11 21:10:01 -06:00
aiongg ad33ff95d4 Merge #548: SVG text: find fonts by PostScript name (#430)
Conflict: crates/fonts/src/fontdb.rs: FontFace, CatalogEntry and ScannedFace keep next's aliases and kind plus the PR's postscript (both catalog paths fill it); next's family_kind and has_family, plus the PR's ScopedFonts::postscript_face
Conflict: crates/fonts/src/tests_sysfonts.rs: both tests
Conflict: crates/images/src/lib.rs: next's case-insensitive query (#404) with the PR's PostScript lookups, using next's spelled() in place of the PR's has_family helper; both tests
2026-10-12 02:06:15 +00:00
aiongg f03b86b850 Integration: Find Font on open stays up over the Import Warnings alert
#126's Find Font on open (next) and #356's Import Warnings alert (139e7c2e, via upstream main) both set the dialog after a file opens. A document with missing fonts and import warnings kept only the alert. Find Font now stays; the status line keeps the warnings.
2026-10-12 02:00:00 +00:00
aiongg 8d3b2b78da Merge upstream main f70f93de
Main's squashes of #510, #528, #420, #538 and #356 equal their PR heads; next has
all of them except the two maintainer merge commits a01bfcde (#538, ROADMAP only)
and 139e7c2e (#356: import-warning alert, malformed-URI assertion).

Conflict: ROADMAP.md: next's log lines (main's #538 line already in next)
Conflict: crates/doc/src/assets.rs: next's side (later same_file comment, Asset fields)
Conflict: crates/engine/src/cmd/datamerge/fill.rs: next's side (Asset with pdf_crop)
Conflict: crates/engine/src/cmd/file.rs: next's side (INDD description, Asset ..Default, crop box sizes)
Conflict: crates/engine/src/cmd/interchange.rs: next's side (INDD conversion warnings, resolve_pdf_crops, grep_style_warnings)
Conflict: crates/engine/src/cmd/links.rs: next's side (Asset ..Default)
Conflict: crates/engine/src/cmd/mathexpr.rs: next's side (Asset ..Default)
Conflict: crates/engine/src/cmd/media.rs: next's side (Asset ..Default)
Conflict: crates/engine/src/cmd/style.rs: next's side
Conflict: crates/engine/src/cmd/table.rs: next's side (Asset ..Default)
Conflict: crates/format/src/lib.rs: next's side (pdf_crop fields and tests)
Conflict: crates/idml/src/import.rs: next's side (linked_assets keyed by path, page and crop; CJK settings)
Conflict: crates/idml/src/tests.rs: both (main's file:/a%bé assertion added)
2026-10-12 01:57:47 +00:00
aionggandskylartaylor f70f93de44 fix(idml): report missing parts and show import warnings
Match IDML part names leniently, report missing parts, and show import warnings when opening a file. Cover the malformed URI crash with a regression test.

Validation: all six cargo xtask ci gates passed on the current main merge candidate; 1,176 native tests passed and all 15 WASM packages checked.
Hosted FreeBSD tests and Windows ARM64 packaging and install/run checks passed.

Task: #356

Co-authored-by: skylartaylor <26588250+skylartaylor@users.noreply.github.com>
2026-10-11 19:39:34 -06:00
moppeeerandskylartaylor 95c8c9cc5b fix(hyphenation): honor capitalized-word settings for uppercase words
Honor the capitalized-word hyphenation setting for uppercase words and retain the current roadmap entries.

Validation: all six cargo xtask ci gates passed on the current main merge candidate; 1,170 native tests passed and all 15 WASM packages checked.

Task: #538

Co-authored-by: skylartaylor <26588250+skylartaylor@users.noreply.github.com>
2026-10-11 19:32:49 -06:00
aiongg 223dedfe5a feat(assets): deduplicate files and omit unused assets on save
Share duplicate file data while keeping distinct link paths independent, and leave unused assets out of saved documents.

Validation: all six cargo xtask ci gates passed on the merge candidate; 1,170 native tests passed and all 15 WASM packages checked. Independent regression checks cover updates, relinking, embedding, undo and save/reopen.

Task: #420
2026-10-11 19:23:58 -06:00
Fabio LussiandClaude Opus 5.5 7968afa39f SVG text: find fonts by PostScript name
A font-family that names no family but matches a face's PostScript name
(as Illustrator's SVG export writes them, e.g. 'MyriadPro-Regular') now
sets the text in that face, from the bundled, loaded or installed fonts.
The name picks the face, so font-weight and font-style don't change it.
Family names and the generic fallbacks resolve as before.

Part of #430

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 03:08:18 +02:00
aiongg ca1a8a12bc Place: an image placed into a frame leaves Auto-Fit off (#528)
* Place: an image placed into a frame fills it once and leaves Auto-Fit off

* Place: the fitting test names its fitting, since a placed image no longer auto-fits
2026-10-11 18:49:56 -06:00
japbcoelhoandClaude Opus 5.5 597f0e649f Color parsing: one scale per colour, not per component (#510)
A CMYK component of 1 or less was read as a fraction even when the other
components were percentages, so {"c": 0.7, "m": 0, "y": 12.2, "k": 0}
(a pale cream) became C 70 % Y 12.2 % and exported as
`0.7019608 0 0.12156863 0 k`. The same applied to RGB arrays.

Now a colour is read as percentages (0..100, or 0..255 for RGB) when any
component is above 1, and as fractions only when every component is
within 0..1.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 18:49:46 -06:00
aiongg cf22cbe081 Integration: Czech, German and Russian for Quit DesignCraft (#544 × cs/de/ru catalogs)
The catalogs that #544's branch doesn't have get the new menu label (machine-translated).
2026-10-12 00:39:55 +00:00
aiongg c0b28a4478 Merge quit-unsaved: quitting asks to save documents with unsaved changes (#544)
Conflict: apps/designcraft/src/native_menu.rs: next's MAC_APP_MENU loop without the Quit arm; menus.rs MAC_APP_MENU ends with a dc-quit Cmd row running app.quit (AppMenuItem::Quit removed)
Conflict: crates/ui-egui/src/lib.rs: DesignApp fields, initialisers and tests keep both sides
2026-10-12 00:38:50 +00:00
aiongg e3e8c44bd4 Merge upstream main 65ef027f 2026-10-12 00:38:22 +00:00
aiongg 6aada5b74a UI: quitting asks to save documents with unsaved changes (#544)
Closing the window or Quit (Cmd+Q, now a menu command instead of the predefined
terminate item) asks about each unsaved document: Save, Don't Save or Cancel.
The control channel's app.quit still quits without asking.
2026-10-12 00:37:32 +00:00
aiongg edaea097e8 Merge asset-dedupe: files with different paths stay separate assets (#420)
Conflict: crates/doc/src/assets.rs: same_file doc comment names both the PDF crop box (next) and the link (asset-dedupe)
2026-10-12 00:32:16 +00:00