@xyflow/vue 2.0.0-next.4 → 2.0.0-next.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js CHANGED
@@ -115,7 +115,7 @@ var export_helper_default = (sfc, props) => {
115
115
  };
116
116
  //#endregion
117
117
  //#region src/components/Background/Background.vue
118
- const _sfc_main$24 = /* @__PURE__ */ (0, vue.defineComponent)({
118
+ const _sfc_main$25 = /* @__PURE__ */ (0, vue.defineComponent)({
119
119
  name: "Background",
120
120
  compatConfig: { MODE: 3 },
121
121
  props: {
@@ -200,7 +200,7 @@ const _sfc_main$24 = /* @__PURE__ */ (0, vue.defineComponent)({
200
200
  return __returned__;
201
201
  }
202
202
  });
203
- const _hoisted_1$14 = { class: "vue-flow__background vue-flow__container" };
203
+ const _hoisted_1$15 = { class: "vue-flow__background vue-flow__container" };
204
204
  const _hoisted_2$4 = [
205
205
  "id",
206
206
  "x",
@@ -214,8 +214,8 @@ const _hoisted_3$3 = [
214
214
  "y",
215
215
  "fill"
216
216
  ];
217
- function _sfc_render$24(_ctx, _cache, $props, $setup, $data, $options) {
218
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_1$14, [
217
+ function _sfc_render$25(_ctx, _cache, $props, $setup, $data, $options) {
218
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("svg", _hoisted_1$15, [
219
219
  (0, vue.renderSlot)(_ctx.$slots, "pattern-container", { id: $setup.patternId }, () => [(0, vue.createElementVNode)("pattern", {
220
220
  id: $setup.patternId,
221
221
  x: $setup.viewport.x % $setup.background.scaledGap[0],
@@ -248,10 +248,10 @@ function _sfc_render$24(_ctx, _cache, $props, $setup, $data, $options) {
248
248
  (0, vue.renderSlot)(_ctx.$slots, "default", { id: $setup.patternId })
249
249
  ]);
250
250
  }
251
- var Background_default = /* @__PURE__ */ export_helper_default(_sfc_main$24, [["render", _sfc_render$24], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Background/Background.vue"]]);
251
+ var Background_default = /* @__PURE__ */ export_helper_default(_sfc_main$25, [["render", _sfc_render$25], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Background/Background.vue"]]);
252
252
  //#endregion
253
253
  //#region src/components/Controls/ControlButton.vue
254
- const _sfc_main$23 = /* @__PURE__ */ (0, vue.defineComponent)({
254
+ const _sfc_main$24 = /* @__PURE__ */ (0, vue.defineComponent)({
255
255
  name: "ControlButton",
256
256
  compatConfig: { MODE: 3 },
257
257
  props: {
@@ -275,12 +275,12 @@ const _sfc_main$23 = /* @__PURE__ */ (0, vue.defineComponent)({
275
275
  return __returned__;
276
276
  }
277
277
  });
278
- const _hoisted_1$13 = [
278
+ const _hoisted_1$14 = [
279
279
  "disabled",
280
280
  "aria-label",
281
281
  "title"
282
282
  ];
283
- function _sfc_render$23(_ctx, _cache, $props, $setup, $data, $options) {
283
+ function _sfc_render$24(_ctx, _cache, $props, $setup, $data, $options) {
284
284
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("button", {
285
285
  type: "button",
286
286
  class: "vue-flow__controls-button",
@@ -288,9 +288,9 @@ function _sfc_render$23(_ctx, _cache, $props, $setup, $data, $options) {
288
288
  "aria-label": $props.label,
289
289
  title: $props.label,
290
290
  onClick: _cache[0] || (_cache[0] = ($event) => _ctx.$emit("click", $event))
291
- }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 8, _hoisted_1$13);
291
+ }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 8, _hoisted_1$14);
292
292
  }
293
- var ControlButton_default = /* @__PURE__ */ export_helper_default(_sfc_main$23, [["render", _sfc_render$23], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Controls/ControlButton.vue"]]);
293
+ var ControlButton_default = /* @__PURE__ */ export_helper_default(_sfc_main$24, [["render", _sfc_render$24], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Controls/ControlButton.vue"]]);
294
294
  //#endregion
295
295
  //#region src/composables/storeToRefs.ts
296
296
  /**
@@ -319,7 +319,7 @@ function storeToRefs(store) {
319
319
  * @param params
320
320
  */
321
321
  function useDrag(params) {
322
- const { panBy, getInternalNode, removeSelectedNodes, removeSelectedEdges, updateNodePositions, getNodes, getEdges } = useVueFlow();
322
+ const { panBy, getInternalNode, addSelectedNodes, removeSelectedNodes, removeSelectedEdges, updateNodePositions, getNodes, getEdges } = useVueFlow();
323
323
  const store = useStore();
324
324
  const { nodeLookup } = store;
325
325
  const { onStart, onDrag, onStop, onClick, el, disabled, id, selectable, dragHandle } = params;
@@ -391,6 +391,13 @@ function useDrag(params) {
391
391
  },
392
392
  autoPanSpeed: store.autoPanSpeed
393
393
  }),
394
+ onNodeMouseDown: (nodeId) => {
395
+ const node = getInternalNode(nodeId);
396
+ if (!node) return;
397
+ store.nodesSelectionActive = false;
398
+ if (!node.selected) addSelectedNodes([node]);
399
+ else if (store.multiSelectionActive) removeSelectedNodes([node]);
400
+ },
394
401
  onDragStart: (event, _dragItems, node, nodes) => {
395
402
  dragFired = true;
396
403
  dragging.value = true;
@@ -1720,7 +1727,7 @@ function useWatchProps(models, props, handle) {
1720
1727
  }
1721
1728
  //#endregion
1722
1729
  //#region src/components/Panel/Panel.vue
1723
- const _sfc_main$22 = /* @__PURE__ */ (0, vue.defineComponent)({
1730
+ const _sfc_main$23 = /* @__PURE__ */ (0, vue.defineComponent)({
1724
1731
  name: "Panel",
1725
1732
  compatConfig: { MODE: 3 },
1726
1733
  props: {
@@ -1750,15 +1757,15 @@ const _sfc_main$22 = /* @__PURE__ */ (0, vue.defineComponent)({
1750
1757
  return __returned__;
1751
1758
  }
1752
1759
  });
1753
- const _hoisted_1$12 = ["aria-label"];
1754
- function _sfc_render$22(_ctx, _cache, $props, $setup, $data, $options) {
1760
+ const _hoisted_1$13 = ["aria-label"];
1761
+ function _sfc_render$23(_ctx, _cache, $props, $setup, $data, $options) {
1755
1762
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
1756
1763
  class: (0, vue.normalizeClass)(["vue-flow__panel", $setup.positionClasses]),
1757
1764
  "aria-label": $props.label ?? void 0,
1758
1765
  style: (0, vue.normalizeStyle)({ pointerEvents: $setup.userSelectionActive ? "none" : "all" })
1759
- }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 14, _hoisted_1$12);
1766
+ }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 14, _hoisted_1$13);
1760
1767
  }
1761
- var Panel_default = /* @__PURE__ */ export_helper_default(_sfc_main$22, [["render", _sfc_render$22], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Panel/Panel.vue"]]);
1768
+ var Panel_default = /* @__PURE__ */ export_helper_default(_sfc_main$23, [["render", _sfc_render$23], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Panel/Panel.vue"]]);
1762
1769
  //#endregion
1763
1770
  //#region src/components/Controls/icons.ts
1764
1771
  function icon(viewBox, d) {
@@ -1775,7 +1782,7 @@ const Lock = icon("0 0 25 32", "M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 1
1775
1782
  const Unlock = icon("0 0 25 32", "M21.333 10.667H19.81V7.619C19.81 3.429 16.38 0 12.19 0c-4.114 1.828-1.37 2.133.305 2.438 1.676.305 4.42 2.59 4.42 5.181v3.048H3.047A3.056 3.056 0 000 13.714v15.238A3.056 3.056 0 003.048 32h18.285a3.056 3.056 0 003.048-3.048V13.714a3.056 3.056 0 00-3.048-3.047zM12.19 24.533a3.056 3.056 0 01-3.047-3.047 3.056 3.056 0 013.047-3.048 3.056 3.056 0 013.048 3.048 3.056 3.056 0 01-3.048 3.047z");
1776
1783
  //#endregion
1777
1784
  //#region src/components/Controls/Controls.vue
1778
- const _sfc_main$21 = /* @__PURE__ */ (0, vue.defineComponent)({
1785
+ const _sfc_main$22 = /* @__PURE__ */ (0, vue.defineComponent)({
1779
1786
  name: "Controls",
1780
1787
  compatConfig: { MODE: 3 },
1781
1788
  props: {
@@ -1885,7 +1892,7 @@ const _sfc_main$21 = /* @__PURE__ */ (0, vue.defineComponent)({
1885
1892
  return __returned__;
1886
1893
  }
1887
1894
  });
1888
- function _sfc_render$21(_ctx, _cache, $props, $setup, $data, $options) {
1895
+ function _sfc_render$22(_ctx, _cache, $props, $setup, $data, $options) {
1889
1896
  return (0, vue.openBlock)(), (0, vue.createBlock)($setup["Panel"], {
1890
1897
  class: "vue-flow__controls",
1891
1898
  position: $props.position,
@@ -1932,10 +1939,10 @@ function _sfc_render$21(_ctx, _cache, $props, $setup, $data, $options) {
1932
1939
  _: 3
1933
1940
  }, 8, ["position", "label"]);
1934
1941
  }
1935
- var Controls_default = /* @__PURE__ */ export_helper_default(_sfc_main$21, [["render", _sfc_render$21], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Controls/Controls.vue"]]);
1942
+ var Controls_default = /* @__PURE__ */ export_helper_default(_sfc_main$22, [["render", _sfc_render$22], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Controls/Controls.vue"]]);
1936
1943
  //#endregion
1937
1944
  //#region src/components/Edges/EdgeText.vue
1938
- const _sfc_main$20 = /* @__PURE__ */ (0, vue.defineComponent)({
1945
+ const _sfc_main$21 = /* @__PURE__ */ (0, vue.defineComponent)({
1939
1946
  name: "EdgeText",
1940
1947
  compatConfig: { MODE: 3 },
1941
1948
  props: {
@@ -2015,7 +2022,7 @@ const _sfc_main$20 = /* @__PURE__ */ (0, vue.defineComponent)({
2015
2022
  return __returned__;
2016
2023
  }
2017
2024
  });
2018
- const _hoisted_1$11 = ["transform", "visibility"];
2025
+ const _hoisted_1$12 = ["transform", "visibility"];
2019
2026
  const _hoisted_2$3 = [
2020
2027
  "width",
2021
2028
  "height",
@@ -2025,7 +2032,7 @@ const _hoisted_2$3 = [
2025
2032
  "ry"
2026
2033
  ];
2027
2034
  const _hoisted_3$2 = ["y"];
2028
- function _sfc_render$20(_ctx, _cache, $props, $setup, $data, $options) {
2035
+ function _sfc_render$21(_ctx, _cache, $props, $setup, $data, $options) {
2029
2036
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("g", {
2030
2037
  transform: $setup.transform,
2031
2038
  visibility: $setup.box.width ? "visible" : "hidden",
@@ -2046,12 +2053,12 @@ function _sfc_render$20(_ctx, _cache, $props, $setup, $data, $options) {
2046
2053
  y: $setup.box.height / 2,
2047
2054
  dy: "0.3em",
2048
2055
  style: $props.labelStyle
2049
- }), [(0, vue.renderSlot)(_ctx.$slots, "default", {}, () => [typeof $props.label !== "string" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)($props.label), { key: 0 })) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [(0, vue.createTextVNode)((0, vue.toDisplayString)($props.label), 1)], 64))])], 16, _hoisted_3$2)], 8, _hoisted_1$11);
2056
+ }), [(0, vue.renderSlot)(_ctx.$slots, "default", {}, () => [typeof $props.label !== "string" ? ((0, vue.openBlock)(), (0, vue.createBlock)((0, vue.resolveDynamicComponent)($props.label), { key: 0 })) : ((0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, { key: 1 }, [(0, vue.createTextVNode)((0, vue.toDisplayString)($props.label), 1)], 64))])], 16, _hoisted_3$2)], 8, _hoisted_1$12);
2050
2057
  }
2051
- var EdgeText_default = /* @__PURE__ */ export_helper_default(_sfc_main$20, [["render", _sfc_render$20], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Edges/EdgeText.vue"]]);
2058
+ var EdgeText_default = /* @__PURE__ */ export_helper_default(_sfc_main$21, [["render", _sfc_render$21], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Edges/EdgeText.vue"]]);
2052
2059
  //#endregion
2053
2060
  //#region src/components/Edges/BaseEdge.vue
2054
- const _sfc_main$19 = /* @__PURE__ */ (0, vue.defineComponent)({
2061
+ const _sfc_main$20 = /* @__PURE__ */ (0, vue.defineComponent)({
2055
2062
  name: "BaseEdge",
2056
2063
  inheritAttrs: false,
2057
2064
  compatConfig: { MODE: 3 },
@@ -2134,14 +2141,14 @@ const _sfc_main$19 = /* @__PURE__ */ (0, vue.defineComponent)({
2134
2141
  return __returned__;
2135
2142
  }
2136
2143
  });
2137
- const _hoisted_1$10 = [
2144
+ const _hoisted_1$11 = [
2138
2145
  "id",
2139
2146
  "d",
2140
2147
  "marker-end",
2141
2148
  "marker-start"
2142
2149
  ];
2143
2150
  const _hoisted_2$2 = ["d", "stroke-width"];
2144
- function _sfc_render$19(_ctx, _cache, $props, $setup, $data, $options) {
2151
+ function _sfc_render$20(_ctx, _cache, $props, $setup, $data, $options) {
2145
2152
  return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, [
2146
2153
  (0, vue.createElementVNode)("path", (0, vue.mergeProps)($setup.attrs, {
2147
2154
  id: $props.id,
@@ -2150,7 +2157,7 @@ function _sfc_render$19(_ctx, _cache, $props, $setup, $data, $options) {
2150
2157
  class: "vue-flow__edge-path",
2151
2158
  "marker-end": $props.markerEnd,
2152
2159
  "marker-start": $props.markerStart
2153
- }), null, 16, _hoisted_1$10),
2160
+ }), null, 16, _hoisted_1$11),
2154
2161
  $props.interactionWidth ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("path", {
2155
2162
  key: 0,
2156
2163
  ref: "interactionEl",
@@ -2183,7 +2190,7 @@ function _sfc_render$19(_ctx, _cache, $props, $setup, $data, $options) {
2183
2190
  ])) : (0, vue.createCommentVNode)("v-if", true)
2184
2191
  ], 64);
2185
2192
  }
2186
- var BaseEdge_default = /* @__PURE__ */ export_helper_default(_sfc_main$19, [["render", _sfc_render$19], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Edges/BaseEdge.vue"]]);
2193
+ var BaseEdge_default = /* @__PURE__ */ export_helper_default(_sfc_main$20, [["render", _sfc_render$20], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Edges/BaseEdge.vue"]]);
2187
2194
  //#endregion
2188
2195
  //#region src/components/Edges/utils.ts
2189
2196
  /**
@@ -2251,7 +2258,7 @@ const BezierEdge = (0, vue.defineComponent)({
2251
2258
  });
2252
2259
  //#endregion
2253
2260
  //#region src/components/Edges/EdgeLabelRenderer.vue
2254
- const _sfc_main$18 = /* @__PURE__ */ (0, vue.defineComponent)({
2261
+ const _sfc_main$19 = /* @__PURE__ */ (0, vue.defineComponent)({
2255
2262
  name: "EdgeLabelRenderer",
2256
2263
  compatConfig: { MODE: 3 },
2257
2264
  setup(__props, { expose: __expose }) {
@@ -2268,17 +2275,17 @@ const _sfc_main$18 = /* @__PURE__ */ (0, vue.defineComponent)({
2268
2275
  return __returned__;
2269
2276
  }
2270
2277
  });
2271
- const _hoisted_1$9 = {
2278
+ const _hoisted_1$10 = {
2272
2279
  height: "0",
2273
2280
  width: "0"
2274
2281
  };
2275
- function _sfc_render$18(_ctx, _cache, $props, $setup, $data, $options) {
2276
- return (0, vue.openBlock)(), (0, vue.createElementBlock)("svg", null, [((0, vue.openBlock)(), (0, vue.createElementBlock)("foreignObject", _hoisted_1$9, [((0, vue.openBlock)(), (0, vue.createBlock)(vue.Teleport, {
2282
+ function _sfc_render$19(_ctx, _cache, $props, $setup, $data, $options) {
2283
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)("svg", null, [((0, vue.openBlock)(), (0, vue.createElementBlock)("foreignObject", _hoisted_1$10, [((0, vue.openBlock)(), (0, vue.createBlock)(vue.Teleport, {
2277
2284
  to: $setup.teleportTarget,
2278
2285
  disabled: !$setup.teleportTarget
2279
2286
  }, [(0, vue.renderSlot)(_ctx.$slots, "default")], 8, ["to", "disabled"]))]))]);
2280
2287
  }
2281
- var EdgeLabelRenderer_default = /* @__PURE__ */ export_helper_default(_sfc_main$18, [["render", _sfc_render$18], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Edges/EdgeLabelRenderer.vue"]]);
2288
+ var EdgeLabelRenderer_default = /* @__PURE__ */ export_helper_default(_sfc_main$19, [["render", _sfc_render$19], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Edges/EdgeLabelRenderer.vue"]]);
2282
2289
  //#endregion
2283
2290
  //#region src/components/Edges/SimpleBezierEdge.ts
2284
2291
  function getControl({ pos, x1, y1, x2, y2 }) {
@@ -2487,7 +2494,7 @@ const StraightEdge = (0, vue.defineComponent)({
2487
2494
  });
2488
2495
  //#endregion
2489
2496
  //#region src/components/Handle/Handle.vue
2490
- const _sfc_main$17 = /* @__PURE__ */ (0, vue.defineComponent)({
2497
+ const _sfc_main$18 = /* @__PURE__ */ (0, vue.defineComponent)({
2491
2498
  name: "Handle",
2492
2499
  compatConfig: { MODE: 3 },
2493
2500
  props: {
@@ -2659,8 +2666,8 @@ const _sfc_main$17 = /* @__PURE__ */ (0, vue.defineComponent)({
2659
2666
  return __returned__;
2660
2667
  }
2661
2668
  });
2662
- const _hoisted_1$8 = ["aria-label"];
2663
- function _sfc_render$17(_ctx, _cache, $props, $setup, $data, $options) {
2669
+ const _hoisted_1$9 = ["aria-label"];
2670
+ function _sfc_render$18(_ctx, _cache, $props, $setup, $data, $options) {
2664
2671
  return (0, vue.openBlock)(), (0, vue.createElementBlock)("div", (0, vue.mergeProps)({ ref: "handle" }, $setup.handleDataIds, {
2665
2672
  "aria-label": $setup.store.ariaLabelConfig["handle.ariaLabel"],
2666
2673
  class: ["vue-flow__handle", [
@@ -2674,9 +2681,84 @@ function _sfc_render$17(_ctx, _cache, $props, $setup, $data, $options) {
2674
2681
  onMousedown: $setup.onPointerDown,
2675
2682
  onTouchstartPassive: $setup.onPointerDown,
2676
2683
  onClick: $setup.onClick
2677
- }), [(0, vue.renderSlot)(_ctx.$slots, "default", { id: $props.id })], 16, _hoisted_1$8);
2684
+ }), [(0, vue.renderSlot)(_ctx.$slots, "default", { id: $props.id })], 16, _hoisted_1$9);
2678
2685
  }
2679
- var Handle_default = /* @__PURE__ */ export_helper_default(_sfc_main$17, [["render", _sfc_render$17], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Handle/Handle.vue"]]);
2686
+ var Handle_default = /* @__PURE__ */ export_helper_default(_sfc_main$18, [["render", _sfc_render$18], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/Handle/Handle.vue"]]);
2687
+ //#endregion
2688
+ //#region src/components/EdgeToolbar/EdgeToolbar.vue
2689
+ const _sfc_main$17 = /* @__PURE__ */ (0, vue.defineComponent)({
2690
+ name: "EdgeToolbar",
2691
+ compatConfig: { MODE: 3 },
2692
+ inheritAttrs: false,
2693
+ props: {
2694
+ edgeId: {
2695
+ type: String,
2696
+ required: true
2697
+ },
2698
+ x: {
2699
+ type: Number,
2700
+ required: true
2701
+ },
2702
+ y: {
2703
+ type: Number,
2704
+ required: true
2705
+ },
2706
+ isVisible: {
2707
+ type: Boolean,
2708
+ required: false,
2709
+ default: void 0
2710
+ },
2711
+ alignX: {
2712
+ type: String,
2713
+ required: false,
2714
+ default: "center"
2715
+ },
2716
+ alignY: {
2717
+ type: String,
2718
+ required: false,
2719
+ default: "center"
2720
+ }
2721
+ },
2722
+ setup(__props, { expose: __expose }) {
2723
+ __expose();
2724
+ const props = __props;
2725
+ const { viewport } = useVueFlow();
2726
+ const { edgeLookup } = useStore();
2727
+ const edge = (0, vue.computed)(() => edgeLookup.get(props.edgeId));
2728
+ const __returned__ = {
2729
+ props,
2730
+ viewport,
2731
+ edgeLookup,
2732
+ edge,
2733
+ isActive: (0, vue.computed)(() => typeof props.isVisible === "boolean" ? props.isVisible : edge.value?.selected),
2734
+ wrapperStyle: (0, vue.computed)(() => ({
2735
+ position: "absolute",
2736
+ transform: (0, _xyflow_system.getEdgeToolbarTransform)(props.x, props.y, viewport.value.zoom, props.alignX, props.alignY),
2737
+ zIndex: (edge.value?.zIndex ?? 0) + 1,
2738
+ pointerEvents: "all",
2739
+ transformOrigin: "0 0"
2740
+ })),
2741
+ EdgeLabelRenderer: EdgeLabelRenderer_default
2742
+ };
2743
+ Object.defineProperty(__returned__, "__isScriptSetup", {
2744
+ enumerable: false,
2745
+ value: true
2746
+ });
2747
+ return __returned__;
2748
+ }
2749
+ });
2750
+ const _hoisted_1$8 = ["data-id"];
2751
+ function _sfc_render$17(_ctx, _cache, $props, $setup, $data, $options) {
2752
+ return $setup.isActive ? ((0, vue.openBlock)(), (0, vue.createBlock)($setup["EdgeLabelRenderer"], { key: 0 }, {
2753
+ default: (0, vue.withCtx)(() => [(0, vue.createElementVNode)("div", (0, vue.mergeProps)(_ctx.$attrs, {
2754
+ style: $setup.wrapperStyle,
2755
+ "data-id": $setup.edge?.id ?? "",
2756
+ class: "vue-flow__edge-toolbar"
2757
+ }), [(0, vue.renderSlot)(_ctx.$slots, "default")], 16, _hoisted_1$8)]),
2758
+ _: 3
2759
+ })) : (0, vue.createCommentVNode)("v-if", true);
2760
+ }
2761
+ var EdgeToolbar_default = /* @__PURE__ */ export_helper_default(_sfc_main$17, [["render", _sfc_render$17], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/EdgeToolbar/EdgeToolbar.vue"]]);
2680
2762
  //#endregion
2681
2763
  //#region src/components/MiniMap/types.ts
2682
2764
  const Slots = Symbol("MiniMapSlots");
@@ -3958,70 +4040,6 @@ function useNodesInitialized(options = { includeHiddenNodes: false }) {
3958
4040
  return (0, vue.computed)(() => areNodesInitialized(nodeLookup, options.includeHiddenNodes));
3959
4041
  }
3960
4042
  //#endregion
3961
- //#region src/components/A11y/A11yDescriptions.vue
3962
- const _sfc_main$11 = /* @__PURE__ */ (0, vue.defineComponent)({
3963
- name: "A11yDescriptions",
3964
- compatConfig: { MODE: 3 },
3965
- setup(__props, { expose: __expose }) {
3966
- __expose();
3967
- const { id } = useVueFlow();
3968
- const { disableKeyboardA11y, ariaLiveMessage, ariaLabelConfig } = storeToRefs(useStore());
3969
- const __returned__ = {
3970
- id,
3971
- disableKeyboardA11y,
3972
- ariaLiveMessage,
3973
- ariaLabelConfig,
3974
- get ARIA_EDGE_DESC_KEY() {
3975
- return ARIA_EDGE_DESC_KEY;
3976
- },
3977
- get ARIA_LIVE_MESSAGE() {
3978
- return ARIA_LIVE_MESSAGE;
3979
- },
3980
- get ARIA_NODE_DESC_KEY() {
3981
- return ARIA_NODE_DESC_KEY;
3982
- }
3983
- };
3984
- Object.defineProperty(__returned__, "__isScriptSetup", {
3985
- enumerable: false,
3986
- value: true
3987
- });
3988
- return __returned__;
3989
- }
3990
- });
3991
- const _hoisted_1$5 = ["id"];
3992
- const _hoisted_2 = ["id"];
3993
- const _hoisted_3 = ["id"];
3994
- function _sfc_render$11(_ctx, _cache, $props, $setup, $data, $options) {
3995
- return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, [
3996
- (0, vue.createElementVNode)("div", {
3997
- id: `${$setup.ARIA_NODE_DESC_KEY}-${$setup.id}`,
3998
- style: { "display": "none" }
3999
- }, (0, vue.toDisplayString)($setup.disableKeyboardA11y ? $setup.ariaLabelConfig["node.a11yDescription.default"] : $setup.ariaLabelConfig["node.a11yDescription.keyboardDisabled"]), 9, _hoisted_1$5),
4000
- (0, vue.createElementVNode)("div", {
4001
- id: `${$setup.ARIA_EDGE_DESC_KEY}-${$setup.id}`,
4002
- style: { "display": "none" }
4003
- }, (0, vue.toDisplayString)($setup.ariaLabelConfig["edge.a11yDescription.default"]), 9, _hoisted_2),
4004
- !$setup.disableKeyboardA11y ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
4005
- key: 0,
4006
- id: `${$setup.ARIA_LIVE_MESSAGE}-${$setup.id}`,
4007
- "aria-live": "assertive",
4008
- "aria-atomic": "true",
4009
- style: {
4010
- "position": "absolute",
4011
- "width": "1px",
4012
- "height": "1px",
4013
- "margin": "-1px",
4014
- "border": "0",
4015
- "padding": "0",
4016
- "overflow": "hidden",
4017
- "clip": "rect(0px, 0px, 0px, 0px)",
4018
- "clip-path": "inset(100%)"
4019
- }
4020
- }, (0, vue.toDisplayString)($setup.ariaLiveMessage), 9, _hoisted_3)) : (0, vue.createCommentVNode)("v-if", true)
4021
- ], 64);
4022
- }
4023
- var A11yDescriptions_default = /* @__PURE__ */ export_helper_default(_sfc_main$11, [["render", _sfc_render$11], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/A11y/A11yDescriptions.vue"]]);
4024
- //#endregion
4025
4043
  //#region src/store/hooks.ts
4026
4044
  function createHooks() {
4027
4045
  return {
@@ -5075,6 +5093,101 @@ function useCreateVueFlow(options, signals) {
5075
5093
  return handle;
5076
5094
  }
5077
5095
  //#endregion
5096
+ //#region src/composables/setupVueFlow.ts
5097
+ /**
5098
+ * Create a VueFlow store, `provide` it to the current component's subtree, and return the instance — the
5099
+ * same API as {@link useVueFlow}. The Vue-native alternative to wrapping in `<VueFlowProvider>`: call it
5100
+ * in the component that renders `<VueFlow>` and you get the store's actions/getters/hooks in that same
5101
+ * `setup`, while the rendered `<VueFlow>` (and any `useVueFlow()`/`useStore()` below it) reuse the provided
5102
+ * store instead of creating their own.
5103
+ *
5104
+ * Must run in a component `setup` (it calls `provide`). Delegates to the same store factory as
5105
+ * `<VueFlowProvider>`, so one call scopes one store — host a single `<VueFlow>` per setup.
5106
+ *
5107
+ * @public
5108
+ * @param options - initial flow options (`id`, initial nodes/edges, defaults, …)
5109
+ * @returns the VueFlow instance (same shape `useVueFlow()` returns)
5110
+ * @example
5111
+ * ```vue
5112
+ * <script setup lang="ts">
5113
+ * import { setupVueFlow, VueFlow } from '@xyflow/vue'
5114
+ *
5115
+ * const { addEdges, fitView } = setupVueFlow()
5116
+ * <\/script>
5117
+ *
5118
+ * <template>
5119
+ * <VueFlow v-model:nodes="nodes" v-model:edges="edges" />
5120
+ * </template>
5121
+ * ```
5122
+ */
5123
+ function setupVueFlow(options) {
5124
+ return useCreateVueFlow(options).instance;
5125
+ }
5126
+ //#endregion
5127
+ //#region src/components/A11y/A11yDescriptions.vue
5128
+ const _sfc_main$11 = /* @__PURE__ */ (0, vue.defineComponent)({
5129
+ name: "A11yDescriptions",
5130
+ compatConfig: { MODE: 3 },
5131
+ setup(__props, { expose: __expose }) {
5132
+ __expose();
5133
+ const { id } = useVueFlow();
5134
+ const { disableKeyboardA11y, ariaLiveMessage, ariaLabelConfig } = storeToRefs(useStore());
5135
+ const __returned__ = {
5136
+ id,
5137
+ disableKeyboardA11y,
5138
+ ariaLiveMessage,
5139
+ ariaLabelConfig,
5140
+ get ARIA_EDGE_DESC_KEY() {
5141
+ return ARIA_EDGE_DESC_KEY;
5142
+ },
5143
+ get ARIA_LIVE_MESSAGE() {
5144
+ return ARIA_LIVE_MESSAGE;
5145
+ },
5146
+ get ARIA_NODE_DESC_KEY() {
5147
+ return ARIA_NODE_DESC_KEY;
5148
+ }
5149
+ };
5150
+ Object.defineProperty(__returned__, "__isScriptSetup", {
5151
+ enumerable: false,
5152
+ value: true
5153
+ });
5154
+ return __returned__;
5155
+ }
5156
+ });
5157
+ const _hoisted_1$5 = ["id"];
5158
+ const _hoisted_2 = ["id"];
5159
+ const _hoisted_3 = ["id"];
5160
+ function _sfc_render$11(_ctx, _cache, $props, $setup, $data, $options) {
5161
+ return (0, vue.openBlock)(), (0, vue.createElementBlock)(vue.Fragment, null, [
5162
+ (0, vue.createElementVNode)("div", {
5163
+ id: `${$setup.ARIA_NODE_DESC_KEY}-${$setup.id}`,
5164
+ style: { "display": "none" }
5165
+ }, (0, vue.toDisplayString)($setup.disableKeyboardA11y ? $setup.ariaLabelConfig["node.a11yDescription.default"] : $setup.ariaLabelConfig["node.a11yDescription.keyboardDisabled"]), 9, _hoisted_1$5),
5166
+ (0, vue.createElementVNode)("div", {
5167
+ id: `${$setup.ARIA_EDGE_DESC_KEY}-${$setup.id}`,
5168
+ style: { "display": "none" }
5169
+ }, (0, vue.toDisplayString)($setup.ariaLabelConfig["edge.a11yDescription.default"]), 9, _hoisted_2),
5170
+ !$setup.disableKeyboardA11y ? ((0, vue.openBlock)(), (0, vue.createElementBlock)("div", {
5171
+ key: 0,
5172
+ id: `${$setup.ARIA_LIVE_MESSAGE}-${$setup.id}`,
5173
+ "aria-live": "assertive",
5174
+ "aria-atomic": "true",
5175
+ style: {
5176
+ "position": "absolute",
5177
+ "width": "1px",
5178
+ "height": "1px",
5179
+ "margin": "-1px",
5180
+ "border": "0",
5181
+ "padding": "0",
5182
+ "overflow": "hidden",
5183
+ "clip": "rect(0px, 0px, 0px, 0px)",
5184
+ "clip-path": "inset(100%)"
5185
+ }
5186
+ }, (0, vue.toDisplayString)($setup.ariaLiveMessage), 9, _hoisted_3)) : (0, vue.createCommentVNode)("v-if", true)
5187
+ ], 64);
5188
+ }
5189
+ var A11yDescriptions_default = /* @__PURE__ */ export_helper_default(_sfc_main$11, [["render", _sfc_render$11], ["__file", "/Users/moritz/xyflow/xyflow/packages/vue/src/components/A11y/A11yDescriptions.vue"]]);
5190
+ //#endregion
5078
5191
  //#region src/composables/useOnInitHandler.ts
5079
5192
  /**
5080
5193
  * Composable that handles the initialization of the viewport.
@@ -7475,6 +7588,37 @@ function connectionLineProps() {
7475
7588
  };
7476
7589
  }
7477
7590
  //#endregion
7591
+ //#region src/utils/edges.ts
7592
+ const defaultOnError = (0, _xyflow_system.createDevWarn)("Vue Flow", "https://vueflow.dev/");
7593
+ /**
7594
+ * Adds a `Connection` (or a full `Edge`) to an edges array and returns a new array — generating the
7595
+ * edge id and skipping the add when an equivalent connection already exists. The pure helper to use
7596
+ * in an `@connect` handler against a `v-model:edges` array, e.g.
7597
+ * `edges.value = addEdge(connection, edges.value)`, with no store/instance access.
7598
+ *
7599
+ * Mirrors xyflow/react's + xyflow/svelte's `addEdge`.
7600
+ */
7601
+ function addEdge(edgeParams, edges, options = {}) {
7602
+ return (0, _xyflow_system.addEdge)(edgeParams, edges, {
7603
+ ...options,
7604
+ onError: options.onError ?? defaultOnError
7605
+ });
7606
+ }
7607
+ /**
7608
+ * Reconnects an existing edge to a new `Connection`, returning a new edges array. The pure,
7609
+ * controlled counterpart to the store action `useVueFlow().reconnectEdge` — use it in an
7610
+ * `@reconnect` handler against a `v-model:edges` array, e.g.
7611
+ * `edges.value = reconnectEdge(oldEdge, newConnection, edges.value)`.
7612
+ *
7613
+ * Mirrors xyflow/react's `reconnectEdge`.
7614
+ */
7615
+ function reconnectEdge(oldEdge, newConnection, edges, options = { shouldReplaceId: true }) {
7616
+ return (0, _xyflow_system.reconnectEdge)(oldEdge, newConnection, edges, {
7617
+ ...options,
7618
+ onError: options.onError ?? defaultOnError
7619
+ });
7620
+ }
7621
+ //#endregion
7478
7622
  exports.Background = Background_default;
7479
7623
  exports.BaseEdge = BaseEdge_default;
7480
7624
  exports.BezierEdge = BezierEdge;
@@ -7494,6 +7638,7 @@ exports.ControlButton = ControlButton_default;
7494
7638
  exports.Controls = Controls_default;
7495
7639
  exports.EdgeLabelRenderer = EdgeLabelRenderer_default;
7496
7640
  exports.EdgeText = EdgeText_default;
7641
+ exports.EdgeToolbar = EdgeToolbar_default;
7497
7642
  exports.ErrorCode = ErrorCode;
7498
7643
  exports.Handle = Handle_default;
7499
7644
  exports.MarkerType = MarkerType;
@@ -7537,6 +7682,7 @@ exports.VueFlow = VueFlow_default;
7537
7682
  exports.VueFlowError = VueFlowError;
7538
7683
  exports.VueFlowInjection = VueFlow;
7539
7684
  exports.VueFlowProvider = VueFlowProvider_default;
7685
+ exports.addEdge = addEdge;
7540
7686
  exports.applyChanges = applyChanges;
7541
7687
  exports.applyEdgeChanges = applyEdgeChanges;
7542
7688
  exports.applyNodeChanges = applyNodeChanges;
@@ -7671,12 +7817,14 @@ Object.defineProperty(exports, "pointToRendererPoint", {
7671
7817
  return _xyflow_system.pointToRendererPoint;
7672
7818
  }
7673
7819
  });
7820
+ exports.reconnectEdge = reconnectEdge;
7674
7821
  Object.defineProperty(exports, "rendererPointToPoint", {
7675
7822
  enumerable: true,
7676
7823
  get: function() {
7677
7824
  return _xyflow_system.rendererPointToPoint;
7678
7825
  }
7679
7826
  });
7827
+ exports.setupVueFlow = setupVueFlow;
7680
7828
  exports.storeToRefs = storeToRefs;
7681
7829
  exports.useConnection = useConnection;
7682
7830
  exports.useEdge = useEdge;