Browse docs
Browse docs
Released 2026-09-28
The first major. On the MUI side the headline is that multi-select works: the type surface had been widened in an earlier release, but the runtime behind it was never there.
Eleven packages, one version. There is no partial upgrade.
| Package | Change |
|---|---|
@dashforge/ui | 1.3.0 → 2.0.0 |
@dashforge/theme-mui · @dashforge/theme-core · @dashforge/tokens | → 2.0.0 |
@dashforge/tw · @dashforge/tw-theme · @dashforge/tw-tokens | → 2.0.0 |
@dashforge/forms · @dashforge/rbac · @dashforge/ui-core · @dashforge/calendar-core | → 2.0.0 |
There is one, and it is only at the type level. Nothing changes at runtime.
<Autocomplete> and <Select> widened value and onChange to describe
both the single and the multiple mode with one signature, so a
single-select handler no longer type-checks:
Type 'Dispatch<SetStateAction<string | null>>' is not assignable to
type '(value: string | string[] | null) => void'Without multiple, the value handed back is never an array. The type
cannot say so, because AutocompleteProps inherits multiple from MUI
rather than declaring it, which leaves nothing with a literal type to
discriminate on.
Either widening your state or narrowing at the boundary keeps compiling:
// widen the state
const [value, setValue] = useState<string | string[] | null>(null);
// or narrow at the boundary
<Autocomplete onChange={(v) => setValue(v as string | null)} />This is a regression in ergonomics and it is being undone in #142, a types-only change. Both forms above survive it. The Tailwind side solved the same problem with a union of handler types, which stays assignable from a narrow handler.
<Autocomplete multiple> and <Select multiple> now carry a parallel
pipeline for the array case rather than bending the single-value one.
One trap is worth recording for anyone touching that code: destructuring
multiple removed it from ...rest, so it stopped reaching MUI and the
component stayed silently in single mode. Five tests fail on exactly
that, which is why they exist.
<CheckboxGroup>For the case where the options are few enough that a dropdown is the
wrong shape. It is <RadioGroup> with array storage, deliberately: same
bridge wiring, same RBAC model, same visibility and unregister semantics.
Two behaviours a consumer cannot guess: the field stores [] rather than
null when nothing is checked, and an option gated to hide stays
visible while it is checked, disabled instead. Hiding it would strand
a value in the payload the user can neither see nor clear.
See CheckboxGroup.
<CheckboxGroup> dropped a stored value that had no matching
option, caught before it shipped. The check path rebuilt the array
from options while the uncheck path preserved it, so a form loading a
value the option list no longer contained lost it on the first
interaction.<SnackbarProvider>'s auto-dismiss timer captured close with an
empty dependency array. Not a present defect, since close is
stable, but it would have gone silently stale the day close gained a
dependency, acting on the queue of the render that created it.jsx-a11y warnings on <Autocomplete> were false and now say so
in place, confirmed against the DOM rather than against MUI's
documentation.tsBuildInfoFile sat outside
dist, so deleting dist left a valid incremental cache describing
declarations that no longer existed: tsc --build emitted nothing and
dependents failed with TS6305.Upgrade every @dashforge/* package in one step.
pnpm add @dashforge/ui@2 @dashforge/theme-mui@2 @dashforge/theme-core@2 \
@dashforge/tokens@2 @dashforge/forms@2 @dashforge/ui-core@2 \
@dashforge/rbac@2 @dashforge/calendar-core@2If your lockfile resists, delete node_modules and the @dashforge/*
entries from it, then install again.
Then work through the
migration guide,
which is organised by who is affected rather than by package. On this
side, only code that passes a narrow handler to <Autocomplete> or
<Select> needs a change.
| Peer | Required range |
|---|---|
react | ^18.0.0 || ^19.0.0 |
react-dom | ^18.0.0 || ^19.0.0 |
@mui/material | ^9.0.0 |
@emotion/react · @emotion/styled | ^11.0.0 |
@dashforge/forms · @dashforge/rbac | 2.0.0 exactly |
No new runtime dependencies.