Commit Graph
672 Commits
Author SHA1 Message Date
Marco Arnulfo 3cd235ee5c Type › Text Variables › Convert Variable to Text: the selected instances, or every instance of one variable, become the text they show on their page 2026-10-23 03:40:11 +02:00
Marco Arnulfo 86356d15be Layout: Go Back and Go Forward through the pages viewed, with InDesign's shortcuts 2026-10-23 03:19:47 +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
MarekSpodBiedry d292dd2acd IDML export: write the graphic placed in a table cell (#1551) 2026-10-22 21:06:54 +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
moppeeer 883bcddac1 Merge branch 'control-panel-lists-shading' into paragraph-panel-indesign 2026-10-22 17:32:39 +02:00
moppeeer daad84ac69 Merge branch 'list-buttons-hanging-indent' into control-panel-lists-shading 2026-10-22 17:30:19 +02:00
moppeeerandClaude Opus 5.5 b3896d8122 List buttons: track the hanging indent they set (listHang)
A paragraph attribute records that the Bulleted or Numbered List button set
the hanging indent; turning the list off takes the indent away only then
(and while it is still as applied), and clears the mark. A paragraph whose
own indents were 18/-18 before the list keeps them.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 17:30:14 +02:00
moppeeer 66fcf3ddce Merge branch 'control-panel-lists-shading' into paragraph-panel-indesign
# Conflicts:
#	ROADMAP.md
2026-10-22 17:01:04 +02:00
moppeeer c427640726 Merge remote-tracking branch 'origin/main' into control-panel-lists-shading
# Conflicts:
#	crates/ui-egui/src/i18n/fr.rs
2026-10-22 16:53:56 +02:00
moppeeer 6bd8fe7c4a Merge remote-tracking branch 'origin/main' into control-panel-text-modes
# Conflicts:
#	crates/ui-egui/src/i18n/fr.rs
2026-10-22 16:52:21 +02:00
moppeeer a320b8888a Merge remote-tracking branch 'origin/main' into properties-more-options
# Conflicts:
#	crates/ui-egui/src/i18n/fr.rs
2026-10-22 16:51:06 +02:00
moppeeer 42d55734de Merge remote-tracking branch 'origin/main' into hyphenate-across-column
# Conflicts:
#	ROADMAP.md
2026-10-22 16:35:55 +02: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
moppeeer ede36e55b7 Merge branch 'control-panel-lists-shading' into paragraph-panel-indesign 2026-10-22 15:09:35 +02:00
moppeeer 14b4acd68e Merge branch 'list-buttons-hanging-indent' into control-panel-lists-shading 2026-10-22 15:09:27 +02:00
moppeeerandClaude Opus 5.5 ebed0f7a05 Docs: list buttons keep a style hanging indent and stop at a selected return
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 15:09:24 +02:00
moppeeerandClaude Opus 5.5 bc50eb5564 Hyphenate Across Column: no column or frame ends in a hyphen when it's off
With Hyphenate Across Column off, a paragraph whose line ending at an
automatic hyphenation point would end a column or frame is re-laid
without that point, so the word moves on whole, as InDesign does. The
points left out are kept per paragraph across re-lays and cleared when an
earlier paragraph is re-laid. On by default, as in InDesign.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 14:09:12 +02:00
moppeeerandClaude Opus 5.5 caced43205 Paragraph panel: InDesign's layout and panel menu
The panel shows the nine alignment buttons in InDesign's groups; indent,
spacing and drop cap fields by their icons in two columns, with Space
Between Paragraphs Using Same Style (Ignore or a space); Shading and Border
with the Paragraph Borders and Shading button and colour; and Hyphenate
with Do Not Align / Align to Baseline Grid.

The panel menu follows InDesign's order: composers, Only Align First Line
to Grid, Balance Ragged Lines, Optical Margin Alignment, the paragraph
dialogs (Keep Options…, Drop Caps and Nested Styles… and GREP Styles… now
open for the selected paragraphs), Bullets and Numbering…, Restart/Continue
Numbering, Define Lists… and the paragraph direction.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-22 14:03:59 +02:00
moppeeer d07d29631e Merge remote-tracking branch 'origin/main' into control-panel-lists-shading
# Conflicts:
#	ROADMAP.md
2026-10-22 11:25:42 +02:00
moppeeer f21c6994e5 Merge remote-tracking branch 'origin/main' into list-buttons-hanging-indent
# Conflicts:
#	ROADMAP.md
2026-10-22 11:20:13 +02:00
moppeeer 0c4523cfcc Merge remote-tracking branch 'origin/main' into control-panel-text-modes
# Conflicts:
#	ROADMAP.md
2026-10-22 10:05:06 +02:00
moppeeer fa89cdfcdc Merge remote-tracking branch 'origin/main' into properties-more-options
# Conflicts:
#	ROADMAP.md
2026-10-22 10:01:42 +02:00
moppeeer 02192ab904 Merge remote-tracking branch 'origin/main' into control-panel-lists-shading
# Conflicts:
#	ROADMAP.md
2026-10-22 09:09:12 +02:00
moppeeer fc04020f0b Merge remote-tracking branch 'origin/main' into list-buttons-hanging-indent
# Conflicts:
#	ROADMAP.md
2026-10-22 09:07:49 +02:00
moppeeer 1a578956aa Merge remote-tracking branch 'origin/main' into control-panel-text-modes
# Conflicts:
#	ROADMAP.md
2026-10-22 09:04:26 +02:00
moppeeer 1fd37c82c7 Merge remote-tracking branch 'origin/main' into properties-more-options
# Conflicts:
#	ROADMAP.md
2026-10-22 09:03:44 +02: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
aionggandSBaksa c3382b422c Guides: a dragged ruler guide snaps to guides, margins, columns and objects (#1542)
* Guides: a dragged guide shows where it is (#1282)

While a guide is dragged out of a ruler or moved, a label beside the
pointer reads X: or Y: and the guide's place, in the ruler units and
measured the way the rulers measure (from the zero point, and from the
page origin when rulers restart per page).

* Guides: keep the drag readout inside the canvas

Near the canvas's right or bottom edge the readout flips to the other
side of the pointer, and it is kept inside the canvas in every case
(readout_at).

* Guides: the drag readout measures the spread under the pointer

The readout measured from the spread in the middle of the view (where the
rulers measure), but a guide is dropped on the spread under the pointer,
so with spreads above one another the number shown could differ from the
guide's place. It now measures that spread (ruler_pieces_of).

* Guides: no readout for an existing guide over another spread

An existing guide moves only on its own spread (guide_drag), so dropped
over another it stays where it was: the readout no longer shows a place
there it won't go.

* #1282: guide selection commands (guide.select, guide.selectAll, guide.deselect, guide.moveBy)

* #1282: select ruler guides on the canvas, X/Y in the Control bar and Properties

* #1282: guides take clicks over objects, a new guide is selected, group drag preview

* Guides: a dragged ruler guide snaps to guides, margins, columns and objects (#1221)

---------

Co-authored-by: SBaksa <sabaksa11@gmail.com>
2026-10-22 02:26:52 -04:00
aiongg d7b9f716f1 View: Lock Guides and Lock Column Guides are commands (#1096) (#1174)
* 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.

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

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

* ROADMAP: the progress line lands in one commit after the guide PRs
2026-10-22 02:12:42 -04:00
aionggandSBaksa 3be2736d0a Guides: select ruler guides and set their position (#1282) (#1445)
* Guides: a dragged guide shows where it is (#1282)

While a guide is dragged out of a ruler or moved, a label beside the
pointer reads X: or Y: and the guide's place, in the ruler units and
measured the way the rulers measure (from the zero point, and from the
page origin when rulers restart per page).

* Guides: keep the drag readout inside the canvas

Near the canvas's right or bottom edge the readout flips to the other
side of the pointer, and it is kept inside the canvas in every case
(readout_at).

* Guides: the drag readout measures the spread under the pointer

The readout measured from the spread in the middle of the view (where the
rulers measure), but a guide is dropped on the spread under the pointer,
so with spreads above one another the number shown could differ from the
guide's place. It now measures that spread (ruler_pieces_of).

* Guides: no readout for an existing guide over another spread

An existing guide moves only on its own spread (guide_drag), so dropped
over another it stays where it was: the readout no longer shows a place
there it won't go.

* #1282: guide selection commands (guide.select, guide.selectAll, guide.deselect, guide.moveBy)

* #1282: select ruler guides on the canvas, X/Y in the Control bar and Properties

* #1282: guides take clicks over objects, a new guide is selected, group drag preview

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

---------

Co-authored-by: SBaksa <sabaksa11@gmail.com>
2026-10-22 01:47:49 -04:00
paaspaas00andClaude Opus 5.5 2c1973a6e4 Control panel (¶): Bulleted and Numbered List, Shading and Border, as InDesign's
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 16:16:25 +02:00
paaspaas00 0ff33bead8 Merge list-buttons-hanging-indent (#1483) into control-panel-lists-shading 2026-10-21 16:09:04 +02:00
paaspaas00andClaude Opus 5.5 189cccd2fc Bulleted and Numbered List buttons give InDesign's default hanging indent
The Properties buttons and Type > Bulleted & Numbered Lists > Apply Bullets /
Apply Numbers (list.bullets, list.numbers) apply the list with Left Indent
0.25 in / First Line Indent -0.25 in when the paragraph has no indents, so the
text lines up after the bullet; pressed again, the list and that indent go.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 16:04:31 +02:00
paaspaas00 b768ea789e Merge properties-more-options into control-panel-text-modes 2026-10-21 14:33:32 +02:00
paaspaas00andClaude Opus 5.5 13527f9cb7 Control panel fields: Escape reverts any typed value; parity docs for the text modes
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 13:15:51 +02:00
paaspaas00andClaude Opus 5.5 6cb9466129 Docs: the Properties ••• sections in the UI parity checklist
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-21 11:57:12 +02:00
skylar taylor-barrick 1420d8c79b refactor(pdf): share placed-PDF rendering (PDFR) (#876) 2026-10-20 19:52:28 -06:00
aiongg 9e633b06b8 #1311: window.panel.dock rejects an edge zone without anchor or side
A zone is a side of the anchor. Without anchor or side, craft-ui would
make a frame on the outer edge of DesignCraft's root, which splits the
canvas; the error names anchor and side instead.
2026-10-20 18:01:17 +00:00
aiongg c75ff9d32c #1311: Dock Panel in a floating panel's menu
A floating panel's tab menu and three-line menu have Dock Panel, which
runs window.panel.dock and so returns the panel to where it floated
from.
2026-10-20 18:01:17 +00:00
aiongg 0d6fe6bff7 Merge remote-tracking branch 'upstream/main' into docking-trial
# Conflicts:
#	crates/ui-egui/src/dock.rs
2026-10-19 20:49:04 +00:00
aiongg e6f125437a Docking trial: craft-ui 6261d9d, paint_icon, float space, flyout event 2026-10-19 13:18:20 +00:00
aiongg b66c3223f1 Docking trial: craft-ui f4f9e5b, DockCommand, hit rects, iconic column 2026-10-19 12:57:34 +00:00
aiongg 84e4032c11 Docking trial: migrate ui.json, delete the classic dock 2026-10-19 12:24:39 +00:00
aiongg 5f5b6164c2 Docking trial: one dock path, ui.docking, localized dock labels 2026-10-19 12:09:25 +00: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 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