Commit Graph
2702 Commits
Author SHA1 Message Date
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 9580ba975c Merge #84 into feat/ime
#84 brings #83 and upstream main.

Conflict: ROADMAP.md: took #84's (main's restructured roadmap); the Input methods inventory line goes into docs/target-app-parity.md
Conflict: apps/designcraft/src/main.rs: kept this branch's discard_marked_text; config_dir lives in main's profile module
Conflict: crates/ui-egui/src/canvas.rs: keys go through keyboard_pane, which takes main's rule (only the focused pane, split or second window)
2026-10-12 03:42:03 +00: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
Fabio LussiandClaude Opus 5.5 719cfd12c5 docs(user): use the standard section title
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:09:11 +02:00
moppeeerandClaude Opus 5.5 3e9881c29b fix(ui): Double-clicking the Fill or Stroke box opens the Color Picker
In InDesign a double-click on the Tools panel's Fill or Stroke box opens
the Color Picker; DesignCraft opened the Swatches panel. It now opens
the Color Picker for that box, with the selection's colour (the selected
text's when text is selected). The Stroke box also reports its name to
screen readers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:08:30 +02:00
Fabio LussiandClaude Opus 5.5 765e28a22e docs(user): apply final review fixes
Part 1: verified = latest release tag policy in docs/user/AGENTS.md; released-pages sentence in root AGENTS.md. Part 6: re-pad Linux table.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 05:06:06 +02:00
Fabio LussiandClaude Opus 5.5 de28587995 docs(user): apply final review fixes
Items B-DesignCraft 1-6 and consistency.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:49:31 +02: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
Fabio LussiandClaude Opus 5.5 2dca7e220e docs: add user docs for DesignCraft
Baseline user docs in docs/user/ (published at getartcraft.com/docs/designcraft),
the docs-check and docs-publish workflows, and a "User docs" rule in AGENTS.md.

Source notes per page:
- index.md: README (intro, features, license), website crafting-apps.ts entry.
- getting-started/index.md: crates/ui-egui/src/chrome.rs start_screen buttons.
- getting-started/install.md: README Downloads, gh release view v0.6.0 asset list,
  packaging/windows/designcraft.wxs (Start Menu shortcut), launcher catalog.rs.
- guides/create-a-document.md: dialogs.rs newDocument dialog, build.rs PRESETS,
  menus.rs UI_COMMANDS, chrome.rs start screen.
- guides/open-a-file.md: apps/designcraft main.rs open_filters, engine file.rs and
  interchange.rs docs, lib.rs import warnings test, issue #110.
