Commit Graph
1660 Commits
Author SHA1 Message Date
moppeeer 5ea8bef42d Merge remote-tracking branch 'origin/main' into codex/direct-select-unselected-anchor
# Conflicts:
#	ROADMAP.md
2026-10-24 14:19:49 +02:00
moppeeer 2a972a01c1 Merge remote-tracking branch 'origin/main' into direct-select-delete-image
# Conflicts:
#	ROADMAP.md
2026-10-24 14:19:46 +02:00
moppeeer 39bf3da8a4 Merge remote-tracking branch 'origin/main' into codex/toc-right-indent-separator
# Conflicts:
#	ROADMAP.md
#	docs/ui-parity.md
2026-10-24 14:19:44 +02:00
moppeeer 54e86b3e8c Merge remote-tracking branch 'origin/main' into properties-wrap-offsets
# Conflicts:
#	ROADMAP.md
2026-10-24 14:19:35 +02:00
moppeeer f5788a27a1 Merge remote-tracking branch 'origin/main' into loaded-cursor-thumbnail
# Conflicts:
#	ROADMAP.md
2026-10-24 14:19:34 +02:00
moppeeer a2ed2364f6 Merge remote-tracking branch 'origin/main' into direct-select-anchor-points
# Conflicts:
#	ROADMAP.md
2026-10-24 14:19:13 +02:00
moppeeer 49a5971175 Merge remote-tracking branch 'origin/main' into properties-anchor-points
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/de.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ja.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:19:01 +02:00
moppeeer badcf57cf6 Merge remote-tracking branch 'origin/main' into clear-fitting-options
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/de.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ja.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:57 +02:00
moppeeer 0f653bcc73 Merge remote-tracking branch 'origin/main' into effect-blend-modes
# Conflicts:
#	ROADMAP.md
2026-10-24 14:18:42 +02:00
moppeeer 43bba37498 Merge remote-tracking branch 'origin/main' into text-frame-options-layout
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
#	docs/target-app-parity.md
2026-10-24 14:18:33 +02:00
moppeeer 0724d00dc1 Merge remote-tracking branch 'origin/main' into paragraph-style-general
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:30 +02:00
moppeeer e17c2ff1d4 Merge remote-tracking branch 'origin/main' into character-style-from-selection
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:24 +02:00
moppeeer 0132c0347a Merge remote-tracking branch 'origin/main' into find-change-format
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:21 +02:00
moppeeer 946dd60733 Merge remote-tracking branch 'origin/main' into insert-pages-dialog
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:10 +02:00
moppeeer beca66e862 Merge remote-tracking branch 'origin/main' into spelling-common-words
# Conflicts:
#	ROADMAP.md
2026-10-24 14:18:08 +02:00
moppeeer 10ff47218b Merge remote-tracking branch 'origin/main' into package-dialog
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:04 +02:00
moppeeer 612bf51ae6 Merge remote-tracking branch 'origin/main' into package-pdf-preset
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:18:02 +02:00
moppeeer aa003865d7 Merge remote-tracking branch 'origin/main' into direct-select-handles
# Conflicts:
#	ROADMAP.md
2026-10-24 14:17:48 +02:00
moppeeer 0014243ac2 Merge remote-tracking branch 'origin/main' into table-cell-keys
# Conflicts:
#	ROADMAP.md
2026-10-24 14:17:47 +02:00
moppeeer b16a4ccfdb Merge remote-tracking branch 'origin/main' into table-menu-insert
# Conflicts:
#	ROADMAP.md
2026-10-24 14:17:46 +02:00
moppeeer bce454453f Merge remote-tracking branch 'origin/main' into table-convert-dialogs
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/cs.rs
#	crates/ui-egui/src/i18n/de.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ja.rs
#	crates/ui-egui/src/i18n/ka.rs
#	crates/ui-egui/src/i18n/pl.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/ru.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-24 14:17:45 +02:00
aiongg d4c1322d97 Merge pull request #1709 from aiongg/w65-batch
Integration batch: book-chapter IDML baseline grids, hyphenation, and the Paragraph panel stack
2026-10-24 08:14:29 -04:00
moppeeerandClaude Opus 5.5 c6a0e1e813 Change Format: empty matches get the paragraph style; style helpers bounded
- A GREP match that is empty (^) was counted but got no paragraph style; the
  paragraph style now goes to the paragraphs of every match, empty ones too.
  Character formatting still needs characters.
