@filekit-studio/diagram 0.0.0-stage → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs ADDED
@@ -0,0 +1,5 @@
1
+ import {forwardRef,useMemo}from'react';import {SketchViewer,SketchEditor}from'@filekit-studio/sketch';import {jsx}from'react/jsx-runtime';function ct(e,c=210,o=90){if(e.width&&e.height)return {width:e.width,height:e.height};let f=(e.description?`${e.label||""}
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||i.text;if(d==="sticky"?w.push({id:u,type:"sticky",x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:i.stroke,strokeWidth:t.strokeWidth||1.5,strokeStyle:t.strokeStyle||"solid",fillColor:i.fill,fillStyle:"solid",stickyColor:i.fill,text:a,textColor:P,fontSize:t.fontSize||14,fontFamily:t.fontFamily||"fuzzy",textAlign:t.textAlign||"center",opacity:t.opacity??1,zIndex:x++,roughness:t.roughness??1}):w.push({id:u,type:d,x:t.x,y:t.y,width:t.width,height:t.height,strokeColor:i.stroke,strokeWidth:t.strokeWidth||2,strokeStyle:t.strokeStyle||"solid",fillColor:i.fill,fillStyle:pt(t.fillStyle),text:a,textColor:P,fontSize:t.fontSize||13.5,fontFamily:t.fontFamily||"sans",textAlign:t.textAlign||"center",opacity:t.opacity??1,zIndex:x++,edgeStyle:r?"round":"sharp",roughness:t.roughness??1,groupIds:[b]}),t.badge){let I=`badge_${t.id}`,Y=Math.max(45,t.badge.length*8+14),N=20,D=t.x+t.width-Y-8,k=t.y-8;d==="diamond"?(D=Math.round(t.x+t.width/2-Y/2),k=Math.round(t.y-N-4)):d==="cylinder"?(D=Math.round(t.x+t.width-Y-14),k=Math.round(t.y-6)):d==="cloud"&&(D=Math.round(t.x+t.width-Y-24),k=Math.round(t.y+2)),w.push({id:I,type:"rectangle",x:D,y:k,width:Y,height:N,strokeColor:i.stroke,strokeWidth:1.5,strokeStyle:"solid",fillColor:"#e2e8f0",fillStyle:"solid",text:t.badge,textColor:i.stroke,fontSize:10,fontFamily:"mono",textAlign:"center",opacity:1,zIndex:x++,edgeStyle:"round",groupIds:[b]});}});let s=c?.direction||o.direction||"LR",m=[];function l(t,i=8){for(let u of m)if(t.x<u.x+u.width+i&&t.x+t.width+i>u.x&&t.y<u.y+u.height+i&&t.y+t.height+i>u.y)return true;return false}let h=lt(f.edges,n,s,g);return f.edges.forEach((t,i)=>{let u=n.get(t.from),b=n.get(t.to);if(!u||!b)return;let d=h[i],r=d?.startAnchor||"right",a=d?.endAnchor||"left",P=d?.startX??Math.round(u.x+u.width),I=d?.startY??Math.round(u.y+u.height/2),Y=d?.endX??Math.round(b.x),N=d?.endY??Math.round(b.y+b.height/2),D=d?.arrowType??"straight",k=d?.controlPoint,v=d?.controlPoint1,B=d?.controlPoint2,C=t.id||`edge_${t.from}_${t.to}_${i}`,_=Y-P,O=N-I,F=Array.from(n.values()).filter(M=>M.id!==u.id&&M.id!==b.id),H=t.tunneling!==false&&g.tunneling!==false&&d?ut(d,F,g):[{startX:P,startY:I,endX:Y,endY:N,isInside:false,isLast:true,arrowType:D,controlPoint:k,controlPoint1:v,controlPoint2:B}],p=g.passthroughOpacity??.35,S=g.passthroughStyle??"dotted";if(H.forEach((M,X)=>{let z=M.endX-M.startX,y=M.endY-M.startY,E=H.length===1?C:`${C}_sub_${X}`,R=M.isInside,W=R?S:t.style||"solid",U=R?p:1,L=X===0?{elementId:u.shapeId,anchor:r}:void 0,K=M.isLast?{elementId:b.shapeId,anchor:a}:void 0,G=M.isLast&&t.arrowEnd!==false?"arrow":"none",$=X===0&&t.arrowStart?"arrow":"none";w.push({id:E,type:M.isLast?"arrow":"line",x:M.startX,y:M.startY,width:z,height:y,arrowType:M.arrowType,controlPoint:M.controlPoint,controlPoint1:M.controlPoint1,controlPoint2:M.controlPoint2,strokeColor:dt(t.color),strokeWidth:t.strokeWidth||2,strokeStyle:W,fillColor:"transparent",fillStyle:"solid",opacity:U,zIndex:R?2:x++,roughness:t.roughness??1,startBinding:L,endBinding:K,endArrowhead:G,startArrowhead:$});}),t.label){let M=Math.max(60,t.label.length*7.5+20),X=22,z={x:P,y:I},y={x:Y,y:N},E=[.5,.35,.65,.22,.78,.15,.85],R=Math.round(P+_/2),W=Math.round(I+O/2),U=false;for(let K of E){let G=tt(K,z,y,D,k,v,B),$={x:Math.round(G.x-M/2),y:Math.round(G.y-X/2),width:M,height:X},T=l($,6),V=Array.from(n.values()).some(j=>$.x<j.x+j.width+4&&$.x+$.width+4>j.x&&$.y<j.y+j.height+4&&$.y+$.height+4>j.y);if(!T&&!V){R=Math.round(G.x),W=Math.round(G.y),U=true;break}}if(!U){let K=tt(.5,z,y,D,k,v,B);R=Math.round(K.x),W=Math.round(K.y);let G={x:Math.round(R-M/2),y:Math.round(W-X/2),width:M,height:X};for(let $ of [-24,24,-44,44,-64,64]){let T=s==="TB"||s==="BT"?{...G,x:G.x+$}:{...G,y:G.y+$};if(!l(T,4)){s==="TB"||s==="BT"?R+=$:W+=$;break}}}let L={x:Math.round(R-M/2),y:Math.round(W-X/2),width:M,height:X};m.push(L),w.push({id:`label_${C}`,type:"rectangle",x:L.x,y:L.y,width:M,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:x++,edgeStyle:"round"});}}),{version:1,name:o.title||"System Architecture",elements:w,canvasBackground:o.canvasBackground||"#f0f4f8",gridStyle:o.gridStyle||"dots",createdAt:Date.now(),updatedAt:Date.now()}}function wt(e){switch(e){case 1:return "fuzzy";case 2:return "sans";case 3:return "mono";default:return "sans"}}function bt(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 st(e,c="Imported Excalidraw"){let o;if(typeof e=="string")try{o=JSON.parse(e);}catch{return {version:1,name:c,elements:[],canvasBackground:"#ffffff",gridStyle:"none",createdAt:Date.now(),updatedAt:Date.now()}}else o=e;let f=(Array.isArray(o)?o:Array.isArray(o.elements)?o.elements:[]).filter(n=>!n.isDeleted),w=[];f.forEach((n,s)=>{let m=typeof n.opacity=="number"?n.opacity/100:1,l=n.strokeWidth||2,h=n.strokeColor&&n.strokeColor!=="transparent"?n.strokeColor:"#1e293b",t=n.backgroundColor&&n.backgroundColor!=="transparent"?n.backgroundColor:"transparent",i="solid";n.fillStyle==="hachure"?i="hachure":n.fillStyle==="cross-hatch"?i="cross-hatch":n.fillStyle==="dots"?i="dots":t==="transparent"&&(i="transparent");let u=n.strokeStyle==="dashed"?"dashed":n.strokeStyle==="dotted"?"dotted":"solid",b={id:n.id||`excal_${s}`,type:bt(n.type),x:Math.round(n.x),y:Math.round(n.y),width:Math.round(n.width),height:Math.round(n.height),rotation:n.angle||0,strokeColor:h,strokeWidth:l,strokeStyle:u,fillColor:t,fillStyle:i,opacity:m,zIndex:s+1,roughness:typeof n.roughness=="number"?n.roughness:1,text:n.text,fontSize:n.fontSize||18,fontFamily:wt(n.fontFamily),textAlign:n.textAlign||"left",groupIds:n.groupIds};n.type==="freedraw"&&Array.isArray(n.points)&&(b.points=n.points.map(([d,r])=>({x:d,y:r}))),(n.type==="arrow"||n.type==="line")&&(b.endArrowhead=n.endArrowhead?"arrow":"none",b.startArrowhead=n.startArrowhead?"arrow":"none",n.startBinding?.elementId&&(b.startBinding={elementId:n.startBinding.elementId,anchor:"center"}),n.endBinding?.elementId&&(b.endBinding={elementId:n.endBinding.elementId,anchor:"center"})),w.push(b);});let x=Array.isArray(o)?void 0:o.appState;return {version:1,name:c,elements:w,canvasBackground:x?.viewBackgroundColor||"#ffffff",gridStyle:x?.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 c=e.elements[0];if(c&&typeof c=="object"&&c!==null&&"roughness"in c&&"strokeColor"in c)return true}}return false}var yt=forwardRef(function({data:c,mode:o="viewer",layoutOptions:g,uiConfig:f,theme:w="system",canvasBackground:x,gridStyle:n,interactive:s=true,autoFit:m=true,showCopyButton:l=true,showZoomControls:h=false,title:t,panelVariant:i="classic",storageKey:u=null,onExit:b,guideHref:d,onOpenGuide:r,onChange:a,controllerRef:P,className:I="",style:Y},N){let D=typeof c=="string"?c:JSON.stringify(c),k=g?JSON.stringify(g):"",v=useMemo(()=>Et(c)?st(c,t||"Imported Diagram"):at(c,g),[D,k,t]),B=x??v.canvasBackground,C=n??v.gridStyle;return o==="viewer"?jsx(SketchViewer,{ref:N,controllerRef:P,value:v.elements,theme:w,canvasBackground:B,gridStyle:C,interactive:s,autoFit:m,showCopyButton:l,showZoomControls:h,title:t??v.name,uiConfig:f,className:I,style:Y}):jsx(SketchEditor,{ref:N,controllerRef:P,value:v.elements,boardName:t??v.name,theme:w,canvasBackground:B,gridStyle:C,panelVariant:i,storageKey:u,uiConfig:f,onExit:b,guideHref:d,onOpenGuide:r,onChange:a,className:I,style:Y})}),Dt=yt;
5
+ export{yt as Diagram,Dt as SketchDiagram,Q as THEME_PALETTES,at as diagramToSketch,ct as estimateNodeDimensions,st as excalidrawToSketch,ot as layoutDiagram,mt as parseDiagramData,et as resolveNodeColors};
package/package.json CHANGED
@@ -1,6 +1,60 @@
1
1
  {
2
2
  "name": "@filekit-studio/diagram",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
6
- }
3
+ "version": "1.0.1",
4
+ "description": "Declarative Diagram-as-Code & JSON graph compiler for @filekit-studio/sketch",
5
+ "homepage": "https://tools.kanaddev.me/sketch",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.mjs",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.mjs",
13
+ "require": "./dist/index.js"
14
+ }
15
+ },
16
+ "files": [
17
+ "dist",
18
+ "README.md",
19
+ "LICENSE"
20
+ ],
21
+ "publishConfig": {
22
+ "access": "public"
23
+ },
24
+ "keywords": [
25
+ "diagram",
26
+ "diagram-as-code",
27
+ "flowchart",
28
+ "graph",
29
+ "dag",
30
+ "auto-layout",
31
+ "architecture-diagrams",
32
+ "sketch",
33
+ "whiteboard",
34
+ "react",
35
+ "nextjs",
36
+ "json-diagram"
37
+ ],
38
+ "scripts": {
39
+ "build": "tsup",
40
+ "dev": "tsup --watch",
41
+ "typecheck": "tsc --noEmit",
42
+ "clean": "rm -rf dist"
43
+ },
44
+ "peerDependencies": {
45
+ "@filekit-studio/sketch": ">=1.1.0",
46
+ "react": ">=18.0.0",
47
+ "react-dom": ">=18.0.0"
48
+ },
49
+ "dependencies": {
50
+ "@filekit-studio/sketch": "^1.2.0"
51
+ },
52
+ "devDependencies": {
53
+ "@types/react": "^19.0.0",
54
+ "@types/react-dom": "^19.0.0",
55
+ "tsup": "^8.3.5",
56
+ "typescript": "^5.7.0"
57
+ },
58
+ "author": "FileKit Studio <https://tools.kanaddev.me>",
59
+ "license": "MIT"
60
+ }