Releases: plushie-ui/plushie-rust
v0.7.1
Full Changelog: v0.7.0...v0.7.1
v0.7.0
[0.7.0] - 2026-05-08
This release introduces the Rust application SDK (plushie crate),
the widget SDK (plushie-widget-sdk), the cargo-plushie tool, and
moves the workspace to a crate-split layout. Everything below is
relative to 0.6.1.
Breaking changes
close_windowmoved fromwidget_optowindow_op. Hosts that
sentwidget_opwithop: "close_window"must switch to
window_opwithop: "close"and awindow_idfield. The renderer
no longer handles the old widget_op form.- Workspace restructured into per-role crates. The former single
renderer crate is split acrossplushie-core,plushie-renderer-engine,
plushie-renderer-lib,plushie-renderer(native binary),
plushie-renderer-wasm,plushie-widget-sdk, andplushie(app SDK).
Workspace crates now live undercrates/. The pure renderer state
engine (Core), retained tree, and wire codec live in
plushie-renderer-engine; widget authors do not depend on it. Propsrepresentation unified. ThePropsenum (Typed vs Wire
variants) collapses to a singlePropMap. SDK builders, prop
helpers, and widget renderers now operate on one representation.
Callers that matched onProps::TypedorProps::Wireneed to
migrate to the unified API.plushie-widget-sdkis optional. It is gated by thedirect
feature on theplushiecrate. Wire-only consumers get a slimmer
build. App authors using built-in widgets see no change; widget
authors must depend onplushie-widget-sdkexplicitly.PlushieRenderertrait is sealed. External implementations are
no longer permitted. All supported backends ship with the crate.- Scripting
interactpayload format. TypedKey,KeyPress,
MouseButton,InteractAction, andEffectKindreplace the
stringly-typed forms. Thecmd/commandmodifier is now resolved
to the platform-appropriate physical modifier by the renderer. - Canonical renderer env whitelist. The renderer subprocess inherits
only an explicit list of environment variables (names and prefixes).
Custom vars must match a documented prefix or be passed via a
supported hook. Seedocs/reference/wire-protocol.md. - Diagnostic wire format. Diagnostics emitted by the renderer use
the typedDiagnosticenum with structured variants instead of
free-form strings. Host SDKs that pattern-match diagnostic text
must migrate to the variant form. - Widget-command wire format unified. Per-widget command variants
(PaneGridOp, etc.) are replaced by a singlewidget_command
envelope with typed payloads. Extension authors that hand-built
command messages must move to the#[derive(WidgetCommand)]path. WidgetExtensiontrait removed. Replaced byPlushieWidget,
WidgetRegistry, and factory-based dispatch. The term "extension"
is retired throughout the API in favour of "widget".[patch.crates-io]replaced by.cargo/config.tomlpath
overrides for theplushie-icedfork during development. Consumer
projects vendoring the fork need to update their override mechanism.
Deprecated
plushie-widget-sdk::JsonProps. The type alias remains available
for compatibility, but widget authors should use&Propsdirectly.
Added
plushieRust application SDK. Elm-styleApptrait with
init/update/view/subscriptions, direct and wire runners,
typed commands, subscription lifecycle diffing, effect dispatch,
and composite-widget support.plushie-widget-sdkfor custom widget authors.PlushieWidget
trait,WidgetRegistry,CanvasEngine,#[derive(PlushieWidget)],
#[derive(WidgetCommand)],#[derive(WidgetEvent)],
#[derive(WidgetProps)],widget!function-like macro,
BUILTIN_TYPE_NAMES, widget-scoped subscriptions, typed config
helpers, panic-isolated entry points, and test helpers.cargo-plushiebuild tool.build(including--wasmvia
wasm-pack),download(renderer binaries),run(with--watch
hot-reload via cargo-watch),new-widget,init,doctor, and
wasmsubcommands. Reads[package.metadata.plushie]and
[package.metadata.plushie.widget]for project and widget
configuration.- Dev-mode hot-reload.
dev::watch_rendererplus the--watch
orchestrator incargo-plushie run. The wire runner swaps the
renderer subprocess on rebuild without losing session state. A
RebuildingOverlayis injected into the view tree with interactive
dismiss, auto-dismiss, and event interception. plushie::cli::run::<A>()easy-path entrypoint with the
--plushie-*reserved flag prefix for framework-owned options.plushie::automationmodule.TestSession(direct) and
WidgetTestSession(widget-scoped) for integration-style testing,
.plushiescript format (header + instructions),Selectorwith
tree search, typed assertions (AssertModel,run_with_model_debug,
resolved_a11ysurfacing of inferred a11y).automation::cli
primitivesscript,replay, andinspect. TheBackendenum
(Mock,Headless,Windowed) routes scripts through the
appropriate runner, including a real renderer subprocess for
Windowedreplay.run_connect+ renderer-spawned-us mode. The SDK can attach to
a renderer launched externally via thePLUSHIE_SOCKETenv var,
using a newSocketAdapterand splitBridgetransport
(Subprocess+Socket).- Four-step renderer binary discovery.
cargo-plushiepath,
PLUSHIE_RENDERERenv, workspacetarget/probe, andPATH
lookup, with an advisory architecture check. - Multi-window lifecycle sync in the wire runtime, at parity with
the Elixir SDK. - Wire bridge auto-restart with heartbeat watchdog. Transient
renderer failures no longer terminate the app. - Protocol version handshake. The SDK validates the renderer's
hellomessage protocol version and honours the negotiated codec. - Typed
Diagnosticenum inplushie-corewith structured
variants. Widget SDK and renderer-lib emit typed diagnostics at all
former log-warn sites. RENDERER_VERSIONconst exported fromplushie-renderer-lib,
deduplicated withPROTOCOL_VERSION.- Typed
Errorenum on theplushiecrate and a wire-renderer
exit hook so app code sees a typed failure surface. plushie-core-macrosproc-macro crate.PlushieEnumderive
(used for FontWeight, FontStyle, FontStretch, and many other
enums), wire-encode/decode generation, and thewidget!
function-like macro for built-in widget descriptions.- Typed core domain types.
Color(hex parsing with short-form
expansion),Angle(dual-storage, degrees on the wire),Padding
(per-side and axis constructors),Length,Theme/CustomTheme
with shade overrides,A11ywith merge semantics,PathCommand,
PointerKind,MouseButton(with Back/Forward),ArrowMode,
SortOrder,ErrorCorrection,ValueRange(renamed fromRange),
EventType,OutgoingMessage, andScopedId. - Composable
TreeTransformwalker in core. Normalize, widget
expansion, and animation scan now share a single walk. - Generic
Animatable<T>types and type-safe animation on
widget-builder setters. Angle-bearing APIs and Image/SVG rotation
flow throughAnglewith animation support. - Widget-scoped subscriptions.
SubscribeCtx, dispatch helpers,
and native renderer wiring let widget authors manage their own
subscription lifecycles. - Accessibility inference. Widget-level
infer_a11ymerges with
explicit host-suppliedA11y. SDK builders set a11y defaults on
the tree so tests can assert. Scoped refs rewrite automatically,
implicit radio groups are populated, and pick_list gains an
infer_a11yfallback. Amissing_accessible_namediagnostic
flags unlabelled widgets.Command::focus_next_withinand
focus_previous_withinscope keyboard navigation. - Automation backend dispatch.
.plushiescripts with
backend: windowedspawn a realplushie-renderersubprocess so
the run can be watched. [profile.dist]for shipping artifacts and Sigstore signing of
release binaries.- CI matrix expanded to macOS (including darwin-x86_64) and
Windows, with nightlycargo auditandcargo denyworkflows. - Workspace-level
[workspace.dependencies]pins shared crates
in one place. - Comprehensive rustdoc pass with
#![deny(missing_docs)]on
plushie,plushie-core, andplushie-widget-sdk, plus
Panics/Errors sections and workspace clippy lints. - docs.rs metadata on every crate; README badges, versioning
policy, and a pull-request template.
Changed
plushie::rununified across direct and wire modes; same API, mode
selected by features and environment.EffectHandlerreturnsFutureinstead of an icedTask.- Codec state is per-App (
EventSink,WriterSink) rather than
global;Codec::get_global()and the last of the global singletons
are removed. TestSessionergonomics pass: richer event-bridge polish,
subscription grouping, assertion helpers, multi-finger touch,
multi-window coverage, async delivery contract forErr/Cancel/
panic, and end-to-endrun_wireintegration.parking_lot::Mutexon hot paths (direct-mode event queue,
renderer sink).- Nextest CI profile tuned;
just test-examplesruns inline tests in
simple examples, added to preflight. - Canvas shape hashing is direct instead of going through
Debug
strings; per-event allocations trimmed on hot paths;
scope-string buffer threaded through normalize with a fast path
when widget expansion is a no-op. memo()actually memoizes at normalize time.- Msgpack depth pre-check and invalid UTF-8 rejection share a single...
v0.6.1
[0.6.1] - 2026-04-02
Fixed
-
Semantic actions (click, toggle, select) now use the synthetic event
path in all modes (mock and headless). The iced event injection path
was unreliable for toggle and select in headless mode because cursor
positioning didn't reliably hit the target widget. -
Mock mode enabled in release builds (requires plushie-iced 0.8.3).
-
iced::time::Instantused for animation timestamps instead of
std::time::Instantto avoid type mismatch with crates.io builds. -
Cargo.lock pinned to resolve
gpu-allocatoragainstwindows0.62
to avoid version conflict withwgpu-halon Windows builds. -
Unused variable warning on Windows for Unix socket path.
-
CI: added release build check and Windows cross-compilation check.
Full Changelog: v0.6.0...v0.6.1
v0.6.0
[0.6.0] - 2026-04-02
Breaking changes
-
Unified pointer events. Canvas-specific (
canvas_press,
canvas_release,canvas_move,canvas_scroll) and mouse area
specific (mouse_right_press,mouse_middle_press,mouse_move,
mouse_scroll,mouse_enter,mouse_exit,mouse_double_click)
event families replaced with unified device-agnostic families:
press,release,move,scroll,enter,exit,
double_click. All carrypointertype,modifiersstate, and
optionalfingerID for touch. -
Canvas element events unified.
canvas_element_enter/leave/
focused/blurred/drag/drag_end/key_press/key_release
replaced with standard families (enter,exit,focused,
blurred,drag,drag_end,key_press,key_release) using
scoped IDs ("{canvas_id}/{element_id}"). -
mouse_areawidget renamed topointer_areaon the wire. -
Scrollable viewport event renamed from
scrolltoscrolled
on the wire.scrollis now the pointer wheel event. -
sensor_resizeevent renamed toresize. -
:start/:endalignment aliases removed. Use:left/:right/
:top/:bottom/:center. Unknown alignment values log a warning. -
Subscription wire types renamed.
on_mouse_move/button/
scrollandon_touchrenamed toon_pointer_move/button/
scroll/touch.
Added
-
Device awareness on pointer events. Every pointer event includes
pointerfield ("mouse","touch","pen"), keyboardmodifiers
state ({shift, ctrl, alt, logo, command}), andfingerID for
touch events. -
Canvas touch support. Canvas now handles
FingerPressed,
FingerMoved, andFingerLiftedevents with full hit testing, drag,
and click detection. Touch events are emitted withpointer: "touch"
and the finger ID. -
Modifier state tracking. Renderer tracks current keyboard
modifier state and includes it on all outgoing pointer events. -
Mock mode canvas element click.
click("#canvas-id/element-id")
works in mock mode by detecting scoped IDs, finding the canvas,
verifying the element exists, and emitting a click event. -
Renderer-side animation system. Transitions, springs, and
sequences with animatable props across display, layout, and input
widgets. -
Per-window scale_factor support.
-
Window-scoped subscriptions. Subscription events include
window_idfor multi-window disambiguation. -
Widget-targeted scroll commands for specific scrollable widgets.
-
Effect stubs for testing (register/unregister via wire protocol).
-
Canvas element key events.
key_press/key_releaseon focused
elements whenarrow_modeis"none". -
Canvas scoped IDs for all element events.
-
Radio group accessibility role for canvas elements.
Fixed
-
Mock mode modifier keys. Click/toggle actions in mock mode now
extract modifiers from the interact payload instead of hardcoding
empty modifiers. -
Mock mode sequential clicks. Replaced the fragile focus+space
approach with direct synthetic event emission. Sequential clicks on
different widgets now work reliably. -
Broken pipe handling. Ignore broken pipes during hello handshake.
Changed
- Upgraded to plushie-iced 0.8.1 (mouse_area cursor position callbacks).
- Renamed
plushie_idtowindow_idthroughout renderer codebase. - Generic renderer pipeline with null renderer for mock mode.
- Extracted shared startup sequence into startup module.
Full Changelog: v0.5.1...v0.6.0
v0.5.1
[0.5.1] - 2026-03-23
Fixed
- WASM release builds now disable
wasm-bindgenexternref, avoiding
browser startup failures such asRangeError: failed to grow table. - Inline fonts supplied in settings are now loaded into the font system
before the first render. This fixes missing default text rendering on
WASM when no system fonts are available.
Full Changelog: v0.5.0...v0.5.1
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
v0.4.1
[0.4.1] - 2026-03-22
Fixed
- Windows release build failure:
externblock updated tounsafe extern
as required by Rust 2024 edition.
Full Changelog: v0.4.0...v0.4.1
v0.4.0
[0.4.0] - 2026-03-21
Breaking changes
- Project renamed from toddy to plushie. All crate names, binary name,
module paths, and import paths have changed:toddy->plushie,
toddy-core->plushie-core,toddy_core->plushie_core. The
binary is nowplushie(wastoddy). The iced fork is now
plushie-iced(wastoddy-iced). - Crate split. The single
toddycrate is now three:
plushie-core(SDK library),plushie-renderer(shared renderer
logic, compilable to native and wasm32), andplushie(native binary).
A fourth crateplushie-wasmprovides the WASM entry point.
Extension authors now depend onplushie-coreinstead oftoddy-core. - Wire protocol field renames.
canvas_scrollposition fields
changed fromcursor_x/cursor_ytox/y.canvas_shape_drag
delta fields changed fromdx/dytodelta_x/delta_y. scroll_tofield change. The legacyoffsetkey is removed;
useoffset_yonly.- Scripting scroll event family renamed from
scrollto
wheel_scrolled(the old name collided with the scrollable widget
family). - Accessibility role name aliases removed. Concatenated forms like
columnheaderare gone; use underscore form only (column_header). - Color format restricted. Only hex notation (
#RRGGBB/
#RRGGBBAA) is accepted; other color notations are rejected. - Shaping prop renamed.
text_shapingis nowshaping. OutgoingEventconstructor signatures changed. Parameter types
standardized across the SDK; callers constructing events manually
will need updating.CoalesceHintadded toOutgoingEvent. The hardcoded coalescing
table is removed. Extensions and host code that relied on implicit
coalescing behavior must setCoalesceHintexplicitly.- Core is zero-I/O. Platform effects (file dialogs, clipboard,
notifications) moved out ofplushie-coreinto the binary crate.
Corenow returnsCoreEffectvariants instead of performing I/O.
Extension authors using core directly will see a different effect API. - IME event family names changed to avoid collisions with other
event families. - Key event shapes unified. Scripting and real key events now use
the same field layout.
Added
- Event throttling and coalescing system:
EventEmitterwith per-event
max_rateand session-widedefault_event_ratefor rate-limited
delivery.CoalesceHintonOutgoingEventreplaces hardcoded
coalescing tables so extensions get equal footing with built-in events. - Transport abstraction with
--execflag for SSH and remote rendering
scenarios. A background writer thread handles non-blocking I/O in
windowed mode. - Canvas interactive shapes: hit testing, hover/pressed styles, drag
events, tooltips, and semantic click/press/release events on
individual shapes. - Canvas shape groups for composing multi-shape elements into a single
interactive unit. - Canvas keyboard navigation: Tab/Shift-Tab between shapes, arrow keys,
Home/End, PgUp/PgDown, Enter/Space activation, Escape to exit. - Canvas shape accessibility via
A11yOverridewrappers, using the same
system as all other widgets. Focused event emitted on keyboard focus
transitions. - Canvas interactive field validation with warnings for unknown keys.
- Overlay
flipprop for auto-flipping when popup content overflows the
viewport edge. - Overlay
alignprop for cross-axis alignment (start, center, end). - Accessibility overrides:
disabled,position_in_set,size_of_set,
has_popupexposed to host SDKs. - Table semantic roles (Table, Row, Cell, ColumnHeader) for screen
reader navigation. - Widget
label,alt,description, anddecorativeprops passed
through to iced's accessibility layer. - Headless mode: announce events and
find_focusedquery responses. - Session lifecycle events (
session_error,session_closed) and
error response whenmax_sessionsis exceeded. - Duplicate node ID detection and error reporting on snapshot.
Debugimpls on all public SDK types.- Extension
InitCtxand enrichedRenderCtxwithwindow_idand
scale_factor. TreeNodeconvenience methods (prop_str,prop_f32,prop_bool,
etc.) andtestingmodule helpers for extension authors.- Property-based tests (proptest) for codec and prop helpers.
- Headless mode: custom font loading from Settings and
load_fontops.
Changed
CoalesceHintonOutgoingEventdrives coalescing decisions; the
hardcoded coalescing table in the emitter is removed.- Accessibility role names standardized to underscore form only
(concatenated aliases likecolumnheaderremoved). - Color values standardized to hex-only format (
#RRGGBB/
#RRGGBBAA); other notations are rejected. parse_shapingreads theshapingprop (wastext_shaping).- Core is zero-I/O: platform effects moved out of
plushie-coreinto the
binary crate. Core now returnsCoreEffectvariants instead of
performing I/O directly. - Shared message processing logic between daemon and headless modes
(extracted into reusable helpers). - Extension caches unified:
core.caches.extensionused everywhere
instead of separate per-mode storage. canvas_scrollposition fields renamed fromcursor_x/cursor_yto
x/y.canvas_shape_dragdelta fields usedelta_x/delta_y(not
dx/dy).- Scripting scroll uses
wheel_scrolledevent family (wasscroll,
which collided with the scrollable widget family). scroll_tousesoffset_yonly (removed legacyoffsetkey).- Workspace-level lints replace per-crate
#![deny(warnings)]. OutgoingEventconstructor parameter types standardized across the
SDK.- Scripting and real key event shapes unified.
- IME events use distinct family names to avoid collisions.
- Event field names aligned with protocol spec.
Fixed
- Overlay
operate()forwards to both anchor and content children,
fixing accessibility and focus traversal for overlaid widgets. - Subscription rate not cleared when re-subscribing with
max_rate
removed; coalesce key collision between similarly-named events. prop_f32/prop_f64reject NaN and Infinity from string parsing.- Input clamping across widget props (padding, color channels, range
bounds, spacing, opacity, etc.). - Content size limits: markdown capped at 1 MB, text_editor at 10 MB.
- Resource limits: images capped at 4096 handles / 1 GiB total, fonts
at 16 MiB per file / 256 runtime loads, font family name length
bounded, dash segment intern cache bounded. - Tree depth limit (256) on recursive functions (
find_window,
collect_window_ids). - Window size and position clamped to reasonable bounds.
- Animation epoch resets on
Resetmessage for clean hot-reload. - Bounded channels for multiplexed headless sessions, preventing
unbounded memory growth. - Session thread
catch_unwindwith error events; extension
catch_unwindonclone_for_sessionandhandle_event. - Validate schemas added for checkbox, toggler, and radio (
line_height,
wrapping,shaping) and pane_grid (split_axis). - Image
border_radiusvalidate type corrected (Number, was Any). f64-to-f32conversions clamped viaf64_to_f32helper to avoid
silent overflow.tree_hashreturns sentinel on serialization failure instead of
panicking.- Headless mode: canvas interact actions (
canvas_press,canvas_release,
canvas_move) now inject real iced mouse events, producing shape-level
events (enter/leave/click/drag) just like windowed mode. Previously
they were synthetic-only and could not trigger canvas shape interaction. - Headless mode: break event injection loop on EOF mid-interact; use
cancelledstatus for unavailable async effects; emit
theme_changedsubscription events. - Decode errors include debug context;
set_globalpanic documented. - Binary mode set on stdin/stdout for Windows compatibility.
list_imagesquery returns correct response kind.- Wayland: no-op warnings for unsupported window position ops;
fullscreen behavior documented. last_slide_valuescleared on snapshot to avoid stale slider state.ExtensionCacheslogs warning on type mismatch inget/get_mut
instead of silently returningNone.- Font log accuracy and panic logging improvements.
v0.3.1
[0.3.1] - 2026-03-19
Fixed
- Preserve iced widget defaults when props are unset. Padding,
spacing, text size, and other optional props now useOption
return types from parsers. When absent from the wire message,
the widget setter is skipped and iced uses its built-in default.
Affected widgets: button, container, window, column, row, grid,
keyed_column, text_input, pick_list, combo_box, table.
Full Changelog: v0.3.0...v0.3.1
v0.3.0
Initial release.
Full Changelog: https://github.com/toddy-ui/toddy/commits/v0.3.0