Commit Graph
4827 Commits
Author SHA1 Message Date
MarekSpodBiedry 6fc7172628 Let single-line paths be resized along their length (#1245) 2026-10-18 23:35:56 +02:00
moppeeer 7308800623 TOC-3: keep the table of contents title readable 2026-10-18 23:29:40 +02:00
RoHaX 175c6f6ae3 T.DE1: restrict German reform hyphenation variants 2026-10-18 22:38:35 +02:00
NetterSilverandClaude Haiku 5.5 103d7eb3ff Clamp object.stroke tint and gapTint to 0..1
Found while testing crates/engine/src/cmd/object.rs:299-313 (object.stroke: `st.tint = v as f32`, `st.gap_tint = v as f32`; the no-selection path at :273 clamps, this one doesn't)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-18 19:59:59 +00:00
Dylan M. Taylor ecd7e5d063 ci: configure Dependabot for Cargo and GitHub Actions
Co-authored-by: Dylan M. Taylor <dylan@dylanmtaylor.com>
2026-10-18 12:31:22 -06:00
seanth 8850dd20e5 Merge branch 'storytold:main' into parent-page-display 2026-10-18 13:36:52 -04:00
seanth db0bc7ada0 Merge branch 'storytold:main' into running-header-order 2026-10-18 13:36:22 -04:00
seanth 8f1f20f24a Merge branch 'storytold:main' into tool-units 2026-10-18 13:36:03 -04:00
seanth 2ea1266ad4 Merge branch 'storytold:main' into xref-edited-text 2026-10-18 13:35:45 -04:00
Marco Arnulfo 526eeda545 Document Setup: read a number without a unit in the document's units (fixes #1247) 2026-10-18 18:04:22 +02:00
Hamza b8ae284a4a View: Bleed and Slug screen modes show their area; draw the slug guide
Bleed and Slug were selectable from the toolbar, the View menu and
`view.screenMode`, and were stored, but the canvas only ever asked whether the
mode was Preview or Presentation. Both therefore drew exactly what Normal drew:
guides, frame edges, the other non-printing marks, and content reaching across
the pasteboard.

They are preview modes now, and what each spread shows reaches out to its box:
the bleed for Bleed, the bleed and the slug for Slug (Slug shows every printing
element, and a slug narrower than the bleed does not pull the edge back in).
Preview and Presentation still stop at the trim.

The slug guide was never drawn either, so the Slug colour in Preferences ›
Guides & Pasteboard was stored, exported and round-tripped while nothing read
it. It is drawn beside the bleed guide, in that colour.

`Spread::bleed_rect`'s body becomes `outset_rect`, which measures either offset
from the page edges, with `bleed_rect` and `slug_rect` as its named callers.
2026-10-18 20:47:01 +05:00
Dylan M. Taylor 7141a68f18 docs: drop references to competing commercial software (#1248) 2026-10-18 10:39:57 -04:00
moppeeer 81913c2f48 TOC-1: localize separator picker and address review cleanup 2026-10-18 16:07:02 +02:00
moppeeer e8ec23a88d TOC-1: preserve right-indent separators and expose their picker 2026-10-18 15:47:55 +02:00
moppeeer ec179d5e69 TOC-2: preserve manual bookmark ordering on refresh 2026-10-18 13:59:55 +02:00
moppeeer 924d9c1b73 TOC-2: generate and refresh nested PDF bookmarks 2026-10-18 13:24:56 +02:00
RoHaX 8a8180c1f8 T.DE1: German 2006 reform hyphenation 2026-10-18 11:06:57 +02:00
Brandon ThomasandClaude Opus 5.5 7cb8b12507 Release 0.9.0
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
v0.9.0
2026-10-17 21:43:04 -04:00
Paul G b20009076e Contributors: credit Paul Gemignani 2026-10-17 17:20:45 -07:00
Paul GandClaude Sonnet 5.5 17848dd1e9 Package: link the packaged document and IDML relative to the package (fixes #340)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01EDKUo6t8zLKhzeuPrJxa3n
2026-10-17 17:11:31 -07:00
harrisonoconnorhover 9434e96dbf fix: integrate parent deletion with current main (#956) 2026-10-17 17:52:04 -04:00
moppeeerandGPT-6 Astra 71869ac3c7 UI.NewDocument: delete saved presets from their cards
Show the existing trash icon on selected or hovered custom Saved cards and route it through file.deletePreset. Keep the factory card protected, prevent the action from selecting or creating a document, and retain the configured preview. Cover both selected and hovered-card clicks in the whole-window regression.

Co-Authored-By: GPT-6 Astra <noreply@openai.com>
2026-10-17 23:40:37 +02:00
Claude 4e263ad821 Cross-references keep edited text and break at spaces
InDesign keeps text typed over a cross-reference's generated text (until the
cross-reference is updated), with its page number still live. The IDML
importer dropped that text and generated it again from the format, so a
credits list whose format reads "Last, First. ... YYYY. Volume X, issue Y."
showed those placeholders instead of the names and dates typed in.

- CrossRef gains `text` (edited text, `<pageNum />` for the live page) and
  `page` (the page last shown). Import keeps saved text that no longer
  reads as its format produces it; export writes it back with InDesign's
  XRefPageNumber variable. Setting a format drops the edits, as InDesign does.
- Edited text whose destination is gone shows its saved page, not "??".
- Spaces in a cross-reference's text are word spaces the line may break at
  (it was set as one unbreakable piece, so long ones broke mid-word).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CgGsJkVe5GYG9qK6VFdECa
2026-10-17 20:00:06 +00:00
skylar taylor-barrick 5aeb4dd743 Merge pull request #1236 from skylartaylor/linked-path-checks
Follow paths stored in documents only on this computer or the document's share
2026-10-17 13:57:26 -06:00
Aykut FiratandClaude Opus 5.5 d98b2cce01 IDML: TOC styles read InDesign's $ID/-prefixed separators and Properties-child entry styles
InDesign writes a TOC style entry's separator with the built-in prefix (`Separator="$ID/^y"`, the right indent tab)
and its FormatStyle / PageNumberStyle / SeparatorStyle as `<Properties>` children, not attributes. The importer kept
the prefix as text (entries read "Welcome$ID/<tab>3") and never found the entry styles, so a regenerated TOC lost its
entry paragraph style and page-number character style.

- names::toc_separator_in strips `$ID/` before decoding.
- toc_of reads FormatStyle, PageNumberStyle and SeparatorStyle with `prop` (attribute or Properties child).
- tests: a TOC style written as InDesign writes it imports its separator, entry style, page-number style and title style.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:32:00 -04:00
Aykut FiratandClaude Opus 5.5 08ce444054 Tables: cell First Baseline offset (Cell Options › Text › First Baseline)
Cells and cell styles had no first-baseline setting, so every cell set its first line by the
Ascent offset (the font's typographic ascender). IDML documents that set FirstBaselineOffset on a
cell style (CapHeight is common, often through a table style's body region) composed every row
taller than the document asked for. With a font whose typographic ascender is a full em (Avenir),
each row grew about 2.6 pt and long tables overset, losing their last rows.

- doc: Cell.first_baseline / first_baseline_min; CellStyle.first_baseline / first_baseline_min,
  applied by CellStyle::apply_to and carried through resolve_cell_style's BasedOn chain.
- idml: FirstBaselineOffset and MinimumFirstBaselineOffset read and written on cells and cell styles.
- compose: a cell's text frame uses the cell's first baseline offset and minimum.
- engine: table.setCell, style.cell.create/edit take firstBaseline / firstBaselineMin; table.get
  reports them; style.cell.create fromSelection captures them.
- tests: import through BasedOn and a table style's body region, a cell's own override, IDML round
  trip; composer cap height vs ascent and a fixed minimum; command parameters and validation.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 15:07:46 -04:00
skylar taylor-barrick 9fd0a881f7 Merge storytold/main into linked-path-checks
The conflict was in links.rs, where main's atomic relink work (b050343a) and
this branch's path gate both changed `update`. Kept main's mechanism (build the
replacement with relinked_asset, then insert it) and this branch's gate (a link
craft-docpath refuses is missing and never read).

relinked_asset now takes the path to read and the link to record separately.
Previously they were one argument, safe only because update passed the raw stored
link; passing the resolved path to the old signature would have rewritten every
relative link to an absolute one on each refresh.

Also passes None for the document in main's embedded-status test, where the asset
has no link so the document is irrelevant.
2026-10-17 12:39:14 -06:00
skylar taylor-barrick d149123cd3 Build: take craft-docpath from the merged craft-libs rev
craft-libs#169 is merged, so the fork pin is no longer needed. Pinned to
storytold/craft-libs 82a24b00 (main after the merge) rather than the older
12281d07, which predates resolve_absolute and the Windows colon refusal.
2026-10-17 12:02:18 -06:00
Claude afc6d31764 Inline objects paint under their frame's text
Anchored objects were painted after all of their frame's text, so an inline
picture whose frame reaches below its baseline (a negative Y offset, common in
IDML) covered the top of the next line with its white background. InDesign
paints them under the text. Both the renderer and the PDF export now draw a
frame's anchored objects after its paragraph shading and before its text.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CgGsJkVe5GYG9qK6VFdECa
2026-10-17 16:15:32 +00:00
con3codeandClaude Opus 5.5 91d4c66b24 docs/cjk.md: mojikumi is applied; consecutive punctuation
The status table still said mojikumi tables were kept but not applied,
which #129 changed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013phQ3ekq6uGBEWD6FjFYG2
2026-10-18 01:12:41 +09:00
Claude 54ea1559d7 Parent pages: show running-header placeholders, keep page overlays off them
On a parent page a running-header variable has no page to read, so it
composed blank; it now shows <variable name>, as the header's placeholder.

While parents were edited, document frames weren't laid out and fell back
to the identity canvas transform, so their hidden characters (a flood of ¶),
spelling squiggles and other overlays were drawn over the right parent page.
Items on spreads that aren't shown now have no canvas transform.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CgGsJkVe5GYG9qK6VFdECa
2026-10-17 15:06:47 +00:00
Claude 34632c0b15 Running headers read a page in text order, not by height
A multi-column page's "last on page" picked whichever matching paragraph sat
lowest, so a dictionary page whose final entry tops column 2 showed the last
entry of column 1. Hits on a page now order by their story's first position
on the page (top-left), then by position within the story.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CgGsJkVe5GYG9qK6VFdECa
2026-10-17 15:06:44 +00:00
ghanashyam03 636277c69f docs: fix broken parity checklist link 2026-10-17 20:35:40 +05:30
con3codeandClaude Opus 5.5 46596a9d19 Mojikumi: close up consecutive punctuation in the Japanese sets only
The Chinese sets keep the larger blank between two marks, as before:
JLREQ's rule is Japanese, and Chinese styles (Taiwan's centred, full-width
marks among them) set consecutive punctuation their own way.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013phQ3ekq6uGBEWD6FjFYG2
2026-10-17 23:42:21 +09:00
con3codeandClaude Opus 5.5 e06f4134d4 Mojikumi: move the consecutive punctuation test clear of #1127's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013phQ3ekq6uGBEWD6FjFYG2
2026-10-17 23:08:18 +09:00
macadminHU e8908b0fc2 HU1: add Hungarian interface localization
Add 1,917 Hungarian translations and two context captions, register Magyar in Preferences, and cover language persistence and tool labels with regression tests. Let tool flyouts grow to fit translated labels.

AI-assisted translation reviewed by a native Hungarian contributor with over 30 years of DTP experience. Further in-context feedback is welcome. Add the contributor's requested public GitHub profile-name preference.
2026-10-17 15:56:21 +02:00
con3codeandClaude Opus 5.5 aa55877b7a Mojikumi: consecutive punctuation closes up
Opening brackets together, and closing brackets, commas and full stops
together, now touch (JLREQ 3.1.4): 」。 and 「『 no longer keep half an
em between them. A closing bracket and an opening one stay half an em
apart, and other neighbours keep the larger blank, as before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013phQ3ekq6uGBEWD6FjFYG2
2026-10-17 22:51:34 +09:00
MarekSpodBiedry f633cf54dd PDF/X-4 export: add xmp:MetadataDate and xmpMM:VersionID to the XMP (#1207) 2026-10-17 15:07:14 +02:00
MarekSpodBiedry b13b1ec408 Keep the mapped style of the first paragraph when placing text at an empty caret (#1208) 2026-10-17 15:05:08 +02:00
NetterSilverandClaude Haiku 5.5 7762573344 Keep a moved equation in place when editing its LaTeX
Found while testing crates/engine/src/cmd/mathexpr.rs:73-83

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 12:39:38 +00:00
MarekSpodBiedry 1b1a66ee77 Make the dock collapse and expand chevrons clickable (#1203) 2026-10-17 14:36:00 +02:00
NetterSilverandClaude Haiku 5.5 485a964e94 Reject a non-finite or non-positive --scale in designcraft-cli run
Found while testing apps/designcraft-cli/src/main.rs:361 (`--scale` parse) and :386 (export); crates/render/src/lib.rs:422-423 (render_page)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 08:51:07 +00:00
Claude 3eb7b5085b Tools: readouts measure in the document's ruler units
Tool readouts (the Page tool's size while dragging, smart-guide distances, the
resize readout) took their unit from the UI's own setting, which nothing changes
from picas, so a document set to inches read in picas. The tool context now takes
the active document's horizontal ruler unit, and the Page tool's W/H use the
horizontal and vertical units, as the Control and Properties fields do.

Test: tool_readouts_measure_in_the_documents_units (picas before).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CgGsJkVe5GYG9qK6VFdECa
2026-10-17 06:27:34 +00:00
NetterSilverandClaude Haiku 5.5 ec4fbb270f Ignore NaN and infinite numbers when importing IDML
Found while testing crates/idml/src/import.rs:2748 (stroke_from: StrokeWeight, MiterLimit), also El::num in crates/idml/src/xml.rs:96 and the plain `.parse().ok()` calls around import.rs:1833, 2823 and 2832

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-17 06:20:21 +02:00
skylar taylor-barrick fc36957fe0 Ignore the local outputs/ folder
Scratch exports from running the app and the CLI land in outputs/. It is
not ignored, so `cargo xtask assets` — which scans tracked and untracked
files alike — reports every PNG and PDF in it as an asset with no row in
ASSETS.md, and the check cannot pass on a machine that has ever run the
app with an output directory.
2026-10-16 22:00:52 -06:00
skylar taylor-barrick 61b1a3b08d Merge pull request #150 from skylartaylor/codex/fix-relink-eps
Merges upstream/main into the branch, resolving 12 conflicted files, and reconciles where the two sides meant different things — notably the format version, where both had independently defined version 2 (EPS sources here, pinned paragraph defaults on main), so a document without EPS was being written as version 1 and re-upgraded on load.

Verified locally against main b17efb2d: cargo test --workspace --no-fail-fast 2869 passed / 0 failed, cargo fmt --check clean, cargo clippy --workspace --all-targets -D warnings clean, xtask layers and wasm ok.
2026-10-16 21:55:21 -06:00
NetterSilverandClaude Haiku 5.5 2cc21e19b2 Ignore non-finite w:sz, w:spacing and w:ind values in DOCX import
Found while testing crates/textimport/src/docx.rs:183 (run_attrs, w:sz) and :206-214 (para_attrs, w:spacing/w:ind via the `tw` closure)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-17 04:55:36 +02:00
skylar taylor-barrick b17efb2ddf Merge pull request #1164 from Hamza0101/fix/gpu-failed-fallback
Hamza's diagnosis of the forgotten OpenGL failure, with the filter reordered so it covers any backend and does not hold another machine's record against this one, plus a regression test.

No workflow runs on this PR: every one is path-filtered and apps/designcraft/src/gpu/backend.rs matches none. Verified locally on 653f83b8 instead — cargo test --workspace --no-fail-fast: 2847 passed, 0 failed, 5 pre-existing ignores; cargo fmt --check clean.
2026-10-16 20:51:25 -06:00
skylar taylor-barrick 653f83b8cb Startup: keep the backend a start was on, whichever it is, and cover it
Builds on the fix in this branch, which spotted that a failed OpenGL was
being forgotten because `failed` is filtered to this platform's
candidates and OpenGL is no candidate off Windows.

Rather than spare OpenGL from the filter, run the filter before the
previous start's backend is added. A stored entry that is no candidate
here came from another machine and still says nothing, so it is dropped
as before; the backend a start was actually running on is added
afterwards and stays, whichever backend it is. That keeps the same crash
out of the next instance without naming OpenGL or the platform, and
without holding a failure recorded on someone else's machine against
this one.

Adds the regression test: on macOS, where Metal is the only candidate, a
start left on OpenGL has to keep it out of the instance, while a stored
OpenGL entry that never ran here is dropped.
2026-10-16 20:46:40 -06:00
skylar taylor-barrick c43a63f71e Reconcile this branch's EPS work with main's placement and format changes
The merge compiled, but six tests showed where the two branches meant
different things. Fixes, in order of consequence:

- Format version: both branches had independently defined version 2 —
  here for retained EPS sources, on main for pinned Keep Lines Together
  and drop cap defaults, with an `upgrade` that runs below 2. Writing 1
  for documents without EPS then re-ran that upgrade on load and rewrote
  their paragraph styles, so saving and reloading changed the document.
  EPS now asks for version 3 and everything else stays at 2.

- place.drop into a frame: main turned Auto-Fit off so that resizing a
  frame crops rather than refits, and this branch had carried the older
  FillProportionally along while moving the geometry out of the edit.
  Main's behaviour is the intended one.

- save() compacts unreferenced assets now, so the format test has to
  place its EPS for the version sniff to see it at all.

- EPUB entries are named from the asset's file stem (asset_path), not
  its bare id: images/logo-<id>.png.

- Command parameters are validated strictly, so the PDF page test sends
  each command only the parameters it takes.

- The relink batch's "commits once" check read a process-wide revision
  counter, which a test running beside it can advance; the single undo
  step is what actually shows it committed once.

The EPS place tests move to cmd/file/eps_place_tests.rs: they write real
files, and main's file-system guard reads src files without seeing inline
#[cfg(test)] modules, but exempts _tests.rs ones.
2026-10-16 20:20:53 -06:00