@blueking/flow-canvas 0.0.9 → 0.0.10
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.cjs.js +1 -1
- package/dist/index.d.ts +16 -2
- package/dist/index.esm.js +2015 -1786
- package/dist/style.css +1 -1
- package/package.json +3 -2
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Ke=Object.create;var Ie=Object.defineProperty;var Ze=Object.getOwnPropertyDescriptor;var Ye=Object.getOwnPropertyNames;var Qe=Object.getPrototypeOf,Je=Object.prototype.hasOwnProperty;var et=(r,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Ye(e))!Je.call(r,s)&&s!==o&&Ie(r,s,{get:()=>e[s],enumerable:!(t=Ze(e,s))||t.enumerable});return r};var we=(r,e,o)=>(o=r!=null?Ke(Qe(r)):{},et(e||!r||!r.__esModule?Ie(o,"default",{value:r,enumerable:!0}):o,r));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const n=require("vue"),tt=require("@antv/x6"),ot=require("@antv/x6-vue-shape"),nt=require("@antv/x6-plugin-selection"),st=require("@antv/x6-plugin-minimap");function rt(){return{version:"1.0",nodes:{},edges:{}}}class te extends Error{constructor(e){super(e),this.name="CanvasConstraintError"}}class $e extends Error{constructor(e){super(e),this.name="CanvasSchemaError"}}function ge(r,e,o){if(e.length===0){if(o===void 0)return;if(typeof o!="object"||o===null||Array.isArray(o))throw new Error("Root value of payload/extensions/meta must be an object or undefined");return o}const t=r?{...r}:{};let s=t;for(let a=0;a<e.length-1;a++){const c=e[a],l=s[c];l&&typeof l=="object"&&!Array.isArray(l)?s[c]={...l}:s[c]={},s=s[c]}const i=e[e.length-1];return o===void 0?delete s[i]:s[i]=o,t}function ke(r,e){switch(e.type){case"node.add":return it(r,e.node);case"node.move":return at(r,e.nodeId,e.position);case"node.remove":return lt(r,e.nodeId);case"node.update":return ct(r,e.nodeId,e.patch);case"node.set-payload":return dt(r,e.nodeId,e.path,e.value);case"node.set-extensions":return ut(r,e.nodeId,e.path,e.value);case"edge.add":return ft(r,e.edge);case"edge.remove":return pt(r,e.edgeId);case"edge.reconnect":return gt(r,e.edgeId,e.source,e.target);case"edge.update":return ht(r,e.edgeId,e.patch);case"edge.set-payload":return vt(r,e.edgeId,e.path,e.value);case"edge.label.update":return mt(r,e.edgeId,e.labelId,e.patch);case"model.set-meta":return yt(r,e.path,e.value);default:throw new te(`Unknown command type: ${e.type}`)}}function ue(r,e){const o=r.nodes[e];if(!o)throw new te(`Node "${e}" does not exist`);return o}function fe(r,e){const o=r.edges[e];if(!o)throw new te(`Edge "${e}" does not exist`);return o}function de(r,e,o){const t=r.nodes[e.nodeId];if(!t)throw new te(`${o} node "${e.nodeId}" does not exist`);if(e.portId&&t.ports&&!t.ports.some(i=>i.id===e.portId))throw new te(`${o} port "${e.portId}" not found on node "${e.nodeId}"`)}function he(r,e,o){return{...r,nodes:{...r.nodes,[e]:o}}}function ve(r,e,o){return{...r,edges:{...r.edges,[e]:o}}}function it(r,e){if(r.nodes[e.id])throw new te(`Node id "${e.id}" already exists`);return{...r,nodes:{...r.nodes,[e.id]:e}}}function at(r,e,o){const t=ue(r,e);return he(r,e,{...t,position:o})}function lt(r,e){ue(r,e);const{[e]:o,...t}=r.nodes,s={};for(const[i,a]of Object.entries(r.edges))a.source.nodeId!==e&&a.target.nodeId!==e&&(s[i]=a);return{...r,nodes:t,edges:s}}function ct(r,e,o){const t=ue(r,e);return he(r,e,{...t,...o,id:t.id})}function dt(r,e,o,t){const s=ue(r,e),i=ge(s.payload,o,t);return he(r,e,{...s,payload:i})}function ut(r,e,o,t){const s=ue(r,e),i=ge(s.extensions,o,t);return he(r,e,{...s,extensions:i})}function ft(r,e){if(r.edges[e.id])throw new te(`Edge id "${e.id}" already exists`);if(de(r,e.source,"Source"),de(r,e.target,"Target"),e.labels){const o=new Set;for(const t of e.labels){if(o.has(t.id))throw new te(`Duplicate label id "${t.id}" in edge "${e.id}"`);o.add(t.id)}}return{...r,edges:{...r.edges,[e.id]:e}}}function pt(r,e){fe(r,e);const{[e]:o,...t}=r.edges;return{...r,edges:t}}function gt(r,e,o,t){const s=fe(r,e),i=o??s.source,a=t??s.target;return de(r,i,"Source"),de(r,a,"Target"),ve(r,e,{...s,source:i,target:a})}function ht(r,e,o){const t=fe(r,e),s={...t,...o,id:t.id};return o.source&&de(r,s.source,"Source"),o.target&&de(r,s.target,"Target"),ve(r,e,s)}function vt(r,e,o,t){const s=fe(r,e),i=ge(s.payload,o,t);return ve(r,e,{...s,payload:i})}function mt(r,e,o,t){const s=fe(r,e);if(!s.labels)throw new te(`Edge "${e}" has no labels`);const i=s.labels.findIndex(c=>c.id===o);if(i===-1)throw new te(`Label "${o}" not found in edge "${e}"`);const a=[...s.labels];return a[i]={...a[i],...t,id:o},ve(r,e,{...s,labels:a})}function yt(r,e,o){const t=ge(r.meta,e,o);return{...r,meta:t}}function Fe(r,e){const o=e?.maxHistorySize??100,t=n.ref(r),s=[],i=[],a=n.ref(!1),c=n.ref(!1);function l(){a.value=s.length>0,c.value=i.length>0}function m(b){const M=t.value;let P=M;for(const A of b.commands)P=ke(P,A);if(!b.skipHistory){const A=e?.excludeCommandFromHistory,F=A?b.commands.filter(z=>!A(z)):b.commands;if(F.length>0){const z=F.length<b.commands.length?{...b,commands:F}:b;s.push({snapshot:M,envelope:z}),s.length>o&&s.shift(),i.length=0}}return t.value=P,l(),P}function f(){const b=s.pop();if(!b)return null;i.push({snapshot:t.value,envelope:b.envelope});const M=e?.preserveMetaOnUndoRedo?{...b.snapshot,meta:t.value.meta}:b.snapshot;return t.value=M,l(),M}function h(){const b=i.pop();if(!b)return null;s.push({snapshot:t.value,envelope:b.envelope});const M=e?.preserveMetaOnUndoRedo?{...b.snapshot,meta:t.value.meta}:b.snapshot;return t.value=M,l(),M}function v(){s.length=0,i.length=0,l()}function C(){return t.value}function E(b){t.value=b,v()}return{currentFlowModel:t,execute:m,undo:f,redo:h,canUndo:a,canRedo:c,get undoStack(){return s.map(b=>b.envelope)},get redoStack(){return i.map(b=>b.envelope)},clear:v,createSnapshot:C,replaceFlowModel:E}}function wt(r){return r!==null&&typeof r=="object"&&r.rejected===!0}class bt{plugins=[];editorContext=null;runtimeCtx=null;runtimeVersion=0;install(e,o){this.plugins=[...e].sort((t,s)=>(t.priority??100)-(s.priority??100)),this.editorContext=o;for(const t of this.plugins)t.install?.(o)}attachRuntime(e){const o=++this.runtimeVersion;this.runtimeCtx=e;const t=this.createSafeRuntimeContext(e,o);for(const s of this.plugins)s.attachRuntime?.(t)}detachRuntime(){for(const e of[...this.plugins].reverse())e.detachRuntime?.();this.runtimeCtx=null}createSafeRuntimeContext(e,o){const t=this,s=new Proxy(e.graph,{get(i,a,c){const l=Reflect.get(i,a,c);return a==="use"&&typeof l=="function"?function(...f){if(t.runtimeVersion===o)return l.apply(i,f)}:l}});return{...e,graph:s}}dispose(){for(const e of[...this.plugins].reverse())e.dispose?.();this.plugins=[],this.editorContext=null,this.runtimeCtx=null}transformCommand(e){if(!this.editorContext)return{envelope:e};let o=e;for(const t of this.plugins){if(!t.transformCommand)continue;const s=this.createPreview(o),i=t.transformCommand(o,s,this.editorContext);if(i===null)return{rejected:!0,error:{code:"plugin_rejected",reason:"",source:t.name}};if(wt(i))return{rejected:!0,error:{code:i.code??"plugin_rejected",reason:i.reason,source:t.name}};o=i}return{envelope:o}}afterCommand(e,o,t){if(this.editorContext)for(const s of this.plugins)s.afterCommand?.(e,o,t,this.editorContext)}dispatchUiEvent(e){if(this.runtimeCtx)for(const o of this.plugins)o.onUiEvent?.(e,this.runtimeCtx)}dispatchSelectionChange(e){if(this.runtimeCtx)for(const o of this.plugins)o.onSelectionChange?.(e,this.runtimeCtx)}dispatchKeyboardShortcut(e){if(!this.runtimeCtx)return!1;for(const o of this.plugins)if(o.onKeyboardShortcut?.(e,this.runtimeCtx))return!0;return!1}collectContextMenuItems(e){if(!this.runtimeCtx)return[];const o=[];for(const t of this.plugins){const s=t.onBlankContextMenu?.(e,this.runtimeCtx);s&&o.push(...s)}return o}collectToolbarItems(){if(!this.editorContext)return[];const e=new Map;for(const o of this.plugins){const t=o.provideToolbarItems?.(this.editorContext);if(t)for(const s of t)e.set(s.id,s)}return[...e.values()].sort((o,t)=>(o.order??0)-(t.order??0))}collectNodeDecorations(e){if(!this.editorContext)return;let o;for(const t of this.plugins){const s=t.decorateNode?.(e,this.editorContext);s&&(o=o?{...o,...s}:s)}return o}collectEdgeDecorations(e){if(!this.editorContext)return;let o;for(const t of this.plugins){const s=t.decorateEdge?.(e,this.editorContext);s&&(o=o?{...o,...s}:s)}return o}collectExtendedApi(){if(!this.runtimeCtx)return{};const e={};for(const o of this.plugins){const t=o.extendApi?.(this.runtimeCtx.api,this.runtimeCtx);t&&Object.assign(e,t)}return e}createPreview(e){const o=this.editorContext;return{previewFlowModel(t){const s=t??e.commands;let i=o.flowModel.value;for(const a of s)i=ke(i,a);return i}}}}let Et=0;function Z(){const r=Date.now().toString(36),e=Math.random().toString(36).substring(2,8);return`${r}-${e}-${++Et}`}const Ce=()=>Z();function kt(r){const{schema:e,plugins:o=[],historyOptions:t}=r,s=r.idGenerator??Ce,i={version:"1.0",...r.initialFlowModel},a=Fe(i,t),c=n.ref(r.mode??"edit"),l=n.ref(!1),m=n.ref(null),f=n.ref([]),h={},v=new bt;function C(P,A,F,z="user:toolbar"){const $={id:`history-${Date.now()}`,source:z,label:P,timestamp:Date.now(),commands:[]};v.afterCommand($,A,F),f.value=v.collectToolbarItems(),r.onCommandResult?.({status:"applied",envelope:$,flowModel:F}),r.onFlowModelChange?.({flowModel:F,prevFlowModel:A,envelope:$,source:z})}const E={execute:a.execute,undo(){const P=a.currentFlowModel.value,A=a.undo();return A&&C("撤销",P,A),A},redo(){const P=a.currentFlowModel.value,A=a.redo();return A&&C("重做",P,A),A},get canUndo(){return a.canUndo},get canRedo(){return a.canRedo},get undoStack(){return a.undoStack},get redoStack(){return a.redoStack},clear:a.clear,createSnapshot:a.createSnapshot,replaceFlowModel(P){const A=a.currentFlowModel.value;a.replaceFlowModel(P),C("替换 FlowModel",A,P,"system:replace")}},b={flowModel:n.computed(()=>a.currentFlowModel.value),history:E,schema:e,mode:c,idGenerator:s,executeCommand:M,replaceFlowModel(P){E.replaceFlowModel(P)},setMode(P){c.value=P},selectionMode:l,setSelectionMode(P){l.value=P},api:m,toolbarItems:f,extendedApi:h,_pluginManager:v,_emitUiEvent:P=>{v.dispatchUiEvent(P)}};v.install(o,{flowModel:b.flowModel,history:E,schema:e,mode:c,idGenerator:s,executeCommand:M}),f.value=v.collectToolbarItems(),n.onScopeDispose(()=>{v.dispose()});function M(P){const A=v.transformCommand(P);if("rejected"in A){const $={status:"rejected",envelope:P,error:A.error};return r.onCommandResult?.($),$}const F=A.envelope,z=a.currentFlowModel.value;try{const $=a.execute(F),q={status:"applied",envelope:F,flowModel:$};return v.afterCommand(F,z,$),f.value=v.collectToolbarItems(),r.onCommandResult?.(q),r.onFlowModelChange?.({flowModel:$,prevFlowModel:z,envelope:F,source:F.source}),q}catch($){if($ instanceof te){const q={status:"invalid",envelope:F,error:{code:"constraint_violated",reason:$.message,source:"engine"}};return r.onCommandResult?.(q),q}throw $}}return b}const Ct=["top","right","bottom","left"];function Ve(){return Ct.map(r=>({id:r,group:r}))}function xe(r,e){return e?.(r)??r.ports??Ve()}const be=-1,xt="flow-canvas-node-ring-target",Ne="flow-canvas-node-ring-target--decorated",Se="flow-canvas-node-ring-target--pulse",It="linear-gradient(135deg, #cadcfa 0%, #cee0ff 100%)";class Nt{graph;schema;shapeRegistry;resolveNodeDecoration;resolveEdgeDecoration;resolveCanvasContext;knownNodeIds=new Set;knownEdgeIds=new Set;syncing=!1;prevNodeDecorationClasses=new Map;prevNodeDecorationColors=new Set;prevEdgeDecorationClasses=new Map;prevEdgeDecorationColors=new Set;highlightedNodeIds=new Set;highlightedEdgeIds=new Set;hoveredEdgeId=null;defaultHighlightedNodeIds=new Set;defaultHighlightedEdgeIds=new Set;prevEdgeStyleIds=new Set;nodeDefaultAttrs=new Map;edgeDefaultAttrs=new Map;lastModel=null;pendingDecorationRAFs=new Map;constructor(e,o,t,s,i,a){this.graph=e,this.schema=o,this.shapeRegistry=t,this.resolveNodeDecoration=s,this.resolveEdgeDecoration=i,this.resolveCanvasContext=a}syncFlowModel(e){if(!this.syncing){this.syncing=!0,this.lastModel=e;try{const o=this.resolveNodes(e),t=this.resolveEdges(e);this.syncNodes(o),this.syncEdges(t,e)}finally{this.syncing=!1}}}get isSyncing(){return this.syncing}saveNodeDefaultAttrs(e,o){const s=o.x6CellConfig?.attrs?.body;if(!s)return;const i={};let a=!1;s.stroke!==void 0&&(i.stroke=s.stroke,a=!0),s.strokeWidth!==void 0&&(i.strokeWidth=s.strokeWidth,a=!0),a&&this.nodeDefaultAttrs.set(e,i)}saveEdgeDefaultAttrs(e,o){const s=o?.x6EdgeConfig?.attrs?.line;if(!s)return;const i={};let a=!1;s.stroke!==void 0&&(i.stroke=s.stroke,a=!0),s.strokeWidth!==void 0&&(i.strokeWidth=s.strokeWidth,a=!0),s.strokeDasharray!==void 0&&(i.strokeDasharray=s.strokeDasharray,a=!0),a&&this.edgeDefaultAttrs.set(e,i)}restoreNodeAttr(e,o,t){const s=this.nodeDefaultAttrs.get(e.id)?.[t];if(s!==void 0)e.setAttrByPath(o,s);else{const i=t==="stroke"?"none":0;e.setAttrByPath(o,i)}}restoreEdgeAttr(e,o,t){const s=this.edgeDefaultAttrs.get(e.id)?.[t];s!==void 0?this.setEdgeAttrIfChanged(e,o,s):e.attr(o)!==void 0&&e.removeAttrByPath(o)}setEdgeAttrIfChanged(e,o,t){e.attr(o)!==t&&e.setAttrByPath(o,t)}getNodeRingTarget(e){return e?e.querySelector(".flow-canvas-highlight-target")??e.querySelector(".flow-canvas-node-surface > :first-child"):null}syncEdgeMarker(e,o,t){const i=o?.x6EdgeConfig?.attrs?.line?.[t],a=`line/${t}`;e.removeAttrByPath(a),i!==void 0&&e.setAttrByPath(a,i)}dispose(){for(const e of this.pendingDecorationRAFs.values())cancelAnimationFrame(e);this.pendingDecorationRAFs.clear(),this.knownNodeIds.clear(),this.knownEdgeIds.clear()}resolveNodes(e){const o=new Map;for(const[t,s]of Object.entries(e.nodes)){const i=this.schema.nodeTypes[s.type];if(!i)throw new $e(`Unknown node type "${s.type}" for node "${t}". Registered types: [${Object.keys(this.schema.nodeTypes).join(", ")}]. Register the type in CanvasSchema.nodeTypes before using it in a FlowModel.`);const a=this.shapeRegistry.registerNodeType(s.type,i.component),c=i.getSize(s),l=xe(s,i.getPorts);o.set(t,{model:s,definition:i,shapeName:a,size:c,ports:l})}return o}resolveEdges(e){const o=new Map;for(const[t,s]of Object.entries(e.edges)){const i=s.type??this.schema.defaultEdgeType??"default",a=this.schema.edgeTypes?.[i];o.set(t,{model:s,definition:a})}return o}syncNodes(e){const o=new Set(e.keys());for(const t of this.knownNodeIds)if(!o.has(t)){const s=this.graph.getCellById(t);s&&this.graph.removeCell(s),this.knownNodeIds.delete(t),this.defaultHighlightedNodeIds.delete(t),this.prevNodeDecorationClasses.delete(t),this.prevNodeDecorationColors.delete(t),this.nodeDefaultAttrs.delete(t);const i=this.pendingDecorationRAFs.get(t);i&&(cancelAnimationFrame(i),this.pendingDecorationRAFs.delete(t))}for(const[t,s]of e){const i=this.graph.getCellById(t);i?this.updateExistingNode(i,s):this.addNewNode(t,s)}}updateExistingNode(e,o){const{model:t,size:s,ports:i,definition:a}=o;if(e.getData()?.type!==t.type){this.graph.removeCell(e),this.addNewNode(e.id,o);return}const l=e.getPosition();(l.x!==t.position.x||l.y!==t.position.y)&&e.setPosition(t.position.x,t.position.y);const m=e.getSize();(m.width!==s.width||m.height!==s.height)&&e.setSize(s.width,s.height,{silent:!0}),this.syncNodePorts(e,i),e.setData({...t}),this.applyNodeBehavior(e,t,a),this.applyNodeHighlightAndDecoration(e,t)}syncNodePorts(e,o){const t=e.getPorts(),s=new Set(o.map(a=>a.id)),i=new Set(t.map(a=>a.id));for(const a of t)a.id&&!s.has(a.id)&&e.removePort(a.id);for(const a of o)i.has(a.id)||e.addPort({id:a.id,group:a.group,...a.x6PortConfig})}addNewNode(e,o){const{model:t,shapeName:s,size:i,ports:a,definition:c}=o,l={id:t.id,shape:s,x:t.position.x,y:t.position.y,width:i.width,height:i.height,data:{...t},ports:{groups:{top:{position:"top",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},right:{position:"right",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},bottom:{position:"bottom",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},left:{position:"left",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}}},items:a.map(f=>({id:f.id,group:f.group,...f.x6PortConfig}))},...c.x6CellConfig};this.graph.addNode(l),this.knownNodeIds.add(e),this.saveNodeDefaultAttrs(e,c);const m=this.graph.getCellById(e);m&&(this.applyNodeBehavior(m,t,c),this.applyNodeHighlightAndDecoration(m,t),this.scheduleDecorationRetryIfNeeded(m,t))}scheduleDecorationRetryIfNeeded(e,o){const t=this.graph.findViewByCell(e)?.container;if(this.getNodeRingTarget(t))return;const s=e.id,i=this.pendingDecorationRAFs.get(s);i&&cancelAnimationFrame(i);const a=requestAnimationFrame(()=>{if(this.pendingDecorationRAFs.delete(s),!this.knownNodeIds.has(s))return;const c=this.lastModel?.nodes[s];if(!c)return;const l=this.graph.getCellById(s);l?.isNode()&&this.applyNodeHighlightAndDecoration(l,c)});this.pendingDecorationRAFs.set(s,a)}applyNodeBehavior(e,o,t){if(!t.getBehavior)return;const s=this.resolveCanvasContext?.();if(!s)return;const i=t.getBehavior(o,s);if(i.draggable!==void 0&&e.setProp("draggable",i.draggable,{silent:!0}),i.connectable!==void 0){const c=i.connectable?!0:i.targetable===!1?!1:"passive";for(const l of e.getPorts())e.setPortProp(l.id,"attrs/circle/magnet",c,{silent:!0})}if(i.showPorts!==void 0){const c=i.showPorts;for(const l of e.getPorts())e.setPortProp(l.id,"attrs/circle/visibility",c?"visible":"hidden",{silent:!0})}const a=e.getData()??{};i.deletable!==void 0&&a._deletable!==i.deletable&&e.setData({...a,_deletable:i.deletable},{silent:!0}),i.selectable!==void 0&&a._selectable!==i.selectable&&e.setData({...e.getData(),_selectable:i.selectable},{silent:!0})}syncEdges(e,o){const t=new Set(e.keys());for(const s of this.knownEdgeIds)if(!t.has(s)){const i=this.graph.getCellById(s);i&&this.graph.removeCell(i),this.knownEdgeIds.delete(s),this.defaultHighlightedEdgeIds.delete(s),this.prevEdgeDecorationClasses.delete(s),this.prevEdgeDecorationColors.delete(s),this.prevEdgeStyleIds.delete(s),this.edgeDefaultAttrs.delete(s)}for(const[s,i]of e){const a=this.graph.getCellById(s),{model:c,definition:l}=i;a?(this.updateExistingEdge(a,c,l,o),this.knownEdgeIds.has(s)||(this.knownEdgeIds.add(s),this.saveEdgeDefaultAttrs(s,l))):this.addNewEdge(s,c,l)}}updateExistingEdge(e,o,t,s){const i=e.getSource(),a=e.getTarget(),c=i.cell!==o.source.nodeId||i.port!==o.source.portId,l=a.cell!==o.target.nodeId||a.port!==o.target.portId;c&&e.setSource({cell:o.source.nodeId,port:o.source.portId}),l&&e.setTarget({cell:o.target.nodeId,port:o.target.portId});const f=(e.getData()?.type??void 0)!==(o.type??void 0);if(f){if(t?.router){const h=typeof t.router=="string"?{name:t.router}:t.router;e.setRouter(h)}if(t?.connector){const h=typeof t.connector=="string"?{name:t.connector}:t.connector;e.setConnector(h)}}(f||c||l)&&(this.syncEdgeMarker(e,t,"sourceMarker"),this.syncEdgeMarker(e,t,"targetMarker")),this.syncEdgeLabels(e,o),e.getZIndex()!==be&&e.setZIndex(be),e.setData({...o},{silent:!0}),this.applyEdgeStyleAndDecoration(e,o,t)}syncEdgeLabels(e,o){if(!o.labels?.length){e.getLabels().length>0&&e.setLabels([]);return}const t=o.labels.map(s=>({attrs:{label:{text:s.text??""}},position:s.position!=null?{distance:s.position}:void 0}));e.setLabels(t)}addNewEdge(e,o,t){const s={id:o.id,source:{cell:o.source.nodeId,port:o.source.portId},target:{cell:o.target.nodeId,port:o.target.portId},data:{...o},zIndex:be};t?.router&&(s.router=typeof t.router=="string"?{name:t.router}:t.router),t?.connector&&(s.connector=typeof t.connector=="string"?{name:t.connector}:t.connector),t?.x6EdgeConfig&&Object.assign(s,t.x6EdgeConfig),o.labels?.length&&(s.labels=o.labels.map(a=>({attrs:{label:{text:a.text??""}},position:a.position!=null?{distance:a.position}:void 0}))),this.graph.addEdge(s),this.knownEdgeIds.add(e),this.saveEdgeDefaultAttrs(e,t);const i=this.graph.getCellById(e);i&&this.applyEdgeStyleAndDecoration(i,o,t)}refreshEdgeStyles(){if(this.lastModel)for(const[e,o]of Object.entries(this.lastModel.edges)){const t=this.graph.getCellById(e);if(!t?.isEdge())continue;const s=o.type??this.schema.defaultEdgeType??"default",i=this.schema.edgeTypes?.[s];this.applyEdgeStyleAndDecoration(t,o,i)}}refreshSingleEdgeStyle(e){if(!this.lastModel)return;const o=this.lastModel.edges[e];if(!o)return;const t=this.graph.getCellById(e);if(!t?.isEdge())return;const s=o.type??this.schema.defaultEdgeType??"default",i=this.schema.edgeTypes?.[s];this.applyEdgeStyleAndDecoration(t,o,i)}refreshNodeHighlights(){if(this.lastModel)for(const[e,o]of Object.entries(this.lastModel.nodes)){const t=this.graph.getCellById(e);t?.isNode()&&this.applyNodeHighlightAndDecoration(t,o)}}applyNodeHighlightAndDecoration(e,o){const t=this.highlightedNodeIds.has(e.id),s=this.resolveNodeDecoration?.(o),i=this.graph.findViewByCell(e)?.container,a=this.getNodeRingTarget(i),c=this.prevNodeDecorationClasses.get(e.id);c&&(i?.classList.remove(c),this.prevNodeDecorationClasses.delete(e.id)),s?.className&&(i?.classList.add(s.className),this.prevNodeDecorationClasses.set(e.id,s.className));const l=s?.borderColor,f=l??(t?"#3a84ff":void 0),h=this.prevNodeDecorationColors.has(e.id)||this.defaultHighlightedNodeIds.has(e.id);f?(e.setAttrByPath("body/stroke",f),e.setAttrByPath("body/strokeWidth",2)):h&&(this.restoreNodeAttr(e,"body/stroke","stroke"),this.restoreNodeAttr(e,"body/strokeWidth","strokeWidth")),a&&(a.classList.add(xt),l?(a.classList.add(Ne),a.style.setProperty("--flow-canvas-node-decoration-ring-background",l),a.style.setProperty("--flow-canvas-node-decoration-ring-opacity","0.95")):(a.classList.remove(Ne),a.style.removeProperty("--flow-canvas-node-decoration-ring-background"),a.style.removeProperty("--flow-canvas-node-decoration-ring-opacity")),t?(a.classList.add(Se),a.style.setProperty("--flow-canvas-node-pulse-ring-background",l??It),a.style.setProperty("--flow-canvas-node-pulse-ring-opacity","0.95")):(a.classList.remove(Se),a.style.removeProperty("--flow-canvas-node-pulse-ring-background"),a.style.removeProperty("--flow-canvas-node-pulse-ring-opacity"))),l?this.prevNodeDecorationColors.add(e.id):this.prevNodeDecorationColors.delete(e.id),t&&!l?this.defaultHighlightedNodeIds.add(e.id):this.defaultHighlightedNodeIds.delete(e.id)}getHoveredEdgeId(){return this.hoveredEdgeId}setHoveredEdge(e){this.hoveredEdgeId=e}setHighlightedNodes(e){this.highlightedNodeIds=new Set(e)}setHighlightedEdges(e){const o=this.highlightedEdgeIds;return this.highlightedEdgeIds=new Set(e),o}applyEdgeStyleAndDecoration(e,o,t){const s=this.highlightedEdgeIds.has(e.id),i=this.resolveEdgeDecoration?.(o),a=this.prevEdgeDecorationClasses.get(e.id);a&&(this.graph.findViewByCell(e)?.container?.classList.remove(a),this.prevEdgeDecorationClasses.delete(e.id)),i?.className&&(this.graph.findViewByCell(e)?.container?.classList.add(i.className),this.prevEdgeDecorationClasses.set(e.id,i.className));let c,l,m;if(t?.style){const E=this.graph.isSelected?.(e)??!1,b=this.hoveredEdgeId===e.id,M=t.style(o,{selected:E,highlighted:s,hovered:b});c=M.stroke,l=M.strokeWidth,m=M.strokeDasharray}const f=!t?.style&&s?"#3a84ff":void 0,h=i?.strokeColor,v=h??c??f,C=!!t?.style||this.prevEdgeDecorationColors.has(e.id)||this.defaultHighlightedEdgeIds.has(e.id)||this.prevEdgeStyleIds.has(e.id);v?this.setEdgeAttrIfChanged(e,"line/stroke",v):C&&this.restoreEdgeAttr(e,"line/stroke","stroke"),t?.style?(this.prevEdgeStyleIds.add(e.id),l?this.setEdgeAttrIfChanged(e,"line/strokeWidth",l):this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),m?this.setEdgeAttrIfChanged(e,"line/strokeDasharray",m):this.restoreEdgeAttr(e,"line/strokeDasharray","strokeDasharray")):this.prevEdgeStyleIds.has(e.id)&&(this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),this.restoreEdgeAttr(e,"line/strokeDasharray","strokeDasharray"),this.prevEdgeStyleIds.delete(e.id)),h?this.prevEdgeDecorationColors.add(e.id):this.prevEdgeDecorationColors.delete(e.id),f?this.defaultHighlightedEdgeIds.add(e.id):this.defaultHighlightedEdgeIds.delete(e.id)}}class St{instanceId=Z();registeredShapes=new Map;wrappedComponents=new Map;getShapeName(e){let o=this.registeredShapes.get(e);return o||(o=`flow-node-${this.instanceId}-${e}`,this.registeredShapes.set(e,o)),o}registerNodeType(e,o){const t=this.getShapeName(e);let s=this.wrappedComponents.get(e);return s||(s=n.defineComponent({name:`FlowCanvasNodeShape${e.replace(/(^|[-_])(\w)/g,(i,a,c)=>c.toUpperCase())}`,setup(){return()=>n.h("div",{class:"flow-canvas-node-surface"},[n.h(o)])}}),this.wrappedComponents.set(e,s)),ot.register({shape:t,component:s,width:100,height:40}),t}dispose(){this.registeredShapes.clear(),this.wrappedComponents.clear()}}class Dt{graph;onUiEvent;onCommand;flowModelRef;idGenerator;disposers=[];constructor(e,o,t,s,i){this.graph=e,this.onUiEvent=o,this.onCommand=t,this.flowModelRef=s,this.idGenerator=i??Ce,this.bindEvents()}dispose(){for(const e of this.disposers)e();this.disposers=[]}bindEvents(){this.on("node:click",({node:e})=>{this.onUiEvent({type:"node.click",nodeId:e.id})}),this.on("node:dblclick",({node:e})=>{this.onUiEvent({type:"node.dblclick",nodeId:e.id})}),this.on("node:contextmenu",({node:e,e:o})=>{this.onUiEvent({type:"node.contextmenu",nodeId:e.id,position:{x:o.clientX,y:o.clientY}})}),this.on("edge:click",({edge:e,e:o})=>{const s=o.target?.closest?.(".x6-edge-label");if(s){const a=e.getData?.()?.labels??[],c=s.parentElement?.querySelectorAll(".x6-edge-label"),l=c?Array.from(c).indexOf(s):0,m=a[Math.max(0,l)];this.onUiEvent({type:"edge.label.click",edgeId:e.id,labelId:m?.id??`label-${l}`});return}this.onUiEvent({type:"edge.click",edgeId:e.id})}),this.on("blank:click",({e})=>{const o=this.graph.clientToLocal(e.clientX,e.clientY);this.onUiEvent({type:"blank.click",position:{x:o.x,y:o.y}})}),this.on("blank:contextmenu",({e})=>{this.onUiEvent({type:"blank.contextmenu",position:{x:e.clientX,y:e.clientY}})}),this.on("node:moved",({node:e})=>{const o=e.getPosition();this.onCommand({id:Z(),source:"user:drag",label:"移动节点",timestamp:Date.now(),commands:[{type:"node.move",nodeId:e.id,position:{x:o.x,y:o.y}}]})}),this.on("edge:connected",({edge:e,isNew:o})=>{const t=e.getSourceCell(),s=e.getTargetCell();if(!t||!s)return;const i=e.getSourcePortId(),a=e.getTargetPortId(),c=e.id in this.flowModelRef.value.edges;o&&!c?(this.graph.removeCell(e),this.onCommand({id:Z(),source:"user:drag",label:"连线",timestamp:Date.now(),commands:[{type:"edge.add",edge:{id:this.idGenerator("edge"),source:{nodeId:t.id,portId:i??void 0},target:{nodeId:s.id,portId:a??void 0}}}]})):this.onCommand({id:Z(),source:"user:drag",label:"重连",timestamp:Date.now(),commands:[{type:"edge.reconnect",edgeId:e.id,source:{nodeId:t.id,portId:i??void 0},target:{nodeId:s.id,portId:a??void 0}}]})}),this.on("edge:change:labels",({edge:e,current:o})=>{const s=e.getData?.()?.labels??[];if(!s.length||!o?.length)return;const i=[];for(let a=0;a<Math.min(s.length,o.length);a++){const c=o[a],l=s[a];if(!l?.id)continue;const m=typeof c.position=="object"?c.position?.distance:c.position;m!=null&&i.push({type:"edge.label.update",edgeId:e.id,labelId:l.id,patch:{position:m}})}i.length&&this.onCommand({id:Z(),source:"user:drag",label:"拖动标签",timestamp:Date.now(),commands:i})})}on(e,o){this.graph.on(e,o),this.disposers.push(()=>this.graph.off(e,o))}}function Mt(r){function e(o){const t=r.getCellById(o);if(!t||!t.isNode())return null;const s=t,i=s.getPosition(),a=s.getSize(),c={x:i.x,y:i.y,width:a.width,height:a.height},l=r.localToGraph(c);return new DOMRect(l.x,l.y,l.width,l.height)}return{getNodeScreenRect:e}}function He(r){return{nodeIds:r.filter(e=>e.isNode()).map(e=>e.id),edgeIds:r.filter(e=>e.isEdge()).map(e=>e.id)}}function _t(r,e){const o=[...e.nodeIds.map(i=>r.getCellById(i)),...e.edgeIds.map(i=>r.getCellById(i))].filter(i=>!!i);if(o.length===0)return null;const t=r.getCellsBBox(o);if(!t)return null;const s=r.localToGraph(t);return new DOMRect(s.x,s.y,s.width,s.height)}function ze(r,e,o){const t=r.nodeIds.filter(a=>{const c=e.nodes[a];if(!c)return!1;const l=o(c);return l.deletable!==!1&&l.deleteDisabled!==!0}),s=new Set(t),i=r.edgeIds.filter(a=>{const c=e.edges[a];return c?!s.has(c.source.nodeId)&&!s.has(c.target.nodeId):!1});return{nodeIds:t,edgeIds:i}}function At(r){return[...r.edgeIds.map(e=>({type:"edge.remove",edgeId:e})),...r.nodeIds.map(e=>({type:"node.remove",nodeId:e}))]}const Bt=100;function Pt({graph:r,overlayManager:e,executeCommand:o,schema:t,flowModel:s,getNodeBehavior:i,idGenerator:a,defaultInsertGap:c,getContextMenuItems:l,onHighlightChange:m,resolveNodeShape:f}){const h=a??Ce;let v=[],C=[],E=null,b=!1,M=null;async function P(){if(b)return E;b=!0;try{const u=await import("@antv/x6-plugin-dnd"),d=u.Dnd??u.default;return d?(E=new d({target:r,scaled:!0,animation:!0,getDragNode:p=>p.clone(),getDropNode:p=>p.clone()}),E):null}catch{return console.warn("[flow-canvas] @antv/x6-plugin-dnd not available, add it to your dependencies"),null}}function A(){return new Promise(u=>{requestAnimationFrame(()=>requestAnimationFrame(()=>u()))})}const F=({node:u})=>{const d=u.getData?.();if(!d?._dndSessionId||d._dndSessionId!==M)return;M=null;const p=u.getPosition();r.removeNode(u.id);const{_dndSessionId:g,...w}=d,x=w.id||h("node");o({id:Z(),source:"user:drag",label:"拖入节点",timestamp:Date.now(),commands:[{type:"node.add",node:{...w,id:x,position:{x:p.x,y:p.y}}}]})};r.on("node:added",F);function z(u){const d=t.nodeTypes[u.type];return xe(u,d?.getPorts)}function $(u){return u??He(r.getSelectedCells?.()??[])}function q(u,d,p,g,w){switch(u){case"left":return{x:d.position.x-w-g.width,y:d.position.y+(p.height-g.height)/2};case"top":return{x:d.position.x+(p.width-g.width)/2,y:d.position.y-w-g.height};case"bottom":return{x:d.position.x+(p.width-g.width)/2,y:d.position.y+p.height+w};default:return{x:d.position.x+p.width+w,y:d.position.y+(p.height-g.height)/2}}}function V(u,d,p){switch(u){case"left":return{x:-(d.width+p),y:0};case"top":return{x:0,y:-(d.height+p)};case"bottom":return{x:0,y:d.height+p};default:return{x:d.width+p,y:0}}}function D(u){switch(u){case"left":return"right";case"top":return"bottom";case"bottom":return"top";default:return"left"}}const y={zoomIn(){r.zoom(.1)},zoomOut(){r.zoom(-.1)},zoomTo(u){r.zoomTo(u)},zoomToFit(){r.zoomToFit({padding:40,maxScale:1.5})},getZoom(){return r.zoom()},centerContent(){r.centerContent()},scrollToOrigin(){r.translate(0,0)},scrollToNode(u){const d=r.getCellById(u);d&&r.centerCell(d)},getSelection(){return $()},getSelectionBounds(u){return _t(r,$(u))},selectNodes(u){const d=u.map(p=>r.getCellById(p)).filter(Boolean);r.select?.(d)},selectEdges(u){const d=u.map(p=>r.getCellById(p)).filter(Boolean);r.select?.(d)},clearSelection(){const u=r.getSelectedCells?.();u?.length&&r.unselect?.(u)},deleteSelection(u){const d=$(u?.selection),p=ze(d,s.value,i??(()=>({}))),g=At(p);if(g.length===0)return null;const w=o({id:Z(),source:u?.source??"user:toolbar",label:u?.label??"删除选中",timestamp:Date.now(),commands:g});return w.status==="applied"&&u?.clearSelectionAfterApply!==!1&&y.clearSelection(),w},registerDndSource(u,d){const p=async g=>{const w=await P();if(!w)return;const x=Z();M=x;const L=d(),U=f?.(L.type),N=r.createNode({width:U?.width??154,height:U?.height??54,shape:U?.shapeName??"rect",data:{...L,_dndSessionId:x}});w.start(N,g)};return u.addEventListener("mousedown",p),()=>{u.removeEventListener("mousedown",p)}},startConnection(u,d){const p=r.getCellById(u);if(!p?.isNode())return;const g=p,w=r.findViewByCell(g);if(!w)return;const x=w.findPortElem(d,"circle")??w.findPortElem(d);if(!x)return;const U=(x.matches?.("[magnet]")?x:x.querySelector?.("[magnet]"))??x,N=U.getBoundingClientRect(),T=N.left+N.width/2,k=N.top+N.height/2,_=new MouseEvent("mousedown",{clientX:T,clientY:k,button:0,buttons:1,bubbles:!0,cancelable:!0});U.dispatchEvent(_)},async exportAsImage(u){const{domToBlob:d}=await import("modern-screenshot"),p=u?.padding??20,g=u?.backgroundColor??r.options.background?.color??"#ffffff",w=r.zoom(),x=r.translate(),L=r.getContentBBox(),U=L.width/w,N=L.height/w;if(U===0||N===0)return new Blob;const T=(L.x-x.tx)/w,k=(L.y-x.ty)/w,_=Math.ceil(U+p*2),O=Math.ceil(N+p*2),W=document.createElement("div");W.style.cssText="position:fixed;left:-99999px;top:0;pointer-events:none;";const j=r.container.cloneNode(!0);j.style.width=`${_}px`,j.style.height=`${O}px`,j.style.overflow="visible";const K=j.querySelector("svg");K&&(K.setAttribute("width",String(_)),K.setAttribute("height",String(O)),K.style.width=`${_}px`,K.style.height=`${O}px`),j.querySelector(".x6-graph-svg-viewport")?.setAttribute("transform",`matrix(1,0,0,1,${-T+p},${-k+p})`),W.appendChild(j),document.body.appendChild(W);try{return await A(),await d(j,{width:_,height:O,backgroundColor:g,scale:u?.scale??window.devicePixelRatio,filter:Y=>{if(Y instanceof Element){const J=Y.getAttribute("class")??"";if(J.includes("x6-widget-selection")||J.includes("x6-widget-transform")||J.includes("x6-graph-grid")||J.includes("x6-graph-background"))return!1}return!0}})}catch(Y){return console.warn("[flow-canvas] Export failed:",Y),new Blob}finally{W.remove()}},highlightNodes(u){v=u,m?.(v,C)},highlightEdges(u){C=u,m?.(v,C)},clearHighlight(){v=[],C=[],m?.([],[])},overlay:e,getContextMenuItems(u){return l?.(u)??[]},insertNodeToRight(u,d,p){const g=s.value,w=g.nodes[u];if(!w)return{status:"invalid",envelope:{id:"",source:"user:toolbar",timestamp:Date.now(),commands:[]},error:{code:"constraint_violated",reason:`Source node "${u}" not found`,source:"api"}};const x=p?.gap??c??Bt,L=p?.direction??"right",U=t.nodeTypes[w.type],N=t.nodeTypes[d.type],T=U?.getSize(w)??{width:154,height:54},k=N?.getSize({...d,position:{x:0,y:0}})??{width:154,height:54},_=q(L,w,T,k,x),O=d.id||h("node"),W={...d,id:O,position:_},j=[{type:"node.add",node:W}],K=V(L,k,x),X={x:_.x,y:_.y,width:k.width,height:k.height};for(const[J,Q]of Object.entries(g.nodes)){if(J===u||J===O)continue;const ce=t.nodeTypes[Q.type]?.getSize(Q)??{width:154,height:54},S=X.x<Q.position.x+ce.width&&X.x+X.width>Q.position.x,I=X.y<Q.position.y+ce.height&&X.y+X.height>Q.position.y;S&&I&&j.push({type:"node.move",nodeId:J,position:{x:Q.position.x+K.x,y:Q.position.y+K.y}})}if(p?.autoWireEdges){const J=z(w),Q=z(W),se=L,ce=D(L),S=J.find(G=>G.group===se),I=Q.find(G=>G.group===ce),B=Q.find(G=>G.group===se),H=S?Object.values(g.edges).find(G=>G.source.nodeId===u&&G.source.portId===S.id):Object.values(g.edges).find(G=>G.source.nodeId===u);if(H){const G=H.target;j.push({type:"edge.remove",edgeId:H.id}),j.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:u,portId:S?.id},target:{nodeId:O,portId:I?.id}}}),j.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:O,portId:B?.id},target:G}})}else j.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:u,portId:S?.id},target:{nodeId:O,portId:I?.id}}})}const Y={id:Z(),source:p?.source??"user:toolbar",label:p?.label??"插入节点",timestamp:Date.now(),commands:j};return o(Y)},onGraphEvent(u,d){return r.on(u,d),()=>r.off(u,d)},unsafeGetGraph(){return r}};return y}function Tt(){const r=n.ref(null),e=n.ref(!1);let o=null,t=!1;function s(h){o&&(clearTimeout(o),o=null),r.value=h}function i(h=100){t||(o&&clearTimeout(o),o=setTimeout(()=>{r.value=null,o=null},h))}function a(){t=!0,o&&(clearTimeout(o),o=null)}function c(h=100){t=!1,i(h)}function l(){o&&(clearTimeout(o),o=null)}function m(){l(),t=!1,r.value=null}function f(){o&&clearTimeout(o)}return{hoveredNodeId:r,isDraggingNode:e,enter:s,leave:i,enterOverlay:a,leaveOverlay:c,cancelLeave:l,reset:m,cleanup:f}}const De=10,pe=12;function Me(r,e){const o=r.getTotalLength();if(o===0)return{...e,length:0,totalLength:0};let t=r.getPointAtLength(0),s=1/0;const i=50,a=o/i;let c=0;for(let h=0;h<=i;h++){const v=h*a,C=r.getPointAtLength(v),E=(C.x-e.x)**2+(C.y-e.y)**2;E<s&&(s=E,t=C,c=v)}const l=Math.max(0,c-a),m=Math.min(o,c+a),f=(m-l)/20;for(let h=l;h<=m;h+=f){const v=r.getPointAtLength(h),C=(v.x-e.x)**2+(v.y-e.y)**2;C<s&&(s=C,t=v,c=h)}return{x:t.x,y:t.y,length:c,totalLength:o}}function _e(r,e){return r<De||r>e-De}function Ae(r,e,o){const t=r.querySelectorAll(".x6-edge-label");for(const s of t){const i=s.getBoundingClientRect();if(e>=i.left-pe&&e<=i.right+pe&&o>=i.top-pe&&o<=i.bottom+pe)return!0}return!1}function Be(){const r="http://www.w3.org/2000/svg",e=document.createElementNS(r,"g");e.setAttribute("class","flow-canvas-edge-delete-tool"),e.style.cursor="pointer";const o=document.createElementNS(r,"rect");o.setAttribute("width","20"),o.setAttribute("height","20"),o.setAttribute("x","-10"),o.setAttribute("y","-10"),o.setAttribute("rx","4"),o.setAttribute("ry","4"),o.setAttribute("fill","#3a84ff"),e.appendChild(o);const t=document.createElementNS(r,"text");return t.setAttribute("font-family","flow-canvas"),t.setAttribute("font-size","16"),t.setAttribute("fill","#ffffff"),t.setAttribute("text-anchor","middle"),t.setAttribute("dominant-baseline","central"),t.textContent="",e.appendChild(t),e}function Rt(r){let e=null,o=null;function t(c,l){if(i(),o=c,l.target?.closest?.(".x6-edge-label"))return;const f=r.getCellById(c);if(!f?.isEdge())return;const h=r.findViewByCell(f);if(!h)return;const v=h.container.querySelector("path");if(!v)return;const C=r.clientToLocal(l.clientX,l.clientY),E=Me(v,C);if(_e(E.length,E.totalLength)||Ae(h.container,l.clientX,l.clientY))return;const b=Be();b.setAttribute("transform",`translate(${E.x}, ${E.y})`),h.container.appendChild(b),e=b}function s(c){if(!o)return;if(c.target?.closest?.(".x6-edge-label")){e&&e.setAttribute("display","none");return}const m=r.getCellById(o);if(!m?.isEdge())return;const f=r.findViewByCell(m);if(!f)return;const h=f.container.querySelector("path");if(!h)return;const v=r.clientToLocal(c.clientX,c.clientY),C=Me(h,v);if(_e(C.length,C.totalLength)||Ae(f.container,c.clientX,c.clientY))e&&e.setAttribute("display","none");else if(e)e.removeAttribute("display"),e.setAttribute("transform",`translate(${C.x}, ${C.y})`);else{const E=Be();E.setAttribute("transform",`translate(${C.x}, ${C.y})`),f.container.appendChild(E),e=E}}function i(){e&&(e.remove(),e=null),o=null}function a(c){c===o&&(e=null,o=null)}return{show:t,move:s,remove:i,handleEdgeRemoved:a}}function Lt(r){let e=null,o=0;function t(f){const h=f?"visible":"hidden";for(const v of r.getNodes())for(const C of v.getPorts())v.setPortProp(C.id,"attrs/circle/visibility",h)}function s(f){if(!e)for(const h of f.getPorts())f.setPortProp(h.id,"attrs/circle/visibility","visible")}function i(f){if(!e)for(const h of f.getPorts())f.setPortProp(h.id,"attrs/circle/visibility","hidden")}function a(f,h){if(!f.getTargetCell())if(e=f.id,h?.size)for(const v of r.getNodes()){const C=h.has(v.id)?"hidden":"visible";for(const E of v.getPorts())v.setPortProp(E.id,"attrs/circle/visibility",C)}else t(!0)}function c(){e=null,t(!1),o=Date.now()+300}function l(f){f===e&&(e=null,t(!1))}function m(){return!e&&Date.now()>=o}return{showNodePorts:s,hideNodePorts:i,handleEdgeAdded:a,handleEdgeConnected:c,handleEdgeRemoved:l,canShowEdgeTool:m}}function Pe(r){return r==="top"||r==="right"||r==="bottom"||r==="left"}function Ot(r){const{editor:e,nodeHover:o,isSelectionModeActive:t,viewportVersion:s,getNodeBehavior:i,getInsertGap:a}=r,{isDraggingNode:c}=r,l=n.ref(null),m=n.ref(!1);let f=null,h=null,v=null;const C=n.computed(()=>({enabled:!0,portGroup:"right",...r.quickAddProp.value}));function E(){f&&(clearTimeout(f),f=null)}function b(){f&&clearTimeout(f),f=setTimeout(()=>{l.value=null,f=null},150)}function M(N){return m.value?!0:(E(),y(N)?(l.value=N,!0):(l.value=null,!1))}function P(){E(),o.enterOverlay()}function A(){b(),o.leaveOverlay()}function F(N){const T=e.schema.nodeTypes[N.type];return xe(N,T?.getPorts)}function z(N,T){const k=C.value.getPort?.(N,T);if(!k)return null;const _=typeof k=="string"?k:k.id;return T.find(O=>O.id===_)??null}function $(N,T){const k=e.api.value?.overlay.getNodeScreenRect(N);if(!k)return null;switch(T){case"top":return{x:k.x+k.width/2,y:k.y};case"bottom":return{x:k.x+k.width/2,y:k.y+k.height};case"left":return{x:k.x,y:k.y+k.height/2};case"right":return{x:k.x+k.width,y:k.y+k.height/2};default:return null}}function q(N,T,k){if(!h)return $(N,k);const _=h.getCellById(N);if(_?.isNode()){const O=_,W=h.findViewByCell(O),j=W?.findPortElem(T,"circle")??W?.findPortElem(T);if(j){const K=h.container.getBoundingClientRect(),X=j.getBoundingClientRect();return{x:X.left-K.left+X.width/2,y:X.top-K.top+X.height/2}}}return $(N,k)}function V(N){const T=F(N),k=z(N,T)??T.find(O=>O.group===C.value.portGroup)??null;if(!k)return null;const _=q(N.id,k.id,k.group);return _?{portId:k.id,portGroup:k.group,portPosition:_}:null}function D(N){const T=V(N),k=C.value.insertDirection;if(typeof k=="function"){const _=k(N,T?{id:T.portId,group:T.portGroup}:null);if(_)return _}else if(k)return k;return T&&Pe(T.portGroup)?T.portGroup:Pe(C.value.portGroup)?C.value.portGroup:"right"}function y(N){if(!C.value.enabled||e.mode.value!=="edit")return!1;const k=e.flowModel.value.nodes[N];return!k||i(k).quickAddEnabled===!1?!1:!!V(k)}const u=n.computed(()=>{if(s.value,!C.value.enabled)return null;const N=l.value;if(!N||c.value||!e.api.value||e.mode.value!=="edit"||t.value)return null;const k=e.flowModel.value.nodes[N];if(!k)return null;const _=i(k);if(_.quickAddEnabled===!1)return null;const O=V(k);return O?{node:k,...O,behavior:_}:null});function d(N){m.value=!0,u.value&&e._emitUiEvent({type:"node.quick-add",nodeId:N,position:u.value.portPosition})}function p(){m.value=!1}function g(N){const T=e.api.value;if(!T)return;const k=e.flowModel.value.nodes[N];if(!k)return;const _=V(k);_&&T.startConnection(N,_.portId)}function w(N,T){const k=e.api.value;if(!k)return;const _=T.id||e.idGenerator("node"),O={...T,id:_},W=e.flowModel.value.nodes[N];if(!W)return;k.insertNodeToRight(N,O,{autoWireEdges:!0,direction:D(W),gap:a(),source:"user:quick-add",label:"快捷插入节点"}).status==="applied"&&e._emitUiEvent({type:"node.action.quick-insert",sourceNodeId:N,newNodeId:_}),r.closePopover()}function x(N){if(!h)return;const T=h.getCellById(N);if(!T?.isNode())return;const k=T,_=e.flowModel.value.nodes[N];if(!_)return;const O=V(_);let W=!0;i(_).hidePortForQuickAdd===!1&&(W=!1);const K=W&&!c.value&&!!O&&y(N);for(const X of k.getPorts()){const Y=K&&X.id===O?.portId?"hidden":"visible";k.setPortProp(X.id,"attrs/circle/visibility",Y)}}function L(N,T){v?.(),h=N,v=n.watch([l,c],([k],[_])=>{if(_&&_!==k){const O=N.getCellById(_);O?.isNode()&&T(O)}k&&x(k)},{flush:"sync"})}n.watch(u,N=>{N||(m.value=!1)});function U(){f&&clearTimeout(f),v?.(),v=null,h=null}return{quickAddNodeId:l,quickAddPopoverOpen:m,mergedConfig:C,data:u,enter:M,leave:b,cancelLeave:E,handleOverlayEnter:P,handleOverlayLeave:A,handleOpen:d,handleClose:p,handleStartDrag:g,handleInsert:w,isActiveForNode:y,syncNodePorts:x,attachRuntime:L,cleanup:U}}const $t=15,Ft=10;function Vt(r){const{editor:e}=r;let o=null,t=null,s=null,i=null;const a=[];let c=null;const l=n.computed(()=>({enabled:!1,bufferMargin:$t,incomingPortGroup:"left",outgoingPortGroup:"right",...r.edgeDropProp.value}));function m(y){if(!o)return null;const u=o.getCellById(y);if(!u?.isEdge())return null;const d=o.findViewByCell(u)?.container;if(!d)return null;const p=d.querySelectorAll("path");for(const g of p)if(g.getAttribute("stroke")!=="transparent")return g;return null}function f(y){const u=m(y);u&&(u.style.stroke="#3a84ff",i=y)}function h(){if(!i)return;const y=m(i);y&&(y.style.stroke=""),i=null}function v(y,u,d){if(o){const p=o.getCellById(y);if(p?.isNode()){const g=p.getPorts().find(w=>w.group===d);if(g?.id)return g.id}}if(u.ports?.length){const p=u.ports.find(g=>g.group===d);if(p)return p.id}return d}function C(y){const u=y.getTotalLength();if(u===0)return[];const d=[];for(let g=0;g<=u;g+=Ft){const w=y.getPointAtLength(g);d.push({x:w.x,y:w.y})}const p=y.getPointAtLength(u);return d.push({x:p.x,y:p.y}),d}function E(y,u,d){if(!o)return null;const p=l.value,g=p.bufferMargin,w={x:y.x+g,y:y.y+g,width:Math.max(0,y.width-g*2),height:Math.max(0,y.height-g*2)};if(w.width<=0||w.height<=0)return null;const x=w.x+w.width,L=w.y+w.height;let U=null;const N=y.x+y.width/2,T=y.y+y.height/2;for(const k of o.getEdges()){const _=u.edges[k.id];if(!_||d&&(_.source.nodeId===d||_.target.nodeId===d)||p.isEdgeDropTarget&&!p.isEdgeDropTarget(_,u))continue;const O=o.findViewByCell(k);if(!O)continue;const W=O.findOne?.("path");if(!W||typeof W.getTotalLength!="function")continue;const j=C(W);if(!j.length)continue;let K=!1,X=1/0;for(const Y of j)if(Y.x>=w.x&&Y.x<=x&&Y.y>=w.y&&Y.y<=L){const J=Y.x-N,Q=Y.y-T,se=J*J+Q*Q;se<X&&(X=se),K=!0}K&&(!U||X<U.distSq)&&(U={edgeId:k.id,edge:_,distSq:X})}return U?{edgeId:U.edgeId,edge:U.edge}:null}function b(y,u){if(!l.value.enabled)return;const p=e.flowModel.value,g=E(y,p,u);g?t!==g.edgeId&&(h(),t=g.edgeId,f(g.edgeId)):t&&(h(),t=null)}let M=!0;function P({node:y}){if(t=null,!l.value.enabled)return;const u=e.flowModel.value,d=u.nodes[y.id];if(!d){M=!1;return}const p=l.value;M=!p.isNodeInsertable||p.isNodeInsertable(d,u)}function A({node:y}){!l.value.enabled||!M||s===null&&(s=requestAnimationFrame(()=>{if(s=null,!o)return;const u=y.getPosition(),d=y.getSize();b({x:u.x,y:u.y,width:d.width,height:d.height},y.id)}))}function F(){s!==null&&(cancelAnimationFrame(s),s=null),h(),M=!0}function z(){if(!o)return;let y=!1;c=()=>{if(!l.value.enabled)return;const u=document.querySelector(".x6-widget-dnd");if(!u){y&&(y=!1,h(),t=null);return}y=!0,s===null&&(s=requestAnimationFrame(()=>{if(s=null,!o)return;const d=u.getBoundingClientRect(),p=o.clientToLocal(d.left,d.top),g=o.clientToLocal(d.right,d.bottom),w={x:p.x,y:p.y,width:g.x-p.x,height:g.y-p.y};b(w)}))},document.addEventListener("mousemove",c),a.push(()=>{c&&(document.removeEventListener("mousemove",c),c=null)})}function $(){h(),t=null,s!==null&&(cancelAnimationFrame(s),s=null)}function q(y){if(!t||y.source!=="user:drag")return y;const u=t;t=null,h();const d=e.flowModel.value,p=d.edges[u];if(!p)return y;const g=y.commands.find(O=>O.type==="node.add"||O.type==="node.move");if(!g)return y;const w=g.type==="node.add"?g.node.id:g.nodeId,x=g.type==="node.add"?g.node:d.nodes[g.nodeId];if(!x)return y;const L=l.value;if(L.isNodeInsertable&&!L.isNodeInsertable(x,d))return y;const U=v(w,x,L.incomingPortGroup),N=v(w,x,L.outgoingPortGroup),T=e.idGenerator("edge"),k=e.idGenerator("edge"),_=[{type:"edge.remove",edgeId:u},{type:"edge.add",edge:{id:T,type:p.type,source:{nodeId:p.source.nodeId,portId:p.source.portId},target:{nodeId:w,portId:U}}},{type:"edge.add",edge:{id:k,type:p.type,source:{nodeId:w,portId:N},target:{nodeId:p.target.nodeId,portId:p.target.portId}}}];return{...y,source:"user:edge-drop",commands:[...y.commands,..._]}}function V(y){o=y;const u=(d,p)=>{y.on(d,p),a.push(()=>y.off(d,p))};u("node:move",P),u("node:change:position",A),u("node:moved",F),z()}function D(){$();for(const y of a)y();a.length=0,o=null,M=!0}return{attachRuntime:V,tryExpandForEdgeDrop:q,cleanup:D}}function Ht(r){function e(s){return{id:r.idGenerator("node"),type:s.type,label:s.label,ports:s.ports?JSON.parse(JSON.stringify(s.ports)):void 0,payload:s.payload?JSON.parse(JSON.stringify(s.payload)):void 0,extensions:s.extensions?JSON.parse(JSON.stringify(s.extensions)):void 0}}function o(s,i,a){const c=r.api.value;switch(s){case"delete":return r.executeCommand({id:Z(),source:"user:toolbar",label:"删除节点",timestamp:Date.now(),commands:[{type:"node.remove",nodeId:i}]}),r._emitUiEvent({type:"node.action.delete",nodeId:i}),!0;case"copy":{if(!c)break;const l=r.flowModel.value.nodes[i];if(!l)break;const m=e(l);c.insertNodeToRight(i,m,{autoWireEdges:!1,gap:a,label:"复制节点"}),r._emitUiEvent({type:"node.action.copy",sourceNodeId:i,newNodeId:m.id});break}case"copy-insert":{if(!c)break;const l=r.flowModel.value.nodes[i];if(!l)break;const m=e(l);c.insertNodeToRight(i,m,{autoWireEdges:!0,gap:a,label:"复制并插入节点"}),r._emitUiEvent({type:"node.action.copy-insert",sourceNodeId:i,newNodeId:m.id});break}case"disconnect":{const l=r.flowModel.value,m=Object.entries(l.edges).filter(([,f])=>{const h=f;return h.source.nodeId===i||h.target.nodeId===i}).map(([f])=>f);if(m.length===0)break;r.executeCommand({id:Z(),source:"user:toolbar",label:"断开连线",timestamp:Date.now(),commands:m.map(f=>({type:"edge.remove",edgeId:f}))}),r._emitUiEvent({type:"node.action.disconnect",nodeId:i,edgeIds:m});break}case"debug":{r._emitUiEvent({type:"node.action.debug",nodeId:i});break}}return!1}function t(s){r.api.value?.deleteSelection({selection:s,source:"user:toolbar",label:"批量删除选中"})}return{handleNodeAction:o,deleteSelection:t}}function zt(){return{refX:0,children:[{tagName:"path",d:"M -16 -5 L -8 0 L -16 5 Z",transform:"rotate(0)"},{tagName:"circle",cx:0,cy:0,r:8,fill:"#3a84ff",stroke:"#3a84ff",transform:"rotate(0)"}]}}function qt(r,e){const o=e.defaultEdgeType??"default",t=e.edgeTypes?.[o],s={zIndex:-1,attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}};t?.router&&(s.router=typeof t.router=="string"?{name:t.router}:t.router),t?.connector&&(s.connector=typeof t.connector=="string"?{name:t.connector}:t.connector),t?.x6EdgeConfig&&Object.assign(s,t.x6EdgeConfig);const i=s.attrs??{},a=i.line??{};return s.attrs={...i,line:{...a,targetMarker:zt()}},r.createEdge(s)}const Gt={class:"flow-canvas-node-actions__bar"},Ut=n.defineComponent({__name:"node-actions-toolbar",props:{node:{},position:{},config:{},behavior:{},actionsOffset:{}},emits:["action"],setup(r,{emit:e}){const o=r,t=n.computed(()=>{const h=o.actionsOffset?.x??0,v=o.actionsOffset?.y??0,C=h!==0||v!==0;return{left:`${o.position.x}px`,top:`${o.position.y}px`,transform:C?`translate(${h}px, ${v}px)`:"translateX(-100%)"}}),s=e,i=n.computed(()=>({debug:{visible:o.config.showDebug&&o.behavior.debuggable!==!1,disabled:o.behavior.debugDisabled===!0},delete:{visible:o.config.showDelete&&o.behavior.deletable!==!1,disabled:o.behavior.deleteDisabled===!0},copy:{visible:o.config.showCopy&&o.behavior.copyable!==!1,disabled:o.behavior.copyDisabled===!0},copyInsert:{visible:o.config.showCopyInsert&&o.behavior.copyable!==!1,disabled:o.behavior.copyInsertDisabled===!0},disconnect:{visible:o.config.showDisconnect&&o.behavior.disconnectable!==!1,disabled:o.behavior.disconnectDisabled===!0}})),a=n.computed(()=>i.value.copy.visible||i.value.copyInsert.visible||i.value.disconnect.visible),c=n.ref(!1);let l=null;function m(){l&&(clearTimeout(l),l=null),c.value=!0}function f(){l=setTimeout(()=>{c.value=!1,l=null},100)}return n.onBeforeUnmount(()=>{l&&clearTimeout(l)}),(h,v)=>(n.openBlock(),n.createElementBlock("div",{class:"flow-canvas-node-actions",style:n.normalizeStyle(t.value)},[n.createElementVNode("div",Gt,[i.value.debug.visible?(n.openBlock(),n.createElementBlock("i",{key:0,class:n.normalizeClass(["flow-canvas-icon canvas-debug flow-canvas-node-actions__icon",{"is-disabled":i.value.debug.disabled}]),onClick:v[0]||(v[0]=C=>!i.value.debug.disabled&&s("action","debug",r.node.id))},null,2)):n.createCommentVNode("",!0),i.value.delete.visible?(n.openBlock(),n.createElementBlock("i",{key:1,class:n.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-node-actions__icon",{"is-disabled":i.value.delete.disabled}]),onClick:v[1]||(v[1]=C=>!i.value.delete.disabled&&s("action","delete",r.node.id))},null,2)):n.createCommentVNode("",!0),a.value?(n.openBlock(),n.createElementBlock("div",{key:2,class:"flow-canvas-node-actions__more-wrapper",onMouseenter:m,onMouseleave:f},[...v[5]||(v[5]=[n.createElementVNode("i",{class:"flow-canvas-icon canvas-gengduo flow-canvas-node-actions__icon"},null,-1)])],32)):n.createCommentVNode("",!0)]),n.createVNode(n.Transition,{name:"flow-canvas-fade"},{default:n.withCtx(()=>[c.value&&a.value?(n.openBlock(),n.createElementBlock("div",{key:0,class:"flow-canvas-node-actions__dropdown",onMouseenter:m,onMouseleave:f},[i.value.copy.visible?(n.openBlock(),n.createElementBlock("div",{key:0,class:n.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.copy.disabled}]),onClick:v[2]||(v[2]=C=>!i.value.copy.disabled&&s("action","copy",r.node.id))},[...v[6]||(v[6]=[n.createElementVNode("i",{class:"flow-canvas-icon canvas-copy-fuzhi-2"},null,-1),n.createElementVNode("span",null,"复制",-1)])],2)):n.createCommentVNode("",!0),i.value.copyInsert.visible?(n.openBlock(),n.createElementBlock("div",{key:1,class:n.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.copyInsert.disabled}]),onClick:v[3]||(v[3]=C=>!i.value.copyInsert.disabled&&s("action","copy-insert",r.node.id))},[...v[7]||(v[7]=[n.createElementVNode("i",{class:"flow-canvas-icon canvas-fuzhibingcharu"},null,-1),n.createElementVNode("span",null,"复制并插入",-1)])],2)):n.createCommentVNode("",!0),i.value.disconnect.visible?(n.openBlock(),n.createElementBlock("div",{key:2,class:n.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.disconnect.disabled}]),onClick:v[4]||(v[4]=C=>!i.value.disconnect.disabled&&s("action","disconnect",r.node.id))},[...v[8]||(v[8]=[n.createElementVNode("i",{class:"flow-canvas-icon canvas-unlock-jiebang"},null,-1),n.createElementVNode("span",null,"断开连线",-1)])],2)):n.createCommentVNode("",!0)],32)):n.createCommentVNode("",!0)]),_:1})],4))}}),ne=(r,e)=>{const o=r.__vccOpts||r;for(const[t,s]of e)o[t]=s;return o},qe=ne(Ut,[["__scopeId","data-v-3b39dab5"]]),jt={key:0,class:"flow-canvas-quick-add__tooltip"},Wt=5,Xt=n.defineComponent({__name:"node-quick-add-popover",props:{node:{},portPosition:{}},emits:["open","close","start-drag","mouseenter","mouseleave"],setup(r,{expose:e,emit:o}){const t=r,s=o,i=n.ref(),a=n.ref(),c=n.ref(!1),l=n.ref(!1);let m=null,f=!1,h=null;function v(V){V.preventDefault(),V.stopPropagation(),m={x:V.clientX,y:V.clientY},f=!1,document.addEventListener("mousemove",C),document.addEventListener("mouseup",E)}function C(V){if(!m)return;const D=V.clientX-m.x,y=V.clientY-m.y;Math.sqrt(D*D+y*y)>=Wt&&(f=!0,b(),s("start-drag",t.node.id))}function E(){b(),f||M(),m=null,f=!1}function b(){document.removeEventListener("mousemove",C),document.removeEventListener("mouseup",E)}function M(){l.value?A():P()}function P(){l.value=!0,s("open",t.node.id),requestAnimationFrame(()=>{document.addEventListener("mousedown",F)})}function A(){l.value=!1,s("close"),document.removeEventListener("mousedown",F)}function F(V){const D=V.target;i.value?.contains(D)||a.value?.contains(D)||A()}function z(){l.value||s("mouseleave")}function $(){h&&(clearTimeout(h),h=null),s("mouseenter")}function q(){h=setTimeout(()=>{A(),s("mouseleave"),h=null},150)}return n.onBeforeUnmount(()=>{b(),h&&clearTimeout(h),document.removeEventListener("mousedown",F)}),e({closePopover:A}),(V,D)=>(n.openBlock(),n.createElementBlock("div",{class:"flow-canvas-quick-add",style:n.normalizeStyle({left:`${r.portPosition.x}px`,top:`${r.portPosition.y}px`}),onMouseenter:D[2]||(D[2]=y=>s("mouseenter")),onMouseleave:z,onClick:D[3]||(D[3]=n.withModifiers(()=>{},["stop"]))},[n.createElementVNode("div",{ref_key:"btnRef",ref:i,class:n.normalizeClass(["flow-canvas-quick-add__btn",{"is-hovered":c.value,"is-active":l.value}]),onMouseenter:D[0]||(D[0]=y=>c.value=!0),onMouseleave:D[1]||(D[1]=y=>c.value=!1),onMousedown:v},[...D[4]||(D[4]=[n.createElementVNode("i",{class:"flow-canvas-icon canvas-zoom-add"},null,-1)])],34),c.value&&!l.value?(n.openBlock(),n.createElementBlock("div",jt,[...D[5]||(D[5]=[n.createElementVNode("div",null,[n.createElementVNode("b",null,"点击"),n.createTextVNode(" 添加节点")],-1),n.createElementVNode("div",null,[n.createElementVNode("b",null,"拖拽"),n.createTextVNode(" 连接节点")],-1)])])):n.createCommentVNode("",!0),n.createVNode(n.Transition,{name:"flow-canvas-fade"},{default:n.withCtx(()=>[l.value?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"popoverRef",ref:a,class:"flow-canvas-quick-add__popover",onMouseenter:$,onMouseleave:q},[n.renderSlot(V.$slots,"default",{},()=>[D[6]||(D[6]=n.createElementVNode("div",{class:"flow-canvas-quick-add__default-content"},"节点快捷操作面板",-1))],!0)],544)):n.createCommentVNode("",!0)]),_:3})],36))}}),Ge=ne(Xt,[["__scopeId","data-v-336cc3b4"]]),Kt={class:"flow-canvas-selection-actions__bar"},Zt=n.defineComponent({__name:"selection-actions-toolbar",props:{position:{},canDelete:{type:Boolean}},emits:["action"],setup(r,{emit:e}){const o=r,t=e,s=n.computed(()=>({left:`${o.position.x}px`,top:`${o.position.y}px`,transform:"translateX(-100%)"}));return(i,a)=>(n.openBlock(),n.createElementBlock("div",{class:"flow-canvas-selection-actions",style:n.normalizeStyle(s.value)},[n.createElementVNode("div",Kt,[n.createElementVNode("i",{class:n.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-selection-actions__icon",{"is-disabled":!r.canDelete}]),onClick:a[0]||(a[0]=c=>r.canDelete&&t("action","delete"))},null,2)])],4))}}),Yt=ne(Zt,[["__scopeId","data-v-25eb8b79"]]),Qt={class:"flow-canvas-runtime-core__overlay"},Jt=n.defineComponent({__name:"canvas-runtime-core",props:{editor:{},graphOptions:{},nodeActions:{},quickAdd:{},edgeDrop:{},getConnectionExcludedNodeIds:{type:Function},toolbarInclude:{}},emits:["ui-event"],setup(r,{expose:e,emit:o}){const t=r,s=o,i=n.ref(),a=n.ref();let c,l,m,f,h=null,v=null,C=null,E=null;const b=Tt(),{hoveredNodeId:M,isDraggingNode:P}=b,A=b.enterOverlay,F=()=>b.leaveOverlay(),z=n.ref(0),$=n.ref({nodeIds:[],edgeIds:[]});function q(S){const I=t.editor.api.value;return I?t.editor.schema.nodeTypes[S.type]?.getBehavior?.(S,{api:I,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})??{}:{}}const V=n.computed(()=>t.editor.mode.value==="edit"&&t.editor.selectionMode.value),D=n.computed(()=>({showDebug:!1,showDelete:!0,showCopy:!0,showCopyInsert:!0,showDisconnect:!0,insertGap:100,...t.nodeActions})),y=n.computed(()=>{if(z.value,!t.editor.api.value)return[];const S=t.editor.flowModel.value,I=t.editor.api.value.overlay,B=[];for(const[H,G]of Object.entries(S.nodes)){const le=t.editor._pluginManager.collectNodeDecorations(G);if(!le?.badge)continue;const re=I.getNodeScreenRect(H);re&&B.push({nodeId:H,x:re.x+re.width-4,y:re.y-8,badge:le.badge})}return B}),u=n.computed(()=>{z.value;const S=M.value;if(!S||P.value||!t.editor.api.value||t.editor.mode.value!=="edit"||V.value)return null;const B=t.editor.flowModel.value.nodes[S];if(!B)return null;const H=t.editor.api.value.overlay.getNodeScreenRect(S);if(!H)return null;const G=q(B);return G.showActions===!1?null:{node:B,position:{x:H.x+H.width,y:H.y+H.height+4},behavior:G}}),d=n.computed(()=>{if(z.value,!t.editor.api.value||t.editor.mode.value!=="edit")return null;const S=$.value;if(S.nodeIds.length+S.edgeIds.length<=1)return null;const I=t.editor.api.value.getSelectionBounds(S);if(!I)return null;const B=ze(S,t.editor.flowModel.value,q);return{position:{x:I.x+I.width,y:I.y+I.height+4},canDelete:B.nodeIds.length>0||B.edgeIds.length>0}}),p=n.ref(),g=Ot({editor:t.editor,quickAddProp:n.computed(()=>t.quickAdd),isDraggingNode:P,nodeHover:b,isSelectionModeActive:V,viewportVersion:z,getNodeBehavior:q,getInsertGap:()=>D.value.insertGap,closePopover:()=>p.value?.closePopover()}),w=g.data,x=g.handleOpen,L=g.handleStartDrag;function U(){g.handleClose(),b.leaveOverlay(200),g.leave()}const N=g.handleOverlayEnter,T=g.handleOverlayLeave,k=g.handleInsert,_=Vt({editor:t.editor,edgeDropProp:n.computed(()=>t.edgeDrop)}),O=Ht(t.editor);function W(S,I){O.handleNodeAction(S,I,D.value.insertGap)&&(M.value=null)}function j(S){S==="delete"&&O.deleteSelection($.value)}function K(S){if(t.editor.mode.value!=="edit")return;if((S.metaKey||S.ctrlKey)&&(S.key==="z"||S.key==="Z")){if(S.shiftKey){if(!t.toolbarInclude?.includes("redo"))return;t.editor.history.redo()}else{if(!t.toolbarInclude?.includes("undo"))return;t.editor.history.undo()}S.preventDefault();return}t.editor._pluginManager.dispatchKeyboardShortcut(S)&&(S.preventDefault(),S.stopPropagation())}function X(S,I){const B=c,H=G=>{const le=B.isRubberbandEnabled?.()??!1;le&&B.disableRubberband?.(),G?c.enablePanning():c.disablePanning(),le&&B.enableRubberband?.()};S&&I?(B.enableSelection?.(),b.reset(),g.quickAddNodeId.value=null,g.quickAddPopoverOpen.value=!1,h?.remove(),H(!1),B.enableRubberband?.()):(B.disableRubberband?.(),H(!0),B.disableSelection?.(),B.cleanSelection?.())}function Y(S){c.on("node:move",({node:I})=>{P.value=!0;const B=t.editor.flowModel.value.nodes[I.id];B&&q(B).bringToFrontOnDrag===!1||I.toFront?.()}),c.on("node:moved",()=>{P.value=!1}),c.on("node:mouseenter",({node:I})=>{if(V.value){M.value=null,g.quickAddNodeId.value=null,S.hideNodePorts(I);return}b.enter(I.id);const B=t.editor.flowModel.value.nodes[I.id];if(B&&q(B).showPorts===!1){g.mergedConfig.value.enabled&&g.enter(I.id);return}g.mergedConfig.value.enabled&&g.enter(I.id)||S.showNodePorts(I)}),c.on("node:mouseleave",({node:I})=>{if(V.value){S.hideNodePorts(I);return}const B=t.editor.flowModel.value.nodes[I.id];let H=100;B&&q(B).actionsOffset&&(H=300),b.leave(H),g.mergedConfig.value.enabled?g.quickAddNodeId.value===I.id&&!g.quickAddPopoverOpen.value?g.leave():g.quickAddNodeId.value!==I.id&&S.hideNodePorts(I):S.hideNodePorts(I)})}function J(S){c.on("edge:added",({edge:I})=>{let B;if(t.getConnectionExcludedNodeIds&&!I.getTargetCell()){const H=I.getSourceCell();if(H){const G=t.getConnectionExcludedNodeIds(H.id);B=G instanceof Set?G:new Set(G)}}S.handleEdgeAdded(I,B)}),c.on("edge:connected",()=>{S.handleEdgeConnected()}),c.on("edge:removed",({edge:I})=>{S.handleEdgeRemoved(I.id),h.handleEdgeRemoved(I.id)}),c.on("edge:mouseenter",({edge:I,e:B})=>{const H=l.getHoveredEdgeId();l.setHoveredEdge(I.id),H&&H!==I.id&&l.refreshSingleEdgeStyle(H),l.refreshSingleEdgeStyle(I.id),t.editor.mode.value==="edit"&&!V.value&&S.canShowEdgeTool()&&h.show(I.id,B)}),c.on("edge:mouseleave",({edge:I})=>{l.setHoveredEdge(null),l.refreshSingleEdgeStyle(I.id),h.remove()}),c.on("edge:click",({edge:I,e:B})=>{B.target?.closest?.(".flow-canvas-edge-delete-tool")&&t.editor.mode.value==="edit"&&(h.remove(),t.editor.executeCommand({id:Z(),source:"user:toolbar",label:"删除连线",timestamp:Date.now(),commands:[{type:"edge.remove",edgeId:I.id}]}))}),v=I=>h.move(I),c.container.addEventListener("mousemove",v)}function Q(){C=S=>{if(!M.value&&!g.quickAddNodeId.value)return;const I=S.target;if(I?.closest?.(".x6-node")||I?.closest?.(".flow-canvas-node-actions")||I?.closest?.(".flow-canvas-quick-add")){b.cancelLeave(),g.cancelLeave();return}b.leave(180),g.quickAddPopoverOpen.value||g.leave()},i.value?.addEventListener("mousemove",C),E=()=>{b.reset(),g.quickAddPopoverOpen.value||(g.quickAddNodeId.value=null)},i.value?.addEventListener("mouseleave",E),i.value?.addEventListener("keydown",K)}function se(){n.watch(()=>t.editor.flowModel.value,S=>l.syncFlowModel(S)),n.watch([()=>t.editor.mode.value,()=>t.editor.selectionMode.value],([S,I])=>{X(S==="edit",I)},{immediate:!0})}n.onMounted(()=>{if(!a.value)return;const S=new Set(["model","container"]),I={};if(t.graphOptions)for(const[R,ee]of Object.entries(t.graphOptions)){if(S.has(R)){console.warn(`[flow-canvas] graphOptions.${R} is managed by the engine and will be ignored`);continue}I[R]=ee}c=new tt.Graph({container:a.value,autoResize:!0,background:{color:"#edf2fc"},grid:{visible:!0,size:20,type:"dot"},highlighting:{magnetAdsorbed:{name:"className",args:{className:"flow-canvas-magnet-adsorbed"}}},panning:{enabled:!0},mousewheel:{enabled:!0,modifiers:["ctrl","meta"]},interacting:{nodeMovable(R){return R.cell.getProp("draggable")!==!1}},connecting:{allowBlank:!1,allowMulti:!0,allowLoop:!1,allowNode:!1,allowEdge:!1,highlight:!0,anchor:"center",connectionPoint:"anchor",snap:{radius:30},createEdge(){return qt(this,t.editor.schema)}},...I}),m=new St,l=new Nt(c,t.editor.schema,m,R=>t.editor._pluginManager.collectNodeDecorations(R),R=>t.editor._pluginManager.collectEdgeDecorations(R),()=>t.editor.api.value?{api:t.editor.api.value,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value}:null);const B=Mt(c),H=Pt({graph:c,overlayManager:B,executeCommand:R=>t.editor.executeCommand(_.tryExpandForEdgeDrop(R)),schema:t.editor.schema,flowModel:t.editor.flowModel,getNodeBehavior:q,idGenerator:t.editor.idGenerator,defaultInsertGap:t.nodeActions?.insertGap,getContextMenuItems:R=>t.editor._pluginManager.collectContextMenuItems(R),onHighlightChange:(R,ee)=>{l.setHighlightedNodes(R);const oe=l.setHighlightedEdges(ee);l.refreshNodeHighlights();const ie=new Set(ee);for(const ae of oe)ie.has(ae)||l.refreshSingleEdgeStyle(ae);for(const ae of ie)oe.has(ae)||l.refreshSingleEdgeStyle(ae)},resolveNodeShape:R=>{const ee=t.editor.schema.nodeTypes[R];if(!ee)return null;const oe=m.registerNodeType(R,ee.component),ie=ee.getSize({id:"",type:R,position:{x:0,y:0}});return{shapeName:oe,width:ie.width,height:ie.height}}});t.editor.api.value=H;const G={flowModel:t.editor.flowModel,history:t.editor.history,schema:t.editor.schema,mode:t.editor.mode,idGenerator:t.editor.idGenerator,executeCommand:t.editor.executeCommand,selectionMode:t.editor.selectionMode,api:H,overlay:B,graph:c};t.editor._pluginManager.attachRuntime(G);const le=t.editor._pluginManager.collectExtendedApi();Object.assign(t.editor.extendedApi,le),t.editor._emitUiEvent=R=>{t.editor._pluginManager.dispatchUiEvent(R),s("ui-event",R)},f=new Dt(c,R=>{(R.type==="node.click"||R.type==="node.dblclick"||R.type==="node.contextmenu")&&b.enter(R.nodeId),t.editor._emitUiEvent(R)},R=>{if(l.isSyncing)return;const ee=_.tryExpandForEdgeDrop(R);if(t.editor.executeCommand(ee).status!=="applied"){for(const ie of ee.commands)if(ie.type==="edge.add"){const ae=c.getCellById(ie.edge.id);ae&&c.removeCell(ae)}}},t.editor.flowModel,t.editor.idGenerator),h=Rt(c);const re=Lt(c);g.attachRuntime(c,R=>re.hideNodePorts(R)),_.attachRuntime(c),Y(re),J(re);let me=new Set;c.on("selection:changed",()=>{const R=He(c.getSelectedCells?.()??[]);$.value=R,t.editor._pluginManager.dispatchSelectionChange(R),s("ui-event",{type:"selection.change",nodeIds:R.nodeIds,edgeIds:R.edgeIds}),l.refreshNodeHighlights();const ee=new Set(R.edgeIds);for(const oe of me)ee.has(oe)||l.refreshSingleEdgeStyle(oe);for(const oe of ee)me.has(oe)||l.refreshSingleEdgeStyle(oe);me=ee});const ye=()=>{z.value++};c.on("translate",ye),c.on("scale",ye),c.on("resize",ye),Q(),l.syncFlowModel(t.editor.flowModel.value),se()});function ce(){b.reset(),g.quickAddNodeId.value=null,g.quickAddPopoverOpen.value=!1}return e({resetHoverState:ce}),n.onBeforeUnmount(()=>{b.cleanup(),g.cleanup(),_.cleanup(),h?.remove(),v&&c?.container?.removeEventListener("mousemove",v),C&&i.value?.removeEventListener("mousemove",C),E&&i.value?.removeEventListener("mouseleave",E),i.value?.removeEventListener("keydown",K),t.editor._pluginManager.detachRuntime(),t.editor.api.value=null;for(const S of Object.keys(t.editor.extendedApi))delete t.editor.extendedApi[S];f?.dispose(),l?.dispose(),m?.dispose(),c?.dispose()}),(S,I)=>(n.openBlock(),n.createElementBlock("div",{ref_key:"rootRef",ref:i,class:n.normalizeClass(["flow-canvas-runtime-core",{"flow-canvas-runtime-core--selection-mode":V.value}]),tabindex:"0"},[n.createElementVNode("div",{ref_key:"containerRef",ref:a,class:"flow-canvas-runtime-core__graph"},null,512),n.createElementVNode("div",Qt,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(y.value,B=>(n.openBlock(),n.createElementBlock("div",{key:`badge-${B.nodeId}`,class:"flow-canvas-runtime-core__badge",style:n.normalizeStyle({left:`${B.x}px`,top:`${B.y}px`,backgroundColor:B.badge.color})},n.toDisplayString(B.badge.text),5))),128)),n.unref(w)?(n.openBlock(),n.createBlock(Ge,{key:0,ref_key:"quickAddPopoverRef",ref:p,node:n.unref(w).node,"port-position":n.unref(w).portPosition,onOpen:n.unref(x),onClose:U,onStartDrag:n.unref(L),onMouseenter:n.unref(N),onMouseleave:n.unref(T)},{default:n.withCtx(()=>[n.renderSlot(S.$slots,"quick-add-panel",{node:n.unref(w).node,api:r.editor.api.value,insertNodeToRight:B=>n.unref(k)(n.unref(w).node.id,B),closePopover:()=>p.value?.closePopover()},void 0,!0)]),_:3},8,["node","port-position","onOpen","onStartDrag","onMouseenter","onMouseleave"])):n.createCommentVNode("",!0),u.value?(n.openBlock(),n.createBlock(qe,{key:1,node:u.value.node,position:u.value.position,config:D.value,behavior:u.value.behavior,"actions-offset":u.value.behavior.actionsOffset,onAction:W,onMouseenter:n.unref(A),onMouseleave:F},null,8,["node","position","config","behavior","actions-offset","onMouseenter"])):n.createCommentVNode("",!0),d.value?(n.openBlock(),n.createBlock(Yt,{key:2,position:d.value.position,"can-delete":d.value.canDelete,onAction:j},null,8,["position","can-delete"])):n.createCommentVNode("",!0)])],2))}}),eo=ne(Jt,[["__scopeId","data-v-c5b9932f"]]),to={class:"flow-canvas-node-palette"},oo=["data-node-type"],no={class:"flow-canvas-node-palette__item-label"},so=n.defineComponent({__name:"canvas-node-palette",props:{editor:{},items:{}},setup(r){const e=r,o=n.ref(),t=n.computed(()=>e.items?e.items:Object.keys(e.editor.schema.nodeTypes).map(s=>({type:s,label:s.charAt(0).toUpperCase()+s.slice(1)})));return n.watch([()=>e.editor.api.value,t,o],([s,i,a],c,l)=>{if(!s||!a)return;const m=[];for(const f of i){const h=a.querySelector(`[data-node-type="${f.type}"]`);if(!h)continue;const v=s.registerDndSource(h,()=>({id:Z(),type:f.type,label:f.label,position:{x:0,y:0}}));m.push(v)}l(()=>{for(const f of m)f()})},{flush:"post"}),(s,i)=>(n.openBlock(),n.createElementBlock("div",to,[n.createElementVNode("div",{ref_key:"listRef",ref:o,class:"flow-canvas-node-palette__list"},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(t.value,a=>(n.openBlock(),n.createElementBlock("div",{key:a.type,class:"flow-canvas-node-palette__item","data-node-type":a.type},[a.icon?(n.openBlock(),n.createElementBlock("i",{key:0,class:n.normalizeClass([a.icon,"flow-canvas-node-palette__item-icon"])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("span",no,n.toDisplayString(a.label),1)],8,oo))),128))],512)]))}}),Ue=ne(so,[["__scopeId","data-v-300314b7"]]),ro={class:"flow-canvas-layout"},io={class:"flow-canvas-layout__main"},ao={class:"flow-canvas-layout__content"},lo={key:0,class:"flow-canvas-layout__footer"},co=n.defineComponent({__name:"canvas-layout",props:{sidebarCollapsed:{type:Boolean,default:!1},sidebarWidth:{default:260},hideSidebar:{type:Boolean,default:!1},hideFooter:{type:Boolean,default:!1},editor:{default:void 0},paletteItems:{default:void 0}},emits:["update:sidebarCollapsed"],setup(r){return(e,o)=>(n.openBlock(),n.createElementBlock("div",ro,[!r.hideSidebar&&(e.$slots.sidebar||r.editor)?(n.openBlock(),n.createElementBlock("aside",{key:0,class:n.normalizeClass(["flow-canvas-layout__sidebar",{"is-collapsed":r.sidebarCollapsed}]),style:n.normalizeStyle({width:r.sidebarCollapsed?"0px":`${r.sidebarWidth}px`})},[n.renderSlot(e.$slots,"sidebar",{},()=>[r.editor?(n.openBlock(),n.createBlock(Ue,{key:0,editor:r.editor,items:r.paletteItems},null,8,["editor","items"])):n.createCommentVNode("",!0)],!0)],6)):n.createCommentVNode("",!0),n.createElementVNode("div",io,[n.createElementVNode("div",ao,[n.renderSlot(e.$slots,"default",{},void 0,!0)]),!r.hideFooter&&e.$slots.footer?(n.openBlock(),n.createElementBlock("div",lo,[n.renderSlot(e.$slots,"footer",{},void 0,!0)])):n.createCommentVNode("",!0)])]))}}),uo=ne(co,[["__scopeId","data-v-26f35b6b"]]),Te=typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform??navigator.userAgent),fo=["undo","redo"];function je(r){const e=new Set(r?.include),o=new Set(fo.filter(l=>!e.has(l))),t=[{id:"undo",type:"undo",group:"history",icon:"flow-canvas-icon canvas-undo",description:"撤销",shortcut:Te?["⌘","Z"]:["Ctrl","Z"],order:10},{id:"redo",type:"redo",group:"history",icon:"flow-canvas-icon canvas-redo",description:"重做",shortcut:Te?["⇧","⌘","Z"]:["Ctrl","Shift","Z"],order:11}],s=[{id:"select",type:"select",group:"tools",icon:"flow-canvas-icon canvas-kuangxuan",description:"框选模式",order:20},{id:"auto-layout",type:"auto-layout",group:"tools",icon:"flow-canvas-icon canvas-beautify",description:"自动排版",order:21},{id:"export",type:"export",group:"tools",icon:"flow-canvas-icon canvas-xiazai",description:"下载",order:24}],i=[{id:"zoom-out",type:"zoom-out",group:"zoom",icon:"flow-canvas-icon canvas-zoom-minus",description:"缩小画布",order:30},{id:"zoom-display",type:"zoom-display",group:"zoom",order:31},{id:"zoom-in",type:"zoom-in",group:"zoom",icon:"flow-canvas-icon canvas-zoom-add",description:"放大画布",order:32}],a=[{id:"reset",type:"reset",group:"reset",icon:"flow-canvas-icon canvas-reset-1_1",description:"重置视图",order:40}];return[...[...t,...s].filter(l=>!o.has(l.type)),...i,...a]}const po={class:"flow-canvas-toolbar"},go={key:0,class:"flow-canvas-toolbar__separator"},ho={class:"flow-canvas-toolbar__group"},vo={key:0,class:"flow-canvas-toolbar__zoom-display"},mo=["data-toolbar-id","data-toolbar-type","disabled","onClick","onMouseenter"],yo=["textContent"],wo={key:0,class:"flow-canvas-toolbar-tooltip__kbd"},bo=n.defineComponent({__name:"canvas-toolbar",props:{items:{},exclude:{},include:{},editor:{}},setup(r){const e=new Set(["undo","redo","select","auto-layout","search","minimap","export"]),o=new Set(["select","search","minimap"]);function t(d){return d.id.startsWith("plugin:")||d.type==="custom"}function s(d){return d!=="custom"&&o.has(d)}const i=r,a=n.computed(()=>{if(i.items)return i.items;const d=je({include:i.include}),p=i.editor.toolbarItems.value,g=new Set(i.exclude??[]),w=new Map;for(const x of d)w.set(x.id,x);for(const x of p){const L=w.get(x.id);L?w.set(x.id,{...L,...x,order:L.order,group:L.group}):t(x)&&w.set(x.id,x)}return[...w.values()].filter(x=>x.type==="custom"||!e.has(x.type)?!0:!g.has(x.type)).sort((x,L)=>(x.order??0)-(L.order??0))}),c=n.ref(1),l=n.ref(null),m=n.ref(null),f=n.ref(!1);let h=null;n.watch(()=>i.editor.api.value,d=>{h?.(),h=null,d&&(c.value=d.getZoom(),h=d.onGraphEvent("scale",()=>{c.value=d.getZoom()}))},{immediate:!0});const v=n.reactive({visible:!1,text:"",shortcut:[],x:0,y:0});function C(d,p){if(!p.description)return;const w=d.currentTarget.getBoundingClientRect();v.text=p.description,v.shortcut=p.shortcut??[],v.visible=!0,n.nextTick(()=>{const x=l.value?.offsetWidth??0,L=l.value?.offsetHeight??0;v.x=w.left+w.width/2-x/2,v.y=w.top-L-6})}function E(){v.visible=!1,l.value=null}n.onScopeDispose(()=>{h?.()});const b=n.computed(()=>`${Math.round(c.value*100)}%`),M=n.computed(()=>i.editor.api.value?{api:i.editor.api.value,flowModel:i.editor.flowModel.value,history:i.editor.history,mode:i.editor.mode.value}:null);function P(d){return d.visible===!1?!1:typeof d.visible=="function"?M.value?d.visible(M.value):!1:!0}function A(d){return typeof d.active=="function"?M.value?d.active(M.value):!1:d.active!==void 0?d.active:d.type==="select"?i.editor.selectionMode.value:!1}const F=n.computed(()=>{const d=y.value.filter(g=>s(g.type)&&A(g));if(d.length===0)return null;const p=m.value;return p&&d.some(g=>g.type===p)?p:d[0]?.type??null});function z(d){return s(d.type)?F.value===d.type:A(d)}function $(d){return!M.value||d.disabled===!0?!0:typeof d.disabled=="function"?d.disabled(M.value):d.type==="undo"?!i.editor.history.canUndo.value:d.type==="redo"?!i.editor.history.canRedo.value:d.type==="export"?f.value:!1}function q(d){if(!(!M.value||!s(d.type)||!A(d))){if(d.type==="select"){i.editor.setSelectionMode(!1);return}d.onClick?.(M.value)}}function V(d){if(s(d.type))for(const p of y.value)!s(p.type)||p.id===d.id||q(p)}function D(d){if(!M.value||$(d))return;if(s(d.type)&&(m.value=d.type,V(d)),d.onClick){d.onClick(M.value);return}const{api:p}=M.value;switch(d.type){case"undo":i.editor.history.undo();break;case"redo":i.editor.history.redo();break;case"zoom-in":p.zoomIn(),c.value=p.getZoom();break;case"zoom-out":p.zoomOut(),c.value=p.getZoom();break;case"fit":p.zoomToFit();break;case"reset":p.zoomTo(1),p.scrollToOrigin(),c.value=1;break;case"export":if(f.value)break;f.value=!0,p.exportAsImage().then(g=>{const w=URL.createObjectURL(g),x=document.createElement("a");x.href=w,x.download="canvas-export.png",x.click(),URL.revokeObjectURL(w)}).catch(g=>{console.warn("[flow-canvas] Export failed:",g)}).finally(()=>{f.value=!1});break;case"select":i.editor.setSelectionMode(!i.editor.selectionMode.value);break;case"auto-layout":i.editor._emitUiEvent({type:"toolbar.auto-layout"});break;case"search":case"minimap":console.warn(`[flow-canvas] "${d.type}" toolbar item has no built-in handler. Provide an onClick callback.`);break;default:d.type!=="custom"&&console.warn(`[flow-canvas] No default handler for toolbar type "${d.type}". Provide an onClick handler.`);break}}const y=n.computed(()=>a.value.filter(P)),u=n.computed(()=>{const d=new Map,p=[];for(const g of y.value){const w=g.group??"default";d.has(w)||(d.set(w,[]),p.push(w)),d.get(w).push(g)}return p.map(g=>({name:g,items:d.get(g)})).filter(g=>g.items.length>0)});return(d,p)=>(n.openBlock(),n.createElementBlock("div",po,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(u.value,(g,w)=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:g.name},[w>0?(n.openBlock(),n.createElementBlock("div",go)):n.createCommentVNode("",!0),n.createElementVNode("div",ho,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(g.items,x=>(n.openBlock(),n.createElementBlock(n.Fragment,{key:x.id},[x.type==="zoom-display"?(n.openBlock(),n.createElementBlock("span",vo,n.toDisplayString(b.value),1)):(n.openBlock(),n.createElementBlock("button",{key:1,type:"button",class:n.normalizeClass(["flow-canvas-toolbar__btn",{"is-disabled":$(x),"is-active":z(x),"is-exporting":x.type==="export"&&f.value}]),"data-toolbar-id":x.id,"data-toolbar-type":x.type,disabled:$(x),onClick:L=>D(x),onMouseenter:L=>C(L,x),onMouseleave:E},[x.component?(n.openBlock(),n.createBlock(n.resolveDynamicComponent(x.component),{key:0})):x.icon?(n.openBlock(),n.createElementBlock("i",{key:1,class:n.normalizeClass(x.icon)},null,2)):(n.openBlock(),n.createElementBlock("span",{key:2,class:"flow-canvas-toolbar__text",textContent:n.toDisplayString(x.text??x.description??x.id)},null,8,yo))],42,mo))],64))),128))])],64))),128)),(n.openBlock(),n.createBlock(n.Teleport,{to:"body"},[v.visible?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"tooltipRef",ref:l,class:"flow-canvas-toolbar-tooltip",style:n.normalizeStyle({left:`${v.x}px`,top:`${v.y}px`})},[n.createElementVNode("span",null,n.toDisplayString(v.text),1),v.shortcut.length?(n.openBlock(),n.createElementBlock("kbd",wo,[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(v.shortcut,(g,w)=>(n.openBlock(),n.createElementBlock("span",{key:w},n.toDisplayString(g),1))),128))])):n.createCommentVNode("",!0),p[0]||(p[0]=n.createElementVNode("div",{class:"flow-canvas-toolbar-tooltip__arrow"},null,-1))],4)):n.createCommentVNode("",!0)]))]))}}),Eo=ne(bo,[["__scopeId","data-v-904248f4"]]),ko={class:"flow-canvas-default-node__ep-label"},Co={key:1,class:"flow-canvas-default-node__diamond flow-canvas-highlight-target"},xo={key:2,class:"flow-canvas-default-node__task-label"},Io=n.defineComponent({__name:"default-node",setup(r){const o=n.inject("getNode")?.(),t=n.computed(()=>o?.getData?.()??null),s=n.computed(()=>t.value?.label||t.value?.type||""),i={start:"canvas-kaishi",end:"canvas-stop","parallel-gateway":"canvas-bingxingwangguan","branch-gateway":"canvas-fenzhiwangguan","converge-gateway":"canvas-huijuwangguan","conditional-parallel-gateway":"canvas-tiaojianbingxingwangguan"},a=new Set(["start","end"]),c=new Set(["parallel-gateway","branch-gateway","converge-gateway","conditional-parallel-gateway"]),l=n.computed(()=>{const f=t.value?.type??"";return a.has(f)?"endpoint":c.has(f)?"gateway":"task"}),m=n.computed(()=>i[t.value?.type??""]??"");return(f,h)=>(n.openBlock(),n.createElementBlock("div",{class:n.normalizeClass(["flow-canvas-default-node",[`is-${l.value}`,{"flow-canvas-highlight-target":l.value!=="gateway"}]])},[l.value==="endpoint"?(n.openBlock(),n.createElementBlock(n.Fragment,{key:0},[m.value?(n.openBlock(),n.createElementBlock("i",{key:0,class:n.normalizeClass([["flow-canvas-icon",m.value],"flow-canvas-default-node__ep-icon"])},null,2)):n.createCommentVNode("",!0),n.createElementVNode("span",ko,n.toDisplayString(s.value),1)],64)):l.value==="gateway"?(n.openBlock(),n.createElementBlock("div",Co,[m.value?(n.openBlock(),n.createElementBlock("i",{key:0,class:n.normalizeClass([["flow-canvas-icon",m.value],"flow-canvas-default-node__gw-icon"])},null,2)):n.createCommentVNode("",!0)])):(n.openBlock(),n.createElementBlock("span",xo,n.toDisplayString(s.value),1))],2))}}),We=ne(Io,[["__scopeId","data-v-f0e24a9f"]]),No={start:{label:"开始",icon:"flow-canvas-icon canvas-kaishi",width:88,height:40},end:{label:"结束",icon:"flow-canvas-icon canvas-stop",width:88,height:40},empty:{label:"空节点",icon:"flow-canvas-icon canvas-jiedi",width:240,height:48},"parallel-gateway":{label:"并行网关",icon:"flow-canvas-icon canvas-bingxingwangguan",width:64,height:64},"branch-gateway":{label:"分支网关",icon:"flow-canvas-icon canvas-fenzhiwangguan",width:64,height:64},"converge-gateway":{label:"汇聚网关",icon:"flow-canvas-icon canvas-huijuwangguan",width:64,height:64},"conditional-parallel-gateway":{label:"条件并行网关",icon:"flow-canvas-icon canvas-tiaojianbingxingwangguan",width:64,height:64}},Re=(r,e)=>({stroke:e.hovered?"#3a84ff":"#abb5cc",strokeWidth:2});function Le(){return{attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}}}function Xe(){return{manhattan:{router:{name:"manhattan",args:{padding:10,maxDirectionChange:90}},connector:{name:"rounded",args:{radius:8}},style:Re,x6EdgeConfig:Le()},bezier:{connector:{name:"smooth"},style:Re,x6EdgeConfig:Le()}}}function So(r){const e=r?.nodeTypes??No,o={},t=[];for(const[a,c]of Object.entries(e)){const l=c.width??150,m=c.height??50;o[a]={component:We,getSize:()=>({width:l,height:m}),getPorts:()=>Ve()},t.push({type:a,label:c.label??a,icon:c.icon})}const s={...Xe(),...r?.edgeTypes},i=r?.defaultEdgeType??"manhattan";return{schema:{nodeTypes:o,defaultEdgeType:i,edgeTypes:s},paletteItems:t}}function Do(r){return{name:"connection-validator",priority:10,transformCommand(e,o,t){const s=new Set;for(const i of e.commands)i.type==="edge.remove"&&s.add(i.edgeId);for(const i of e.commands){if(i.type!=="edge.add"&&i.type!=="edge.reconnect")continue;const a=t.flowModel.value,c=i.type==="edge.add"?i.edge.source.nodeId:i.source?.nodeId,l=i.type==="edge.add"?i.edge.target.nodeId:i.target?.nodeId;if(!c||!l)continue;const m=a.nodes[c],f=a.nodes[l];if(!m||!f)continue;const h=i.type==="edge.add"?i.edge.source.portId:i.source?.portId,v=i.type==="edge.add"?i.edge.target.portId:i.target?.portId,C=h?m.ports?.find(A=>A.id===h):void 0,E=v?f.ports?.find(A=>A.id===v):void 0,b=i.type==="edge.reconnect"?i.edgeId:void 0,M=Object.values(a.edges).filter(A=>A.id!==b&&!s.has(A.id)),P=r({flowModel:a,sourceNode:m,targetNode:f,sourcePort:C,targetPort:E,existingEdges:M});if(!P.valid)return{rejected:!0,reason:P.reason??"Connection validation failed",code:"validation_failed"}}return e}}}function Mo(r){const{rubberband:e=!0,multiple:o=!0,movable:t=!0}=r??{};return{name:"selection",priority:90,attachRuntime(s){s.graph.use(new nt.Selection({enabled:!0,rubberband:e,multiple:o,movable:t,pointerEvents:"none",showNodeSelectionBox:!0,filter:i=>!(i.isNode()&&(i.getData?.()??{})._selectable===!1)}))}}}function _o(r){const{tolerance:e=10,color:o="#3a84ff"}=r??{};let t=null;return{name:"snapline",priority:90,async attachRuntime(s){const{Snapline:i}=await import("@antv/x6-plugin-snapline");s.graph.use(new i({enabled:!0,tolerance:e,className:"flow-canvas-snapline"})),t=document.createElement("style"),t.textContent=`.flow-canvas-snapline line { stroke: ${o} !important; }`,document.head.appendChild(t)},detachRuntime(){t?.remove(),t=null}}}const Ao={class:"flow-canvas-search-popover__input"},Bo=["value","placeholder"],Po=["onMouseenter","onClick"],To={class:"flow-canvas-search-popover__item-label"},Ro={key:0,class:"flow-canvas-search-popover__item-subtitle"},Lo={key:1,class:"flow-canvas-search-popover__empty"},Oo=n.defineComponent({__name:"search-popover",props:{open:{type:Boolean},position:{},query:{},results:{},placeholder:{default:"搜索节点名称"},emptyText:{default:"暂无匹配节点"},isAnchorTarget:{type:Function,default:void 0}},emits:["update:query","select","close"],setup(r,{emit:e}){const o=r,t=e,s=n.ref(null),i=n.ref(null),a=n.ref(-1);n.watch(()=>o.open,E=>{E&&(a.value=-1,n.nextTick(()=>{s.value?.focus(),s.value?.select()}))}),n.watch(()=>o.query,()=>{a.value=-1}),n.watch(()=>o.results.length,E=>{if(!E){a.value=-1;return}a.value>=E&&(a.value=-1)});function c(E){t("update:query",E.target.value)}function l(E){a.value=E}function m(){a.value=-1}function f(){t("update:query",""),n.nextTick(()=>{s.value?.focus()})}function h(){const E=o.results[a.value]??o.results[0];E&&t("select",E.id)}function v(E){if(E.key==="Escape"){E.preventDefault(),t("close");return}if(E.key==="ArrowDown"){if(E.preventDefault(),!o.results.length)return;a.value=a.value<o.results.length-1?a.value+1:0;return}if(E.key==="ArrowUp"){if(E.preventDefault(),!o.results.length)return;a.value=a.value>0?a.value-1:o.results.length-1;return}E.key==="Enter"&&(E.preventDefault(),h())}function C(E){if(!o.open)return;const b=E.target;b&&i.value?.contains(b)||o.isAnchorTarget?.(E.target)||t("close")}return n.onMounted(()=>{document.addEventListener("mousedown",C)}),n.onBeforeUnmount(()=>{document.removeEventListener("mousedown",C)}),(E,b)=>r.open?(n.openBlock(),n.createElementBlock("div",{key:0,ref_key:"panelRef",ref:i,class:"flow-canvas-search-popover",style:n.normalizeStyle({left:`${r.position.x}px`,top:`${r.position.y}px`,width:`${r.position.width}px`})},[n.createElementVNode("div",Ao,[b[1]||(b[1]=n.createElementVNode("i",{class:"flow-canvas-icon canvas-search"},null,-1)),n.createElementVNode("input",{ref_key:"inputRef",ref:s,value:r.query,placeholder:r.placeholder,onInput:c,onKeydown:v},null,40,Bo),r.query?(n.openBlock(),n.createElementBlock("button",{key:0,type:"button",class:"flow-canvas-search-popover__clear","aria-label":"清空搜索",onClick:f},[...b[0]||(b[0]=[n.createElementVNode("i",{class:"flow-canvas-icon canvas-close-circle-shape"},null,-1)])])):n.createCommentVNode("",!0)]),r.results.length?(n.openBlock(),n.createElementBlock("div",{key:0,class:"flow-canvas-search-popover__list",onMouseleave:m},[(n.openBlock(!0),n.createElementBlock(n.Fragment,null,n.renderList(r.results,(M,P)=>(n.openBlock(),n.createElementBlock("button",{key:M.id,type:"button",class:n.normalizeClass(["flow-canvas-search-popover__item",{"is-active":P===a.value}]),onMouseenter:A=>l(P),onClick:A=>t("select",M.id)},[n.createElementVNode("span",To,n.toDisplayString(M.label),1),M.subtitle?(n.openBlock(),n.createElementBlock("span",Ro,n.toDisplayString(M.subtitle),1)):n.createCommentVNode("",!0)],42,Po))),128))],32)):(n.openBlock(),n.createElementBlock("div",Lo,n.toDisplayString(r.emptyText),1))],4)):n.createCommentVNode("",!0)}}),$o=ne(Oo,[["__scopeId","data-v-c80f6b26"]]),Oe=282,Fo=4,Vo=300,Ho=360,Ee=100,zo=Ho*4-Ee;function qo(r){return r!==null}function Go(r){const e=new Set;return r.map(o=>o?.trim()).filter(o=>!!o).filter(o=>{const t=o.toLowerCase();return e.has(t)?!1:(e.add(t),!0)})}function Uo(r,e){const o=Math.max(8,window.innerWidth-e-8);return Math.min(Math.max(8,r),o)}function jo(r,e){const o=e?.getNodeMeta?.(r);if(o===null)return null;const t=o?.label?.trim()||r.label?.trim()||r.id,s=o?.subtitle?.trim()||void 0,i=Go(o?.keywords??[r.label,s]);return i.length?{id:r.id,label:t,subtitle:s,keywords:i}:null}function Wo(r){let e=null,o=null,t=null,s=null,i=null,a=[];const c=n.ref(!1),l=n.ref(""),m=n.ref({x:0,y:0,width:Oe}),f=n.computed(()=>e?Object.values(e.flowModel.value.nodes).map(D=>jo(D,r)).filter(qo):[]),h=n.computed(()=>{const D=l.value.trim().toLowerCase(),y=Math.max(1,r?.maxResults??Vo);return D?f.value.filter(u=>u.keywords.some(d=>d.toLowerCase().includes(D))).slice(0,y):f.value.slice(0,y)});function v(){return t?.querySelector('.flow-canvas-toolbar__btn[data-toolbar-type="search"]')}function C(){return v()?.closest(".flow-canvas-toolbar")}function E(){const D=C(),y=t?.getBoundingClientRect(),u=D?.getBoundingClientRect()??y;if(!u)return;const d=Math.max(Oe,Math.round(u.width));m.value={x:Uo(u.left,d),y:u.bottom+Fo,width:d}}function b(){a.forEach(D=>clearTimeout(D)),a=[],o?.api.clearHighlight()}function M(D){b();const y=setTimeout(()=>{o?.api.highlightNodes([D])},Ee),u=setTimeout(()=>{o?.api.clearHighlight(),a=[]},Ee+zo);a.push(y,u)}function P(D){o&&(o.api.scrollToNode(D),M(D))}function A(){o&&(c.value=!0,E(),requestAnimationFrame(()=>E()))}function F(){c.value=!1,l.value=""}function z(){if(c.value){F();return}A()}function $(D){const y=v();return!!(y&&D instanceof Node&&y.contains(D))}function q(){c.value&&E()}const V=n.defineComponent({name:"FlowCanvasSearchHost",setup(){return()=>n.h($o,{open:c.value,position:m.value,query:l.value,results:h.value,placeholder:r?.placeholder??"搜索节点名称",emptyText:r?.emptyText??"暂无匹配节点",isAnchorTarget:$,"onUpdate:query":D=>{l.value=D},onSelect:P,onClose:F})}});return{name:"search",priority:90,install(D){e=D},attachRuntime(D){o=D,t=D.graph.container.closest(".flow-canvas-layout__content")??D.graph.container.parentElement,s=document.createElement("div"),s.className="flow-canvas-search-host",document.body.append(s),i=n.createApp(V),i.mount(s),window.addEventListener("resize",q),window.addEventListener("scroll",q,!0)},detachRuntime(){F(),b(),window.removeEventListener("resize",q),window.removeEventListener("scroll",q,!0),i?.unmount(),i=null,s?.remove(),s=null,t=null,o=null},dispose(){F(),b(),e=null},provideToolbarItems(){return[{id:"plugin:search",type:"search",icon:"flow-canvas-icon canvas-search",description:"搜索",group:"tools",order:22,active:()=>c.value,onClick:z}]}}}const Xo=52,Ko=16,Zo=40;function Yo(r){const e=document.createElement("div");e.className="flow-canvas-minimap",r.floating!==!1&&e.classList.add("flow-canvas-minimap--floating");const o=document.createElement("div");o.className="flow-canvas-minimap__host",e.append(o),Object.assign(e.style,{width:`${r.width}px`,height:`${r.height}px`}),r.floating!==!1&&Object.assign(e.style,{top:`${Xo}px`,left:`${Ko}px`});let t=null,s=r.defaultOpen??!1,i=null;function a(){!r.onClickOutside||i||(i=v=>{const C=v.target;C&&e.contains(C)||v.target?.closest('[data-toolbar-type="minimap"]')||r.onClickOutside()},document.addEventListener("mousedown",i))}function c(){i&&(document.removeEventListener("mousedown",i),i=null)}function l(){t||(t=new st.MiniMap({container:o,width:r.width,height:r.height,padding:r.contentPadding??Zo,scalable:!1}),r.sourceGraph.use(t))}function m(v){s=v,e.style.display=s?"":"none",s?(l(),a()):c()}function f(){m(s),r.mountTarget.appendChild(e)}function h(){c(),t?.dispose(),t=null,e.remove()}return f(),{element:e,isOpen:()=>s,setOpen:m,toggle(){const v=!s;return m(v),v},destroy:h}}function Qo(r){let e=null;const o=n.ref(!1);function t(i){e?.setOpen(i),o.value=i}function s(){e&&(o.value=e.toggle())}return{name:"minimap",priority:90,attachRuntime(i){const a=r?.width??334,c=r?.height??180,l=r?.container??i.graph.container.closest(".flow-canvas-layout__content")??i.graph.container.parentElement;l&&(e=Yo({sourceGraph:i.graph,mountTarget:l,width:a,height:c,floating:!r?.container,defaultOpen:!1,onClickOutside:()=>t(!1)}),t(!1))},detachRuntime(){e?.destroy(),e=null,o.value=!1},provideToolbarItems(){return[{id:"plugin:minimap",type:"minimap",icon:"flow-canvas-icon canvas-map",description:"小地图",group:"tools",order:23,active:()=>o.value,onClick:s}]}}}function Jo(){let r=null,e=0;return{name:"clipboard",priority:90,onKeyboardShortcut(o,t){const s=o.metaKey||o.ctrlKey;if(s&&o.key==="c"){const i=t.graph.getSelectedCells?.()??[];if(!i.length)return!1;const a=t.flowModel.value,c=new Set(i.filter(f=>f.isNode()).map(f=>f.id)),l=[...c].map(f=>a.nodes[f]).filter(Boolean);if(!l.length)return!1;const m=Object.values(a.edges).filter(f=>c.has(f.source.nodeId)&&c.has(f.target.nodeId));return r={nodes:l,edges:m},e=0,!0}if(s&&o.key==="v"){if(!r?.nodes.length)return!1;e++;const i=e*30,a=new Map,c=[];for(const l of r.nodes){const m=`${l.id}_cp${Z().slice(0,6)}`;a.set(l.id,m),c.push({type:"node.add",node:{...l,id:m,position:{x:l.position.x+i,y:l.position.y+i},payload:l.payload?{...l.payload}:{},extensions:l.extensions?{...l.extensions}:void 0}})}for(const l of r.edges){const m=a.get(l.source.nodeId),f=a.get(l.target.nodeId);!m||!f||c.push({type:"edge.add",edge:{...l,id:`${l.id}_cp${Z().slice(0,6)}`,source:{...l.source,nodeId:m},target:{...l.target,nodeId:f},labels:l.labels?.map(h=>({...h,id:`${h.id}_cp${Z().slice(0,6)}`})),payload:l.payload?{...l.payload}:{}}})}return c.length&&t.executeCommand({id:Z(),source:"user:keyboard",label:"粘贴",timestamp:Date.now(),commands:c}),!0}return!1}}}exports.CanvasConstraintError=te;exports.CanvasLayout=uo;exports.CanvasNodePalette=Ue;exports.CanvasRuntime=eo;exports.CanvasSchemaError=$e;exports.CanvasToolbar=Eo;exports.DefaultNode=We;exports.NodeActionsToolbar=qe;exports.NodeQuickAddPopover=Ge;exports.applyCanvasCommand=ke;exports.clipboardPlugin=Jo;exports.connectionValidatorPlugin=Do;exports.createBuiltinEdgeTypes=Xe;exports.createCanvasHistory=Fe;exports.createDefaultSchema=So;exports.createDefaultToolbarItems=je;exports.createEmptyFlowModel=rt;exports.generateId=Z;exports.minimapPlugin=Qo;exports.searchPlugin=Wo;exports.selectionPlugin=Mo;exports.snaplinePlugin=_o;exports.useCanvasEditor=kt;
|
|
1
|
+
"use strict";var tt=Object.create;var Me=Object.defineProperty;var ot=Object.getOwnPropertyDescriptor;var nt=Object.getOwnPropertyNames;var rt=Object.getPrototypeOf,st=Object.prototype.hasOwnProperty;var it=(n,e,o,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of nt(e))!st.call(n,r)&&r!==o&&Me(n,r,{get:()=>e[r],enumerable:!(t=ot(e,r))||t.enumerable});return n};var Ce=(n,e,o)=>(o=n!=null?tt(rt(n)):{},it(e||!n||!n.__esModule?Me(o,"default",{value:n,enumerable:!0}):o,n));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("vue"),at=require("@antv/x6"),lt=require("@antv/x6-vue-shape"),ct=require("@antv/x6-plugin-selection"),dt=require("@antv/x6-plugin-minimap");function ut(){return{version:"1.0",nodes:{},edges:{}}}class te extends Error{constructor(e){super(e),this.name="CanvasConstraintError"}}class He extends Error{constructor(e){super(e),this.name="CanvasSchemaError"}}function ye(n,e,o){if(e.length===0){if(o===void 0)return;if(typeof o!="object"||o===null||Array.isArray(o))throw new Error("Root value of payload/extensions/meta must be an object or undefined");return o}const t=n?{...n}:{};let r=t;for(let a=0;a<e.length-1;a++){const c=e[a],l=r[c];l&&typeof l=="object"&&!Array.isArray(l)?r[c]={...l}:r[c]={},r=r[c]}const i=e[e.length-1];return o===void 0?delete r[i]:r[i]=o,t}function Ie(n,e){switch(e.type){case"node.add":return ft(n,e.node);case"node.move":return gt(n,e.nodeId,e.position);case"node.remove":return pt(n,e.nodeId);case"node.update":return ht(n,e.nodeId,e.patch);case"node.set-payload":return vt(n,e.nodeId,e.path,e.value);case"node.set-extensions":return mt(n,e.nodeId,e.path,e.value);case"edge.add":return yt(n,e.edge);case"edge.remove":return wt(n,e.edgeId);case"edge.reconnect":return bt(n,e.edgeId,e.source,e.target);case"edge.update":return Et(n,e.edgeId,e.patch);case"edge.set-payload":return kt(n,e.edgeId,e.path,e.value);case"edge.label.update":return Ct(n,e.edgeId,e.labelId,e.patch);case"model.set-meta":return xt(n,e.path,e.value);default:throw new te(`Unknown command type: ${e.type}`)}}function ge(n,e){const o=n.nodes[e];if(!o)throw new te(`Node "${e}" does not exist`);return o}function pe(n,e){const o=n.edges[e];if(!o)throw new te(`Edge "${e}" does not exist`);return o}function ue(n,e,o){const t=n.nodes[e.nodeId];if(!t)throw new te(`${o} node "${e.nodeId}" does not exist`);if(e.portId&&t.ports&&!t.ports.some(i=>i.id===e.portId))throw new te(`${o} port "${e.portId}" not found on node "${e.nodeId}"`)}function we(n,e,o){return{...n,nodes:{...n.nodes,[e]:o}}}function be(n,e,o){return{...n,edges:{...n.edges,[e]:o}}}function ft(n,e){if(n.nodes[e.id])throw new te(`Node id "${e.id}" already exists`);return{...n,nodes:{...n.nodes,[e.id]:e}}}function gt(n,e,o){const t=ge(n,e);return we(n,e,{...t,position:o})}function pt(n,e){ge(n,e);const{[e]:o,...t}=n.nodes,r={};for(const[i,a]of Object.entries(n.edges))a.source.nodeId!==e&&a.target.nodeId!==e&&(r[i]=a);return{...n,nodes:t,edges:r}}function ht(n,e,o){const t=ge(n,e);return we(n,e,{...t,...o,id:t.id})}function vt(n,e,o,t){const r=ge(n,e),i=ye(r.payload,o,t);return we(n,e,{...r,payload:i})}function mt(n,e,o,t){const r=ge(n,e),i=ye(r.extensions,o,t);return we(n,e,{...r,extensions:i})}function yt(n,e){if(n.edges[e.id])throw new te(`Edge id "${e.id}" already exists`);if(ue(n,e.source,"Source"),ue(n,e.target,"Target"),e.labels){const o=new Set;for(const t of e.labels){if(o.has(t.id))throw new te(`Duplicate label id "${t.id}" in edge "${e.id}"`);o.add(t.id)}}return{...n,edges:{...n.edges,[e.id]:e}}}function wt(n,e){pe(n,e);const{[e]:o,...t}=n.edges;return{...n,edges:t}}function bt(n,e,o,t){const r=pe(n,e),i=o??r.source,a=t??r.target;return ue(n,i,"Source"),ue(n,a,"Target"),be(n,e,{...r,source:i,target:a})}function Et(n,e,o){const t=pe(n,e),r={...t,...o,id:t.id};return o.source&&ue(n,r.source,"Source"),o.target&&ue(n,r.target,"Target"),be(n,e,r)}function kt(n,e,o,t){const r=pe(n,e),i=ye(r.payload,o,t);return be(n,e,{...r,payload:i})}function Ct(n,e,o,t){const r=pe(n,e);if(!r.labels)throw new te(`Edge "${e}" has no labels`);const i=r.labels.findIndex(c=>c.id===o);if(i===-1)throw new te(`Label "${o}" not found in edge "${e}"`);const a=[...r.labels];return a[i]={...a[i],...t,id:o},be(n,e,{...r,labels:a})}function xt(n,e,o){const t=ye(n.meta,e,o);return{...n,meta:t}}function Ge(n,e){const o=e?.maxHistorySize??100,t=s.ref(n),r=[],i=[],a=s.ref(!1),c=s.ref(!1);function l(){a.value=r.length>0,c.value=i.length>0}function m(E){const M=t.value;let N=M;for(const F of E.commands)N=Ie(N,F);if(!E.skipHistory){const F=e?.excludeCommandFromHistory,G=F?E.commands.filter(S=>!F(S)):E.commands;if(G.length>0){const S=G.length<E.commands.length?{...E,commands:G}:E;r.push({snapshot:M,envelope:S}),r.length>o&&r.shift(),i.length=0}}return t.value=N,l(),N}function f(){const E=r.pop();if(!E)return null;i.push({snapshot:t.value,envelope:E.envelope});const M=e?.preserveMetaOnUndoRedo?{...E.snapshot,meta:t.value.meta}:E.snapshot;return t.value=M,l(),M}function h(){const E=i.pop();if(!E)return null;r.push({snapshot:t.value,envelope:E.envelope});const M=e?.preserveMetaOnUndoRedo?{...E.snapshot,meta:t.value.meta}:E.snapshot;return t.value=M,l(),M}function u(){r.length=0,i.length=0,l()}function b(){return t.value}function D(E){t.value=E,u()}function L(E,M){const N={id:`update-${Date.now()}`,source:"system:update",label:M??"更新模型",timestamp:Date.now(),commands:[]};r.push({snapshot:t.value,envelope:N}),r.length>o&&r.shift(),i.length=0,t.value=E,l()}return{currentFlowModel:t,execute:m,undo:f,redo:h,canUndo:a,canRedo:c,get undoStack(){return r.map(E=>E.envelope)},get redoStack(){return i.map(E=>E.envelope)},clear:u,createSnapshot:b,replaceFlowModel:D,updateFlowModel:L}}function It(n){return n!==null&&typeof n=="object"&&n.rejected===!0}class St{plugins=[];editorContext=null;runtimeCtx=null;runtimeVersion=0;install(e,o){this.plugins=[...e].sort((t,r)=>(t.priority??100)-(r.priority??100)),this.editorContext=o;for(const t of this.plugins)t.install?.(o)}attachRuntime(e){const o=++this.runtimeVersion;this.runtimeCtx=e;const t=this.createSafeRuntimeContext(e,o);for(const r of this.plugins)r.attachRuntime?.(t)}detachRuntime(){for(const e of[...this.plugins].reverse())e.detachRuntime?.();this.runtimeCtx=null}createSafeRuntimeContext(e,o){const t=this,r=new Proxy(e.graph,{get(i,a,c){const l=Reflect.get(i,a,c);return a==="use"&&typeof l=="function"?function(...f){if(t.runtimeVersion===o)return l.apply(i,f)}:l}});return{...e,graph:r}}dispose(){for(const e of[...this.plugins].reverse())e.dispose?.();this.plugins=[],this.editorContext=null,this.runtimeCtx=null}transformCommand(e){if(!this.editorContext)return{envelope:e};let o=e;for(const t of this.plugins){if(!t.transformCommand)continue;const r=this.createPreview(o),i=t.transformCommand(o,r,this.editorContext);if(i===null)return{rejected:!0,error:{code:"plugin_rejected",reason:"",source:t.name}};if(It(i))return{rejected:!0,error:{code:i.code??"plugin_rejected",reason:i.reason,source:t.name}};o=i}return{envelope:o}}afterCommand(e,o,t){if(this.editorContext)for(const r of this.plugins)r.afterCommand?.(e,o,t,this.editorContext)}dispatchUiEvent(e){if(this.runtimeCtx)for(const o of this.plugins)o.onUiEvent?.(e,this.runtimeCtx)}dispatchSelectionChange(e){if(this.runtimeCtx)for(const o of this.plugins)o.onSelectionChange?.(e,this.runtimeCtx)}dispatchKeyboardShortcut(e){if(!this.runtimeCtx)return!1;for(const o of this.plugins)if(o.onKeyboardShortcut?.(e,this.runtimeCtx))return!0;return!1}collectContextMenuItems(e){if(!this.runtimeCtx)return[];const o=[];for(const t of this.plugins){const r=t.onBlankContextMenu?.(e,this.runtimeCtx);r&&o.push(...r)}return o}collectToolbarItems(){if(!this.editorContext)return[];const e=new Map;for(const o of this.plugins){const t=o.provideToolbarItems?.(this.editorContext);if(t)for(const r of t)e.set(r.id,r)}return[...e.values()].sort((o,t)=>(o.order??0)-(t.order??0))}collectNodeDecorations(e){if(!this.editorContext)return;let o;for(const t of this.plugins){const r=t.decorateNode?.(e,this.editorContext);r&&(o=o?{...o,...r}:r)}return o}collectEdgeDecorations(e){if(!this.editorContext)return;let o;for(const t of this.plugins){const r=t.decorateEdge?.(e,this.editorContext);r&&(o=o?{...o,...r}:r)}return o}collectExtendedApi(){if(!this.runtimeCtx)return{};const e={};for(const o of this.plugins){const t=o.extendApi?.(this.runtimeCtx.api,this.runtimeCtx);t&&Object.assign(e,t)}return e}createPreview(e){const o=this.editorContext;return{previewFlowModel(t){const r=t??e.commands;let i=o.flowModel.value;for(const a of r)i=Ie(i,a);return i}}}}let Nt=0;function W(){const n=Date.now().toString(36),e=Math.random().toString(36).substring(2,8);return`${n}-${e}-${++Nt}`}const Se=()=>W();function Mt(n){const{schema:e,plugins:o=[],historyOptions:t}=n,r=n.idGenerator??Se,i={version:"1.0",...n.initialFlowModel},a=Ge(i,t),c=s.ref(n.mode??"edit"),l=s.ref(!1),m=s.ref(null),f=s.ref([]),h={},u=new St;function b(M,N,F,G="user:toolbar"){const S={id:`history-${Date.now()}`,source:G,label:M,timestamp:Date.now(),commands:[]};u.afterCommand(S,N,F),f.value=u.collectToolbarItems(),n.onCommandResult?.({status:"applied",envelope:S,flowModel:F}),n.onFlowModelChange?.({flowModel:F,prevFlowModel:N,envelope:S,source:G})}const D={execute:a.execute,undo(){const M=a.currentFlowModel.value,N=a.undo();return N&&b("撤销",M,N),N},redo(){const M=a.currentFlowModel.value,N=a.redo();return N&&b("重做",M,N),N},get canUndo(){return a.canUndo},get canRedo(){return a.canRedo},get undoStack(){return a.undoStack},get redoStack(){return a.redoStack},clear:a.clear,createSnapshot:a.createSnapshot,replaceFlowModel(M){const N=a.currentFlowModel.value;a.replaceFlowModel(M),b("替换 FlowModel",N,M,"system:replace")},updateFlowModel(M,N){const F=a.currentFlowModel.value;a.updateFlowModel(M,N),b(N??"更新 FlowModel",F,M,"system:update")}},L={flowModel:s.computed(()=>a.currentFlowModel.value),history:D,schema:e,mode:c,idGenerator:r,executeCommand:E,replaceFlowModel(M){D.replaceFlowModel(M)},updateFlowModel(M,N){D.updateFlowModel(M,N)},setMode(M){c.value=M},selectionMode:l,setSelectionMode(M){l.value=M},api:m,toolbarItems:f,extendedApi:h,_pluginManager:u,_emitUiEvent:M=>{u.dispatchUiEvent(M)}};u.install(o,{flowModel:L.flowModel,history:D,schema:e,mode:c,idGenerator:r,executeCommand:E}),f.value=u.collectToolbarItems(),s.onScopeDispose(()=>{u.dispose()});function E(M){const N=u.transformCommand(M);if("rejected"in N){const S={status:"rejected",envelope:M,error:N.error};return n.onCommandResult?.(S),S}const F=N.envelope,G=a.currentFlowModel.value;try{const S=a.execute(F),U={status:"applied",envelope:F,flowModel:S};return u.afterCommand(F,G,S),f.value=u.collectToolbarItems(),n.onCommandResult?.(U),n.onFlowModelChange?.({flowModel:S,prevFlowModel:G,envelope:F,source:F.source}),U}catch(S){if(S instanceof te){const U={status:"invalid",envelope:F,error:{code:"constraint_violated",reason:S.message,source:"engine"}};return n.onCommandResult?.(U),U}throw S}}return L}const Dt=["top","right","bottom","left"];function Ue(){return Dt.map(n=>({id:n,group:n}))}function Ne(n,e){return e?.(n)??n.ports??Ue()}const xe=-1,At="flow-canvas-node-ring-target",De="flow-canvas-node-ring-target--decorated",Ae="flow-canvas-node-ring-target--pulse",_t="linear-gradient(135deg, #cadcfa 0%, #cee0ff 100%)";class Bt{graph;schema;shapeRegistry;resolveNodeDecoration;resolveEdgeDecoration;resolveCanvasContext;knownNodeIds=new Set;knownEdgeIds=new Set;syncing=!1;prevNodeDecorationClasses=new Map;prevNodeDecorationColors=new Set;prevEdgeDecorationClasses=new Map;prevEdgeDecorationColors=new Set;prevEdgeDecorationMarkerIds=new Set;highlightedNodeIds=new Set;highlightedEdgeIds=new Set;hoveredEdgeId=null;defaultHighlightedNodeIds=new Set;defaultHighlightedEdgeIds=new Set;prevEdgeStyleIds=new Set;nodeDefaultAttrs=new Map;edgeDefaultAttrs=new Map;lastModel=null;pendingDecorationRAFs=new Map;constructor(e,o,t,r,i,a){this.graph=e,this.schema=o,this.shapeRegistry=t,this.resolveNodeDecoration=r,this.resolveEdgeDecoration=i,this.resolveCanvasContext=a}syncFlowModel(e){if(!this.syncing){this.syncing=!0,this.lastModel=e;try{const o=this.resolveNodes(e),t=this.resolveEdges(e);this.syncNodes(o),this.syncEdges(t,e)}finally{this.syncing=!1}}}get isSyncing(){return this.syncing}saveNodeDefaultAttrs(e,o){const r=o.x6CellConfig?.attrs?.body;if(!r)return;const i={};let a=!1;r.stroke!==void 0&&(i.stroke=r.stroke,a=!0),r.strokeWidth!==void 0&&(i.strokeWidth=r.strokeWidth,a=!0),a&&this.nodeDefaultAttrs.set(e,i)}saveEdgeDefaultAttrs(e,o){const r=o?.x6EdgeConfig?.attrs?.line;if(!r)return;const i={};let a=!1;r.stroke!==void 0&&(i.stroke=r.stroke,a=!0),r.strokeWidth!==void 0&&(i.strokeWidth=r.strokeWidth,a=!0),r.strokeDasharray!==void 0&&(i.strokeDasharray=r.strokeDasharray,a=!0),a&&this.edgeDefaultAttrs.set(e,i)}restoreNodeAttr(e,o,t){const r=this.nodeDefaultAttrs.get(e.id)?.[t];if(r!==void 0)e.setAttrByPath(o,r);else{const i=t==="stroke"?"none":0;e.setAttrByPath(o,i)}}restoreEdgeAttr(e,o,t){const r=this.edgeDefaultAttrs.get(e.id)?.[t];r!==void 0?this.setEdgeAttrIfChanged(e,o,r):e.attr(o)!==void 0&&e.removeAttrByPath(o)}setEdgeAttrIfChanged(e,o,t){const r=e.attr(o),i=typeof r=="object"&&r!==null,a=typeof t=="object"&&t!==null;r!==t&&(i&&a&&JSON.stringify(r)===JSON.stringify(t)||e.setAttrByPath(o,t))}getNodeRingTarget(e){return e?e.querySelector(".flow-canvas-highlight-target")??e.querySelector(".flow-canvas-node-surface > :first-child"):null}syncEdgeMarker(e,o,t){const i=o?.x6EdgeConfig?.attrs?.line?.[t],a=`line/${t}`;e.removeAttrByPath(a),i!==void 0&&e.setAttrByPath(a,i)}getEdgeMarkerConfig(e,o){const r=e?.x6EdgeConfig?.attrs?.line?.[o];if(r)return typeof r=="string"?{name:r}:{...r}}applyEdgeMarkerDecoration(e,o,t,r){if(!r){this.prevEdgeDecorationMarkerIds.has(e.id)&&(this.syncEdgeMarker(e,o,t),this.prevEdgeDecorationMarkerIds.delete(e.id));return}const i=this.getEdgeMarkerConfig(o,t)??{name:"block",width:8,height:8};this.setEdgeAttrIfChanged(e,`line/${t}`,{...i,stroke:r,fill:r}),this.prevEdgeDecorationMarkerIds.add(e.id)}dispose(){for(const e of this.pendingDecorationRAFs.values())cancelAnimationFrame(e);this.pendingDecorationRAFs.clear(),this.knownNodeIds.clear(),this.knownEdgeIds.clear()}resolveNodes(e){const o=new Map;for(const[t,r]of Object.entries(e.nodes)){const i=this.schema.nodeTypes[r.type];if(!i)throw new He(`Unknown node type "${r.type}" for node "${t}". Registered types: [${Object.keys(this.schema.nodeTypes).join(", ")}]. Register the type in CanvasSchema.nodeTypes before using it in a FlowModel.`);const a=this.shapeRegistry.registerNodeType(r.type,i.component),c=i.getSize(r),l=Ne(r,i.getPorts);o.set(t,{model:r,definition:i,shapeName:a,size:c,ports:l})}return o}resolveEdges(e){const o=new Map;for(const[t,r]of Object.entries(e.edges)){const i=r.type??this.schema.defaultEdgeType??"default",a=this.schema.edgeTypes?.[i];o.set(t,{model:r,definition:a})}return o}syncNodes(e){const o=new Set(e.keys());for(const t of this.knownNodeIds)if(!o.has(t)){const r=this.graph.getCellById(t);r&&this.graph.removeCell(r),this.knownNodeIds.delete(t),this.defaultHighlightedNodeIds.delete(t),this.prevNodeDecorationClasses.delete(t),this.prevNodeDecorationColors.delete(t),this.nodeDefaultAttrs.delete(t);const i=this.pendingDecorationRAFs.get(t);i&&(cancelAnimationFrame(i),this.pendingDecorationRAFs.delete(t))}for(const[t,r]of e){const i=this.graph.getCellById(t);i?this.updateExistingNode(i,r):this.addNewNode(t,r)}}updateExistingNode(e,o){const{model:t,size:r,ports:i,definition:a}=o;if(e.getData()?.type!==t.type){this.graph.removeCell(e),this.addNewNode(e.id,o);return}const l=e.getPosition();(l.x!==t.position.x||l.y!==t.position.y)&&e.setPosition(t.position.x,t.position.y);const m=e.getSize();(m.width!==r.width||m.height!==r.height)&&e.setSize(r.width,r.height,{silent:!0}),this.syncNodePorts(e,i),e.setData({...t}),this.applyNodeBehavior(e,t,a),this.applyNodeHighlightAndDecoration(e,t)}syncNodePorts(e,o){const t=e.getPorts(),r=new Set(o.map(a=>a.id)),i=new Set(t.map(a=>a.id));for(const a of t)a.id&&!r.has(a.id)&&e.removePort(a.id);for(const a of o)i.has(a.id)||e.addPort({id:a.id,group:a.group,...a.x6PortConfig})}addNewNode(e,o){const{model:t,shapeName:r,size:i,ports:a,definition:c}=o,l={id:t.id,shape:r,x:t.position.x,y:t.position.y,width:i.width,height:i.height,data:{...t},ports:{groups:{top:{position:"top",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},right:{position:"right",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},bottom:{position:"bottom",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},left:{position:"left",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}}},items:a.map(f=>({id:f.id,group:f.group,...f.x6PortConfig}))},...c.x6CellConfig};this.graph.addNode(l),this.knownNodeIds.add(e),this.saveNodeDefaultAttrs(e,c);const m=this.graph.getCellById(e);m&&(this.applyNodeBehavior(m,t,c),this.applyNodeHighlightAndDecoration(m,t),this.scheduleDecorationRetryIfNeeded(m))}scheduleDecorationRetryIfNeeded(e){const o=this.graph.findViewByCell(e)?.container;if(this.getNodeRingTarget(o))return;const t=e.id,r=this.pendingDecorationRAFs.get(t);r&&cancelAnimationFrame(r);const i=requestAnimationFrame(()=>{if(this.pendingDecorationRAFs.delete(t),!this.knownNodeIds.has(t))return;const a=this.lastModel?.nodes[t];if(!a)return;const c=this.graph.getCellById(t);c?.isNode()&&this.applyNodeHighlightAndDecoration(c,a)});this.pendingDecorationRAFs.set(t,i)}applyNodeBehavior(e,o,t){if(!t.getBehavior)return;const r=this.resolveCanvasContext?.();if(!r)return;const i=t.getBehavior(o,r);if(i.draggable!==void 0&&e.setProp("draggable",i.draggable,{silent:!0}),i.connectable!==void 0){const c=i.connectable?!0:i.targetable===!1?!1:"passive";for(const l of e.getPorts())e.setPortProp(l.id,"attrs/circle/magnet",c,{silent:!0})}if(i.showPorts!==void 0){const c=i.showPorts;for(const l of e.getPorts())e.setPortProp(l.id,"attrs/circle/visibility",c?"visible":"hidden",{silent:!0})}const a=e.getData()??{};i.deletable!==void 0&&a._deletable!==i.deletable&&e.setData({...a,_deletable:i.deletable},{silent:!0}),i.selectable!==void 0&&a._selectable!==i.selectable&&e.setData({...e.getData(),_selectable:i.selectable},{silent:!0})}syncEdges(e,o){const t=new Set(e.keys());for(const r of this.knownEdgeIds)if(!t.has(r)){const i=this.graph.getCellById(r);i&&this.graph.removeCell(i),this.knownEdgeIds.delete(r),this.defaultHighlightedEdgeIds.delete(r),this.prevEdgeDecorationClasses.delete(r),this.prevEdgeDecorationColors.delete(r),this.prevEdgeDecorationMarkerIds.delete(r),this.prevEdgeStyleIds.delete(r),this.edgeDefaultAttrs.delete(r)}for(const[r,i]of e){const a=this.graph.getCellById(r),{model:c,definition:l}=i;a?(this.updateExistingEdge(a,c,l,o),this.knownEdgeIds.has(r)||(this.knownEdgeIds.add(r),this.saveEdgeDefaultAttrs(r,l))):this.addNewEdge(r,c,l)}}updateExistingEdge(e,o,t,r){const i=e.getSource(),a=e.getTarget(),c=i.cell!==o.source.nodeId||i.port!==o.source.portId,l=a.cell!==o.target.nodeId||a.port!==o.target.portId;c&&e.setSource({cell:o.source.nodeId,port:o.source.portId}),l&&e.setTarget({cell:o.target.nodeId,port:o.target.portId});const f=(e.getData()?.type??void 0)!==(o.type??void 0);if(f){if(t?.router){const h=typeof t.router=="string"?{name:t.router}:t.router;e.setRouter(h)}if(t?.connector){const h=typeof t.connector=="string"?{name:t.connector}:t.connector;e.setConnector(h)}}(f||c||l)&&(this.syncEdgeMarker(e,t,"sourceMarker"),this.syncEdgeMarker(e,t,"targetMarker")),this.syncEdgeLabels(e,o),e.getZIndex()!==xe&&e.setZIndex(xe),e.setData({...o},{silent:!0}),this.applyEdgeStyleAndDecoration(e,o,t)}syncEdgeLabels(e,o){if(!o.labels?.length){e.getLabels().length>0&&e.setLabels([]);return}const t=o.labels.map(r=>({attrs:{label:{text:r.text??""}},position:r.position!=null?{distance:r.position}:void 0}));e.setLabels(t)}addNewEdge(e,o,t){const r={id:o.id,source:{cell:o.source.nodeId,port:o.source.portId},target:{cell:o.target.nodeId,port:o.target.portId},data:{...o},zIndex:xe};t?.router&&(r.router=typeof t.router=="string"?{name:t.router}:t.router),t?.connector&&(r.connector=typeof t.connector=="string"?{name:t.connector}:t.connector),t?.x6EdgeConfig&&Object.assign(r,t.x6EdgeConfig),o.labels?.length&&(r.labels=o.labels.map(a=>({attrs:{label:{text:a.text??""}},position:a.position!=null?{distance:a.position}:void 0}))),this.graph.addEdge(r),this.knownEdgeIds.add(e),this.saveEdgeDefaultAttrs(e,t);const i=this.graph.getCellById(e);i&&this.applyEdgeStyleAndDecoration(i,o,t)}refreshEdgeStyles(){if(this.lastModel)for(const[e,o]of Object.entries(this.lastModel.edges)){const t=this.graph.getCellById(e);if(!t?.isEdge())continue;const r=o.type??this.schema.defaultEdgeType??"default",i=this.schema.edgeTypes?.[r];this.applyEdgeStyleAndDecoration(t,o,i)}}refreshSingleEdgeStyle(e){if(!this.lastModel)return;const o=this.lastModel.edges[e];if(!o)return;const t=this.graph.getCellById(e);if(!t?.isEdge())return;const r=o.type??this.schema.defaultEdgeType??"default",i=this.schema.edgeTypes?.[r];this.applyEdgeStyleAndDecoration(t,o,i)}refreshNodeHighlights(){if(this.lastModel)for(const[e,o]of Object.entries(this.lastModel.nodes)){const t=this.graph.getCellById(e);t?.isNode()&&this.applyNodeHighlightAndDecoration(t,o)}}applyNodeHighlightAndDecoration(e,o){const t=this.highlightedNodeIds.has(e.id),r=this.resolveNodeDecoration?.(o),i=this.graph.findViewByCell(e)?.container,a=this.getNodeRingTarget(i),c=this.prevNodeDecorationClasses.get(e.id);c&&(i?.classList.remove(c),this.prevNodeDecorationClasses.delete(e.id)),r?.className&&(i?.classList.add(r.className),this.prevNodeDecorationClasses.set(e.id,r.className));const l=r?.borderColor,f=l??(t?"#3a84ff":void 0),h=this.prevNodeDecorationColors.has(e.id)||this.defaultHighlightedNodeIds.has(e.id);f?(e.setAttrByPath("body/stroke",f),e.setAttrByPath("body/strokeWidth",2)):h&&(this.restoreNodeAttr(e,"body/stroke","stroke"),this.restoreNodeAttr(e,"body/strokeWidth","strokeWidth")),a&&(a.classList.add(At),l?(a.classList.add(De),a.style.setProperty("--flow-canvas-node-decoration-ring-background",l),a.style.setProperty("--flow-canvas-node-decoration-ring-opacity","0.95")):(a.classList.remove(De),a.style.removeProperty("--flow-canvas-node-decoration-ring-background"),a.style.removeProperty("--flow-canvas-node-decoration-ring-opacity")),t?(a.classList.add(Ae),a.style.setProperty("--flow-canvas-node-pulse-ring-background",l??_t),a.style.setProperty("--flow-canvas-node-pulse-ring-opacity","0.95")):(a.classList.remove(Ae),a.style.removeProperty("--flow-canvas-node-pulse-ring-background"),a.style.removeProperty("--flow-canvas-node-pulse-ring-opacity"))),l?this.prevNodeDecorationColors.add(e.id):this.prevNodeDecorationColors.delete(e.id),t&&!l?this.defaultHighlightedNodeIds.add(e.id):this.defaultHighlightedNodeIds.delete(e.id)}getHoveredEdgeId(){return this.hoveredEdgeId}setHoveredEdge(e){this.hoveredEdgeId=e}setHighlightedNodes(e){this.highlightedNodeIds=new Set(e)}setHighlightedEdges(e){const o=this.highlightedEdgeIds;return this.highlightedEdgeIds=new Set(e),o}applyEdgeStyleAndDecoration(e,o,t){const r=this.highlightedEdgeIds.has(e.id),i=this.resolveEdgeDecoration?.(o),a=this.prevEdgeDecorationClasses.get(e.id);a&&(this.graph.findViewByCell(e)?.container?.classList.remove(a),this.prevEdgeDecorationClasses.delete(e.id)),i?.className&&(this.graph.findViewByCell(e)?.container?.classList.add(i.className),this.prevEdgeDecorationClasses.set(e.id,i.className));let c,l,m;if(t?.style){const L=this.graph.isSelected?.(e)??!1,E=this.hoveredEdgeId===e.id,M=t.style(o,{selected:L,highlighted:r,hovered:E});c=M.stroke,l=M.strokeWidth,m=M.strokeDasharray}const f=!t?.style&&r?"#3a84ff":void 0,h=i?.strokeColor,u=i?.targetMarkerColor,b=h??c??f,D=!!t?.style||this.prevEdgeDecorationColors.has(e.id)||this.defaultHighlightedEdgeIds.has(e.id)||this.prevEdgeStyleIds.has(e.id);b?this.setEdgeAttrIfChanged(e,"line/stroke",b):D&&this.restoreEdgeAttr(e,"line/stroke","stroke"),this.applyEdgeMarkerDecoration(e,t,"targetMarker",u),t?.style?(this.prevEdgeStyleIds.add(e.id),l?this.setEdgeAttrIfChanged(e,"line/strokeWidth",l):this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),m?this.setEdgeAttrIfChanged(e,"line/strokeDasharray",m):this.restoreEdgeAttr(e,"line/strokeDasharray","strokeDasharray")):this.prevEdgeStyleIds.has(e.id)&&(this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),this.restoreEdgeAttr(e,"line/strokeDasharray","strokeDasharray"),this.prevEdgeStyleIds.delete(e.id)),h?this.prevEdgeDecorationColors.add(e.id):this.prevEdgeDecorationColors.delete(e.id),f?this.defaultHighlightedEdgeIds.add(e.id):this.defaultHighlightedEdgeIds.delete(e.id)}}class Pt{instanceId=W();registeredShapes=new Map;wrappedComponents=new Map;getShapeName(e){let o=this.registeredShapes.get(e);return o||(o=`flow-node-${this.instanceId}-${e}`,this.registeredShapes.set(e,o)),o}registerNodeType(e,o){const t=this.getShapeName(e);let r=this.wrappedComponents.get(e);return r||(r=s.defineComponent({name:`FlowCanvasNodeShape${e.replace(/(^|[-_])(\w)/g,(i,a,c)=>c.toUpperCase())}`,setup(){return()=>s.h("div",{class:"flow-canvas-node-surface"},[s.h(o)])}}),this.wrappedComponents.set(e,r)),lt.register({shape:t,component:r,width:100,height:40}),t}dispose(){this.registeredShapes.clear(),this.wrappedComponents.clear()}}class Tt{graph;onUiEvent;onCommand;flowModelRef;idGenerator;disposers=[];constructor(e,o,t,r,i){this.graph=e,this.onUiEvent=o,this.onCommand=t,this.flowModelRef=r,this.idGenerator=i??Se,this.bindEvents()}dispose(){for(const e of this.disposers)e();this.disposers=[]}bindEvents(){this.on("node:click",({node:e})=>{this.onUiEvent({type:"node.click",nodeId:e.id})}),this.on("node:dblclick",({node:e})=>{this.onUiEvent({type:"node.dblclick",nodeId:e.id})}),this.on("node:contextmenu",({node:e,e:o})=>{this.onUiEvent({type:"node.contextmenu",nodeId:e.id,position:{x:o.clientX,y:o.clientY}})}),this.on("edge:click",({edge:e,e:o})=>{const r=o.target?.closest?.(".x6-edge-label");if(r){const a=e.getData?.()?.labels??[],c=r.parentElement?.querySelectorAll(".x6-edge-label"),l=c?Array.from(c).indexOf(r):0,m=a[Math.max(0,l)];this.onUiEvent({type:"edge.label.click",edgeId:e.id,labelId:m?.id??`label-${l}`});return}this.onUiEvent({type:"edge.click",edgeId:e.id})}),this.on("blank:click",({e})=>{const o=this.graph.clientToLocal(e.clientX,e.clientY);this.onUiEvent({type:"blank.click",position:{x:o.x,y:o.y}})}),this.on("blank:contextmenu",({e})=>{this.onUiEvent({type:"blank.contextmenu",position:{x:e.clientX,y:e.clientY}})}),this.on("node:moved",({node:e})=>{const o=e.getPosition();this.onCommand({id:W(),source:"user:drag",label:"移动节点",timestamp:Date.now(),commands:[{type:"node.move",nodeId:e.id,position:{x:o.x,y:o.y}}]})}),this.on("edge:connected",({edge:e,isNew:o})=>{const t=e.getSourceCell(),r=e.getTargetCell();if(!t||!r)return;const i=e.getSourcePortId(),a=e.getTargetPortId(),c=e.id in this.flowModelRef.value.edges;o&&!c?(this.graph.removeCell(e),this.onCommand({id:W(),source:"user:drag",label:"连线",timestamp:Date.now(),commands:[{type:"edge.add",edge:{id:this.idGenerator("edge"),source:{nodeId:t.id,portId:i??void 0},target:{nodeId:r.id,portId:a??void 0}}}]})):this.onCommand({id:W(),source:"user:drag",label:"重连",timestamp:Date.now(),commands:[{type:"edge.reconnect",edgeId:e.id,source:{nodeId:t.id,portId:i??void 0},target:{nodeId:r.id,portId:a??void 0}}]})}),this.on("edge:change:labels",({edge:e,current:o})=>{const r=e.getData?.()?.labels??[];if(!r.length||!o?.length)return;const i=[];for(let a=0;a<Math.min(r.length,o.length);a++){const c=o[a],l=r[a];if(!l?.id)continue;const m=typeof c.position=="object"?c.position?.distance:c.position;m!=null&&i.push({type:"edge.label.update",edgeId:e.id,labelId:l.id,patch:{position:m}})}i.length&&this.onCommand({id:W(),source:"user:drag",label:"拖动标签",timestamp:Date.now(),commands:i})})}on(e,o){this.graph.on(e,o),this.disposers.push(()=>this.graph.off(e,o))}}function Lt(n){function e(o){const t=n.getCellById(o);if(!t||!t.isNode())return null;const r=t,i=r.getPosition(),a=r.getSize(),c={x:i.x,y:i.y,width:a.width,height:a.height},l=n.localToGraph(c);return new DOMRect(l.x,l.y,l.width,l.height)}return{getNodeScreenRect:e}}const Rt=Object.freeze({top:24,right:8,bottom:8,left:8});function je(n){return{nodeIds:n.filter(e=>e.isNode()).map(e=>e.id),edgeIds:n.filter(e=>e.isEdge()).map(e=>e.id)}}function Ot(n,e=Rt){return new DOMRect(n.x-e.left,n.y-e.top,n.width+e.left+e.right,n.height+e.top+e.bottom)}function $t(n,e){const o=[...e.nodeIds.map(i=>n.getCellById(i)),...e.edgeIds.map(i=>n.getCellById(i))].filter(i=>!!i);if(o.length===0)return null;const t=n.getCellsBBox(o);if(!t)return null;const r=n.localToGraph(t);return Ot(r)}function We(n,e,o){const t=n.nodeIds.filter(a=>{const c=e.nodes[a];if(!c)return!1;const l=o(c);return l.deletable!==!1&&l.deleteDisabled!==!0}),r=new Set(t),i=n.edgeIds.filter(a=>{const c=e.edges[a];return c?!r.has(c.source.nodeId)&&!r.has(c.target.nodeId):!1});return{nodeIds:t,edgeIds:i}}function Ft(n){return[...n.edgeIds.map(e=>({type:"edge.remove",edgeId:e})),...n.nodeIds.map(e=>({type:"node.remove",nodeId:e}))]}const zt=100;function Vt({graph:n,overlayManager:e,executeCommand:o,schema:t,flowModel:r,getNodeBehavior:i,idGenerator:a,defaultInsertGap:c,getContextMenuItems:l,onHighlightChange:m,resolveNodeShape:f}){const h=a??Se;let u=[],b=[],D=null,L=!1,E=null;async function M(){if(L)return D;L=!0;try{const g=await import("@antv/x6-plugin-dnd"),w=g.Dnd??g.default;return w?(D=new w({target:n,scaled:!0,animation:!0,getDragNode:d=>d.clone(),getDropNode:d=>d.clone()}),D):null}catch{return console.warn("[flow-canvas] @antv/x6-plugin-dnd not available, add it to your dependencies"),null}}function N(){return new Promise(g=>{requestAnimationFrame(()=>requestAnimationFrame(()=>g()))})}const F=({node:g})=>{const w=g.getData?.();if(!w?._dndSessionId||w._dndSessionId!==E)return;E=null;const d=g.getPosition();n.removeNode(g.id);const{_dndSessionId:p,...v}=w,y=v.id||h("node");o({id:W(),source:"user:drag",label:"拖入节点",timestamp:Date.now(),commands:[{type:"node.add",node:{...v,id:y,position:{x:d.x,y:d.y}}}]})};n.on("node:added",F);function G(g){const w=t.nodeTypes[g.type];return Ne(g,w?.getPorts)}function S(g){return g??je(n.getSelectedCells?.()??[])}function U(g,w,d,p,v){switch(g){case"left":return{x:w.position.x-v-p.width,y:w.position.y+(d.height-p.height)/2};case"top":return{x:w.position.x+(d.width-p.width)/2,y:w.position.y-v-p.height};case"bottom":return{x:w.position.x+(d.width-p.width)/2,y:w.position.y+d.height+v};default:return{x:w.position.x+d.width+v,y:w.position.y+(d.height-p.height)/2}}}function T(g){switch(g){case"left":return"right";case"top":return"bottom";case"bottom":return"top";default:return"left"}}const O={zoomIn(){n.zoom(.1)},zoomOut(){n.zoom(-.1)},zoomTo(g){n.zoomTo(g)},zoomToFit(){n.zoomToFit({padding:40,maxScale:1.5})},getZoom(){return n.zoom()},centerContent(){n.centerContent()},scrollToOrigin(){n.translate(0,0)},scrollToNode(g){const w=n.getCellById(g);w&&n.centerCell(w)},getSelection(){return S()},getSelectionBounds(g){return $t(n,S(g))},selectNodes(g){const w=g.map(d=>n.getCellById(d)).filter(Boolean);n.select?.(w)},selectEdges(g){const w=g.map(d=>n.getCellById(d)).filter(Boolean);n.select?.(w)},clearSelection(){const g=n.getSelectedCells?.();g?.length&&n.unselect?.(g)},deleteSelection(g){const w=S(g?.selection),d=We(w,r.value,i??(()=>({}))),p=Ft(d);if(p.length===0)return null;const v=o({id:W(),source:g?.source??"user:toolbar",label:g?.label??"删除选中",timestamp:Date.now(),commands:p});return v.status==="applied"&&g?.clearSelectionAfterApply!==!1&&O.clearSelection(),v},registerDndSource(g,w){const d=async p=>{const v=await M();if(!v)return;const y=W();E=y;const k=w(),R=f?.(k.type),V=n.createNode({width:R?.width??154,height:R?.height??54,shape:R?.shapeName??"rect",data:{...k,_dndSessionId:y}});v.start(V,p)};return g.addEventListener("mousedown",d),()=>{g.removeEventListener("mousedown",d)}},startConnection(g,w){const d=n.getCellById(g);if(!d?.isNode())return;const p=d,v=n.findViewByCell(p);if(!v)return;const y=v.findPortElem(w,"circle")??v.findPortElem(w);if(!y)return;const R=(y.matches?.("[magnet]")?y:y.querySelector?.("[magnet]"))??y,V=R.getBoundingClientRect(),A=V.left+V.width/2,P=V.top+V.height/2,C=new MouseEvent("mousedown",{clientX:A,clientY:P,button:0,buttons:1,bubbles:!0,cancelable:!0});R.dispatchEvent(C)},async exportAsImage(g){const{domToBlob:w}=await import("modern-screenshot"),d=g?.padding??20,p=g?.backgroundColor??n.options.background?.color??"#ffffff",v=n.zoom(),y=n.translate(),k=n.getContentBBox(),R=k.width/v,V=k.height/v;if(R===0||V===0)return new Blob;const A=(k.x-y.tx)/v,P=(k.y-y.ty)/v,C=Math.ceil(R+d*2),B=Math.ceil(V+d*2),z=document.createElement("div");z.style.cssText="position:fixed;left:-99999px;top:0;pointer-events:none;";const q=n.container.cloneNode(!0);q.style.width=`${C}px`,q.style.height=`${B}px`,q.style.overflow="visible";const K=q.querySelector("svg");K&&(K.setAttribute("width",String(C)),K.setAttribute("height",String(B)),K.style.width=`${C}px`,K.style.height=`${B}px`),q.querySelector(".x6-graph-svg-viewport")?.setAttribute("transform",`matrix(1,0,0,1,${-A+d},${-P+d})`),z.appendChild(q),document.body.appendChild(z);try{return await N(),await w(q,{width:C,height:B,backgroundColor:p,scale:g?.scale??window.devicePixelRatio,filter:j=>{if(j instanceof Element){const X=j.getAttribute("class")??"";if(X.includes("x6-widget-selection")||X.includes("x6-widget-transform")||X.includes("x6-graph-grid")||X.includes("x6-graph-background"))return!1}return!0}})}catch(j){return console.warn("[flow-canvas] Export failed:",j),new Blob}finally{z.remove()}},highlightNodes(g){u=g,m?.(u,b)},highlightEdges(g){b=g,m?.(u,b)},clearHighlight(){u=[],b=[],m?.([],[])},overlay:e,getContextMenuItems(g){return l?.(g)??[]},insertNodeToRight(g,w,d){const p=r.value,v=p.nodes[g];if(!v)return{status:"invalid",envelope:{id:"",source:"user:toolbar",timestamp:Date.now(),commands:[]},error:{code:"constraint_violated",reason:`Source node "${g}" not found`,source:"api"}};const y=d?.gap??c??zt,k=d?.direction??"right",R=t.nodeTypes[v.type],V=t.nodeTypes[w.type],A=R?.getSize(v)??{width:154,height:54},P=V?.getSize({...w,position:{x:0,y:0}})??{width:154,height:54},C=U(k,v,A,P,y),B=w.id||h("node"),z={...w,id:B,position:C},q=[{type:"node.add",node:z}];if(d?.autoWireEdges){const ee=G(v),j=G(z),X=k,ce=T(k),ne=ee.find(x=>x.group===X),ae=j.find(x=>x.group===ce),Ee=j.find(x=>x.group===X),fe=ne?Object.values(p.edges).find(x=>x.source.nodeId===g&&x.source.portId===ne.id):Object.values(p.edges).find(x=>x.source.nodeId===g);if(fe){const x=fe.target,I=P.width+y,_=k==="right"?I:k==="left"?-I:0,H=k==="bottom"?I:k==="top"?-I:0,Y=new Set,oe=[x.nodeId];for(;oe.length>0;){const Z=oe.shift();if(Y.has(Z)||Z===g)continue;Y.add(Z);const de=p.nodes[Z];if(de){q.push({type:"node.move",nodeId:Z,position:{x:de.position.x+_,y:de.position.y+H}});for(const le of Object.values(p.edges))le.source.nodeId===Z&&!Y.has(le.target.nodeId)&&oe.push(le.target.nodeId)}}q.push({type:"edge.remove",edgeId:fe.id}),q.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:g,portId:ne?.id},target:{nodeId:B,portId:ae?.id}}}),q.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:B,portId:Ee?.id},target:x}})}else q.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:g,portId:ne?.id},target:{nodeId:B,portId:ae?.id}}})}const K={id:W(),source:d?.source??"user:toolbar",label:d?.label??"插入节点",timestamp:Date.now(),commands:q};return o(K)},onGraphEvent(g,w){return n.on(g,w),()=>n.off(g,w)},unsafeGetGraph(){return n}};return O}function qt(){const n=s.ref(null),e=s.ref(!1);let o=null,t=!1;function r(h){o&&(clearTimeout(o),o=null),n.value=h}function i(h=100){t||(o&&clearTimeout(o),o=setTimeout(()=>{n.value=null,o=null},h))}function a(){t=!0,o&&(clearTimeout(o),o=null)}function c(h=100){t=!1,i(h)}function l(){o&&(clearTimeout(o),o=null)}function m(){l(),t=!1,n.value=null}function f(){o&&clearTimeout(o)}return{hoveredNodeId:n,isDraggingNode:e,enter:r,leave:i,enterOverlay:a,leaveOverlay:c,cancelLeave:l,reset:m,cleanup:f}}const _e=10,he=12;function Be(n,e){const o=n.getTotalLength();if(o===0)return{...e,length:0,totalLength:0};let t=n.getPointAtLength(0),r=1/0;const i=50,a=o/i;let c=0;for(let h=0;h<=i;h++){const u=h*a,b=n.getPointAtLength(u),D=(b.x-e.x)**2+(b.y-e.y)**2;D<r&&(r=D,t=b,c=u)}const l=Math.max(0,c-a),m=Math.min(o,c+a),f=(m-l)/20;for(let h=l;h<=m;h+=f){const u=n.getPointAtLength(h),b=(u.x-e.x)**2+(u.y-e.y)**2;b<r&&(r=b,t=u,c=h)}return{x:t.x,y:t.y,length:c,totalLength:o}}function Pe(n,e){return n<_e||n>e-_e}function Te(n,e,o){const t=n.querySelectorAll(".x6-edge-label");for(const r of t){const i=r.getBoundingClientRect();if(e>=i.left-he&&e<=i.right+he&&o>=i.top-he&&o<=i.bottom+he)return!0}return!1}function Le(){const n="http://www.w3.org/2000/svg",e=document.createElementNS(n,"g");e.setAttribute("class","flow-canvas-edge-delete-tool"),e.style.cursor="pointer";const o=document.createElementNS(n,"rect");o.setAttribute("width","20"),o.setAttribute("height","20"),o.setAttribute("x","-10"),o.setAttribute("y","-10"),o.setAttribute("rx","4"),o.setAttribute("ry","4"),o.setAttribute("fill","#3a84ff"),e.appendChild(o);const t=document.createElementNS(n,"text");return t.setAttribute("font-family","flow-canvas"),t.setAttribute("font-size","16"),t.setAttribute("fill","#ffffff"),t.setAttribute("text-anchor","middle"),t.setAttribute("dominant-baseline","central"),t.textContent="",e.appendChild(t),e}function Ht(n){let e=null,o=null;function t(c,l){if(i(),o=c,l.target?.closest?.(".x6-edge-label"))return;const f=n.getCellById(c);if(!f?.isEdge())return;const h=n.findViewByCell(f);if(!h)return;const u=h.container.querySelector("path");if(!u)return;const b=n.clientToLocal(l.clientX,l.clientY),D=Be(u,b);if(Pe(D.length,D.totalLength)||Te(h.container,l.clientX,l.clientY))return;const L=Le();L.setAttribute("transform",`translate(${D.x}, ${D.y})`),h.container.appendChild(L),e=L}function r(c){if(!o)return;if(c.target?.closest?.(".x6-edge-label")){e&&e.setAttribute("display","none");return}const m=n.getCellById(o);if(!m?.isEdge())return;const f=n.findViewByCell(m);if(!f)return;const h=f.container.querySelector("path");if(!h)return;const u=n.clientToLocal(c.clientX,c.clientY),b=Be(h,u);if(Pe(b.length,b.totalLength)||Te(f.container,c.clientX,c.clientY))e&&e.setAttribute("display","none");else if(e)e.removeAttribute("display"),e.setAttribute("transform",`translate(${b.x}, ${b.y})`);else{const D=Le();D.setAttribute("transform",`translate(${b.x}, ${b.y})`),f.container.appendChild(D),e=D}}function i(){e&&(e.remove(),e=null),o=null}function a(c){c===o&&(e=null,o=null)}return{show:t,move:r,remove:i,handleEdgeRemoved:a}}function Gt(n){let e=null,o=0;function t(f){const h=f?"visible":"hidden";for(const u of n.getNodes())for(const b of u.getPorts())u.setPortProp(b.id,"attrs/circle/visibility",h)}function r(f){if(!e)for(const h of f.getPorts())f.setPortProp(h.id,"attrs/circle/visibility","visible")}function i(f){if(!e)for(const h of f.getPorts())f.setPortProp(h.id,"attrs/circle/visibility","hidden")}function a(f,h){if(!f.getTargetCell())if(e=f.id,h?.size)for(const u of n.getNodes()){const b=h.has(u.id)?"hidden":"visible";for(const D of u.getPorts())u.setPortProp(D.id,"attrs/circle/visibility",b)}else t(!0)}function c(){e=null,t(!1),o=Date.now()+300}function l(f){f===e&&(e=null,t(!1))}function m(){return!e&&Date.now()>=o}return{showNodePorts:r,hideNodePorts:i,handleEdgeAdded:a,handleEdgeConnected:c,handleEdgeRemoved:l,canShowEdgeTool:m}}function Re(n){return n==="top"||n==="right"||n==="bottom"||n==="left"}function Ut(n){const{editor:e,nodeHover:o,isSelectionModeActive:t,viewportVersion:r,getNodeBehavior:i,getInsertGap:a}=n,{isDraggingNode:c}=n,l=s.ref(null),m=s.ref(!1);let f=null,h=null,u=null;const b=s.computed(()=>({enabled:!0,portGroup:"right",...n.quickAddProp.value}));function D(){f&&(clearTimeout(f),f=null)}function L(){f&&clearTimeout(f),f=setTimeout(()=>{l.value=null,f=null},150)}function E(A){return m.value?!0:(D(),g(A)?(l.value=A,!0):(l.value=null,!1))}function M(){D(),o.enterOverlay()}function N(){L(),o.leaveOverlay()}function F(A){const P=e.schema.nodeTypes[A.type];return Ne(A,P?.getPorts)}function G(A,P){const C=b.value.getPort?.(A,P);if(!C)return null;const B=typeof C=="string"?C:C.id;return P.find(z=>z.id===B)??null}function S(A,P){const C=e.api.value?.overlay.getNodeScreenRect(A);if(!C)return null;switch(P){case"top":return{x:C.x+C.width/2,y:C.y};case"bottom":return{x:C.x+C.width/2,y:C.y+C.height};case"left":return{x:C.x,y:C.y+C.height/2};case"right":return{x:C.x+C.width,y:C.y+C.height/2};default:return null}}function U(A,P,C){if(!h)return S(A,C);const B=h.getCellById(A);if(B?.isNode()){const z=B,q=h.findViewByCell(z),K=q?.findPortElem(P,"circle")??q?.findPortElem(P);if(K){const ee=h.container.getBoundingClientRect(),j=K.getBoundingClientRect();return{x:j.left-ee.left+j.width/2,y:j.top-ee.top+j.height/2}}}return S(A,C)}function T(A){const P=F(A),C=G(A,P)??P.find(z=>z.group===b.value.portGroup)??null;if(!C)return null;const B=U(A.id,C.id,C.group);return B?{portId:C.id,portGroup:C.group,portPosition:B}:null}function O(A){const P=T(A),C=b.value.insertDirection;if(typeof C=="function"){const B=C(A,P?{id:P.portId,group:P.portGroup}:null);if(B)return B}else if(C)return C;return P&&Re(P.portGroup)?P.portGroup:Re(b.value.portGroup)?b.value.portGroup:"right"}function g(A){if(!b.value.enabled||e.mode.value!=="edit")return!1;const C=e.flowModel.value.nodes[A];return!C||i(C).quickAddEnabled===!1?!1:!!T(C)}const w=s.computed(()=>{if(r.value,!b.value.enabled)return null;const A=l.value;if(!A||c.value||!e.api.value||e.mode.value!=="edit"||t.value)return null;const C=e.flowModel.value.nodes[A];if(!C)return null;const B=i(C);if(B.quickAddEnabled===!1)return null;const z=T(C);return z?{node:C,...z,behavior:B}:null});function d(A){m.value=!0,w.value&&e._emitUiEvent({type:"node.quick-add",nodeId:A,position:w.value.portPosition})}function p(){m.value=!1}function v(A){const P=e.api.value;if(!P)return;const C=e.flowModel.value.nodes[A];if(!C)return;const B=T(C);B&&P.startConnection(A,B.portId)}function y(A,P){const C=e.api.value;if(!C)return;const B=P.id||e.idGenerator("node"),z={...P,id:B},q=e.flowModel.value.nodes[A];if(!q)return;C.insertNodeToRight(A,z,{autoWireEdges:!0,direction:O(q),gap:a(),source:"user:quick-add",label:"快捷插入节点"}).status==="applied"&&e._emitUiEvent({type:"node.action.quick-insert",sourceNodeId:A,newNodeId:B}),n.closePopover()}function k(A){if(!h)return;const P=h.getCellById(A);if(!P?.isNode())return;const C=P,B=e.flowModel.value.nodes[A];if(!B)return;const z=T(B);let q=!0;i(B).hidePortForQuickAdd===!1&&(q=!1);const ee=q&&!c.value&&!!z&&g(A);for(const j of C.getPorts()){const X=ee&&j.id===z?.portId?"hidden":"visible";C.setPortProp(j.id,"attrs/circle/visibility",X)}}function R(A,P){u?.(),h=A,u=s.watch([l,c],([C],[B])=>{if(B&&B!==C){const z=A.getCellById(B);z?.isNode()&&P(z)}C&&k(C)},{flush:"sync"})}s.watch(w,A=>{A||(m.value=!1)});function V(){f&&clearTimeout(f),u?.(),u=null,h=null}return{quickAddNodeId:l,quickAddPopoverOpen:m,mergedConfig:b,data:w,enter:E,leave:L,cancelLeave:D,handleOverlayEnter:M,handleOverlayLeave:N,handleOpen:d,handleClose:p,handleStartDrag:v,handleInsert:y,isActiveForNode:g,syncNodePorts:k,attachRuntime:R,cleanup:V}}const jt=15,Wt=10;function Xt(n){const{editor:e}=n;let o=null,t=null,r=null,i=null;const a=[];let c=null;const l=s.computed(()=>({enabled:!1,bufferMargin:jt,incomingPortGroup:"left",outgoingPortGroup:"right",...n.edgeDropProp.value}));function m(g){if(!o)return null;const w=o.getCellById(g);if(!w?.isEdge())return null;const d=o.findViewByCell(w)?.container;if(!d)return null;const p=d.querySelectorAll("path");for(const v of p)if(v.getAttribute("stroke")!=="transparent")return v;return null}function f(g){const w=m(g);w&&(w.style.stroke="#3a84ff",i=g)}function h(){if(!i)return;const g=m(i);g&&(g.style.stroke=""),i=null}function u(g,w,d){if(o){const p=o.getCellById(g);if(p?.isNode()){const v=p.getPorts().find(y=>y.group===d);if(v?.id)return v.id}}if(w.ports?.length){const p=w.ports.find(v=>v.group===d);if(p)return p.id}return d}function b(g){const w=g.getTotalLength();if(w===0)return[];const d=[];for(let v=0;v<=w;v+=Wt){const y=g.getPointAtLength(v);d.push({x:y.x,y:y.y})}const p=g.getPointAtLength(w);return d.push({x:p.x,y:p.y}),d}function D(g,w,d){if(!o)return null;const p=l.value,v=p.bufferMargin,y={x:g.x+v,y:g.y+v,width:Math.max(0,g.width-v*2),height:Math.max(0,g.height-v*2)};if(y.width<=0||y.height<=0)return null;const k=y.x+y.width,R=y.y+y.height;let V=null;const A=g.x+g.width/2,P=g.y+g.height/2;for(const C of o.getEdges()){const B=w.edges[C.id];if(!B||d&&(B.source.nodeId===d||B.target.nodeId===d)||p.isEdgeDropTarget&&!p.isEdgeDropTarget(B,w))continue;const z=o.findViewByCell(C);if(!z)continue;const q=z.findOne?.("path");if(!q||typeof q.getTotalLength!="function")continue;const K=b(q);if(!K.length)continue;let ee=!1,j=1/0;for(const X of K)if(X.x>=y.x&&X.x<=k&&X.y>=y.y&&X.y<=R){const ce=X.x-A,ne=X.y-P,ae=ce*ce+ne*ne;ae<j&&(j=ae),ee=!0}ee&&(!V||j<V.distSq)&&(V={edgeId:C.id,edge:B,distSq:j})}return V?{edgeId:V.edgeId,edge:V.edge}:null}function L(g,w){if(!l.value.enabled)return;const p=e.flowModel.value,v=D(g,p,w);v?t!==v.edgeId&&(h(),t=v.edgeId,f(v.edgeId)):t&&(h(),t=null)}let E=!0;function M({node:g}){if(t=null,!l.value.enabled)return;const w=e.flowModel.value,d=w.nodes[g.id];if(!d){E=!1;return}const p=l.value;E=!p.isNodeInsertable||p.isNodeInsertable(d,w)}function N({node:g}){!l.value.enabled||!E||r===null&&(r=requestAnimationFrame(()=>{if(r=null,!o)return;const w=g.getPosition(),d=g.getSize();L({x:w.x,y:w.y,width:d.width,height:d.height},g.id)}))}function F(){r!==null&&(cancelAnimationFrame(r),r=null),h(),E=!0}function G(){if(!o)return;let g=!1;c=()=>{if(!l.value.enabled)return;const w=document.querySelector(".x6-widget-dnd");if(!w){g&&(g=!1,h(),t=null);return}g=!0,r===null&&(r=requestAnimationFrame(()=>{if(r=null,!o)return;const d=w.getBoundingClientRect(),p=o.clientToLocal(d.left,d.top),v=o.clientToLocal(d.right,d.bottom),y={x:p.x,y:p.y,width:v.x-p.x,height:v.y-p.y};L(y)}))},document.addEventListener("mousemove",c),a.push(()=>{c&&(document.removeEventListener("mousemove",c),c=null)})}function S(){h(),t=null,r!==null&&(cancelAnimationFrame(r),r=null)}function U(g){if(!t||g.source!=="user:drag")return g;const w=t;t=null,h();const d=e.flowModel.value,p=d.edges[w];if(!p)return g;const v=g.commands.find(z=>z.type==="node.add"||z.type==="node.move");if(!v)return g;const y=v.type==="node.add"?v.node.id:v.nodeId,k=v.type==="node.add"?v.node:d.nodes[v.nodeId];if(!k)return g;const R=l.value;if(R.isNodeInsertable&&!R.isNodeInsertable(k,d))return g;const V=u(y,k,R.incomingPortGroup),A=u(y,k,R.outgoingPortGroup),P=e.idGenerator("edge"),C=e.idGenerator("edge"),B=[{type:"edge.remove",edgeId:w},{type:"edge.add",edge:{id:P,type:p.type,source:{nodeId:p.source.nodeId,portId:p.source.portId},target:{nodeId:y,portId:V}}},{type:"edge.add",edge:{id:C,type:p.type,source:{nodeId:y,portId:A},target:{nodeId:p.target.nodeId,portId:p.target.portId}}}];return{...g,source:"user:edge-drop",commands:[...g.commands,...B]}}function T(g){o=g;const w=(d,p)=>{g.on(d,p),a.push(()=>g.off(d,p))};w("node:move",M),w("node:change:position",N),w("node:moved",F),G()}function O(){S();for(const g of a)g();a.length=0,o=null,E=!0}return{attachRuntime:T,tryExpandForEdgeDrop:U,cleanup:O}}function Kt(n){function e(r){return{id:n.idGenerator("node"),type:r.type,label:r.label,ports:r.ports?JSON.parse(JSON.stringify(r.ports)):void 0,payload:r.payload?JSON.parse(JSON.stringify(r.payload)):void 0,extensions:r.extensions?JSON.parse(JSON.stringify(r.extensions)):void 0}}function o(r,i,a){const c=n.api.value;switch(r){case"delete":return n.executeCommand({id:W(),source:"user:toolbar",label:"删除节点",timestamp:Date.now(),commands:[{type:"node.remove",nodeId:i}]}),n._emitUiEvent({type:"node.action.delete",nodeId:i}),!0;case"copy":{if(!c)break;const l=n.flowModel.value.nodes[i];if(!l)break;const m=e(l),f=50;n.executeCommand({id:W(),source:"user:toolbar",label:"复制节点",timestamp:Date.now(),commands:[{type:"node.add",node:{...m,position:{x:l.position.x+f,y:l.position.y+f}}}]}),c.selectNodes([m.id]),n._emitUiEvent({type:"node.action.copy",sourceNodeId:i,newNodeId:m.id});break}case"copy-insert":{if(!c)break;const l=n.flowModel.value.nodes[i];if(!l)break;const m=e(l);c.insertNodeToRight(i,m,{autoWireEdges:!0,gap:a,label:"复制并插入节点"}),c.selectNodes([m.id]),n._emitUiEvent({type:"node.action.copy-insert",sourceNodeId:i,newNodeId:m.id});break}case"disconnect":{const l=n.flowModel.value,m=Object.entries(l.edges).filter(([,f])=>{const h=f;return h.source.nodeId===i||h.target.nodeId===i}).map(([f])=>f);if(m.length===0)break;n.executeCommand({id:W(),source:"user:toolbar",label:"断开连线",timestamp:Date.now(),commands:m.map(f=>({type:"edge.remove",edgeId:f}))}),n._emitUiEvent({type:"node.action.disconnect",nodeId:i,edgeIds:m});break}case"debug":{n._emitUiEvent({type:"node.action.debug",nodeId:i});break}}return!1}function t(r){n.api.value?.deleteSelection({selection:r,source:"user:toolbar",label:"批量删除选中"})}return{handleNodeAction:o,deleteSelection:t}}function Yt(){return{refX:0,children:[{tagName:"path",d:"M -16 -5 L -8 0 L -16 5 Z",transform:"rotate(0)"},{tagName:"circle",cx:0,cy:0,r:8,fill:"#3a84ff",stroke:"#3a84ff",transform:"rotate(0)"}]}}function Zt(n,e){const o=e.defaultEdgeType??"default",t=e.edgeTypes?.[o],r={zIndex:-1,attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}};t?.router&&(r.router=typeof t.router=="string"?{name:t.router}:t.router),t?.connector&&(r.connector=typeof t.connector=="string"?{name:t.connector}:t.connector),t?.x6EdgeConfig&&Object.assign(r,t.x6EdgeConfig);const i=r.attrs??{},a=i.line??{};return r.attrs={...i,line:{...a,targetMarker:Yt()}},n.createEdge(r)}const Qt=".x6-widget-selection",Jt=".x6-graph-svg";function eo(n){const e=n.querySelector(Qt),o=n.querySelector(Jt);return!e||!o||e.parentNode!==o.parentNode||!o.parentNode||o.previousSibling===e?!1:(o.parentNode.insertBefore(e,o),!0)}function to(n){const e=()=>eo(n);e();const o=new MutationObserver(()=>{e()});return o.observe(n,{childList:!0}),()=>o.disconnect()}function oo(n,e,o){const t=new Set(e),r=new Set(o),i=new Set([...t,...r]);for(const a of i){const c=n.getCellById(a);if(!c?.isNode())continue;const l=r.has(a),m=c.getData()??{};m._selected!==l&&c.setData({...m,_selected:l})}}const no={class:"flow-canvas-node-actions__bar"},ro=s.defineComponent({__name:"node-actions-toolbar",props:{node:{},position:{},config:{},behavior:{},actionsOffset:{}},emits:["action"],setup(n,{emit:e}){const o=n,t=s.computed(()=>{const h=o.actionsOffset?.x??0,u=o.actionsOffset?.y??0,b=h!==0||u!==0;return{left:`${o.position.x}px`,top:`${o.position.y}px`,transform:b?`translate(${h}px, ${u}px)`:"translateX(-100%)"}}),r=e,i=s.computed(()=>({debug:{visible:o.config.showDebug&&o.behavior.debuggable!==!1,disabled:o.behavior.debugDisabled===!0},delete:{visible:o.config.showDelete&&o.behavior.deletable!==!1,disabled:o.behavior.deleteDisabled===!0},copy:{visible:o.config.showCopy&&o.behavior.copyable!==!1,disabled:o.behavior.copyDisabled===!0},copyInsert:{visible:o.config.showCopyInsert&&o.behavior.copyable!==!1,disabled:o.behavior.copyInsertDisabled===!0},disconnect:{visible:o.config.showDisconnect&&o.behavior.disconnectable!==!1,disabled:o.behavior.disconnectDisabled===!0}})),a=s.computed(()=>i.value.copy.visible||i.value.copyInsert.visible||i.value.disconnect.visible),c=s.ref(!1);let l=null;function m(){l&&(clearTimeout(l),l=null),c.value=!0}function f(){l=setTimeout(()=>{c.value=!1,l=null},100)}return s.onBeforeUnmount(()=>{l&&clearTimeout(l)}),(h,u)=>(s.openBlock(),s.createElementBlock("div",{class:"flow-canvas-node-actions",style:s.normalizeStyle(t.value)},[s.createElementVNode("div",no,[i.value.debug.visible?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass(["flow-canvas-icon canvas-debug flow-canvas-node-actions__icon",{"is-disabled":i.value.debug.disabled}]),onClick:u[0]||(u[0]=b=>!i.value.debug.disabled&&r("action","debug",n.node.id))},null,2)):s.createCommentVNode("",!0),i.value.delete.visible?(s.openBlock(),s.createElementBlock("i",{key:1,class:s.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-node-actions__icon",{"is-disabled":i.value.delete.disabled}]),onClick:u[1]||(u[1]=b=>!i.value.delete.disabled&&r("action","delete",n.node.id))},null,2)):s.createCommentVNode("",!0),a.value?(s.openBlock(),s.createElementBlock("div",{key:2,class:"flow-canvas-node-actions__more-wrapper",onMouseenter:m,onMouseleave:f},[...u[5]||(u[5]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-gengduo flow-canvas-node-actions__icon"},null,-1)])],32)):s.createCommentVNode("",!0)]),s.createVNode(s.Transition,{name:"flow-canvas-fade"},{default:s.withCtx(()=>[c.value&&a.value?(s.openBlock(),s.createElementBlock("div",{key:0,class:"flow-canvas-node-actions__dropdown",onMouseenter:m,onMouseleave:f},[i.value.copy.visible?(s.openBlock(),s.createElementBlock("div",{key:0,class:s.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.copy.disabled}]),onClick:u[2]||(u[2]=b=>!i.value.copy.disabled&&r("action","copy",n.node.id))},[...u[6]||(u[6]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-copy-fuzhi-2"},null,-1),s.createElementVNode("span",null,"复制",-1)])],2)):s.createCommentVNode("",!0),i.value.copyInsert.visible?(s.openBlock(),s.createElementBlock("div",{key:1,class:s.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.copyInsert.disabled}]),onClick:u[3]||(u[3]=b=>!i.value.copyInsert.disabled&&r("action","copy-insert",n.node.id))},[...u[7]||(u[7]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-fuzhibingcharu"},null,-1),s.createElementVNode("span",null,"复制并插入",-1)])],2)):s.createCommentVNode("",!0),i.value.disconnect.visible?(s.openBlock(),s.createElementBlock("div",{key:2,class:s.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.disconnect.disabled}]),onClick:u[4]||(u[4]=b=>!i.value.disconnect.disabled&&r("action","disconnect",n.node.id))},[...u[8]||(u[8]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-unlock-jiebang"},null,-1),s.createElementVNode("span",null,"断开连线",-1)])],2)):s.createCommentVNode("",!0)],32)):s.createCommentVNode("",!0)]),_:1})],4))}}),se=(n,e)=>{const o=n.__vccOpts||n;for(const[t,r]of e)o[t]=r;return o},Xe=se(ro,[["__scopeId","data-v-3b39dab5"]]),so={key:0,class:"flow-canvas-quick-add__tooltip"},io=5,ao=s.defineComponent({__name:"node-quick-add-popover",props:{node:{},portPosition:{}},emits:["open","close","start-drag","mouseenter","mouseleave"],setup(n,{expose:e,emit:o}){const t=n,r=o,i=s.ref(),a=s.ref(),c=s.ref(!1),l=s.ref(!1);let m=null,f=!1,h=null;function u(T){T.preventDefault(),T.stopPropagation(),m={x:T.clientX,y:T.clientY},f=!1,document.addEventListener("mousemove",b),document.addEventListener("mouseup",D)}function b(T){if(!m)return;const O=T.clientX-m.x,g=T.clientY-m.y;Math.sqrt(O*O+g*g)>=io&&(f=!0,L(),r("start-drag",t.node.id))}function D(){L(),f||E(),m=null,f=!1}function L(){document.removeEventListener("mousemove",b),document.removeEventListener("mouseup",D)}function E(){l.value?N():M()}function M(){l.value=!0,r("open",t.node.id),requestAnimationFrame(()=>{document.addEventListener("mousedown",F)})}function N(){l.value=!1,r("close"),document.removeEventListener("mousedown",F)}function F(T){const O=T.target;i.value?.contains(O)||a.value?.contains(O)||N()}function G(){l.value||r("mouseleave")}function S(){h&&(clearTimeout(h),h=null),r("mouseenter")}function U(){h=setTimeout(()=>{N(),r("mouseleave"),h=null},150)}return s.onBeforeUnmount(()=>{L(),h&&clearTimeout(h),document.removeEventListener("mousedown",F)}),e({closePopover:N}),(T,O)=>(s.openBlock(),s.createElementBlock("div",{class:"flow-canvas-quick-add",style:s.normalizeStyle({left:`${n.portPosition.x}px`,top:`${n.portPosition.y}px`}),onMouseenter:O[2]||(O[2]=g=>r("mouseenter")),onMouseleave:G,onClick:O[3]||(O[3]=s.withModifiers(()=>{},["stop"]))},[s.createElementVNode("div",{ref_key:"btnRef",ref:i,class:s.normalizeClass(["flow-canvas-quick-add__btn",{"is-hovered":c.value,"is-active":l.value}]),onMouseenter:O[0]||(O[0]=g=>c.value=!0),onMouseleave:O[1]||(O[1]=g=>c.value=!1),onMousedown:u},[...O[4]||(O[4]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-zoom-add"},null,-1)])],34),c.value&&!l.value?(s.openBlock(),s.createElementBlock("div",so,[...O[5]||(O[5]=[s.createElementVNode("div",null,[s.createElementVNode("b",null,"点击"),s.createTextVNode(" 添加节点")],-1),s.createElementVNode("div",null,[s.createElementVNode("b",null,"拖拽"),s.createTextVNode(" 连接节点")],-1)])])):s.createCommentVNode("",!0),s.createVNode(s.Transition,{name:"flow-canvas-fade"},{default:s.withCtx(()=>[l.value?(s.openBlock(),s.createElementBlock("div",{key:0,ref_key:"popoverRef",ref:a,class:"flow-canvas-quick-add__popover",onMouseenter:S,onMouseleave:U},[s.renderSlot(T.$slots,"default",{},()=>[O[6]||(O[6]=s.createElementVNode("div",{class:"flow-canvas-quick-add__default-content"},"节点快捷操作面板",-1))],!0)],544)):s.createCommentVNode("",!0)]),_:3})],36))}}),Ke=se(ao,[["__scopeId","data-v-336cc3b4"]]),lo={class:"flow-canvas-selection-actions__bar"},co=s.defineComponent({__name:"selection-actions-toolbar",props:{position:{},canDelete:{type:Boolean}},emits:["action"],setup(n,{emit:e}){const o=n,t=e,r=s.computed(()=>({left:`${o.position.x}px`,top:`${o.position.y}px`,transform:"translateX(-100%)"}));return(i,a)=>(s.openBlock(),s.createElementBlock("div",{class:"flow-canvas-selection-actions",style:s.normalizeStyle(r.value)},[s.createElementVNode("div",lo,[s.createElementVNode("i",{class:s.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-selection-actions__icon",{"is-disabled":!n.canDelete}]),onClick:a[0]||(a[0]=c=>n.canDelete&&t("action","delete"))},null,2)])],4))}}),uo=se(co,[["__scopeId","data-v-25eb8b79"]]),fo={class:"flow-canvas-runtime-core__overlay"},go=s.defineComponent({__name:"canvas-runtime-core",props:{editor:{},graphOptions:{},nodeActions:{},quickAdd:{},edgeDrop:{},getConnectionExcludedNodeIds:{type:Function},toolbarInclude:{}},emits:["ui-event"],setup(n,{expose:e,emit:o}){const t=n,r=o,i=s.ref(),a=s.ref();let c,l,m,f,h=null,u=null,b=null,D=null,L=null;const E=qt(),{hoveredNodeId:M,isDraggingNode:N}=E,F=E.enterOverlay,G=()=>E.leaveOverlay(),S=s.ref(0),U=s.ref({nodeIds:[],edgeIds:[]});function T(x){const I=t.editor.api.value;return I?t.editor.schema.nodeTypes[x.type]?.getBehavior?.(x,{api:I,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})??{}:{}}const O=s.computed(()=>t.editor.mode.value==="edit"&&t.editor.selectionMode.value),g=s.computed(()=>({showDebug:!1,showDelete:!0,showCopy:!0,showCopyInsert:!0,showDisconnect:!0,insertGap:100,...t.nodeActions})),w=s.computed(()=>{if(S.value,!t.editor.api.value)return[];const x=t.editor.flowModel.value,I=t.editor.api.value.overlay,_=[];for(const[H,Y]of Object.entries(x.nodes)){const oe=t.editor._pluginManager.collectNodeDecorations(Y);if(!oe?.badge)continue;const Z=I.getNodeScreenRect(H);Z&&_.push({nodeId:H,x:Z.x+Z.width-4,y:Z.y-8,badge:oe.badge})}return _}),d=s.computed(()=>{S.value;const x=M.value;if(!x||N.value||!t.editor.api.value||t.editor.mode.value!=="edit"||O.value)return null;const _=t.editor.flowModel.value.nodes[x];if(!_)return null;const H=t.editor.api.value.overlay.getNodeScreenRect(x);if(!H)return null;const Y=T(_);return Y.showActions===!1?null:{node:_,position:{x:H.x+H.width,y:H.y+H.height+4},behavior:Y}}),p=s.computed(()=>{if(S.value,!t.editor.api.value||t.editor.mode.value!=="edit")return null;const x=U.value;if(x.nodeIds.length+x.edgeIds.length===0)return null;const I=t.editor.api.value.getSelectionBounds(x);if(!I)return null;const _=We(x,t.editor.flowModel.value,T);return{position:{x:I.x+I.width,y:I.y+I.height+4},canDelete:_.nodeIds.length>0||_.edgeIds.length>0}}),v=s.ref(),y=Ut({editor:t.editor,quickAddProp:s.computed(()=>t.quickAdd),isDraggingNode:N,nodeHover:E,isSelectionModeActive:O,viewportVersion:S,getNodeBehavior:T,getInsertGap:()=>g.value.insertGap,closePopover:()=>v.value?.closePopover()}),k=y.data,R=y.handleOpen,V=y.handleStartDrag;function A(){y.handleClose(),E.leaveOverlay(200),y.leave()}const P=y.handleOverlayEnter,C=y.handleOverlayLeave,B=y.handleInsert,z=Xt({editor:t.editor,edgeDropProp:s.computed(()=>t.edgeDrop)}),q=Kt(t.editor);function K(x,I){q.handleNodeAction(x,I,g.value.insertGap)&&(M.value=null)}function ee(x){x==="delete"&&q.deleteSelection(U.value)}function j(x){if(t.editor.mode.value!=="edit")return;if((x.metaKey||x.ctrlKey)&&(x.key==="z"||x.key==="Z")){if(x.shiftKey){if(!t.toolbarInclude?.includes("redo"))return;t.editor.history.redo()}else{if(!t.toolbarInclude?.includes("undo"))return;t.editor.history.undo()}x.preventDefault();return}t.editor._pluginManager.dispatchKeyboardShortcut(x)&&(x.preventDefault(),x.stopPropagation())}function X(x,I){const _=c,H=Y=>{const oe=_.isRubberbandEnabled?.()??!1;oe&&_.disableRubberband?.(),Y?c.enablePanning():c.disablePanning(),oe&&_.enableRubberband?.()};x&&I?(_.enableSelection?.(),E.reset(),y.quickAddNodeId.value=null,y.quickAddPopoverOpen.value=!1,h?.remove(),H(!1),_.enableRubberband?.()):(_.disableRubberband?.(),H(!0),_.disableSelection?.(),_.cleanSelection?.())}function ce(x){c.on("node:move",({node:I})=>{N.value=!0;const _=t.editor.flowModel.value.nodes[I.id];_&&T(_).bringToFrontOnDrag===!1||I.toFront?.()}),c.on("node:moved",()=>{N.value=!1}),c.on("node:mouseenter",({node:I})=>{if(O.value){M.value=null,y.quickAddNodeId.value=null,x.hideNodePorts(I);return}E.enter(I.id);const _=t.editor.flowModel.value.nodes[I.id];if(_&&T(_).showPorts===!1){y.mergedConfig.value.enabled&&y.enter(I.id);return}y.mergedConfig.value.enabled&&y.enter(I.id)||x.showNodePorts(I)}),c.on("node:mouseleave",({node:I})=>{if(O.value){x.hideNodePorts(I);return}const _=t.editor.flowModel.value.nodes[I.id];let H=100;_&&T(_).actionsOffset&&(H=300),E.leave(H),y.mergedConfig.value.enabled?y.quickAddNodeId.value===I.id&&!y.quickAddPopoverOpen.value?y.leave():y.quickAddNodeId.value!==I.id&&x.hideNodePorts(I):x.hideNodePorts(I)})}function ne(x){c.on("edge:added",({edge:I})=>{let _;if(t.getConnectionExcludedNodeIds&&!I.getTargetCell()){const H=I.getSourceCell();if(H){const Y=t.getConnectionExcludedNodeIds(H.id);_=Y instanceof Set?Y:new Set(Y)}}x.handleEdgeAdded(I,_)}),c.on("edge:connected",()=>{x.handleEdgeConnected()}),c.on("edge:removed",({edge:I})=>{x.handleEdgeRemoved(I.id),h.handleEdgeRemoved(I.id)}),c.on("edge:mouseenter",({edge:I,e:_})=>{const H=l.getHoveredEdgeId();l.setHoveredEdge(I.id),H&&H!==I.id&&l.refreshSingleEdgeStyle(H),l.refreshSingleEdgeStyle(I.id),t.editor.mode.value==="edit"&&!O.value&&x.canShowEdgeTool()&&h.show(I.id,_)}),c.on("edge:mouseleave",({edge:I})=>{l.setHoveredEdge(null),l.refreshSingleEdgeStyle(I.id),h.remove()}),c.on("edge:click",({edge:I,e:_})=>{_.target?.closest?.(".flow-canvas-edge-delete-tool")&&t.editor.mode.value==="edit"&&(h.remove(),t.editor.executeCommand({id:W(),source:"user:toolbar",label:"删除连线",timestamp:Date.now(),commands:[{type:"edge.remove",edgeId:I.id}]}))}),u=I=>h.move(I),c.container.addEventListener("mousemove",u)}function ae(){b=x=>{if(!M.value&&!y.quickAddNodeId.value)return;const I=x.target;if(I?.closest?.(".x6-node")||I?.closest?.(".flow-canvas-node-actions")||I?.closest?.(".flow-canvas-quick-add")){E.cancelLeave(),y.cancelLeave();return}E.leave(180),y.quickAddPopoverOpen.value||y.leave()},i.value?.addEventListener("mousemove",b),D=()=>{E.reset(),y.quickAddPopoverOpen.value||(y.quickAddNodeId.value=null)},i.value?.addEventListener("mouseleave",D),i.value?.addEventListener("keydown",j)}function Ee(){s.watch(()=>t.editor.flowModel.value,x=>l.syncFlowModel(x)),s.watch([()=>t.editor.mode.value,()=>t.editor.selectionMode.value],([x,I])=>{X(x==="edit",I)},{immediate:!0})}s.onMounted(()=>{if(!a.value)return;const x=new Set(["model","container"]),I={};if(t.graphOptions)for(const[$,Q]of Object.entries(t.graphOptions)){if(x.has($)){console.warn(`[flow-canvas] graphOptions.${$} is managed by the engine and will be ignored`);continue}I[$]=Q}c=new at.Graph({container:a.value,autoResize:!0,background:{color:"#edf2fc"},grid:{visible:!0,size:20,type:"dot",args:{color:"#C1CADB",thickness:2}},highlighting:{magnetAdsorbed:{name:"className",args:{className:"flow-canvas-magnet-adsorbed"}}},panning:{enabled:!0},mousewheel:{enabled:!0,modifiers:["ctrl","meta"]},interacting:{nodeMovable($){return $.cell.getProp("draggable")!==!1}},connecting:{allowBlank:!1,allowMulti:!0,allowLoop:!1,allowNode:!1,allowEdge:!1,highlight:!0,anchor:"center",connectionPoint:"anchor",snap:{radius:30},createEdge(){return Zt(this,t.editor.schema)}},...I}),m=new Pt,l=new Bt(c,t.editor.schema,m,$=>t.editor._pluginManager.collectNodeDecorations($),$=>t.editor._pluginManager.collectEdgeDecorations($),()=>t.editor.api.value?{api:t.editor.api.value,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value}:null);const _=Lt(c),H=Vt({graph:c,overlayManager:_,executeCommand:$=>t.editor.executeCommand(z.tryExpandForEdgeDrop($)),schema:t.editor.schema,flowModel:t.editor.flowModel,getNodeBehavior:T,idGenerator:t.editor.idGenerator,defaultInsertGap:t.nodeActions?.insertGap,getContextMenuItems:$=>t.editor._pluginManager.collectContextMenuItems($),onHighlightChange:($,Q)=>{l.setHighlightedNodes($);const re=l.setHighlightedEdges(Q);l.refreshNodeHighlights();const J=new Set(Q);for(const ie of re)J.has(ie)||l.refreshSingleEdgeStyle(ie);for(const ie of J)re.has(ie)||l.refreshSingleEdgeStyle(ie)},resolveNodeShape:$=>{const Q=t.editor.schema.nodeTypes[$];if(!Q)return null;const re=m.registerNodeType($,Q.component),J=Q.getSize({id:"",type:$,position:{x:0,y:0}});return{shapeName:re,width:J.width,height:J.height}}});t.editor.api.value=H;const Y={flowModel:t.editor.flowModel,history:t.editor.history,schema:t.editor.schema,mode:t.editor.mode,idGenerator:t.editor.idGenerator,executeCommand:t.editor.executeCommand,selectionMode:t.editor.selectionMode,api:H,overlay:_,graph:c};t.editor._pluginManager.attachRuntime(Y);const oe=t.editor._pluginManager.collectExtendedApi();Object.assign(t.editor.extendedApi,oe),t.editor._emitUiEvent=$=>{t.editor._pluginManager.dispatchUiEvent($),r("ui-event",$)},f=new Tt(c,$=>{($.type==="node.click"||$.type==="node.dblclick"||$.type==="node.contextmenu")&&E.enter($.nodeId),t.editor._emitUiEvent($)},$=>{if(l.isSyncing)return;const Q=z.tryExpandForEdgeDrop($);if(t.editor.executeCommand(Q).status!=="applied"){for(const J of Q.commands)if(J.type==="edge.add"){const ie=c.getCellById(J.edge.id);ie&&c.removeCell(ie)}}},t.editor.flowModel,t.editor.idGenerator),h=Ht(c);const Z=Gt(c);y.attachRuntime(c,$=>Z.hideNodePorts($)),z.attachRuntime(c),ce(Z),ne(Z),L=to(c.container);let de=new Set,le=new Set;c.on("selection:changed",()=>{const $=je(c.getSelectedCells?.()??[]),Q=new Set($.nodeIds);oo(c,de,Q),de=Q,U.value=$,t.editor._pluginManager.dispatchSelectionChange($),r("ui-event",{type:"selection.change",nodeIds:$.nodeIds,edgeIds:$.edgeIds}),l.refreshNodeHighlights();const re=new Set($.edgeIds);for(const J of le)re.has(J)||l.refreshSingleEdgeStyle(J);for(const J of re)le.has(J)||l.refreshSingleEdgeStyle(J);le=re});const ke=()=>{S.value++};c.on("translate",ke),c.on("scale",ke),c.on("resize",ke),ae(),l.syncFlowModel(t.editor.flowModel.value),Ee()});function fe(){E.reset(),y.quickAddNodeId.value=null,y.quickAddPopoverOpen.value=!1}return e({resetHoverState:fe}),s.onBeforeUnmount(()=>{E.cleanup(),y.cleanup(),z.cleanup(),h?.remove(),u&&c?.container?.removeEventListener("mousemove",u),b&&i.value?.removeEventListener("mousemove",b),D&&i.value?.removeEventListener("mouseleave",D),L?.(),i.value?.removeEventListener("keydown",j),t.editor._pluginManager.detachRuntime(),t.editor.api.value=null;for(const x of Object.keys(t.editor.extendedApi))delete t.editor.extendedApi[x];f?.dispose(),l?.dispose(),m?.dispose(),c?.dispose()}),(x,I)=>(s.openBlock(),s.createElementBlock("div",{ref_key:"rootRef",ref:i,class:s.normalizeClass(["flow-canvas-runtime-core",{"flow-canvas-runtime-core--selection-mode":O.value}]),tabindex:"0"},[s.createElementVNode("div",{ref_key:"containerRef",ref:a,class:"flow-canvas-runtime-core__graph"},null,512),s.createElementVNode("div",fo,[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(w.value,_=>(s.openBlock(),s.createElementBlock("div",{key:`badge-${_.nodeId}`,class:"flow-canvas-runtime-core__badge",style:s.normalizeStyle({left:`${_.x}px`,top:`${_.y}px`,backgroundColor:_.badge.color})},s.toDisplayString(_.badge.text),5))),128)),s.unref(k)?(s.openBlock(),s.createBlock(Ke,{key:0,ref_key:"quickAddPopoverRef",ref:v,node:s.unref(k).node,"port-position":s.unref(k).portPosition,onOpen:s.unref(R),onClose:A,onStartDrag:s.unref(V),onMouseenter:s.unref(P),onMouseleave:s.unref(C)},{default:s.withCtx(()=>[s.renderSlot(x.$slots,"quick-add-panel",{node:s.unref(k).node,api:n.editor.api.value,insertNodeToRight:_=>s.unref(B)(s.unref(k).node.id,_),closePopover:()=>v.value?.closePopover()},void 0,!0)]),_:3},8,["node","port-position","onOpen","onStartDrag","onMouseenter","onMouseleave"])):s.createCommentVNode("",!0),d.value?(s.openBlock(),s.createBlock(Xe,{key:1,node:d.value.node,position:d.value.position,config:g.value,behavior:d.value.behavior,"actions-offset":d.value.behavior.actionsOffset,onAction:K,onMouseenter:s.unref(F),onMouseleave:G},null,8,["node","position","config","behavior","actions-offset","onMouseenter"])):s.createCommentVNode("",!0),p.value?(s.openBlock(),s.createBlock(uo,{key:2,position:p.value.position,"can-delete":p.value.canDelete,onAction:ee},null,8,["position","can-delete"])):s.createCommentVNode("",!0)])],2))}}),po=se(go,[["__scopeId","data-v-a9bbf5f1"]]),ho={class:"flow-canvas-node-palette"},vo=["data-node-type"],mo={class:"flow-canvas-node-palette__item-label"},yo=s.defineComponent({__name:"canvas-node-palette",props:{editor:{},items:{}},setup(n){const e=n,o=s.ref(),t=s.computed(()=>e.items?e.items:Object.keys(e.editor.schema.nodeTypes).map(r=>({type:r,label:r.charAt(0).toUpperCase()+r.slice(1)})));return s.watch([()=>e.editor.api.value,t,o],([r,i,a],c,l)=>{if(!r||!a)return;const m=[];for(const f of i){const h=a.querySelector(`[data-node-type="${f.type}"]`);if(!h)continue;const u=r.registerDndSource(h,()=>({id:W(),type:f.type,label:f.label,position:{x:0,y:0}}));m.push(u)}l(()=>{for(const f of m)f()})},{flush:"post"}),(r,i)=>(s.openBlock(),s.createElementBlock("div",ho,[s.createElementVNode("div",{ref_key:"listRef",ref:o,class:"flow-canvas-node-palette__list"},[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(t.value,a=>(s.openBlock(),s.createElementBlock("div",{key:a.type,class:"flow-canvas-node-palette__item","data-node-type":a.type},[a.icon?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass([a.icon,"flow-canvas-node-palette__item-icon"])},null,2)):s.createCommentVNode("",!0),s.createElementVNode("span",mo,s.toDisplayString(a.label),1)],8,vo))),128))],512)]))}}),Ye=se(yo,[["__scopeId","data-v-300314b7"]]),wo={class:"flow-canvas-layout"},bo={class:"flow-canvas-layout__main"},Eo={class:"flow-canvas-layout__content"},ko={key:0,class:"flow-canvas-layout__footer"},Co=s.defineComponent({__name:"canvas-layout",props:{sidebarCollapsed:{type:Boolean,default:!1},sidebarWidth:{default:260},hideSidebar:{type:Boolean,default:!1},hideFooter:{type:Boolean,default:!1},editor:{default:void 0},paletteItems:{default:void 0}},emits:["update:sidebarCollapsed"],setup(n){return(e,o)=>(s.openBlock(),s.createElementBlock("div",wo,[!n.hideSidebar&&(e.$slots.sidebar||n.editor)?(s.openBlock(),s.createElementBlock("aside",{key:0,class:s.normalizeClass(["flow-canvas-layout__sidebar",{"is-collapsed":n.sidebarCollapsed}]),style:s.normalizeStyle({width:n.sidebarCollapsed?"0px":`${n.sidebarWidth}px`})},[s.renderSlot(e.$slots,"sidebar",{},()=>[n.editor?(s.openBlock(),s.createBlock(Ye,{key:0,editor:n.editor,items:n.paletteItems},null,8,["editor","items"])):s.createCommentVNode("",!0)],!0)],6)):s.createCommentVNode("",!0),s.createElementVNode("div",bo,[s.createElementVNode("div",Eo,[s.renderSlot(e.$slots,"default",{},void 0,!0)]),!n.hideFooter&&e.$slots.footer?(s.openBlock(),s.createElementBlock("div",ko,[s.renderSlot(e.$slots,"footer",{},void 0,!0)])):s.createCommentVNode("",!0)])]))}}),xo=se(Co,[["__scopeId","data-v-26f35b6b"]]),Oe=typeof navigator<"u"&&/Mac|iPod|iPhone|iPad/.test(navigator.platform??navigator.userAgent),Io=["undo","redo"];function Ze(n){const e=new Set(n?.include),o=new Set(Io.filter(l=>!e.has(l))),t=[{id:"undo",type:"undo",group:"history",icon:"flow-canvas-icon canvas-undo",description:"撤销",shortcut:Oe?["⌘","Z"]:["Ctrl","Z"],order:10},{id:"redo",type:"redo",group:"history",icon:"flow-canvas-icon canvas-redo",description:"重做",shortcut:Oe?["⇧","⌘","Z"]:["Ctrl","Shift","Z"],order:11}],r=[{id:"select",type:"select",group:"tools",icon:"flow-canvas-icon canvas-kuangxuan",description:"框选模式",order:20},{id:"auto-layout",type:"auto-layout",group:"tools",icon:"flow-canvas-icon canvas-beautify",description:"自动排版",order:21},{id:"export",type:"export",group:"tools",icon:"flow-canvas-icon canvas-xiazai",description:"下载",order:24}],i=[{id:"zoom-out",type:"zoom-out",group:"zoom",icon:"flow-canvas-icon canvas-zoom-minus",description:"缩小画布",order:30},{id:"zoom-display",type:"zoom-display",group:"zoom",order:31},{id:"zoom-in",type:"zoom-in",group:"zoom",icon:"flow-canvas-icon canvas-zoom-add",description:"放大画布",order:32}],a=[{id:"reset",type:"reset",group:"reset",icon:"flow-canvas-icon canvas-reset-1_1",description:"重置视图",order:40}];return[...[...t,...r].filter(l=>!o.has(l.type)),...i,...a]}const So={class:"flow-canvas-toolbar"},No={key:0,class:"flow-canvas-toolbar__separator"},Mo={class:"flow-canvas-toolbar__group"},Do={key:0,class:"flow-canvas-toolbar__zoom-display"},Ao=["data-toolbar-id","data-toolbar-type","disabled","onClick","onMouseenter"],_o=["textContent"],Bo={key:0,class:"flow-canvas-toolbar-tooltip__kbd"},Po=s.defineComponent({__name:"canvas-toolbar",props:{items:{},exclude:{},include:{},editor:{}},setup(n){const e=new Set(["undo","redo","select","auto-layout","search","minimap","export"]),o=new Set(["select","search","minimap"]);function t(d){return d.id.startsWith("plugin:")||d.type==="custom"}function r(d){return d!=="custom"&&o.has(d)}const i=n,a=s.computed(()=>{if(i.items)return i.items;const d=Ze({include:i.include}),p=i.editor.toolbarItems.value,v=new Set(i.exclude??[]),y=new Map;for(const k of d)y.set(k.id,k);for(const k of p){const R=y.get(k.id);R?y.set(k.id,{...R,...k,order:R.order,group:R.group}):t(k)&&y.set(k.id,k)}return[...y.values()].filter(k=>k.type==="custom"||!e.has(k.type)?!0:!v.has(k.type)).sort((k,R)=>(k.order??0)-(R.order??0))}),c=s.ref(1),l=s.ref(null),m=s.ref(null),f=s.ref(!1);let h=null;s.watch(()=>i.editor.api.value,d=>{h?.(),h=null,d&&(c.value=d.getZoom(),h=d.onGraphEvent("scale",()=>{c.value=d.getZoom()}))},{immediate:!0});const u=s.reactive({visible:!1,text:"",shortcut:[],x:0,y:0});function b(d,p){if(!p.description)return;const y=d.currentTarget.getBoundingClientRect();u.text=p.description,u.shortcut=p.shortcut??[],u.visible=!0,s.nextTick(()=>{const k=l.value?.offsetWidth??0,R=l.value?.offsetHeight??0;u.x=y.left+y.width/2-k/2,u.y=y.top-R-6})}function D(){u.visible=!1,l.value=null}s.onScopeDispose(()=>{h?.()});const L=s.computed(()=>`${Math.round(c.value*100)}%`),E=s.computed(()=>i.editor.api.value?{api:i.editor.api.value,flowModel:i.editor.flowModel.value,history:i.editor.history,mode:i.editor.mode.value}:null);function M(d){return d.visible===!1?!1:typeof d.visible=="function"?E.value?d.visible(E.value):!1:!0}function N(d){return typeof d.active=="function"?E.value?d.active(E.value):!1:d.active!==void 0?d.active:d.type==="select"?i.editor.selectionMode.value:!1}const F=s.computed(()=>{const d=g.value.filter(v=>r(v.type)&&N(v));if(d.length===0)return null;const p=m.value;return p&&d.some(v=>v.type===p)?p:d[0]?.type??null});function G(d){return r(d.type)?F.value===d.type:N(d)}function S(d){return!E.value||d.disabled===!0?!0:typeof d.disabled=="function"?d.disabled(E.value):d.type==="undo"?!i.editor.history.canUndo.value:d.type==="redo"?!i.editor.history.canRedo.value:d.type==="export"?f.value:!1}function U(d){if(!(!E.value||!r(d.type)||!N(d))){if(d.type==="select"){i.editor.setSelectionMode(!1);return}d.onClick?.(E.value)}}function T(d){if(r(d.type))for(const p of g.value)!r(p.type)||p.id===d.id||U(p)}function O(d){if(!E.value||S(d))return;if(r(d.type)&&(m.value=d.type,T(d)),d.onClick){d.onClick(E.value);return}const{api:p}=E.value;switch(d.type){case"undo":i.editor.history.undo();break;case"redo":i.editor.history.redo();break;case"zoom-in":p.zoomIn(),c.value=p.getZoom();break;case"zoom-out":p.zoomOut(),c.value=p.getZoom();break;case"fit":p.zoomToFit();break;case"reset":p.zoomTo(1),p.scrollToOrigin(),c.value=1;break;case"export":if(f.value)break;f.value=!0,p.exportAsImage().then(v=>{const y=URL.createObjectURL(v),k=document.createElement("a");k.href=y,k.download="canvas-export.png",k.click(),URL.revokeObjectURL(y)}).catch(v=>{console.warn("[flow-canvas] Export failed:",v)}).finally(()=>{f.value=!1});break;case"select":i.editor.setSelectionMode(!i.editor.selectionMode.value);break;case"auto-layout":i.editor._emitUiEvent({type:"toolbar.auto-layout"});break;case"search":case"minimap":console.warn(`[flow-canvas] "${d.type}" toolbar item has no built-in handler. Provide an onClick callback.`);break;default:d.type!=="custom"&&console.warn(`[flow-canvas] No default handler for toolbar type "${d.type}". Provide an onClick handler.`);break}}const g=s.computed(()=>a.value.filter(M)),w=s.computed(()=>{const d=new Map,p=[];for(const v of g.value){const y=v.group??"default";d.has(y)||(d.set(y,[]),p.push(y)),d.get(y).push(v)}return p.map(v=>({name:v,items:d.get(v)})).filter(v=>v.items.length>0)});return(d,p)=>(s.openBlock(),s.createElementBlock("div",So,[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(w.value,(v,y)=>(s.openBlock(),s.createElementBlock(s.Fragment,{key:v.name},[y>0?(s.openBlock(),s.createElementBlock("div",No)):s.createCommentVNode("",!0),s.createElementVNode("div",Mo,[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(v.items,k=>(s.openBlock(),s.createElementBlock(s.Fragment,{key:k.id},[k.type==="zoom-display"?(s.openBlock(),s.createElementBlock("span",Do,s.toDisplayString(L.value),1)):(s.openBlock(),s.createElementBlock("button",{key:1,type:"button",class:s.normalizeClass(["flow-canvas-toolbar__btn",{"is-disabled":S(k),"is-active":G(k),"is-exporting":k.type==="export"&&f.value}]),"data-toolbar-id":k.id,"data-toolbar-type":k.type,disabled:S(k),onClick:R=>O(k),onMouseenter:R=>b(R,k),onMouseleave:D},[k.component?(s.openBlock(),s.createBlock(s.resolveDynamicComponent(k.component),{key:0})):k.icon?(s.openBlock(),s.createElementBlock("i",{key:1,class:s.normalizeClass(k.icon)},null,2)):(s.openBlock(),s.createElementBlock("span",{key:2,class:"flow-canvas-toolbar__text",textContent:s.toDisplayString(k.text??k.description??k.id)},null,8,_o))],42,Ao))],64))),128))])],64))),128)),(s.openBlock(),s.createBlock(s.Teleport,{to:"body"},[u.visible?(s.openBlock(),s.createElementBlock("div",{key:0,ref_key:"tooltipRef",ref:l,class:"flow-canvas-toolbar-tooltip",style:s.normalizeStyle({left:`${u.x}px`,top:`${u.y}px`})},[s.createElementVNode("span",null,s.toDisplayString(u.text),1),u.shortcut.length?(s.openBlock(),s.createElementBlock("kbd",Bo,[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(u.shortcut,(v,y)=>(s.openBlock(),s.createElementBlock("span",{key:y},s.toDisplayString(v),1))),128))])):s.createCommentVNode("",!0),p[0]||(p[0]=s.createElementVNode("div",{class:"flow-canvas-toolbar-tooltip__arrow"},null,-1))],4)):s.createCommentVNode("",!0)]))]))}}),To=se(Po,[["__scopeId","data-v-904248f4"]]),Lo={class:"flow-canvas-default-node__ep-label"},Ro={key:1,class:"flow-canvas-default-node__diamond flow-canvas-highlight-target"},Oo={key:2,class:"flow-canvas-default-node__task-label"},$o=s.defineComponent({__name:"default-node",setup(n){const o=s.inject("getNode")?.(),t=s.computed(()=>o?.getData?.()??null),r=s.computed(()=>t.value?.label||t.value?.type||""),i={start:"canvas-kaishi",end:"canvas-stop","parallel-gateway":"canvas-bingxingwangguan","branch-gateway":"canvas-fenzhiwangguan","converge-gateway":"canvas-huijuwangguan","conditional-parallel-gateway":"canvas-tiaojianbingxingwangguan"},a=new Set(["start","end"]),c=new Set(["parallel-gateway","branch-gateway","converge-gateway","conditional-parallel-gateway"]),l=s.computed(()=>{const f=t.value?.type??"";return a.has(f)?"endpoint":c.has(f)?"gateway":"task"}),m=s.computed(()=>i[t.value?.type??""]??"");return(f,h)=>(s.openBlock(),s.createElementBlock("div",{class:s.normalizeClass(["flow-canvas-default-node",[`is-${l.value}`,{"flow-canvas-highlight-target":l.value!=="gateway"}]])},[l.value==="endpoint"?(s.openBlock(),s.createElementBlock(s.Fragment,{key:0},[m.value?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass([["flow-canvas-icon",m.value],"flow-canvas-default-node__ep-icon"])},null,2)):s.createCommentVNode("",!0),s.createElementVNode("span",Lo,s.toDisplayString(r.value),1)],64)):l.value==="gateway"?(s.openBlock(),s.createElementBlock("div",Ro,[m.value?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass([["flow-canvas-icon",m.value],"flow-canvas-default-node__gw-icon"])},null,2)):s.createCommentVNode("",!0)])):(s.openBlock(),s.createElementBlock("span",Oo,s.toDisplayString(r.value),1))],2))}}),Qe=se($o,[["__scopeId","data-v-f0e24a9f"]]),Fo={start:{label:"开始",icon:"flow-canvas-icon canvas-kaishi",width:88,height:40},end:{label:"结束",icon:"flow-canvas-icon canvas-stop",width:88,height:40},empty:{label:"空节点",icon:"flow-canvas-icon canvas-jiedi",width:240,height:48},"parallel-gateway":{label:"并行网关",icon:"flow-canvas-icon canvas-bingxingwangguan",width:64,height:64},"branch-gateway":{label:"分支网关",icon:"flow-canvas-icon canvas-fenzhiwangguan",width:64,height:64},"converge-gateway":{label:"汇聚网关",icon:"flow-canvas-icon canvas-huijuwangguan",width:64,height:64},"conditional-parallel-gateway":{label:"条件并行网关",icon:"flow-canvas-icon canvas-tiaojianbingxingwangguan",width:64,height:64}},$e=(n,e)=>({stroke:e.hovered?"#3a84ff":"#abb5cc",strokeWidth:2});function Fe(){return{attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}}}function Je(){return{manhattan:{router:{name:"manhattan",args:{padding:10,maxDirectionChange:90}},connector:{name:"rounded",args:{radius:8}},style:$e,x6EdgeConfig:Fe()},bezier:{connector:{name:"smooth"},style:$e,x6EdgeConfig:Fe()}}}function zo(n){const e=n?.nodeTypes??Fo,o={},t=[];for(const[a,c]of Object.entries(e)){const l=c.width??150,m=c.height??50;o[a]={component:Qe,getSize:()=>({width:l,height:m}),getPorts:()=>Ue()},t.push({type:a,label:c.label??a,icon:c.icon})}const r={...Je(),...n?.edgeTypes},i=n?.defaultEdgeType??"manhattan";return{schema:{nodeTypes:o,defaultEdgeType:i,edgeTypes:r},paletteItems:t}}function Vo(n){return{name:"connection-validator",priority:10,transformCommand(e,o,t){const r=new Set;for(const i of e.commands)i.type==="edge.remove"&&r.add(i.edgeId);for(const i of e.commands){if(i.type!=="edge.add"&&i.type!=="edge.reconnect")continue;const a=t.flowModel.value,c=i.type==="edge.add"?i.edge.source.nodeId:i.source?.nodeId,l=i.type==="edge.add"?i.edge.target.nodeId:i.target?.nodeId;if(!c||!l)continue;const m=a.nodes[c],f=a.nodes[l];if(!m||!f)continue;const h=i.type==="edge.add"?i.edge.source.portId:i.source?.portId,u=i.type==="edge.add"?i.edge.target.portId:i.target?.portId,b=h?m.ports?.find(N=>N.id===h):void 0,D=u?f.ports?.find(N=>N.id===u):void 0,L=i.type==="edge.reconnect"?i.edgeId:void 0,E=Object.values(a.edges).filter(N=>N.id!==L&&!r.has(N.id)),M=n({flowModel:a,sourceNode:m,targetNode:f,sourcePort:b,targetPort:D,existingEdges:E});if(!M.valid)return{rejected:!0,reason:M.reason??"Connection validation failed",code:"validation_failed"}}return e}}}function qo(n){const{rubberband:e=!0,multiple:o=!0,movable:t=!0}=n??{};return{name:"selection",priority:90,attachRuntime(r){r.graph.use(new ct.Selection({enabled:!0,rubberband:e,multiple:o,movable:t,pointerEvents:"none",showNodeSelectionBox:!0,filter:i=>!(i.isNode()&&(i.getData?.()??{})._selectable===!1)}))}}}function Ho(n){const{tolerance:e=10,color:o="#3a84ff"}=n??{};let t=null;return{name:"snapline",priority:90,async attachRuntime(r){const{Snapline:i}=await import("@antv/x6-plugin-snapline");r.graph.use(new i({enabled:!0,tolerance:e,className:"flow-canvas-snapline"})),t=document.createElement("style"),t.textContent=`.flow-canvas-snapline line { stroke: ${o} !important; }`,document.head.appendChild(t)},detachRuntime(){t?.remove(),t=null}}}const Go={class:"flow-canvas-search-popover__input-box"},Uo=["value","placeholder"],jo={key:0,class:"flow-canvas-search-popover__no-result"},Wo={class:"flow-canvas-search-popover__counter"},Xo=["onMouseenter","onClick"],Ko={class:"flow-canvas-search-popover__item-label"},Yo=s.defineComponent({__name:"search-popover",props:{open:{type:Boolean},position:{},query:{},results:{},matchIndex:{default:-1},placeholder:{default:"搜索节点名称"},isAnchorTarget:{type:Function,default:void 0}},emits:["update:query","select","nextMatch","prevMatch","close"],setup(n,{emit:e}){const o=n,t=e,r=s.ref(null),i=s.ref(null),a=s.ref(-1);s.watch(()=>o.open,u=>{u&&(a.value=-1,s.nextTick(()=>{r.value?.focus(),r.value?.select()}))}),s.watch(()=>o.query,()=>{a.value=-1}),s.watch(()=>o.results.length,u=>{if(!u){a.value=-1;return}a.value>=u&&(a.value=-1)});function c(u){t("update:query",u.target.value)}function l(u){a.value=u}function m(){a.value=-1}function f(u){if(u.key==="Escape"){u.preventDefault(),t("close");return}if(u.key==="ArrowDown"){if(u.preventDefault(),!o.results.length)return;a.value=a.value<o.results.length-1?a.value+1:0;return}if(u.key==="ArrowUp"){if(u.preventDefault(),!o.results.length)return;a.value=a.value>0?a.value-1:o.results.length-1;return}if(u.key==="Enter"){if(u.preventDefault(),a.value>=0){const b=o.results[a.value];b&&t("select",b.id);return}u.shiftKey?t("prevMatch"):t("nextMatch")}}function h(u){if(!o.open)return;const b=u.target;b&&i.value?.contains(b)||o.isAnchorTarget?.(u.target)||t("close")}return s.onMounted(()=>{document.addEventListener("mousedown",h)}),s.onBeforeUnmount(()=>{document.removeEventListener("mousedown",h)}),(u,b)=>n.open?(s.openBlock(),s.createElementBlock("div",{key:0,ref_key:"panelRef",ref:i,class:"flow-canvas-search-popover",style:s.normalizeStyle({left:`${n.position.x}px`,top:`${n.position.y}px`,width:`${n.position.width}px`})},[s.createElementVNode("div",Go,[s.createElementVNode("input",{ref_key:"inputRef",ref:r,value:n.query,placeholder:n.placeholder,onInput:c,onKeydown:f},null,40,Uo),n.query?(s.openBlock(),s.createElementBlock(s.Fragment,{key:0},[n.results.length?(s.openBlock(),s.createElementBlock(s.Fragment,{key:1},[s.createElementVNode("button",{type:"button",class:"flow-canvas-search-popover__nav-btn","aria-label":"上一个",onClick:b[0]||(b[0]=D=>t("prevMatch"))},[...b[2]||(b[2]=[s.createElementVNode("svg",{viewBox:"0 0 16 16",width:"12",height:"12"},[s.createElementVNode("path",{d:"M10.3 12.3 6 8l4.3-4.3",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"})],-1)])]),s.createElementVNode("span",Wo,s.toDisplayString(n.matchIndex>=0?n.matchIndex+1:0)+" / "+s.toDisplayString(n.results.length),1),s.createElementVNode("button",{type:"button",class:"flow-canvas-search-popover__nav-btn","aria-label":"下一个",onClick:b[1]||(b[1]=D=>t("nextMatch"))},[...b[3]||(b[3]=[s.createElementVNode("svg",{viewBox:"0 0 16 16",width:"12",height:"12"},[s.createElementVNode("path",{d:"M5.7 3.7 10 8l-4.3 4.3",fill:"none",stroke:"currentColor","stroke-width":"1.5","stroke-linecap":"round","stroke-linejoin":"round"})],-1)])])],64)):(s.openBlock(),s.createElementBlock("span",jo,"无结果"))],64)):s.createCommentVNode("",!0),b[4]||(b[4]=s.createElementVNode("i",{class:"flow-canvas-icon canvas-search flow-canvas-search-popover__search-icon"},null,-1))]),n.query&&n.results.length?(s.openBlock(),s.createElementBlock("div",{key:0,class:"flow-canvas-search-popover__list-box",onMouseleave:m},[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(n.results,(D,L)=>(s.openBlock(),s.createElementBlock("button",{key:D.id,type:"button",class:s.normalizeClass(["flow-canvas-search-popover__item",{"is-active":L===a.value,"is-matched":L===n.matchIndex}]),onMouseenter:E=>l(L),onClick:E=>t("select",D.id)},[s.createElementVNode("span",Ko,s.toDisplayString(D.label),1)],42,Xo))),128))],32)):s.createCommentVNode("",!0)],4)):s.createCommentVNode("",!0)}}),Zo=se(Yo,[["__scopeId","data-v-aca2b1c1"]]),ze=282,Qo=4,Jo=300,ve="flow-canvas-node-ring-target--search-match",me="flow-canvas-node-ring-target--search-current",en="flow-canvas-node-ring-target";function tn(n){return n!==null}function on(n){const e=new Set;return n.map(o=>o?.trim()).filter(o=>!!o).filter(o=>{const t=o.toLowerCase();return e.has(t)?!1:(e.add(t),!0)})}function nn(n,e){const o=Math.max(8,window.innerWidth-e-8);return Math.min(Math.max(8,n),o)}function rn(n,e){const o=e?.getNodeMeta?.(n);if(o===null)return null;const t=o?.label?.trim()||n.label?.trim()||n.id,r=o?.subtitle?.trim()||void 0,i=on(o?.keywords??[n.label,r]);return i.length?{id:n.id,label:t,subtitle:r,keywords:i}:null}function sn(n){let e=null,o=null,t=null,r=null,i=null,a=null;const c=s.ref(!1),l=s.ref(""),m=s.ref({x:0,y:0,width:ze}),f=s.ref(-1),h=s.computed(()=>e?Object.values(e.flowModel.value.nodes).map(p=>rn(p,n)).filter(tn):[]),u=s.computed(()=>{const p=l.value.trim().toLowerCase(),v=Math.max(1,n?.maxResults??Jo);return p?h.value.filter(y=>y.keywords.some(k=>k.toLowerCase().includes(p))).slice(0,v):h.value.slice(0,v)});function b(){return t?.querySelector('.flow-canvas-toolbar__btn[data-toolbar-type="search"]')}function D(){return b()?.closest(".flow-canvas-toolbar")}function L(){const p=D(),v=t?.getBoundingClientRect(),y=p?.getBoundingClientRect()??v;if(!y)return;const k=Math.max(ze,Math.round(y.width));m.value={x:nn(y.left,k),y:y.bottom+Qo,width:k}}function E(p){if(!o)return null;const v=o.graph.getCellById(p);if(!v?.isNode())return null;const y=o.graph.findViewByCell(v)?.container;return y?y.querySelector(".flow-canvas-highlight-target")??y.querySelector(".flow-canvas-node-surface > :first-child"):null}function M(){if(!o)return;const p=o.graph.getNodes();for(const v of p){const y=E(v.id);y&&y.classList.remove(ve,me)}}function N(){if(!o)return;const p=l.value.trim().toLowerCase();if(!c.value||!p){M();return}const v=new Set(u.value.map(R=>R.id)),y=f.value>=0?u.value[f.value]?.id:null,k=o.graph.getNodes();for(const R of k){const V=E(R.id);V&&(V.classList.add(en),R.id===y?(V.classList.remove(ve),V.classList.add(me)):v.has(R.id)?(V.classList.remove(me),V.classList.add(ve)):V.classList.remove(ve,me))}}function F(p){if(!o)return;const v=u.value.findIndex(y=>y.id===p);v>=0&&(f.value=v),o.api.scrollToNode(p),N()}function G(){const p=u.value;if(p.length===0)return;const v=f.value<p.length-1?f.value+1:0;f.value=v,F(p[v].id)}function S(){const p=u.value;if(p.length===0)return;const v=f.value>0?f.value-1:p.length-1;f.value=v,F(p[v].id)}function U(){o&&(c.value=!0,L(),requestAnimationFrame(()=>L()))}function T(){c.value=!1,l.value="",f.value=-1,M()}function O(){if(c.value){T();return}U()}function g(p){const v=b();return!!(v&&p instanceof Node&&v.contains(p))}function w(){c.value&&L()}const d=s.defineComponent({name:"FlowCanvasSearchHost",setup(){return()=>s.h(Zo,{open:c.value,position:m.value,query:l.value,results:u.value,matchIndex:f.value,placeholder:n?.placeholder??"搜索节点名称",isAnchorTarget:g,"onUpdate:query":p=>{l.value=p,f.value=-1},onSelect:F,onNextMatch:G,onPrevMatch:S,onClose:T})}});return{name:"search",priority:90,install(p){e=p},attachRuntime(p){o=p,t=p.graph.container.closest(".flow-canvas-layout__content")??p.graph.container.parentElement,r=document.createElement("div"),r.className="flow-canvas-search-host",document.body.append(r),i=s.createApp(d),i.mount(r),a=s.watch(()=>[l.value,u.value.length],()=>{f.value=-1,N()}),window.addEventListener("resize",w),window.addEventListener("scroll",w,!0)},detachRuntime(){T(),a?.(),a=null,window.removeEventListener("resize",w),window.removeEventListener("scroll",w,!0),i?.unmount(),i=null,r?.remove(),r=null,t=null,o=null},dispose(){T(),a?.(),a=null,e=null},provideToolbarItems(){return[{id:"plugin:search",type:"search",icon:"flow-canvas-icon canvas-search",description:"搜索",group:"tools",order:22,active:()=>c.value,onClick:O}]}}}const Ve=52,qe=16,et=4,an=40;function ln(n){const{mountRect:e,toolbarRect:o,fallbackLeft:t,fallbackTop:r,fallbackWidth:i,height:a}=n,c=n.offset??et;return!o||o.width<=0?{left:t,top:r,width:i,height:a}:{left:Math.round(o.left-e.left),top:Math.round(o.bottom-e.top+c),width:Math.round(o.width),height:a}}function cn(n){const e=document.createElement("div");e.className="flow-canvas-minimap",n.floating!==!1&&e.classList.add("flow-canvas-minimap--floating");const o=document.createElement("div");o.className="flow-canvas-minimap__host",e.append(o),Object.assign(e.style,{width:`${n.width}px`,height:`${n.height}px`}),n.floating!==!1&&Object.assign(e.style,{top:`${Ve}px`,left:`${qe}px`});let t=null,r=n.defaultOpen??!1,i=null,a=null,c=null,l=null,m={width:n.width,height:n.height};function f(S,U){if(!t)return;const T=t;T.options.width=S,T.options.height=U,T.updatePaper(n.sourceGraph.container.clientWidth,n.sourceGraph.container.clientHeight)}function h(){if(n.floating===!1)return;const S=ln({mountRect:n.mountTarget.getBoundingClientRect(),toolbarRect:n.getToolbarElement?.()?.getBoundingClientRect()??null,fallbackLeft:qe,fallbackTop:Ve,fallbackWidth:n.width,height:n.height,offset:n.panelOffset??et});m={width:S.width,height:S.height},Object.assign(e.style,{left:`${S.left}px`,top:`${S.top}px`,width:`${S.width}px`,height:`${S.height}px`}),f(S.width,S.height)}function u(){if(n.floating===!1||typeof ResizeObserver>"u")return;const S=n.getToolbarElement?.()??null;a||(a=new ResizeObserver(()=>{r&&(u(),h())})),l!==S&&(a.disconnect(),a.observe(n.mountTarget),S&&a.observe(S),l=S)}function b(){n.floating!==!1&&(h(),u(),c||(c=()=>{r&&(u(),h())},window.addEventListener("resize",c)))}function D(){c&&(window.removeEventListener("resize",c),c=null),a?.disconnect(),a=null,l=null}function L(){!n.onClickOutside||i||(i=S=>{const U=S.target;U&&e.contains(U)||S.target?.closest('[data-toolbar-type="minimap"]')||S.target?.closest(".flow-canvas-layout__content")||n.onClickOutside()},document.addEventListener("mousedown",i))}function E(){i&&(document.removeEventListener("mousedown",i),i=null)}function M(){t||(t=new dt.MiniMap({container:o,width:m.width,height:m.height,padding:n.contentPadding??an,scalable:!1}),n.sourceGraph.use(t))}function N(S){r=S,e.style.display=r?"":"none",r?(b(),M(),L(),requestAnimationFrame(()=>{r&&(u(),h())})):(E(),D())}function F(){N(r),n.mountTarget.appendChild(e)}function G(){E(),D(),t?.dispose(),t=null,e.remove()}return F(),{element:e,isOpen:()=>r,setOpen:N,toggle(){const S=!r;return N(S),S},destroy:G}}function dn(n){let e=null,o=null;const t=s.ref(!1);function r(){return o?.querySelector('.flow-canvas-toolbar__btn[data-toolbar-type="minimap"]')}function i(){return r()?.closest(".flow-canvas-toolbar")}function a(l){e?.setOpen(l),t.value=l}function c(){e&&(t.value=e.toggle())}return{name:"minimap",priority:90,attachRuntime(l){const m=l,f=n?.width??334,h=n?.height??180;o=m.graph.container.closest(".flow-canvas-layout__content")??m.graph.container.parentElement;const u=n?.container??o;u&&(e=cn({sourceGraph:l.graph,mountTarget:u,width:f,height:h,floating:!n?.container,defaultOpen:!1,getToolbarElement:n?.container?void 0:i,onClickOutside:()=>a(!1)}),a(!1))},detachRuntime(){e?.destroy(),e=null,o=null,t.value=!1},provideToolbarItems(){return[{id:"plugin:minimap",type:"minimap",icon:"flow-canvas-icon canvas-map",description:"小地图",group:"tools",order:23,active:()=>t.value,onClick:c}]}}}function un(){let n=null,e=0;return{name:"clipboard",priority:90,onKeyboardShortcut(o,t){const r=o.metaKey||o.ctrlKey;if(r&&o.key==="c"){const i=t.graph.getSelectedCells?.()??[];if(!i.length)return!1;const a=t.flowModel.value,c=new Set(i.filter(f=>f.isNode()).map(f=>f.id)),l=[...c].map(f=>a.nodes[f]).filter(Boolean);if(!l.length)return!1;const m=Object.values(a.edges).filter(f=>c.has(f.source.nodeId)&&c.has(f.target.nodeId));return n={nodes:l,edges:m},e=0,!0}if(r&&o.key==="v"){if(!n?.nodes.length)return!1;e++;const i=e*30,a=new Map,c=[];for(const l of n.nodes){const m=`${l.id}_cp${W().slice(0,6)}`;a.set(l.id,m),c.push({type:"node.add",node:{...l,id:m,position:{x:l.position.x+i,y:l.position.y+i},payload:l.payload?{...l.payload}:{},extensions:l.extensions?{...l.extensions}:void 0}})}for(const l of n.edges){const m=a.get(l.source.nodeId),f=a.get(l.target.nodeId);!m||!f||c.push({type:"edge.add",edge:{...l,id:`${l.id}_cp${W().slice(0,6)}`,source:{...l.source,nodeId:m},target:{...l.target,nodeId:f},labels:l.labels?.map(h=>({...h,id:`${h.id}_cp${W().slice(0,6)}`})),payload:l.payload?{...l.payload}:{}}})}return c.length&&t.executeCommand({id:W(),source:"user:keyboard",label:"粘贴",timestamp:Date.now(),commands:c}),!0}return!1}}}exports.CanvasConstraintError=te;exports.CanvasLayout=xo;exports.CanvasNodePalette=Ye;exports.CanvasRuntime=po;exports.CanvasSchemaError=He;exports.CanvasToolbar=To;exports.DefaultNode=Qe;exports.NodeActionsToolbar=Xe;exports.NodeQuickAddPopover=Ke;exports.applyCanvasCommand=Ie;exports.clipboardPlugin=un;exports.connectionValidatorPlugin=Vo;exports.createBuiltinEdgeTypes=Je;exports.createCanvasHistory=Ge;exports.createDefaultSchema=zo;exports.createDefaultToolbarItems=Ze;exports.createEmptyFlowModel=ut;exports.generateId=W;exports.minimapPlugin=dn;exports.searchPlugin=sn;exports.selectionPlugin=qo;exports.snaplinePlugin=Ho;exports.useCanvasEditor=Mt;
|
package/dist/index.d.ts
CHANGED
|
@@ -224,6 +224,8 @@ interface CanvasHistory {
|
|
|
224
224
|
clear(): void;
|
|
225
225
|
createSnapshot(): FlowModel;
|
|
226
226
|
replaceFlowModel(model: FlowModel): void;
|
|
227
|
+
/** 更新 FlowModel,同时保留历史栈(当前状态入 undo 栈)。 */
|
|
228
|
+
updateFlowModel(model: FlowModel, label?: string): void;
|
|
227
229
|
}
|
|
228
230
|
interface CanvasHistoryOptions {
|
|
229
231
|
maxHistorySize?: number;
|
|
@@ -267,9 +269,20 @@ interface NodeDecoration {
|
|
|
267
269
|
};
|
|
268
270
|
borderColor?: string;
|
|
269
271
|
}
|
|
272
|
+
interface EdgeGradientStop {
|
|
273
|
+
offset: number;
|
|
274
|
+
color: string;
|
|
275
|
+
opacity?: number;
|
|
276
|
+
}
|
|
277
|
+
interface EdgeStrokeGradient {
|
|
278
|
+
type: 'linearGradient';
|
|
279
|
+
stops: EdgeGradientStop[];
|
|
280
|
+
attrs?: Record<string, unknown>;
|
|
281
|
+
}
|
|
270
282
|
interface EdgeDecoration {
|
|
271
283
|
className?: string;
|
|
272
|
-
strokeColor?: string;
|
|
284
|
+
strokeColor?: string | EdgeStrokeGradient;
|
|
285
|
+
targetMarkerColor?: string;
|
|
273
286
|
}
|
|
274
287
|
interface ContextMenuItem {
|
|
275
288
|
id: string;
|
|
@@ -628,6 +641,8 @@ interface CanvasEditorContext {
|
|
|
628
641
|
idGenerator: IdGenerator;
|
|
629
642
|
executeCommand(envelope: CommandEnvelope): CommandExecutionResult;
|
|
630
643
|
replaceFlowModel(model: FlowModel): void;
|
|
644
|
+
/** 更新 FlowModel,同时保留历史栈(当前状态入 undo 栈),支持撤销。 */
|
|
645
|
+
updateFlowModel(model: FlowModel, label?: string): void;
|
|
631
646
|
setMode(mode: CanvasMode): void;
|
|
632
647
|
/** 框选模式:开启后左键拖拽画布空白区域为框选,关闭时为画布平移 */
|
|
633
648
|
selectionMode: Ref<boolean>;
|
|
@@ -877,7 +892,6 @@ interface SearchNodeMeta {
|
|
|
877
892
|
}
|
|
878
893
|
interface SearchPluginOptions {
|
|
879
894
|
placeholder?: string;
|
|
880
|
-
emptyText?: string;
|
|
881
895
|
maxResults?: number;
|
|
882
896
|
getNodeMeta?: (node: FlowNodeModel) => SearchNodeMeta | null | undefined;
|
|
883
897
|
}
|