Commit Graph
1054 Commits
Author SHA1 Message Date
Brandon Thomas b095274498 Merge branch 'pr/680' into batch1 2026-10-13 02:21:39 -04:00
Brandon Thomas 528f5138df Merge branch 'pr/678' into batch1 2026-10-13 02:21:39 -04:00
Brandon Thomas eb855a1964 Merge branch 'pr/672' into batch1 2026-10-13 02:21:39 -04:00
Brandon Thomas 392a5c7ab7 Merge branch 'pr/668' into batch1 2026-10-13 02:21:39 -04:00
Brandon Thomas 8255d58c2e Merge branch 'pr/667' into batch1 2026-10-13 02:21:39 -04:00
Brandon Thomas e009a43d10 Merge branch 'pr/666' into batch1 2026-10-13 02:21:39 -04:00
aiongg e1c2265581 Integration (new-doc-preview x #616): the recovery timer's file.recovery.save skips the New Document preview 2026-10-13 04:25:12 +00:00
aiongg 8bccf1de6e Merge new-doc-preview: New Document: Preview shows the new document behind the window (#679)
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/cmd/file.rs
#	crates/engine/src/lib.rs
#	crates/ui-egui/src/control.rs
#	crates/ui-egui/src/dialogs.rs
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/lib.rs
#	crates/ui-egui/src/new_document.rs
#	docs/target-app-parity.md
2026-10-13 04:11:58 +00:00
aiongg 7fdca7387b feat(ui): New Document Preview follows side paths and keeps Create in step
- A preview that a menu or script edits or saves while the window is open
  becomes a document of its own: Close keeps it and gives it its Untitled
  number. document.list and the control inspect mark the preview.
- Close shows the previously active document again only if the preview was
  still active; a document opened meanwhile stays active.
- Create refuses invalid fields with a status beside the buttons, keeping
  the window and the preview. When the settings are the previewed ones, the
  preview document becomes the new document; otherwise file.new makes it,
  and a failure puts the window back with the error.
- The preview is rebuilt once the fields have stayed the same for 200 ms,
  and refused settings are not retried until they change.
- No recovery discard for preview documents, which are never written.
- The window's key is _previewedDoc, distinct from the interaction preview
  key, and ending the preview is a no-op without one.
2026-10-13 04:06:10 +00:00
aiongg 5da112a9cb feat(ui): Preview in the New Document window
A Preview checkbox beside Close and Create shows a document with the
window's settings in the workspace and rebuilds it as they change: size,
orientation, pages, facing pages, margins, columns, gutter, bleed and slug.
It is off by default and kept for the session. Fields that don't hold a
value yet, and sizes file.new refuses, keep the last preview.

The engine keeps the preview document (Session::preview_new_document,
end_new_document_preview): it replaces itself in its tab, takes no
Untitled number and is never written as recovery data. Create removes it
and makes the document with file.new, so it starts with a clean undo
history. Close, Escape, ui.dialog.cancel, turning Preview off or another
dialog replacing the window remove it and show the previously active
document again, unchanged.
2026-10-13 03:47:57 +00:00
sanyamsingh001andCodex 481b7d2f3b PARITY-EFFECTIVE-PPI: check transformed image resolution
Co-Authored-By: Codex <codex@openai.com>
2026-10-13 13:17:58 +10:00
sanyamsingh001andCodex fa9c7b08b2 PARITY-DISTRIBUTE-LOCKS: preserve locked objects during distribution
Co-Authored-By: Codex <codex@openai.com>
2026-10-13 12:43:50 +10:00
aiongg 9a07d8a095 Integration: format 2026-10-13 01:19:52 +00:00
aiongg f2fc69307b Integration (#667): a character style made at a bare caret captures the typing format 2026-10-13 01:19:14 +00:00
aiongg 4bbafaf055 Merge #672: PARITY-TABLE-SPLIT: split each original selected cell once 2026-10-13 01:15:47 +00:00
aiongg ef4423ab4c Merge #668: PARITY-ARRANGE: step past same-layer siblings in Arrange 2026-10-13 01:15:20 +00:00
aiongg 86b3505675 Merge #667: PARITY-CHARACTER-STYLE: capture selected character formatting 2026-10-13 01:15:19 +00:00
aiongg 95920bff94 Merge #666: PARITY-DATA-SOURCE: honor quoted delimiters and record boundaries 2026-10-13 01:15:19 +00:00
aiongg 8d30e0f41b Integration: format 2026-10-13 01:07:08 +00:00
aiongg b2aa5c1ec8 Merge object-style-effects: Object styles carry effects (#653) 2026-10-13 01:05:37 +00:00
aiongg 6b2e319f96 Integration (#636): bracket clamps can't panic on a NaN path length 2026-10-13 01:02:40 +00:00
aiongg ebae0c7805 Merge parent-based-on: Parents: a parent can be based on another parent (#652)
# Conflicts:
#	ROADMAP.md
#	crates/compose/src/cache.rs
#	crates/doc/src/build.rs
#	crates/engine/src/cmd/file.rs
#	crates/engine/src/cmd/layout.rs
#	crates/idml/src/import.rs
#	crates/idml/src/tests.rs
#	crates/pdf/src/tests.rs
#	crates/render/src/lib.rs
#	crates/render/src/text.rs
#	crates/tools/src/snap.rs
#	docs/gaps.md
#	docs/target-app-parity.md
2026-10-13 01:00:08 +00:00
sanyamsingh001andCodex 5ca6a474b9 PARITY-TABLE-SPLIT: split each original selected cell once
Co-Authored-By: Codex <codex@openai.com>
2026-10-13 10:59:32 +10:00
aiongg 462831bf81 fix(styles): object style effects keep local effects, validate values, follow BasedOn in IDML (#653) 2026-10-13 00:58:47 +00:00
aiongg 182db943c2 fix(parents): bound every based-on walk; base items follow the parent showing them (#652)
Cycle checks walk based_on with a seen-set over all parents, so a cycle
longer than the drawing depth cap is still found. Snapping lists parent
items through shown_parent_pages instead of recursing, and offers base
items on a parent spread. A base parent's text on a parent spread is
composed for that spread, so page-number markers show its prefix.
Cmd+Shift-click hits what is drawn: it honours Show Parent Items, hidden
and locked layers, the facing-page filter and layer order. IDML import
warns when a parent spread's pages name different bases or their own
spread.
2026-10-13 00:51:41 +00:00
sanyamsingh001andCodex b4db428608 PARITY-ARRANGE: step past same-layer siblings in Arrange
Co-Authored-By: Codex <codex@openai.com>
2026-10-13 10:48:56 +10:00
sanyamsingh001andCodex f7adb11cdc PARITY-CHARACTER-STYLE: capture selected character formatting
Co-Authored-By: Codex <codex@openai.com>
2026-10-13 10:46:10 +10:00
sanyamsingh001andCodex 7abcbc745f PARITY-DATA-SOURCE: honor quoted delimiters and record boundaries
Co-Authored-By: Codex <codex@openai.com>
2026-10-13 10:44:20 +10:00
aiongg 98ff430022 feat(styles): object styles carry effects (#653) 2026-10-13 00:40:59 +00:00
aiongg 13f4c37153 Integration (#662 x next): a null spread is absent (spread 0), as Paste in Place forwards its optional spread and file.place documents null as absent 2026-10-13 00:33:00 +00:00
aiongg 5b81bfa9b6 Integration: format 2026-10-13 00:23:24 +00:00
aiongg 80803e3ae3 feat(parents): a parent can be based on another parent (#652)
Pages draw the base parent's items, then the parent's, then their own,
on the canvas, in PDF and image export, and on the parent spread itself.
Chains are followed base first with a depth bound. Overrides, parent hit
testing and the flattener's transparency check include base items.

layout.parents.options {parent, basedOn} sets or clears the base and
refuses cycles; document.inspect reports basedOn per parent. Opening a
.designcraft or IDML file clears a cyclic or dangling base with a warning.
IDML already carried the base as the parent pages' AppliedMaster; a test
covers the round trip.
2026-10-13 00:21:48 +00:00
aiongg 71db506182 Merge pr/643: UI: the Effects dialog, as in InDesign (#643)
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/cmd/object.rs
#	crates/ui-egui/src/dialogs.rs
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ja.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/uk.rs
#	crates/ui-egui/src/menus.rs
#	crates/ui-egui/src/panels/properties.rs
2026-10-13 00:12:33 +00:00
aiongg 6797589402 Merge pr/647: Text: edit type on a path along the curve (#647)
# Conflicts:
#	crates/engine/src/cmd/text.rs
2026-10-13 00:10:31 +00:00
aiongg 99e6922981 Merge pr/636: Tools: drag type-on-a-path start and end brackets (#636)
# Conflicts:
#	ROADMAP.md
#	crates/idml/src/tests.rs
#	crates/tools/src/lib.rs
#	crates/tools/src/select.rs
#	crates/tools/src/tests.rs
#	crates/ui-egui/src/canvas.rs
2026-10-13 00:08:12 +00:00
aiongg 1cf1477183 Integration (#630): the Pen continuing from a path's first anchor adds anchors before it (path.appendAnchor at: start) instead of reversing the path, so arrowheads stay on their ends and a press then Esc leaves no undo step 2026-10-13 00:06:15 +00:00
aiongg 575839cc4f Merge pr/630: Tools: the Pen continues an open path from either end point (#630)
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/cmd/object.rs
#	crates/tools/src/lib.rs
#	crates/tools/src/pen.rs
#	crates/tools/src/tests.rs
#	crates/ui-egui/src/canvas.rs
#	crates/ui-egui/src/i18n.rs
#	crates/ui-egui/src/i18n/ar.rs
#	crates/ui-egui/src/i18n/it.rs
#	crates/ui-egui/src/i18n/ja.rs
#	crates/ui-egui/src/i18n/pt_br.rs
#	crates/ui-egui/src/i18n/uk.rs
2026-10-13 00:02:51 +00:00
aiongg 8ad77980ac Merge pr/648: Eyedropper: a sampled colour goes to the stroke when the Stroke box is in front (#648)
# Conflicts:
#	ROADMAP.md
#	crates/tools/src/xform.rs
#	crates/ui-egui/src/toolbar.rs
2026-10-13 00:01:26 +00:00
aiongg d7d71380ad Merge pr/610: Links: placed text files can stay linked (Word, RTF, text) (#610)
# Conflicts:
#	ROADMAP.md
#	crates/engine/src/cmd/file.rs
#	crates/engine/src/cmd/linked.rs
#	crates/engine/src/cmd/links.rs
#	crates/engine/src/cmd/place_text.rs
#	crates/engine/src/cmd/prefs.rs
#	crates/engine/src/lib.rs
#	crates/ui-egui/src/dialogs.rs
2026-10-13 00:00:51 +00:00
aiongg 7e4c75fce9 Merge pr/662: Commands: reject unknown spread values instead of falling back to page 1 (#662)
# Conflicts:
#	crates/engine/src/cmd/file.rs
#	crates/engine/src/cmd/guides.rs
#	crates/engine/src/cmd/object.rs
2026-10-12 23:59:28 +00:00
aiongg 605b31c6d6 Merge pr/663: CLI: accept a UTF-8 BOM in scripts and document the syntax in script --help (#663) 2026-10-12 23:56:41 +00:00
Marco Arnulfo 9e15d5a17e fix(cli): accept a UTF-8 BOM in scripts and document the syntax in script --help (fixes #654) 2026-10-13 00:41:46 +02:00
Marco Arnulfo 3d59dd5d97 fix(cmd): reject unknown spread values instead of falling back to page 1 (part of #651) 2026-10-13 00:38:54 +02:00
aiongg 283f3f5bbc Merge colour-entry: Color Picker and Color panel keep typed values; colours read on a fixed scale (#323)
Conflict: crates/engine/src/cmd/style.rs: object.color params doc and enabled = next's (text?, has_text or selection) + the model form; apply_color = next's text targets and caret typing format + the branch's rounding-based swatch reuse
Conflict: crates/ui-egui/src/dialogs.rs: next's deleteCharacterStyle / swatchOptions arms; colorPicker = the branch's (no-op without edits, model-form colour) with next's `text`
Conflict: crates/ui-egui/src/panels/swatches.rs: double-click opens the picker with picker_fields + next's `text`; spectrum = the branch's model form + next's `text`
Conflict: docs/target-app-parity.md: the branch's Color panel line + next's Threading and Place text lines
Conflict: ROADMAP.md: logs both
2026-10-12 22:17:14 +00:00
aiongg e391002be6 Merge text-stroke-behind: Text: stroke behind fill (#619)
Conflict: crates/render/src/text.rs: the branch's paint_glyphs with next's fill and stroke overprint (overprint_fill / overprint_stroke, an overprinting() Multiply layer around each paint); next's cell_stroke(kind, weight, length); path text strokes don't overprint, as before
Conflict: crates/pdf/src/text.rs: the branch's text_run / paint_outlines / glyph_outlines split with next's skew tan, vertical mark offsets and split_clusters glyph order (#421)
Conflict: crates/engine/src/cmd/paths.rs: next's shatai transform + the branch's stroke_behind_fill key
Conflict: crates/idml/src/tests.rs: tests both
Conflict: docs/typography-parity.md, ROADMAP.md: headers combined, logs both
2026-10-12 22:04:10 +00:00
aiongg 8811669ee0 Merge alt-arrow-kerning: Type: Alt+Left/Right kerns at the caret and tracks a selection (#621)
Conflict: crates/engine/src/cmd/prefs.rs: next's document.preferences params doc + kerningIncrement
Conflict: crates/engine/src/tests.rs: tests both
Conflict: docs/target-app-parity.md: next's UI and Pen lines + the branch's Tools line
Conflict: ROADMAP.md: logs both
2026-10-12 21:58:22 +00:00
Marco Arnulfo fc01666ac2 feat(text): select sentence, paragraph and story on 3, 4 and 5 clicks (fixes #622) 2026-10-12 23:58:11 +02:00
aiongg 86848092ed Merge autoflow-columns: Autoflow: one frame per column, as the page's columns are set (#625)
Conflict: crates/engine/src/cmd/place_text.rs: autoflow(d, sid, max_pages, cmd, primary): next's parent-spread refusal and cmd-named errors + the branch's per-column body; callers file.place, text.thread (primary false) and Smart Text Reflow (primary true)
Conflict: crates/engine/src/lib.rs: Smart Text Reflow passes next's "Smart Text Reflow" and primary
Conflict: crates/engine/src/cmd/file.rs: next's file.place params doc with the branch's autoflow wording
Conflict: docs/target-app-parity.md: next's Threading line + the branch's Place text line
Conflict: ROADMAP.md: logs both
2026-10-12 21:54:55 +00:00
aiongg d050223b78 Colour entry: panel number fields keep typed text; colours are read on a fixed scale
The Color panel's C/M/Y/K and R/G/B fields keep the typed number until Enter
or leaving the field, and send {model, ...} colours in 0..1, which object.color
reads without guessing the scale (M 1 is 1 %, R 1 is not pure red). Colours
that round to the same swatch name reuse that swatch instead of adding hidden
twins. The hex parser rejects signs and other non-hex characters (#323).
2026-10-12 21:53:06 +00:00
aiongg 2cc95c64a3 Integration (#618 review): differing SVG fill-opacity and stroke-opacity take the fill's for the object with a warning (items have one opacity); test differing_fill_and_stroke_opacity_takes_the_fills_and_warns 2026-10-12 21:49:21 +00:00