@mp70/react-networks 0.1.1-alpha → 0.1.5-alpha

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.js CHANGED
@@ -1,2 +1,3 @@
1
- 'use strict';var Be=require('react'),reactflow=require('reactflow'),htmlToImage=require('html-to-image'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var Be__default=/*#__PURE__*/_interopDefault(Be);var ke=()=>"bottom-up",pt=t=>t.data.uNumberingDirection||ke(),vt=(t,e,o)=>o==="bottom-up"?e-t+1:t,Pt=(t,e,o)=>o==="bottom-up"?e-t+1:t;var Et=(t,e,o,i)=>{if(!t.parentId||t.parentId!==e.id)return o;let n=t.data.uHeight||1,a=e.data.uHeight||42,s=pt(e),d=60,l=o.y-d,u=Math.round(l/20)+1,y;s==="bottom-up"?y=vt(u,a,s)-n+1:y=vt(u,a,s);let f=a-n+1,N=Math.max(1,Math.min(f,y));if(s==="top-down"&&y<=1&&(N=1),!Tt(e,t,N,i)){let D=Dt(e,t,i,N);D!==N&&(N=D);}let U;if(s==="bottom-up"){let D=N+n-1,E=Pt(D,a,s);U=d+(E-1)*20-1;}else {let D=Pt(N,a,s);U=d+(D-1)*20-1;}return {x:o.x,y:U,uPosition:N}},Tt=(t,e,o,i)=>{let n=e.data.uHeight||1,a=t.data.uHeight||42;if(o<1||o+n-1>a)return false;let s=i.filter(d=>d.type==="device"&&d.parentId===t.id&&d.id!==e.id);for(let d of s){let l=d.data.uPosition||1,u=d.data.uHeight||1,y=o,f=o+n-1,N=l,U=l+u-1;if(y<=U&&f>=N)return false}return true},Dt=(t,e,o,i=1)=>{let n=e.data.uHeight||1,a=t.data.uHeight||42;for(let s=i;s<=a-n+1;s++)if(Tt(t,e,s,o))return s;return 1},mt=(t,e,o=1)=>{let i=60,n=pt(t),a=t.data.uHeight||42,s=Pt(e,a,n),d;if(n==="bottom-up"){let l=e+o-1,u=Pt(l,a,n);d=i+(u-1)*20-1;}else d=i+(s-1)*20-1;return {x:0,y:d}},Qt=(t,e,o)=>{let i=t.data.uHeight||1,n=mt(e,o,i);return {...t,position:n,data:{...t.data,uPosition:o}}},ve=(t,e)=>{let o=t.data.uPosition||1,i=t.data.uHeight||1,n=e.data.uHeight||42,a=Math.max(1,Math.min(n-i+1,o));return a!==o?Qt(t,e,a):t};var It=({data:t,selected:e,id:o,onViewChange:i,onRackFaceChange:n,isDragOver:a=false})=>{let{label:s,ports:d=0,status:l="active",uHeight:u=42,uPosition:y=1,face:f="front",customHeaderText:N}=t,{getNodes:U,setNodes:D}=reactflow.useReactFlow(),E=U(),[c,F]=Be.useState(true),X=()=>{let _=pt({data:t})==="bottom-up"?"top-down":"bottom-up";D(g=>g.map(T=>T.id===o?{...T,data:{...T.data,uNumberingDirection:_}}:T));},O=()=>{let h=f==="front"?"rear":"front";n?(n(o,h),i&&E.filter(g=>g.parentId===o).forEach(g=>{i(g.id,h);})):i?E.filter(g=>g.parentId===o).forEach(g=>{i(g.id,h);}):D(_=>_.map(g=>g.id===o?{...g,data:{...g.data,face:h}}:g.parentId===o?{...g,data:{...g.data,view:h}}:g));},V=h=>{switch(h){case "active":return "#10b981";case "inactive":return "#6b7280";case "maintenance":return "#f59e0b";default:return "#6b7280"}},et=()=>{let h=[],_=60,g=pt({data:t});for(let T=1;T<=u;T++){let v=_+(T-1)*20-4,R=vt(T,u,g);h.push(jsxRuntime.jsx("div",{style:{position:"absolute",left:"-35px",top:`${v}px`,background:"#374151",color:"#9ca3af",padding:"2px 4px",borderRadius:"2px",fontSize:"8px",fontWeight:"bold",width:"28px",textAlign:"center",border:"1px solid #4b5563",zIndex:10,height:`${20}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:R},T));}return h};return jsxRuntime.jsxs("div",{className:`rack-node ${e?"selected":""} ${a?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${V(l)}`,borderRadius:"8px",padding:0,width:`${300}px`,height:`${60+u*20}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:a?"0 0 20px #3b82f6, 0 0 40px #3b82f6, 0 0 60px #3b82f6":e?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",transition:"box-shadow 0.2s ease-in-out"},children:[jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Top}),jsxRuntime.jsxs("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#1f2937",padding:"8px",position:"relative",height:`${60}px`,display:"flex",flexDirection:"column",justifyContent:"center"},children:[jsxRuntime.jsx("div",{style:{fontWeight:"bold",marginBottom:"4px"},children:s}),jsxRuntime.jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[N?jsxRuntime.jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:N}):jsxRuntime.jsxs("span",{children:[typeof d=="number"?d:0," ports"]})," \u2022 ",u,"U \u2022 ",f]}),jsxRuntime.jsxs("div",{style:{display:"flex",gap:"4px",position:"absolute",top:"4px",right:"4px"},children:[jsxRuntime.jsx("button",{onPointerDown:h=>{h.stopPropagation();},onMouseDown:h=>{h.stopPropagation();},onClick:h=>{h.stopPropagation(),h.preventDefault(),F(!c);},style:{background:c?"#10b981":"#374151",color:c?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${c?"Hide":"Show"} U markers`,children:"U"}),jsxRuntime.jsx("button",{onPointerDown:h=>{h.stopPropagation();},onMouseDown:h=>{h.stopPropagation();},onClick:h=>{h.stopPropagation(),h.preventDefault(),X();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch U numbering to ${pt({data:t})==="bottom-up"?"top-down":"bottom-up"}`,children:pt({data:t})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),jsxRuntime.jsx("button",{onPointerDown:h=>{h.stopPropagation();},onMouseDown:h=>{h.stopPropagation();},onClick:h=>{h.stopPropagation(),h.preventDefault(),O();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${f==="front"?"rear":"front"} view`,children:f==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsxRuntime.jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${u*20}px`,overflow:"hidden"}}),c&&jsxRuntime.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:et()})]})};var At=({data:t,selected:e})=>{let{label:o,status:i="active"}=t,n=a=>{switch(a){case "active":return "#10b981";case "inactive":return "#6b7280";case "maintenance":return "#f59e0b";default:return "#6b7280"}};return jsxRuntime.jsxs("div",{className:`fiber-node ${e?"selected":""}`,style:{background:"#1f2937",border:`2px solid ${n(i)}`,borderRadius:"50%",width:"60px",height:"60px",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontFamily:"monospace",fontSize:"10px",fontWeight:"bold",boxShadow:e?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative"},children:[jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Top}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Bottom}),jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Left}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right}),jsxRuntime.jsx("div",{style:{textAlign:"center"},children:jsxRuntime.jsx("div",{style:{fontSize:"8px",lineHeight:"1.2"},children:o})}),jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"4px",left:"50%",transform:"translateX(-50%)",width:"8px",height:"8px",background:n(i),borderRadius:"50%"}})]})};var Ft=({id:t,sourceX:e,sourceY:o,targetX:i,targetY:n,sourcePosition:a,targetPosition:s,data:d,selected:l,style:u={}})=>{let[y,f,N]=reactflow.getBezierPath({sourceX:e,sourceY:o,sourcePosition:a,targetX:i,targetY:n,targetPosition:s}),{bandwidth:U,length:D,color:E="#00FFFF"}=d||{},c={...u,stroke:E,strokeWidth:l?3:2,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(reactflow.BaseEdge,{id:t,path:y,style:c}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:l&&d&&(U||D)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${f}px,${N}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${E}`,pointerEvents:"none",zIndex:9999},children:[U&&jsxRuntime.jsx("div",{children:U}),D&&jsxRuntime.jsxs("div",{children:[D,"m"]})]})})]})};var Mt=({id:t,sourceX:e,sourceY:o,targetX:i,targetY:n,sourcePosition:a,targetPosition:s,style:d={},data:l,markerEnd:u})=>{let [y,f,N]=reactflow.getBezierPath({sourceX:e,sourceY:o,sourcePosition:a,targetX:i,targetY:n,targetPosition:s}),U=l?.connectorType||"C13";l?.voltage||"AC";l?.amperage||(U==="C19"?"16A":"10A");return jsxRuntime.jsx(reactflow.BaseEdge,{id:t,path:y,markerEnd:u,style:(()=>{let F={stroke:l?.color||"#f59e0b",strokeWidth:U==="C19"?5:3,strokeLinecap:"round",strokeLinejoin:"round",...d};return U==="C19"?{...F,strokeDasharray:"none"}:{...F,strokeDasharray:"6,3"}})()})};var te=(o=>(o.FULL="full",o.HALF="half",o))(te||{});var zt={C13:{type:"C13",color:"#f59e0b",borderColor:"#d97706",amperage:10,voltage:230,phases:1},C14:{type:"C14",color:"#f59e0b",borderColor:"#d97706",amperage:10,voltage:230,phases:1},C19:{type:"C19",color:"#fbbf24",borderColor:"#d97706",amperage:16,voltage:230,phases:1},C20:{type:"C20",color:"#fbbf24",borderColor:"#d97706",amperage:16,voltage:230,phases:1}};function ht(t){let e=zt[t];if(!e)throw new Error(`Unknown connector type: ${t}`);let o=e.amperage===16;e.amperage===10;let n=o?12:8,a=o?10:5,s=o?{borderRadius:"3px"}:{clipPath:"polygon(2px 0, calc(100% - 2px) 0, 100% 2px, 100% 100%, 0 100%, 0 2px)",borderRadius:"0px"};return {width:n,height:a,color:e.color,borderColor:e.borderColor,fontSize:o?"3px":"4px",...s}}function Rt(t){let e=zt[t];if(!e)throw new Error(`Unknown connector type: ${t}`);return e}function _e(t){return Rt(t).amperage===16}function Lt(t){return t%10<8?"C13":"C19"}function St(t){let e=t.toLowerCase();return e.includes("mx304")||e.includes("mx480")||e.includes("mx960")?"C20":"C14"}var Bt=({data:t,selected:e})=>{let{label:o,status:i="active",deviceType:n="server",manufacturer:a,role:s,uHeight:d=1,uPosition:l=1,width:u="full",ports:y=[],rearPorts:f=[],view:N,powerSide:U="left"}=t,D=N||(f.length>0&&y.length===0?"rear":"front"),E={};E["net-top"]="front",E["net-bottom"]="front",y.length>0&&y.forEach(g=>{g.ports.forEach(T=>{let v=T.type?.includes("power")?T.label:`${g.name}-${T.label}`;E[v]="front";});}),E["pwr-left-1"]="rear",E["pwr-left-2"]="rear",E["net-right-1"]="rear",E["net-right-2"]="rear",f.length>0&&f.forEach(g=>{g.ports.forEach(T=>{let v=T.type?.includes("power")?T.label:`${g.name}-${T.label}`;E[v]="rear";});});let c=d*20,F=u==="half"?"150px":"304px",X=u==="half"?"150px":void 0,O=g=>{switch(g){case "active":return "#10b981";case "inactive":return "#6b7280";case "maintenance":return "#f59e0b";default:return "#6b7280"}},et=(g,T)=>{let v=[];if(g.length===0)return v;let R=Math.max(4,Math.floor(c*.4)),rt=Math.max(2,Math.floor(c*.2));return g.forEach((b,I)=>{b.ports.forEach(($,A)=>{let H=!!$.type&&$.type.includes("power");if(T==="front"&&H)return;let j=H?`${$.label}`:`${b.name}-${$.label}`,J=$.connected,B="#6b7280";if(J)if($.type?.includes("power"))B=$.type==="power_c19"?"#fbbf24":"#f59e0b";else if($.type==="console"||$.type==="mgmt")B="#8b5cf6";else if($.type==="usb")B="#10b981";else switch($.cableType){case "smf":B="#fbbf24";break;case "cat6":B="#8b5cf6";break;case "om3":B="#06b6d4";break;case "om4":B="#8b5cf6";break;case "om5":B="#84cc16";break;case "cat5e":B="#3b82f6";break;case "cat6a":B="#ef4444";break;case "cat7":B="#f97316";break;case "fiber":B="#3b82f6";break;case "ethernet":B="#10b981";break;default:B="#10b981";}let nt=reactflow.Position.Top,M={width:`${R}px`,height:`${rt}px`,background:J?B:"#6b7280",border:`1px solid ${J?B:"#374151"}`,borderRadius:"1px",cursor:"pointer"};if(T==="front")A%2===0?(nt=reactflow.Position.Top,M.transform="translateY(50%)",M.left=`${A/2*(R+2)}px`):(nt=reactflow.Position.Bottom,M.transform="translateY(-50%)",M.left=`${(A-1)/2*(R+2)}px`);else if((n?.toLowerCase().replace(/_/g,"-")||"")==="patch-panel")A%2===0?(nt=reactflow.Position.Top,M.transform="translateY(50%)",M.left=`${A/2*(R+2)}px`):(nt=reactflow.Position.Bottom,M.transform="translateY(-50%)",M.left=`${(A-1)/2*(R+2)}px`);else if($.type?.includes("power")){nt=reactflow.Position.Left,M.transform="translateX(50%)";let st=c<=20?10:20,ot=c<=20?30:50;M.top=`${st+A*ot}%`;let Q=St(o),lt=ht(Q);M={...M,width:`${lt.width}px`,height:`${lt.height}px`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:lt.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:lt.borderRadius,clipPath:lt.clipPath};}else nt=reactflow.Position.Right,M.transform="translateX(-50%)",M.top=`${25+A*50}%`;let gt;H?gt="target":n==="switch"||n==="router"?gt="source":gt=J?"source":"target",v.push(jsxRuntime.jsx(reactflow.Handle,{id:j,type:gt,position:nt,style:M,title:`${b.name} - ${$.label} ${J?"(connected)":"(disconnected)"}`,children:H?A+1:void 0},j));});}),v},h=()=>{let g=[],v=Math.max(4,Math.floor(c*.4)),R=Math.max(2,Math.floor(c*.2));if(D==="front"){if(y.length>0)return et(y,"front");if(n==="switch"&&(o.toLowerCase().includes("agg")||o.toLowerCase().includes("core")||s==="agg"||s==="core"))return _();g.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-top",type:"target",position:reactflow.Position.Top,style:{width:`${v}px`,height:`${R}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateY(50%)"},title:"Network Port (Top)"},"net-top")),g.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-bottom",type:"target",position:reactflow.Position.Bottom,style:{width:`${v}px`,height:`${R}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateY(-50%)"},title:"Network Port (Bottom)"},"net-bottom"));}else if(D==="rear"){if(f.length>0)return et(f,"rear");let rt=n==="switch",I=(n?.toLowerCase().replace(/_/g,"-")||"")==="patch-panel";if(!I){let $=St(o),A=Rt($),H=ht($),j=c<=20?"10%":"25%";g.push(jsxRuntime.jsx(reactflow.Handle,{id:"pwr-left-1",type:"target",position:reactflow.Position.Left,style:{width:`${H.width}px`,height:`${H.height}px`,background:H.color,border:`1px solid ${H.borderColor}`,cursor:"pointer",transform:"translateX(50%)",top:j,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:H.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:H.borderRadius,clipPath:H.clipPath},title:`Power Port 1 (${A.type}) - ${A.voltage}V, ${A.amperage}A`,children:"1"},"pwr-1"));let J=c<=20?"50%":"75%";g.push(jsxRuntime.jsx(reactflow.Handle,{id:"pwr-left-2",type:"target",position:reactflow.Position.Left,style:{width:`${H.width}px`,height:`${H.height}px`,background:H.color,border:`1px solid ${H.borderColor}`,cursor:"pointer",transform:"translateX(50%)",top:J,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:H.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:H.borderRadius,clipPath:H.clipPath},title:`Power Port 2 (${A.type}) - ${A.voltage}V, ${A.amperage}A`,children:"2"},"pwr-2"));}!rt&&!I&&(g.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-right-1",type:"target",position:reactflow.Position.Right,style:{width:`${v}px`,height:`${R}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateX(-50%)",top:"25%"},title:"Network Port 1 (Right)"},"net-right-1")),g.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-right-2",type:"target",position:reactflow.Position.Right,style:{width:`${v}px`,height:`${R}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateX(-50%)",top:"75%"},title:"Network Port 2 (Right)"},"net-right-2")));}return g},_=()=>{let g=[],v=Math.max(10,Math.floor(c*.45)),R=Math.max(5,Math.floor(c*.25));for(let b=1;b<=16;b++){let I=jsxRuntime.jsx(reactflow.Handle,{id:`port-${b}`,type:"source",position:reactflow.Position.Top,style:{width:`${v}px`,height:`${R}px`,background:"#10b981",border:"1px solid #059669",borderRadius:"2px",cursor:"pointer",transform:"translateY(50%)",zIndex:1e3,left:`${(b-1)*(v+2)}px`},title:`Port ${b}`},`port-${b}`);g.push(I);}for(let b=17;b<=32;b++){let I=b-16,$=jsxRuntime.jsx(reactflow.Handle,{id:`port-${b}`,type:"source",position:reactflow.Position.Bottom,style:{width:`${v}px`,height:`${R}px`,background:"#10b981",border:"1px solid #059669",borderRadius:"2px",cursor:"pointer",transform:"translateY(-50%)",zIndex:1e3,left:`${(I-1)*(v+2)}px`},title:`Port ${b}`},`port-${b}`);g.push($);}for(let b=1;b<=4;b++){let I=Math.max(4,Math.floor(c*.3)),$=Math.max(3,Math.floor(c*.15));g.push(jsxRuntime.jsx(reactflow.Handle,{id:`uplink-${b}`,type:"source",position:reactflow.Position.Right,style:{width:`${I}px`,height:`${$}px`,background:"#8b5cf6",border:"0.5px solid #7c3aed",borderRadius:"0.5px",cursor:"pointer",transform:"translateX(-50%)"},title:`Uplink ${b}`},`uplink-${b}`));}return g};return jsxRuntime.jsxs("div",{className:`device-node ${e?"selected":""}`,style:{background:"#1f2937",border:`1px solid ${O(i)}`,borderRadius:"2px",padding:"0px",width:F,...X&&{left:X},height:`${c}px`,color:"white",fontFamily:"monospace",fontSize:"8px",boxShadow:e?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",justifyContent:"center",cursor:"grab",marginBottom:"0px",boxSizing:"border-box",marginTop:"0px",marginLeft:"0px",marginRight:"0px"},children:[jsxRuntime.jsxs("div",{style:{textAlign:"center",flex:1,display:"flex",flexDirection:"column",justifyContent:"center",overflow:"hidden",padding:"2px"},children:[jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"7px",lineHeight:"1.1",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:o}),d>1&&jsxRuntime.jsx("div",{style:{fontSize:"6px",color:"#9ca3af",lineHeight:"1"},children:a})]}),d>1&&jsxRuntime.jsxs("div",{style:{position:"absolute",bottom:"1px",right:"1px",background:"#374151",color:"#9ca3af",padding:"1px 2px",borderRadius:"1px",fontSize:"6px",lineHeight:"1"},children:[d,"U"]}),jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"1px",left:"1px",width:"4px",height:"4px",background:O(i),borderRadius:"50%"}}),h()]})};var Ot=({data:t,selected:e,id:o})=>{let{label:i,status:n="active",heightCm:a=100,powerPorts:s=36,portTypes:d=[],widthPx:l=15,mgmt_unit:u}=t,y=D=>{switch(D){case "active":return "#10b981";case "inactive":return "#6b7280";case "maintenance":return "#f59e0b";default:return "#6b7280"}},f=a*4.2,N=()=>{let E=Math.ceil(s/10),c=Array(10).fill(0).map((b,I)=>I<8?"10A":"16A");for(let b=0,I=0;b<E;++b)for(let $=0;$<10&&I<s;++$,++I){c[$];}let g=[],T=15,rt=(f-T-3)/(s-9)*.5;for(let b=0;b<s;b++){let I=T-2+rt*b,$=`${b+1}`;if(u&&(u==="top"&&b===0||u==="middle"&&b===Math.floor(s/2)||u==="bottom"&&b===s-1)){g.push(U(I));continue}let H=Lt(b),j=ht(H),J=Math.round((l-j.width)/2-1);g.push(jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right,id:$,style:{position:"absolute",left:`${J}px`,top:`${I-j.height/2}px`,width:`${j.width}px`,height:`${j.height}px`,background:j.color,border:`1px solid ${j.borderColor}`,cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:j.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:j.borderRadius,clipPath:j.clipPath},title:`Power Port ${b+1} (${H})`,children:b+1},`handle-${$}`));}return g},U=D=>jsxRuntime.jsxs("div",{style:{position:"absolute",left:`${(l-16)/2}px`,top:`${D-12/2}px`,width:"16px",height:"12px",background:"#1a1a1a",border:"1px solid #374151",borderRadius:"1px",display:"flex",flexDirection:"column",padding:"1px",zIndex:10},children:[jsxRuntime.jsx("div",{style:{position:"absolute",left:"-10px",top:"1px",background:"#ffffff",border:"0.5px solid #6b7280",borderRadius:"0.5px",width:"8px",height:"10px",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"3px",color:"#10b981",fontFamily:"monospace",fontWeight:"bold",transform:"rotate(90deg)",transformOrigin:"center"},children:"APC"}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right,id:"mgmt-net-1",style:{width:"70%",height:"6px",background:"#10b981",border:"1px solid #059669",borderRadius:"1px",cursor:"pointer",zIndex:11,margin:"0 auto"},title:"Management Network Port"},"mgmt-net-1")]},"mgmt-unit");return jsxRuntime.jsxs("div",{className:`vertical-pdu-node ${e?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${y(n)}`,borderRadius:"2px",padding:0,width:`${l}px`,height:`${f}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:e?"0 0 0 2px #3b82f6":"0 1px 3px rgba(0,0,0,0.3)",position:"relative",display:"flex",flexDirection:"column"},children:[jsxRuntime.jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"linear-gradient(90deg, #4a5568 0%, #2d3748 50%, #4a5568 100%)",padding:"2px",position:"relative",height:"20px",display:"flex",flexDirection:"column",justifyContent:"center",borderBottom:"1px solid #4a5568"},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"6px",color:"#e2e8f0"},children:i})}),jsxRuntime.jsx("div",{style:{flex:1,background:"linear-gradient(180deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",position:"relative",minHeight:`${f-20}px`,overflow:"hidden"},children:N()})]})};function ze(t,e){if(!t.source||!t.target||!t.sourceHandle||!t.targetHandle)return {valid:true};let o=e.edges.some(c=>c.source===t.source&&c.sourceHandle===t.sourceHandle),i=e.edges.some(c=>c.target===t.target&&c.targetHandle===t.targetHandle);if(o)return {valid:false,reason:"Source port is already connected"};if(i)return {valid:false,reason:"Target port is already connected"};let n=t.sourceHandle,a=t.targetHandle,s=e.nodes.find(c=>c.id===t.source),d=e.nodes.find(c=>c.id===t.target),l=(c,F)=>{if(!c)return false;let X=c.startsWith("pwr")||c.startsWith("power"),O=F?.type==="vertical-pdu"&&c!=="mgmt-net-1";return X||O},u=(c,F)=>{if(!c)return false;if(F?.type==="vertical-pdu"&&c==="mgmt-net-1")return true;let X=c.startsWith("net-")||c.startsWith("port-")||c.startsWith("uplink-")||c.includes("Fiber")||c.includes("Ports"),O=/^[A-Z0-9]+-\d+$/.test(c)&&!c.startsWith("pwr")&&!c.startsWith("power");return X||O},y=l(n,s),f=l(a,d),N=u(n,s),U=u(a,d);if(y&&U||f&&N)return {valid:false,reason:"Cannot connect network cable to power port"};if(y&&!f||f&&!y)return {valid:false,reason:"Power ports must connect to power-compatible ports"};let D=s?.type==="vertical-pdu",E=d?.type==="vertical-pdu";if(y||f){let c=D?d:E?s:null,F=D?s:E?d:null;if(c&&F&&e.edges.filter(V=>{let et=l(V.sourceHandle||""),h=l(V.targetHandle||""),_=V.source===c.id||V.target===c.id;V.source===F.id||V.target===F.id;return (et||h)&&_}).some(V=>V.source===F.id||V.target===F.id))return {valid:false,reason:"Dual-feed required: connect second power to a different PDU"}}return {valid:true}}function Le(t,e){if(!e)return;let o=e.data??{},i=o.handleSideMap;if(i&&i[t])return i[t];if(t==="net-top"||t==="net-bottom")return "front";if(t==="pwr-left-1"||t==="pwr-left-2"||t==="net-right-1"||t==="net-right-2")return "rear";let n=Array.isArray(o.ports)?o.ports:[],a=Array.isArray(o.rearPorts)?o.rearPorts:[];if(t.startsWith("pwr")||t.includes("power"))return "rear";for(let d of n)for(let l of d.ports||[])if((!!l.type&&String(l.type).includes("power")?l.label:`${d.name}-${l.label}`)===t)return "front";for(let d of a)for(let l of d.ports||[])if((!!l.type&&String(l.type).includes("power")?l.label:`${d.name}-${l.label}`)===t)return "rear"}function Vt(t={},e={}){let o={nodes:t.nodes??[],edges:t.edges??[],debug:t.debug??false},i=new Set;return {getState:()=>o,setState:f=>{o={...o,...f},i.forEach(N=>N(o));},subscribe:f=>(i.add(f),()=>i.delete(f)),selectEdgeZIndex:f=>{let N=o.nodes.find(et=>et.id===f.target);if(!N||N.type!=="device")return 1e3;let U=N.data?.view||"front",D=Le(f.targetHandle||"",N);if(D)return U===D?1e3:500;let E=(f.targetHandle||"").toString(),c=E.toLowerCase(),F=c.startsWith("pwr")||c.startsWith("power"),X=c.startsWith("net-")||c.startsWith("port-")||c.startsWith("uplink-")||c.includes("fiber")||c.includes("ports"),O=/^[A-Z0-9]+-\d+$/i.test(E)&&!c.startsWith("pwr")&&!c.startsWith("power"),V=X||O;return F?U==="rear"?1e3:500:V?U==="front"?1e3:500:1e3},validateConnection:f=>(e.validateConnection||ze)(f,o),selectNodeById:f=>o.nodes.find(N=>N.id===f),selectConnectedEdges:f=>o.edges.filter(N=>N.source===f||N.target===f)}}function We(t){let e=n=>t.subscribe(n),o=()=>t.getState();return Be.useSyncExternalStore(e,o,o)}function Gt(t){let e=i=>t.subscribe(i),o=()=>t.getState().nodes;return Be.useSyncExternalStore(e,o,o)}function Yt(t){let e=i=>t.subscribe(i),o=()=>t.getState().edges;return Be.useSyncExternalStore(e,o,o)}function ne(t){return t.selectEdgeZIndex}var Je=(t,e,o)=>({rack:i=>jsxRuntime.jsx(It,{...i,onViewChange:t,onRackFaceChange:e,isDragOver:o===i.id}),fiber:At,device:Bt,"vertical-pdu":Ot}),Qe={fiber:Ft,power:Mt},to=({nodes:t,edges:e,initialNodes:o,initialEdges:i,onNodesChange:n,onEdgesChange:a,store:s,debug:d,onNodeClick:l,onEdgeClick:u,onViewChange:y,onRackFaceChange:f,className:N,style:U,alignRacksToBottom:D,colorMode:E="dark",onInit:c,onFlowMethods:F,showDownloadButton:X=false,downloadButtonPosition:O="top-right",downloadButtonText:V="Download Image",downloadButtonStyle:et})=>{let h=Array.isArray(t)&&Array.isArray(e),_=Be__default.default.useMemo(()=>s||Vt({nodes:h?t||[]:o||t||[],edges:h?e||[]:i||e||[],debug:d}),[s,h,d]),g=Gt(_),T=Yt(_),[v,R,rt]=reactflow.useNodesState(g),[b,I,$]=reactflow.useEdgesState(T),A=ne(_),H=Be.useRef(null),{toObject:j,setViewport:J}=reactflow.useReactFlow();Be.useEffect(()=>{F&&F({toObject:j,setViewport:J,toImage:r=>H.current?htmlToImage.toPng(H.current,r):Promise.reject(new Error("ReactFlow wrapper not available"))});},[F,j,J]);let B=Be.useCallback(()=>{if(!H.current){d&&console.error("ReactFlow wrapper ref is not available");return}htmlToImage.toPng(H.current,{filter:r=>!(r?.classList?.contains("react-flow__minimap")||r?.classList?.contains("react-flow__controls")||r?.classList?.contains("react-flow__attribution")||r?.classList?.contains("download-button")||r?.tagName==="BUTTON"),backgroundColor:E==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(r=>{let p=document.createElement("a");p.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,p.href=r,p.click();}).catch(r=>{d&&console.error("Error downloading image:",r);});},[E]),[nt,M]=Be.useState(null),gt=Be.useMemo(()=>Je(y,f,nt),[y,f,nt]),Kt=Be.useMemo(()=>Qe,[]),st=Be.useRef(v);Be.useEffect(()=>{st.current=v;},[v]);let ot=Be.useRef(b);Be.useEffect(()=>{ot.current=b;},[b]),Be.useEffect(()=>{R(g);},[g,R]),Be.useEffect(()=>{I(T);},[T,I]),Be.useEffect(()=>{h&&_.setState({nodes:t||[]});},[h,t,_]),Be.useEffect(()=>{h&&_.setState({edges:e||[]});},[h,e,_]),Be.useEffect(()=>{if(!D||!v||v.length===0)return;let r=v.filter(w=>w.type==="rack");if(r.length===0)return;let p=r.map(w=>{let C=w.data&&w.data.uHeight||42,W=60+C*20;return (w.position?.y||0)+W}),m=Math.min(...p),x=Math.max(...p);if(x-m<20)return;let P=x,z=v.map(w=>{if(w.type!=="rack")return w;let C=w.data&&w.data.uHeight||42,W=60+C*20,Z=(w.position?.y||0)+W,G=P-Z;return Math.abs(G)<5?w:{...w,position:{x:w.position?.x||0,y:(w.position?.y||0)+G}}});z.some((w,C)=>w.position!==v[C].position)&&R(z);},[D,v,R]);let Q=Be.useCallback(r=>st.current.find(p=>p.id===r),[]);Be.useEffect(()=>{I(r=>r.map(p=>{let m=A(p);return {...p,zIndex:m,style:{...p.style,zIndex:m}}}));},[v,I,A]),Be.useEffect(()=>{let r=v.map(m=>{if(m.type==="device"&&m.parentId&&m.data.uPosition&&(!m.position||m.position.x===0&&m.position.y===0)){let x=Q(m.parentId);if(x){let k=mt(x,m.data.uPosition);return {...m,position:k}}}return m});r.some((m,x)=>m.position!==v[x].position)&&R(r);},[v,R,Q]);let lt=Be.useCallback(r=>{let p=r.map(m=>{if(m.type==="position"&&m.position){let x=Q(m.id);if(x&&x.type==="device"&&x.parentId){let k=Q(x.parentId);if(k){let P=Et(x,k,m.position,st.current);if(P.uPosition!==void 0){let z={...x,data:{...x.data,uPosition:P.uPosition}};R(S=>S.map(w=>w.id===x.id?z:w));}return {...m,position:{x:P.x,y:P.y}}}}if(x&&x.type==="device"&&x.parentId){let k=Q(x.parentId);if(k){let P=k,z=300,S=(P.data.uHeight||42)*20,w=P.position.x,C=P.position.x+z,W=P.position.y,Z=P.position.y+S;if(m.position.x<w||m.position.x>C||m.position.y<W||m.position.y>Z){let G=m.position.x+P.position.x,wt=m.position.y+P.position.y,xt={...x,parentId:void 0,extent:void 0,data:{...x.data,uPosition:void 0}};return R(Ne=>Ne.map(Jt=>Jt.id===x.id?xt:Jt)),{...m,position:{x:G,y:wt}}}}}}return m});rt(p);},[rt,R,Q]),ge=Be.useCallback((r,p)=>{M(null);},[]),fe=Be.useCallback((r,p,m)=>{if(p.type==="device"&&!p.parentId){let x=st.current.filter(z=>z.type==="rack"),k=null,P=1/0;for(let z of x){let S=z,w=Math.sqrt(Math.pow(p.position.x-S.position.x,2)+Math.pow(p.position.y-S.position.y,2)),C=300,W=(S.data.uHeight||42)*20,Z=S.position.x,G=S.position.x+C,wt=S.position.y,xt=S.position.y+W;p.position.x>=Z&&p.position.x<=G&&p.position.y>=wt&&p.position.y<=xt&&w<P&&(P=w,k=S);}M(k?k.id:null);}else M(null);},[]),me=Be.useCallback((r,p,m)=>{if(p.type==="device"&&!p.parentId){let x=st.current.filter(z=>z.type==="rack"),k=null,P=1/0;for(let z of x){let S=z,w=Math.sqrt(Math.pow(p.position.x-S.position.x,2)+Math.pow(p.position.y-S.position.y,2)),C=300,W=(S.data.uHeight||42)*20,Z=S.position.x,G=S.position.x+C,wt=S.position.y,xt=S.position.y+W;p.position.x>=Z&&p.position.x<=G&&p.position.y>=wt&&p.position.y<=xt&&w<P&&(P=w,k=S);}if(k){let z=p.position.x-k.position.x,S=p.position.y-k.position.y,w={...p,parentId:k.id,extent:"parent",position:{x:z,y:S},data:{...p.data,uPosition:1}};R(C=>C.map(W=>W.id===p.id?w:W));}}M(null);},[R]);Be.useCallback(r=>{if(!r.source||!r.target||!r.sourceHandle||!r.targetHandle)return {valid:true};let p=r.sourceHandle,m=r.targetHandle,x=ot.current.some(P=>P.source===r.source&&P.sourceHandle===p),k=ot.current.some(P=>P.target===r.target&&P.targetHandle===m);return x?{valid:false,reason:"Source port is already connected"}:k?{valid:false,reason:"Target port is already connected"}:{valid:true}},[]);let he=Be.useCallback(r=>{let p=Q(r.source),m=p?.type==="vertical-pdu",x=p?.type==="device"&&p.data?.deviceType==="switch",k=!!r.targetHandle&&(r.targetHandle.startsWith("pwr")||r.targetHandle.startsWith("power")),P=!!r.targetHandle&&(r.targetHandle.startsWith("net-")||r.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(r.targetHandle));if(m&&k&&r.target&&r.targetHandle){let w=ot.current.find(C=>C.target===r.target&&C.targetHandle===r.targetHandle);if(w){let C={...r,type:"power",zIndex:A({...r,id:"temp-id"})};I(W=>{let Z=W.filter(G=>G.id!==w.id);return reactflow.addEdge(C,Z)});return}}if(x&&P&&r.target&&r.targetHandle){let w=ot.current.find(C=>C.target===r.target&&C.targetHandle===r.targetHandle);if(w){let C={...r,type:"fiber",zIndex:A({...r,id:"temp-id"})};I(W=>{let Z=W.filter(G=>G.id!==w.id);return reactflow.addEdge(C,Z)});return}}let z=_.validateConnection({source:r.source??null,target:r.target??null,sourceHandle:r.sourceHandle??null,targetHandle:r.targetHandle??null});if(!z.valid){if(m&&r.source&&r.sourceHandle){let w=ot.current.find(C=>C.source===r.source&&C.sourceHandle===r.sourceHandle);if(w){let C={...r,type:k?"power":"fiber",zIndex:A({...r,id:"temp-id"})};I(W=>{let Z=W.filter(G=>G.id!==w.id);return reactflow.addEdge(C,Z)});return}}if(x&&r.source&&r.sourceHandle){let w=ot.current.find(C=>C.source===r.source&&C.sourceHandle===r.sourceHandle);if(w){let C={...r,type:"fiber",zIndex:A({...r,id:"temp-id"})};I(W=>{let Z=W.filter(G=>G.id!==w.id);return reactflow.addEdge(C,Z)});return}}d&&console.warn(`Connection rejected: ${z.reason}`);return}let S={...r,type:m&&k?"power":"fiber",zIndex:A({...r,id:"temp-id"})};I(w=>reactflow.addEdge(S,w));},[I,_,A,Q]),ye=Be.useCallback((r,p)=>{if((r.metaKey||r.ctrlKey)&&p.type==="device"){let x=p.data||{},k=x.view||(Array.isArray(x.rearPorts)&&x.rearPorts.length>0?"rear":"front"),P=k==="front"?"rear":"front";d&&console.log(`Command+click: Toggling device ${p.id} from ${k} to ${P}`),y&&y(p.id,P),l&&l(p);}else l&&l(p);},[y,l,d]),be=Be.useCallback(()=>{},[]),we=Be.useCallback((r,p)=>{u&&u(p);},[u]),[L,qt]=Be.useState(null);reactflow.useOnSelectionChange({onChange:({nodes:r})=>{if(r&&r.length===1){let p=r[0];qt(p),l&&l(p);}else qt(null),l&&l(null);}});let xe=Be.useCallback(()=>{if(!L)return;let r=Q(L.id);if(r){if(r.type==="rack"){let m=(r.data&&r.data.face||"front")==="front"?"rear":"front";f?f(r.id,m):R(x=>x.map(k=>k.id===r.id?{...k,data:{...k.data,face:m}}:k.parentId===r.id?{...k,data:{...k.data,view:m}}:k));return}if(r.type==="device"){let p=r.data||{},m=Array.isArray(p.rearPorts)&&p.rearPorts.length>0,x=Array.isArray(p.ports)&&p.ports.length>0,P=(p.view||(m&&!x?"rear":"front"))==="front"?"rear":"front";y?y(r.id,P):R(z=>z.map(S=>S.id===r.id?{...S,data:{...S.data,view:P}}:S));}}},[L,Q,f,y,R]);return jsxRuntime.jsxs("div",{ref:H,className:`${N||""} ${E==="light"?"react-flow-light":"react-flow-dark"}`,style:{width:"100%",height:"100%",...U},children:[jsxRuntime.jsxs(reactflow.ReactFlow,{nodes:v,edges:b,onNodesChange:r=>{lt(r);r.reduce((m,x)=>(x.type==="add"||x.type==="remove",m),null);h?n&&n(st.current):_.setState({nodes:st.current});},onEdgesChange:r=>{$(r),h?a&&a(ot.current):_.setState({edges:ot.current});},onConnect:he,onNodeClick:ye,onNodeDoubleClick:be,onNodeDragStart:ge,onNodeDrag:fe,onNodeDragStop:me,onEdgeClick:we,onInit:c,nodeTypes:gt,edgeTypes:Kt,defaultEdgeOptions:{zIndex:1e3,reconnectable:true},nodesDraggable:true,nodesConnectable:true,elementsSelectable:true,selectNodesOnDrag:false,fitView:true,attributionPosition:"bottom-left",children:[jsxRuntime.jsx(reactflow.Background,{}),jsxRuntime.jsx(reactflow.Controls,{}),jsxRuntime.jsx(reactflow.MiniMap,{})]}),X&&jsxRuntime.jsx("button",{className:"download-button",onClick:B,style:{position:"absolute",top:O.includes("top")?"10px":"auto",bottom:O.includes("bottom")?"10px":"auto",right:O.includes("right")?"10px":"auto",left:O.includes("left")?"10px":"auto",zIndex:1e3,background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:"4px",padding:"0.5rem 0.75rem",fontSize:"0.875rem",cursor:"pointer",transition:"all 0.2s ease",...et},children:V}),L&&(L.type==="rack"||L.type==="device")&&jsxRuntime.jsx("div",{style:{position:"absolute",top:12,right:12,display:"flex",gap:8,zIndex:2e3},children:jsxRuntime.jsx("button",{onClick:r=>{r.preventDefault(),xe();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:L.type==="rack"?(L.data?.face||"front")==="front"?"Switch to rear":"Switch to front":(L.data?.view||(Array.isArray(L.data?.rearPorts)&&L.data.rearPorts.length>0&&!(Array.isArray(L.data?.ports)&&L.data.ports.length>0)?"rear":"front"))==="front"?"Switch to rear":"Switch to front",children:L.type==="rack"?(L.data?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front":(L.data?.view||(Array.isArray(L.data?.rearPorts)&&L.data.rearPorts.length>0&&!(Array.isArray(L.data?.ports)&&L.data.ports.length>0)?"rear":"front"))==="front"?"\u21C4 Rear":"\u21C4 Front"})})]})},eo=t=>jsxRuntime.jsx(reactflow.ReactFlowProvider,{children:jsxRuntime.jsx(to,{...t})});var de=t=>({id:`rack-${t.id}`,type:"rack",position:{x:0,y:0},data:{label:t.name,status:typeof t.status=="object"&&t.status?t.status.value:t.status,uHeight:t.u_height??t.units??42,inventoryId:t.id,inventoryType:"rack",facilityId:t.facility_id,serial:t.serial,assetTag:t.asset_tag,site:typeof t.site=="object"&&t.site?t.site.name:t.site,role:typeof t.role=="object"&&t.role?t.role.name:t.role,tenant:typeof t.tenant=="object"&&t.tenant?t.tenant.name:t.tenant}}),le=t=>({id:`device-${t.id}`,type:"device",position:{x:0,y:0},parentId:t.rack?`rack-${typeof t.rack=="object"&&t.rack?t.rack.id:t.rack}`:void 0,extent:t.rack?"parent":void 0,data:{label:t.name,status:typeof t.status=="object"&&t.status?t.status.value:t.status,deviceType:t.device_type?.model??t.model,manufacturer:t.device_type?.manufacturer?.name??t.manufacturer,role:typeof t.device_role=="object"&&t.device_role?t.device_role.name:t.role,uHeight:t.device_type?.u_height??t.u_height??1,uPosition:t.position||1,view:t.face||"front",inventoryId:t.id,inventoryType:"device",primaryIp4:typeof t.primary_ip4=="object"&&t.primary_ip4?t.primary_ip4.address:t.primary_ip4,primaryIp6:typeof t.primary_ip6=="object"&&t.primary_ip6?t.primary_ip6.address:t.primary_ip6,site:typeof t.site=="object"&&t.site?t.site.name:t.site,rack:typeof t.rack=="object"&&t.rack?t.rack.name:t.rack}}),pe=t=>{let e=n=>{if(!n)return;if(typeof n=="string")return n;let a=n.device;return typeof a=="object"&&a?a.id:a},o=e(t.termination_a),i=e(t.termination_b);return {id:`cable-${t.id}`,source:`device-${o}`,target:`device-${i}`,type:"fiber",data:{bandwidth:t.type?.label??t.bandwidth,length:t.length||0,color:t.color,inventoryId:t.id,inventoryType:"cable",status:typeof t.status=="object"&&t.status?t.status.value:t.status,terminationA:typeof t.termination_a=="object"&&t.termination_a?t.termination_a.name:t.termination_a,terminationB:typeof t.termination_b=="object"&&t.termination_b?t.termination_b.name:t.termination_b}}},oo=t=>{let e=[],o=[];return t.racks.forEach(i=>e.push(de(i))),t.devices.forEach(i=>e.push(le(i))),t.cables.forEach(i=>o.push(pe(i))),{nodes:e,edges:o}},ro=t=>{let e=t.filter(n=>n.type==="rack"),o=t.filter(n=>n.type==="device"),i=t.filter(n=>!["rack","device"].includes(n.type));return e.forEach((n,a)=>{n.position={x:a*300,y:100};}),o.forEach(n=>{if(n.parentId){let a=e.find(s=>s.id===n.parentId);if(a){let s=n.data.uPosition||1,d=n.data.uHeight||1;n.position={x:a.position.x+50,y:a.position.y+s*20-d*10};}}else n.position={x:Math.random()*400+100,y:Math.random()*200+50};}),i.forEach((n,a)=>{n.position={x:a*150+100,y:300};}),t};var bt=class extends Error{constructor(o,i,n,a,s){super(`Device placement conflict: ${i} at U${n}-${n+a-1} in rack ${o}${s?` conflicts with ${s}`:""}`);this.rackId=o;this.deviceId=i;this.uPosition=n;this.uHeight=a;this.conflictWith=s;this.name="DevicePlacementError";}};function Zt(t,e={}){let{conflictPolicy:o="strict"}=e,i=[],n=[];for(let a of t.devices)a.unit+a.height-1>t.units&&n.push({deviceId:a.id,uPosition:a.unit,uHeight:a.height,rackUHeight:t.units});for(let a=0;a<t.devices.length;a++){let s=t.devices[a],d=s.unit,l=s.unit+s.height-1;for(let u=a+1;u<t.devices.length;u++){let y=t.devices[u],f=y.unit,N=y.unit+y.height-1;d<=N&&l>=f&&i.push({deviceId:s.id,uPosition:s.unit,uHeight:s.height,conflictWith:y.id});}}return {isValid:i.length===0&&n.length===0,conflicts:i,outOfBounds:n}}function ue(t,e,o={}){let{deviceTypeMapping:i={}}=o,n=i[t.type]||"device",a=mt(e,t.unit,t.height);return {id:t.id,type:n,position:a,parentId:e.id,extent:"parent",data:{label:t.name,status:"active",deviceType:t.type,uHeight:t.height,uPosition:t.unit,width:t.width||"full",role:t.role,ports:t.ports,rearPorts:t.rearPorts,connections:t.connections}}}function no(t){return {id:t.id,type:"rack",position:t.position,data:{label:t.name,status:"active",uHeight:t.units,uNumberingDirection:t.uNumberingDirection||"bottom-up",customHeaderText:t.customHeaderText,ports:[]}}}function io(t,e={}){let{conflictPolicy:o="strict",validatePlacements:i=true}=e,n=[],a=[];if(i)for(let s of t){let d=Zt(s,e);if(!d.isValid&&o==="strict"){let l=[];throw d.conflicts.forEach(u=>{l.push(`Device ${u.deviceId} at U${u.uPosition}-${u.uPosition+u.uHeight-1} conflicts with ${u.conflictWith}`);}),d.outOfBounds.forEach(u=>{l.push(`Device ${u.deviceId} at U${u.uPosition}-${u.uPosition+u.uHeight-1} exceeds rack height (${u.rackUHeight}U)`);}),new bt(s.id,d.conflicts[0]?.deviceId||d.outOfBounds[0]?.deviceId||"unknown",d.conflicts[0]?.uPosition||d.outOfBounds[0]?.uPosition||1,d.conflicts[0]?.uHeight||d.outOfBounds[0]?.uHeight||1)}}for(let s of t){let d=no(s);n.push(d);for(let l of s.devices)try{let u=ue(l,d,e);a.push(u);}catch(u){if(o==="strict")throw u;if(o==="nearest"){let y=Dt(d,{id:l.id,data:{label:l.name,uHeight:l.height}},a,l.unit);if(y!==l.unit){console.warn(`Device ${l.id} moved from U${l.unit} to U${y} due to conflict`);let f={...l,unit:y},N=ue(f,d,e);a.push(N);}else throw new bt(s.id,l.id,l.unit,l.height)}}}return n.push(...a),n}function ao(t){let e=[],o=t.filter(i=>i.type==="rack");for(let i of o){let a=t.filter(s=>s.type==="device"&&s.parentId===i.id).map(s=>({id:s.id,name:s.data.label,unit:s.data.uPosition||1,height:s.data.uHeight||1,type:s.data.deviceType||"server",width:s.data.width,ports:s.data.ports,connections:s.data.connections}));e.push({id:i.id,name:i.data.label,position:i.position,units:i.data.uHeight||42,uNumberingDirection:i.data.uNumberingDirection||"bottom-up",customHeaderText:i.data.customHeaderText,devices:a});}return e}function so(t,e,o,i){return t.map(n=>n.id!==e?n:{...n,devices:n.devices.map(a=>a.id!==o?a:{...a,unit:i})})}function co(t,e,o,i={}){let{conflictPolicy:n="strict"}=i;return t.map(a=>{if(a.id!==e)return a;if(n==="strict"&&!Zt({...a,devices:[...a.devices,o]},i).isValid)throw new bt(e,o.id,o.unit,o.height);return {...a,devices:[...a.devices,o]}})}function lo(t,e,o){return t.map(i=>i.id!==e?i:{...i,devices:i.devices.filter(n=>n.id!==o)})}exports.DeviceNode=Bt;exports.DevicePlacementError=bt;exports.FiberEdge=Ft;exports.FiberNode=At;exports.NetworkDiagram=eo;exports.POWER_CONNECTORS=zt;exports.PowerEdge=Mt;exports.RackNode=It;exports.VerticalPDU=Ot;exports.Width=te;exports.addDeviceToRack=co;exports.buildNodesFromRackConfig=io;exports.calculateDevicePositionFromU=mt;exports.createNetworkDiagramStore=Vt;exports.createRackConfigFromNodes=ao;exports.findNextAvailableUPosition=Dt;exports.generateLayout=ro;exports.getConnectorConfig=Rt;exports.getDeviceConnectorType=St;exports.getPDUPortType=Lt;exports.getPowerPortStyle=ht;exports.inventoryCableToNetworkEdge=pe;exports.inventoryDeviceToNetworkNode=le;exports.inventoryRackToNetworkNode=de;exports.inventoryToNetworkDiagram=oo;exports.isHighPowerConnector=_e;exports.isUPositionAvailable=Tt;exports.removeDeviceFromRack=lo;exports.snapToUPosition=Et;exports.updateDeviceUPosition=Qt;exports.updateDeviceUPositionInSchema=so;exports.useDiagramEdges=Yt;exports.useDiagramNodes=Gt;exports.useNetworkDiagram=We;exports.validateAndSnapDevice=ve;exports.validateRackDevicePlacements=Zt;//# sourceMappingURL=index.js.map
1
+ 'use strict';var or=require('react'),reactflow=require('reactflow'),htmlToImage=require('html-to-image'),jsxRuntime=require('react/jsx-runtime');function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var or__default=/*#__PURE__*/_interopDefault(or);var _o=()=>"bottom-up",xe=e=>e.data.uNumberingDirection||_o(),Be=(e,r,o)=>o==="bottom-up"?r-e+1:e,Me=(e,r,o)=>o==="bottom-up"?r-e+1:e;var nt=(e,r,o,i)=>{if(!e.parentId||e.parentId!==r.id)return o;let n=e.data.uHeight||1,s=r.data.uHeight||42,c=xe(r),a=60,l=o.y-a,p=Math.round(l/20)+1,m;c==="bottom-up"?m=Be(p,s,c)-n+1:m=Be(p,s,c);let b=s-n+1,y=Math.max(1,Math.min(b,m));if(c==="top-down"&&m<=1&&(y=1),!it(r,e,y,i)){let v=Le(r,e,i,y);v!==y&&(y=v);}let H;if(c==="bottom-up"){let v=y+n-1,I=Me(v,s,c);H=a+(I-1)*20-1;}else {let v=Me(y,s,c);H=a+(v-1)*20-1;}return {x:o.x,y:H,uPosition:y}},it=(e,r,o,i)=>{let n=r.data.uHeight||1,s=e.data.uHeight||42;if(o<1||o+n-1>s)return false;let c=i.filter(a=>a.type==="device"&&a.parentId===e.id&&a.id!==r.id);for(let a of c){let l=a.data.uPosition||1,p=a.data.uHeight||1,m=o,b=o+n-1,y=l,H=l+p-1;if(m<=H&&b>=y)return false}return true},Le=(e,r,o,i=1)=>{let n=r.data.uHeight||1,s=e.data.uHeight||42;for(let c=i;c<=s-n+1;c++)if(it(e,r,c,o))return c;return 1},He=(e,r,o=1)=>{let i=60,n=xe(e),s=e.data.uHeight||42,c=Me(r,s,n),a;if(n==="bottom-up"){let l=r+o-1,p=Me(l,s,n);a=i+(p-1)*20-1;}else a=i+(c-1)*20-1;return {x:0,y:a}},Vt=(e,r,o)=>{let i=e.data.uHeight||1,n=He(r,o,i);return {...e,position:n,data:{...e.data,uPosition:o}}},Ao=(e,r)=>{let o=e.data.uPosition||1,i=e.data.uHeight||1,n=r.data.uHeight||42,s=Math.max(1,Math.min(n-i+1,o));return s!==o?Vt(e,r,s):e};function se(e){switch(e){case "active":return "#10b981";case "inactive":return "#6b7280";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var st=({data:e,selected:r,id:o,onViewChange:i,onRackFaceChange:n,isDragOver:s=false})=>{let{label:c,ports:a=0,status:l="active",uHeight:p=42,face:m="front",customHeaderText:b}=e,{getNodes:y,setNodes:H}=reactflow.useReactFlow(),v=y(),[I,w]=or.useState(true),_=()=>{let R=xe({data:e})==="bottom-up"?"top-down":"bottom-up";H(x=>x.map(N=>N.id===o?{...N,data:{...N.data,uNumberingDirection:R}}:N));},L=()=>{let h=m==="front"?"rear":"front";n?(n(o,h),i&&v.filter(x=>x.parentId===o).forEach(x=>{i(x.id,h);})):i?v.filter(x=>x.parentId===o).forEach(x=>{i(x.id,h);}):H(R=>R.map(x=>x.id===o?{...x,data:{...x.data,face:h}}:x.parentId===o?{...x,data:{...x.data,view:h}}:x));},z=()=>{let h=[],R=60,x=xe({data:e});for(let N=1;N<=p;N++){let $=R+(N-1)*20-4,T=Be(N,p,x);h.push(jsxRuntime.jsx("div",{style:{position:"absolute",left:"-35px",top:`${$}px`,background:"#374151",color:"#9ca3af",padding:"2px 4px",borderRadius:"2px",fontSize:"8px",fontWeight:"bold",width:"28px",textAlign:"center",border:"1px solid #4b5563",zIndex:10,height:`${20}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:T},N));}return h};return jsxRuntime.jsxs("div",{className:`rack-node ${r?"selected":""} ${s?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${se(l)}`,borderRadius:"8px",padding:0,width:`${300}px`,height:`${60+p*20}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:s?"0 0 20px #3b82f6, 0 0 40px #3b82f6, 0 0 60px #3b82f6":r?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",transition:"box-shadow 0.2s ease-in-out"},children:[jsxRuntime.jsxs("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#1f2937",padding:"8px",position:"relative",height:`${60}px`,display:"flex",flexDirection:"column",justifyContent:"center"},children:[jsxRuntime.jsx("div",{style:{fontWeight:"bold",marginBottom:"4px"},children:c}),jsxRuntime.jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[b?jsxRuntime.jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:b}):jsxRuntime.jsxs("span",{children:[typeof a=="number"?a:0," ports"]})," \u2022 ",p,"U \u2022 ",m]}),jsxRuntime.jsxs("div",{style:{display:"flex",gap:"4px",position:"absolute",top:"4px",right:"4px"},children:[jsxRuntime.jsx("button",{onPointerDown:h=>{h.stopPropagation();},onMouseDown:h=>{h.stopPropagation();},onClick:h=>{h.stopPropagation(),h.preventDefault(),w(!I);},style:{background:I?"#10b981":"#374151",color:I?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${I?"Hide":"Show"} U markers`,children:"U"}),jsxRuntime.jsx("button",{onPointerDown:h=>{h.stopPropagation();},onMouseDown:h=>{h.stopPropagation();},onClick:h=>{h.stopPropagation(),h.preventDefault(),_();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch U numbering to ${xe({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:xe({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),jsxRuntime.jsx("button",{onPointerDown:h=>{h.stopPropagation();},onMouseDown:h=>{h.stopPropagation();},onClick:h=>{h.stopPropagation(),h.preventDefault(),L();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${m==="front"?"rear":"front"} view`,children:m==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsxRuntime.jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${p*20}px`,overflow:"hidden"}}),I&&jsxRuntime.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:z()})]})};var at=({data:e,selected:r})=>{let{label:o,status:i="active"}=e;return jsxRuntime.jsxs("div",{className:`fiber-node ${r?"selected":""}`,style:{background:"#1f2937",border:`2px solid ${se(i)}`,borderRadius:"50%",width:"60px",height:"60px",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontFamily:"monospace",fontSize:"10px",fontWeight:"bold",boxShadow:r?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative"},children:[jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Top}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Bottom}),jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Left}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right}),jsxRuntime.jsx("div",{style:{textAlign:"center"},children:jsxRuntime.jsx("div",{style:{fontSize:"8px",lineHeight:"1.2"},children:o})}),jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"4px",left:"50%",transform:"translateX(-50%)",width:"8px",height:"8px",background:se(i),borderRadius:"50%"}})]})};var ct=({id:e,sourceX:r,sourceY:o,targetX:i,targetY:n,sourcePosition:s,targetPosition:c,data:a,selected:l,style:p={},className:m})=>{let [b,y,H]=reactflow.getBezierPath({sourceX:r,sourceY:o,sourcePosition:s,targetX:i,targetY:n,targetPosition:c}),{bandwidth:v,length:I,color:w="#00FFFF",striped:_=false}=a||{};m?.includes("edge-connecting");let z={...p,stroke:w,strokeWidth:l?3:2,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:b,style:z}),_&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-stripe`,path:b,style:{...p,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:l&&a&&(v||I)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${y}px,${H}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${w}`,pointerEvents:"none",zIndex:9999},children:[v&&jsxRuntime.jsx("div",{children:v}),I&&jsxRuntime.jsxs("div",{children:[I,"m"]})]})})]})};var lt=({id:e,sourceX:r,sourceY:o,targetX:i,targetY:n,sourcePosition:s,targetPosition:c,style:a={},data:l,markerEnd:p})=>{let[m]=reactflow.getBezierPath({sourceX:r,sourceY:o,sourcePosition:s,targetX:i,targetY:n,targetPosition:c}),b=l?.connectorType||"C13";return jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:m,markerEnd:p,style:(()=>{let H={stroke:l?.color||"#f59e0b",strokeWidth:b==="C19"?5:3,strokeLinecap:"round",strokeLinejoin:"round",...a};return b==="C19"?{...H,strokeDasharray:"none"}:{...H,strokeDasharray:"6,3"}})()})};var jt=({data:e,selected:r,style:o={},...i})=>{let{color:n="#00FFFF"}=e||{},s={...o,stroke:n,strokeWidth:r?4:3};return jsxRuntime.jsx(reactflow.SmoothStepEdge,{...i,data:e,selected:r,style:s})};function Zo({sourceX:e,sourceY:r,targetX:o,targetY:i,sourcePosition:n,targetPosition:s}){let c=n===reactflow.Position.Left||n===reactflow.Position.Right,a;if(c){let l=(e+o)/2;a=`M ${e},${r} L ${l},${r} L ${l},${i} L ${o},${i}`;}else {let l=(r+i)/2;a=`M ${e},${r} L ${e},${l} L ${o},${l} L ${o},${i}`;}return a}var Kt=({id:e,sourceX:r,sourceY:o,targetX:i,targetY:n,sourcePosition:s,targetPosition:c,data:a,selected:l,style:p={},...m})=>{let{color:b="#00FFFF",striped:y=false}=a||{},H=Zo({sourceX:r,sourceY:o,sourcePosition:s,targetX:i,targetY:n,targetPosition:c}),v={...p,stroke:b,strokeWidth:l?3:2,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:H,style:v}),y&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-stripe`,path:H,style:{...p,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var qt=(o=>(o.FULL="full",o.HALF="half",o))(qt||{});var pt={C13:{type:"C13",color:"#f59e0b",borderColor:"#d97706",amperage:10,voltage:230,phases:1},C14:{type:"C14",color:"#f59e0b",borderColor:"#d97706",amperage:10,voltage:230,phases:1},C19:{type:"C19",color:"#fbbf24",borderColor:"#d97706",amperage:16,voltage:230,phases:1},C20:{type:"C20",color:"#fbbf24",borderColor:"#d97706",amperage:16,voltage:230,phases:1}};function Ce(e){let r=pt[e];if(!r)throw new Error(`Unknown connector type: ${e}`);let o=r.amperage===16,i=o?12:8,n=o?10:5,s=o?{borderRadius:"3px"}:{clipPath:"polygon(2px 0, calc(100% - 2px) 0, 100% 2px, 100% 100%, 0 100%, 0 2px)",borderRadius:"0px"};return {width:i,height:n,color:r.color,borderColor:r.borderColor,fontSize:o?"3px":"4px",...s}}function Ge(e){let r=pt[e];if(!r)throw new Error(`Unknown connector type: ${e}`);return r}function Jo(e){return Ge(e).amperage===16}function ut(e){return e%10<8?"C13":"C19"}function Xe(e){let r=e.toLowerCase();return r.includes("mx304")||r.includes("mx480")||r.includes("mx960")?"C20":"C14"}var ft=({data:e,selected:r})=>{let{label:o,status:i="active",deviceType:n="server",manufacturer:s,role:c,uHeight:a=1,width:l="full",ports:p=[],rearPorts:m=[],view:b}=e,y=b||(m.length>0&&p.length===0?"rear":"front"),H={};H["net-top"]="front",H["net-bottom"]="front",p.length>0&&p.forEach(h=>{h.ports.forEach(R=>{let x=R.type?.includes("power")?R.label:`${h.name}-${R.label}`;H[x]="front";});}),H["pwr-left-1"]="rear",H["pwr-left-2"]="rear",H["net-right-1"]="rear",H["net-right-2"]="rear",m.length>0&&m.forEach(h=>{h.ports.forEach(R=>{let x=R.type?.includes("power")?R.label:`${h.name}-${R.label}`;H[x]="rear";});});let v=a*20,I=l==="half"?"150px":"304px",w=l==="half"?"150px":void 0,_=(h,R)=>{let x=[];if(h.length===0)return x;let N=Math.max(4,Math.floor(v*.4)),$=Math.max(2,Math.floor(v*.2));return h.forEach((T,M)=>{T.ports.forEach((C,P)=>{let F=!!C.type&&C.type.includes("power");if(R==="front"&&F)return;let Y=F?`${C.label}`:`${T.name}-${C.label}`,j=C.connected,D="#6b7280";if(j)if(C.type?.includes("power"))D=C.type==="power_c19"?"#fbbf24":"#f59e0b";else if(C.type==="console"||C.type==="mgmt")D="#8b5cf6";else if(C.type==="usb")D="#10b981";else switch(C.cableType){case "smf":D="#fbbf24";break;case "cat6":D="#8b5cf6";break;case "om3":D="#06b6d4";break;case "om4":D="#8b5cf6";break;case "om5":D="#84cc16";break;case "cat5e":D="#3b82f6";break;case "cat6a":D="#ef4444";break;case "cat7":D="#f97316";break;case "fiber":D="#3b82f6";break;case "ethernet":D="#10b981";break;default:D="#10b981";}let G=reactflow.Position.Top,E={width:`${N}px`,height:`${$}px`,background:j?D:"#6b7280",border:`1px solid ${j?D:"#374151"}`,borderRadius:"1px",cursor:"pointer"};if(R==="front")P%2===0?(G=reactflow.Position.Top,E.transform="translateY(50%)",E.left=`${P/2*(N+2)}px`):(G=reactflow.Position.Bottom,E.transform="translateY(-50%)",E.left=`${(P-1)/2*(N+2)}px`);else if((n?.toLowerCase().replace(/_/g,"-")||"")==="patch-panel")P%2===0?(G=reactflow.Position.Top,E.transform="translateY(50%)",E.left=`${P/2*(N+2)}px`):(G=reactflow.Position.Bottom,E.transform="translateY(-50%)",E.left=`${(P-1)/2*(N+2)}px`);else if(C.type?.includes("power")){G=reactflow.Position.Left,E.transform="translateX(50%)";let We=v<=20?10:20,Pe=v<=20?30:50;E.top=`${We+P*Pe}%`;let tt=Xe(o),fe=Ce(tt);E={...E,width:`${fe.width}px`,height:`${fe.height}px`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:fe.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:fe.borderRadius,clipPath:fe.clipPath};}else G=reactflow.Position.Right,E.transform="translateX(-50%)",E.top=`${25+P*50}%`;let Ae=(n?.toLowerCase().replace(/_/g,"-")||"")==="patch-panel",ue;if(F)ue="target";else if(n==="switch"||n==="router")ue="source",x.push(jsxRuntime.jsx(reactflow.Handle,{id:`${Y}-target`,type:"target",position:G,style:E,title:`${T.name} - ${C.label} (input) ${j?"(connected)":"(disconnected)"}`},`${Y}-target`));else if(Ae){ue=R==="rear"?"source":"target";let ge=R==="rear"?"target":"source";x.push(jsxRuntime.jsx(reactflow.Handle,{id:`${Y}-${ge}`,type:ge,position:G,style:E,title:`${T.name} - ${C.label} (${ge}) ${j?"(connected)":"(disconnected)"}`},`${Y}-${ge}`));}else ue=j?"source":"target";x.push(jsxRuntime.jsx(reactflow.Handle,{id:Y,type:ue,position:G,style:E,title:`${T.name} - ${C.label} ${j?"(connected)":"(disconnected)"}`,children:F?P+1:void 0},Y));});}),x},L=()=>{let h=[],R=Math.max(4,Math.floor(v*.4)),x=Math.max(2,Math.floor(v*.2));if(y==="front"){if(p.length>0)return _(p,"front");if(n==="switch"&&(o.toLowerCase().includes("agg")||o.toLowerCase().includes("core")||c==="agg"||c==="core"))return z();h.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-top",type:"target",position:reactflow.Position.Top,style:{width:`${R}px`,height:`${x}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateY(50%)"},title:"Network Port (Top)"},"net-top")),h.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-bottom",type:"target",position:reactflow.Position.Bottom,style:{width:`${R}px`,height:`${x}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateY(-50%)"},title:"Network Port (Bottom)"},"net-bottom"));}else if(y==="rear"){if(m.length>0)return _(m,"rear");let N=n==="switch",T=(n?.toLowerCase().replace(/_/g,"-")||"")==="patch-panel";if(!T){let M=Xe(o),C=Ge(M),P=Ce(M),F=v<=20?"10%":"25%";h.push(jsxRuntime.jsx(reactflow.Handle,{id:"pwr-left-1",type:"target",position:reactflow.Position.Left,style:{width:`${P.width}px`,height:`${P.height}px`,background:P.color,border:`1px solid ${P.borderColor}`,cursor:"pointer",transform:"translateX(50%)",top:F,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:P.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:P.borderRadius,clipPath:P.clipPath},title:`Power Port 1 (${C.type}) - ${C.voltage}V, ${C.amperage}A`,children:"1"},"pwr-1"));let Y=v<=20?"50%":"75%";h.push(jsxRuntime.jsx(reactflow.Handle,{id:"pwr-left-2",type:"target",position:reactflow.Position.Left,style:{width:`${P.width}px`,height:`${P.height}px`,background:P.color,border:`1px solid ${P.borderColor}`,cursor:"pointer",transform:"translateX(50%)",top:Y,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:P.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:P.borderRadius,clipPath:P.clipPath},title:`Power Port 2 (${C.type}) - ${C.voltage}V, ${C.amperage}A`,children:"2"},"pwr-2"));}!N&&!T&&(h.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-right-1",type:"target",position:reactflow.Position.Right,style:{width:`${R}px`,height:`${x}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateX(-50%)",top:"25%"},title:"Network Port 1 (Right)"},"net-right-1")),h.push(jsxRuntime.jsx(reactflow.Handle,{id:"net-right-2",type:"target",position:reactflow.Position.Right,style:{width:`${R}px`,height:`${x}px`,background:"#10b981",border:"0.5px solid #059669",borderRadius:"1px",cursor:"pointer",transform:"translateX(-50%)",top:"75%"},title:"Network Port 2 (Right)"},"net-right-2")));}return h},z=()=>{let h=[],R=Math.max(10,Math.floor(v*.45)),x=Math.max(5,Math.floor(v*.25));for(let N=1;N<=16;N++){let $=jsxRuntime.jsx(reactflow.Handle,{id:`port-${N}`,type:"source",position:reactflow.Position.Top,style:{width:`${R}px`,height:`${x}px`,background:"#10b981",border:"1px solid #059669",borderRadius:"2px",cursor:"pointer",transform:"translateY(50%)",zIndex:1e3,left:`${(N-1)*(R+2)}px`},title:`Port ${N}`},`port-${N}`);h.push($);}for(let N=17;N<=32;N++){let $=N-16,T=jsxRuntime.jsx(reactflow.Handle,{id:`port-${N}`,type:"source",position:reactflow.Position.Bottom,style:{width:`${R}px`,height:`${x}px`,background:"#10b981",border:"1px solid #059669",borderRadius:"2px",cursor:"pointer",transform:"translateY(-50%)",zIndex:1e3,left:`${($-1)*(R+2)}px`},title:`Port ${N}`},`port-${N}`);h.push(T);}for(let N=1;N<=4;N++){let $=Math.max(4,Math.floor(v*.3)),T=Math.max(3,Math.floor(v*.15));h.push(jsxRuntime.jsx(reactflow.Handle,{id:`uplink-${N}`,type:"source",position:reactflow.Position.Right,style:{width:`${$}px`,height:`${T}px`,background:"#8b5cf6",border:"0.5px solid #7c3aed",borderRadius:"0.5px",cursor:"pointer",transform:"translateX(-50%)"},title:`Uplink ${N}`},`uplink-${N}`));}return h};return jsxRuntime.jsxs("div",{className:`device-node ${r?"selected":""}`,style:{background:"#1f2937",border:`1px solid ${se(i)}`,borderRadius:"2px",padding:"0px",width:I,...w&&{left:w},height:`${v}px`,color:"white",fontFamily:"monospace",fontSize:"8px",boxShadow:r?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",justifyContent:"center",cursor:"grab",marginBottom:"0px",boxSizing:"border-box",marginTop:"0px",marginLeft:"0px",marginRight:"0px"},children:[jsxRuntime.jsxs("div",{style:{textAlign:"center",flex:1,display:"flex",flexDirection:"column",justifyContent:"center",overflow:"hidden",padding:"2px"},children:[jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"7px",lineHeight:"1.1",whiteSpace:"nowrap",overflow:"hidden",textOverflow:"ellipsis"},children:o}),a>1&&jsxRuntime.jsx("div",{style:{fontSize:"6px",color:"#9ca3af",lineHeight:"1"},children:s})]}),a>1&&jsxRuntime.jsxs("div",{style:{position:"absolute",bottom:"1px",right:"1px",background:"#374151",color:"#9ca3af",padding:"1px 2px",borderRadius:"1px",fontSize:"6px",lineHeight:"1"},children:[a,"U"]}),jsxRuntime.jsx("div",{style:{position:"absolute",bottom:"1px",left:"1px",width:"4px",height:"4px",background:se(i),borderRadius:"50%"}}),L()]})};var bt=({data:e,selected:r})=>{let{label:o,status:i="active",heightCm:n=100,powerPorts:s=36,widthPx:c=15,mgmt_unit:a}=e,l=n*4.2,p=()=>{let y=Math.ceil(s/10),H=Array(10).fill(0).map((x,N)=>N<8?"10A":"16A");for(let x=0,N=0;x<y;++x)for(let $=0;$<10&&N<s;++$,++N){H[$];}let _=[],L=15,R=(l-L-3)/(s-9)*.5;for(let x=0;x<s;x++){let N=L-2+R*x,$=`${x+1}`;if(a&&(a==="top"&&x===0||a==="middle"&&x===Math.floor(s/2)||a==="bottom"&&x===s-1)){_.push(m(N));continue}let M=ut(x),C=Ce(M),P=Math.round((c-C.width)/2-1);_.push(jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right,id:$,style:{position:"absolute",left:`${P}px`,top:`${N-C.height/2}px`,width:`${C.width}px`,height:`${C.height}px`,background:C.color,border:`1px solid ${C.borderColor}`,cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:C.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:C.borderRadius,clipPath:C.clipPath},title:`Power Port ${x+1} (${M})`,children:x+1},`handle-${$}`));}return _},m=b=>jsxRuntime.jsxs("div",{style:{position:"absolute",left:`${(c-16)/2}px`,top:`${b-12/2}px`,width:"16px",height:"12px",background:"#1a1a1a",border:"1px solid #374151",borderRadius:"1px",display:"flex",flexDirection:"column",padding:"1px",zIndex:10},children:[jsxRuntime.jsx("div",{style:{position:"absolute",left:"-10px",top:"1px",background:"#ffffff",border:"0.5px solid #6b7280",borderRadius:"0.5px",width:"8px",height:"10px",display:"flex",alignItems:"center",justifyContent:"center",fontSize:"3px",color:"#10b981",fontFamily:"monospace",fontWeight:"bold",transform:"rotate(90deg)",transformOrigin:"center"},children:"APC"}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right,id:"mgmt-net-1",style:{width:"70%",height:"6px",background:"#10b981",border:"1px solid #059669",borderRadius:"1px",cursor:"pointer",zIndex:11,margin:"0 auto"},title:"Management Network Port"},"mgmt-net-1")]},"mgmt-unit");return jsxRuntime.jsxs("div",{className:`vertical-pdu-node ${r?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${se(i)}`,borderRadius:"2px",padding:0,width:`${c}px`,height:`${l}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:r?"0 0 0 2px #3b82f6":"0 1px 3px rgba(0,0,0,0.3)",position:"relative",display:"flex",flexDirection:"column"},children:[jsxRuntime.jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"linear-gradient(90deg, #4a5568 0%, #2d3748 50%, #4a5568 100%)",padding:"2px",position:"relative",height:"20px",display:"flex",flexDirection:"column",justifyContent:"center",borderBottom:"1px solid #4a5568"},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"6px",color:"#e2e8f0"},children:o})}),jsxRuntime.jsx("div",{style:{flex:1,background:"linear-gradient(180deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",position:"relative",minHeight:`${l-20}px`,overflow:"hidden"},children:p()})]})};var yt=({data:e,selected:r,id:o})=>{let{lossDb:i}=e||{},n=reactflow.useEdges(),s=n.find(y=>y.target===o&&y.targetHandle==="left"),c=n.find(y=>y.source===o&&y.sourceHandle==="right"),a=n.find(y=>y.target===o&&y.targetHandle==="right"),l=c||a,p=s?.data?.color||"#555",m=l?.data?.color||"#555",b=!!s&&!!l;return jsxRuntime.jsxs("div",{className:`splice-node ${r?"selected":""}`,style:{width:69,height:16,borderRadius:8,border:"none",outline:"none",position:"relative",background:"transparent",boxShadow:r?"0 0 0 2px #3b82f6":"none"},children:[jsxRuntime.jsxs("div",{style:{position:"absolute",inset:0,display:"grid",gridTemplateColumns:"1fr 1fr",borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none"},children:[jsxRuntime.jsx("div",{style:{background:p}}),jsxRuntime.jsx("div",{style:{background:m}})]}),jsxRuntime.jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1}}),b&&jsxRuntime.jsx("div",{className:"splice-glow",style:{position:"absolute",left:"50%",top:0,bottom:0,width:"1px",background:"rgba(255, 255, 255, 0.6)",boxShadow:"0 0 2px rgba(255, 255, 255, 0.8), 0 0 4px rgba(255, 255, 255, 0.4)",pointerEvents:"none",zIndex:2}}),b&&typeof i=="number"&&jsxRuntime.jsx("div",{className:"splice-text-label animate-in",style:{position:"absolute",inset:0,display:"flex",alignItems:"center",justifyContent:"center",fontSize:9,fontFamily:"monospace",pointerEvents:"none",zIndex:3,fontWeight:"bold"},children:`${i.toFixed(2)} dB`}),jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Left,id:"left",isConnectable:true,style:{width:12,height:12,borderRadius:"50%",border:"none",background:p,zIndex:100,cursor:"crosshair",left:-6,top:"50%",transform:"translateY(-50%)"}}),jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right,id:"right",isConnectable:true,style:{width:12,height:12,borderRadius:"50%",border:"none",background:m,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}}),jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Right,id:"right",isConnectable:true,style:{width:12,height:12,borderRadius:"50%",border:"none",background:m,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var he=20,we=32,oo=4,ye=12,er=69,wt=80,xt=(wt-er)/2;var kt=(e,r,o,i)=>{if(!e.parentId||e.parentId!==r.id)return o;let n=we,s=o.y-n,c=Math.round(s/he)+1,l=Math.max(1,Math.min(ye,c));if(!Nt(r,e,l,i)){let y=Ze(r,e,i,l);if(y!==l)return {x:xt,y:n+(y-1)*he+5,holderPosition:y}}let b=n+(l-1)*he+5;return {x:xt,y:b,holderPosition:l}},Nt=(e,r,o,i)=>!i.filter(s=>s.parentId===e.id&&s.type==="splice"&&s.id!==r.id).some(s=>s.data.holderPosition===o),Ze=(e,r,o,i=1)=>{for(let n=i;n<=ye;n++)if(Nt(e,r,n,o))return n;for(let n=i-1;n>=1;n--)if(Nt(e,r,n,o))return n;return 1},Fe=(e,r)=>{let n=we+(r-1)*he+5;return {x:xt,y:n}};var St=({data:e,selected:r})=>{let{label:o="Splice Tray",status:i="active"}=e||{},[n,s]=or.useState(false),c=()=>{if(!n)return null;let a=[],l=we;for(let p=1;p<=ye;p++){let m=l+(p-1)*he;a.push(jsxRuntime.jsxs("div",{style:{position:"absolute",left:"-35px",top:`${m}px`,background:"#374151",color:"#9ca3af",padding:"2px 4px",borderRadius:"2px",fontSize:"8px",fontWeight:"bold",width:"28px",textAlign:"center",border:"1px solid #4b5563",zIndex:10,height:`${he}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",p]},p));}return a};return jsxRuntime.jsxs("div",{className:`splice-tray-node ${r?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${wt}px`,height:`${we+ye*he+oo}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:r?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column"},children:[jsxRuntime.jsxs("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#1f2937",padding:"2px",position:"relative",height:`${we}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"8px"},children:[jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"10px"},children:o}),jsxRuntime.jsx("button",{onPointerDown:a=>{a.stopPropagation();},onMouseDown:a=>{a.stopPropagation();},onClick:a=>{a.stopPropagation(),a.preventDefault(),s(!n);},style:{background:n?"#10b981":"#374151",color:n?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${n?"Hide":"Show"} holder markers`,children:"H"})]}),c(),jsxRuntime.jsx("div",{style:{position:"absolute",top:we,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var ro=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function ae(e){let r=(e-1)%12;return ro[r]}function no(e){return e>12}function _e(e){let r=ae(e);return no(e)?{background:r,backgroundImage:`repeating-linear-gradient(45deg, ${r} 0 6px, #000 6px 9px)`}:{background:r}}function Ht(e){return ae(e)}var Ct=({data:e,selected:r,id:o})=>{let{fibersPerTube:i=12,tubeIndex:n=1,startOn:s="left-center"}=e||{},c=Math.max(1,Math.min(24,Number(i)||12)),a=14,l=4,p=1,m=2,b=20,y=c*a+(c-1)*l,H=Math.max(60,y+p*2+m*2),v=ae((n-1)%12+1),I=`tube-${n}`,w=18,_={width:w,height:w,borderRadius:"50%",opacity:.25,pointerEvents:"auto",background:v,backgroundColor:v,border:`2px solid ${v}`,"--fiber-bg":v},L=()=>s==="left"?reactflow.Position.Left:s==="right"?reactflow.Position.Right:reactflow.Position.Bottom,z=()=>{let h=[],R=H-m*2-p*2,N,$,T=false;s==="left"?(N=p,$=reactflow.Position.Top):s==="right"?(N=p+R-y,$=reactflow.Position.Top,T=true):(N=p+(R-y)/2,$=reactflow.Position.Top);for(let M=0;M<c;M++){let C=T?c-M:M+1,P=_e(C),F=ae(C),Y=N+M*(a+l),j=p,D=P.backgroundImage?P.backgroundImage:F,G={position:"absolute",left:`${Y}px`,top:`${j}px`,width:a,height:a,borderRadius:"50%",border:"none",background:D,backgroundColor:F,zIndex:10,cursor:"pointer","--fiber-bg":F};P.backgroundImage&&(G["--fiber-bg-image"]=P.backgroundImage);let E=`fiber-${C}`;h.push(jsxRuntime.jsxs(or__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:E,type:"target",position:$,className:"tube-fiber-handle",isConnectable:true,style:G,"data-fiber-idx":C,"data-fiber-color":F}),jsxRuntime.jsx(reactflow.Handle,{id:E,type:"source",position:$,className:"tube-fiber-handle",isConnectable:true,style:G,"data-fiber-idx":C,"data-fiber-color":F})]},`fiber-${C}`));}return h};return jsxRuntime.jsxs("div",{style:{width:H,height:b,borderRadius:4,background:"#111827",border:`${m}px solid ${r?"#3b82f6":v}`,position:"relative",boxShadow:r?`0 0 0 ${m}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:p,boxSizing:"border-box"},children:[z(),jsxRuntime.jsx(reactflow.Handle,{id:I,type:"target",position:L(),isConnectable:true,style:_,"data-tube-idx":n,"data-tube-color":v}),jsxRuntime.jsx(reactflow.Handle,{id:I,type:"source",position:L(),isConnectable:true,style:_,"data-tube-idx":n,"data-tube-color":v})]})};var Rt=({data:e,selected:r})=>{let{tubeCount:o=12,fibersPerTube:i=12,fiberCount:n,cableId:s="CBL-002",label:c,tubeStartIndex:a=1,borderStyle:l="default"}=e||{},p=Math.max(1,Math.min(24,Number(o)||12)),m=Math.max(1,Number(a)||1),b=8,y=2,H=6,v=H+b+4,I=60,w=Math.max(120,p*(b+y)+H*2),_=n??p*(Number(i)||12),L=c??`${_}f Cable`,z=s?`Cable ID ${s}`:void 0,h=ae(m),R=r?"#3b82f6":h,x=false;l==="black"?R=r?"#3b82f6":"#000000":l==="black-yellow-striped"&&(R=r?"#3b82f6":"#000000",x=!r);let N=()=>{let M=[];for(let C=0;C<p;C++){let P=m+C,F=_e(P),Y=ae(P),j=H+C*(b+y),D=-4,G=F.backgroundImage?F.backgroundImage:Y,E={position:"absolute",left:`${j}px`,top:`${D}px`,width:b,height:b,borderRadius:"50%",border:"none",background:G,backgroundColor:Y,zIndex:10,cursor:"pointer","--fiber-bg":Y};F.backgroundImage&&(E["--fiber-bg-image"]=F.backgroundImage);let le=`tube-${P}`;M.push(jsxRuntime.jsxs(or__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:le,type:"target",position:reactflow.Position.Top,className:"tube-fiber-handle",isConnectable:true,style:E,"data-fiber-idx":P,"data-tube-idx":P,"data-tube-color":Y}),jsxRuntime.jsx(reactflow.Handle,{id:le,type:"source",position:reactflow.Position.Top,className:"tube-fiber-handle",isConnectable:true,style:E,"data-fiber-idx":P,"data-tube-idx":P,"data-tube-color":Y})]},`tube-${P}`));}return M},$=2,T=jsxRuntime.jsxs("div",{style:{width:"100%",height:"100%",borderRadius:x?2:4,background:"#111827",position:"relative",padding:H,paddingTop:v,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[N(),jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:L}),z&&jsxRuntime.jsx("div",{style:{fontSize:10,opacity:.8},children:z})]});return x?jsxRuntime.jsx("div",{style:{width:w,height:I,borderRadius:4,background:"repeating-linear-gradient(45deg, #000000 0 6px, #ffdf00 6px 9px)",padding:$,boxSizing:"border-box",position:"relative",boxShadow:r?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)"},children:T}):jsxRuntime.jsxs("div",{style:{width:w,height:I,borderRadius:4,background:"#111827",border:`${$}px solid ${R}`,position:"relative",boxShadow:r?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:H,paddingTop:v,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[N(),jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:L}),z&&jsxRuntime.jsx("div",{style:{fontSize:10,opacity:.8},children:z})]})};function nr(e,r){if(!e.source||!e.target||!e.sourceHandle||!e.targetHandle)return {valid:true};let o=r.edges.some(w=>w.source===e.source&&w.sourceHandle===e.sourceHandle),i=r.edges.some(w=>w.target===e.target&&w.targetHandle===e.targetHandle);if(o)return {valid:false,reason:"Source port is already connected"};if(i)return {valid:false,reason:"Target port is already connected"};let n=e.sourceHandle,s=e.targetHandle,c=r.nodes.find(w=>w.id===e.source),a=r.nodes.find(w=>w.id===e.target),l=(w,_)=>{if(!w)return false;let L=w.startsWith("pwr")||w.startsWith("power"),z=_?.type==="vertical-pdu"&&w!=="mgmt-net-1";return L||z},p=(w,_)=>{if(!w)return false;if(_?.type==="vertical-pdu"&&w==="mgmt-net-1"||_?.type==="tube"&&w.startsWith("fiber-")||(_?.type==="tube"||_?.type==="cable")&&w.startsWith("tube-")||_?.type==="splice"&&(w==="left"||w==="right"))return true;let L=w.startsWith("net-")||w.startsWith("port-")||w.startsWith("uplink-")||w.includes("Fiber")||w.includes("Ports"),z=/^[A-Z0-9]+-\d+$/.test(w)&&!w.startsWith("pwr")&&!w.startsWith("power");return L||z},m=l(n,c),b=l(s,a),y=p(n,c),H=p(s,a);if(m&&H||b&&y)return {valid:false,reason:"Cannot connect network cable to power port"};if(m&&!b||b&&!m)return {valid:false,reason:"Power ports must connect to power-compatible ports"};let v=c?.type==="vertical-pdu",I=a?.type==="vertical-pdu";if(m||b){let w=v?a:I?c:null,_=v?c:I?a:null;if(w&&_&&r.edges.filter(h=>{let R=l(h.sourceHandle||""),x=l(h.targetHandle||""),N=h.source===w.id||h.target===w.id;return (R||x)&&N}).some(h=>h.source===_.id||h.target===_.id))return {valid:false,reason:"Dual-feed required: connect second power to a different PDU"}}return {valid:true}}function Je(e,r){if(!r)return;let o=typeof e=="string"?e.replace(/-(target|source)$/i,""):e,i=r.data??{},n=i.handleSideMap;if(n&&n[o])return n[o];if(o==="net-top"||o==="net-bottom")return "front";if(o==="pwr-left-1"||o==="pwr-left-2"||o==="net-right-1"||o==="net-right-2")return "rear";let s=Array.isArray(i.ports)?i.ports:[],c=Array.isArray(i.rearPorts)?i.rearPorts:[];if(o.startsWith("pwr")||o.includes("power"))return "rear";for(let l of s)for(let p of l.ports||[])if((!!p.type&&String(p.type).includes("power")?p.label:`${l.name}-${p.label}`)===o)return "front";for(let l of c)for(let p of l.ports||[])if((!!p.type&&String(p.type).includes("power")?p.label:`${l.name}-${p.label}`)===o)return "rear"}function Dt(e={},r={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},i=new Set;return {getState:()=>o,setState:b=>{o={...o,...b},i.forEach(y=>y(o));},subscribe:b=>(i.add(b),()=>i.delete(b)),selectEdgeZIndex:b=>{let y=o.nodes.find(R=>R.id===b.target);if(!y||y.type!=="device")return 1e3;let H=y.data?.view||"front",v=Je(b.targetHandle||"",y);if(v)return H===v?1e3:500;let I=(b.targetHandle||"").toString(),w=I.toLowerCase(),_=w.startsWith("pwr")||w.startsWith("power"),L=w.startsWith("net-")||w.startsWith("port-")||w.startsWith("uplink-")||w.includes("fiber")||w.includes("ports"),z=/^[A-Z0-9]+-\d+$/i.test(I)&&!w.startsWith("pwr")&&!w.startsWith("power"),h=L||z;return _?H==="rear"?1e3:500:h?H==="front"?1e3:500:1e3},validateConnection:b=>(r.validateConnection||nr)(b,o),selectNodeById:b=>o.nodes.find(y=>y.id===b),selectConnectedEdges:b=>o.edges.filter(y=>y.source===b||y.target===b)}}function ir(e){let r=n=>e.subscribe(n),o=()=>e.getState();return or.useSyncExternalStore(r,o,o)}function It(e){let r=i=>e.subscribe(i),o=()=>e.getState().nodes;return or.useSyncExternalStore(r,o,o)}function $t(e){let r=i=>e.subscribe(i),o=()=>e.getState().edges;return or.useSyncExternalStore(r,o,o)}function co(e){return e.selectEdgeZIndex}function lo(e){let r=300,o=(e.data.uHeight||42)*20,i=e.position.x,n=e.position.x+r,s=e.position.y,c=e.position.y+o;return {left:i,right:n,top:s,bottom:c}}function Qe(e,r){let o=lo(r);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function et(e,r){let o=null,i=1/0;for(let n of r){if(!Qe(e,n))continue;let s=Math.sqrt(Math.pow(e.x-n.position.x,2)+Math.pow(e.y-n.position.y,2));s<i&&(i=s,o=n);}return o}function q(e){let{edges:r,connection:o,edgeType:i,selectEdgeZIndex:n,findBy:s,data:c}=e,a=s==="source"?o.sourceHandle:o.targetHandle,l=s==="source"?o.source:o.target;if(!a||!l)return null;let p=r.find(I=>s==="source"?I.source===l&&I.sourceHandle===a:I.target===l&&I.targetHandle===a);if(!p)return null;let m=r.filter(I=>I.id!==p.id),b=reactflow.addEdge(o,m),y=b[b.length-1],H=n({...o,id:y.id,type:i}),v={...y,type:i,zIndex:H,style:{...y.style,zIndex:H},data:c!==void 0?c:y.data};return [...b.slice(0,-1),v]}var xr=(e,r,o)=>({rack:i=>jsxRuntime.jsx(st,{...i,onViewChange:e,onRackFaceChange:r,isDragOver:o?o()===i.id:false}),fiber:at,device:ft,"vertical-pdu":bt,splice:yt,"splice-tray":St,tube:Ct,cable:Rt}),Nr={fiber:ct,power:lt,smoothstep:jt,step:Kt},wr=({nodes:e,edges:r,initialNodes:o,initialEdges:i,onNodesChange:n,onEdgesChange:s,store:c,debug:a,onNodeClick:l,onEdgeClick:p,onViewChange:m,onRackFaceChange:b,className:y,style:H,alignRacksToBottom:v,colorMode:I="dark",onInit:w,onFlowMethods:_,showDownloadButton:L=false,downloadButtonPosition:z="top-right",downloadButtonText:h="Download Image",downloadButtonStyle:R,allowReconnectExisting:x=false,useSmoothstepEdgesForTubes:N=false})=>{let $=Array.isArray(e)&&Array.isArray(r),T=or__default.default.useMemo(()=>c||Dt({nodes:$?e||[]:o||e||[],edges:$?r||[]:i||r||[],debug:a}),[c,$,a]),M=It(T),C=$t(T),[P,F,Y]=reactflow.useNodesState(M),[j,D,G]=reactflow.useEdgesState(C),E=co(T),le=or.useRef(null),{toObject:Ae,setViewport:ue,setNodes:ge,setEdges:We,getNodes:Pe}=reactflow.useReactFlow();or.useEffect(()=>{_&&_({toObject:Ae,setViewport:ue,setNodes:t=>{ge(t),T.setState({nodes:t});},setEdges:t=>{We(t),T.setState({edges:t});},toImage:t=>le.current?htmlToImage.toPng(le.current,t):Promise.reject(new Error("ReactFlow wrapper not available"))});},[_,Ae,ue,ge,We,T]);let tt=or.useCallback(()=>{if(!le.current){a&&console.error("ReactFlow wrapper ref is not available");return}htmlToImage.toPng(le.current,{filter:t=>!(t?.classList?.contains("react-flow__minimap")||t?.classList?.contains("react-flow__controls")||t?.classList?.contains("react-flow__attribution")||t?.classList?.contains("download-button")||t?.tagName==="BUTTON"),backgroundColor:I==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(t=>{let d=document.createElement("a");d.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,d.href=t,d.click();}).catch(t=>{a&&console.error("Error downloading image:",t);});},[I,a]),[fe,Ue]=or.useState(null),Ut=or.useRef(null),zt=or.useRef(m),Ot=or.useRef(b);or.useEffect(()=>{zt.current=m;},[m]),or.useEffect(()=>{Ot.current=b;},[b]),or.useEffect(()=>{Ut.current=fe;},[fe]);let yo=or.useRef(()=>Ut.current),xo=or.useMemo(()=>xr((t,d)=>zt.current?.(t,d),(t,d)=>Ot.current?.(t,d),yo.current),[]),No=or.useMemo(()=>Nr,[]),pe=or.useRef(P);or.useEffect(()=>{pe.current=P;},[P]);let U=or.useRef(j);or.useEffect(()=>{U.current=j;},[j]),or.useEffect(()=>{F(M);},[M,F]),or.useEffect(()=>{D(C);},[C,D]),or.useEffect(()=>{$&&T.setState({nodes:e||[]});},[$,e,T]),or.useEffect(()=>{$&&T.setState({edges:r||[]});},[$,r,T]),or.useEffect(()=>{if(!v||!P||P.length===0)return;let t=P.filter(A=>A.type==="rack");if(t.length===0)return;let d=t.map(A=>{let ie=A.data?.uHeight||42,X=60+ie*20;return (A.position?.y||0)+X}),g=Math.min(...d),f=Math.max(...d);if(f-g<20)return;let u=f,W=P.map(A=>{if(A.type!=="rack")return A;let ie=A.data?.uHeight||42,X=60+ie*20,V=(A.position?.y||0)+X,Z=u-V;return Math.abs(Z)<5?A:{...A,position:{x:A.position?.x||0,y:(A.position?.y||0)+Z}}});W.some((A,ee)=>A.position!==P[ee].position)&&F(W);},[v,P,F]);let O=or.useCallback(t=>pe.current.find(d=>d.id===t),[]),ze=or.useCallback((t,d)=>{if(!t||!d)return;let g=O(t);if(!g)return;if(g.type==="tube"&&d.startsWith("fiber-")){let k=d.replace("fiber-",""),u=parseInt(k,10);if(u>=1&&u<=24){let W=Ht(u),B=u>12;return {color:W,striped:B}}}if((g.type==="cable"||g.type==="tube")&&d.startsWith("tube-")){let k=d.replace("tube-",""),u=parseInt(k,10);if(u>=1&&u<=24){let W=ae(u),B=u>12;return {color:W,striped:B}}}let f=g.data;if(f.color)return {color:f.color}},[O]);or.useEffect(()=>{D(t=>t.map(d=>{let g=E(d);return {...d,zIndex:g,style:{...d.style,zIndex:g}}}));},[P,D,E]),or.useEffect(()=>{let t=P.map(g=>{if(g.type==="splice"&&g.parentId&&g.data.holderPosition&&(!g.position||g.position.x===0&&g.position.y===0)){let f=O(g.parentId);if(f&&f.type==="splice-tray"){let k=Fe(f,g.data.holderPosition);return {...g,position:k}}}if(g.type==="device"&&g.parentId&&g.data.uPosition&&(!g.position||g.position.x===0&&g.position.y===0)){let f=O(g.parentId);if(f){let k=He(f,g.data.uPosition);return {...g,position:k}}}return g});t.some((g,f)=>g.position!==P[f].position)&&F(t);},[P,F,O]);let wo=or.useCallback(t=>{let d=t.map(g=>{if(g.type==="position"&&g.position){let f=O(g.id);if(f&&f.type==="splice"&&f.parentId){let k=O(f.parentId);if(k&&k.type==="splice-tray"){let u=kt(f,k,g.position,pe.current);if(u.holderPosition!==void 0){let W={...f,data:{...f.data,holderPosition:u.holderPosition}};F(B=>B.map(A=>A.id===f.id?W:A));}return {...g,position:{x:u.x,y:u.y}}}}if(f&&f.type==="device"&&f.parentId){let k=O(f.parentId);if(k){let u=nt(f,k,g.position,pe.current);if(u.uPosition!==void 0){let W={...f,data:{...f.data,uPosition:u.uPosition}};F(B=>B.map(A=>A.id===f.id?W:A));}return {...g,position:{x:u.x,y:u.y}}}}if(f&&f.type==="device"&&f.parentId){let k=O(f.parentId);if(k){let u=k;if(!Qe(g.position,u)){let W=g.position.x+u.position.x,B=g.position.y+u.position.y,A={...f,parentId:void 0,extent:void 0,data:{...f.data,uPosition:void 0}};return F(ee=>ee.map(ie=>ie.id===f.id?A:ie)),{...g,position:{x:W,y:B}}}}}}return g});Y(d);},[Y,F,O]),ko=or.useCallback((t,d)=>{Ue(null);},[]),vo=or.useCallback((t,d,g)=>{if(d.type==="device"&&!d.parentId){let f=pe.current.filter(u=>u.type==="rack").map(u=>u),k=et(d.position,f);Ue(k?.id??null);}else Ue(null);},[]),Po=or.useCallback((t,d,g)=>{if(d.type==="device"&&!d.parentId){let f=pe.current.filter(u=>u.type==="rack").map(u=>u),k=et(d.position,f);if(k){let u=d.position.x-k.position.x,W=d.position.y-k.position.y,B={...d,parentId:k.id,extent:"parent",position:{x:u,y:W},data:{...d.data,uPosition:1}},A=pe.current.map(ee=>ee.id===d.id?B:ee);F(A),$||T.setState({nodes:A});}}Ue(null);},[F,$,T]),So=or.useCallback(t=>{if(!t.source||!t.target||!t.sourceHandle||!t.targetHandle)return true;let d=O(t.source),g=O(t.target);if(d?.type==="tube"&&g?.type==="tube"&&t.sourceHandle.startsWith("fiber-")&&t.targetHandle.startsWith("fiber-"))return a&&console.log("Connection rejected: Cannot connect fibres within tubes",t),false;if(d?.type==="tube"&&t.sourceHandle.startsWith("fiber-")&&(g?.type==="cable"||g?.type==="tube")&&t.targetHandle.startsWith("tube-"))return a&&console.log("Connection rejected: Cannot connect individual fibre to cable/tube tube handle",t),false;if((d?.type==="cable"||d?.type==="tube")&&t.sourceHandle.startsWith("tube-")&&g?.type==="tube"&&t.targetHandle.startsWith("fiber-"))return a&&console.log("Connection rejected: Cannot connect cable/tube tube handle to individual fibre",t),false;if(g?.type==="splice"&&(t.targetHandle==="left"||t.targetHandle==="right"))return U.current.find(u=>u.target===t.target&&u.targetHandle===t.targetHandle||u.source===t.target&&u.sourceHandle===t.targetHandle)?(a&&console.log("Splice handle already connected, will replace",t),true):(a&&console.log("Allowing connection to splice handle",t),true);if(d?.type==="tube"&&t.sourceHandle.startsWith("fiber-"))return g?.type!=="splice"?(a&&console.log("Connection rejected: Tube fiber handles can only connect to splices",t),false):U.current.find(u=>u.source===t.source&&u.sourceHandle===t.sourceHandle)?(a&&console.log("Tube fiber handle already connected, will replace",t),true):(a&&console.log("Allowing connection from tube fiber handle to splice",t),true);if((d?.type==="cable"||d?.type==="tube")&&t.sourceHandle.startsWith("tube-"))return t.targetHandle.startsWith("tube-")?U.current.find(u=>u.source===t.source&&u.sourceHandle===t.sourceHandle)?(a&&console.log("Tube-level handle already connected, will replace",t),true):(a&&console.log("Allowing connection from tube-level handle to tube handle",t),true):(a&&console.log("Connection rejected: Tube handles can only connect to other tube handles",t),false);if(d?.type==="splice"&&t.sourceHandle==="right")return U.current.find(u=>u.source===t.source&&u.sourceHandle===t.sourceHandle||u.target===t.source&&u.targetHandle===t.sourceHandle)&&a&&console.log("Splice source handle already connected, will replace",t),true;if(g?.type==="tube"&&t.targetHandle.startsWith("fiber-"))return d?.type!=="splice"?(a&&console.log("Connection rejected: Tube fiber handles can only connect from splices",t),false):U.current.find(u=>u.target===t.target&&u.targetHandle===t.targetHandle)?(a&&console.log("Tube fiber target handle already connected, will replace",t),true):(a&&console.log("Allowing connection from splice to tube fiber handle",t),true);if((g?.type==="cable"||g?.type==="tube")&&t.targetHandle.startsWith("tube-"))return t.sourceHandle.startsWith("tube-")?U.current.find(u=>u.target===t.target&&u.targetHandle===t.targetHandle)?(a&&console.log("Tube-level target handle already connected, will replace",t),true):(a&&console.log("Allowing connection from tube handle to tube-level handle",t),true):(a&&console.log("Connection rejected: Tube handles can only connect from other tube handles",t),false);let f=T.validateConnection({source:t.source??null,target:t.target??null,sourceHandle:t.sourceHandle??null,targetHandle:t.targetHandle??null});if(!f.valid&&x){if(t.source&&t.sourceHandle&&U.current.find(u=>u.source===t.source&&u.sourceHandle===t.sourceHandle))return a&&console.log("Source handle has existing edge, will replace",t),true;if(t.target&&t.targetHandle&&U.current.find(u=>u.target===t.target&&u.targetHandle===t.targetHandle))return a&&console.log("Target handle has existing edge, will replace",t),true}return a&&!f.valid&&console.log("Connection rejected by store validation:",f.reason,t),f.valid},[O,T,a,x]),Ho=or.useCallback(t=>{let d=O(t.source),g=O(t.target),f=d?.type==="vertical-pdu",k=d?.data,u=d?.type==="device"&&k?.deviceType==="switch",W=!!t.targetHandle&&(t.targetHandle.startsWith("pwr")||t.targetHandle.startsWith("power")),B=!!t.targetHandle&&(t.targetHandle.startsWith("net-")||t.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(t.targetHandle)),A=d?.type==="tube"&&g?.type==="cable",ee=d?.type==="cable"&&g?.type==="tube",ie=A||ee,X;f&&W?X="power":ie?X=N?"smoothstep":"fiber":X="fiber";let V;if((X==="fiber"||X==="smoothstep")&&!f){let S=ze(t.source,t.sourceHandle);S&&(V={color:S.color,striped:S.striped});}if(g?.type==="splice"&&(t.targetHandle==="left"||t.targetHandle==="right")&&t.target&&t.targetHandle){let S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"target",data:V});if(S){D(S);return}if(t.targetHandle==="right"&&(S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"source",data:V}),S)){D(S);return}}if(d?.type==="splice"&&t.sourceHandle==="right"&&t.source&&t.sourceHandle){let S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"source",data:V});if(S){D(S);return}if(S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"target",data:V}),S){D(S);return}}if(d?.type==="tube"&&t.sourceHandle?.startsWith("fiber-")&&t.source&&t.sourceHandle){let S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"source",data:V});if(S){D(S);return}}if(g?.type==="tube"&&t.targetHandle?.startsWith("fiber-")&&t.target&&t.targetHandle){let S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"target",data:V});if(S){D(S);return}}if((d?.type==="cable"||d?.type==="tube")&&t.sourceHandle?.startsWith("tube-")&&t.source&&t.sourceHandle){let S=q({edges:U.current,connection:t,edgeType:X,selectEdgeZIndex:E,findBy:"source",data:V});if(S){D(S);return}}if((g?.type==="cable"||g?.type==="tube")&&t.targetHandle?.startsWith("tube-")&&t.target&&t.targetHandle){let S=q({edges:U.current,connection:t,edgeType:X,selectEdgeZIndex:E,findBy:"target",data:V});if(S){D(S);return}}if(f&&W&&t.target&&t.targetHandle){let S=q({edges:U.current,connection:t,edgeType:"power",selectEdgeZIndex:E,findBy:"target",data:V});if(S){D(S);return}}if(u&&B&&t.target&&t.targetHandle){let S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"target",data:V});if(S){D(S);return}}let Z=T.validateConnection({source:t.source??null,target:t.target??null,sourceHandle:t.sourceHandle??null,targetHandle:t.targetHandle??null});if(!Z.valid){if(x){if(t.source&&t.sourceHandle){let S=q({edges:U.current,connection:t,edgeType:X,selectEdgeZIndex:E,findBy:"source",data:V});if(S){D(S);return}}if(t.target&&t.targetHandle){let S=q({edges:U.current,connection:t,edgeType:X,selectEdgeZIndex:E,findBy:"target",data:V});if(S){D(S);return}}}if(f&&t.source&&t.sourceHandle){let S=q({edges:U.current,connection:t,edgeType:W?"power":"fiber",selectEdgeZIndex:E,findBy:"source",data:V});if(S){D(S);return}}if(u&&t.source&&t.sourceHandle){let S=q({edges:U.current,connection:t,edgeType:"fiber",selectEdgeZIndex:E,findBy:"source",data:V});if(S){D(S);return}}a&&console.warn(`Connection rejected: ${Z.reason}`);return}let Ie={...t,type:X,zIndex:E({...t,id:"temp-id"}),data:V};D(S=>{let Oe=reactflow.addEdge(Ie,S),oe=Oe[Oe.length-1];return oe&&(Mt(rt=>new Set(rt).add(oe.id)),setTimeout(()=>{Mt(rt=>{let Lt=new Set(rt);return Lt.delete(oe.id),Lt});},1e3)),Oe});},[D,T,E,O,a,ze,x,N]),Co=or.useCallback((t,d)=>{if(!d.source||!d.target||!d.sourceHandle||!d.targetHandle)return;let g=t.sourceHandle||"",f=t.targetHandle||"",k=d.sourceHandle||"",u=d.targetHandle||"";if(g.startsWith("tube-")&&k!==g){a&&console.log("Edge update blocked: Cannot disconnect tube handle",{oldEdge:t,newConnection:d});return}if(f.startsWith("tube-")&&u!==f){a&&console.log("Edge update blocked: Cannot disconnect tube handle",{oldEdge:t,newConnection:d});return}let W=O(d.source),B=O(d.target),A=W?.type==="vertical-pdu",ee=!!d.targetHandle&&(d.targetHandle.startsWith("pwr")||d.targetHandle.startsWith("power")),ie=W?.type==="tube"&&B?.type==="cable",X=W?.type==="cable"&&B?.type==="tube",V=ie||X,Z;A&&ee?Z="power":V?Z=N?"smoothstep":"fiber":Z="fiber";let Ie;if((Z==="fiber"||Z==="smoothstep")&&!A){let S=ze(d.source,d.sourceHandle);S&&(Ie={color:S.color,striped:S.striped});}D(S=>S.map(oe=>oe.id===t.id?{...oe,source:d.source,target:d.target,sourceHandle:d.sourceHandle,targetHandle:d.targetHandle,type:Z,data:Ie!==void 0?{...oe.data,...Ie}:oe.data,zIndex:E({...d,id:oe.id,type:Z}),style:{...oe.style,zIndex:E({...d,id:oe.id,type:Z})}}:oe));},[D,O,ze,E,N]),Eo=or.useCallback((t,d)=>{let g=t.metaKey||t.ctrlKey;if(d.type==="tube"&&d.parentId&&!g){let k=Pe().find(u=>u.id===d.parentId&&u.type==="cable");if(k){F(u=>u.map(W=>({...W,selected:W.id===k.id}))),l&&l(k);return}}if(g&&d.type==="device"){let f=d.data||{},k=f.view||(Array.isArray(f.rearPorts)&&f.rearPorts.length>0?"rear":"front"),u=k==="front"?"rear":"front";a&&console.log(`Command+click: Toggling device ${d.id} from ${k} to ${u}`),m&&m(d.id,u),l&&l(d);}else l&&l(d);},[m,l,a,Pe,F]),Ro=or.useCallback(()=>{},[]),Do=or.useCallback((t,d)=>{p&&p(d);},[p]),[ce,ot]=or.useState(null),[Bt,Mt]=or.useState(new Set);reactflow.useOnSelectionChange({onChange:({nodes:t})=>{if(t&&t.length===1){let d=t[0];if(d.type==="tube"&&d.parentId){let f=Pe().find(k=>k.id===d.parentId&&k.type==="cable");if(f){ot(f),F(k=>k.map(u=>({...u,selected:u.id===f.id}))),l&&l(f);return}}ot(d),l&&l(d);}else ot(null),l&&l(null);}});let To=or.useCallback((t,{nodeId:d,handleType:g})=>{a&&console.log("Connection started from",{nodeId:d,handleType:g});},[a]),Io=or.useCallback(t=>{a&&console.log("Connection ended",t);},[a]),$o=or.useCallback(()=>{if(!ce)return;let t=O(ce.id);if(t){if(t.type==="rack"){let f=((t.data||{}).face||"front")==="front"?"rear":"front";b?(b(t.id,f),m&&Pe().filter(u=>u.parentId===t.id).forEach(u=>{m(u.id,f);})):F(k=>k.map(u=>u.id===t.id?{...u,data:{...u.data,face:f}}:u.parentId===t.id?{...u,data:{...u.data,view:f}}:u));return}if(t.type==="device"){let d=t.data||{},g=Array.isArray(d.rearPorts)&&d.rearPorts.length>0,f=Array.isArray(d.ports)&&d.ports.length>0,u=(d.view||(g&&!f?"rear":"front"))==="front"?"rear":"front";m?m(t.id,u):F(W=>W.map(B=>B.id===t.id?{...B,data:{...B.data,view:u}}:B));}}},[ce,O,b,m,F]),Fo=or.useMemo(()=>j.map(t=>{let d=t,g=O(String(d.source)),f=O(String(d.target)),k=Je(d.sourceHandle||"",g),u=Je(d.targetHandle||"",f),W=g&&g.data?.view,B=f&&f.data?.view,A=g?.type==="device"&&W==="rear",ee=f?.type==="device"&&B==="rear",Z=A&&k!=="rear"&&(ee&&u!=="rear")?{...t.style,opacity:0,pointerEvents:"none",zIndex:0}:t.style;return {...t,style:Z,className:Bt.has(t.id)?"edge-connecting":t.className}}),[j,Bt,O]);return jsxRuntime.jsxs("div",{ref:le,className:`${y||""} ${I==="light"?"react-flow-light":"react-flow-dark"}`,style:{width:"100%",height:"100%",...H},children:[jsxRuntime.jsxs(reactflow.ReactFlow,{nodes:P,edges:Fo,onNodesChange:t=>{wo(t),$?n&&n(pe.current):T.setState({nodes:pe.current});},onEdgesChange:t=>{let d=t.filter(g=>{if(g.type==="remove"){let f=U.current.find(k=>k.id===g.id);if(f){let k=f.sourceHandle||"",u=f.targetHandle||"";if(k.startsWith("tube-")||u.startsWith("tube-"))return a&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",f),false}}return true});d.length>0&&(G(d),$?s&&s(U.current):T.setState({edges:U.current}));},onConnect:Ho,onConnectStart:To,onConnectEnd:Io,onEdgeUpdate:Co,isValidConnection:So,onNodeClick:Eo,onNodeDoubleClick:Ro,onNodeDragStart:ko,onNodeDrag:vo,onNodeDragStop:Po,onEdgeClick:Do,onInit:w,nodeTypes:xo,edgeTypes:No,defaultEdgeOptions:{zIndex:1e3,reconnectable:true},nodesDraggable:true,nodesConnectable:true,elementsSelectable:true,selectNodesOnDrag:false,fitView:true,proOptions:{hideAttribution:true},children:[jsxRuntime.jsx(reactflow.Background,{color:I==="light"?"#e5e5e5":"#2a2a2a"}),jsxRuntime.jsx(reactflow.Controls,{}),jsxRuntime.jsx(reactflow.MiniMap,{}),jsxRuntime.jsx(reactflow.Panel,{position:"bottom-right",className:"react-networks-attribution",children:jsxRuntime.jsx("a",{href:"https://github.com/MP70/react-networks",target:"_blank",rel:"noopener noreferrer",className:"react-networks-attribution-link",children:"react-networks"})})]}),L&&jsxRuntime.jsx("button",{className:"download-button",onClick:tt,style:{position:"absolute",top:z.includes("top")?"10px":"auto",bottom:z.includes("bottom")?"10px":"auto",right:z.includes("right")?"10px":"auto",left:z.includes("left")?"10px":"auto",zIndex:1e3,background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:"4px",padding:"0.5rem 0.75rem",fontSize:"0.875rem",cursor:"pointer",transition:"all 0.2s ease",...R},children:h}),ce&&(ce.type==="rack"||ce.type==="device")&&jsxRuntime.jsx("div",{style:{position:"absolute",top:12,right:12,display:"flex",gap:8,zIndex:2e3},children:jsxRuntime.jsx("button",{onClick:t=>{t.preventDefault(),$o();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let t=ce.data;if(ce.type==="rack")return (t?.face||"front")==="front"?"Switch to rear":"Switch to front";{let d=Array.isArray(t?.rearPorts)&&t.rearPorts.length>0,g=Array.isArray(t?.ports)&&t.ports.length>0;return (t?.view||(d&&!g?"rear":"front"))==="front"?"Switch to rear":"Switch to front"}})(),children:(()=>{let t=ce.data;if(ce.type==="rack")return (t?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front";{let d=Array.isArray(t?.rearPorts)&&t.rearPorts.length>0,g=Array.isArray(t?.ports)&&t.ports.length>0;return (t?.view||(d&&!g?"rear":"front"))==="front"?"\u21C4 Rear":"\u21C4 Front"}})()})})]})},kr=e=>jsxRuntime.jsx(reactflow.ReactFlowProvider,{children:jsxRuntime.jsx(wr,{...e})});var go=e=>({id:`rack-${e.id}`,type:"rack",position:{x:0,y:0},data:{label:e.name,status:typeof e.status=="object"&&e.status?e.status.value:e.status,uHeight:e.u_height??e.units??42,inventoryId:e.id,inventoryType:"rack",facilityId:e.facility_id,serial:e.serial,assetTag:e.asset_tag,site:typeof e.site=="object"&&e.site?e.site.name:e.site,role:typeof e.role=="object"&&e.role?e.role.name:e.role,tenant:typeof e.tenant=="object"&&e.tenant?e.tenant.name:e.tenant}}),fo=e=>({id:`device-${e.id}`,type:"device",position:{x:0,y:0},parentId:e.rack?`rack-${typeof e.rack=="object"&&e.rack?e.rack.id:e.rack}`:void 0,extent:e.rack?"parent":void 0,data:{label:e.name,status:typeof e.status=="object"&&e.status?e.status.value:e.status,deviceType:e.device_type?.model??e.model,manufacturer:e.device_type?.manufacturer?.name??e.manufacturer,role:typeof e.device_role=="object"&&e.device_role?e.device_role.name:e.role,uHeight:e.device_type?.u_height??e.u_height??1,uPosition:e.position||1,view:e.face||"front",inventoryId:e.id,inventoryType:"device",primaryIp4:typeof e.primary_ip4=="object"&&e.primary_ip4?e.primary_ip4.address:e.primary_ip4,primaryIp6:typeof e.primary_ip6=="object"&&e.primary_ip6?e.primary_ip6.address:e.primary_ip6,site:typeof e.site=="object"&&e.site?e.site.name:e.site,rack:typeof e.rack=="object"&&e.rack?e.rack.name:e.rack}}),bo=e=>{let r=n=>{if(!n)return;if(typeof n=="string")return n;let s=n.device;return typeof s=="object"&&s?s.id:s},o=r(e.termination_a),i=r(e.termination_b);return {id:`cable-${e.id}`,source:`device-${o}`,target:`device-${i}`,type:"fiber",data:{bandwidth:e.type?.label??e.bandwidth,length:e.length||0,color:e.color,inventoryId:e.id,inventoryType:"cable",status:typeof e.status=="object"&&e.status?e.status.value:e.status,terminationA:typeof e.termination_a=="object"&&e.termination_a?e.termination_a.name:e.termination_a,terminationB:typeof e.termination_b=="object"&&e.termination_b?e.termination_b.name:e.termination_b}}},vr=e=>{let r=[],o=[];return e.racks.forEach(i=>r.push(go(i))),e.devices.forEach(i=>r.push(fo(i))),e.cables.forEach(i=>o.push(bo(i))),{nodes:r,edges:o}},Pr=e=>{let r=e.filter(n=>n.type==="rack"),o=e.filter(n=>n.type==="device"),i=e.filter(n=>!["rack","device"].includes(n.type));return r.forEach((n,s)=>{n.position={x:s*300,y:100};}),o.forEach(n=>{if(n.parentId){let s=r.find(c=>c.id===n.parentId);if(s){let c=n.data.uPosition||1,a=n.data.uHeight||1;n.position={x:s.position.x+50,y:s.position.y+c*20-a*10};}}else n.position={x:Math.random()*400+100,y:Math.random()*200+50};}),i.forEach((n,s)=>{n.position={x:s*150+100,y:300};}),e};var De=class extends Error{constructor(o,i,n,s,c){super(`Device placement conflict: ${i} at U${n}-${n+s-1} in rack ${o}${c?` conflicts with ${c}`:""}`);this.rackId=o;this.deviceId=i;this.uPosition=n;this.uHeight=s;this.conflictWith=c;this.name="DevicePlacementError";}};function At(e,r={}){let o=[],i=[];for(let n of e.devices)n.unit+n.height-1>e.units&&i.push({deviceId:n.id,uPosition:n.unit,uHeight:n.height,rackUHeight:e.units});for(let n=0;n<e.devices.length;n++){let s=e.devices[n],c=s.unit,a=s.unit+s.height-1;for(let l=n+1;l<e.devices.length;l++){let p=e.devices[l],m=p.unit,b=p.unit+p.height-1;c<=b&&a>=m&&o.push({deviceId:s.id,uPosition:s.unit,uHeight:s.height,conflictWith:p.id});}}return {isValid:o.length===0&&i.length===0,conflicts:o,outOfBounds:i}}function mo(e,r,o={}){let{deviceTypeMapping:i={}}=o,n=i[e.type]||"device",s=He(r,e.unit,e.height);return {id:e.id,type:n,position:s,parentId:r.id,extent:"parent",data:{label:e.name,status:"active",deviceType:e.type,uHeight:e.height,uPosition:e.unit,width:e.width||"full",role:e.role,ports:e.ports,rearPorts:e.rearPorts,connections:e.connections}}}function Sr(e){return {id:e.id,type:"rack",position:e.position,data:{label:e.name,status:"active",uHeight:e.units,uNumberingDirection:e.uNumberingDirection||"bottom-up",customHeaderText:e.customHeaderText,ports:[]}}}function Hr(e,r={}){let{conflictPolicy:o="strict",validatePlacements:i=true}=r,n=[],s=[];if(i)for(let c of e){let a=At(c,r);if(!a.isValid&&o==="strict"){let l=[];throw a.conflicts.forEach(p=>{l.push(`Device ${p.deviceId} at U${p.uPosition}-${p.uPosition+p.uHeight-1} conflicts with ${p.conflictWith}`);}),a.outOfBounds.forEach(p=>{l.push(`Device ${p.deviceId} at U${p.uPosition}-${p.uPosition+p.uHeight-1} exceeds rack height (${p.rackUHeight}U)`);}),new De(c.id,a.conflicts[0]?.deviceId||a.outOfBounds[0]?.deviceId||"unknown",a.conflicts[0]?.uPosition||a.outOfBounds[0]?.uPosition||1,a.conflicts[0]?.uHeight||a.outOfBounds[0]?.uHeight||1)}}for(let c of e){let a=Sr(c);n.push(a);for(let l of c.devices)try{let p=mo(l,a,r);s.push(p);}catch(p){if(o==="strict")throw p;if(o==="nearest"){let m=Le(a,{id:l.id,data:{label:l.name,uHeight:l.height}},s,l.unit);if(m!==l.unit){console.warn(`Device ${l.id} moved from U${l.unit} to U${m} due to conflict`);let b={...l,unit:m},y=mo(b,a,r);s.push(y);}else throw new De(c.id,l.id,l.unit,l.height)}}}return n.push(...s),n}function Cr(e){let r=[],o=e.filter(i=>i.type==="rack");for(let i of o){let s=e.filter(c=>c.type==="device"&&c.parentId===i.id).map(c=>({id:c.id,name:c.data.label,unit:c.data.uPosition||1,height:c.data.uHeight||1,type:c.data.deviceType||"server",width:c.data.width,ports:c.data.ports,connections:c.data.connections}));r.push({id:i.id,name:i.data.label,position:i.position,units:i.data.uHeight||42,uNumberingDirection:i.data.uNumberingDirection||"bottom-up",customHeaderText:i.data.customHeaderText,devices:s});}return r}function Er(e,r,o,i){return e.map(n=>n.id!==r?n:{...n,devices:n.devices.map(s=>s.id!==o?s:{...s,unit:i})})}function Rr(e,r,o,i={}){let{conflictPolicy:n="strict"}=i;return e.map(s=>{if(s.id!==r)return s;if(n==="strict"&&!At({...s,devices:[...s.devices,o]},i).isValid)throw new De(r,o.id,o.unit,o.height);return {...s,devices:[...s.devices,o]}})}function Dr(e,r,o){return e.map(i=>i.id!==r?i:{...i,devices:i.devices.filter(n=>n.id!==o)})}var Te=class extends Error{constructor(o,i,n,s){super(`Splice placement conflict: ${i} at holder ${n} in tray ${o}${s?` conflicts with ${s}`:""}`);this.trayId=o;this.spliceId=i;this.holder=n;this.conflictWith=s;this.name="SplicePlacementError";}};function Wt(e,r={}){let o=[],i=[];for(let n of e.splices)(n.holder<1||n.holder>ye)&&i.push({spliceId:n.id,holder:n.holder,max:ye});for(let n=0;n<e.splices.length;n++){let s=e.splices[n];for(let c=n+1;c<e.splices.length;c++){let a=e.splices[c];s.holder===a.holder&&o.push({spliceId:s.id,holder:s.holder,conflictWith:a.id});}}return {isValid:o.length===0&&i.length===0,conflicts:o,outOfBounds:i}}function ho(e,r){let o=Fe(r,e.holder);return {id:e.id,type:"splice",position:o,parentId:r.id,extent:"parent",data:{label:e.name,holderPosition:e.holder,lossDb:e.lossDb}}}function Tr(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function Ir(e,r={}){let{conflictPolicy:o="strict",validatePlacements:i=true}=r,n=[],s=[];if(i)for(let c of e){let a=Wt(c,r);if(!a.isValid&&o==="strict"){let l=[];throw a.conflicts.forEach(p=>{l.push(`Splice ${p.spliceId} at holder ${p.holder} conflicts with ${p.conflictWith}`);}),a.outOfBounds.forEach(p=>{l.push(`Splice ${p.spliceId} at holder ${p.holder} is out of bounds (max: ${p.max})`);}),new Te(c.id,a.conflicts[0]?.spliceId||a.outOfBounds[0]?.spliceId||"unknown",a.conflicts[0]?.holder||a.outOfBounds[0]?.holder||1)}}for(let c of e){let a=Tr(c);n.push(a);for(let l of c.splices)try{let p=ho(l,a);s.push(p);}catch(p){if(o==="strict")throw p;if(o==="nearest"){let m=[...n,...s],b=Ze(a,{id:l.id,data:{label:l.name,holderPosition:l.holder}},m,l.holder);if(b!==l.holder){console.warn(`Splice ${l.id} moved from holder ${l.holder} to holder ${b} due to conflict`);let y={...l,holder:b},H=ho(y,a);s.push(H);}else throw new Te(c.id,l.id,l.holder)}}}return n.push(...s),n}function $r(e){let r=[],o=e.filter(i=>i.type==="splice-tray");for(let i of o){let s=e.filter(c=>c.type==="splice"&&c.parentId===i.id).map(c=>({id:c.id,name:c.data.label,holder:c.data.holderPosition||1,lossDb:c.data.lossDb}));r.push({id:i.id,name:i.data.label,position:i.position,splices:s});}return r}function Fr(e,r,o,i){return e.map(n=>n.id!==r?n:{...n,splices:n.splices.map(s=>s.id!==o?s:{...s,holder:i})})}function _r(e,r,o,i={}){let{conflictPolicy:n="strict"}=i;return e.map(s=>{if(s.id!==r)return s;if(n==="strict"&&!Wt({...s,splices:[...s.splices,o]},i).isValid)throw new Te(r,o.id,o.holder);return {...s,splices:[...s.splices,o]}})}function Ar(e,r,o){return e.map(i=>i.id!==r?i:{...i,splices:i.splices.filter(n=>n.id!==o)})}
2
+ exports.CableNode=Rt;exports.DeviceNode=ft;exports.DevicePlacementError=De;exports.FIBER_COLORS_12=ro;exports.FiberEdge=ct;exports.FiberNode=at;exports.NetworkDiagram=kr;exports.POWER_CONNECTORS=pt;exports.PowerEdge=lt;exports.RackNode=st;exports.SpliceNode=yt;exports.SplicePlacementError=Te;exports.SpliceTrayNode=St;exports.TubeNode=Ct;exports.VerticalPDU=bt;exports.Width=qt;exports.addDeviceToRack=Rr;exports.addSpliceToTray=_r;exports.baseColorFor=ae;exports.buildNodesFromRackConfig=Hr;exports.buildNodesFromSpliceConfig=Ir;exports.calculateDevicePositionFromU=He;exports.calculateSplicePositionFromNumber=Fe;exports.createNetworkDiagramStore=Dt;exports.createRackConfigFromNodes=Cr;exports.createSpliceConfigFromNodes=$r;exports.fiberSolidOrStriped=_e;exports.findNearestRack=et;exports.findNextAvailableHolderPosition=Ze;exports.findNextAvailableUPosition=Le;exports.generateLayout=Pr;exports.getConnectorConfig=Ge;exports.getDeviceConnectorType=Xe;exports.getFiberColor=Ht;exports.getPDUPortType=ut;exports.getPowerPortStyle=Ce;exports.getRackBounds=lo;exports.getStatusColor=se;exports.inventoryCableToNetworkEdge=bo;exports.inventoryDeviceToNetworkNode=fo;exports.inventoryRackToNetworkNode=go;exports.inventoryToNetworkDiagram=vr;exports.isHighPowerConnector=Jo;exports.isPointInRack=Qe;exports.isStriped=no;exports.isUPositionAvailable=it;exports.removeDeviceFromRack=Dr;exports.removeSpliceFromTray=Ar;exports.replaceEdge=q;exports.snapToSplicePosition=kt;exports.snapToUPosition=nt;exports.updateDeviceUPosition=Vt;exports.updateDeviceUPositionInSchema=Er;exports.updateSpliceHolderPosition=Fr;exports.useDiagramEdges=$t;exports.useDiagramNodes=It;exports.useNetworkDiagram=ir;exports.validateAndSnapDevice=Ao;exports.validateRackDevicePlacements=At;exports.validateSplicePlacements=Wt;//# sourceMappingURL=index.js.map
2
3
  //# sourceMappingURL=index.js.map