Timeline
What's new?
We're always working on the React Flow docs and the library.
This is a timeline of the things we've added or changed so far.

React Flow 12.10.0
Minor Changes
- #5637 Add
zIndexModeto control how z-index is calculated for nodes and edges - #5484 Add
experimental_useOnNodesChangeMiddlewarehook
Patch Changes
- #5629 Thanks @AlaricBaraou ! - Prevent unnecessary re-render in
FlowRenderer - #5592 Thanks @svilen-ivanov-kubit ! - Always create a new measured object in apply changes.
- #5635 Thanks @tornado-softwares ! - Update an ongoing connection when user moves node with keyboard.

React Flow UI Components updated to React 19 and Tailwind CSS 4
Our React Flow UI components have been updated to support the latest version of shadcn/ui, on React 19 and Tailwind 4!
This update includes a fresh look from the latest version of shadcn/ui , and a new UI Components tutorial to get you started.
How to upgrade your project
To upgrade your project, follow the steps below.
Step 1: Update dependencies.
npm install react@latest react-dom@latest tailwindcss@latestOr do so manually in package.json, and then run
npm installStep 2: Run the Tailwind CSS upgrade codemod.
Read more about available codemods in the shadcn/ui Tailwind CSS 4 upgrade guide .
npx @tailwindcss/upgradeStep 3: Move the React Flow styles to the global.css file.
Important: Tailwind CSS 4 is now configured completely in CSS. Instead of importing
your @xyflow/react/dist/style.css file in your App.tsx, you will need to it in your
global.css file, after you import tailwindcss.
// Tailwind CSS 3
-@tailwind base;
-@tailwind components;
-@tailwind utilities;
// Tailwind CSS 4
+@import "tailwindcss";
+@import "tw-animate-css";
+@layer base {
+ @import "@xyflow/react/dist/style.css";
+}We recommend removing the old js/ts tailwind configuration from your project, and migrating to the new CSS-variable-only configuration.
This can make things a lot simpler: you can configure everything related to your application’s design system and look in a single CSS file.
-import '@xyflow/react/dist/style.css';
import "./globals.css";
export default function RootLayout({
children,
}: Readonly<{
children: React.ReactNode;
}>) {
return (
<html lang="en">
<body>{children}</body>
</html>
);
}Step 4: Update the components
For each component you want to update, you can run the following commands.
If it’s a shadcn/ui component:
npx shadcn@latest add component-nameIf it’s a React Flow UI component:
npx shadcn@latest add https://ui.reactflow.dev/component-name
React Flow 12.9.0
This update is huge! We added a new EdgeToolbar component, it’s now possible to start a
selection above a node and child nodes of different parents won’t overlap anymore:
Minor Changes
- #5544 Add
EdgeToolbarcomponent - #5550 Prevent child nodes of different parents from overlapping
- #5551 Allow to start a selection above a node
Patch Changes

React Flow 12.8.5
Patch Changes
- #5480 Prevent multi-touch events while making a new connection
- #5482 Make isNodeIntersecting behave the same as getIntersectingNodes
- #5509 Prevent calling onResizeEnd if node was not resized
- #5511 Fix regression: elevate edges if connected nodes are selected
- #5497 Skip eagerly rendering nodes when node dimensions and handles are predefined
- #5455 Thanks @Sec-ant ! - Fix warning when display is set to none on the wrapper div


React Flow 12.8.3
A new version of React Flow is out. With 12.8.3 you get a lot of bug fixes and a great improvement for handles. It’s now possible to position child content of a handle outside of the handle itself and still use it as a starting point for connections as you can see in this example:
Patch Changes
- #5428 Be able to use detached handle content as a starting point for a connection
- #5419 Make edge markers fallback to
--xy-edge-strokeCSS variable when marker color is null - #5453 Snap selection instead of separate nodes when snap grid is enabled
- #5444 Export
MiniMapNodeto use it for custom mini map nodes - #5415 Allow strings and enums for marker types
- #5436 Prevent a 0 added to the markup for edges when interactionWidth is 0
- #5443 Use 1 as the default for interactive Minimap zoom step
- #5448 Use correct
HandleConnectiontype for HandleonConnect - #5420 Omit
defaultValuefromNode’sdomAttributesto fix type incompatibility when usingWritableDraft