- apply_char_style and apply_para_style listed every paragraph of the story
  for each match; Story::paras_touching gives the ones a range reaches, from
  the range itself.

Found by CodeRabbit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:50:38 +02:00
moppeeer 2ddb60fa43 Merge branch 'package-dialog' into package-pdf-preset
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/package_dialog.rs
2026-10-24 13:37:54 +02:00
moppeeerandClaude Opus 5.5 f756c91747 Package: missing styles count, same document, Enter in a field, instructions first
- A style the font lacks counts as a missing font in Summary and Fonts, as
  file.package counts it (font_status).
- The dialog remembers its document; Package... and Continue refuse when another
  document became active meanwhile, so the package is the one summarised.
- Enter in Address or Instructions makes a new line: the dialog footer no
  longer takes it for Continue (dialogs::MULTILINE_FOCUS).
- Instructions.txt starts with the printing instructions, then the report, as
  the dialog promises.

Found by CodeRabbit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:36:59 +02:00
moppeeerandClaude Opus 5.5 713579a7b8 Convert Text to Table: resolved separators, the count as given, Insert's column limit
Merges #1676 (a null table style is no style), and:
- The dialog compares separators as table.convertFromText resolves them, so
  "comma" and a typed "," are the same and Number of Columns applies.
- The column count goes to the engine as given: 0 is refused (the dialog stays
  open) instead of becoming 1.
- At most 200 columns, table.insert's MAX_COLUMNS, in the engine and the field.
- The help says the words tab, comma and paragraph name those separators.
- A short last row's padding cells take the text's paragraph and character
  format (Table::from_strings formats every cell).

