object::renumber now gives a story copy's anchors and tables new ids.
Duplicate Layer keys each copied anchor by the original anchor's id,
so copied cross-references point at the copied paragraph, and pairs
copied tables with the originals in order, so objects anchored in
table cells keep their live captions. A copy that renumber reports
incomplete is refused with the nested-too-deeply error.
Copying an object recurses from its groups into the stories of anchored
text frames and on into theirs. The limit on how deeply a layer's
objects may nest now counts that depth in all, from the object on the
spread, instead of starting again at each story.
Copying a frame now gives the objects anchored in its story copy ids of
their own and copies of the stories of anchored text frames. Duplicate
Layer renumbered them a second time, so live captions kept pointing at
the originals and shared stories were copied again. It now records the
ids of those copies instead.
Copying a frame also renumbers objects anchored in endnotes inside table
cells and footnotes, which kept their original ids before.
An edit that moves lines into other frames composes on until a paragraph
starts in the same frame and place as before, or to the story's end, as
an_edit_that_moves_lines_composes_up_to_the_next_frame_the_text_starts_in
shows. The ROADMAP line no longer cites an issue about selection lag.
The document keeps its outlines sorted by image and threshold, and the
lookup uses a binary search. The data merge test now checks that the
merged document has the image's outline, and that a bounding box wrap
leaves the same caption overset.
The dialog turned the inset link on when the first selected frame had the
same inset on all four sides. With a second frame whose sides differ, typing
one side then set all four sides of every selected frame, so the second
frame lost its other insets.
The link is now on only when every frame the dialog changes has even sides:
the selected items, else the caret's frame, else every frame of the caret's
story.
Duplicate Layer gave each copied text anchor the id story id << 24 | n without checking it, so a document holding an anchor with that id, such as one loaded from a file, got two anchors with one id, and cross-references could find the wrong one. A copied anchor now takes a new id when another anchor has that one or when the story id does not fit in the high bits.
Each copied story with text anchors walked every story copied before it
to retarget their cross-references, so copying many such frames took
time quadratic in their number. The copies' cross-references are now
pointed at the copied anchors once, after the last item is copied.
save deflated every asset that isn't PNG, JPEG, GIF or WebP, with no size
cap, while opening refuses a deflated asset over 1 GiB or deflated entries
over 4 GiB together. An asset past either cap is now stored as is, which
opening reads at any size. Smaller assets are deflated as before, and the
zip bomb guard on load is unchanged.
Duplicate Layer pointed copied live captions at the copied objects before anchored objects in the copied stories had their ids, so a caption whose source is anchored kept the original object as its source. Anchored objects in copied stories also kept their captions and parent-item overrides unchanged. The copies now take their links after every anchored object has its id, and anchored objects get the same remapping as the other copies.
data.placeholder.add with role qr and the insertion point in text bound
the QR code to the first selected frame, which the caret was not in. It
now returns "qr placeholders bind to a frame", as a QR field there does.
A field inserted at the insertion point left the caret before its
marker, so a second field went in front of the first. The caret now
moves past the marker, as after typing.
Docs: docs/agents.md.
Both text frames in the test start with an identity transform, so comparing transforms passed even when the copied thread was reversed. The assertion now compares the frames' paths, which differ.
renumber and its helpers return false when a copy nests deeper than
MAX_COPY_DEPTH and must not be inserted. They now carry #[must_use], so
a caller that drops the result fails to build under -D warnings.