Fission 0.4.0
Fission 0.4.0 is the authoring API v2 release. The tag is the merge of PR #63, authoring-api-v2-final, and refactors the framework around concrete component-to-Widget conversion, scoped build handles, provider context, retained local widget state, and WidgetId identity.
This is a breaking authoring release. The commit range from v0.3.0 to v0.4.0 migrates the framework, widgets, shells, examples, tests, and documentation onto the new public authoring shape instead of keeping the old public node/widget-boundary model alive.
Source commit: 91cefd180896d64b388ca9b731be8d97ab3cfccb
Published crate metadata points at crates/authoring/fission in that commit.
Highlights
- Added the widget authoring API v2 RFC and refined the child identity model before landing the implementation.
- Replaced
NodeIdwithWidgetIdin the IR and migrated layout/render/runtime paths to the new identity type. - Added scoped build handles and provider state in
fission-core. - Added base scoped raw action primitives for host shells that need to tag mounted subtrees and inspect scoped raw dispatch.
- Introduced the closed
Widgetrepresentation used by authored components and framework widgets. - Updated core interaction internals, runtime state, reducer plumbing, and action binding around the new authoring model.
- Migrated core layout, control, media, text, overlay, navigation, async, form, picker, chart, and 3D widgets to
impl From<Component> for Widget. - Updated desktop, winit, mobile, web, static-site, server, and terminal shells for the new widget representation and identity model.
- Updated CLI command UI, test driver, layout tests, examples, crate READMEs, widget reference docs, Learn pages, cookbook pages, capability docs, chart docs, and release docs.
New Features
Authoring API v2
- Components are now written as ordinary Rust structs that convert into Fission widgets with
impl From<Component> for Widget. - The public authoring surface is centered on
Widget,Option<Widget>, andVec<Widget>child slots rather than exposing node-like internals as the normal application boundary. - Core framework widgets and
fission-widgetscomponents were migrated to the same conversion model, including display/data widgets, forms, pickers, overlays, navigation, async media, text, layout helpers, charts, and 3D surfaces. - The
fissionfacade exports were updated so application authors can use the new model through the facade/prelude. - Feature tests were added around the facade and macro exports so the new authoring APIs remain available from the expected public entry points.
Scoped Build Handles
- Added
fission::build::current::<State>(), exported by the facade, returning aBuildCtxHandle<State>andViewHandle<State>during component conversion. ViewHandleis the read side for state and view data used while building widgets.BuildCtxHandleis the wiring side for action binding, local reducer binding, and runtime-managed behavior.- Runtime state and reducer plumbing were refactored so component conversion can access scoped handles without threading build arguments through every reusable child component.
- Tests in
authoring_api_v2.rscover typed build handles working during build and generated global state views reading nested fields.
Providers And Scoped Context
- Added
Providerand build-scope provider state for typed parent-to-child context during widget conversion. - Added facade exports for
fission::build::{provide, read, try_read}. - Provider behavior is covered by tests that resolve the nearest scoped value without losing the parent scope and report a clear error when provider reads happen outside a provider scope.
- Documentation was updated to distinguish provider context from durable application state.
Local Widget State
- Added the
#[fission_component]macro for v2 authoring components. - Added
#[local_state(default = ...)]and#[local_state(default_with = ...)]support, generatingStateField<T>accessors for retained UI-local state. - Added local reducer authoring through scoped build context, allowing component-local retained state to update without being moved into global app state.
- Local state behavior is covered by tests for authoring shape, persistence across rebuilds, sibling isolation, reordered dynamic children, and pruning removed local state identity after rebuild.
Scoped Raw Action Primitives
- Added
ActionScopeIdas a stable raw dispatch scope identifier. - Added the
ActionScopewidget for annotating a subtree in the lowered semantics tree. - Added
ActionInput::ScopedRawso runtime and shell code can inspect the nearest action scope and target before recovering the original unscoped input. - Propagated action scope ids through input lowering and runtime dispatch paths.
Widget Identity And Runtime Model
- Replaced the old IR
NodeIdfile withWidgetIdand migrated runtime/lowering/layout tests to use widget identity. - Added explicit widget identity usage across examples and tests where retained state, animations, inputs, portals, overlays, or dynamic children require stable identity.
- Updated core interaction internals and lowering paths for the closed
Widgetrepresentation. - Added guard tests to prevent removed public authoring escape hatches from being reintroduced.
Shells, Rendering, And Tools
- Updated base shell abstractions and the desktop/winit shells for
WidgetIdand the closed widget API. - Updated mobile and web shells for the new authoring/runtime model.
- Updated static-site and server shells, including static-site document/build/browser-island paths and server render/artifact paths.
- Updated terminal shell rendering and verification.
- Updated the Fission command UI screens and components to the new widget API.
- Updated the Fission test driver and
fission-testregression suites around layout, interaction, media, scrolling, text input, flyout behavior, and UI regressions.
Examples
- Migrated the counter example to the new
#[fission_component], local state,build::current, and local reducer pattern. - Migrated animation gallery, chart gallery, editor, embed examples, field inspector, icon gallery, inbox, mobile smoke, product browser, Pokemon card store, terminal, text lab, todo design system, web smoke, and widget gallery examples.
- Updated example tests where they depend on widget identity, action binding, text/input behavior, browser bridge behavior, visual audit paths, or retained state.
Documentation Site And Reference Material
- Added
docs/rfc-widget-authoring-api-v2.md. - Added the 0.4.0 authoring API release blog post and backfilled release posts for 0.1.0, 0.2.0, and 0.3.0.
- Added the state handles and providers guide.
- Updated Learn/runtime-model pages, app-structure guidance, layout/widget guides, resources/async docs, platform shell/testing docs, theming/i18n docs, and cookbook entries.
- Updated capability documentation and capability reference pages for the new widget API.
- Updated widget reference pages across the catalog and replaced stale node/custom-node references with the new custom-widget authoring direction.
- Updated chart reference documentation and chart gallery material.
- Improved documentation information architecture, nested static-site navigation menus, responsive documentation pages, and blog navigation.
Bug Fixes
- Fixed action binding examples in the widget authoring API v2 RFC.
- Clarified widget child identity rules before landing the
WidgetIdmigration. - Simplified the minimal widget API example to match the final authoring model.
- Updated stale docs/examples that still referenced old public node/widget-boundary forms.
- Culled off-bounds Vello text glyphs.
- Improved static-site blog navigation after the release-post backfill.
- Refreshed documentation IA and responsive site pages after the authoring API migration.
Testing And Validation Added In The Tag
- Added
crates/core/fission-core/tests/authoring_api_v2.rscovering typed build handles, provider scope resolution, provider errors outside scope, generated global state views, local state authoring shape, retained local state persistence, sibling isolation, reordered dynamic children, local state pruning, and public API escape-hatch prevention. - Updated
fission-widgetstest suites for display widgets, forms, pickers, overlays, async widgets, markdown, routing, theming, and widget invariants. - Updated core runtime/layout/input/text/media tests for
WidgetId, handles, and the closed widget API. - Updated shell composition tests, terminal shell tests, test-driver tests, example tests, and widget-gallery visual audit tests.
API Changes And Migration Notes
- Replace old public node/widget-boundary authoring with
impl From<Component> for Widget. - Use
let (ctx, view) = fission::build::current::<State>();inside conversion instead of passing build context through every component signature. - Use
Widget,Option<Widget>, andVec<Widget>for child slots, with.into()at composition boundaries. - Use
Providerplusfission::build::read::<T>()for scoped parent-to-child context, not durable product state. - Use
#[fission_component]and#[local_state(...)]for retained UI-local component state. - Use scoped local reducer binding for local retained state updates.
- Use explicit
WidgetIdvalues for dynamic retained children that can be reordered, filtered, or recreated. - Use
ActionScopeonly when shell/runtime code needs a low-level raw dispatch boundary for a mounted subtree; normal application actions should remain typed reducer actions. - Remove application code that depends on old public
NodeId/node-like authoring paths.
Published Crate Set
The tag updates the workspace crate manifests under crates/ to 0.4.0, including the fission facade, authoring/widget crates, macro crate, core/runtime/IR/layout/theme/semantics/i18n/text-engine crates, rendering crates, shell crates, command/tooling crates, chart and 3D crates, credentials, design-system codegen, and test crates.
Contributors
- zcourts
- Courtney Robinson
Verification
v0.3.0^{}resolves tod0183e2fa02e09cb383f423debadfb49e63cd235.v0.4.0^{}resolves to91cefd180896d64b388ca9b731be8d97ab3cfccb.- The tag range contains 67 commits total, including 66 non-merge commits and the PR #63 merge commit.
- The tag diff from
v0.3.0tov0.4.0changes 1162 files, with 43,270 insertions and 16,280 deletions. - Published crate VCS metadata confirms
fission0.4.0 was built from91cefd180896d64b388ca9b731be8d97ab3cfccbatcrates/authoring/fission.
Release blog: https://fission.rs/blog/2026-06-02-fission-0-4-0-authoring-api/
Full changelog: v0.3.0...v0.4.0