Commit Graph
1090 Commits
Author SHA1 Message Date
aiongg bbf7ea975f Merge mac-titlebar update: macOS: dragging a title-bar control no longer moves the window
Conflict: apps/designcraft/Cargo.toml: one objc2/objc2-app-kit entry with next's NSTextInputContext and the branch's NSApplication/NSResponder/NSWindow features; next's fmv-macos-events kept
Conflict: apps/designcraft/src/main.rs: next's App fields, GPU startup, IME discard and Apple events kept; the branch's `movable` field and `mac_window::sync_movable` call added before `startup.leave()`
2026-10-11 14:10:18 +00:00
aiongg 44f3f304a5 macOS: dragging a title-bar control no longer moves the window
AppKit moves the window when a drag starts anywhere in the title-bar band
of a full-size content view, on the application bar's controls too. The
title bar now reports whether the pointer is on one of its controls
(title_bar::window_movable), and the macOS app sets the window's movable
flag from it each frame it changes, through objc2-app-kit's safe methods
(the versions muda already uses). Home, the menus, search, the workspace
menu, Share and Discord keep their drags; empty bar space still moves the
window, and so does the band while a modal covers the bar.
2026-10-11 13:40:28 +00:00
aiongg a5b8d99164 Merge parent-margins: Layout: parent pages pass margins and guides to their pages
Conflict: crates/doc/src/page.rs: next's Spread::parent_page_for_side is the one parent-page choice (single-sided pages take the first page); the branch's parent_page_index is dropped and its IDML import caller (crates/idml/src/import.rs) uses parent_page_for_side
Conflict: crates/doc/src/build.rs: the branch's parent_page_of/parent_page/parent_guides/margin sync on next's parent_page_for_side; tests both
Conflict: crates/engine/src/cmd/layout.rs: test modules both
Conflict: crates/engine/src/tests_idml.rs: tests both
Conflict: crates/format/src/lib.rs: next's upgrade and duplicate-asset merge, then the branch's mark_differing_margins_local, in both loaders
Conflict: ROADMAP.md: both log lines
Conflict: docs/target-app-parity.md: next's snapping line plus the branch's parent-page guides
2026-10-11 13:12:06 +00:00
aiongg 1daf0a8ec8 Integration: custom wrap boundaries with graphic text wrap
wrap-boundary gives TextWrap a custom path (so it is no longer Copy) and drops it when
object.textWrap sets an offset or contour; next lets object.textWrap edit a placed graphic's
own wrap. The command drops the boundary of the wrap it edits, and next's graphic-wrap IDML
test clones the wrap it compares.
2026-10-11 13:11:02 +00:00
aiongg b6cc59d349 Merge wrap-boundary: IDML: import and wrap around custom text-wrap boundaries
Conflict: crates/compose/src/lib.rs: the custom boundary goes into next's shared wrap_exclusion(); free_slots keeps next's JumpObject handling outside it and takes the branch's combined BoundingBox/Contour arm
Conflict: crates/engine/src/cmd/object.rs: params doc has next's content flag and the branch's custom-boundary note
Conflict: crates/engine/src/tests.rs: both tests
Conflict: crates/idml/src/export.rs: the boundary goes into next's text_wrap_pref()
Conflict: crates/idml/src/import.rs: next's object-style-aware text_wrap() plus the branch's boundary parsing for the item's own wrap; pdf_page_in and wrap_path_of both kept
Conflict: crates/idml/src/tests.rs: both sides' tests
2026-10-11 13:08:12 +00:00
aiongg fb8d796d37 Integration: the application bar's search covers next's languages and CJK-only commands
help-search adds the "No matching commands" string and command_search(); next has German and
Russian tables that need a row for every key, and hides CJK-only commands from menus and Quick
Apply unless CJK features are on. The search field follows the same rule.
2026-10-11 13:06:31 +00:00
aiongg 6b205302d8 Merge help-search: UI: make the application bar's search field find and run commands
Conflict: crates/ui-egui/src/chrome.rs: next's app-bar and macOS title-bar constants, then the branch's search field
Conflict: crates/ui-egui/src/menus.rs: shortcuts() keeps next's IME and context-menu guards and adds the search field's; Quick Apply keeps next's CJK-only filter on the branch's quick_commands()
2026-10-11 13:05:15 +00:00
aiongg 25aa2735b8 Merge copy-notes: Text: footnotes insert into a story whose references lack footnotes
Conflict: crates/doc/src/slice.rs: tests module keeps next's append_story overflow test and the branch's copy/paste and hostile-marker tests
2026-10-11 13:04:05 +00:00
aiongg 8aeabe959e Merge resize-anchors: Selection tool: Alt and Shift resize around the centre and keep side-handle drags centred 2026-10-11 13:03:16 +00:00
aiongg 8f5b3313a9 Merge feat/layout-parity update: Layout: a baseline shift doesn't move the Em Box Height first baseline 2026-10-11 13:03:09 +00:00
aiongg 470aac7d10 Layout: parent pages pass margins and guides to their pages 2026-10-11 13:02:23 +00:00
aiongg fe8a724da4 Text: footnotes insert into a story whose references lack footnotes 2026-10-11 12:54:42 +00:00
aiongg 47d17ca6f5 IDML: import and wrap around custom text-wrap boundaries 2026-10-11 12:53:50 +00:00
aiongg a73d106ab4 UI: make the application bar's search field find and run commands 2026-10-11 12:47:27 +00:00
aiongg 6cf1933a13 Text: notes insert into a story whose markers lack payloads 2026-10-11 12:43:59 +00:00
aiongg 0de31ef27b Layout: a baseline shift doesn't move the Em Box Height first baseline
The line's em box top is measured at the unshifted baseline; the shift
moves only the drawn glyphs. CJK character alignment still counts. The
Ascent, Cap Height and x Height offsets keep counting a raised baseline.
2026-10-11 12:33:55 +00:00
aiongg d6309bae32 Text: copied text keeps its endnotes and editorial notes 2026-10-11 12:31:59 +00:00
aiongg d5fe4ec201 Integration: shatai glyphs in right-to-left lines always take a tagged run
8806a223 (next, for #392) drew a slanted glyph with run while a
right-to-left line span was open, so its tagged span would not nest in
the line span. pdf-rtl-text (8f30ba1c) removes the line span and its
line_span flag, so the glyph always goes through tagged_run. The
regression test keeps its export of tagged and untagged PDFs with shatai
Hebrew and checks what the branch's tests check: reading-order text,
no marked content opened inside an ActualText span, and no ActualText
wider than a word.
2026-10-11 12:28:34 +00:00
aiongg eda793e300 Merge pdf-rtl-text: PDF: right-to-left lines carry no line-wide ActualText 2026-10-11 12:24:45 +00:00
aiongg 941d8b29d5 Merge #464: Fonts: discover Linux user fonts in XDG_DATA_HOME
Conflict: crates/fonts/src/fontdb.rs: both — the PR's unix_font_dirs, then next's platform_font_files and unscanned_font_files
2026-10-11 12:24:41 +00:00
aiongg 8acb2fbdce Merge #463: Docs: explain hyphenation defaults and image fitting modes to agents
Conflict: crates/engine/src/cmd/text.rs: text.formatParagraph params doc keeps next's drop-cap fields and adds the PR's "hyphenate?: bool (default true)"
2026-10-11 12:24:26 +00:00
aiongg f25ca5cbc6 Merge #454: i18n: translate print, import and table controls
Conflict: ROADMAP.md: status line lists both changes (the PR's review date); progress log both lines, the PR's first
Conflict: crates/ui-egui/src/i18n/ja.rs (auto-merged, edited): the PR's ("All", "すべて") row dropped, next already has it
2026-10-11 12:24:17 +00:00
aiongg cde814c0df Selection tool: Alt and Shift resize around the centre and keep side-handle drags centred 2026-10-11 12:24:00 +00:00
aiongg fc40ffed2c Merge #475: CLI: --export writes the file type its extension names 2026-10-11 12:23:53 +00:00
aiongg 92b50683f6 Merge #474: Show the first parent page behind single-sided pages (#429)
Conflict: crates/doc/src/build.rs: next's parent_page_for (it calls Spread::parent_page_for_side); the PR's test kept
Conflict: crates/tools/src/snap.rs: shown_parent_page_index no longer exists (snap calls Spread::parent_page_for_side); the PR's test kept, calling parent_page_for_side on a two-page and a one-page parent
Conflict: crates/doc/src/page.rs (auto-merged, edited): parent_page_for_side picks the parent's first page for PageSide::Single, the PR's rule moved to where next makes the choice
2026-10-11 12:23:50 +00:00
aiongg de18c1833c Merge #472: Moving a sheared, rotated text frame leaves no text trails
Conflict: ROADMAP.md: both progress-log lines, the PR's first
2026-10-11 12:20:23 +00:00
aiongg 65db56a471 Integration: swatch references bump the story revision with wrapping_add
#456 makes every story revision increment wrap; next's swatch_refs.rs (added after the PR's base) still used rev += 1.
2026-10-11 12:20:13 +00:00
aiongg 9ed4aba3da Merge #456: Wrap saved story revision counters consistently
Conflict: crates/doc/src/edit.rs: next's thread_frames (append_story); every rev += 1 is rev.wrapping_add(1)
Conflict: crates/engine/src/cmd/fonts.rs: next's replace (the local-formatting pass moved out of this hunk)
Conflict: crates/engine/src/cmd/text.rs: next's format_chars (apply_char_attrs, typing format); rev += 1 is rev.wrapping_add(1)
2026-10-11 12:20:08 +00:00
aiongg d5a6eca36d Merge #427 update: Text: Optical kerning spaces pairs from their outlines
Conflict: Cargo.lock: next's (the PR's dependency is already on next)
Conflict: ROADMAP.md: next's (the PR's earlier head is already merged)
Conflict: docs/gaps.md: next's (the PR's earlier head is already merged)
Conflict: docs/typography-parity.md: next's, test count 170 -> 172 as in d0120bf6
Conflict: crates/compose/src/optical.rs: next's plus d0120bf6's kernable() dash and fullwidth exclusion and its unit test
Conflict: crates/compose/src/tests.rs: next's plus d0120bf6's optical_kerning_leaves_dash_pairs_alone
2026-10-11 12:19:35 +00:00
aiongg ec245dda53 Merge #394 update: UI: CJK interface text from installed fonts, on the Latin baseline 2026-10-11 12:19:17 +00:00
noah1400andClaude Opus 5.5 40e8dbc6fb CLI: --pdf-options that is no JSON object is an error
`run --pdf-options '[1]' --export a.pdf` panicked when the PDF's path
was added to the options (exit status 101). The value is now checked
where it is read.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 11:55:20 +02:00
noah1400andClaude Opus 5.5 8547a9fca4 CLI: --export writes the file type its extension names (#432)
--export knew .pdf, .epub, .idml and .designcraft and saved a PNG of
the page under every other name: out.html, out.txt, OUT.PDF, and
out.designcraft from `script`. The exit status was 0.

.html and .htm now run file.exportHtml, .rtf and .txt run
file.exportText (the story being edited or of the selected frame), and
extensions match in any case. A name with another extension is an
error before anything runs; one with no extension is still a PNG.
`run` and `script` share one list, and `script` saves a copy for
.designcraft.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 11:55:05 +02:00
Abdelrehman Fouad d0120bf6a6 Text: Optical kerning leaves dashes and fullwidth forms alone
Two dashes end to end have no ink gap to measure, so -- and the double
em dash opened up by the loosen cap; Chinese sets —— as one continuous
rule. Fullwidth Latin (U+FF21–FF5A) was kernable through its Latin
script and moved CJK text off its em grid. Both are now excluded from
kernable(), with a unit test and a compose test that failed before.
2026-10-11 11:45:29 +02:00
MarekSpodBiedry 5ab84500fe Show the first parent page behind single-sided pages (#429) 2026-10-11 11:40:56 +02:00
moppeeerandClaude Opus 5.5 3943e4c8b7 Repaint a moved text frame's whole text box
Text is composed in the box around a frame's path in the frame's own
coordinates. A sheared then rotated frame turns that box past its path's
bounds, which was all a move repainted, so its text left trails behind.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 11:39:41 +02:00
Abdelrehman Fouad d02a220b4e Text: Optical kerning spaces pairs from their outlines
Optical kerning was treated exactly like Metrics: the font's kern pairs
and nothing else, so text set with Optical in InDesign came out wider,
rewrapped and went overset in tightly fitted frames.

Now the font's pairs are turned off for Optical text and each pair is
spaced from its outlines (crates/compose/src/optical.rs): every glyph's
ink is sampled into 28 bands across the em, the pair's mean and smallest
ink gap over the bands both glyphs ink are compared with the font's
stem-to-stem gap (the pair nn, or HH then oo), and the pair moves 60% of
the way towards it, keeping 30% of that gap and moving at most -0.12 or
+0.06 em. Latin, Greek and Cyrillic letters, digits and Western
punctuation take part; spaces, marks, missing glyphs, right-to-left
runs, upright and tate-chu-yoko glyphs and pairs across a fallback font
keep their font spacing. Profiles and references are cached, bounded.

Tests: AV, To and r. close up and nn stays; HH closes up under Optical
but not Metrics (fails on main); every change on a pangram stays within
the bounds and spaces keep their width; profile, gap, adjustment and
character-class unit tests.

Docs: typography parity Kerning row and remaining effort, gap 4,
ROADMAP milestone 6 and progress log.

Fixes #181.
2026-10-11 11:39:20 +02:00
KnottyDyes 97b753619a Docs: explain hyphenation defaults and image fitting modes to agents
Command descriptions left the new-text hyphenation default and image fitting outcomes implicit. State the default and each fitting mode's semantics, and add an MCP example that disables hyphenation. No behavior changes.
2026-10-11 01:26:26 -06:00
sanyamsingh001andCodex f58c212289 QA1: wrap saved story revisions consistently
Co-Authored-By: Codex <codex@openai.com>
2026-10-11 16:30:58 +10:00
Ikki Nishihara 8143cb2a7d i18n: translate print, import and table controls
Route visible labels through the existing translation and RTL helpers.
Keep document commands, stored options and user-defined style names intact.
Update the localization status and roadmap progress log.
2026-10-11 14:44:39 +09:00
aiongg 7eb3b2ac5a Integration: the Tabs panel floats outside the docking layout
atomic-say brings upstream's shared panel docking (#409), which sends
float_panel and dock_panel through the docking registry; next's Tabs panel
is float-only and not registered there, so Type > Tabs failed with "panel
must name a registered panel". Float-only panels keep the legacy floating
list: they float and close without the registry, a customized layout
keeps them in that list, and dock::floating still draws them then.
2026-10-11 05:35:53 +00:00
aiongg 8f30ba1c55 PDF: right-to-left lines carry no line-wide ActualText
poppler positions an ActualText with the transform in force where its
span ends; a line span closes outside the runs' transforms, so pdftotext
placed the line text off the page and dropped it. An ActualText per run
fares no better: poppler reverses its characters in a right-to-left
line. Without them, poppler orders the glyphs of right-to-left lines
itself and extracts whole lines in reading order, and the content stream
keeps listing them in reading order. With no line span left, glyphs in
it no longer need to avoid krilla's cluster spans, so that workaround
goes too. The tests that read the line span's ActualText now check that
ActualText never spans more than a cluster.
2026-10-11 05:33:12 +00:00
aiongg e828cd6c13 Integration: indd-utils at 08c6b78b 2026-10-11 05:19:21 +00:00
aiongg 924a78a2dd Merge feat/layout-parity: Layout: only CJK fonts take the em box top from a one-em typo box
Conflict: crates/compose/src/tests.rs: next's baseline-fit and keep tests, then the branch's OS/2 offset doc and code-page constant
Conflict: crates/fonts/src/tests_vertical.rs: testing imports from both (with_base, with_code_pages)
2026-10-11 05:19:16 +00:00
aiongg c94d7ce8c8 Merge mojikumi-base: CJK: mojikumi tables based on Nothing and the one-em line-end set apply their rules
Conflict: crates/compose/src/tests.rs: next's tests, plus the branch's one-em line-end test after its neighbour
2026-10-11 05:18:58 +00:00
aiongg b77ed8c300 Merge fix/idml-interchange: PDF: Bounding Box crops are measured from the page's drawing, not a render 2026-10-11 05:18:36 +00:00
aiongg 0d05035e65 Integration: thread cursors have system cursors in the tool cursor table
tool-cursors moves the cursor-to-system-icon table into cursors.rs; next's
text threading adds Cursor::ThreadLink and Cursor::Unthread. They keep the
icons next gave them (alias, no-drop) under the loaded-text badge.
2026-10-11 05:18:36 +00:00
aiongg 7c6bb39656 Integration: close the live-corner test before the pen cursor tests
The tool-cursors merge (ba6fcbe2) appended the branch's pen cursor tests
after next's live_corner_diamonds_follow_a_rotated_frame without that
test's closing brace.
2026-10-11 05:18:07 +00:00
aiongg ba6fcbe26a Merge tool-cursors: Canvas: tools show their own cursors (Direct Selection, Pen states)
Conflict: crates/tools/src/tests.rs: both sides' tests (thread ports, pen add/delete)
Conflict: crates/ui-egui/src/canvas.rs: the branch's cursors::show for the icon, then next's loaded-text/thread badge; next's cursor_icon dropped for cursors::system
Conflict: crates/ui-egui/src/lib.rs: DesignApp fields from both sides
2026-10-11 05:17:24 +00:00
aiongg 2352a58b7d Merge tool-icons-swap: Tools panel: Selection is the filled arrow, Direct Selection the hollow one 2026-10-11 05:16:40 +00:00
aiongg 2fae23fcc6 Merge atomic-save: MCP: exported files replace the target atomically (#436)
Conflict: ROADMAP.md: both progress-log entries, next's newer ones first
Conflict: apps/designcraft/src/gpu.rs: next's side; the branch's test fix targets the startup record tests next replaced
Conflict: apps/designcraft/src/main.rs: next's gpu startup and macOS IME helper; config_dir() dropped for the branch's profile::config_dir(), recovery_dir from profile::recovery_dir()
Conflict: crates/ui-egui/src/canvas.rs: next's guard (menu_open, keyboard_pane already limits keys to the focused pane)
Conflict: crates/ui-egui/src/lib.rs: modules from both sides
2026-10-11 05:16:10 +00:00