Config
Vue Flow allows you to configure zoom, graph and flow behavior. Configuration can be passed either as props to the VueFlow component or as options to the useVueFlow composable.
<!-- Pass configuration as props -->
<template>
<VueFlow :default-zoom="0.5" :max-zoom="4" :min-zoom="0.1" />
</template>
<script setup>
import { useVueFlow } from '@braks/vue-flow'
useVueFlow({
defaultZoom: 0.5,
maxZoom: 4,
minZoom: 0.1,
})
</script>
Updating Config
You can update the configuration at any point, either by having them bound as props or using the state values returned by useVueFlow.
<script setup>
const defaultZoom = ref(1)
onMounted(() => {
// change the default zoom value of the state
defaultZoom.value = 1
})
</script>
<template>
<VueFlow :default-zoom="defaultZoom" />
</template>
<script setup>
const { defaultZoom } = useVueFlow({
defaultZoom: 0.5,
})
onMounted(() => {
// change the default zoom value of the state
defaultZoom.value = 1
})
</script>
Basic Options
id optional
Type:
stringDetails:
Unique id of Vue Flow.
It is used for the lookup and injection of the state instance.
modelValue optional
Type:
ElementsDetails:
An array of elements (nodes + edges).
Use either the modelValue prop or nodes/edges separately. Do not mix them!
Example:
<script setup>
import { VueFlow } from '@braks/vue-flow'
const elements = ref([
{ id: '1', type: 'input', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 }, },
{ id: '3', label: 'Node 3', position: { x: 400, y: 100 } },
{ id: '4', type: 'output', label: 'Node 4', position: { x: 400, y: 200 } },
{ id: 'e1-3', source: '1', target: '3' },
{ id: 'e1-2', source: '1', target: '2', animated: true },
])
</script>
<template>
<div style="height: 300px">
<VueFlow v-model="elements" />
</div>
</template>
nodes optional
Type:
Node[]Details:
An array of nodes.
Use either the modelValue prop or nodes separately. Do not mix them!
Example:
<script setup>
import { VueFlow } from '@braks/vue-flow'
const nodes = ref([
{ id: '1', type: 'input', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 }, },
{ id: '3', label: 'Node 3', position: { x: 400, y: 100 } },
{ id: '4', type: 'output', label: 'Node 4', position: { x: 400, y: 200 } },
])
</script>
<template>
<div style="height: 300px">
<VueFlow :nodes="nodes" />
</div>
</template>
edges optional
Type:
Edge[]Details:
An array of edges.
Use either the modelValue prop or edges separately. Do not mix them!
Example:
<script setup>
import { VueFlow } from '@braks/vue-flow'
const nodes = ref([
{ id: '1', type: 'input', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 }, },
{ id: '3', label: 'Node 3', position: { x: 400, y: 100 } },
{ id: '4', type: 'output', label: 'Node 4', position: { x: 400, y: 200 } },
])
const edges = ref([
{ id: 'e1-3', source: '1', target: '3' },
{ id: 'e1-2', source: '1', target: '2', animated: true },
])
</script>
<template>
<div style="height: 300px">
<VueFlow :nodes="nodes" :edges="edges" />
</div>
</template>
node-types optional
Default:
DefaultNodeTypesDetails:
An object mapping node-type names to component definitions/name.
Example:
<script setup>
import { VueFlow } from '@braks/vue-flow'
import CustomNode from './CustomNode.vue'
const nodeTypes = {
custom: CustomNode,
}
const nodes = ref([
{ id: '1', type: 'custom', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 }, },
])
const edges = ref([
{ id: 'e1-2', source: '1', target: '2', animated: true },
])
</script>
<template>
<div style="height: 300px">
<VueFlow :nodes="nodes" :edges="edges" :node-types="nodeTypes" />
</div>
</template>
edge-types optional
Default:
DefaultEdgeTypesDetails:
An object mapping edge-type names to component definitions/name.
Example:
<script setup>
import { VueFlow } from '@braks/vue-flow'
import CustomEdge from './CustomEdge.vue'
const edgeTypes = {
custom: CustomEdge,
}
const nodes = ref([
{ id: '1', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 }, },
])
const edges = ref([
{ id: 'e1-2', type: 'custom', source: '1', target: '2', animated: true },
])
</script>
<template>
<div style="height: 300px">
<VueFlow :nodes="nodes" :edges="edges" :edge-types="edgeTypes" />
</div>
</template>
apply-default optional
Type:
booleanDefault:
trueDetails:
Enable/disable default state update handlers.
If you want to have full control of state changes, you can disable the default behavior and apply your own change handlers to the state.
Example:
<script setup>
import { VueFlow } from '@braks/vue-flow'
const nodes = ref([
{ id: '1', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 }, },
])
const edges = ref([
{ id: 'e1-2', type: 'custom', source: '1', target: '2', animated: true },
])
</script>
<template>
<div style="height: 300px">
<VueFlow :nodes="nodes" :edges="edges" :apply-default="false" />
</div>
</template>
connection-mode optional
Type:
ConnectionModeDefault:
ConnectionMode.LooseDetails:
If set to
looseall handles are treated as source handles (thus allowing for connections on target handles as well.)
connection-line-type optional
Type:
ConnectionLineTypeDefault:
ConnectionLineType.BezierDetails:
The path to use when drawing a connection-line (
bezier,step,smoothstep).When using a custom connection line this prop does nothing.
connection-line-style optional
Type:
CSSProperties|nullDetails:
Additional styles to add to the default connection-line.
fit-view-on-init optional
Type:
booleanDefault:
falseDetails:
Trigger fit view when viewport is mounted.
Viewport Options
zoom-activation-key-code optional
Type:
KeyCodeDefault:
MetaDetails:
Define a key which can be used to activate zoom.
Overwrites zoom-on-scroll or pan-on-scroll behavior as long as the key is pressed.
zoom-on-scroll optional
Type:
booleanDefault:
trueDetails:
Whether to allow zooming in and out when scrolling inside the Vue Flow container.
zoom-on-pinch optional
Type:
booleanDefault:
trueDetails:
Whether to allow zooming in and out when pinching (touch or trackpad) inside the Vue Flow container.
zoom-on-double-click optional
Type:
booleanDefault:
trueDetails:
Whether to allow zooming in and out when double-clicking (or tapping) inside the Vue Flow container.
pan-on-scroll optional
Type:
booleanDefault:
falseDetails:
Whether to allow panning inside the Vue Flow container.
Does not work together with
zoom-on-scrollbut will work together withzoom-activation-key-code.
pan-on-scroll-speed optional
Type:
numberDefault:
0.5
pan-on-scroll-mode optional
Type:
PanOnScrollModeDefault:
PanOnScrollMode.FreeDetails:
Specify on which axis panning is allowed (x, y or both).
pan-on-drag optional
Old name:
paneMovableType:
booleanDefault:
trueDetails:
Whether to allow moving the pane when dragging inside the Vue Flow container.
prevent-scrolling optional
Type:
booleanDefault:
trueDetails:
Enable this to prevent vue flow from scrolling inside its container, i.e. allow for the page to scroll.
no-wheel-class-name optional
Type:
stringDefault:
nowheelDetails:
Set a class name which prevents elements from triggering wheel-scroll events (thus disabling zoom/pan-scroll behavior on the element).
Useful if you want to allow for scrolling inside a node
no-pan-class-name optional
Type:
stringDefault:
nopanDetails:
Set a class name which prevents elements from triggering pan-scroll events.
min-zoom optional
Type:
numberDefault:
0.5
max-zoom optional
Type:
numberDefault:
2
default-zoom optional
Type:
numberDefault:
1
default-position optional
Type:
[x: number, y: number]Default:
[0, 0]Details:
Default viewport position on initial load.
translate-extent optional
Type:
CoordinateExtentDefault:
[
[Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],
[Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],
]
Details:
The area in which the viewport can be moved around.
Selection Options
selection-key-code optional
Type:
KeyCodeDefault:
ShiftDetails:
Define a key which can be used to activate the selection rect.
multi-selection-key-code optional
Type:
KeyCodeDefault:
MetaDetails:
Define a key which can be used to activate multi-selection.
Multi-selection can be used to select multiple nodes with clicks.
delete-key-code optional
Type:
KeyCodeDefault:
BackspaceDetails:
Define a key which can be used to activate remove elements from the pane.
Global Node Options
nodes-draggable optional
Type:
booleanDefault:
trueDetails:
Globally enable/disable dragging nodes.
Can be overwritten by setting
draggableon a specific node element.Example:
<script setup>
const elements = ref([
{ id: '1', label: 'Node 1', position: { x: 250, y: 5 } },
// This will overwrite the globally set option of nodes-draggable
{ id: '2', draggable: true, label: 'Node 2', position: { x: 100, y: 100 } },
])
</script>
<template>
<VueFlow :nodes-draggable="false" />
</template>
nodes-connectable optional
Type:
booleanDefault:
trueDetails:
Globally enable/disable connecting nodes.
Can be overwritten by setting
connectableon a specific node element.Example:
<script setup>
const elements = ref([
{ id: '1', label: 'Node 1', position: { x: 250, y: 5 } },
// This will overwrite the globally set option of nodes-connectable
{ id: '2', connectable: true, label: 'Node 2', position: { x: 100, y: 100 } },
])
</script>
<template>
<VueFlow :nodes-connectable="false" />
</template>
nodes-extent optional
Type:
CoordinateExtentDefault:
[
[Number.NEGATIVE_INFINITY, Number.NEGATIVE_INFINITY],
[Number.POSITIVE_INFINITY, Number.POSITIVE_INFINITY],
]
Details:
The area in which nodes can be moved around.
Can be overwritten by setting
extenton a specific node element.Example:
<script setup>
const elements = ref([
{ id: '1', label: 'Node 1', position: { x: 250, y: 5 } },
// This will overwrite the globally set option of node-extent
{ id: '2', extent: [[-100, -100], [100, 100]], label: 'Node 2', position: { x: 100, y: 100 } },
])
</script>
<template>
<VueFlow />
</template>
select-nodes-on-drag optional
Type:
booleanDefault:
true
snap-to-grid optional
Type:
booleanDefault:
falseDetails:
If enabled, nodes will be placed and moved in a grid-like fashion.
snap-grid optional
Type:
SnapGridDefault:
[15, 15]Details:
If
snapToGridis enabled, nodes will be placed and moved in a grid-like fashion according to thesnapGridvalue.
Global Edge Options
edges-updatable optional
Type:
booleanDefault:
trueDetails:
Globally enable/disable updating edges.
Can be overwritten by setting
updatableon a specific edge element.Example:
<script setup>
const elements = ref([
{ id: '1', label: 'Node 1', position: { x: 250, y: 5 } },
{ id: '2', label: 'Node 2', position: { x: 100, y: 100 } },
{ id: 'e1-3', source: '1', target: '3' },
// Overwrites global edges-updatable config
{ id: 'e1-2', updatable: true, source: '1', target: '2', animated: true },
])
</script>
<template>
<VueFlow :edges-updatable="false" />
</template>
default-marker-color optional
Type:
stringDefault:
#b1b1b7Details:
The default color value which is used when presenting edge-markers (arrowheads).
edge-updater-radius optional
Type:
numberDefault:
10Details:
The radius at which an edge-updater can be triggered.
connect-on-click optional
Type:
booleanDefault:
trueDetails:
Allow edges to be created by clicking two handles in a row.
Useful if you want to enable creating edges on a touch device.
default-edge-options optional
Type:
DefaultEdgeOptionsDetails:
Default values when creating a new edge.
Does not work for the
addEdgeutility!
Global Element Options
only-render-visible-elements optional
Type:
booleanDefault:
falseDetails:
Skip rendering elements that are not visible currently (either hidden or outside the current pane dimensions).
elements-selectable optional
Type:
booleanDefault:
trueDetails:
Enable/disable selecting elements. This will also disable pointer-events in general.