A point release after 20261001, continuing the parameter-bar reorganisation (TYP-766). Nothing about what a document does has changed — only what the bar shows and where.
A plain rectangle shows its position and size again. Its panel used to render empty; position, size, rotation, shadow, text wrap, lock and role are all back.
"Traingle" is spelled "Triangle".
Locked is a padlock and no longer looks disabled while locked. The switch used to sit inside the block it greys out, so its colours dimmed with the fields around it. It is now a padlock (closed when locked, open when not) at the right edge of the Position & size header, outside the greyed block, and can be toggled with the keyboard.
Select All updates the parameter bar. Cmd+A and Select > Select All used to leave the bar showing whichever element was selected before; it now shows the whole selection.
The role dialog reads in dark mode. The limit cards (Resize, Move, "moving is off") used fixed greys that all but vanished on the dark theme; they follow the theme now, and a switched-off limit shows as a dashed card instead of a faded one.
The bar opens with the element's name, not its UUID. A title card at the top now shows the name as an editable field, with the element's type underneath — Rectangle, Rounded rectangle, Ellipse, Image, Text frame, Line, Path, Polygon, Group. The UUID no longer sits at the top.
Details, folded, closes every bar. A new section at the bottom holds the UUID and, for an image, the effective-resolution figure that used to sit beside the name field. It starts collapsed — click to open it.
One order for every element type, and Locked moved into the Position & size header. Every
bar now reads Position & size → Rotate → Appearance (Corners, Shadow) → Fit text → Text wrap →
Role → Details, leaving out whatever a type does not have. Locked is no longer
its own section — a padlock sits at the right edge of the Position & size header, so it stays
reachable even while the element is locked and the fields below it are greyed out.
A host calling hide('parameterbar.position_size') now also hides the Locked padlock, since
it moved inside that header — it used to be a separate parameterbar.locked section that hiding
position_size left alone.
A Line element now has a Position & size wrapper too. It never had one before — its fields
sat loose under the title. A host calling hide('parameterbar.position_size') now also hides
a selected line's position/size block, the same as it already did for every other element type.
Several selected elements share one bar. Shift-click a few elements and the bar now shows the properties they all have — Rotate, Corners, Shadow, Fit text, Text wrap, Role — in the same order as for one element, under a title card that says how many are selected. Change a value and every selected element gets it, as one undo step. Where the elements differ, the control says so: a switch reads as off and is drawn dashed, a number field stays empty with a dash. Fit text only edits its rules when every frame has the same ones; otherwise it says "Rules differ per frame". The shadow colour chip edits all of them too; when their shadow colours differ it shows empty, in a dashed well.
Fill, stroke and opacity act on the whole selection. With several elements selected, the
toolbar's fill colour, stroke colour and opacity used to change only the top-most one; they now
change every selected element — an opacity drag is one undo step, same as before. Where the colours
differ the picker highlights no swatch; where the opacities differ the field shows —. Colouring
selected text or table cells still applies to the one frame being edited.
A selection that includes an older text or table element shows no shared sections. Those elements have no entry in the bar's section list, so only the title card and Position & size appear.
Locked moved into the header of the multi bar too. With several elements selected, the lock switch sits at the right edge of Position & size, as it does for one element. Locking greys the sections below it, and an edit in the multi bar never changes a locked element.
The Shadow, Fit text and Position & size switches now line up at the same right edge. All three section headers are built by one shared component, replacing three near-identical, slightly misaligned copies.
Built-in roles: Close instead of a stray Cancel. A built-in role has nothing to save, so its footer shows one Close button at the right edge. "Duplicate to customise" is an outline button at the height of the name field rather than a primary pill.
The page's Locked toggle is the same lock chip as an element's (padlock plus "Locked" /
"Unlocked"). parameterbar.page.locked still hides it.
"Appearance" reads as a group heading — sentence case, above the uppercase section headers — and the separate "In the viewer" label above Role is gone: the Role summary box carries that title.
parameterbarsections.ts (ELEMENT_TYPES, SECTION_ORDER); the
render wiring is the RENDER map in parameterbarcontroler.ts.element_size_panel / element_size_line_panel
(parameterbarelementsize(line).ts), markup .pb-title / .pb-title-type (stylesheets/style.css).
Its name <input> keeps id='name' and data-pb-component='name'; the card is registered as a
second parameterbar.position_size root (register_pb_root(prefix, root, slot), new optional
slot), so gEditorUI.hide('parameterbar.position_size.name') still resolves, live too, even
though the field sits outside the Position & size block — hiding parameterbar.position_size no
longer hides the name.parameterbardetails.ts is the new element_details_panel(), wrapper data-pb-component='details',
reusing resolution_label() (now exported from parameterbarelementsize.ts).parameterbarsections.ts adds SECTION_GROUP (corners/shadow → "Appearance", role → "In the
viewer"); the render loop in parameterbarcontroler.ts prints a .pb-group-label ahead of the
first section in a group that differs from the previous one.lock_switch() (parameterbarlock.ts, exported, replaces element_lock_panel) builds the
padlock (a role="button" span with aria-pressed, .typograph-pb-lock); element_size_panel / element_size_line_panel append it to the Position & size <h2>
and apply set_parameterbar_locked() to pb_sp_root only, not the wrapper that holds the header —
the padlock would otherwise be greyed along with the fields it locks.
data-pb-component='locked' is unchanged, so gEditorUI.hide('parameterbar.locked') still works.
multi_lock_panel (parameterbarmulti.ts) was later folded into it — see Several selected below.docs/API-EditorUI.md corrected: the key has always been parameterbar.locked, not
parameterbar.lock as the table said.section_header(title, control?) (parameterbarsectionheader.ts, exported) is the one section
header row now used by Shadow (parameterbarshadow.ts), Fit text (parameterbarautofit.ts) and
Position & size (parameterbarelementsize(line).ts) — a flex row, title left, an optional
control (a switch, so far) right-aligned, class pb-section-header. Where the row also drives a
ParameterHeader's collapsible container (Shadow, Fit text), the ParameterHeader instance and
its typograph-pb-cells container stay; only its generated title row is replaced with
section_header()'s output. data-pb-component='autofit.enabled' moved from that title row onto
a <span> wrapping just the switch, so gEditorUI.hide('parameterbar.autofit.enabled') still
resolves. .pb-section-header (stylesheets/style.css) is based on .parametersbar h2 so
nothing else shifted, plus justify-content: space-between.shared_sections(elements) (parameterbarsections.ts) is the
intersection of sections_for in SECTION_ORDER, without position_size and details.
parameterbarmixed.ts holds common_value (strict equality, objects by JSON.stringify),
apply_all (one undo step, then redraw) and the show_switch / show_field mixed display
(is-mixed class, — placeholder, cleared in the switch callback via set_switch_callback).
apply_all skips locked elements in a multi-selection (editable()); lock_switch opts in with
{ include_locked:true } so it can unlock. The multi position, rotate, shadow-angle and role
writes go through editable() too. After a multi lock, set_parameterbar_locked() greys
#parmetersbarcontent. Text wrap mutates each element's own wrap, so differing standoffs, side
and inverse survive an edit. The Shadow, Corners, Text wrap and Fit text panels now take a
list (element_shadow_panel(elements, c) etc.); the single bar's RENDER passes [el], the
multi bar's MULTI_RENDER the selection. Both bars share render_sections() in
parameterbarcontroler.ts, so the multi bar prints the same group labels. lock_switch() takes
PageElement[] too; multi_lock_panel is gone. The multi wrapper keeps
data-pb-component='multi'; the padlock keeps locked. Fit text's rule edits now give each
frame its own copy of the steps, where a single frame used to share the panel's array.selectiontargets.ts adds selection_targets() (selectedElements()
when more than one, else [selectedElement()] or []; pure core targets_of(page)) and
each_target(set), which writes through editable() with no undo step of its own. The colour
pickers (SwatchPanel, the legacy Panel) use it instead of apply_all, because their
show()/hide() already bracket the whole picker session as one step, and a nested set_undo()
would drop every pick but the last. SwatchPanel reads its initial swatch and tint through
common_value (common_swatch); the text-selection, table-cell and text-stroke branches stay on
selectedElement(). opacity_call_back writes to every target between the existing
opacity_drag_start/opacity_drag_end pair. The shadow chip is no longer hidden for several;
.typograph-swatch-well.is-mixed draws its mixed state.gEditorUI.register_pb_root(prefix, root, slot?): the optional slot registers a second root
under the same prefix; the title card uses it so a live hide('parameterbar.position_size.name')
reaches the name field. Existing two-argument calls behave as before.lock_chip(initial, toggle, what) (parameterbarlock.ts) is the shared lock control; lock_switch()
wraps it for elements, ParameterBarPage uses it directly.