@blueking/flow-canvas 0.0.1-beta.1
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 +725 -0
- package/dist/core/apply-command.d.ts +11 -0
- package/dist/core/editor.d.ts +50 -0
- package/dist/core/errors.d.ts +6 -0
- package/dist/core/history.d.ts +15 -0
- package/dist/core/plugin-manager.d.ts +58 -0
- package/dist/index-BAAMFT_J.js +236 -0
- package/dist/index-CleU3x1v.cjs +1 -0
- package/dist/index-DD3pv5ZZ.cjs +21 -0
- package/dist/index-siYsjzl4.js +181 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.d.ts +33 -0
- package/dist/index.esm.js +2709 -0
- package/dist/plugins/clipboard.d.ts +9 -0
- package/dist/plugins/connection-validator.d.ts +3 -0
- package/dist/plugins/minimap.d.ts +7 -0
- package/dist/plugins/selection.d.ts +7 -0
- package/dist/plugins/snapline.d.ts +6 -0
- package/dist/runtime/canvas-api.d.ts +25 -0
- package/dist/runtime/canvas-runtime-core.vue.d.ts +36 -0
- package/dist/runtime/event-bridge.d.ts +28 -0
- package/dist/runtime/graph-bridge.d.ts +127 -0
- package/dist/runtime/overlay-manager.d.ts +4 -0
- package/dist/runtime/shape-registry.d.ts +8 -0
- package/dist/runtime/use-edge-delete-tool.d.ts +11 -0
- package/dist/runtime/use-node-hover.d.ts +8 -0
- package/dist/runtime/use-port-visibility.d.ts +15 -0
- package/dist/shell/canvas-layout.vue.d.ts +35 -0
- package/dist/shell/canvas-node-palette.vue.d.ts +10 -0
- package/dist/shell/canvas-toolbar.vue.d.ts +11 -0
- package/dist/shell/default-node.vue.d.ts +4 -0
- package/dist/shell/default-schema.d.ts +39 -0
- package/dist/shell/node-actions-toolbar.vue.d.ts +18 -0
- package/dist/shell/node-quick-add-popover.vue.d.ts +36 -0
- package/dist/shell/toolbar-items.d.ts +13 -0
- package/dist/style.css +1 -0
- package/dist/types/api.d.ts +104 -0
- package/dist/types/command.d.ts +160 -0
- package/dist/types/flow-model.d.ts +46 -0
- package/dist/types/history.d.ts +18 -0
- package/dist/types/overlay.d.ts +17 -0
- package/dist/types/plugin.d.ts +64 -0
- package/dist/types/schema.d.ts +77 -0
- package/dist/utils/path.d.ts +7 -0
- package/dist/utils/uuid.d.ts +1 -0
- package/package.json +55 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";var _e=Object.create;var he=Object.defineProperty;var Ae=Object.getOwnPropertyDescriptor;var Te=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,$e=Object.prototype.hasOwnProperty;var Le=(i,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Te(e))!$e.call(i,o)&&o!==t&&he(i,o,{get:()=>e[o],enumerable:!(n=Ae(e,o))||n.enumerable});return i};var pe=(i,e,t)=>(t=i!=null?_e(Re(i)):{},Le(e||!i||!i.__esModule?he(t,"default",{value:i,enumerable:!0}):t,i));Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const s=require("vue"),ze=require("@antv/x6"),Ve=require("@antv/x6-vue-shape");function Oe(){return{version:"1.0",nodes:{},edges:{}}}class q extends Error{constructor(e){super(e),this.name="CanvasConstraintError"}}class Ee extends Error{constructor(e){super(e),this.name="CanvasSchemaError"}}function ae(i,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 n=i?{...i}:{};let o=n;for(let a=0;a<e.length-1;a++){const l=e[a],d=o[l];d&&typeof d=="object"&&!Array.isArray(d)?o[l]={...d}:o[l]={},o=o[l]}const r=e[e.length-1];return t===void 0?delete o[r]:o[r]=t,n}function re(i,e){switch(e.type){case"node.add":return je(i,e.node);case"node.move":return Fe(i,e.nodeId,e.position);case"node.remove":return He(i,e.nodeId);case"node.update":return qe(i,e.nodeId,e.patch);case"node.set-payload":return Ue(i,e.nodeId,e.path,e.value);case"node.set-extensions":return Ge(i,e.nodeId,e.path,e.value);case"edge.add":return We(i,e.edge);case"edge.remove":return Qe(i,e.edgeId);case"edge.reconnect":return Xe(i,e.edgeId,e.source,e.target);case"edge.update":return Ye(i,e.edgeId,e.patch);case"edge.set-payload":return Ke(i,e.edgeId,e.path,e.value);case"edge.label.update":return Ze(i,e.edgeId,e.labelId,e.patch);case"model.set-meta":return Je(i,e.path,e.value);default:throw new q(`Unknown command type: ${e.type}`)}}function oe(i,e){const t=i.nodes[e];if(!t)throw new q(`Node "${e}" does not exist`);return t}function ne(i,e){const t=i.edges[e];if(!t)throw new q(`Edge "${e}" does not exist`);return t}function ee(i,e,t){const n=i.nodes[e.nodeId];if(!n)throw new q(`${t} node "${e.nodeId}" does not exist`);if(e.portId&&n.ports&&!n.ports.some(r=>r.id===e.portId))throw new q(`${t} port "${e.portId}" not found on node "${e.nodeId}"`)}function le(i,e,t){return{...i,nodes:{...i.nodes,[e]:t}}}function de(i,e,t){return{...i,edges:{...i.edges,[e]:t}}}function je(i,e){if(i.nodes[e.id])throw new q(`Node id "${e.id}" already exists`);return{...i,nodes:{...i.nodes,[e.id]:e}}}function Fe(i,e,t){const n=oe(i,e);return le(i,e,{...n,position:t})}function He(i,e){oe(i,e);const{[e]:t,...n}=i.nodes,o={};for(const[r,a]of Object.entries(i.edges))a.source.nodeId!==e&&a.target.nodeId!==e&&(o[r]=a);return{...i,nodes:n,edges:o}}function qe(i,e,t){const n=oe(i,e);return le(i,e,{...n,...t,id:n.id})}function Ue(i,e,t,n){const o=oe(i,e),r=ae(o.payload,t,n);return le(i,e,{...o,payload:r})}function Ge(i,e,t,n){const o=oe(i,e),r=ae(o.extensions,t,n);return le(i,e,{...o,extensions:r})}function We(i,e){if(i.edges[e.id])throw new q(`Edge id "${e.id}" already exists`);if(ee(i,e.source,"Source"),ee(i,e.target,"Target"),e.labels){const t=new Set;for(const n of e.labels){if(t.has(n.id))throw new q(`Duplicate label id "${n.id}" in edge "${e.id}"`);t.add(n.id)}}return{...i,edges:{...i.edges,[e.id]:e}}}function Qe(i,e){ne(i,e);const{[e]:t,...n}=i.edges;return{...i,edges:n}}function Xe(i,e,t,n){const o=ne(i,e),r=t??o.source,a=n??o.target;return ee(i,r,"Source"),ee(i,a,"Target"),de(i,e,{...o,source:r,target:a})}function Ye(i,e,t){const n=ne(i,e),o={...n,...t,id:n.id};return t.source&&ee(i,o.source,"Source"),t.target&&ee(i,o.target,"Target"),de(i,e,o)}function Ke(i,e,t,n){const o=ne(i,e),r=ae(o.payload,t,n);return de(i,e,{...o,payload:r})}function Ze(i,e,t,n){const o=ne(i,e);if(!o.labels)throw new q(`Edge "${e}" has no labels`);const r=o.labels.findIndex(l=>l.id===t);if(r===-1)throw new q(`Label "${t}" not found in edge "${e}"`);const a=[...o.labels];return a[r]={...a[r],...n,id:t},de(i,e,{...o,labels:a})}function Je(i,e,t){const n=ae(i.meta,e,t);return{...i,meta:n}}function Ce(i,e){const t=e?.maxHistorySize??100,n=s.ref(i),o=[],r=[],a=s.ref(!1),l=s.ref(!1);function d(){a.value=o.length>0,l.value=r.length>0}function u(w){const b=n.value;let g=b;for(const P of w.commands)g=re(g,P);return o.push({snapshot:b,envelope:w}),o.length>t&&o.shift(),r.length=0,n.value=g,d(),g}function f(){const w=o.pop();return w?(r.push({snapshot:n.value,envelope:w.envelope}),n.value=w.snapshot,d(),w.snapshot):null}function c(){const w=r.pop();if(!w)return null;o.push({snapshot:n.value,envelope:w.envelope});let b=n.value;for(const g of w.envelope.commands)b=re(b,g);return n.value=b,d(),b}function k(){o.length=0,r.length=0,d()}function p(){return n.value}function x(w){n.value=w,k()}return{currentFlowModel:n,execute:u,undo:f,redo:c,canUndo:a,canRedo:l,get undoStack(){return o.map(w=>w.envelope)},get redoStack(){return r.map(w=>w.envelope)},clear:k,createSnapshot:p,replaceFlowModel:x}}function et(i){return i!==null&&typeof i=="object"&&i.rejected===!0}class tt{plugins=[];editorContext=null;runtimeCtx=null;runtimeVersion=0;install(e,t){this.plugins=[...e].sort((n,o)=>(n.priority??100)-(o.priority??100)),this.editorContext=t;for(const n of this.plugins)n.install?.(t)}attachRuntime(e){const t=++this.runtimeVersion;this.runtimeCtx=e;const n=this.createSafeRuntimeContext(e,t);for(const o of this.plugins)o.attachRuntime?.(n)}detachRuntime(){for(const e of[...this.plugins].reverse())e.detachRuntime?.();this.runtimeCtx=null}createSafeRuntimeContext(e,t){const n=this,o=new Proxy(e.graph,{get(r,a,l){const d=Reflect.get(r,a,l);return a==="use"&&typeof d=="function"?function(...f){if(n.runtimeVersion===t)return d.apply(r,f)}:d}});return{...e,graph:o}}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 n of this.plugins){if(!n.transformCommand)continue;const o=this.createPreview(t),r=n.transformCommand(t,o,this.editorContext);if(r===null)return{rejected:!0,error:{code:"plugin_rejected",reason:"",source:n.name}};if(et(r))return{rejected:!0,error:{code:r.code??"plugin_rejected",reason:r.reason,source:n.name}};t=r}return{envelope:t}}afterCommand(e,t,n){if(this.editorContext)for(const o of this.plugins)o.afterCommand?.(e,t,n,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 n of this.plugins){const o=n.onBlankContextMenu?.(e,this.runtimeCtx);o&&t.push(...o)}return t}collectToolbarItems(){if(!this.editorContext)return[];const e=new Map;for(const t of this.plugins){const n=t.provideToolbarItems?.(this.editorContext);if(n)for(const o of n)e.set(o.id,o)}return[...e.values()].sort((t,n)=>(t.order??0)-(n.order??0))}collectNodeDecorations(e){if(!this.editorContext)return;let t;for(const n of this.plugins){const o=n.decorateNode?.(e,this.editorContext);o&&(t=t?{...t,...o}:o)}return t}collectEdgeDecorations(e){if(!this.editorContext)return;let t;for(const n of this.plugins){const o=n.decorateEdge?.(e,this.editorContext);o&&(t=t?{...t,...o}:o)}return t}collectExtendedApi(){if(!this.runtimeCtx)return{};const e={};for(const t of this.plugins){const n=t.extendApi?.(this.runtimeCtx.api,this.runtimeCtx);n&&Object.assign(e,n)}return e}createPreview(e){const t=this.editorContext;return{previewFlowModel(n){const o=n??e.commands;let r=t.flowModel.value;for(const a of o)r=re(r,a);return r}}}}function ot(i){const{initialFlowModel:e,schema:t,plugins:n=[],historyOptions:o}=i,r=Ce(e,o),a=s.ref(i.mode??"edit"),l=s.ref(!1),d=s.ref(null),u=s.ref([]),f={},c=new tt;function k(b,g,P,h="user:toolbar"){const m={id:`history-${Date.now()}`,source:h,label:b,timestamp:Date.now(),commands:[]};c.afterCommand(m,g,P),u.value=c.collectToolbarItems(),i.onCommandResult?.({status:"applied",envelope:m,flowModel:P}),i.onFlowModelChange?.({flowModel:P,prevFlowModel:g,envelope:m,source:h})}const p={execute:r.execute,undo(){const b=r.currentFlowModel.value,g=r.undo();return g&&k("撤销",b,g),g},redo(){const b=r.currentFlowModel.value,g=r.redo();return g&&k("重做",b,g),g},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 g=r.currentFlowModel.value;r.replaceFlowModel(b),k("替换 FlowModel",g,b,"system:replace")}},x={flowModel:s.computed(()=>r.currentFlowModel.value),history:p,schema:t,mode:a,executeCommand:w,replaceFlowModel(b){p.replaceFlowModel(b)},setMode(b){a.value=b},selectionMode:l,setSelectionMode(b){l.value=b},api:d,toolbarItems:u,extendedApi:f,_pluginManager:c};c.install(n,{flowModel:x.flowModel,history:p,schema:t,mode:a,executeCommand:w}),u.value=c.collectToolbarItems(),s.onScopeDispose(()=>{c.dispose()});function w(b){const g=c.transformCommand(b);if("rejected"in g){const m={status:"rejected",envelope:b,error:g.error};return i.onCommandResult?.(m),m}const P=g.envelope,h=r.currentFlowModel.value;try{const m=r.execute(P),S={status:"applied",envelope:P,flowModel:m};return c.afterCommand(P,h,m),u.value=c.collectToolbarItems(),i.onCommandResult?.(S),i.onFlowModelChange?.({flowModel:m,prevFlowModel:h,envelope:P,source:P.source}),S}catch(m){if(m instanceof q){const S={status:"invalid",envelope:P,error:{code:"constraint_violated",reason:m.message,source:"engine"}};return i.onCommandResult?.(S),S}throw m}}return x}class nt{graph;schema;shapeRegistry;resolveNodeDecoration;resolveEdgeDecoration;resolveCanvasContext;knownNodeIds=new Set;knownEdgeIds=new Set;syncing=!1;prevNodeDecorationClasses=new Map;prevNodeDecorationColors=new Set;prevEdgeDecorationClasses=new Map;prevEdgeDecorationColors=new Set;highlightedNodeIds=new Set;highlightedEdgeIds=new Set;hoveredEdgeId=null;defaultHighlightedNodeIds=new Set;defaultHighlightedEdgeIds=new Set;prevEdgeStyleIds=new Set;nodeDefaultAttrs=new Map;edgeDefaultAttrs=new Map;lastModel=null;constructor(e,t,n,o,r,a){this.graph=e,this.schema=t,this.shapeRegistry=n,this.resolveNodeDecoration=o,this.resolveEdgeDecoration=r,this.resolveCanvasContext=a}syncFlowModel(e){if(!this.syncing){this.syncing=!0,this.lastModel=e;try{const t=this.resolveNodes(e),n=this.resolveEdges(e);this.syncNodes(t),this.syncEdges(n,e)}finally{this.syncing=!1}}}get isSyncing(){return this.syncing}saveNodeDefaultAttrs(e,t){const o=t.x6CellConfig?.attrs?.body;if(!o)return;const r={};let a=!1;o.stroke!==void 0&&(r.stroke=o.stroke,a=!0),o.strokeWidth!==void 0&&(r.strokeWidth=o.strokeWidth,a=!0),a&&this.nodeDefaultAttrs.set(e,r)}saveEdgeDefaultAttrs(e,t){const o=t?.x6EdgeConfig?.attrs?.line;if(!o)return;const r={};let a=!1;o.stroke!==void 0&&(r.stroke=o.stroke,a=!0),o.strokeWidth!==void 0&&(r.strokeWidth=o.strokeWidth,a=!0),o.strokeDasharray!==void 0&&(r.strokeDasharray=o.strokeDasharray,a=!0),a&&this.edgeDefaultAttrs.set(e,r)}restoreNodeAttr(e,t,n){const o=this.nodeDefaultAttrs.get(e.id)?.[n];o!==void 0?e.setAttrByPath(t,o):e.removeAttrByPath(t)}restoreEdgeAttr(e,t,n){const o=this.edgeDefaultAttrs.get(e.id)?.[n];o!==void 0?e.setAttrByPath(t,o):e.removeAttrByPath(t)}syncEdgeMarker(e,t,n){const r=t?.x6EdgeConfig?.attrs?.line?.[n],a=`line/${n}`;e.removeAttrByPath(a),r!==void 0&&e.setAttrByPath(a,r)}dispose(){this.knownNodeIds.clear(),this.knownEdgeIds.clear()}resolveNodes(e){const t=new Map;for(const[n,o]of Object.entries(e.nodes)){const r=this.schema.nodeTypes[o.type];if(!r)throw new Ee(`Unknown node type "${o.type}" for node "${n}". 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(o.type,r.component),l=r.getSize(o),d=r.getPorts?.(o)??o.ports??[];t.set(n,{model:o,definition:r,shapeName:a,size:l,ports:d})}return t}resolveEdges(e){const t=new Map;for(const[n,o]of Object.entries(e.edges)){const r=o.type??this.schema.defaultEdgeType??"default",a=this.schema.edgeTypes?.[r];t.set(n,{model:o,definition:a})}return t}syncNodes(e){const t=new Set(e.keys());for(const n of this.knownNodeIds)if(!t.has(n)){const o=this.graph.getCellById(n);o&&this.graph.removeCell(o),this.knownNodeIds.delete(n),this.defaultHighlightedNodeIds.delete(n),this.prevNodeDecorationClasses.delete(n),this.prevNodeDecorationColors.delete(n),this.nodeDefaultAttrs.delete(n)}for(const[n,o]of e){const r=this.graph.getCellById(n);r?this.updateExistingNode(r,o):this.addNewNode(n,o)}}updateExistingNode(e,t){const{model:n,size:o,ports:r,definition:a}=t,l=e.getPosition();(l.x!==n.position.x||l.y!==n.position.y)&&e.setPosition(n.position.x,n.position.y);const d=e.getSize();(d.width!==o.width||d.height!==o.height)&&e.setSize(o.width,o.height,{silent:!0}),this.syncNodePorts(e,r),e.setData({...n},{silent:!0}),this.applyNodeBehavior(e,n,a),this.applyNodeHighlightAndDecoration(e,n)}syncNodePorts(e,t){const n=e.getPorts(),o=new Set(t.map(a=>a.id)),r=new Set(n.map(a=>a.id));for(const a of n)a.id&&!o.has(a.id)&&e.removePort(a.id);for(const a of t)r.has(a.id)||e.addPort({id:a.id,group:a.group,...a.x6PortConfig})}addNewNode(e,t){const{model:n,shapeName:o,size:r,ports:a,definition:l}=t,d={id:n.id,shape:o,x:n.position.x,y:n.position.y,width:r.width,height:r.height,data:{...n},ports:{groups:{top:{position:"top",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},right:{position:"right",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},bottom:{position:"bottom",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}},left:{position:"left",attrs:{circle:{r:6,magnet:!0,fill:"#3a84ff",stroke:"#fff",strokeWidth:1,visibility:"hidden"}}}},items:a.map(f=>({id:f.id,group:f.group,...f.x6PortConfig}))},...l.x6CellConfig};this.graph.addNode(d),this.knownNodeIds.add(e),this.saveNodeDefaultAttrs(e,l);const u=this.graph.getCellById(e);u&&(this.applyNodeBehavior(u,n,l),this.applyNodeHighlightAndDecoration(u,n))}applyNodeBehavior(e,t,n){if(!n.getBehavior)return;const o=this.resolveCanvasContext?.();if(!o)return;const r=n.getBehavior(t,o);if(r.draggable!==void 0&&e.setProp("draggable",r.draggable,{silent:!0}),r.connectable!==void 0){const l=r.connectable;for(const d of e.getPorts())e.setPortProp(d.id,"attrs/circle/magnet",l,{silent:!0})}if(r.showPorts!==void 0){const l=r.showPorts;for(const d of e.getPorts())e.setPortProp(d.id,"attrs/circle/style/visibility",l?"visible":"hidden",{silent:!0})}const a=e.getData()??{};r.deletable!==void 0&&a._deletable!==r.deletable&&e.setData({...a,_deletable:r.deletable},{silent:!0}),r.selectable!==void 0&&a._selectable!==r.selectable&&e.setData({...e.getData(),_selectable:r.selectable},{silent:!0})}syncEdges(e,t){const n=new Set(e.keys());for(const o of this.knownEdgeIds)if(!n.has(o)){const r=this.graph.getCellById(o);r&&this.graph.removeCell(r),this.knownEdgeIds.delete(o),this.defaultHighlightedEdgeIds.delete(o),this.prevEdgeDecorationClasses.delete(o),this.prevEdgeDecorationColors.delete(o),this.prevEdgeStyleIds.delete(o),this.edgeDefaultAttrs.delete(o)}for(const[o,r]of e){const a=this.graph.getCellById(o),{model:l,definition:d}=r;a?(this.updateExistingEdge(a,l,d,t),this.knownEdgeIds.has(o)||(this.knownEdgeIds.add(o),this.saveEdgeDefaultAttrs(o,d))):this.addNewEdge(o,l,d)}}updateExistingEdge(e,t,n,o){const r=e.getSource(),a=e.getTarget();if((r.cell!==t.source.nodeId||r.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}),n?.router){const l=typeof n.router=="string"?{name:n.router}:n.router;e.setRouter(l)}if(n?.connector){const l=typeof n.connector=="string"?{name:n.connector}:n.connector;e.setConnector(l)}this.syncEdgeMarker(e,n,"sourceMarker"),this.syncEdgeMarker(e,n,"targetMarker"),this.syncEdgeLabels(e,t),e.setData({...t},{silent:!0}),this.applyEdgeStyleAndDecoration(e,t,n)}syncEdgeLabels(e,t){if(!t.labels?.length){e.getLabels().length>0&&e.setLabels([]);return}const n=t.labels.map(o=>({attrs:{label:{text:o.text??""}},position:o.position!=null?{distance:o.position}:void 0}));e.setLabels(n)}addNewEdge(e,t,n){const o={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};n?.router&&(o.router=typeof n.router=="string"?{name:n.router}:n.router),n?.connector&&(o.connector=typeof n.connector=="string"?{name:n.connector}:n.connector),n?.x6EdgeConfig&&Object.assign(o,n.x6EdgeConfig),t.labels?.length&&(o.labels=t.labels.map(a=>({attrs:{label:{text:a.text??""}},position:a.position!=null?{distance:a.position}:void 0}))),this.graph.addEdge(o),this.knownEdgeIds.add(e),this.saveEdgeDefaultAttrs(e,n);const r=this.graph.getCellById(e);r&&this.applyEdgeStyleAndDecoration(r,t,n)}refreshEdgeStyles(){if(this.lastModel)for(const[e,t]of Object.entries(this.lastModel.edges)){const n=this.graph.getCellById(e);if(!n?.isEdge())continue;const o=t.type??this.schema.defaultEdgeType??"default",r=this.schema.edgeTypes?.[o];this.applyEdgeStyleAndDecoration(n,t,r)}}refreshNodeHighlights(){if(this.lastModel)for(const[e,t]of Object.entries(this.lastModel.nodes)){const n=this.graph.getCellById(e);n?.isNode()&&this.applyNodeHighlightAndDecoration(n,t)}}applyNodeHighlightAndDecoration(e,t){const n=this.highlightedNodeIds.has(e.id),o=this.resolveNodeDecoration?.(t),r=this.prevNodeDecorationClasses.get(e.id);r&&(this.graph.findViewByCell(e)?.container?.classList.remove(r),this.prevNodeDecorationClasses.delete(e.id)),o?.className&&(this.graph.findViewByCell(e)?.container?.classList.add(o.className),this.prevNodeDecorationClasses.set(e.id,o.className));const a=o?.borderColor,d=a??(n?"#3a84ff":void 0),u=this.prevNodeDecorationColors.has(e.id)||this.defaultHighlightedNodeIds.has(e.id);d?(e.setAttrByPath("body/stroke",d),e.setAttrByPath("body/strokeWidth",2)):u&&(this.restoreNodeAttr(e,"body/stroke","stroke"),this.restoreNodeAttr(e,"body/strokeWidth","strokeWidth")),a?this.prevNodeDecorationColors.add(e.id):this.prevNodeDecorationColors.delete(e.id),n&&!a?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,n){const o=this.highlightedEdgeIds.has(e.id),r=this.resolveEdgeDecoration?.(t),a=this.prevEdgeDecorationClasses.get(e.id);a&&(this.graph.findViewByCell(e)?.container?.classList.remove(a),this.prevEdgeDecorationClasses.delete(e.id)),r?.className&&(this.graph.findViewByCell(e)?.container?.classList.add(r.className),this.prevEdgeDecorationClasses.set(e.id,r.className));let l,d,u;if(n?.style){const x=this.graph.isSelected?.(e)??!1,w=this.hoveredEdgeId===e.id,b=n.style(t,{selected:x,highlighted:o,hovered:w});l=b.stroke,d=b.strokeWidth,u=b.strokeDasharray}const f=!n?.style&&o?"#3a84ff":void 0,c=r?.strokeColor,k=c??l??f,p=!!n?.style||this.prevEdgeDecorationColors.has(e.id)||this.defaultHighlightedEdgeIds.has(e.id)||this.prevEdgeStyleIds.has(e.id);k?e.setAttrByPath("line/stroke",k):p&&this.restoreEdgeAttr(e,"line/stroke","stroke"),n?.style?(this.prevEdgeStyleIds.add(e.id),d?e.setAttrByPath("line/strokeWidth",d):this.restoreEdgeAttr(e,"line/strokeWidth","strokeWidth"),u?e.setAttrByPath("line/strokeDasharray",u):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)),c?this.prevEdgeDecorationColors.add(e.id):this.prevEdgeDecorationColors.delete(e.id),f?this.defaultHighlightedEdgeIds.add(e.id):this.defaultHighlightedEdgeIds.delete(e.id)}}let st=0;function _(){const i=Date.now().toString(36),e=Math.random().toString(36).substring(2,8);return`${i}-${e}-${++st}`}class it{instanceId=_();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 n=this.getShapeName(e);return Ve.register({shape:n,component:t,width:100,height:40}),n}dispose(){this.registeredShapes.clear()}}class rt{graph;onUiEvent;onCommand;flowModelRef;disposers=[];constructor(e,t,n,o){this.graph=e,this.onUiEvent=t,this.onCommand=n,this.flowModelRef=o,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 o=t.target?.closest?.(".x6-edge-label");if(o){const a=e.getData?.()?.labels??[],l=o.parentElement?.querySelectorAll(".x6-edge-label"),d=l?Array.from(l).indexOf(o):0,u=a[Math.max(0,d)];this.onUiEvent({type:"edge.label.click",edgeId:e.id,labelId:u?.id??`label-${d}`});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:_(),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 n=e.getSourceCell(),o=e.getTargetCell();if(!n||!o)return;const r=e.getSourcePortId(),a=e.getTargetPortId(),l=e.id in this.flowModelRef.value.edges;t&&!l?this.onCommand({id:_(),source:"user:drag",label:"连线",timestamp:Date.now(),commands:[{type:"edge.add",edge:{id:e.id,source:{nodeId:n.id,portId:r??void 0},target:{nodeId:o.id,portId:a??void 0}}}]}):this.onCommand({id:_(),source:"user:drag",label:"重连",timestamp:Date.now(),commands:[{type:"edge.reconnect",edgeId:e.id,source:{nodeId:n.id,portId:r??void 0},target:{nodeId:o.id,portId:a??void 0}}]})}),this.on("edge:change:labels",({edge:e,current:t})=>{const o=e.getData?.()?.labels??[];if(!o.length||!t?.length)return;const r=[];for(let a=0;a<Math.min(o.length,t.length);a++){const l=t[a],d=o[a];if(!d?.id)continue;const u=typeof l.position=="object"?l.position?.distance:l.position;u!=null&&r.push({type:"edge.label.update",edgeId:e.id,labelId:d.id,patch:{position:u}})}r.length&&this.onCommand({id:_(),source:"user:drag",label:"拖动标签",timestamp:Date.now(),commands:r})})}on(e,t){this.graph.on(e,t),this.disposers.push(()=>this.graph.off(e,t))}}function at(i,e){const t=s.ref(null);function n(r){const a=i.getCellById(r);if(!a||!a.isNode())return null;const l=a,d=l.getPosition(),u=l.getSize(),f={x:d.x,y:d.y,width:u.width,height:u.height},c=i.localToGraph(f);return new DOMRect(c.x,c.y,c.width,c.height)}function o(r,a){const l=i.getCellById(r);if(!l||!l.isNode())return null;const d=l,u=d.getData()??{},f=u.type,p=((f?e.nodeTypes[f]:void 0)?.getOverlayAnchors?.(u)??{})[a],x=p&&typeof p=="object"&&"x"in p?p:void 0,w=d.getPosition(),b=w.x+(x?.x??0),g=w.y+(x?.y??0),P=i.localToGraph({x:b,y:g});return{x:P.x,y:P.y}}return{overlayContainer:t,getNodeScreenRect:n,getAnchorScreenPosition:o}}const lt=100;function dt({graph:i,overlayManager:e,executeCommand:t,schema:n,flowModel:o,defaultInsertGap:r,getContextMenuItems:a,onHighlightChange:l,resolveNodeShape:d}){let u=[],f=[],c=null,k=!1,p=null,x=!1;async function w(){if(k)return c;k=!0;try{const h=await Promise.resolve().then(()=>require("./index-DD3pv5ZZ.cjs")),m=h.Dnd??h.default;return m?(c=new m({target:i,scaled:!0,animation:!0,getDragNode:S=>S.clone(),getDropNode:S=>S.clone()}),c):null}catch{return console.warn("[flow-canvas] @antv/x6-plugin-dnd not available, add it to your dependencies"),null}}async function b(){if(!x){x=!0;try{const h=await Promise.resolve().then(()=>require("./index-CleU3x1v.cjs")),m=h.Export??h.default;m&&i.use(new m)}catch{console.warn("[flow-canvas] @antv/x6-plugin-export not available, add it to your dependencies")}}}const g=({node:h})=>{const m=h.getData?.();if(!m?._dndSessionId||m._dndSessionId!==p)return;p=null;const S=h.getPosition();i.removeNode(h.id);const{_dndSessionId:z,...I}=m,N=I.id||_();t({id:_(),source:"user:drag",label:"拖入节点",timestamp:Date.now(),commands:[{type:"node.add",node:{...I,id:N,position:{x:S.x,y:S.y}}}]})};return i.on("node:added",g),{zoomIn(){i.zoom(.1)},zoomOut(){i.zoom(-.1)},zoomTo(h){i.zoomTo(h)},zoomToFit(){i.zoomToFit({padding:40,maxScale:1.5})},getZoom(){return i.zoom()},centerContent(){i.centerContent()},scrollToOrigin(){i.translate(0,0)},scrollToNode(h){const m=i.getCellById(h);m&&i.centerCell(m)},getSelection(){const h=i.getSelectedCells?.()??[];return{nodeIds:h.filter(m=>m.isNode()).map(m=>m.id),edgeIds:h.filter(m=>m.isEdge()).map(m=>m.id)}},selectNodes(h){const m=h.map(S=>i.getCellById(S)).filter(Boolean);i.select?.(m)},selectEdges(h){const m=h.map(S=>i.getCellById(S)).filter(Boolean);i.select?.(m)},clearSelection(){const h=i.getSelectedCells?.();h?.length&&i.unselect?.(h)},registerDndSource(h,m){const S=async z=>{const I=await w();if(!I)return;const N=_();p=N;const R=m(),V=d?.(R.type),U=i.createNode({width:V?.width??154,height:V?.height??54,shape:V?.shapeName??"rect",data:{...R,_dndSessionId:N}});I.start(U,z)};return h.addEventListener("mousedown",S),()=>{h.removeEventListener("mousedown",S)}},startConnection(h,m){const S=i.getCellById(h);if(!S?.isNode())return;const z=S,I=i.findViewByCell(z);if(!I)return;const N=I.findPortElem(m,"circle")??I.findPortElem(m);if(!N)return;const V=(N.matches?.("[magnet]")?N:N.querySelector?.("[magnet]"))??N,U=V.getBoundingClientRect(),Y=U.left+U.width/2,G=U.top+U.height/2,H=new MouseEvent("mousedown",{clientX:Y,clientY:G,button:0,buttons:1,bubbles:!0,cancelable:!0});V.dispatchEvent(H)},async exportAsImage(h){await b();const m=i;return typeof m.toPNG!="function"?(console.warn("[flow-canvas] exportAsImage requires @antv/x6-plugin-export, add it to your dependencies"),new Blob):new Promise(S=>{m.toPNG(z=>{fetch(z).then(I=>I.blob()).then(S).catch(()=>S(new Blob))},{backgroundColor:h?.backgroundColor??"#ffffff",padding:h?.padding??20,quality:h?.quality,copyStyles:!0})})},async exportAsSVG(){await b();const h=i;return typeof h.toSVG!="function"?(console.warn("[flow-canvas] exportAsSVG requires @antv/x6-plugin-export, add it to your dependencies"),""):new Promise(m=>{h.toSVG(S=>m(S))})},highlightNodes(h){u=h,l?.(u,f)},highlightEdges(h){f=h,l?.(u,f)},clearHighlight(){u=[],f=[],l?.([],[])},overlay:e,getContextMenuItems(h){return a?.(h)??[]},insertNodeToRight(h,m,S){const z=o.value,I=z.nodes[h];if(!I)return{status:"invalid",envelope:{id:"",source:"user:toolbar",timestamp:Date.now(),commands:[]},error:{code:"constraint_violated",reason:`Source node "${h}" not found`,source:"api"}};const N=S?.gap??r??lt,R=n.nodeTypes[I.type],V=n.nodeTypes[m.type],U=R?.getSize(I)??{width:154,height:54},Y=V?.getSize({...m,position:{x:0,y:0}})??{width:154,height:54},G={x:I.position.x+U.width+N,y:I.position.y+(U.height-Y.height)/2},H=m.id||_(),Q={...m,id:H,position:G},j=[{type:"node.add",node:Q}],te=Y.width+N,K={x:G.x,y:G.y,width:Y.width,height:Y.height};for(const[W,O]of Object.entries(z.nodes)){if(W===h||W===H)continue;const X=n.nodeTypes[O.type]?.getSize(O)??{width:154,height:54},$=K.x<O.position.x+X.width&&K.x+K.width>O.position.x,ue=K.y<O.position.y+X.height&&K.y+K.height>O.position.y;$&&ue&&j.push({type:"node.move",nodeId:W,position:{x:O.position.x+te,y:O.position.y}})}if(S?.autoWireEdges){const W=I.ports?.find($=>$.group==="right"),O=Q.ports?.find($=>$.group==="left"),se=Q.ports?.find($=>$.group==="right"),X=W?Object.values(z.edges).find($=>$.source.nodeId===h&&$.source.portId===W.id):Object.values(z.edges).find($=>$.source.nodeId===h);if(X){const $=X.target;j.push({type:"edge.remove",edgeId:X.id}),j.push({type:"edge.add",edge:{id:_(),source:{nodeId:h,portId:W?.id},target:{nodeId:H,portId:O?.id}}}),j.push({type:"edge.add",edge:{id:_(),source:{nodeId:H,portId:se?.id},target:$}})}else j.push({type:"edge.add",edge:{id:_(),source:{nodeId:h,portId:W?.id},target:{nodeId:H,portId:O?.id}}})}const ce={id:_(),source:S?.source??"user:toolbar",label:S?.label??"插入节点",timestamp:Date.now(),commands:j};return t(ce)},onGraphEvent(h,m){return i.on(h,m),()=>i.off(h,m)},unsafeGetGraph(){return i}}}function ct(){const i=s.ref(null),e=s.ref(!1);let t=null;function n(l){t&&(clearTimeout(t),t=null),i.value=l}function o(){t=setTimeout(()=>{i.value=null,t=null},100)}function r(){t&&(clearTimeout(t),t=null)}function a(){t&&clearTimeout(t)}return{hoveredNodeId:i,isDraggingNode:e,enter:n,leave:o,cancelLeave:r,cleanup:a}}const ve=10;function me(i,e){const t=i.getTotalLength();if(t===0)return{...e,length:0,totalLength:0};let n=i.getPointAtLength(0),o=1/0;const r=50,a=t/r;let l=0;for(let c=0;c<=r;c++){const k=c*a,p=i.getPointAtLength(k),x=(p.x-e.x)**2+(p.y-e.y)**2;x<o&&(o=x,n=p,l=k)}const d=Math.max(0,l-a),u=Math.min(t,l+a),f=(u-d)/20;for(let c=d;c<=u;c+=f){const k=i.getPointAtLength(c),p=(k.x-e.x)**2+(k.y-e.y)**2;p<o&&(o=p,n=k,l=c)}return{x:n.x,y:n.y,length:l,totalLength:t}}function ye(i,e){return i<ve||i>e-ve}function be(){const i="http://www.w3.org/2000/svg",e=document.createElementNS(i,"g");e.setAttribute("class","flow-canvas-edge-delete-tool"),e.style.cursor="pointer";const t=document.createElementNS(i,"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 n=document.createElementNS(i,"text");return n.setAttribute("font-family","flow-canvas"),n.setAttribute("font-size","16"),n.setAttribute("fill","#ffffff"),n.setAttribute("text-anchor","middle"),n.setAttribute("dominant-baseline","central"),n.textContent="",e.appendChild(n),e}function ut(i){let e=null,t=null;function n(l,d){r(),t=l;const u=i.getCellById(l);if(!u?.isEdge())return;const f=i.findViewByCell(u);if(!f)return;const c=f.container.querySelector("path");if(!c)return;const k=i.clientToLocal(d.clientX,d.clientY),p=me(c,k);if(ye(p.length,p.totalLength))return;const x=be();x.setAttribute("transform",`translate(${p.x}, ${p.y})`),f.container.appendChild(x),e=x}function o(l){if(!t)return;const d=i.getCellById(t);if(!d?.isEdge())return;const u=i.findViewByCell(d);if(!u)return;const f=u.container.querySelector("path");if(!f)return;const c=i.clientToLocal(l.clientX,l.clientY),k=me(f,c);if(ye(k.length,k.totalLength))e&&e.setAttribute("display","none");else if(e)e.removeAttribute("display"),e.setAttribute("transform",`translate(${k.x}, ${k.y})`);else{const p=be();p.setAttribute("transform",`translate(${k.x}, ${k.y})`),u.container.appendChild(p),e=p}}function r(){e&&(e.remove(),e=null),t=null}function a(l){l===t&&(e=null,t=null)}return{show:n,move:o,remove:r,handleEdgeRemoved:a}}function ft(i){let e=null,t=0;function n(f){const c=f?"visible":"hidden";for(const k of i.getNodes())for(const p of k.getPorts())k.setPortProp(p.id,"attrs/circle/visibility",c)}function o(f){if(!e)for(const c of f.getPorts())f.setPortProp(c.id,"attrs/circle/visibility","visible")}function r(f){if(!e)for(const c of f.getPorts())f.setPortProp(c.id,"attrs/circle/visibility","hidden")}function a(f){f.getTargetCell()||(e=f.id,n(!0))}function l(){e=null,n(!1),t=Date.now()+300}function d(f){f===e&&(e=null,n(!1))}function u(){return!e&&Date.now()>=t}return{showNodePorts:o,hideNodePorts:r,handleEdgeAdded:a,handleEdgeConnected:l,handleEdgeRemoved:d,canShowEdgeTool:u}}const pt={class:"flow-canvas-node-actions__bar"},gt=s.defineComponent({__name:"node-actions-toolbar",props:{node:{},position:{},config:{},behavior:{}},emits:["action"],setup(i,{emit:e}){const t=i,n=e,o=s.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=s.computed(()=>o.value.copy.visible||o.value.copyInsert.visible||o.value.disconnect.visible),a=s.ref(!1);let l=null;function d(){l&&(clearTimeout(l),l=null),a.value=!0}function u(){l=setTimeout(()=>{a.value=!1,l=null},100)}return s.onBeforeUnmount(()=>{l&&clearTimeout(l)}),(f,c)=>(s.openBlock(),s.createElementBlock("div",{class:"flow-canvas-node-actions",style:s.normalizeStyle({left:`${i.position.x}px`,top:`${i.position.y}px`})},[s.createElementVNode("div",pt,[o.value.debug.visible?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass(["flow-canvas-icon canvas-debug flow-canvas-node-actions__icon",{"is-disabled":o.value.debug.disabled}]),onClick:c[0]||(c[0]=k=>!o.value.debug.disabled&&n("action","debug",i.node.id))},null,2)):s.createCommentVNode("",!0),o.value.delete.visible?(s.openBlock(),s.createElementBlock("i",{key:1,class:s.normalizeClass(["flow-canvas-icon canvas-shanchu flow-canvas-node-actions__icon",{"is-disabled":o.value.delete.disabled}]),onClick:c[1]||(c[1]=k=>!o.value.delete.disabled&&n("action","delete",i.node.id))},null,2)):s.createCommentVNode("",!0),r.value?(s.openBlock(),s.createElementBlock("div",{key:2,class:"flow-canvas-node-actions__more-wrapper",onMouseenter:d,onMouseleave:u},[...c[5]||(c[5]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-gengduo flow-canvas-node-actions__icon"},null,-1)])],32)):s.createCommentVNode("",!0)]),s.createVNode(s.Transition,{name:"flow-canvas-fade"},{default:s.withCtx(()=>[a.value&&r.value?(s.openBlock(),s.createElementBlock("div",{key:0,class:"flow-canvas-node-actions__dropdown",onMouseenter:d,onMouseleave:u},[o.value.copy.visible?(s.openBlock(),s.createElementBlock("div",{key:0,class:s.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":o.value.copy.disabled}]),onClick:c[2]||(c[2]=k=>!o.value.copy.disabled&&n("action","copy",i.node.id))},[...c[6]||(c[6]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-copy-fuzhi-2"},null,-1),s.createElementVNode("span",null,"复制",-1)])],2)):s.createCommentVNode("",!0),o.value.copyInsert.visible?(s.openBlock(),s.createElementBlock("div",{key:1,class:s.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":o.value.copyInsert.disabled}]),onClick:c[3]||(c[3]=k=>!o.value.copyInsert.disabled&&n("action","copy-insert",i.node.id))},[...c[7]||(c[7]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-fuzhibingcharu"},null,-1),s.createElementVNode("span",null,"复制并插入",-1)])],2)):s.createCommentVNode("",!0),o.value.disconnect.visible?(s.openBlock(),s.createElementBlock("div",{key:2,class:s.normalizeClass(["flow-canvas-node-actions__dropdown-item",{"is-disabled":o.value.disconnect.disabled}]),onClick:c[4]||(c[4]=k=>!o.value.disconnect.disabled&&n("action","disconnect",i.node.id))},[...c[8]||(c[8]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-unlock-jiebang"},null,-1),s.createElementVNode("span",null,"断开连线",-1)])],2)):s.createCommentVNode("",!0)],32)):s.createCommentVNode("",!0)]),_:1})],4))}}),Z=(i,e)=>{const t=i.__vccOpts||i;for(const[n,o]of e)t[n]=o;return t},xe=Z(gt,[["__scopeId","data-v-14d6590b"]]),ht={key:0,class:"flow-canvas-quick-add__tooltip"},vt=5,mt=s.defineComponent({__name:"node-quick-add-popover",props:{node:{},portPosition:{},tooltipText:{}},emits:["open","close","start-drag","mouseenter","mouseleave"],setup(i,{expose:e,emit:t}){const n=i,o=t,r=s.ref(),a=s.ref(),l=s.ref(!1),d=s.ref(!1);let u=null,f=!1,c=null;function k(I){I.preventDefault(),I.stopPropagation(),u={x:I.clientX,y:I.clientY},f=!1,document.addEventListener("mousemove",p),document.addEventListener("mouseup",x)}function p(I){if(!u)return;const N=I.clientX-u.x,R=I.clientY-u.y;Math.sqrt(N*N+R*R)>=vt&&(f=!0,w(),o("start-drag",n.node.id))}function x(){w(),f||b(),u=null,f=!1}function w(){document.removeEventListener("mousemove",p),document.removeEventListener("mouseup",x)}function b(){d.value?P():g()}function g(){d.value=!0,o("open",n.node.id),requestAnimationFrame(()=>{document.addEventListener("mousedown",h)})}function P(){d.value=!1,o("close"),document.removeEventListener("mousedown",h)}function h(I){const N=I.target;r.value?.contains(N)||a.value?.contains(N)||P()}function m(){d.value||o("mouseleave")}function S(){c&&(clearTimeout(c),c=null),o("mouseenter")}function z(){c=setTimeout(()=>{P(),o("mouseleave"),c=null},150)}return s.onBeforeUnmount(()=>{w(),c&&clearTimeout(c),document.removeEventListener("mousedown",h)}),e({closePopover:P}),(I,N)=>(s.openBlock(),s.createElementBlock("div",{class:"flow-canvas-quick-add",style:s.normalizeStyle({left:`${i.portPosition.x}px`,top:`${i.portPosition.y}px`}),onMouseenter:N[2]||(N[2]=R=>o("mouseenter")),onMouseleave:m,onClick:N[3]||(N[3]=s.withModifiers(()=>{},["stop"]))},[s.createElementVNode("div",{ref_key:"btnRef",ref:r,class:s.normalizeClass(["flow-canvas-quick-add__btn",{"is-hovered":l.value,"is-active":d.value}]),onMouseenter:N[0]||(N[0]=R=>l.value=!0),onMouseleave:N[1]||(N[1]=R=>l.value=!1),onMousedown:k},[...N[4]||(N[4]=[s.createElementVNode("i",{class:"flow-canvas-icon canvas-zoom-add"},null,-1)])],34),l.value&&!d.value?(s.openBlock(),s.createElementBlock("div",ht,[...N[5]||(N[5]=[s.createElementVNode("div",null,[s.createElementVNode("b",null,"点击"),s.createTextVNode(" 添加节点")],-1),s.createElementVNode("div",null,[s.createElementVNode("b",null,"拖拽"),s.createTextVNode(" 连接节点")],-1)])])):s.createCommentVNode("",!0),s.createVNode(s.Transition,{name:"flow-canvas-fade"},{default:s.withCtx(()=>[d.value?(s.openBlock(),s.createElementBlock("div",{key:0,ref_key:"popoverRef",ref:a,class:"flow-canvas-quick-add__popover",onMouseenter:S,onMouseleave:z},[s.renderSlot(I.$slots,"default",{},()=>[N[6]||(N[6]=s.createElementVNode("div",{class:"flow-canvas-quick-add__default-content"},"节点快捷操作面板",-1))],!0)],544)):s.createCommentVNode("",!0)]),_:3})],36))}}),Ne=Z(mt,[["__scopeId","data-v-deb5af25"]]),yt=s.defineComponent({__name:"canvas-runtime-core",props:{editor:{},graphOptions:{},nodeActions:{},quickAdd:{}},emits:["ui-event"],setup(i,{emit:e}){const t=i,n=e,o=s.ref(),r=s.ref(),a=s.ref();let l,d,u,f;const c=ct(),{hoveredNodeId:k,isDraggingNode:p}=c,x=c.cancelLeave,w=c.leave,b=s.ref(null);let g=null;function P(E){return m(),X(E)?(b.value=E,!0):(b.value=null,!1)}function h(){g&&clearTimeout(g),g=setTimeout(()=>{b.value=null,g=null},150)}function m(){g&&(clearTimeout(g),g=null)}function S(){m(),c.cancelLeave()}function z(){h(),c.leave()}let I=null,N=null,R=null;const V=s.ref(0),U=s.computed(()=>{if(V.value,!t.editor.api.value)return[];const E=t.editor.flowModel.value,C=t.editor.api.value.overlay,y=[];for(const[M,A]of Object.entries(E.nodes)){const B=t.editor._pluginManager.collectNodeDecorations(A);if(!B?.badge)continue;const T=C.getNodeScreenRect(M);T&&y.push({nodeId:M,x:T.x+T.width-4,y:T.y-8,badge:B.badge})}return y}),Y=s.computed(()=>{V.value;const E=k.value;if(!E||!t.editor.api.value)return[];const y=t.editor.flowModel.value.nodes[E];if(!y)return[];const M=t.editor.schema.nodeTypes[y.type];if(!M?.getOverlayAnchors)return[];const A=M.getOverlayAnchors(y),B=t.editor.api.value.overlay,T={};for(const F of Object.keys(A)){const J=B.getAnchorScreenPosition(E,F);J&&(T[F]=J)}return[{node:y,screenAnchors:T}]}),G=s.computed(()=>({showDebug:!1,showDelete:!0,showCopy:!0,showCopyInsert:!0,showDisconnect:!0,insertGap:100,...t.nodeActions})),H=s.computed(()=>{V.value;const E=k.value;if(!E||p.value||!t.editor.api.value||t.editor.mode.value!=="edit")return null;const C=t.editor.flowModel.value,y=C.nodes[E];if(!y)return null;const M=t.editor.api.value.overlay.getNodeScreenRect(E);if(!M)return null;const B=t.editor.schema.nodeTypes[y.type]?.getBehavior?.(y,{api:t.editor.api.value,flowModel:C,history:t.editor.history,mode:t.editor.mode.value})??{};return B.showActions===!1?null:{node:y,position:{x:M.x+M.width,y:M.y+M.height+4},behavior:B}}),Q=s.computed(()=>({enabled:!0,tooltipText:"",...t.quickAdd})),j=s.computed(()=>{if(V.value,!Q.value.enabled)return null;const E=b.value;if(!E||p.value||!t.editor.api.value||t.editor.mode.value!=="edit")return null;const C=t.editor.flowModel.value,y=C.nodes[E];if(!y)return null;const A=t.editor.schema.nodeTypes[y.type]?.getBehavior?.(y,{api:t.editor.api.value,flowModel:C,history:t.editor.history,mode:t.editor.mode.value})??{};if(A.quickAddEnabled===!1)return null;const B=t.editor.api.value.overlay.getNodeScreenRect(E);return B?{node:y,portPosition:{x:B.x+B.width,y:B.y+B.height/2},behavior:A}:null}),te=s.ref();function K(E){const C=j.value;C&&n("ui-event",{type:"node.quick-add",nodeId:E,position:C.portPosition})}function ce(E){const C=t.editor.api.value;C&&C.startConnection(E,"right")}function W(E,C){const y=t.editor.api.value;if(!y)return;const M=C.id||_(),A={...C,id:M};y.insertNodeToRight(E,A,{autoWireEdges:!0,gap:G.value.insertGap,source:"user:quick-add",label:"快捷插入节点"}).status==="applied"&&n("ui-event",{type:"node.action.quick-insert",sourceNodeId:E,newNodeId:M}),te.value?.closePopover()}function O(E){return{id:_(),type:E.type,label:E.label,ports:E.ports?JSON.parse(JSON.stringify(E.ports)):void 0,payload:E.payload?JSON.parse(JSON.stringify(E.payload)):void 0,extensions:E.extensions?JSON.parse(JSON.stringify(E.extensions)):void 0}}function se(E,C){const y=t.editor,M=y.api.value;switch(E){case"delete":{y.executeCommand({id:_(),source:"user:toolbar",label:"删除节点",timestamp:Date.now(),commands:[{type:"node.remove",nodeId:C}]}),n("ui-event",{type:"node.action.delete",nodeId:C}),k.value=null;break}case"copy":{if(!M)break;const A=y.flowModel.value.nodes[C];if(!A)break;const B=O(A);M.insertNodeToRight(C,B,{autoWireEdges:!1,gap:G.value.insertGap,label:"复制节点"}),n("ui-event",{type:"node.action.copy",sourceNodeId:C,newNodeId:B.id});break}case"copy-insert":{if(!M)break;const A=y.flowModel.value.nodes[C];if(!A)break;const B=O(A);M.insertNodeToRight(C,B,{autoWireEdges:!0,gap:G.value.insertGap,label:"复制并插入节点"}),n("ui-event",{type:"node.action.copy-insert",sourceNodeId:C,newNodeId:B.id});break}case"disconnect":{const A=y.flowModel.value,B=Object.entries(A.edges).filter(([,T])=>{const F=T;return F.source.nodeId===C||F.target.nodeId===C}).map(([T])=>T);if(B.length===0)break;y.executeCommand({id:_(),source:"user:toolbar",label:"断开连线",timestamp:Date.now(),commands:B.map(T=>({type:"edge.remove",edgeId:T}))}),n("ui-event",{type:"node.action.disconnect",nodeId:C,edgeIds:B});break}case"debug":{n("ui-event",{type:"node.action.debug",nodeId:C});break}}}function X(E){if(!Q.value.enabled||t.editor.mode.value!=="edit")return!1;const C=t.editor.flowModel.value,y=C.nodes[E];return y?(t.editor.schema.nodeTypes[y.type]?.getBehavior?.(y,{api:t.editor.api.value,flowModel:C,history:t.editor.history,mode:t.editor.mode.value})??{}).quickAddEnabled!==!1:!1}function $(E){if(t.editor.mode.value!=="edit")return;t.editor._pluginManager.dispatchKeyboardShortcut(E)&&(E.preventDefault(),E.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 De(E){const C=t.editor.schema.defaultEdgeType??"default",y=t.editor.schema.edgeTypes?.[C],M={zIndex:-1,attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}};y?.router&&(M.router=typeof y.router=="string"?{name:y.router}:y.router),y?.connector&&(M.connector=typeof y.connector=="string"?{name:y.connector}:y.connector),y?.x6EdgeConfig&&Object.assign(M,y.x6EdgeConfig);const A=M.attrs??{},B=A.line??{};return M.attrs={...A,line:{...B,targetMarker:ue()}},E.createEdge(M)}return s.onMounted(()=>{if(!r.value)return;const E=new Set(["model","container"]),C={};if(t.graphOptions)for(const[v,D]of Object.entries(t.graphOptions)){if(E.has(v)){console.warn(`[flow-canvas] graphOptions.${v} is managed by the engine and will be ignored`);continue}C[v]=D}l=new ze.Graph({container:r.value,autoResize:!0,background:{color:"#edf2fc"},grid:{visible:!0,size:20,type:"dot"},panning:{enabled:!0},mousewheel:{enabled:!0,modifiers:["ctrl","meta"]},connecting:{allowBlank:!1,allowMulti:!0,allowLoop:!1,allowNode:!1,allowEdge:!1,highlight:!0,anchor:"center",connectionPoint:"anchor",snap:{radius:30},createEdge(){return De(this)}},...C}),u=new it,d=new nt(l,t.editor.schema,u,v=>t.editor._pluginManager.collectNodeDecorations(v),v=>t.editor._pluginManager.collectEdgeDecorations(v),()=>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 y=at(l,t.editor.schema);a.value&&(y.overlayContainer.value=a.value);const M=dt({graph:l,overlayManager:y,executeCommand:v=>t.editor.executeCommand(v),schema:t.editor.schema,flowModel:t.editor.flowModel,defaultInsertGap:t.nodeActions?.insertGap,getContextMenuItems:v=>t.editor._pluginManager.collectContextMenuItems(v),onHighlightChange:(v,D)=>{d.setHighlightedNodes(v),d.setHighlightedEdges(D),d.refreshNodeHighlights(),d.refreshEdgeStyles()},resolveNodeShape:v=>{const D=t.editor.schema.nodeTypes[v];if(!D)return null;const L=u.registerNodeType(v,D.component),ie=D.getSize({id:"",type:v,position:{x:0,y:0}});return{shapeName:L,width:ie.width,height:ie.height}}});t.editor.api.value=M;const A={flowModel:t.editor.flowModel,history:t.editor.history,schema:t.editor.schema,mode:t.editor.mode,executeCommand:t.editor.executeCommand,api:M,overlay:y,graph:l};t.editor._pluginManager.attachRuntime(A);const B=t.editor._pluginManager.collectExtendedApi();Object.assign(t.editor.extendedApi,B),f=new rt(l,v=>{(v.type==="node.click"||v.type==="node.dblclick"||v.type==="node.contextmenu")&&c.enter(v.nodeId),t.editor._pluginManager.dispatchUiEvent(v),n("ui-event",v)},v=>{d.isSyncing||t.editor.executeCommand(v)},t.editor.flowModel),I=ut(l);const T=ft(l),F=l,J=v=>{const D=F.isRubberbandEnabled?.()??!1;D&&F.disableRubberband?.(),v?l.enablePanning():l.disablePanning(),D&&F.enableRubberband?.()},fe=()=>{V.value++};l.on("translate",fe),l.on("scale",fe),l.on("resize",fe),l.on("node:move",()=>{p.value=!0}),l.on("node:moved",()=>{p.value=!1}),l.on("node:mouseenter",({node:v})=>{c.enter(v.id),Q.value.enabled&&P(v.id)||T.showNodePorts(v)}),l.on("node:mouseleave",({node:v})=>{c.leave(),Q.value.enabled&&b.value===v.id?h():T.hideNodePorts(v)});function Be(v){const D=l.getCellById(v);if(!D?.isNode())return;const L=D,ie=!p.value&&X(v);for(const ge of L.getPorts()){const Pe=ie&&ge.group==="right"?"hidden":"visible";L.setPortProp(ge.id,"attrs/circle/visibility",Pe)}}s.watch([b,p],([v],[D])=>{if(D&&D!==v){const L=l.getCellById(D);L?.isNode()&&T.hideNodePorts(L)}v&&Be(v)},{flush:"sync"}),l.on("edge:added",({edge:v})=>{T.handleEdgeAdded(v)}),l.on("edge:connected",()=>{T.handleEdgeConnected()}),l.on("edge:removed",({edge:v})=>{T.handleEdgeRemoved(v.id),I.handleEdgeRemoved(v.id)}),l.on("selection:changed",()=>{const v=l.getSelectedCells?.()??[],D={nodeIds:v.filter(L=>L.isNode()).map(L=>L.id),edgeIds:v.filter(L=>L.isEdge()).map(L=>L.id)};t.editor._pluginManager.dispatchSelectionChange(D),n("ui-event",{type:"selection.change",nodeIds:D.nodeIds,edgeIds:D.edgeIds}),d.refreshEdgeStyles()}),l.on("edge:mouseenter",({edge:v,e:D})=>{d.setHoveredEdge(v.id),d.refreshEdgeStyles(),t.editor.mode.value==="edit"&&T.canShowEdgeTool()&&I.show(v.id,D)}),N=v=>I.move(v),l.container.addEventListener("mousemove",N),l.on("edge:mouseleave",()=>{d.setHoveredEdge(null),d.refreshEdgeStyles(),I.remove()}),l.on("edge:click",({edge:v,e:D})=>{D.target?.closest?.(".flow-canvas-edge-delete-tool")&&t.editor.mode.value==="edit"&&(I.remove(),t.editor.executeCommand({id:_(),source:"user:toolbar",label:"删除连线",timestamp:Date.now(),commands:[{type:"edge.remove",edgeId:v.id}]}))}),o.value?.addEventListener("keydown",$),d.syncFlowModel(t.editor.flowModel.value),s.watch(()=>t.editor.flowModel.value,v=>d.syncFlowModel(v)),s.watch(()=>t.editor.selectionMode.value,v=>{if(R?.(),R=null,v){J(!1),F.enableRubberband?.();const D=()=>{l.container.removeEventListener("mouseup",D),R=null,setTimeout(()=>{t.editor.selectionMode.value&&t.editor.setSelectionMode(!1)},50)};l.container.addEventListener("mouseup",D),R=()=>l.container.removeEventListener("mouseup",D)}else F.disableRubberband?.(),J(!0)}),s.watch(()=>t.editor.mode.value,v=>{const D=v==="edit";J(!0),D?F.enableSelection?.():F.disableSelection?.()})}),s.onBeforeUnmount(()=>{c.cleanup(),g&&clearTimeout(g),I?.remove(),R?.(),N&&l?.container?.removeEventListener("mousemove",N),o.value?.removeEventListener("keydown",$),t.editor._pluginManager.detachRuntime(),t.editor.api.value=null;for(const E of Object.keys(t.editor.extendedApi))delete t.editor.extendedApi[E];f?.dispose(),d?.dispose(),u?.dispose(),l?.dispose()}),(E,C)=>(s.openBlock(),s.createElementBlock("div",{ref_key:"rootRef",ref:o,class:"flow-canvas-runtime-core",tabindex:"0"},[s.createElementVNode("div",{ref_key:"containerRef",ref:r,class:"flow-canvas-runtime-core__graph"},null,512),s.createElementVNode("div",{ref_key:"overlayContainerRef",ref:a,class:"flow-canvas-runtime-core__overlay"},[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(U.value,y=>(s.openBlock(),s.createElementBlock("div",{key:`badge-${y.nodeId}`,class:"flow-canvas-runtime-core__badge",style:s.normalizeStyle({left:`${y.x}px`,top:`${y.y}px`,backgroundColor:y.badge.color})},s.toDisplayString(y.badge.text),5))),128)),j.value?(s.openBlock(),s.createBlock(Ne,{key:0,ref_key:"quickAddPopoverRef",ref:te,node:j.value.node,"port-position":j.value.portPosition,"tooltip-text":Q.value.tooltipText,onOpen:K,onStartDrag:ce,onMouseenter:S,onMouseleave:z},{default:s.withCtx(()=>[s.renderSlot(E.$slots,"quick-add-panel",{node:j.value.node,api:i.editor.api.value,insertNodeToRight:y=>W(j.value.node.id,y),closePopover:()=>te.value?.closePopover()},void 0,!0)]),_:3},8,["node","port-position","tooltip-text"])):s.createCommentVNode("",!0),H.value?(s.openBlock(),s.createBlock(xe,{key:1,node:H.value.node,position:H.value.position,config:G.value,behavior:H.value.behavior,onAction:se,onMouseenter:s.unref(x),onMouseleave:s.unref(w)},null,8,["node","position","config","behavior","onMouseenter","onMouseleave"])):s.createCommentVNode("",!0),(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(Y.value,y=>(s.openBlock(),s.createElementBlock("div",{key:y.node.id,class:"flow-canvas-runtime-core__node-overlay",onMouseenter:C[0]||(C[0]=(...M)=>s.unref(x)&&s.unref(x)(...M)),onMouseleave:C[1]||(C[1]=(...M)=>s.unref(w)&&s.unref(w)(...M))},[s.renderSlot(E.$slots,"node-overlay",{node:y.node,screenAnchors:y.screenAnchors,api:i.editor.api.value},void 0,!0)],32))),128))],512)],512))}}),bt=Z(yt,[["__scopeId","data-v-bba2427b"]]),wt={class:"flow-canvas-node-palette"},kt=["data-node-type"],Et={class:"flow-canvas-node-palette__item-label"},Ct=s.defineComponent({__name:"canvas-node-palette",props:{editor:{},items:{}},setup(i){const e=i,t=s.ref(),n=s.computed(()=>e.items?e.items:Object.keys(e.editor.schema.nodeTypes).map(o=>({type:o,label:o.charAt(0).toUpperCase()+o.slice(1)})));return s.watch([()=>e.editor.api.value,n,t],([o,r,a],l,d)=>{if(!o||!a)return;const u=[];for(const f of r){const c=a.querySelector(`[data-node-type="${f.type}"]`);if(!c)continue;const k=o.registerDndSource(c,()=>({id:_(),type:f.type,label:f.label,position:{x:0,y:0}}));u.push(k)}d(()=>{for(const f of u)f()})},{flush:"post"}),(o,r)=>(s.openBlock(),s.createElementBlock("div",wt,[s.createElementVNode("div",{ref_key:"listRef",ref:t,class:"flow-canvas-node-palette__list"},[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(n.value,a=>(s.openBlock(),s.createElementBlock("div",{key:a.type,class:"flow-canvas-node-palette__item","data-node-type":a.type},[a.icon?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass([a.icon,"flow-canvas-node-palette__item-icon"])},null,2)):s.createCommentVNode("",!0),s.createElementVNode("span",Et,s.toDisplayString(a.label),1)],8,kt))),128))],512)]))}}),Ie=Z(Ct,[["__scopeId","data-v-300314b7"]]),xt={class:"flow-canvas-layout"},Nt={class:"flow-canvas-layout__main"},It={class:"flow-canvas-layout__content"},St={key:0,class:"flow-canvas-layout__footer"},Mt=s.defineComponent({__name:"canvas-layout",props:{sidebarCollapsed:{type:Boolean,default:!1},sidebarWidth:{default:260},hideSidebar:{type:Boolean,default:!1},hideFooter:{type:Boolean,default:!1},editor:{default:void 0},paletteItems:{default:void 0}},emits:["update:sidebarCollapsed"],setup(i){return(e,t)=>(s.openBlock(),s.createElementBlock("div",xt,[!i.hideSidebar&&(e.$slots.sidebar||i.editor)?(s.openBlock(),s.createElementBlock("aside",{key:0,class:s.normalizeClass(["flow-canvas-layout__sidebar",{"is-collapsed":i.sidebarCollapsed}]),style:s.normalizeStyle({width:i.sidebarCollapsed?"0px":`${i.sidebarWidth}px`})},[s.renderSlot(e.$slots,"sidebar",{},()=>[i.editor?(s.openBlock(),s.createBlock(Ie,{key:0,editor:i.editor,items:i.paletteItems},null,8,["editor","items"])):s.createCommentVNode("",!0)],!0)],6)):s.createCommentVNode("",!0),s.createElementVNode("div",Nt,[s.createElementVNode("div",It,[s.renderSlot(e.$slots,"default",{},void 0,!0)]),!i.hideFooter&&e.$slots.footer?(s.openBlock(),s.createElementBlock("div",St,[s.renderSlot(e.$slots,"footer",{},void 0,!0)])):s.createCommentVNode("",!0)])]))}}),Dt=Z(Mt,[["__scopeId","data-v-26f35b6b"]]);function Se(i){const e=new Set(i?.exclude),t=[{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}],o=[{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[...[...t,...n].filter(l=>!e.has(l.type)),...o,...r]}const Bt={class:"flow-canvas-toolbar"},Pt={key:0,class:"flow-canvas-toolbar__separator"},_t={class:"flow-canvas-toolbar__group"},At={key:0,class:"flow-canvas-toolbar__zoom-display"},Tt=["data-description","disabled","onClick"],Rt=["textContent"],$t=s.defineComponent({__name:"canvas-toolbar",props:{items:{},exclude:{},editor:{}},setup(i){const e=i,t=s.computed(()=>e.items?e.items:Se({exclude:e.exclude})),n=s.ref(1);let o=null;s.watch(()=>e.editor.api.value,p=>{o?.(),o=null,p&&(n.value=p.getZoom(),o=p.onGraphEvent("scale",()=>{n.value=p.getZoom()}))},{immediate:!0}),s.onScopeDispose(()=>{o?.()});const r=s.computed(()=>`${Math.round(n.value*100)}%`),a=s.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 l(p){return p.visible===!1?!1:typeof p.visible=="function"?a.value?p.visible(a.value):!1:!0}function d(p){return p.type==="select"?e.editor.selectionMode.value:!1}function u(p){return!a.value||p.disabled===!0?!0:typeof p.disabled=="function"?p.disabled(a.value):p.type==="undo"?!e.editor.history.canUndo.value:p.type==="redo"?!e.editor.history.canRedo.value:!1}function f(p){if(!a.value||u(p))return;if(p.onClick){p.onClick(a.value);return}const{api:x}=a.value;switch(p.type){case"undo":e.editor.history.undo();break;case"redo":e.editor.history.redo();break;case"zoom-in":x.zoomIn(),n.value=x.getZoom();break;case"zoom-out":x.zoomOut(),n.value=x.getZoom();break;case"fit":x.zoomToFit();break;case"reset":x.zoomTo(1),x.scrollToOrigin(),n.value=1;break;case"export":x.exportAsImage().then(w=>{const b=URL.createObjectURL(w),g=document.createElement("a");g.href=b,g.download="canvas-export.png",g.click(),URL.revokeObjectURL(b)}).catch(w=>{console.warn("[flow-canvas] Export failed:",w)});break;case"select":e.editor.setSelectionMode(!e.editor.selectionMode.value);break;case"search":case"auto-layout":case"minimap":console.warn(`[flow-canvas] "${p.type}" toolbar item has no built-in handler. Provide an onClick callback.`);break;default:p.type!=="custom"&&console.warn(`[flow-canvas] No default handler for toolbar type "${p.type}". Provide an onClick handler.`);break}}const c=s.computed(()=>t.value.filter(l)),k=s.computed(()=>{const p=new Map,x=[];for(const w of c.value){const b=w.group??"default";p.has(b)||(p.set(b,[]),x.push(b)),p.get(b).push(w)}return x.map(w=>({name:w,items:p.get(w)})).filter(w=>w.items.length>0)});return(p,x)=>(s.openBlock(),s.createElementBlock("div",Bt,[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(k.value,(w,b)=>(s.openBlock(),s.createElementBlock(s.Fragment,{key:w.name},[b>0?(s.openBlock(),s.createElementBlock("div",Pt)):s.createCommentVNode("",!0),s.createElementVNode("div",_t,[(s.openBlock(!0),s.createElementBlock(s.Fragment,null,s.renderList(w.items,g=>(s.openBlock(),s.createElementBlock(s.Fragment,{key:g.id},[g.type==="zoom-display"?(s.openBlock(),s.createElementBlock("span",At,s.toDisplayString(r.value),1)):(s.openBlock(),s.createElementBlock("button",{key:1,class:s.normalizeClass(["flow-canvas-toolbar__btn",{"is-disabled":u(g),"is-active":d(g)}]),"data-description":g.description,disabled:u(g),onClick:P=>f(g)},[g.component?(s.openBlock(),s.createBlock(s.resolveDynamicComponent(g.component),{key:0})):g.icon?(s.openBlock(),s.createElementBlock("i",{key:1,class:s.normalizeClass(g.icon)},null,2)):(s.openBlock(),s.createElementBlock("span",{key:2,class:"flow-canvas-toolbar__text",textContent:s.toDisplayString(g.text??g.description??g.id)},null,8,Rt))],10,Tt))],64))),128))])],64))),128))]))}}),Lt=Z($t,[["__scopeId","data-v-ca50cd45"]]),zt={class:"flow-canvas-default-node__ep-label"},Vt={key:1,class:"flow-canvas-default-node__diamond"},Ot={key:2,class:"flow-canvas-default-node__task-label"},jt=s.defineComponent({__name:"default-node",setup(i){const t=s.inject("getNode")?.(),n=s.computed(()=>t?.getData?.()??null),o=s.computed(()=>n.value?.label||n.value?.type||""),r={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"]),l=new Set(["parallel-gateway","branch-gateway","converge-gateway","conditional-parallel-gateway"]),d=s.computed(()=>{const f=n.value?.type??"";return a.has(f)?"endpoint":l.has(f)?"gateway":"task"}),u=s.computed(()=>r[n.value?.type??""]??"");return(f,c)=>(s.openBlock(),s.createElementBlock("div",{class:s.normalizeClass(["flow-canvas-default-node",`is-${d.value}`])},[d.value==="endpoint"?(s.openBlock(),s.createElementBlock(s.Fragment,{key:0},[u.value?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass([["flow-canvas-icon",u.value],"flow-canvas-default-node__ep-icon"])},null,2)):s.createCommentVNode("",!0),s.createElementVNode("span",zt,s.toDisplayString(o.value),1)],64)):d.value==="gateway"?(s.openBlock(),s.createElementBlock("div",Vt,[u.value?(s.openBlock(),s.createElementBlock("i",{key:0,class:s.normalizeClass([["flow-canvas-icon",u.value],"flow-canvas-default-node__gw-icon"])},null,2)):s.createCommentVNode("",!0)])):(s.openBlock(),s.createElementBlock("span",Ot,s.toDisplayString(o.value),1))],2))}}),Me=Z(jt,[["__scopeId","data-v-c88cdae7"]]),Ft={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}},we=(i,e)=>({stroke:e.hovered?"#3a84ff":"#abb5cc",strokeWidth:2}),ke={attrs:{line:{stroke:"#abb5cc",strokeWidth:2,targetMarker:{name:"block",width:8,height:8}}}},Ht={manhattan:{router:{name:"manhattan",args:{padding:10,maxDirectionChange:90}},connector:{name:"rounded",args:{radius:8}},style:we,x6EdgeConfig:ke},bezier:{connector:{name:"smooth"},style:we,x6EdgeConfig:ke}};function qt(i){const e=i?.nodeTypes??Ft,t={},n=[];for(const[a,l]of Object.entries(e)){const d=l.width??150,u=l.height??50;t[a]={component:Me,getSize:()=>({width:d,height:u}),getPorts:()=>[{id:"top",group:"top"},{id:"right",group:"right"},{id:"bottom",group:"bottom"},{id:"left",group:"left"}]},n.push({type:a,label:l.label??a,icon:l.icon})}const o={...Ht,...i?.edgeTypes},r=i?.defaultEdgeType??"manhattan";return{schema:{nodeTypes:t,defaultEdgeType:r,edgeTypes:o},paletteItems:n}}function Ut(i){return{name:"connection-validator",priority:10,transformCommand(e,t,n){for(const o of e.commands){if(o.type!=="edge.add"&&o.type!=="edge.reconnect")continue;const r=n.flowModel.value,a=o.type==="edge.add"?o.edge.source.nodeId:o.source?.nodeId,l=o.type==="edge.add"?o.edge.target.nodeId:o.target?.nodeId;if(!a||!l)continue;const d=r.nodes[a],u=r.nodes[l];if(!d||!u)continue;const f=o.type==="edge.add"?o.edge.source.portId:o.source?.portId,c=o.type==="edge.add"?o.edge.target.portId:o.target?.portId,k=f?d.ports?.find(g=>g.id===f):void 0,p=c?u.ports?.find(g=>g.id===c):void 0,x=o.type==="edge.reconnect"?o.edgeId:void 0,w=Object.values(r.edges).filter(g=>g.id!==x),b=i({flowModel:r,sourceNode:d,targetNode:u,sourcePort:k,targetPort:p,existingEdges:w});if(!b.valid)return{rejected:!0,reason:b.reason??"Connection validation failed",code:"validation_failed"}}return e}}}function Gt(i){const{rubberband:e=!0,multiple:t=!0,movable:n=!0}=i??{};return{name:"selection",priority:90,async attachRuntime(o){const{Selection:r}=await import("@antv/x6-plugin-selection");o.graph.use(new r({enabled:!0,rubberband:!1,multiple:t,movable:n,showNodeSelectionBox:!0,filter:a=>!(a.isNode()&&(!o.graph.isRubberbandEnabled?.()||(a.getData?.()??{})._selectable===!1))}))}}}function Wt(i){const{tolerance:e=10,color:t="#3a84ff"}=i??{};let n=null;return{name:"snapline",priority:90,async attachRuntime(o){const{Snapline:r}=await import("@antv/x6-plugin-snapline");o.graph.use(new r({enabled:!0,tolerance:e,className:"flow-canvas-snapline"})),n=document.createElement("style"),n.textContent=`.flow-canvas-snapline line { stroke: ${t} !important; }`,document.head.appendChild(n)},detachRuntime(){n?.remove(),n=null}}}function Qt(i){let e=null;return{name:"minimap",priority:90,async attachRuntime(t){if(!i?.container)return;e=i.container;const{MiniMap:n}=await import("@antv/x6-plugin-minimap");t.graph.use(new n({container:i.container,width:i.width??200,height:i.height??160}))},detachRuntime(){e=null},provideToolbarItems(){return[{id:"minimap",type:"minimap",tooltip:"小地图",order:100,visible:!!i?.container,onClick(){if(!e)return;const t=e.style.display==="none";e.style.display=t?"":"none"}}]}}}function Xt(){let i=null,e=0;return{name:"clipboard",priority:90,onKeyboardShortcut(t,n){const o=t.metaKey||t.ctrlKey;if(o&&t.key==="c"){const r=n.graph.getSelectedCells?.()??[];if(!r.length)return!1;const a=n.flowModel.value,l=new Set(r.filter(f=>f.isNode()).map(f=>f.id)),d=[...l].map(f=>a.nodes[f]).filter(Boolean);if(!d.length)return!1;const u=Object.values(a.edges).filter(f=>l.has(f.source.nodeId)&&l.has(f.target.nodeId));return i={nodes:d,edges:u},e=0,!0}if(o&&t.key==="v"){if(!i?.nodes.length)return!1;e++;const r=e*30,a=new Map,l=[];for(const d of i.nodes){const u=`${d.id}_cp${_().slice(0,6)}`;a.set(d.id,u),l.push({type:"node.add",node:{...d,id:u,position:{x:d.position.x+r,y:d.position.y+r},payload:d.payload?{...d.payload}:{},extensions:d.extensions?{...d.extensions}:void 0}})}for(const d of i.edges){const u=a.get(d.source.nodeId),f=a.get(d.target.nodeId);!u||!f||l.push({type:"edge.add",edge:{...d,id:`${d.id}_cp${_().slice(0,6)}`,source:{...d.source,nodeId:u},target:{...d.target,nodeId:f},labels:d.labels?.map(c=>({...c,id:`${c.id}_cp${_().slice(0,6)}`})),payload:d.payload?{...d.payload}:{}}})}return l.length&&n.executeCommand({id:_(),source:"user:keyboard",label:"粘贴",timestamp:Date.now(),commands:l}),!0}return!1}}}exports.CanvasConstraintError=q;exports.CanvasLayout=Dt;exports.CanvasNodePalette=Ie;exports.CanvasRuntime=bt;exports.CanvasSchemaError=Ee;exports.CanvasToolbar=Lt;exports.DefaultNode=Me;exports.NodeActionsToolbar=xe;exports.NodeQuickAddPopover=Ne;exports.applyCanvasCommand=re;exports.clipboardPlugin=Xt;exports.connectionValidatorPlugin=Ut;exports.createCanvasHistory=Ce;exports.createDefaultSchema=qt;exports.createDefaultToolbarItems=Se;exports.createEmptyFlowModel=Oe;exports.generateId=_;exports.minimapPlugin=Qt;exports.selectionPlugin=Gt;exports.snaplinePlugin=Wt;exports.useCanvasEditor=ot;
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
export type { FlowModel, FlowNodeModel, FlowEdgeModel, FlowPortModel, FlowEdgeLabelModel } from './types/flow-model';
|
|
2
|
+
export { createEmptyFlowModel } from './types/flow-model';
|
|
3
|
+
export type { CanvasSchema, CanvasNodeDefinition, CanvasEdgeDefinition, CanvasCallbackContext, CanvasMode, NodeBehaviorConfig, EdgeRenderState, EdgeStyle, } from './types/schema';
|
|
4
|
+
export type { CanvasCommand, CommandEnvelope, CommandSource, CommandPreview, CommandRejection, CommandExecutionResult, CommandExecutionError, FlowModelChangeEvent, CanvasUiEvent, ScreenPosition, CanvasPosition, } from './types/command';
|
|
5
|
+
export type { CanvasHistory, CanvasHistoryOptions } from './types/history';
|
|
6
|
+
export type { CanvasPlugin, EditorPluginContext, RuntimePluginContext, CanvasSelection, NodeDecoration, EdgeDecoration, ContextMenuItem, } from './types/plugin';
|
|
7
|
+
export type { CanvasApi, CanvasToolbarItem, BuiltinToolbarType, ExportOptions, NodeActionsConfig, QuickAddConfig, InsertNodeOptions, ConnectionValidator, ConnectionValidateContext, ConnectionValidateResult, NodePaletteItem, } from './types/api';
|
|
8
|
+
export type { OverlayManager, NodeOverlayAnchors, OverlayAnchor } from './types/overlay';
|
|
9
|
+
export { applyCanvasCommand } from './core/apply-command';
|
|
10
|
+
export { CanvasConstraintError, CanvasSchemaError } from './core/errors';
|
|
11
|
+
export { createCanvasHistory } from './core/history';
|
|
12
|
+
export { useCanvasEditor } from './core/editor';
|
|
13
|
+
export type { CanvasEditorContext, CanvasEditorOptions } from './core/editor';
|
|
14
|
+
export { default as CanvasRuntime } from './runtime/canvas-runtime-core.vue';
|
|
15
|
+
export { default as CanvasLayout } from './shell/canvas-layout.vue';
|
|
16
|
+
export { default as CanvasToolbar } from './shell/canvas-toolbar.vue';
|
|
17
|
+
export { default as CanvasNodePalette } from './shell/canvas-node-palette.vue';
|
|
18
|
+
export { default as DefaultNode } from './shell/default-node.vue';
|
|
19
|
+
export { default as NodeActionsToolbar } from './shell/node-actions-toolbar.vue';
|
|
20
|
+
export { default as NodeQuickAddPopover } from './shell/node-quick-add-popover.vue';
|
|
21
|
+
export { createDefaultToolbarItems } from './shell/toolbar-items';
|
|
22
|
+
export type { DefaultToolbarItemsOptions } from './shell/toolbar-items';
|
|
23
|
+
export { createDefaultSchema } from './shell/default-schema';
|
|
24
|
+
export type { DefaultNodeTypeConfig, DefaultSchemaOptions, DefaultSchemaResult } from './shell/default-schema';
|
|
25
|
+
export { connectionValidatorPlugin } from './plugins/connection-validator';
|
|
26
|
+
export { selectionPlugin } from './plugins/selection';
|
|
27
|
+
export type { SelectionPluginOptions } from './plugins/selection';
|
|
28
|
+
export { snaplinePlugin } from './plugins/snapline';
|
|
29
|
+
export type { SnaplinePluginOptions } from './plugins/snapline';
|
|
30
|
+
export { minimapPlugin } from './plugins/minimap';
|
|
31
|
+
export type { MinimapPluginOptions } from './plugins/minimap';
|
|
32
|
+
export { clipboardPlugin } from './plugins/clipboard';
|
|
33
|
+
export { generateId } from './utils/uuid';
|