Roles said whether a customer may resize or move an element. Now they can say how far.
Limits on resize and move. In the role editor, beside May the customer…, a new column — Within these limits:
"May be resized 80–120% and nudged ±12 mm" is now a role. Every element using it follows, the Role panel says so in its summary, and Preview as viewer lets you feel it.
⚠️ A percentage is of the size as drawn — permanently. Each element remembers its size and position when the role is applied, and limits are always measured from that. A frame a customer enlarged to 120% does not get another 20% the next time the document is opened.
⚠️ The editor is never limited. Limits are rules for the customer; a designer can always go past them. Use Preview as viewer to check them.
How limits combine with groups, frames that grow with their text, and elements that sit against a
page edge: docs/EditPermissions.md.
Text wraps around pictures in multi-column frames. Text wrap used to be switched off for any frame with more than one column, so the text ran straight under the picture. Each column now flows around it on its own side, balanced columns included.
⚠️ Documents saved in the editor can be printed again. Since 20260929 the editor saved two settings — an element's page anchor and its rotation point — as an empty value when they were not set, and the PDF service rejected every such document. They are now left out, as the service expects. A document saved before this release needs to be opened and saved once more before it will print.
A story that continues on the next spread gets its text there. A text chain stopped at the spread edge, so a frame on the following spread stayed empty, and nothing reported the text that did not fit.
A linked text frame shows only the lines that fit it. It drew the rest of the story below itself, over whatever was underneath, even though that text continues in the next frame.
Soft returns start a new line. A line break made with Shift+Enter in InDesign — an address block, say — ran together on one line, and printed with a box where each break should be.
Text beside a very narrow gap next to a picture is no longer lost. A gap too narrow for a word made the text vanish for as long as the picture lasted; it now continues below.
Text frames with columns print in their columns. A two- or three-column frame showed its columns on screen but printed as one narrow column down its left edge, running under any picture in the way. It now prints as it looks. A document saved before this release prints in columns once it has been opened and saved again.
Size and move limits are enforced. The editor's move and resize gestures — which the viewer shares — went around the permission checks' limit step entirely, so any limit a template carried did nothing. They now go through it, including after snapping to a guide.
Limits survive saving. A template's limits were written to the file and never read back, so they were lost on every open.
These come from the converter and the PDF service, not from the editor, and reach users when those services deploy:
The reference is docs/EditPermissions.md ("Limits: how far, not just whether"); decisions and
evidence are on TYP-762.
edit_constraints = { resize?: {min_width, max_width, min_height, max_height, aspect_lock}, move?: {dx, dy}, reference?: {x, y, width, height} }, each bound {value, unit: 'mm'|'percent'}.
A role carries the limits; ⚠️ only an element carries a reference. apply_role() captures it;
apply_roles() at load keeps it — re-measuring there is the ratchet.
⚠️ constrain() passes everything through in editor mode, as can() grants everything.
⚠️ PageElement.limit_resize() turns limits into drag offsets for any handle — offsets, not a
clamped rect, because resize_n() rescales a picture and a group's children from them. The old
try_resize() was right only for the bottom-right handle, and nothing called it.
AutoSize growth is clamped to a largest-height limit in do_auto_size(), outside the editor.
Only resize, move and the reference are in document-schema. The colour and image allow-lists and a movement region exist in the canvas policy but are not modelled, so nothing may write them.
Canvas pin b5b5088 (first shipped at 68e0386, build 674) — besides TYP-762 it carries the
Testdocument fixes (epic TYP-770):
find_element() / chain_element() follow a text chain across spreads (TYP-775)page_anchor / rotation_origin are omitted from the wire (TYP-777)rich_text_layout places each line in its column (TYP-778,
place_layout_in_columns()) — the PDF draws from positions, so a multi-column frame printed as
one tall column. Added to this release by a second deploy, at b5b5088.The editor-side half of TYP-775 (overflowutils, toolbar, overfloweditor) is merged into
this branch.
⚠️ TYP-777 is the reason this release cannot wait: every document the 20260929 editor saves
fails the schema's Assert\Choice on ''.
TYP-762-limits — editConstraints on PageElement and Role.ALLOW_EXTRA_ATTRIBUTES=false rejects edit_constraints on the current schema.68e0386).chore/bump-document-generator-testdocument — the PDF fixes
(TYP-780/781/776/782). Independent of the editor.TYP-762-limits-ui, pinned to canvas 68e0386 — deployed as build 674.chore/bump-document-generator-778-779 — document-generator 1803c6f: the
column vertical-align rule (TYP-778) and SVG stylesheet colours (TYP-779). Independent of the
editor.TYP-778-columns-in-print — master b5b5088.docs/release-note-20260930-print-fixes last, pinned to canvas b5b5088 — it
carries this note, and merging it deploys.