Tables inside a copied table cell or note kept the original table's id, so
two tables in the document shared one id. Duplicate Layer now renumbers
them at every depth, with the paragraphs that hold them.
Duplicate Layer copied a layer's objects and stories but not the
hyperlinks on them, so the copies had no links. Each hyperlink whose
source is a copied object or a copied story now gets a copy with an id
of its own, pointing at the copy and going to the same destination.
* refactor(ui): split shortcut set import into sort, apply and conflict steps
Resolves SonarCloud rust:S3776 on import (ui-egui/src/shortcut_import.rs).
* refactor(ui): split drop caps and nested styles dialog into row helpers
Resolves SonarCloud rust:S3776 on drop_caps_and_nested_styles (ui-egui/src/dialogs.rs).
* refactor(ui): split draw_guides into bleed, grid, overlay and guide helpers
Resolves SonarCloud rust:S3776 on draw_guides (ui-egui/src/canvas.rs).
* refactor(ui): split control_paragraph into alignment, indent, drop cap and shading helpers
Resolves SonarCloud rust:S3776 on control_paragraph (ui-egui/src/chrome.rs).
* refactor(idml): move graphic layer option tree out of image_el
Resolves SonarCloud rust:S3776 on image_el (idml/src/export.rs).
* refactor(engine): split convert_all's per-story plan into convert_plan
Resolves SonarCloud rust:S3776 on convert_all (cmd/variables.rs).
* refactor(pdf): split graphic_unclipped into per-kind helpers
Resolves SonarCloud rust:S3776 on graphic_unclipped (pdf/src/export.rs).
* refactor(compose): extract wrap exclusions and frame text area from frame_specs_placed
Resolves SonarCloud rust:S3776 on frame_specs_placed (compose/src/lib.rs).
* refactor(ui): extract command shortcut lookup from shortcut_key
Resolves SonarCloud rust:S3776 on shortcut_key (ui-egui/src/menus.rs).
Duplicate Layer gave the copied stories' tables and anchored objects
their new ids in hash-map order, so the ids differed from run to run.
It now takes the stories in order. The Layers panel's "Duplicate Layer"
menu item has a row in every interface language.
Picks up the startup prompt without the glyphs a font may lack (storytold/craft-libs#343, #344): the close mark is painted and the version pill is ASCII, so apps that panic on a missing glyph no longer take the prompt down.
Part of tracking issue storytold/craft-libs#319
* refactor(engine): split join_paths and apply_para (Sonar S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(engine): use the resolved style types in apply_para_in_story
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Pass the resolved styles by reference at the call site
* Drop the range binding the call no longer uses
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
* refactor(ui): extract helpers from swatches, properties, canvas and app logic (Sonar S3776)
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* fix(ui): drop unused variable after extraction
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
* Use scope_id for the flex grid's interaction id
---------
Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
The Sonar S2208 sweep replaced use super::* with explicit lists, but
tests_ime.rs and panel_docking_tests.rs use helpers added after it was
written, so main stopped compiling.
layer.duplicate adds "<name> copy" above a layer, with the layer's
settings, a copy of every object on it and copies of its ruler guides,
on document and parent pages, in one undo step. Copied text frames stay
threaded to the copies of frames on the same layer and are not threaded
to frames on other layers. The anchored objects in a copied story get
new ids, and so do its tables and its text anchors outside table cells
and notes; its cross-references point at the copied anchors. A group
goes on the new layer with all its members, and a copied live caption
follows the copied object. A copied override of a parent item overrides
that item's copy, and is detached when the parent item is on another
layer. Pages hide a parent item's copy where they hide the parent item.
A layer whose objects nest more than 64 levels deep is refused.
The Layers panel runs it from a layer's context menu (Duplicate Layer
"<name>") and when a layer is dropped on Create New Layer.