Commit Graph
2702 Commits
Author SHA1 Message Date
midasmatterhorn 8cfaa90dcb idml: read PDFAttribute PageNumber so placed PDFs show their page
A placement of a multi-page PDF carried no page number through IDML: graphic()
always made the asset with page 0 and keyed linked_assets by path alone, so
every placement of one file showed page 1 (InDesign's PDFAttribute PageNumber
was ignored). Import now reads PDFAttribute/@PageNumber (1-based) into
Asset.page, linked_assets is keyed by (path, page), and export writes
PDFAttribute back for pages past the first.

Regression test: the same file placed at pages 2, 1 and 2 imports as two
assets with pages 1 and 0 and round-trips through export.
2026-10-14 23:46:19 +03:00
moppeeerandClaude Opus 5.5 017b925189 Placeholder paragraphs as short as InDesign's (2 to 5 sentences)
Measured in Zero2Graphic's video: InDesign's placeholder paragraphs run 5,
10 (at 18 pt), 6 and 8 lines in a 5.9 cm column, about 2, 2, 3 and 3 of
DesignCraft's filler sentences. The rhythm started 3, 4, 2, 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:31:32 +02:00
IanHollow 0fe2373c74 Fix the AppStream screenshot URL and caption
Assisted-by: OpenAI Codex (GPT-6)
Signed-off-by: IanHollow <72767437+IanHollow@users.noreply.github.com>
2026-10-14 13:14:07 -07:00
moppeeerandClaude Opus 5.5 a948ab2884 Pathfinder panel laid out as InDesign's, with Join Path and Convert Point
The panel was a row of text buttons (Add, Subtract, …, Make Compound,
Release). InDesign's has four rows of icon buttons: Paths (Join, Open,
Close, Reverse), Pathfinder, Convert Shape and Convert Point. The icons are
new drawings in icons.rs. Two engine commands back the rows that had none:
path.join (close an open path, or join two open paths at their nearest
ends) and path.convertPoints (plain, corner, smooth, symmetrical, on the
selected points or whole paths).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 22:13:49 +02:00
midasmatterhorn e45bb864ed math: cap LaTeX expression nesting depth so hostile input can't overflow the stack
`math.svg` and `math.insert` take an unbounded `latex` string, and the parser's
arg/atom/list/list_until_right recursive descent recursed once per group: 100k
nested braces, `\frac`s or `\left(`s overflowed the stack (an abort the command
guard cannot catch). Past MAX_NESTING (256) groups stop descending, so the rest
of the input is consumed iteratively.

Regression test: 100k nested braces, `\frac`s and `\left(`s typeset to an SVG;
the old code aborted with a stack overflow.
2026-10-14 22:52:56 +03:00
NetterSilverandClaude Haiku 5.5 2302b7ec7f Keep viewBox-only placed SVGs at viewBox size on IDML import
Fixes #950

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 19:42:32 +00:00
moppeeerandClaude Opus 5.5 bb96f1455f Fill with Placeholder Text in paragraphs, as InDesign does
InDesign's placeholder text comes in paragraphs; Zero2Graphic's magazine
tutorial styles its second paragraph as an 18 pt lead (2:16). DesignCraft
filled the frame with one paragraph, and the last filler sentence ran into
the first ("interit.Ovid"). Paragraphs now hold 2 to 5 sentences, and an
overset fill is trimmed to the last whole sentence.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:32:57 +02:00
moppeeerandClaude Opus 5.5 d5d8621780 Pathfinder keeps the frontmost object, as InDesign does
InDesign's Pathfinder result takes the attributes (and content) of the
frontmost object, except Subtract, which keeps the backmost. DesignCraft
kept the backmost for every op but Minus Back, so a photo placed over
strips and intersected with them was deleted and the black strips stayed
(Zero2Graphic's magazine tutorial, 7:19).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:22:17 +02:00
NetterSilverandClaude Haiku 5.5 8b834d0533 Fix overflow in layout.pages.insert when after is u64::MAX
Found while testing crates/doc/src/build.rs:377 (Document::insert_pages), called from crates/engine/src/cmd/layout.rs:91

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 19:17:09 +00:00
moppeeerandClaude Opus 5.5 05626847a3 Merge origin/main into #325 (New Document window)
Conflicts in dialogs.rs: main's set_field kept (Dialog::s made pub(crate) for
new_document.rs), #325's New Document body re-seated in main's dispatch.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 21:11:30 +02:00
zydvc26s67-webandCopilot App 4516989e51 Type: let a blank line's hidden paragraph mark take leading immediately
Selecting an empty paragraph (a blank line) puts a collapsed caret on its
hidden paragraph mark, the only character on that line. Previously
type.char either deferred the formatting to the next typed character (in
a non-empty story) or dropped it on the floor for composition, so there
was no way to change a blank line's height — matching InDesign's ability
to select the pilcrow and adjust leading.

