Browse docs
Browse docs
Released 2026-05-14 · Public-API freeze
This is the release that makes the road to 1.0.0 possible: the
DashFormBridge contract is frozen into a clear required core and a
small optional runtime tier, the four long-deprecated "version string"
fields are removed, and implementation-detail exports are flagged
@internal.
All seven packages bumped to 0.2.0-beta (lockstep). The substantive
changes are concentrated in three:
| Package | What changed |
|---|---|
@dashforge/ui-core | DashFormBridge interface freeze. @internal markers on DependencyTracker / RuleEvaluator / store helpers / createMockRHFResult. |
@dashforge/forms | DashFormProvider stops emitting the 4 deprecated version strings (~30 lines of dead code removed). @internal markers on FormEngineAdapter / createRuntimeStore / createReactionRegistry. |
@dashforge/ui | All 10 form components simplified from bridge?.method?.() to bridge?.method(). Test fixtures updated to the new contract. |
@dashforge/tokens, @dashforge/theme-core, @dashforge/theme-mui,
@dashforge/rbac — version bump only (no source change).
The four @deprecated "version string" properties are gone from
DashFormBridge:
errorVersion — replace with subscribeField(name, listener) + getError(name)touchedVersion — replace with subscribeField + isTouched(name)dirtyVersion — replace with subscribeField + isDirty(name)valuesVersion — replace with subscribeField + getValue(name)These were deprecated back in 0.1.6-alpha
when the per-field subscription system replaced the version-string
"subscribe by reading a value during render" trick.
The bridge surface is now split into two explicit tiers:
Required core (always present when the bridge is non-null): engine,
register, unregister, getValue, setValue, getError, isTouched,
isDirty, submitCount, subscribeField.
Optional runtime tier (feature-gated by the implementation):
getFieldRuntime, setFieldRuntime, subscribeFieldRuntime, debug.
Because the core methods are no longer optional, the defensive
bridge?.method?.() double optional chain in the UI components collapses
to a single bridge?.method() — bridge itself can still be null in
standalone (no-provider) mode, but once it exists, the methods are
guaranteed.
MIGRATION.md at the repo root — the first dedicated migration
guide, with a contract diff table, pattern migrations, and an explicit
"what did NOT change" list.@internal JSDoc markers on implementation-detail exports in
@dashforge/forms and @dashforge/ui-core. The symbols are still
exported for backwards compatibility, but tooling that respects
@internal will hide them, and they may move out of the entry point in
a future release.MIGRATION.md, and the
roadmap.| You are… | Action required |
|---|---|
Using @dashforge/ui components inside a DashFormProvider | None. Component public APIs are unchanged. |
Implementing a custom DashFormBridge | Implement the now-required core methods; drop the deprecated version fields. See MIGRATION.md. |
| Maintaining a mocked bridge in tests | Update the mock to the new contract — @dashforge/ui ships an updated createMockBridge as a reference. |
Unchanged from 0.1.9-alpha, proving the contract tightening did not
regress behavior:
@dashforge/forms — 133 / 133 passing@dashforge/ui — 484 / 485 passing (1 skipped)@dashforge/rbac — 264 / 264 passingFull recipe in
MIGRATION.md → 0.1.9-alpha → 0.2.0-beta.