FormEngine 12.0.0
November 11, 2026
Overview
FormEngine 12.0.0 requires React 18 or 19. React 17 is out of the peer range. Core and Designer now peer on MobX 7 and mobx-react 10.
Material UI components peer on MUI 9 and MUI X Date Pickers 9; several designer layout props moved into sx or were renamed.
@react-form-builder/components-rsuite adds Accordion and
Accordion panel.
Sortable list is a separate package for repeating rows that users can reorder.
See the usage guide.
Fixed overlays stay inside the designer canvas. Print preview no longer shows RSuite toasts and other body portals. Unsaved action-editor
drafts survive parameter edits. Material UI errors show on the first Validate. Uploader success no longer always fires onError.
Parent and modal forms share one userContext object by reference. Nested fields are not deep-observed. Sharing mutations across parent and modal forms.
Why update
- Drop React 17. Peers are React and React DOM
^18 || ^19. - Install MobX 7 / mobx-react 10 with Core and Designer.
- Move to Material UI 9 / MUI X Date Pickers 9 and apply the Material UI prop migrations below.
- Use Accordion and Sortable list.
- Mutate userContext in a modal and see it on the parent and host object.
- Pick up the designer, Uploader, and security fixes below.
Key features
- React peers are
^18 || ^19. - MobX peers are mobx
^7.1.0and mobx-react^10.0.2. - Material UI peers are
@mui/material^9.5.0and@mui/x-date-pickers^9.16.0. Material UI components. - Accordion and Accordion panel.
- Sortable list lets users reorder rows by dragging. See the usage guide.
- Uploader paste (default
false) and fixed success /onErrorhandling. - ComponentData.setUserDefinedProp.
Changelog
Breaking changes
- Removed React 17 from peer ranges. Supported peers are React and React DOM
^18 || ^19. Upgrade off React 17 before installing FormEngine 12. - Raised MobX peers to
mobx^7.1.0andmobx-react^10.0.2(mobx-react-lite5 comes in transitively). If you still callobservable.reforobservable.deep, switch to the MobX 7 named annotation exports. See Migrating from MobX 6 to MobX 7. - Upgraded
@react-form-builder/components-material-uipeers to@mui/material^9.5.0and@mui/x-date-pickers^9.16.0. Designer props that used removed MUI system props changed as follows:- MuiBox: dropped
maxWidth. Put layout limits in sx. - MuiStack: dropped
justifyContent,alignItems, andflexWrap. Move them intosx. - MuiTypography:
textAlignis now the native Typographyalignprop. - MuiDialog: dropped
disableEscapeKeyDown. Escape always closes the dialog; ignoreescapeKeyDowninonClosewhen Escape must not close it. - MuiDatePicker: uses MUI X Date Pickers v9 types. FormEngine
value/onChangestayDate | null.
- MuiBox: dropped
- Removed the exported
EditableTableStatetype from@react-form-builder/designerand its generated API docs. Delete imports of that type. - Upgraded
@react-form-builder/components-uploadertoreact-dropzone^20.2.0:- Successful uploads call
onChangeonly. Before this release, afilePath/urlmismatch marked every success as a failure and also firedonError. Change form actions that depended on that always-onErrorpath. - Non-OK HTTP responses are failures even when the JSON body looks successful.
- Upstream
maxFileskeeps files up to the limit instead of rejecting the whole batch. react-dropzone20 setsengines.node: >= 22. Node 20 installs may warn about engines.
- Successful uploads call
Update instructions
Update all FormEngine packages to version 12.0.0.
Use React 18 or 19. Remove React 17 from resolutions or nested installs.
Install matching MobX peers:
npm install mobx@^7.1.0 mobx-react@^10.0.2
If application code still uses observable.ref or observable.deep, switch to the MobX 7 named annotations in
Migrating from MobX 6 to MobX 7.
Install the Material UI v9 peers:
npm install @mui/material@^9.5.0 @mui/x-date-pickers@^9.16.0 @emotion/react @emotion/styled dayjs
Then update saved form JSON and custom wrappers:
- On
MuiBox, removemaxWidthand put it insx(for examplemaxWidth: theme.breakpoints.values.md). - On
MuiStack, removejustifyContent,alignItems, andflexWrapfrom the designer props and put them insx. - On
MuiTypography, renametextAligntoalign. - On
MuiDialog, removedisableEscapeKeyDown. InonClose, ignorereason === 'escapeKeyDown'when Escape must not close the dialog. - Keep DatePicker
value/onChangeasDate | null. Upgrade any direct MUI X Date Pickers usage for v9 on its own.
If you still want those old layout fields as first-class designer props, expose them through custom component annotations. The built-in components no longer ship them.
After upgrading @react-form-builder/components-uploader, check actions that listened for onError on every upload. Success now goes through
onChange only. Set paste to true only when
paste-to-upload should work (default is false). readOnly blocks dropzone interaction the same way as disabled.
Install and register @react-form-builder/components-sortable-list using the
package documentation. For form setup steps, see the
usage guide.
Accordion is in @react-form-builder/components-rsuite. Register the RSuite view as usual. Dropping a non-panel child into Accordion wraps
it in an Accordion panel.
Delete any EditableTableState imports from @react-form-builder/designer.
userContext is stored with observableRef, so parent,
modal, and host share one object. FormEngine does not deep-observe nested fields. Pass a host-owned observable(...) if you need nested
MobX reactions. Replace the prop and rerender to swap the whole environment.
When you need reactivity.
If you build this repository, use Node.js 26.13.0 and npm 11.21.2 from .nvmrc. The monorepo is on Vite 8.x, ESLint 10.x
(flat config), and Lerna 10.x. Published packages do not require Node 26; Uploader's react-dropzone 20 expects Node 22+.
Features
- Added Accordion and
Accordion panel to
@react-form-builder/components-rsuite. Accordion can keep one panel open or let panels expand independently. Dropping a non-panel component into Accordion creates a panel wrapper. See RsAccordionProps. - Added Sortable list as
@react-form-builder/components-sortable-list. It reuses Repeater row templates,value,addRow, andremoveRow, and adds drag and keyboard reorder handles. See the usage guide. - Added paste on Uploader (default
false). - Added ComponentData.setUserDefinedProp. RSuite Menu, Tab,
and the built-in
openModalaction update one override at a time through this method. ActionEventArgs.setUserDefinedProps still replaces the whole bag. - Added searchable on RsDropdown and searchable on RsTagPicker.
Enhancements
- Keep author CSS such as
position: fixedinside the designer form viewer so full-viewport overlays no longer cover designer chrome. - Canvas drag-and-drop auto-scroll follows the designer canvas more reliably while dragging.
- useDisposable publishes disposable resources through React's
useSyncExternalStore, including Strict Mode create/dispose order. - Shared Vite React tooling uses
@vitejs/plugin-react(Oxc Fast Refresh) in the monorepo and examples. - React 19 hosts in the monorepo declare
react/react-dom^19.3.1. React 18 peers stay supported. - Designer Font Awesome free SVG icon packages are on 7.3.1 with barrel icon imports.
- Vitest / jsdom runs and component-test overhead are lower in the repository test workspaces.
Bug fixes
- Hide RSuite body-level portals (toasts, modal/drawer chrome, tooltips, popovers, picker menus) under
@media printso they stay out of designer print preview. - The component toolbar portaled to
document.bodyuses designer typography again. - Keep unsaved action-editor code when changing action parameters. Explicit source loads still replace the editor body.
- HTML attribute table edits apply only on Apply. Row deletion passes a new array to
onChange, so pending drafts no longer leave deleted rows visible. - Material UI validation errors show on the first manual Validate in Designer Preview, including MuiDatePicker and controls without native helper text.
- The Required checkbox in the property panel follows the selected component after switching from a required field to an optional one.
- Keep component selection when creating presets.
- Uploader treats a missing
urlas failure, treats non-OK HTTP status as failure, and treatsreadOnlylikedisabledfor interaction. - Parent, modal, and host share one userContext reference. Nested fields are not deep-observed. Sharing mutations across parent and modal forms.
Resources
- Accordion and Accordion panel.
- Sortable list package documentation and usage guide.
- Material UI package docs and MuiDatePicker.
- ComponentData.setUserDefinedProp.
- UploaderProps.paste.
- useDisposable.
- Store custom data in forms: userContext, parent/modal sharing, reactivity.
- Designer FAQ: userContext.
Security
- Bumped
joifrom17.13.8to17.13.9(GHSA-4528-x5fx-h6hg). - Bumped
follow-redirectsfrom1.16.0to1.16.2(GHSA-mrwp-f3q8-3g9p). - Bumped
follow-redirectsto1.16.2in examples. - Bumped
lodash-esfrom4.17.23to4.18.1. - Bumped
qsfrom6.16.0to6.16.2. - Bumped
qsandexpressin examples. - Bumped
dompurifyfrom3.4.16to3.4.17in examples. - Bumped
handlebarsfrom4.7.9to4.7.10. - Bumped
ip-addressfrom10.7.2to10.7.4. - Bumped
katexfrom0.16.47to0.18.10. - Bumped
shell-quotefrom1.10.0to1.12.0. - Bumped
body-parserfrom1.20.8to1.20.9. - Bumped
fast-urifrom3.1.7/3.1.8to3.1.9. - Bumped
postcss-selector-parserfrom6.1.4to6.1.5. - Bumped
markdown-itfrom14.2.0to14.3.3in examples.
Chore
- Bumped monorepo Node.js pin from
24.18.0to26.13.0and npm to11.21.2. - Bumped
vitefrom7.xto^8.3.6and switched examples to@vitejs/plugin-react^6.2.1. - Bumped
eslintto10.14.0with flat config; migrated toeslint-plugin-import-xand@eslint-react/eslint-plugin. - Bumped
lernafrom9.xto^10.1.1. - Bumped designer
i18nextto^26.7.1,react-i18nextto^17.1.12, and related i18n packages. - Bumped
react-dropzonefrom^14.3.8to^20.2.0in@react-form-builder/components-uploader. - Bumped
rimraffrom5.0.0to6.1.3. - Bumped
dotenv-clito11.1.0. - Bumped
@testing-library/jest-domto7.0.1. - Bumped
eslint-plugin-jsdocto65.4.2/65.4.3. - Bumped Vitest test stack to
5.0.5andjsdomin the test workspaces. - Moved declaration emit to unplugin DTS in package builds.