* 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>
* 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>
* 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
* 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>
Extend the existing MCP tools instead of adding a second set (#259):
- every tool states destructiveHint and idempotentHint next to
readOnlyHint/openWorldHint; input schemas are closed
- the #776 unknown-key check walks the schema, so a misspelt key in a
batch step, a pointer event or mods is -32602 with its path instead
of being ignored
- script::parse refuses JSON step keys other than command/params
- a panic outside a command (rendering, inspection, the app connection)
is a tool error and the server keeps running
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
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>
Resolve documentation conflicts while preserving upstream updates and the PR's German 2006 implementation. Validation: formatting, PDF dependency check, workspace Clippy, asset attribution, layering and German composition tests pass. Full CI reaches four existing Windows/path-related engine test failures in unchanged upstream files.
Points selected with Direct Selection title Properties "Anchor Point(s)"
and show Transform, Appearance, Convert Points and the Delete Point(s)
quick action, as InDesign does. path.deletePoints removes the selected (or
given) points of several paths in one undo step. The Convert Point glyphs
are redrawn after InDesign's: the anchor on a corner or a curve with its
handles.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Edit > Keyboard Shortcuts is craft_keymap::ui::ShortcutsDialog over the
keymap and named shortcut sets. ui.json stores the sets as shortcutSets
and still writes the active set as shortcuts plus shortcutsMore. The
InDesign importer is the dialog's second import format, with a review,
and window.importShortcuts imports as a new set. window.shortcutSets
lists and selects sets. The native macOS menu drops its key equivalents
while the dialog records.
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.
Distinguish numbers from counts and text columns from grid columns, use formal Hungarian address consistently, and align menu paths with the visible labels. Add context and menu-path regression coverage and correct the localization language count and revision history.
Set my chosen real name and display name to Veress Róbert and disable GitHub profile-name synchronization. Preserve all other contributor entries.
Export PDF, File > Print and Separations Preview share one print
pipeline: print_pdf builds the print PDF of a set of pages (flattener,
rasterized layers and effects, PDF boxes, the writer, the blend space
outside print color), pdf_export adds Export PDF's view options for
file.exportPdf and file.print, and the preview separates print_pdf's
page per spread. Gradient stops on spot swatches resolve through the
same InkSet as fills (inks::spot_output). The hayro patches move to
craft-libs 8fbfea8 with craft-pdf, craft-prepress and krilla.
Each visible spread is exported in memory as Export PDF writes it (its
print settings, the document bleed) and separated with
craft_prepress::plates off the UI thread, at a resolution matched to the
zoom. The canvas draws all inks composited, one plate as film or the ink
limit over gray; Window > Output > Separations Preview lists the plates,
spot plates by name, with each ink's percentage under the pointer.
view.separations takes spot ink names and reports the plates, ui.inspect
shows the preview's sheets, and ink.separations gives coverage and the
areas over an ink limit to automation. The renderer's GCR separation view
is gone; its plate passes stay for the CMYK blend space.
Repin craft-pdf, craft-prepress and krilla to craft-libs#190 at 8fbfea8.
Plain exports with a CMYK blend space use print::cmyk_blending (CMYK page
and transparency groups, no output intent, no /Trapped); PDF/X-4 keeps
print::settings with the working space as GTS_PDFX output intent, as
InDesign writes an output intent only for PDF/X.
A stop can name a colour swatch (spot, process, tint, [Paper]) next to its
display colour. swatch.create {gradient}, object.gradient, the Gradient panel
and IDML StopColor keep the reference; renames follow it, swatch edits refresh
the stop's colour and a deleted swatch leaves a plain colour. The field is
optional and omitted for plain stops, so saved documents load and save as
before.
file.print builds its PDF with the same pipeline as file.exportPdf
(flattener, placed PDFs with hidden layers and soft effects as images,
print color, view options), accepts Export PDF's settings and returns its
warnings, instead of calling designcraft_pdf::export_pdf with the
hard-edged vector drop shadow.
Groups are pushed with Surface::push_group, so Knockout Group writes
/K true and Isolate Blending /I true, each on its own. File > Export PDF
no longer rasterizes knockout groups.
Overprint Fill, Overprint Stroke, Overprint Gap, overprinting text (ruby,
kenten) and 100% [Black] under Appearance of Black are pushed through
Surface::push_overprint with OPM 1, around the paint they apply to.
PDF/A exports are RGB and leave overprint out with a warning.
CMYK print exports (a CMYK blend space, and PDF/X-4) take their blending
groups, output intent and /Trapped from write::print::settings instead of
rewriting krilla's bytes. The output intent is the CMYK working space,
Coated FOGRA39 when it has none or its profile can't be written. PDF/X-4
still adds the XMP metadata date and version ID krilla doesn't write.
RGB and PDF/A exports are written as before.