How much of React Flow this covers
Measured, not recalled: scripts/audit-react-flow.mjs reads React Flow’s own type declarations. For what to do about the gaps, see Migrating from React Flow.
Flowinger keeps React Flow’s shape and names — ReactFlow, ReactFlowProvider, useReactFlow, useStore,
Handle, Position, Background, MarkerType, useNodesState, applyNodeChanges, addEdge, the Node /
Edge / NodeProps types — and the react-flow__* class names on the elements it draws. It began as the part of the
API an app like QueryLens uses (which it replaced, with identical
geometry and its whole end-to-end suite passing), and has since grown to name all of the rest.
Naming something is not the same as doing it, and this page counts the two apart.
The numbers
Section titled “The numbers”Measured against @xyflow/react 12.11.6’s own type declarations
(node scripts/audit-react-flow.mjs <path to its dist/esm/index.d.ts>, after pnpm build):
| React Flow has | Flowinger names | …and does | |
|---|---|---|---|
| Exports (components, hooks, functions, types) | 211 | 211 | — |
ReactFlow props |
119 | 119 | 119 |
Instance (useReactFlow()) |
32 | 32 | 32 |
Node, Edge, NodeProps, EdgeProps fields |
22 / 20 / 13 / 20 | all | all |
Handle, Background, BaseEdge props |
6 / 6 / 9 | all | all |
MiniMap, Controls, NodeResizer, NodeToolbar props |
18 / 9 / 16 / 4 | all | all |
fitView options |
8 | 8 | 8 |
| All members counted | 302 | 302 | 302 |
A name that compiles and does nothing is worse than a missing one — it fails silently, in production, in someone
else’s app — so the audit counts the two apart: a member whose doc comment says @unimplemented is named, not
done, and a canvas given one says so in development. None are, now. The mechanism stays as a ratchet: a
test keeps the tags and the warning table the same list, so a name added before it works is a visible exception
and not a quiet one.
“Does” is a feature behind the name, not identical to React Flow: counts are not weights, and the places the behaviour differs on purpose are listed below and in Migrating from React Flow.
Accepted, not implemented
Section titled “Accepted, not implemented”Nothing is. (proOptions and attributionPosition are accepted and do nothing by design: there is no
attribution to hide, so the end state they ask for is the one you have.)
Most of what did nothing in the first measurement is a feature — a prop that needs the feature that acts on it
says which, once, in development (Features). New ones: a11yFeature, stackingFeature,
colorModeFeature, selectionRectFeature, zoomKeyFeature, smoothFeature and debugFeature, all in
FlowingerCanvas.
Differences on purpose
Section titled “Differences on purpose”ReactFlowPropsandReactFlowInstanceare not generic. The canvas and the instance are not, soReactFlowInstance<MyNode>is an error rather than a type argument quietly ignored.onConnectEndis given aConnectEndState({ connection, isValid }), notFinalConnectionState. The type is exported under React Flow’s name, but is not what the callback receives, so a handler annotated with it is a compile error rather than a quietly wrong shape.useReactFlow()returns one object for the life of the provider.viewportInitializedon it is a live getter, so it is current when you read it — but, as the object never changes, flipping it does not re-render you. UseonInitoruseNodesInitialized()to react to it.useStorereads ten fields, not React Flow’s whole internal store, anduseStoreApi()hasgetStateandsubscribebut nosetState.Panel,NodeToolbar,MiniMap,HandleandBaseEdgetake their element’s attributes —id,title,role,aria-*,tabIndex,data-*— but not its event handlers, which the canvas’s own pointer and keyboard handling would lose to; a handle’sidstays its handle id, and onBaseEdgethey land on the path. The engine’s own classes, positioning and handlers win over yours.- Where a prop’s default is not React Flow’s, on purpose:
multiSelectionKeyCodeleft out lets Shift add to a selection as well as Control and ⌘;zoomActivationKeyCodeleft out leaveszoomOnScrolloff meaning no zoom;interpolateis'linear'(React Flow’s is'smooth';smoothFeaturehas it when asked);Controls’showInteractiveis off (React Flow’s is on);colorModeleft out adds no class and keeps the library’s palette, andcolorModeonly reaches what is drawn inside the canvas (aMiniMaporControlsoutside it takes the--flowinger-*variables from an ancestor as before). - Defaults differ, and that is the part a compiler will not find: nodes are not draggable, connectable or
selectable until you say so (
nodesDraggable,nodesConnectable,elementsSelectable— React Flow’s are on),minZoomis0.05(React Flow’s0.5),fitViewkeeps a 40 px margin unless you pass apaddingratio (React Flow’s is0.1), andpanActivationKeyCodeis off unless given (React Flow’s is'Space') and needspanKeyFeature, whichFlowingerCanvashas. Nodes and edges do not get React Flow’srole,aria-roledescriptionor live region.
docs/migrating-from-react-flow.md is the checklist, with each default read from React Flow’s source.
Beyond React Flow
Section titled “Beyond React Flow”Flowinger has 52 exports React Flow does not — the feature objects (dragFeature,
panKeyFeature…) and what they need — and the pro modules: undo/redo, copy and paste, snap guides,
export, smart routing, flowchart shapes and a collapsible tree. Those are in separate entry points
(flowinger/history, flowinger/clipboard…) and add nothing to the core’s size unless imported.