- guides/place-images-and-text.md: main.rs place filters, engine file.rs file.place,
  dialogs.rs pdfImport, menus.rs placeWithOptions, release notes (#80).
- guides/export-a-pdf.md: dialogs.rs pdf_export and apply_pdf_preset, menus.rs.
- troubleshooting/app-closes-at-start.md: README graphics backend and logs,
  apps/designcraft/src/gpu.rs, issues #167, #192, #220, #273.
- troubleshooting/get-help.md: README Logs section.
- faq/is-it-free.md: README, docs/gaps.md. faq/supported-systems.md: README,
  release assets. faq/indesign-files.md: main.rs open filters, issues #450, #451, #110.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 04:05:27 +02: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
aiongg 10546a6e66 Assets: files with different paths stay separate assets
Two linked files with identical bytes were merged into one asset, so updating, relinking or embedding one changed both placements and saves dropped one path. Assets now match only with the same link; identical bytes still share one buffer in memory.
2026-10-12 00:22:34 +00:00
aiongg 49d8d67ae0 Integration: format
rustfmt orders the fonts crate's modules after #536 (mod kind) joined next's mod mac_fonts.
2026-10-12 00:21:40 +00:00
aiongg 978a9b9b98 Merge #452: M6: Adopt craft-print and support Windows PDF printing
Conflict: crates/engine/src/cmd/print.rs: the PR's print_with/craft_print::submit; print_with and the test's expected bytes export through next's interchange::with_pdf_boxes
Conflict: Cargo.lock: next's lock plus only craft-print (the auto-merge had moved windows-sys back to 0.59/0.60 for several crates)
Conflict: Cargo.toml: craft-print entry moved beside craft-ui with a comment
Conflict: ROADMAP.md: status Change texts combined; both progress-log lines (the PR's 2026-10-11 line under the 2026-10-12 ones)
Conflict: docs/gaps.md: status Change texts combined
Conflict: docs/hardware-parity.md: status Change texts combined
2026-10-12 00:21:22 +00:00
aiongg fd21bc4f04 Integration: Properties › Transform rotate and flip buttons use the Control panel's icons (#541)
#541 adds rotate-cw, rotate-ccw, flip-h and flip-v icons for its Properties › Transform buttons; next's Control panel already draws the same actions with rotate-clockwise, tool-rotate, flip-horizontal and flip-vertical. The Properties buttons use those, and the PR's duplicate icon arms are removed so both panels show the same icons.
2026-10-12 00:19:29 +00:00
aiongg 30354c0a88 Merge #541: Rotation, shear, scale, rotate and flip in Properties › Transform
Conflict: ROADMAP.md: both progress-log lines
Conflict: crates/ui-egui/src/panels/properties.rs: tests keep next's panel(app) helper and Pathfinder test; the PR's transform test builds its harness through panel(app)
2026-10-12 00:18:50 +00:00
aiongg 6c8ba2d75d Merge #539: One underline bar per stretch of text, no seams between letters
Conflict: ROADMAP.md: both progress-log lines
2026-10-12 00:18:21 +00:00
aiongg d50f1b36d9 Merge #538: Words in capitals hyphenate like capitalized words
Conflict: ROADMAP.md: both progress-log lines
2026-10-12 00:17:58 +00:00
aiongg bbd6a6c277 Merge #537: Engine: report the selected text; remember recently used fonts
Conflict: crates/engine/src/cmd/text.rs: next's selection_attrs (mixed, typing format, mixed_para_attrs, link_style) with the PR's selectedText added to its output; both parameter descriptions
2026-10-12 00:17:43 +00:00
aiongg d83de14b7f Merge #536: Fonts: format, classification and PANOSE of each face, read without keeping fonts loaded
Conflict: crates/fonts/src/fontdb.rs: FontFace keeps next's family/style alias fields and the PR's kind
Conflict: crates/fonts/src/lib.rs: both mod mac_fonts (macOS) and mod kind
2026-10-12 00:16:58 +00:00
aiongg e8d568af98 Integration: Czech, German and Russian View submenu paths for the View menu (#527)
#527 moves Proof Setup, Rotate Spread and Separations Preview from Type to View and adds Screen Mode, Extras and Structure submenus; ja.rs follows it in the PR. cs.rs, de.rs and ru.rs (added on next) still had the Type/... keys, which the catalog tests report as stale. Their View/... rows join each catalog's existing translations of View and of the submenu names (machine-made, not reviewed by native speakers).
2026-10-12 00:16:31 +00:00
aiongg edf30ac0ff Merge #527: View items in the View menu, laid out like InDesign's
Conflict: ROADMAP.md: both progress-log lines
Conflict: crates/ui-egui/src/i18n.rs: both sets of rows
Conflict: crates/ui-egui/src/i18n/it.rs: both sets of rows (Presentation with next's)
Conflict: crates/ui-egui/src/menus.rs: the PR's View list (Rotate Spread, Screen Mode); next's Overprint Preview is already in it
2026-10-12 00:15:48 +00:00
aiongg 52d42ebdd0 Merge #525: Tint and Apply To in the Properties Fill and Stroke menus
Conflict: ROADMAP.md: both progress-log lines
Conflict: crates/engine/src/cmd/object.rs: object.fill takes the PR's swatch?/tint? form with next's known_swatch check (#520) on a given swatch; params doc names the swatch format; both test modules
Conflict: crates/ui-egui/src/i18n/it.rs: both sets of rows
Conflict: crates/ui-egui/src/panels/properties.rs: swatch_menu keeps the PR's popup (Apply To, Tint) with next's swatch_list for the swatches (its own width); tests keep next's Pathfinder test and the PR's three
2026-10-12 00:15:19 +00:00