Found by CodeRabbit and @skylartaylor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 13:23:45 +02:00
dotCooCoo e51b2c6114 Type › Notes › Convert to Note: the selected text becomes a note, as in InDesign
The new command note.convertFromText removes the selected story text
and puts it into a new editorial note whose anchor sits where the text
was. It takes an optional author, and Convert Note to Text puts the text
back. DesignCraft refuses a selection in a table cell, or one that holds
a note, footnote, endnote, anchored object, index marker, text anchor,
cross-reference or table, and leaves the story unchanged. The item
follows New Note in Type › Notes, with translations in the catalogs that
already translate Convert Note to Text.
2026-10-24 04:18:18 -07:00
Hamza 332b0d9f5c links: a linked file is read under a cap, not whole (#1596)
Update, Relink and Relink Folder all reload a linked graphic through `reload`,
which read the file with an unbounded `read`. A document whose link points at a
multi-GB file exhausted memory on Update. How large a linked file is belongs to
whoever wrote the document, not to whoever opens it: the path comes out of the
document.

`reload` now reads through `read_capped` at the limit packaging already applies
to a linked file (`MAX_LINKED_FILE_BYTES`, 256 MB), and a file over it is
refused by name instead of read. `reload_capped` takes the cap so a test can
show both sides without a 256 MB fixture.

Not changed: `file.place` reads a path the same unbounded way, but there the
user picked the file, where a link's path can come from a document someone else
wrote. Whether that read wants the same cap is a call for a maintainer, so it
is reported rather than changed.

Found in the audit of #1596 (DC-15).
2026-10-24 16:07:21 +05:00
moppeeerandClaude Opus 5.5 89f44620d5 Insert Pages: an after past the last page appends again, as main pins; before stays strict
Main's insert_pages_bounds.rs and a_page_count_insert_pages_cannot_mean_is_refused
pin that an `after` past the last page appends. This branch had made it an error;
`before` (new here) still has to name a page, and both together are refused.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 12:08:55 +02:00
moppeeer 77b69bc693 Merge branch 'direct-select-anchor-points' into properties-anchor-points 2026-10-24 11:46:24 +02:00
moppeeer 9d7911b822 Merge branch 'direct-select-anchor-points' into direct-select-handles 2026-10-24 11:46:16 +02:00
moppeeer 1038ec1b3c Merge remote-tracking branch 'origin/main' into direct-select-anchor-points
# Conflicts:
#	crates/engine/src/cmd/edit.rs
#	crates/engine/src/tests.rs
#	crates/tools/src/select.rs
2026-10-24 11:46:16 +02:00
moppeeer ccc6f16e72 Merge remote-tracking branch 'origin/main' into insert-pages-dialog
# Conflicts:
#	crates/engine/src/cmd/layout.rs
2026-10-24 11:31:28 +02:00
moppeeer 3a14e8d93d Merge remote-tracking branch 'origin/main' into package-pdf-preset
# Conflicts:
#	crates/ui-egui/src/menus.rs
2026-10-24 11:30:19 +02:00
moppeeer 527c0d350b Merge remote-tracking branch 'origin/main' into character-style-from-selection
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/dialogs.rs
2026-10-24 11:29:16 +02:00
moppeeer a627bfe47c Merge remote-tracking branch 'origin/main' into find-change-format
# Conflicts:
#	crates/engine/src/cmd/find.rs
2026-10-24 11:22:22 +02:00
moppeeer 21ddc03da0 Merge remote-tracking branch 'origin/main' into paragraph-style-general
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/tests.rs
2026-10-24 11:21:33 +02:00
moppeeer f677f1cd69 Merge remote-tracking branch 'origin/main' into text-frame-options-layout
# Conflicts:
#	docs/target-app-parity.md
2026-10-24 11:19:59 +02:00
moppeeer 589d3d7c1a Merge remote-tracking branch 'origin/main' into codex/direct-select-unselected-anchor
# Conflicts:
#	crates/engine/src/tests.rs
2026-10-24 11:18:56 +02:00
moppeeer d2f6f7c338 Merge remote-tracking branch 'origin/main' into table-convert-dialogs 2026-10-24 11:13:15 +02:00
NetterSilverandClaude Haiku 5.5 f0ce96138c Saturate footnote and endnote numbering at u32::MAX
Found while testing crates/compose/src/notes.rs:133 (also crates/doc/src/notes.rs:265 footnote_start and crates/doc/src/endnotes.rs:150 endnote_start)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 09:07:37 +00:00
moppeeer e4cb6cffc7 Merge remote-tracking branch 'origin/main' into table-menu-insert 2026-10-24 11:06:43 +02:00
moppeeerandClaude Opus 5.5 5c3d25a092 Tables: typing with one cell selected replaces its text
A cell selected with Esc (or a drag inside it) kept the caret at the start of
its text, so typing went in front. With one cell (or one merged cell)
selected, text.insert now selects the cell's whole text first, as InDesign
replaces the contents. Found by CodeRabbit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 11:06:27 +02:00
PiMinusMaxandClaude Opus 5.5 c11006c832 Effects dialog: the Angle with Use Global Light sets the global light
The Angle field was greyed out with Use Global Light on. It now shows
the document's global light angle and changes it for every effect that
uses it, applied with the effects in one undo step.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-24 10:55:13 +02:00
dotCooCoo 333cdf116f Package: the Windows redirect test falls back to a directory junction
package_refuses_windows_directory_redirects made its redirect with
symlink_dir. Without Developer Mode or elevation that call fails with
os error 1314 (ERROR_PRIVILEGE_NOT_HELD), which std does not report as
PermissionDenied, so the skip arm did not match and the test panicked.

When symlink_dir fails, the test now makes a directory junction with
mklink /J, which needs no privilege. is_redirect treats a junction as
a redirect, so the test still checks that File > Package refuses the
redirected folder. It skips only when neither can be made. The package
code is unchanged.
2026-10-24 01:53:04 -07:00
Dylan M. TaylorandClaude Sonnet 5.5 88dd71cc51 refactor(engine): split find change and used fonts (Sonar S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:50:41 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 8271f1a26b refactor(engine): split execute_unguarded, load_styles and resize_border (Sonar S3776) (#1726)
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 04:50:14 -04:00
Dylan M. TaylorandClaude Sonnet 5.5 30fbbb8c04 fix(engine): stop range selection after the last record number
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:50:03 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 9897e6e22e fix: complete explicit imports in test modules
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:48:09 +00:00
Dylan M. TaylorandClaude Sonnet 5.5 681493f458 refactor(engine): split data merge fill and record selection (Sonar S3776, S107)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-24 08:34:17 +00:00