@filekit-studio/diagram 1.0.1 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.mts +103 -2
- package/dist/index.d.ts +103 -2
- package/dist/index.js +4 -4
- package/dist/index.mjs +4 -4
- package/package.json +2 -2
package/dist/index.d.mts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { GridStyle, SketchUIConfig, ThemeMode, PanelVariant, SketchDocument, SketchController } from '@filekit-studio/sketch';
|
|
2
|
+
import { GridStyle, SketchUIConfig, ThemeMode, PanelVariant, SketchDocument, SketchController, AnchorPosition } from '@filekit-studio/sketch';
|
|
3
3
|
export { GridStyle, PanelVariant, SketchBoardElement, SketchController, SketchDocument, SketchUIConfig, ThemeMode } from '@filekit-studio/sketch';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -594,4 +594,105 @@ declare function estimateNodeDimensions(node: DiagramNode, defaultWidth?: number
|
|
|
594
594
|
*/
|
|
595
595
|
declare function layoutDiagram(data: DiagramData, options?: DiagramLayoutOptions): DiagramLayoutResult;
|
|
596
596
|
|
|
597
|
-
|
|
597
|
+
/**
|
|
598
|
+
* @filekit-studio/diagram
|
|
599
|
+
* Smart Collision-Aware Edge Router
|
|
600
|
+
*
|
|
601
|
+
* Provides analytical, high-performance edge routing with:
|
|
602
|
+
* 1. Multi-Port Distribution: Evenly spreads contact points along node faces to eliminate point convergence.
|
|
603
|
+
* 2. Ray-Box Obstacle Avoidance: Detects node intersections and automatically detours into clearance gutters.
|
|
604
|
+
* 3. Corridor Fanning: Offsets parallel edge paths so concurrent connections travel in distinct lanes.
|
|
605
|
+
*
|
|
606
|
+
* @packageDocumentation
|
|
607
|
+
*/
|
|
608
|
+
|
|
609
|
+
interface PositionedNodeBox {
|
|
610
|
+
id: string;
|
|
611
|
+
shapeId: string;
|
|
612
|
+
shape?: string;
|
|
613
|
+
x: number;
|
|
614
|
+
y: number;
|
|
615
|
+
width: number;
|
|
616
|
+
height: number;
|
|
617
|
+
}
|
|
618
|
+
interface RoutedEdgeResult {
|
|
619
|
+
edgeId: string;
|
|
620
|
+
startAnchor: AnchorPosition;
|
|
621
|
+
endAnchor: AnchorPosition;
|
|
622
|
+
startX: number;
|
|
623
|
+
startY: number;
|
|
624
|
+
endX: number;
|
|
625
|
+
endY: number;
|
|
626
|
+
arrowType: 'straight' | 'curved' | 'elbow';
|
|
627
|
+
controlPoint?: {
|
|
628
|
+
x: number;
|
|
629
|
+
y: number;
|
|
630
|
+
};
|
|
631
|
+
controlPoint1?: {
|
|
632
|
+
x: number;
|
|
633
|
+
y: number;
|
|
634
|
+
};
|
|
635
|
+
controlPoint2?: {
|
|
636
|
+
x: number;
|
|
637
|
+
y: number;
|
|
638
|
+
};
|
|
639
|
+
isBackward: boolean;
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Pre-analyzes and routes all diagram edges with intelligent collision evasion and anchor distribution.
|
|
643
|
+
*/
|
|
644
|
+
declare function routeDiagramEdges(edges: DiagramEdge[], nodeMap: Map<string, PositionedNodeBox>, direction: DiagramDirection, options?: DiagramLayoutOptions): RoutedEdgeResult[];
|
|
645
|
+
/**
|
|
646
|
+
* Tests whether a 2D point lies within the geometric perimeter of a diagram shape.
|
|
647
|
+
*/
|
|
648
|
+
declare function isPointInsideShape(px: number, py: number, node: PositionedNodeBox, margin?: number): boolean;
|
|
649
|
+
/**
|
|
650
|
+
* Samples a parametric point along a straight, curved, or elbow path at parameter t in [0, 1].
|
|
651
|
+
*/
|
|
652
|
+
declare function sampleEdgePoint(t: number, p1: {
|
|
653
|
+
x: number;
|
|
654
|
+
y: number;
|
|
655
|
+
}, p2: {
|
|
656
|
+
x: number;
|
|
657
|
+
y: number;
|
|
658
|
+
}, arrowType: 'straight' | 'curved' | 'elbow', cp?: {
|
|
659
|
+
x: number;
|
|
660
|
+
y: number;
|
|
661
|
+
}, cp1?: {
|
|
662
|
+
x: number;
|
|
663
|
+
y: number;
|
|
664
|
+
}, cp2?: {
|
|
665
|
+
x: number;
|
|
666
|
+
y: number;
|
|
667
|
+
}): {
|
|
668
|
+
x: number;
|
|
669
|
+
y: number;
|
|
670
|
+
};
|
|
671
|
+
interface SubSegmentResult {
|
|
672
|
+
startX: number;
|
|
673
|
+
startY: number;
|
|
674
|
+
endX: number;
|
|
675
|
+
endY: number;
|
|
676
|
+
isInside: boolean;
|
|
677
|
+
isLast: boolean;
|
|
678
|
+
arrowType: 'straight' | 'curved' | 'elbow';
|
|
679
|
+
controlPoint?: {
|
|
680
|
+
x: number;
|
|
681
|
+
y: number;
|
|
682
|
+
};
|
|
683
|
+
controlPoint1?: {
|
|
684
|
+
x: number;
|
|
685
|
+
y: number;
|
|
686
|
+
};
|
|
687
|
+
controlPoint2?: {
|
|
688
|
+
x: number;
|
|
689
|
+
y: number;
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Slices a connector into alternating solid and submerged (dotted, 35% opacity) sub-segments
|
|
694
|
+
* when it crosses through intermediate obstacle shapes.
|
|
695
|
+
*/
|
|
696
|
+
declare function decomposePassthroughSegments(edge: RoutedEdgeResult, obstacleNodes: PositionedNodeBox[], options?: DiagramLayoutOptions): SubSegmentResult[];
|
|
697
|
+
|
|
698
|
+
export { type ColorPalette, Diagram, type DiagramData, type DiagramDirection, type DiagramEdge, type DiagramFillStyle, type DiagramGroup, type DiagramLayoutOptions, type DiagramLayoutResult, type DiagramLineStyle, type DiagramNode, type DiagramNodeShape, type DiagramNodeTheme, type DiagramProps, type ExcalidrawDocument, type ExcalidrawRawElement, SketchDiagram, THEME_PALETTES, decomposePassthroughSegments, diagramToSketch, estimateNodeDimensions, excalidrawToSketch, isPointInsideShape, layoutDiagram, parseDiagramData, resolveNodeColors, routeDiagramEdges, sampleEdgePoint };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
import { GridStyle, SketchUIConfig, ThemeMode, PanelVariant, SketchDocument, SketchController } from '@filekit-studio/sketch';
|
|
2
|
+
import { GridStyle, SketchUIConfig, ThemeMode, PanelVariant, SketchDocument, SketchController, AnchorPosition } from '@filekit-studio/sketch';
|
|
3
3
|
export { GridStyle, PanelVariant, SketchBoardElement, SketchController, SketchDocument, SketchUIConfig, ThemeMode } from '@filekit-studio/sketch';
|
|
4
4
|
|
|
5
5
|
/**
|
|
@@ -594,4 +594,105 @@ declare function estimateNodeDimensions(node: DiagramNode, defaultWidth?: number
|
|
|
594
594
|
*/
|
|
595
595
|
declare function layoutDiagram(data: DiagramData, options?: DiagramLayoutOptions): DiagramLayoutResult;
|
|
596
596
|
|
|
597
|
-
|
|
597
|
+
/**
|
|
598
|
+
* @filekit-studio/diagram
|
|
599
|
+
* Smart Collision-Aware Edge Router
|
|
600
|
+
*
|
|
601
|
+
* Provides analytical, high-performance edge routing with:
|
|
602
|
+
* 1. Multi-Port Distribution: Evenly spreads contact points along node faces to eliminate point convergence.
|
|
603
|
+
* 2. Ray-Box Obstacle Avoidance: Detects node intersections and automatically detours into clearance gutters.
|
|
604
|
+
* 3. Corridor Fanning: Offsets parallel edge paths so concurrent connections travel in distinct lanes.
|
|
605
|
+
*
|
|
606
|
+
* @packageDocumentation
|
|
607
|
+
*/
|
|
608
|
+
|
|
609
|
+
interface PositionedNodeBox {
|
|
610
|
+
id: string;
|
|
611
|
+
shapeId: string;
|
|
612
|
+
shape?: string;
|
|
613
|
+
x: number;
|
|
614
|
+
y: number;
|
|
615
|
+
width: number;
|
|
616
|
+
height: number;
|
|
617
|
+
}
|
|
618
|
+
interface RoutedEdgeResult {
|
|
619
|
+
edgeId: string;
|
|
620
|
+
startAnchor: AnchorPosition;
|
|
621
|
+
endAnchor: AnchorPosition;
|
|
622
|
+
startX: number;
|
|
623
|
+
startY: number;
|
|
624
|
+
endX: number;
|
|
625
|
+
endY: number;
|
|
626
|
+
arrowType: 'straight' | 'curved' | 'elbow';
|
|
627
|
+
controlPoint?: {
|
|
628
|
+
x: number;
|
|
629
|
+
y: number;
|
|
630
|
+
};
|
|
631
|
+
controlPoint1?: {
|
|
632
|
+
x: number;
|
|
633
|
+
y: number;
|
|
634
|
+
};
|
|
635
|
+
controlPoint2?: {
|
|
636
|
+
x: number;
|
|
637
|
+
y: number;
|
|
638
|
+
};
|
|
639
|
+
isBackward: boolean;
|
|
640
|
+
}
|
|
641
|
+
/**
|
|
642
|
+
* Pre-analyzes and routes all diagram edges with intelligent collision evasion and anchor distribution.
|
|
643
|
+
*/
|
|
644
|
+
declare function routeDiagramEdges(edges: DiagramEdge[], nodeMap: Map<string, PositionedNodeBox>, direction: DiagramDirection, options?: DiagramLayoutOptions): RoutedEdgeResult[];
|
|
645
|
+
/**
|
|
646
|
+
* Tests whether a 2D point lies within the geometric perimeter of a diagram shape.
|
|
647
|
+
*/
|
|
648
|
+
declare function isPointInsideShape(px: number, py: number, node: PositionedNodeBox, margin?: number): boolean;
|
|
649
|
+
/**
|
|
650
|
+
* Samples a parametric point along a straight, curved, or elbow path at parameter t in [0, 1].
|
|
651
|
+
*/
|
|
652
|
+
declare function sampleEdgePoint(t: number, p1: {
|
|
653
|
+
x: number;
|
|
654
|
+
y: number;
|
|
655
|
+
}, p2: {
|
|
656
|
+
x: number;
|
|
657
|
+
y: number;
|
|
658
|
+
}, arrowType: 'straight' | 'curved' | 'elbow', cp?: {
|
|
659
|
+
x: number;
|
|
660
|
+
y: number;
|
|
661
|
+
}, cp1?: {
|
|
662
|
+
x: number;
|
|
663
|
+
y: number;
|
|
664
|
+
}, cp2?: {
|
|
665
|
+
x: number;
|
|
666
|
+
y: number;
|
|
667
|
+
}): {
|
|
668
|
+
x: number;
|
|
669
|
+
y: number;
|
|
670
|
+
};
|
|
671
|
+
interface SubSegmentResult {
|
|
672
|
+
startX: number;
|
|
673
|
+
startY: number;
|
|
674
|
+
endX: number;
|
|
675
|
+
endY: number;
|
|
676
|
+
isInside: boolean;
|
|
677
|
+
isLast: boolean;
|
|
678
|
+
arrowType: 'straight' | 'curved' | 'elbow';
|
|
679
|
+
controlPoint?: {
|
|
680
|
+
x: number;
|
|
681
|
+
y: number;
|
|
682
|
+
};
|
|
683
|
+
controlPoint1?: {
|
|
684
|
+
x: number;
|
|
685
|
+
y: number;
|
|
686
|
+
};
|
|
687
|
+
controlPoint2?: {
|
|
688
|
+
x: number;
|
|
689
|
+
y: number;
|
|
690
|
+
};
|
|
691
|
+
}
|
|
692
|
+
/**
|
|
693
|
+
* Slices a connector into alternating solid and submerged (dotted, 35% opacity) sub-segments
|
|
694
|
+
* when it crosses through intermediate obstacle shapes.
|
|
695
|
+
*/
|
|
696
|
+
declare function decomposePassthroughSegments(edge: RoutedEdgeResult, obstacleNodes: PositionedNodeBox[], options?: DiagramLayoutOptions): SubSegmentResult[];
|
|
697
|
+
|
|
698
|
+
export { type ColorPalette, Diagram, type DiagramData, type DiagramDirection, type DiagramEdge, type DiagramFillStyle, type DiagramGroup, type DiagramLayoutOptions, type DiagramLayoutResult, type DiagramLineStyle, type DiagramNode, type DiagramNodeShape, type DiagramNodeTheme, type DiagramProps, type ExcalidrawDocument, type ExcalidrawRawElement, SketchDiagram, THEME_PALETTES, decomposePassthroughSegments, diagramToSketch, estimateNodeDimensions, excalidrawToSketch, isPointInsideShape, layoutDiagram, parseDiagramData, resolveNodeColors, routeDiagramEdges, sampleEdgePoint };
|
package/dist/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
'use strict';var react=require('react'),sketch=require('@filekit-studio/sketch'),jsxRuntime=require('react/jsx-runtime');function
|
|
1
|
+
'use strict';var react=require('react'),sketch=require('@filekit-studio/sketch'),jsxRuntime=require('react/jsx-runtime');function ut(e,i=210,r=90){if(e.width&&e.height)return {width:e.width,height:e.height};let g=(e.description?`${e.label||""}
|
|
2
2
|
${e.description}`:e.label||"").split(`
|
|
3
|
-
`),w=f.reduce((i,u)=>Math.max(i,u.length),0),x=(e.fontSize||14)*.72,n=Math.round(w*x),s=Math.max(c,n+64),m=f.length,l=(e.fontSize||14)*1.45,h=e.badge?14:0,t=Math.max(o,Math.round(m*l+44+h));if(e.shape==="diamond")return {width:e.width??Math.max(Math.round(s*1.65),240),height:e.height??Math.max(Math.round(t*1.55),160)};if(e.shape==="cylinder"||e.shape==="database")return {width:e.width??Math.max(s+32,230),height:e.height??Math.max(t+(e.description?90:75),180)};if(e.shape==="cloud")return {width:e.width??Math.max(Math.round(s*1.45),230),height:e.height??Math.max(Math.round(t*1.4),125)};if(e.shape==="sticky")return {width:e.width??Math.max(s+20,220),height:e.height??Math.max(t+34,140)};if(e.shape==="circle"||e.shape==="ellipse"){let i=Math.max(s*1.25,t*1.25,140);return {width:e.width??i,height:e.height??Math.max(Math.round(t*1.3),110)}}return {width:e.width??Math.max(s+16,210),height:e.height??Math.max(t+12,90)}}function nt(e,c){let o=new Map,g=new Map;e.forEach(s=>{o.set(s,[]),g.set(s,0);}),c.forEach(s=>{o.has(s.from)&&g.has(s.to)&&(o.get(s.from).push(s.to),g.set(s.to,(g.get(s.to)||0)+1));});let f=new Map,w=new Set,x=new Set;function n(s,m){if(x.has(s))return;let l=f.get(s)??0;f.set(s,Math.max(l,m)),x.add(s),w.add(s);let h=o.get(s)||[];for(let t of h)n(t,m+1);x.delete(s);}return e.filter(s=>(g.get(s)||0)===0).forEach(s=>n(s,0)),e.forEach(s=>{w.has(s)||n(s,0);}),f}function ot(e,c){let o={...e.layout,...c},g=o.direction||e.direction||"LR",f=o.nodeSpacing??95,w=o.rankSpacing??220,x=o.padding??90,n=o.groupPadding??56,s=o.clusterSpacing??220,m=o.intraRankSpacing??120,l=o.defaultNodeWidth??210,h=o.defaultNodeHeight??90,t=e.nodes||[],i=e.edges||[],u=e.groups||[];if(t.length===0)return {nodes:[],edges:[],groups:[],bounds:{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0}};let b=t.map(p=>{let S=ct(p,l,h);return {...p,width:S.width,height:S.height,x:p.x??0,y:p.y??0,relX:0,relY:0}}),d=new Map;b.forEach(p=>d.set(p.id,p));let r=g==="LR"||g==="RL",a=g==="RL"||g==="BT",P=36;if(!(u.length>0)){let p=nt(t.map(y=>y.id),i),S=new Map;b.forEach(y=>{let E=p.get(y.id)??0;S.has(E)||S.set(E,[]),S.get(E).push(y);});let M=Array.from(S.keys()).sort((y,E)=>y-E),X=x,z=0;return M.forEach(y=>{let R=S.get(y).reduce((W,U,L)=>W+(r?U.height:U.width)+(L>0?f:0),0);z=Math.max(z,R);}),M.forEach(y=>{let E=S.get(y),R=0,W=E.reduce((L,K,G)=>L+(r?K.height:K.width)+(G>0?f:0),0),U=x+(z-W)/2;E.forEach(L=>{R=Math.max(R,r?L.width:L.height),r?(L.x=Math.round(X),L.y=Math.round(U),U+=L.height+f):(L.x=Math.round(U),L.y=Math.round(X),U+=L.width+f);}),X+=R+w;}),ht(b,i,[],a,r,x,X)}let Y=new Map;u.forEach(p=>{p.nodeIds.forEach(S=>Y.set(S,p.id));});let N=[],D=new Map;u.forEach(p=>{let S=p.nodeIds.map(T=>d.get(T)).filter(T=>!!T);if(S.length===0)return;let M=new Set(p.nodeIds),X=i.filter(T=>M.has(T.from)&&M.has(T.to)),z=nt(S.map(T=>T.id),X),y=new Map;S.forEach(T=>{let V=z.get(T.id)??0;y.has(V)||y.set(V,[]),y.get(V).push(T);});let E=Array.from(y.keys()).sort((T,V)=>T-V),R=0,W=0;E.forEach(T=>{let j=y.get(T).reduce((rt,q,J)=>rt+(r?q.height:q.width)+(J>0?f:0),0);W=Math.max(W,j);}),E.forEach(T=>{let V=y.get(T),j=0,rt=V.reduce((J,it,gt)=>J+(r?it.height:it.width)+(gt>0?f:0),0),q=(W-rt)/2;V.forEach(J=>{j=Math.max(j,r?J.width:J.height),r?(J.relX=Math.round(R),J.relY=Math.round(q),q+=J.height+f):(J.relX=Math.round(q),J.relY=Math.round(R),q+=J.width+f);}),R+=j+m;});let U=r?R-m:W,L=r?W:R-m,K=Math.round(U+n*2),G=Math.round(L+n*2+P),$={id:p.id,isGroup:true,groupObj:p,memberNodes:S,width:K,height:G,x:0,y:0};N.push($),D.set(p.id,$);}),b.filter(p=>!Y.has(p.id)).forEach(p=>{let S={id:`standalone_${p.id}`,isGroup:false,memberNodes:[p],width:p.width,height:p.height,x:0,y:0};N.push(S),D.set(S.id,S);});let v=p=>{let S=Y.get(p);return S||`standalone_${p}`},B=[];i.forEach(p=>{let S=v(p.from),M=v(p.to);S!==M&&B.push({from:S,to:M});});let C=nt(N.map(p=>p.id),B),_=new Map;N.forEach(p=>{let S=C.get(p.id)??0;_.has(S)||_.set(S,[]),_.get(S).push(p);});let O=Array.from(_.keys()).sort((p,S)=>p-S),F=x,A=0;O.forEach(p=>{let M=_.get(p).reduce((X,z,y)=>X+(r?z.height:z.width)+(y>0?s:0),0);A=Math.max(A,M);});let H=[];return O.forEach(p=>{let S=_.get(p),M=0,X=S.reduce((y,E,R)=>y+(r?E.height:E.width)+(R>0?s:0),0),z=x+(A-X)/2;S.forEach(y=>{if(M=Math.max(M,r?y.width:y.height),r?(y.x=Math.round(F),y.y=Math.round(z),z+=y.height+s):(y.x=Math.round(z),y.y=Math.round(F),z+=y.width+s),y.isGroup&&y.groupObj)H.push({...y.groupObj,x:y.x,y:y.y,width:y.width,height:y.height}),y.memberNodes.forEach(E=>{E.x=Math.round(y.x+n+E.relX),E.y=Math.round(y.y+n+P+E.relY);});else {let E=y.memberNodes[0];E.x=y.x,E.y=y.y;}}),F+=M+s;}),ht(b,i,H,a,r,x,F)}function ht(e,c,o,g,f,w,x){if(g){let h=x-95;e.forEach(t=>{f?t.x=h-(t.x-w)-t.width:t.y=h-(t.y-w)-t.height;}),o.forEach(t=>{f?t.x=h-(t.x-w)-t.width:t.y=h-(t.y-w)-t.height;});}let n=1/0,s=1/0,m=-1/0,l=-1/0;return e.forEach(h=>{n=Math.min(n,h.x),s=Math.min(s,h.y),m=Math.max(m,h.x+h.width),l=Math.max(l,h.y+h.height);}),o.forEach(h=>{n=Math.min(n,h.x),s=Math.min(s,h.y),m=Math.max(m,h.x+h.width),l=Math.max(l,h.y+h.height);}),{nodes:e,edges:c,groups:o,bounds:{minX:Math.round(n),minY:Math.round(s),maxX:Math.round(m),maxY:Math.round(l),width:Math.round(m-n),height:Math.round(l-s)}}}function Z(e,c,o,g,f,w=12){let x=f.x-w,n=f.y-w,s=f.x+f.width+w,m=f.y+f.height+w;if(Math.max(e,o)<x||Math.min(e,o)>s||Math.max(c,g)<n||Math.min(c,g)>m)return false;let l=o-e,h=g-c,t=0,i=1,u=[-l,l,-h,h],b=[e-x,s-e,c-n,m-c];for(let d=0;d<4;d++)if(u[d]===0){if(b[d]<0)return false}else {let r=b[d]/u[d];if(u[d]<0){if(r>i)return false;r>t&&(t=r);}else {if(r<t)return false;r<i&&(i=r);}}return t<=i}function lt(e,c,o,g){let f=Array.from(c.values()),w=new Map;function x(l,h){w.has(l)||w.set(l,new Map);let t=w.get(l);return t.has(h)||t.set(h,{sourceEdges:[],targetEdges:[]}),t.get(h)}let n=[];e.forEach((l,h)=>{let t=c.get(l.from),i=c.get(l.to);if(!t||!i)return;let u=false;o==="LR"?u=i.x+i.width<=t.x+30:o==="RL"?u=i.x>=t.x+t.width-30:o==="TB"?u=i.y+i.height<=t.y+30:o==="BT"&&(u=i.y>=t.y+t.height-30);let b,d;l.startAnchor?b=l.startAnchor:u?b=o==="LR"||o==="RL"?"top":"right":b=o==="LR"?"right":o==="RL"?"left":o==="TB"?"bottom":"top",l.endAnchor?d=l.endAnchor:u?d=o==="LR"||o==="RL"?"top":"right":d=o==="LR"?"left":o==="RL"?"right":o==="TB"?"top":"bottom",n.push({edge:l,source:t,target:i,startAnchor:b,endAnchor:d,isBackward:u}),x(t.id,b).sourceEdges.push({edge:l,index:h}),x(i.id,d).targetEdges.push({edge:l,index:h});});function s(l,h,t,i){let u=x(l.id,h),b=i?u.targetEdges:u.sourceEdges,d=b.length,r=Math.max(0,b.findIndex(a=>a.index===t));if(h==="left"||h==="right"){let a=h==="left"?l.x:l.x+l.width;if(d<=1)return {x:a,y:l.y+l.height/2};let P=l.height-24,I=Math.min(28,P/(d+1)),Y=l.y+12+(P-(d-1)*I)/2,N=Math.round(Y+r*I);return {x:a,y:N}}else {let a=h==="top"?l.y:l.y+l.height;if(d<=1)return {x:l.x+l.width/2,y:a};let P=l.width-24,I=Math.min(32,P/(d+1)),Y=l.x+12+(P-(d-1)*I)/2;return {x:Math.round(Y+r*I),y:a}}}let m=[];return n.forEach(({edge:l,source:h,target:t,startAnchor:i,endAnchor:u,isBackward:b},d)=>{let r=s(h,i,d,false),a=s(t,u,d,true),P=l.id||`edge_${h.id}_${t.id}_${d}`;if(b)if(o==="LR"||o==="RL"){let D=Math.min(r.x,a.x),k=Math.max(r.x,a.x),B=f.filter(A=>A.id!==h.id&&A.id!==t.id&&A.x+A.width>D&&A.x<k).reduce((A,H)=>Math.min(A,H.y),Math.min(r.y,a.y)),C=Math.abs(r.x-a.x),_=Math.max(90,Math.min(260,C*.22)),O=Math.min(B-_,Math.min(r.y,a.y)-_),F={x:Math.round((r.x+a.x)/2),y:Math.round(O)};m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"curved",controlPoint:F,isBackward:true});return}else {let D=Math.min(r.y,a.y),k=Math.max(r.y,a.y),B=f.filter(A=>A.id!==h.id&&A.id!==t.id&&A.y+A.height>D&&A.y<k).reduce((A,H)=>Math.max(A,H.x+H.width),Math.max(r.x,a.x)),C=Math.abs(r.y-a.y),_=Math.max(90,Math.min(260,C*.22)),O=Math.max(B+_,Math.max(r.x,a.x)+_),F={x:Math.round(O),y:Math.round((r.y+a.y)/2)};m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"curved",controlPoint:F,isBackward:true});return}let I=l.routing||g?.edgeRouting||"elbow",Y=Math.abs(a.y-r.y),N=Math.abs(a.x-r.x);if(I==="elbow"){if((o==="LR"||o==="RL")&&Y<14){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"straight",isBackward:false});return}if((o==="TB"||o==="BT")&&N<14){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"straight",isBackward:false});return}let D=f.filter(k=>k.id!==h.id&&k.id!==t.id);if(o==="LR"||o==="RL"){let k=Math.round((r.x+a.x)/2),v=[k,k-36,k+36,k-72,k+72,Math.round(r.x+36),Math.round(a.x-36)],B;for(let F of v)if(!D.some(H=>Z(r.x,r.y,F,r.y,H,8)||Z(F,r.y,F,a.y,H,8)||Z(F,a.y,a.x,a.y,H,8))){B=F;break}if(B!==void 0){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:B,y:r.y},controlPoint2:{x:B,y:a.y},isBackward:false});return}let C=(r.y+a.y)/2,O=D.filter(F=>Z(r.x,r.y,a.x,a.y,F,12))[0];if(O){let A=C<O.y+O.height/2?O.y-36:O.y+O.height+36;m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:k,y:r.y},controlPoint2:{x:k,y:A},isBackward:false});return}m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:k,y:r.y},controlPoint2:{x:k,y:a.y},isBackward:false});return}else {let k=Math.round((r.y+a.y)/2),v=[k,k-36,k+36,k-72,k+72,Math.round(r.y+36),Math.round(a.y-36)],B;for(let C of v)if(!D.some(O=>Z(r.x,r.y,r.x,C,O,8)||Z(r.x,C,a.x,C,O,8)||Z(a.x,C,a.x,a.y,O,8))){B=C;break}if(B!==void 0){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:r.x,y:B},controlPoint2:{x:a.x,y:B},isBackward:false});return}m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:r.x,y:k},controlPoint2:{x:a.x,y:k},isBackward:false});return}}if(I==="curved"){let D=Math.round((r.x+a.x)/2),k=Math.round((r.y+a.y)/2);m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"curved",controlPoint:{x:D,y:k},isBackward:false});return}m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"straight",isBackward:false});}),m}function xt(e,c,o,g=0){let f=o.x-g,w=o.y-g,x=o.x+o.width+g,n=o.y+o.height+g;if(e<f||e>x||c<w||c>n)return false;let s=o.x+o.width/2,m=o.y+o.height/2,l=o.width/2+g,h=o.height/2+g,t=o.shape||"rectangle";return t==="diamond"?Math.abs(e-s)/l+Math.abs(c-m)/h<=1:t==="ellipse"||t==="circle"||t==="cloud"?(e-s)*(e-s)/(l*l)+(c-m)*(c-m)/(h*h)<=1:true}function tt(e,c,o,g,f,w,x){if(g==="curved"&&f){let n=1-e;return {x:n*n*c.x+2*n*e*f.x+e*e*o.x,y:n*n*c.y+2*n*e*f.y+e*e*o.y}}if(g==="elbow"&&w&&x){let n=1-e,s=n*n,m=s*n,l=e*e,h=l*e;return {x:m*c.x+3*s*e*w.x+3*n*l*x.x+h*o.x,y:m*c.y+3*s*e*w.y+3*n*l*x.y+h*o.y}}return {x:c.x+e*(o.x-c.x),y:c.y+e*(o.y-c.y)}}function ut(e,c,o){let g={x:e.startX,y:e.startY},f={x:e.endX,y:e.endY};if(o?.tunneling===false||c.length===0)return [{startX:g.x,startY:g.y,endX:f.x,endY:f.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let w=32,x=[],n=false;for(let h=0;h<=w;h++){let t=h/w,i=tt(t,g,f,e.arrowType,e.controlPoint,e.controlPoint1,e.controlPoint2),u=t>.04&&t<.96&&c.some(b=>xt(i.x,i.y,b,2));u&&(n=true),x.push({pt:i,inside:u,t});}if(!n)return [{startX:g.x,startY:g.y,endX:f.x,endY:f.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let s=[],m={points:[x[0]],isInside:x[0].inside};for(let h=1;h<x.length;h++){let t=x[h];t.inside===m.isInside?m.points.push(t):(s.push(m),m={points:[m.points[m.points.length-1],t],isInside:t.inside});}s.push(m);let l=[];return s.forEach((h,t)=>{let i=h.points[0].pt,u=h.points[h.points.length-1].pt,b=t===s.length-1;l.push({startX:Math.round(i.x),startY:Math.round(i.y),endX:Math.round(u.x),endY:Math.round(u.y),isInside:h.isInside,isLast:b,arrowType:"straight"});}),l}var Q={indigo:{stroke:"#4f46e5",fill:"#e0e7ff",text:"#312e81"},blue:{stroke:"#2563eb",fill:"#dbeafe",text:"#1e3a8a"},emerald:{stroke:"#059669",fill:"#d1fae5",text:"#064e3b"},green:{stroke:"#16a34a",fill:"#dcfce7",text:"#14532d"},amber:{stroke:"#d97706",fill:"#fef3c7",text:"#78350f"},yellow:{stroke:"#ca8a04",fill:"#fef9c3",text:"#713f12"},rose:{stroke:"#e11d48",fill:"#ffe4e6",text:"#881337"},red:{stroke:"#dc2626",fill:"#fee2e2",text:"#7f1d1d"},purple:{stroke:"#7c3aed",fill:"#ede9fe",text:"#4c1d95"},violet:{stroke:"#8b5cf6",fill:"#f3e8ff",text:"#581c87"},slate:{stroke:"#475569",fill:"#f1f5f9",text:"#0f172a"},neutral:{stroke:"#525252",fill:"#f5f5f5",text:"#171717"},sky:{stroke:"#0284c7",fill:"#e0f2fe",text:"#0c4a6e"},cyan:{stroke:"#0891b2",fill:"#cffafe",text:"#164e63"},teal:{stroke:"#0d9488",fill:"#ccfbf1",text:"#134e4a"},orange:{stroke:"#ea580c",fill:"#ffedd5",text:"#7c2d12"}};function et(e,c,o){return c||o?{stroke:c||"#4f46e5",fill:o||"#e0e7ff",text:c||"#1e293b"}:e&&Q[e]?Q[e]:e&&e.startsWith("#")?{stroke:e,fill:`${e}20`,text:e}:Q.indigo}function dt(e){if(!e)return "#475569";let c=e.trim().toLowerCase();return Q[c]?Q[c].stroke:e}function pt(e){switch(e){case "none":return "transparent";case "solid":return "solid";case "cross-hatch":return "cross-hatch";case "dots":return "dots";default:return "hachure"}}function mt(e){if(typeof e=="string")try{let c=JSON.parse(e);if(typeof c!="object"||c===null)throw new Error("Parsed diagram JSON must be an object");return c}catch(c){return console.error("Failed to parse diagram JSON string:",c),{title:"Empty Diagram",nodes:[{id:"error-node",label:"Invalid Diagram JSON",description:String(c),color:"rose"}]}}return e}function at(e,c){let o=mt(e),g={...o.layout,...c},f=ot(o,g),w=[],x=1;f.groups.forEach(t=>{let i=et(t.color),u=`frame_${t.id}`;w.push({id:u,type:"frame",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:i.stroke,strokeWidth:1.5,strokeStyle:t.borderStyle||"dashed",fillColor:t.backgroundColor||"transparent",fillStyle:"solid",opacity:.85,zIndex:x++,frameLabel:t.label});});let n=new Map;f.nodes.forEach(t=>{let i=et(t.color,t.strokeColor,t.fillColor),u=`shape_${t.id}`,b=`group_node_${t.id}`;n.set(t.id,{id:t.id,x:t.x,y:t.y,width:t.width,height:t.height,shapeId:u,shape:t.shape});let d="rectangle",r=false;switch(t.shape){case "diamond":d="diamond";break;case "ellipse":case "circle":d="ellipse";break;case "cylinder":case "database":d="cylinder";break;case "cloud":d="cloud";break;case "sticky":d="sticky";break;case "rounded":d="rectangle",r=true;break;default:d="rectangle",r=false;break}let a=t.description?`${t.label}
|
|
4
|
-
${t.description}`:t.label,P=t.textColor||
|
|
5
|
-
exports.Diagram=
|
|
3
|
+
`),w=g.reduce((o,s)=>Math.max(o,s.length),0),p=(e.fontSize||14)*.72,a=Math.round(w*p),c=Math.max(i,a+64),y=g.length,d=(e.fontSize||14)*1.45,l=e.badge?14:0,t=Math.max(r,Math.round(y*d+44+l));if(e.shape==="diamond")return {width:e.width??Math.max(Math.round(c*1.65),240),height:e.height??Math.max(Math.round(t*1.55),160)};if(e.shape==="cylinder"||e.shape==="database")return {width:e.width??Math.max(c+32,230),height:e.height??Math.max(t+(e.description?90:75),180)};if(e.shape==="cloud")return {width:e.width??Math.max(Math.round(c*1.45),230),height:e.height??Math.max(Math.round(t*1.4),125)};if(e.shape==="sticky")return {width:e.width??Math.max(c+20,220),height:e.height??Math.max(t+34,140)};if(e.shape==="circle"||e.shape==="ellipse"){let o=Math.max(c*1.25,t*1.25,140);return {width:e.width??o,height:e.height??Math.max(Math.round(t*1.3),110)}}return {width:e.width??Math.max(c+16,210),height:e.height??Math.max(t+12,90)}}function nt(e,i){let r=new Map,m=new Map;e.forEach(c=>{r.set(c,[]),m.set(c,0);}),i.forEach(c=>{r.has(c.from)&&m.has(c.to)&&(r.get(c.from).push(c.to),m.set(c.to,(m.get(c.to)||0)+1));});let g=new Map,w=new Set,p=new Set;function a(c,y){if(p.has(c))return;let d=g.get(c)??0;g.set(c,Math.max(d,y)),p.add(c),w.add(c);let l=r.get(c)||[];for(let t of l)a(t,y+1);p.delete(c);}return e.filter(c=>(m.get(c)||0)===0).forEach(c=>a(c,0)),e.forEach(c=>{w.has(c)||a(c,0);}),g}function ot(e,i){let r={...e.layout,...i},m=r.direction||e.direction||"LR",g=r.nodeSpacing??95,w=r.rankSpacing??220,p=r.padding??90,a=r.groupPadding??56,c=r.clusterSpacing??220,y=r.intraRankSpacing??120,d=r.defaultNodeWidth??210,l=r.defaultNodeHeight??90,t=e.nodes||[],o=e.edges||[],s=e.groups||[];if(t.length===0)return {nodes:[],edges:[],groups:[],bounds:{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0}};let f=t.map(b=>{let k=ut(b,d,l);return {...b,width:k.width,height:k.height,x:b.x??0,y:b.y??0,relX:0,relY:0}}),u=new Map;f.forEach(b=>u.set(b.id,b));let n=m==="LR"||m==="RL",h=m==="RL"||m==="BT",P=36;if(!(s.length>0)){let b=nt(t.map(x=>x.id),o),k=new Map;f.forEach(x=>{let D=b.get(x.id)??0;k.has(D)||k.set(D,[]),k.get(D).push(x);});let W=Array.from(k.keys()).sort((x,D)=>x-D),S=p,X=0;return W.forEach(x=>{let $=k.get(x).reduce((O,_,z)=>O+(n?_.height:_.width)+(z>0?g:0),0);X=Math.max(X,$);}),W.forEach(x=>{let D=k.get(x),$=0,O=D.reduce((z,J,K)=>z+(n?J.height:J.width)+(K>0?g:0),0),_=p+(X-O)/2;D.forEach(z=>{$=Math.max($,n?z.width:z.height),n?(z.x=Math.round(S),z.y=Math.round(_),_+=z.height+g):(z.x=Math.round(_),z.y=Math.round(S),_+=z.width+g);}),S+=$+w;}),lt(f,o,[],h,n,p,S)}let A=new Map;s.forEach(b=>{b.nodeIds.forEach(k=>A.set(k,b.id));});let v=[],Y=new Map;s.forEach(b=>{let k=b.nodeIds.map(E=>u.get(E)).filter(E=>!!E);if(k.length===0)return;let W=new Set(b.nodeIds),S=o.filter(E=>W.has(E.from)&&W.has(E.to)),X=nt(k.map(E=>E.id),S),x=new Map;k.forEach(E=>{let U=X.get(E.id)??0;x.has(U)||x.set(U,[]),x.get(U).push(E);});let D=Array.from(x.keys()).sort((E,U)=>E-U),$=0,O=0;D.forEach(E=>{let q=x.get(E).reduce((V,Z,j)=>V+(n?Z.height:Z.width)+(j>0?g:0),0);O=Math.max(O,q);}),D.forEach(E=>{let U=x.get(E),q=0,V=U.reduce((j,ct,xt)=>j+(n?ct.height:ct.width)+(xt>0?g:0),0),Z=(O-V)/2;U.forEach(j=>{q=Math.max(q,n?j.width:j.height),n?(j.relX=Math.round($),j.relY=Math.round(Z),Z+=j.height+g):(j.relX=Math.round(Z),j.relY=Math.round($),Z+=j.width+g);}),$+=q+y;});let _=n?$-y:O,z=n?O:$-y,J=Math.round(_+a*2),K=Math.round(z+a*2+P),H={id:b.id,isGroup:true,groupObj:b,memberNodes:k,width:J,height:K,x:0,y:0};v.push(H),Y.set(b.id,H);}),f.filter(b=>!A.has(b.id)).forEach(b=>{let k={id:`standalone_${b.id}`,isGroup:false,memberNodes:[b],width:b.width,height:b.height,x:0,y:0};v.push(k),Y.set(k.id,k);});let N=b=>{let k=A.get(b);return k||`standalone_${b}`},B=[];o.forEach(b=>{let k=N(b.from),W=N(b.to);k!==W&&B.push({from:k,to:W});});let R=nt(v.map(b=>b.id),B),F=new Map;v.forEach(b=>{let k=R.get(b.id)??0;F.has(k)||F.set(k,[]),F.get(k).push(b);});let I=Array.from(F.keys()).sort((b,k)=>b-k),C=p,T=0;I.forEach(b=>{let W=F.get(b).reduce((S,X,x)=>S+(n?X.height:X.width)+(x>0?c:0),0);T=Math.max(T,W);});let G=[];return I.forEach(b=>{let k=F.get(b),W=0,S=k.reduce((x,D,$)=>x+(n?D.height:D.width)+($>0?c:0),0),X=p+(T-S)/2;k.forEach(x=>{if(W=Math.max(W,n?x.width:x.height),n?(x.x=Math.round(C),x.y=Math.round(X),X+=x.height+c):(x.x=Math.round(X),x.y=Math.round(C),X+=x.width+c),x.isGroup&&x.groupObj)G.push({...x.groupObj,x:x.x,y:x.y,width:x.width,height:x.height}),x.memberNodes.forEach(D=>{D.x=Math.round(x.x+a+D.relX),D.y=Math.round(x.y+a+P+D.relY);});else {let D=x.memberNodes[0];D.x=x.x,D.y=x.y;}}),C+=W+c;}),lt(f,o,G,h,n,p,C)}function lt(e,i,r,m,g,w,p){if(m){let l=p-95;e.forEach(t=>{g?t.x=l-(t.x-w)-t.width:t.y=l-(t.y-w)-t.height;}),r.forEach(t=>{g?t.x=l-(t.x-w)-t.width:t.y=l-(t.y-w)-t.height;});}let a=1/0,c=1/0,y=-1/0,d=-1/0;return e.forEach(l=>{a=Math.min(a,l.x),c=Math.min(c,l.y),y=Math.max(y,l.x+l.width),d=Math.max(d,l.y+l.height);}),r.forEach(l=>{a=Math.min(a,l.x),c=Math.min(c,l.y),y=Math.max(y,l.x+l.width),d=Math.max(d,l.y+l.height);}),{nodes:e,edges:i,groups:r,bounds:{minX:Math.round(a),minY:Math.round(c),maxX:Math.round(y),maxY:Math.round(d),width:Math.round(y-a),height:Math.round(d-c)}}}function Q(e,i,r,m,g,w=12){let p=g.x-w,a=g.y-w,c=g.x+g.width+w,y=g.y+g.height+w;if(Math.max(e,r)<p||Math.min(e,r)>c||Math.max(i,m)<a||Math.min(i,m)>y)return false;let d=r-e,l=m-i,t=0,o=1,s=[-d,d,-l,l],f=[e-p,c-e,i-a,y-i];for(let u=0;u<4;u++)if(s[u]===0){if(f[u]<0)return false}else {let n=f[u]/s[u];if(s[u]<0){if(n>o)return false;n>t&&(t=n);}else {if(n<t)return false;n<o&&(o=n);}}return t<=o}function at(e,i,r,m){let g=Array.from(i.values()),w=new Map;function p(d,l){w.has(d)||w.set(d,new Map);let t=w.get(d);return t.has(l)||t.set(l,{sourceEdges:[],targetEdges:[]}),t.get(l)}let a=[];e.forEach((d,l)=>{let t=i.get(d.from),o=i.get(d.to);if(!t||!o)return;let s=false;r==="LR"?s=o.x+o.width<=t.x+30:r==="RL"?s=o.x>=t.x+t.width-30:r==="TB"?s=o.y+o.height<=t.y+30:r==="BT"&&(s=o.y>=t.y+t.height-30);let f,u;d.startAnchor?f=d.startAnchor:s?f=r==="LR"||r==="RL"?"top":"right":f=r==="LR"?"right":r==="RL"?"left":r==="TB"?"bottom":"top",d.endAnchor?u=d.endAnchor:s?u=r==="LR"||r==="RL"?"top":"right":u=r==="LR"?"left":r==="RL"?"right":r==="TB"?"top":"bottom",a.push({edge:d,source:t,target:o,startAnchor:f,endAnchor:u,isBackward:s}),p(t.id,f).sourceEdges.push({edge:d,index:l}),p(o.id,u).targetEdges.push({edge:d,index:l});});function c(d,l,t,o){let s=p(d.id,l),f=o?s.targetEdges:s.sourceEdges,u=f.length,n=Math.max(0,f.findIndex(h=>h.index===t));if(l==="left"||l==="right"){let h=l==="left"?d.x:d.x+d.width;if(u<=1)return {x:h,y:d.y+d.height/2};let P=d.height-24,L=Math.min(28,P/(u+1)),A=d.y+12+(P-(u-1)*L)/2,v=Math.round(A+n*L);return {x:h,y:v}}else {let h=l==="top"?d.y:d.y+d.height;if(u<=1)return {x:d.x+d.width/2,y:h};let P=d.width-24,L=Math.min(32,P/(u+1)),A=d.x+12+(P-(u-1)*L)/2;return {x:Math.round(A+n*L),y:h}}}let y=[];return a.forEach(({edge:d,source:l,target:t,startAnchor:o,endAnchor:s,isBackward:f},u)=>{let n=c(l,o,u,false),h=c(t,s,u,true),P=d.id||`edge_${l.id}_${t.id}_${u}`;if(f)if(r==="LR"||r==="RL"){let Y=Math.min(n.x,h.x),M=Math.max(n.x,h.x),B=g.filter(T=>T.id!==l.id&&T.id!==t.id&&T.x+T.width>Y&&T.x<M).reduce((T,G)=>Math.min(T,G.y),Math.min(n.y,h.y)),R=Math.abs(n.x-h.x),F=Math.max(90,Math.min(260,R*.22)),I=Math.min(B-F,Math.min(n.y,h.y)-F),C={x:Math.round((n.x+h.x)/2),y:Math.round(I)};y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"curved",controlPoint:C,isBackward:true});return}else {let Y=Math.min(n.y,h.y),M=Math.max(n.y,h.y),B=g.filter(T=>T.id!==l.id&&T.id!==t.id&&T.y+T.height>Y&&T.y<M).reduce((T,G)=>Math.max(T,G.x+G.width),Math.max(n.x,h.x)),R=Math.abs(n.y-h.y),F=Math.max(90,Math.min(260,R*.22)),I=Math.max(B+F,Math.max(n.x,h.x)+F),C={x:Math.round(I),y:Math.round((n.y+h.y)/2)};y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"curved",controlPoint:C,isBackward:true});return}let L=d.routing||m?.edgeRouting||"elbow",A=Math.abs(h.y-n.y),v=Math.abs(h.x-n.x);if(L==="elbow"){if((r==="LR"||r==="RL")&&A<14){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"straight",isBackward:false});return}if((r==="TB"||r==="BT")&&v<14){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"straight",isBackward:false});return}let Y=g.filter(M=>M.id!==l.id&&M.id!==t.id);if(r==="LR"||r==="RL"){let M=Math.round((n.x+h.x)/2),N=[M,M-36,M+36,M-72,M+72,Math.round(n.x+36),Math.round(h.x-36)],B;for(let C of N)if(!Y.some(G=>Q(n.x,n.y,C,n.y,G,8)||Q(C,n.y,C,h.y,G,8)||Q(C,h.y,h.x,h.y,G,8))){B=C;break}if(B!==void 0){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:B,y:n.y},controlPoint2:{x:B,y:h.y},isBackward:false});return}let R=(n.y+h.y)/2,I=Y.filter(C=>Q(n.x,n.y,h.x,h.y,C,12))[0];if(I){let T=R<I.y+I.height/2?I.y-36:I.y+I.height+36;y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:M,y:n.y},controlPoint2:{x:M,y:T},isBackward:false});return}y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:M,y:n.y},controlPoint2:{x:M,y:h.y},isBackward:false});return}else {let M=Math.round((n.y+h.y)/2),N=[M,M-36,M+36,M-72,M+72,Math.round(n.y+36),Math.round(h.y-36)],B;for(let R of N)if(!Y.some(I=>Q(n.x,n.y,n.x,R,I,8)||Q(n.x,R,h.x,R,I,8)||Q(h.x,R,h.x,h.y,I,8))){B=R;break}if(B!==void 0){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:n.x,y:B},controlPoint2:{x:h.x,y:B},isBackward:false});return}y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:n.x,y:M},controlPoint2:{x:h.x,y:M},isBackward:false});return}}if(L==="curved"){let Y=h.x-n.x,M=h.y-n.y,N=Math.hypot(Y,M),B=Math.round((n.x+h.x)/2),R=Math.round((n.y+h.y)/2),F=Math.max(18,Math.min(38,N*.15)),I=Math.round(F*2),C;Math.abs(Y)>=Math.abs(M)?C={x:B,y:R-I}:C={x:B+I,y:R},y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"curved",controlPoint:C,isBackward:false});return}y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"straight",isBackward:false});}),y}function dt(e,i,r,m=0){let g=r.x-m,w=r.y-m,p=r.x+r.width+m,a=r.y+r.height+m;if(e<g||e>p||i<w||i>a)return false;let c=r.x+r.width/2,y=r.y+r.height/2,d=r.width/2+m,l=r.height/2+m,t=r.shape||"rectangle";if(t==="diamond")return Math.abs(e-c)/d+Math.abs(i-y)/l<=1;if(t==="ellipse"||t==="circle"||t==="cloud")return (e-c)*(e-c)/(d*d)+(i-y)*(i-y)/(l*l)<=1;if(t==="triangle"){let o=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/r.height)),s=r.width/2*o;return e>=c-s-m&&e<=c+s+m}if(t==="parallelogram"){let o=Math.min(36,r.width*.22),s=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/r.height)),f=r.x+o*(1-s),u=r.x+r.width-o*s;return e>=f-m&&e<=u+m}if(t==="trapezoid"){let o=Math.min(r.width*.2,40),s=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/r.height)),f=r.x+o*(1-s),u=r.x+r.width-o*(1-s);return e>=f-m&&e<=u+m}if(t==="hexagon"){let o=Math.min(r.width*.22,45),s,f;if(i<=y){let u=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/(r.height/2)));s=r.x+o*(1-u),f=r.x+r.width-o*(1-u);}else {let u=r.height<=0?0:Math.max(0,Math.min(1,(i-y)/(r.height/2)));s=r.x+o*u,f=r.x+r.width-o*u;}return e>=s-m&&e<=f+m}if(t==="capsule")if(r.width>=r.height){let o=r.height/2+m,s=r.x+r.height/2,f=r.x+r.width-r.height/2;return e>=s&&e<=f?i>=r.y-m&&i<=r.y+r.height+m:e<s?Math.hypot(e-s,i-y)<=o:Math.hypot(e-f,i-y)<=o}else {let o=r.width/2+m,s=r.y+r.width/2,f=r.y+r.height-r.width/2;return i>=s&&i<=f?e>=r.x-m&&e<=r.x+r.width+m:i<s?Math.hypot(e-c,i-s)<=o:Math.hypot(e-c,i-f)<=o}if(t==="cylinder"){let o=Math.min(24,r.height*.18),s=r.width/2+m,f=o/2+m,u=r.y+o/2,n=r.y+r.height-o/2;if(e>=g&&e<=p&&i>=u&&i<=n)return true;let h=e-c,P=i-u;if(h*h/(s*s)+P*P/(f*f)<=1)return true;let L=e-c,A=i-n;return L*L/(s*s)+A*A/(f*f)<=1}return true}function et(e,i,r,m,g,w,p){if(m==="curved"&&g){let a=1-e;return {x:a*a*i.x+2*a*e*g.x+e*e*r.x,y:a*a*i.y+2*a*e*g.y+e*e*r.y}}if(m==="elbow"&&w&&p){let a=1-e,c=a*a,y=c*a,d=e*e,l=d*e;return {x:y*i.x+3*c*e*w.x+3*a*d*p.x+l*r.x,y:y*i.y+3*c*e*w.y+3*a*d*p.y+l*r.y}}return {x:i.x+e*(r.x-i.x),y:i.y+e*(r.y-i.y)}}function st(e,i,r){let m={x:e.startX,y:e.startY},g={x:e.endX,y:e.endY};if(r?.tunneling===false||i.length===0)return [{startX:m.x,startY:m.y,endX:g.x,endY:g.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let w=32,p=[],a=false;for(let l=0;l<=w;l++){let t=l/w,o=et(t,m,g,e.arrowType,e.controlPoint,e.controlPoint1,e.controlPoint2),s=t>.04&&t<.96&&i.some(f=>dt(o.x,o.y,f,2));s&&(a=true),p.push({pt:o,inside:s,t});}if(!a)return [{startX:m.x,startY:m.y,endX:g.x,endY:g.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let c=[],y={points:[p[0]],isInside:p[0].inside};for(let l=1;l<p.length;l++){let t=p[l];t.inside===y.isInside?y.points.push(t):(c.push(y),y={points:[y.points[y.points.length-1],t],isInside:t.inside});}c.push(y);let d=[];return c.forEach((l,t)=>{let o=l.points[0].pt,s=l.points[l.points.length-1].pt,f=t===c.length-1;d.push({startX:Math.round(o.x),startY:Math.round(o.y),endX:Math.round(s.x),endY:Math.round(s.y),isInside:l.isInside,isLast:f,arrowType:"straight"});}),d}var tt={indigo:{stroke:"#4f46e5",fill:"#e0e7ff",text:"#312e81"},blue:{stroke:"#2563eb",fill:"#dbeafe",text:"#1e3a8a"},emerald:{stroke:"#059669",fill:"#d1fae5",text:"#064e3b"},green:{stroke:"#16a34a",fill:"#dcfce7",text:"#14532d"},amber:{stroke:"#d97706",fill:"#fef3c7",text:"#78350f"},yellow:{stroke:"#ca8a04",fill:"#fef9c3",text:"#713f12"},rose:{stroke:"#e11d48",fill:"#ffe4e6",text:"#881337"},red:{stroke:"#dc2626",fill:"#fee2e2",text:"#7f1d1d"},purple:{stroke:"#7c3aed",fill:"#ede9fe",text:"#4c1d95"},violet:{stroke:"#8b5cf6",fill:"#f3e8ff",text:"#581c87"},slate:{stroke:"#475569",fill:"#f1f5f9",text:"#0f172a"},neutral:{stroke:"#525252",fill:"#f5f5f5",text:"#171717"},sky:{stroke:"#0284c7",fill:"#e0f2fe",text:"#0c4a6e"},cyan:{stroke:"#0891b2",fill:"#cffafe",text:"#164e63"},teal:{stroke:"#0d9488",fill:"#ccfbf1",text:"#134e4a"},orange:{stroke:"#ea580c",fill:"#ffedd5",text:"#7c2d12"}};function rt(e,i,r){return i||r?{stroke:i||"#4f46e5",fill:r||"#e0e7ff",text:i||"#1e293b"}:e&&tt[e]?tt[e]:e&&e.startsWith("#")?{stroke:e,fill:`${e}20`,text:e}:tt.indigo}function mt(e){if(!e)return "#475569";let i=e.trim().toLowerCase();return tt[i]?tt[i].stroke:e}function pt(e){switch(e){case "none":return "transparent";case "solid":return "solid";case "cross-hatch":return "cross-hatch";case "dots":return "dots";default:return "hachure"}}function ft(e){if(typeof e=="string")try{let i=JSON.parse(e);if(typeof i!="object"||i===null)throw new Error("Parsed diagram JSON must be an object");return i}catch(i){return console.error("Failed to parse diagram JSON string:",i),{title:"Empty Diagram",nodes:[{id:"error-node",label:"Invalid Diagram JSON",description:String(i),color:"rose"}]}}return e}function it(e,i){let r=ft(e),m={...r.layout,...i},g=ot(r,m),w=[],p=1;g.groups.forEach(t=>{let o=rt(t.color),s=`frame_${t.id}`;w.push({id:s,type:"frame",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:o.stroke,strokeWidth:1.5,strokeStyle:t.borderStyle||"dashed",fillColor:t.backgroundColor||"transparent",fillStyle:"solid",opacity:.85,zIndex:p++,frameLabel:t.label});});let a=new Map;g.nodes.forEach(t=>{let o=rt(t.color,t.strokeColor,t.fillColor),s=`shape_${t.id}`,f=`group_node_${t.id}`;a.set(t.id,{id:t.id,x:t.x,y:t.y,width:t.width,height:t.height,shapeId:s,shape:t.shape});let u="rectangle",n=false;switch(t.shape){case "diamond":u="diamond";break;case "ellipse":case "circle":u="ellipse";break;case "cylinder":case "database":u="cylinder";break;case "cloud":u="cloud";break;case "sticky":u="sticky";break;case "rounded":u="rectangle",n=true;break;default:u="rectangle",n=false;break}let h=t.description?`${t.label}
|
|
4
|
+
${t.description}`:t.label,P=t.textColor||o.text;if(u==="sticky"?w.push({id:s,type:"sticky",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:o.stroke,strokeWidth:t.strokeWidth||1.5,strokeStyle:t.strokeStyle||"solid",fillColor:o.fill,fillStyle:"solid",stickyColor:o.fill,text:h,textColor:P,fontSize:t.fontSize||14,fontFamily:t.fontFamily||"fuzzy",textAlign:t.textAlign||"center",opacity:t.opacity??1,zIndex:p++,roughness:t.roughness??1}):w.push({id:s,type:u,x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:o.stroke,strokeWidth:t.strokeWidth||2,strokeStyle:t.strokeStyle||"solid",fillColor:o.fill,fillStyle:pt(t.fillStyle),text:h,textColor:P,fontSize:t.fontSize||13.5,fontFamily:t.fontFamily||"sans",textAlign:t.textAlign||"center",opacity:t.opacity??1,zIndex:p++,edgeStyle:n?"round":"sharp",roughness:t.roughness??1,groupIds:[f]}),t.badge){let L=`badge_${t.id}`,A=Math.max(45,t.badge.length*8+14),v=20,Y=t.x+t.width-A-8,M=t.y-8;u==="diamond"?(Y=Math.round(t.x+t.width/2-A/2),M=Math.round(t.y-v-4)):u==="cylinder"?(Y=Math.round(t.x+t.width-A-14),M=Math.round(t.y-6)):u==="cloud"&&(Y=Math.round(t.x+t.width-A-24),M=Math.round(t.y+2)),w.push({id:L,type:"rectangle",x:Y,y:M,width:A,height:v,strokeColor:o.stroke,strokeWidth:1.5,strokeStyle:"solid",fillColor:"#e2e8f0",fillStyle:"solid",text:t.badge,textColor:o.stroke,fontSize:10,fontFamily:"mono",textAlign:"center",opacity:1,zIndex:p++,edgeStyle:"round",groupIds:[f]});}});let c=i?.direction||r.direction||"LR",y=[];function d(t,o=8){for(let s of y)if(t.x<s.x+s.width+o&&t.x+t.width+o>s.x&&t.y<s.y+s.height+o&&t.y+t.height+o>s.y)return true;return false}let l=at(g.edges,a,c,m);return g.edges.forEach((t,o)=>{let s=a.get(t.from),f=a.get(t.to);if(!s||!f)return;let u=l[o],n=u?.startAnchor||"right",h=u?.endAnchor||"left",P=u?.startX??Math.round(s.x+s.width),L=u?.startY??Math.round(s.y+s.height/2),A=u?.endX??Math.round(f.x),v=u?.endY??Math.round(f.y+f.height/2),Y=u?.arrowType??"straight",M=u?.controlPoint,N=u?.controlPoint1,B=u?.controlPoint2,R=t.id||`edge_${t.from}_${t.to}_${o}`,F=A-P,I=v-L,C=Array.from(a.values()).filter(S=>S.id!==s.id&&S.id!==f.id),G=t.tunneling!==false&&m.tunneling!==false&&u?st(u,C,m):[{startX:P,startY:L,endX:A,endY:v,isInside:false,isLast:true,arrowType:Y,controlPoint:M,controlPoint1:N,controlPoint2:B}],b=m.passthroughOpacity??.35,k=m.passthroughStyle??"dotted",W=!!t.label;if(G.forEach((S,X)=>{let x=S.endX-S.startX,D=S.endY-S.startY,$=G.length===1?R:`${R}_sub_${X}`,O=S.isInside,_=O?k:t.style||"solid",z=O?b:1,J=X===0?{elementId:s.shapeId,anchor:n}:void 0,K=S.isLast?{elementId:f.shapeId,anchor:h}:void 0,H=S.isLast&&t.arrowEnd!==false?"arrow":"none",E=X===0&&t.arrowStart?"arrow":"none";w.push({id:$,type:S.isLast?"arrow":"line",x:S.startX,y:S.startY,width:x,height:D,arrowType:S.arrowType,controlPoint:S.controlPoint,controlPoint1:S.controlPoint1,controlPoint2:S.controlPoint2,strokeColor:mt(t.color),strokeWidth:t.strokeWidth||2,strokeStyle:_,fillColor:"transparent",fillStyle:"solid",opacity:z,zIndex:O?2:p++,roughness:t.roughness??1,startBinding:J,endBinding:K,endArrowhead:H,startArrowhead:E,label:W&&S.isLast?t.label:void 0});}),t.label&&!W){let S=Math.max(60,t.label.length*7.5+20),X=22,x={x:P,y:L},D={x:A,y:v},$=[.5,.35,.65,.22,.78,.15,.85],O=Math.round(P+F/2),_=Math.round(L+I/2),z=false;for(let K of $){let H=et(K,x,D,Y,M,N,B),E={x:Math.round(H.x-S/2),y:Math.round(H.y-X/2),width:S,height:X},U=d(E,6),q=Array.from(a.values()).some(V=>E.x<V.x+V.width+4&&E.x+E.width+4>V.x&&E.y<V.y+V.height+4&&E.y+E.height+4>V.y);if(!U&&!q){O=Math.round(H.x),_=Math.round(H.y),z=true;break}}if(!z){let K=et(.5,x,D,Y,M,N,B);O=Math.round(K.x),_=Math.round(K.y);let H={x:Math.round(O-S/2),y:Math.round(_-X/2),width:S,height:X};for(let E of [-24,24,-44,44,-64,64]){let U=c==="TB"||c==="BT"?{...H,x:H.x+E}:{...H,y:H.y+E};if(!d(U,4)){c==="TB"||c==="BT"?O+=E:_+=E;break}}}let J={x:Math.round(O-S/2),y:Math.round(_-X/2),width:S,height:X};y.push(J),w.push({id:`label_${R}`,type:"rectangle",x:J.x,y:J.y,width:S,height:X,strokeColor:"#cbd5e1",strokeWidth:1,strokeStyle:"solid",fillColor:"#e2e8f0",fillStyle:"solid",text:t.label,textColor:"#0f172a",fontSize:10.5,fontFamily:"sans",textAlign:"center",opacity:.96,zIndex:p++,edgeStyle:"round"});}}),{version:1,name:r.title||"System Architecture",elements:w,canvasBackground:r.canvasBackground||"#f0f4f8",gridStyle:r.gridStyle||"dots",createdAt:Date.now(),updatedAt:Date.now()}}function bt(e){switch(e){case 1:return "fuzzy";case 2:return "sans";case 3:return "mono";default:return "sans"}}function wt(e){switch(e){case "rectangle":return "rectangle";case "diamond":return "diamond";case "ellipse":return "ellipse";case "arrow":return "arrow";case "line":return "line";case "text":return "text";case "freedraw":return "pen";case "image":return "image";case "frame":return "frame";default:return "rectangle"}}function ht(e,i="Imported Excalidraw"){let r;if(typeof e=="string")try{r=JSON.parse(e);}catch{return {version:1,name:i,elements:[],canvasBackground:"#ffffff",gridStyle:"none",createdAt:Date.now(),updatedAt:Date.now()}}else r=e;let g=(Array.isArray(r)?r:Array.isArray(r.elements)?r.elements:[]).filter(a=>!a.isDeleted),w=[];g.forEach((a,c)=>{let y=typeof a.opacity=="number"?a.opacity/100:1,d=a.strokeWidth||2,l=a.strokeColor&&a.strokeColor!=="transparent"?a.strokeColor:"#1e293b",t=a.backgroundColor&&a.backgroundColor!=="transparent"?a.backgroundColor:"transparent",o="solid";a.fillStyle==="hachure"?o="hachure":a.fillStyle==="cross-hatch"?o="cross-hatch":a.fillStyle==="dots"?o="dots":t==="transparent"&&(o="transparent");let s=a.strokeStyle==="dashed"?"dashed":a.strokeStyle==="dotted"?"dotted":"solid",f={id:a.id||`excal_${c}`,type:wt(a.type),x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height),rotation:a.angle||0,strokeColor:l,strokeWidth:d,strokeStyle:s,fillColor:t,fillStyle:o,opacity:y,zIndex:c+1,roughness:typeof a.roughness=="number"?a.roughness:1,text:a.text,fontSize:a.fontSize||18,fontFamily:bt(a.fontFamily),textAlign:a.textAlign||"left",groupIds:a.groupIds};a.type==="freedraw"&&Array.isArray(a.points)&&(f.points=a.points.map(([u,n])=>({x:u,y:n}))),(a.type==="arrow"||a.type==="line")&&(f.endArrowhead=a.endArrowhead?"arrow":"none",f.startArrowhead=a.startArrowhead?"arrow":"none",a.startBinding?.elementId&&(f.startBinding={elementId:a.startBinding.elementId,anchor:"center"}),a.endBinding?.elementId&&(f.endBinding={elementId:a.endBinding.elementId,anchor:"center"})),w.push(f);});let p=Array.isArray(r)?void 0:r.appState;return {version:1,name:i,elements:w,canvasBackground:p?.viewBackgroundColor||"#ffffff",gridStyle:p?.gridSize?"grid":"none",createdAt:Date.now(),updatedAt:Date.now()}}function Et(e){if(typeof e=="string")return e.includes('"type":"excalidraw"')||e.includes('"source":"https://excalidraw.com"');if(typeof e=="object"&&e!==null){if("type"in e&&e.type==="excalidraw")return true;if("elements"in e&&Array.isArray(e.elements)){let i=e.elements[0];if(i&&typeof i=="object"&&i!==null&&"roughness"in i&&"strokeColor"in i)return true}}return false}var gt=react.forwardRef(function({data:i,mode:r="viewer",layoutOptions:m,uiConfig:g,theme:w="system",canvasBackground:p,gridStyle:a,interactive:c=true,autoFit:y=true,showCopyButton:d=true,showZoomControls:l=false,title:t,panelVariant:o="classic",storageKey:s=null,onExit:f,guideHref:u,onOpenGuide:n,onChange:h,controllerRef:P,className:L="",style:A},v){let Y=typeof i=="string"?i:JSON.stringify(i),M=m?JSON.stringify(m):"",N=react.useMemo(()=>Et(i)?ht(i,t||"Imported Diagram"):it(i,m),[Y,M,t]),B=p??N.canvasBackground,R=a??N.gridStyle;return r==="viewer"?jsxRuntime.jsx(sketch.SketchViewer,{ref:v,controllerRef:P,value:N.elements,theme:w,canvasBackground:B,gridStyle:R,interactive:c,autoFit:y,showCopyButton:d,showZoomControls:l,title:t??N.name,uiConfig:g,className:L,style:A}):jsxRuntime.jsx(sketch.SketchEditor,{ref:v,controllerRef:P,value:N.elements,boardName:t??N.name,theme:w,canvasBackground:B,gridStyle:R,panelVariant:o,storageKey:s,uiConfig:g,onExit:f,guideHref:u,onOpenGuide:n,onChange:h,className:L,style:A})}),Dt=gt;
|
|
5
|
+
exports.Diagram=gt;exports.SketchDiagram=Dt;exports.THEME_PALETTES=tt;exports.decomposePassthroughSegments=st;exports.diagramToSketch=it;exports.estimateNodeDimensions=ut;exports.excalidrawToSketch=ht;exports.isPointInsideShape=dt;exports.layoutDiagram=ot;exports.parseDiagramData=ft;exports.resolveNodeColors=rt;exports.routeDiagramEdges=at;exports.sampleEdgePoint=et;
|
package/dist/index.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import {forwardRef,useMemo}from'react';import {SketchViewer,SketchEditor}from'@filekit-studio/sketch';import {jsx}from'react/jsx-runtime';function
|
|
1
|
+
import {forwardRef,useMemo}from'react';import {SketchViewer,SketchEditor}from'@filekit-studio/sketch';import {jsx}from'react/jsx-runtime';function ut(e,i=210,r=90){if(e.width&&e.height)return {width:e.width,height:e.height};let g=(e.description?`${e.label||""}
|
|
2
2
|
${e.description}`:e.label||"").split(`
|
|
3
|
-
`),w=f.reduce((i,u)=>Math.max(i,u.length),0),x=(e.fontSize||14)*.72,n=Math.round(w*x),s=Math.max(c,n+64),m=f.length,l=(e.fontSize||14)*1.45,h=e.badge?14:0,t=Math.max(o,Math.round(m*l+44+h));if(e.shape==="diamond")return {width:e.width??Math.max(Math.round(s*1.65),240),height:e.height??Math.max(Math.round(t*1.55),160)};if(e.shape==="cylinder"||e.shape==="database")return {width:e.width??Math.max(s+32,230),height:e.height??Math.max(t+(e.description?90:75),180)};if(e.shape==="cloud")return {width:e.width??Math.max(Math.round(s*1.45),230),height:e.height??Math.max(Math.round(t*1.4),125)};if(e.shape==="sticky")return {width:e.width??Math.max(s+20,220),height:e.height??Math.max(t+34,140)};if(e.shape==="circle"||e.shape==="ellipse"){let i=Math.max(s*1.25,t*1.25,140);return {width:e.width??i,height:e.height??Math.max(Math.round(t*1.3),110)}}return {width:e.width??Math.max(s+16,210),height:e.height??Math.max(t+12,90)}}function nt(e,c){let o=new Map,g=new Map;e.forEach(s=>{o.set(s,[]),g.set(s,0);}),c.forEach(s=>{o.has(s.from)&&g.has(s.to)&&(o.get(s.from).push(s.to),g.set(s.to,(g.get(s.to)||0)+1));});let f=new Map,w=new Set,x=new Set;function n(s,m){if(x.has(s))return;let l=f.get(s)??0;f.set(s,Math.max(l,m)),x.add(s),w.add(s);let h=o.get(s)||[];for(let t of h)n(t,m+1);x.delete(s);}return e.filter(s=>(g.get(s)||0)===0).forEach(s=>n(s,0)),e.forEach(s=>{w.has(s)||n(s,0);}),f}function ot(e,c){let o={...e.layout,...c},g=o.direction||e.direction||"LR",f=o.nodeSpacing??95,w=o.rankSpacing??220,x=o.padding??90,n=o.groupPadding??56,s=o.clusterSpacing??220,m=o.intraRankSpacing??120,l=o.defaultNodeWidth??210,h=o.defaultNodeHeight??90,t=e.nodes||[],i=e.edges||[],u=e.groups||[];if(t.length===0)return {nodes:[],edges:[],groups:[],bounds:{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0}};let b=t.map(p=>{let S=ct(p,l,h);return {...p,width:S.width,height:S.height,x:p.x??0,y:p.y??0,relX:0,relY:0}}),d=new Map;b.forEach(p=>d.set(p.id,p));let r=g==="LR"||g==="RL",a=g==="RL"||g==="BT",P=36;if(!(u.length>0)){let p=nt(t.map(y=>y.id),i),S=new Map;b.forEach(y=>{let E=p.get(y.id)??0;S.has(E)||S.set(E,[]),S.get(E).push(y);});let M=Array.from(S.keys()).sort((y,E)=>y-E),X=x,z=0;return M.forEach(y=>{let R=S.get(y).reduce((W,U,L)=>W+(r?U.height:U.width)+(L>0?f:0),0);z=Math.max(z,R);}),M.forEach(y=>{let E=S.get(y),R=0,W=E.reduce((L,K,G)=>L+(r?K.height:K.width)+(G>0?f:0),0),U=x+(z-W)/2;E.forEach(L=>{R=Math.max(R,r?L.width:L.height),r?(L.x=Math.round(X),L.y=Math.round(U),U+=L.height+f):(L.x=Math.round(U),L.y=Math.round(X),U+=L.width+f);}),X+=R+w;}),ht(b,i,[],a,r,x,X)}let Y=new Map;u.forEach(p=>{p.nodeIds.forEach(S=>Y.set(S,p.id));});let N=[],D=new Map;u.forEach(p=>{let S=p.nodeIds.map(T=>d.get(T)).filter(T=>!!T);if(S.length===0)return;let M=new Set(p.nodeIds),X=i.filter(T=>M.has(T.from)&&M.has(T.to)),z=nt(S.map(T=>T.id),X),y=new Map;S.forEach(T=>{let V=z.get(T.id)??0;y.has(V)||y.set(V,[]),y.get(V).push(T);});let E=Array.from(y.keys()).sort((T,V)=>T-V),R=0,W=0;E.forEach(T=>{let j=y.get(T).reduce((rt,q,J)=>rt+(r?q.height:q.width)+(J>0?f:0),0);W=Math.max(W,j);}),E.forEach(T=>{let V=y.get(T),j=0,rt=V.reduce((J,it,gt)=>J+(r?it.height:it.width)+(gt>0?f:0),0),q=(W-rt)/2;V.forEach(J=>{j=Math.max(j,r?J.width:J.height),r?(J.relX=Math.round(R),J.relY=Math.round(q),q+=J.height+f):(J.relX=Math.round(q),J.relY=Math.round(R),q+=J.width+f);}),R+=j+m;});let U=r?R-m:W,L=r?W:R-m,K=Math.round(U+n*2),G=Math.round(L+n*2+P),$={id:p.id,isGroup:true,groupObj:p,memberNodes:S,width:K,height:G,x:0,y:0};N.push($),D.set(p.id,$);}),b.filter(p=>!Y.has(p.id)).forEach(p=>{let S={id:`standalone_${p.id}`,isGroup:false,memberNodes:[p],width:p.width,height:p.height,x:0,y:0};N.push(S),D.set(S.id,S);});let v=p=>{let S=Y.get(p);return S||`standalone_${p}`},B=[];i.forEach(p=>{let S=v(p.from),M=v(p.to);S!==M&&B.push({from:S,to:M});});let C=nt(N.map(p=>p.id),B),_=new Map;N.forEach(p=>{let S=C.get(p.id)??0;_.has(S)||_.set(S,[]),_.get(S).push(p);});let O=Array.from(_.keys()).sort((p,S)=>p-S),F=x,A=0;O.forEach(p=>{let M=_.get(p).reduce((X,z,y)=>X+(r?z.height:z.width)+(y>0?s:0),0);A=Math.max(A,M);});let H=[];return O.forEach(p=>{let S=_.get(p),M=0,X=S.reduce((y,E,R)=>y+(r?E.height:E.width)+(R>0?s:0),0),z=x+(A-X)/2;S.forEach(y=>{if(M=Math.max(M,r?y.width:y.height),r?(y.x=Math.round(F),y.y=Math.round(z),z+=y.height+s):(y.x=Math.round(z),y.y=Math.round(F),z+=y.width+s),y.isGroup&&y.groupObj)H.push({...y.groupObj,x:y.x,y:y.y,width:y.width,height:y.height}),y.memberNodes.forEach(E=>{E.x=Math.round(y.x+n+E.relX),E.y=Math.round(y.y+n+P+E.relY);});else {let E=y.memberNodes[0];E.x=y.x,E.y=y.y;}}),F+=M+s;}),ht(b,i,H,a,r,x,F)}function ht(e,c,o,g,f,w,x){if(g){let h=x-95;e.forEach(t=>{f?t.x=h-(t.x-w)-t.width:t.y=h-(t.y-w)-t.height;}),o.forEach(t=>{f?t.x=h-(t.x-w)-t.width:t.y=h-(t.y-w)-t.height;});}let n=1/0,s=1/0,m=-1/0,l=-1/0;return e.forEach(h=>{n=Math.min(n,h.x),s=Math.min(s,h.y),m=Math.max(m,h.x+h.width),l=Math.max(l,h.y+h.height);}),o.forEach(h=>{n=Math.min(n,h.x),s=Math.min(s,h.y),m=Math.max(m,h.x+h.width),l=Math.max(l,h.y+h.height);}),{nodes:e,edges:c,groups:o,bounds:{minX:Math.round(n),minY:Math.round(s),maxX:Math.round(m),maxY:Math.round(l),width:Math.round(m-n),height:Math.round(l-s)}}}function Z(e,c,o,g,f,w=12){let x=f.x-w,n=f.y-w,s=f.x+f.width+w,m=f.y+f.height+w;if(Math.max(e,o)<x||Math.min(e,o)>s||Math.max(c,g)<n||Math.min(c,g)>m)return false;let l=o-e,h=g-c,t=0,i=1,u=[-l,l,-h,h],b=[e-x,s-e,c-n,m-c];for(let d=0;d<4;d++)if(u[d]===0){if(b[d]<0)return false}else {let r=b[d]/u[d];if(u[d]<0){if(r>i)return false;r>t&&(t=r);}else {if(r<t)return false;r<i&&(i=r);}}return t<=i}function lt(e,c,o,g){let f=Array.from(c.values()),w=new Map;function x(l,h){w.has(l)||w.set(l,new Map);let t=w.get(l);return t.has(h)||t.set(h,{sourceEdges:[],targetEdges:[]}),t.get(h)}let n=[];e.forEach((l,h)=>{let t=c.get(l.from),i=c.get(l.to);if(!t||!i)return;let u=false;o==="LR"?u=i.x+i.width<=t.x+30:o==="RL"?u=i.x>=t.x+t.width-30:o==="TB"?u=i.y+i.height<=t.y+30:o==="BT"&&(u=i.y>=t.y+t.height-30);let b,d;l.startAnchor?b=l.startAnchor:u?b=o==="LR"||o==="RL"?"top":"right":b=o==="LR"?"right":o==="RL"?"left":o==="TB"?"bottom":"top",l.endAnchor?d=l.endAnchor:u?d=o==="LR"||o==="RL"?"top":"right":d=o==="LR"?"left":o==="RL"?"right":o==="TB"?"top":"bottom",n.push({edge:l,source:t,target:i,startAnchor:b,endAnchor:d,isBackward:u}),x(t.id,b).sourceEdges.push({edge:l,index:h}),x(i.id,d).targetEdges.push({edge:l,index:h});});function s(l,h,t,i){let u=x(l.id,h),b=i?u.targetEdges:u.sourceEdges,d=b.length,r=Math.max(0,b.findIndex(a=>a.index===t));if(h==="left"||h==="right"){let a=h==="left"?l.x:l.x+l.width;if(d<=1)return {x:a,y:l.y+l.height/2};let P=l.height-24,I=Math.min(28,P/(d+1)),Y=l.y+12+(P-(d-1)*I)/2,N=Math.round(Y+r*I);return {x:a,y:N}}else {let a=h==="top"?l.y:l.y+l.height;if(d<=1)return {x:l.x+l.width/2,y:a};let P=l.width-24,I=Math.min(32,P/(d+1)),Y=l.x+12+(P-(d-1)*I)/2;return {x:Math.round(Y+r*I),y:a}}}let m=[];return n.forEach(({edge:l,source:h,target:t,startAnchor:i,endAnchor:u,isBackward:b},d)=>{let r=s(h,i,d,false),a=s(t,u,d,true),P=l.id||`edge_${h.id}_${t.id}_${d}`;if(b)if(o==="LR"||o==="RL"){let D=Math.min(r.x,a.x),k=Math.max(r.x,a.x),B=f.filter(A=>A.id!==h.id&&A.id!==t.id&&A.x+A.width>D&&A.x<k).reduce((A,H)=>Math.min(A,H.y),Math.min(r.y,a.y)),C=Math.abs(r.x-a.x),_=Math.max(90,Math.min(260,C*.22)),O=Math.min(B-_,Math.min(r.y,a.y)-_),F={x:Math.round((r.x+a.x)/2),y:Math.round(O)};m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"curved",controlPoint:F,isBackward:true});return}else {let D=Math.min(r.y,a.y),k=Math.max(r.y,a.y),B=f.filter(A=>A.id!==h.id&&A.id!==t.id&&A.y+A.height>D&&A.y<k).reduce((A,H)=>Math.max(A,H.x+H.width),Math.max(r.x,a.x)),C=Math.abs(r.y-a.y),_=Math.max(90,Math.min(260,C*.22)),O=Math.max(B+_,Math.max(r.x,a.x)+_),F={x:Math.round(O),y:Math.round((r.y+a.y)/2)};m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"curved",controlPoint:F,isBackward:true});return}let I=l.routing||g?.edgeRouting||"elbow",Y=Math.abs(a.y-r.y),N=Math.abs(a.x-r.x);if(I==="elbow"){if((o==="LR"||o==="RL")&&Y<14){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"straight",isBackward:false});return}if((o==="TB"||o==="BT")&&N<14){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"straight",isBackward:false});return}let D=f.filter(k=>k.id!==h.id&&k.id!==t.id);if(o==="LR"||o==="RL"){let k=Math.round((r.x+a.x)/2),v=[k,k-36,k+36,k-72,k+72,Math.round(r.x+36),Math.round(a.x-36)],B;for(let F of v)if(!D.some(H=>Z(r.x,r.y,F,r.y,H,8)||Z(F,r.y,F,a.y,H,8)||Z(F,a.y,a.x,a.y,H,8))){B=F;break}if(B!==void 0){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:B,y:r.y},controlPoint2:{x:B,y:a.y},isBackward:false});return}let C=(r.y+a.y)/2,O=D.filter(F=>Z(r.x,r.y,a.x,a.y,F,12))[0];if(O){let A=C<O.y+O.height/2?O.y-36:O.y+O.height+36;m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:k,y:r.y},controlPoint2:{x:k,y:A},isBackward:false});return}m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:k,y:r.y},controlPoint2:{x:k,y:a.y},isBackward:false});return}else {let k=Math.round((r.y+a.y)/2),v=[k,k-36,k+36,k-72,k+72,Math.round(r.y+36),Math.round(a.y-36)],B;for(let C of v)if(!D.some(O=>Z(r.x,r.y,r.x,C,O,8)||Z(r.x,C,a.x,C,O,8)||Z(a.x,C,a.x,a.y,O,8))){B=C;break}if(B!==void 0){m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:r.x,y:B},controlPoint2:{x:a.x,y:B},isBackward:false});return}m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"elbow",controlPoint1:{x:r.x,y:k},controlPoint2:{x:a.x,y:k},isBackward:false});return}}if(I==="curved"){let D=Math.round((r.x+a.x)/2),k=Math.round((r.y+a.y)/2);m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"curved",controlPoint:{x:D,y:k},isBackward:false});return}m.push({edgeId:P,startAnchor:i,endAnchor:u,startX:Math.round(r.x),startY:Math.round(r.y),endX:Math.round(a.x),endY:Math.round(a.y),arrowType:"straight",isBackward:false});}),m}function xt(e,c,o,g=0){let f=o.x-g,w=o.y-g,x=o.x+o.width+g,n=o.y+o.height+g;if(e<f||e>x||c<w||c>n)return false;let s=o.x+o.width/2,m=o.y+o.height/2,l=o.width/2+g,h=o.height/2+g,t=o.shape||"rectangle";return t==="diamond"?Math.abs(e-s)/l+Math.abs(c-m)/h<=1:t==="ellipse"||t==="circle"||t==="cloud"?(e-s)*(e-s)/(l*l)+(c-m)*(c-m)/(h*h)<=1:true}function tt(e,c,o,g,f,w,x){if(g==="curved"&&f){let n=1-e;return {x:n*n*c.x+2*n*e*f.x+e*e*o.x,y:n*n*c.y+2*n*e*f.y+e*e*o.y}}if(g==="elbow"&&w&&x){let n=1-e,s=n*n,m=s*n,l=e*e,h=l*e;return {x:m*c.x+3*s*e*w.x+3*n*l*x.x+h*o.x,y:m*c.y+3*s*e*w.y+3*n*l*x.y+h*o.y}}return {x:c.x+e*(o.x-c.x),y:c.y+e*(o.y-c.y)}}function ut(e,c,o){let g={x:e.startX,y:e.startY},f={x:e.endX,y:e.endY};if(o?.tunneling===false||c.length===0)return [{startX:g.x,startY:g.y,endX:f.x,endY:f.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let w=32,x=[],n=false;for(let h=0;h<=w;h++){let t=h/w,i=tt(t,g,f,e.arrowType,e.controlPoint,e.controlPoint1,e.controlPoint2),u=t>.04&&t<.96&&c.some(b=>xt(i.x,i.y,b,2));u&&(n=true),x.push({pt:i,inside:u,t});}if(!n)return [{startX:g.x,startY:g.y,endX:f.x,endY:f.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let s=[],m={points:[x[0]],isInside:x[0].inside};for(let h=1;h<x.length;h++){let t=x[h];t.inside===m.isInside?m.points.push(t):(s.push(m),m={points:[m.points[m.points.length-1],t],isInside:t.inside});}s.push(m);let l=[];return s.forEach((h,t)=>{let i=h.points[0].pt,u=h.points[h.points.length-1].pt,b=t===s.length-1;l.push({startX:Math.round(i.x),startY:Math.round(i.y),endX:Math.round(u.x),endY:Math.round(u.y),isInside:h.isInside,isLast:b,arrowType:"straight"});}),l}var Q={indigo:{stroke:"#4f46e5",fill:"#e0e7ff",text:"#312e81"},blue:{stroke:"#2563eb",fill:"#dbeafe",text:"#1e3a8a"},emerald:{stroke:"#059669",fill:"#d1fae5",text:"#064e3b"},green:{stroke:"#16a34a",fill:"#dcfce7",text:"#14532d"},amber:{stroke:"#d97706",fill:"#fef3c7",text:"#78350f"},yellow:{stroke:"#ca8a04",fill:"#fef9c3",text:"#713f12"},rose:{stroke:"#e11d48",fill:"#ffe4e6",text:"#881337"},red:{stroke:"#dc2626",fill:"#fee2e2",text:"#7f1d1d"},purple:{stroke:"#7c3aed",fill:"#ede9fe",text:"#4c1d95"},violet:{stroke:"#8b5cf6",fill:"#f3e8ff",text:"#581c87"},slate:{stroke:"#475569",fill:"#f1f5f9",text:"#0f172a"},neutral:{stroke:"#525252",fill:"#f5f5f5",text:"#171717"},sky:{stroke:"#0284c7",fill:"#e0f2fe",text:"#0c4a6e"},cyan:{stroke:"#0891b2",fill:"#cffafe",text:"#164e63"},teal:{stroke:"#0d9488",fill:"#ccfbf1",text:"#134e4a"},orange:{stroke:"#ea580c",fill:"#ffedd5",text:"#7c2d12"}};function et(e,c,o){return c||o?{stroke:c||"#4f46e5",fill:o||"#e0e7ff",text:c||"#1e293b"}:e&&Q[e]?Q[e]:e&&e.startsWith("#")?{stroke:e,fill:`${e}20`,text:e}:Q.indigo}function dt(e){if(!e)return "#475569";let c=e.trim().toLowerCase();return Q[c]?Q[c].stroke:e}function pt(e){switch(e){case "none":return "transparent";case "solid":return "solid";case "cross-hatch":return "cross-hatch";case "dots":return "dots";default:return "hachure"}}function mt(e){if(typeof e=="string")try{let c=JSON.parse(e);if(typeof c!="object"||c===null)throw new Error("Parsed diagram JSON must be an object");return c}catch(c){return console.error("Failed to parse diagram JSON string:",c),{title:"Empty Diagram",nodes:[{id:"error-node",label:"Invalid Diagram JSON",description:String(c),color:"rose"}]}}return e}function at(e,c){let o=mt(e),g={...o.layout,...c},f=ot(o,g),w=[],x=1;f.groups.forEach(t=>{let i=et(t.color),u=`frame_${t.id}`;w.push({id:u,type:"frame",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:i.stroke,strokeWidth:1.5,strokeStyle:t.borderStyle||"dashed",fillColor:t.backgroundColor||"transparent",fillStyle:"solid",opacity:.85,zIndex:x++,frameLabel:t.label});});let n=new Map;f.nodes.forEach(t=>{let i=et(t.color,t.strokeColor,t.fillColor),u=`shape_${t.id}`,b=`group_node_${t.id}`;n.set(t.id,{id:t.id,x:t.x,y:t.y,width:t.width,height:t.height,shapeId:u,shape:t.shape});let d="rectangle",r=false;switch(t.shape){case "diamond":d="diamond";break;case "ellipse":case "circle":d="ellipse";break;case "cylinder":case "database":d="cylinder";break;case "cloud":d="cloud";break;case "sticky":d="sticky";break;case "rounded":d="rectangle",r=true;break;default:d="rectangle",r=false;break}let a=t.description?`${t.label}
|
|
4
|
-
${t.description}`:t.label,P=t.textColor||
|
|
5
|
-
export{
|
|
3
|
+
`),w=g.reduce((o,s)=>Math.max(o,s.length),0),p=(e.fontSize||14)*.72,a=Math.round(w*p),c=Math.max(i,a+64),y=g.length,d=(e.fontSize||14)*1.45,l=e.badge?14:0,t=Math.max(r,Math.round(y*d+44+l));if(e.shape==="diamond")return {width:e.width??Math.max(Math.round(c*1.65),240),height:e.height??Math.max(Math.round(t*1.55),160)};if(e.shape==="cylinder"||e.shape==="database")return {width:e.width??Math.max(c+32,230),height:e.height??Math.max(t+(e.description?90:75),180)};if(e.shape==="cloud")return {width:e.width??Math.max(Math.round(c*1.45),230),height:e.height??Math.max(Math.round(t*1.4),125)};if(e.shape==="sticky")return {width:e.width??Math.max(c+20,220),height:e.height??Math.max(t+34,140)};if(e.shape==="circle"||e.shape==="ellipse"){let o=Math.max(c*1.25,t*1.25,140);return {width:e.width??o,height:e.height??Math.max(Math.round(t*1.3),110)}}return {width:e.width??Math.max(c+16,210),height:e.height??Math.max(t+12,90)}}function nt(e,i){let r=new Map,m=new Map;e.forEach(c=>{r.set(c,[]),m.set(c,0);}),i.forEach(c=>{r.has(c.from)&&m.has(c.to)&&(r.get(c.from).push(c.to),m.set(c.to,(m.get(c.to)||0)+1));});let g=new Map,w=new Set,p=new Set;function a(c,y){if(p.has(c))return;let d=g.get(c)??0;g.set(c,Math.max(d,y)),p.add(c),w.add(c);let l=r.get(c)||[];for(let t of l)a(t,y+1);p.delete(c);}return e.filter(c=>(m.get(c)||0)===0).forEach(c=>a(c,0)),e.forEach(c=>{w.has(c)||a(c,0);}),g}function ot(e,i){let r={...e.layout,...i},m=r.direction||e.direction||"LR",g=r.nodeSpacing??95,w=r.rankSpacing??220,p=r.padding??90,a=r.groupPadding??56,c=r.clusterSpacing??220,y=r.intraRankSpacing??120,d=r.defaultNodeWidth??210,l=r.defaultNodeHeight??90,t=e.nodes||[],o=e.edges||[],s=e.groups||[];if(t.length===0)return {nodes:[],edges:[],groups:[],bounds:{minX:0,minY:0,maxX:0,maxY:0,width:0,height:0}};let f=t.map(b=>{let k=ut(b,d,l);return {...b,width:k.width,height:k.height,x:b.x??0,y:b.y??0,relX:0,relY:0}}),u=new Map;f.forEach(b=>u.set(b.id,b));let n=m==="LR"||m==="RL",h=m==="RL"||m==="BT",P=36;if(!(s.length>0)){let b=nt(t.map(x=>x.id),o),k=new Map;f.forEach(x=>{let D=b.get(x.id)??0;k.has(D)||k.set(D,[]),k.get(D).push(x);});let W=Array.from(k.keys()).sort((x,D)=>x-D),S=p,X=0;return W.forEach(x=>{let $=k.get(x).reduce((O,_,z)=>O+(n?_.height:_.width)+(z>0?g:0),0);X=Math.max(X,$);}),W.forEach(x=>{let D=k.get(x),$=0,O=D.reduce((z,J,K)=>z+(n?J.height:J.width)+(K>0?g:0),0),_=p+(X-O)/2;D.forEach(z=>{$=Math.max($,n?z.width:z.height),n?(z.x=Math.round(S),z.y=Math.round(_),_+=z.height+g):(z.x=Math.round(_),z.y=Math.round(S),_+=z.width+g);}),S+=$+w;}),lt(f,o,[],h,n,p,S)}let A=new Map;s.forEach(b=>{b.nodeIds.forEach(k=>A.set(k,b.id));});let v=[],Y=new Map;s.forEach(b=>{let k=b.nodeIds.map(E=>u.get(E)).filter(E=>!!E);if(k.length===0)return;let W=new Set(b.nodeIds),S=o.filter(E=>W.has(E.from)&&W.has(E.to)),X=nt(k.map(E=>E.id),S),x=new Map;k.forEach(E=>{let U=X.get(E.id)??0;x.has(U)||x.set(U,[]),x.get(U).push(E);});let D=Array.from(x.keys()).sort((E,U)=>E-U),$=0,O=0;D.forEach(E=>{let q=x.get(E).reduce((V,Z,j)=>V+(n?Z.height:Z.width)+(j>0?g:0),0);O=Math.max(O,q);}),D.forEach(E=>{let U=x.get(E),q=0,V=U.reduce((j,ct,xt)=>j+(n?ct.height:ct.width)+(xt>0?g:0),0),Z=(O-V)/2;U.forEach(j=>{q=Math.max(q,n?j.width:j.height),n?(j.relX=Math.round($),j.relY=Math.round(Z),Z+=j.height+g):(j.relX=Math.round(Z),j.relY=Math.round($),Z+=j.width+g);}),$+=q+y;});let _=n?$-y:O,z=n?O:$-y,J=Math.round(_+a*2),K=Math.round(z+a*2+P),H={id:b.id,isGroup:true,groupObj:b,memberNodes:k,width:J,height:K,x:0,y:0};v.push(H),Y.set(b.id,H);}),f.filter(b=>!A.has(b.id)).forEach(b=>{let k={id:`standalone_${b.id}`,isGroup:false,memberNodes:[b],width:b.width,height:b.height,x:0,y:0};v.push(k),Y.set(k.id,k);});let N=b=>{let k=A.get(b);return k||`standalone_${b}`},B=[];o.forEach(b=>{let k=N(b.from),W=N(b.to);k!==W&&B.push({from:k,to:W});});let R=nt(v.map(b=>b.id),B),F=new Map;v.forEach(b=>{let k=R.get(b.id)??0;F.has(k)||F.set(k,[]),F.get(k).push(b);});let I=Array.from(F.keys()).sort((b,k)=>b-k),C=p,T=0;I.forEach(b=>{let W=F.get(b).reduce((S,X,x)=>S+(n?X.height:X.width)+(x>0?c:0),0);T=Math.max(T,W);});let G=[];return I.forEach(b=>{let k=F.get(b),W=0,S=k.reduce((x,D,$)=>x+(n?D.height:D.width)+($>0?c:0),0),X=p+(T-S)/2;k.forEach(x=>{if(W=Math.max(W,n?x.width:x.height),n?(x.x=Math.round(C),x.y=Math.round(X),X+=x.height+c):(x.x=Math.round(X),x.y=Math.round(C),X+=x.width+c),x.isGroup&&x.groupObj)G.push({...x.groupObj,x:x.x,y:x.y,width:x.width,height:x.height}),x.memberNodes.forEach(D=>{D.x=Math.round(x.x+a+D.relX),D.y=Math.round(x.y+a+P+D.relY);});else {let D=x.memberNodes[0];D.x=x.x,D.y=x.y;}}),C+=W+c;}),lt(f,o,G,h,n,p,C)}function lt(e,i,r,m,g,w,p){if(m){let l=p-95;e.forEach(t=>{g?t.x=l-(t.x-w)-t.width:t.y=l-(t.y-w)-t.height;}),r.forEach(t=>{g?t.x=l-(t.x-w)-t.width:t.y=l-(t.y-w)-t.height;});}let a=1/0,c=1/0,y=-1/0,d=-1/0;return e.forEach(l=>{a=Math.min(a,l.x),c=Math.min(c,l.y),y=Math.max(y,l.x+l.width),d=Math.max(d,l.y+l.height);}),r.forEach(l=>{a=Math.min(a,l.x),c=Math.min(c,l.y),y=Math.max(y,l.x+l.width),d=Math.max(d,l.y+l.height);}),{nodes:e,edges:i,groups:r,bounds:{minX:Math.round(a),minY:Math.round(c),maxX:Math.round(y),maxY:Math.round(d),width:Math.round(y-a),height:Math.round(d-c)}}}function Q(e,i,r,m,g,w=12){let p=g.x-w,a=g.y-w,c=g.x+g.width+w,y=g.y+g.height+w;if(Math.max(e,r)<p||Math.min(e,r)>c||Math.max(i,m)<a||Math.min(i,m)>y)return false;let d=r-e,l=m-i,t=0,o=1,s=[-d,d,-l,l],f=[e-p,c-e,i-a,y-i];for(let u=0;u<4;u++)if(s[u]===0){if(f[u]<0)return false}else {let n=f[u]/s[u];if(s[u]<0){if(n>o)return false;n>t&&(t=n);}else {if(n<t)return false;n<o&&(o=n);}}return t<=o}function at(e,i,r,m){let g=Array.from(i.values()),w=new Map;function p(d,l){w.has(d)||w.set(d,new Map);let t=w.get(d);return t.has(l)||t.set(l,{sourceEdges:[],targetEdges:[]}),t.get(l)}let a=[];e.forEach((d,l)=>{let t=i.get(d.from),o=i.get(d.to);if(!t||!o)return;let s=false;r==="LR"?s=o.x+o.width<=t.x+30:r==="RL"?s=o.x>=t.x+t.width-30:r==="TB"?s=o.y+o.height<=t.y+30:r==="BT"&&(s=o.y>=t.y+t.height-30);let f,u;d.startAnchor?f=d.startAnchor:s?f=r==="LR"||r==="RL"?"top":"right":f=r==="LR"?"right":r==="RL"?"left":r==="TB"?"bottom":"top",d.endAnchor?u=d.endAnchor:s?u=r==="LR"||r==="RL"?"top":"right":u=r==="LR"?"left":r==="RL"?"right":r==="TB"?"top":"bottom",a.push({edge:d,source:t,target:o,startAnchor:f,endAnchor:u,isBackward:s}),p(t.id,f).sourceEdges.push({edge:d,index:l}),p(o.id,u).targetEdges.push({edge:d,index:l});});function c(d,l,t,o){let s=p(d.id,l),f=o?s.targetEdges:s.sourceEdges,u=f.length,n=Math.max(0,f.findIndex(h=>h.index===t));if(l==="left"||l==="right"){let h=l==="left"?d.x:d.x+d.width;if(u<=1)return {x:h,y:d.y+d.height/2};let P=d.height-24,L=Math.min(28,P/(u+1)),A=d.y+12+(P-(u-1)*L)/2,v=Math.round(A+n*L);return {x:h,y:v}}else {let h=l==="top"?d.y:d.y+d.height;if(u<=1)return {x:d.x+d.width/2,y:h};let P=d.width-24,L=Math.min(32,P/(u+1)),A=d.x+12+(P-(u-1)*L)/2;return {x:Math.round(A+n*L),y:h}}}let y=[];return a.forEach(({edge:d,source:l,target:t,startAnchor:o,endAnchor:s,isBackward:f},u)=>{let n=c(l,o,u,false),h=c(t,s,u,true),P=d.id||`edge_${l.id}_${t.id}_${u}`;if(f)if(r==="LR"||r==="RL"){let Y=Math.min(n.x,h.x),M=Math.max(n.x,h.x),B=g.filter(T=>T.id!==l.id&&T.id!==t.id&&T.x+T.width>Y&&T.x<M).reduce((T,G)=>Math.min(T,G.y),Math.min(n.y,h.y)),R=Math.abs(n.x-h.x),F=Math.max(90,Math.min(260,R*.22)),I=Math.min(B-F,Math.min(n.y,h.y)-F),C={x:Math.round((n.x+h.x)/2),y:Math.round(I)};y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"curved",controlPoint:C,isBackward:true});return}else {let Y=Math.min(n.y,h.y),M=Math.max(n.y,h.y),B=g.filter(T=>T.id!==l.id&&T.id!==t.id&&T.y+T.height>Y&&T.y<M).reduce((T,G)=>Math.max(T,G.x+G.width),Math.max(n.x,h.x)),R=Math.abs(n.y-h.y),F=Math.max(90,Math.min(260,R*.22)),I=Math.max(B+F,Math.max(n.x,h.x)+F),C={x:Math.round(I),y:Math.round((n.y+h.y)/2)};y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"curved",controlPoint:C,isBackward:true});return}let L=d.routing||m?.edgeRouting||"elbow",A=Math.abs(h.y-n.y),v=Math.abs(h.x-n.x);if(L==="elbow"){if((r==="LR"||r==="RL")&&A<14){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"straight",isBackward:false});return}if((r==="TB"||r==="BT")&&v<14){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"straight",isBackward:false});return}let Y=g.filter(M=>M.id!==l.id&&M.id!==t.id);if(r==="LR"||r==="RL"){let M=Math.round((n.x+h.x)/2),N=[M,M-36,M+36,M-72,M+72,Math.round(n.x+36),Math.round(h.x-36)],B;for(let C of N)if(!Y.some(G=>Q(n.x,n.y,C,n.y,G,8)||Q(C,n.y,C,h.y,G,8)||Q(C,h.y,h.x,h.y,G,8))){B=C;break}if(B!==void 0){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:B,y:n.y},controlPoint2:{x:B,y:h.y},isBackward:false});return}let R=(n.y+h.y)/2,I=Y.filter(C=>Q(n.x,n.y,h.x,h.y,C,12))[0];if(I){let T=R<I.y+I.height/2?I.y-36:I.y+I.height+36;y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:M,y:n.y},controlPoint2:{x:M,y:T},isBackward:false});return}y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:M,y:n.y},controlPoint2:{x:M,y:h.y},isBackward:false});return}else {let M=Math.round((n.y+h.y)/2),N=[M,M-36,M+36,M-72,M+72,Math.round(n.y+36),Math.round(h.y-36)],B;for(let R of N)if(!Y.some(I=>Q(n.x,n.y,n.x,R,I,8)||Q(n.x,R,h.x,R,I,8)||Q(h.x,R,h.x,h.y,I,8))){B=R;break}if(B!==void 0){y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:n.x,y:B},controlPoint2:{x:h.x,y:B},isBackward:false});return}y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"elbow",controlPoint1:{x:n.x,y:M},controlPoint2:{x:h.x,y:M},isBackward:false});return}}if(L==="curved"){let Y=h.x-n.x,M=h.y-n.y,N=Math.hypot(Y,M),B=Math.round((n.x+h.x)/2),R=Math.round((n.y+h.y)/2),F=Math.max(18,Math.min(38,N*.15)),I=Math.round(F*2),C;Math.abs(Y)>=Math.abs(M)?C={x:B,y:R-I}:C={x:B+I,y:R},y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"curved",controlPoint:C,isBackward:false});return}y.push({edgeId:P,startAnchor:o,endAnchor:s,startX:Math.round(n.x),startY:Math.round(n.y),endX:Math.round(h.x),endY:Math.round(h.y),arrowType:"straight",isBackward:false});}),y}function dt(e,i,r,m=0){let g=r.x-m,w=r.y-m,p=r.x+r.width+m,a=r.y+r.height+m;if(e<g||e>p||i<w||i>a)return false;let c=r.x+r.width/2,y=r.y+r.height/2,d=r.width/2+m,l=r.height/2+m,t=r.shape||"rectangle";if(t==="diamond")return Math.abs(e-c)/d+Math.abs(i-y)/l<=1;if(t==="ellipse"||t==="circle"||t==="cloud")return (e-c)*(e-c)/(d*d)+(i-y)*(i-y)/(l*l)<=1;if(t==="triangle"){let o=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/r.height)),s=r.width/2*o;return e>=c-s-m&&e<=c+s+m}if(t==="parallelogram"){let o=Math.min(36,r.width*.22),s=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/r.height)),f=r.x+o*(1-s),u=r.x+r.width-o*s;return e>=f-m&&e<=u+m}if(t==="trapezoid"){let o=Math.min(r.width*.2,40),s=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/r.height)),f=r.x+o*(1-s),u=r.x+r.width-o*(1-s);return e>=f-m&&e<=u+m}if(t==="hexagon"){let o=Math.min(r.width*.22,45),s,f;if(i<=y){let u=r.height<=0?0:Math.max(0,Math.min(1,(i-r.y)/(r.height/2)));s=r.x+o*(1-u),f=r.x+r.width-o*(1-u);}else {let u=r.height<=0?0:Math.max(0,Math.min(1,(i-y)/(r.height/2)));s=r.x+o*u,f=r.x+r.width-o*u;}return e>=s-m&&e<=f+m}if(t==="capsule")if(r.width>=r.height){let o=r.height/2+m,s=r.x+r.height/2,f=r.x+r.width-r.height/2;return e>=s&&e<=f?i>=r.y-m&&i<=r.y+r.height+m:e<s?Math.hypot(e-s,i-y)<=o:Math.hypot(e-f,i-y)<=o}else {let o=r.width/2+m,s=r.y+r.width/2,f=r.y+r.height-r.width/2;return i>=s&&i<=f?e>=r.x-m&&e<=r.x+r.width+m:i<s?Math.hypot(e-c,i-s)<=o:Math.hypot(e-c,i-f)<=o}if(t==="cylinder"){let o=Math.min(24,r.height*.18),s=r.width/2+m,f=o/2+m,u=r.y+o/2,n=r.y+r.height-o/2;if(e>=g&&e<=p&&i>=u&&i<=n)return true;let h=e-c,P=i-u;if(h*h/(s*s)+P*P/(f*f)<=1)return true;let L=e-c,A=i-n;return L*L/(s*s)+A*A/(f*f)<=1}return true}function et(e,i,r,m,g,w,p){if(m==="curved"&&g){let a=1-e;return {x:a*a*i.x+2*a*e*g.x+e*e*r.x,y:a*a*i.y+2*a*e*g.y+e*e*r.y}}if(m==="elbow"&&w&&p){let a=1-e,c=a*a,y=c*a,d=e*e,l=d*e;return {x:y*i.x+3*c*e*w.x+3*a*d*p.x+l*r.x,y:y*i.y+3*c*e*w.y+3*a*d*p.y+l*r.y}}return {x:i.x+e*(r.x-i.x),y:i.y+e*(r.y-i.y)}}function st(e,i,r){let m={x:e.startX,y:e.startY},g={x:e.endX,y:e.endY};if(r?.tunneling===false||i.length===0)return [{startX:m.x,startY:m.y,endX:g.x,endY:g.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let w=32,p=[],a=false;for(let l=0;l<=w;l++){let t=l/w,o=et(t,m,g,e.arrowType,e.controlPoint,e.controlPoint1,e.controlPoint2),s=t>.04&&t<.96&&i.some(f=>dt(o.x,o.y,f,2));s&&(a=true),p.push({pt:o,inside:s,t});}if(!a)return [{startX:m.x,startY:m.y,endX:g.x,endY:g.y,isInside:false,isLast:true,arrowType:e.arrowType,controlPoint:e.controlPoint,controlPoint1:e.controlPoint1,controlPoint2:e.controlPoint2}];let c=[],y={points:[p[0]],isInside:p[0].inside};for(let l=1;l<p.length;l++){let t=p[l];t.inside===y.isInside?y.points.push(t):(c.push(y),y={points:[y.points[y.points.length-1],t],isInside:t.inside});}c.push(y);let d=[];return c.forEach((l,t)=>{let o=l.points[0].pt,s=l.points[l.points.length-1].pt,f=t===c.length-1;d.push({startX:Math.round(o.x),startY:Math.round(o.y),endX:Math.round(s.x),endY:Math.round(s.y),isInside:l.isInside,isLast:f,arrowType:"straight"});}),d}var tt={indigo:{stroke:"#4f46e5",fill:"#e0e7ff",text:"#312e81"},blue:{stroke:"#2563eb",fill:"#dbeafe",text:"#1e3a8a"},emerald:{stroke:"#059669",fill:"#d1fae5",text:"#064e3b"},green:{stroke:"#16a34a",fill:"#dcfce7",text:"#14532d"},amber:{stroke:"#d97706",fill:"#fef3c7",text:"#78350f"},yellow:{stroke:"#ca8a04",fill:"#fef9c3",text:"#713f12"},rose:{stroke:"#e11d48",fill:"#ffe4e6",text:"#881337"},red:{stroke:"#dc2626",fill:"#fee2e2",text:"#7f1d1d"},purple:{stroke:"#7c3aed",fill:"#ede9fe",text:"#4c1d95"},violet:{stroke:"#8b5cf6",fill:"#f3e8ff",text:"#581c87"},slate:{stroke:"#475569",fill:"#f1f5f9",text:"#0f172a"},neutral:{stroke:"#525252",fill:"#f5f5f5",text:"#171717"},sky:{stroke:"#0284c7",fill:"#e0f2fe",text:"#0c4a6e"},cyan:{stroke:"#0891b2",fill:"#cffafe",text:"#164e63"},teal:{stroke:"#0d9488",fill:"#ccfbf1",text:"#134e4a"},orange:{stroke:"#ea580c",fill:"#ffedd5",text:"#7c2d12"}};function rt(e,i,r){return i||r?{stroke:i||"#4f46e5",fill:r||"#e0e7ff",text:i||"#1e293b"}:e&&tt[e]?tt[e]:e&&e.startsWith("#")?{stroke:e,fill:`${e}20`,text:e}:tt.indigo}function mt(e){if(!e)return "#475569";let i=e.trim().toLowerCase();return tt[i]?tt[i].stroke:e}function pt(e){switch(e){case "none":return "transparent";case "solid":return "solid";case "cross-hatch":return "cross-hatch";case "dots":return "dots";default:return "hachure"}}function ft(e){if(typeof e=="string")try{let i=JSON.parse(e);if(typeof i!="object"||i===null)throw new Error("Parsed diagram JSON must be an object");return i}catch(i){return console.error("Failed to parse diagram JSON string:",i),{title:"Empty Diagram",nodes:[{id:"error-node",label:"Invalid Diagram JSON",description:String(i),color:"rose"}]}}return e}function it(e,i){let r=ft(e),m={...r.layout,...i},g=ot(r,m),w=[],p=1;g.groups.forEach(t=>{let o=rt(t.color),s=`frame_${t.id}`;w.push({id:s,type:"frame",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:o.stroke,strokeWidth:1.5,strokeStyle:t.borderStyle||"dashed",fillColor:t.backgroundColor||"transparent",fillStyle:"solid",opacity:.85,zIndex:p++,frameLabel:t.label});});let a=new Map;g.nodes.forEach(t=>{let o=rt(t.color,t.strokeColor,t.fillColor),s=`shape_${t.id}`,f=`group_node_${t.id}`;a.set(t.id,{id:t.id,x:t.x,y:t.y,width:t.width,height:t.height,shapeId:s,shape:t.shape});let u="rectangle",n=false;switch(t.shape){case "diamond":u="diamond";break;case "ellipse":case "circle":u="ellipse";break;case "cylinder":case "database":u="cylinder";break;case "cloud":u="cloud";break;case "sticky":u="sticky";break;case "rounded":u="rectangle",n=true;break;default:u="rectangle",n=false;break}let h=t.description?`${t.label}
|
|
4
|
+
${t.description}`:t.label,P=t.textColor||o.text;if(u==="sticky"?w.push({id:s,type:"sticky",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:o.stroke,strokeWidth:t.strokeWidth||1.5,strokeStyle:t.strokeStyle||"solid",fillColor:o.fill,fillStyle:"solid",stickyColor:o.fill,text:h,textColor:P,fontSize:t.fontSize||14,fontFamily:t.fontFamily||"fuzzy",textAlign:t.textAlign||"center",opacity:t.opacity??1,zIndex:p++,roughness:t.roughness??1}):w.push({id:s,type:u,x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:o.stroke,strokeWidth:t.strokeWidth||2,strokeStyle:t.strokeStyle||"solid",fillColor:o.fill,fillStyle:pt(t.fillStyle),text:h,textColor:P,fontSize:t.fontSize||13.5,fontFamily:t.fontFamily||"sans",textAlign:t.textAlign||"center",opacity:t.opacity??1,zIndex:p++,edgeStyle:n?"round":"sharp",roughness:t.roughness??1,groupIds:[f]}),t.badge){let L=`badge_${t.id}`,A=Math.max(45,t.badge.length*8+14),v=20,Y=t.x+t.width-A-8,M=t.y-8;u==="diamond"?(Y=Math.round(t.x+t.width/2-A/2),M=Math.round(t.y-v-4)):u==="cylinder"?(Y=Math.round(t.x+t.width-A-14),M=Math.round(t.y-6)):u==="cloud"&&(Y=Math.round(t.x+t.width-A-24),M=Math.round(t.y+2)),w.push({id:L,type:"rectangle",x:Y,y:M,width:A,height:v,strokeColor:o.stroke,strokeWidth:1.5,strokeStyle:"solid",fillColor:"#e2e8f0",fillStyle:"solid",text:t.badge,textColor:o.stroke,fontSize:10,fontFamily:"mono",textAlign:"center",opacity:1,zIndex:p++,edgeStyle:"round",groupIds:[f]});}});let c=i?.direction||r.direction||"LR",y=[];function d(t,o=8){for(let s of y)if(t.x<s.x+s.width+o&&t.x+t.width+o>s.x&&t.y<s.y+s.height+o&&t.y+t.height+o>s.y)return true;return false}let l=at(g.edges,a,c,m);return g.edges.forEach((t,o)=>{let s=a.get(t.from),f=a.get(t.to);if(!s||!f)return;let u=l[o],n=u?.startAnchor||"right",h=u?.endAnchor||"left",P=u?.startX??Math.round(s.x+s.width),L=u?.startY??Math.round(s.y+s.height/2),A=u?.endX??Math.round(f.x),v=u?.endY??Math.round(f.y+f.height/2),Y=u?.arrowType??"straight",M=u?.controlPoint,N=u?.controlPoint1,B=u?.controlPoint2,R=t.id||`edge_${t.from}_${t.to}_${o}`,F=A-P,I=v-L,C=Array.from(a.values()).filter(S=>S.id!==s.id&&S.id!==f.id),G=t.tunneling!==false&&m.tunneling!==false&&u?st(u,C,m):[{startX:P,startY:L,endX:A,endY:v,isInside:false,isLast:true,arrowType:Y,controlPoint:M,controlPoint1:N,controlPoint2:B}],b=m.passthroughOpacity??.35,k=m.passthroughStyle??"dotted",W=!!t.label;if(G.forEach((S,X)=>{let x=S.endX-S.startX,D=S.endY-S.startY,$=G.length===1?R:`${R}_sub_${X}`,O=S.isInside,_=O?k:t.style||"solid",z=O?b:1,J=X===0?{elementId:s.shapeId,anchor:n}:void 0,K=S.isLast?{elementId:f.shapeId,anchor:h}:void 0,H=S.isLast&&t.arrowEnd!==false?"arrow":"none",E=X===0&&t.arrowStart?"arrow":"none";w.push({id:$,type:S.isLast?"arrow":"line",x:S.startX,y:S.startY,width:x,height:D,arrowType:S.arrowType,controlPoint:S.controlPoint,controlPoint1:S.controlPoint1,controlPoint2:S.controlPoint2,strokeColor:mt(t.color),strokeWidth:t.strokeWidth||2,strokeStyle:_,fillColor:"transparent",fillStyle:"solid",opacity:z,zIndex:O?2:p++,roughness:t.roughness??1,startBinding:J,endBinding:K,endArrowhead:H,startArrowhead:E,label:W&&S.isLast?t.label:void 0});}),t.label&&!W){let S=Math.max(60,t.label.length*7.5+20),X=22,x={x:P,y:L},D={x:A,y:v},$=[.5,.35,.65,.22,.78,.15,.85],O=Math.round(P+F/2),_=Math.round(L+I/2),z=false;for(let K of $){let H=et(K,x,D,Y,M,N,B),E={x:Math.round(H.x-S/2),y:Math.round(H.y-X/2),width:S,height:X},U=d(E,6),q=Array.from(a.values()).some(V=>E.x<V.x+V.width+4&&E.x+E.width+4>V.x&&E.y<V.y+V.height+4&&E.y+E.height+4>V.y);if(!U&&!q){O=Math.round(H.x),_=Math.round(H.y),z=true;break}}if(!z){let K=et(.5,x,D,Y,M,N,B);O=Math.round(K.x),_=Math.round(K.y);let H={x:Math.round(O-S/2),y:Math.round(_-X/2),width:S,height:X};for(let E of [-24,24,-44,44,-64,64]){let U=c==="TB"||c==="BT"?{...H,x:H.x+E}:{...H,y:H.y+E};if(!d(U,4)){c==="TB"||c==="BT"?O+=E:_+=E;break}}}let J={x:Math.round(O-S/2),y:Math.round(_-X/2),width:S,height:X};y.push(J),w.push({id:`label_${R}`,type:"rectangle",x:J.x,y:J.y,width:S,height:X,strokeColor:"#cbd5e1",strokeWidth:1,strokeStyle:"solid",fillColor:"#e2e8f0",fillStyle:"solid",text:t.label,textColor:"#0f172a",fontSize:10.5,fontFamily:"sans",textAlign:"center",opacity:.96,zIndex:p++,edgeStyle:"round"});}}),{version:1,name:r.title||"System Architecture",elements:w,canvasBackground:r.canvasBackground||"#f0f4f8",gridStyle:r.gridStyle||"dots",createdAt:Date.now(),updatedAt:Date.now()}}function bt(e){switch(e){case 1:return "fuzzy";case 2:return "sans";case 3:return "mono";default:return "sans"}}function wt(e){switch(e){case "rectangle":return "rectangle";case "diamond":return "diamond";case "ellipse":return "ellipse";case "arrow":return "arrow";case "line":return "line";case "text":return "text";case "freedraw":return "pen";case "image":return "image";case "frame":return "frame";default:return "rectangle"}}function ht(e,i="Imported Excalidraw"){let r;if(typeof e=="string")try{r=JSON.parse(e);}catch{return {version:1,name:i,elements:[],canvasBackground:"#ffffff",gridStyle:"none",createdAt:Date.now(),updatedAt:Date.now()}}else r=e;let g=(Array.isArray(r)?r:Array.isArray(r.elements)?r.elements:[]).filter(a=>!a.isDeleted),w=[];g.forEach((a,c)=>{let y=typeof a.opacity=="number"?a.opacity/100:1,d=a.strokeWidth||2,l=a.strokeColor&&a.strokeColor!=="transparent"?a.strokeColor:"#1e293b",t=a.backgroundColor&&a.backgroundColor!=="transparent"?a.backgroundColor:"transparent",o="solid";a.fillStyle==="hachure"?o="hachure":a.fillStyle==="cross-hatch"?o="cross-hatch":a.fillStyle==="dots"?o="dots":t==="transparent"&&(o="transparent");let s=a.strokeStyle==="dashed"?"dashed":a.strokeStyle==="dotted"?"dotted":"solid",f={id:a.id||`excal_${c}`,type:wt(a.type),x:Math.round(a.x),y:Math.round(a.y),width:Math.round(a.width),height:Math.round(a.height),rotation:a.angle||0,strokeColor:l,strokeWidth:d,strokeStyle:s,fillColor:t,fillStyle:o,opacity:y,zIndex:c+1,roughness:typeof a.roughness=="number"?a.roughness:1,text:a.text,fontSize:a.fontSize||18,fontFamily:bt(a.fontFamily),textAlign:a.textAlign||"left",groupIds:a.groupIds};a.type==="freedraw"&&Array.isArray(a.points)&&(f.points=a.points.map(([u,n])=>({x:u,y:n}))),(a.type==="arrow"||a.type==="line")&&(f.endArrowhead=a.endArrowhead?"arrow":"none",f.startArrowhead=a.startArrowhead?"arrow":"none",a.startBinding?.elementId&&(f.startBinding={elementId:a.startBinding.elementId,anchor:"center"}),a.endBinding?.elementId&&(f.endBinding={elementId:a.endBinding.elementId,anchor:"center"})),w.push(f);});let p=Array.isArray(r)?void 0:r.appState;return {version:1,name:i,elements:w,canvasBackground:p?.viewBackgroundColor||"#ffffff",gridStyle:p?.gridSize?"grid":"none",createdAt:Date.now(),updatedAt:Date.now()}}function Et(e){if(typeof e=="string")return e.includes('"type":"excalidraw"')||e.includes('"source":"https://excalidraw.com"');if(typeof e=="object"&&e!==null){if("type"in e&&e.type==="excalidraw")return true;if("elements"in e&&Array.isArray(e.elements)){let i=e.elements[0];if(i&&typeof i=="object"&&i!==null&&"roughness"in i&&"strokeColor"in i)return true}}return false}var gt=forwardRef(function({data:i,mode:r="viewer",layoutOptions:m,uiConfig:g,theme:w="system",canvasBackground:p,gridStyle:a,interactive:c=true,autoFit:y=true,showCopyButton:d=true,showZoomControls:l=false,title:t,panelVariant:o="classic",storageKey:s=null,onExit:f,guideHref:u,onOpenGuide:n,onChange:h,controllerRef:P,className:L="",style:A},v){let Y=typeof i=="string"?i:JSON.stringify(i),M=m?JSON.stringify(m):"",N=useMemo(()=>Et(i)?ht(i,t||"Imported Diagram"):it(i,m),[Y,M,t]),B=p??N.canvasBackground,R=a??N.gridStyle;return r==="viewer"?jsx(SketchViewer,{ref:v,controllerRef:P,value:N.elements,theme:w,canvasBackground:B,gridStyle:R,interactive:c,autoFit:y,showCopyButton:d,showZoomControls:l,title:t??N.name,uiConfig:g,className:L,style:A}):jsx(SketchEditor,{ref:v,controllerRef:P,value:N.elements,boardName:t??N.name,theme:w,canvasBackground:B,gridStyle:R,panelVariant:o,storageKey:s,uiConfig:g,onExit:f,guideHref:u,onOpenGuide:n,onChange:h,className:L,style:A})}),Dt=gt;
|
|
5
|
+
export{gt as Diagram,Dt as SketchDiagram,tt as THEME_PALETTES,st as decomposePassthroughSegments,it as diagramToSketch,ut as estimateNodeDimensions,ht as excalidrawToSketch,dt as isPointInsideShape,ot as layoutDiagram,ft as parseDiagramData,rt as resolveNodeColors,at as routeDiagramEdges,et as sampleEdgePoint};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@filekit-studio/diagram",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "Declarative Diagram-as-Code & JSON graph compiler for @filekit-studio/sketch",
|
|
5
5
|
"homepage": "https://tools.kanaddev.me/sketch",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -47,7 +47,7 @@
|
|
|
47
47
|
"react-dom": ">=18.0.0"
|
|
48
48
|
},
|
|
49
49
|
"dependencies": {
|
|
50
|
-
"@filekit-studio/sketch": "^1.2.
|
|
50
|
+
"@filekit-studio/sketch": "^1.2.2"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
53
|
"@types/react": "^19.0.0",
|