Releases

Alle veröffentlichten Flow-Releases mit ihren Highlights, Migrationshinweisen und den enthaltenen Fixes. Wie du ein Update einspielst, beschreibt Upgrades‍.Neue Releases kannst du über den Atom-Feed von GitHub‍ abonnieren. Anders als diese Seite zeigt er auch Vorab-Versionen und beschränkt sich auf die zehn aktuellsten Releases.

1.5.0 – Loading states from the real UI, grouped accordions, and Flow for VueMinor

13 October 2026 - npm‍ - GitHub Release‍

Highlights

  • SkeletonMode turns the real UI into its own loading skeleton, so a loading view no longer needs a second, hand-built tree.
  • AccordionGroup stacks accordions as one compact block with separators. Collapsed accordion content is now found by find-in-page.
  • Extensions can be written in Vue: @mittwald/flow-remote-vue-components ships as beta.
  • NumberField shows custom units that Intl.NumberFormat does not know, like MiB or GiB.
  • CodeEditor supports isDisabled.

Deprecations

  • Accordion's variant prop is deprecated. variant="outline" no longer draws a frame, so the prop has no effect and warns when passed. Remove it with npx @mittwald/flow-codemods@latest accordion-variant-deprecated src. Where several outlined accordions stood below each other, wrap them in an AccordionGroup. Where a single one has to stand apart, place it in a LayoutCard. See MIGRATION.md‍.

SkeletonMode (beta)

