chore: sync upstream (86 Commits) #12

Merged
alf merged 86 commits from chore/sync-upstream-20261027 into main 2026-10-27 20:15:18 +00:00
Owner

Upstream-Sync von upstream/main (86 Commits). Fast-Forward.

  • 1abeda44 Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text
  • 5d8739b3 Merge pull request #1795 from dotCooCoo/feat/story-editor-depth-ruler
  • d36e5fb6 Merge pull request #1927 from Silvertree2010/perf/export-speed
  • 1db1635a Ask the composition cache once per story and page in PDF export
  • d77fdf2d fix(ui): dropdown menus grow back after a search with no matches (#1917)
  • 9ef2e64f Merge main into the column rule extent fix
  • 50650f74 Iconic panel flyouts stay open while the canvas is in use (#1902)
  • fcea4173 Hide stale Story Editor depth marks while text changes
  • 17247c92 Merge main into feat/story-editor-depth-ruler
  • 935b817b Merge pull request #1892 from aiongg/layout
  • 446a36d0 Merge pull request #1890 from storytold/fix/nextest-0.9.150
  • 42993ae6 test(engine): read only test cfgs and any pub(…) mod as test modules in the file guard
  • bbb49511 refactor(epub): split lib.rs into modules
  • 27e21ba1 refactor(render): split lib.rs into modules
  • 08f633ae refactor(fonts): split fontdb.rs into fontdb/
Upstream-Sync von `upstream/main` (86 Commits). Fast-Forward. - 1abeda44 Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text - 5d8739b3 Merge pull request #1795 from dotCooCoo/feat/story-editor-depth-ruler - d36e5fb6 Merge pull request #1927 from Silvertree2010/perf/export-speed - 1db1635a Ask the composition cache once per story and page in PDF export - d77fdf2d fix(ui): dropdown menus grow back after a search with no matches (#1917) - 9ef2e64f Merge main into the column rule extent fix - 50650f74 Iconic panel flyouts stay open while the canvas is in use (#1902) - fcea4173 Hide stale Story Editor depth marks while text changes - 17247c92 Merge main into feat/story-editor-depth-ruler - 935b817b Merge pull request #1892 from aiongg/layout - 446a36d0 Merge pull request #1890 from storytold/fix/nextest-0.9.150 - 42993ae6 test(engine): read only test cfgs and any pub(…) mod as test modules in the file guard - bbb49511 refactor(epub): split lib.rs into modules - 27e21ba1 refactor(render): split lib.rs into modules - 08f633ae refactor(fonts): split fontdb.rs into fontdb/
alf added 86 commits 2026-10-27 20:15:17 +00:00
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.
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.
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.
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.
# Conflicts:
#	ROADMAP.md
Use the fixed release for GHSA-vc25-qg58-w57c.
Split files share test helpers through pub(super)/pub(crate) test modules. The guard read only `mod` and `pub mod` as a test module, so it scanned their fixtures as production code. `attr.contains("test")` also matched `#[cfg(not(test))]`, so such a module was skipped; it is scanned now.
ci: require nextest 0.9.150
refactor: shared module layout (craft-contrib#20)
Move the depth ruler state, translations, and menu command into the split UI modules.
Draw the depth ruler and overset line after composition reflects the edited
text. Add a paint-output regression for inserting a paragraph break.
Auto-Collapse Iconic Panels is off by default, so a flyout closes only from its icon or
another icon. The setting is saved under a new key, so preferences saved with the old
default start with it off, and Preferences > Interface > Panels shows it.
* fix(ui): font menus grow back after a search with no matches

Every combo box is craft_ui::ComboBox (craft-libs pinned at 62bb0e1d), whose
menu follows its contents' height while open (egui#5225); clippy.toml bans
egui::ComboBox.

The Font menu splits into a header (search field, filters) and a list
(font_menu_header, font_menu_list). Font fields show it in a
craft_ui::combo::Menu and the style dialogs' Font Family combo boxes in
ComboBox::show_ui_with_header, so only the rows scroll and the search field
stays in place. The blank and Parent's Font rows sit in the header, above
the search.

* chore(deps): craft-libs 60d60d48 (dropdown fixes)

* chore(deps): craft-libs 4d7b82f7 (dropdown fixes)

* chore(deps): craft-libs 92d392cf (#387 merged)

* chore(xtask): pdf-deps expects craft-libs 92d392cf
The PDF exporter called Cache::get twice for every text frame it drew.
Each call rebuilds the cache signature of the whole story, which looks up
every frame of the story with Document::find (a linear walk over all
spreads), and the anchored-frame placements walk them again. For a story
threaded through many frames this is O(frames^2 x items) per export.

The document doesn't change during an export, so the exporter now keeps
the composition it got for each (story, page) and reuses it. The cache
still decides what to compose; the output is byte-identical.

Add examples/pdf_export.rs to designcraft-cli: File > Export PDF through
a headless session on the `designcraft-cli perf` stress document (200
pages, 1M characters in 40 threaded stories, 500 placed images). The
stress document generator moves unchanged from src/perf.rs to a small
library module (src/stress.rs) that the binary and the example share.

Ryzen 16 threads, Linux, 12 runs each, interleaved:
  main     median 3485 ms, min 3427 ms
  patched  median 2016 ms, min 1656 ms  (-42 % median, -52 % min)
The exported PDF is byte-identical (12,075,744 bytes).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
PDF export: ask the composition cache once per story and page
Story Editor: a depth ruler beside the text, and View › Story Editor › Show/Hide Depth Ruler, as in InDesign
Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text
Some checks failed
ci.yml / Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text (pull_request) Failing after 0s
nix.yml / Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text (pull_request) Failing after 0s
sonarcloud.yml / Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text (pull_request) Failing after 0s
ci.yml / Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text (push) Failing after 0s
nix.yml / Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text (push) Failing after 0s
sonarcloud.yml / Merge pull request #1802 from dotCooCoo/fix/column-rules-span-the-text (push) Failing after 0s
1abeda4459
Text frames: column rules run from the top line's ascent to the bottom line's descent
alf merged commit 1abeda4459 into main 2026-10-27 20:15:18 +00:00
alf deleted branch chore/sync-upstream-20261027 2026-10-27 20:15:19 +00:00
Sign in to join this conversation.
No reviewers
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
iris/designcraft!12
No description provided.