- engine/cmd/text.rs: recognize an empty paragraph's own caret position
  (empty_para_mark) and apply character attributes straight to that
  byte's run instead of deferring to typing format.
- compose/lib.rs: an empty paragraph has no glyphs of its own, so resolve
  the hidden mark's run (if overridden) for the paragraph's base leading
  instead of always falling back to the paragraph's plain default.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-14 12:05:35 -07:00
zydvc26s67-webandCopilot App bfcd6ef71f Style delete: redirect every reference, validate name and replacement
delete_para and delete_char previously reassigned only the story text
runs/paragraphs using the deleted style, leaving other styles' Based
On, paragraph styles' nested/nested-line/GREP style refs, the drop cap
style, and the footnote reference style pointed at a name that no
longer exists.

Extract redirect_style_refs() from rename_style() (everything it does
except updating the registry entry's own name) and reuse it from both
delete commands, so deleting a style now redirects every reference
type to the replacement style before removing the registry entry.
Also teach rename_char_refs() about drop_cap_style, which it missed
even for renames.

Add validation: name must be non-empty and refer to an existing
style, and replaceWith (if given) must refer to an existing style and
can't be the style being deleted.

Co-authored-by: Copilot App <223556219+Copilot@users.noreply.github.com>
2026-10-14 11:33:35 -07:00
moppeeerandClaude Opus 5.5 d3309401f5 Show 100% black as rich black on screen by default, as InDesign does
InDesign's Preferences › Appearance of Black defaults to Display All
Blacks as Rich Black on screen, so [Black] text and strokes look pure
black (RGB 0,0,0), as in Adobe's magazine-layout tutorial. DesignCraft
defaulted to Display All Blacks Accurately (#343334). Settings saved
with an explicit choice keep it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 20:30:21 +02:00
zydvc26s67-web 7c5b248dfc Merge remote-tracking branch 'origin/main' into pr171-fix 2026-10-14 11:11:42 -07:00
moppeeerandClaude Opus 5.5 524166f562 Margins and Columns and Create Guides laid out as InDesign's
Margins sit in Top/Bottom and Inside/Outside pairs (Left/Right on a
non-facing document) with a link button between them that makes all four
the same; Columns has Number and Gutter. Create Guides puts Rows and
Columns side by side, with Fit Guides to Margins/Page and Remove Existing
Ruler Guides under Options. Both have a Preview checkbox that previews the
change through a session interaction (one undo step on OK, nothing on
Cancel), and a measurement field works out arithmetic when it loses focus.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:49:04 +02:00
Govinda RoyandClaude Opus 5.5 149eaf3095 Layers panel: double-click an object row to rename it
The object's name turns into a field: Enter or a click elsewhere renames it
(object.rename), Esc leaves it as it was, and renaming to nothing goes back
to the automatic label. Layer rows keep double-click for Layer Options
(#416).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 23:41:31 +06:00
MarekSpodBiedry 38fadd1146 fix: find optical-size fonts named by their WWS family and style (#911) 2026-10-14 19:37:09 +02:00
moppeeer 9327a55100 Merge origin/main into #468 (layout-parent-guides-units)
Main restructured the dialog dispatch; #468's Create Guides and Margins and Columns arms moved into it unchanged.
2026-10-14 19:24:45 +02:00
moppeeerandClaude Opus 5.5 11b1566c09 Type tool: a press over a locked empty frame draws a new text frame instead of converting it
Adobe's "Set up a modern magazine layout" (Brian Wood, 2:12–4:23) locks a
page frame drawn round the spread (Cmd+L), then draws the text frames on
top of it with the Type tool. In DesignCraft the press landed in the
locked frame, which the Type tool turned into a text frame, putting the
caret in it; no new frame was drawn.

- The Type tool takes a hit only on text frames (locked or not, as
  InDesign lets you edit their text) and unlocked empty frames; over a
  locked empty frame, the press starts a new text frame.
- text.placeCaret refuses to convert a locked empty frame (or one on a
  locked layer).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 19:22:54 +02:00
Jeffrey Thayne 999d0583a3 Merge remote-tracking branch 'origin/main' into linked-docx
# Conflicts:
#	ROADMAP.md
#	crates/ui-egui/src/dialogs.rs
2026-10-14 11:21:54 -06:00
aiongg eda77049b4 Merge #599 update: dropped-file loop stays out of the web build 2026-10-14 17:15:56 +00:00
aiongg f1118d826e Place: the dropped-file loop stays out of the web build 2026-10-14 17:15:50 +00:00
zydvc26s67-web 117429085b Merge remote-tracking branch 'origin/main' into zydvc26s67-web-paragraph-styles-save-delete
# Conflicts:
#	crates/engine/src/tests.rs
#	crates/ui-egui/src/dialogs.rs
2026-10-14 10:12:29 -07:00
aiongg c6c03ccb90 Merge #599 update: dropped files land on the spread under the pointer (#931) 2026-10-14 17:10:51 +00:00
aiongg a112a20c23 Merge upstream main 11a51d5b (0.8.0) 2026-10-14 17:09:42 +00:00
aiongg 8648cb0020 Place: a dropped file lands on the spread under the pointer (#931)
A file dropped on the window is placed on the spread under the pointer,
or the spread under the view centre when the pointer isn't over the
canvas, a parent spread included while parents are being edited: a
graphic's top left goes to that point, text into a new frame on the
document page there. Before, every dropped file went to the first
spread.
2026-10-14 17:08:35 +00:00
aiongg d72307ec02 Merge remote-tracking branch 'upstream/main' into place-loads-cursor
# Conflicts:
#	crates/engine/src/cmd/file.rs
2026-10-14 17:01:12 +00:00
Brandon ThomasandClaude Opus 5.5 d07cbbe94c Merge PR #859 (with main's 255-click limit kept inside its event budget)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:58:52 -04:00
Brandon Thomas 0df9238c73 Merge PR #850 2026-10-14 12:56:09 -04:00
Davit MatchakhelidzeandClaude Sonnet 5.5 44b83aa6a3 i18n(ka): catalog follows the reviewed translations
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-14 20:55:53 +04:00
Davit MatchakhelidzeandClaude Opus 5.5 5d4ed2a663 text: Georgian document language; no initial capitals for Georgian
Georgian is a Properties text language (IDML "Georgian" maps to ka). Georgian has no initial capitals: Mtavruli is only for all-caps text, so Change Case title and sentence case and index section heads leave Mkhedruli as it is (doc::capitalizes); upper case still gives Mtavruli.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-14 20:55:04 +04:00
Davit MatchakhelidzeandClaude Opus 5.5 19bacaadd7 i18n: Georgian (ka) interface language
Adds i18n/ka.rs (1,734 entries: every key of the shared, Arabic, Brazilian Portuguese, Japanese, Italian and Ukrainian tables, plus labels only the code and command table use), registered as ქართული in LANGUAGES and the Interface Language menu. Count captions use the category-first form Ukrainian already uses (გვერდი: 5), since Georgian nouns stay singular after a numeral. Tests: every Georgian key resolves, placeholders and ellipses are preserved, no Mtavruli, every menu title, item and submenu is translated, and switching to ka renders. Docs: localization-parity.md and ROADMAP.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01YMTAbGNRxnMEzRvYnQGphF
2026-10-14 20:55:04 +04:00
Brandon ThomasandClaude Opus 5.5 23ac4ce3f1 fix: integrate batched community PRs (#845's Find scope test uses the Page tool's double-click from #862)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 12:51:12 -04:00
Marco Arnulfo 20d30e2266 Images: indexed-colour TIFFs decode through their palette (fixes #927) 2026-10-14 18:46:57 +02:00
Brandon Thomas 4f193834bd Merge PR #870 (with #869) 2026-10-14 12:40:07 -04:00
Brandon Thomas 50a6b60072 Merge PR #868 2026-10-14 12:39:59 -04:00
Brandon Thomas c8a8a1868d Merge PR #867 2026-10-14 12:39:59 -04:00
Brandon Thomas b8d975b094 Merge PR #866 2026-10-14 12:39:59 -04:00
Brandon Thomas 23aeddb354 Merge PR #864 2026-10-14 12:39:58 -04:00
Brandon Thomas c1a1970168 Merge PR #862 2026-10-14 12:39:58 -04:00
Brandon Thomas a6e7e2a0c7 Merge PR #838 2026-10-14 12:39:58 -04:00
Brandon Thomas e8a3cda237 Merge PR #836 2026-10-14 12:39:58 -04:00
Brandon Thomas d67fb28456 Merge PR #840 2026-10-14 12:39:58 -04:00
Brandon Thomas 6ceb57d4f5 Merge PR #845 2026-10-14 12:39:58 -04:00
Brandon Thomas 24e86db864 Merge PR #855 2026-10-14 12:39:58 -04:00
tydude001andClaude Opus 5.5 a65a83b765 packaging: RPM requires library sonames, so openSUSE can install it
DesignCraft's RPM requires Fedora package names: `libxkbcommon`, `(vulkan-loader or libglvnd-egl)`.
openSUSE has no `libxkbcommon`, `vulkan-loader` or `libglvnd-egl` package, so zypper refuses it with
`nothing provides 'libxkbcommon'` (exit 4, which the ArtCraft Launcher shows as "error 4";
storytold/craft-launcher#341).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 11:36:19 -05:00
moppeeerandClaude Opus 5.5 cbba1fe7e1 Tools panel as InDesign's: Gradient Feather a tool of its own; two-column layout; View Options; Apply Color and Apply Gradient
Chris Nielsen's "The Adobe InDesign Toolbox" (InDesign 2020) walks the
Tools panel in one and two columns. Compared with it:

- Gradient Swatch and Gradient Feather are separate tools (one flyout
  here before).
- In two columns InDesign lays out Content Collector and Content Placer,
  Apply Color / Apply Gradient / Apply None and Normal / Preview (with
  Bleed, Slug, Presentation in its flyout) side by side
  (SPLIT_IN_TWO_COLUMNS). One column keeps one well with a flyout, which
  now names what is in front (Apply Color, Apply Gradient or Apply None).
- The utility button is View Options: Frame Edges, Rulers, Guides, Smart
  Guides, Baseline Grid and Hidden Characters, checked when shown, with
  their shortcuts (17:40). It was Text Frame Options (Object › Text Frame
  Options…, ⌘B, still opens it).
- Apply Color (,) applies the colour applied last ([Black] at first) and
  Apply Gradient (.) the gradient applied last, else the document's first,
  else white to black (InDesign's default), to the fill or stroke in front.
  The flyout had Apply Color as [Black] and no Apply Gradient.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:15:14 +02:00
aiongg 78340e6588 Canvas: tools show their own cursors (Direct Selection, Pen states)
Tool cursors are glyphs drawn in code (black ink, white halo): the filled
arrow for Selection, the hollow arrow for Direct Selection, the pen nib
with an add, delete, close or convert badge, and a curved double arrow
for rotating. Linux and Windows show them as OS cursor bitmaps,
rasterized per pixels-per-point and cached; macOS paints them at the
pointer, since it sizes cursor bitmaps in points; the web build keeps
the system cursors. Text, hand, zoom and resize cursors stay system
cursors.

The Pen tool reports what a click does: over the first anchor of the
path being drawn it closes the path, and between paths a click on a
selected path's anchor deletes it and a click on its outline adds one.
The Add, Delete and Convert Direction Point tools show the matching pen
badges.

The glyph geometry and the rasterizer are adapted from VectorCraft's
code-drawn tool cursors (same organisation, original work).

Fixes #438
2026-10-14 18:11:06 +02:00
aiongg 179a6c5f4e Tools panel: Selection is the filled arrow, Direct Selection the hollow one
Fixes #437
2026-10-14 17:59:20 +02:00
Claude 23105a6df9 Merge upstream main (0.8.0) into small-frame-wrap
Conflict: crates/compose/src/tests.rs, both sides added tests at the same place (upstream's #83 Jump Object tests, our tombstone tests); kept both.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CgGsJkVe5GYG9qK6VFdECa
2026-10-14 15:50:20 +00:00