Wrap a view in <SkeletonMode isEnabled={isLoading}> and its real components render as skeleton while it loads. Everything inside is inert, and screen readers hear "Loading content" once. A nested isEnabled={false} shows the parts that are already loaded. Works in extensions as well. (#3317, #3320, #3321, #3322, #3324)

While loading

Text becomes one bar per line, in the width the text will take.

The project view rendered by SkeletonMode while loading The project view rendered by SkeletonMode while loading

When loaded

The same project view, loaded The same project view, loaded

Avatars, icons, images, badges, buttons and form fields keep their real size as surfaces. Navigation, alerts, charts, editors and overlays follow the same rules.

AccordionGroup and accordion headers

AccordionGroup (beta)

AccordionGroup renders its accordions as one block with separators, so the surrounding gap only applies around the group. Set allowsMultipleExpanded={false} to keep one accordion open at a time. expandedKeys, defaultExpandedKeys and onExpandedChange control it by the accordions' ids. (#3409)

An AccordionGroup with three accordions and separators An AccordionGroup with three accordions and separators

Text headers

A Text header renders a plain toggle with a smaller chevron. A Heading header now renders an h3 by default and stays in the page outline.

An Accordion with a Text header An Accordion with a Text header

Badges in the header

Badges now sit inside the header instead of breaking out of the toggle.

An Accordion header with a Badge and an AlertBadge An Accordion header with a Badge and an AlertBadge

Find-in-page

Collapsed content is now searchable: the browser's find-in-page expands the accordion that holds a match.

Flow for Vue (beta)

@mittwald/flow-remote-vue-components lets you write an mStudio extension in Vue and still render real Flow components in mStudio. It is the Vue counterpart of @mittwald/flow-remote-react-components, including overlays and the List. The package is beta: build against it, but its API is exempt from Flow's breaking-change promise until the beta ends. See Installation‍. (#3179)

Props keep their Flow names and types. Events become Vue listeners, children become slots, and controllable props work with v-model:

Custom units in NumberField

The new unit prop shows units Intl.NumberFormat does not know, like MiB or GiB, right behind the number, exactly where formatOptions units appear. The label stays the plain field name, and the value stays a plain number. Screen readers get the unit as part of the field's name. (#3367)

A NumberField showing 512 MiB A NumberField showing 512 MiB

Disabled CodeEditor

CodeEditor supports isDisabled. A disabled editor cannot be edited or focused, disables its copy button and drops syntax highlighting, so the code does not look editable. Use isReadOnly when the code must stay readable. Inside a react-hook-form Field, isDisabled now reaches the CodeEditor as well. (#3369, #3457)

A disabled CodeEditor A disabled CodeEditor

Keyboard shortcuts in Combine

Combine now spaces Kbd next to Kbd and Kbd next to Text, so a shortcut legend like "↑ ↓ Select" needs no wrapper of its own. (#3381)

Combine with two Kbd and a Text Combine with two Kbd and a Text

Smaller additions

  • CartesianChart.YAxis takes width (a number or "auto"). A category axis sizes itself to its longest label by default, so long names in a vertical bar chart no longer wrap. Number axes keep their 60px. (#3344)
  • FormRootError accepts children that replace the default alert. As a function, they receive the root error and can pick the content by its type. (#3302)
  • Flex gets paddingBlock and paddingInline. (#3329)

Fixes

  • 1.5.34 – Badge: render spans so a badge can sit in running text (#07741d7‍)
  • 1.5.34 – Modal: poll assertions that wait for a modal to open or close (#2dbaa06‍)
  • 1.5.34 – update visual regression screenshots (#de6b78a‍)
  • 1.5.34 – keep the screenshot workflows on ubuntu-latest (#cc0413e‍)
  • 1.5.34 – pin the test jobs to ubuntu-24.04 (#a066512‍)
  • 1.5.34 – run screenshot workflows on ubuntu-26.04 (#6a0c3c8‍)
  • 1.5.33 – List: focus the search once enabled and skip the empty filter modal (#7a7bfe6‍)
  • 1.5.33 – require (#caf4627‍)
  • 1.5.33 – run changed visual tests through the in-process cross-version harness on PRs (#1618a5a‍)
  • 1.5.32 – remote-dom-demo: one demo page per component group (#9a7cf9e‍)
  • 1.5.31 – Icon: keep the vertical alignment of FontAwesome icons in the layered stylesheet (#fd496fb‍)
  • 1.5.30 – ListSummary: keep the root classes when a className is passed (#a6764d9‍)
  • 1.5.29 – add a Wrap page and fill the story gaps from #3429‍ (#e69dd04‍)
  • 1.5.28 – Table: keep empty column headers in the grid (#385d863‍)
  • 1.5.28 – Tabs: gate the AccordionGroup scenario at 1.5.0 (#2cf2bfc‍)
  • 1.5.28 – update visual regression screenshots (#1071cb2‍)
  • 1.5.27 – agents: split narrow sections out of the package agent guides (#09d5d84‍)
  • 1.5.26 – TranslationProvider: compile each localized message once (#7e0fb85‍)
  • 1.5.25 – DeprecationWarningProvider: deduplicate warnings across instances (#9e3bad8‍)
  • 1.5.24 – CodeEditor: stop reconfiguring the editor and leaking styles on every render (#288f4a1‍)
  • 1.5.23 – Markdown: keep rendered elements across re-renders (#3808e79‍)
  • 1.5.22 – agents: move package-specific footguns out of the root AGENTS.md (#3f1e815‍)
  • 1.5.21 – Activity: use React's Activity on every React that ships it (#be33a2c‍)
  • 1.5.20 – Tabs: stop the active panel from clipping its content (#a8db4f7‍)
  • 1.5.20 – update visual regression screenshots (#e808824‍)
  • 1.5.19 – foundations: merge Error Handling into Fehlermeldungen (#e97d3b2‍)
  • 1.5.19 – sprach-guide: reduce glossary to product terms and align guidelines (#a2460d0‍)
  • 1.5.18 – remote-react-components: wait for the code highlighting before capturing (#e759758‍)
  • 1.5.18 – deps-dev: bump the dev-patch group across 1 directory with 6 updates (#fb55360‍)
  • 1.5.17 – Slider: show the initial marker for a defaultValue of 0 (#697c64c‍)
  • 1.5.17 – drop the stretch prop from LiveCodeEditor usages (#9ccc9a0‍)
  • 1.5.17 – render the Styleguide with the FontAwesome Pro icons (#926080b‍)
  • 1.5.17 – components: follow the className, JSX and JSDoc conventions (#68d5b49‍)
  • 1.5.17 – remote-react-components: gate 1.5.0 scenarios for cross-version runs and fix the List select-all race (#a159fb3‍)
  • 1.5.16 – MenuItem: expose muted items as aria-disabled (#3ecf5f0‍)
  • 1.5.16 – MenuItem: mute mouse releases and stop muted events (#d220005‍)
  • 1.5.16 – note that muted menu items are aria-disabled too (#9fab518‍)
  • 1.5.16 – MenuItem: drop the unused ariaDisabled selector (#50797c3‍)
  • 1.5.15 – Markdown: open only external links in a new tab (#1c72558‍)
  • 1.5.14 – CountryOptions: recompute the options when filterBy or sortBy change (#8a93db7‍)
  • 1.5.13 – Icon: keep the token size of FontAwesome icons in the layered stylesheet (#60cb019‍)
  • 1.5.12 – agents: say which regression tests a bug fix leaves out (#fb31f91‍)
  • 1.5.11 – CartesianChart: fit a category y-axis to its longest label (#804b5b7‍)
  • 1.5.10 – components: label a remote list by its section heading (#5035577‍)
  • 1.5.9 – components: call the consumer's onOpenChange on ComboBox, DatePicker and DateRangePicker (#4da0c23‍)
  • 1.5.8 – CartesianChart: keep rendering a non-element emptyView (#49ac4f4‍)
  • 1.5.7 – components: apply the reduced-motion reset to ::before and ::after (#f439552‍)
  • 1.5.6 – Section: call useId before the early returns (#e7d81e0‍)
  • 1.5.5 – components: keep the consumer className on TimeField, SkeletonText and ContextMenu (#3fee1b4‍)
  • 1.5.5 – Markdown: continue ordered list numbering across split lists (#97737bc‍)
  • 1.5.4 – components: add missing accessible names in Tabs, List filters and AvatarStack (#e92fdd7‍)
  • 1.5.4 – remote-react-components: regenerate firefox-darwin baselines (#3ef6bd6‍)
  • 1.5.3 – use grain on template backgrounds instead of documenting it (#f4cb420‍)
  • 1.5.3 – design-tokens: add grain texture token (#2492fa6‍)
  • 1.5.2 – releases: re-capture the 1.1.0–1.4.0 figures, one English example each (#19aec5e‍)
  • 1.5.2 – core: let Playwright's Firefox launch on macOS 27 (#afceedf‍)
  • 1.5.2 – release-figure: one example per figure, English content via replace (#7145e97‍)
  • 1.5.1 – agents: scope the breaking-change rule to stable components (#d967f9f‍)

1.4.0 – Select all in menus and filters, file uploads in the MarkdownEditorMinor

30 September 2026 - npm‍ - GitHub Release‍

Highlights

  • ContextMenu gets showSelectAll for multiple selection, and List filters offer "Select all" from six values on (#3274).
  • MarkdownEditor takes files by drop, paste or a toolbar button and inserts them as markdown at the cursor (#3265).
  • Image has rounded corners by default; withBorder only draws the border now, in a quieter color (#3266).
  • CopyButton gets onCopy, called with the copied text once it is in the clipboard (#3282).
  • An Action with a bare closeOverlay closes the overlay it sits in, whatever component that is (#3191).
  • The upgrade and list commands of @mittwald/flow-codemods report peer ranges the Flow packages ask for (#3204).

Select all in ContextMenu and List filters

Picking all but one value of a long filter used to mean clicking almost every option. With showSelectAll, a ContextMenu in selectionMode="multiple" starts with a "Select all" entry. It selects every enabled item, reads "Deselect all" once everything is selected, and shows as indeterminate for a partial selection. Each click fires onSelectionChange once with the full set.

List filters in some mode turn it on from six values on, both in the filter menu and in the all-filters modal. MenuItem gets an isIndeterminate prop for the same state. An older host ignores showSelectAll and shows no entry.

File uploads in the MarkdownEditor

Pass uploadFile and the MarkdownEditor accepts files dropped onto it, pasted into it, or picked with the new attachment button in the toolbar. A placeholder goes to the cursor right away. When your promise resolves, it becomes an image embed or a link; when it rejects, the placeholder disappears. The upload itself stays with you — endpoint, auth and error handling — while Flow handles the interaction and the screen-reader announcements. It works in mStudio extensions too.

The attachment button

The paperclip at the end of the toolbar opens the file picker.

A MarkdownEditor with the attachment button at the end of its toolbar A MarkdownEditor with the attachment button at the end of its toolbar

Image corners and borders

withBorder now only draws the border. The new withRoundedCorners prop (default true) controls the corner radius on its own, so every Image is rounded unless it opts out. The border uses the same color as Separator and no longer stands out in dark mode.

Rounded by default

An Image without any props now has rounded corners.

An image with rounded corners and no border An image with rounded corners and no border

With a border

withBorder adds a thin border in the separator color.

An image with rounded corners and a thin border An image with rounded corners and a thin border

Smaller additions

  • CopyButton calls onCopy(text) after a successful copy and not when copying fails, so it counts copies, not clicks. It works in mStudio extensions as well.
  • <Action closeOverlay> closes the nearest enclosing overlay. A dismiss action no longer has to name the surrounding component; an explicit name like closeOverlay="Modal" still wins.
  • A new AIHosting icon, for AI Hosting specifically. Sparkles stays the general AI icon.
  • npx @mittwald/flow-codemods@latest upgrade and list <revision> print the peer ranges of the Flow packages you use, marked required or optional, before the install. list --json carries them as peers.

Migrations

Image without withBorder is rounded now. To keep square corners, pass withRoundedCorners={false}. No other code change is required — see MIGRATION.md‍.

Fixes

  • 1.4.39 – ci: cache the .debs of the firefox + webkit Playwright installs (#db8bed1‍)
  • 1.4.39 – hash core sources in remote package builds (#e5b6118‍)
  • 1.4.38 – ci: keep non-matching label events out of the visual run's concurrency group (#b85e30f‍)
  • 1.4.38 – PasswordCreationField: keep the result while a slow validation runs (#75b9e99‍)
  • 1.4.38 – deps: bump the actions group across 1 directory with 2 updates (#4dd92d4‍)
  • 1.4.37 – deps-dev: bump the dev-minor group with 2 updates (#747795b‍)
  • 1.4.36 – HeaderNavigation: render a link combined with a button like the icon buttons (#f1f0748‍)
  • 1.4.36 – drop the link-with-button example from HeaderNavigation (#0e6bba4‍)
  • 1.4.36 – remove the link-with-button section from HeaderNavigation (#fc823ea‍)
  • 1.4.36 – HeaderNavigation: drop the link-with-button story and browser test (#070be80‍)
  • 1.4.36 – Modal: hold the close animation instead of racing a fixed sleep (#bd433db‍)
  • 1.4.36 – update visual regression screenshots (#e6538e2‍)
  • 1.4.36 – update visual regression screenshots (#945a87f‍)
  • 1.4.35 – Field: disable fields of a disabled form (#45fb9ae‍)
  • 1.4.34 – components: add form field contract test and guidance (#e4d3245‍)
  • 1.4.33 – components: one const per UI variant, the JSX picks (#2aa5ff1‍)
  • 1.4.33 – stop saving per-PR Next.js build caches (#9a5a9ec‍)
  • 1.4.32 – ci: bound the .deb download when the cache misses (#3ea2f2b‍)
  • 1.4.32 – ci: cache the .debs Playwright installs for WebKit (#9c87434‍)
  • 1.4.32 – ci: key the Playwright caches on the Ubuntu release (#7a80a75‍)
  • 1.4.32 – Modal: drop "modal" from the unsaved changes confirmation text (#f270eea‍)
  • 1.4.32 – release-figure: offer every figure in dark mode too (#6430d81‍)
  • 1.4.32 – drop the TEMP trigger again (#e53b747‍)
  • 1.4.32 – drop the TEMP trigger and benchmark again (#3b03864‍)
  • 1.4.32 – TEMP — benchmark apt alone vs. parallel .deb fetch (drop before merge) (#768cb66‍)
  • 1.4.32 – TEMP — benchmark: don't stop on the dry-run's exit code (drop before merge) (#4693783‍)
  • 1.4.32 – TEMP — make the browser suites affected (drop before merge) (#b2cbe44‍)
  • 1.4.32 – TEMP — make the browser suites affected (drop before merge) (#169ae96‍)
  • 1.4.32 – update visual regression screenshots (#33c5e5b‍)
  • 1.4.31 – show component design tokens on component pages (#0b69238‍)
  • 1.4.31 – deps: bump the production group with 3 updates (#91bab44‍)
  • 1.4.30 – Modal: keep an older remote's close button in the top-right corner (#f145be7‍)
  • 1.4.29 – LightBox: keep the gallery image's aspect ratio (#ab32089‍)
  • 1.4.28 – remote-react-renderer: drop an empty children array on the host (#9d852fd‍)
  • 1.4.27 – link the GitHub releases Atom feed (#55c75f0‍)
  • 1.4.27 – add a non-blocking Firefox job to the browser tests (#3771a4d‍)
  • 1.4.26 – ci: stop the PR cross-version job saving the old-versions cache (#74315db‍)
  • 1.4.26 – components: keep published declarations valid under stripInternal (#c9f8dff‍)
  • 1.4.26 – add States foundations page (#5096ca5‍)
  • 1.4.26 – States: address review feedback (#c3c809c‍)
  • 1.4.25 – place page-wide alerts inside the LayoutCard (#97c50b0‍)
  • 1.4.24 – List: include the whole end day in the date range filter (#f02d3d5‍)
  • 1.4.24 – capture from the docs examples, not Storybook (#c6c3d7a‍)
  • 1.4.23 – components: flag hardcoded flow-- class names that nothing generates (#ad7e7ac‍)
  • 1.4.22 – Overlay: keep typed dates when react-aria appends a hidden node to body (#26403a0‍)
  • 1.4.21 – deps: bump the production group across 1 directory with 13 updates (#af37f4d‍)
  • 1.4.20 – LayoutCard: space alerts stacked directly in a LayoutCard (#b4a0a1c‍)
  • 1.4.19 – deps-dev: bump the dev-patch group across 1 directory with 16 updates (#21b2626‍)
  • 1.4.18 – ActionGroup: keep multiple abort actions together at the start (#16c3464‍)
  • 1.4.17 – structure modal content with Section (#860bad0‍)
  • 1.4.16 – components: keep typed dates and times while a remote value is on its way (#e1e2bf6‍)
  • 1.4.15 – ext-bridge: allow minor updates of @mittwald/react-use-promise (#7247a48‍)
  • 1.4.14 – DatePicker: keep the calendar closed inside a popover (#a702b4f‍)
  • 1.4.14 – align global search with mStudio search (#f964961‍)
  • 1.4.13 – route app builders to USAGE.md from every repo entry point (#8fb4670‍)
  • 1.4.12 – CodeEditor: reference label and description only while rendered (#bf96178‍)
  • 1.4.12 – FieldError: link field errors to their control while shown (#3abb135‍)
  • 1.4.12 – FieldError: stop leaking messages into other fields (#031dd4a‍)
  • 1.4.12 – FieldError: stop remounting the error on every field render (#7b51522‍)
  • 1.4.12 – PasswordCreationField: link a valid password's result to the input (#9280413‍)
  • 1.4.12 – PasswordCreationField: show a generated password's rating at once (#f7c203e‍)
  • 1.4.12 – PasswordCreationField: show danger on the bar while the field is invalid (#42627ef‍)
  • 1.4.11 – repo: solve six documented footguns at their root (#9e2fe6f‍)
  • 1.4.10 – ext-bridge: name the likely cause when the host never connects, use local timeout (#7b86979‍)
  • 1.4.9 – deps: bump the production group across 1 directory with 14 updates (#d0b2526‍)
  • 1.4.8 – List: keep tile images square at the bottom (#ecc88fc‍)
  • 1.4.8 – keep the App Shell header and sidebars in view (#2d0f248‍)
  • 1.4.8 – commit-guard: allow breaking changes on a major line (#4d9ebdd‍)
  • 1.4.7 – Accordion: animate the content height instead of the grid rows (#d16e177‍)
  • 1.4.6 – Button: expose muted presses as aria-disabled (#90bbfa3‍)
  • 1.4.5 – ContextMenu: pass labeling props to the menu instead of the popover (#e0e1756‍)
  • 1.4.5 – deps: bump the actions group with 2 updates (#856a840‍)
  • 1.4.5 – MarkdownEditor: gate the attachment button scenario below 1.4.0 (#d25c061‍)
  • 1.4.4 – deps-dev: bump eslint from 10.10.0 to 10.11.0 in the dev-minor group (#aff66cd‍)
  • 1.4.3 – Slider: place the initial marker at the inline start (#fbb6ec2‍)
  • 1.4.2 – MarkdownEditor: keep the preview height across re-renders (#cc1e148‍)
  • 1.4.1 – Flex: let a className override the layout props (#a4ea169‍)

1.3.0 – CodeBlock folds smoothly, forms opt out of the close confirmationMinor

28 September 2026 - npm‍ - GitHub Release‍

Highlights

  • CodeBlock animates showing more and less: height, fade and button move together, and the collapsed code runs under the show-more button (#3290).
  • A Form can opt out of the close confirmation with confirmModalCloseOnUnsavedChanges={false}, so it no longer asks before its modal closes (#3289).
  • ComponentDefaultsProvider is available to remote apps (#3289).
  • The Accordion expand animation eases out.

CodeBlock

Toggling show more / show less used to switch the height instantly. The height, the fade and the button's position now animate together, with the same timing as other expanding content. Code that grows after it was expanded is not clipped, and with reduced motion the block switches without a transition. The line numbers fold with the code, and the button sits closer to the bottom edge.

Form and ComponentDefaultsProvider

A Form inside a Modal asks for confirmation before the modal closes while the form has unsaved changes. Set confirmModalCloseOnUnsavedChanges={false} on a form that should not trigger this. The prop overrides the Form.confirmModalCloseOnUnsavedChanges default of a ComponentDefaultsProvider, which mStudio extensions can now import too.

Both first shipped on npm with 1.3.1.

Fixes

  • 1.3.13 – components: move style computations from JS to CSS (#bab8880‍)
  • 1.3.12 – Rating: round decimal values to the nearest segment (#b6a0c0a‍)
  • 1.3.11 – react-tunnel: fill the exit before paint when it mounts in a Suspense reveal (#28676af‍)
  • 1.3.10 – Calendar: stop the preset menu from growing on every layout (#3cee28e‍)
  • 1.3.9 – carry the template rule into component-index and llms.json (#9573480‍)
  • 1.3.8 – tell coding agents to start from a template (#9e2566b‍)
  • 1.3.7 – ColumnLayout: keep the column ratio when content is wider (#abb824b‍)
  • 1.3.6 – Label: keep label buttons out of the field's accessible name (#f395601‍)
  • 1.3.5 – List: compose filter UI through views in remote context (#e218d14‍)
  • 1.3.4 – codemods: mark form-resets-after-modal-close as applying to the remote package (#79ce51e‍)
  • 1.3.3 – CheckboxButton: keep label left-aligned and fill the row height (#5efc008‍)
  • 1.3.2 – docs: stop react-live from remounting the example preview (#1a1652d‍)
  • 1.3.1 – Tabs, TabNavigation: measure against a scaled container (#b274a2b‍)

1.2.0 – Hints that point at the right control, and bars in the chartMinor

21 September 2026 - npm‍ - GitHub Release‍

Highlights

  • CoachMark is a new overlay that points at a control on its own — for a feature that is new, moved or easy to miss. It leaves the page usable and can be anchored by id, so an mStudio extension can place one (#3166).
  • CartesianChart draws bar series, stacked or grouped, and a layout prop turns the chart on its side for horizontal bars (#2880).
  • Badge takes a ContextualHelp directly — no trigger to write, no button to style (#3049).
  • Heading places a Button or CopyButton beside its text, scaled to the heading (#3136).
  • List.Item gets a dependencies prop so a stable render function can declare the external state it reads (#3139).
  • Every popover now keeps a gap to the viewport edge, and a width you set reaches the content instead of leaving empty background beside it.

CoachMark

A coach mark points at a control the user did not ask about. It opens on its own and stays out of the way: the page below keeps scrolling, focus is left alone, and the hint rides along with its anchor instead of closing at the first scroll. Write it directly behind the element it points at — it then follows that element in the reading order, and the anchor refers to it through aria-details.

Anchor it with anchorRef where you have a ref, or with anchor where you do not. An mStudio extension renders in a different context than the host, so a ref never arrives, but an id does — the coach mark keeps looking until that element appears, which matters because the host materializes the page in pieces.

The component is remote-capable and marked beta.

Dismissal is composed, not configured: wrap the button in an Action — Flow never closes an overlay on your behalf.

A hint at its anchor

The coach mark opens below the button it points at, with a tip towards it.

A coach mark below a Connect domain button, pointing at it with a tip A coach mark below a Connect domain button, pointing at it with a tip

Bars in CartesianChart

CartesianChart.Bar renders a bar series. Give several bars the same stackId to stack them; leave it off to group them side by side. Bars pick up the categorical color scale and round their outer corners.

The chart's new layout prop decides which axis is the categorical one. "horizontal" (the default) keeps bars growing upwards; "vertical" turns the chart on its side. XAxis and YAxis follow the layout on their own — only the dataKey moves to whichever axis is the categorical one. Bar is remote-capable.

Grouped bars

Three series without a stackId stand side by side per month.

Grouped bars for databases, webspace and email storage over three months Grouped bars for databases, webspace and email storage over three months

Horizontal bars

layout="vertical" puts the categories on the Y axis.

Horizontal bars showing the storage per project for Shop, Blog and Wiki Horizontal bars showing the storage per project for Shop, Blog and Wiki

Contextual help in a Badge

Write a ContextualHelp into a Badge and the badge supplies the trigger button itself, colored and sized to match:

A ContextualHelpTrigger you write out yourself lands in the same place and is styled the same way, so you keep control of the trigger when you need it.

The help, opened

The trigger sits after the badge's value; the help opens below it.

A Priority High badge with an info trigger, its contextual help open below A Priority High badge with an info trigger, its contextual help open below

Buttons in a Heading

A Button or CopyButton written in a heading's content is now placed beside the heading text and scaled to the heading's size — m for the two largest sizes, s below.

A copy button beside the text

The button takes the heading's size and sits on its text line.

A heading reading my-shop.de with a copy button beside it A heading reading my-shop.de with a copy button beside it

Declaring what a list item reads

A List.Item re-renders when its data changes, or when one of its render functions changes identity — which a function written inline in JSX does on every render. A render function with a stable identity gave the item no signal at all (hoisted out of the component, wrapped in useCallback, or reading from an external store), so it kept the values it first saw. dependencies is how you give it one:

A /tunnel entry point

@mittwald/flow-react-components/tunnel re-exports the @mittwald/react-tunnel API through the very module instance Flow uses. The tunnel's context is module-level, so a consumer's own dependency on @mittwald/react-tunnel becomes a second context as soon as the versions diverge, and entries stop finding Flow's providers. Import from this entry point instead of from the package directly (#3176).

Fixes

  • 1.2.28 – Popover: render the tip from one component (#c764de4‍)
  • 1.2.27 – Link: inherit the font size of the surrounding text for inline links (#9490b0b‍)
  • 1.2.26 – components: subtle micro-interactions for interactive components (#fc68bcc‍)
  • 1.2.25 – components: invalidate build when the design tokens change (#fc70f93‍)
  • 1.2.24 – Accordion: name the toggle of a label header (#c526710‍)
  • 1.2.23 – point llms.txt at the Markdown pages and add extension guidance (#39831cf‍)
  • 1.2.22 – List: make infiniteScroll work in table view mode (#bd171f8‍)
  • 1.2.21 – Popover: lift a non-modal popover over ordinary page content (#7705faa‍)
  • 1.2.20 – components: animate DonutChart, ProgressBar and chart on load (#10f85d9‍)
  • 1.2.19 – components: make the selector lint rules blocking and gate :global class names (#c7a0262‍)
  • 1.2.18 – codemods: stop one empty source file failing a whole upgrade (#36dc53f‍)
  • 1.2.17 – components: stop declaring query containers nothing queries (#c4d03bf‍)
  • 1.2.16 – Overlay: keep focus and scroll position when something appends to body (#e9554f6‍)
  • 1.2.15 – deps: bump the production group across 1 directory with 19 updates (#453d99f‍)
  • 1.2.14 – deps-dev: bump the dev-patch group across 1 directory with 7 updates (#3463327‍)
  • 1.2.13 – deps: bump the dev-minor and actions groups (#9c49710‍)
  • 1.2.12 – FileDropZone: match dropped files against accept like the attribute does (#7118f1d‍)
  • 1.2.11 – DonutChart: keep the value centred in a stretching flex row (#7267ac4‍)
  • 1.2.10 – components: announce accordion state and gallery position (#62e4c41‍)
  • 1.2.9 – remote-core: carry Date and other built-ins across the remote boundary (#534e62d‍)
  • 1.2.8 – PasswordCreationField: make the field usable with a screen reader (#33fde0b‍)
  • 1.2.7 – TextArea: resize and count a value the field never saw typed (#a0df423‍)
  • 1.2.6 – components: compile the browser tests' base styles from source (#2320245‍)
  • 1.2.5 – Tooltip: hide a tooltip that never got positioned (#81c1aff‍)
  • 1.2.4 – Combine: keep a text and its small button in the line (#a9ae866‍)
  • 1.2.3 – CoachMark: play the closing animation instead of vanishing (#75d9bda‍)
  • 1.2.2 – components: invalidate build:icons when the icon source changes (#9978fa1‍)
  • 1.2.1 – Tabs: keep collapsed tab titles out of the scrollable overflow (#7595357‍)

1.1.0 – Upgrade across Flow versions with one commandMinor

31 August 2026 - npm‍ - GitHub Release‍

Highlights

  • npx @mittwald/flow-codemods@latest upgrade bumps every Flow dependency, installs, and runs the codemods for the range it crossed.
  • The new @mittwald/flow-codemods package carries the migration catalogue that MIGRATION.md is generated from — 23 entries, each carrying a codemod where the change can be applied mechanically.
  • flow-codemods list <revision> shows what a target version would touch before you commit to it.
  • Rating takes a segment count, single-segment filling and individual segments: maxValue, fill="single", and RatingSegment children with their own icons and labels.
  • @mittwald/flow-react-components ships USAGE.md and a JSON component index, so a coding agent can answer component questions without the docs site.

The upgrade CLI

Upgrading Flow used to mean reading MIGRATION.md, deciding which entries applied to your jump, and running codemods one at a time. The new @mittwald/flow-codemods package does that for you.

upgrade detects your package manager, refuses to run on a dirty working tree (--allow-dirty overrides), and reports every file it declined. --dry writes nothing, --print shows the transformed output, and --json makes list machine-readable.

The catalogue is the single source for both the CLI and MIGRATION.md: an entry describes what changed and how to migrate, and carries a codemod when the change can be decided mechanically. Entries without one still tell you what to do by hand — for those, the prose is the migration.

Rating: segment count, single fill, individual segments

Rating gained maxValue (default 5) for the number of segments, and fill="single" to fill only the selected segment instead of every segment up to it. Both the component and RatingSegment work in mStudio extensions.

Ten segments

maxValue={10} draws ten segments instead of the default five.

A rating with ten stars, seven of them filled A rating with ten stars, seven of them filled

Individual segments

For a scale whose segments are not interchangeable, pass RatingSegment children. They define how many segments there are (maxValue no longer applies), and each one takes its own icons and accessible label.

A rating with a sad, a neutral and a happy face; only the happy one is filled A rating with a sad, a neutral and a happy face; only the happy one is filled

Documentation a coding agent can read

@mittwald/flow-react-components now ships its own consumer guide, and the docs site is published in machine-readable form.

  • USAGE.md, shipped inside the package: how to build an application with Flow — component selection, layout and spacing, what is safe to depend on, and the mistakes that come up most. Available offline, which is what makes it usable from an agent's tool loop.
  • @mittwald/flow-react-components/component-index — a JSON index of every public component with its lifecycle status and props.
  • The docs site at https://flow.mittwald.de‍ serves /llms.txt, /llms.json, /llms-full.txt, and every page as Markdown at /raw/<path>.md.

Point your agent at USAGE.md and the component index; it stops guessing component names and props.

Fixes

  • 1.1.53 – icons: drop the trailing separator from an icon's class attribute (#8a48c83‍)
  • 1.1.52 – SectionHeader: render links in size "m" (#2151330‍)
  • 1.1.51 – Popover: keep a gap to the viewport edge on a narrow screen (#e607168‍)
  • 1.1.50 – Overlay: size the backdrop to the viewport, not the document (#7eb1589‍)
  • 1.1.49 – Notification: keep the notification inside narrow viewports (#e35fc7a‍)
  • 1.1.48 – Popover: report the open state instead of taking it over (#0524e54‍)
  • 1.1.46 – deps-dev: bump vite-plugin-sass-dts from 1.3.37 to 1.3.39 in the dev-patch group (#22e3d6c‍)
  • 1.1.45 – deps: bump cronstrue from 3.24.0 to 3.25.0 in the production group (#fd25656‍)
  • 1.1.44 – codemods: stop migrations breaking asset imports and skipping the password-tools rule (#3fa8963‍)
  • 1.1.43 – deps-dev: bump the dev-minor group with 11 updates (#7348ed6‍)
  • 1.1.42 – deps: bump the production group across 1 directory with 19 updates (#443a3bc‍)
  • 1.1.41 – icons: inline the Tabler icon path data instead of depending on @tabler/icons-react (#11be0f2‍)
  • 1.1.40 – components: keep overlay trigger buttons inside their trigger (#7210212‍)
  • 1.1.39 – components: keep field values controlled from the first render (#16c6981‍)
  • 1.1.38 – MessageThread: restore list markers for ordered lists (#11ad06c‍)
  • 1.1.37 – codemods: order the unit tests after the remote-components generator (#d9fa5ba‍)
  • 1.1.36 – Image: keep sizing from style when no size props are given (#abfc5a6‍)
  • 1.1.35 – deps-dev: bump the dev-patch group across 1 directory with 8 updates (#4b8a593‍)
  • 1.1.34 – Markdown: clip striped table cells to the rounded corners (#a1ade85‍)
  • 1.1.33 – deps-dev: bump the dev-minor group with 4 updates (#7e666d1‍)
  • 1.1.32 – Activity: stop a deactivated subtree leaving its overlays on screen (#a6c613b‍)
  • 1.1.31 – Option: stop every option landing in the collection twice (#f6a8d84‍)
  • 1.1.30 – ci: render every commit type in the changelog (#8f28777‍)
  • 1.1.29 – PasswordCreationField: update to stable v3 (#8c56d85‍)
  • 1.1.28 – codemods: wrap bare function references passed to onAction (#bb98f3c‍)
  • 1.1.26 – components: prefix the CSS properties Safari needs prefixed (#8b3536c‍)
  • 1.1.25 – NotificationProvider: keep notifications interactive over an open overlay (#07ea00d‍)
  • 1.1.23 – DateRangePicker: use the size scale for the date segment padding (#ce60e49‍)
  • 1.1.21 – Navigation: keep the badge in the item's line and truncate the label (#825bcbc‍)
  • 1.1.21 – Markdown: forward the react-markdown options it accepts (#953cb55‍)
  • 1.1.20 – Option: infer textValue from mixed children and keep value stable (#e80bf3c‍)
  • 1.1.19 – Tabs: keep the tab selection controlled from the first render (#dd29fa5‍)
  • 1.1.18 – ListItem: render linked items as real anchors (#de6dc0a‍)
  • 1.1.17 – Tunnel: render tunnelled children in the first commit (#09db004‍)
  • 1.1.17 – Button: treat a string label like a Text child (#13cc756‍)
  • 1.1.17 – components: keep tests and stories out of the published types (#bf947d9‍)
  • 1.1.10 – Link: prevent text selection on icon element (#9f3160b‍)
  • 1.1.9 – List: let items follow the state they are rendered from (#40e0401‍)
  • 1.1.9 – codemods: colour the upgrade by-hand list and print summaries last (#a91daf3‍)
  • 1.1.7 – codemods: add migration entry for Tabs' navigation-usage move to TabNavigation (#c1d45d4‍)
  • 1.1.6 – codemods: install with the project's real package manager (#63875ae‍)
  • 1.1.5 – docs: drop the classic JSX transform debug props from live examples (fixes #3017‍) (#64abb32‍)
  • 1.1.4 – Heading: space tunneled content without :has() (#97022ee‍)
  • 1.1.3 – codemods: the SegmentedControl -> RadioGroup direction is a rename (#0832a67‍)
  • 1.1.2 – Tabs: forward aria-label to the tab list (#cad04b6‍)
  • 1.1.2 – codemods: say that action -> onAction changes the callback type (#9a52148‍)
  • 1.1.1 – codemods: compile the transforms so a consumer install can load them (#50f8075‍)

1.0.0 – Semantic Versioning is a promise now, not an intentionMajor

26 August 2026 - npm‍ - GitHub Release‍

Highlights

  • 1.0.0 carries no breaking change over 0.2.0-alpha.1058. Coming from the last alpha, the upgrade is a version bump and nothing else.
  • Semantic Versioning is binding from here on: an incompatible change to the runtime public API only ever ships in a new major (ADR 0005, RFC #2711).
  • Deprecate, don't break — an API that is going away stays functional and warns at runtime first. That warning is your lead time before the next major.
  • Every @mittwald/flow-* package keeps sharing one version, so the promise reads identically for all of them, @mittwald/flow-remote-react-components included.
  • Deliberately not covered, so the design system can keep moving: TypeScript types, CSS class names, design tokens, and the internal DOM structure.
  • New docs page under Get Started walks through what the release means per audience and how to catch up from an older alpha.

Deprecations

Nothing is newly deprecated in 1.0.0. What changed is the removal date: every path deprecated during the alpha keeps working and now disappears at 2.0.0, not before.

  • Align → use Combine (#2871‍)
  • SegmentedControl / Segment → use Tabs (switching content) or RadioGroup (setting a value) (#2903‍) — not mechanical, the replacement is a decision per usage
  • The global flags object → use ComponentDefaultsProvider, which also works per subtree (#2796‍)
  • Button / SubmitButton: color="accent" → use color="success" (#2874‍)
  • Action: action → use onAction

What the version number now guarantees

An incompatible change to any of these only appears in a new major: the runtime public API of public.ts (which components and exports exist, which props they accept, and the documented behaviour of documented functions), the props of the components in @mittwald/flow-remote-react-components, published icons, and the versioned remote protocol.

Node and React are runtime requirements with explicit rules. The Node floor is the actively supported LTS — currently node >=24 — and dropping a version still inside its LTS window is breaking, while dropping an already-EOL one may ship in a minor. Widening the accepted React range is backwards compatible; raising the minimum is breaking.

TypeScript types stay best-effort and are not covered, so a tsc error can in theory appear in a patch. If that would be expensive for your project, pin exact versions instead of ^ ranges. A deliberate type break still ships a migration note.

One override exists: a component's lifecycle status. A Beta component is exempt from the breaking-change promise while its API is still moving; Stable is the default and fully bound; Deprecated stays covered until it is removed in a major.

What it means for mStudio extensions

The props of the components in @mittwald/flow-remote-react-components are the contract with extension developers and carry the same promise as the React components. The remote protocol is versioned and negotiated when the connection is established, so an extension built against an older Flow keeps running when the mStudio host updates.

@mittwald/ext-bridge shares the version but has its own migration guide and a stricter Node rule: for that package, any raise of the Node floor is a breaking change, regardless of EOL, and its floor may be more conservative than the rest. Since the alpha it requires node >=24 and narrows its React peer range to ^19.2.0. Declared context parameters are typed and optional config values are never null any more, so reading config.containerId no longer needs a runtime narrow (#2889‍).

Migrations

From 0.2.0-alpha.1058 there is nothing to do. Coming from an older alpha, the work sits between the alphas, not in 1.0.0, and none of it is a prerequisite — the old paths still work in 1.x.

Every change that needs an adjustment in your code has a before/after entry in the migration guide of the package it affects:

Entries are sorted by version, newest first. Find the version you are coming from and work upwards. The oldest 0.2.0-alpha entry is the jump to 0.2.0-alpha.646, so from anything around 0.2.0-alpha.600 the guides are complete.

How to work through them — and the codemod CLI that automates part of it — is on Upgrades‍.

Fixes

  • 1.0.16 – components: stop shipping design-token build metadata to the browser (#7d3afde‍)
  • 1.0.13 – Modal: keep the heading text next to its icon (#9ff2cae‍)
  • 1.0.9 – Form: stop a Modal's form submit from reaching the surrounding Form (#ee9b60a‍)
  • 1.0.8 – FileField: open the file dialog inside a link row (#b77a14c‍)
  • 1.0.7 – Table: will not render in remote (#22929f4‍)
  • 1.0.6 – docs: hide deprecated values from the properties table (#eaa0349‍)
  • 1.0.5 – docs: show full prop types in the properties table (#2c42ad5‍)
  • 1.0.3 – CodeBlock: balance the padding and unify the editor line colors (#6bf57c7‍)
  • 1.0.2 – Remote: serialization allows duplicate object references (#ac3ef26‍)
  • 1.0.1 – Breadcrumb: fix cursor pointer for spans with role link (#d44d61c‍)

Auf dieser Seite