Changelog
All notable changes to Flowinger. The format follows Keep a Changelog,
and versions follow Semantic Versioning — with the usual caveat that while the version
is 0.x, a minor release may change the API; anything that does is listed under Changed.
The design notes behind each release — what was measured, what was tried and dropped — are in
plan.md.
0.9.1 - 2026-10-15
Section titled “0.9.1 - 2026-10-15”The first published release of 0.9.0’s changes — the bridge to 1.0: reactFlowDefaults,
development warnings where 1.0 will be noticed, and what 1.0 promises and
how to upgrade. 0.9.0 was tagged but its release stopped at the size check before it reached
npm. Nothing in the library changed since; what follows is why it stopped, and the browser suite.
Changed
Section titled “Changed”- The whole canvas’s size budget is 37 kB (was 36). 0.9.0 measured 35.97 kB — inside 36 by 26 bytes on one machine, and over it on CI’s Linux runner, where the same build gzips a little larger; that stopped its release before it published. The growth is 0.8.0’s culled first render (a culled mount ten times faster). The core’s budget stays 20 kB.
- The browser suite runs in Firefox and WebKit as well as Chromium, in
pnpm e2eand in CI. Neither found a bug in the library. On a Mac the 29 tests passed in both on their first run, and run five times in all three browsers (435 tests) none failed or was flaky. On CI’s Linux runner, WebKit found two tests that had assumed the browser draws often: there it drew one or two frames in 600 ms. So a box held at the pane’s edge had panned 13.5 px where the test wanted 100, and a 500 ms'smooth'move was over before a frame of it was seen. The first test now waits until the view has moved; the second steps the move a frame at a time on a paused clock (Playwright’spage.clock). A third test, the lock’s, dragged a node to within 40 px of the pane’s bottom edge, where auto-pan moves the view by as much as the drag is slow; on a busy machine it failed 9 runs in 20. It now drags away from the edge. Two differences are covered outside the suite: Playwright’s wheel arrives in pixels in every browser, so Firefox’s wheel in lines (deltaMode1) is tested in jsdom; and Firefox gives the mouse pointer id 0 where the others give 1, which is safe because the library only ever compares pointer ids.
0.9.0 - 2026-10-15
Section titled “0.9.0 - 2026-10-15”Tagged, but never published: its release stopped at the size check (see 0.9.1, which published these changes).
The bridge to 1.0: nothing an app can see changes, and in development a canvas now says where 1.0 will be noticed. Upgrading to 1.0 has the detail, and what 1.0 promises the contract.
reactFlowDefaults— React Flow’s default for every canvas prop where Flowinger’s differs, read from its source:nodesDraggable,nodesConnectable,elementsSelectableandnodesFocusableon,minZoom0.5, a 1 pxnodeDragThreshold,paneClickDistance1 andnodeClickDistance0, ⌘ (on a Mac) or Control formultiSelectionKeyCodeandzoomActivationKeyCode, Space forpanActivationKeyCode, and a 0.1 fit margin.<FlowingerCanvas {...reactFlowDefaults}>behaves like React Flow’s canvas. From 1.0,<ReactFlow>applies them itself and<FlowingerCanvas>keeps Flowinger’s.- In development,
<ReactFlow>names the props it leaves out whose default 1.0 changes, once a page, each with today’s value and 1.0’s —nodesDraggable (false → true)— and how to keep either: render<FlowingerCanvas>, or spreadreactFlowDefaults.<ReactFlow>is therefore its own component now, rendering<FlowingerCanvas>. - In development, an edge drawn at a side guessed from its handle’s name says so, once a page: an edge naming
a handle (
in,out,prev,next,top…) that its node has no<Handle>of. 1.0 drops that rule, which React Flow does not have; the warning names the side 1.0 gives it and the<Handle>to add. - What 1.0 promises and Upgrading to 1.0, in the docs and on the site.
Changed
Section titled “Changed”- Writing a feature is experimental.
Feature,EngineContextand the types they are made of are tagged@experimental: they reach into the store, and may change in a minor release, with a line here. Using the built-in features is unaffected. - The migration guide’s table of defaults has the four it lacked:
nodesFocusable,nodeDragThreshold,paneClickDistanceandnodeClickDistance. - Size. The core is 19.85 kB gzipped (was 19.83) and the whole canvas 35.97 (was 35.94):
<ReactFlow>as its own component, and the store’shasNodeElement. The warnings themselves are development-only and not in a production build. Both are inside the 20 and 36 kB budgets, the whole canvas by 0.03 kB.
0.8.0 - 2026-10-15
Section titled “0.8.0 - 2026-10-15”Changed
Section titled “Changed”- With
onlyRenderVisibleElements, the first render is culled too. The nodes and options reach the store in layout effects, after the first render, which therefore drew every node — to measure it, and then drop all but those in view. The culling feature now judges that render from the props: the nodes as declared, against the starting view and an assumed 1920 × 1080 pane, with selected nodes always drawn. At 10,000 nodes a culled mount went from about 570 ms to about 70 in a profile. A server renders the same set (so hydration matches), where it rendered every node: a culled page no longer sends all its nodes as HTML. In a test environment with no layout, everything is still drawn once the canvas has mounted. In the benchmark a culled mount is 41 / 49 / 55 ms at 1,000 / 5,000 / 10,000 nodes, against React Flow’s 83 / 302 / 594 — the benchmarks. - Size. The core is 19.8 kB gzipped (was 19.7) and the whole canvas 35.9 (was 35.5), inside the 20 and 36 kB budgets.
Feature.firstVisiblefor features: the visible set for a render before the store has one, judged from the props. WhatcullingFeatureuses for the first render.
0.7.0 - 2026-10-14
Section titled “0.7.0 - 2026-10-14”Changed
Section titled “Changed”- With
onlyRenderVisibleElements, a pan or zoom that stays inside the region last worked out costs nothing. The visible set is worked out for the view and a quarter-view margin round it; while the view stays inside that region (and it is not more than three times the view after a zoom in), every node in view is already drawn, so nothing is looked at again. A node kept from that region may be drawn a little further out of view than before. At 10,000 nodes a pan costs 3.2 ms a frame (was 4.4) and a zoom 2.3 (was 5.0); React Flow 4.2 and 4.5 in the same run — the benchmarks. - An edge label’s halo is 6 px wide (was 4), so the line no longer shows between two close stems — the
“TT” in “HTTPS” at the default 12 px. Labels drawn with
labelShowBgare unchanged. - A drag, a measurement or a selection now costs what changed, not the size of the graph. A drag hands the
canvas a list that is the last one with one node replaced, and everything that was worked out from the whole
list — the store’s maps and counts, the canvas’s and the stacking feature’s nesting, the dimension reports,
and the culling pass — now starts from the answer it had and looks at what was replaced. With
onlyRenderVisibleElementson, at 10,000 nodes a drag costs 4.3 ms a move (7.7 before; React Flow 4.5), and a mount 0.5 s. See the benchmarks. - Size. The core is 19.7 kB gzipped (was 18.9) and the whole canvas 35.5 (was 33.9); the culling feature 1.2 kB (was 0.5). The budgets are 20 and 36 kB (were 19 and 34).
- A workflow-simulation example (
examples/stepper): run, step and pause an order process with a decision and a failure path; each step’s status and each edge’s flow drawn from a purenext(state). - A multiplayer example with Yjs (
examples/presence): a shared graph, and each person’s cursor (in graph units) and selection through Yjs awareness, synced between tabs with no server. - A swimlanes example (
examples/swimlanes): lanes as parent nodes, steps as their children, and moving a step to another lane by re-parenting it on drop, re-based so it stays put. - Guides (
docs/guides/, and a section on the site): an org chart, laying out a DAG with dagre, a flowchart editor with undo, export to PNG/SVG, save and load as JSON, and a workflow builder in Next.js — each leads with what people search for and points at the example that does it. - An example that exports the diagram as an image (
examples/export): PNG, JPEG, WebP or SVG at 1–3×, with the page’s background, none or white, as the whole diagram or fitted to a 1200 × 630 card; previewed, downloaded or copied to the clipboard, withfilterleaving out a badge and the handles. - An example that saves and loads a graph as JSON (
examples/save-load):toObject()kept in the browser across a reload, downloaded and opened as a file, or edited as text, with a check that says what is wrong with a file instead of handing the canvas something it cannot draw. - A documentation site at https://naveen-boddepalli.github.io/flowinger/ (Astro Starlight, in
site/): search, a sidebar, and a live editor on the home page that is rendered on the server. Its pages are generated from the repository’s Markdown (docs/, the examples, the changelog, roadmap, contributing guide and design record), so each is written once. The demo moved to/flowinger/demo/;llms.txtstays at the root. - An example in Next.js (
examples/nextjs): a graph laid out and framed in a Server Component, then shown as a viewer and as an editor with undo. Built against the packed library in CI like the others. Server rendering is rewritten around it: what the server draws, what waits for the client, and how to frame the first paint. EngineContext.takeDirtyNodes()for features: the nodes whose place, size, visibility or selection changed since it was last asked, ornullfor “any”. WhatcullingFeaturelooks again at.
- A canvas inside a
FlowingerProviderwas server-rendered at the origin, not at itsdefaultViewportor controlledviewport: the canvas moved the provider’s view there in an effect, and a server runs none. It now starts there on its first render, so the server’s HTML is framed and hydration draws the same. - In an uncontrolled flow, selecting a node did not tell culling, so a selected node outside the view was not drawn until the next change of anything else, and one that was let go of stayed drawn.
0.6.0 - 2026-10-13
Section titled “0.6.0 - 2026-10-13”flowinger/editable-edge—EditableEdge, an edge with waypoints you can move: it runs throughdata.points, and once selected each waypoint is a handle to drag, the dot between each pair of ends is a place to add one, and a double click removes one. Written throughupdateEdgeData, so a controlled flow hears every move.getEditableEdgePathis the path as a function. See the pro modules.HexagonNodeinflowinger/shapes(shapeNodeTypes.hexagon).- A collapsible-tree example (
examples/tree): an org chart whose branches fold withuseCollapsibleTree, laid out again around what is hidden. Built against the packed library in CI like the others. - Benchmarks against React Flow at 1,000, 5,000 and 10,000 nodes, with and without
onlyRenderVisibleElements: mount, pan, zoom, drag, memory.pnpm benchre-runs it in a real browser and rewrites the table;bench/results.jsonhas the numbers.
Changed
Section titled “Changed”- Size. The core is 18.9 kB gzipped (was 18.7) and the whole canvas 33.9 (was 33.7): the counters and fast paths that made culling scale. The budgets, 19 and 34, are unchanged.
Controlswere unreadable in a light theme that set--flowinger-surfaceand--flowinger-textand nothing else: the buttons fell back to a dark--flowinger-surface-raisedunder dark text. It now falls back to--flowinger-surface. (Thelayoutsandeditorexamples had the bug in light mode; both now set it.)onlyRenderVisibleElementscost more than it saved at scale. With it on, 10,000 nodes mounted in 2.1 s, zoomed at 13.6 ms a frame and dragged at 10 ms a move (React Flow: 0.6 s, 4.8, 4.8). Work proportional to the whole graph was done where it should have been proportional to the view: registering a handle ran the culling pass and woke everyuseStorereader (forcing a layout each time a node unmounted); “is every node measured?” scanned every node after every handle (a quadratic mount); the selection was recomputed from every node and edge when none was selected; and the edge layer rebuilt a map of all nodes whenever the visible set moved. Now 0.5 s, 5.5 ms and 7.7 ms. Found by the benchmark above.- The rectangle round a box selection, a
NodeToolbarfor another node (nodeId), and the pan to a node that takes keyboard focus (autoPanOnNodeFocus) used a child’s position inside its parent as if it were on the canvas. With a group in the selection the rectangle’s corner was wrong, and the toolbar and the pan went to the wrong place for a child. Found by watching them in a browser; the unit tests had no sub-flow.
0.5.0 - 2026-10-13
Section titled “0.5.0 - 2026-10-13”- Every one of React Flow’s 211 exports and 119 canvas props is named, and does something. The audit
(
scripts/audit-react-flow.mjs) counts a name that compiles and does nothing apart from one that works —@unimplementedin its doc comment, and a development warning when a canvas is given it — and there are none: 302 of the 302 members of the props, the instance and the components do what they say. See React Flow coverage and, for what differs from React Flow, the migration guide. - Gestures and keys:
selectionKeyCode,multiSelectionKeyCodeandzoomActivationKeyCode(a key, a combination, a list, ornull);panOnScrollModeandpreventScrolling;noWheelClassName,noPanClassNameandnoDragClassName(yours, besidenowheel/nopan/nodrag);paneClickDistanceandnodeClickDistance;selectNodesOnDrag. - Connecting:
connectionDragThreshold(default 1 px — a click on a handle is no longer a connection),connectionRadius(20) andreconnectRadius(10), in graph units;connectOnClick(default true) withonClickConnectStart/onClickConnectEnd— click a handle, then another. - Selection: a box selection leaves a rectangle round what it took (
selectionRectFeature), which is dragged to move it all and right-clicked:onSelectionDragStart/onSelectionDrag/onSelectionDragStop(withonNodeDrag*called as well) andonSelectionContextMenu.autoPanOnSelection: a box held at the pane’s edge pans the view, its corner staying on the same place in the graph. - Look:
elevateNodesOnSelect(default on) andelevateEdgesOnSelect(off) andzIndexMode('basic','auto','manual') asstackingFeature— a selected node, and what is inside it, is raised by 1000;colorMode('light','dark','system') ascolorModeFeature;defaultMarkerColor;connectionLineContainerStyle. - Accessibility and diagnostics:
nodesFocusable,disableKeyboardA11y, a node’s and an edge’s ownfocusable,ariaLabelConfig(descriptions nodes and edges point at, a live announcement of a keyboard move, labels for the controls, minimap and handles),autoPanOnNodeFocus— alla11yFeature;debug(debugFeature). Node.handles— where a node’s handles are, for an edge to meet before they are drawn and measured (server-rendered output, the first measure).interpolate: 'smooth'(smoothFeature, van Wijk and Nuij’s path).MiniMap’sinversePan.NodeToolbar‘snodeIdfor another node, or several, drawn at them in graph space.Controls’showInteractive/onInteractiveChange— a lock that switches dragging, connecting and selecting off and on over the canvas’s props.- New features, all in
allFeatures:a11yFeature,colorModeFeature,debugFeature,selectionRectFeature,smoothFeature,stackingFeature,zoomKeyFeature. A prop for one aFlowingerCorelacks says so in development, as the others do. nodeOriginandnode.origin. Where on a node itspositionis:[0, 0]top-left (default),[0.5, 0.5]the centre. A child’spositionis relative to its parent’s top-left, as in React Flow. Edges, hit testing, the minimap,fitView, extents, intersections and the resizer all use the drawn box.panActivationKeyCode— holding the key turns a drag into a pan — aspanKeyFeature(inallFeatures, soFlowingerCanvashas it; aFlowingerCoreis told in development that it does nothing without it). Off unless given: React Flow’s own default of'Space'is not applied.nodeDragThreshold, in pixels;0is none. NeedsdragFeature.easeon viewport moves (setViewport,fitView,setCenter,zoomTo…).MiniMap:nodeComponent,onNodeClick,zoomable,zoomStep,offsetScale;MiniMapNode.NodeResizeControl, one resize control (a handle or a line, on a side or a corner) withchildren;NodeResizeris eight of them.NodeResizer’snodeIdandautoScale.SimpleBezierEdgeandgetSimpleBezierPath,EdgeText,EdgeToolbar,experimental_useOnNodesChangeMiddlewareandexperimental_useOnEdgesChangeMiddleware, andviewportInitializedon the instance (a live getter).- The “pro” modules, free and separate entry points —
flowinger/history(useUndoRedo),flowinger/clipboard(useClipboard),flowinger/snaplines(useSnapLines,SnapLinesOverlay),flowinger/export(exportCanvasToSvg,exportCanvasToPng,downloadFile),flowinger/smart-edges(SmartEdge,getSmartEdgePath),flowinger/shapes(flowchart nodes) andflowinger/tree(useCollapsibleTree), or all of them fromflowinger/pro. They add nothing to the core unless imported. See the pro modules. scripts/audit-react-flow.mjsreports members named and implemented apart.
Changed
Section titled “Changed”FlowingerCanvas’s node position is a top-left corner everywhere.store.absolutePosition(andInternalNode.internals.positionAbsolute) is the node’s drawn top-left; with the defaultnodeOriginthis is what it always was.- Size budgets are 34 kB (whole canvas) and 19 kB (core), up from 27 / 17.5. Measured: 33.6 / 18.7. Each of the 39 props that were only names costs its own code, in the features that act on it; the core’s share is the wheel, the click distances, the two stacking hooks and the lock.
- Defaults that move, where React Flow’s are followed: a press on a handle is a connection only once the
pointer has travelled 1 px; a drop snaps to a handle within 20 graph units; clicking two handles connects them;
a selected node is raised by 1000; a box selection leaves a draggable rectangle round what it took; a node
that takes keyboard focus out of view is panned to. Where flowinger’s own behaviour was established it is
kept when the prop is left out — Shift still adds to a selection,
zoomOnScrolloff is still no zoom, and animated moves stay'linear'. ZIndexModeis'auto' | 'basic' | 'manual', as in React Flow (it was'auto' | 'manual').FitViewOptionsno longer repeatsease/interpolate, which it inherits fromSetViewportOptions.
MiniMap’s new props were spread onto the<svg>as unknown attributes, so React warned;NodeToolbar’snodeIddid the same on a<div>.NodeResizerignorednodeId.useClipboardasked the browser for clipboard permission on every paste (it readnavigator.clipboardon a keydown); it uses thecopy/cut/pasteevents. A copied child is placed in the copy of its parent, and is not offset twice.exportCanvasToSvgexported the visible view at the wrong size at any zoom but 1. It exports the whole diagram.useSnapLinesleft guides on screen for alignments it had not snapped to, compared nodes of different parents as one space, and ignorednodeOrigin;SnapLinesOverlaydrew in screen space, so its guides were wrong at any pan or zoom; and it only drew guides —snapNodeChangesapplies the snap.useCollapsibleTreerevealed what sat under a branch still collapsed when an ancestor was expanded.SmartEdgetreated its own end nodes as obstacles (so every edge ran the router), did not leave a handle the way it faced, and recomputed on every drag frame.- Shape nodes ignored the node’s
width/height, anddata.colorwas declared and unread.
0.4.0 - 2026-10-11
Section titled “0.4.0 - 2026-10-11”Panel,NodeToolbar,MiniMap,HandleandBaseEdgetake the attributes of their own element —id,title,role,aria-*,tabIndex,data-*. Not its event handlers, which the canvas’s own pointer and keyboard handling would lose to (a compile error, rather than a handler that quietly replaces a drag); a handle’sidis still its handle id; onBaseEdgethey land on the path. The engine’s classes, positioning and handlers win over yours.- A controlled view:
viewportandonViewportChange. Givenviewport, the canvas draws exactly it and moves nowhere on its own; a pan, a wheel zoom, a zoom button orfitViewasks throughonViewportChangewhere it would go, and the view changes whenviewportdoes. An animated move is followed frame by frame by an owner that applies each, and cut short if the owner moves the view itself. Withoutviewport,onViewportChangereports each move after it is made.defaultViewportis ignored whenviewportis given; in development, aviewportwith noonViewportChangesays it cannot move. sourcePositionandtargetPositionon a node, and React Flow’s built-in node types behind them. A node with no component of its own — notype, or onenodeTypesdoes not name — now has handles, as React Flow’sdefault,inputandoutputdo: a target ontargetPosition(default top), a source onsourcePosition(default bottom);inputhas only the source,outputonly the target,groupnone. A component of your own is handed both fields. Before, such a node had no handles at all and edges attached to it by direction. The handle sets are compared with React Flow’s own rendering.nodeTypes.defaultis used, as in React Flow. A node with notype, or atypenobody registered, is drawn by thedefaultyou register — before, only the built-in view was ever used for them.input,outputandgroupstay the built-ins unless registered. Compared with React Flow’s own rendering.- React Flow’s type names, for the types flowinger already has:
OnNodesChange,OnEdgesChange,OnConnect,OnConnectStart,OnConnectEnd,OnInit,OnMove*,OnNodeDrag,OnDelete,OnBeforeDelete,OnSelectionChangeFunc,NodeMouseHandler,EdgeMouseHandler,IsValidConnection,ReactFlowProps,ReactFlowInstance,ReactFlowJsonObject,DefaultEdgeOptions,CoordinateExtent,SnapGrid,ControlProps,ConnectionLineComponent,BezierEdgePropsand the other built-in edges’ props,GetBezierPathParamsand its two siblings,HandleConnection,DeleteElementsOptions,FitBoundsOptions,OnResizeand the other resize callbacks, and a few more — 59 in all. Types only, so nothing reaches a bundle.ReactFlowPropsandReactFlowInstanceare not generic, on purpose. Of React Flow’s 211 exports flowinger now has 158 (it had 99). useConnection(selector?)— the connection being dragged right now:fromNode/toNode,fromHandle/toHandle,isValid,from/to. The target is reported whether or not it would be accepted, so a node can mark an incompatible one.NoConnectionwhen none is in progress.useHandleConnections({ type, id, nodeId })—useNodeConnectionsnarrowed to one handle, under React Flow’s older name for it.idanddomAttributeson the canvas, for attributes flowinger has no prop for (never an event handler, orid/style/className/children/role/tabIndex, which the engine owns).
- A flick did not drag. A press that was released after one far move, with no move in between, left the node where it was: the move that crosses the drag threshold is delivered to whatever is under the pointer, and the node only ever saw the pointer once it was captured. The release now applies it.
fitViewdid nothing for a canvas mounted hidden. The prop framed the nodes once they were measured, and counted that as done even when the pane had no size yet — a canvas inside a closed tab, modal or accordion is 0 × 0, where framing is a no-op — so it never framed when shown. It now waits for a pane with a size, and frames then.- Types for
require. The package is"type": "module", so the one declaration file was typed as ESM even for arequireconsumer; TypeScript’snode16/nodenextresolution from CommonJS rejected it (publint and Are the Types Wrong: “masquerading as ESM”).exportsnow givesrequireits own declarations (dist/cjs/), and the build checks the packed tarball in CI.importand bundler resolution are unchanged. Affects every earlier release.
Changed
Section titled “Changed”- Test ids are React Flow’s. An edge’s
data-testidisrf__edge-<id>(it wasedge-<id>), and the canvas, each node,Controls,MiniMapandBackgroundnow carryrf__wrapper,rf__node-<id>,rf__controls,rf__minimapandrf__background— checked against the real library’s output — so tests that select on them carry over, as ones onreact-flow__*class names already did. If you selected an edge onedge-<id>, add the prefix. package.jsonexportsneststypesunder each ofimportandrequire, and exports./package.json. Resolution by tools that readexportsis unchanged; the tarball is about 12 kB larger for the second set of declarations.
0.4.0-rc.1 - 2026-10-10
Section titled “0.4.0-rc.1 - 2026-10-10”A release candidate, published to the next dist-tag. It carried what became 0.4.0, above, and was the
first run of the release pipeline itself — npm trusted publishing and the provenance attestation — before the
real release.
0.3.0 - 2026-09-22
Section titled “0.3.0 - 2026-09-22”getInternalNode(id)anduseInternalNode(id)— a node plusinternals.positionAbsoluteandinternals.z.useStoreApi()—getState()without subscribing, andsubscribe().ariaLabel,ariaRoleanddomAttributesonNodeandEdge.
0.2.0 - 2026-09-22
Section titled “0.2.0 - 2026-09-22”- Mouse events as
eventsFeature: double click, context menu, enter / move / leave on nodes, edges and the pane, andonPaneScroll. - The view moving:
defaultViewport,onMoveStart/onMove/onMoveEnd,useOnViewportChange, and thenowheelclass. - Edges:
interactionWidth,pathOptions(curvature,borderRadius),labelStyle, a box behind a label (labelShowBgand friends, asedgeLabelsFeature), theBezierEdge/StraightEdge/SmoothStepEdge/StepEdgecomponents,getEdgeCenter,getBezierEdgeCenter,updateEdgeData,getNodeConnections,getHandleConnections,isNode,isEdge. - Nodes: more fields on
NodeProps(selectable,draggable,deletable,dragging,dragHandle,parentId,zIndex,width,height),initialWidth/initialHeight,useUpdateNodeInternals. - Handles:
isConnectableStart,isConnectableEnd, and a handle’s ownisValidConnectionandonConnect. - Components:
Controlsposition,fitViewOptions,ControlButton;MiniMapstyling props andposition;BackgroundbgColorandpatternClassName;getViewportForBounds, exact to React Flow’s. NOTICE.md, crediting the few lines adapted from React Flow.
Changed
Section titled “Changed”- A node’s or edge’s own
selectablenow wins over the canvas’selementsSelectable, either way, as in React Flow. - A bezier edge’s label sits on the curve, not on the straight line between its ends.
0.1.0 - 2026-09-21
Section titled “0.1.0 - 2026-09-21”First release.
- Pan and zoom (drag, wheel, trackpad pinch, touch pinch, double click, keyboard),
fitView,translateExtent, and an instance API (setViewport,zoomTo,setCenter,fitBounds,screenToFlowPosition, node and edge getters and mutators). - Nodes as your own React components, with
Handles measured where they are really drawn; edges (bezier, straight, step, smoothstep, custom) with arrowheads, labels and animation; sub-flows (parentId,extent: 'parent',expandParent). - Controlled flows (
onNodesChange,applyNodeChanges,useNodesState,addEdge), selection and box selection, dragging with snapping and auto-pan, connecting and reconnecting, delete. Background,Controls,MiniMap,Panel,NodeToolbar,NodeResizer,EdgeLabelRenderer,ViewportPortal.- A small core and opt-in features (
FlowingerCore,FlowingerCanvas); about 15 kB gzipped with no features, about 23 kB with all of them. - Server rendering and hydration on React 18 and 19.