Commit Graph
4827 Commits
Author SHA1 Message Date
danielwbittner-hubandClaude Opus 5.5 3c2b835e58 i18n(de): clearer terms, strings added since the German table, six hard-coded dialog labels
German terminology made consistent and easier to understand: Anschnitt for
bleed (Beschnitt already meant crop), Vorlagenseite for parent pages,
Intelligente Hilfslinien/Maße/Abstände, 90° nach rechts/links instead of the
UZS abbreviation, Anzahl der Ecken, Zielmedium, PDF mit Tags, Aufgabenleiste,
Position for the gradient stop location.

45 interface strings had no German row and fell back to English (23 of them
added to the shared table after the German table: Data Merge, PowerPoint
export, composite fonts, odd/even page breaks, ...); all now have one.

Preferences > Guides & Pasteboard (Align to Object Edges/Centers, Smart
Dimensions/Spacing, Snap to Zone) and Insert Cross-Reference > Link To drew
their labels without tr, so they stayed English in every language.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:43:11 +02:00
moppeeer 0d89d86992 Merge origin/main into codex/numbering-section-dialog 2026-10-15 11:43:10 +02:00
moppeeer a6814bc61a Merge origin/main into codex/numbering-section-options 2026-10-15 11:38:28 +02:00
markus.doebeleandClaude Opus 5.5 0a836edb7d fix: IDML links in a subfolder beside the package load on another machine
A package opened away from its author's machine kept image links like
`/images/logo.png` that no longer exist; only the package folder and its
Links/ folder were searched, so images in `images/` next to the .idml
showed as missing. Also try the link's trailing folders (up to 8) under
the package folder, longest first.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 11:35:39 +02:00
moppeeer 1062d39511 Merge origin/main into codex/new-document-dialog 2026-10-15 11:35:26 +02:00
moppeeer da7a457c95 Merge origin/main into codex/compact-object-control-bar 2026-10-15 11:31:02 +02:00
moppeeer 6f127f9a4f Merge origin/main into codex/windows-integrated-titlebar 2026-10-15 11:27:25 +02:00
Middle DiscandClaude Sonnet 5.5 7aa518f495 Layout: explicit target for Margins and Columns and Create Guides
Only these two dialogs read bare numbers in the ruler unit; other dialogs keep their meaning.
Apply to: this page, both pages of the spread, or all pages. Parent edits default to the whole parent spread.
Replace unchecked indexing in inherited_guides and marginsAndColumns with get().

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XWRYQ5eieuUrtxhdbh6goq
2026-10-15 12:56:29 +03:30
moppeeer 16e3469f7a Merge origin/main into codex/pencil-live-preview 2026-10-15 11:24:00 +02:00
Andres TorresiandClaude Opus 5.5 a4e02ed4fd fix(text): variable font sliders preview live as one undo step; Character panel layout
Dragging a variable font axis slider previews the change on the page and
commits it as one undo step when the slider is let go. The panel gathers what
every axis slider did in a frame before acting, so with several axes a drag no
longer commits and reopens the change on every frame. A click, an arrow key or
a value typed in the field beside each slider applies at once. Narrow axes
(Skia's weight runs 0.48-3.2) step by hundredths; a slider snapping a value
that is off its steps no longer counts as a change.

Live previews are commands, so the panel stays on app.run: edit.preview
{label, command, params} shows an edit on the document as it was before the
preview began, edit.commitPreview makes it one undo step, edit.cancelPreview
drops it. A preview no panel held in the last frame (its slider let go, or the
panel closed) is committed at the start of the next one.

The Character panel drops its repeated heading, lays Size, Kerning and
Baseline, and Leading and Tracking, out in two columns whose captions and
fields line up, shows auto leading in parentheses, and shows a style with
axis settings as its axes alone, here and in the Text Frame floating bar.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:23:55 +01:00
moppeeer 6bc1bbff89 Merge origin/main into codex/eyedropper-text-format 2026-10-15 11:17:04 +02:00
Keyne PEKARandCodex e569381c2e IDML872.1: preserve liquid guides through interchange
Keep GuideType=Liquid on document and parent pages, with literal XML and
mixed-guide regression coverage. Leave object liquid constraints separate.

Co-Authored-By: Codex <codex@openai.com>
2026-10-15 17:13:35 +08:00
moppeeerandClaude Opus 5.5 dcfc9e9032 fmt
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:57:31 +02:00
moppeeerandClaude Opus 5.5 8f10e54546 ROADMAP: text frames scale their text
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:56:57 +02:00
Marco Arnulfo eb4e811b52 feat(desktop): portable mode needs a writable DesignCraftData (#574)
A portable copy unzipped into a read-only folder such as Program Files
kept pointing settings and recovery at a DesignCraftData it could not
write, so both were lost without a word. The data folder is now probed
(created, then a file written and removed) and, when that fails, the
platform folders are used as if there were no portable.txt; the log and
the status bar say which folder could not be written.
DESIGNCRAFT_CONFIG_DIR still wins. Adds
a_portable_install_that_cannot_write_its_data_uses_the_platform_paths.
2026-10-15 10:46:12 +02:00
Marco Arnulfo 960982810b feat(desktop): portable mode looks next to DesignCraft.app on macOS (#574)
Inside a macOS bundle the executable sits in DesignCraft.app/Contents/MacOS,
a signed folder nobody edits, so the marker and DesignCraftData are looked
for next to the .app, as craft-settings does. Adds
inside_a_macos_bundle_the_marker_sits_next_to_the_app.
2026-10-15 10:46:12 +02:00
Marco Arnulfo bb30c98f15 feat(desktop): portable mode, portable.txt next to the executable (#574)
A file named portable.txt beside the executable keeps settings, logs,
the GPU start-up record and crash recovery in a DesignCraftData folder
next to it instead of the per-user folders, as PhotoCraft and FilmCraft
do. A folder of that name is not a marker. DESIGNCRAFT_CONFIG_DIR still
wins, empty or not. The Windows portable zip now ships portable.txt;
the MSI and the macOS app bundle don't, so nothing changes there.
2026-10-15 10:46:12 +02:00
moppeeerandClaude Opus 5.5 183feade3b Fit Frame to Content puts a text frame's bottom on its last baseline
The height search stopped up to 0.011 pt short of it (a line is set within 0.01 pt), so a fitted
frame scaled up with its text came out overset. InDesign fits 70 pt Kanji_PA to 18.521 mm, its
ascent.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:34:50 +02:00
moppeeer f56273f72e Merge origin/main into codex/handle-double-click-fit 2026-10-15 10:34:44 +02:00
moppeeerandClaude Opus 5.5 2f05a52ff0 Scaling a text frame scales its text, as InDesign's When Scaling: Apply to Content
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 10:15:49 +02:00
wstockandClaude Fable 5.1 c1ee3b77c5 Tools: Cmd held with another tool borrows the Selection tool for one gesture (#919)
In InDesign, holding Cmd (Ctrl) with the Type or a drawing tool makes a
press select, move or resize as the Selection tool would, without
switching tools; the Pen family gets Direct Selection. The engine now
borrows that tool from a Cmd-held press to the release, keeps the chosen
tool, and shows the borrowed tool's cursor while Cmd is held.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011K1peyrh5MdZ6ttHkVq8Gh
2026-10-15 07:18:11 +00:00
wstockandClaude Fable 5.1 02bc1e38aa Importers: XML element nesting and DTD group nesting are bounded (#712)
The DOCX and IDML element-tree builders accepted any depth, and the
tree is then walked and dropped recursively; a DTD content model's
groups recursed without a budget. Each parser now refuses nesting past
a fixed budget with an error, before any recursive consumer runs.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011K1peyrh5MdZ6ttHkVq8Gh
2026-10-15 07:13:51 +00:00
wstockandClaude Fable 5.1 93b10bd37e Type tool: a drag after several clicks extends the selection by words, lines or paragraphs (#981)
Double-clicking selected a word, but holding the button and moving did
nothing. `text.extendTo` now takes `unit`: after a `text.selectAt`, the
selection grows by whole units from the unit first selected, in either
direction, as InDesign does. The Type tool sends the unit its clicks
chose with every drag.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011K1peyrh5MdZ6ttHkVq8Gh
2026-10-15 07:08:13 +00:00
aiongg e22205039c test(idml): the liquid-rule round trip detaches page 1's parent along with its local margins 2026-10-15 06:40:32 +00:00
aiongg d4dd4287e1 Merge upstream main a930276 into parent-margins: local_margins replaces the parent-margin equality rule
Conflicts:
- crates/doc/src/build.rs: kept parent_page_of/parent_page/parent_guides,
  sync_parent_margins and mark_differing_margins_local; inherited_guides(abs)
  stays as a wrapper over parent_guides for the guide commands and dialogs.
  Kept main's single_sided_page_shows_first_parent_page test next to
  differing_margins_from_older_files_stay_local.
- crates/doc/src/page.rs (auto-merged): Spread::parent_page_index takes main's
  rule (first parent page for left and single-sided pages).
- crates/engine/src/cmd/layout.rs: the parent block uses sync_parent_margins
  instead of main's old-margins equality check; parent accepts prefix, label or
  index; document pages set here become local. Main's
  parent_margins_change_the_parent_and_follow_unoverridden_pages stays; added
  applying_a_parent_gives_its_margins_and_local_margins_stay_local.
- crates/tools/src/snap.rs, crates/ui-egui/src/canvas.rs: guides read through
  parent_guides (no per-page Vec); main's current_spread_page and
  current_parent_page kept.
- crates/ui-egui/src/panels/properties.rs: main's parent-target margin fields.
- crates/format/src/lib.rs: upgrade and merge_duplicate_assets, then
  mark_differing_margins_local.
- crates/engine/src/tests_idml.rs: both sides' tests.
- ROADMAP.md: main's file plus this PR's progress-log line.
2026-10-15 06:35:36 +00:00
Ikki Nishihara 44d9fcea5b docs: add public font integration guidance to README 2026-10-15 15:34:58 +09:00
aiongg ac524c4e7a Merge upstream main a930276 into fix/idml-interchange: placed PDF crop on top of main's PDFAttribute page
Conflicts and how each was resolved:
- crates/idml/src/import.rs: main's linked_assets and insert_asset kept; the
  crop is read beside main's page (PDFAttribute as a child or a property), and
  linked_assets is keyed by (path, page, PdfCrop) so two crops of one page are
  two assets.
- crates/idml/src/export.rs: PDFAttribute with PageNumber, PDFCrop and
  TransparentBackground is written for every placed PDF, replacing main's
  page > 0 block.
- crates/idml/src/tests.rs: main's file plus the `$ID/` font tests.
- crates/engine/src/cmd/file.rs: main's exact PDF page size, place cursor and
  add_asset kept; Crop to stores the choice on the asset (the graphic spans
  the box), so the place cursor's frame crop box is gone.
- crates/engine/src/cmd/{book,interchange}.rs: main's confined and reporting
  imports, with the PDF crops resolved after them.
- crates/engine/src/cmd/print.rs: main's print_with, exporting with the
  measured PDF boxes.
- crates/engine/src/cmd/links.rs: main's text links plus pdfCrop.
- crates/engine/src/cmd/{datamerge/fill,mathexpr,media,table}.rs,
  crates/format/src/lib.rs: main's add_asset with the asset defaults.
- crates/engine/src/cmd/package.rs, crates/engine/src/tests_idml.rs: both
  sides' tests.
- crates/fonts/src/fontdb.rs: main's style traits, looked up through
  plain_family.
- crates/render/src/lib.rs: pdf_crop_box replaces pdf_page_box; main's
  UserUnit test checks pdf_crop_box.
- crates/ui-egui/src/dialogs.rs: main's dialog with the content-bounds crops.

Also: Asset::same_file compares the PDF crop, so placing or saving no longer
merges two crops of one page; Asset literals added on main take the defaults;
main's PageNumber test checks the crop and that page 1 is written; new tests
a_pdf_page_placed_with_two_crops_imports_as_two_assets and
pdf_assets_with_different_crops_stay_apart.
2026-10-15 06:34:45 +00:00
aiongg 314e535c37 fix(type): kerning at the end of a paragraph or story is kept for typing, not applied to the last character 2026-10-15 06:31:23 +00:00
aiongg c275878087 fix(paths): Join Path with one of two paths locked refuses instead of closing the other 2026-10-15 06:30:51 +00:00
aiongg ae19df8ef2 fix(typography): Standard Ligatures switches on over a feature-list -liga 2026-10-15 06:30:20 +00:00
Ikki Nishihara eb82632591 fix: reconcile DTD protections with upstream expansion budget 2026-10-15 15:30:09 +09:00
Gert Pellin 30e1b76264 Merge branch 'main' into fix/776-unknown-params
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/cmd/file.rs
#	crates/engine/src/cmd/prefs.rs
#	crates/engine/src/lib.rs
2026-10-15 08:26:28 +02:00
aiongg 06892bbc7e Merge upstream main a930276 into feat/ime: this branch's IME model replaces text.compose
#84 landed on main squashed (0f4f382b0), so the merge was resolved against #84's
tip as the base: main's version of #84 stands and only this branch's IME changes
are applied on top.

Conflicts and how each was resolved:
- crates/engine/src/cmd/text.rs: removed main's text.compose command, compose_text
  and its compose_tests; text.insert keeps main's reset of the typing format after a
  successful edit, skipped while an IME preview is open; reselection bumps the
  revision.
- crates/engine/src/lib.rs: removed Session.composition and the hook that ended it
  in execute_unguarded; set_active/add_document end the composition and reset the
  Find scope; both test modules kept.
- crates/engine/src/tooling.rs: removed main's composition() and its
  end_composition (the opposite semantics); begin_interaction no longer ends a
  composition.
- crates/engine/src/cmd/edit.rs, file.rs, guard.rs, recovery.rs: main's code with
  bump_revision in place of revision arithmetic; Revert takes the fresh state's
  revision.
- crates/ui-egui/src/canvas.rs: removed main's IME block, composition highlight and
  remembered caret rect; this branch's ime_event/ime_output stay. Main's dead-key
  test is ported to these events (the accent stays as typed when the caret moves).
- crates/ui-egui/src/lib.rs, menus.rs: both sides' fields and checks.
- apps/designcraft/src/main.rs, apps/designcraft-web/src/web.rs: both sides.
- docs/control-protocol.md: ui.ime row plus main's ui.click/ui.drag params.

Also: the remaining `revision += 1` sites on main use bump_revision, and two tests
compare revisions with `>`; the IME candidate window follows the caret on type on a
path; IME status lines in ROADMAP.md, gaps, ui-, localization- and target-app-parity
docs and roadmap.md.
2026-10-15 06:23:59 +00:00
aiongg 04420fd25c Compose: progress-log line for the Japanese composer gating 2026-10-15 06:16:35 +00:00
aiongg 903cc617b2 Merge upstream main a930276 into fix/cjk-leading-model-composer: per-paragraph Japanese composer gating replaces the import-time leading model drop
Conflicts:
- crates/compose/src/lib.rs: kept main's line placement (line_metrics with first
  baseline tops, baseline grid snap) and this branch's leading model and Aki Below
  advance. The Hyphenation Zone check uses Composer::single_line(), so the Japanese
  single-line composer gets the zone too.
- crates/idml/src/tests.rs: kept both tests at the conflict (composer kinds, text
  stroke alignment).

Also resolved:
- crates/idml/src/import.rs: removed the package scan for a Japanese composer and the
  drop of [No paragraph style]'s leading model; the import keeps the file's leading
  model and the composer kind, and compose applies the model per paragraph.
- crates/idml/src/tests.rs: the default-leading-model test lays out the document and
  checks Roman spacing under the non-Japanese composers and the Aki Below spacing
  under the Japanese ones; a new test round-trips a Japanese composer document.
2026-10-15 06:16:29 +00:00
aiongg eec4ad3e65 fix(typography): every OpenType toggle has a control, single figure choices export, Standard Ligatures sets Ligatures
The Typography panel's Other Features section lists the otf::TOGGLES tags no other section shows. Choosing a figure style or width alone also sets the other axis (the one all of the selection has, else Proportional or Lining), so IDML export writes a figure style instead of Default; turning one off clears both axes. Standard Ligatures reads and sets the ligatures attribute through type.char, and type.openTypeFeatures reports liga from it.
2026-10-15 06:16:15 +00:00
aiongg 4186f95aed Merge upstream main a930276 into gpu-startup: the indirect-call validation fix is kept once
Conflicts:
- README.md: one WGPU_VALIDATION_INDIRECT_CALL row (this branch's wording).
- apps/designcraft/src/gpu.rs: main's only change is a test tweak in the backend-fallback tests, which now live in gpu/backend.rs; kept this branch's file and ported the tweak there (the check depends on the chosen backend, not the candidate count).
- apps/designcraft/src/main.rs: dropped main's inline VALIDATION_INDIRECT_CALL block (#664) in favour of gpu::instance_flags(); kept the adapter selection, restart and first-frame watch, and took main's macOS Dock Quit handling, preserve_documents_on_exit in on_exit, and profile::config_dir/recovery_dir.
- crates/engine/src/recovery.rs: took main's version; its retained recovered checkpoints do what this branch's recovery change did.
- ROADMAP.md: main's file plus this PR's one progress-log line.
2026-10-15 06:15:27 +00:00
aiongg 21f14d7f79 fix(render): wide feathers and inner effects stay sharp at high zoom 2026-10-15 06:15:21 +00:00
aiongg 6b43209e30 fix(type): text typed on a blank line takes the line's paragraph mark format 2026-10-15 06:15:15 +00:00
aiongg 34a87ff42d fix(type): kerning at a caret kerns the pair at the caret 2026-10-15 06:15:08 +00:00
aiongg fdd5da9c0e Merge upstream main a930276 into tool-cursors: Pen continue resolved into the hover model
Conflicts: crates/tools/src/lib.rs, crates/tools/src/pen.rs and
crates/ui-egui/src/cursors.rs (add/add). The cursor work already in main is
kept as is (canvas.rs, ui-egui/src/lib.rs, tools tests.rs, ROADMAP.md take
main's version).

- pen.rs: the end-point check moves into hover_at as Hover::Continue, ahead
  of Delete and Add; Down has one Continue arm and cursor() derives from
  hover_at alone, so over a selected open path's end point the click
  continues the path instead of deleting the anchor. Continuing from either
  end (continue_from) is main's. The module doc is complete again.
- cursors.rs: Badge::Continue, the PenContinue glyph, and PenContinue in the
  glyph test list.
- tests.rs: pen_over_a_selected_open_paths_end_point_continues_it.
2026-10-15 06:13:56 +00:00
aiongg 19a1085c96 fix(type): formatting set on a blank line applies to the text typed there 2026-10-15 06:13:39 +00:00
aiongg 22de618def fix(doc): consecutive right pages after a section restart get separate spreads 2026-10-15 06:13:38 +00:00
aiongg 27025e5245 fix(paths): Join Path and Convert Point leave paths on locked layers and in locked groups unchanged 2026-10-15 06:13:26 +00:00
aiongg e1998538d1 fix(layers): Enter in the rename field keeps an unnamed object's automatic label 2026-10-15 06:13:09 +00:00
aiongg f786a650e5 fix(type-menu): Define Lists command path matches the Bulleted & Numbered Lists menu 2026-10-15 06:13:03 +00:00
aiongg 22f4049ff6 fix(toolbar): Apply Gradient on the stroke is one undo step and keeps the fill's tint 2026-10-15 06:12:53 +00:00
dotCooCoo 8a4c8dc2ce Swatches: Load Swatches numbers repeated .ase names and names unnamed colors by value
load_swatches matched each name in a swatch exchange file against the
document, which by then held the file's earlier colors. A color whose
name the file had already used was dropped, or with replace it
overwrote the earlier color. A color with no name was added with an
empty name, and every later unnamed color was treated as a repeat of
it. A file of seven colors with a repeated name and three unnamed
colors added three of its six new colors.

load_swatches now names an unnamed color by its value, as object.color
names an unnamed color ("C=0 M=0 Y=0 K=55"), and sets named to false.
A name the file has already given gets the first free number ("Red 2",
"Red 3"), as Styles::unique_name numbers names. Names already in the
document follow the same rule as before: they are kept unless replace
is set, and a locked swatch is left unchanged. The swatch.load
description now states both rules.
2026-10-14 23:04:12 -07:00
NetterSilverandClaude Haiku 5.5 96c62b84ce Flatten deleted text variables in table cells and notes
Found while testing crates/engine/src/cmd/variables.rs:49

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 05:43:47 +00:00
sanyamsingh001andCodex c314ec31dc Merge tested main 7ed56979c7 into PR #315
Preserve the reviewed PR behavior and tested upstream base.

Co-Authored-By: Codex <codex@openai.com>
2026-10-15 15:31:57 +10:00