Rebrush React Flow UI
We have made some significant improvements to React Flow UI (formerly known as React Flow components). These changes enhance the functionality, visual look and usability of the components, to improive the general developer experience.
Re-organize components
Some components have been moved to examples, while others have been consolidated in a new structure:
- Nodes Utilities: These components can be used as building blocks for creating custom nodes.
- Custom Nodes: These are fully functional nodes that can be used directly in your application.
- Handles: These components are used to create connection points inside nodes.
- Custom Edges: Fully functional edges that can be used out of the box.
- Controls: Collection of interactive controls.
- Miscellaneous: Various utility components that don’t fit into the other categories,
like
DevTools.
Find all of them in the React Flow UI page.
BaseNode enhancements
Our BaseNode component has been fully revamped, to provide a more consistent experience with shadcn UI , and the rest of our React Flow UI component library.
The new BaseNode component now includes improved styling and wrapper components,
aligning to shadcn UI design principles.
Just like a shadcn UI Card component , the
BaseNode component now exports
BaseNodeHeaderandBaseNodeHeaderTitlefor the header section,BaseNodeContentfor the main content area andBaseNodeFooterfor the footer section.
This structure allows for better organization of content within the node, making it easier to create complex node layouts.
Improved examples and nodes
We have also added a few new components and improved existing ones. Our component pages now include more comprehensive examples that showcase the new features and capabilities of the components. For example:
- New
NodeAppendixcomponent, which can be used to add additional information or controls to nodes, like aNode Badge! - The
AnnotationNodecomponent has been moved to an example usage ofBaseNode, to demonstrate how to style theBaseNode. - The
StatusIndicatornow includes a variant with an overlaying spinner, and improved usage examples. - The
TooltipNodecomponent, has been improved and moved toNodeTooltip. It is no longer a custom node, but rather an utility component that you can use to wrap a custom node with a tooltip.
No more selected prop
You don’t need to pass the selected prop to the BaseNode or its related components
anymore. Styling the selected state is now handled automatically by tailwind CSS
selectors.
However, selected is still a valid prop for nodes in React Flow, and you can still use
it to determine if a node is selected or not in your custom components. If you do not need
the selected prop for custom logic, but you only use it for styling, you can safely
remove it from your components, and you can follow how BaseNode is implemented to
achieve custom styling for your custom selected nodes.
export const BaseNode = forwardRef<HTMLDivElement, HTMLAttributes<HTMLDivElement>>(
({ className, ...props }, ref) => (
<div
ref={ref}
className={cn(
'relative rounded-md border bg-card text-card-foreground',
'hover:ring-1',
// React Flow displays node elements inside of a `NodeWrapper` component,
// which compiles down to a div with the class `react-flow__node`.
// When a node is selected, the class `selected` is added to the
// `react-flow__node` element. This allows us to style the node when it
// is selected, using Tailwind's `&` selector.
'[.react-flow\\_\\_node.selected_&]:border-muted-foreground',
'[.react-flow\\_\\_node.selected_&]:shadow-lg',
className,
)}
tabIndex={0}
{...props}
/>
),
);
BaseNode.displayName = 'BaseNode';Feedback
We hope these improvements make your experience with React Flow UI even better. If you have any feedback or suggestions, please let us know via mail or Discord !

Learn section rework
Restructured and updated content
We went over and updated our learn section. Here’s what’s changed:
- We slimmed down most pages and deleted some fluff that we felt didn’t contribute to a better understanding of the library.
- Quickstart is now the landing page to rule them all, with installation and example setup.
- Getting started and concepts have been merged into one section.
- The customization and concepts section have been updated. Our mental approach was to shorten and clearly separate pages by context, making them easy to digest when read both standalone and in succession.
- In general texts include more interlinking between our docs sections, snippets now include highlights and the layout and headings have been improved for easier scanning of the text.
Reworked code preview
Our code preview component has been updated with a sleek new design with an action bar that allows you to toggle, copy, refresh or open the code in a sandbox. The default size has also been adjusted in some places to integrate into the text better. Here’s what it looks like: