v0.5.0
[0.5.0] - 2026-03-23
Breaking changes
- Canvas group redesign. Interactive elements are now groups with
top-level fields (id,on_click,a11y, etc.) instead of a nested
"interactive"sub-object. Only groups can be interactive -- leaf
shapes (rect, circle, etc.) are no longer interactive on their own. - Standalone transform/clip commands removed.
push_transform,
pop_transform,translate,rotate,scale,push_clip,
pop_clipare no longer supported as standalone shape types. Use the
transformsarray andclipfield on groups instead. - Group
x/yfields removed. Usetransforms: [{"type": "translate", "x": ..., "y": ...}]instead. - Event families renamed.
canvas_shape_*->canvas_element_*,
shape_id->element_idin event data.
Added
- Transforms on groups. Groups carry an ordered
transformsarray
(translate, rotate, scale) and an optionalclipfield, replacing
standalone push/pop commands. - Transform-aware hit testing. Full 2D affine matrix tracks
translate, rotate, and scale through nested groups. Cursor positions
are mapped to local space via the inverse matrix. Clip regions from
ancestor groups are intersected and tested. - Focus lifecycle events. New event families:
canvas_element_blurred,
canvas_focused,canvas_blurred,canvas_group_focused,
canvas_group_blurred. - Click-to-focus. Clicking an interactive element grants the canvas
keyboard focus and sets internal focus to the clicked element. - ID-based focus tracking. Focus survives element reordering between
renders. Stale elements are detected and blurred automatically. - Focus style. New
focus_stylefield on groups for visual feedback
when keyboard-focused. Priority: pressed > hover > focus. - Suppressible focus ring.
show_focus_ring: falsedisables the
default ring (usefocus_stylefor custom indicators). - Geometry-aware focus rings. Ring shape adapts to hit region: rounded
rectangle for rect, circle for circle, capsule for line. Full transform
support via matrix decomposition. - Arrow mode. New
arrow_modecanvas prop:wrap(default),clamp,
linear,none. - Focusable groups. Groups with
focusable: truebecome Tab stops
for two-level navigation. Tab moves between top-level entries, arrows
navigate within the focused group. - Canvas accessible role. New
rolecanvas prop (defaults togroup
when interactive,imageotherwise).active_descendantset
dynamically from focused element. - Accessibility tree structure. Focusable groups create parent-child
relationships viatraverse(). Child accessible nodes have widget IDs
foractive_descendantresolution. - Validation diagnostics. Warnings for: interactive elements without
a11y, stateful roles missing state props (switch/toggled,
radio/selected), elements without set position. focus_elementwidget op. Programmatically focus a canvas and set
internal focus to a specific element.click_element/focus_elementtest interact actions.CanvasElementFocusChangedmessage. Single message for blur+focus
transitions, split into separate outgoing events by the emitter.- Theme-aware canvas colors. Color strings in fill, stroke, and text
that match iced palette names ("primary","text","background",
"success","danger","warning") are resolved against the current
theme at draw time. Canvas shapes now participate in the theme system. - Focus-visible pattern. Focus ring and focus_style only show for
keyboard navigation (Tab), not mouse clicks. Matches iced's built-in
button behavior. - Custom focus ring radius. New
focus_ring_radiusfield on groups
for shape-matched focus rings (e.g. pill-shaped toggles).
Fixed
- WASM build: replaced
wasm-opt --all-featureswith explicit feature
flags for compatibility with older wasm-opt versions. - Canvas style overrides (hover_style, pressed_style, focus_style) now
correctly read from the group, not from children. - Canvas keyboard events now work when the mouse cursor is outside the
canvas bounds. - Canvas focus visuals (focus ring, focus_style) clear when the canvas
loses iced-level focus. text_editorcursor no longer resets on every keystroke. Content hash
is updated after TextEditorAction to prevent stale prop sync.text_editorcursor movement, selection, and click-to-position now
work. All actions (not just edits) are performed on the Content.
Changed
- Release binary assets renamed from
plushie-{os}-{arch}to
plushie-renderer-{os}-{arch}. WASM archive renamed from
plushie-wasm.tar.gztoplushie-renderer-wasm.tar.gz. - Updated to plushie-iced 0.8.0.
Full Changelog: v0.4.1...v0.5.0