@blueking/flow-canvas 0.0.3 → 0.0.4
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/README.md +93 -41
- package/dist/index.cjs.js +1 -1
- package/dist/index.d.ts +53 -10
- package/dist/index.esm.js +2213 -1669
- package/dist/style.css +1 -1
- package/package.json +2 -5
package/dist/index.cjs.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
"use strict";var Ye=Object.create;var Be=Object.defineProperty;var Ke=Object.getOwnPropertyDescriptor;var Ze=Object.getOwnPropertyNames;var Je=Object.getPrototypeOf,et=Object.prototype.hasOwnProperty;var tt=(s,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ze(e))!et.call(s,n)&&n!==t&&Be(s,n,{get:()=>e[n],enumerable:!(o=Ke(e,n))||o.enumerable});return s};var fe=(s,e,t)=>(t=s!=null?Ye(Je(s)):{},tt(e||!s||!s.__esModule?Be(t,"default",{value:s,enumerable:!0}):t,s));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const i=require("vue"),ot=require("@antv/x6"),nt=require("@antv/x6-vue-shape");function st(){return{version:"1.0",nodes:{},edges:{}}}class Y extends Error{constructor(e){super(e),this.name="CanvasConstraintError"}}class Oe extends Error{constructor(e){super(e),this.name="CanvasSchemaError"}}function we(s,e,t){if(e.length===0){if(t===void 0)return;if(typeof t!="object"||t===null||Array.isArray(t))throw new Error("Root value of payload/extensions/meta must be an object or undefined");return t}const o=s?{...s}:{};let n=o;for(let r=0;r<e.length-1;r++){const d=e[r],l=n[d];l&&typeof l=="object"&&!Array.isArray(l)?n[d]={...l}:n[d]={},n=n[d]}const a=e[e.length-1];return t===void 0?delete n[a]:n[a]=t,o}function be(s,e){switch(e.type){case"node.add":return it(s,e.node);case"node.move":return rt(s,e.nodeId,e.position);case"node.remove":return at(s,e.nodeId);case"node.update":return lt(s,e.nodeId,e.patch);case"node.set-payload":return dt(s,e.nodeId,e.path,e.value);case"node.set-extensions":return ct(s,e.nodeId,e.path,e.value);case"edge.add":return ut(s,e.edge);case"edge.remove":return ft(s,e.edgeId);case"edge.reconnect":return pt(s,e.edgeId,e.source,e.target);case"edge.update":return gt(s,e.edgeId,e.patch);case"edge.set-payload":return ht(s,e.edgeId,e.path,e.value);case"edge.label.update":return vt(s,e.edgeId,e.labelId,e.patch);case"model.set-meta":return mt(s,e.path,e.value);default:throw new Y(`Unknown command type: ${e.type}`)}}function pe(s,e){const t=s.nodes[e];if(!t)throw new Y(`Node "${e}" does not exist`);return t}function ge(s,e){const t=s.edges[e];if(!t)throw new Y(`Edge "${e}" does not exist`);return t}function de(s,e,t){const o=s.nodes[e.nodeId];if(!o)throw new Y(`${t} node "${e.nodeId}" does not exist`);if(e.portId&&o.ports&&!o.ports.some(a=>a.id===e.portId))throw new Y(`${t} port "${e.portId}" not found on node "${e.nodeId}"`)}function ke(s,e,t){return{...s,nodes:{...s.nodes,[e]:t}}}function Ee(s,e,t){return{...s,edges:{...s.edges,[e]:t}}}function it(s,e){if(s.nodes[e.id])throw new Y(`Node id "${e.id}" already exists`);return{...s,nodes:{...s.nodes,[e.id]:e}}}function rt(s,e,t){const o=pe(s,e);return ke(s,e,{...o,position:t})}function at(s,e){pe(s,e);const{[e]:t,...o}=s.nodes,n={};for(const[a,r]of Object.entries(s.edges))r.source.nodeId!==e&&r.target.nodeId!==e&&(n[a]=r);return{...s,nodes:o,edges:n}}function lt(s,e,t){const o=pe(s,e);return ke(s,e,{...o,...t,id:o.id})}function dt(s,e,t,o){const n=pe(s,e),a=we(n.payload,t,o);return ke(s,e,{...n,payload:a})}function ct(s,e,t,o){const n=pe(s,e),a=we(n.extensions,t,o);return ke(s,e,{...n,extensions:a})}function ut(s,e){if(s.edges[e.id])throw new Y(`Edge id "${e.id}" already exists`);if(de(s,e.source,"Source"),de(s,e.target,"Target"),e.labels){const t=new Set;for(const o of e.labels){if(t.has(o.id))throw new Y(`Duplicate label id "${o.id}" in edge "${e.id}"`);t.add(o.id)}}return{...s,edges:{...s.edges,[e.id]:e}}}function ft(s,e){ge(s,e);const{[e]:t,...o}=s.edges;return{...s,edges:o}}function pt(s,e,t,o){const n=ge(s,e),a=t??n.source,r=o??n.target;return de(s,a,"Source"),de(s,r,"Target"),Ee(s,e,{...n,source:a,target:r})}function gt(s,e,t){const o=ge(s,e),n={...o,...t,id:o.id};return t.source&&de(s,n.source,"Source"),t.target&&de(s,n.target,"Target"),Ee(s,e,n)}function ht(s,e,t,o){const n=ge(s,e),a=we(n.payload,t,o);return Ee(s,e,{...n,payload:a})}function vt(s,e,t,o){const n=ge(s,e);if(!n.labels)throw new Y(`Edge "${e}" has no labels`);const a=n.labels.findIndex(d=>d.id===t);if(a===-1)throw new Y(`Label "${t}" not found in edge "${e}"`);const r=[...n.labels];return r[a]={...r[a],...o,id:t},Ee(s,e,{...n,labels:r})}function mt(s,e,t){const o=we(s.meta,e,t);return{...s,meta:o}}function ze(s,e){const t=e?.maxHistorySize??100,o=i.ref(s),n=[],a=[],r=i.ref(!1),d=i.ref(!1);function l(){r.value=n.length>0,d.value=a.length>0}function h(k){const M=o.value;let b=M;for(const S of k.commands)b=be(b,S);return n.push({snapshot:M,envelope:k}),n.length>t&&n.shift(),a.length=0,o.value=b,l(),b}function c(){const k=n.pop();return k?(a.push({snapshot:o.value,envelope:k.envelope}),o.value=k.snapshot,l(),k.snapshot):null}function m(){const k=a.pop();if(!k)return null;n.push({snapshot:o.value,envelope:k.envelope});let M=o.value;for(const b of k.envelope.commands)M=be(M,b);return o.value=M,l(),M}function p(){n.length=0,a.length=0,l()}function g(){return o.value}function N(k){o.value=k,p()}return{currentFlowModel:o,execute:h,undo:c,redo:m,canUndo:r,canRedo:d,get undoStack(){return n.map(k=>k.envelope)},get redoStack(){return a.map(k=>k.envelope)},clear:p,createSnapshot:g,replaceFlowModel:N}}function yt(s){return s!==null&&typeof s=="object"&&s.rejected===!0}class bt{plugins=[];editorContext=null;runtimeCtx=null;runtimeVersion=0;install(e,t){this.plugins=[...e].sort((o,n)=>(o.priority??100)-(n.priority??100)),this.editorContext=t;for(const o of this.plugins)o.install?.(t)}attachRuntime(e){const t=++this.runtimeVersion;this.runtimeCtx=e;const o=this.createSafeRuntimeContext(e,t);for(const n of this.plugins)n.attachRuntime?.(o)}detachRuntime(){for(const e of[...this.plugins].reverse())e.detachRuntime?.();this.runtimeCtx=null}createSafeRuntimeContext(e,t){const o=this,n=new Proxy(e.graph,{get(a,r,d){const l=Reflect.get(a,r,d);return r==="use"&&typeof l=="function"?function(...c){if(o.runtimeVersion===t)return l.apply(a,c)}:l}});return{...e,graph:n}}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 t=e;for(const o of this.plugins){if(!o.transformCommand)continue;const n=this.createPreview(t),a=o.transformCommand(t,n,this.editorContext);if(a===null)return{rejected:!0,error:{code:"plugin_rejected",reason:"",source:o.name}};if(yt(a))return{rejected:!0,error:{code:a.code??"plugin_rejected",reason:a.reason,source:o.name}};t=a}return{envelope:t}}afterCommand(e,t,o){if(this.editorContext)for(const n of this.plugins)n.afterCommand?.(e,t,o,this.editorContext)}dispatchUiEvent(e){if(this.runtimeCtx)for(const t of this.plugins)t.onUiEvent?.(e,this.runtimeCtx)}dispatchSelectionChange(e){if(this.runtimeCtx)for(const t of this.plugins)t.onSelectionChange?.(e,this.runtimeCtx)}dispatchKeyboardShortcut(e){if(!this.runtimeCtx)return!1;for(const t of this.plugins)if(t.onKeyboardShortcut?.(e,this.runtimeCtx))return!0;return!1}collectContextMenuItems(e){if(!this.runtimeCtx)return[];const t=[];for(const o of this.plugins){const n=o.onBlankContextMenu?.(e,this.runtimeCtx);n&&t.push(...n)}return t}collectToolbarItems(){if(!this.editorContext)return[];const e=new Map;for(const t of this.plugins){const o=t.provideToolbarItems?.(this.editorContext);if(o)for(const n of o)e.set(n.id,n)}return[...e.values()].sort((t,o)=>(t.order??0)-(o.order??0))}collectNodeDecorations(e){if(!this.editorContext)return;let t;for(const o of this.plugins){const n=o.decorateNode?.(e,this.editorContext);n&&(t=t?{...t,...n}:n)}return t}collectEdgeDecorations(e){if(!this.editorContext)return;let t;for(const o of this.plugins){const n=o.decorateEdge?.(e,this.editorContext);n&&(t=t?{...t,...n}:n)}return t}collectExtendedApi(){if(!this.runtimeCtx)return{};const e={};for(const t of this.plugins){const o=t.extendApi?.(this.runtimeCtx.api,this.runtimeCtx);o&&Object.assign(e,o)}return e}createPreview(e){const t=this.editorContext;return{previewFlowModel(o){const n=o??e.commands;let a=t.flowModel.value;for(const r of n)a=be(a,r);return a}}}}let wt=0;function G(){const s=Date.now().toString(36),e=Math.random().toString(36).substring(2,8);return`${s}-${e}-${++wt}`}const Me=()=>G();function kt(s){const{schema:e,plugins:t=[],historyOptions:o}=s,n=s.idGenerator??Me,a={version:"1.0",...s.initialFlowModel},r=ze(a,o),d=i.ref(s.mode??"edit"),l=i.ref(!1),h=i.ref(null),c=i.ref([]),m={},p=new bt;function g(b,S,L,H="user:toolbar"){const V={id:`history-${Date.now()}`,source:H,label:b,timestamp:Date.now(),commands:[]};p.afterCommand(V,S,L),c.value=p.collectToolbarItems(),s.onCommandResult?.({status:"applied",envelope:V,flowModel:L}),s.onFlowModelChange?.({flowModel:L,prevFlowModel:S,envelope:V,source:H})}const N={execute:r.execute,undo(){const b=r.currentFlowModel.value,S=r.undo();return S&&g("撤销",b,S),S},redo(){const b=r.currentFlowModel.value,S=r.redo();return S&&g("重做",b,S),S},get canUndo(){return r.canUndo},get canRedo(){return r.canRedo},get undoStack(){return r.undoStack},get redoStack(){return r.redoStack},clear:r.clear,createSnapshot:r.createSnapshot,replaceFlowModel(b){const S=r.currentFlowModel.value;r.replaceFlowModel(b),g("替换 FlowModel",S,b,"system:replace")}},k={flowModel:i.computed(()=>r.currentFlowModel.value),history:N,schema:e,mode:d,idGenerator:n,executeCommand:M,replaceFlowModel(b){N.replaceFlowModel(b)},setMode(b){d.value=b},selectionMode:l,setSelectionMode(b){l.value=b},api:h,toolbarItems:c,extendedApi:m,_pluginManager:p};p.install(t,{flowModel:k.flowModel,history:N,schema:e,mode:d,idGenerator:n,executeCommand:M}),c.value=p.collectToolbarItems(),i.onScopeDispose(()=>{p.dispose()});function M(b){const S=p.transformCommand(b);if("rejected"in S){const V={status:"rejected",envelope:b,error:S.error};return s.onCommandResult?.(V),V}const L=S.envelope,H=r.currentFlowModel.value;try{const V=r.execute(L),K={status:"applied",envelope:L,flowModel:V};return p.afterCommand(L,H,V),c.value=p.collectToolbarItems(),s.onCommandResult?.(K),s.onFlowModelChange?.({flowModel:V,prevFlowModel:H,envelope:L,source:L.source}),K}catch(V){if(V instanceof Y){const K={status:"invalid",envelope:L,error:{code:"constraint_violated",reason:V.message,source:"engine"}};return s.onCommandResult?.(K),K}throw V}}return k}const Et=["top","right","bottom","left"];function Ge(){return Et.map(s=>({id:s,group:s}))}function Se(s,e){return e?.(s)??s.ports??Ge()}class Ct{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;constructor(e,t,o,n,a,r){this.graph=e,this.schema=t,this.shapeRegistry=o,this.resolveNodeDecoration=n,this.resolveEdgeDecoration=a,this.resolveCanvasContext=r}syncFlowModel(e){if(!this.syncing){this.syncing=!0,this.lastModel=e;try{const t=this.resolveNodes(e),o=this.resolveEdges(e);this.syncNodes(t),this.syncEdges(o,e)}finally{this.syncing=!1}}}get isSyncing(){return this.syncing}saveNodeDefaultAttrs(e,t){const n=t.x6CellConfig?.attrs?.body;if(!n)return;const a={};let r=!1;n.stroke!==void 0&&(a.stroke=n.stroke,r=!0),n.strokeWidth!==void 0&&(a.strokeWidth=n.strokeWidth,r=!0),r&&this.nodeDefaultAttrs.set(e,a)}saveEdgeDefaultAttrs(e,t){const n=t?.x6EdgeConfig?.attrs?.line;if(!n)return;const a={};let r=!1;n.stroke!==void 0&&(a.stroke=n.stroke,r=!0),n.strokeWidth!==void 0&&(a.strokeWidth=n.strokeWidth,r=!0),n.strokeDasharray!==void 0&&(a.strokeDasharray=n.strokeDasharray,r=!0),r&&this.edgeDefaultAttrs.set(e,a)}restoreNodeAttr(e,t,o){const n=this.nodeDefaultAttrs.get(e.id)?.[o];n!==void 0?e.setAttrByPath(t,n):e.removeAttrByPath(t)}restoreEdgeAttr(e,t,o){const n=this.edgeDefaultAttrs.get(e.id)?.[o];n!==void 0?e.setAttrByPath(t,n):e.removeAttrByPath(t)}syncEdgeMarker(e,t,o){const a=t?.x6EdgeConfig?.attrs?.line?.[o],r=`line/${o}`;e.removeAttrByPath(r),a!==void 0&&e.setAttrByPath(r,a)}dispose(){this.knownNodeIds.clear(),this.knownEdgeIds.clear()}resolveNodes(e){const t=new Map;for(const[o,n]of Object.entries(e.nodes)){const a=this.schema.nodeTypes[n.type];if(!a)throw new Oe(`Unknown node type "${n.type}" for node "${o}". Registered types: [${Object.keys(this.schema.nodeTypes).join(", ")}]. Register the type in CanvasSchema.nodeTypes before using it in a FlowModel.`);const r=this.shapeRegistry.registerNodeType(n.type,a.component),d=a.getSize(n),l=Se(n,a.getPorts);t.set(o,{model:n,definition:a,shapeName:r,size:d,ports:l})}return t}resolveEdges(e){const t=new Map;for(const[o,n]of Object.entries(e.edges)){const a=n.type??this.schema.defaultEdgeType??"default",r=this.schema.edgeTypes?.[a];t.set(o,{model:n,definition:r})}return t}syncNodes(e){const t=new Set(e.keys());for(const o of this.knownNodeIds)if(!t.has(o)){const n=this.graph.getCellById(o);n&&this.graph.removeCell(n),this.knownNodeIds.delete(o),this.defaultHighlightedNodeIds.delete(o),this.prevNodeDecorationClasses.delete(o),this.prevNodeDecorationColors.delete(o),this.nodeDefaultAttrs.delete(o)}for(const[o,n]of e){const a=this.graph.getCellById(o);a?this.updateExistingNode(a,n):this.addNewNode(o,n)}}updateExistingNode(e,t){const{model:o,size:n,ports:a,definition:r}=t;if(e.getData()?.type!==o.type){this.graph.removeCell(e),this.addNewNode(e.id,t);return}const l=e.getPosition();(l.x!==o.position.x||l.y!==o.position.y)&&e.setPosition(o.position.x,o.position.y);const h=e.getSize();(h.width!==n.width||h.height!==n.height)&&e.setSize(n.width,n.height,{silent:!0}),this.syncNodePorts(e,a),e.setData({...o}),this.applyNodeBehavior(e,o,r),this.applyNodeHighlightAndDecoration(e,o)}syncNodePorts(e,t){const o=e.getPorts(),n=new Set(t.map(r=>r.id)),a=new Set(o.map(r=>r.id));for(const r of o)r.id&&!n.has(r.id)&&e.removePort(r.id);for(const r of t)a.has(r.id)||e.addPort({id:r.id,group:r.group,...r.x6PortConfig})}addNewNode(e,t){const{model:o,shapeName:n,size:a,ports:r,definition:d}=t,l={id:o.id,shape:n,x:o.position.x,y:o.position.y,width:a.width,height:a.height,data:{...o},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:r.map(c=>({id:c.id,group:c.group,...c.x6PortConfig}))},...d.x6CellConfig};this.graph.addNode(l),this.knownNodeIds.add(e),this.saveNodeDefaultAttrs(e,d);const h=this.graph.getCellById(e);h&&(this.applyNodeBehavior(h,o,d),this.applyNodeHighlightAndDecoration(h,o))}applyNodeBehavior(e,t,o){if(!o.getBehavior)return;const n=this.resolveCanvasContext?.();if(!n)return;const a=o.getBehavior(t,n);if(a.draggable!==void 0&&e.setProp("draggable",a.draggable,{silent:!0}),a.connectable!==void 0){const d=a.connectable;for(const l of e.getPorts())e.setPortProp(l.id,"attrs/circle/magnet",d,{silent:!0})}if(a.showPorts!==void 0){const d=a.showPorts;for(const l of e.getPorts())e.setPortProp(l.id,"attrs/circle/visibility",d?"visible":"hidden",{silent:!0})}const r=e.getData()??{};a.deletable!==void 0&&r._deletable!==a.deletable&&e.setData({...r,_deletable:a.deletable},{silent:!0}),a.selectable!==void 0&&r._selectable!==a.selectable&&e.setData({...e.getData(),_selectable:a.selectable},{silent:!0})}syncEdges(e,t){const o=new Set(e.keys());for(const n of this.knownEdgeIds)if(!o.has(n)){const a=this.graph.getCellById(n);a&&this.graph.removeCell(a),this.knownEdgeIds.delete(n),this.defaultHighlightedEdgeIds.delete(n),this.prevEdgeDecorationClasses.delete(n),this.prevEdgeDecorationColors.delete(n),this.prevEdgeStyleIds.delete(n),this.edgeDefaultAttrs.delete(n)}for(const[n,a]of e){const r=this.graph.getCellById(n),{model:d,definition:l}=a;r?(this.updateExistingEdge(r,d,l,t),this.knownEdgeIds.has(n)||(this.knownEdgeIds.add(n),this.saveEdgeDefaultAttrs(n,l))):this.addNewEdge(n,d,l)}}updateExistingEdge(e,t,o,n){const a=e.getSource(),r=e.getTarget();if((a.cell!==t.source.nodeId||a.port!==t.source.portId)&&e.setSource({cell:t.source.nodeId,port:t.source.portId}),(r.cell!==t.target.nodeId||r.port!==t.target.portId)&&e.setTarget({cell:t.target.nodeId,port:t.target.portId}),o?.router){const d=typeof o.router=="string"?{name:o.router}:o.router;e.setRouter(d)}if(o?.connector){const d=typeof o.connector=="string"?{name:o.connector}:o.connector;e.setConnector(d)}this.syncEdgeMarker(e,o,"sourceMarker"),this.syncEdgeMarker(e,o,"targetMarker"),this.syncEdgeLabels(e,t),e.setData({...t},{silent:!0}),this.applyEdgeStyleAndDecoration(e,t,o)}syncEdgeLabels(e,t){if(!t.labels?.length){e.getLabels().length>0&&e.setLabels([]);return}const o=t.labels.map(n=>({attrs:{label:{text:n.text??""}},position:n.position!=null?{distance:n.position}:void 0}));e.setLabels(o)}addNewEdge(e,t,o){const n={id:t.id,source:{cell:t.source.nodeId,port:t.source.portId},target:{cell:t.target.nodeId,port:t.target.portId},data:{...t},zIndex:-1};o?.router&&(n.router=typeof o.router=="string"?{name:o.router}:o.router),o?.connector&&(n.connector=typeof o.connector=="string"?{name:o.connector}:o.connector),o?.x6EdgeConfig&&Object.assign(n,o.x6EdgeConfig),t.labels?.length&&(n.labels=t.labels.map(r=>({attrs:{label:{text:r.text??""}},position:r.position!=null?{distance:r.position}:void 0}))),this.graph.addEdge(n),this.knownEdgeIds.add(e),this.saveEdgeDefaultAttrs(e,o);const a=this.graph.getCellById(e);a&&this.applyEdgeStyleAndDecoration(a,t,o)}refreshEdgeStyles(){if(this.lastModel)for(const[e,t]of Object.entries(this.lastModel.edges)){const o=this.graph.getCellById(e);if(!o?.isEdge())continue;const n=t.type??this.schema.defaultEdgeType??"default",a=this.schema.edgeTypes?.[n];this.applyEdgeStyleAndDecoration(o,t,a)}}refreshNodeHighlights(){if(this.lastModel)for(const[e,t]of Object.entries(this.lastModel.nodes)){const o=this.graph.getCellById(e);o?.isNode()&&this.applyNodeHighlightAndDecoration(o,t)}}applyNodeHighlightAndDecoration(e,t){const o=this.highlightedNodeIds.has(e.id),n=this.resolveNodeDecoration?.(t),a=this.prevNodeDecorationClasses.get(e.id);a&&(this.graph.findViewByCell(e)?.container?.classList.remove(a),this.prevNodeDecorationClasses.delete(e.id)),n?.className&&(this.graph.findViewByCell(e)?.container?.classList.add(n.className),this.prevNodeDecorationClasses.set(e.id,n.className));const r=n?.borderColor,l=r??(o?"#3a84ff":void 0),h=this.prevNodeDecorationColors.has(e.id)||this.defaultHighlightedNodeIds.has(e.id);l?(e.setAttrByPath("body/stroke",l),e.setAttrByPath("body/strokeWidth",2)):h&&(this.restoreNodeAttr(e,"body/stroke","stroke"),this.restoreNodeAttr(e,"body/strokeWidth","strokeWidth")),r?this.prevNodeDecorationColors.add(e.id):this.prevNodeDecorationColors.delete(e.id),o&&!r?this.defaultHighlightedNodeIds.add(e.id):this.defaultHighlightedNodeIds.delete(e.id)}setHoveredEdge(e){this.hoveredEdgeId=e}setHighlightedNodes(e){this.highlightedNodeIds=new Set(e)}setHighlightedEdges(e){this.highlightedEdgeIds=new Set(e)}applyEdgeStyleAndDecoration(e,t,o){const n=this.highlightedEdgeIds.has(e.id),a=this.resolveEdgeDecoration?.(t),r=this.prevEdgeDecorationClasses.get(e.id);r&&(this.graph.findViewByCell(e)?.container?.classList.remove(r),this.prevEdgeDecorationClasses.delete(e.id)),a?.className&&(this.graph.findViewByCell(e)?.container?.classList.add(a.className),this.prevEdgeDecorationClasses.set(e.id,a.className));let d,l,h;if(o?.style){const N=this.graph.isSelected?.(e)??!1,k=this.hoveredEdgeId===e.id,M=o.style(t,{selected:N,highlighted:n,hovered:k});d=M.stroke,l=M.strokeWidth,h=M.strokeDasharray}const c=!o?.style&&n?"#3a84ff":void 0,m=a?.strokeColor,p=m??d??c,g=!!o?.style||this.prevEdgeDecorationColors.has(e.id)||this.defaultHighlightedEdgeIds.has(e.id)||this.prevEdgeStyleIds.has(e.id);p?e.setAttrByPath("line/stroke",p):g&&this.restoreEdgeAttr(e,"line/stroke","stroke"),o?.style?(this.prevEdgeStyleIds.add(e.id),l?e.setAttrByPath("line/strokeWidth",l):this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),h?e.setAttrByPath("line/strokeDasharray",h):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)),m?this.prevEdgeDecorationColors.add(e.id):this.prevEdgeDecorationColors.delete(e.id),c?this.defaultHighlightedEdgeIds.add(e.id):this.defaultHighlightedEdgeIds.delete(e.id)}}class xt{instanceId=G();registeredShapes=new Map;getShapeName(e){let t=this.registeredShapes.get(e);return t||(t=`flow-node-${this.instanceId}-${e}`,this.registeredShapes.set(e,t)),t}registerNodeType(e,t){const o=this.getShapeName(e);return nt.register({shape:o,component:t,width:100,height:40}),o}dispose(){this.registeredShapes.clear()}}class Nt{graph;onUiEvent;onCommand;flowModelRef;idGenerator;disposers=[];constructor(e,t,o,n,a){this.graph=e,this.onUiEvent=t,this.onCommand=o,this.flowModelRef=n,this.idGenerator=a??Me,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:t})=>{this.onUiEvent({type:"node.contextmenu",nodeId:e.id,position:{x:t.clientX,y:t.clientY}})}),this.on("edge:click",({edge:e,e:t})=>{const n=t.target?.closest?.(".x6-edge-label");if(n){const r=e.getData?.()?.labels??[],d=n.parentElement?.querySelectorAll(".x6-edge-label"),l=d?Array.from(d).indexOf(n):0,h=r[Math.max(0,l)];this.onUiEvent({type:"edge.label.click",edgeId:e.id,labelId:h?.id??`label-${l}`});return}this.onUiEvent({type:"edge.click",edgeId:e.id})}),this.on("blank:click",({e})=>{const t=this.graph.clientToLocal(e.clientX,e.clientY);this.onUiEvent({type:"blank.click",position:{x:t.x,y:t.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 t=e.getPosition();this.onCommand({id:G(),source:"user:drag",label:"移动节点",timestamp:Date.now(),commands:[{type:"node.move",nodeId:e.id,position:{x:t.x,y:t.y}}]})}),this.on("edge:connected",({edge:e,isNew:t})=>{const o=e.getSourceCell(),n=e.getTargetCell();if(!o||!n)return;const a=e.getSourcePortId(),r=e.getTargetPortId(),d=e.id in this.flowModelRef.value.edges;t&&!d?(this.graph.removeCell(e),this.onCommand({id:G(),source:"user:drag",label:"连线",timestamp:Date.now(),commands:[{type:"edge.add",edge:{id:this.idGenerator("edge"),source:{nodeId:o.id,portId:a??void 0},target:{nodeId:n.id,portId:r??void 0}}}]})):this.onCommand({id:G(),source:"user:drag",label:"重连",timestamp:Date.now(),commands:[{type:"edge.reconnect",edgeId:e.id,source:{nodeId:o.id,portId:a??void 0},target:{nodeId:n.id,portId:r??void 0}}]})}),this.on("edge:change:labels",({edge:e,current:t})=>{const n=e.getData?.()?.labels??[];if(!n.length||!t?.length)return;const a=[];for(let r=0;r<Math.min(n.length,t.length);r++){const d=t[r],l=n[r];if(!l?.id)continue;const h=typeof d.position=="object"?d.position?.distance:d.position;h!=null&&a.push({type:"edge.label.update",edgeId:e.id,labelId:l.id,patch:{position:h}})}a.length&&this.onCommand({id:G(),source:"user:drag",label:"拖动标签",timestamp:Date.now(),commands:a})})}on(e,t){this.graph.on(e,t),this.disposers.push(()=>this.graph.off(e,t))}}function It(s){function e(t){const o=s.getCellById(t);if(!o||!o.isNode())return null;const n=o,a=n.getPosition(),r=n.getSize(),d={x:a.x,y:a.y,width:r.width,height:r.height},l=s.localToGraph(d);return new DOMRect(l.x,l.y,l.width,l.height)}return{getNodeScreenRect:e}}const Mt=100;function St({graph:s,overlayManager:e,executeCommand:t,schema:o,flowModel:n,idGenerator:a,defaultInsertGap:r,getContextMenuItems:d,onHighlightChange:l,resolveNodeShape:h}){const c=a??Me;let m=[],p=[],g=null,N=!1,k=null,M=!1;async function b(){if(N)return g;N=!0;try{const v=await import("@antv/x6-plugin-dnd"),w=v.Dnd??v.default;return w?(g=new w({target:s,scaled:!0,animation:!0,getDragNode:x=>x.clone(),getDropNode:x=>x.clone()}),g):null}catch{return console.warn("[flow-canvas] @antv/x6-plugin-dnd not available, add it to your dependencies"),null}}async function S(){if(!M){M=!0;try{const v=await import("@antv/x6-plugin-export"),w=v.Export??v.default;w&&s.use(new w)}catch{console.warn("[flow-canvas] @antv/x6-plugin-export not available, add it to your dependencies")}}}const L=({node:v})=>{const w=v.getData?.();if(!w?._dndSessionId||w._dndSessionId!==k)return;k=null;const x=v.getPosition();s.removeNode(v.id);const{_dndSessionId:R,...A}=w,z=A.id||c("node");t({id:G(),source:"user:drag",label:"拖入节点",timestamp:Date.now(),commands:[{type:"node.add",node:{...A,id:z,position:{x:x.x,y:x.y}}}]})};s.on("node:added",L);function H(v){const w=o.nodeTypes[v.type];return Se(v,w?.getPorts)}function V(v,w,x,R,A){switch(v){case"left":return{x:w.position.x-A-R.width,y:w.position.y+(x.height-R.height)/2};case"top":return{x:w.position.x+(x.width-R.width)/2,y:w.position.y-A-R.height};case"bottom":return{x:w.position.x+(x.width-R.width)/2,y:w.position.y+x.height+A};default:return{x:w.position.x+x.width+A,y:w.position.y+(x.height-R.height)/2}}}function K(v,w,x){switch(v){case"left":return{x:-(w.width+x),y:0};case"top":return{x:0,y:-(w.height+x)};case"bottom":return{x:0,y:w.height+x};default:return{x:w.width+x,y:0}}}function $(v){switch(v){case"left":return"right";case"top":return"bottom";case"bottom":return"top";default:return"left"}}return{zoomIn(){s.zoom(.1)},zoomOut(){s.zoom(-.1)},zoomTo(v){s.zoomTo(v)},zoomToFit(){s.zoomToFit({padding:40,maxScale:1.5})},getZoom(){return s.zoom()},centerContent(){s.centerContent()},scrollToOrigin(){s.translate(0,0)},scrollToNode(v){const w=s.getCellById(v);w&&s.centerCell(w)},getSelection(){const v=s.getSelectedCells?.()??[];return{nodeIds:v.filter(w=>w.isNode()).map(w=>w.id),edgeIds:v.filter(w=>w.isEdge()).map(w=>w.id)}},selectNodes(v){const w=v.map(x=>s.getCellById(x)).filter(Boolean);s.select?.(w)},selectEdges(v){const w=v.map(x=>s.getCellById(x)).filter(Boolean);s.select?.(w)},clearSelection(){const v=s.getSelectedCells?.();v?.length&&s.unselect?.(v)},registerDndSource(v,w){const x=async R=>{const A=await b();if(!A)return;const z=G();k=z;const q=w(),O=h?.(q.type),F=s.createNode({width:O?.width??154,height:O?.height??54,shape:O?.shapeName??"rect",data:{...q,_dndSessionId:z}});A.start(F,R)};return v.addEventListener("mousedown",x),()=>{v.removeEventListener("mousedown",x)}},startConnection(v,w){const x=s.getCellById(v);if(!x?.isNode())return;const R=x,A=s.findViewByCell(R);if(!A)return;const z=A.findPortElem(w,"circle")??A.findPortElem(w);if(!z)return;const O=(z.matches?.("[magnet]")?z:z.querySelector?.("[magnet]"))??z,F=O.getBoundingClientRect(),ne=F.left+F.width/2,ee=F.top+F.height/2,se=new MouseEvent("mousedown",{clientX:ne,clientY:ee,button:0,buttons:1,bubbles:!0,cancelable:!0});O.dispatchEvent(se)},async exportAsImage(v){await S();const w=s;return typeof w.toPNG!="function"?(console.warn("[flow-canvas] exportAsImage requires @antv/x6-plugin-export, add it to your dependencies"),new Blob):new Promise(x=>{w.toPNG(R=>{fetch(R).then(A=>A.blob()).then(x).catch(()=>x(new Blob))},{backgroundColor:v?.backgroundColor??"#ffffff",padding:v?.padding??20,quality:v?.quality,copyStyles:!0})})},async exportAsSVG(){await S();const v=s;return typeof v.toSVG!="function"?(console.warn("[flow-canvas] exportAsSVG requires @antv/x6-plugin-export, add it to your dependencies"),""):new Promise(w=>{v.toSVG(x=>w(x))})},highlightNodes(v){m=v,l?.(m,p)},highlightEdges(v){p=v,l?.(m,p)},clearHighlight(){m=[],p=[],l?.([],[])},overlay:e,getContextMenuItems(v){return d?.(v)??[]},insertNodeToRight(v,w,x){const R=n.value,A=R.nodes[v];if(!A)return{status:"invalid",envelope:{id:"",source:"user:toolbar",timestamp:Date.now(),commands:[]},error:{code:"constraint_violated",reason:`Source node "${v}" not found`,source:"api"}};const z=x?.gap??r??Mt,q=x?.direction??"right",O=o.nodeTypes[A.type],F=o.nodeTypes[w.type],ne=O?.getSize(A)??{width:154,height:54},ee=F?.getSize({...w,position:{x:0,y:0}})??{width:154,height:54},se=V(q,A,ne,ee,z),ie=w.id||c("node"),he={...w,id:ie,position:se},Z=[{type:"node.add",node:he}],ve=K(q,ee,z),J={x:se.x,y:se.y,width:ee.width,height:ee.height};for(const[te,W]of Object.entries(R.nodes)){if(te===v||te===ie)continue;const ae=o.nodeTypes[W.type]?.getSize(W)??{width:154,height:54},X=J.x<W.position.x+ae.width&&J.x+J.width>W.position.x,le=J.y<W.position.y+ae.height&&J.y+J.height>W.position.y;X&&le&&Z.push({type:"node.move",nodeId:te,position:{x:W.position.x+ve.x,y:W.position.y+ve.y}})}if(x?.autoWireEdges){const te=H(A),W=H(he),ce=q,ae=$(q),X=te.find(U=>U.group===ce),le=W.find(U=>U.group===ae),me=W.find(U=>U.group===ce),ue=X?Object.values(R.edges).find(U=>U.source.nodeId===v&&U.source.portId===X.id):Object.values(R.edges).find(U=>U.source.nodeId===v);if(ue){const U=ue.target;Z.push({type:"edge.remove",edgeId:ue.id}),Z.push({type:"edge.add",edge:{id:c("edge"),source:{nodeId:v,portId:X?.id},target:{nodeId:ie,portId:le?.id}}}),Z.push({type:"edge.add",edge:{id:c("edge"),source:{nodeId:ie,portId:me?.id},target:U}})}else Z.push({type:"edge.add",edge:{id:c("edge"),source:{nodeId:v,portId:X?.id},target:{nodeId:ie,portId:le?.id}}})}const Ce={id:G(),source:x?.source??"user:toolbar",label:x?.label??"插入节点",timestamp:Date.now(),commands:Z};return t(Ce)},onGraphEvent(v,w){return s.on(v,w),()=>s.off(v,w)},unsafeGetGraph(){return s}}}function Dt(){const s=i.ref(null),e=i.ref(!1);let t=null,o=!1;function n(m){t&&(clearTimeout(t),t=null),s.value=m}function a(m=100){o||(t&&clearTimeout(t),t=setTimeout(()=>{s.value=null,t=null},m))}function r(){o=!0,t&&(clearTimeout(t),t=null)}function d(m=100){o=!1,a(m)}function l(){t&&(clearTimeout(t),t=null)}function h(){l(),o=!1,s.value=null}function c(){t&&clearTimeout(t)}return{hoveredNodeId:s,isDraggingNode:e,enter:n,leave:a,enterOverlay:r,leaveOverlay:d,cancelLeave:l,reset:h,cleanup:c}}const _e=10,ye=12;function Ae(s,e){const t=s.getTotalLength();if(t===0)return{...e,length:0,totalLength:0};let o=s.getPointAtLength(0),n=1/0;const a=50,r=t/a;let d=0;for(let m=0;m<=a;m++){const p=m*r,g=s.getPointAtLength(p),N=(g.x-e.x)**2+(g.y-e.y)**2;N<n&&(n=N,o=g,d=p)}const l=Math.max(0,d-r),h=Math.min(t,d+r),c=(h-l)/20;for(let m=l;m<=h;m+=c){const p=s.getPointAtLength(m),g=(p.x-e.x)**2+(p.y-e.y)**2;g<n&&(n=g,o=p,d=m)}return{x:o.x,y:o.y,length:d,totalLength:t}}function Te(s,e){return s<_e||s>e-_e}function Re(s,e,t){const o=s.querySelectorAll(".x6-edge-label");for(const n of o){const a=n.getBoundingClientRect();if(e>=a.left-ye&&e<=a.right+ye&&t>=a.top-ye&&t<=a.bottom+ye)return!0}return!1}function $e(){const s="http://www.w3.org/2000/svg",e=document.createElementNS(s,"g");e.setAttribute("class","flow-canvas-edge-delete-tool"),e.style.cursor="pointer";const t=document.createElementNS(s,"rect");t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("x","-10"),t.setAttribute("y","-10"),t.setAttribute("rx","4"),t.setAttribute("ry","4"),t.setAttribute("fill","#3a84ff"),e.appendChild(t);const o=document.createElementNS(s,"text");return o.setAttribute("font-family","flow-canvas"),o.setAttribute("font-size","16"),o.setAttribute("fill","#ffffff"),o.setAttribute("text-anchor","middle"),o.setAttribute("dominant-baseline","central"),o.textContent="",e.appendChild(o),e}function Pt(s){let e=null,t=null;function o(d,l){if(a(),t=d,l.target?.closest?.(".x6-edge-label"))return;const c=s.getCellById(d);if(!c?.isEdge())return;const m=s.findViewByCell(c);if(!m)return;const p=m.container.querySelector("path");if(!p)return;const g=s.clientToLocal(l.clientX,l.clientY),N=Ae(p,g);if(Te(N.length,N.totalLength)||Re(m.container,l.clientX,l.clientY))return;const k=$e();k.setAttribute("transform",`translate(${N.x}, ${N.y})`),m.container.appendChild(k),e=k}function n(d){if(!t)return;if(d.target?.closest?.(".x6-edge-label")){e&&e.setAttribute("display","none");return}const h=s.getCellById(t);if(!h?.isEdge())return;const c=s.findViewByCell(h);if(!c)return;const m=c.container.querySelector("path");if(!m)return;const p=s.clientToLocal(d.clientX,d.clientY),g=Ae(m,p);if(Te(g.length,g.totalLength)||Re(c.container,d.clientX,d.clientY))e&&e.setAttribute("display","none");else if(e)e.removeAttribute("display"),e.setAttribute("transform",`translate(${g.x}, ${g.y})`);else{const N=$e();N.setAttribute("transform",`translate(${g.x}, ${g.y})`),c.container.appendChild(N),e=N}}function a(){e&&(e.remove(),e=null),t=null}function r(d){d===t&&(e=null,t=null)}return{show:o,move:n,remove:a,handleEdgeRemoved:r}}function Bt(s){let e=null,t=0;function o(c){const m=c?"visible":"hidden";for(const p of s.getNodes())for(const g of p.getPorts())p.setPortProp(g.id,"attrs/circle/visibility",m)}function n(c){if(!e)for(const m of c.getPorts())c.setPortProp(m.id,"attrs/circle/visibility","visible")}function a(c){if(!e)for(const m of c.getPorts())c.setPortProp(m.id,"attrs/circle/visibility","hidden")}function r(c,m){if(!c.getTargetCell())if(e=c.id,m?.size)for(const p of s.getNodes()){const g=m.has(p.id)?"hidden":"visible";for(const N of p.getPorts())p.setPortProp(N.id,"attrs/circle/visibility",g)}else o(!0)}function d(){e=null,o(!1),t=Date.now()+300}function l(c){c===e&&(e=null,o(!1))}function h(){return!e&&Date.now()>=t}return{showNodePorts:n,hideNodePorts:a,handleEdgeAdded:r,handleEdgeConnected:d,handleEdgeRemoved:l,canShowEdgeTool:h}}const _t={class:"flow-canvas-node-actions__bar"},At=i.defineComponent({__name:"node-actions-toolbar",props:{node:{},position:{},config:{},behavior:{},actionsOffset:{}},emits:["action"],setup(s,{emit:e}){const t=s,o=i.computed(()=>{const m=t.actionsOffset?.x??0,p=t.actionsOffset?.y??0,g=m!==0||p!==0;return{left:`${t.position.x}px`,top:`${t.position.y}px`,transform:g?`translate(${m}px, ${p}px)`:"translateX(-100%)"}}),n=e,a=i.computed(()=>({debug:{visible:t.config.showDebug&&t.behavior.debuggable!==!1,disabled:t.behavior.debugDisabled===!0},delete:{visible:t.config.showDelete&&t.behavior.deletable!==!1,disabled:t.behavior.deleteDisabled===!0},copy:{visible:t.config.showCopy&&t.behavior.copyable!==!1,disabled:t.behavior.copyDisabled===!0},copyInsert:{visible:t.config.showCopyInsert&&t.behavior.copyable!==!1,disabled:t.behavior.copyInsertDisabled===!0},disconnect:{visible:t.config.showDisconnect&&t.behavior.disconnectable!==!1,disabled:t.behavior.disconnectDisabled===!0}})),r=i.computed(()=>a.value.copy.visible||a.value.copyInsert.visible||a.value.disconnect.visible),d=i.ref(!1);let l=null;function h(){l&&(clearTimeout(l),l=null),d.value=!0}function c(){l=setTimeout(()=>{d.value=!1,l=null},100)}return i.onBeforeUnmount(()=>{l&&clearTimeout(l)}),(m,p)=>(i.openBlock(),i.createElementBlock("div",{class:"flow-canvas-node-actions",style:i.normalizeStyle(o.value)},[i.createElementVNode("div",_t,[a.value.debug.visible?(i.openBlock(),i.createElementBlock("i",{key:0,class:i.normalizeClass(["flow-canvas-icon canvas-debug flow-canvas-node-actions__icon",{"is-disabled":a.value.debug.disabled}]),onClick:p[0]||(p[0]=g=>!a.value.debug.disabled&&n("action","debug",s.node.id))},null,2)):i.createCommentVNode("",!0),a.value.delete.visible?(i.openBlock(),i.createElementBlock("i",{key:1,class:i.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-node-actions__icon",{"is-disabled":a.value.delete.disabled}]),onClick:p[1]||(p[1]=g=>!a.value.delete.disabled&&n("action","delete",s.node.id))},null,2)):i.createCommentVNode("",!0),r.value?(i.openBlock(),i.createElementBlock("div",{key:2,class:"flow-canvas-node-actions__more-wrapper",onMouseenter:h,onMouseleave:c},[...p[5]||(p[5]=[i.createElementVNode("i",{class:"flow-canvas-icon canvas-gengduo flow-canvas-node-actions__icon"},null,-1)])],32)):i.createCommentVNode("",!0)]),i.createVNode(i.Transition,{name:"flow-canvas-fade"},{default:i.withCtx(()=>[d.value&&r.value?(i.openBlock(),i.createElementBlock("div",{key:0,class:"flow-canvas-node-actions__dropdown",onMouseenter:h,onMouseleave:c},[a.value.copy.visible?(i.openBlock(),i.createElementBlock("div",{key:0,class:i.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":a.value.copy.disabled}]),onClick:p[2]||(p[2]=g=>!a.value.copy.disabled&&n("action","copy",s.node.id))},[...p[6]||(p[6]=[i.createElementVNode("i",{class:"flow-canvas-icon canvas-copy-fuzhi-2"},null,-1),i.createElementVNode("span",null,"复制",-1)])],2)):i.createCommentVNode("",!0),a.value.copyInsert.visible?(i.openBlock(),i.createElementBlock("div",{key:1,class:i.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":a.value.copyInsert.disabled}]),onClick:p[3]||(p[3]=g=>!a.value.copyInsert.disabled&&n("action","copy-insert",s.node.id))},[...p[7]||(p[7]=[i.createElementVNode("i",{class:"flow-canvas-icon canvas-fuzhibingcharu"},null,-1),i.createElementVNode("span",null,"复制并插入",-1)])],2)):i.createCommentVNode("",!0),a.value.disconnect.visible?(i.openBlock(),i.createElementBlock("div",{key:2,class:i.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":a.value.disconnect.disabled}]),onClick:p[4]||(p[4]=g=>!a.value.disconnect.disabled&&n("action","disconnect",s.node.id))},[...p[8]||(p[8]=[i.createElementVNode("i",{class:"flow-canvas-icon canvas-unlock-jiebang"},null,-1),i.createElementVNode("span",null,"断开连线",-1)])],2)):i.createCommentVNode("",!0)],32)):i.createCommentVNode("",!0)]),_:1})],4))}}),re=(s,e)=>{const t=s.__vccOpts||s;for(const[o,n]of e)t[o]=n;return t},je=re(At,[["__scopeId","data-v-3b39dab5"]]),Tt={key:0,class:"flow-canvas-quick-add__tooltip"},Rt=5,$t=i.defineComponent({__name:"node-quick-add-popover",props:{node:{},portPosition:{},tooltipText:{}},emits:["open","close","start-drag","mouseenter","mouseleave"],setup(s,{expose:e,emit:t}){const o=s,n=t,a=i.ref(),r=i.ref(),d=i.ref(!1),l=i.ref(!1);let h=null,c=!1,m=null;function p($){$.preventDefault(),$.stopPropagation(),h={x:$.clientX,y:$.clientY},c=!1,document.addEventListener("mousemove",g),document.addEventListener("mouseup",N)}function g($){if(!h)return;const _=$.clientX-h.x,v=$.clientY-h.y;Math.sqrt(_*_+v*v)>=Rt&&(c=!0,k(),n("start-drag",o.node.id))}function N(){k(),c||M(),h=null,c=!1}function k(){document.removeEventListener("mousemove",g),document.removeEventListener("mouseup",N)}function M(){l.value?S():b()}function b(){l.value=!0,n("open",o.node.id),requestAnimationFrame(()=>{document.addEventListener("mousedown",L)})}function S(){l.value=!1,n("close"),document.removeEventListener("mousedown",L)}function L($){const _=$.target;a.value?.contains(_)||r.value?.contains(_)||S()}function H(){l.value||n("mouseleave")}function V(){m&&(clearTimeout(m),m=null),n("mouseenter")}function K(){m=setTimeout(()=>{S(),n("mouseleave"),m=null},150)}return i.onBeforeUnmount(()=>{k(),m&&clearTimeout(m),document.removeEventListener("mousedown",L)}),e({closePopover:S}),($,_)=>(i.openBlock(),i.createElementBlock("div",{class:"flow-canvas-quick-add",style:i.normalizeStyle({left:`${s.portPosition.x}px`,top:`${s.portPosition.y}px`}),onMouseenter:_[2]||(_[2]=v=>n("mouseenter")),onMouseleave:H,onClick:_[3]||(_[3]=i.withModifiers(()=>{},["stop"]))},[i.createElementVNode("div",{ref_key:"btnRef",ref:a,class:i.normalizeClass(["flow-canvas-quick-add__btn",{"is-hovered":d.value,"is-active":l.value}]),onMouseenter:_[0]||(_[0]=v=>d.value=!0),onMouseleave:_[1]||(_[1]=v=>d.value=!1),onMousedown:p},[..._[4]||(_[4]=[i.createElementVNode("i",{class:"flow-canvas-icon canvas-zoom-add"},null,-1)])],34),d.value&&!l.value?(i.openBlock(),i.createElementBlock("div",Tt,[..._[5]||(_[5]=[i.createElementVNode("div",null,[i.createElementVNode("b",null,"点击"),i.createTextVNode(" 添加节点")],-1),i.createElementVNode("div",null,[i.createElementVNode("b",null,"拖拽"),i.createTextVNode(" 连接节点")],-1)])])):i.createCommentVNode("",!0),i.createVNode(i.Transition,{name:"flow-canvas-fade"},{default:i.withCtx(()=>[l.value?(i.openBlock(),i.createElementBlock("div",{key:0,ref_key:"popoverRef",ref:r,class:"flow-canvas-quick-add__popover",onMouseenter:V,onMouseleave:K},[i.renderSlot($.$slots,"default",{},()=>[_[6]||(_[6]=i.createElementVNode("div",{class:"flow-canvas-quick-add__default-content"},"节点快捷操作面板",-1))],!0)],544)):i.createCommentVNode("",!0)]),_:3})],36))}}),Fe=re($t,[["__scopeId","data-v-b98695cf"]]),Lt={class:"flow-canvas-runtime-core__overlay"},Vt=i.defineComponent({__name:"canvas-runtime-core",props:{editor:{},graphOptions:{},nodeActions:{},quickAdd:{},getConnectionExcludedNodeIds:{type:Function}},emits:["ui-event"],setup(s,{emit:e}){const t=s,o=e,n=i.ref(),a=i.ref();let r,d,l,h;const c=Dt(),{hoveredNodeId:m,isDraggingNode:p}=c,g=c.enterOverlay,N=()=>c.leaveOverlay(),k=i.ref(null),M=i.ref(!1);let b=null;function S(y){return M.value?!0:(H(),J(y)?(k.value=y,!0):(k.value=null,!1))}function L(){b&&clearTimeout(b),b=setTimeout(()=>{k.value=null,b=null},150)}function H(){b&&(clearTimeout(b),b=null)}function V(){H(),c.enterOverlay()}function K(){L(),c.leaveOverlay()}let $=null,_=null,v=null,w=null,x=null;const R=i.ref(0),A=i.computed(()=>{if(R.value,!t.editor.api.value)return[];const y=t.editor.flowModel.value,E=t.editor.api.value.overlay,u=[];for(const[I,D]of Object.entries(y.nodes)){const P=t.editor._pluginManager.collectNodeDecorations(D);if(!P?.badge)continue;const T=E.getNodeScreenRect(I);T&&u.push({nodeId:I,x:T.x+T.width-4,y:T.y-8,badge:P.badge})}return u}),z=i.computed(()=>({showDebug:!1,showDelete:!0,showCopy:!0,showCopyInsert:!0,showDisconnect:!0,insertGap:100,...t.nodeActions})),q=i.computed(()=>{R.value;const y=m.value;if(!y||p.value||!t.editor.api.value||t.editor.mode.value!=="edit")return null;const E=t.editor.flowModel.value,u=E.nodes[y];if(!u)return null;const I=t.editor.api.value.overlay.getNodeScreenRect(y);if(!I)return null;const P=t.editor.schema.nodeTypes[u.type]?.getBehavior?.(u,{api:t.editor.api.value,flowModel:E,history:t.editor.history,mode:t.editor.mode.value})??{};return P.showActions===!1?null:{node:u,position:{x:I.x+I.width,y:I.y+I.height+4},behavior:P}}),O=i.computed(()=>({enabled:!0,tooltipText:"",portGroup:"right",...t.quickAdd})),F=i.computed(()=>{if(R.value,!O.value.enabled)return null;const y=k.value;if(!y||p.value||!t.editor.api.value||t.editor.mode.value!=="edit")return null;const E=t.editor.flowModel.value,u=E.nodes[y];if(!u)return null;const D=t.editor.schema.nodeTypes[u.type]?.getBehavior?.(u,{api:t.editor.api.value,flowModel:E,history:t.editor.history,mode:t.editor.mode.value})??{};if(D.quickAddEnabled===!1)return null;const P=X(u);return P?{node:u,portId:P.portId,portGroup:P.portGroup,portPosition:P.portPosition,behavior:D}:null}),ne=i.ref();function ee(y){M.value=!0;const E=F.value;E&&o("ui-event",{type:"node.quick-add",nodeId:y,position:E.portPosition})}function se(){M.value=!1}function ie(y){const E=t.editor.api.value;if(!E)return;const I=t.editor.flowModel.value.nodes[y];if(!I)return;const D=X(I);D&&E.startConnection(y,D.portId)}function he(y,E){const u=t.editor.api.value;if(!u)return;const I=E.id||t.editor.idGenerator("node"),D={...E,id:I},P=t.editor.flowModel.value.nodes[y];if(!P)return;u.insertNodeToRight(y,D,{autoWireEdges:!0,direction:le(P),gap:z.value.insertGap,source:"user:quick-add",label:"快捷插入节点"}).status==="applied"&&o("ui-event",{type:"node.action.quick-insert",sourceNodeId:y,newNodeId:I}),ne.value?.closePopover()}function Z(y){return{id:t.editor.idGenerator("node"),type:y.type,label:y.label,ports:y.ports?JSON.parse(JSON.stringify(y.ports)):void 0,payload:y.payload?JSON.parse(JSON.stringify(y.payload)):void 0,extensions:y.extensions?JSON.parse(JSON.stringify(y.extensions)):void 0}}function ve(y,E){const u=t.editor,I=u.api.value;switch(y){case"delete":{u.executeCommand({id:G(),source:"user:toolbar",label:"删除节点",timestamp:Date.now(),commands:[{type:"node.remove",nodeId:E}]}),o("ui-event",{type:"node.action.delete",nodeId:E}),m.value=null;break}case"copy":{if(!I)break;const D=u.flowModel.value.nodes[E];if(!D)break;const P=Z(D);I.insertNodeToRight(E,P,{autoWireEdges:!1,gap:z.value.insertGap,label:"复制节点"}),o("ui-event",{type:"node.action.copy",sourceNodeId:E,newNodeId:P.id});break}case"copy-insert":{if(!I)break;const D=u.flowModel.value.nodes[E];if(!D)break;const P=Z(D);I.insertNodeToRight(E,P,{autoWireEdges:!0,gap:z.value.insertGap,label:"复制并插入节点"}),o("ui-event",{type:"node.action.copy-insert",sourceNodeId:E,newNodeId:P.id});break}case"disconnect":{const D=u.flowModel.value,P=Object.entries(D.edges).filter(([,T])=>{const Q=T;return Q.source.nodeId===E||Q.target.nodeId===E}).map(([T])=>T);if(P.length===0)break;u.executeCommand({id:G(),source:"user:toolbar",label:"断开连线",timestamp:Date.now(),commands:P.map(T=>({type:"edge.remove",edgeId:T}))}),o("ui-event",{type:"node.action.disconnect",nodeId:E,edgeIds:P});break}case"debug":{o("ui-event",{type:"node.action.debug",nodeId:E});break}}}function J(y){if(!O.value.enabled||t.editor.mode.value!=="edit")return!1;const E=t.editor.flowModel.value,u=E.nodes[y];return!u||(t.editor.schema.nodeTypes[u.type]?.getBehavior?.(u,{api:t.editor.api.value,flowModel:E,history:t.editor.history,mode:t.editor.mode.value})??{}).quickAddEnabled===!1?!1:!!X(u)}function Ce(y){const E=t.editor.schema.nodeTypes[y.type];return Se(y,E?.getPorts)}function te(y){return y==="top"||y==="right"||y==="bottom"||y==="left"}function W(y,E){const u=O.value.getPort?.(y,E);if(!u)return null;const I=typeof u=="string"?u:u.id;return E.find(D=>D.id===I)??null}function ce(y,E){const u=t.editor.api.value?.overlay.getNodeScreenRect(y);if(!u)return null;switch(E){case"top":return{x:u.x+u.width/2,y:u.y};case"bottom":return{x:u.x+u.width/2,y:u.y+u.height};case"left":return{x:u.x,y:u.y+u.height/2};case"right":return{x:u.x+u.width,y:u.y+u.height/2};default:return null}}function ae(y,E,u){const I=r.getCellById(y);if(I?.isNode()){const D=I,P=r.findViewByCell(D),T=P?.findPortElem(E,"circle")??P?.findPortElem(E);if(T){const Q=r.container.getBoundingClientRect(),oe=T.getBoundingClientRect();return{x:oe.left-Q.left+oe.width/2,y:oe.top-Q.top+oe.height/2}}}return ce(y,u)}function X(y){const E=Ce(y),u=W(y,E)??E.find(D=>D.group===O.value.portGroup)??null;if(!u)return null;const I=ae(y.id,u.id,u.group);return I?{portId:u.id,portGroup:u.group,portPosition:I}:null}function le(y){const E=X(y),u=O.value.insertDirection;if(typeof u=="function"){const I=u(y,E?{id:E.portId,group:E.portGroup}:null);if(I)return I}else if(u)return u;return E&&te(E.portGroup)?E.portGroup:te(O.value.portGroup)?O.value.portGroup:"right"}function me(y){if(t.editor.mode.value!=="edit")return;t.editor._pluginManager.dispatchKeyboardShortcut(y)&&(y.preventDefault(),y.stopPropagation())}function ue(){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 U(y){const E=t.editor.schema.defaultEdgeType??"default",u=t.editor.schema.edgeTypes?.[E],I={zIndex:-1,attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}};u?.router&&(I.router=typeof u.router=="string"?{name:u.router}:u.router),u?.connector&&(I.connector=typeof u.connector=="string"?{name:u.connector}:u.connector),u?.x6EdgeConfig&&Object.assign(I,u.x6EdgeConfig);const D=I.attrs??{},P=D.line??{};return I.attrs={...D,line:{...P,targetMarker:ue()}},y.createEdge(I)}return i.onMounted(()=>{if(!a.value)return;const y=new Set(["model","container"]),E={};if(t.graphOptions)for(const[f,C]of Object.entries(t.graphOptions)){if(y.has(f)){console.warn(`[flow-canvas] graphOptions.${f} is managed by the engine and will be ignored`);continue}E[f]=C}r=new ot.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(f){return f.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 U(this)}},...E}),l=new xt,d=new Ct(r,t.editor.schema,l,f=>t.editor._pluginManager.collectNodeDecorations(f),f=>t.editor._pluginManager.collectEdgeDecorations(f),()=>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 u=It(r),I=St({graph:r,overlayManager:u,executeCommand:f=>t.editor.executeCommand(f),schema:t.editor.schema,flowModel:t.editor.flowModel,idGenerator:t.editor.idGenerator,defaultInsertGap:t.nodeActions?.insertGap,getContextMenuItems:f=>t.editor._pluginManager.collectContextMenuItems(f),onHighlightChange:(f,C)=>{d.setHighlightedNodes(f),d.setHighlightedEdges(C),d.refreshNodeHighlights(),d.refreshEdgeStyles()},resolveNodeShape:f=>{const C=t.editor.schema.nodeTypes[f];if(!C)return null;const B=l.registerNodeType(f,C.component),j=C.getSize({id:"",type:f,position:{x:0,y:0}});return{shapeName:B,width:j.width,height:j.height}}});t.editor.api.value=I;const D={flowModel:t.editor.flowModel,history:t.editor.history,schema:t.editor.schema,mode:t.editor.mode,idGenerator:t.editor.idGenerator,executeCommand:t.editor.executeCommand,api:I,overlay:u,graph:r};t.editor._pluginManager.attachRuntime(D);const P=t.editor._pluginManager.collectExtendedApi();Object.assign(t.editor.extendedApi,P),h=new Nt(r,f=>{(f.type==="node.click"||f.type==="node.dblclick"||f.type==="node.contextmenu")&&c.enter(f.nodeId),t.editor._pluginManager.dispatchUiEvent(f),o("ui-event",f)},f=>{if(d.isSyncing)return;if(t.editor.executeCommand(f).status!=="applied"){for(const B of f.commands)if(B.type==="edge.add"){const j=r.getCellById(B.edge.id);j&&r.removeCell(j)}}},t.editor.flowModel,t.editor.idGenerator),$=Pt(r);const T=Bt(r),Q=r,oe=f=>{const C=Q.isRubberbandEnabled?.()??!1;C&&Q.disableRubberband?.(),f?r.enablePanning():r.disablePanning(),C&&Q.enableRubberband?.()},xe=()=>{R.value++};r.on("translate",xe),r.on("scale",xe),r.on("resize",xe),r.on("node:move",({node:f})=>{p.value=!0;const C=t.editor.flowModel.value.nodes[f.id];C&&t.editor.api.value&&t.editor.schema.nodeTypes[C.type]?.getBehavior?.(C,{api:t.editor.api.value,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})?.bringToFrontOnDrag===!1||f.toFront?.()}),r.on("node:moved",()=>{p.value=!1}),r.on("node:mouseenter",({node:f})=>{c.enter(f.id);const C=t.editor.flowModel.value.nodes[f.id];if(C&&t.editor.api.value&&t.editor.schema.nodeTypes[C.type]?.getBehavior?.(C,{api:t.editor.api.value,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})?.showPorts===!1){O.value.enabled&&S(f.id);return}O.value.enabled&&S(f.id)||T.showNodePorts(f)}),r.on("node:mouseleave",({node:f})=>{const C=t.editor.flowModel.value.nodes[f.id];let B=100;C&&t.editor.api.value&&t.editor.schema.nodeTypes[C.type]?.getBehavior?.(C,{api:t.editor.api.value,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})?.actionsOffset&&(B=300),c.leave(B),O.value.enabled?k.value===f.id&&!M.value?L():k.value!==f.id&&T.hideNodePorts(f):T.hideNodePorts(f)});function Qe(f){const C=r.getCellById(f);if(!C?.isNode())return;const B=C,j=t.editor.flowModel.value.nodes[f];if(!j)return;const Ne=X(j);let De=!0;t.editor.api.value&&t.editor.schema.nodeTypes[j.type]?.getBehavior?.(j,{api:t.editor.api.value,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})?.hidePortForQuickAdd===!1&&(De=!1);const Xe=De&&!p.value&&!!Ne&&J(f);for(const Ie of B.getPorts()){const Pe=Xe&&Ie.id===Ne?.portId?"hidden":"visible";B.setPortProp(Ie.id,"attrs/circle/visibility",Pe)}}i.watch([k,p],([f],[C])=>{if(C&&C!==f){const B=r.getCellById(C);B?.isNode()&&T.hideNodePorts(B)}f&&Qe(f)},{flush:"sync"}),i.watch(F,f=>{f||(M.value=!1)}),r.on("edge:added",({edge:f})=>{let C;if(t.getConnectionExcludedNodeIds&&!f.getTargetCell()){const B=f.getSourceCell();if(B){const j=t.getConnectionExcludedNodeIds(B.id);C=j instanceof Set?j:new Set(j)}}T.handleEdgeAdded(f,C)}),r.on("edge:connected",()=>{T.handleEdgeConnected()}),r.on("edge:removed",({edge:f})=>{T.handleEdgeRemoved(f.id),$.handleEdgeRemoved(f.id)}),r.on("selection:changed",()=>{const f=r.getSelectedCells?.()??[],C={nodeIds:f.filter(B=>B.isNode()).map(B=>B.id),edgeIds:f.filter(B=>B.isEdge()).map(B=>B.id)};t.editor._pluginManager.dispatchSelectionChange(C),o("ui-event",{type:"selection.change",nodeIds:C.nodeIds,edgeIds:C.edgeIds}),d.refreshEdgeStyles()}),r.on("edge:mouseenter",({edge:f,e:C})=>{d.setHoveredEdge(f.id),d.refreshEdgeStyles(),t.editor.mode.value==="edit"&&T.canShowEdgeTool()&&$.show(f.id,C)}),_=f=>$.move(f),r.container.addEventListener("mousemove",_),v=f=>{if(!m.value&&!k.value)return;const C=f.target;if(C?.closest?.(".x6-node")||C?.closest?.(".flow-canvas-node-actions")||C?.closest?.(".flow-canvas-quick-add")){c.cancelLeave(),H();return}c.leave(180),M.value||L()},n.value?.addEventListener("mousemove",v),w=()=>{c.reset(),M.value||(k.value=null)},n.value?.addEventListener("mouseleave",w),r.on("edge:mouseleave",()=>{d.setHoveredEdge(null),d.refreshEdgeStyles(),$.remove()}),r.on("edge:click",({edge:f,e:C})=>{C.target?.closest?.(".flow-canvas-edge-delete-tool")&&t.editor.mode.value==="edit"&&($.remove(),t.editor.executeCommand({id:G(),source:"user:toolbar",label:"删除连线",timestamp:Date.now(),commands:[{type:"edge.remove",edgeId:f.id}]}))}),n.value?.addEventListener("keydown",me),d.syncFlowModel(t.editor.flowModel.value),i.watch(()=>t.editor.flowModel.value,f=>d.syncFlowModel(f)),i.watch(()=>t.editor.selectionMode.value,f=>{if(x?.(),x=null,f){oe(!1),Q.enableRubberband?.();const C=()=>{r.container.removeEventListener("mouseup",C),x=null,setTimeout(()=>{t.editor.selectionMode.value&&t.editor.setSelectionMode(!1)},50)};r.container.addEventListener("mouseup",C),x=()=>r.container.removeEventListener("mouseup",C)}else Q.disableRubberband?.(),oe(!0)}),i.watch(()=>t.editor.mode.value,f=>{const C=f==="edit";oe(!0),C?Q.enableSelection?.():Q.disableSelection?.()})}),i.onBeforeUnmount(()=>{c.cleanup(),b&&clearTimeout(b),$?.remove(),x?.(),_&&r?.container?.removeEventListener("mousemove",_),v&&n.value?.removeEventListener("mousemove",v),w&&n.value?.removeEventListener("mouseleave",w),n.value?.removeEventListener("keydown",me),t.editor._pluginManager.detachRuntime(),t.editor.api.value=null;for(const y of Object.keys(t.editor.extendedApi))delete t.editor.extendedApi[y];h?.dispose(),d?.dispose(),l?.dispose(),r?.dispose()}),(y,E)=>(i.openBlock(),i.createElementBlock("div",{ref_key:"rootRef",ref:n,class:"flow-canvas-runtime-core",tabindex:"0"},[i.createElementVNode("div",{ref_key:"containerRef",ref:a,class:"flow-canvas-runtime-core__graph"},null,512),i.createElementVNode("div",Lt,[(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(A.value,u=>(i.openBlock(),i.createElementBlock("div",{key:`badge-${u.nodeId}`,class:"flow-canvas-runtime-core__badge",style:i.normalizeStyle({left:`${u.x}px`,top:`${u.y}px`,backgroundColor:u.badge.color})},i.toDisplayString(u.badge.text),5))),128)),F.value?(i.openBlock(),i.createBlock(Fe,{key:0,ref_key:"quickAddPopoverRef",ref:ne,node:F.value.node,"port-position":F.value.portPosition,"tooltip-text":O.value.tooltipText,onOpen:ee,onClose:se,onStartDrag:ie,onMouseenter:V,onMouseleave:K},{default:i.withCtx(()=>[i.renderSlot(y.$slots,"quick-add-panel",{node:F.value.node,api:s.editor.api.value,insertNodeToRight:u=>he(F.value.node.id,u),closePopover:()=>ne.value?.closePopover()},void 0,!0)]),_:3},8,["node","port-position","tooltip-text"])):i.createCommentVNode("",!0),q.value?(i.openBlock(),i.createBlock(je,{key:1,node:q.value.node,position:q.value.position,config:z.value,behavior:q.value.behavior,"actions-offset":q.value.behavior.actionsOffset,onAction:ve,onMouseenter:i.unref(g),onMouseleave:N},null,8,["node","position","config","behavior","actions-offset","onMouseenter"])):i.createCommentVNode("",!0)])],512))}}),Ot=re(Vt,[["__scopeId","data-v-b37732f8"]]),zt={class:"flow-canvas-node-palette"},Gt=["data-node-type"],jt={class:"flow-canvas-node-palette__item-label"},Ft=i.defineComponent({__name:"canvas-node-palette",props:{editor:{},items:{}},setup(s){const e=s,t=i.ref(),o=i.computed(()=>e.items?e.items:Object.keys(e.editor.schema.nodeTypes).map(n=>({type:n,label:n.charAt(0).toUpperCase()+n.slice(1)})));return i.watch([()=>e.editor.api.value,o,t],([n,a,r],d,l)=>{if(!n||!r)return;const h=[];for(const c of a){const m=r.querySelector(`[data-node-type="${c.type}"]`);if(!m)continue;const p=n.registerDndSource(m,()=>({id:G(),type:c.type,label:c.label,position:{x:0,y:0}}));h.push(p)}l(()=>{for(const c of h)c()})},{flush:"post"}),(n,a)=>(i.openBlock(),i.createElementBlock("div",zt,[i.createElementVNode("div",{ref_key:"listRef",ref:t,class:"flow-canvas-node-palette__list"},[(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(o.value,r=>(i.openBlock(),i.createElementBlock("div",{key:r.type,class:"flow-canvas-node-palette__item","data-node-type":r.type},[r.icon?(i.openBlock(),i.createElementBlock("i",{key:0,class:i.normalizeClass([r.icon,"flow-canvas-node-palette__item-icon"])},null,2)):i.createCommentVNode("",!0),i.createElementVNode("span",jt,i.toDisplayString(r.label),1)],8,Gt))),128))],512)]))}}),He=re(Ft,[["__scopeId","data-v-300314b7"]]),Ht={class:"flow-canvas-layout"},qt={class:"flow-canvas-layout__main"},Ut={class:"flow-canvas-layout__content"},Wt={key:0,class:"flow-canvas-layout__footer"},Qt=i.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(s){return(e,t)=>(i.openBlock(),i.createElementBlock("div",Ht,[!s.hideSidebar&&(e.$slots.sidebar||s.editor)?(i.openBlock(),i.createElementBlock("aside",{key:0,class:i.normalizeClass(["flow-canvas-layout__sidebar",{"is-collapsed":s.sidebarCollapsed}]),style:i.normalizeStyle({width:s.sidebarCollapsed?"0px":`${s.sidebarWidth}px`})},[i.renderSlot(e.$slots,"sidebar",{},()=>[s.editor?(i.openBlock(),i.createBlock(He,{key:0,editor:s.editor,items:s.paletteItems},null,8,["editor","items"])):i.createCommentVNode("",!0)],!0)],6)):i.createCommentVNode("",!0),i.createElementVNode("div",qt,[i.createElementVNode("div",Ut,[i.renderSlot(e.$slots,"default",{},void 0,!0)]),!s.hideFooter&&e.$slots.footer?(i.openBlock(),i.createElementBlock("div",Wt,[i.renderSlot(e.$slots,"footer",{},void 0,!0)])):i.createCommentVNode("",!0)])]))}}),Xt=re(Qt,[["__scopeId","data-v-26f35b6b"]]),Yt=["undo","redo"];function qe(s){const e=new Set(s?.include),t=new Set([...Yt.filter(l=>!e.has(l)),...s?.exclude??[]]),o=[{id:"undo",type:"undo",group:"history",icon:"flow-canvas-icon canvas-undo",description:"撤销",order:10},{id:"redo",type:"redo",group:"history",icon:"flow-canvas-icon canvas-redo",description:"重做",order:11}],n=[{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:"search",type:"search",group:"tools",icon:"flow-canvas-icon canvas-search",description:"搜索节点",order:22},{id:"minimap",type:"minimap",group:"tools",icon:"flow-canvas-icon canvas-map",description:"缩略图",order:23},{id:"export",type:"export",group:"tools",icon:"flow-canvas-icon canvas-xiazai",description:"导出为图片",order:24}],a=[{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}],r=[{id:"reset",type:"reset",group:"reset",icon:"flow-canvas-icon canvas-reset-1_1",description:"重置视图",order:40}];return[...[...o,...n].filter(l=>!t.has(l.type)),...a,...r]}const Kt={class:"flow-canvas-toolbar"},Zt={key:0,class:"flow-canvas-toolbar__separator"},Jt={class:"flow-canvas-toolbar__group"},eo={key:0,class:"flow-canvas-toolbar__zoom-display"},to=["data-description","disabled","onClick"],oo=["textContent"],no=i.defineComponent({__name:"canvas-toolbar",props:{items:{},exclude:{},editor:{}},setup(s){const e=s,t=i.computed(()=>e.items?e.items:qe({exclude:e.exclude})),o=i.ref(1);let n=null;i.watch(()=>e.editor.api.value,g=>{n?.(),n=null,g&&(o.value=g.getZoom(),n=g.onGraphEvent("scale",()=>{o.value=g.getZoom()}))},{immediate:!0}),i.onScopeDispose(()=>{n?.()});const a=i.computed(()=>`${Math.round(o.value*100)}%`),r=i.computed(()=>e.editor.api.value?{api:e.editor.api.value,flowModel:e.editor.flowModel.value,history:e.editor.history,mode:e.editor.mode.value}:null);function d(g){return g.visible===!1?!1:typeof g.visible=="function"?r.value?g.visible(r.value):!1:!0}function l(g){return g.type==="select"?e.editor.selectionMode.value:!1}function h(g){return!r.value||g.disabled===!0?!0:typeof g.disabled=="function"?g.disabled(r.value):g.type==="undo"?!e.editor.history.canUndo.value:g.type==="redo"?!e.editor.history.canRedo.value:!1}function c(g){if(!r.value||h(g))return;if(g.onClick){g.onClick(r.value);return}const{api:N}=r.value;switch(g.type){case"undo":e.editor.history.undo();break;case"redo":e.editor.history.redo();break;case"zoom-in":N.zoomIn(),o.value=N.getZoom();break;case"zoom-out":N.zoomOut(),o.value=N.getZoom();break;case"fit":N.zoomToFit();break;case"reset":N.zoomTo(1),N.scrollToOrigin(),o.value=1;break;case"export":N.exportAsImage().then(k=>{const M=URL.createObjectURL(k),b=document.createElement("a");b.href=M,b.download="canvas-export.png",b.click(),URL.revokeObjectURL(M)}).catch(k=>{console.warn("[flow-canvas] Export failed:",k)});break;case"select":e.editor.setSelectionMode(!e.editor.selectionMode.value);break;case"search":case"auto-layout":case"minimap":console.warn(`[flow-canvas] "${g.type}" toolbar item has no built-in handler. Provide an onClick callback.`);break;default:g.type!=="custom"&&console.warn(`[flow-canvas] No default handler for toolbar type "${g.type}". Provide an onClick handler.`);break}}const m=i.computed(()=>t.value.filter(d)),p=i.computed(()=>{const g=new Map,N=[];for(const k of m.value){const M=k.group??"default";g.has(M)||(g.set(M,[]),N.push(M)),g.get(M).push(k)}return N.map(k=>({name:k,items:g.get(k)})).filter(k=>k.items.length>0)});return(g,N)=>(i.openBlock(),i.createElementBlock("div",Kt,[(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(p.value,(k,M)=>(i.openBlock(),i.createElementBlock(i.Fragment,{key:k.name},[M>0?(i.openBlock(),i.createElementBlock("div",Zt)):i.createCommentVNode("",!0),i.createElementVNode("div",Jt,[(i.openBlock(!0),i.createElementBlock(i.Fragment,null,i.renderList(k.items,b=>(i.openBlock(),i.createElementBlock(i.Fragment,{key:b.id},[b.type==="zoom-display"?(i.openBlock(),i.createElementBlock("span",eo,i.toDisplayString(a.value),1)):(i.openBlock(),i.createElementBlock("button",{key:1,class:i.normalizeClass(["flow-canvas-toolbar__btn",{"is-disabled":h(b),"is-active":l(b)}]),"data-description":b.description,disabled:h(b),onClick:S=>c(b)},[b.component?(i.openBlock(),i.createBlock(i.resolveDynamicComponent(b.component),{key:0})):b.icon?(i.openBlock(),i.createElementBlock("i",{key:1,class:i.normalizeClass(b.icon)},null,2)):(i.openBlock(),i.createElementBlock("span",{key:2,class:"flow-canvas-toolbar__text",textContent:i.toDisplayString(b.text??b.description??b.id)},null,8,oo))],10,to))],64))),128))])],64))),128))]))}}),so=re(no,[["__scopeId","data-v-51b5c98a"]]),io={class:"flow-canvas-default-node__ep-label"},ro={key:1,class:"flow-canvas-default-node__diamond"},ao={key:2,class:"flow-canvas-default-node__task-label"},lo=i.defineComponent({__name:"default-node",setup(s){const t=i.inject("getNode")?.(),o=i.computed(()=>t?.getData?.()??null),n=i.computed(()=>o.value?.label||o.value?.type||""),a={start:"canvas-kaishi",end:"canvas-stop","parallel-gateway":"canvas-bingxingwangguan","branch-gateway":"canvas-fenzhiwangguan","converge-gateway":"canvas-huijuwangguan","conditional-parallel-gateway":"canvas-tiaojianbingxingwangguan"},r=new Set(["start","end"]),d=new Set(["parallel-gateway","branch-gateway","converge-gateway","conditional-parallel-gateway"]),l=i.computed(()=>{const c=o.value?.type??"";return r.has(c)?"endpoint":d.has(c)?"gateway":"task"}),h=i.computed(()=>a[o.value?.type??""]??"");return(c,m)=>(i.openBlock(),i.createElementBlock("div",{class:i.normalizeClass(["flow-canvas-default-node",`is-${l.value}`])},[l.value==="endpoint"?(i.openBlock(),i.createElementBlock(i.Fragment,{key:0},[h.value?(i.openBlock(),i.createElementBlock("i",{key:0,class:i.normalizeClass([["flow-canvas-icon",h.value],"flow-canvas-default-node__ep-icon"])},null,2)):i.createCommentVNode("",!0),i.createElementVNode("span",io,i.toDisplayString(n.value),1)],64)):l.value==="gateway"?(i.openBlock(),i.createElementBlock("div",ro,[h.value?(i.openBlock(),i.createElementBlock("i",{key:0,class:i.normalizeClass([["flow-canvas-icon",h.value],"flow-canvas-default-node__gw-icon"])},null,2)):i.createCommentVNode("",!0)])):(i.openBlock(),i.createElementBlock("span",ao,i.toDisplayString(n.value),1))],2))}}),Ue=re(lo,[["__scopeId","data-v-c88cdae7"]]),co={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}},Le=(s,e)=>({stroke:e.hovered?"#3a84ff":"#abb5cc",strokeWidth:2});function Ve(){return{attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}}}function We(){return{manhattan:{router:{name:"manhattan",args:{padding:10,maxDirectionChange:90}},connector:{name:"rounded",args:{radius:8}},style:Le,x6EdgeConfig:Ve()},bezier:{connector:{name:"smooth"},style:Le,x6EdgeConfig:Ve()}}}function uo(s){const e=s?.nodeTypes??co,t={},o=[];for(const[r,d]of Object.entries(e)){const l=d.width??150,h=d.height??50;t[r]={component:Ue,getSize:()=>({width:l,height:h}),getPorts:()=>Ge()},o.push({type:r,label:d.label??r,icon:d.icon})}const n={...We(),...s?.edgeTypes},a=s?.defaultEdgeType??"manhattan";return{schema:{nodeTypes:t,defaultEdgeType:a,edgeTypes:n},paletteItems:o}}function fo(s){return{name:"connection-validator",priority:10,transformCommand(e,t,o){for(const n of e.commands){if(n.type!=="edge.add"&&n.type!=="edge.reconnect")continue;const a=o.flowModel.value,r=n.type==="edge.add"?n.edge.source.nodeId:n.source?.nodeId,d=n.type==="edge.add"?n.edge.target.nodeId:n.target?.nodeId;if(!r||!d)continue;const l=a.nodes[r],h=a.nodes[d];if(!l||!h)continue;const c=n.type==="edge.add"?n.edge.source.portId:n.source?.portId,m=n.type==="edge.add"?n.edge.target.portId:n.target?.portId,p=c?l.ports?.find(b=>b.id===c):void 0,g=m?h.ports?.find(b=>b.id===m):void 0,N=n.type==="edge.reconnect"?n.edgeId:void 0,k=Object.values(a.edges).filter(b=>b.id!==N),M=s({flowModel:a,sourceNode:l,targetNode:h,sourcePort:p,targetPort:g,existingEdges:k});if(!M.valid)return{rejected:!0,reason:M.reason??"Connection validation failed",code:"validation_failed"}}return e}}}function po(s){const{rubberband:e=!0,multiple:t=!0,movable:o=!0}=s??{};return{name:"selection",priority:90,async attachRuntime(n){const{Selection:a}=await import("@antv/x6-plugin-selection");n.graph.use(new a({enabled:!0,rubberband:e,multiple:t,movable:o,showNodeSelectionBox:!0,filter:r=>!(r.isNode()&&(!n.graph.isRubberbandEnabled?.()||(r.getData?.()??{})._selectable===!1))}))}}}function go(s){const{tolerance:e=10,color:t="#3a84ff"}=s??{};let o=null;return{name:"snapline",priority:90,async attachRuntime(n){const{Snapline:a}=await import("@antv/x6-plugin-snapline");n.graph.use(new a({enabled:!0,tolerance:e,className:"flow-canvas-snapline"})),o=document.createElement("style"),o.textContent=`.flow-canvas-snapline line { stroke: ${t} !important; }`,document.head.appendChild(o)},detachRuntime(){o?.remove(),o=null}}}function ho(s){let e=null;return{name:"minimap",priority:90,async attachRuntime(t){if(!s?.container)return;e=s.container;const{MiniMap:o}=await import("@antv/x6-plugin-minimap");t.graph.use(new o({container:s.container,width:s.width??200,height:s.height??160}))},detachRuntime(){e=null},provideToolbarItems(){return[{id:"minimap",type:"minimap",tooltip:"小地图",order:100,visible:!!s?.container,onClick(){if(!e)return;const t=e.style.display==="none";e.style.display=t?"":"none"}}]}}}function vo(){let s=null,e=0;return{name:"clipboard",priority:90,onKeyboardShortcut(t,o){const n=t.metaKey||t.ctrlKey;if(n&&t.key==="c"){const a=o.graph.getSelectedCells?.()??[];if(!a.length)return!1;const r=o.flowModel.value,d=new Set(a.filter(c=>c.isNode()).map(c=>c.id)),l=[...d].map(c=>r.nodes[c]).filter(Boolean);if(!l.length)return!1;const h=Object.values(r.edges).filter(c=>d.has(c.source.nodeId)&&d.has(c.target.nodeId));return s={nodes:l,edges:h},e=0,!0}if(n&&t.key==="v"){if(!s?.nodes.length)return!1;e++;const a=e*30,r=new Map,d=[];for(const l of s.nodes){const h=`${l.id}_cp${G().slice(0,6)}`;r.set(l.id,h),d.push({type:"node.add",node:{...l,id:h,position:{x:l.position.x+a,y:l.position.y+a},payload:l.payload?{...l.payload}:{},extensions:l.extensions?{...l.extensions}:void 0}})}for(const l of s.edges){const h=r.get(l.source.nodeId),c=r.get(l.target.nodeId);!h||!c||d.push({type:"edge.add",edge:{...l,id:`${l.id}_cp${G().slice(0,6)}`,source:{...l.source,nodeId:h},target:{...l.target,nodeId:c},labels:l.labels?.map(m=>({...m,id:`${m.id}_cp${G().slice(0,6)}`})),payload:l.payload?{...l.payload}:{}}})}return d.length&&o.executeCommand({id:G(),source:"user:keyboard",label:"粘贴",timestamp:Date.now(),commands:d}),!0}return!1}}}exports.CanvasConstraintError=Y;exports.CanvasLayout=Xt;exports.CanvasNodePalette=He;exports.CanvasRuntime=Ot;exports.CanvasSchemaError=Oe;exports.CanvasToolbar=so;exports.DefaultNode=Ue;exports.NodeActionsToolbar=je;exports.NodeQuickAddPopover=Fe;exports.applyCanvasCommand=be;exports.clipboardPlugin=vo;exports.connectionValidatorPlugin=fo;exports.createBuiltinEdgeTypes=We;exports.createCanvasHistory=ze;exports.createDefaultSchema=uo;exports.createDefaultToolbarItems=qe;exports.createEmptyFlowModel=st;exports.generateId=G;exports.minimapPlugin=ho;exports.selectionPlugin=po;exports.snaplinePlugin=go;exports.useCanvasEditor=kt;
|
|
1
|
+
"use strict";var Fe=Object.create;var we=Object.defineProperty;var Ge=Object.getOwnPropertyDescriptor;var Ue=Object.getOwnPropertyNames;var je=Object.getPrototypeOf,We=Object.prototype.hasOwnProperty;var Xe=(s,e,t,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let n of Ue(e))!We.call(s,n)&&n!==t&&we(s,n,{get:()=>e[n],enumerable:!(r=Ge(e,n))||r.enumerable});return s};var he=(s,e,t)=>(t=s!=null?Fe(je(s)):{},Xe(e||!s||!s.__esModule?we(t,"default",{value:s,enumerable:!0}):t,s));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const o=require("vue"),Ke=require("@antv/x6"),Ye=require("@antv/x6-vue-shape"),Qe=require("@antv/x6-plugin-selection"),Ze=require("@antv/x6-plugin-minimap");function Je(){return{version:"1.0",nodes:{},edges:{}}}class ee extends Error{constructor(e){super(e),this.name="CanvasConstraintError"}}class Ae extends Error{constructor(e){super(e),this.name="CanvasSchemaError"}}function fe(s,e,t){if(e.length===0){if(t===void 0)return;if(typeof t!="object"||t===null||Array.isArray(t))throw new Error("Root value of payload/extensions/meta must be an object or undefined");return t}const r=s?{...s}:{};let n=r;for(let a=0;a<e.length-1;a++){const c=e[a],l=n[c];l&&typeof l=="object"&&!Array.isArray(l)?n[c]={...l}:n[c]={},n=n[c]}const i=e[e.length-1];return t===void 0?delete n[i]:n[i]=t,r}function ue(s,e){switch(e.type){case"node.add":return et(s,e.node);case"node.move":return tt(s,e.nodeId,e.position);case"node.remove":return ot(s,e.nodeId);case"node.update":return nt(s,e.nodeId,e.patch);case"node.set-payload":return st(s,e.nodeId,e.path,e.value);case"node.set-extensions":return rt(s,e.nodeId,e.path,e.value);case"edge.add":return it(s,e.edge);case"edge.remove":return at(s,e.edgeId);case"edge.reconnect":return lt(s,e.edgeId,e.source,e.target);case"edge.update":return ct(s,e.edgeId,e.patch);case"edge.set-payload":return dt(s,e.edgeId,e.path,e.value);case"edge.label.update":return ut(s,e.edgeId,e.labelId,e.patch);case"model.set-meta":return ft(s,e.path,e.value);default:throw new ee(`Unknown command type: ${e.type}`)}}function ae(s,e){const t=s.nodes[e];if(!t)throw new ee(`Node "${e}" does not exist`);return t}function le(s,e){const t=s.edges[e];if(!t)throw new ee(`Edge "${e}" does not exist`);return t}function re(s,e,t){const r=s.nodes[e.nodeId];if(!r)throw new ee(`${t} node "${e.nodeId}" does not exist`);if(e.portId&&r.ports&&!r.ports.some(i=>i.id===e.portId))throw new ee(`${t} port "${e.portId}" not found on node "${e.nodeId}"`)}function pe(s,e,t){return{...s,nodes:{...s.nodes,[e]:t}}}function ge(s,e,t){return{...s,edges:{...s.edges,[e]:t}}}function et(s,e){if(s.nodes[e.id])throw new ee(`Node id "${e.id}" already exists`);return{...s,nodes:{...s.nodes,[e.id]:e}}}function tt(s,e,t){const r=ae(s,e);return pe(s,e,{...r,position:t})}function ot(s,e){ae(s,e);const{[e]:t,...r}=s.nodes,n={};for(const[i,a]of Object.entries(s.edges))a.source.nodeId!==e&&a.target.nodeId!==e&&(n[i]=a);return{...s,nodes:r,edges:n}}function nt(s,e,t){const r=ae(s,e);return pe(s,e,{...r,...t,id:r.id})}function st(s,e,t,r){const n=ae(s,e),i=fe(n.payload,t,r);return pe(s,e,{...n,payload:i})}function rt(s,e,t,r){const n=ae(s,e),i=fe(n.extensions,t,r);return pe(s,e,{...n,extensions:i})}function it(s,e){if(s.edges[e.id])throw new ee(`Edge id "${e.id}" already exists`);if(re(s,e.source,"Source"),re(s,e.target,"Target"),e.labels){const t=new Set;for(const r of e.labels){if(t.has(r.id))throw new ee(`Duplicate label id "${r.id}" in edge "${e.id}"`);t.add(r.id)}}return{...s,edges:{...s.edges,[e.id]:e}}}function at(s,e){le(s,e);const{[e]:t,...r}=s.edges;return{...s,edges:r}}function lt(s,e,t,r){const n=le(s,e),i=t??n.source,a=r??n.target;return re(s,i,"Source"),re(s,a,"Target"),ge(s,e,{...n,source:i,target:a})}function ct(s,e,t){const r=le(s,e),n={...r,...t,id:r.id};return t.source&&re(s,n.source,"Source"),t.target&&re(s,n.target,"Target"),ge(s,e,n)}function dt(s,e,t,r){const n=le(s,e),i=fe(n.payload,t,r);return ge(s,e,{...n,payload:i})}function ut(s,e,t,r){const n=le(s,e);if(!n.labels)throw new ee(`Edge "${e}" has no labels`);const i=n.labels.findIndex(c=>c.id===t);if(i===-1)throw new ee(`Label "${t}" not found in edge "${e}"`);const a=[...n.labels];return a[i]={...a[i],...r,id:t},ge(s,e,{...n,labels:a})}function ft(s,e,t){const r=fe(s.meta,e,t);return{...s,meta:r}}function Pe(s,e){const t=e?.maxHistorySize??100,r=o.ref(s),n=[],i=[],a=o.ref(!1),c=o.ref(!1);function l(){a.value=n.length>0,c.value=i.length>0}function g(C){const M=r.value;let D=M;for(const T of C.commands)D=ue(D,T);return n.push({snapshot:M,envelope:C}),n.length>t&&n.shift(),i.length=0,r.value=D,l(),D}function u(){const C=n.pop();return C?(i.push({snapshot:r.value,envelope:C.envelope}),r.value=C.snapshot,l(),C.snapshot):null}function h(){const C=i.pop();if(!C)return null;n.push({snapshot:r.value,envelope:C.envelope});let M=r.value;for(const D of C.envelope.commands)M=ue(M,D);return r.value=M,l(),M}function f(){n.length=0,i.length=0,l()}function y(){return r.value}function m(C){r.value=C,f()}return{currentFlowModel:r,execute:g,undo:u,redo:h,canUndo:a,canRedo:c,get undoStack(){return n.map(C=>C.envelope)},get redoStack(){return i.map(C=>C.envelope)},clear:f,createSnapshot:y,replaceFlowModel:m}}function pt(s){return s!==null&&typeof s=="object"&&s.rejected===!0}class gt{plugins=[];editorContext=null;runtimeCtx=null;runtimeVersion=0;install(e,t){this.plugins=[...e].sort((r,n)=>(r.priority??100)-(n.priority??100)),this.editorContext=t;for(const r of this.plugins)r.install?.(t)}attachRuntime(e){const t=++this.runtimeVersion;this.runtimeCtx=e;const r=this.createSafeRuntimeContext(e,t);for(const n of this.plugins)n.attachRuntime?.(r)}detachRuntime(){for(const e of[...this.plugins].reverse())e.detachRuntime?.();this.runtimeCtx=null}createSafeRuntimeContext(e,t){const r=this,n=new Proxy(e.graph,{get(i,a,c){const l=Reflect.get(i,a,c);return a==="use"&&typeof l=="function"?function(...u){if(r.runtimeVersion===t)return l.apply(i,u)}:l}});return{...e,graph:n}}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 t=e;for(const r of this.plugins){if(!r.transformCommand)continue;const n=this.createPreview(t),i=r.transformCommand(t,n,this.editorContext);if(i===null)return{rejected:!0,error:{code:"plugin_rejected",reason:"",source:r.name}};if(pt(i))return{rejected:!0,error:{code:i.code??"plugin_rejected",reason:i.reason,source:r.name}};t=i}return{envelope:t}}afterCommand(e,t,r){if(this.editorContext)for(const n of this.plugins)n.afterCommand?.(e,t,r,this.editorContext)}dispatchUiEvent(e){if(this.runtimeCtx)for(const t of this.plugins)t.onUiEvent?.(e,this.runtimeCtx)}dispatchSelectionChange(e){if(this.runtimeCtx)for(const t of this.plugins)t.onSelectionChange?.(e,this.runtimeCtx)}dispatchKeyboardShortcut(e){if(!this.runtimeCtx)return!1;for(const t of this.plugins)if(t.onKeyboardShortcut?.(e,this.runtimeCtx))return!0;return!1}collectContextMenuItems(e){if(!this.runtimeCtx)return[];const t=[];for(const r of this.plugins){const n=r.onBlankContextMenu?.(e,this.runtimeCtx);n&&t.push(...n)}return t}collectToolbarItems(){if(!this.editorContext)return[];const e=new Map;for(const t of this.plugins){const r=t.provideToolbarItems?.(this.editorContext);if(r)for(const n of r)e.set(n.id,n)}return[...e.values()].sort((t,r)=>(t.order??0)-(r.order??0))}collectNodeDecorations(e){if(!this.editorContext)return;let t;for(const r of this.plugins){const n=r.decorateNode?.(e,this.editorContext);n&&(t=t?{...t,...n}:n)}return t}collectEdgeDecorations(e){if(!this.editorContext)return;let t;for(const r of this.plugins){const n=r.decorateEdge?.(e,this.editorContext);n&&(t=t?{...t,...n}:n)}return t}collectExtendedApi(){if(!this.runtimeCtx)return{};const e={};for(const t of this.plugins){const r=t.extendApi?.(this.runtimeCtx.api,this.runtimeCtx);r&&Object.assign(e,r)}return e}createPreview(e){const t=this.editorContext;return{previewFlowModel(r){const n=r??e.commands;let i=t.flowModel.value;for(const a of n)i=ue(i,a);return i}}}}let ht=0;function j(){const s=Date.now().toString(36),e=Math.random().toString(36).substring(2,8);return`${s}-${e}-${++ht}`}const ye=()=>j();function vt(s){const{schema:e,plugins:t=[],historyOptions:r}=s,n=s.idGenerator??ye,i={version:"1.0",...s.initialFlowModel},a=Pe(i,r),c=o.ref(s.mode??"edit"),l=o.ref(!1),g=o.ref(null),u=o.ref([]),h={},f=new gt;function y(D,T,O,G="user:toolbar"){const R={id:`history-${Date.now()}`,source:G,label:D,timestamp:Date.now(),commands:[]};f.afterCommand(R,T,O),u.value=f.collectToolbarItems(),s.onCommandResult?.({status:"applied",envelope:R,flowModel:O}),s.onFlowModelChange?.({flowModel:O,prevFlowModel:T,envelope:R,source:G})}const m={execute:a.execute,undo(){const D=a.currentFlowModel.value,T=a.undo();return T&&y("撤销",D,T),T},redo(){const D=a.currentFlowModel.value,T=a.redo();return T&&y("重做",D,T),T},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(D){const T=a.currentFlowModel.value;a.replaceFlowModel(D),y("替换 FlowModel",T,D,"system:replace")}},C={flowModel:o.computed(()=>a.currentFlowModel.value),history:m,schema:e,mode:c,idGenerator:n,executeCommand:M,replaceFlowModel(D){m.replaceFlowModel(D)},setMode(D){c.value=D},selectionMode:l,setSelectionMode(D){l.value=D},api:g,toolbarItems:u,extendedApi:h,_pluginManager:f,_emitUiEvent:D=>{f.dispatchUiEvent(D)}};f.install(t,{flowModel:C.flowModel,history:m,schema:e,mode:c,idGenerator:n,executeCommand:M}),u.value=f.collectToolbarItems(),o.onScopeDispose(()=>{f.dispose()});function M(D){const T=f.transformCommand(D);if("rejected"in T){const R={status:"rejected",envelope:D,error:T.error};return s.onCommandResult?.(R),R}const O=T.envelope,G=a.currentFlowModel.value;try{const R=a.execute(O),q={status:"applied",envelope:O,flowModel:R};return f.afterCommand(O,G,R),u.value=f.collectToolbarItems(),s.onCommandResult?.(q),s.onFlowModelChange?.({flowModel:R,prevFlowModel:G,envelope:O,source:O.source}),q}catch(R){if(R instanceof ee){const q={status:"invalid",envelope:O,error:{code:"constraint_violated",reason:R.message,source:"engine"}};return s.onCommandResult?.(q),q}throw R}}return C}const mt=["top","right","bottom","left"];function Te(){return mt.map(s=>({id:s,group:s}))}function be(s,e){return e?.(s)??s.ports??Te()}const ve=-1,yt="flow-canvas-node-ring-target",ke="flow-canvas-node-ring-target--decorated",Ee="flow-canvas-node-ring-target--pulse",bt="linear-gradient(135deg, #cadcfa 0%, #cee0ff 100%)";class wt{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;constructor(e,t,r,n,i,a){this.graph=e,this.schema=t,this.shapeRegistry=r,this.resolveNodeDecoration=n,this.resolveEdgeDecoration=i,this.resolveCanvasContext=a}syncFlowModel(e){if(!this.syncing){this.syncing=!0,this.lastModel=e;try{const t=this.resolveNodes(e),r=this.resolveEdges(e);this.syncNodes(t),this.syncEdges(r,e)}finally{this.syncing=!1}}}get isSyncing(){return this.syncing}saveNodeDefaultAttrs(e,t){const n=t.x6CellConfig?.attrs?.body;if(!n)return;const i={};let a=!1;n.stroke!==void 0&&(i.stroke=n.stroke,a=!0),n.strokeWidth!==void 0&&(i.strokeWidth=n.strokeWidth,a=!0),a&&this.nodeDefaultAttrs.set(e,i)}saveEdgeDefaultAttrs(e,t){const n=t?.x6EdgeConfig?.attrs?.line;if(!n)return;const i={};let a=!1;n.stroke!==void 0&&(i.stroke=n.stroke,a=!0),n.strokeWidth!==void 0&&(i.strokeWidth=n.strokeWidth,a=!0),n.strokeDasharray!==void 0&&(i.strokeDasharray=n.strokeDasharray,a=!0),a&&this.edgeDefaultAttrs.set(e,i)}restoreNodeAttr(e,t,r){const n=this.nodeDefaultAttrs.get(e.id)?.[r];if(n!==void 0)e.setAttrByPath(t,n);else{const i=r==="stroke"?"none":0;e.setAttrByPath(t,i)}}restoreEdgeAttr(e,t,r){const n=this.edgeDefaultAttrs.get(e.id)?.[r];n!==void 0?e.setAttrByPath(t,n):e.removeAttrByPath(t)}getNodeRingTarget(e){return e?e.querySelector(".flow-canvas-highlight-target")??e.querySelector(".flow-canvas-node-surface > :first-child"):null}syncEdgeMarker(e,t,r){const i=t?.x6EdgeConfig?.attrs?.line?.[r],a=`line/${r}`;e.removeAttrByPath(a),i!==void 0&&e.setAttrByPath(a,i)}dispose(){this.knownNodeIds.clear(),this.knownEdgeIds.clear()}resolveNodes(e){const t=new Map;for(const[r,n]of Object.entries(e.nodes)){const i=this.schema.nodeTypes[n.type];if(!i)throw new Ae(`Unknown node type "${n.type}" for node "${r}". 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(n.type,i.component),c=i.getSize(n),l=be(n,i.getPorts);t.set(r,{model:n,definition:i,shapeName:a,size:c,ports:l})}return t}resolveEdges(e){const t=new Map;for(const[r,n]of Object.entries(e.edges)){const i=n.type??this.schema.defaultEdgeType??"default",a=this.schema.edgeTypes?.[i];t.set(r,{model:n,definition:a})}return t}syncNodes(e){const t=new Set(e.keys());for(const r of this.knownNodeIds)if(!t.has(r)){const n=this.graph.getCellById(r);n&&this.graph.removeCell(n),this.knownNodeIds.delete(r),this.defaultHighlightedNodeIds.delete(r),this.prevNodeDecorationClasses.delete(r),this.prevNodeDecorationColors.delete(r),this.nodeDefaultAttrs.delete(r)}for(const[r,n]of e){const i=this.graph.getCellById(r);i?this.updateExistingNode(i,n):this.addNewNode(r,n)}}updateExistingNode(e,t){const{model:r,size:n,ports:i,definition:a}=t;if(e.getData()?.type!==r.type){this.graph.removeCell(e),this.addNewNode(e.id,t);return}const l=e.getPosition();(l.x!==r.position.x||l.y!==r.position.y)&&e.setPosition(r.position.x,r.position.y);const g=e.getSize();(g.width!==n.width||g.height!==n.height)&&e.setSize(n.width,n.height,{silent:!0}),this.syncNodePorts(e,i),e.setData({...r}),this.applyNodeBehavior(e,r,a),this.applyNodeHighlightAndDecoration(e,r)}syncNodePorts(e,t){const r=e.getPorts(),n=new Set(t.map(a=>a.id)),i=new Set(r.map(a=>a.id));for(const a of r)a.id&&!n.has(a.id)&&e.removePort(a.id);for(const a of t)i.has(a.id)||e.addPort({id:a.id,group:a.group,...a.x6PortConfig})}addNewNode(e,t){const{model:r,shapeName:n,size:i,ports:a,definition:c}=t,l={id:r.id,shape:n,x:r.position.x,y:r.position.y,width:i.width,height:i.height,data:{...r},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(u=>({id:u.id,group:u.group,...u.x6PortConfig}))},...c.x6CellConfig};this.graph.addNode(l),this.knownNodeIds.add(e),this.saveNodeDefaultAttrs(e,c);const g=this.graph.getCellById(e);g&&(this.applyNodeBehavior(g,r,c),this.applyNodeHighlightAndDecoration(g,r))}applyNodeBehavior(e,t,r){if(!r.getBehavior)return;const n=this.resolveCanvasContext?.();if(!n)return;const i=r.getBehavior(t,n);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,t){const r=new Set(e.keys());for(const n of this.knownEdgeIds)if(!r.has(n)){const i=this.graph.getCellById(n);i&&this.graph.removeCell(i),this.knownEdgeIds.delete(n),this.defaultHighlightedEdgeIds.delete(n),this.prevEdgeDecorationClasses.delete(n),this.prevEdgeDecorationColors.delete(n),this.prevEdgeStyleIds.delete(n),this.edgeDefaultAttrs.delete(n)}for(const[n,i]of e){const a=this.graph.getCellById(n),{model:c,definition:l}=i;a?(this.updateExistingEdge(a,c,l,t),this.knownEdgeIds.has(n)||(this.knownEdgeIds.add(n),this.saveEdgeDefaultAttrs(n,l))):this.addNewEdge(n,c,l)}}updateExistingEdge(e,t,r,n){const i=e.getSource(),a=e.getTarget();if((i.cell!==t.source.nodeId||i.port!==t.source.portId)&&e.setSource({cell:t.source.nodeId,port:t.source.portId}),(a.cell!==t.target.nodeId||a.port!==t.target.portId)&&e.setTarget({cell:t.target.nodeId,port:t.target.portId}),r?.router){const c=typeof r.router=="string"?{name:r.router}:r.router;e.setRouter(c)}if(r?.connector){const c=typeof r.connector=="string"?{name:r.connector}:r.connector;e.setConnector(c)}this.syncEdgeMarker(e,r,"sourceMarker"),this.syncEdgeMarker(e,r,"targetMarker"),this.syncEdgeLabels(e,t),e.getZIndex()!==ve&&e.setZIndex(ve),e.setData({...t},{silent:!0}),this.applyEdgeStyleAndDecoration(e,t,r)}syncEdgeLabels(e,t){if(!t.labels?.length){e.getLabels().length>0&&e.setLabels([]);return}const r=t.labels.map(n=>({attrs:{label:{text:n.text??""}},position:n.position!=null?{distance:n.position}:void 0}));e.setLabels(r)}addNewEdge(e,t,r){const n={id:t.id,source:{cell:t.source.nodeId,port:t.source.portId},target:{cell:t.target.nodeId,port:t.target.portId},data:{...t},zIndex:ve};r?.router&&(n.router=typeof r.router=="string"?{name:r.router}:r.router),r?.connector&&(n.connector=typeof r.connector=="string"?{name:r.connector}:r.connector),r?.x6EdgeConfig&&Object.assign(n,r.x6EdgeConfig),t.labels?.length&&(n.labels=t.labels.map(a=>({attrs:{label:{text:a.text??""}},position:a.position!=null?{distance:a.position}:void 0}))),this.graph.addEdge(n),this.knownEdgeIds.add(e),this.saveEdgeDefaultAttrs(e,r);const i=this.graph.getCellById(e);i&&this.applyEdgeStyleAndDecoration(i,t,r)}refreshEdgeStyles(){if(this.lastModel)for(const[e,t]of Object.entries(this.lastModel.edges)){const r=this.graph.getCellById(e);if(!r?.isEdge())continue;const n=t.type??this.schema.defaultEdgeType??"default",i=this.schema.edgeTypes?.[n];this.applyEdgeStyleAndDecoration(r,t,i)}}refreshNodeHighlights(){if(this.lastModel)for(const[e,t]of Object.entries(this.lastModel.nodes)){const r=this.graph.getCellById(e);r?.isNode()&&this.applyNodeHighlightAndDecoration(r,t)}}applyNodeHighlightAndDecoration(e,t){const r=this.highlightedNodeIds.has(e.id),n=this.resolveNodeDecoration?.(t),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)),n?.className&&(i?.classList.add(n.className),this.prevNodeDecorationClasses.set(e.id,n.className));const l=n?.borderColor,u=l??(r?"#3a84ff":void 0),h=this.prevNodeDecorationColors.has(e.id)||this.defaultHighlightedNodeIds.has(e.id);u?(e.setAttrByPath("body/stroke",u),e.setAttrByPath("body/strokeWidth",2)):h&&(this.restoreNodeAttr(e,"body/stroke","stroke"),this.restoreNodeAttr(e,"body/strokeWidth","strokeWidth")),a&&(a.classList.add(yt),l?(a.classList.add(ke),a.style.setProperty("--flow-canvas-node-decoration-ring-background",l),a.style.setProperty("--flow-canvas-node-decoration-ring-opacity","0.95")):(a.classList.remove(ke),a.style.removeProperty("--flow-canvas-node-decoration-ring-background"),a.style.removeProperty("--flow-canvas-node-decoration-ring-opacity")),r?(a.classList.add(Ee),a.style.setProperty("--flow-canvas-node-pulse-ring-background",l??bt),a.style.setProperty("--flow-canvas-node-pulse-ring-opacity","0.95")):(a.classList.remove(Ee),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),r&&!l?this.defaultHighlightedNodeIds.add(e.id):this.defaultHighlightedNodeIds.delete(e.id)}setHoveredEdge(e){this.hoveredEdgeId=e}setHighlightedNodes(e){this.highlightedNodeIds=new Set(e)}setHighlightedEdges(e){this.highlightedEdgeIds=new Set(e)}applyEdgeStyleAndDecoration(e,t,r){const n=this.highlightedEdgeIds.has(e.id),i=this.resolveEdgeDecoration?.(t),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,g;if(r?.style){const m=this.graph.isSelected?.(e)??!1,C=this.hoveredEdgeId===e.id,M=r.style(t,{selected:m,highlighted:n,hovered:C});c=M.stroke,l=M.strokeWidth,g=M.strokeDasharray}const u=!r?.style&&n?"#3a84ff":void 0,h=i?.strokeColor,f=h??c??u,y=!!r?.style||this.prevEdgeDecorationColors.has(e.id)||this.defaultHighlightedEdgeIds.has(e.id)||this.prevEdgeStyleIds.has(e.id);f?e.setAttrByPath("line/stroke",f):y&&this.restoreEdgeAttr(e,"line/stroke","stroke"),r?.style?(this.prevEdgeStyleIds.add(e.id),l?e.setAttrByPath("line/strokeWidth",l):this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),g?e.setAttrByPath("line/strokeDasharray",g):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),u?this.defaultHighlightedEdgeIds.add(e.id):this.defaultHighlightedEdgeIds.delete(e.id)}}class kt{instanceId=j();registeredShapes=new Map;wrappedComponents=new Map;getShapeName(e){let t=this.registeredShapes.get(e);return t||(t=`flow-node-${this.instanceId}-${e}`,this.registeredShapes.set(e,t)),t}registerNodeType(e,t){const r=this.getShapeName(e);let n=this.wrappedComponents.get(e);return n||(n=o.defineComponent({name:`FlowCanvasNodeShape${e.replace(/(^|[-_])(\w)/g,(i,a,c)=>c.toUpperCase())}`,setup(){return()=>o.h("div",{class:"flow-canvas-node-surface"},[o.h(t)])}}),this.wrappedComponents.set(e,n)),Ye.register({shape:r,component:n,width:100,height:40}),r}dispose(){this.registeredShapes.clear(),this.wrappedComponents.clear()}}class Et{graph;onUiEvent;onCommand;flowModelRef;idGenerator;disposers=[];constructor(e,t,r,n,i){this.graph=e,this.onUiEvent=t,this.onCommand=r,this.flowModelRef=n,this.idGenerator=i??ye,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:t})=>{this.onUiEvent({type:"node.contextmenu",nodeId:e.id,position:{x:t.clientX,y:t.clientY}})}),this.on("edge:click",({edge:e,e:t})=>{const n=t.target?.closest?.(".x6-edge-label");if(n){const a=e.getData?.()?.labels??[],c=n.parentElement?.querySelectorAll(".x6-edge-label"),l=c?Array.from(c).indexOf(n):0,g=a[Math.max(0,l)];this.onUiEvent({type:"edge.label.click",edgeId:e.id,labelId:g?.id??`label-${l}`});return}this.onUiEvent({type:"edge.click",edgeId:e.id})}),this.on("blank:click",({e})=>{const t=this.graph.clientToLocal(e.clientX,e.clientY);this.onUiEvent({type:"blank.click",position:{x:t.x,y:t.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 t=e.getPosition();this.onCommand({id:j(),source:"user:drag",label:"移动节点",timestamp:Date.now(),commands:[{type:"node.move",nodeId:e.id,position:{x:t.x,y:t.y}}]})}),this.on("edge:connected",({edge:e,isNew:t})=>{const r=e.getSourceCell(),n=e.getTargetCell();if(!r||!n)return;const i=e.getSourcePortId(),a=e.getTargetPortId(),c=e.id in this.flowModelRef.value.edges;t&&!c?(this.graph.removeCell(e),this.onCommand({id:j(),source:"user:drag",label:"连线",timestamp:Date.now(),commands:[{type:"edge.add",edge:{id:this.idGenerator("edge"),source:{nodeId:r.id,portId:i??void 0},target:{nodeId:n.id,portId:a??void 0}}}]})):this.onCommand({id:j(),source:"user:drag",label:"重连",timestamp:Date.now(),commands:[{type:"edge.reconnect",edgeId:e.id,source:{nodeId:r.id,portId:i??void 0},target:{nodeId:n.id,portId:a??void 0}}]})}),this.on("edge:change:labels",({edge:e,current:t})=>{const n=e.getData?.()?.labels??[];if(!n.length||!t?.length)return;const i=[];for(let a=0;a<Math.min(n.length,t.length);a++){const c=t[a],l=n[a];if(!l?.id)continue;const g=typeof c.position=="object"?c.position?.distance:c.position;g!=null&&i.push({type:"edge.label.update",edgeId:e.id,labelId:l.id,patch:{position:g}})}i.length&&this.onCommand({id:j(),source:"user:drag",label:"拖动标签",timestamp:Date.now(),commands:i})})}on(e,t){this.graph.on(e,t),this.disposers.push(()=>this.graph.off(e,t))}}function Ct(s){function e(t){const r=s.getCellById(t);if(!r||!r.isNode())return null;const n=r,i=n.getPosition(),a=n.getSize(),c={x:i.x,y:i.y,width:a.width,height:a.height},l=s.localToGraph(c);return new DOMRect(l.x,l.y,l.width,l.height)}return{getNodeScreenRect:e}}function Re(s){return{nodeIds:s.filter(e=>e.isNode()).map(e=>e.id),edgeIds:s.filter(e=>e.isEdge()).map(e=>e.id)}}function xt(s,e){const t=[...e.nodeIds.map(i=>s.getCellById(i)),...e.edgeIds.map(i=>s.getCellById(i))].filter(i=>!!i);if(t.length===0)return null;const r=s.getCellsBBox(t);if(!r)return null;const n=s.localToGraph(r);return new DOMRect(n.x,n.y,n.width,n.height)}function Le(s,e,t){const r=s.nodeIds.filter(a=>{const c=e.nodes[a];if(!c)return!1;const l=t(c);return l.deletable!==!1&&l.deleteDisabled!==!0}),n=new Set(r),i=s.edgeIds.filter(a=>{const c=e.edges[a];return c?!n.has(c.source.nodeId)&&!n.has(c.target.nodeId):!1});return{nodeIds:r,edgeIds:i}}function Nt(s){return[...s.edgeIds.map(e=>({type:"edge.remove",edgeId:e})),...s.nodeIds.map(e=>({type:"node.remove",nodeId:e}))]}const It=100;function St({graph:s,overlayManager:e,executeCommand:t,schema:r,flowModel:n,getNodeBehavior:i,idGenerator:a,defaultInsertGap:c,getContextMenuItems:l,onHighlightChange:g,resolveNodeShape:u}){const h=a??ye;let f=[],y=[],m=null,C=!1,M=null;async function D(){if(C)return m;C=!0;try{const v=await import("@antv/x6-plugin-dnd"),d=v.Dnd??v.default;return d?(m=new d({target:s,scaled:!0,animation:!0,getDragNode:p=>p.clone(),getDropNode:p=>p.clone()}),m):null}catch{return console.warn("[flow-canvas] @antv/x6-plugin-dnd not available, add it to your dependencies"),null}}function T(){return new Promise(v=>{requestAnimationFrame(()=>requestAnimationFrame(()=>v()))})}const O=({node:v})=>{const d=v.getData?.();if(!d?._dndSessionId||d._dndSessionId!==M)return;M=null;const p=v.getPosition();s.removeNode(v.id);const{_dndSessionId:I,...S}=d,k=S.id||h("node");t({id:j(),source:"user:drag",label:"拖入节点",timestamp:Date.now(),commands:[{type:"node.add",node:{...S,id:k,position:{x:p.x,y:p.y}}}]})};s.on("node:added",O);function G(v){const d=r.nodeTypes[v.type];return be(v,d?.getPorts)}function R(v){return v??Re(s.getSelectedCells?.()??[])}function q(v,d,p,I,S){switch(v){case"left":return{x:d.position.x-S-I.width,y:d.position.y+(p.height-I.height)/2};case"top":return{x:d.position.x+(p.width-I.width)/2,y:d.position.y-S-I.height};case"bottom":return{x:d.position.x+(p.width-I.width)/2,y:d.position.y+p.height+S};default:return{x:d.position.x+p.width+S,y:d.position.y+(p.height-I.height)/2}}}function H(v,d,p){switch(v){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 N(v){switch(v){case"left":return"right";case"top":return"bottom";case"bottom":return"top";default:return"left"}}const L={zoomIn(){s.zoom(.1)},zoomOut(){s.zoom(-.1)},zoomTo(v){s.zoomTo(v)},zoomToFit(){s.zoomToFit({padding:40,maxScale:1.5})},getZoom(){return s.zoom()},centerContent(){s.centerContent()},scrollToOrigin(){s.translate(0,0)},scrollToNode(v){const d=s.getCellById(v);d&&s.centerCell(d)},getSelection(){return R()},getSelectionBounds(v){return xt(s,R(v))},selectNodes(v){const d=v.map(p=>s.getCellById(p)).filter(Boolean);s.select?.(d)},selectEdges(v){const d=v.map(p=>s.getCellById(p)).filter(Boolean);s.select?.(d)},clearSelection(){const v=s.getSelectedCells?.();v?.length&&s.unselect?.(v)},deleteSelection(v){const d=R(v?.selection),p=Le(d,n.value,i??(()=>({}))),I=Nt(p);if(I.length===0)return null;const S=t({id:j(),source:v?.source??"user:toolbar",label:v?.label??"删除选中",timestamp:Date.now(),commands:I});return S.status==="applied"&&v?.clearSelectionAfterApply!==!1&&L.clearSelection(),S},registerDndSource(v,d){const p=async I=>{const S=await D();if(!S)return;const k=j();M=k;const V=d(),Y=u?.(V.type),x=s.createNode({width:Y?.width??154,height:Y?.height??54,shape:Y?.shapeName??"rect",data:{...V,_dndSessionId:k}});S.start(x,I)};return v.addEventListener("mousedown",p),()=>{v.removeEventListener("mousedown",p)}},startConnection(v,d){const p=s.getCellById(v);if(!p?.isNode())return;const I=p,S=s.findViewByCell(I);if(!S)return;const k=S.findPortElem(d,"circle")??S.findPortElem(d);if(!k)return;const Y=(k.matches?.("[magnet]")?k:k.querySelector?.("[magnet]"))??k,x=Y.getBoundingClientRect(),A=x.left+x.width/2,b=x.top+x.height/2,B=new MouseEvent("mousedown",{clientX:A,clientY:b,button:0,buttons:1,bubbles:!0,cancelable:!0});Y.dispatchEvent(B)},async exportAsImage(v){const{domToBlob:d}=await import("modern-screenshot"),p=v?.padding??20,I=v?.backgroundColor??s.options.background?.color??"#ffffff",S=s.zoom(),k=s.translate(),V=s.getContentBBox(),Y=V.width/S,x=V.height/S;if(Y===0||x===0)return new Blob;const A=(V.x-k.tx)/S,b=(V.y-k.ty)/S,B=Math.ceil(Y+p*2),z=Math.ceil(x+p*2),U=document.createElement("div");U.style.cssText="position:fixed;left:-99999px;top:0;pointer-events:none;";const F=s.container.cloneNode(!0);F.style.width=`${B}px`,F.style.height=`${z}px`,F.style.overflow="visible";const Q=F.querySelector("svg");Q&&(Q.setAttribute("width",String(B)),Q.setAttribute("height",String(z)),Q.style.width=`${B}px`,Q.style.height=`${z}px`),F.querySelector(".x6-graph-svg-viewport")?.setAttribute("transform",`matrix(1,0,0,1,${-A+p},${-b+p})`),U.appendChild(F),document.body.appendChild(U);try{return await T(),await d(F,{width:B,height:z,backgroundColor:I,scale:v?.scale??window.devicePixelRatio,filter:te=>{if(te instanceof Element){const Z=te.getAttribute("class")??"";if(Z.includes("x6-widget-selection")||Z.includes("x6-widget-transform")||Z.includes("x6-graph-grid")||Z.includes("x6-graph-background"))return!1}return!0}})}catch(te){return console.warn("[flow-canvas] Export failed:",te),new Blob}finally{U.remove()}},highlightNodes(v){f=v,g?.(f,y)},highlightEdges(v){y=v,g?.(f,y)},clearHighlight(){f=[],y=[],g?.([],[])},overlay:e,getContextMenuItems(v){return l?.(v)??[]},insertNodeToRight(v,d,p){const I=n.value,S=I.nodes[v];if(!S)return{status:"invalid",envelope:{id:"",source:"user:toolbar",timestamp:Date.now(),commands:[]},error:{code:"constraint_violated",reason:`Source node "${v}" not found`,source:"api"}};const k=p?.gap??c??It,V=p?.direction??"right",Y=r.nodeTypes[S.type],x=r.nodeTypes[d.type],A=Y?.getSize(S)??{width:154,height:54},b=x?.getSize({...d,position:{x:0,y:0}})??{width:154,height:54},B=q(V,S,A,b,k),z=d.id||h("node"),U={...d,id:z,position:B},F=[{type:"node.add",node:U}],Q=H(V,b,k),W={x:B.x,y:B.y,width:b.width,height:b.height};for(const[Z,E]of Object.entries(I.nodes)){if(Z===v||Z===z)continue;const _=r.nodeTypes[E.type]?.getSize(E)??{width:154,height:54},$=W.x<E.position.x+_.width&&W.x+W.width>E.position.x,X=W.y<E.position.y+_.height&&W.y+W.height>E.position.y;$&&X&&F.push({type:"node.move",nodeId:Z,position:{x:E.position.x+Q.x,y:E.position.y+Q.y}})}if(p?.autoWireEdges){const Z=G(S),E=G(U),w=V,_=N(V),$=Z.find(K=>K.group===w),X=E.find(K=>K.group===_),oe=E.find(K=>K.group===w),J=$?Object.values(I.edges).find(K=>K.source.nodeId===v&&K.source.portId===$.id):Object.values(I.edges).find(K=>K.source.nodeId===v);if(J){const K=J.target;F.push({type:"edge.remove",edgeId:J.id}),F.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:v,portId:$?.id},target:{nodeId:z,portId:X?.id}}}),F.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:z,portId:oe?.id},target:K}})}else F.push({type:"edge.add",edge:{id:h("edge"),source:{nodeId:v,portId:$?.id},target:{nodeId:z,portId:X?.id}}})}const te={id:j(),source:p?.source??"user:toolbar",label:p?.label??"插入节点",timestamp:Date.now(),commands:F};return t(te)},onGraphEvent(v,d){return s.on(v,d),()=>s.off(v,d)},unsafeGetGraph(){return s}};return L}function _t(){const s=o.ref(null),e=o.ref(!1);let t=null,r=!1;function n(h){t&&(clearTimeout(t),t=null),s.value=h}function i(h=100){r||(t&&clearTimeout(t),t=setTimeout(()=>{s.value=null,t=null},h))}function a(){r=!0,t&&(clearTimeout(t),t=null)}function c(h=100){r=!1,i(h)}function l(){t&&(clearTimeout(t),t=null)}function g(){l(),r=!1,s.value=null}function u(){t&&clearTimeout(t)}return{hoveredNodeId:s,isDraggingNode:e,enter:n,leave:i,enterOverlay:a,leaveOverlay:c,cancelLeave:l,reset:g,cleanup:u}}const Ce=10,de=12;function xe(s,e){const t=s.getTotalLength();if(t===0)return{...e,length:0,totalLength:0};let r=s.getPointAtLength(0),n=1/0;const i=50,a=t/i;let c=0;for(let h=0;h<=i;h++){const f=h*a,y=s.getPointAtLength(f),m=(y.x-e.x)**2+(y.y-e.y)**2;m<n&&(n=m,r=y,c=f)}const l=Math.max(0,c-a),g=Math.min(t,c+a),u=(g-l)/20;for(let h=l;h<=g;h+=u){const f=s.getPointAtLength(h),y=(f.x-e.x)**2+(f.y-e.y)**2;y<n&&(n=y,r=f,c=h)}return{x:r.x,y:r.y,length:c,totalLength:t}}function Ne(s,e){return s<Ce||s>e-Ce}function Ie(s,e,t){const r=s.querySelectorAll(".x6-edge-label");for(const n of r){const i=n.getBoundingClientRect();if(e>=i.left-de&&e<=i.right+de&&t>=i.top-de&&t<=i.bottom+de)return!0}return!1}function Se(){const s="http://www.w3.org/2000/svg",e=document.createElementNS(s,"g");e.setAttribute("class","flow-canvas-edge-delete-tool"),e.style.cursor="pointer";const t=document.createElementNS(s,"rect");t.setAttribute("width","20"),t.setAttribute("height","20"),t.setAttribute("x","-10"),t.setAttribute("y","-10"),t.setAttribute("rx","4"),t.setAttribute("ry","4"),t.setAttribute("fill","#3a84ff"),e.appendChild(t);const r=document.createElementNS(s,"text");return r.setAttribute("font-family","flow-canvas"),r.setAttribute("font-size","16"),r.setAttribute("fill","#ffffff"),r.setAttribute("text-anchor","middle"),r.setAttribute("dominant-baseline","central"),r.textContent="",e.appendChild(r),e}function Mt(s){let e=null,t=null;function r(c,l){if(i(),t=c,l.target?.closest?.(".x6-edge-label"))return;const u=s.getCellById(c);if(!u?.isEdge())return;const h=s.findViewByCell(u);if(!h)return;const f=h.container.querySelector("path");if(!f)return;const y=s.clientToLocal(l.clientX,l.clientY),m=xe(f,y);if(Ne(m.length,m.totalLength)||Ie(h.container,l.clientX,l.clientY))return;const C=Se();C.setAttribute("transform",`translate(${m.x}, ${m.y})`),h.container.appendChild(C),e=C}function n(c){if(!t)return;if(c.target?.closest?.(".x6-edge-label")){e&&e.setAttribute("display","none");return}const g=s.getCellById(t);if(!g?.isEdge())return;const u=s.findViewByCell(g);if(!u)return;const h=u.container.querySelector("path");if(!h)return;const f=s.clientToLocal(c.clientX,c.clientY),y=xe(h,f);if(Ne(y.length,y.totalLength)||Ie(u.container,c.clientX,c.clientY))e&&e.setAttribute("display","none");else if(e)e.removeAttribute("display"),e.setAttribute("transform",`translate(${y.x}, ${y.y})`);else{const m=Se();m.setAttribute("transform",`translate(${y.x}, ${y.y})`),u.container.appendChild(m),e=m}}function i(){e&&(e.remove(),e=null),t=null}function a(c){c===t&&(e=null,t=null)}return{show:r,move:n,remove:i,handleEdgeRemoved:a}}function Dt(s){let e=null,t=0;function r(u){const h=u?"visible":"hidden";for(const f of s.getNodes())for(const y of f.getPorts())f.setPortProp(y.id,"attrs/circle/visibility",h)}function n(u){if(!e)for(const h of u.getPorts())u.setPortProp(h.id,"attrs/circle/visibility","visible")}function i(u){if(!e)for(const h of u.getPorts())u.setPortProp(h.id,"attrs/circle/visibility","hidden")}function a(u,h){if(!u.getTargetCell())if(e=u.id,h?.size)for(const f of s.getNodes()){const y=h.has(f.id)?"hidden":"visible";for(const m of f.getPorts())f.setPortProp(m.id,"attrs/circle/visibility",y)}else r(!0)}function c(){e=null,r(!1),t=Date.now()+300}function l(u){u===e&&(e=null,r(!1))}function g(){return!e&&Date.now()>=t}return{showNodePorts:n,hideNodePorts:i,handleEdgeAdded:a,handleEdgeConnected:c,handleEdgeRemoved:l,canShowEdgeTool:g}}function _e(s){return s==="top"||s==="right"||s==="bottom"||s==="left"}function Bt(s){const{editor:e,nodeHover:t,isSelectionModeActive:r,viewportVersion:n,getNodeBehavior:i,getInsertGap:a}=s,{isDraggingNode:c}=s,l=o.ref(null),g=o.ref(!1);let u=null,h=null,f=null;const y=o.computed(()=>({enabled:!0,portGroup:"right",...s.quickAddProp.value}));function m(){u&&(clearTimeout(u),u=null)}function C(){u&&clearTimeout(u),u=setTimeout(()=>{l.value=null,u=null},150)}function M(x){return g.value?!0:(m(),L(x)?(l.value=x,!0):(l.value=null,!1))}function D(){m(),t.enterOverlay()}function T(){C(),t.leaveOverlay()}function O(x){const A=e.schema.nodeTypes[x.type];return be(x,A?.getPorts)}function G(x,A){const b=y.value.getPort?.(x,A);if(!b)return null;const B=typeof b=="string"?b:b.id;return A.find(z=>z.id===B)??null}function R(x,A){const b=e.api.value?.overlay.getNodeScreenRect(x);if(!b)return null;switch(A){case"top":return{x:b.x+b.width/2,y:b.y};case"bottom":return{x:b.x+b.width/2,y:b.y+b.height};case"left":return{x:b.x,y:b.y+b.height/2};case"right":return{x:b.x+b.width,y:b.y+b.height/2};default:return null}}function q(x,A,b){if(!h)return R(x,b);const B=h.getCellById(x);if(B?.isNode()){const z=B,U=h.findViewByCell(z),F=U?.findPortElem(A,"circle")??U?.findPortElem(A);if(F){const Q=h.container.getBoundingClientRect(),W=F.getBoundingClientRect();return{x:W.left-Q.left+W.width/2,y:W.top-Q.top+W.height/2}}}return R(x,b)}function H(x){const A=O(x),b=G(x,A)??A.find(z=>z.group===y.value.portGroup)??null;if(!b)return null;const B=q(x.id,b.id,b.group);return B?{portId:b.id,portGroup:b.group,portPosition:B}:null}function N(x){const A=H(x),b=y.value.insertDirection;if(typeof b=="function"){const B=b(x,A?{id:A.portId,group:A.portGroup}:null);if(B)return B}else if(b)return b;return A&&_e(A.portGroup)?A.portGroup:_e(y.value.portGroup)?y.value.portGroup:"right"}function L(x){if(!y.value.enabled||e.mode.value!=="edit")return!1;const b=e.flowModel.value.nodes[x];return!b||i(b).quickAddEnabled===!1?!1:!!H(b)}const v=o.computed(()=>{if(n.value,!y.value.enabled)return null;const x=l.value;if(!x||c.value||!e.api.value||e.mode.value!=="edit"||r.value)return null;const b=e.flowModel.value.nodes[x];if(!b)return null;const B=i(b);if(B.quickAddEnabled===!1)return null;const z=H(b);return z?{node:b,...z,behavior:B}:null});function d(x){g.value=!0,v.value&&e._emitUiEvent({type:"node.quick-add",nodeId:x,position:v.value.portPosition})}function p(){g.value=!1}function I(x){const A=e.api.value;if(!A)return;const b=e.flowModel.value.nodes[x];if(!b)return;const B=H(b);B&&A.startConnection(x,B.portId)}function S(x,A){const b=e.api.value;if(!b)return;const B=A.id||e.idGenerator("node"),z={...A,id:B},U=e.flowModel.value.nodes[x];if(!U)return;b.insertNodeToRight(x,z,{autoWireEdges:!0,direction:N(U),gap:a(),source:"user:quick-add",label:"快捷插入节点"}).status==="applied"&&e._emitUiEvent({type:"node.action.quick-insert",sourceNodeId:x,newNodeId:B}),s.closePopover()}function k(x){if(!h)return;const A=h.getCellById(x);if(!A?.isNode())return;const b=A,B=e.flowModel.value.nodes[x];if(!B)return;const z=H(B);let U=!0;i(B).hidePortForQuickAdd===!1&&(U=!1);const Q=U&&!c.value&&!!z&&L(x);for(const W of b.getPorts()){const te=Q&&W.id===z?.portId?"hidden":"visible";b.setPortProp(W.id,"attrs/circle/visibility",te)}}function V(x,A){f?.(),h=x,f=o.watch([l,c],([b],[B])=>{if(B&&B!==b){const z=x.getCellById(B);z?.isNode()&&A(z)}b&&k(b)},{flush:"sync"})}o.watch(v,x=>{x||(g.value=!1)});function Y(){u&&clearTimeout(u),f?.(),f=null,h=null}return{quickAddNodeId:l,quickAddPopoverOpen:g,mergedConfig:y,data:v,enter:M,leave:C,cancelLeave:m,handleOverlayEnter:D,handleOverlayLeave:T,handleOpen:d,handleClose:p,handleStartDrag:I,handleInsert:S,isActiveForNode:L,syncNodePorts:k,attachRuntime:V,cleanup:Y}}function At(s){function e(n){return{id:s.idGenerator("node"),type:n.type,label:n.label,ports:n.ports?JSON.parse(JSON.stringify(n.ports)):void 0,payload:n.payload?JSON.parse(JSON.stringify(n.payload)):void 0,extensions:n.extensions?JSON.parse(JSON.stringify(n.extensions)):void 0}}function t(n,i,a){const c=s.api.value;switch(n){case"delete":return s.executeCommand({id:j(),source:"user:toolbar",label:"删除节点",timestamp:Date.now(),commands:[{type:"node.remove",nodeId:i}]}),s._emitUiEvent({type:"node.action.delete",nodeId:i}),!0;case"copy":{if(!c)break;const l=s.flowModel.value.nodes[i];if(!l)break;const g=e(l);c.insertNodeToRight(i,g,{autoWireEdges:!1,gap:a,label:"复制节点"}),s._emitUiEvent({type:"node.action.copy",sourceNodeId:i,newNodeId:g.id});break}case"copy-insert":{if(!c)break;const l=s.flowModel.value.nodes[i];if(!l)break;const g=e(l);c.insertNodeToRight(i,g,{autoWireEdges:!0,gap:a,label:"复制并插入节点"}),s._emitUiEvent({type:"node.action.copy-insert",sourceNodeId:i,newNodeId:g.id});break}case"disconnect":{const l=s.flowModel.value,g=Object.entries(l.edges).filter(([,u])=>{const h=u;return h.source.nodeId===i||h.target.nodeId===i}).map(([u])=>u);if(g.length===0)break;s.executeCommand({id:j(),source:"user:toolbar",label:"断开连线",timestamp:Date.now(),commands:g.map(u=>({type:"edge.remove",edgeId:u}))}),s._emitUiEvent({type:"node.action.disconnect",nodeId:i,edgeIds:g});break}case"debug":{s._emitUiEvent({type:"node.action.debug",nodeId:i});break}}return!1}function r(n){s.api.value?.deleteSelection({selection:n,source:"user:toolbar",label:"批量删除选中"})}return{handleNodeAction:t,deleteSelection:r}}function Pt(){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 Tt(s,e){const t=e.defaultEdgeType??"default",r=e.edgeTypes?.[t],n={zIndex:-1,attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}};r?.router&&(n.router=typeof r.router=="string"?{name:r.router}:r.router),r?.connector&&(n.connector=typeof r.connector=="string"?{name:r.connector}:r.connector),r?.x6EdgeConfig&&Object.assign(n,r.x6EdgeConfig);const i=n.attrs??{},a=i.line??{};return n.attrs={...i,line:{...a,targetMarker:Pt()}},s.createEdge(n)}const Rt={class:"flow-canvas-node-actions__bar"},Lt=o.defineComponent({__name:"node-actions-toolbar",props:{node:{},position:{},config:{},behavior:{},actionsOffset:{}},emits:["action"],setup(s,{emit:e}){const t=s,r=o.computed(()=>{const h=t.actionsOffset?.x??0,f=t.actionsOffset?.y??0,y=h!==0||f!==0;return{left:`${t.position.x}px`,top:`${t.position.y}px`,transform:y?`translate(${h}px, ${f}px)`:"translateX(-100%)"}}),n=e,i=o.computed(()=>({debug:{visible:t.config.showDebug&&t.behavior.debuggable!==!1,disabled:t.behavior.debugDisabled===!0},delete:{visible:t.config.showDelete&&t.behavior.deletable!==!1,disabled:t.behavior.deleteDisabled===!0},copy:{visible:t.config.showCopy&&t.behavior.copyable!==!1,disabled:t.behavior.copyDisabled===!0},copyInsert:{visible:t.config.showCopyInsert&&t.behavior.copyable!==!1,disabled:t.behavior.copyInsertDisabled===!0},disconnect:{visible:t.config.showDisconnect&&t.behavior.disconnectable!==!1,disabled:t.behavior.disconnectDisabled===!0}})),a=o.computed(()=>i.value.copy.visible||i.value.copyInsert.visible||i.value.disconnect.visible),c=o.ref(!1);let l=null;function g(){l&&(clearTimeout(l),l=null),c.value=!0}function u(){l=setTimeout(()=>{c.value=!1,l=null},100)}return o.onBeforeUnmount(()=>{l&&clearTimeout(l)}),(h,f)=>(o.openBlock(),o.createElementBlock("div",{class:"flow-canvas-node-actions",style:o.normalizeStyle(r.value)},[o.createElementVNode("div",Rt,[i.value.debug.visible?(o.openBlock(),o.createElementBlock("i",{key:0,class:o.normalizeClass(["flow-canvas-icon canvas-debug flow-canvas-node-actions__icon",{"is-disabled":i.value.debug.disabled}]),onClick:f[0]||(f[0]=y=>!i.value.debug.disabled&&n("action","debug",s.node.id))},null,2)):o.createCommentVNode("",!0),i.value.delete.visible?(o.openBlock(),o.createElementBlock("i",{key:1,class:o.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-node-actions__icon",{"is-disabled":i.value.delete.disabled}]),onClick:f[1]||(f[1]=y=>!i.value.delete.disabled&&n("action","delete",s.node.id))},null,2)):o.createCommentVNode("",!0),a.value?(o.openBlock(),o.createElementBlock("div",{key:2,class:"flow-canvas-node-actions__more-wrapper",onMouseenter:g,onMouseleave:u},[...f[5]||(f[5]=[o.createElementVNode("i",{class:"flow-canvas-icon canvas-gengduo flow-canvas-node-actions__icon"},null,-1)])],32)):o.createCommentVNode("",!0)]),o.createVNode(o.Transition,{name:"flow-canvas-fade"},{default:o.withCtx(()=>[c.value&&a.value?(o.openBlock(),o.createElementBlock("div",{key:0,class:"flow-canvas-node-actions__dropdown",onMouseenter:g,onMouseleave:u},[i.value.copy.visible?(o.openBlock(),o.createElementBlock("div",{key:0,class:o.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.copy.disabled}]),onClick:f[2]||(f[2]=y=>!i.value.copy.disabled&&n("action","copy",s.node.id))},[...f[6]||(f[6]=[o.createElementVNode("i",{class:"flow-canvas-icon canvas-copy-fuzhi-2"},null,-1),o.createElementVNode("span",null,"复制",-1)])],2)):o.createCommentVNode("",!0),i.value.copyInsert.visible?(o.openBlock(),o.createElementBlock("div",{key:1,class:o.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.copyInsert.disabled}]),onClick:f[3]||(f[3]=y=>!i.value.copyInsert.disabled&&n("action","copy-insert",s.node.id))},[...f[7]||(f[7]=[o.createElementVNode("i",{class:"flow-canvas-icon canvas-fuzhibingcharu"},null,-1),o.createElementVNode("span",null,"复制并插入",-1)])],2)):o.createCommentVNode("",!0),i.value.disconnect.visible?(o.openBlock(),o.createElementBlock("div",{key:2,class:o.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":i.value.disconnect.disabled}]),onClick:f[4]||(f[4]=y=>!i.value.disconnect.disabled&&n("action","disconnect",s.node.id))},[...f[8]||(f[8]=[o.createElementVNode("i",{class:"flow-canvas-icon canvas-unlock-jiebang"},null,-1),o.createElementVNode("span",null,"断开连线",-1)])],2)):o.createCommentVNode("",!0)],32)):o.createCommentVNode("",!0)]),_:1})],4))}}),ne=(s,e)=>{const t=s.__vccOpts||s;for(const[r,n]of e)t[r]=n;return t},Oe=ne(Lt,[["__scopeId","data-v-3b39dab5"]]),Ot={key:0,class:"flow-canvas-quick-add__tooltip"},$t=5,Vt=o.defineComponent({__name:"node-quick-add-popover",props:{node:{},portPosition:{}},emits:["open","close","start-drag","mouseenter","mouseleave"],setup(s,{expose:e,emit:t}){const r=s,n=t,i=o.ref(),a=o.ref(),c=o.ref(!1),l=o.ref(!1);let g=null,u=!1,h=null;function f(H){H.preventDefault(),H.stopPropagation(),g={x:H.clientX,y:H.clientY},u=!1,document.addEventListener("mousemove",y),document.addEventListener("mouseup",m)}function y(H){if(!g)return;const N=H.clientX-g.x,L=H.clientY-g.y;Math.sqrt(N*N+L*L)>=$t&&(u=!0,C(),n("start-drag",r.node.id))}function m(){C(),u||M(),g=null,u=!1}function C(){document.removeEventListener("mousemove",y),document.removeEventListener("mouseup",m)}function M(){l.value?T():D()}function D(){l.value=!0,n("open",r.node.id),requestAnimationFrame(()=>{document.addEventListener("mousedown",O)})}function T(){l.value=!1,n("close"),document.removeEventListener("mousedown",O)}function O(H){const N=H.target;i.value?.contains(N)||a.value?.contains(N)||T()}function G(){l.value||n("mouseleave")}function R(){h&&(clearTimeout(h),h=null),n("mouseenter")}function q(){h=setTimeout(()=>{T(),n("mouseleave"),h=null},150)}return o.onBeforeUnmount(()=>{C(),h&&clearTimeout(h),document.removeEventListener("mousedown",O)}),e({closePopover:T}),(H,N)=>(o.openBlock(),o.createElementBlock("div",{class:"flow-canvas-quick-add",style:o.normalizeStyle({left:`${s.portPosition.x}px`,top:`${s.portPosition.y}px`}),onMouseenter:N[2]||(N[2]=L=>n("mouseenter")),onMouseleave:G,onClick:N[3]||(N[3]=o.withModifiers(()=>{},["stop"]))},[o.createElementVNode("div",{ref_key:"btnRef",ref:i,class:o.normalizeClass(["flow-canvas-quick-add__btn",{"is-hovered":c.value,"is-active":l.value}]),onMouseenter:N[0]||(N[0]=L=>c.value=!0),onMouseleave:N[1]||(N[1]=L=>c.value=!1),onMousedown:f},[...N[4]||(N[4]=[o.createElementVNode("i",{class:"flow-canvas-icon canvas-zoom-add"},null,-1)])],34),c.value&&!l.value?(o.openBlock(),o.createElementBlock("div",Ot,[...N[5]||(N[5]=[o.createElementVNode("div",null,[o.createElementVNode("b",null,"点击"),o.createTextVNode(" 添加节点")],-1),o.createElementVNode("div",null,[o.createElementVNode("b",null,"拖拽"),o.createTextVNode(" 连接节点")],-1)])])):o.createCommentVNode("",!0),o.createVNode(o.Transition,{name:"flow-canvas-fade"},{default:o.withCtx(()=>[l.value?(o.openBlock(),o.createElementBlock("div",{key:0,ref_key:"popoverRef",ref:a,class:"flow-canvas-quick-add__popover",onMouseenter:R,onMouseleave:q},[o.renderSlot(H.$slots,"default",{},()=>[N[6]||(N[6]=o.createElementVNode("div",{class:"flow-canvas-quick-add__default-content"},"节点快捷操作面板",-1))],!0)],544)):o.createCommentVNode("",!0)]),_:3})],36))}}),$e=ne(Vt,[["__scopeId","data-v-336cc3b4"]]),zt={class:"flow-canvas-selection-actions__bar"},Ht=o.defineComponent({__name:"selection-actions-toolbar",props:{position:{},canDelete:{type:Boolean}},emits:["action"],setup(s,{emit:e}){const t=s,r=e,n=o.computed(()=>({left:`${t.position.x}px`,top:`${t.position.y}px`,transform:"translateX(-100%)"}));return(i,a)=>(o.openBlock(),o.createElementBlock("div",{class:"flow-canvas-selection-actions",style:o.normalizeStyle(n.value)},[o.createElementVNode("div",zt,[o.createElementVNode("i",{class:o.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-selection-actions__icon",{"is-disabled":!s.canDelete}]),onClick:a[0]||(a[0]=c=>s.canDelete&&r("action","delete"))},null,2)])],4))}}),qt=ne(Ht,[["__scopeId","data-v-25eb8b79"]]),Ft={class:"flow-canvas-runtime-core__overlay"},Gt=o.defineComponent({__name:"canvas-runtime-core",props:{editor:{},graphOptions:{},nodeActions:{},quickAdd:{},getConnectionExcludedNodeIds:{type:Function}},emits:["ui-event"],setup(s,{emit:e}){const t=s,r=e,n=o.ref(),i=o.ref();let a,c,l,g,u=null,h=null,f=null,y=null;const m=_t(),{hoveredNodeId:C,isDraggingNode:M}=m,D=m.enterOverlay,T=()=>m.leaveOverlay(),O=o.ref(0),G=o.ref({nodeIds:[],edgeIds:[]});function R(E){const w=t.editor.api.value;return w?t.editor.schema.nodeTypes[E.type]?.getBehavior?.(E,{api:w,flowModel:t.editor.flowModel.value,history:t.editor.history,mode:t.editor.mode.value})??{}:{}}const q=o.computed(()=>t.editor.mode.value==="edit"&&t.editor.selectionMode.value),H=o.computed(()=>({showDebug:!1,showDelete:!0,showCopy:!0,showCopyInsert:!0,showDisconnect:!0,insertGap:100,...t.nodeActions})),N=o.computed(()=>{if(O.value,!t.editor.api.value)return[];const E=t.editor.flowModel.value,w=t.editor.api.value.overlay,_=[];for(const[$,X]of Object.entries(E.nodes)){const oe=t.editor._pluginManager.collectNodeDecorations(X);if(!oe?.badge)continue;const J=w.getNodeScreenRect($);J&&_.push({nodeId:$,x:J.x+J.width-4,y:J.y-8,badge:oe.badge})}return _}),L=o.computed(()=>{O.value;const E=C.value;if(!E||M.value||!t.editor.api.value||t.editor.mode.value!=="edit"||q.value)return null;const _=t.editor.flowModel.value.nodes[E];if(!_)return null;const $=t.editor.api.value.overlay.getNodeScreenRect(E);if(!$)return null;const X=R(_);return X.showActions===!1?null:{node:_,position:{x:$.x+$.width,y:$.y+$.height+4},behavior:X}}),v=o.computed(()=>{if(O.value,!t.editor.api.value||t.editor.mode.value!=="edit")return null;const E=G.value;if(E.nodeIds.length+E.edgeIds.length<=1)return null;const w=t.editor.api.value.getSelectionBounds(E);if(!w)return null;const _=Le(E,t.editor.flowModel.value,R);return{position:{x:w.x+w.width,y:w.y+w.height+4},canDelete:_.nodeIds.length>0||_.edgeIds.length>0}}),d=o.ref(),p=Bt({editor:t.editor,quickAddProp:o.computed(()=>t.quickAdd),isDraggingNode:M,nodeHover:m,isSelectionModeActive:q,viewportVersion:O,getNodeBehavior:R,getInsertGap:()=>H.value.insertGap,closePopover:()=>d.value?.closePopover()}),I=p.data,S=p.handleOpen,k=p.handleClose,V=p.handleStartDrag,Y=p.handleOverlayEnter,x=p.handleOverlayLeave,A=p.handleInsert,b=At(t.editor);function B(E,w){b.handleNodeAction(E,w,H.value.insertGap)&&(C.value=null)}function z(E){E==="delete"&&b.deleteSelection(G.value)}function U(E){if(t.editor.mode.value!=="edit")return;t.editor._pluginManager.dispatchKeyboardShortcut(E)&&(E.preventDefault(),E.stopPropagation())}function F(E,w){const _=a,$=X=>{const oe=_.isRubberbandEnabled?.()??!1;oe&&_.disableRubberband?.(),X?a.enablePanning():a.disablePanning(),oe&&_.enableRubberband?.()};E?(_.enableSelection?.(),w?(m.reset(),p.quickAddNodeId.value=null,p.quickAddPopoverOpen.value=!1,u?.remove(),$(!1),_.enableRubberband?.()):(_.disableRubberband?.(),$(!0))):(_.disableRubberband?.(),$(!0),_.disableSelection?.())}function Q(E){a.on("node:move",({node:w})=>{M.value=!0;const _=t.editor.flowModel.value.nodes[w.id];_&&R(_).bringToFrontOnDrag===!1||w.toFront?.()}),a.on("node:moved",()=>{M.value=!1}),a.on("node:mouseenter",({node:w})=>{if(q.value){C.value=null,p.quickAddNodeId.value=null,E.hideNodePorts(w);return}m.enter(w.id);const _=t.editor.flowModel.value.nodes[w.id];if(_&&R(_).showPorts===!1){p.mergedConfig.value.enabled&&p.enter(w.id);return}p.mergedConfig.value.enabled&&p.enter(w.id)||E.showNodePorts(w)}),a.on("node:mouseleave",({node:w})=>{if(q.value){E.hideNodePorts(w);return}const _=t.editor.flowModel.value.nodes[w.id];let $=100;_&&R(_).actionsOffset&&($=300),m.leave($),p.mergedConfig.value.enabled?p.quickAddNodeId.value===w.id&&!p.quickAddPopoverOpen.value?p.leave():p.quickAddNodeId.value!==w.id&&E.hideNodePorts(w):E.hideNodePorts(w)})}function W(E){a.on("edge:added",({edge:w})=>{let _;if(t.getConnectionExcludedNodeIds&&!w.getTargetCell()){const $=w.getSourceCell();if($){const X=t.getConnectionExcludedNodeIds($.id);_=X instanceof Set?X:new Set(X)}}E.handleEdgeAdded(w,_)}),a.on("edge:connected",()=>{E.handleEdgeConnected()}),a.on("edge:removed",({edge:w})=>{E.handleEdgeRemoved(w.id),u.handleEdgeRemoved(w.id)}),a.on("edge:mouseenter",({edge:w,e:_})=>{c.setHoveredEdge(w.id),c.refreshEdgeStyles(),t.editor.mode.value==="edit"&&!q.value&&E.canShowEdgeTool()&&u.show(w.id,_)}),a.on("edge:mouseleave",()=>{c.setHoveredEdge(null),c.refreshEdgeStyles(),u.remove()}),a.on("edge:click",({edge:w,e:_})=>{_.target?.closest?.(".flow-canvas-edge-delete-tool")&&t.editor.mode.value==="edit"&&(u.remove(),t.editor.executeCommand({id:j(),source:"user:toolbar",label:"删除连线",timestamp:Date.now(),commands:[{type:"edge.remove",edgeId:w.id}]}))}),h=w=>u.move(w),a.container.addEventListener("mousemove",h)}function te(){f=E=>{if(!C.value&&!p.quickAddNodeId.value)return;const w=E.target;if(w?.closest?.(".x6-node")||w?.closest?.(".flow-canvas-node-actions")||w?.closest?.(".flow-canvas-quick-add")){m.cancelLeave(),p.cancelLeave();return}m.leave(180),p.quickAddPopoverOpen.value||p.leave()},n.value?.addEventListener("mousemove",f),y=()=>{m.reset(),p.quickAddPopoverOpen.value||(p.quickAddNodeId.value=null)},n.value?.addEventListener("mouseleave",y),n.value?.addEventListener("keydown",U)}function Z(){o.watch(()=>t.editor.flowModel.value,E=>c.syncFlowModel(E)),o.watch([()=>t.editor.mode.value,()=>t.editor.selectionMode.value],([E,w])=>{F(E==="edit",w)},{immediate:!0})}return o.onMounted(()=>{if(!i.value)return;const E=new Set(["model","container"]),w={};if(t.graphOptions)for(const[P,se]of Object.entries(t.graphOptions)){if(E.has(P)){console.warn(`[flow-canvas] graphOptions.${P} is managed by the engine and will be ignored`);continue}w[P]=se}a=new Ke.Graph({container:i.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(P){return P.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 Tt(this,t.editor.schema)}},...w}),l=new kt,c=new wt(a,t.editor.schema,l,P=>t.editor._pluginManager.collectNodeDecorations(P),P=>t.editor._pluginManager.collectEdgeDecorations(P),()=>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 _=Ct(a),$=St({graph:a,overlayManager:_,executeCommand:P=>t.editor.executeCommand(P),schema:t.editor.schema,flowModel:t.editor.flowModel,getNodeBehavior:R,idGenerator:t.editor.idGenerator,defaultInsertGap:t.nodeActions?.insertGap,getContextMenuItems:P=>t.editor._pluginManager.collectContextMenuItems(P),onHighlightChange:(P,se)=>{c.setHighlightedNodes(P),c.setHighlightedEdges(se),c.refreshNodeHighlights(),c.refreshEdgeStyles()},resolveNodeShape:P=>{const se=t.editor.schema.nodeTypes[P];if(!se)return null;const ce=l.registerNodeType(P,se.component),ie=se.getSize({id:"",type:P,position:{x:0,y:0}});return{shapeName:ce,width:ie.width,height:ie.height}}});t.editor.api.value=$;const X={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:$,overlay:_,graph:a};t.editor._pluginManager.attachRuntime(X);const oe=t.editor._pluginManager.collectExtendedApi();Object.assign(t.editor.extendedApi,oe),t.editor._emitUiEvent=P=>{t.editor._pluginManager.dispatchUiEvent(P),r("ui-event",P)},g=new Et(a,P=>{(P.type==="node.click"||P.type==="node.dblclick"||P.type==="node.contextmenu")&&m.enter(P.nodeId),t.editor._emitUiEvent(P)},P=>{if(c.isSyncing)return;if(t.editor.executeCommand(P).status!=="applied"){for(const ce of P.commands)if(ce.type==="edge.add"){const ie=a.getCellById(ce.edge.id);ie&&a.removeCell(ie)}}},t.editor.flowModel,t.editor.idGenerator),u=Mt(a);const J=Dt(a);p.attachRuntime(a,P=>J.hideNodePorts(P)),Q(J),W(J),a.on("selection:changed",()=>{const P=Re(a.getSelectedCells?.()??[]);G.value=P,t.editor._pluginManager.dispatchSelectionChange(P),r("ui-event",{type:"selection.change",nodeIds:P.nodeIds,edgeIds:P.edgeIds}),c.refreshNodeHighlights(),c.refreshEdgeStyles()});const K=()=>{O.value++};a.on("translate",K),a.on("scale",K),a.on("resize",K),te(),c.syncFlowModel(t.editor.flowModel.value),Z()}),o.onBeforeUnmount(()=>{m.cleanup(),p.cleanup(),u?.remove(),h&&a?.container?.removeEventListener("mousemove",h),f&&n.value?.removeEventListener("mousemove",f),y&&n.value?.removeEventListener("mouseleave",y),n.value?.removeEventListener("keydown",U),t.editor._pluginManager.detachRuntime(),t.editor.api.value=null;for(const E of Object.keys(t.editor.extendedApi))delete t.editor.extendedApi[E];g?.dispose(),c?.dispose(),l?.dispose(),a?.dispose()}),(E,w)=>(o.openBlock(),o.createElementBlock("div",{ref_key:"rootRef",ref:n,class:o.normalizeClass(["flow-canvas-runtime-core",{"flow-canvas-runtime-core--selection-mode":q.value}]),tabindex:"0"},[o.createElementVNode("div",{ref_key:"containerRef",ref:i,class:"flow-canvas-runtime-core__graph"},null,512),o.createElementVNode("div",Ft,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(N.value,_=>(o.openBlock(),o.createElementBlock("div",{key:`badge-${_.nodeId}`,class:"flow-canvas-runtime-core__badge",style:o.normalizeStyle({left:`${_.x}px`,top:`${_.y}px`,backgroundColor:_.badge.color})},o.toDisplayString(_.badge.text),5))),128)),o.unref(I)?(o.openBlock(),o.createBlock($e,{key:0,ref_key:"quickAddPopoverRef",ref:d,node:o.unref(I).node,"port-position":o.unref(I).portPosition,onOpen:o.unref(S),onClose:o.unref(k),onStartDrag:o.unref(V),onMouseenter:o.unref(Y),onMouseleave:o.unref(x)},{default:o.withCtx(()=>[o.renderSlot(E.$slots,"quick-add-panel",{node:o.unref(I).node,api:s.editor.api.value,insertNodeToRight:_=>o.unref(A)(o.unref(I).node.id,_),closePopover:()=>d.value?.closePopover()},void 0,!0)]),_:3},8,["node","port-position","onOpen","onClose","onStartDrag","onMouseenter","onMouseleave"])):o.createCommentVNode("",!0),L.value?(o.openBlock(),o.createBlock(Oe,{key:1,node:L.value.node,position:L.value.position,config:H.value,behavior:L.value.behavior,"actions-offset":L.value.behavior.actionsOffset,onAction:B,onMouseenter:o.unref(D),onMouseleave:T},null,8,["node","position","config","behavior","actions-offset","onMouseenter"])):o.createCommentVNode("",!0),v.value?(o.openBlock(),o.createBlock(qt,{key:2,position:v.value.position,"can-delete":v.value.canDelete,onAction:z},null,8,["position","can-delete"])):o.createCommentVNode("",!0)])],2))}}),Ut=ne(Gt,[["__scopeId","data-v-84f96992"]]),jt={class:"flow-canvas-node-palette"},Wt=["data-node-type"],Xt={class:"flow-canvas-node-palette__item-label"},Kt=o.defineComponent({__name:"canvas-node-palette",props:{editor:{},items:{}},setup(s){const e=s,t=o.ref(),r=o.computed(()=>e.items?e.items:Object.keys(e.editor.schema.nodeTypes).map(n=>({type:n,label:n.charAt(0).toUpperCase()+n.slice(1)})));return o.watch([()=>e.editor.api.value,r,t],([n,i,a],c,l)=>{if(!n||!a)return;const g=[];for(const u of i){const h=a.querySelector(`[data-node-type="${u.type}"]`);if(!h)continue;const f=n.registerDndSource(h,()=>({id:j(),type:u.type,label:u.label,position:{x:0,y:0}}));g.push(f)}l(()=>{for(const u of g)u()})},{flush:"post"}),(n,i)=>(o.openBlock(),o.createElementBlock("div",jt,[o.createElementVNode("div",{ref_key:"listRef",ref:t,class:"flow-canvas-node-palette__list"},[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(r.value,a=>(o.openBlock(),o.createElementBlock("div",{key:a.type,class:"flow-canvas-node-palette__item","data-node-type":a.type},[a.icon?(o.openBlock(),o.createElementBlock("i",{key:0,class:o.normalizeClass([a.icon,"flow-canvas-node-palette__item-icon"])},null,2)):o.createCommentVNode("",!0),o.createElementVNode("span",Xt,o.toDisplayString(a.label),1)],8,Wt))),128))],512)]))}}),Ve=ne(Kt,[["__scopeId","data-v-300314b7"]]),Yt={class:"flow-canvas-layout"},Qt={class:"flow-canvas-layout__main"},Zt={class:"flow-canvas-layout__content"},Jt={key:0,class:"flow-canvas-layout__footer"},eo=o.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(s){return(e,t)=>(o.openBlock(),o.createElementBlock("div",Yt,[!s.hideSidebar&&(e.$slots.sidebar||s.editor)?(o.openBlock(),o.createElementBlock("aside",{key:0,class:o.normalizeClass(["flow-canvas-layout__sidebar",{"is-collapsed":s.sidebarCollapsed}]),style:o.normalizeStyle({width:s.sidebarCollapsed?"0px":`${s.sidebarWidth}px`})},[o.renderSlot(e.$slots,"sidebar",{},()=>[s.editor?(o.openBlock(),o.createBlock(Ve,{key:0,editor:s.editor,items:s.paletteItems},null,8,["editor","items"])):o.createCommentVNode("",!0)],!0)],6)):o.createCommentVNode("",!0),o.createElementVNode("div",Qt,[o.createElementVNode("div",Zt,[o.renderSlot(e.$slots,"default",{},void 0,!0)]),!s.hideFooter&&e.$slots.footer?(o.openBlock(),o.createElementBlock("div",Jt,[o.renderSlot(e.$slots,"footer",{},void 0,!0)])):o.createCommentVNode("",!0)])]))}}),to=ne(eo,[["__scopeId","data-v-26f35b6b"]]),oo=["undo","redo"];function ze(s){const e=new Set(s?.include),t=new Set(oo.filter(l=>!e.has(l))),r=[{id:"undo",type:"undo",group:"history",icon:"flow-canvas-icon canvas-undo",description:"撤销",order:10},{id:"redo",type:"redo",group:"history",icon:"flow-canvas-icon canvas-redo",description:"重做",order:11}],n=[{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[...[...r,...n].filter(l=>!t.has(l.type)),...i,...a]}const no={class:"flow-canvas-toolbar"},so={key:0,class:"flow-canvas-toolbar__separator"},ro={class:"flow-canvas-toolbar__group"},io={key:0,class:"flow-canvas-toolbar__zoom-display"},ao=["data-toolbar-id","data-toolbar-type","disabled","onClick","onMouseenter"],lo=["textContent"],co=o.defineComponent({__name:"canvas-toolbar",props:{items:{},exclude:{},editor:{}},setup(s){const e=new Set(["undo","redo","select","auto-layout","search","minimap","export"]),t=new Set(["select","search","minimap"]);function r(d){return d.id.startsWith("plugin:")||d.type==="custom"}function n(d){return d!=="custom"&&t.has(d)}const i=s,a=o.computed(()=>{if(i.items)return i.items;const d=ze(),p=i.editor.toolbarItems.value,I=new Set(i.exclude??[]),S=new Map;for(const k of d)S.set(k.id,k);for(const k of p){const V=S.get(k.id);V?S.set(k.id,{...V,...k,order:V.order,group:V.group}):r(k)&&S.set(k.id,k)}return[...S.values()].filter(k=>k.type==="custom"||!e.has(k.type)?!0:!I.has(k.type)).sort((k,V)=>(k.order??0)-(V.order??0))}),c=o.ref(1),l=o.ref(null),g=o.ref(null),u=o.ref(!1);let h=null;o.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 f=o.reactive({visible:!1,text:"",x:0,y:0});function y(d,p){if(!p.description)return;const S=d.currentTarget.getBoundingClientRect();f.text=p.description,f.visible=!0,o.nextTick(()=>{const k=l.value?.offsetWidth??0,V=l.value?.offsetHeight??0;f.x=S.left+S.width/2-k/2,f.y=S.top-V-6})}function m(){f.visible=!1,l.value=null}o.onScopeDispose(()=>{h?.()});const C=o.computed(()=>`${Math.round(c.value*100)}%`),M=o.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 D(d){return d.visible===!1?!1:typeof d.visible=="function"?M.value?d.visible(M.value):!1:!0}function T(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 O=o.computed(()=>{const d=L.value.filter(I=>n(I.type)&&T(I));if(d.length===0)return null;const p=g.value;return p&&d.some(I=>I.type===p)?p:d[0]?.type??null});function G(d){return n(d.type)?O.value===d.type:T(d)}function R(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"?u.value:!1}function q(d){if(!(!M.value||!n(d.type)||!T(d))){if(d.type==="select"){i.editor.setSelectionMode(!1);return}d.onClick?.(M.value)}}function H(d){if(n(d.type))for(const p of L.value)!n(p.type)||p.id===d.id||q(p)}function N(d){if(!M.value||R(d))return;if(n(d.type)&&(g.value=d.type,H(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(u.value)break;u.value=!0,p.exportAsImage().then(I=>{const S=URL.createObjectURL(I),k=document.createElement("a");k.href=S,k.download="canvas-export.png",k.click(),URL.revokeObjectURL(S)}).catch(I=>{console.warn("[flow-canvas] Export failed:",I)}).finally(()=>{u.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 L=o.computed(()=>a.value.filter(D)),v=o.computed(()=>{const d=new Map,p=[];for(const I of L.value){const S=I.group??"default";d.has(S)||(d.set(S,[]),p.push(S)),d.get(S).push(I)}return p.map(I=>({name:I,items:d.get(I)})).filter(I=>I.items.length>0)});return(d,p)=>(o.openBlock(),o.createElementBlock("div",no,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(v.value,(I,S)=>(o.openBlock(),o.createElementBlock(o.Fragment,{key:I.name},[S>0?(o.openBlock(),o.createElementBlock("div",so)):o.createCommentVNode("",!0),o.createElementVNode("div",ro,[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(I.items,k=>(o.openBlock(),o.createElementBlock(o.Fragment,{key:k.id},[k.type==="zoom-display"?(o.openBlock(),o.createElementBlock("span",io,o.toDisplayString(C.value),1)):(o.openBlock(),o.createElementBlock("button",{key:1,type:"button",class:o.normalizeClass(["flow-canvas-toolbar__btn",{"is-disabled":R(k),"is-active":G(k),"is-exporting":k.type==="export"&&u.value}]),"data-toolbar-id":k.id,"data-toolbar-type":k.type,disabled:R(k),onClick:V=>N(k),onMouseenter:V=>y(V,k),onMouseleave:m},[k.component?(o.openBlock(),o.createBlock(o.resolveDynamicComponent(k.component),{key:0})):k.icon?(o.openBlock(),o.createElementBlock("i",{key:1,class:o.normalizeClass(k.icon)},null,2)):(o.openBlock(),o.createElementBlock("span",{key:2,class:"flow-canvas-toolbar__text",textContent:o.toDisplayString(k.text??k.description??k.id)},null,8,lo))],42,ao))],64))),128))])],64))),128)),(o.openBlock(),o.createBlock(o.Teleport,{to:"body"},[f.visible?(o.openBlock(),o.createElementBlock("div",{key:0,ref_key:"tooltipRef",ref:l,class:"flow-canvas-toolbar-tooltip",style:o.normalizeStyle({left:`${f.x}px`,top:`${f.y}px`})},[o.createTextVNode(o.toDisplayString(f.text)+" ",1),p[0]||(p[0]=o.createElementVNode("div",{class:"flow-canvas-toolbar-tooltip__arrow"},null,-1))],4)):o.createCommentVNode("",!0)]))]))}}),uo=ne(co,[["__scopeId","data-v-77d4afbb"]]),fo={class:"flow-canvas-default-node__ep-label"},po={key:1,class:"flow-canvas-default-node__diamond flow-canvas-highlight-target"},go={key:2,class:"flow-canvas-default-node__task-label"},ho=o.defineComponent({__name:"default-node",setup(s){const t=o.inject("getNode")?.(),r=o.computed(()=>t?.getData?.()??null),n=o.computed(()=>r.value?.label||r.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=o.computed(()=>{const u=r.value?.type??"";return a.has(u)?"endpoint":c.has(u)?"gateway":"task"}),g=o.computed(()=>i[r.value?.type??""]??"");return(u,h)=>(o.openBlock(),o.createElementBlock("div",{class:o.normalizeClass(["flow-canvas-default-node",[`is-${l.value}`,{"flow-canvas-highlight-target":l.value!=="gateway"}]])},[l.value==="endpoint"?(o.openBlock(),o.createElementBlock(o.Fragment,{key:0},[g.value?(o.openBlock(),o.createElementBlock("i",{key:0,class:o.normalizeClass([["flow-canvas-icon",g.value],"flow-canvas-default-node__ep-icon"])},null,2)):o.createCommentVNode("",!0),o.createElementVNode("span",fo,o.toDisplayString(n.value),1)],64)):l.value==="gateway"?(o.openBlock(),o.createElementBlock("div",po,[g.value?(o.openBlock(),o.createElementBlock("i",{key:0,class:o.normalizeClass([["flow-canvas-icon",g.value],"flow-canvas-default-node__gw-icon"])},null,2)):o.createCommentVNode("",!0)])):(o.openBlock(),o.createElementBlock("span",go,o.toDisplayString(n.value),1))],2))}}),He=ne(ho,[["__scopeId","data-v-f0e24a9f"]]),vo={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}},Me=(s,e)=>({stroke:e.hovered?"#3a84ff":"#abb5cc",strokeWidth:2});function De(){return{attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}}}function qe(){return{manhattan:{router:{name:"manhattan",args:{padding:10,maxDirectionChange:90}},connector:{name:"rounded",args:{radius:8}},style:Me,x6EdgeConfig:De()},bezier:{connector:{name:"smooth"},style:Me,x6EdgeConfig:De()}}}function mo(s){const e=s?.nodeTypes??vo,t={},r=[];for(const[a,c]of Object.entries(e)){const l=c.width??150,g=c.height??50;t[a]={component:He,getSize:()=>({width:l,height:g}),getPorts:()=>Te()},r.push({type:a,label:c.label??a,icon:c.icon})}const n={...qe(),...s?.edgeTypes},i=s?.defaultEdgeType??"manhattan";return{schema:{nodeTypes:t,defaultEdgeType:i,edgeTypes:n},paletteItems:r}}function yo(s){return{name:"connection-validator",priority:10,transformCommand(e,t,r){for(const n of e.commands){if(n.type!=="edge.add"&&n.type!=="edge.reconnect")continue;const i=r.flowModel.value,a=n.type==="edge.add"?n.edge.source.nodeId:n.source?.nodeId,c=n.type==="edge.add"?n.edge.target.nodeId:n.target?.nodeId;if(!a||!c)continue;const l=i.nodes[a],g=i.nodes[c];if(!l||!g)continue;const u=n.type==="edge.add"?n.edge.source.portId:n.source?.portId,h=n.type==="edge.add"?n.edge.target.portId:n.target?.portId,f=u?l.ports?.find(D=>D.id===u):void 0,y=h?g.ports?.find(D=>D.id===h):void 0,m=n.type==="edge.reconnect"?n.edgeId:void 0,C=Object.values(i.edges).filter(D=>D.id!==m),M=s({flowModel:i,sourceNode:l,targetNode:g,sourcePort:f,targetPort:y,existingEdges:C});if(!M.valid)return{rejected:!0,reason:M.reason??"Connection validation failed",code:"validation_failed"}}return e}}}function bo(s){const{rubberband:e=!0,multiple:t=!0,movable:r=!0}=s??{};return{name:"selection",priority:90,attachRuntime(n){n.graph.use(new Qe.Selection({enabled:!0,rubberband:e,multiple:t,movable:r,pointerEvents:"none",showNodeSelectionBox:!0,filter:i=>!(i.isNode()&&(i.getData?.()??{})._selectable===!1)}))}}}function wo(s){const{tolerance:e=10,color:t="#3a84ff"}=s??{};let r=null;return{name:"snapline",priority:90,async attachRuntime(n){const{Snapline:i}=await import("@antv/x6-plugin-snapline");n.graph.use(new i({enabled:!0,tolerance:e,className:"flow-canvas-snapline"})),r=document.createElement("style"),r.textContent=`.flow-canvas-snapline line { stroke: ${t} !important; }`,document.head.appendChild(r)},detachRuntime(){r?.remove(),r=null}}}const ko={class:"flow-canvas-search-popover__input"},Eo=["value","placeholder"],Co=["onMouseenter","onClick"],xo={class:"flow-canvas-search-popover__item-label"},No={key:0,class:"flow-canvas-search-popover__item-subtitle"},Io={key:1,class:"flow-canvas-search-popover__empty"},So=o.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(s,{emit:e}){const t=s,r=e,n=o.ref(null),i=o.ref(null),a=o.ref(-1);o.watch(()=>t.open,m=>{m&&(a.value=-1,o.nextTick(()=>{n.value?.focus(),n.value?.select()}))}),o.watch(()=>t.query,()=>{a.value=-1}),o.watch(()=>t.results.length,m=>{if(!m){a.value=-1;return}a.value>=m&&(a.value=-1)});function c(m){r("update:query",m.target.value)}function l(m){a.value=m}function g(){a.value=-1}function u(){r("update:query",""),o.nextTick(()=>{n.value?.focus()})}function h(){const m=t.results[a.value]??t.results[0];m&&r("select",m.id)}function f(m){if(m.key==="Escape"){m.preventDefault(),r("close");return}if(m.key==="ArrowDown"){if(m.preventDefault(),!t.results.length)return;a.value=a.value<t.results.length-1?a.value+1:0;return}if(m.key==="ArrowUp"){if(m.preventDefault(),!t.results.length)return;a.value=a.value>0?a.value-1:t.results.length-1;return}m.key==="Enter"&&(m.preventDefault(),h())}function y(m){if(!t.open)return;const C=m.target;C&&i.value?.contains(C)||t.isAnchorTarget?.(m.target)||r("close")}return o.onMounted(()=>{document.addEventListener("mousedown",y)}),o.onBeforeUnmount(()=>{document.removeEventListener("mousedown",y)}),(m,C)=>s.open?(o.openBlock(),o.createElementBlock("div",{key:0,ref_key:"panelRef",ref:i,class:"flow-canvas-search-popover",style:o.normalizeStyle({left:`${s.position.x}px`,top:`${s.position.y}px`,width:`${s.position.width}px`})},[o.createElementVNode("div",ko,[C[1]||(C[1]=o.createElementVNode("i",{class:"flow-canvas-icon canvas-search"},null,-1)),o.createElementVNode("input",{ref_key:"inputRef",ref:n,value:s.query,placeholder:s.placeholder,onInput:c,onKeydown:f},null,40,Eo),s.query?(o.openBlock(),o.createElementBlock("button",{key:0,type:"button",class:"flow-canvas-search-popover__clear","aria-label":"清空搜索",onClick:u},[...C[0]||(C[0]=[o.createElementVNode("i",{class:"flow-canvas-icon canvas-close-circle-shape"},null,-1)])])):o.createCommentVNode("",!0)]),s.results.length?(o.openBlock(),o.createElementBlock("div",{key:0,class:"flow-canvas-search-popover__list",onMouseleave:g},[(o.openBlock(!0),o.createElementBlock(o.Fragment,null,o.renderList(s.results,(M,D)=>(o.openBlock(),o.createElementBlock("button",{key:M.id,type:"button",class:o.normalizeClass(["flow-canvas-search-popover__item",{"is-active":D===a.value}]),onMouseenter:T=>l(D),onClick:T=>r("select",M.id)},[o.createElementVNode("span",xo,o.toDisplayString(M.label),1),M.subtitle?(o.openBlock(),o.createElementBlock("span",No,o.toDisplayString(M.subtitle),1)):o.createCommentVNode("",!0)],42,Co))),128))],32)):(o.openBlock(),o.createElementBlock("div",Io,o.toDisplayString(s.emptyText),1))],4)):o.createCommentVNode("",!0)}}),_o=ne(So,[["__scopeId","data-v-c80f6b26"]]),Be=282,Mo=4,Do=300,Bo=360,me=100,Ao=Bo*4-me;function Po(s){return s!==null}function To(s){const e=new Set;return s.map(t=>t?.trim()).filter(t=>!!t).filter(t=>{const r=t.toLowerCase();return e.has(r)?!1:(e.add(r),!0)})}function Ro(s,e){const t=Math.max(8,window.innerWidth-e-8);return Math.min(Math.max(8,s),t)}function Lo(s,e){const t=e?.getNodeMeta?.(s);if(t===null)return null;const r=t?.label?.trim()||s.label?.trim()||s.id,n=t?.subtitle?.trim()||void 0,i=To(t?.keywords??[s.label,n]);return i.length?{id:s.id,label:r,subtitle:n,keywords:i}:null}function Oo(s){let e=null,t=null,r=null,n=null,i=null,a=[];const c=o.ref(!1),l=o.ref(""),g=o.ref({x:0,y:0,width:Be}),u=o.computed(()=>e?Object.values(e.flowModel.value.nodes).map(N=>Lo(N,s)).filter(Po):[]),h=o.computed(()=>{const N=l.value.trim().toLowerCase(),L=Math.max(1,s?.maxResults??Do);return N?u.value.filter(v=>v.keywords.some(d=>d.toLowerCase().includes(N))).slice(0,L):u.value.slice(0,L)});function f(){return r?.querySelector('.flow-canvas-toolbar__btn[data-toolbar-type="search"]')}function y(){return f()?.closest(".flow-canvas-toolbar")}function m(){const N=y(),L=r?.getBoundingClientRect(),v=N?.getBoundingClientRect()??L;if(!v)return;const d=Math.max(Be,Math.round(v.width));g.value={x:Ro(v.left,d),y:v.bottom+Mo,width:d}}function C(){a.forEach(N=>clearTimeout(N)),a=[],t?.api.clearHighlight()}function M(N){C();const L=setTimeout(()=>{t?.api.highlightNodes([N])},me),v=setTimeout(()=>{t?.api.clearHighlight(),a=[]},me+Ao);a.push(L,v)}function D(N){t&&(t.api.scrollToNode(N),M(N))}function T(){t&&(c.value=!0,m(),requestAnimationFrame(()=>m()))}function O(){c.value=!1,l.value=""}function G(){if(c.value){O();return}T()}function R(N){const L=f();return!!(L&&N instanceof Node&&L.contains(N))}function q(){c.value&&m()}const H=o.defineComponent({name:"FlowCanvasSearchHost",setup(){return()=>o.h(_o,{open:c.value,position:g.value,query:l.value,results:h.value,placeholder:s?.placeholder??"搜索节点名称",emptyText:s?.emptyText??"暂无匹配节点",isAnchorTarget:R,"onUpdate:query":N=>{l.value=N},onSelect:D,onClose:O})}});return{name:"search",priority:90,install(N){e=N},attachRuntime(N){t=N,r=N.graph.container.closest(".flow-canvas-layout__content")??N.graph.container.parentElement,n=document.createElement("div"),n.className="flow-canvas-search-host",document.body.append(n),i=o.createApp(H),i.mount(n),window.addEventListener("resize",q),window.addEventListener("scroll",q,!0)},detachRuntime(){O(),C(),window.removeEventListener("resize",q),window.removeEventListener("scroll",q,!0),i?.unmount(),i=null,n?.remove(),n=null,r=null,t=null},dispose(){O(),C(),e=null},provideToolbarItems(){return[{id:"plugin:search",type:"search",icon:"flow-canvas-icon canvas-search",description:"搜索节点",group:"tools",order:22,active:()=>c.value,onClick:G}]}}}const $o=52,Vo=16,zo=40;function Ho(s){const e=document.createElement("div");e.className="flow-canvas-minimap",s.floating!==!1&&e.classList.add("flow-canvas-minimap--floating");const t=document.createElement("div");t.className="flow-canvas-minimap__host",e.append(t),Object.assign(e.style,{width:`${s.width}px`,height:`${s.height}px`}),s.floating!==!1&&Object.assign(e.style,{top:`${$o}px`,left:`${Vo}px`});let r=null,n=s.defaultOpen??!1,i=null;function a(){!s.onClickOutside||i||(i=f=>{const y=f.target;y&&e.contains(y)||f.target?.closest('[data-toolbar-type="minimap"]')||s.onClickOutside()},document.addEventListener("mousedown",i))}function c(){i&&(document.removeEventListener("mousedown",i),i=null)}function l(){r||(r=new Ze.MiniMap({container:t,width:s.width,height:s.height,padding:s.contentPadding??zo,scalable:!1}),s.sourceGraph.use(r))}function g(f){n=f,e.style.display=n?"":"none",n?(l(),a()):c()}function u(){g(n),s.mountTarget.appendChild(e)}function h(){c(),r?.dispose(),r=null,e.remove()}return u(),{element:e,isOpen:()=>n,setOpen:g,toggle(){const f=!n;return g(f),f},destroy:h}}function qo(s){let e=null;const t=o.ref(!1);function r(i){e?.setOpen(i),t.value=i}function n(){e&&(t.value=e.toggle())}return{name:"minimap",priority:90,attachRuntime(i){const a=s?.width??334,c=s?.height??180,l=s?.container??i.graph.container.closest(".flow-canvas-layout__content")??i.graph.container.parentElement;l&&(e=Ho({sourceGraph:i.graph,mountTarget:l,width:a,height:c,floating:!s?.container,defaultOpen:!1,onClickOutside:()=>r(!1)}),r(!1))},detachRuntime(){e?.destroy(),e=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:n}]}}}function Fo(){let s=null,e=0;return{name:"clipboard",priority:90,onKeyboardShortcut(t,r){const n=t.metaKey||t.ctrlKey;if(n&&t.key==="c"){const i=r.graph.getSelectedCells?.()??[];if(!i.length)return!1;const a=r.flowModel.value,c=new Set(i.filter(u=>u.isNode()).map(u=>u.id)),l=[...c].map(u=>a.nodes[u]).filter(Boolean);if(!l.length)return!1;const g=Object.values(a.edges).filter(u=>c.has(u.source.nodeId)&&c.has(u.target.nodeId));return s={nodes:l,edges:g},e=0,!0}if(n&&t.key==="v"){if(!s?.nodes.length)return!1;e++;const i=e*30,a=new Map,c=[];for(const l of s.nodes){const g=`${l.id}_cp${j().slice(0,6)}`;a.set(l.id,g),c.push({type:"node.add",node:{...l,id:g,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 s.edges){const g=a.get(l.source.nodeId),u=a.get(l.target.nodeId);!g||!u||c.push({type:"edge.add",edge:{...l,id:`${l.id}_cp${j().slice(0,6)}`,source:{...l.source,nodeId:g},target:{...l.target,nodeId:u},labels:l.labels?.map(h=>({...h,id:`${h.id}_cp${j().slice(0,6)}`})),payload:l.payload?{...l.payload}:{}}})}return c.length&&r.executeCommand({id:j(),source:"user:keyboard",label:"粘贴",timestamp:Date.now(),commands:c}),!0}return!1}}}exports.CanvasConstraintError=ee;exports.CanvasLayout=to;exports.CanvasNodePalette=Ve;exports.CanvasRuntime=Ut;exports.CanvasSchemaError=Ae;exports.CanvasToolbar=uo;exports.DefaultNode=He;exports.NodeActionsToolbar=Oe;exports.NodeQuickAddPopover=$e;exports.applyCanvasCommand=ue;exports.clipboardPlugin=Fo;exports.connectionValidatorPlugin=yo;exports.createBuiltinEdgeTypes=qe;exports.createCanvasHistory=Pe;exports.createDefaultSchema=mo;exports.createDefaultToolbarItems=ze;exports.createEmptyFlowModel=Je;exports.generateId=j;exports.minimapPlugin=qo;exports.searchPlugin=Oo;exports.selectionPlugin=bo;exports.snaplinePlugin=wo;exports.useCanvasEditor=vt;
|
package/dist/index.d.ts
CHANGED
|
@@ -207,6 +207,8 @@ type CanvasUiEvent = {
|
|
|
207
207
|
type: 'node.action.quick-insert';
|
|
208
208
|
sourceNodeId: string;
|
|
209
209
|
newNodeId: string;
|
|
210
|
+
} | {
|
|
211
|
+
type: 'toolbar.auto-layout';
|
|
210
212
|
};
|
|
211
213
|
|
|
212
214
|
interface CanvasHistory {
|
|
@@ -244,6 +246,8 @@ interface RuntimePluginContext extends EditorPluginContext {
|
|
|
244
246
|
api: CanvasApi;
|
|
245
247
|
overlay: OverlayManager;
|
|
246
248
|
graph: Graph;
|
|
249
|
+
/** 框选模式是否激活(由 editor.selectionMode 驱动) */
|
|
250
|
+
selectionMode: Readonly<Ref<boolean>>;
|
|
247
251
|
}
|
|
248
252
|
interface CanvasSelection {
|
|
249
253
|
nodeIds: string[];
|
|
@@ -288,7 +292,12 @@ interface CanvasPlugin {
|
|
|
288
292
|
extendApi?(api: CanvasApi, ctx: RuntimePluginContext): Record<string, Function>;
|
|
289
293
|
}
|
|
290
294
|
|
|
291
|
-
type
|
|
295
|
+
type CoreToolbarType = 'undo' | 'redo' | 'select' | 'auto-layout' | 'export' | 'zoom-in' | 'zoom-out' | 'zoom-display' | 'fit' | 'reset';
|
|
296
|
+
/**
|
|
297
|
+
* 这类工具项默认由内置插件提供入口与行为,toolbar 壳层只负责渲染与隐藏控制。
|
|
298
|
+
*/
|
|
299
|
+
type PluginManagedToolbarType = 'search' | 'minimap';
|
|
300
|
+
type BuiltinToolbarType = CoreToolbarType | PluginManagedToolbarType;
|
|
292
301
|
interface CanvasToolbarItem {
|
|
293
302
|
id: string;
|
|
294
303
|
type: BuiltinToolbarType | 'custom';
|
|
@@ -304,12 +313,21 @@ interface CanvasToolbarItem {
|
|
|
304
313
|
order?: number;
|
|
305
314
|
visible?: boolean | ((ctx: CanvasCallbackContext) => boolean);
|
|
306
315
|
disabled?: boolean | ((ctx: CanvasCallbackContext) => boolean);
|
|
316
|
+
active?: boolean | ((ctx: CanvasCallbackContext) => boolean);
|
|
307
317
|
onClick?: (ctx: CanvasCallbackContext) => void;
|
|
308
318
|
}
|
|
309
319
|
interface ExportOptions {
|
|
310
320
|
backgroundColor?: string;
|
|
311
321
|
padding?: number;
|
|
312
322
|
quality?: number;
|
|
323
|
+
/** 输出图片的缩放倍率,默认跟随 devicePixelRatio */
|
|
324
|
+
scale?: number;
|
|
325
|
+
}
|
|
326
|
+
interface DeleteSelectionOptions {
|
|
327
|
+
selection?: CanvasSelection;
|
|
328
|
+
source?: CommandSource;
|
|
329
|
+
label?: string;
|
|
330
|
+
clearSelectionAfterApply?: boolean;
|
|
313
331
|
}
|
|
314
332
|
interface NodeActionsConfig {
|
|
315
333
|
showDebug?: boolean;
|
|
@@ -336,13 +354,14 @@ interface CanvasApi {
|
|
|
336
354
|
scrollToOrigin(): void;
|
|
337
355
|
scrollToNode(nodeId: string): void;
|
|
338
356
|
getSelection(): CanvasSelection;
|
|
357
|
+
getSelectionBounds(selection?: CanvasSelection): DOMRect | null;
|
|
339
358
|
selectNodes(ids: string[]): void;
|
|
340
359
|
selectEdges(ids: string[]): void;
|
|
341
360
|
clearSelection(): void;
|
|
361
|
+
deleteSelection(options?: DeleteSelectionOptions): CommandExecutionResult | null;
|
|
342
362
|
registerDndSource(el: HTMLElement, factory: () => FlowNodeModel): () => void;
|
|
343
363
|
startConnection(nodeId: string, portId?: string): void;
|
|
344
364
|
exportAsImage(options?: ExportOptions): Promise<Blob>;
|
|
345
|
-
exportAsSVG(): Promise<string>;
|
|
346
365
|
highlightNodes(nodeIds: string[]): void;
|
|
347
366
|
highlightEdges(edgeIds: string[]): void;
|
|
348
367
|
clearHighlight(): void;
|
|
@@ -381,8 +400,6 @@ type QuickAddInsertDirectionResolver = (node: FlowNodeModel, port: FlowPortModel
|
|
|
381
400
|
interface QuickAddConfig {
|
|
382
401
|
/** 全局开关,默认 true */
|
|
383
402
|
enabled?: boolean;
|
|
384
|
-
/** "+"按钮 hover 时的 tooltip 文案 */
|
|
385
|
-
tooltipText?: string;
|
|
386
403
|
/** quick-add 绑定的端口分组,默认 'right';节点不存在该分组端口时将不显示 quick-add */
|
|
387
404
|
portGroup?: string;
|
|
388
405
|
/** 精确指定 quick-add 使用哪个端口;优先级高于 portGroup */
|
|
@@ -479,6 +496,13 @@ interface CanvasCallbackContext {
|
|
|
479
496
|
mode: CanvasMode;
|
|
480
497
|
}
|
|
481
498
|
|
|
499
|
+
/**
|
|
500
|
+
* @antv/x6-plugin-selection 在运行时向 Graph 原型注入的方法。
|
|
501
|
+
* 仅在 selectionPlugin 已通过 graph.use() 注册后可用。
|
|
502
|
+
* 当前 X6 类型声明已包含这些方法,因此这里保留别名供运行时语义标注使用。
|
|
503
|
+
*/
|
|
504
|
+
type GraphWithSelection = Graph;
|
|
505
|
+
|
|
482
506
|
/**
|
|
483
507
|
* 纯函数 reducer:将一条原子命令应用到 FlowModel 上,返回新 FlowModel(不可变)。
|
|
484
508
|
* 所有 FlowModel 不变量在此处保证:
|
|
@@ -591,6 +615,11 @@ interface CanvasEditorContext {
|
|
|
591
615
|
extendedApi: Record<string, Function>;
|
|
592
616
|
/** @internal used by CanvasRuntime */
|
|
593
617
|
_pluginManager: PluginManager;
|
|
618
|
+
/**
|
|
619
|
+
* @internal 发出 UI 事件。Runtime mount 前仅分发到插件;mount 后同时触发 Vue emit('ui-event')。
|
|
620
|
+
* 由 CanvasRuntime 在挂载时注入完整实现。
|
|
621
|
+
*/
|
|
622
|
+
_emitUiEvent: (event: CanvasUiEvent) => void;
|
|
594
623
|
}
|
|
595
624
|
/**
|
|
596
625
|
* 画布编辑引擎的核心 composable。
|
|
@@ -711,7 +740,6 @@ declare const _default$1: typeof __VLS_export$1;
|
|
|
711
740
|
type __VLS_Props = {
|
|
712
741
|
node: FlowNodeModel;
|
|
713
742
|
portPosition: ScreenPosition;
|
|
714
|
-
tooltipText?: string;
|
|
715
743
|
};
|
|
716
744
|
declare function closePopover(): void;
|
|
717
745
|
declare var __VLS_7: {};
|
|
@@ -743,17 +771,18 @@ type __VLS_WithSlots<T, S> = T & {
|
|
|
743
771
|
};
|
|
744
772
|
|
|
745
773
|
interface DefaultToolbarItemsOptions {
|
|
746
|
-
/** 要排除的操作项类型(仅对可隐藏的组生效,zoom 和 reset 组固定不可排除) */
|
|
747
|
-
exclude?: BuiltinToolbarType[];
|
|
748
774
|
/** 要恢复显示的默认隐藏项(默认隐藏:undo、redo) */
|
|
749
775
|
include?: BuiltinToolbarType[];
|
|
750
776
|
}
|
|
751
777
|
/**
|
|
752
778
|
* 工具栏默认项分为四组(从左到右):
|
|
753
779
|
* 1. history: 撤销、重做 — 默认隐藏,通过 include: ['undo', 'redo'] 恢复显示
|
|
754
|
-
* 2. tools:
|
|
780
|
+
* 2. tools: 框选、自动排版、下载
|
|
781
|
+
* search / minimap 由内置插件默认提供,不在 core 默认项中声明
|
|
755
782
|
* 3. zoom: 缩小、放大 — 固定
|
|
756
783
|
* 4. reset: 重置 — 固定
|
|
784
|
+
*
|
|
785
|
+
* exclude 过滤统一由 CanvasToolbar 组件在合并 plugin items 后执行,此函数不处理。
|
|
757
786
|
*/
|
|
758
787
|
declare function createDefaultToolbarItems(options?: DefaultToolbarItemsOptions): CanvasToolbarItem[];
|
|
759
788
|
|
|
@@ -812,7 +841,21 @@ interface SnaplinePluginOptions {
|
|
|
812
841
|
}
|
|
813
842
|
declare function snaplinePlugin(options?: SnaplinePluginOptions): CanvasPlugin;
|
|
814
843
|
|
|
844
|
+
interface SearchNodeMeta {
|
|
845
|
+
label?: string;
|
|
846
|
+
subtitle?: string;
|
|
847
|
+
keywords?: string[];
|
|
848
|
+
}
|
|
849
|
+
interface SearchPluginOptions {
|
|
850
|
+
placeholder?: string;
|
|
851
|
+
emptyText?: string;
|
|
852
|
+
maxResults?: number;
|
|
853
|
+
getNodeMeta?: (node: FlowNodeModel) => SearchNodeMeta | null | undefined;
|
|
854
|
+
}
|
|
855
|
+
declare function searchPlugin(options?: SearchPluginOptions): CanvasPlugin;
|
|
856
|
+
|
|
815
857
|
interface MinimapPluginOptions {
|
|
858
|
+
/** 外部容器(传入后使用外部容器渲染,不创建浮动面板) */
|
|
816
859
|
container?: HTMLElement;
|
|
817
860
|
width?: number;
|
|
818
861
|
height?: number;
|
|
@@ -828,5 +871,5 @@ declare function minimapPlugin(options?: MinimapPluginOptions): CanvasPlugin;
|
|
|
828
871
|
*/
|
|
829
872
|
declare function clipboardPlugin(): CanvasPlugin;
|
|
830
873
|
|
|
831
|
-
export { CanvasConstraintError, _default$5 as CanvasLayout, _default$3 as CanvasNodePalette, _default$6 as CanvasRuntime, CanvasSchemaError, _default$4 as CanvasToolbar, _default$2 as DefaultNode, _default$1 as NodeActionsToolbar, _default as NodeQuickAddPopover, applyCanvasCommand, clipboardPlugin, connectionValidatorPlugin, createBuiltinEdgeTypes, createCanvasHistory, createDefaultSchema, createDefaultToolbarItems, createEmptyFlowModel, generateId, minimapPlugin, selectionPlugin, snaplinePlugin, useCanvasEditor };
|
|
832
|
-
export type { BuiltinEdgeType, BuiltinToolbarType, CanvasApi, CanvasCallbackContext, CanvasCommand, CanvasEdgeDefinition, CanvasEditorContext, CanvasEditorOptions, CanvasHistory, CanvasHistoryOptions, CanvasMode, CanvasNodeDefinition, CanvasPlugin, CanvasPosition, CanvasSchema, CanvasSelection, CanvasToolbarItem, CanvasUiEvent, CommandEnvelope, CommandExecutionError, CommandExecutionResult, CommandPreview, CommandRejection, CommandSource, ConnectionValidateContext, ConnectionValidateResult, ConnectionValidator, ContextMenuItem, DefaultNodeTypeConfig, DefaultSchemaOptions, DefaultSchemaResult, DefaultToolbarItemsOptions, EdgeDecoration, EdgeRenderState, EdgeStyle, EditorPluginContext, ExportOptions, FlowEdgeLabelModel, FlowEdgeModel, FlowModel, FlowModelChangeEvent, FlowNodeModel, FlowPortModel, IdGenerator, InsertDirection, InsertNodeOptions, MinimapPluginOptions, NodeActionsConfig, NodeBehaviorConfig, NodeDecoration, NodePaletteItem, OverlayManager, QuickAddConfig, QuickAddInsertDirectionResolver, QuickAddPortResolver, RuntimePluginContext, ScreenPosition, SelectionPluginOptions, SnaplinePluginOptions };
|
|
874
|
+
export { CanvasConstraintError, _default$5 as CanvasLayout, _default$3 as CanvasNodePalette, _default$6 as CanvasRuntime, CanvasSchemaError, _default$4 as CanvasToolbar, _default$2 as DefaultNode, _default$1 as NodeActionsToolbar, _default as NodeQuickAddPopover, applyCanvasCommand, clipboardPlugin, connectionValidatorPlugin, createBuiltinEdgeTypes, createCanvasHistory, createDefaultSchema, createDefaultToolbarItems, createEmptyFlowModel, generateId, minimapPlugin, searchPlugin, selectionPlugin, snaplinePlugin, useCanvasEditor };
|
|
875
|
+
export type { BuiltinEdgeType, BuiltinToolbarType, CanvasApi, CanvasCallbackContext, CanvasCommand, CanvasEdgeDefinition, CanvasEditorContext, CanvasEditorOptions, CanvasHistory, CanvasHistoryOptions, CanvasMode, CanvasNodeDefinition, CanvasPlugin, CanvasPosition, CanvasSchema, CanvasSelection, CanvasToolbarItem, CanvasUiEvent, CommandEnvelope, CommandExecutionError, CommandExecutionResult, CommandPreview, CommandRejection, CommandSource, ConnectionValidateContext, ConnectionValidateResult, ConnectionValidator, ContextMenuItem, CoreToolbarType, DefaultNodeTypeConfig, DefaultSchemaOptions, DefaultSchemaResult, DefaultToolbarItemsOptions, DeleteSelectionOptions, EdgeDecoration, EdgeRenderState, EdgeStyle, EditorPluginContext, ExportOptions, FlowEdgeLabelModel, FlowEdgeModel, FlowModel, FlowModelChangeEvent, FlowNodeModel, FlowPortModel, GraphWithSelection, IdGenerator, InsertDirection, InsertNodeOptions, MinimapPluginOptions, NodeActionsConfig, NodeBehaviorConfig, NodeDecoration, NodePaletteItem, OverlayManager, PluginManagedToolbarType, QuickAddConfig, QuickAddInsertDirectionResolver, QuickAddPortResolver, RuntimePluginContext, ScreenPosition, SearchNodeMeta, SearchPluginOptions, SelectionPluginOptions, SnaplinePluginOptions };
|