Commit Graph
4115 Commits
Author SHA1 Message Date
macadminHU 18c47868dc HU1: document screen-mode and document-grid tests
Add purpose descriptions only. All nine CI gates passed; existing test assertions remain unchanged.
2026-10-25 08:40:03 +01:00
macadminHU 775ba1c6ad HU1: document cached and context translation tests
Add purpose descriptions only. All nine CI gates passed; test assertions and executable code are unchanged.
2026-10-25 08:39:20 +01:00
skylartaylor 6bc2e25792 M0.37: fix accessible controls and simplify reviewed engine paths 2026-10-25 08:31:14 +01:00
skylartaylor b350488906 Reconcile current DesignCraft main with the egui 0.37 migration 2026-10-25 07:16:33 +01:00
NetterSilverandClaude Haiku 5.5 58060a5804 Fix ruler major tick spacing skipping the 10x step
Found while testing crates/geom/src/units.rs:~147 (Unit::ruler_ticks, the `while major * zoom < 50.0` loop)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 07:04:03 +01:00
skylar taylor-barrick 7ca39c6c10 Merge pull request #1806 from storytold/fix/idml-nested-pdf-layer-agreement
Keep nested placed-PDF layer choices in embedded IDML
2026-10-24 23:45:11 -06:00
skylar taylor-barrick 7417172663 M6: reject conflicting shared-id PDF layer choices in IDML 2026-10-24 22:59:09 -06:00
NetterSilverandClaude Haiku 5.5 22f896536d Reply with a parse error on non-UTF-8 lines in MCP serve
Found while testing crates/mcp/src/server.rs:62-64 (Server::serve)

