Commit Graph
2291 Commits
Author SHA1 Message Date
aiongg 52c28c625e Merge #490: i18n: Czech interface language
# Conflicts:
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/menus.rs
2026-10-11 16:37:15 +00:00
aiongg 5dc90d3228 Merge #495: pt-BR: complete the interface translation
# Conflicts:
#	crates/ui-egui/src/i18n/pt_br.rs
2026-10-11 16:36:20 +00:00
aiongg ee2f4dffd6 Merge #506: Recovery: each running app keeps its own recovery data 2026-10-11 16:36:07 +00:00
aiongg 3fbaf6f2dc Merge #491: UI: Alt + wheel zooms the view at the pointer 2026-10-11 16:36:07 +00:00
noah1400 257fb08dbd Recovery: each running app keeps its own recovery data (#496)
Document uids start at 1 in every process, and every running app wrote
its recovery entries into the one recovery folder. Two apps wrote over
each other's `1.designcraft`, and an app that started reopened and
removed the entries of one still running.

A run now has a folder of its own in the recovery folder and holds a
lock in it for as long as it runs. An app that starts moves the entries
of runs that have ended, and those an earlier version wrote, into its
folder and reopens them. A locked folder is left alone.
2026-10-11 16:55:39 +02:00
aiongg 3699b9c4d0 Merge ui-script-fallback: UI: show Tamil, Indic, Southeast Asian and other scripts from installed fonts 2026-10-11 14:14:40 +00:00
aiongg 65b91a0802 Merge presentation-exit: View: leave Presentation mode with Esc or Shift+W
Conflict: crates/ui-egui/src/menus.rs: UI_COMMANDS keeps next's app.formattingAffectsText and adds view.togglePresentation after view.togglePreview
2026-10-11 14:13:49 +00:00
aiongg 10d32f0b01 Integration: Interface Language lives in Preferences on next's Russian and macOS menu bar
prefs-language removes the Edit › Interface Language submenu; next added Russian and rebuilds
the macOS menu bar when the language changes (#397).
- de.rs and ru.rs drop their "Edit/Interface Language" path entries, as ja.rs does.
- The Russian language test checks the Preferences list instead of the removed submenu.
- app.language's params doc lists ru and says the macOS menu bar follows at once.
- native_menu.rs: the rebuild comment names Preferences and Cancel, which change
  `app.ui.language` and so reach the same rebuild in `NativeMenu::poll`.
2026-10-11 14:13:23 +00:00
aiongg 6c716ca84b Merge prefs-language: UI: Cancel in Preferences restores the interface language
Conflict: crates/ui-egui/src/dialogs.rs: next's Cell Options functions and the branch's `cancel` both kept; tests: next's test module with the branch's preferences_first_setting_switches_interface_language added and its scroll-down step added to next's preferences_horizontal_scroll_reaches_clipped_options
Conflict: crates/ui-egui/src/menus.rs: Edit › Interface Language submenu removed, next's Русский entry with it
2026-10-11 14:11:22 +00:00
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 2077d9f088 UI: show Tamil, Indic, Southeast Asian and other scripts from installed fonts 2026-10-11 14:09:14 +00:00
aiongg 513c28b2eb UI: Cancel in Preferences restores the interface language 2026-10-11 14:08:35 +00:00
aiongg 7b903cf6b1 View: leave Presentation mode with Esc or Shift+W 2026-10-11 14:03:50 +00:00
aiongg f2f07a9b86 UI: set the interface language in Preferences 2026-10-11 13:50:21 +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 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
LosminekandClaude Opus 5.5 b3d256c817 i18n (cs): terminology review fixes
Changes from an independent review pass over the Czech catalog:

- meaning: "Fit Text" resizes the frame to the text, not the text; the nested
  style "New Line Style" is a style for lines of text, not for strokes;
  "Liquid Settings", "Nonbreaking Space/Hyphen" and "Discretionary Hyphen" use
  the common Czech terms
- consistency: a story is "text" and an article is "clanek" (they were both
  "clanek"); "Tags" matches "Novy tag"/"Odebrat tag"; "Float Panel" matches
  "Float panel"; Image = "Obrazek" like the other image labels; Remove =
  "Odebrat"; one name for the Utilities menu that no longer clashes with Tools
- grammar and shape: command-like labels (Essentials, Wavy, Metrics, Optical,
  Both, Restart Numbering, Output All Blacks...) and a stray "(" fixed

Strings that need a code change to be right in every place (digit set names
that share keys with languages, nested-style units after a number, the
Crop/Trim/Media combo) are left as they are.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 14:11:32 +02:00
MarekSpodBiedry 233aef8986 Fix needless horizontal scrollbar in the app bar at 115% scale (#481) 2026-10-11 13:51:42 +02:00
LosminekandClaude Opus 5.5 332723a58e i18n: tests for the Czech catalog, plural counts and language switch
- Every Czech row is looked up through the cached tr(), and an unknown
  label passes through unchanged.
- No duplicate or empty rows; placeholders, trailing ellipses and colons
  and padded captions match the English key. Only stale rows fail: keys
  that no catalog, command label, menu name or UI command knows any
  more. A new English string falls back to English, as in #294.
- count_label("cs", ..) gives the one / few / other form for 0, 1, 2,
  4, 5, 11 and 22, and the Group selection title uses its context row.
- Czech is selectable from the menu, persisted in UiState and leaves
  document data untouched; it joins the language switch geometry test.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 13:50:24 +02:00
LosminekandClaude Opus 5.5 8178e15ddd i18n: Czech in Edit > Interface Language, with plural count captions
Register "Čeština" (cs) in LANGUAGES, the Interface Language menu and
the app.language parameter doc, and look it up in tr() like the other
single-language tables. tr_context() uses the Czech CONTEXT rows.

count_label() picks the Czech plural form for the number (1 chyba,
3 chyby, 5 chyb; 1 stránka, 3 stránky, 5 stránek), so the info panel,
the Preflight panel and the status bar read grammatically for every
count. Nouns without plural forms keep the existing "{count} {noun}"
caption; other languages are unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 13:50:13 +02:00
LosminekandClaude Opus 5.5 23ae46dbee i18n: Czech interface catalog (1,722 strings)
Add crates/ui-egui/src/i18n/cs.rs in the shape of ar.rs, it.rs, ja.rs and
uk.rs. It has a row for every key of the shared table and of the Arabic,
Brazilian Portuguese, Italian, Japanese and Ukrainian tables (1,697
strings), plus 25 labels the code passes to tr() that no catalog had yet
(data merge and composite font commands, panel docking, the unsaved
changes dialog, W:/H: in the control bar).

Translated from the meaning of the English strings with ordinary Czech
desktop-publishing vocabulary; no other product's localization was used.
Phrases that the MIT OR Apache-2.0 Czech catalogs of VectorCraft and
PhotoCraft already use are kept identical for consistency across
ArtCraft and credited in ASSETS.md.

The file also holds PLURALS (one / few / other forms for the count
captions) and CONTEXT (the Properties panel title "Group" is a noun,
the menu command is a verb). The next commit wires them in.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 13:49:17 +02:00
noah1400 0a9bfa5735 UI: Alt + wheel zooms the view at the pointer (#470)
The wheel turned over a document view with Alt (Option) held scrolled
the view like the plain wheel. It now zooms at the pointer, exactly as
Ctrl/Cmd + wheel does. As with that zoom, a wheel motion keeps its key
to its end: letting Alt go while a trackpad swipe coasts on does not
turn the rest into scrolling.
2026-10-11 13:41:07 +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 30cbd67e3d Honor IDML SameParaStyleSpacing between same-style paragraphs (#449) 2026-10-11 11:43:38 +02:00
MarekSpodBiedry 5ab84500fe Show the first parent page behind single-sided pages (#429) 2026-10-11 11:40:56 +02:00