Commit Graph
815 Commits
Author SHA1 Message Date
skylar taylor-barrick 7427a15863 M6: harden placed PDF layer variants (#1670)
Integrate current main (d8d78851) without rewriting the contributor's commits, retaining craft-libs 9f75d3dc.

Accept literal null trailer entries while rejecting actual or ambiguous encryption/hybrid markers. Structurally inspect bounded xref/trailer history instead of adopting trailer-looking comments. Preflight all selected source variants before editing/undo; preserve reset-to-defaults. Suppress stale unrewritable canvas overrides rather than revealing source content. Keep conservative all-content crop fallback without overcropping layerless/null stubs.

Validation: cargo xtask ci, all 9 gates passed; 3062 tests passed, 6 skipped; all 16 WASM-safe crates checked. 17 supported variants passed independent qpdf, logical preservation and Poppler pixel checks; 6 unsupported/repair-only cases refused. Direct-harness Claude Opus 5 reviewed the exact main-relative delta with no blocking findings.

No native-format changes or unrelated layer features. Synthetic regression fixtures are generated in test code.
2026-10-24 00:18:22 -06:00
aiongg d8d7885172 Anchored objects: Relative to Spine mirrors custom positions on right-hand pages (#1702)
* Anchored objects: Relative to Spine mirrors custom positions on right-hand pages

* Anchored objects: page side from the frame's spread position; footnote cache keyed by page side
2026-10-24 01:34:05 -04:00
Brandon Thomas 058b369b53 Merge storytold/main into squad/pdfx-unembedded-fonts
# Conflicts:
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-23 17:30:20 -04:00
Brandon Thomas c882fd0f58 Merge storytold/main into feat/save-dialog-folder 2026-10-23 17:27:23 -04:00
Brandon Thomas dc968ecdff Merge pull request #1629 from marcoarnulfo/feat/autoflow-existing-pages
Autoflow: fill the pages that follow before adding pages at the end
2026-10-23 17:26:42 -04:00
aiongg 1fd8463af9 i18n: missing translations are reported, never a failure (#1677)
A string without a translation shows in English, and an empty catalog row
counts as untranslated. Tests keep duplicate-key and placeholder checks and
the lookup, context, plural-caption and right-to-left mechanics; coverage,
stale-key, wording and per-language literal checks are removed.

`cargo xtask i18n-report`, also a `cargo xtask ci` step, runs the ignored
missing_translations_report test and prints the missing strings per language.
2026-10-23 15:39:24 -04:00
Marco Arnulfo b5342e48cd Save and export dialogs start in the document's folder, or the last one used (#1653) 2026-10-23 21:32:05 +02:00
andeecollard da8d3a2937 PDF: accept forward xref links and reject cycles 2026-10-23 19:19:20 +01:00
andeecollard 62a26d9e35 PDF: preserve catalogs and full references in layer variants 2026-10-23 17:47:18 +01:00
Marco Arnulfo e7d16aeaaa docs: autoflow drops the pages it added for unused frames; threading into grouped frames is no longer a gap 2026-10-23 11:40:25 +02:00
Marco Arnulfo 2caa39e130 Autoflow: fill the pages that follow before adding pages at the end
Autoflow (Shift-click, autoflow on Place, text.thread with autoflow) inserted
new pages right after the story's last frame, in front of the document's own
pages. As in InDesign, it now threads one frame per column on each page that
follows, whatever else the page holds, and only then adds pages at the end of
the document. It fills whole pages, so an estimate that stops inside a page
can't leave its later columns out of the thread. Frames it set past the end
of the text are removed again; the pages they were on stay. Smart Text Reflow
of the primary text frame keeps adding pages after the story's last page.

Shrinks gap 26: flowing into the primary text frame of the following pages
is left.
2026-10-22 23:28:22 +02:00
KnottyDyes bba31c17b6 PDF: report visible unembedded fonts in PDF/X-4 (#909)
Track text state through graphics saves and drawn forms; exempt invisible text. Report font names and pages in export warnings and validation without embedding or outlining placed fonts.
2026-10-22 10:31:21 -06:00
aiongg 8f98f3dc8b Keyboard Shortcuts: import an InDesign shortcut set (#1296)
* #1180: import an InDesign keyboard shortcut set

Edit > Keyboard Shortcuts gets Import InDesign Set..., which reads the
.txt that InDesign's Show Set writes (window.importShortcuts {path|text}).
Matched commands take the set's Default shortcut, or lose theirs when
every occurrence says [none defined]; other commands give up keys the
set takes. The report lists changes, cleared conflicts, and the items
that could not be matched or read. Tool keys stay fixed.

* #1180: read the set file through the checked reader

* #1180: when two items want the same keys, the later one takes them
2026-10-22 09:28:11 -04:00
aiongg f3b7c3ee34 ROADMAP: progress lines for guide selection, guide snapping and dragged column guides (#1543) 2026-10-22 03:06:48 -04:00
aionggandHamza 333f2a04e3 Selection: drag a column guide to move its gutter (#1096) (#1176)
* IDML: keep column guides that were dragged off centre (#1096)

InDesign records dragged column guides in `MarginPreference ColumnsPositions`,
as pairs of offsets from the margin box's left edge. The importer discarded them
and divided the columns evenly, so a page whose gutter the designer had moved
came back with it in the middle: on a 450 pt margin box, `0 150 170 450` was
read as columns at 215 and 235.

`Columns::positions` already existed, documented as "Custom column positions
(after dragging column guides)", but nothing set it and nothing read it. Now
`Page::column_rects` returns the custom rects when they are set — that one
method is what the canvas guides, snapping, threading and the first frame of a
placed story all go through, so they follow the dragged gutter — the importer
fills it, and the exporter writes the page's real positions instead of
recomputing an even split, so the round trip keeps them.

`layout.marginsAndColumns` clears them when a count or gutter is set, which is
what InDesign's Margins and Columns does. Without that the stale positions would
outrank the new value and the dialog would look broken.

Verified against InDesign-authored IDML rather than assumed, which settled two
things. The attribute is written whether or not anything was dragged — a real
page's values are exactly its even split — so an even set is dropped rather than
marking every imported page custom and freezing its columns; the tolerance for
that comparison only absorbs float noise, about 1e-14 pt on that page. And
`<Guide>` is a `<Page>` child, not a `<Spread>` one, which is where this
importer already looks: the reporter's missing ruler guide was 099fbd2, landed
the day the ticket was filed, not a second bug.

That commit left `lib.rs` still listing guides as ignored on import; corrected.

* IDML: test a ruler guide in a column gutter without facing pages (#1096)

* View: Lock Guides and Lock Column Guides are commands (#1096)

view.lockGuides {on?} (Cmd+Alt+;) sets the Lock Guides UI state the Properties panel and ruler-guide drags use. view.lockColumnGuides {on?} is a document setting, on by default, saved with the document, not an undo step, and read from and written to IDML ColumnGuideLocked. Both are in View > Grids & Guides with checkmarks.

* IDML: custom column positions are validated and round-trip (#1096)

Columns::positions are used only when they are 2 x count finite edges,
ascending from 0 to the margin box width (within 0.01 pt); anything else
is the even split, in Page::column_rects, on IDML import (bounded parse,
checked against the page's margin box) and on IDML export.
Columns::with_gutter_moved moves one gutter's pair of guides between its
neighbours for the coming column-guide command.

ROADMAP: drop four progress-log lines the #1121 merge duplicated and move
its line to the top.

* Layout: Margins and Columns keeps dragged columns unless the count or gutter changes (#1096)

* Layout: autoflow, inserted pages and new parents follow dragged columns (#1096)

* Integration: close #1121's round-trip test beside the ruler-guide test

* View: Lock Column Guides is translated wherever Lock Guides is (#1096)

* View: Lock Column Guides is translated wherever Lock Guides is (#1096)

* Layout: a new margin or page width resets dragged columns (#1096)

* IDML: a page without its own margins checks the default's column positions against its width (#1096)

* Layout: #1121's margin case follows the new-width rule (#1096)

* View: Lock Column Guides is undoable (#1096)

* Layout: dragged columns scale with a new margin or page width (#1096)

* Layout: dragged columns mirror when a page changes side (#1096)

* Layout: the page-width test drags a page whose columns are its own (#1096)

* Selection: drag a column guide to move its gutter (#1096)

* Layout: pages that follow a one-page parent take its dragged columns mirrored (#1096)

* Selection: column-guide drag review fixes (#1096)

* ROADMAP: the progress line lands in one commit after the guide PRs

---------

Co-authored-by: Hamza <mail.hamzanaveed@gmail.com>
2026-10-22 02:52:17 -04:00
aiongg 2660395db5 macOS: a Language submenu in the app menu (#1541) 2026-10-22 01:31:36 -04:00
aiongg 496b1899a2 macOS menu bar: menus keep working after a language change; key equivalents follow the shortcuts (#1540)
* macOS menu bar: keep working after a rebuild; key equivalents follow the shortcuts in effect

* macOS menu bar: the shortcut test sets its key with window.setShortcut
2026-10-22 01:18:41 -04:00
aiongg 2aa5da5950 Paragraph rules: Rule Above's offset is measured from the baseline (#1535)
* Paragraph rules: Rule Above's offset is measured from the first line's baseline

* ROADMAP: Rule Above offset progress line
2026-10-21 20:40:26 -04:00
skylar taylor-barrick 1420d8c79b refactor(pdf): share placed-PDF rendering (PDFR) (#876) 2026-10-20 19:52:28 -06:00
Brandon Thomas affce22f4f Merge remote-tracking branch 'origin/main' into HEAD
# Conflicts:
#	docs/gaps.md
2026-10-19 02:52:49 -04:00
Brandon Thomas f78bf721e8 Merge storytold/main into codex/delete-parent-pages 2026-10-19 02:52:27 -04:00
Brandon Thomas 96957ef53f Merge storytold/main into fix/340-package-relative-links 2026-10-19 02:52:13 -04:00
Brandon Thomas 0857671f48 Merge storytold/main into screen-mode-bleed-slug 2026-10-19 02:51:59 -04:00
Brandon Thomas 0e4d1cef7e Merge storytold/main into fonts/reload-changed-fonts 2026-10-19 02:51:28 -04:00
Brandon Thomas fcb83fd12d Merge storytold/main into codex/delete-parent-pages 2026-10-19 02:51:25 -04:00
Brandon Thomas 0ac836d6cb Merge storytold/main into fix/340-package-relative-links 2026-10-19 02:51:22 -04:00
Brandon Thomas 5e94f78c2e Merge storytold/main into screen-mode-bleed-slug 2026-10-19 02:51:20 -04:00
Brandon Thomas 157035aa9e Merge storytold/main into squad/stroke-type-validation 2026-10-19 02:51:17 -04:00
Brandon Thomas 89bfb16a20 Merge pull request #1230 from ghanashyam03/fix/designcraft-roadmap-parity-link
docs: fix broken parity checklist link
2026-10-19 02:49:37 -04:00
Brandon ThomasandClaude Opus 5.5 4e848d9727 ROADMAP: drop the duplicate review line and the stray blank line
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 02:38:44 -04:00
Brandon ThomasandClaude Opus 5.5 b741d0dabb ROADMAP: move the package-links note into the progress log
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-19 02:38:43 -04:00
KnottyDyes 07b4956e0f Docs: install the CLI and register it with MCP clients 2026-10-18 23:03:26 -06:00
KnottyDyes 287b65f788 Object: reject malformed stroke types 2026-10-18 17:25:35 -06: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
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
ghanashyam03 636277c69f docs: fix broken parity checklist link 2026-10-17 20:35:40 +05:30
Abdelrehman Fouad d78783b6bd Fonts: Type › Reload Fonts reads fonts changed on disk again
Fonts installed, edited or removed while the app runs needed a restart
(#328, #547). font.reload rescans the font folders, lets go of the shared
faces whose installed file changed (length or modification time) or is
gone, so the next lookup reads the file as it is now, and recomposes the
open documents with a new composition cache. It isn't an undo step.
2026-10-16 17:15:47 +02:00
aiongg 8e18800280 Integration: #1075 and #1077 progress log lines 2026-10-16 12:43:06 +00:00
aiongg 3294c4a9bb Merge #1077 update 2026-10-16 12:42:33 +00:00
aiongg f90c0de884 Merge #1075 update 2026-10-16 12:42:32 +00:00
harrisonoconnorhover 91a32730ef fix: allow deleting parent pages (#956) 2026-10-16 08:02:23 -04:00
Hamza cf5b54e72c Record the Greek language in the work list
gaps.md's header asks for a ROADMAP progress-log line and a timestamp when a gap
is closed or shrunk. Gap 13 was shrunk in the first commit (four hyphenating
languages became five); this adds the two it was missing.

Docs only; the fix itself is unchanged.
2026-10-16 16:06:36 +05:00
Hamza b5cc353c6d Close gap 27 in the work list
gaps.md asks for it in its own header: "When you close a gap, delete its entry
(or shrink it), add a line to the ROADMAP progress log and update the
timestamps." The entry was still listed, which is how a second contributor picks
up work that is already done.

Docs only; the fix itself is unchanged.
2026-10-16 16:06:09 +05:00
aiongg 78bf14afb4 Merge branch 'fix-1067' into next-integ 2026-10-16 05:02:21 +00:00
aiongg dbf495bee9 Merge PR #1066 and #1067: Pages panel scroll areas, divider and Panel Options
- panels/pages.rs: #635's parent rows (rendered thumbnails, parents by id, the shown parent selected, double-click shows that parent) sit in #1066's parents scroll area, vertical and side by side; Panel Options' parent size sets the parent icon height (Extra Small: blank pages); thumbnail key = (uid, revision, page or parent, height); pages use ThumbOf::Page; #869/#870/#1058 kept (canvas refit after leaving parents, Delete Page/Spread through the delete-pages question, applyParent by id); #1067's narrow-spread label kept; tests: both sides.
- dock.rs: #343's floating-window frame kept, its body goes through scrolled_body so a floating Pages panel keeps its footer.
- dialogs.rs: deletePages, newWorkspace (#1058 and ours) and pagesPanelOptions arms side by side; HEAD's dialog widths plus pagesPanelOptions at 380.
- lib.rs: skip_delete_pages_warning and pages_parents_height/pages_panel both kept.
- i18n.rs, i18n/{ar,de,it,ja,ka,pt_br,uk}.rs: both sides' rows, no duplicate keys.
- ROADMAP.md: the two new lines in the log's style; dropped four 2026-10-14 lines the union merge duplicated.
2026-10-16 04:56:09 +00:00
aiongg bc5799c046 Merge PR #1036: Overset marks for text frames inside groups
ROADMAP.md: the union merge re-added 13 log lines already present; kept one copy each. The PR's overset line moved into date order and took the group-ports clause; its other two lines describe work from other PRs and were dropped.
docs/ui-parity.md: merged cleanly next to #1033's row.
2026-10-16 04:51:29 +00:00
aiongg 06c7ff6117 Integration: progress log deduplicated and in date order 2026-10-16 04:49:30 +00:00
aiongg 21a6e6d90f Merge branch 'batch-tB' into next-integ
# Conflicts:
#	docs/gaps.md
2026-10-16 04:48:56 +00:00
aiongg 833db788af Merge branch 'batch-tA' into next-integ 2026-10-16 04:48:48 +00:00