Co-Authored-By: Claude Haiku 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-25 04:05:32 +00:00
con3code a4106eafe0 Merge remote-tracking branch 'upstream/main' into fix/mojikumi-consecutive-punctuation 2026-10-25 12:43:11 +09:00
con3code 1605cada6e Merge remote-tracking branch 'upstream/main' into fix/idml-q-unit 2026-10-25 12:43:11 +09:00
skylar taylor-barrick dae8a622eb Count distinct placement ids in the IDML layer-variant guard
A duplicated text frame holding an anchored placed PDF leaves two placements sharing one ItemId, so the raw update count exceeded the variant count and a correct export failed. The guard now checks that every mapped id was reached. Replaces the mismatch test with a duplicated-frame export regression.
2026-10-24 21:13:58 -06:00
skylar taylor-barrick 3c24fc290b Text: explain the positive baseline-grid increment requirement 2026-10-24 21:06:26 -06:00
skylar taylor-barrick 3bacb1b022 Text: reject malformed explicit Story Options targets 2026-10-24 21:06:21 -06:00
Davit Matchakhelidze 56230ae370 Merge remote-tracking branch 'origin/main' into ka-update
# Conflicts:
#	crates/ui-egui/src/i18n/ka.rs
2026-10-25 06:47:23 +04:00
skylar taylor-barrick 21a54becce M6: guard IDML variant coverage and strengthen export tests 2026-10-24 20:45:22 -06:00
dotCooCoo 346a005c20 File Info: a keyword list or null from ui.dialog.open reaches file.info as it is 2026-10-24 19:39:52 -07:00
skylartaylor 8a6ed75d41 egui037: reconcile current DesignCraft main and qualify CI 2026-10-25 03:38:13 +01:00
skylar taylor-barrick 25218f3759 M6: preserve nested PDF layer choices in embedded IDML 2026-10-24 20:16:22 -06:00
dotCooCoo 5f77ea123b Text frames: column rules run from the top line's ascent to the bottom line's descent
A column rule ran from the top of the columns to their bottom, so a frame
that the text only half fills drew its rules down to the empty bottom of
the frame. InDesign draws them from the top line's ascent to the bottom
line's descent. column_rule_rects now takes that extent from the frame's
lines, and the top and bottom insets shorten the rule from there. A frame
without lines draws no rules. Existing documents draw their column rules
at the new length, on screen, in PDF and in PowerPoint export.
2026-10-24 18:54:30 -07:00
dotCooCoo 2c7bbaa79e File Info: OK keeps the fields the dialog does not hold, and the active document's Data Merge preview 2026-10-24 18:40:43 -07:00
aiongg 3ed45a7e3f Docking: a modal focuses the main window only when a floating panel window has the keyboard 2026-10-25 01:36:14 +00:00
skylar taylor-barrick 53d9b6d7f8 M6: merge current main and retain nested PDF/A placement traversal 2026-10-24 19:25:12 -06:00
dotCooCoo 0f037cb67e Merge main into feat/file-info 2026-10-24 18:14:03 -07:00
aiongg 3b5d85d664 Docking: a modal opened from a floating panel window focuses the main window 2026-10-25 01:13:52 +00:00
skylar taylor-barrick df526527cd Merge main into the explicit-visibility branch 2026-10-24 18:58:31 -06:00
skylar taylor-barrick 0f1ff65e7a Merge pull request #1647 from andeecollard/codex/placed-graphic-layer-overrides
M6: preserve placed-graphic layer settings across IDML and native saves
2026-10-24 18:55:32 -06:00
dotCooCoo 41b7611b27 Story Editor: showing or hiding the depth ruler keeps the text's focus
The ruler's space is allocated before the text editor, so toggling it
moved the editor's automatic widget id, and the editor lost its focus
and caret. The editor now has a fixed id.
2026-10-24 17:53:51 -07:00
dotCooCoo e1ff9b9ee8 Story Editor: Show/Hide Depth Ruler in Spanish
The shared table's Spanish column held the English label. It now reads
"Mostrar/ocultar regla de profundidad", and a test checks that every
interface language translates the label.
2026-10-24 17:42:42 -07:00
aiongg d0317e6018 Merge remote-tracking branch 'upstream/main' into docking-trial 2026-10-25 00:38:08 +00:00
aiongg befc2e0346 Styles: renaming a style keeps its Export Tagging (#1790)
* Styles: renaming a style keeps its Export Tagging

Renaming a paragraph or character style, or moving it into a style
group, moves its Export Tagging to the new name. Deleting a style drops
its tagging and leaves the replacement's own tagging unchanged.

* Styles: a paragraph style can't be renamed onto another style's name

* Styles: a refused rename says the name is taken and shows the General section

Renaming a paragraph or character style onto a name another style has
now says so ("a paragraph style named `Body` already exists"); empty
or bracketed names keep the generic message. The Paragraph Style Options
dialog switches to General, where the name field is, when the rename is
refused. Paragraph style names are trimmed like character style names,
and a renamed style never picks up an export tag left under its new name.

* Styles: the rename test's stale tagging takes the Split Document field

* ROADMAP: date the style rename line 2026-10-24
2026-10-24 20:37:21 -04:00
aiongg 280ad8eb65 Search: one list of the UI commands it leaves out, with the docking ones; Show Panel needs a panel 2026-10-25 00:29:13 +00:00
aiongg c987cbd8e8 Merge remote-tracking branch 'upstream/main' into docking-trial 2026-10-25 00:26:21 +00:00
aiongg a59880394d Search: Delete Workspace is left out of Quick Apply and command search (#1791)
* Search: Delete Workspace is left out of Quick Apply and command search

It needs a saved workspace's name, which a search entry can't supply,
so choosing it there failed. The application bar's workspace menu lists
the saved workspaces to delete.

* Search: leave out the interface commands that fail or reset a setting there

Quick Apply and the application bar's search ran their entries without
parameters. Commands that need a workspace, a command and shortcut, a
menu item, a panel, a window edge, an app page, a recent file, or a
swatch or color group failed when chosen there. Interface Color Theme
and UI Scaling switched to the dark theme and 100%, Workspace switched
to Essentials, and Reset Shortcuts cleared every custom shortcut without
asking. Search leaves all of them out; each stays in the menu, panel or
dialog that gives it the value.

* Search: the flattener preset, Screen Mode, Zoom To and the Task Bar pin stay out of Quick Apply
2026-10-24 20:23:48 -04:00
skylar taylor-barrick 9f6cb08591 M6: preserve nested placed-PDF layer choices in PDF/A export 2026-10-24 18:07:19 -06:00
skylar taylor-barrick d5d1b9236e Docs: stop claiming every placement in the placed_items comment 2026-10-24 17:55:46 -06:00
skylar taylor-barrick 040e388e68 M6: let rustfmt lay out the anchored regression's item
Formatting only: the gate's `cargo fmt --check` rejected the three-argument layout.
2026-10-24 17:50:41 -06:00
skylar taylor-barrick 921fcc16d0 Merge current main (b595f1b7) into the #1647+#1671 pair 2026-10-24 17:45:15 -06:00
skylar taylor-barrick 2d81510d19 M6: keep an anchored placement's layer choice in a regression
The parent-page regression covers a placement a page inherits. The other placement the export
walks reach is an object anchored in a story: the IDML copy gets a variant that shows every
layer, an external-only copy is refused, and PDF/A-2b rasterises it and warns. The nested-story
regression that used to cover this case also asserted placements anchored inside a table cell and
a footnote, which this pass does not reach; this one keeps the anchored case alone.
2026-10-24 17:45:12 -06:00
skylar taylor-barrick dfba0a3f9d M6: leave placements nested in cells and notes out of the PDF layer pass
Both exports walk Document::placed_items: document and parent spreads, groups, and the objects
anchored in a story. That is the walk the parent-page and anchored fix introduced. The
nested-story traversal (table cells, notes, endnotes), Document::update_placed_items and the
fail-closed refusals that went with it are not part of it: that is the traversal change on its
own, not the placements this pass carries. update_items keeps its reach, so the two exports clear
the choice where the placement actually is again.

A choice anchored inside a table cell's or a note's text therefore stays on the document and is
not carried into the embedded IDML copy, as on main; the refusal that turned that silent
difference into an export error goes with the traversal it guarded, since asking the walk's own
predicate it could never fire. The stale-field half keeps: has_applicable_pdf_layer_overrides
still asks for a graphic whose asset is a PDF, so relinking a placed PDF to an image no longer
makes the package report name a choice that does not exist.

Tests: the nested-placement regression and the relink integration test of the removed refusal
go; the parent-page regression, the stale-field predicate test and the format 4 cell-only reader
test stay. The comments no longer claim every placement counts.
2026-10-24 17:44:02 -06:00
skylar taylor-barrick a32ad396f3 PDF: give the test-only Graphic literals the layer_options field
Graphic gained an optional layer_options field, so the test-only literals in the PDF
crate and in the engine's optional-content support need it. No behaviour changes.
2026-10-24 17:39:46 -06:00
skylartaylor df9d51f4e2 egui037: Integrate DesignCraft main EPUB and PDF updates 2026-10-25 01:34:16 +02:00
aiongg 44aa2702f3 Docking: files dropped on a floating panel window open or place
craft-ui reports drops on native floating windows in DockOutput::window_files;
they go through the main window's drop handling in the same frame.
2026-10-24 23:08:02 +00:00
skylar taylor-barrick ba8936e061 M6: keep the relink regression off the file guard's path
The workspace file guard scans test modules too when they are declared `pub(crate) mod` (it only
skips a plain `mod`), so a temp file written inside pdflayers.rs' tests failed
no_crate_touches_the_file_system_outside_the_checked_readers. The unit test now builds the state a
relink leaves behind - layer fields on an item whose asset is an image - and asserts the refusal
predicate ignores it while all three exports run. The user path (a real links.relink to a PNG) moves
to tests/pdf_optional_content.rs, where the guard exempts fixtures written by test files.
2026-10-24 17:05:13 -06:00
aiongg aad814b05e Docking: modals block native floating panel windows
While a dialog, About or Quick Apply is open, floating panels in their own OS
windows take no input and are drawn under a dim from the panel token.
2026-10-24 22:58:56 +00:00
aiongg 6053b099bc Docking: pin craft-libs to 6e7f28518dd1 (main)
Every craft-libs crate and the Krilla/Hayro patches use one revision, which
also vendors hayro-postscript. Clipping text paints nothing in the PDF bounds
device; its clip arrives through push_clip_path.
2026-10-24 22:58:49 +00:00
skylartaylor a2db858e7d egui037: Port DesignCraft to egui 0.37
Pin the final egui, winit and shared UI revisions and reconcile current main.
Preserve document-epoch input and screenshot boundaries, host action ordering,
and Windows path regression coverage. Add click/End batch characterization.

Validation: all nine Linux CI stages pass (3230 tests, zero failures); Windows
CI and bounded native editing workflows pass on the same production source.
2026-10-25 00:52:21 +02:00
con3codeandClaude Opus 5.5 2c401cb543 Number fields: every " pt" field reads the unit typed
The Control panel's Font Size, Leading and Baseline Shift and Character •••
Baseline Shift still used NumField::number with " pt", which read 13Q as
13 pt. NumField::number now makes a points field for the " pt" suffix, so
no point field can miss it; with_suffix is gone.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013phQ3ekq6uGBEWD6FjFYG2
2026-10-25 07:50:15 +09:00
dotCooCoo 5c103c280e Story Editor: a depth ruler beside the text, and View › Story Editor › Show/Hide Depth Ruler, as in InDesign
The Story Editor has a vertical depth ruler between the style column
and the text. It is marked in the document's vertical ruler units with
how deep the story's text fills its frames, counted through its
columns and threaded frames, and it is shaded down to the overset
point. Paragraph spacing adds to the depth. Lines set side by side, in
the sub-columns of a split paragraph or on both sides of a wrap
object, count once. Where several marks fall on one editor row, only
the deepest is drawn. A red line crosses the text, and the ruler when
it shows, above the first character that does not fit.

View › Story Editor › Show/Hide Depth Ruler (view.storyEditorDepthRuler)
shows or hides the ruler in the Story Editor, for every story opened in
it. The ruler is shown by default, and the setting is saved with the
preferences.
2026-10-24 15:50:10 -07:00
skylar taylor-barrick fa741a157d Doc: keep the pointer test clear of a clippy lint
`spreads.to_vec()` instead of `.iter().cloned().collect()`, which `-D warnings` rejects. Caught by
the gate run, not by the test.
2026-10-24 16:46:26 -06:00
dotCooCoo c1561f7ccf Preflight: the missing-link test makes the temporary folder absolute
a_missing_link_shown_by_its_preview_is_still_reported builds its link
under std::env::temp_dir(). On macOS and Linux that returns TMPDIR as
set, so a relative TMPDIR gave a relative link, which document_path
refuses in a document without a path, and the test failed with
"(the path is not valid)". The test now passes the temporary folder
through std::path::absolute first. The preflight code is unchanged.
2026-10-24 15:43:49 -07:00