@mp70/react-networks 0.2.0-rc.0 → 0.3.0-alpha.0

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,3 +1,3 @@
1
- 'use strict';var lt=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 lt__default=/*#__PURE__*/_interopDefault(lt);var Me=20,et=60,xo=300,Zt=5;function Sn(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function En(e,t){let r=Sn(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function Rn(e){return Sn(e)==="light"?"#e5e5e5":"#2a2a2a"}function Tn(e,t){return {width:"100%",height:"100%",...t}}var ba=["device","server","switch","router"],ha=new Set(ba);function qt(e){return typeof e=="string"&&ha.has(e)}function We(e){return !!e&&qt(e.type)}var ma=()=>"bottom-up",ht=e=>e.data.uNumberingDirection||ma(),ko=(e,t,o)=>o==="bottom-up"?t-e+1:e,vo=(e,t,o)=>o==="bottom-up"?t-e+1:e;var Co=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let i=e.data.uHeight||1,a=t.data.uHeight||42,d=ht(t),s=60,l=o.y-s,p=Math.round(l/20)+1,m;d==="bottom-up"?m=ko(p,a,d)-i+1:m=ko(p,a,d);let f=a-i+1,c=Math.max(1,Math.min(f,m));if(d==="top-down"&&m<=1&&(c=1),!ur(t,e,c,r)){let x=Ho(t,e,r,c);x!==c&&(c=x);}let b;if(d==="bottom-up"){let x=c+i-1,k=vo(x,a,d);b=s+(k-1)*20-1;}else {let x=vo(c,a,d);b=s+(x-1)*20-1;}return {x:o.x,y:b,uPosition:c}},ur=(e,t,o,r)=>{let i=t.data.uHeight||1,a=e.data.uHeight||42;if(o<1||o+i-1>a)return false;let d=r.filter(s=>qt(s.type)&&s.parentId===e.id&&s.id!==t.id);for(let s of d){let l=s.data.uPosition||1,p=s.data.uHeight||1,m=o,f=o+i-1,c=l,b=l+p-1;if(m<=b&&f>=c)return false}return true},Ho=(e,t,o,r=1)=>{let i=t.data.uHeight||1,a=e.data.uHeight||42;for(let d=r;d<=a-i+1;d++)if(ur(e,t,d,o))return d;return 1},_t=(e,t,o=1)=>{let r=60,i=ht(e),a=e.data.uHeight||42,d=vo(t,a,i),s;if(i==="bottom-up"){let l=t+o-1,p=vo(l,a,i);s=r+(p-1)*20-1;}else s=r+(d-1)*20-1;return {x:0,y:s}},In=(e,t,o)=>{let r=e.data.uHeight||1,i=_t(t,o,r),a=Array.isArray(e.data.ports)?e.data.ports:void 0;return {...e,position:i,data:{...e.data,ports:a,uPosition:o}}},ya=(e,t)=>{let o=e.data.uPosition||1,r=e.data.uHeight||1,i=t.data.uHeight||42,a=Math.max(1,Math.min(i-r+1,o));return a!==o?In(e,t,a):e};function Ke(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var pr=({data:e,selected:t,id:o,onViewChange:r,onRackFaceChange:i,isDragOver:a=false})=>{let{label:d,ports:s=0,status:l="active",uHeight:p=42,face:m="front",customHeaderText:f,rackWidthPx:c}=e,b=c||300,{getNodes:x,setNodes:k}=reactflow.useReactFlow(),C=x(),[v,T]=lt.useState(e.showUMarkers!==void 0?e.showUMarkers:true),E=()=>{let _=ht({data:e})==="bottom-up"?"top-down":"bottom-up";k(S=>S.map(D=>D.id===o?{...D,data:{...D.data,uNumberingDirection:_}}:D));},F=()=>{let w=m==="front"?"rear":"front";i?i(o,w):r?C.filter(S=>S.parentId===o).forEach(S=>{r(S.id,w);}):k(_=>_.map(S=>S.id===o?{...S,data:{...S.data,face:w}}:S.parentId===o?{...S,data:{...S.data,view:w}}:S));},y=()=>{let w=[],_=60,S=ht({data:e});for(let D=1;D<=p;D++){let A=_+(D-1)*20-4,U=ko(D,p,S);w.push(jsxRuntime.jsx("div",{style:{position:"absolute",left:"-35px",top:`${A}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:U},D));}return w};return jsxRuntime.jsxs("div",{className:`rack-node ${t?"selected":""} ${a?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${Ke(l)}`,borderRadius:"8px",padding:0,width:`${b}px`,height:`${60+p*20}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:a?"0 0 20px #3b82f6, 0 0 40px #3b82f6, 0 0 60px #3b82f6":t?"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:d}),jsxRuntime.jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[f?jsxRuntime.jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:f}):jsxRuntime.jsxs("span",{children:[typeof s=="number"?s: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:w=>{w.stopPropagation();},onMouseDown:w=>{w.stopPropagation();},onClick:w=>{w.stopPropagation(),w.preventDefault(),T(!v);},style:{background:v?"#10b981":"#374151",color:v?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${v?"Hide":"Show"} U markers`,children:"U"}),jsxRuntime.jsx("button",{onPointerDown:w=>{w.stopPropagation();},onMouseDown:w=>{w.stopPropagation();},onClick:w=>{w.stopPropagation(),w.preventDefault(),E();},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 ${ht({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:ht({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),jsxRuntime.jsx("button",{onPointerDown:w=>{w.stopPropagation();},onMouseDown:w=>{w.stopPropagation();},onClick:w=>{w.stopPropagation(),w.preventDefault(),F();},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"}}),v&&jsxRuntime.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:y()})]})};var gr=({data:e,selected:t})=>{let{label:o,status:r="active"}=e;return jsxRuntime.jsxs("div",{className:`fiber-node ${t?"selected":""}`,style:{background:"#1f2937",border:`2px solid ${Ke(r)}`,borderRadius:"50%",width:"60px",height:"60px",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontFamily:"monospace",fontSize:"10px",fontWeight:"bold",boxShadow:t?"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:Ke(r),borderRadius:"50%"}})]})};var Dn=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function De(e){let t=(e-1)%12;return Dn[t]}function yt(e){return e>12}function tt(e,t){let o=t?.base??De(e),r=t?.striped??yt(e),i=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:i}}function fr(e){let t=tt(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function wt(e){return De(e)}function ot(e){return e.map(t=>({base:De(t),striped:yt(t)}))}function va(e,t,o,r,i,a,d,s){let l=ot(o),p=l.length,m=r?1.2:1,f=!!s?.highlight,c=r?2:1.5,b=s?.highlightWidth??c*3,x=s?.highlightColor??l[0]?.base??"#22d3ee";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[f&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:t,style:{...i,stroke:x,strokeWidth:b,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${c}px`,"--rn-edge-highlight-to":`${b}px`}}),l.map((k,C)=>{let T=(p-C)*m;return jsxRuntime.jsx("path",{d:t,stroke:k.base,strokeWidth:T,fill:"none",strokeLinecap:"butt",opacity:k.striped?.9:1,style:i},`${e}-ribbon-${C}`)}),l.some(k=>k.striped)&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...i,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:r&&s&&(s.bandwidth||s.length)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${a}px,${d}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${l[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[s.bandwidth&&jsxRuntime.jsx("div",{children:s.bandwidth}),s.length&&jsxRuntime.jsxs("div",{children:[s.length,"m"]}),jsxRuntime.jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var Eo=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,data:s,selected:l,style:p={},className:m})=>{let[f,c,b]=reactflow.getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:i,targetPosition:d}),{bandwidth:x,length:k,color:C="#00FFFF",striped:v=false,ribbonFiberIds:T,isRibbon:E,highlight:F,highlightColor:y,highlightWidth:w}=s||{},_=!!F;if((E||T&&T.length>=6&&T.length<=12)&&T)return va(e,f,T,l??false,p??{},c,b,s);let D=l?3:2,A=w??D*3,U={...p,stroke:C,strokeWidth:D,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[_&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:f,style:{...p,stroke:y??C,strokeWidth:A,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${D}px`,"--rn-edge-highlight-to":`${A}px`}}),jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:f,style:U}),v&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-stripe`,path:f,style:{...p,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:l&&s&&(x||k)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${c}px,${b}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${C}`,pointerEvents:"none",zIndex:9999},children:[x&&jsxRuntime.jsx("div",{children:x}),k&&jsxRuntime.jsxs("div",{children:[k,"m"]})]})})]})};var br=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,style:s={},data:l,markerEnd:p})=>{let[m]=reactflow.getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:i,targetPosition:d}),f=l?.connectorType||"C13";return jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:m,markerEnd:p,style:(()=>{let b={stroke:l?.color||"#f59e0b",strokeWidth:f==="C19"?5:3,strokeLinecap:"round",strokeLinejoin:"round",...s};return f==="C19"?{...b,strokeDasharray:"none"}:{...b,strokeDasharray:"6,3"}})()})};function Ra(e,t,o,r,i,a,d,s,l,p,m){let f=ot(s),c=f.length,b=l?1.8:1.5,x=!!m?.highlight,k=l?3:2.5,C=m?.highlightWidth??k*3,v=m?.highlightColor??f[0]?.base??"#22d3ee",[T,E,F]=reactflow.getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[x&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:T,style:{...p,stroke:v,strokeWidth:C,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${k}px`,"--rn-edge-highlight-to":`${C}px`}}),f.map((y,w)=>{let S=(c-w)*b;return jsxRuntime.jsx("path",{d:T,stroke:y.base,strokeWidth:S,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:p},`${e}-ribbon-${w}`)}),f.some(y=>y.striped)&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-ribbon-stripe`,path:T,style:{...p,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:l&&m&&(m.bandwidth||m.length)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${E}px,${F}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${f[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[m.bandwidth&&jsxRuntime.jsx("div",{children:m.bandwidth}),m.length&&jsxRuntime.jsxs("div",{children:[m.length,"m"]}),jsxRuntime.jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[s.length,"F"]})]})})]})}var Mn=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,data:s,selected:l,style:p={},...m})=>{let{color:f="#00FFFF",ribbonFiberIds:c,isRibbon:b,highlight:x,highlightColor:k,highlightWidth:C}=s||{},v=!!x;if((b||c&&c.length>=6&&c.length<=12)&&c)return Ra(e,t,o,r,i,a,d,c,l??false,p??{},s);let E=l?4:3,F=C??E*3,y={...p,stroke:f,strokeWidth:E};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[v&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:reactflow.getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d})[0],style:{...p,stroke:k??f,strokeWidth:F,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${E}px`,"--rn-edge-highlight-to":`${F}px`}}),jsxRuntime.jsx(reactflow.SmoothStepEdge,{...m,id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,data:s,selected:l,style:y})]})};function Ia({sourceX:e,sourceY:t,targetX:o,targetY:r,sourcePosition:i,targetPosition:a}){let d=i===reactflow.Position.Left||i===reactflow.Position.Right,s;if(d){let l=(e+o)/2;s=`M ${e},${t} L ${l},${t} L ${l},${r} L ${o},${r}`;}else {let l=(t+r)/2;s=`M ${e},${t} L ${e},${l} L ${o},${l} L ${o},${r}`;}return s}function Da(e,t,o,r,i,a){let d=ot(o),s=d.length,l=r?1.2:1,p=!!a?.highlight,m=r?2:1.5,f=a?.highlightWidth??m*3,c=a?.highlightColor??d[0]?.base??"#22d3ee",b=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),x=b?(parseFloat(b[1])+parseFloat(b[3]))/2:0,k=b?(parseFloat(b[2])+parseFloat(b[4]))/2:0;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[p&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:t,style:{...i,stroke:c,strokeWidth:f,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${m}px`,"--rn-edge-highlight-to":`${f}px`}}),d.map((C,v)=>{let E=(s-v)*l;return jsxRuntime.jsx("path",{d:t,stroke:C.base,strokeWidth:E,fill:"none",strokeLinecap:"butt",opacity:C.striped?.9:1,style:i},`${e}-ribbon-${v}`)}),d.some(C=>C.striped)&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...i,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:r&&a&&(a.bandwidth||a.length)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${x}px,${k}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${d[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[a.bandwidth&&jsxRuntime.jsx("div",{children:a.bandwidth}),a.length&&jsxRuntime.jsxs("div",{children:[a.length,"m"]}),jsxRuntime.jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var On=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,data:s,selected:l,style:p={},...m})=>{let{color:f="#00FFFF",striped:c=false,ribbonFiberIds:b,isRibbon:x,highlight:k,highlightColor:C,highlightWidth:v}=s||{},T=!!k,E=Ia({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:i,targetPosition:d});if((x||b&&b.length>=6&&b.length<=12)&&b)return Da(e,E,b,l??false,p??{},s);let y=l?3:2,w=v??y*3,_={...p,stroke:f,strokeWidth:y,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[T&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:E,style:{...p,stroke:C??f,strokeWidth:w,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${y}px`,"--rn-edge-highlight-to":`${w}px`}}),jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:E,style:_}),c&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-stripe`,path:E,style:{...p,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var Bn=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,style:s={},data:l,markerEnd:p,selected:m})=>{let{color:f="#6366f1",label:c,highlight:b,highlightColor:x,highlightWidth:k}=l||{},C=!!b,v=8,T=k??v*1.8,[E,F,y]=reactflow.getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:i,targetPosition:d}),w={...s,stroke:f,strokeWidth:v,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[C&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:E,style:{...s,stroke:x??f,strokeWidth:T,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${x??f}) drop-shadow(0 0 16px ${x??f})`,"--rn-edge-highlight-from":`${v}px`,"--rn-edge-highlight-to":`${T}px`}}),jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:E,markerEnd:p,style:w}),c&&jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:jsxRuntime.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${F}px,${y}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${f}`,pointerEvents:"none",zIndex:9999},children:c})})]})};var Un=(o=>(o.FULL="full",o.HALF="half",o))(Un||{});var mr={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 ro(e){let t=mr[e];if(!t)throw new Error(`Unknown connector type: ${e}`);let o=t.amperage===16,r=o?12:8*1.3,i=o?10:5*1.3,a=o?{borderRadius:"3px"}:{clipPath:"polygon(2px 0, calc(100% - 2px) 0, 100% 2px, 100% 100%, 0 100%, 0 2px)",borderRadius:"0px"};return {width:r,height:i,color:t.color,borderColor:t.borderColor,fontSize:o?"3px":"4px",...a}}function Vn(e){let t=mr[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function Wa(e){return Vn(e).amperage===16}function yr(e){return e%10<8?"C13":"C19"}function wr(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var Aa=/-(source|target)$/i;function Te(e){return e?e.replace(Aa,""):""}function rt(e){return typeof e=="string"&&e.includes("power")}function kt(e,t){return rt(t.type)?t.label:`${e}-${t.label}`}function To(e){let t=Te(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}var La="#6b7280",za="#374151",Nr="#10b981",Ba="100% 100%",Ua={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},Va=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,ja=/^data:image\//i,Ga=typeof window<"u"?lt__default.default.useLayoutEffect:lt__default.default.useEffect;function Xa(e){return (e??"").toLowerCase().replace(/_/g,"-")}function Ya(e){return !Va.test(e)&&!e.startsWith("//")}function Ka(e){if(!e)return;let t=e.trim();if(t){if(Ya(t))return t;try{let o=new URL(t),r=o.protocol.toLowerCase();return r==="https:"||r==="blob:"?o.href:r==="data:"&&ja.test(t)?t:void 0}catch{return}}}function Za(e){return `url(${JSON.stringify(e)})`}function kr(e){return rt(e.type)}function qa(e,t){return kt(e,t)}function Ja(e,t,o,r,i){let a=t.length>0||!!r,d=o.length>0||!!i;return e||(a?"front":d?"rear":"front")}function Qa(e,t){return t===true||e==="fill"?Ba:e==="none"?"auto":e==="scale-down"?"contain":e??"cover"}function es(e){return kr(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?Nr:e.cableType?Ua[e.cableType]??Nr:Nr}function ts(e){return e.connected?es(e):La}function Gn(e){return e.map(t=>{let o=t.ports.map(r=>`${r.label}:${r.type??""}:${r.connected?"1":"0"}:${r.cableType??""}`).join(",");return `${t.name}[${o}]`}).join("|")}function os(e,t,o,r){return {width:`${e}px`,height:`${t}px`,background:o,border:`0.5px solid ${r}`,borderRadius:"1px",cursor:"pointer"}}function Xn(e,t){return e%2===0?{position:reactflow.Position.Top,style:{transform:"translateY(50%)",left:`${e/2*(t+2)}px`}}:{position:reactflow.Position.Bottom,style:{transform:"translateY(-50%)",left:`${(e-1)/2*(t+2)}px`}}}function rs(e,t,o){return t===1?{position:reactflow.Position.Top,style:{transform:"translateY(50%)",right:"4%",left:void 0}}:Xn(e,o)}function ns(e,t,o,r,i,a,d){if(a==="patch-panel"||a==="switch")return Xn(t,r);if(kr(e)){let p=wr(d),m=ro(p),f;if(i<=20){let x=Math.max(2,i-m.height-2);f=`${o<=1?(2+x)/2:2+t*(x-2)/(o-1)}px`;}else f=`${25+t*50}%`;return {position:reactflow.Position.Left,style:{transform:"translateX(50%)",top:f,width:`${m.width}px`,height:`${m.height}px`,background:m.color,border:`1px solid ${m.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:m.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:m.borderRadius,clipPath:m.clipPath}}}return {position:reactflow.Position.Right,style:{transform:"translateX(-50%)",top:`${25+t*50}%`}}}function is(e,t,o,r){if(e)return {primary:"target"};let i=t==="patch-panel";return t==="switch"||t==="router"?{primary:"source",secondary:"target"}:i?o==="rear"?{primary:"source",secondary:"target"}:{primary:"target",secondary:"source"}:{primary:r?"source":"target"}}var $t=({id:e,data:t,selected:o})=>{let r=reactflow.useUpdateNodeInternals(),{label:i,status:a="active",deviceType:d="server",manufacturer:s,uHeight:l=1,width:p="full",ports:m,rearPorts:f,view:c,rackWidthPx:b,frontImageUrl:x,rearImageUrl:k,imageFit:C,imagePosition:v,imageRepeat:T,stretchToFit:E}=t,F=lt__default.default.useMemo(()=>Array.isArray(m)?m:[],[m]),y=lt__default.default.useMemo(()=>Array.isArray(f)?f:[],[f]),w=Xa(d),_=b??300,S=Ja(c,F,y,x,k),D=l*20,A=lt__default.default.useMemo(()=>[S,w,i,D.toString(),Gn(F),Gn(y)].join("|"),[S,w,i,D,F,y]);Ga(()=>{r(e);},[A,e,r]);let U=lt__default.default.useMemo(()=>{let $=Ka(S==="rear"?k:x);return $?{backgroundImage:Za($),backgroundSize:Qa(C,E),backgroundPosition:v??"center",backgroundRepeat:T??"no-repeat"}:{}},[S,k,x,C,E,v,T]),le=_+4,ee=Math.floor(_/2),re=p==="half"?`${ee}px`:`${le}px`,ne=p==="half"?`${ee}px`:void 0,z=w==="server"&&l===1,B=Ke(a),O={"--rn-device-bg-image":String(U.backgroundImage??"none"),"--rn-device-bg-position":String(U.backgroundPosition??"center"),"--rn-device-bg-repeat":String(U.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(U.backgroundSize??"cover"),"--rn-device-border-color":B,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${D}px`,"--rn-device-left":ne??"auto","--rn-device-status-color":B,"--rn-device-translate-y":z?"-1px":"0px","--rn-device-width":re},L=lt__default.default.useCallback((J,$)=>{let M=[];if(J.length===0)return M;let oe=Math.max(4,Math.floor(D*.4)),ie=Math.max(2,Math.floor(D*.2));for(let Q of J)for(let j=0;j<Q.ports.length;j+=1){let ae=Q.ports[j],Ne=kr(ae);if($==="front"&&Ne)continue;let ye=qa(Q.name,ae),ce=ts(ae),qe=ae.connected?ce:za,Ge=os(oe,ie,ce,qe),jt=$==="front"?rs(j,Q.ports.length,oe):ns(ae,j,Q.ports.length,oe,D,w,i),ue={...Ge,...jt.style},$e=is(Ne,w,$,ae.connected);if($e.secondary){let Ae=w==="switch"||w==="router"?`${Q.name} - ${ae.label} (input) ${ae.connected?"(connected)":"(disconnected)"}`:`${Q.name} - ${ae.label} (${$e.secondary}) ${ae.connected?"(connected)":"(disconnected)"}`;M.push(jsxRuntime.jsx(reactflow.Handle,{id:`${ye}-${$e.secondary}`,type:$e.secondary,position:jt.position,style:ue,title:Ae},`${ye}-${$e.secondary}`));}M.push(jsxRuntime.jsx(reactflow.Handle,{id:ye,type:$e.primary,position:jt.position,style:ue,title:`${Q.name} - ${ae.label} ${ae.connected?"(connected)":"(disconnected)"}`,children:Ne?j+1:void 0},ye));}return M},[D,i,w]),X=lt__default.default.useMemo(()=>S==="front"?F.length>0?L(F,"front"):[]:S==="rear"?y.length>0?L(y,"rear"):[]:[],[S,F,y,L]);return jsxRuntime.jsxs("div",{className:`device-node ${o?"selected":""}`,style:O,children:[jsxRuntime.jsxs("div",{className:"device-node__content",children:[jsxRuntime.jsx("div",{className:"device-node__label",children:i}),l>1&&jsxRuntime.jsx("div",{className:"device-node__manufacturer",children:s})]}),l>1&&jsxRuntime.jsxs("div",{className:"device-node__u-indicator",children:[l,"U"]}),jsxRuntime.jsx("div",{className:"device-node__status-indicator"}),X]})};var vr=({data:e,selected:t})=>{let{label:o,status:r="active",heightCm:i=100,powerPorts:a=36,widthPx:d=15,mgmt_unit:s}=e,l=i*4.2,p=()=>{let c=Math.ceil(a/10),b=Array(10).fill(0).map((w,_)=>_<8?"10A":"16A");for(let w=0,_=0;w<c;++w)for(let S=0;S<10&&_<a;++S,++_){b[S];}let v=[],T=15,y=(l-T-3)/(a-9)*.5;for(let w=0;w<a;w++){let _=T-2+y*w,S=`${w+1}`;if(s&&(s==="top"&&w===0||s==="middle"&&w===Math.floor(a/2)||s==="bottom"&&w===a-1)){v.push(m(_));continue}let A=yr(w),U=ro(A),le=Math.round((d-U.width)/2-1);v.push(jsxRuntime.jsx(reactflow.Handle,{type:"source",position:reactflow.Position.Right,id:S,style:{position:"absolute",left:`${le}px`,top:`${_-U.height/2}px`,width:`${U.width}px`,height:`${U.height}px`,background:U.color,border:`1px solid ${U.borderColor}`,cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:U.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:U.borderRadius,clipPath:U.clipPath},title:`Power Port ${w+1} (${A})`,children:w+1},`handle-${S}`));}return v},m=f=>jsxRuntime.jsxs("div",{style:{position:"absolute",left:`${(d-16)/2}px`,top:`${f-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 ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${Ke(r)}`,borderRadius:"2px",padding:0,width:`${d}px`,height:`${l}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"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 Pr=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:i="single",ribbonFiberIds:a}=e||{},d=reactflow.useEdges(),s=d.find(y=>y.target===o&&y.targetHandle==="left"),l=d.find(y=>y.source===o&&y.sourceHandle==="right"),p=d.find(y=>y.target===o&&y.targetHandle==="right"),m=l||p,f=s?.data?.color||"#555",c=m?.data?.color||"#555",b=i==="ribbon",x=s?.data?.ribbonFiberIds||a,k=m?.data?.ribbonFiberIds||a,C=b&&x?ot(x):null,v=b&&k?ot(k):null,T=!!s&&!!m;return jsxRuntime.jsxs("div",{className:`splice-node ${t?"selected":""}`,style:{width:b?85:69,height:b?20:16,borderRadius:8,border:"none",outline:"none",position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"none"},children:[b&&C&&v?jsxRuntime.jsxs("div",{style:{position:"absolute",inset:0,borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none",display:"grid",gridTemplateColumns:"1fr 1fr"},children:[jsxRuntime.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:C.map((y,w)=>jsxRuntime.jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`left-${w}`))}),jsxRuntime.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:v.map((y,w)=>jsxRuntime.jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`right-${w}`))})]}):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:f}}),jsxRuntime.jsx("div",{style:{background:c}})]}),jsxRuntime.jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),T&&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}}),T&&typeof r=="number"&&jsxRuntime.jsxs("div",{className:"splice-text-label animate-in",style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",fontSize:b?8:9,fontFamily:"monospace",pointerEvents:"none",zIndex:3,fontWeight:"bold",gap:"2px"},children:[jsxRuntime.jsx("div",{children:`${r.toFixed(2)} dB`}),b&&a&&jsxRuntime.jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[a.length,"F"]})]}),jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Left,id:"left",isConnectable:true,style:{width:12,height:b&&C?20:12,borderRadius:b&&C?"6px":"50%",border:"none",background:b&&C?`linear-gradient(to bottom, ${C.map(y=>y.base).join(", ")})`:f,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:b&&v?20:12,borderRadius:b&&v?"6px":"50%",border:"none",background:b&&v?`linear-gradient(to bottom, ${v.map(y=>y.base).join(", ")})`:c,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:b&&v?20:12,borderRadius:b&&v?"6px":"50%",border:"none",background:b&&v?`linear-gradient(to bottom, ${v.map(y=>y.base).join(", ")})`:c,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var lo=20,Io=36;var vt=32,qn=4,ct=12,ss=69,Ct=80,Sr=(Ct-ss)/2;var Er=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let i=e.data?.mode==="ribbon",a=i?Io:lo,d=i?32:16,s=vt,l=o.y-s,p=Math.round(l/a)+1,f=Math.max(1,Math.min(ct,p));if(!so(t,e,f,r)){let x=co(t,e,r,f);if(x!==f){let k=(a-d)/2;return {x:Sr,y:s+(x-1)*a+k,holderPosition:x}}}let c=(a-d)/2,b=s+(f-1)*a+c;return {x:Sr,y:b,holderPosition:f}},so=(e,t,o,r)=>!r.filter(a=>a.parentId===e.id&&a.type==="splice"&&a.id!==t.id).some(a=>a.data.holderPosition===o),co=(e,t,o,r=1)=>{for(let i=r;i<=ct;i++)if(so(e,t,i,o))return i;for(let i=r-1;i>=1;i--)if(so(e,t,i,o))return i;return 1},ds=(e,t)=>uo(e,t,false),uo=(e,t,o=false)=>{let r=vt,i=o?Io:lo,d=(i-(o?32:16))/2,s=r+(t-1)*i+d;return {x:Sr,y:s}};var Ir=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,i]=lt.useState(false),a=()=>{if(!r)return null;let d=[],s=vt;for(let l=1;l<=ct;l++){let p=s+(l-1)*lo;d.push(jsxRuntime.jsxs("div",{style:{position:"absolute",left:"-35px",top:`${p}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:`${lo}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",l]},l));}return d};return jsxRuntime.jsxs("div",{className:`splice-tray-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${Ct}px`,height:`${vt+ct*Io+qn}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"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:`${vt}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:d=>{d.stopPropagation();},onMouseDown:d=>{d.stopPropagation();},onClick:d=>{d.stopPropagation(),d.preventDefault(),i(!r);},style:{background:r?"#10b981":"#374151",color:r?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${r?"Hide":"Show"} holder markers`,children:"H"})]}),a(),jsxRuntime.jsx("div",{style:{position:"absolute",top:vt,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var Dr=({data:e,selected:t,id:o})=>{let{fibersPerTube:r=12,tubeIndex:i=1,startOn:a="left-center"}=e||{},d=e?.mode==="ribbon"||e?.ribbon===true,s=reactflow.useEdges(),l=`tube-${i}`,p=s.find(ee=>ee.source===o&&ee.sourceHandle===l||ee.target===o&&ee.targetHandle===l),m=p?.data?.color,f=De((i-1)%12+1),c=m||f,b=Math.max(1,Math.min(24,Number(r)||12)),x=14,k=4,C=1,v=2,T=20,E=b*x+(b-1)*k,F=Math.max(60,E+C*2+v*2),y=a==="left"?reactflow.Position.Left:a==="right"?reactflow.Position.Right:reactflow.Position.Bottom,w=y!==reactflow.Position.Bottom,_=w?14:20,S=w?8:20,D=w?`inset ${y===reactflow.Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",A=p?c:w?`linear-gradient(${y===reactflow.Position.Left?"to right":"to left"}, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)), ${c}`:`radial-gradient(circle, ${c} 40%, transparent 70%)`,U={width:_,height:S,borderRadius:w?6:"50%",opacity:p?.3:.9,pointerEvents:"auto",background:A,backgroundColor:c,border:p?`2px solid ${c}`:`3px dashed ${c}`,cursor:"crosshair","--fiber-bg":c,boxShadow:p?D:`${D}${D!=="none"?", ":""}0 0 8px ${c}`,transition:"opacity 0.2s, box-shadow 0.2s",...y===reactflow.Position.Left?{left:-(_-4)}:y===reactflow.Position.Right?{right:-(_-4)}:{}},le=lt.useMemo(()=>{let ee=[],re=F-v*2-C*2,ne,z,B=false;a==="left"?(ne=C,z=reactflow.Position.Top):a==="right"?(ne=C+re-E,z=reactflow.Position.Top,B=true):(ne=C+(re-E)/2,z=reactflow.Position.Top);for(let O=0;O<b;O++){let L=B?b-O:O+1,X=`fiber-${L}`,J=s.find(Ne=>Ne.source===o&&Ne.sourceHandle===X||Ne.target===o&&Ne.targetHandle===X),$=!!J&&(J.data?.isRibbon||J.data?.ribbonFiberIds&&Array.isArray(J.data.ribbonFiberIds)),M=J?.data?.color,oe=typeof J?.data?.striped=="boolean"?J.data.striped:void 0,ie=tt(L);d||$?ie=tt(L,{base:"#808080",striped:false}):(M||oe!==void 0)&&(ie=tt(L,{...M?{base:M}:{},...oe!==void 0?{striped:oe}:{}}));let Q=ne+O*(x+k),j=C,ae={position:"absolute",left:`${Q}px`,top:`${j}px`,width:x,height:x,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":ie.base,backgroundColor:ie.base};ie.backgroundImage&&(ae["--fiber-bg-image"]=ie.backgroundImage),ee.push(jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:X,type:"target",position:z,className:"tube-fiber-handle",isConnectable:true,style:ae,"data-fiber-idx":L,"data-fiber-color":ie.base}),jsxRuntime.jsx(reactflow.Handle,{id:X,type:"source",position:z,className:"tube-fiber-handle",isConnectable:true,style:ae,"data-fiber-idx":L,"data-fiber-color":ie.base})]},`fiber-${L}`));}return ee},[b,a,F,s,o,x,k,C,v,E,d]);return jsxRuntime.jsxs("div",{style:{width:F,height:T,borderRadius:4,background:"#111827",border:`${v}px solid ${t?"#3b82f6":c}`,position:"relative",boxShadow:t?`0 0 0 ${v}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:C,boxSizing:"border-box",overflow:"visible"},children:[le,jsxRuntime.jsx(reactflow.Handle,{id:l,type:"target",position:y,isConnectable:true,className:"tube-connection-handle",style:U,"data-tube-idx":i,"data-tube-color":c,title:p?"Connected - drag to reconnect":"Drag to connect cable tube"}),jsxRuntime.jsx(reactflow.Handle,{id:l,type:"source",position:y,isConnectable:true,className:"tube-connection-handle",style:U,"data-tube-idx":i,"data-tube-color":c,title:p?"Connected - drag to reconnect":"Drag to connect cable tube"})]})};var $r=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:i,color:a,rotation:d}=e||{},s=lt__default.default.useRef(null);lt__default.default.useEffect(()=>{if(s.current){let z=typeof d=="number"?d:0;s.current.style.transform=`rotate(${z}deg)`,s.current.style.transformOrigin="center center";}},[d]);let l=Math.max(1,Math.min(24,Number(o)||12)),p=10,m=2,f=6,c=f+p+4,b=60,x=Math.max(120,l*(p+m)+f*2),C=i??`${l}f Cable`,v=r?`Cable ID ${r}`:void 0,T=De(1),E=a||T,F=t?"#3b82f6":E,y=typeof d=="number"?d:0,w=z=>{let B=(z%360+360)%360;return B>=315||B<45?reactflow.Position.Top:B>=45&&B<135?reactflow.Position.Right:B>=135&&B<225?reactflow.Position.Bottom:reactflow.Position.Left},_=()=>{let z=[],B=w(y);for(let O=0;O<l;O++){let L=O+1,X=tt(L),J=X.base,$=f+O*(p+m),M=-5,oe=X.backgroundImage?X.backgroundImage:J,ie={position:"absolute",left:`${$}px`,top:`${M}px`,width:p,height:p,borderRadius:"50%",border:"none",background:oe,backgroundColor:J,zIndex:10,cursor:"pointer","--fiber-bg":J};X.backgroundImage&&(ie["--fiber-bg-image"]=X.backgroundImage);let Q=`fiber-${L}`;z.push(jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:Q,type:"target",position:B,className:"tube-fiber-handle",isConnectable:true,style:ie,"data-fiber-idx":L,"data-fiber-color":J}),jsxRuntime.jsx(reactflow.Handle,{id:Q,type:"source",position:B,className:"tube-fiber-handle",isConnectable:true,style:ie,"data-fiber-idx":L,"data-fiber-color":J})]},`fiber-${L}`));}return z},S="cable-button",D=8,A={width:D,height:D,borderRadius:"50%",background:E,backgroundColor:E,border:`1px solid ${E}`,cursor:"pointer",zIndex:10},U=2,ee=(z=>{let B=(z%360+360)%360;return B>=315||B<45?reactflow.Position.Bottom:B>=45&&B<135?reactflow.Position.Left:B>=135&&B<225?reactflow.Position.Top:reactflow.Position.Right})(y),re={width:x,height:b,position:"relative",transform:`rotate(${y}deg)`,transformOrigin:"center center","--rotation":`${y}deg`},ne={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${U}px solid ${F}`,boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:f,paddingTop:c,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2};return jsxRuntime.jsx("div",{ref:s,style:re,children:jsxRuntime.jsxs("div",{style:ne,children:[_(),jsxRuntime.jsx(reactflow.Handle,{id:S,type:"source",position:ee,className:"cable-button-handle",isConnectable:true,style:A,"data-handle-type":"cable-button","data-cable-color":E}),jsxRuntime.jsx(reactflow.Handle,{id:S,type:"target",position:ee,className:"cable-button-handle",isConnectable:true,style:A,"data-handle-type":"cable-button","data-cable-color":E}),jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2,transform:"translateX(2px)"},children:[jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:C}),v&&jsxRuntime.jsx("div",{style:{fontSize:10,opacity:.8},children:v})]})]})})};var Wr=({data:e,selected:t})=>{let{tubeCount:o=12,fibersPerTube:r=12,fiberCount:i,cableId:a="CBL-002",label:d,tubeStartIndex:s=1,color:l}=e||{},p=Math.max(1,Math.min(24,Number(o)||12)),m=Math.max(1,Number(s)||1),f=14,c=10,b=3,x=6,k=x+c+4,C=60,v=Math.max(120,p*(f+b)+x*2),T=i??p*(Number(r)||12),E=d??`${T}f Cable`,F=a?`Cable ID ${a}`:void 0,y=De(m),w=l||y,_=t?"#3b82f6":w,S=()=>{let ee=[];for(let re=0;re<p;re++){let ne=m+re,z=tt(ne),B=z.base,O=x+re*(f+b),L=-5,X=z.backgroundImage?z.backgroundImage:B,J={position:"absolute",left:`${O}px`,top:`${L}px`,width:f,height:c,borderRadius:6,border:"none",background:X,backgroundColor:B,zIndex:10,cursor:"pointer","--fiber-bg":B};z.backgroundImage&&(J["--fiber-bg-image"]=z.backgroundImage);let $=`tube-${ne}`;ee.push(jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:$,type:"target",position:reactflow.Position.Top,className:"tube-fiber-handle",isConnectable:true,style:J,"data-fiber-idx":ne,"data-tube-idx":ne,"data-tube-color":B}),jsxRuntime.jsx(reactflow.Handle,{id:$,type:"source",position:reactflow.Position.Top,className:"tube-fiber-handle",isConnectable:true,style:J,"data-fiber-idx":ne,"data-tube-idx":ne,"data-tube-color":B})]},`tube-${ne}`));}return ee},D="cable-button",A=8,U={width:A,height:A,borderRadius:"50%",background:w,backgroundColor:w,border:`1px solid ${w}`,cursor:"pointer",zIndex:10};return jsxRuntime.jsxs("div",{style:{width:v,height:C,borderRadius:4,background:"#111827",border:`2px solid ${_}`,position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:x,paddingTop:k,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[S(),jsxRuntime.jsx(reactflow.Handle,{id:D,type:"source",position:reactflow.Position.Bottom,className:"cable-button-handle",isConnectable:true,style:U,"data-handle-type":"cable-button","data-cable-color":w}),jsxRuntime.jsx(reactflow.Handle,{id:D,type:"target",position:reactflow.Position.Bottom,className:"cable-button-handle",isConnectable:true,style:U,"data-handle-type":"cable-button","data-cable-color":w}),jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2},children:[jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:E}),F&&jsxRuntime.jsx("div",{style:{fontSize:10,opacity:.8},children:F})]})]})};var Ar=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:i,label:a,portLabelsLeft:d,portLabelsRight:s}=e||{},l=reactflow.useEdges(),p=typeof i=="number"&&[1,2,4].includes(i)?i:2,m=Math.max(1,Math.min(4,p)),f=9,c=3,b=3,x=60,k=30,C=m*f+(m-1)*c,v=Math.max(k,C+b*2),T=Math.max(x,80),E=(w,_)=>{let S=`${w}-${_+1}`;return l.find(A=>A.source===o&&A.sourceHandle===S||A.target===o&&A.targetHandle===S)?.data?.color||"#555"},F=w=>{let _=[],S=w==="left"?reactflow.Position.Left:reactflow.Position.Right,D=w==="left"?d:s;for(let A=0;A<m;A++){let U=A+1,le=`${w}-${U}`,ee=E(w,A),z=b+(v-C)/2+A*(f+c),B={position:"absolute",left:w==="left"?-5:void 0,right:w==="right"?-5:void 0,top:`${z}px`,width:f,height:f,borderRadius:"50%",border:"none",background:ee,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};_.push(jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:le,type:"target",position:S,isConnectable:true,style:B}),jsxRuntime.jsx(reactflow.Handle,{id:le,type:"source",position:S,isConnectable:true,style:B})]},le)),D&&D[A]&&_.push(jsxRuntime.jsx("div",{style:{position:"absolute",left:w==="left"?-30:void 0,right:w==="right"?-30:void 0,top:`${z}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:w==="left"?"right":"left",width:"25px"},children:D[A]},`${le}-label`));}return _},y=a||`${r}-${m}f`;return jsxRuntime.jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:T,height:v,borderRadius:4,border:`2px solid ${t?"#3b82f6":"#4b5563"}`,background:"#1f2937",position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",display:"flex",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",fontSize:"10px",padding:`${b}px`,boxSizing:"border-box"},children:[F("left"),jsxRuntime.jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:y})}),F("right")]})};var St=32,Oo=30,hs=24,ms=80,Wo=400,Ao=300,ii=2,Pt=8,ai=120;function Lr(e){let{couplerFiberCount:t}=e.data||{},o=typeof t=="number"&&[1,2,4].includes(t)?t:2,r=Math.max(1,Math.min(4,o)),i=7,a=3,d=3,s=60,l=30,p=r*i+(r-1)*a,m=Math.max(l,p+d*2);return {width:Math.max(s,80),height:m}}function Lo(e){let{fibersPerTube:t=12}=e.data||{},o=Math.max(1,Math.min(24,Number(t)||12)),r=14,i=4,a=1,d=2,s=20,l=o*r+(o-1)*i;return {width:Math.max(60,l+a*2+d*2),height:s}}function si(e){return {width:Ct,height:0}}function di(e){return e.type==="coupler"?Lr(e):e.type==="tube"?Lo(e):e.type==="splice-tray"?si():{width:80,height:30}}function Or(e){let t=0;for(let o of e){let r=di(o),i=(o.position?.x||0)+r.width;i>t&&(t=i);}return t}function li(e,t=0){let o=t;for(let r of e){let i=di(r),a=(r.position?.y||0)+i.height;a>o&&(o=a);}return o}function ci(e){return e.data?.panelWidth||Wo}function ys(e){return e.data?.panelHeight||Ao}function ui(e){return ci(e)-ii*2-Pt*2}function ws(e,t){return ui(e)-t}function pi(e,t=Oo){return Math.floor(e/t)+1}function gi(e,t=Oo){return (e-1)*t}function Ns(e,t,o){let r=Oo,i=pi(o.y,r),a=gi(i,r);return {x:o.x,y:a,slotPosition:i}}function zr(e,t){if(t.length===0)return {width:e.data?.panelWidth||Wo,height:e.data?.panelHeight||Ao};let o=t.some(l=>l.type==="tube"),r=t.some(l=>l.type==="splice-tray"),i=t.some(l=>l.type==="coupler"),a;if(o&&r&&i){let l=0,p=0;for(let c of t)if(c.type==="tube"){let b=Lo(c);b.width>l&&(l=b.width);}else if(c.type==="coupler"){let b=Lr(c);b.width>p&&(p=b.width);}let m=l+ai+Ct+p+5,f=0;a=f+m+f;}else a=Or(t)+4;a=Math.max(e.data?.panelWidth||Wo,a);let d=li(t,St),s=Math.max(e.data?.panelHeight||Ao,d+Pt);return {width:a,height:s}}function fi(e,t,o){if(e===0)return 0;if(e===1)return t;let r=e*t,i=o-r,a=Math.max(5,i/(e-1));return t+a}function xs(e,t,o){return fi(e,t,o)}var oi=20,ri=400,ni=300;function Br(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||ri,height:e.data?.closureHeight||e.data?.panelHeight||ni};let o=t.some(s=>s.type==="tube"),r=t.some(s=>s.type==="splice-tray"),i;if(o&&r){let s=0,l=0,p=0,m=t.filter(c=>c.type==="tube"),f=t.filter(c=>c.type==="splice-tray");if(m.length>0&&f.length>0){let c=f.map(x=>x.position?.x||0),b=c.reduce((x,k)=>x+k,0)/c.length;for(let x of m){let k=Lo(x);(x.position?.x||0)<b?k.width>s&&(s=k.width):k.width>l&&(l=k.width);}f.length>0&&(p=Ct),i=Pt+s+oi+p+oi+l+5;}else i=Or(t)+Pt+5;}else i=Or(t)+Pt+5;i=Math.max(e.data?.closureWidth||e.data?.panelWidth||ri,i);let a=li(t,St),d=Math.max(e.data?.closureHeight||e.data?.panelHeight||ni,a+Pt);return {width:i,height:d}}var jr=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:i,panelWidth:a,panelHeight:d}=e||{},{getNodes:s,setNodes:l}=reactflow.useReactFlow(),p=lt.useRef(false),m=lt.useRef([]),f=lt.useMemo(()=>{let E=s().filter(F=>F.parentId===o);return (E.length!==m.current.length||E.some((F,y)=>F.id!==m.current[y]?.id))&&(m.current=E),m.current},[s,o]),c=lt.useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:a,panelHeight:d}}),[o,e,a,d]),b=lt.useMemo(()=>a&&d?{width:a,height:d}:f.length===0?{width:a||400,height:d||300}:zr(c,f),[f,c,a,d]);lt.useEffect(()=>{if(a&&d||p.current)return;let T=a,E=d,F=Math.abs((T||0)-b.width),y=Math.abs((E||0)-b.height);(F>1||y>1)&&(p.current=true,l(w=>w.map(_=>_.id===o?{..._,data:{..._.data,panelWidth:b.width,panelHeight:b.height}}:_)),setTimeout(()=>{p.current=false;},0));},[o,b.width,b.height,a,d,l]);let x=b.width,k=b.height,C=St,v=i||r;return jsxRuntime.jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${x}px`,height:`${k}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#1f2937",boxSizing:"border-box"},children:[jsxRuntime.jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${C}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"6px 6px 0 0",borderBottom:"1px solid #4b5563"},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:v})}),jsxRuntime.jsx("div",{style:{position:"absolute",top:C,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var Yr=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:i,closureWidth:a,closureHeight:d,panelWidth:s,panelHeight:l}=e||{},{getNodes:p,setNodes:m}=reactflow.useReactFlow(),f=lt.useRef(false),c=lt.useRef([]),b=lt.useMemo(()=>{let w=p().filter(_=>_.parentId===o);return (w.length!==c.current.length||w.some((_,S)=>_.id!==c.current[S]?.id))&&(c.current=w),c.current},[p,o]),x=lt.useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:a||s,closureHeight:d||l}}),[o,e,a,d,s,l]),k=lt.useMemo(()=>a&&d?{width:a,height:d}:s&&l?{width:s,height:l}:b.length===0?{width:a||s||400,height:d||l||300}:Br(x,b),[b,x,a,d,s,l]);lt.useEffect(()=>{if(a&&d||s&&l||f.current)return;let y=a||s,w=d||l,_=Math.abs((y||0)-k.width),S=Math.abs((w||0)-k.height);(_>1||S>1)&&(f.current=true,m(D=>D.map(A=>A.id===o?{...A,data:{...A.data,closureWidth:k.width,closureHeight:k.height}}:A)),setTimeout(()=>{f.current=false;},0));},[o,k.width,k.height,a,d,s,l,m]);let C=k.width,v=k.height,T=St,E=i||r,F=C/2;return jsxRuntime.jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${F}px ${F}px 12px 12px`,padding:0,width:`${C}px`,height:`${v}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#1f2937",boxSizing:"border-box",overflow:"hidden"},children:[jsxRuntime.jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${T}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:`${F}px ${F}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:E})}),jsxRuntime.jsx("div",{style:{position:"absolute",top:T,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var Zr=({data:e,selected:t,id:o})=>{let{label:r,splitterType:i="splitter",inputCount:a=1,outputCount:d=8}=e||{},s=reactflow.useEdges(),l=r||(i==="WDM"?"WDM":"Splitter"),p=9,m=3,f=3,c=50,b=30,x=Math.min(Math.max(a||1,1),2),k=x*p+(x-1)*m,C=Math.min(d||8,48),v=C*p+(C-1)*m,T=Math.max(k,v),E=Math.max(b,T+f*2),F=Math.max(c,50),y=re=>s.find(z=>z.source===o&&z.sourceHandle===re||z.target===o&&z.targetHandle===re)?.data?.color||"#555",w=()=>{let re=[],ne=f+(E-k)/2;for(let z=0;z<x;z++){let B=`input-${z+1}`,O=ne+z*(p+m),L=y(B),X={position:"absolute",left:-5,top:`${O}px`,width:p,height:p,borderRadius:"50%",border:"none",background:L,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};re.push(jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:`${B}-target`,type:"target",position:reactflow.Position.Left,isConnectable:true,style:X}),jsxRuntime.jsx(reactflow.Handle,{id:`${B}-source`,type:"source",position:reactflow.Position.Left,isConnectable:true,style:X})]},B));}return re},_=()=>{let re=[],ne=f+(E-v)/2;for(let z=0;z<C;z++){let B=`output-${z+1}`,O=ne+z*(p+m),L=y(B),X={position:"absolute",right:-5,top:`${O}px`,width:p,height:p,borderRadius:"50%",border:"none",background:L,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};re.push(jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:`${B}-target`,type:"target",position:reactflow.Position.Right,isConnectable:true,style:X}),jsxRuntime.jsx(reactflow.Handle,{id:`${B}-source`,type:"source",position:reactflow.Position.Right,isConnectable:true,style:X})]},B));}return re},S=Math.max(k+f*4,b*.6),D=(E-S)/2,A=D+S,U=0,le=E,ee=t?"#3b82f6":"#4b5563";return jsxRuntime.jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:F,height:E,position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",display:"flex",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",fontSize:"10px",padding:`${f}px`,boxSizing:"border-box"},children:[jsxRuntime.jsx("svg",{width:F,height:E,viewBox:`0 0 ${F} ${E}`,style:{position:"absolute",top:0,left:0,width:`${F}px`,height:`${E}px`,pointerEvents:"none",zIndex:0},children:jsxRuntime.jsx("polygon",{points:`0,${D} 0,${A} ${F},${le} ${F},${U}`,fill:"#1f2937",stroke:ee,strokeWidth:"2"})}),w(),jsxRuntime.jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:l})}),_()]})};var yi=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",Uo=(e,t)=>yi(e)||yi(t),te=(e,t)=>t?e?.type==="fibre-split"?Te(t):Te(t):t||"";function Vo(e,t){if(!e||!t)return "unknown";let o=Te(t);if(!o)return "unknown";if(e.type==="vertical-pdu")return "power";let r=e.data??{},i=Array.isArray(r.ports)?r.ports:[],a=Array.isArray(r.rearPorts)?r.rearPorts:[];for(let p of [...i,...a])for(let m of p.ports||[])if(kt(p.name,{label:m.label,type:rt(m.type)?m.type:void 0})===o)return rt(m.type)?"power":"network";if(To(o)||/^\d+$/.test(o))return "power";let d=o.toLowerCase(),s=d.startsWith("net-")||d.startsWith("port-")||d.startsWith("uplink-")||d.includes("fiber")||d.includes("ports"),l=/^[A-Z0-9]+-\d+$/i.test(o)&&!d.startsWith("pwr")&&!d.startsWith("power");return s||l?"network":"unknown"}function Et(e,t){return Vo(e,t)==="power"}function Rs(e,t){if(!e.source||!e.target||!e.sourceHandle||!e.targetHandle)return {valid:true};let o=t.nodes.find($=>$.id===e.source),r=t.nodes.find($=>$.id===e.target),i=Uo(o,r);if(!i){let $=Vo(o,e.sourceHandle),M=Vo(r,e.targetHandle);if($!=="unknown"&&M!=="unknown"&&$!==M)return {valid:false,reason:`Cannot connect ${$} handle to ${M} handle`};let oe=$==="power"&&M==="power",ie=o?.type==="vertical-pdu"||r?.type==="vertical-pdu";if(oe&&!ie)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let a=te(o,e.sourceHandle),d=te(r,e.targetHandle),s=t.edges.some($=>e.ignoreEdgeId&&$.id===e.ignoreEdgeId?false:$.source===e.source?te(o,$.sourceHandle)===a:$.target===e.source?te(o,$.targetHandle)===a:false),l=t.edges.some($=>e.ignoreEdgeId&&$.id===e.ignoreEdgeId?false:$.target===e.target?te(r,$.targetHandle)===d:$.source===e.target?te(r,$.sourceHandle)===d:false);if((s||l)&&!i)return s?{valid:false,reason:`Source handle ${e.sourceHandle} on node ${e.source} is already connected`}:{valid:false,reason:`Target handle ${e.targetHandle} on node ${e.target} is already connected`};let p=($,M)=>($?.type==="tube"||$?.type==="cable")&&!!M&&M.startsWith("fiber-"),m=($,M)=>($?.type==="tube"||$?.type==="multi-tube-cable")&&!!M&&M.startsWith("tube-"),f=($,M)=>$?.type==="multi-tube-cable"&&!!M&&M.startsWith("tube-"),c=($,M)=>$?.type==="tube"&&!!M&&M.startsWith("tube-"),b=($,M)=>($?.type==="cable"||$?.type==="multi-tube-cable")&&M==="cable-button",x=($,M)=>$?.type==="splice"&&(M==="left"||M==="right"),k=($,M)=>$?.type==="coupler"&&!!M&&(M.startsWith("left-")||M.startsWith("right-")),C=($,M)=>{if($?.type!=="fibre-split"||!M)return false;let oe=te($,M);return oe.startsWith("input-")||oe.startsWith("output-")};if(!i)return {valid:true};if(o?.type==="splice"&&r?.type==="splice"){let $=o.data?.mode==="ribbon",M=r.data?.mode==="ribbon";if($!==M)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let v=p(o,e.sourceHandle),T=p(r,e.targetHandle),E=x(o,e.sourceHandle),F=x(r,e.targetHandle),y=k(o,e.sourceHandle),w=k(r,e.targetHandle),_=C(o,e.sourceHandle),S=C(r,e.targetHandle),D=b(o,e.sourceHandle),A=b(r,e.targetHandle),U=f(o,e.sourceHandle),le=f(r,e.targetHandle),ee=c(o,e.sourceHandle),re=c(r,e.targetHandle),ne=m(o,e.sourceHandle),z=m(r,e.targetHandle);return v&&F||T&&E||(E&&(w||S)||F&&(y||_))||(y&&(w||S||F)||w&&(y||_||E))||D&&A||(U&&re||le&&ee)?{valid:true}:ne&&z?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}function jo(e,t){if(!t)return;let o=Te(e),r=t.data??{},i=r.handleSideMap;if(i&&i[o])return i[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 a=Array.isArray(r.ports)?r.ports:[],d=Array.isArray(r.rearPorts)?r.rearPorts:[];if(To(o))return "rear";for(let s of a)for(let l of s.ports||[])if(kt(s.name,{label:l.label,type:rt(l.type)?l.type:void 0})===o)return "front";for(let s of d)for(let l of s.ports||[])if(kt(s.name,{label:l.label,type:rt(l.type)?l.type:void 0})===o)return "rear"}function qr(e={},t={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},r=new Set;return {getState:()=>o,setState:f=>{o={...o,...f},r.forEach(c=>c(o));},subscribe:f=>(r.add(f),()=>r.delete(f)),selectEdgeZIndex:f=>{let c=(k,C)=>{let v=o.nodes.find(re=>re.id===k);if(!(!!v&&(v.type==="device"||v.type==="server"||v.type==="switch"||v.type==="router"))||!v||v.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let F=Array.isArray(v.data?.rearPorts)&&v.data.rearPorts.length>0,y=Array.isArray(v.data?.ports)&&v.data.ports.length>0,w=v.data?.view||(F&&!y?"rear":"front"),_=jo(C||"",v);if(_)return w===_?1e3:500;let S=(C||"").toString().replace(/-(source|target)$/i,""),D=S.toLowerCase(),A=D.startsWith("pwr")||D.startsWith("power"),U=D.startsWith("net-")||D.startsWith("port-")||D.startsWith("uplink-")||D.includes("fiber")||D.includes("ports"),le=/^[A-Z0-9]+-\d+$/i.test(S)&&!D.startsWith("pwr")&&!D.startsWith("power"),ee=U||le;if(A)return w==="rear"?1e3:500;if(ee)return w==="front"?1e3:500},b=c(f.target,f.targetHandle);if(b!==void 0)return b;let x=c(f.source,f.sourceHandle);return x!==void 0?x:1e3},validateConnection:f=>(t.validateConnection||Rs)(f,o),selectNodeById:f=>o.nodes.find(c=>c.id===f),selectConnectedEdges:f=>o.edges.filter(c=>c.source===f||c.target===f)}}function Ts(e){let t=i=>e.subscribe(a=>i()),o=()=>e.getState();return lt.useSyncExternalStore(t,o,o)}function Qr(e){let t=r=>e.subscribe(i=>r()),o=()=>e.getState().nodes;return lt.useSyncExternalStore(t,o,o)}function en(e){let t=r=>e.subscribe(i=>r()),o=()=>e.getState().edges;return lt.useSyncExternalStore(t,o,o)}function wi(e){return e.selectEdgeZIndex}function Ni(e){let t=e.data.rackWidthPx||300,o=60+(e.data.uHeight||42)*20,r=e.position.x,i=e.position.x+t,a=e.position.y,d=e.position.y+o;return {left:r,right:i,top:a,bottom:d}}function xi(e,t){let o=Ni(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function Go(e,t){let o=null,r=1/0;for(let i of t){if(!xi(e,i))continue;let a=Math.sqrt(Math.pow(e.x-i.position.x,2)+Math.pow(e.y-i.position.y,2));a<r&&(r=a,o=i);}return o}function Pe(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:i,findBy:a,matchOn:d=a,data:s}=e,l=a==="source"?o.sourceHandle:o.targetHandle,p=a==="source"?o.source:o.target;if(!l||!p)return null;let m=Te(l),f=t.find(v=>d==="source"?v.source===p&&Te(v.sourceHandle)===m:v.target===p&&Te(v.targetHandle)===m);if(!f)return null;let c=t.filter(v=>v.id!==f.id),b=reactflow.addEdge(o,c),x=b[b.length-1],k=i({...o,id:x.id,type:r}),C={...x,type:r,zIndex:k,style:{...x.style,zIndex:k},data:s!==void 0?s:x.data};return [...b.slice(0,-1),C]}function Ci(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}var Fe=({type:e,children:t})=>{let o=lt__default.default.useRef(null),r=lt__default.default.useCallback(i=>{if(o.current=i,i){let a=i.parentElement,d=0;for(;a&&!a.classList.contains("react-flow__node")&&d<10;)a=a.parentElement,d++;a&&a.classList.contains("react-flow__node")&&a.setAttribute("data-type",e);}},[e]);return lt__default.default.useEffect(()=>{if(o.current){let i=o.current.parentElement,a=0;for(;i&&!i.classList.contains("react-flow__node")&&a<10;)i=i.parentElement,a++;i&&i.classList.contains("react-flow__node")&&i.setAttribute("data-type",e);}},[e]),jsxRuntime.jsx("div",{ref:r,style:{width:"100%",height:"100%"},children:t})},Hi=(e,t,o)=>({rack:r=>jsxRuntime.jsx(Fe,{type:"rack",children:jsxRuntime.jsx(pr,{...r,onViewChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsxRuntime.jsx(Fe,{type:"fiber",children:jsxRuntime.jsx(gr,{...r})}),device:r=>jsxRuntime.jsx(Fe,{type:"device",children:jsxRuntime.jsx($t,{...r})}),server:r=>jsxRuntime.jsx(Fe,{type:"server",children:jsxRuntime.jsx($t,{...r})}),switch:r=>jsxRuntime.jsx(Fe,{type:"switch",children:jsxRuntime.jsx($t,{...r})}),router:r=>jsxRuntime.jsx(Fe,{type:"router",children:jsxRuntime.jsx($t,{...r})}),"vertical-pdu":r=>jsxRuntime.jsx(Fe,{type:"vertical-pdu",children:jsxRuntime.jsx(vr,{...r})}),splice:r=>jsxRuntime.jsx(Fe,{type:"splice",children:jsxRuntime.jsx(Pr,{...r})}),"splice-tray":r=>jsxRuntime.jsx(Fe,{type:"splice-tray",children:jsxRuntime.jsx(Ir,{...r})}),tube:r=>jsxRuntime.jsx(Fe,{type:"tube",children:jsxRuntime.jsx(Dr,{...r})}),cable:r=>jsxRuntime.jsx(Fe,{type:"cable",children:jsxRuntime.jsx($r,{...r})}),"multi-tube-cable":r=>jsxRuntime.jsx(Fe,{type:"multi-tube-cable",children:jsxRuntime.jsx(Wr,{...r})}),coupler:r=>jsxRuntime.jsx(Fe,{type:"coupler",children:jsxRuntime.jsx(Ar,{...r})}),"patch-panel":r=>jsxRuntime.jsx(Fe,{type:"patch-panel",children:jsxRuntime.jsx(jr,{...r})}),closure:r=>jsxRuntime.jsx(Fe,{type:"closure",children:jsxRuntime.jsx(Yr,{...r})}),"fibre-split":r=>jsxRuntime.jsx(Fe,{type:"fibre-split",children:jsxRuntime.jsx(Zr,{...r})})});function Pi(e){if(!e)return false;if(e.type==="switch")return true;if(e.type!=="device")return false;let t=e.data?.deviceType;return typeof t=="string"&&t.toLowerCase().replace(/_/g,"-")==="switch"}function Si(e,t,o){let r=e.sourceHandle,i=e.targetHandle;return Pi(t)&&r&&!Et(t,r)&&(r=Te(r)),Pi(o)&&i&&!Et(o,i)&&(i=`${Te(i)}-target`),r===e.sourceHandle&&i===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:i}}var Vs={fiber:Eo,ethernet:Eo,power:br,smoothstep:Mn,step:On,"thick-cable":Bn},js=8192,Gs=8192,Xs=2048,Ys=4;function go(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function Ks(e){if(e)return {...e,width:go(e.width,1,js),height:go(e.height,1,Gs),padding:go(e.padding,0,Xs),pixelRatio:go(e.pixelRatio,.1,Ys),quality:go(e.quality,0,1)}}var Zs=({nodes:e,edges:t,initialNodes:o,initialEdges:r,onNodesChange:i,onEdgesChange:a,store:d,debug:s,onNodeClick:l,onEdgeClick:p,nodeTypes:m,edgeTypes:f,onConnect:c,onEdgeUpdate:b,isValidConnection:x,connectionMode:k,onViewChange:C,onRackFaceChange:v,className:T,style:E,alignRacksToBottom:F,reAssignable:y=true,colorMode:w="dark",onInit:_,onFlowMethods:S,showDownloadButton:D=false,downloadButtonPosition:A="top-right",downloadButtonText:U="Download Image",downloadButtonStyle:le,useSmoothstepEdgesForTubes:ee=false,readOnly:re=false,interaction:ne,actionPanel:z,connectOnClick:B=true,panOnDrag:O=true,panOnScroll:L=true,zoomOnScroll:X=true,fitViewOptions:J})=>{let $=lt.useCallback((n,u)=>{let h=new Map,g=[],H=[],R=(I,W)=>!I||!W?false:!!(I.startsWith("tube-")||W.type==="splice"&&(I==="left"||I==="right")||I==="cable-button");for(let I of n){if(!I.source||!I.target||!I.sourceHandle||!I.targetHandle){s&&console.warn("Invalid edge skipped (missing source/target/handles):",I);continue}let W=u.find(he=>he.id===I.source),P=u.find(he=>he.id===I.target),K=`${I.source}:${I.sourceHandle}`,se=h.get(K),ke=R(I.sourceHandle,W),Re=`${I.target}:${I.targetHandle}`,ve=h.get(Re),Ue=R(I.targetHandle,P);if(se&&!ke){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:K,existingEdge:se.id,duplicateEdge:I.id}),H.push(I);continue}if(ve&&!Ue){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Re,existingEdge:ve.id,duplicateEdge:I.id}),H.push(I);continue}g.push(I),se||h.set(K,I),ve||h.set(Re,I);}return s&&H.length>0&&console.log(`Filtered ${H.length} duplicate edge(s) from initial edges`),g},[s]),M=Array.isArray(e)&&Array.isArray(t),oe=lt__default.default.useMemo(()=>M?e||[]:o||e||[],[M,e,o]),ie=lt__default.default.useMemo(()=>M?t||[]:r||t||[],[M,t,r]),Q=lt__default.default.useMemo(()=>$(ie,oe),[ie,oe,$]),j=lt__default.default.useMemo(()=>d||qr({nodes:oe,edges:Q,debug:s}),[d,M,s,Q]),ae=Qr(j),Ne=en(j),[ye,ce]=reactflow.useNodesState(ae),[qe,Ge,jt]=reactflow.useEdgesState(Ne),ue=wi(j),$e=lt.useRef(null),[Ae,Yi]=lt.useState(false);lt.useEffect(()=>{let n=()=>{Yi(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return n(),window.addEventListener("resize",n),()=>window.removeEventListener("resize",n)},[]);let xe=re===true,Ie=lt.useMemo(()=>{let u={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!Ae,edgesFocusable:!Ae,edgesReconnectable:true,connectOnClick:B,panOnDrag:O,panOnScroll:L&&!Ae,zoomOnScroll:X&&!Ae,zoomOnPinch:!Ae,zoomOnDoubleClick:!Ae,allowKeyboardDelete:true,showControls:true,showMiniMap:!Ae,showInteractiveControl:true},...ne??{}};return xe?{...u,nodesDraggable:false,nodesConnectable:false,elementsSelectable:false,edgesFocusable:false,edgesReconnectable:false,connectOnClick:false,panOnDrag:false,panOnScroll:false,zoomOnScroll:false,zoomOnPinch:false,zoomOnDoubleClick:false,allowKeyboardDelete:false,showInteractiveControl:false}:u},[Ae,B,O,L,X,ne,xe]),bo=lt.useMemo(()=>({enabled:z?.enabled??true,showRearToggle:z?.showRearToggle??true,showDeRack:z?.showDeRack??true}),[z]),{toObject:ln,setViewport:cn,setNodes:un,setEdges:pn,getNodes:gt,getEdges:gn,fitView:Zo,flowToScreenPosition:qo}=reactflow.useReactFlow();lt.useEffect(()=>{S&&S({toObject:()=>ln(),setViewport:cn,setNodes:n=>{un(n),j.setState({nodes:n});},setEdges:n=>{pn(n),j.setState({edges:n});},toImage:n=>$e.current?htmlToImage.toPng($e.current,Ks(n)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>gt(),getEdges:()=>gn(),fitView:n=>{if(n?.nodes&&Array.isArray(n.nodes)&&n.nodes.length>0){let u=n.nodes.map(H=>gt().find(R=>R.id===H)).filter(H=>H!==void 0),{nodes:h,...g}=n;Zo({...g,nodes:u});}else {let{nodes:u,...h}=n||{};Zo(h);}}});},[S,ln,cn,un,pn,j,Zo,gt,gn]);let[ft,fn]=lt.useState(false),Ki=lt.useCallback(()=>{if(!ft){if(!$e.current){s&&console.error("ReactFlow wrapper ref is not available");return}fn(true),htmlToImage.toPng($e.current,{filter:n=>!(n?.classList?.contains("react-flow__minimap")||n?.classList?.contains("react-flow__controls")||n?.classList?.contains("react-flow__attribution")||n?.classList?.contains("download-button")||n?.tagName==="BUTTON"),backgroundColor:w==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(n=>{let u=document.createElement("a");u.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,u.href=n,u.click();}).catch(n=>{s&&console.error("Error downloading image:",n);}).finally(()=>{fn(false);});}},[w,s,ft]),[bn,ho]=lt.useState(null),hn=lt.useRef(null),mn=lt.useRef(C),yn=lt.useRef(v);lt.useEffect(()=>{mn.current=C;},[C]),lt.useEffect(()=>{yn.current=v;},[v]),lt.useEffect(()=>{hn.current=bn;},[bn]);let Jo=lt.useCallback((n,u)=>{mn.current?.(n,u);},[]),Qo=lt.useCallback((n,u)=>{yn.current?.(n,u);},[]),er=lt.useCallback(()=>hn.current,[]),wn=lt.useRef({...Hi(Jo,Qo,er),...m??{}});lt.useEffect(()=>{wn.current={...Hi(Jo,Qo,er),...m??{}};},[Jo,Qo,er,m]);let Zi=lt.useMemo(()=>({...Vs,...f??{}}),[f]),Xe=lt.useRef(ye);lt.useEffect(()=>{Xe.current=ye;},[ye]);let Y=lt.useRef(qe);lt.useEffect(()=>{Y.current=qe;},[qe]),lt.useEffect(()=>{ce(ae);},[ae,ce]),lt.useEffect(()=>{Ge(Ne);},[Ne,Ge]),lt.useEffect(()=>{if(M&&t){let n=$(t,e||[]);n.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-n.length} duplicate(s) removed`),a?.(n));}},[M,t,e,$,a,s]),lt.useEffect(()=>{M&&j.setState({nodes:e||[]});},[M,e,j]),lt.useEffect(()=>{M&&j.setState({edges:t||[]});},[M,t,j]),lt.useEffect(()=>{if(!F||!ye||ye.length===0)return;let n=ye.filter(P=>P.type==="rack");if(n.length===0)return;let u=n.map(P=>{let se=P.data?.uHeight||42,ke=60+se*20;return (P.position?.y||0)+ke}),h=Math.min(...u),g=Math.max(...u);if(g-h<20)return;let R=g,I=ye.map(P=>{if(P.type!=="rack")return P;let se=P.data?.uHeight||42,ke=60+se*20,Re=(P.position?.y||0)+ke,ve=R-Re;return Math.abs(ve)<5?P:{...P,position:{x:P.position?.x||0,y:(P.position?.y||0)+ve}}});I.some((P,K)=>P.position!==ye[K].position)&&ce(I);},[F,ye,ce]);let Gt=lt.useRef(new Map);lt.useEffect(()=>{let n=new Map;ye.forEach(u=>{n.set(u.id,u);}),Gt.current=n;},[ye]);let pe=lt.useCallback(n=>Gt.current.get(n),[]),Oe=lt.useCallback(n=>{if(!n)return;if(typeof n.parentId=="string")return n.parentId;let u=n.parentNode;if(typeof u=="string")return u},[]),tr=lt.useCallback(n=>{if(!n||n.type!=="device")return false;let u=n.data?.deviceType;return typeof u=="string"&&u.toLowerCase().replace(/_/g,"-")==="patch-panel"},[]),mo=lt.useCallback(n=>{Xe.current=n;let u=new Map;n.forEach(h=>{u.set(h.id,h);}),Gt.current=u,ce(n),M?i?.(n):j.setState({nodes:n});},[M,j,ce,i]),we=lt.useCallback(n=>{Y.current=n,Ge(n),M?a?.(n):j.setState({edges:n});},[M,j,Ge,a]),it=lt.useCallback(n=>{if(n.positionAbsolute)return n.positionAbsolute;let u=n.position?.x||0,h=n.position?.y||0,g=Oe(n),H=new Set;for(;g&&!H.has(g);){H.add(g);let R=pe(g);if(!R)break;if(R.positionAbsolute){u+=R.positionAbsolute.x,h+=R.positionAbsolute.y;break}u+=R.position?.x||0,h+=R.position?.y||0,g=Oe(R);}return {x:u,y:h}},[pe,Oe]),yo=lt.useCallback(n=>{let u=it(n),h=n.width||0,g=n.height||0;return {x:u.x+h/2,y:u.y+g/2}},[it]),Xt=lt.useCallback((n,u)=>{if(!n||!u)return;let h=pe(n);if(!h)return;let g=u.replace(/-(source|target)$/i,"");if(h.type==="fibre-split"&&g.startsWith("output-")){let R=Y.current.filter(I=>I.target===n&&(I.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"));if(R.length>0){let I=R[0]?.data?.color;if(I)return {color:I}}}if((h.type==="tube"||h.type==="cable")&&u.startsWith("fiber-")){let R=u.replace("fiber-",""),I=parseInt(R,10);if(I>=1&&I<=24){let W=wt(I),P=I>12;return {color:W,striped:P}}}if((h.type==="multi-tube-cable"||h.type==="tube")&&u.startsWith("tube-")){let R=u.replace("tube-",""),I=parseInt(R,10);if(I>=1&&I<=24){let W=De(I),P=I>12;return {color:W,striped:P}}}let H=h.data;if(H.color)return {color:H.color}},[pe]),Nn=lt.useRef(new Map);lt.useEffect(()=>{Ge(n=>{let u=false,h=n.map(g=>{let H=ue(g);return Nn.current.get(g.id)!==H?(u=true,Nn.current.set(g.id,H),{...g,zIndex:H,style:{...g.style,zIndex:H}}):g});return u?h:n});},[ye,Ge,ue]),lt.useEffect(()=>{let n=ye.map(h=>{if(h.type==="coupler"&&h.parentId){let g=pe(h.parentId);if(g&&(g.type==="patch-panel"||g.type==="closure")&&(!h.extent||h.extent!=="parent"))return {...h,extent:"parent"}}if(h.type==="splice"&&h.parentId&&h.data.holderPosition&&(!h.position||h.position.x===0&&h.position.y===0)){let g=pe(h.parentId);if(g&&g.type==="splice-tray"){let H=h.data.mode==="ribbon",R=uo(g,h.data.holderPosition,H);return {...h,position:R}}}if(We(h)&&h.parentId&&h.data.uPosition&&(!h.position||h.position.x===0&&h.position.y===0)){let g=pe(h.parentId);if(g){let H=h.data.uHeight||1,R=_t(g,h.data.uPosition,H);return {...h,position:R}}}return h});n.some((h,g)=>{let H=ye[g];return h.extent!==H.extent||h.position?.x!==H.position?.x||h.position?.y!==H.position?.y})&&ce(n);},[ye,ce,pe]);let qi=lt.useCallback(n=>{if(xe)return null;let u=new Map,h=new Map,g=new Set,H=n.map(W=>{if(W.type==="position"&&W.position){let P=pe(W.id);if(P&&P.type==="coupler"&&P.parentId){let K=pe(P.parentId);if(K&&(K.type==="patch-panel"||K.type==="closure"))return (!P.extent||P.extent!=="parent")&&g.add(P.id),{...W,position:P.position||{x:0,y:0}}}if(P&&(P.type==="tube"||P.type==="splice-tray")&&P.parentId){let K=pe(P.parentId);if(K&&K.type==="closure")return (!P.extent||P.extent!=="parent")&&g.add(P.id),{...W,position:P.position||{x:0,y:0}}}if(P&&P.type==="splice"&&P.parentId){let K=pe(P.parentId);if(K&&K.type==="splice-tray"){let se=Er(P,K,W.position,Xe.current);return se.holderPosition!==void 0&&u.set(P.id,se.holderPosition),{...W,position:{x:se.x,y:se.y}}}}if(P&&We(P)&&P.parentId){let K=pe(P.parentId);if(K&&K.type==="rack"){let se=Co(P,K,W.position,Xe.current);return se.uPosition!==void 0&&h.set(P.id,se.uPosition),{...W,position:{x:se.x,y:se.y}}}}}return W}),R=reactflow.applyNodeChanges(H,Xe.current).map(W=>{let P=W;g.has(W.id)&&(P={...P,extent:"parent"});let K=u.get(W.id);K!==void 0&&(P={...P,data:{...P.data,holderPosition:K}});let se=h.get(W.id);return se!==void 0&&(P={...P,data:{...P.data,uPosition:se}}),P});Xe.current=R;let I=new Map;return R.forEach(W=>{I.set(W.id,W);}),Gt.current=I,ce(R),R},[ce,pe,xe]),Ji=lt.useCallback((n,u)=>{ho(null);},[]),Qi=lt.useCallback((n,u,h)=>{let g=Oe(u);if(!y||!We(u)||g){ho(null);return}let H=Xe.current.filter(P=>P.type==="rack").map(P=>P),R=yo(u),W=Go(R,H)?.id??null;ho(P=>P===W?P:W);},[y,yo,Oe]),ea=lt.useCallback((n,u,h)=>{ho(null);let g=Oe(u);if(!y||!We(u)||g)return;let H=it(u),R=Xe.current.filter(he=>he.type==="rack").map(he=>he),I=yo(u),W=Go(I,R),P=Xe.current;if(!W)return;let K={x:H.x-W.position.x,y:H.y-W.position.y},se=P.find(he=>he.id===u.id)||u,ke={...se,parentId:W.id,extent:"parent",position:{x:0,y:K.y},data:{...se.data}},Re=P.filter(he=>he.id!==u.id).concat(ke),ve=Co(ke,W,ke.position,Re),Ue=P.map(he=>he.id!==u.id?he:{...he,parentId:W.id,extent:"parent",position:{x:ve.x,y:ve.y},data:{...he.data,uPosition:ve.uPosition??he.data.uPosition}});mo(Ue);},[y,it,yo,mo,Oe]),ta=lt.useCallback(n=>{if(!n.source||!n.target||!n.sourceHandle||!n.targetHandle)return true;let u=pe(n.source),h=pe(n.target),g=te(u,n.sourceHandle),H=te(h,n.targetHandle),R=Y.current.some(G=>G.source===n.source?te(u,G.sourceHandle)===g:G.target===n.source?te(u,G.targetHandle)===g:false),I=Y.current.some(G=>G.target===n.target?te(h,G.targetHandle)===H:G.source===n.target?te(h,G.sourceHandle)===H:false);if(R&&s&&console.log("Connection will replace: Source handle already connected",{source:n.source,sourceHandle:n.sourceHandle,existingEdges:Y.current.filter(G=>G.source===n.source&&G.sourceHandle===n.sourceHandle||G.target===n.source&&G.targetHandle===n.sourceHandle)}),I&&s&&console.log("Connection will replace: Target handle already connected",{target:n.target,targetHandle:n.targetHandle,existingEdges:Y.current.filter(G=>G.target===n.target&&G.targetHandle===n.targetHandle||G.source===n.target&&G.sourceHandle===n.targetHandle)}),!Uo(u,h))return true;if(u?.type==="splice"&&h?.type==="splice"){let G=u.data?.mode==="ribbon",ge=h.data?.mode==="ribbon";if(G!==ge)return s&&console.log("Connection rejected: Ribbon splices can only connect to other ribbon splices",n),false}let P=(G,ge)=>(G?.type==="tube"||G?.type==="cable")&&!!ge&&ge.startsWith("fiber-"),K=(G,ge)=>(G?.type==="tube"||G?.type==="multi-tube-cable")&&!!ge&&ge.startsWith("tube-"),se=(G,ge)=>G?.type==="multi-tube-cable"&&!!ge&&ge.startsWith("tube-"),ke=(G,ge)=>G?.type==="tube"&&!!ge&&ge.startsWith("tube-"),Re=(G,ge)=>(G?.type==="cable"||G?.type==="multi-tube-cable")&&ge==="cable-button",ve=(G,ge)=>G?.type==="splice"&&(ge==="left"||ge==="right"),Ue=(G,ge)=>G?.type==="coupler"&&!!ge&&(ge.startsWith("left-")||ge.startsWith("right-")),he=(G,ge)=>{if(G?.type!=="fibre-split"||!ge)return false;let N=ge.replace(/-(source|target)$/i,"");return N.startsWith("input-")||N.startsWith("output-")},_e=P(u,n.sourceHandle),Ve=P(h,n.targetHandle),Le=ve(u,n.sourceHandle),Ce=ve(h,n.targetHandle),Je=Ue(u,n.sourceHandle),Z=Ue(h,n.targetHandle),He=he(u,n.sourceHandle),de=he(h,n.targetHandle),wo=Re(u,n.sourceHandle),ir=Re(h,n.targetHandle),Dt=se(u,n.sourceHandle),Ft=se(h,n.targetHandle),ar=ke(u,n.sourceHandle),sr=ke(h,n.targetHandle),No=K(u,n.sourceHandle),dr=K(h,n.targetHandle);return _e&&Ce||Ve&&Le||(Le&&(Z||de)||Ce&&(Je||He))||(Je&&(Z||de||Ce)||Z&&(Je||He||Le))||wo&&ir||(Dt&&sr||Ft&&ar)?true:No&&dr?(s&&console.log("Connection rejected: Tube handles can only connect between cable and tube nodes",n),false):(s&&console.log("Connection rejected: Connection not allowed by fiber rules",n),false)},[pe,s]),oa=lt.useCallback(n=>{if(xe)return;s&&console.log("onConnect called:",n);let u=pe(n.source),h=pe(n.target);s&&(console.log("onConnect: sourceNode type:",u?.type,"targetNode type:",h?.type),console.log("onConnect: sourceHandle:",n.sourceHandle,"targetHandle:",n.targetHandle));let g=Si(n,u,h),H=j.validateConnection({source:g.source??null,target:g.target??null,sourceHandle:g.sourceHandle,targetHandle:g.targetHandle});if(!H.valid&&!(H.reason??"").includes("already connected")){s&&console.warn(`Connection rejected: ${H.reason}`);return}let R=u?.type==="vertical-pdu",I=u?.type==="vertical-pdu"||h?.type==="vertical-pdu",W=Et(u,g.sourceHandle),P=Et(h,g.targetHandle),K=W&&P&&I,se=u?.data,ke=u?.type==="switch"||u?.type==="device"&&se?.deviceType==="switch",Re=P,ve=!!g.targetHandle&&(g.targetHandle.startsWith("net-")||g.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(Te(g.targetHandle))),Ue=!!g.sourceHandle&&(g.sourceHandle.startsWith("net-")||g.sourceHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(Te(g.sourceHandle))),he=h?.type==="switch"||h?.type==="device"&&h.data?.deviceType==="switch",_e=h?.type==="vertical-pdu",Ve=W,Le=u?.type==="tube"&&h?.type==="multi-tube-cable",Ce=u?.type==="multi-tube-cable"&&h?.type==="tube",Je=Le||Ce,Z=g.sourceHandle==="cable-button"&&g.targetHandle==="cable-button",He="fiber";K?He="power":Z?He="thick-cable":Je&&(He=ee?"smoothstep":"fiber");let de,wo=Ci(h),ir=Ci(u);if(wo||ir){let N=h?.data,V=u?.data,me=wo?N.ribbonFiberIds:V.ribbonFiberIds;me&&Array.isArray(me)&&me.length>=6&&me.length<=12&&(de={ribbonFiberIds:me,isRibbon:true});}if(!de&&(He==="fiber"||He==="smoothstep")&&!R){let N;Le?N=Xt(g.target,g.targetHandle):N=Xt(g.source,g.sourceHandle),N&&(de={color:N.color,striped:N.striped,isRibbon:false});}else if(He==="thick-cable"&&Z){let N=u?.data;de={color:N?.color||(N?.tubeStartIndex?De(N.tubeStartIndex):"#6366f1")};}let Dt=te(u,g.sourceHandle),Ft=te(h,g.targetHandle),ar=Y.current.some(N=>N.source===g.source?te(u,N.sourceHandle)===Dt:N.target===g.source?te(u,N.targetHandle)===Dt:false),sr=Y.current.some(N=>N.target===g.target?te(h,N.targetHandle)===Ft:N.source===g.target?te(h,N.sourceHandle)===Ft:false);if(ar||sr){let N=new Set;for(let V of Y.current){if(V.source===g.source&&te(u,V.sourceHandle)===Dt){N.add(V.id);continue}if(V.target===g.source&&te(u,V.targetHandle)===Dt){N.add(V.id);continue}if(V.source===g.target&&te(h,V.sourceHandle)===Ft){N.add(V.id);continue}V.target===g.target&&te(h,V.targetHandle)===Ft&&N.add(V.id);}if(N.size>0){let V=Y.current.filter(Ye=>!N.has(Ye.id)),me=reactflow.addEdge(g,V);if(me.length===V.length)s&&console.warn("Handle replacement skipped: addEdge did not create a new edge",g);else {let Ye=me[me.length-1],at=ue({...g,id:Ye.id,type:He}),bt={...Ye,type:He,zIndex:at,style:{...Ye.style,zIndex:at},data:de!==void 0?de:Ye.data};we([...me.slice(0,-1),bt]),s&&console.log("Handle replacement: Replaced",N.size,"edge(s)");return}}}if(h?.type==="splice"&&(n.targetHandle==="left"||n.targetHandle==="right")&&n.target&&n.targetHandle){let N=Y.current.find(V=>V.target===n.target&&V.targetHandle===n.targetHandle||V.source===n.target&&V.sourceHandle===n.targetHandle);if(N){s&&(console.log("Splice target handle replacement: Found existing edge",N.id,"on splice handle",n.targetHandle),console.log("Existing edge details:",{id:N.id,source:N.source,target:N.target,sourceHandle:N.sourceHandle,targetHandle:N.targetHandle,data:N.data}));let V=n.source&&n.sourceHandle?Y.current.find(Qe=>Qe.source===n.source&&Qe.sourceHandle===n.sourceHandle):null;s&&V&&console.log("Splice target handle replacement: Also found existing source edge",V.id);let me=new Set;N&&me.add(N.id),V&&V.id!==N.id&&me.add(V.id);let Ye=Y.current.filter(Qe=>!me.has(Qe.id));s&&console.log("Splice target handle replacement: Removing",me.size,"edge(s), creating new connection");let at=`edge-${n.source}-${n.sourceHandle}-${n.target}-${n.targetHandle}-${Date.now()}`,bt=ue({...n,id:at,type:"fiber"}),Kt={id:at,source:n.source,target:n.target,sourceHandle:n.sourceHandle,targetHandle:n.targetHandle,type:"fiber",zIndex:bt,style:{zIndex:bt},data:de!==void 0?de:{}},cr=[...Ye,Kt];we(cr),s&&console.log("Splice target handle replacement: Successfully replaced edge with new edge",Kt.id);return}}if(u?.type==="splice"&&n.sourceHandle==="right"&&n.source&&n.sourceHandle){let N=Y.current.find(V=>V.source===n.source&&V.sourceHandle===n.sourceHandle||V.target===n.source&&V.targetHandle===n.sourceHandle);if(N){s&&console.log("Splice source handle replacement: Found existing edge",N.id,"on splice handle",n.sourceHandle);let V=n.target&&n.targetHandle?Y.current.find(Qe=>Qe.target===n.target&&Qe.targetHandle===n.targetHandle):null;s&&V&&console.log("Splice source handle replacement: Also found existing target edge",V.id);let me=new Set;N&&me.add(N.id),V&&V.id!==N.id&&me.add(V.id);let Ye=Y.current.filter(Qe=>!me.has(Qe.id));s&&console.log("Splice source handle replacement: Removing",me.size,"edge(s), creating new connection");let at=`edge-${n.source}-${n.sourceHandle}-${n.target}-${n.targetHandle}-${Date.now()}`,bt=ue({...n,id:at,type:"fiber"}),Kt={id:at,source:n.source,target:n.target,sourceHandle:n.sourceHandle,targetHandle:n.targetHandle,type:"fiber",zIndex:bt,style:{zIndex:bt},data:de!==void 0?de:{}},cr=[...Ye,Kt];we(cr),s&&console.log("Splice source handle replacement: Successfully replaced edge with new edge",Kt.id);return}}if((u?.type==="tube"||u?.type==="cable")&&n.sourceHandle?.startsWith("fiber-")&&n.source&&n.sourceHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"source",data:de});if(N){we(N);return}}if((h?.type==="tube"||h?.type==="cable")&&n.targetHandle?.startsWith("fiber-")&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"target",data:de});if(N){we(N);return}}if((u?.type==="multi-tube-cable"||u?.type==="tube")&&n.sourceHandle?.startsWith("tube-")&&n.source&&n.sourceHandle){let N=Pe({edges:Y.current,connection:g,edgeType:He,selectEdgeZIndex:ue,findBy:"source",data:de});if(N){we(N);return}}if((h?.type==="multi-tube-cable"||h?.type==="tube")&&n.targetHandle?.startsWith("tube-")&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:He,selectEdgeZIndex:ue,findBy:"target",data:de});if(N){we(N);return}}if(u?.type==="coupler"&&(n.sourceHandle?.startsWith("left-")||n.sourceHandle?.startsWith("right-"))){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"source",data:de});if(N){we(N);return}}if(h?.type==="coupler"&&(n.targetHandle?.startsWith("left-")||n.targetHandle?.startsWith("right-"))){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"target",data:de});if(N){we(N);return}}if(Z&&n.source&&n.sourceHandle&&n.target&&n.targetHandle){let N=u?.data,V=N?.color||(N?.tubeStartIndex?De(N.tubeStartIndex):"#6366f1"),me=Pe({edges:Y.current,connection:g,edgeType:"thick-cable",selectEdgeZIndex:ue,findBy:"source",data:{color:V}});if(me){we(me);return}if(me=Pe({edges:Y.current,connection:g,edgeType:"thick-cable",selectEdgeZIndex:ue,findBy:"target",data:{color:V}}),me){we(me);return}}if(R&&Re&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"power",selectEdgeZIndex:ue,findBy:"target",data:de});if(N){we(N);return}}if(_e&&Ve&&n.source&&n.sourceHandle&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"power",selectEdgeZIndex:ue,findBy:"source",matchOn:"target",data:de});if(N){we(N);return}}if(ke&&ve&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"target",data:de});if(N){we(N);return}}if(he&&Ue&&n.source&&n.sourceHandle&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"target",matchOn:"source",data:de});if(N){we(N);return}}let No=j.validateConnection({source:g.source??null,target:g.target??null,sourceHandle:g.sourceHandle,targetHandle:g.targetHandle});if(!No.valid){if(R&&n.source&&n.sourceHandle){let N=Pe({edges:Y.current,connection:g,edgeType:Re?"power":"fiber",selectEdgeZIndex:ue,findBy:"source",data:de});if(N){we(N);return}}if(_e&&n.source&&n.sourceHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"power",selectEdgeZIndex:ue,findBy:"source",matchOn:"target",data:de});if(N){we(N);return}}if(ke&&n.source&&n.sourceHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"source",data:de});if(N){we(N);return}}if(he&&n.target&&n.targetHandle){let N=Pe({edges:Y.current,connection:g,edgeType:"fiber",selectEdgeZIndex:ue,findBy:"target",matchOn:"source",data:de});if(N){we(N);return}}s&&console.warn(`Connection rejected: ${No.reason}`);return}let dr=Y.current.some(N=>N.source===g.source&&N.sourceHandle===g.sourceHandle||N.target===g.source&&N.targetHandle===g.sourceHandle),vn=Y.current.some(N=>N.target===g.target&&N.targetHandle===g.targetHandle||N.source===g.target&&N.sourceHandle===g.targetHandle),lr=(N,V)=>!N||!V?false:!!(N.startsWith("tube-")||V.type==="splice"&&(N==="left"||N==="right")||N==="cable-button"),Cn=lr(g.sourceHandle||"",u),Hn=lr(g.targetHandle||"",h);if(dr&&!Cn){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:n.source,sourceHandle:g.sourceHandle,existingEdges:Y.current.filter(N=>N.source===g.source&&N.sourceHandle===g.sourceHandle||N.target===g.source&&N.targetHandle===g.sourceHandle)});return}if(vn&&!Hn){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:g.target,targetHandle:g.targetHandle,existingEdges:Y.current.filter(N=>N.target===g.target&&N.targetHandle===g.targetHandle||N.source===g.target&&N.sourceHandle===g.targetHandle)});return}let Pn={...g,type:He,zIndex:ue({...g,id:"temp-id"}),data:de},G=reactflow.addEdge(Pn,Y.current),ge=G[G.length-1];ge&&(kn(N=>new Set(N).add(ge.id)),setTimeout(()=>{kn(N=>{let V=new Set(N);return V.delete(ge.id),V});},1e3)),we(G);},[we,j,ue,pe,s,Xt,ee,xe]),ra=lt.useCallback((n,u)=>{if(xe||!u.source||!u.target||!u.sourceHandle||!u.targetHandle)return;let h=pe(u.source),g=pe(u.target),H=Si(u,h,g),R=te(h,H.sourceHandle),I=te(g,H.targetHandle),W=Y.current.some(Z=>{if(Z.id===n.id)return false;let He=Z.source===H.source&&te(h,Z.sourceHandle)===R||Z.target===H.source&&te(h,Z.targetHandle)===R,de=Z.target===H.target&&te(g,Z.targetHandle)===I||Z.source===H.target&&te(g,Z.sourceHandle)===I;return He||de}),P=j.validateConnection({source:H.source??null,target:H.target??null,sourceHandle:H.sourceHandle,targetHandle:H.targetHandle,ignoreEdgeId:n.id});if(!P.valid&&!((P.reason??"").includes("already connected")&&W)){s&&console.warn(`Edge update rejected: ${P.reason}`);return}let K=h?.type==="vertical-pdu"||g?.type==="vertical-pdu",se=Et(h,H.sourceHandle),ke=Et(g,H.targetHandle),Re=se&&ke&&K,ve=h?.type==="tube"&&g?.type==="multi-tube-cable",Ue=h?.type==="multi-tube-cable"&&g?.type==="tube",he=ve||Ue,_e;Re?_e="power":he?_e=ee?"smoothstep":"fiber":_e="fiber";let Ve;if(_e==="fiber"||_e==="smoothstep"){let Z=Xt(H.source,H.sourceHandle);Z&&(Ve={color:Z.color,striped:Z.striped});}let Je=Y.current.filter(Z=>{if(Z.id===n.id)return true;let He=Z.source===H.source&&te(h,Z.sourceHandle)===R||Z.target===H.source&&te(h,Z.targetHandle)===R,de=Z.target===H.target&&te(g,Z.targetHandle)===I||Z.source===H.target&&te(g,Z.sourceHandle)===I;return !(He||de)}).map(Z=>Z.id===n.id?{...Z,source:H.source,target:H.target,sourceHandle:H.sourceHandle,targetHandle:H.targetHandle,type:_e,data:Ve!==void 0?{...Z.data,...Ve}:Z.data,zIndex:ue({...H,id:Z.id,type:_e}),style:{...Z.style,zIndex:ue({...H,id:Z.id,type:_e})}}:Z);we(Je);},[we,pe,Xt,ue,ee,s,j,xe]),na=lt.useCallback((n,u)=>{if(Ae){l&&l(u);return}let h=n.metaKey||n.ctrlKey,g=gt(),H=u,R=Oe(u);if(u.type==="tube"&&R&&!h){let I=g.find(W=>W.id===R&&(W.type==="cable"||W.type==="multi-tube-cable"));I&&(H=I);}if(or(H),Yt([]),ce(I=>I.map(W=>{let P=W.id===H.id;return W.selected===P?W:{...W,selected:P}})),h&&We(H)){let I=H.data||{},W=I.view||(Array.isArray(I.rearPorts)&&I.rearPorts.length>0?"rear":"front"),P=W==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${H.id} from ${W} to ${P}`),C&&C(H.id,P);}l&&l(H);},[C,l,s,gt,ce,Ae,Oe]),ia=lt.useCallback(()=>{},[]),aa=lt.useCallback((n,u)=>{or(null),Yt([u]),ce(h=>h.map(g=>g.selected?{...g,selected:false}:g)),l?.(null),p&&p(u);},[p,l,ce]),sa=lt.useCallback(()=>{or(null),Yt([]),ce(n=>n.map(u=>u.selected?{...u,selected:false}:u)),l?.(null);},[l,ce]),[Be,or]=lt.useState(null),[xn,kn]=lt.useState(new Set);reactflow.useOnSelectionChange({onChange:({edges:n})=>{Yt(n||[]);}});let[rr,Yt]=lt.useState([]);lt.useEffect(()=>{let n=u=>{if(Ie.allowKeyboardDelete&&(u.key==="Backspace"||u.key==="Delete")&&rr.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let h=rr.filter(g=>{let H=g.sourceHandle||"",R=g.targetHandle||"";return H.startsWith("tube-")||R.startsWith("tube-")?(s&&console.log("Cannot delete edge connected to tube handle",g),false):true});if(h.length>0){let g=new Set(h.map(R=>R.id)),H=Y.current.filter(R=>!g.has(R.id));we(H),Yt([]),s&&console.log("Deleted edges:",h.map(R=>R.id));}}};return window.addEventListener("keydown",n),()=>window.removeEventListener("keydown",n)},[rr,we,s,Ie.allowKeyboardDelete]);let da=lt.useCallback((n,{nodeId:u,handleType:h})=>{s&&console.log("Connection started from",{nodeId:u,handleType:h});},[s]),la=lt.useCallback(n=>{s&&console.log("Connection ended",n);},[s]),ca=lt.useCallback(()=>{if(xe||!Be)return;let n=pe(Be.id);if(n){if(n.type==="rack"){let g=((n.data||{}).face||"front")==="front"?"rear":"front";v?(v(n.id,g),C&&gt().filter(R=>R.parentId===n.id).forEach(R=>{C(R.id,g);})):ce(H=>H.map(R=>R.id===n.id?{...R,data:{...R.data,face:g}}:R.parentId===n.id?{...R,data:{...R.data,view:g}}:R));return}if(We(n)){let u=n.data||{},h=Array.isArray(u.rearPorts)&&u.rearPorts.length>0,g=Array.isArray(u.ports)&&u.ports.length>0,R=(u.view||(h&&!g?"rear":"front"))==="front"?"rear":"front";C?C(n.id,R):ce(I=>I.map(W=>W.id===n.id?{...W,data:{...W.data,view:R}}:W));}}},[Be,pe,v,C,ce,gt,xe]),ua=lt.useCallback(()=>{if(xe||!y||!Be||!We(Be))return;let n=pe(Be.id),u=Oe(n);if(!n||!We(n)||!u)return;let h=it(n),H=Xe.current.map(R=>R.id!==n.id?R:{...R,parentId:void 0,parentNode:void 0,extent:void 0,position:h,data:{...R.data,uPosition:void 0}});mo(H);},[xe,y,Be,pe,it,mo,Oe]),pa=lt.useMemo(()=>{let n=Gt.current;return qe.map(u=>{let h=u,g=n.get(String(h.source)),H=n.get(String(h.target)),R=jo(h.sourceHandle||"",g),I=jo(h.targetHandle||"",H),W=Le=>{if(!Le||!We(Le))return;let Ce=Le.data??{},Je=Array.isArray(Ce.rearPorts)&&Ce.rearPorts.length>0,Z=Array.isArray(Ce.ports)&&Ce.ports.length>0;return Ce.view||(Je&&!Z?"rear":"front")},P=W(g),K=W(H),se=tr(g),ke=tr(H),Re=We(g)&&!se&&!!P&&!!R&&R!==P,ve=We(H)&&!ke&&!!K&&!!I&&I!==K,_e=Re||ve,Ve=u.style;if(_e)Ve={...u.style,opacity:0,pointerEvents:"none",zIndex:0};else if(u.style&&u.style.opacity===0&&u.style.pointerEvents==="none"&&u.style.zIndex===0){let Ce={...u.style};delete Ce.opacity,delete Ce.pointerEvents,delete Ce.zIndex,Ve=Object.keys(Ce).length>0?Ce:void 0;}return {...u,style:Ve,className:xn.has(u.id)?"edge-connecting":u.className}})},[qe,xn,tr]),Ee=lt.useMemo(()=>Be?pe(Be.id)??Be:null,[Be,pe]),It=lt.useMemo(()=>{if(!Ee||!bo.enabled||xe)return {showRearToggle:false,showDeRack:false,count:0};let n=Ee.type==="rack"||We(Ee),u=bo.showRearToggle&&n,h=bo.showDeRack&&y&&!xe&&We(Ee)&&!!Oe(Ee);return {showRearToggle:u,showDeRack:h,count:(u?1:0)+(h?1:0)}},[Ee,bo,y,xe,Oe]),nr=lt.useMemo(()=>{if(!Ee||It.count===0||!$e.current)return null;let n=$e.current.getBoundingClientRect();if(n.width<=0||n.height<=0)return null;let u=Ee.positionAbsolute??it(Ee),h=Ee.width||0,g=Ee.height||0,H=It.count>1?220:110,R=34;try{let I=qo({x:u.x+h/2,y:u.y}),W=qo({x:u.x+h/2,y:u.y+g}),P=I.x-n.left-H/2,K=I.y-n.top-R-10;return K<8&&(K=W.y-n.top+10),P=Math.max(8,Math.min(P,n.width-H-8)),K=Math.max(8,Math.min(K,n.height-R-8)),{left:P,top:K}}catch{return null}},[Ee,It,it,qo]),ga=En(w,T),fa=Tn(w,{touchAction:"none",...E});return jsxRuntime.jsxs("div",{ref:$e,className:ga,style:fa,children:[jsxRuntime.jsxs(reactflow.ReactFlow,{nodes:ye,edges:pa,onNodesChange:n=>{if(xe)return;let u=qi(n);u&&(M?i&&i(u):j.setState({nodes:u}));},onEdgesChange:n=>{if(xe)return;let u=n.filter(h=>{if(h.type==="remove"){let g=Y.current.find(H=>H.id===h.id);if(g){let H=g.sourceHandle||"",R=g.targetHandle||"";if(H.startsWith("tube-")||R.startsWith("tube-"))return s&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",g),false}}return true});if(u.length>0){let h=reactflow.applyEdgeChanges(u,Y.current);jt(u),M?a&&a(h):j.setState({edges:h});}},onConnect:xe?void 0:c??oa,onConnectStart:da,onConnectEnd:la,onEdgeUpdate:xe?void 0:b??ra,isValidConnection:x??ta,connectionMode:k,onNodeClick:na,onNodeDoubleClick:ia,onPaneClick:sa,onNodeDragStart:Ji,onNodeDrag:Qi,onNodeDragStop:ea,onEdgeClick:aa,onInit:_,nodeTypes:wn.current,edgeTypes:Zi,defaultEdgeOptions:{zIndex:1e3,reconnectable:Ie.edgesReconnectable},nodesDraggable:Ie.nodesDraggable,nodesConnectable:Ie.nodesConnectable,elementsSelectable:Ie.elementsSelectable,edgesFocusable:Ie.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:Ie.connectOnClick,panOnDrag:Ie.panOnDrag,panOnScroll:Ie.panOnScroll,zoomOnScroll:Ie.zoomOnScroll,zoomOnPinch:Ie.zoomOnPinch,zoomOnDoubleClick:Ie.zoomOnDoubleClick,preventScrolling:Ae,onlyRenderVisibleElements:true,fitView:true,fitViewOptions:J,proOptions:{hideAttribution:true},children:[jsxRuntime.jsx(reactflow.Background,{color:Rn(w)}),Ie.showControls&&jsxRuntime.jsx(reactflow.Controls,{showInteractive:Ie.showInteractiveControl}),Ie.showMiniMap&&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"})})]}),D&&jsxRuntime.jsx("button",{className:"download-button",onClick:Ki,disabled:ft,"aria-busy":ft,style:{position:"absolute",top:A.includes("top")?"10px":"auto",bottom:A.includes("bottom")?"10px":"auto",right:A.includes("right")?"10px":"auto",left:A.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:ft?"not-allowed":"pointer",opacity:ft?.7:1,transition:"all 0.2s ease",...le},children:ft?`${U}...`:U}),Ee&&nr&&It.count>0&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:nr.top,left:nr.left,display:"flex",gap:8,zIndex:2e3},children:[It.showRearToggle&&jsxRuntime.jsx("button",{onClick:n=>{n.preventDefault(),ca();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let n=Ee.data;if(Ee.type==="rack")return (n?.face||"front")==="front"?"Switch to rear":"Switch to front";{let u=Array.isArray(n?.rearPorts)&&n.rearPorts.length>0,h=Array.isArray(n?.ports)&&n.ports.length>0;return (n?.view||(u&&!h?"rear":"front"))==="front"?"Switch to rear":"Switch to front"}})(),children:(()=>{let n=Ee.data;if(Ee.type==="rack")return (n?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front";{let u=Array.isArray(n?.rearPorts)&&n.rearPorts.length>0,h=Array.isArray(n?.ports)&&n.ports.length>0;return (n?.view||(u&&!h?"rear":"front"))==="front"?"\u21C4 Rear":"\u21C4 Front"}})()}),It.showDeRack&&jsxRuntime.jsx("button",{onClick:n=>{n.preventDefault(),ua();},style:{background:"#7f1d1d",color:"#fee2e2",border:"1px solid #b91c1c",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:"Remove device from rack so it can be moved/reassigned",children:"De-rack"})]})]})},on=e=>jsxRuntime.jsx(reactflow.ReactFlowProvider,{children:jsxRuntime.jsx(Zs,{...e})});var rn=class extends lt.Component{constructor(){super(...arguments);this.state={error:null};this.reset=()=>{this.setState({error:null});};}static getDerivedStateFromError(o){return {error:o}}componentDidCatch(o,r){this.props.onError?.(o,r);}render(){let{error:o}=this.state,{children:r,fallback:i}=this.props;return o?typeof i=="function"?i(o,this.reset):i??jsxRuntime.jsxs("div",{role:"alert",style:{padding:16,margin:8,border:"1px solid #e53e3e",borderRadius:4,backgroundColor:"#fff5f5",color:"#c53030"},children:[jsxRuntime.jsx("strong",{children:"Diagram error"}),": ",o.message,jsxRuntime.jsx("button",{type:"button",onClick:this.reset,style:{marginLeft:12,padding:"4px 8px",cursor:"pointer"},children:"Try again"})]}):r}};function fo(e,{rowHeight:t,tubeGap:o}){let r=[],i=[],a=e.kind??(e.tubeCount?"tube":"simple"),d=a==="tube"?Math.max(1,Math.min(24,e.tubeCount??1)):1,s=a==="tube"?Math.max(1,Math.min(24,e.fibersPerTube??12)):Math.max(1,Math.min(24,e.fiberCount??12)),l=Math.max(1,e.tubeStartIndex??1),p=Math.max(1,e.fiberStartIndex??1),m=0;for(let f=0;f<d;f+=1){let c=l+f,b=e.tubeColorMap?.[c];i.push({tubeIndex:c,y:m,label:`T${c}`,color:b??De(c)});for(let x=0;x<s;x+=1){let k=p+x,C=fr(k);r.push({key:`${c}-${k}`,tubeIndex:a==="tube"?c:void 0,fiberIndex:k,y:m,color:wt(k),striped:yt(k),backgroundImage:typeof C.backgroundImage=="string"?C.backgroundImage:void 0}),m+=t;}f<d-1&&(m+=o);}return {rows:r,tubeLabels:i,height:m}}var nn=e=>typeof e=="object"&&e!==null,td=e=>{if(!nn(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&nn(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&nn(t.layout)}if(e.type==="fibre-flow-closure"){let t=e.data;return typeof t.label=="string"&&typeof t.width=="number"&&typeof t.height=="number"&&typeof t.headerHeight=="number"}return false},od=e=>e==="fibre-flow"||e==="fibre-flow-link",rd=e=>typeof e.id=="string"&&e.id.length>0&&typeof e.source=="string"&&e.source.length>0&&typeof e.target=="string"&&e.target.length>0,nd=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",id=(e,t=[])=>{let o=new Map(t.map(i=>[i.id,i])),r=[];return e.forEach(i=>{if(!rd(i))return;let a=o.get(i.id),d=od(i.type)?i.type:a?.type??nd(i);r.push({...a??{},...i,type:d});}),r},Di=e=>`fiber-${e.tube??1}-${e.fiber}`,Fi=e=>wt(e.fiber),_i=e=>yt(e.fiber),ad=(e,t)=>{if(t)return t;if(!(typeof e!="number"||Number.isNaN(e)))return e>=1e3?`${(e/1e3).toFixed(1)} km`:`${Math.round(e)} m`},sd=(e,t,o,r,i,a)=>e?`${o} ${a}`:t?`0 ${i} ${r} ${a}`:"6 6",dd=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,data:s})=>{let[l,p,m]=reactflow.getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,curvature:.35}),f=typeof s?.lossDb=="number"?`${s.lossDb.toFixed(2)} dB`:"",c=s?.label??f,b=s?.sourceColor,x=s?.targetColor,k=s?.color??b??x??"#94a3b8",C=s?.sourceStriped??false,v=s?.targetStriped??false,T=s?.highlighted??true,E=s?.dimmed??false,F=s?.circuitId,y=s?.circuitLabel??F,w=s?.showCircuitId??false,_=b&&x&&b!==x,S=r-t,D=i-o,A=Math.sqrt(S*S+D*D),U=p-t,le=m-o,ee=Math.sqrt(U*U+le*le),re=A>0?ee/A*100:50,ne=`fibre-flow-gradient-${e}`,z=C&&!v,B=v&&!C,O=C&&v,L=A*1.25,X=L/2,J=12,$=Math.ceil(X*1.2/J),M=Array($).fill("6 6").join(" "),oe=Math.ceil(X*1.2/J),ie=Array(oe).fill("6 6").join(" "),Q=w&&y,j=Math.max(c?c.length*6.2+16:0,Q?(y?.length||0)*5.5+16:0),ae=Q?32:16;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("defs",{children:_&&jsxRuntime.jsxs("linearGradient",{id:ne,x1:t,y1:o,x2:r,y2:i,gradientUnits:"userSpaceOnUse",children:[jsxRuntime.jsx("stop",{offset:"0%",stopColor:b}),jsxRuntime.jsx("stop",{offset:`${re}%`,stopColor:b}),jsxRuntime.jsx("stop",{offset:`${re}%`,stopColor:x}),jsxRuntime.jsx("stop",{offset:"100%",stopColor:x})]})}),_?jsxRuntime.jsx("path",{id:e,d:l,fill:"none",stroke:`url(#${ne})`,strokeWidth:T?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:E?.25:1,strokeOpacity:E?.25:1,style:{mixBlendMode:"normal"}}):jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:l,style:{stroke:k,strokeWidth:T?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:E?.25:1,strokeOpacity:E?.25:1,mixBlendMode:"normal"}}),(O||z||B)&&jsxRuntime.jsx("path",{id:`${e}-stripe`,d:l,fill:"none",stroke:"#000",strokeWidth:T?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:sd(z,B,M,ie,X,L),strokeDashoffset:0,opacity:E?.2:.9,style:{mixBlendMode:"normal"}}),(c||Q)&&T&&jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${p}px, ${m}px)`,width:j,height:ae,background:"rgba(248, 250, 252, 0.92)",border:"1px solid rgba(15, 23, 42, 0.4)",borderRadius:4,fontSize:10,fontFamily:"monospace",color:"rgba(15, 23, 42, 0.9)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none",padding:"2px 4px",zIndex:9999},children:[c&&jsxRuntime.jsx("div",{style:{lineHeight:1.2},children:c}),Q&&jsxRuntime.jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:c?2:0},children:y})]})})]})},ld=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,data:s})=>{let[l,p,m]=reactflow.getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:i,sourcePosition:a,targetPosition:d,curvature:.2}),f=s?.label,c=s?.color??"#64748b";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:l,style:{stroke:c,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),f&&jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:jsxRuntime.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${p}px, ${m}px)`,padding:"2px 8px",background:"rgba(30, 41, 59, 0.9)",border:`1px solid ${c}`,borderRadius:10,fontSize:10,fontFamily:"monospace",color:"#e2e8f0",letterSpacing:.2,whiteSpace:"nowrap",pointerEvents:"none",zIndex:9999},children:f})})]})},cd=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:i,showTubeLabels:a,showFiberNumbers:d,layout:s,colorMode:l="dark"}=e,p=l==="light",m=8,f=12,c=-1,b=0,x=t.jacketColor??"#facc15",k=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",C=a&&k,v=o==="left"?m+b:b,T=o==="right"?m+b:b,E=o==="left"?reactflow.Position.Right:reactflow.Position.Left,F={width:4,height:4,borderRadius:"50%",background:x,border:`1px solid ${x}`,boxShadow:"0 0 1px rgba(0,0,0,0.4)",top:"50%",position:"absolute",...o==="left"?{left:0,transform:"translate(-50%, -50%)"}:{right:0,transform:"translate(50%, -50%)"}};return jsxRuntime.jsxs("div",{style:{position:"relative",width:i,height:s.height,fontFamily:"monospace",color:"inherit",overflow:"visible"},children:[jsxRuntime.jsx("div",{style:{position:"absolute",top:-18,left:o==="left"?0:void 0,right:o==="right"?0:void 0,fontSize:10,fontWeight:700,letterSpacing:.4,textTransform:"uppercase",background:p?"rgba(248, 250, 252, 0.95)":"rgba(15, 23, 42, 0.9)",color:p?"#1a1a1a":"#f8fafc",padding:"2px 6px",borderRadius:4,whiteSpace:"nowrap",maxWidth:i,overflow:"hidden",textOverflow:"ellipsis",zIndex:10,...o==="right"?{textAlign:"right"}:{}},children:t.label}),jsxRuntime.jsx("div",{style:{position:"absolute",top:0,bottom:0,width:m,left:o==="left"?0:void 0,right:o==="right"?0:void 0,borderRadius:4,background:k?"transparent":x,border:`1px solid ${x}`,boxShadow:k?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:k&&s.tubeLabels.map((y,w)=>{let _=s.rows.filter(ee=>ee.tubeIndex===y.tubeIndex);if(_.length===0)return null;let S=_[0].y,D=_[_.length-1].y+r,A=D-S,U=s.tubeLabels[w+1],le=U&&U.y-D>0;return jsxRuntime.jsx("div",{style:{position:"absolute",top:S,left:0,right:0,height:A,background:y.color,borderLeft:`2px solid ${y.color}`,borderRight:`2px solid ${y.color}`,borderTop:w===0?`2px solid ${y.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:le?"1px solid rgba(0,0,0,0.15)":`2px solid ${y.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:w===0&&!le||w===0?"4px 4px 0 0":le?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${y.tubeIndex}`)})}),!C&&jsxRuntime.jsx("div",{style:{position:"absolute",top:0,bottom:0,left:v,right:T,...o==="left"?{borderRight:`1px solid ${x}`}:{borderLeft:`1px solid ${x}`},pointerEvents:"none",zIndex:0}}),k&&s.tubeLabels.map((y,w)=>{let _=s.rows.filter(U=>U.tubeIndex===y.tubeIndex);if(_.length===0)return null;let S=_[0].y,A=_[_.length-1].y+r-S;return jsxRuntime.jsx("div",{style:{position:"absolute",top:S,left:v,right:T,height:A,...o==="left"?{borderRight:`2px solid ${y.color}`}:{borderLeft:`2px solid ${y.color}`},opacity:.5,pointerEvents:"none"}},`tube-border-${y.tubeIndex}`)}),s.rows.map(y=>{let w=`fiber-${y.tubeIndex??1}-${y.fiberIndex}`,_=y.y+r/2,S={position:"absolute",width:f,height:f,borderRadius:"50%",top:_,background:y.backgroundImage?y.backgroundImage:y.color,backgroundColor:y.color,border:`2px solid ${y.color}`,boxShadow:"0 0 6px rgba(0,0,0,0.3)",...o==="left"?{right:-f/2}:{left:-f/2},transform:"translateY(-50%)",zIndex:1e3,cursor:"crosshair","--fiber-bg":y.color,minWidth:f,minHeight:f};y.backgroundImage&&(S["--fiber-bg-image"]=y.backgroundImage);let D=o==="left"?{right:f+c,textAlign:"right"}:{left:f+c,textAlign:"left"};return jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:w,type:"source",position:E,className:"fibre-flow-handle",style:S,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),jsxRuntime.jsx(reactflow.Handle,{id:w,type:"target",position:E,className:"fibre-flow-handle",style:S,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),d&&jsxRuntime.jsx("div",{style:{position:"absolute",top:y.y+r/2-6,...D,fontSize:8,fontWeight:600,color:p?"rgba(15, 23, 42, 0.7)":"rgba(148, 163, 184, 0.95)",whiteSpace:"nowrap",lineHeight:1},children:y.fiberIndex})]},y.key)}),jsxRuntime.jsx(reactflow.Handle,{id:"cable-run",type:"source",position:o==="left"?reactflow.Position.Left:reactflow.Position.Right,className:"cable-run-handle",style:F,isConnectable:true,"data-handle-type":"cable-run"}),jsxRuntime.jsx(reactflow.Handle,{id:"cable-run",type:"target",position:o==="left"?reactflow.Position.Left:reactflow.Position.Right,className:"cable-run-handle",style:F,isConnectable:true,"data-handle-type":"cable-run"})]})},ud=({data:e})=>{let t=e.colorMode==="light";return jsxRuntime.jsx("div",{style:{width:e.width,height:e.height,background:"transparent",border:t?"1px solid rgba(148, 163, 184, 0.3)":"1px solid rgba(148, 163, 184, 0.5)",borderRadius:12,boxShadow:t?"0 12px 24px rgba(0, 0, 0, 0.1)":"0 12px 24px rgba(15, 23, 42, 0.2)",position:"relative",pointerEvents:"none"},children:jsxRuntime.jsx("div",{style:{height:e.headerHeight,display:"flex",alignItems:"center",justifyContent:"center",fontFamily:"monospace",fontWeight:700,fontSize:12,letterSpacing:.6,textTransform:"uppercase",color:t?"rgba(15, 23, 42, 0.9)":"rgba(226, 232, 240, 0.9)",background:t?"rgba(241, 245, 249, 0.7)":"rgba(15, 23, 42, 0.6)",borderBottom:t?"1px solid rgba(148, 163, 184, 0.2)":"1px solid rgba(148, 163, 184, 0.35)",borderTopLeftRadius:12,borderTopRightRadius:12},children:e.label})})},pd=(e,t,o,r,i,a,d,s,l,p="dark")=>{let m=[],f=0;return e.forEach(c=>{let b=fo(c.leftCable,{rowHeight:o,tubeGap:r}),x=fo(c.rightCable,{rowHeight:o,tubeGap:r}),k=Math.max(b.height,x.height),C=a*2+d,v=32,T=16,E=C+T*2,F=k+v+T*2,y=`flow-closure-${c.id}`,w=`flow-cable-${c.id}-left`,_=`flow-cable-${c.id}-right`,S=t==="horizontal"?{x:f,y:0}:{x:0,y:f};f+=(t==="horizontal"?E:F)+i;let D=c.chamberId?`${c.id} - ${c.chamberId}`:c.id;m.push({id:y,type:"fibre-flow-closure",position:S,data:{label:D,width:E,height:F,headerHeight:v,colorMode:p},selectable:false,draggable:false,style:{width:E,height:F}});let A=v+T+(k-b.height)/2,U=v+T+(k-x.height)/2;m.push({id:w,type:"fibre-flow-cable",position:{x:T,y:A},parentId:y,extent:"parent",data:{label:c.leftCable.label,cable:c.leftCable,side:"left",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:l,layout:b,colorMode:p},style:{width:a,height:b.height}}),m.push({id:_,type:"fibre-flow-cable",position:{x:T+C-a,y:U},parentId:y,extent:"parent",data:{label:c.rightCable.label,cable:c.rightCable,side:"right",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:l,layout:x,colorMode:p},style:{width:a,height:x.height}});}),m},gd=(e,t,o,r=false)=>{let i=[],a=new Map,d=new Map,s=new Map;return (t??[]).forEach(l=>{l.color&&a.set(l.id,l.color),l.label&&d.set(l.id,l.label);}),e.forEach(l=>{let p=`flow-cable-${l.id}-left`,m=`flow-cable-${l.id}-right`;[{nodeId:p,cable:l.leftCable},{nodeId:m,cable:l.rightCable}].forEach(({nodeId:c,cable:b})=>{let x=s.get(b.id);if(x&&x.closureId!==l.id){let k=ad(b.distanceMeters??x.distanceMeters,b.distanceLabel??x.distanceLabel),C=b.jacketColor??x.jacketColor??"#64748b";i.push({id:`flow-link-${x.nodeId}-${c}`,type:"fibre-flow-link",source:x.nodeId,target:c,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:k,color:C}});}s.set(b.id,{nodeId:c,closureId:l.id,jacketColor:b.jacketColor,distanceLabel:b.distanceLabel,distanceMeters:b.distanceMeters});}),l.splices.forEach(c=>{let b=o?c.circuitId===o:true,x=!!o&&!b,k=c.circuitId?a.get(c.circuitId):void 0,C=c.circuitId?d.get(c.circuitId):void 0,v=c.color??k,T=Fi(c.from),E=Fi(c.to),F=_i(c.from),y=_i(c.to);i.push({id:`flow-edge-${l.id}-${c.id}`,type:"fibre-flow",source:p,target:m,sourceHandle:Di(c.from),targetHandle:Di(c.to),data:{lossDb:c.lossDb,label:c.label,color:v,sourceColor:T,targetColor:E,sourceStriped:F,targetStriped:y,highlighted:b,dimmed:x,circuitId:c.circuitId,circuitLabel:C,showCircuitId:r}});});}),i},fd=({closures:e,circuits:t,highlightedCircuitId:o,layout:r="horizontal",rowHeight:i=20,tubeGap:a=10,closureGap:d=140,cableColumnWidth:s=32,spliceAreaWidth:l=260,showTubeLabels:p=true,showFiberNumbers:m=true,colorMode:f="dark",showCircuitId:c=false,className:b,style:x,readOnly:k=false,panOnDrag:C=true,panOnScroll:v=true,zoomOnScroll:T=true})=>{let E=lt.useMemo(()=>pd(e,r,i,a,d,s,l,p,m,f),[e,r,i,a,d,s,l,p,m,f]),F=lt.useMemo(()=>gd(e,t,o,c),[e,t,o,c]),[y,w]=lt.useState(E),[_,S]=lt.useState(F);lt.useEffect(()=>{w(E);},[E,w]),lt.useEffect(()=>{S(F);},[F,S]);let D=lt.useCallback((O,L)=>{if(!O||!L||!L.startsWith("fiber-"))return;let X=y.find(Q=>Q.id===O);if(!X||X.type!=="fibre-flow-cable")return;let J=/^fiber-(\d+)-(\d+)$/.exec(L);if(!J)return;let $=Number(J[1]),M=Number(J[2]),ie=X.data.layout.rows.find(Q=>(Q.tubeIndex??1)===$&&Q.fiberIndex===M);if(ie)return {color:ie.color,striped:ie.striped??false}},[y]),A=lt.useCallback(O=>{if(k||!O.source||!O.target||!O.sourceHandle||!O.targetHandle)return false;let L=y.find(oe=>oe.id===O.source),X=y.find(oe=>oe.id===O.target);if(!L||!X)return false;let J=typeof O.sourceHandle=="string"&&O.sourceHandle.startsWith("fiber-"),$=typeof O.targetHandle=="string"&&O.targetHandle.startsWith("fiber-");return O.sourceHandle==="cable-run"||O.targetHandle==="cable-run"?true:J&&$?L.type==="fibre-flow-cable"&&X.type==="fibre-flow-cable":false},[y,k]),U=lt.useCallback(O=>{if(k)return;let L=O.sourceHandle==="cable-run"||O.targetHandle==="cable-run",X=j=>typeof j=="string"&&j.startsWith("fiber-"),J=X(O.sourceHandle),$=X(O.targetHandle),M=(j,ae,Ne)=>j.source===ae&&j.sourceHandle===Ne||j.target===ae&&j.targetHandle===Ne,oe=L?void 0:D(O.source,O.sourceHandle),ie=L?void 0:D(O.target,O.targetHandle),Q=L?void 0:{sourceColor:oe?.color,targetColor:ie?.color,color:oe?.color??ie?.color,sourceStriped:oe?.striped,targetStriped:ie?.striped};S(j=>{let ae=j.filter(Ne=>{let ye=J&&M(Ne,O.source,O.sourceHandle),ce=$&&M(Ne,O.target,O.targetHandle);return !(ye||ce)});return reactflow.addEdge({...O,type:L?"fibre-flow-link":"fibre-flow",data:Q},ae)});},[D,k,S]),le=lt.useCallback((O,L)=>{if(k)return;let X=L.sourceHandle==="cable-run"||L.targetHandle==="cable-run",J=X?void 0:D(L.source,L.sourceHandle),$=X?void 0:D(L.target,L.targetHandle),M=X?void 0:{sourceColor:J?.color,targetColor:$?.color,color:J?.color??$?.color,sourceStriped:J?.striped,targetStriped:$?.striped},oe=Q=>typeof Q=="string"&&Q.startsWith("fiber-"),ie=(Q,j,ae)=>Q.source===j&&Q.sourceHandle===ae||Q.target===j&&Q.targetHandle===ae;S(Q=>{let j=Q.filter(ce=>ce.id!==O.id),ae=oe(L.sourceHandle),Ne=oe(L.targetHandle),ye=j.filter(ce=>{let qe=ae&&ie(ce,L.source,L.sourceHandle),Ge=Ne&&ie(ce,L.target,L.targetHandle);return !(qe||Ge)});return reactflow.addEdge({...L,type:X?"fibre-flow-link":"fibre-flow",data:M},ye)});},[D,k,S]),ee=lt.useCallback(O=>{k||w(O.filter(td));},[k,w]),re=lt.useCallback(O=>{k||S(L=>id(O,L));},[k,S]),ne=lt.useMemo(()=>({"fibre-flow-cable":cd,"fibre-flow-closure":ud}),[]),z=lt.useMemo(()=>({"fibre-flow":dd,"fibre-flow-link":ld}),[]),B={borderRadius:8,overflow:"hidden",...x};return jsxRuntime.jsx(on,{nodes:y,edges:_,onNodesChange:ee,onEdgesChange:re,onConnect:U,onEdgeUpdate:le,isValidConnection:A,connectionMode:reactflow.ConnectionMode.Loose,nodeTypes:ne,edgeTypes:z,className:b,style:B,colorMode:f,readOnly:k,panOnDrag:C,panOnScroll:v,zoomOnScroll:T,fitViewOptions:{padding:.2}})},bd=e=>jsxRuntime.jsx(fd,{...e});var yd=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:i=150,layout:a,showTubeLabels:d,showFiberNumbers:s=true,showCableLabel:l=true})=>{let p=lt.useMemo(()=>a??fo(e,{rowHeight:o,tubeGap:r}),[a,e,o,r]),m=26,f=10,c=18,b=t==="left"?i-c:c,x=8,k=t==="left"?6:i-m-18,C=e.jacketColor??"#facc15",v=d??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxRuntime.jsxs("div",{style:{position:"relative",width:i,height:p.height,fontFamily:"monospace",color:"inherit"},children:[l&&jsxRuntime.jsx("div",{style:{position:"absolute",top:-18,left:t==="left"?0:void 0,right:t==="right"?0:void 0,fontSize:10,fontWeight:700,letterSpacing:.4,textTransform:"uppercase",background:"rgba(15, 23, 42, 0.85)",color:"#f8fafc",padding:"2px 6px",borderRadius:4},children:e.label}),jsxRuntime.jsx("div",{style:{position:"absolute",top:0,bottom:0,width:m,left:t==="left"?0:void 0,right:t==="right"?0:void 0,borderRadius:14,background:`linear-gradient(90deg, ${C} 0%, ${C} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${C}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),v&&p.tubeLabels.map(T=>jsxRuntime.jsxs("div",{style:{position:"absolute",top:T.y+o/2-6,left:k,fontSize:9,fontWeight:700,textTransform:"uppercase",color:"rgba(15, 23, 42, 0.75)",background:"rgba(255, 255, 255, 0.6)",padding:"1px 6px 1px 4px",borderRadius:10,display:"flex",alignItems:"center",gap:4},children:[jsxRuntime.jsx("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:T.color,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 3px rgba(0,0,0,0.25)"}}),jsxRuntime.jsx("span",{children:T.label})]},`tube-${T.tubeIndex}`)),p.rows.map(T=>{let E=T.y+o/2-f/2,F=t==="left"?b-f/2-x:b+f/2+x;return jsxRuntime.jsxs(lt__default.default.Fragment,{children:[jsxRuntime.jsx("div",{style:{position:"absolute",top:E,left:b-f/2,width:f,height:f,borderRadius:"50%",backgroundColor:T.color,backgroundImage:T.backgroundImage,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 4px rgba(0,0,0,0.25)"}}),s&&jsxRuntime.jsx("div",{style:{position:"absolute",top:T.y+o/2-6,left:F,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:T.fiberIndex})]},T.key)})]})};var Oi=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}}),Li=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}}),zi=e=>{let t=i=>{if(!i)return;if(typeof i=="string")return i;let a=i.device;return typeof a=="object"&&a?a.id:a},o=t(e.termination_a),r=t(e.termination_b);return {id:`cable-${e.id}`,source:`device-${o}`,target:`device-${r}`,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}}},wd=e=>{let t=[],o=[];return e.racks.forEach(r=>t.push(Oi(r))),e.devices.forEach(r=>t.push(Li(r))),e.cables.forEach(r=>o.push(zi(r))),{nodes:t,edges:o}},Nd=e=>{let t=e.filter(i=>i.type==="rack"),o=e.filter(i=>i.type==="device"),r=e.filter(i=>!["rack","device"].includes(i.type));return t.forEach((i,a)=>{i.position={x:a*300,y:100};}),o.forEach(i=>{if(i.parentId){let a=t.find(d=>d.id===i.parentId);if(a){let d=i.data.uPosition||1,s=i.data.uHeight||1;i.position={x:a.position.x+50,y:a.position.y+d*20-s*10};}}else i.position={x:Math.random()*400+100,y:Math.random()*200+50};}),r.forEach((i,a)=>{i.position={x:a*150+100,y:300};}),e};var Bi=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Ui=e=>({id:`rack-${e.id}`,type:"rack",position:{x:0,y:0},data:{label:e.name,status:e.status.value,uHeight:e.u_height,netboxId:e.id,netboxType:"rack",facilityId:e.facility_id,serial:e.serial,assetTag:e.asset_tag,site:e.site.name,role:e.role?.name,tenant:e.tenant?.name}}),Vi=e=>({id:`device-${e.id}`,type:"device",position:{x:0,y:0},parentId:e.rack?`rack-${e.rack.id}`:void 0,extent:e.rack?"parent":void 0,data:{label:e.name,status:e.status.value,deviceType:e.device_type.model,manufacturer:e.device_type.manufacturer.name,role:e.device_role.name,uHeight:1,uPosition:e.position||1,face:e.face||"front",netboxId:e.id,netboxType:"device",primaryIp4:e.primary_ip4?.address,primaryIp6:e.primary_ip6?.address,site:e.site.name,rack:e.rack?.name}}),ji=e=>({id:`cable-${e.id}`,source:Bi(e.termination_a.device),target:Bi(e.termination_b.device),type:"fiber",data:{bandwidth:e.type.label,length:e.length||0,color:e.color,netboxId:e.id,netboxType:"cable",status:e.status.value,terminationA:e.termination_a.name,terminationB:e.termination_b.name}}),xd=e=>{let t=[],o=[],r=new Map;return e.racks.forEach(i=>{t.push(Ui(i));}),e.devices.forEach(i=>{let a=Vi(i);t.push(a),r.set(i.name,a.id);}),e.cables.forEach(i=>{let a=ji(i),d=(typeof i.termination_a.device.id=="number"?`device-${i.termination_a.device.id}`:void 0)??r.get(i.termination_a.device.name)??a.source,s=(typeof i.termination_b.device.id=="number"?`device-${i.termination_b.device.id}`:void 0)??r.get(i.termination_b.device.name)??a.target;o.push({...a,source:d,target:s});}),{nodes:t,edges:o}},kd=(e,t)=>{let o=new Map,r=new Set;return e.filter(a=>a.position!==null).sort((a,d)=>(a.position||0)-(d.position||0)).forEach(a=>{a.position&&(o.set(a.id,a.position),r.add(a.position));}),o};function Ko(e){let{items:t,checkOutOfBounds:o,checkConflicts:r}=e,i=[],a=[];for(let d of t){let s=o(d);s&&!s.isValid&&s.error&&a.push(s.error);}for(let d=0;d<t.length;d++){let s=t[d];for(let l=d+1;l<t.length;l++){let p=t[l],m=r(s,p);m&&m.hasConflict&&m.conflict&&i.push(m.conflict);}}return {isValid:i.length===0&&a.length===0,conflicts:i,outOfBounds:a}}var Ut=class extends Error{constructor(o,r,i,a,d){super(`Device placement conflict: ${r} at U${i}-${i+a-1} in rack ${o}${d?` conflicts with ${d}`:""}`);this.rackId=o;this.deviceId=r;this.uPosition=i;this.uHeight=a;this.conflictWith=d;this.name="DevicePlacementError";}};function sn(e,t={}){return Ko({items:e.devices,checkOutOfBounds:o=>o.unit+o.height-1>e.units?{isValid:false,error:{deviceId:o.id,uPosition:o.unit,uHeight:o.height,rackUHeight:e.units}}:null,checkConflicts:(o,r)=>{let i=o.unit,a=o.unit+o.height-1,d=r.unit,s=r.unit+r.height-1;return i<=s&&a>=d?{hasConflict:true,conflict:{deviceId:o.id,uPosition:o.unit,uHeight:o.height,conflictWith:r.id}}:null}})}function Gi(e,t,o={}){let{deviceTypeMapping:r={}}=o,i=r[e.type]||"device",a=_t(t,e.unit,e.height);return {id:e.id,type:i,position:a,parentId:t.id,extent:"parent",data:{label:e.name,status:e.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,frontImageUrl:e.frontImageUrl,rearImageUrl:e.rearImageUrl,frontImageAttribution:e.frontImageAttribution,rearImageAttribution:e.rearImageAttribution,imageFit:e.imageFit,imagePosition:e.imagePosition,imageRepeat:e.imageRepeat,stretchToFit:e.stretchToFit,rackWidthPx:t.data.rackWidthPx}}}function vd(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:[],rackWidthPx:e.rackWidthPx}}}function Cd(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,i=[],a=[];if(r)for(let d of e){let s=sn(d,t);if(!s.isValid&&o==="strict"){let l=[];throw s.conflicts.forEach(p=>{l.push(`Device ${p.deviceId} at U${p.uPosition}-${p.uPosition+p.uHeight-1} conflicts with ${p.conflictWith}`);}),s.outOfBounds.forEach(p=>{l.push(`Device ${p.deviceId} at U${p.uPosition}-${p.uPosition+p.uHeight-1} exceeds rack height (${p.rackUHeight}U)`);}),new Ut(d.id,s.conflicts[0]?.deviceId||s.outOfBounds[0]?.deviceId||"unknown",s.conflicts[0]?.uPosition||s.outOfBounds[0]?.uPosition||1,s.conflicts[0]?.uHeight||s.outOfBounds[0]?.uHeight||1)}}for(let d of e){let s=vd(d);i.push(s);for(let l of d.devices)try{let p=Gi(l,s,t);a.push(p);}catch(p){if(o==="strict")throw p;if(o==="nearest"){let m=Ho(s,{id:l.id,data:{label:l.name,uHeight:l.height}},a,l.unit);if(m!==l.unit){console.warn(`Device ${l.id} moved from U${l.unit} to U${m} due to conflict`);let f={...l,unit:m},c=Gi(f,s,t);a.push(c);}else throw new Ut(d.id,l.id,l.unit,l.height)}}}return i.push(...a),i}function Hd(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let a=e.filter(d=>qt(d.type)&&d.parentId===r.id).map(d=>({id:d.id,name:d.data.label,unit:d.data.uPosition||1,height:d.data.uHeight||1,type:d.data.deviceType||"server",width:d.data.width==="full"||d.data.width==="half"?d.data.width:void 0,ports:Array.isArray(d.data.ports)?d.data.ports:void 0,connections:d.data.connections,frontImageUrl:d.data.frontImageUrl,rearImageUrl:d.data.rearImageUrl,frontImageAttribution:d.data.frontImageAttribution,rearImageAttribution:d.data.rearImageAttribution,imageFit:d.data.imageFit,imagePosition:d.data.imagePosition,imageRepeat:d.data.imageRepeat,stretchToFit:d.data.stretchToFit}));t.push({id:r.id,name:r.data.label,position:r.position,units:r.data.uHeight||42,uNumberingDirection:r.data.uNumberingDirection||"bottom-up",customHeaderText:r.data.customHeaderText,devices:a,rackWidthPx:r.data.rackWidthPx});}return t}function Pd(e,t,o,r){return e.map(i=>i.id!==t?i:{...i,devices:i.devices.map(a=>a.id!==o?a:{...a,unit:r})})}function Sd(e,t,o,r={}){let{conflictPolicy:i="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(i==="strict"&&!sn({...a,devices:[...a.devices,o]},r).isValid)throw new Ut(t,o.id,o.unit,o.height);return {...a,devices:[...a.devices,o]}})}function Ed(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(i=>i.id!==o)})}var Vt=class extends Error{constructor(o,r,i,a){super(`Splice placement conflict: ${r} at holder ${i} in tray ${o}${a?` conflicts with ${a}`:""}`);this.trayId=o;this.spliceId=r;this.holder=i;this.conflictWith=a;this.name="SplicePlacementError";}};function dn(e,t={}){return Ko({items:e.splices,checkOutOfBounds:o=>o.holder<1||o.holder>ct?{isValid:false,error:{spliceId:o.id,holder:o.holder,max:ct}}:null,checkConflicts:(o,r)=>o.holder===r.holder?{hasConflict:true,conflict:{spliceId:o.id,holder:o.holder,conflictWith:r.id}}:null})}function Xi(e,t){let o=e.mode==="ribbon",r=uo(t,e.holder,o);return {id:e.id,type:"splice",position:r,parentId:t.id,extent:"parent",data:{label:e.name,holderPosition:e.holder,lossDb:e.lossDb,mode:e.mode||"single",ribbonFiberIds:e.ribbonFiberIds}}}function Rd(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function Td(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,i=[],a=[];if(r)for(let d of e){let s=dn(d,t);if(!s.isValid&&o==="strict"){let l=[];throw s.conflicts.forEach(p=>{l.push(`Splice ${p.spliceId} at holder ${p.holder} conflicts with ${p.conflictWith}`);}),s.outOfBounds.forEach(p=>{l.push(`Splice ${p.spliceId} at holder ${p.holder} is out of bounds (max: ${p.max})`);}),new Vt(d.id,s.conflicts[0]?.spliceId||s.outOfBounds[0]?.spliceId||"unknown",s.conflicts[0]?.holder||s.outOfBounds[0]?.holder||1)}}for(let d of e){let s=Rd(d);i.push(s);for(let l of d.splices)try{let p=l.holder;if(o==="nearest"){let c={id:l.id,type:"splice",position:{x:0,y:0},data:{label:l.name,holderPosition:l.holder}},b=[...i,...a];so(s,c,l.holder,b)||(p=co(s,c,b,l.holder));}let m=p!==l.holder?{...l,holder:p}:l,f=Xi(m,s);a.push(f);}catch(p){if(o==="strict")throw p;if(o==="nearest"){let m=[...i,...a],f=co(s,{id:l.id,data:{label:l.name,holderPosition:l.holder}},m,l.holder);if(f!==l.holder){console.warn(`Splice ${l.id} moved from holder ${l.holder} to holder ${f} due to conflict`);let c={...l,holder:f},b=Xi(c,s);a.push(b);}else throw new Vt(d.id,l.id,l.holder)}}}return i.push(...a),i}function Id(e){let t=[],o=e.filter(r=>r.type==="splice-tray");for(let r of o){let a=e.filter(d=>d.type==="splice"&&d.parentId===r.id).map(d=>({id:d.id,name:d.data.label,holder:d.data.holderPosition||1,lossDb:d.data.lossDb,mode:d.data.mode||"single",ribbonFiberIds:d.data.ribbonFiberIds}));t.push({id:r.id,name:r.data.label,position:r.position,splices:a});}return t}function Dd(e,t,o,r){return e.map(i=>i.id!==t?i:{...i,splices:i.splices.map(a=>a.id!==o?a:{...a,holder:r})})}function Fd(e,t,o,r={}){let{conflictPolicy:i="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(i==="strict"&&!dn({...a,splices:[...a.splices,o]},r).isValid)throw new Vt(t,o.id,o.holder);return {...a,splices:[...a.splices,o]}})}function _d(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(i=>i.id!==o)})}
2
- exports.COUPLERS_PER_PANEL=hs;exports.COUPLER_SLOT_HEIGHT_PX=Oo;exports.COUPLER_WIDTH_PX=ms;exports.CableNode=$r;exports.ClosureNode=Yr;exports.CouplerNode=Ar;exports.DeviceNode=$t;exports.DevicePlacementError=Ut;exports.DiagramErrorBoundary=rn;exports.FIBER_COLORS_12=Dn;exports.FiberEdge=Eo;exports.FiberNode=gr;exports.FibreCableWithTubesExpanded=yd;exports.FibreFlowMap=bd;exports.FibreSplitNode=Zr;exports.HANDLE_EXTENSION_PX=Zt;exports.MultiTubeCableNode=Wr;exports.NetworkDiagram=on;exports.PANEL_BORDER_WIDTH=ii;exports.PANEL_HEADER_HEIGHT=St;exports.PANEL_HEIGHT_PX=Ao;exports.PANEL_PADDING=Pt;exports.PANEL_TUBE_TRAY_SPACING=ai;exports.PANEL_WIDTH_PX=Wo;exports.POWER_CONNECTORS=mr;exports.PatchPanelNode=jr;exports.PowerEdge=br;exports.RACK_HEADER_HEIGHT=et;exports.RACK_WIDTH_PX=xo;exports.RackNode=pr;exports.SpliceNode=Pr;exports.SplicePlacementError=Vt;exports.SpliceTrayNode=Ir;exports.TubeNode=Dr;exports.U_HEIGHT_PX=Me;exports.VerticalPDU=vr;exports.Width=Un;exports.addDeviceToRack=Sd;exports.addSpliceToTray=Fd;exports.baseColorFor=De;exports.buildNodesFromRackConfig=Cd;exports.buildNodesFromSpliceConfig=Td;exports.calculateClosureDimensions=Br;exports.calculateCouplerRightX=ws;exports.calculateCouplerSlotSpacing=xs;exports.calculateCouplerSpacing=fi;exports.calculateDevicePositionFromU=_t;exports.calculatePanelDimensions=zr;exports.calculateSlotPositionFromY=pi;exports.calculateSplicePositionFromNumber=ds;exports.calculateUPositions=kd;exports.calculateYFromSlotPosition=gi;exports.createNetworkDiagramStore=qr;exports.createRackConfigFromNodes=Hd;exports.createSpliceConfigFromNodes=Id;exports.fiberSolidOrStriped=fr;exports.findNearestRack=Go;exports.findNextAvailableHolderPosition=co;exports.findNextAvailableUPosition=Ho;exports.generateLayout=Nd;exports.getConnectorConfig=Vn;exports.getCouplerDimensions=Lr;exports.getDeviceConnectorType=wr;exports.getFiberColor=wt;exports.getInnerContentWidth=ui;exports.getPDUPortType=yr;exports.getPanelHeight=ys;exports.getPanelWidth=ci;exports.getPowerPortStyle=ro;exports.getRackBounds=Ni;exports.getStatusColor=Ke;exports.getTrayDimensions=si;exports.getTubeDimensions=Lo;exports.inventoryCableToNetworkEdge=zi;exports.inventoryDeviceToNetworkNode=Li;exports.inventoryRackToNetworkNode=Oi;exports.inventoryToNetworkDiagram=wd;exports.isHighPowerConnector=Wa;exports.isPointInRack=xi;exports.isStriped=yt;exports.isUPositionAvailable=ur;exports.netboxCableToNetworkEdge=ji;exports.netboxDeviceToNetworkNode=Vi;exports.netboxRackToNetworkNode=Ui;exports.netboxToNetworkDiagram=xd;exports.removeDeviceFromRack=Ed;exports.removeSpliceFromTray=_d;exports.replaceEdge=Pe;exports.snapToCouplerPosition=Ns;exports.snapToSplicePosition=Er;exports.snapToUPosition=Co;exports.updateDeviceUPosition=In;exports.updateDeviceUPositionInSchema=Pd;exports.updateSpliceHolderPosition=Dd;exports.useDiagramEdges=en;exports.useDiagramNodes=Qr;exports.useNetworkDiagram=Ts;exports.validateAndSnapDevice=ya;exports.validateRackDevicePlacements=sn;exports.validateSplicePlacements=dn;//# sourceMappingURL=index.js.map
1
+ 'use strict';var ot=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 ot__default=/*#__PURE__*/_interopDefault(ot);var tt=20,vt=60,jr=300,Ho=5;function ni(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function ii(e,t){let r=ni(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function ai(e){return ni(e)==="light"?"#e5e5e5":"#2a2a2a"}function si(e,t){return {width:"100%",height:"100%",...t}}var ns=["device","server","switch","router"],is=new Set(ns);function Do(e){return typeof e=="string"&&is.has(e)}function Je(e){return !!e&&Do(e.type)}var as=24;function ss(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function $e(e){return ss(e)==="split-face"}function Ot(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:as}function Lt(e){return e?.rackWidthPx||300}function _o(e){let t=Lt(e);return $e(e)?t*2+Ot(e):t}function Ve(e){return e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both"?e.mountMode:"both"}function Bt(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Qo(e,t){let o=new Set(Bt(e));return Bt(t).some(n=>o.has(n))}function Yr(e,t){return $e(e)&&Ve(t)==="front"?Lt(e)+Ot(e):0}function di(e,t){return $e(e)&&Ve(t)==="both"?_o(e):Lt(e)}var ds=()=>"bottom-up",Yt=e=>e.data.uNumberingDirection||ds(),er=(e,t,o)=>o==="bottom-up"?t-e+1:e,tr=(e,t,o)=>o==="bottom-up"?t-e+1:e;var or=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data.uHeight||1,i=t.data.uHeight||42,d=Yt(t),a=60,c=o.y-a,l=Math.round(c/20)+1,b;d==="bottom-up"?b=er(l,i,d)-n+1:b=er(l,i,d);let f=i-n+1,u=Math.max(1,Math.min(f,b));if(d==="top-down"&&b<=1&&(u=1),!Kr(t,e,u,r)){let m=rr(t,e,r,u);m!==u&&(u=m);}let p;if(d==="bottom-up"){let m=u+n-1,x=tr(m,i,d);p=a+(x-1)*20-1;}else {let m=tr(u,i,d);p=a+(m-1)*20-1;}return {x:Yr(t.data,e.data),y:p,uPosition:u}},Kr=(e,t,o,r)=>{let n=t.data.uHeight||1,i=e.data.uHeight||42;if(o<1||o+n-1>i)return false;let d=r.filter(l=>Do(l.type)&&l.parentId===e.id&&l.id!==t.id),a=$e(e.data),c=Ve(t.data);for(let l of d){let b=l.data.uPosition||1,f=l.data.uHeight||1,u=o,p=o+n-1,m=b,x=b+f-1;if(u<=x&&p>=m){if(a){let P=Ve(l.data);if(!Qo(c,P))continue}return false}}return true},rr=(e,t,o,r=1)=>{let n=t.data.uHeight||1,i=e.data.uHeight||42;for(let d=r;d<=i-n+1;d++)if(Kr(e,t,d,o))return d;return 1},go=(e,t,o=1,r)=>{let n=60,i=Yt(e),d=e.data.uHeight||42,a=tr(t,d,i),c;if(i==="bottom-up"){let l=t+o-1,b=tr(l,d,i);c=n+(b-1)*20-1;}else c=n+(a-1)*20-1;return {x:Yr(e.data,r),y:c}},ci=(e,t,o)=>{let r=e.data.uHeight||1,n=go(t,o,r,e.data),i=Array.isArray(e.data.ports)?e.data.ports:void 0;return {...e,position:n,data:{...e.data,ports:i,uPosition:o}}},cs=(e,t)=>{let o=e.data.uPosition||1,r=e.data.uHeight||1,n=t.data.uHeight||42,i=Math.max(1,Math.min(n-r+1,o));return i!==o?ci(e,t,i):e};function mt(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var Zr=({data:e,selected:t,id:o,onViewChange:r,onRackFaceChange:n,isDragOver:i=false})=>{let{label:d,ports:a=0,status:c="active",uHeight:l=42,face:b="front",customHeaderText:f}=e,u=$e(e),p=_o(e),m=Lt(e),x=Ot(e),{getNodes:P,setNodes:N}=reactflow.useReactFlow(),v=P(),[C,F]=ot.useState(e.showUMarkers!==void 0?e.showUMarkers:true),w=()=>{let A=Yt({data:e})==="bottom-up"?"top-down":"bottom-up";N(_=>_.map(U=>U.id===o?{...U,data:{...U.data,uNumberingDirection:A}}:U));},R=()=>{if(u)return;let E=b==="front"?"rear":"front";n?n(o,E):r?v.filter(_=>_.parentId===o).forEach(_=>{r(_.id,E);}):N(A=>A.map(_=>_.id===o?{..._,data:{..._.data,face:E}}:_.parentId===o?{..._,data:{..._.data,view:E}}:_));},D=()=>{let E=[],A=60,_=Yt({data:e});for(let U=1;U<=l;U++){let se=A+(U-1)*20-4,j=er(U,l,_);E.push(jsxRuntime.jsx("div",{style:{position:"absolute",left:"-35px",top:`${se}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:j},U));}return E};return jsxRuntime.jsxs("div",{className:`rack-node ${t?"selected":""} ${i?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${mt(c)}`,borderRadius:"8px",padding:0,width:`${p}px`,height:`${60+l*20}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:i?"0 0 20px #3b82f6, 0 0 40px #3b82f6, 0 0 60px #3b82f6":t?"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:d}),jsxRuntime.jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[f?jsxRuntime.jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:f}):jsxRuntime.jsxs("span",{children:[typeof a=="number"?a:0," ports"]})," \u2022 ",l,"U \u2022 ",u?"rear|front":b]}),jsxRuntime.jsxs("div",{style:{display:"flex",gap:"4px",position:"absolute",top:"4px",right:"4px"},children:[jsxRuntime.jsx("button",{onPointerDown:E=>{E.stopPropagation();},onMouseDown:E=>{E.stopPropagation();},onClick:E=>{E.stopPropagation(),E.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:E=>{E.stopPropagation();},onMouseDown:E=>{E.stopPropagation();},onClick:E=>{E.stopPropagation(),E.preventDefault(),w();},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 ${Yt({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:Yt({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),!u&&jsxRuntime.jsx("button",{onPointerDown:E=>{E.stopPropagation();},onMouseDown:E=>{E.stopPropagation();},onClick:E=>{E.stopPropagation(),E.preventDefault(),R();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${b==="front"?"rear":"front"} view`,children:b==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsxRuntime.jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${l*20}px`,overflow:"hidden"},children:u&&jsxRuntime.jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none",display:"flex"},children:[jsxRuntime.jsx("div",{style:{width:`${m}px`,borderRight:"1px dashed rgba(156,163,175,0.35)",background:"rgba(17,24,39,0.15)",display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"4px",fontSize:"8px",color:"#9ca3af",fontWeight:"bold",textTransform:"uppercase",letterSpacing:"0.06em"},children:"Rear"}),jsxRuntime.jsx("div",{style:{width:`${x}px`}}),jsxRuntime.jsx("div",{style:{width:`${m}px`,borderLeft:"1px dashed rgba(156,163,175,0.35)",background:"rgba(17,24,39,0.25)",display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"4px",fontSize:"8px",color:"#9ca3af",fontWeight:"bold",textTransform:"uppercase",letterSpacing:"0.06em"},children:"Front"})]})}),C&&jsxRuntime.jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:D()})]})};var qr=({data:e,selected:t})=>{let{label:o,status:r="active"}=e;return jsxRuntime.jsxs("div",{className:`fiber-node ${t?"selected":""}`,style:{background:"#1f2937",border:`2px solid ${mt(r)}`,borderRadius:"50%",width:"60px",height:"60px",display:"flex",alignItems:"center",justifyContent:"center",color:"white",fontFamily:"monospace",fontSize:"10px",fontWeight:"bold",boxShadow:t?"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:mt(r),borderRadius:"50%"}})]})};var li=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function Xe(e){let t=(e-1)%12;return li[t]}function Zt(e){return e>12}function Tt(e,t){let o=t?.base??Xe(e),r=t?.striped??Zt(e),n=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:n}}function Jr(e){let t=Tt(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function qt(e){return Xe(e)}function Rt(e){return e.map(t=>({base:Xe(t),striped:Zt(t)}))}function gs(e,t,o,r,n,i,d,a){let c=Rt(o),l=c.length,b=r?1.2:1,f=!!a?.highlight,u=r?2:1.5,p=a?.highlightWidth??u*3,m=a?.highlightColor??c[0]?.base??"#22d3ee";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[f&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:m,strokeWidth:p,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${u}px`,"--rn-edge-highlight-to":`${p}px`}}),c.map((x,P)=>{let v=(l-P)*b;return jsxRuntime.jsx("path",{d:t,stroke:x.base,strokeWidth:v,fill:"none",strokeLinecap:"butt",opacity:x.striped?.9:1,style:n},`${e}-ribbon-${P}`)}),c.some(x=>x.striped)&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:r&&a&&(a.bandwidth||a.length)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${i}px,${d}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${c[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[a.bandwidth&&jsxRuntime.jsx("div",{children:a.bandwidth}),a.length&&jsxRuntime.jsxs("div",{children:[a.length,"m"]}),jsxRuntime.jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var ar=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,data:a,selected:c,style:l={},className:b})=>{let[f,u,p]=reactflow.getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:d}),{bandwidth:m,length:x,color:P="#00FFFF",striped:N=false,ribbonFiberIds:v,isRibbon:C,highlight:F,highlightColor:w,highlightWidth:R}=a||{},D=!!F;if((C||v&&v.length>=6&&v.length<=12)&&v)return gs(e,f,v,c??false,l??{},u,p,a);let A=c?3:2,_=R??A*3,U={...l,stroke:P,strokeWidth:A,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[D&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:f,style:{...l,stroke:w??P,strokeWidth:_,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${A}px`,"--rn-edge-highlight-to":`${_}px`}}),jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:f,style:U}),N&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-stripe`,path:f,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:c&&a&&(m||x)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${u}px,${p}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${P}`,pointerEvents:"none",zIndex:9999},children:[m&&jsxRuntime.jsx("div",{children:m}),x&&jsxRuntime.jsxs("div",{children:[x,"m"]})]})})]})};var Qr=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,style:a={},data:c,markerEnd:l})=>{let[b]=reactflow.getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:d}),f=c?.connectorType||"C13",u=c?.metadata??{},p=typeof c?.powerStrokeWidth=="number"?c.powerStrokeWidth:typeof u.strokeWidth=="number"?u.strokeWidth:void 0,m=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof u.strokeDasharray=="string"?u.strokeDasharray:void 0,x=typeof c?.powerOpacity=="number"?c.powerOpacity:typeof u.opacity=="number"?u.opacity:void 0;return jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:b,markerEnd:l,style:(()=>{let v=p??(f==="C19"?5:3),C=m??(f==="C19"?"none":"6,3");return {...{stroke:c?.color||"#f59e0b",strokeWidth:v,strokeLinecap:"round",strokeLinejoin:"round",...x!==void 0?{opacity:x}:{}},strokeDasharray:C,...a}})()})};function xs(e,t,o,r,n,i,d,a,c,l,b){let f=Rt(a),u=f.length,p=c?1.8:1.5,m=!!b?.highlight,x=c?3:2.5,P=b?.highlightWidth??x*3,N=b?.highlightColor??f[0]?.base??"#22d3ee",[v,C,F]=reactflow.getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d});return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[m&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:v,style:{...l,stroke:N,strokeWidth:P,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${x}px`,"--rn-edge-highlight-to":`${P}px`}}),f.map((w,R)=>{let E=(u-R)*p;return jsxRuntime.jsx("path",{d:v,stroke:w.base,strokeWidth:E,fill:"none",strokeLinecap:"butt",opacity:w.striped?.9:1,style:l},`${e}-ribbon-${R}`)}),f.some(w=>w.striped)&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-ribbon-stripe`,path:v,style:{...l,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:c&&b&&(b.bandwidth||b.length)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${C}px,${F}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${f[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[b.bandwidth&&jsxRuntime.jsx("div",{children:b.bandwidth}),b.length&&jsxRuntime.jsxs("div",{children:[b.length,"m"]}),jsxRuntime.jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[a.length,"F"]})]})})]})}var gi=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,data:a,selected:c,style:l={},...b})=>{let{color:f="#00FFFF",ribbonFiberIds:u,isRibbon:p,highlight:m,highlightColor:x,highlightWidth:P}=a||{},N=!!m;if((p||u&&u.length>=6&&u.length<=12)&&u)return xs(e,t,o,r,n,i,d,u,c??false,l??{},a);let C=c?4:3,F=P??C*3,w={...l,stroke:f,strokeWidth:C};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[N&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:reactflow.getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d})[0],style:{...l,stroke:x??f,strokeWidth:F,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${C}px`,"--rn-edge-highlight-to":`${F}px`}}),jsxRuntime.jsx(reactflow.SmoothStepEdge,{...b,id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,data:a,selected:c,style:w})]})};function ks({sourceX:e,sourceY:t,targetX:o,targetY:r,sourcePosition:n,targetPosition:i}){let d=n===reactflow.Position.Left||n===reactflow.Position.Right,a;if(d){let c=(e+o)/2;a=`M ${e},${t} L ${c},${t} L ${c},${r} L ${o},${r}`;}else {let c=(t+r)/2;a=`M ${e},${t} L ${e},${c} L ${o},${c} L ${o},${r}`;}return a}function Ps(e,t,o,r,n,i){let d=Rt(o),a=d.length,c=r?1.2:1,l=!!i?.highlight,b=r?2:1.5,f=i?.highlightWidth??b*3,u=i?.highlightColor??d[0]?.base??"#22d3ee",p=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),m=p?(parseFloat(p[1])+parseFloat(p[3]))/2:0,x=p?(parseFloat(p[2])+parseFloat(p[4]))/2:0;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[l&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:u,strokeWidth:f,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${b}px`,"--rn-edge-highlight-to":`${f}px`}}),d.map((P,N)=>{let C=(a-N)*c;return jsxRuntime.jsx("path",{d:t,stroke:P.base,strokeWidth:C,fill:"none",strokeLinecap:"butt",opacity:P.striped?.9:1,style:n},`${e}-ribbon-${N}`)}),d.some(P=>P.striped)&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:r&&i&&(i.bandwidth||i.length)&&jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${m}px,${x}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${d[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[i.bandwidth&&jsxRuntime.jsx("div",{children:i.bandwidth}),i.length&&jsxRuntime.jsxs("div",{children:[i.length,"m"]}),jsxRuntime.jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var hi=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,data:a,selected:c,style:l={},...b})=>{let{color:f="#00FFFF",striped:u=false,ribbonFiberIds:p,isRibbon:m,highlight:x,highlightColor:P,highlightWidth:N}=a||{},v=!!x,C=ks({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:d});if((m||p&&p.length>=6&&p.length<=12)&&p)return Ps(e,C,p,c??false,l??{},a);let w=c?3:2,R=N??w*3,D={...l,stroke:f,strokeWidth:w,strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[v&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:C,style:{...l,stroke:P??f,strokeWidth:R,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${w}px`,"--rn-edge-highlight-to":`${R}px`}}),jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:C,style:D}),u&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-stripe`,path:C,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var xi=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,style:a={},data:c,markerEnd:l,selected:b})=>{let{color:f="#6366f1",label:u,highlight:p,highlightColor:m,highlightWidth:x}=c||{},P=!!p,N=8,v=x??N*1.8,[C,F,w]=reactflow.getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:d}),R={...a,stroke:f,strokeWidth:N,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[P&&jsxRuntime.jsx(reactflow.BaseEdge,{id:`${e}-highlight`,path:C,style:{...a,stroke:m??f,strokeWidth:v,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${m??f}) drop-shadow(0 0 16px ${m??f})`,"--rn-edge-highlight-from":`${N}px`,"--rn-edge-highlight-to":`${v}px`}}),jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:C,markerEnd:l,style:R}),u&&jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:jsxRuntime.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${F}px,${w}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${f}`,pointerEvents:"none",zIndex:9999},children:u})})]})};var Ni=(o=>(o.FULL="full",o.HALF="half",o))(Ni||{});var tn={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},AC:{type:"AC",color:"#60a5fa",borderColor:"#2563eb",amperage:15,voltage:120,phases:1}};function eo(e){let t=tn[e];if(!t)throw new Error(`Unknown connector type: ${e}`);let o=t.amperage===16,r=t.type==="AC",n=o?12:r?10:8*1.3,i=o?10:r?7:5*1.3,d=o||r?{borderRadius:r?"2px":"3px"}:{clipPath:"polygon(2px 0, calc(100% - 2px) 0, 100% 2px, 100% 100%, 0 100%, 0 2px)",borderRadius:"0px"};return {width:n,height:i,color:t.color,borderColor:t.borderColor,fontSize:o?"3px":r?"3.5px":"4px",...d}}function ki(e){let t=tn[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function Ss(e){return ki(e).amperage===16}function dr(e){return e%10<8?"C13":"C19"}function Bo(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var Es=/-(source|target)$/i;function Ge(e){return e?e.replace(Es,""):""}function St(e){return typeof e=="string"&&e.includes("power")}function Et(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:St(t.type)?t.label:`${e}-${t.label}`}function cr(e){let t=Ge(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}var Fs="#6b7280",Hs="#374151",on="#10b981",Ds="100% 100%",_s={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},Ms=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,$s=/^data:image\//i,As=typeof window<"u"?ot__default.default.useLayoutEffect:ot__default.default.useEffect;function Ls(e){return (e??"").toLowerCase().replace(/_/g,"-")}function Bs(e){return !Ms.test(e)&&!e.startsWith("//")}function Os(e){if(!e)return;let t=e.trim();if(t){if(Bs(t))return t;try{let o=new URL(t),r=o.protocol.toLowerCase();return r==="https:"||r==="blob:"?o.href:r==="data:"&&$s.test(t)?t:void 0}catch{return}}}function Ws(e){return `url(${JSON.stringify(e)})`}function an(e){return St(e.type)}function rn(e,t){return Et(e,t)}function zs(e){return !!(e.position&&typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number")}function Us(e,t,o,r,n){let i=t.length>0||!!r,d=o.length>0||!!n;return e||(i?"front":d?"rear":"front")}function Vs(e,t){return t===true||e==="fill"?Ds:e==="none"?"auto":e==="scale-down"?"contain":e??"cover"}function Gs(e){return an(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?on:e.cableType?_s[e.cableType]??on:on}function Xs(e){return e.connected?Gs(e):Fs}function Ci(e){return e.map(t=>{let o=t.ports.map(r=>{let n=r.position?[r.position.side??"",r.position.offsetPercent??"",r.position.offsetPx??"",r.position.xPercent??"",r.position.yPercent??""].join(":"):"";return [r.id??"",r.label,r.type??"",r.connected?"1":"0",r.cableType??"",r.connectorType??"",n].join(":")}).join(",");return `${t.name}[${o}]`}).join("|")}function js(e,t,o,r,n=false){return {width:`${e}px`,height:`${t}px`,minWidth:n?`${e}px`:void 0,minHeight:n?`${t}px`:void 0,background:o,border:`0.5px solid ${r}`,borderRadius:"1px",cursor:"pointer",zIndex:2}}function Ys(e){let t=Math.max(6,Math.min(10,Math.round(e*.025))),o=Math.max(3,Math.min(5,Math.round(t*.55)));return {width:t,height:o}}function nn(e){return Math.max(0,Math.min(100,e))}function yt(e,t,o){return Math.max(t,Math.min(o,e))}function Ks(e){switch(e){case "top":return reactflow.Position.Top;case "right":return reactflow.Position.Right;case "bottom":return reactflow.Position.Bottom;case "left":return reactflow.Position.Left;default:return reactflow.Position.Top}}function Zs(e,t){let o=[{side:"left",distance:e},{side:"right",distance:100-e},{side:"top",distance:t},{side:"bottom",distance:100-t}];return o.sort((r,n)=>r.distance-n.distance),o[0].side}function qs(e,t,o,r,n,i){if(!e.position)return;if(typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number"){let m=nn(e.position.xPercent),x=nn(e.position.yPercent),P=e.position.side??Zs(m,x),N=yt(r*m/100,t/2,Math.max(t/2,r-t/2)),v=yt(i??n*x/100,o/2,Math.max(o/2,n-o/2));return {position:Ks(P),style:{left:`${N-t/2}px`,top:`${v-o/2}px`,right:void 0,bottom:void 0,transform:"none"}}}if(!e.position.side)return;let a=e.position.side,c=typeof e.position.offsetPercent=="number"?nn(e.position.offsetPercent):void 0,l=typeof e.position.offsetPx=="number"?e.position.offsetPx:void 0,b=t/2,f=Math.max(b,r-t/2),u=o/2,p=Math.max(u,n-o/2);switch(a){case "top":{let m=l!==void 0?l:r*(c??50)/100,x=yt(m,b,f);return {position:reactflow.Position.Top,style:{top:"0px",left:`${x}px`,right:void 0,bottom:void 0,transform:"translate(-50%, 50%)"}}}case "bottom":{let m=l!==void 0?l:r*(c??50)/100,x=yt(m,b,f);return {position:reactflow.Position.Bottom,style:{bottom:"0px",left:`${x}px`,right:void 0,top:void 0,transform:"translate(-50%, -50%)"}}}case "left":{let m=l!==void 0?l:n*(c??50)/100,x=yt(m,u,p);return {position:reactflow.Position.Left,style:{left:"0px",top:`${x}px`,right:void 0,bottom:void 0,transform:"translate(50%, -50%)"}}}case "right":{let m=l!==void 0?l:n*(c??50)/100,x=yt(m,u,p);return {position:reactflow.Position.Right,style:{right:"0px",top:`${x}px`,left:void 0,bottom:void 0,transform:"translate(-50%, -50%)"}}}default:return}}function Ti(e,t,o,r){let n=o/2,i=Math.max(n,r-o/2),d=n,a=i;if(t>1){let c=i-n,l=c/(t-1),b=t>=20?2:t>=12?3:void 0;if(b!==void 0){let f=o+b;if(l>f){let u=f*(t-1);if(u<c){let p=(c-u)/2;d=n+p,a=i-p;}}}}return t===1?(d+a)/2:d+e*(a-d)/(t-1)}function Ri(e,t,o,r){let n=e%2===0,i=Math.ceil(t/2),d=Math.floor(t/2),a=Math.max(n?i:d,1),c=Math.floor(n?e/2:(e-1)/2),l=Ti(c,a,o,r);return n?{position:reactflow.Position.Top,style:{transform:"translateY(50%)",left:`${l-o/2}px`}}:{position:reactflow.Position.Bottom,style:{transform:"translateY(-50%)",left:`${l-o/2}px`}}}function vi(e,t,o,r,n,i){let d=e%2===0,a=Math.ceil(t/2),c=Math.floor(t/2),l=Math.max(d?a:c,1),b=Math.floor(d?e/2:(e-1)/2),f=Ti(b,l,o,n),u=1,p=yt(Math.round(r*.75),1,4),m=Math.max(u,i-r-1),x=yt(u+r+p,u,m),P=d?u:x;return {position:reactflow.Position.Top,style:{transform:"none",left:`${f-o/2}px`,top:`${P}px`,right:void 0,bottom:void 0}}}function Js(e,t,o,r,n){let i=e.connectorType??(e.type==="power_ac"?"AC":Bo(n)),d=eo(i),a;if(r<=20){let b=Math.max(2,r-d.height-2);a=`${o<=1?(2+b)/2:2+t*(b-2)/(o-1)}px`;}else a=`${25+t*50}%`;return {position:reactflow.Position.Right,style:{transform:"translateX(-50%)",top:a,width:`${d.width}px`,height:`${d.height}px`,background:d.color,border:`1px solid ${d.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:d.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:d.borderRadius,clipPath:d.clipPath}}}function Qs(e,t,o,r){if(t===1){let n=Math.max(6,Math.round(r*.04)),i=Math.max(o/2,r-n-o/2);return {position:reactflow.Position.Top,style:{transform:"translateY(50%)",left:`${i}px`,right:void 0}}}return Ri(e,t,o,r)}function ed(e,t,o,r,n,i,d,a,c){if(a==="patch-panel"||a==="switch")return Ri(t,o,r,i);if(an(e)){let f=e.connectorType??(e.type==="power_ac"?"AC":Bo(c)),u=eo(f),p;if(d<=20){let P=Math.max(2,d-u.height-2);p=`${o<=1?(2+P)/2:2+t*(P-2)/(o-1)}px`;}else p=`${25+t*50}%`;return {position:reactflow.Position.Left,style:{transform:"translateX(50%)",top:p,width:`${u.width}px`,height:`${u.height}px`,background:u.color,border:`1px solid ${u.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:u.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:u.borderRadius,clipPath:u.clipPath}}}return {position:reactflow.Position.Right,style:{transform:"translate(-50%, -50%)",top:`${yt(o<=1?d/2:n/2+t*Math.max(d-n,0)/Math.max(o-1,1),n/2,Math.max(n/2,d-n/2))}px`}}}function td(e,t,o,r){if(e)return {primary:"target"};let n=t==="patch-panel";return t==="switch"||t==="router"?{primary:"source",secondary:"target"}:n?o==="rear"?{primary:"source",secondary:"target"}:{primary:"target",secondary:"source"}:{primary:r?"source":"target"}}var mo=({id:e,data:t,selected:o})=>{let r=reactflow.useUpdateNodeInternals(),{label:n,status:i="active",deviceType:d="server",manufacturer:a,uHeight:c=1,width:l="full",ports:b,rearPorts:f,view:u,rackWidthPx:p,frontImageUrl:m,rearImageUrl:x,imageFit:P,imagePosition:N,imageRepeat:v,stretchToFit:C}=t,F=ot__default.default.useMemo(()=>Array.isArray(b)?b:[],[b]),w=ot__default.default.useMemo(()=>Array.isArray(f)?f:[],[f]),R=Ls(d),D=p??300,E=$e(t),A=Ve(t),_=Us(u,F,w,m,x),U=ot__default.default.useMemo(()=>E?Bt(A):[_],[E,A,_]),se=U[0]??_,j=E&&A==="both",Y=c*20,ie=Ot(t),z=D+ie,V=ot__default.default.useMemo(()=>[E?"split":"single",A,U.join(","),se,R,n,Y.toString(),D.toString(),z.toString(),Ci(F),Ci(w)].join("|"),[E,A,U,se,R,n,Y,D,z,F,w]);As(()=>{r(e);},[V,e,r]);let B=ot__default.default.useCallback(fe=>{let _e=Os(fe==="rear"?x:m);return _e?{backgroundImage:Ws(_e),backgroundSize:Vs(P,C),backgroundPosition:N??"center",backgroundRepeat:v??"no-repeat"}:{}},[x,m,P,C,N,v]),O=ot__default.default.useMemo(()=>B("front"),[B]),X=ot__default.default.useMemo(()=>B("rear"),[B]),ee=se==="rear"?X:O,M,L;if(E)M=`${di(t,t)+4}px`,L=void 0;else {let fe=D+4,he=Math.floor(D/2);M=l==="half"?`${he}px`:`${fe}px`,L=l==="half"?`${he}px`:void 0;}let de=R==="server"&&c===1,ae=mt(i),ce={"--rn-device-bg-image":j?"none":String(ee.backgroundImage??"none"),"--rn-device-bg-position":String(ee.backgroundPosition??"center"),"--rn-device-bg-repeat":String(ee.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(ee.backgroundSize??"cover"),"--rn-device-border-color":ae,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${Y}px`,"--rn-device-left":L??"auto","--rn-device-status-color":ae,"--rn-device-translate-y":de?"-1px":"0px","--rn-device-width":M},q=ot__default.default.useMemo(()=>{let fe=new Set;for(let he of F)for(let _e of he.ports)fe.add(rn(he.name,_e));return fe},[F]),ve=ot__default.default.useCallback((fe,he)=>he==="rear"&&j&&q.has(fe)?`${fe}--rear`:fe,[q,j]),De=ot__default.default.useCallback((fe,he,_e)=>{let te=new Map;if(Y>24||he.length<=1)return te;let Ae=he.filter(Pe=>zs(Pe)&&Pe.position?.side==="top");if(Ae.length<=1)return te;let Re=[...new Set(Ae.map(Pe=>Number(Pe.position?.yPercent)))].filter(Pe=>Number.isFinite(Pe)).sort((Pe,Qe)=>Pe-Qe);if(Re.length<=1)return te;let dt=_e/2+1,Ne=Math.max(dt,Y-_e/2-1),Se=Math.max(0,Ne-dt),ke=Re.length,Nt=Math.max(_e+2,4),Ye=ke>1?Math.min(Nt,Se/(ke-1)):0,Te=Ye*Math.max(0,ke-1),ct=Ae.reduce((Pe,Qe)=>Pe+Y*Number(Qe.position?.yPercent)/100,0)/Ae.length,rt=yt(ct-Te/2,dt,Ne-Te),kt=new Map;Re.forEach((Pe,Qe)=>{kt.set(Pe,rt+Qe*Ye);});for(let Pe of Ae){let Qe=Number(Pe.position?.yPercent),nt=kt.get(Qe);nt!==void 0&&te.set(rn(fe,Pe),nt);}return te},[Y]),xe=ot__default.default.useCallback((fe,he,_e=0,te=D)=>{let Ae=[];if(fe.length===0)return Ae;let{width:Re,height:dt}=Ys(te),Ne=fe.reduce((ke,Nt)=>ke+Nt.ports.length,0),Se=(R==="switch"||R==="patch-panel")&&Ne>=24;for(let ke of fe){let Nt=De(ke.name,ke.ports,dt);for(let Ye=0;Ye<ke.ports.length;Ye+=1){let Te=ke.ports[Ye],ct=an(Te),rt=Re,kt=dt;if(ct){let Gt=Te.connectorType??(Te.type==="power_ac"?"AC":Bo(n)),Xt=eo(Gt);rt=Xt.width,kt=Xt.height;}let Pe=rn(ke.name,Te),Qe=Xs(Te),nt=Te.connected?Qe:Hs,Ko=Nt.has(Pe),Mr=js(rt,kt,Qe,nt,Ko),To=he==="front"?ct?Js(Te,Ye,ke.ports.length,Y,n):Se?vi(Ye,ke.ports.length,Re,dt,te,Y):Qs(Ye,ke.ports.length,Re,te):!ct&&Se?vi(Ye,ke.ports.length,Re,dt,te,Y):ed(Te,Ye,ke.ports.length,Re,dt,te,Y,R,n),Pt=qs(Te,rt,kt,te,Y,Nt.get(Pe)),_t=Pt?ct?{position:Pt.position,style:{...To.style,...Pt.style}}:Pt:To,ze={...{...Mr,..._t.style}};ze.left!==void 0&&_e!==0&&(typeof ze.left=="number"?ze.left=`${ze.left+_e}px`:ze.left=`calc(${ze.left} + ${_e}px)`),j&&ze.left===void 0&&(_t.position===reactflow.Position.Left?(ze.left=`${_e}px`,ze.right=void 0):_t.position===reactflow.Position.Right&&(ze.left=`${_e+te}px`,ze.right=void 0));let Mt=ve(Pe,he),ft=td(ct,R,he,Te.connected);if(ft.secondary){let Gt=R==="switch"||R==="router"?{...ze,background:"transparent",border:"none",opacity:0}:ze,Xt=R==="switch"||R==="router"?`${ke.name} - ${Te.label} (input) ${Te.connected?"(connected)":"(disconnected)"}`:`${ke.name} - ${Te.label} (${ft.secondary}) ${Te.connected?"(connected)":"(disconnected)"}`;Ae.push(jsxRuntime.jsx(reactflow.Handle,{id:`${Mt}-${ft.secondary}`,type:ft.secondary,position:_t.position,style:Gt,title:Xt},`${Mt}-${ft.secondary}`));}Ae.push(jsxRuntime.jsx(reactflow.Handle,{id:Mt,type:ft.primary,position:_t.position,style:ze,title:`${ke.name} - ${Te.label} ${Te.connected?"(connected)":"(disconnected)"}`,children:ct?Ye+1:void 0},Mt));}}return Ae},[De,Y,D,n,R,ve,j]),be=ot__default.default.useMemo(()=>{let fe=[];for(let he of U){if(he==="front"&&F.length>0){let _e=j?z:0;fe.push(...xe(F,"front",_e,D));}he==="rear"&&w.length>0&&fe.push(...xe(w,"rear",0,D));}return fe},[U,F,w,xe,D,j,z]);return jsxRuntime.jsxs("div",{className:`device-node ${o?"selected":""} ${j?"device-node--split-both":""}`,style:ce,children:[j&&jsxRuntime.jsxs("div",{className:"device-node__split-face-layer",style:{position:"absolute",inset:0,display:"flex",pointerEvents:"none",zIndex:0},children:[jsxRuntime.jsx("div",{className:"device-node__split-face device-node__split-face--rear",style:{width:`${D}px`,backgroundImage:String(X.backgroundImage??"none"),backgroundPosition:String(X.backgroundPosition??"center"),backgroundRepeat:String(X.backgroundRepeat??"no-repeat"),backgroundSize:String(X.backgroundSize??"cover")}}),jsxRuntime.jsx("div",{className:"device-node__face-bridge","data-testid":"device-face-bridge",style:{width:`${ie}px`},children:jsxRuntime.jsx("div",{className:"device-node__face-bridge-line"})}),jsxRuntime.jsx("div",{className:"device-node__split-face device-node__split-face--front",style:{width:`${D}px`,backgroundImage:String(O.backgroundImage??"none"),backgroundPosition:String(O.backgroundPosition??"center"),backgroundRepeat:String(O.backgroundRepeat??"no-repeat"),backgroundSize:String(O.backgroundSize??"cover")}})]}),jsxRuntime.jsxs("div",{className:"device-node__content",style:{position:"relative",zIndex:1},children:[jsxRuntime.jsx("div",{className:"device-node__label",children:n}),c>1&&jsxRuntime.jsx("div",{className:"device-node__manufacturer",children:a})]}),c>1&&jsxRuntime.jsxs("div",{className:"device-node__u-indicator",children:[c,"U"]}),jsxRuntime.jsx("div",{className:"device-node__status-indicator"}),be]})};var at=20,ur=3,sn=2,od=1.2;function dn(e){return Math.max(0,Math.min(100,e))}function rd(e,t){let o=[{side:"left",distance:e},{side:"right",distance:100-e},{side:"top",distance:t},{side:"bottom",distance:100-t}];return o.sort((r,n)=>r.distance-n.distance),o[0].side}function pr(e){if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13")return "C13";if(t==="C19")return "C19";if(t==="AC")return "AC"}function nd(e,t){let o=pr(e.connectorType);if(o)return o;let r=String(e.type??"").toLowerCase();return r.includes("c19")?"C19":r.includes("c13")?"C13":r.includes("power_ac")?"AC":t}function id(e){return Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0?e.pduPortGroups:Array.isArray(e.rearPorts)&&e.rearPorts.length>0?e.rearPorts:Array.isArray(e.ports)&&e.ports.length>0?e.ports:[]}function ad(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>pr(dr(r))??"C13"):Array.from({length:t},(o,r)=>{let n=pr(e.portTypes?.[r]);return n||(pr(dr(r))??"C13")})}function sd(e,t){let o=id(e),r=ad(e,t);if(o.length===0)return Array.from({length:t},(d,a)=>({id:`${a+1}`,label:`${a+1}`,connectorType:r[a]??"C13",groupName:"Power"}));let n=[],i=0;return o.forEach(d=>{d.ports.forEach(a=>{let c=r[i]??"C13";n.push({id:Et(d.name,a),label:a.label,connectorType:nd(a,c),groupName:d.name,position:a.position}),i+=1;});}),n}function dd(e,t){if(e.length===0)return [];let o=Math.max(t-sn-ur,1);if(e.length===1)return [at+sn+o/2];let r=[],n=0;for(let a=0;a<e.length;a+=1)r.push(n),n+=1,a<e.length-1&&e[a].groupName!==e[a+1].groupName&&(n+=od);let i=r[r.length-1]||1,d=i>0?o/i:0;return r.map(a=>at+sn+a*d)}function cd(e,t,o,r,n,i){if(!e)return {position:reactflow.Position.Right,leftPx:Math.round((r-n)/2)-1,topPx:t-i/2};let d=e.side,a=d==="left"?reactflow.Position.Left:d==="top"?reactflow.Position.Top:d==="bottom"?reactflow.Position.Bottom:reactflow.Position.Right,c=typeof e.offsetPercent=="number"?dn(e.offsetPercent):void 0,l=typeof e.offsetPx=="number"?e.offsetPx:void 0,b=typeof e.xPercent=="number"?dn(e.xPercent):void 0,f=typeof e.yPercent=="number"?dn(e.yPercent):void 0;if(b!==void 0&&f!==void 0){let m=d??rd(b,f),x=m==="left"?reactflow.Position.Left:m==="top"?reactflow.Position.Top:m==="bottom"?reactflow.Position.Bottom:reactflow.Position.Right,P=Math.max(o-ur,1),N=r*b/100,v=at+P*f/100;return {position:x,leftPx:N-n/2,topPx:v-i/2}}let u=b!==void 0?r*b/100:r-n/2-1,p=f!==void 0?at+Math.max(o-ur,1)*f/100:t;return d==="top"||d==="bottom"?(l!==void 0?u=l:c!==void 0&&(u=r*c/100),p=d==="top"?at+i/2:at+o-i/2):(l!==void 0?p=at+l:c!==void 0&&(p=at+Math.max(o-ur,1)*c/100),d==="left"?u=n/2:d==="right"&&(u=r-n/2-1)),{position:a,leftPx:u-n/2,topPx:p-i/2}}function ld(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t-1:Math.floor(t/2)}function ud(e,t){return jsxRuntime.jsxs("div",{style:{position:"absolute",left:`${(t-16)/2}px`,top:`${e-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")}var cn=({data:e,selected:t})=>{let{label:o,status:r="active",heightCm:n=100,powerPorts:i=36,widthPx:d=15,mgmt_unit:a}=e,c=Math.max(0,i),l=sd(e,c),b=n*4.2,f=Math.max(b-at,1),u=dd(l,f),p=ld(a,l.length);return jsxRuntime.jsxs("div",{className:`vertical-pdu-node ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${mt(r)}`,borderRadius:"2px",padding:0,width:`${d}px`,height:`${b}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"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:`${at}px`,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:`${b-at}px`,overflow:"hidden"},children:l.map((m,x)=>{let P=u[x]??at+f/2;if(p===x)return ud(P,d);let N=eo(m.connectorType),v=cd(m.position,P,f,d,N.width,N.height);return jsxRuntime.jsx(reactflow.Handle,{type:"source",position:v.position,id:m.id,style:{position:"absolute",left:`${v.leftPx}px`,top:`${v.topPx}px`,width:`${N.width}px`,height:`${N.height}px`,background:N.color,border:`1px solid ${N.borderColor}`,cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:N.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:N.borderRadius,clipPath:N.clipPath},title:`${m.groupName} - ${m.label} (${m.connectorType})`,children:m.label},`handle-${m.id}`)})})]})};var pn=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:n="single",ribbonFiberIds:i}=e||{},d=reactflow.useEdges(),a=d.find(w=>w.target===o&&w.targetHandle==="left"),c=d.find(w=>w.source===o&&w.sourceHandle==="right"),l=d.find(w=>w.target===o&&w.targetHandle==="right"),b=c||l,f=a?.data?.color||"#555",u=b?.data?.color||"#555",p=n==="ribbon",m=a?.data?.ribbonFiberIds||i,x=b?.data?.ribbonFiberIds||i,P=p&&m?Rt(m):null,N=p&&x?Rt(x):null,v=!!a&&!!b;return jsxRuntime.jsxs("div",{className:`splice-node ${t?"selected":""}`,style:{width:p?85:69,height:p?20:16,borderRadius:8,border:"none",outline:"none",position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"none"},children:[p&&P&&N?jsxRuntime.jsxs("div",{style:{position:"absolute",inset:0,borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none",display:"grid",gridTemplateColumns:"1fr 1fr"},children:[jsxRuntime.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:P.map((w,R)=>jsxRuntime.jsx("div",{style:{flex:1,background:w.base,opacity:w.striped?.9:1}},`left-${R}`))}),jsxRuntime.jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:N.map((w,R)=>jsxRuntime.jsx("div",{style:{flex:1,background:w.base,opacity:w.striped?.9:1}},`right-${R}`))})]}):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:f}}),jsxRuntime.jsx("div",{style:{background:u}})]}),jsxRuntime.jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),v&&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}}),v&&typeof r=="number"&&jsxRuntime.jsxs("div",{className:"splice-text-label animate-in",style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",fontSize:p?8:9,fontFamily:"monospace",pointerEvents:"none",zIndex:3,fontWeight:"bold",gap:"2px"},children:[jsxRuntime.jsx("div",{children:`${r.toFixed(2)} dB`}),p&&i&&jsxRuntime.jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[i.length,"F"]})]}),jsxRuntime.jsx(reactflow.Handle,{type:"target",position:reactflow.Position.Left,id:"left",isConnectable:true,style:{width:12,height:p&&P?20:12,borderRadius:p&&P?"6px":"50%",border:"none",background:p&&P?`linear-gradient(to bottom, ${P.map(w=>w.base).join(", ")})`:f,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:p&&N?20:12,borderRadius:p&&N?"6px":"50%",border:"none",background:p&&N?`linear-gradient(to bottom, ${N.map(w=>w.base).join(", ")})`:u,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:p&&N?20:12,borderRadius:p&&N?"6px":"50%",border:"none",background:p&&N?`linear-gradient(to bottom, ${N.map(w=>w.base).join(", ")})`:u,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var zo=20,fr=36;var to=32,Ii=4,zt=12,fd=69,oo=80,fn=(oo-fd)/2;var gn=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",i=n?fr:zo,d=n?32:16,a=to,c=o.y-a,l=Math.round(c/i)+1,f=Math.max(1,Math.min(zt,l));if(!Wo(t,e,f,r)){let m=Uo(t,e,r,f);if(m!==f){let x=(i-d)/2;return {x:fn,y:a+(m-1)*i+x,holderPosition:m}}}let u=(i-d)/2,p=a+(f-1)*i+u;return {x:fn,y:p,holderPosition:f}},Wo=(e,t,o,r)=>!r.filter(i=>i.parentId===e.id&&i.type==="splice"&&i.id!==t.id).some(i=>i.data.holderPosition===o),Uo=(e,t,o,r=1)=>{for(let n=r;n<=zt;n++)if(Wo(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(Wo(e,t,n,o))return n;return 1},gd=(e,t)=>Vo(e,t,false),Vo=(e,t,o=false)=>{let r=to,n=o?fr:zo,d=(n-(o?32:16))/2,a=r+(t-1)*n+d;return {x:fn,y:a}};var hn=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,n]=ot.useState(false),i=()=>{if(!r)return null;let d=[],a=to;for(let c=1;c<=zt;c++){let l=a+(c-1)*zo;d.push(jsxRuntime.jsxs("div",{style:{position:"absolute",left:"-35px",top:`${l}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:`${zo}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",c]},c));}return d};return jsxRuntime.jsxs("div",{className:`splice-tray-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${oo}px`,height:`${to+zt*fr+Ii}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"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:`${to}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:d=>{d.stopPropagation();},onMouseDown:d=>{d.stopPropagation();},onClick:d=>{d.stopPropagation(),d.preventDefault(),n(!r);},style:{background:r?"#10b981":"#374151",color:r?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${r?"Hide":"Show"} holder markers`,children:"H"})]}),i(),jsxRuntime.jsx("div",{style:{position:"absolute",top:to,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var yn=({data:e,selected:t,id:o})=>{let{fibersPerTube:r=12,tubeIndex:n=1,startOn:i="left-center"}=e||{},d=e?.mode==="ribbon"||e?.ribbon===true,a=reactflow.useEdges(),c=`tube-${n}`,l=a.find(j=>j.source===o&&j.sourceHandle===c||j.target===o&&j.targetHandle===c),b=l?.data?.color,f=Xe((n-1)%12+1),u=b||f,p=Math.max(1,Math.min(24,Number(r)||12)),m=14,x=4,P=1,N=2,v=20,C=p*m+(p-1)*x,F=Math.max(60,C+P*2+N*2),w=i==="left"?reactflow.Position.Left:i==="right"?reactflow.Position.Right:reactflow.Position.Bottom,R=w!==reactflow.Position.Bottom,D=R?14:20,E=R?8:20,A=R?`inset ${w===reactflow.Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",_=l?u:R?`linear-gradient(${w===reactflow.Position.Left?"to right":"to left"}, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)), ${u}`:`radial-gradient(circle, ${u} 40%, transparent 70%)`,U={width:D,height:E,borderRadius:R?6:"50%",opacity:l?.3:.9,pointerEvents:"auto",background:_,backgroundColor:u,border:l?`2px solid ${u}`:`3px dashed ${u}`,cursor:"crosshair","--fiber-bg":u,boxShadow:l?A:`${A}${A!=="none"?", ":""}0 0 8px ${u}`,transition:"opacity 0.2s, box-shadow 0.2s",...w===reactflow.Position.Left?{left:-(D-4)}:w===reactflow.Position.Right?{right:-(D-4)}:{}},se=ot.useMemo(()=>{let j=[],Y=F-N*2-P*2,ie,z,V=false;i==="left"?(ie=P,z=reactflow.Position.Top):i==="right"?(ie=P+Y-C,z=reactflow.Position.Top,V=true):(ie=P+(Y-C)/2,z=reactflow.Position.Top);for(let B=0;B<p;B++){let O=V?p-B:B+1,X=`fiber-${O}`,ee=a.find(De=>De.source===o&&De.sourceHandle===X||De.target===o&&De.targetHandle===X),M=!!ee&&(ee.data?.isRibbon||ee.data?.ribbonFiberIds&&Array.isArray(ee.data.ribbonFiberIds)),L=ee?.data?.color,de=typeof ee?.data?.striped=="boolean"?ee.data.striped:void 0,ae=Tt(O);d||M?ae=Tt(O,{base:"#808080",striped:false}):(L||de!==void 0)&&(ae=Tt(O,{...L?{base:L}:{},...de!==void 0?{striped:de}:{}}));let ce=ie+B*(m+x),q=P,ve={position:"absolute",left:`${ce}px`,top:`${q}px`,width:m,height:m,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":ae.base,backgroundColor:ae.base};ae.backgroundImage&&(ve["--fiber-bg-image"]=ae.backgroundImage),j.push(jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:X,type:"target",position:z,className:"tube-fiber-handle",isConnectable:true,style:ve,"data-fiber-idx":O,"data-fiber-color":ae.base}),jsxRuntime.jsx(reactflow.Handle,{id:X,type:"source",position:z,className:"tube-fiber-handle",isConnectable:true,style:ve,"data-fiber-idx":O,"data-fiber-color":ae.base})]},`fiber-${O}`));}return j},[p,i,F,a,o,m,x,P,N,C,d]);return jsxRuntime.jsxs("div",{style:{width:F,height:v,borderRadius:4,background:"#111827",border:`${N}px solid ${t?"#3b82f6":u}`,position:"relative",boxShadow:t?`0 0 0 ${N}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:P,boxSizing:"border-box",overflow:"visible"},children:[se,jsxRuntime.jsx(reactflow.Handle,{id:c,type:"target",position:w,isConnectable:true,className:"tube-connection-handle",style:U,"data-tube-idx":n,"data-tube-color":u,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"}),jsxRuntime.jsx(reactflow.Handle,{id:c,type:"source",position:w,isConnectable:true,className:"tube-connection-handle",style:U,"data-tube-idx":n,"data-tube-color":u,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"})]})};var Nn=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:n,color:i,rotation:d}=e||{},a=ot__default.default.useRef(null);ot__default.default.useEffect(()=>{if(a.current){let z=typeof d=="number"?d:0;a.current.style.transform=`rotate(${z}deg)`,a.current.style.transformOrigin="center center";}},[d]);let c=Math.max(1,Math.min(24,Number(o)||12)),l=10,b=2,f=6,u=f+l+4,p=60,m=Math.max(120,c*(l+b)+f*2),P=n??`${c}f Cable`,N=r?`Cable ID ${r}`:void 0,v=Xe(1),C=i||v,F=t?"#3b82f6":C,w=typeof d=="number"?d:0,R=z=>{let V=(z%360+360)%360;return V>=315||V<45?reactflow.Position.Top:V>=45&&V<135?reactflow.Position.Right:V>=135&&V<225?reactflow.Position.Bottom:reactflow.Position.Left},D=()=>{let z=[],V=R(w);for(let B=0;B<c;B++){let O=B+1,X=Tt(O),ee=X.base,M=f+B*(l+b),L=-5,de=X.backgroundImage?X.backgroundImage:ee,ae={position:"absolute",left:`${M}px`,top:`${L}px`,width:l,height:l,borderRadius:"50%",border:"none",background:de,backgroundColor:ee,zIndex:10,cursor:"pointer","--fiber-bg":ee};X.backgroundImage&&(ae["--fiber-bg-image"]=X.backgroundImage);let ce=`fiber-${O}`;z.push(jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:ce,type:"target",position:V,className:"tube-fiber-handle",isConnectable:true,style:ae,"data-fiber-idx":O,"data-fiber-color":ee}),jsxRuntime.jsx(reactflow.Handle,{id:ce,type:"source",position:V,className:"tube-fiber-handle",isConnectable:true,style:ae,"data-fiber-idx":O,"data-fiber-color":ee})]},`fiber-${O}`));}return z},E="cable-button",A=8,_={width:A,height:A,borderRadius:"50%",background:C,backgroundColor:C,border:`1px solid ${C}`,cursor:"pointer",zIndex:10},U=2,j=(z=>{let V=(z%360+360)%360;return V>=315||V<45?reactflow.Position.Bottom:V>=45&&V<135?reactflow.Position.Left:V>=135&&V<225?reactflow.Position.Top:reactflow.Position.Right})(w),Y={width:m,height:p,position:"relative",transform:`rotate(${w}deg)`,transformOrigin:"center center","--rotation":`${w}deg`},ie={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${U}px solid ${F}`,boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:f,paddingTop:u,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2};return jsxRuntime.jsx("div",{ref:a,style:Y,children:jsxRuntime.jsxs("div",{style:ie,children:[D(),jsxRuntime.jsx(reactflow.Handle,{id:E,type:"source",position:j,className:"cable-button-handle",isConnectable:true,style:_,"data-handle-type":"cable-button","data-cable-color":C}),jsxRuntime.jsx(reactflow.Handle,{id:E,type:"target",position:j,className:"cable-button-handle",isConnectable:true,style:_,"data-handle-type":"cable-button","data-cable-color":C}),jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2,transform:"translateX(2px)"},children:[jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:P}),N&&jsxRuntime.jsx("div",{style:{fontSize:10,opacity:.8},children:N})]})]})})};var Pn=({data:e,selected:t})=>{let{tubeCount:o=12,fibersPerTube:r=12,fiberCount:n,cableId:i="CBL-002",label:d,tubeStartIndex:a=1,color:c}=e||{},l=Math.max(1,Math.min(24,Number(o)||12)),b=Math.max(1,Number(a)||1),f=14,u=10,p=3,m=6,x=m+u+4,P=60,N=Math.max(120,l*(f+p)+m*2),v=n??l*(Number(r)||12),C=d??`${v}f Cable`,F=i?`Cable ID ${i}`:void 0,w=Xe(b),R=c||w,D=t?"#3b82f6":R,E=()=>{let j=[];for(let Y=0;Y<l;Y++){let ie=b+Y,z=Tt(ie),V=z.base,B=m+Y*(f+p),O=-5,X=z.backgroundImage?z.backgroundImage:V,ee={position:"absolute",left:`${B}px`,top:`${O}px`,width:f,height:u,borderRadius:6,border:"none",background:X,backgroundColor:V,zIndex:10,cursor:"pointer","--fiber-bg":V};z.backgroundImage&&(ee["--fiber-bg-image"]=z.backgroundImage);let M=`tube-${ie}`;j.push(jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:M,type:"target",position:reactflow.Position.Top,className:"tube-fiber-handle",isConnectable:true,style:ee,"data-fiber-idx":ie,"data-tube-idx":ie,"data-tube-color":V}),jsxRuntime.jsx(reactflow.Handle,{id:M,type:"source",position:reactflow.Position.Top,className:"tube-fiber-handle",isConnectable:true,style:ee,"data-fiber-idx":ie,"data-tube-idx":ie,"data-tube-color":V})]},`tube-${ie}`));}return j},A="cable-button",_=8,U={width:_,height:_,borderRadius:"50%",background:R,backgroundColor:R,border:`1px solid ${R}`,cursor:"pointer",zIndex:10};return jsxRuntime.jsxs("div",{style:{width:N,height:P,borderRadius:4,background:"#111827",border:`2px solid ${D}`,position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:m,paddingTop:x,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[E(),jsxRuntime.jsx(reactflow.Handle,{id:A,type:"source",position:reactflow.Position.Bottom,className:"cable-button-handle",isConnectable:true,style:U,"data-handle-type":"cable-button","data-cable-color":R}),jsxRuntime.jsx(reactflow.Handle,{id:A,type:"target",position:reactflow.Position.Bottom,className:"cable-button-handle",isConnectable:true,style:U,"data-handle-type":"cable-button","data-cable-color":R}),jsxRuntime.jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2},children:[jsxRuntime.jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:C}),F&&jsxRuntime.jsx("div",{style:{fontSize:10,opacity:.8},children:F})]})]})};var Cn=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:n,label:i,portLabelsLeft:d,portLabelsRight:a}=e||{},c=reactflow.useEdges(),l=typeof n=="number"&&[1,2,4].includes(n)?n:2,b=Math.max(1,Math.min(4,l)),f=9,u=3,p=3,m=60,x=30,P=b*f+(b-1)*u,N=Math.max(x,P+p*2),v=Math.max(m,80),C=(R,D)=>{let E=`${R}-${D+1}`;return c.find(_=>_.source===o&&_.sourceHandle===E||_.target===o&&_.targetHandle===E)?.data?.color||"#555"},F=R=>{let D=[],E=R==="left"?reactflow.Position.Left:reactflow.Position.Right,A=R==="left"?d:a;for(let _=0;_<b;_++){let U=_+1,se=`${R}-${U}`,j=C(R,_),z=p+(N-P)/2+_*(f+u),V={position:"absolute",left:R==="left"?-5:void 0,right:R==="right"?-5:void 0,top:`${z}px`,width:f,height:f,borderRadius:"50%",border:"none",background:j,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};D.push(jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:se,type:"target",position:E,isConnectable:true,style:V}),jsxRuntime.jsx(reactflow.Handle,{id:se,type:"source",position:E,isConnectable:true,style:V})]},se)),A&&A[_]&&D.push(jsxRuntime.jsx("div",{style:{position:"absolute",left:R==="left"?-30:void 0,right:R==="right"?-30:void 0,top:`${z}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:R==="left"?"right":"left",width:"25px"},children:A[_]},`${se}-label`));}return D},w=i||`${r}-${b}f`;return jsxRuntime.jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:v,height:N,borderRadius:4,border:`2px solid ${t?"#3b82f6":"#4b5563"}`,background:"#1f2937",position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",display:"flex",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",fontSize:"10px",padding:`${p}px`,boxSizing:"border-box"},children:[F("left"),jsxRuntime.jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:w})}),F("right")]})};var io=32,Nr=30,kd=24,Pd=80,wr=400,xr=300,Li=2,no=8,Bi=120;function Tn(e){let{couplerFiberCount:t}=e.data||{},o=typeof t=="number"&&[1,2,4].includes(t)?t:2,r=Math.max(1,Math.min(4,o)),n=7,i=3,d=3,a=60,c=30,l=r*n+(r-1)*i,b=Math.max(c,l+d*2);return {width:Math.max(a,80),height:b}}function kr(e){let{fibersPerTube:t=12}=e.data||{},o=Math.max(1,Math.min(24,Number(t)||12)),r=14,n=4,i=1,d=2,a=20,c=o*r+(o-1)*n;return {width:Math.max(60,c+i*2+d*2),height:a}}function Oi(e){return {width:oo,height:0}}function Wi(e){return e.type==="coupler"?Tn(e):e.type==="tube"?kr(e):e.type==="splice-tray"?Oi():{width:80,height:30}}function vn(e){let t=0;for(let o of e){let r=Wi(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function zi(e,t=0){let o=t;for(let r of e){let n=Wi(r),i=(r.position?.y||0)+n.height;i>o&&(o=i);}return o}function Ui(e){return e.data?.panelWidth||wr}function Cd(e){return e.data?.panelHeight||xr}function Vi(e){return Ui(e)-Li*2-no*2}function vd(e,t){return Vi(e)-t}function Gi(e,t=Nr){return Math.floor(e/t)+1}function Xi(e,t=Nr){return (e-1)*t}function Td(e,t,o){let r=Nr,n=Gi(o.y,r),i=Xi(n,r);return {x:o.x,y:i,slotPosition:n}}function Rn(e,t){if(t.length===0)return {width:e.data?.panelWidth||wr,height:e.data?.panelHeight||xr};let o=t.some(c=>c.type==="tube"),r=t.some(c=>c.type==="splice-tray"),n=t.some(c=>c.type==="coupler"),i;if(o&&r&&n){let c=0,l=0;for(let u of t)if(u.type==="tube"){let p=kr(u);p.width>c&&(c=p.width);}else if(u.type==="coupler"){let p=Tn(u);p.width>l&&(l=p.width);}let b=c+Bi+oo+l+5,f=0;i=f+b+f;}else i=vn(t)+4;i=Math.max(e.data?.panelWidth||wr,i);let d=zi(t,io),a=Math.max(e.data?.panelHeight||xr,d+no);return {width:i,height:a}}function ji(e,t,o){if(e===0)return 0;if(e===1)return t;let r=e*t,n=o-r,i=Math.max(5,n/(e-1));return t+i}function Rd(e,t,o){return ji(e,t,o)}var Mi=20,$i=400,Ai=300;function Sn(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||$i,height:e.data?.closureHeight||e.data?.panelHeight||Ai};let o=t.some(a=>a.type==="tube"),r=t.some(a=>a.type==="splice-tray"),n;if(o&&r){let a=0,c=0,l=0,b=t.filter(u=>u.type==="tube"),f=t.filter(u=>u.type==="splice-tray");if(b.length>0&&f.length>0){let u=f.map(m=>m.position?.x||0),p=u.reduce((m,x)=>m+x,0)/u.length;for(let m of b){let x=kr(m);(m.position?.x||0)<p?x.width>a&&(a=x.width):x.width>c&&(c=x.width);}f.length>0&&(l=oo),n=no+a+Mi+l+Mi+c+5;}else n=vn(t)+no+5;}else n=vn(t)+no+5;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||$i,n);let i=zi(t,io),d=Math.max(e.data?.closureHeight||e.data?.panelHeight||Ai,i+no);return {width:n,height:d}}var Fn=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:n,panelWidth:i,panelHeight:d}=e||{},{getNodes:a,setNodes:c}=reactflow.useReactFlow(),l=ot.useRef(false),b=ot.useRef([]),f=ot.useMemo(()=>{let C=a().filter(F=>F.parentId===o);return (C.length!==b.current.length||C.some((F,w)=>F.id!==b.current[w]?.id))&&(b.current=C),b.current},[a,o]),u=ot.useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:i,panelHeight:d}}),[o,e,i,d]),p=ot.useMemo(()=>i&&d?{width:i,height:d}:f.length===0?{width:i||400,height:d||300}:Rn(u,f),[f,u,i,d]);ot.useEffect(()=>{if(i&&d||l.current)return;let v=i,C=d,F=Math.abs((v||0)-p.width),w=Math.abs((C||0)-p.height);(F>1||w>1)&&(l.current=true,c(R=>R.map(D=>D.id===o?{...D,data:{...D.data,panelWidth:p.width,panelHeight:p.height}}:D)),setTimeout(()=>{l.current=false;},0));},[o,p.width,p.height,i,d,c]);let m=p.width,x=p.height,P=io,N=n||r;return jsxRuntime.jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${m}px`,height:`${x}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#1f2937",boxSizing:"border-box"},children:[jsxRuntime.jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${P}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"6px 6px 0 0",borderBottom:"1px solid #4b5563"},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:N})}),jsxRuntime.jsx("div",{style:{position:"absolute",top:P,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var _n=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:n,closureWidth:i,closureHeight:d,panelWidth:a,panelHeight:c}=e||{},{getNodes:l,setNodes:b}=reactflow.useReactFlow(),f=ot.useRef(false),u=ot.useRef([]),p=ot.useMemo(()=>{let R=l().filter(D=>D.parentId===o);return (R.length!==u.current.length||R.some((D,E)=>D.id!==u.current[E]?.id))&&(u.current=R),u.current},[l,o]),m=ot.useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:i||a,closureHeight:d||c}}),[o,e,i,d,a,c]),x=ot.useMemo(()=>i&&d?{width:i,height:d}:a&&c?{width:a,height:c}:p.length===0?{width:i||a||400,height:d||c||300}:Sn(m,p),[p,m,i,d,a,c]);ot.useEffect(()=>{if(i&&d||a&&c||f.current)return;let w=i||a,R=d||c,D=Math.abs((w||0)-x.width),E=Math.abs((R||0)-x.height);(D>1||E>1)&&(f.current=true,b(A=>A.map(_=>_.id===o?{..._,data:{..._.data,closureWidth:x.width,closureHeight:x.height}}:_)),setTimeout(()=>{f.current=false;},0));},[o,x.width,x.height,i,d,a,c,b]);let P=x.width,N=x.height,v=io,C=n||r,F=P/2;return jsxRuntime.jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${F}px ${F}px 12px 12px`,padding:0,width:`${P}px`,height:`${N}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#1f2937",boxSizing:"border-box",overflow:"hidden"},children:[jsxRuntime.jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${v}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:`${F}px ${F}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:C})}),jsxRuntime.jsx("div",{style:{position:"absolute",top:v,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var $n=({data:e,selected:t,id:o})=>{let{label:r,splitterType:n="splitter",inputCount:i=1,outputCount:d=8}=e||{},a=reactflow.useEdges(),c=r||(n==="WDM"?"WDM":"Splitter"),l=9,b=3,f=3,u=50,p=30,m=Math.min(Math.max(i||1,1),2),x=m*l+(m-1)*b,P=Math.min(d||8,48),N=P*l+(P-1)*b,v=Math.max(x,N),C=Math.max(p,v+f*2),F=Math.max(u,50),w=Y=>a.find(z=>z.source===o&&z.sourceHandle===Y||z.target===o&&z.targetHandle===Y)?.data?.color||"#555",R=()=>{let Y=[],ie=f+(C-x)/2;for(let z=0;z<m;z++){let V=`input-${z+1}`,B=ie+z*(l+b),O=w(V),X={position:"absolute",left:-5,top:`${B}px`,width:l,height:l,borderRadius:"50%",border:"none",background:O,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};Y.push(jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:`${V}-target`,type:"target",position:reactflow.Position.Left,isConnectable:true,style:X}),jsxRuntime.jsx(reactflow.Handle,{id:`${V}-source`,type:"source",position:reactflow.Position.Left,isConnectable:true,style:X})]},V));}return Y},D=()=>{let Y=[],ie=f+(C-N)/2;for(let z=0;z<P;z++){let V=`output-${z+1}`,B=ie+z*(l+b),O=w(V),X={position:"absolute",right:-5,top:`${B}px`,width:l,height:l,borderRadius:"50%",border:"none",background:O,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};Y.push(jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:`${V}-target`,type:"target",position:reactflow.Position.Right,isConnectable:true,style:X}),jsxRuntime.jsx(reactflow.Handle,{id:`${V}-source`,type:"source",position:reactflow.Position.Right,isConnectable:true,style:X})]},V));}return Y},E=Math.max(x+f*4,p*.6),A=(C-E)/2,_=A+E,U=0,se=C,j=t?"#3b82f6":"#4b5563";return jsxRuntime.jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:F,height:C,position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",display:"flex",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",fontSize:"10px",padding:`${f}px`,boxSizing:"border-box"},children:[jsxRuntime.jsx("svg",{width:F,height:C,viewBox:`0 0 ${F} ${C}`,style:{position:"absolute",top:0,left:0,width:`${F}px`,height:`${C}px`,pointerEvents:"none",zIndex:0},children:jsxRuntime.jsx("polygon",{points:`0,${A} 0,${_} ${F},${se} ${F},${U}`,fill:"#1f2937",stroke:j,strokeWidth:"2"})}),R(),jsxRuntime.jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsxRuntime.jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:c})}),D()]})};var qi=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",vr=(e,t)=>qi(e)||qi(t),re=(e,t)=>t?e?.type==="fibre-split"?Ge(t):Ge(t):t||"";function Tr(e,t){if(!e||!t)return "unknown";let o=Ge(t);if(!o)return "unknown";if(e.type==="vertical-pdu")return "power";let r=e.data??{},n=Array.isArray(r.ports)?r.ports:[],i=Array.isArray(r.rearPorts)?r.rearPorts:[];for(let l of [...n,...i])for(let b of l.ports||[])if(Et(l.name,{id:b.id,label:b.label,type:St(b.type)?b.type:void 0})===o)return St(b.type)?"power":"network";if(cr(o)||/^\d+$/.test(o))return "power";let d=o.toLowerCase(),a=d.startsWith("net-")||d.startsWith("port-")||d.startsWith("uplink-")||d.includes("fiber")||d.includes("ports"),c=/^[A-Z0-9]+-\d+$/i.test(o)&&!d.startsWith("pwr")&&!d.startsWith("power");return a||c?"network":"unknown"}function ao(e,t){return Tr(e,t)==="power"}function Md(e,t){if(!e.source||!e.target||!e.sourceHandle||!e.targetHandle)return {valid:true};let o=t.nodes.find(M=>M.id===e.source),r=t.nodes.find(M=>M.id===e.target),n=vr(o,r);if(!n){let M=Tr(o,e.sourceHandle),L=Tr(r,e.targetHandle);if(M!=="unknown"&&L!=="unknown"&&M!==L)return {valid:false,reason:`Cannot connect ${M} handle to ${L} handle`};let de=M==="power"&&L==="power",ae=o?.type==="vertical-pdu"||r?.type==="vertical-pdu";if(de&&!ae)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let i=re(o,e.sourceHandle),d=re(r,e.targetHandle),a=t.edges.some(M=>e.ignoreEdgeId&&M.id===e.ignoreEdgeId?false:M.source===e.source?re(o,M.sourceHandle)===i:M.target===e.source?re(o,M.targetHandle)===i:false),c=t.edges.some(M=>e.ignoreEdgeId&&M.id===e.ignoreEdgeId?false:M.target===e.target?re(r,M.targetHandle)===d:M.source===e.target?re(r,M.sourceHandle)===d:false);if((a||c)&&!n)return a?{valid:false,reason:`Source handle ${e.sourceHandle} on node ${e.source} is already connected`}:{valid:false,reason:`Target handle ${e.targetHandle} on node ${e.target} is already connected`};let l=(M,L)=>(M?.type==="tube"||M?.type==="cable")&&!!L&&L.startsWith("fiber-"),b=(M,L)=>(M?.type==="tube"||M?.type==="multi-tube-cable")&&!!L&&L.startsWith("tube-"),f=(M,L)=>M?.type==="multi-tube-cable"&&!!L&&L.startsWith("tube-"),u=(M,L)=>M?.type==="tube"&&!!L&&L.startsWith("tube-"),p=(M,L)=>(M?.type==="cable"||M?.type==="multi-tube-cable")&&L==="cable-button",m=(M,L)=>M?.type==="splice"&&(L==="left"||L==="right"),x=(M,L)=>M?.type==="coupler"&&!!L&&(L.startsWith("left-")||L.startsWith("right-")),P=(M,L)=>{if(M?.type!=="fibre-split"||!L)return false;let de=re(M,L);return de.startsWith("input-")||de.startsWith("output-")};if(!n)return {valid:true};if(o?.type==="splice"&&r?.type==="splice"){let M=o.data?.mode==="ribbon",L=r.data?.mode==="ribbon";if(M!==L)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let N=l(o,e.sourceHandle),v=l(r,e.targetHandle),C=m(o,e.sourceHandle),F=m(r,e.targetHandle),w=x(o,e.sourceHandle),R=x(r,e.targetHandle),D=P(o,e.sourceHandle),E=P(r,e.targetHandle),A=p(o,e.sourceHandle),_=p(r,e.targetHandle),U=f(o,e.sourceHandle),se=f(r,e.targetHandle),j=u(o,e.sourceHandle),Y=u(r,e.targetHandle),ie=b(o,e.sourceHandle),z=b(r,e.targetHandle);return N&&F||v&&C||(C&&(R||E)||F&&(w||D))||(w&&(R||E||F)||R&&(w||D||C))||A&&_||(U&&Y||se&&j)?{valid:true}:ie&&z?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}function Rr(e,t){if(!t)return;let o="--rear",r=Ge(e),n=r.endsWith(o);n&&(r=r.slice(0,-o.length));let i=t.data??{},d=i.handleSideMap;if(d&&d[r])return d[r];if(n)return "rear";if(r==="net-top"||r==="net-bottom")return "front";if(r==="pwr-left-1"||r==="pwr-left-2"||r==="net-right-1"||r==="net-right-2")return "rear";let a=Array.isArray(i.ports)?i.ports:[],c=Array.isArray(i.rearPorts)?i.rearPorts:[];if(cr(r))return "rear";for(let l of a)for(let b of l.ports||[])if(Et(l.name,{id:b.id,label:b.label,type:St(b.type)?b.type:void 0})===r)return "front";for(let l of c)for(let b of l.ports||[])if(Et(l.name,{id:b.id,label:b.label,type:St(b.type)?b.type:void 0})===r)return "rear"}function An(e={},t={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},r=new Set;return {getState:()=>o,setState:f=>{o={...o,...f},r.forEach(u=>u(o));},subscribe:f=>(r.add(f),()=>r.delete(f)),selectEdgeZIndex:f=>{let u=N=>{if(typeof N.parentId=="string")return N.parentId;let v=N.parentNode;if(typeof v=="string")return v},p=N=>{let v=u(N),C=v?o.nodes.find(D=>D.id===v&&D.type==="rack"):void 0;if(C&&$e(C.data))return Bt(Ve(N.data));let F=Array.isArray(N.data?.rearPorts)&&N.data.rearPorts.length>0,w=Array.isArray(N.data?.ports)&&N.data.ports.length>0;return [N.data?.view||(F&&!w?"rear":"front")]},m=(N,v)=>{let C=o.nodes.find(Y=>Y.id===N);if(!(!!C&&(C.type==="device"||C.type==="server"||C.type==="switch"||C.type==="router"))||!C||C.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let R=p(C),D=Rr(v||"",C);if(D)return R.includes(D)?1e3:500;let E=(v||"").toString().replace(/-(source|target)$/i,""),A=E.toLowerCase(),_=A.startsWith("pwr")||A.startsWith("power"),U=A.startsWith("net-")||A.startsWith("port-")||A.startsWith("uplink-")||A.includes("fiber")||A.includes("ports"),se=/^[A-Z0-9]+-\d+$/i.test(E)&&!A.startsWith("pwr")&&!A.startsWith("power"),j=U||se;if(_)return R.includes("rear")?1e3:500;if(j)return R.includes("front")?1e3:500},x=m(f.target,f.targetHandle);if(x!==void 0)return x;let P=m(f.source,f.sourceHandle);return P!==void 0?P:1e3},validateConnection:f=>(t.validateConnection||Md)(f,o),selectNodeById:f=>o.nodes.find(u=>u.id===f),selectConnectedEdges:f=>o.edges.filter(u=>u.source===f||u.target===f)}}function $d(e){let t=n=>e.subscribe(i=>n()),o=()=>e.getState();return ot.useSyncExternalStore(t,o,o)}function Bn(e){let t=r=>e.subscribe(n=>r()),o=()=>e.getState().nodes;return ot.useSyncExternalStore(t,o,o)}function On(e){let t=r=>e.subscribe(n=>r()),o=()=>e.getState().edges;return ot.useSyncExternalStore(t,o,o)}function Ji(e){return e.selectEdgeZIndex}function Qi(e){let t=_o(e.data),o=60+(e.data.uHeight||42)*20,r=e.position.x,n=e.position.x+t,i=e.position.y,d=e.position.y+o;return {left:r,right:n,top:i,bottom:d}}function ea(e,t){let o=Qi(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function Sr(e,t){let o=null,r=1/0;for(let n of t){if(!ea(e,n))continue;let i=Math.sqrt(Math.pow(e.x-n.position.x,2)+Math.pow(e.y-n.position.y,2));i<r&&(r=i,o=n);}return o}function Oe(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,findBy:i,matchOn:d=i,data:a}=e,c=i==="source"?o.sourceHandle:o.targetHandle,l=i==="source"?o.source:o.target;if(!c||!l)return null;let b=Ge(c),f=t.find(N=>d==="source"?N.source===l&&Ge(N.sourceHandle)===b:N.target===l&&Ge(N.targetHandle)===b);if(!f)return null;let u=t.filter(N=>N.id!==f.id),p=reactflow.addEdge(o,u),m=p[p.length-1],x=n({...o,id:m.id,type:r}),P={...m,type:r,zIndex:x,style:{...m.style,zIndex:x},data:a!==void 0?a:m.data};return [...p.slice(0,-1),P]}function ta(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function oa(e){return typeof e=="string"&&e.trim().length>0}function Ld(e){let t=ta(e.ports)>0||oa(e.frontImageUrl),o=ta(e.rearPorts)>0||oa(e.rearImageUrl);if(t&&o)return "both";if(t)return "front";if(o)return "rear"}function ra(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let i=Ld(e);if(i)return i;if(e.view==="front"||e.view==="rear")return e.view;let d=o+r/2;return t>=d?"front":"rear"}function aa(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}var je=({type:e,children:t})=>{let o=ot__default.default.useRef(null),r=ot__default.default.useCallback(n=>{if(o.current=n,n){let i=n.parentElement,d=0;for(;i&&!i.classList.contains("react-flow__node")&&d<10;)i=i.parentElement,d++;i&&i.classList.contains("react-flow__node")&&i.setAttribute("data-type",e);}},[e]);return ot__default.default.useEffect(()=>{if(o.current){let n=o.current.parentElement,i=0;for(;n&&!n.classList.contains("react-flow__node")&&i<10;)n=n.parentElement,i++;n&&n.classList.contains("react-flow__node")&&n.setAttribute("data-type",e);}},[e]),jsxRuntime.jsx("div",{ref:r,style:{width:"100%",height:"100%"},children:t})},sa=(e,t,o)=>({rack:r=>jsxRuntime.jsx(je,{type:"rack",children:jsxRuntime.jsx(Zr,{...r,onViewChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsxRuntime.jsx(je,{type:"fiber",children:jsxRuntime.jsx(qr,{...r})}),device:r=>jsxRuntime.jsx(je,{type:"device",children:jsxRuntime.jsx(mo,{...r})}),server:r=>jsxRuntime.jsx(je,{type:"server",children:jsxRuntime.jsx(mo,{...r})}),switch:r=>jsxRuntime.jsx(je,{type:"switch",children:jsxRuntime.jsx(mo,{...r})}),router:r=>jsxRuntime.jsx(je,{type:"router",children:jsxRuntime.jsx(mo,{...r})}),"vertical-pdu":r=>jsxRuntime.jsx(je,{type:"vertical-pdu",children:jsxRuntime.jsx(cn,{...r})}),splice:r=>jsxRuntime.jsx(je,{type:"splice",children:jsxRuntime.jsx(pn,{...r})}),"splice-tray":r=>jsxRuntime.jsx(je,{type:"splice-tray",children:jsxRuntime.jsx(hn,{...r})}),tube:r=>jsxRuntime.jsx(je,{type:"tube",children:jsxRuntime.jsx(yn,{...r})}),cable:r=>jsxRuntime.jsx(je,{type:"cable",children:jsxRuntime.jsx(Nn,{...r})}),"multi-tube-cable":r=>jsxRuntime.jsx(je,{type:"multi-tube-cable",children:jsxRuntime.jsx(Pn,{...r})}),coupler:r=>jsxRuntime.jsx(je,{type:"coupler",children:jsxRuntime.jsx(Cn,{...r})}),"patch-panel":r=>jsxRuntime.jsx(je,{type:"patch-panel",children:jsxRuntime.jsx(Fn,{...r})}),closure:r=>jsxRuntime.jsx(je,{type:"closure",children:jsxRuntime.jsx(_n,{...r})}),"fibre-split":r=>jsxRuntime.jsx(je,{type:"fibre-split",children:jsxRuntime.jsx($n,{...r})})});function da(e){if(!e)return false;if(e.type==="switch")return true;if(e.type!=="device")return false;let t=e.data?.deviceType;return typeof t=="string"&&t.toLowerCase().replace(/_/g,"-")==="switch"}function ca(e,t,o){let r=e.sourceHandle,n=e.targetHandle;return da(t)&&r&&!ao(t,r)&&(r=Ge(r)),da(o)&&n&&!ao(o,n)&&(n=`${Ge(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var qd={fiber:ar,ethernet:ar,power:Qr,smoothstep:gi,step:hi,"thick-cable":xi},Jd=8192,Qd=8192,ec=2048,tc=4;function Xo(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function oc(e){if(e)return {...e,width:Xo(e.width,1,Jd),height:Xo(e.height,1,Qd),padding:Xo(e.padding,0,ec),pixelRatio:Xo(e.pixelRatio,.1,tc),quality:Xo(e.quality,0,1)}}var rc=({nodes:e,edges:t,initialNodes:o,initialEdges:r,onNodesChange:n,onEdgesChange:i,store:d,debug:a,onNodeClick:c,onEdgeClick:l,nodeTypes:b,edgeTypes:f,onConnect:u,onEdgeUpdate:p,isValidConnection:m,connectionMode:x,onViewChange:P,onRackFaceChange:N,className:v,style:C,alignRacksToBottom:F,reAssignable:w=true,colorMode:R="dark",onInit:D,onFlowMethods:E,showDownloadButton:A=false,downloadButtonPosition:_="top-right",downloadButtonText:U="Download Image",downloadButtonStyle:se,useSmoothstepEdgesForTubes:j=false,readOnly:Y=false,interaction:ie,actionPanel:z,connectOnClick:V=true,panOnDrag:B=true,panOnScroll:O=true,zoomOnScroll:X=true,fitViewOptions:ee})=>{let M=ot.useCallback((s,g)=>{let y=new Map,h=[],T=[],I=(H,$)=>!H||!$?false:!!(H.startsWith("tube-")||$.type==="splice"&&(H==="left"||H==="right")||H==="cable-button");for(let H of s){if(!H.source||!H.target||!H.sourceHandle||!H.targetHandle){a&&console.warn("Invalid edge skipped (missing source/target/handles):",H);continue}let $=g.find(et=>et.id===H.source),S=g.find(et=>et.id===H.target),K=`${H.source}:${H.sourceHandle}`,oe=y.get(K),Ee=I(H.sourceHandle,$),Ie=`${H.target}:${H.targetHandle}`,Fe=y.get(Ie),Ze=I(H.targetHandle,S);if(oe&&!Ee){a&&console.warn("Duplicate connection detected on source handle, removing:",{handle:K,existingEdge:oe.id,duplicateEdge:H.id}),T.push(H);continue}if(Fe&&!Ze){a&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Ie,existingEdge:Fe.id,duplicateEdge:H.id}),T.push(H);continue}h.push(H),oe||y.set(K,H),Fe||y.set(Ie,H);}return a&&T.length>0&&console.log(`Filtered ${T.length} duplicate edge(s) from initial edges`),h},[a]),L=Array.isArray(e)&&Array.isArray(t),de=ot__default.default.useMemo(()=>L?e||[]:o||e||[],[L,e,o]),ae=ot__default.default.useMemo(()=>L?t||[]:r||t||[],[L,t,r]),ce=ot__default.default.useMemo(()=>M(ae,de),[ae,de,M]),q=ot__default.default.useMemo(()=>d||An({nodes:de,edges:ce,debug:a}),[d,L,a,ce]),ve=Bn(q),De=On(q),[xe,be]=reactflow.useNodesState(ve),[fe,he,_e]=reactflow.useEdgesState(De),te=Ji(q),Ae=ot.useRef(null),[Re,dt]=ot.useState(false);ot.useEffect(()=>{let s=()=>{dt(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return s(),window.addEventListener("resize",s),()=>window.removeEventListener("resize",s)},[]);let Ne=Y===true,Se=ot.useMemo(()=>{let g={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!Re,edgesFocusable:!Re,edgesReconnectable:true,connectOnClick:V,panOnDrag:B,panOnScroll:O&&!Re,zoomOnScroll:X&&!Re,zoomOnPinch:!Re,zoomOnDoubleClick:!Re,allowKeyboardDelete:true,showControls:true,showMiniMap:!Re,showInteractiveControl:true},...ie??{}};return Ne?{...g,nodesDraggable:false,nodesConnectable:false,elementsSelectable:false,edgesFocusable:false,edgesReconnectable:false,connectOnClick:false,panOnDrag:false,panOnScroll:false,zoomOnScroll:false,zoomOnPinch:false,zoomOnDoubleClick:false,allowKeyboardDelete:false,showInteractiveControl:false}:g},[Re,V,B,O,X,ie,Ne]),ke=ot.useMemo(()=>({enabled:z?.enabled??true,showRearToggle:z?.showRearToggle??true,showDeRack:z?.showDeRack??true}),[z]),{toObject:Nt,setViewport:Ye,setNodes:Te,setEdges:ct,getNodes:rt,getEdges:kt,fitView:Pe,flowToScreenPosition:Qe}=reactflow.useReactFlow();ot.useEffect(()=>{E&&E({toObject:()=>Nt(),setViewport:Ye,setNodes:s=>{Te(s),q.setState({nodes:s});},setEdges:s=>{ct(s),q.setState({edges:s});},toImage:s=>Ae.current?htmlToImage.toPng(Ae.current,oc(s)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>rt(),getEdges:()=>kt(),fitView:s=>{if(s?.nodes&&Array.isArray(s.nodes)&&s.nodes.length>0){let g=s.nodes.map(T=>rt().find(I=>I.id===T)).filter(T=>T!==void 0),{nodes:y,...h}=s;Pe({...h,nodes:g});}else {let{nodes:g,...y}=s||{};Pe(y);}}});},[E,Nt,Ye,Te,ct,q,Pe,rt,kt]);let[nt,Ko]=ot.useState(false),Mr=ot.useCallback(()=>{if(!nt){if(!Ae.current){a&&console.error("ReactFlow wrapper ref is not available");return}Ko(true),htmlToImage.toPng(Ae.current,{filter:s=>!(s?.classList?.contains("react-flow__minimap")||s?.classList?.contains("react-flow__controls")||s?.classList?.contains("react-flow__attribution")||s?.classList?.contains("download-button")||s?.tagName==="BUTTON"),backgroundColor:R==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(s=>{let g=document.createElement("a");g.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,g.href=s,g.click();}).catch(s=>{a&&console.error("Error downloading image:",s);}).finally(()=>{Ko(false);});}},[R,a,nt]),[To,Pt]=ot.useState(null),_t=ot.useRef(null),$r=ot.useRef(P),ze=ot.useRef(N);ot.useEffect(()=>{$r.current=P;},[P]),ot.useEffect(()=>{ze.current=N;},[N]),ot.useEffect(()=>{_t.current=To;},[To]);let Mt=ot.useCallback((s,g)=>{$r.current?.(s,g);},[]),ft=ot.useCallback((s,g)=>{ze.current?.(s,g);},[]),Gt=ot.useCallback(()=>_t.current,[]),Xt=ot.useRef({...sa(Mt,ft,Gt),...b??{}});ot.useEffect(()=>{Xt.current={...sa(Mt,ft,Gt),...b??{}};},[Mt,ft,Gt,b]);let Ba=ot.useMemo(()=>({...qd,...f??{}}),[f]),gt=ot.useRef(xe);ot.useEffect(()=>{gt.current=xe;},[xe]);let J=ot.useRef(fe);ot.useEffect(()=>{J.current=fe;},[fe]),ot.useEffect(()=>{be(ve);},[ve,be]),ot.useEffect(()=>{he(De);},[De,he]),ot.useEffect(()=>{if(L&&t){let s=M(t,e||[]);s.length!==t.length&&(a&&console.warn(`Controlled edges had ${t.length-s.length} duplicate(s) removed`),i?.(s));}},[L,t,e,M,i,a]),ot.useEffect(()=>{L&&q.setState({nodes:e||[]});},[L,e,q]),ot.useEffect(()=>{L&&q.setState({edges:t||[]});},[L,t,q]),ot.useEffect(()=>{if(!F||!xe||xe.length===0)return;let s=xe.filter(S=>S.type==="rack");if(s.length===0)return;let g=s.map(S=>{let oe=S.data?.uHeight||42,Ee=60+oe*20;return (S.position?.y||0)+Ee}),y=Math.min(...g),h=Math.max(...g);if(h-y<20)return;let I=h,H=xe.map(S=>{if(S.type!=="rack")return S;let oe=S.data?.uHeight||42,Ee=60+oe*20,Ie=(S.position?.y||0)+Ee,Fe=I-Ie;return Math.abs(Fe)<5?S:{...S,position:{x:S.position?.x||0,y:(S.position?.y||0)+Fe}}});H.some((S,K)=>S.position!==xe[K].position)&&be(H);},[F,xe,be]);let Ro=ot.useRef(new Map);ot.useEffect(()=>{let s=new Map;xe.forEach(g=>{s.set(g.id,g);}),Ro.current=s;},[xe]);let le=ot.useCallback(s=>Ro.current.get(s),[]),Ke=ot.useCallback(s=>{if(!s)return;if(typeof s.parentId=="string")return s.parentId;let g=s.parentNode;if(typeof g=="string")return g},[]),Kn=ot.useCallback(s=>{let g=Ke(s);if(!g)return;let y=le(g);if(!(!y||y.type!=="rack"))return y},[le,Ke]),Zn=ot.useCallback(s=>!s||s.type!=="rack"?false:$e(s.data),[]),lo=ot.useCallback(s=>{if(!s||!Je(s))return false;let g=Kn(s);return g?$e(g.data):false},[Kn]),Ar=ot.useCallback(s=>{if(!s||s.type!=="device")return false;let g=s.data?.deviceType;return typeof g=="string"&&g.toLowerCase().replace(/_/g,"-")==="patch-panel"},[]),Zo=ot.useCallback(s=>{gt.current=s;let g=new Map;s.forEach(y=>{g.set(y.id,y);}),Ro.current=g,be(s),L?n?.(s):q.setState({nodes:s});},[L,q,be,n]),we=ot.useCallback(s=>{J.current=s,he(s),L?i?.(s):q.setState({edges:s});},[L,q,he,i]),$t=ot.useCallback(s=>{if(s.positionAbsolute)return s.positionAbsolute;let g=s.position?.x||0,y=s.position?.y||0,h=Ke(s),T=new Set;for(;h&&!T.has(h);){T.add(h);let I=le(h);if(!I)break;if(I.positionAbsolute){g+=I.positionAbsolute.x,y+=I.positionAbsolute.y;break}g+=I.position?.x||0,y+=I.position?.y||0,h=Ke(I);}return {x:g,y}},[le,Ke]),qo=ot.useCallback(s=>{let g=$t(s),y=s.width||0,h=s.height||0;return {x:g.x+y/2,y:g.y+h/2}},[$t]),So=ot.useCallback((s,g)=>{if(!s||!g)return;let y=le(s);if(!y)return;let h=g.replace(/-(source|target)$/i,"");if(y.type==="fibre-split"&&h.startsWith("output-")){let I=J.current.filter(H=>H.target===s&&(H.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"));if(I.length>0){let H=I[0]?.data?.color;if(H)return {color:H}}}if((y.type==="tube"||y.type==="cable")&&g.startsWith("fiber-")){let I=g.replace("fiber-",""),H=parseInt(I,10);if(H>=1&&H<=24){let $=qt(H),S=H>12;return {color:$,striped:S}}}if((y.type==="multi-tube-cable"||y.type==="tube")&&g.startsWith("tube-")){let I=g.replace("tube-",""),H=parseInt(I,10);if(H>=1&&H<=24){let $=Xe(H),S=H>12;return {color:$,striped:S}}}let T=y.data;if(T.color)return {color:T.color}},[le]),qn=ot.useRef(new Map);ot.useEffect(()=>{he(s=>{let g=false,y=s.map(h=>{let T=te(h);return qn.current.get(h.id)!==T?(g=true,qn.current.set(h.id,T),{...h,zIndex:T,style:{...h.style,zIndex:T}}):h});return g?y:s});},[xe,he,te]),ot.useEffect(()=>{let s=xe.map(y=>{if(y.type==="coupler"&&y.parentId){let h=le(y.parentId);if(h&&(h.type==="patch-panel"||h.type==="closure")&&(!y.extent||y.extent!=="parent"))return {...y,extent:"parent"}}if(y.type==="splice"&&y.parentId&&y.data.holderPosition&&(!y.position||y.position.x===0&&y.position.y===0)){let h=le(y.parentId);if(h&&h.type==="splice-tray"){let T=y.data.mode==="ribbon",I=Vo(h,y.data.holderPosition,T);return {...y,position:I}}}if(Je(y)&&y.parentId&&y.data.uPosition&&(!y.position||y.position.x===0&&y.position.y===0)){let h=le(y.parentId);if(h){let T=y.data.uHeight||1,I=go(h,y.data.uPosition,T,y.data);return {...y,position:I}}}return y});s.some((y,h)=>{let T=xe[h];return y.extent!==T.extent||y.position?.x!==T.position?.x||y.position?.y!==T.position?.y})&&be(s);},[xe,be,le]);let Oa=ot.useCallback(s=>{if(Ne)return null;let g=new Map,y=new Map,h=new Set,T=s.map($=>{if($.type==="position"&&$.position){let S=le($.id);if(S&&S.type==="coupler"&&S.parentId){let K=le(S.parentId);if(K&&(K.type==="patch-panel"||K.type==="closure"))return (!S.extent||S.extent!=="parent")&&h.add(S.id),{...$,position:S.position||{x:0,y:0}}}if(S&&(S.type==="tube"||S.type==="splice-tray")&&S.parentId){let K=le(S.parentId);if(K&&K.type==="closure")return (!S.extent||S.extent!=="parent")&&h.add(S.id),{...$,position:S.position||{x:0,y:0}}}if(S&&S.type==="splice"&&S.parentId){let K=le(S.parentId);if(K&&K.type==="splice-tray"){let oe=gn(S,K,$.position,gt.current);return oe.holderPosition!==void 0&&g.set(S.id,oe.holderPosition),{...$,position:{x:oe.x,y:oe.y}}}}if(S&&Je(S)&&S.parentId){let K=le(S.parentId);if(K&&K.type==="rack"){let oe=or(S,K,$.position,gt.current);return oe.uPosition!==void 0&&y.set(S.id,oe.uPosition),{...$,position:{x:oe.x,y:oe.y}}}}}return $}),I=reactflow.applyNodeChanges(T,gt.current).map($=>{let S=$;h.has($.id)&&(S={...S,extent:"parent"});let K=g.get($.id);K!==void 0&&(S={...S,data:{...S.data,holderPosition:K}});let oe=y.get($.id);return oe!==void 0&&(S={...S,data:{...S.data,uPosition:oe}}),S});gt.current=I;let H=new Map;return I.forEach($=>{H.set($.id,$);}),Ro.current=H,be(I),I},[be,le,Ne]),Wa=ot.useCallback((s,g)=>{Pt(null);},[]),za=ot.useCallback((s,g,y)=>{let h=Ke(g);if(!w||!Je(g)||h){Pt(null);return}let T=gt.current.filter(S=>S.type==="rack").map(S=>S),I=qo(g),$=Sr(I,T)?.id??null;Pt(S=>S===$?S:$);},[w,qo,Ke]),Ua=ot.useCallback((s,g,y)=>{Pt(null);let h=Ke(g);if(!w||!Je(g)||h)return;let T=$t(g),I=gt.current.filter(W=>W.type==="rack").map(W=>W),H=qo(g),$=Sr(H,I),S=gt.current;if(!$)return;let K={x:T.x-$.position.x,y:T.y-$.position.y},oe=S.find(W=>W.id===g.id)||g,Ee=$e($.data),Ie=Lt($.data),Fe=Ot($.data),Ze=Ee?ra(oe.data,K.x,Ie,Fe):"both",et=Ee&&Ze==="front"?Ie+Fe:0,Le=Ze==="rear"?"rear":Ze==="front"?"front":oe.data.view==="front"||oe.data.view==="rear"?oe.data.view:void 0,qe={...oe,parentId:$.id,extent:"parent",position:{x:et,y:K.y},data:{...oe.data,rackLayout:Ee?"split-face":"single-face",rackWidthPx:Ie,rackFaceGapPx:Fe,mountMode:Ze,view:Le}},Ue=S.filter(W=>W.id!==g.id).concat(qe),Ce=or(qe,$,qe.position,Ue),it=S.map(W=>W.id!==g.id?W:{...W,parentId:$.id,extent:"parent",position:{x:Ce.x,y:Ce.y},data:{...W.data,rackLayout:Ee?"split-face":"single-face",rackWidthPx:Ie,rackFaceGapPx:Fe,mountMode:Ze,view:Le,uPosition:Ce.uPosition??W.data.uPosition}});Zo(it);},[w,$t,qo,Zo,Ke]),Va=ot.useCallback(s=>{if(!s.source||!s.target||!s.sourceHandle||!s.targetHandle)return true;let g=le(s.source),y=le(s.target),h=re(g,s.sourceHandle),T=re(y,s.targetHandle),I=J.current.some(Z=>Z.source===s.source?re(g,Z.sourceHandle)===h:Z.target===s.source?re(g,Z.targetHandle)===h:false),H=J.current.some(Z=>Z.target===s.target?re(y,Z.targetHandle)===T:Z.source===s.target?re(y,Z.sourceHandle)===T:false);if(I&&a&&console.log("Connection will replace: Source handle already connected",{source:s.source,sourceHandle:s.sourceHandle,existingEdges:J.current.filter(Z=>Z.source===s.source&&Z.sourceHandle===s.sourceHandle||Z.target===s.source&&Z.targetHandle===s.sourceHandle)}),H&&a&&console.log("Connection will replace: Target handle already connected",{target:s.target,targetHandle:s.targetHandle,existingEdges:J.current.filter(Z=>Z.target===s.target&&Z.targetHandle===s.targetHandle||Z.source===s.target&&Z.sourceHandle===s.targetHandle)}),!vr(g,y))return true;if(g?.type==="splice"&&y?.type==="splice"){let Z=g.data?.mode==="ribbon",ge=y.data?.mode==="ribbon";if(Z!==ge)return a&&console.log("Connection rejected: Ribbon splices can only connect to other ribbon splices",s),false}let S=(Z,ge)=>(Z?.type==="tube"||Z?.type==="cable")&&!!ge&&ge.startsWith("fiber-"),K=(Z,ge)=>(Z?.type==="tube"||Z?.type==="multi-tube-cable")&&!!ge&&ge.startsWith("tube-"),oe=(Z,ge)=>Z?.type==="multi-tube-cable"&&!!ge&&ge.startsWith("tube-"),Ee=(Z,ge)=>Z?.type==="tube"&&!!ge&&ge.startsWith("tube-"),Ie=(Z,ge)=>(Z?.type==="cable"||Z?.type==="multi-tube-cable")&&ge==="cable-button",Fe=(Z,ge)=>Z?.type==="splice"&&(ge==="left"||ge==="right"),Ze=(Z,ge)=>Z?.type==="coupler"&&!!ge&&(ge.startsWith("left-")||ge.startsWith("right-")),et=(Z,ge)=>{if(Z?.type!=="fibre-split"||!ge)return false;let k=ge.replace(/-(source|target)$/i,"");return k.startsWith("input-")||k.startsWith("output-")},Le=S(g,s.sourceHandle),qe=S(y,s.targetHandle),Ue=Fe(g,s.sourceHandle),Ce=Fe(y,s.targetHandle),it=Ze(g,s.sourceHandle),W=Ze(y,s.targetHandle),He=et(g,s.sourceHandle),ne=et(y,s.targetHandle),Io=Ie(g,s.sourceHandle),Wr=Ie(y,s.targetHandle),po=oe(g,s.sourceHandle),fo=oe(y,s.targetHandle),zr=Ee(g,s.sourceHandle),Ur=Ee(y,s.targetHandle),Jo=K(g,s.sourceHandle),Vr=K(y,s.targetHandle);return Le&&Ce||qe&&Ue||(Ue&&(W||ne)||Ce&&(it||He))||(it&&(W||ne||Ce)||W&&(it||He||Ue))||Io&&Wr||(po&&Ur||fo&&zr)?true:Jo&&Vr?(a&&console.log("Connection rejected: Tube handles can only connect between cable and tube nodes",s),false):(a&&console.log("Connection rejected: Connection not allowed by fiber rules",s),false)},[le,a]),Ga=ot.useCallback(s=>{if(Ne)return;a&&console.log("onConnect called:",s);let g=le(s.source),y=le(s.target);a&&(console.log("onConnect: sourceNode type:",g?.type,"targetNode type:",y?.type),console.log("onConnect: sourceHandle:",s.sourceHandle,"targetHandle:",s.targetHandle));let h=ca(s,g,y),T=q.validateConnection({source:h.source??null,target:h.target??null,sourceHandle:h.sourceHandle,targetHandle:h.targetHandle});if(!T.valid&&!(T.reason??"").includes("already connected")){a&&console.warn(`Connection rejected: ${T.reason}`);return}let I=g?.type==="vertical-pdu",H=g?.type==="vertical-pdu"||y?.type==="vertical-pdu",$=ao(g,h.sourceHandle),S=ao(y,h.targetHandle),K=$&&S&&H,oe=g?.data,Ee=g?.type==="switch"||g?.type==="device"&&oe?.deviceType==="switch",Ie=S,Fe=!!h.targetHandle&&(h.targetHandle.startsWith("net-")||h.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(Ge(h.targetHandle))),Ze=!!h.sourceHandle&&(h.sourceHandle.startsWith("net-")||h.sourceHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(Ge(h.sourceHandle))),et=y?.type==="switch"||y?.type==="device"&&y.data?.deviceType==="switch",Le=y?.type==="vertical-pdu",qe=$,Ue=g?.type==="tube"&&y?.type==="multi-tube-cable",Ce=g?.type==="multi-tube-cable"&&y?.type==="tube",it=Ue||Ce,W=h.sourceHandle==="cable-button"&&h.targetHandle==="cable-button",He="fiber";K?He="power":W?He="thick-cable":it&&(He=j?"smoothstep":"fiber");let ne,Io=aa(y),Wr=aa(g);if(Io||Wr){let k=y?.data,G=g?.data,ye=Io?k.ribbonFiberIds:G.ribbonFiberIds;ye&&Array.isArray(ye)&&ye.length>=6&&ye.length<=12&&(ne={ribbonFiberIds:ye,isRibbon:true});}if(!ne&&(He==="fiber"||He==="smoothstep")&&!I){let k;Ue?k=So(h.target,h.targetHandle):k=So(h.source,h.sourceHandle),k&&(ne={color:k.color,striped:k.striped,isRibbon:false});}else if(He==="thick-cable"&&W){let k=g?.data;ne={color:k?.color||(k?.tubeStartIndex?Xe(k.tubeStartIndex):"#6366f1")};}let po=re(g,h.sourceHandle),fo=re(y,h.targetHandle),zr=J.current.some(k=>k.source===h.source?re(g,k.sourceHandle)===po:k.target===h.source?re(g,k.targetHandle)===po:false),Ur=J.current.some(k=>k.target===h.target?re(y,k.targetHandle)===fo:k.source===h.target?re(y,k.sourceHandle)===fo:false);if(zr||Ur){let k=new Set;for(let G of J.current){if(G.source===h.source&&re(g,G.sourceHandle)===po){k.add(G.id);continue}if(G.target===h.source&&re(g,G.targetHandle)===po){k.add(G.id);continue}if(G.source===h.target&&re(y,G.sourceHandle)===fo){k.add(G.id);continue}G.target===h.target&&re(y,G.targetHandle)===fo&&k.add(G.id);}if(k.size>0){let G=J.current.filter(bt=>!k.has(bt.id)),ye=reactflow.addEdge(h,G);if(ye.length===G.length)a&&console.warn("Handle replacement skipped: addEdge did not create a new edge",h);else {let bt=ye[ye.length-1],At=te({...h,id:bt.id,type:He}),jt={...bt,type:He,zIndex:At,style:{...bt.style,zIndex:At},data:ne!==void 0?ne:bt.data};we([...ye.slice(0,-1),jt]),a&&console.log("Handle replacement: Replaced",k.size,"edge(s)");return}}}if(y?.type==="splice"&&(s.targetHandle==="left"||s.targetHandle==="right")&&s.target&&s.targetHandle){let k=J.current.find(G=>G.target===s.target&&G.targetHandle===s.targetHandle||G.source===s.target&&G.sourceHandle===s.targetHandle);if(k){a&&(console.log("Splice target handle replacement: Found existing edge",k.id,"on splice handle",s.targetHandle),console.log("Existing edge details:",{id:k.id,source:k.source,target:k.target,sourceHandle:k.sourceHandle,targetHandle:k.targetHandle,data:k.data}));let G=s.source&&s.sourceHandle?J.current.find(Ct=>Ct.source===s.source&&Ct.sourceHandle===s.sourceHandle):null;a&&G&&console.log("Splice target handle replacement: Also found existing source edge",G.id);let ye=new Set;k&&ye.add(k.id),G&&G.id!==k.id&&ye.add(G.id);let bt=J.current.filter(Ct=>!ye.has(Ct.id));a&&console.log("Splice target handle replacement: Removing",ye.size,"edge(s), creating new connection");let At=`edge-${s.source}-${s.sourceHandle}-${s.target}-${s.targetHandle}-${Date.now()}`,jt=te({...s,id:At,type:"fiber"}),Fo={id:At,source:s.source,target:s.target,sourceHandle:s.sourceHandle,targetHandle:s.targetHandle,type:"fiber",zIndex:jt,style:{zIndex:jt},data:ne!==void 0?ne:{}},Xr=[...bt,Fo];we(Xr),a&&console.log("Splice target handle replacement: Successfully replaced edge with new edge",Fo.id);return}}if(g?.type==="splice"&&s.sourceHandle==="right"&&s.source&&s.sourceHandle){let k=J.current.find(G=>G.source===s.source&&G.sourceHandle===s.sourceHandle||G.target===s.source&&G.targetHandle===s.sourceHandle);if(k){a&&console.log("Splice source handle replacement: Found existing edge",k.id,"on splice handle",s.sourceHandle);let G=s.target&&s.targetHandle?J.current.find(Ct=>Ct.target===s.target&&Ct.targetHandle===s.targetHandle):null;a&&G&&console.log("Splice source handle replacement: Also found existing target edge",G.id);let ye=new Set;k&&ye.add(k.id),G&&G.id!==k.id&&ye.add(G.id);let bt=J.current.filter(Ct=>!ye.has(Ct.id));a&&console.log("Splice source handle replacement: Removing",ye.size,"edge(s), creating new connection");let At=`edge-${s.source}-${s.sourceHandle}-${s.target}-${s.targetHandle}-${Date.now()}`,jt=te({...s,id:At,type:"fiber"}),Fo={id:At,source:s.source,target:s.target,sourceHandle:s.sourceHandle,targetHandle:s.targetHandle,type:"fiber",zIndex:jt,style:{zIndex:jt},data:ne!==void 0?ne:{}},Xr=[...bt,Fo];we(Xr),a&&console.log("Splice source handle replacement: Successfully replaced edge with new edge",Fo.id);return}}if((g?.type==="tube"||g?.type==="cable")&&s.sourceHandle?.startsWith("fiber-")&&s.source&&s.sourceHandle){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"source",data:ne});if(k){we(k);return}}if((y?.type==="tube"||y?.type==="cable")&&s.targetHandle?.startsWith("fiber-")&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"target",data:ne});if(k){we(k);return}}if((g?.type==="multi-tube-cable"||g?.type==="tube")&&s.sourceHandle?.startsWith("tube-")&&s.source&&s.sourceHandle){let k=Oe({edges:J.current,connection:h,edgeType:He,selectEdgeZIndex:te,findBy:"source",data:ne});if(k){we(k);return}}if((y?.type==="multi-tube-cable"||y?.type==="tube")&&s.targetHandle?.startsWith("tube-")&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:He,selectEdgeZIndex:te,findBy:"target",data:ne});if(k){we(k);return}}if(g?.type==="coupler"&&(s.sourceHandle?.startsWith("left-")||s.sourceHandle?.startsWith("right-"))){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"source",data:ne});if(k){we(k);return}}if(y?.type==="coupler"&&(s.targetHandle?.startsWith("left-")||s.targetHandle?.startsWith("right-"))){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"target",data:ne});if(k){we(k);return}}if(W&&s.source&&s.sourceHandle&&s.target&&s.targetHandle){let k=g?.data,G=k?.color||(k?.tubeStartIndex?Xe(k.tubeStartIndex):"#6366f1"),ye=Oe({edges:J.current,connection:h,edgeType:"thick-cable",selectEdgeZIndex:te,findBy:"source",data:{color:G}});if(ye){we(ye);return}if(ye=Oe({edges:J.current,connection:h,edgeType:"thick-cable",selectEdgeZIndex:te,findBy:"target",data:{color:G}}),ye){we(ye);return}}if(I&&Ie&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:"power",selectEdgeZIndex:te,findBy:"target",data:ne});if(k){we(k);return}}if(Le&&qe&&s.source&&s.sourceHandle&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:"power",selectEdgeZIndex:te,findBy:"source",matchOn:"target",data:ne});if(k){we(k);return}}if(Ee&&Fe&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"target",data:ne});if(k){we(k);return}}if(et&&Ze&&s.source&&s.sourceHandle&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"target",matchOn:"source",data:ne});if(k){we(k);return}}let Jo=q.validateConnection({source:h.source??null,target:h.target??null,sourceHandle:h.sourceHandle,targetHandle:h.targetHandle});if(!Jo.valid){if(I&&s.source&&s.sourceHandle){let k=Oe({edges:J.current,connection:h,edgeType:Ie?"power":"fiber",selectEdgeZIndex:te,findBy:"source",data:ne});if(k){we(k);return}}if(Le&&s.source&&s.sourceHandle){let k=Oe({edges:J.current,connection:h,edgeType:"power",selectEdgeZIndex:te,findBy:"source",matchOn:"target",data:ne});if(k){we(k);return}}if(Ee&&s.source&&s.sourceHandle){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"source",data:ne});if(k){we(k);return}}if(et&&s.target&&s.targetHandle){let k=Oe({edges:J.current,connection:h,edgeType:"fiber",selectEdgeZIndex:te,findBy:"target",matchOn:"source",data:ne});if(k){we(k);return}}a&&console.warn(`Connection rejected: ${Jo.reason}`);return}let Vr=J.current.some(k=>k.source===h.source&&k.sourceHandle===h.sourceHandle||k.target===h.source&&k.targetHandle===h.sourceHandle),ei=J.current.some(k=>k.target===h.target&&k.targetHandle===h.targetHandle||k.source===h.target&&k.sourceHandle===h.targetHandle),Gr=(k,G)=>!k||!G?false:!!(k.startsWith("tube-")||G.type==="splice"&&(k==="left"||k==="right")||k==="cable-button"),ti=Gr(h.sourceHandle||"",g),oi=Gr(h.targetHandle||"",y);if(Vr&&!ti){a&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:s.source,sourceHandle:h.sourceHandle,existingEdges:J.current.filter(k=>k.source===h.source&&k.sourceHandle===h.sourceHandle||k.target===h.source&&k.targetHandle===h.sourceHandle)});return}if(ei&&!oi){a&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:h.target,targetHandle:h.targetHandle,existingEdges:J.current.filter(k=>k.target===h.target&&k.targetHandle===h.targetHandle||k.source===h.target&&k.sourceHandle===h.targetHandle)});return}let ri={...h,type:He,zIndex:te({...h,id:"temp-id"}),data:ne},Z=reactflow.addEdge(ri,J.current),ge=Z[Z.length-1];ge&&(Qn(k=>new Set(k).add(ge.id)),setTimeout(()=>{Qn(k=>{let G=new Set(k);return G.delete(ge.id),G});},1e3)),we(Z);},[we,q,te,le,a,So,j,Ne]),Xa=ot.useCallback((s,g)=>{if(Ne||!g.source||!g.target||!g.sourceHandle||!g.targetHandle)return;let y=le(g.source),h=le(g.target),T=ca(g,y,h),I=re(y,T.sourceHandle),H=re(h,T.targetHandle),$=J.current.some(W=>{if(W.id===s.id)return false;let He=W.source===T.source&&re(y,W.sourceHandle)===I||W.target===T.source&&re(y,W.targetHandle)===I,ne=W.target===T.target&&re(h,W.targetHandle)===H||W.source===T.target&&re(h,W.sourceHandle)===H;return He||ne}),S=q.validateConnection({source:T.source??null,target:T.target??null,sourceHandle:T.sourceHandle,targetHandle:T.targetHandle,ignoreEdgeId:s.id});if(!S.valid&&!((S.reason??"").includes("already connected")&&$)){a&&console.warn(`Edge update rejected: ${S.reason}`);return}let K=y?.type==="vertical-pdu"||h?.type==="vertical-pdu",oe=ao(y,T.sourceHandle),Ee=ao(h,T.targetHandle),Ie=oe&&Ee&&K,Fe=y?.type==="tube"&&h?.type==="multi-tube-cable",Ze=y?.type==="multi-tube-cable"&&h?.type==="tube",et=Fe||Ze,Le;Ie?Le="power":et?Le=j?"smoothstep":"fiber":Le="fiber";let qe;if(Le==="fiber"||Le==="smoothstep"){let W=So(T.source,T.sourceHandle);W&&(qe={color:W.color,striped:W.striped});}let it=J.current.filter(W=>{if(W.id===s.id)return true;let He=W.source===T.source&&re(y,W.sourceHandle)===I||W.target===T.source&&re(y,W.targetHandle)===I,ne=W.target===T.target&&re(h,W.targetHandle)===H||W.source===T.target&&re(h,W.sourceHandle)===H;return !(He||ne)}).map(W=>W.id===s.id?{...W,source:T.source,target:T.target,sourceHandle:T.sourceHandle,targetHandle:T.targetHandle,type:Le,data:qe!==void 0?{...W.data,...qe}:W.data,zIndex:te({...T,id:W.id,type:Le}),style:{...W.style,zIndex:te({...T,id:W.id,type:Le})}}:W);we(it);},[we,le,So,te,j,a,q,Ne]),ja=ot.useCallback((s,g)=>{if(Re){c&&c(g);return}let y=s.metaKey||s.ctrlKey,h=rt(),T=g,I=Ke(g);if(g.type==="tube"&&I&&!y){let H=h.find($=>$.id===I&&($.type==="cable"||$.type==="multi-tube-cable"));H&&(T=H);}if(Lr(T),Eo([]),be(H=>H.map($=>{let S=$.id===T.id;return $.selected===S?$:{...$,selected:S}})),y&&Je(T)&&!lo(T)){let H=T.data||{},$=H.view||(Array.isArray(H.rearPorts)&&H.rearPorts.length>0?"rear":"front"),S=$==="front"?"rear":"front";a&&console.log(`Command+click: Toggling device ${T.id} from ${$} to ${S}`),P&&P(T.id,S);}c&&c(T);},[P,c,a,rt,be,Re,Ke,lo]),Ya=ot.useCallback(()=>{},[]),Ka=ot.useCallback((s,g)=>{Lr(null),Eo([g]),be(y=>y.map(h=>h.selected?{...h,selected:false}:h)),c?.(null),l&&l(g);},[l,c,be]),Za=ot.useCallback(()=>{Lr(null),Eo([]),be(s=>s.map(g=>g.selected?{...g,selected:false}:g)),c?.(null);},[c,be]),[lt,Lr]=ot.useState(null),[Jn,Qn]=ot.useState(new Set);reactflow.useOnSelectionChange({onChange:({edges:s})=>{Eo(s||[]);}});let[Br,Eo]=ot.useState([]);ot.useEffect(()=>{let s=g=>{if(Se.allowKeyboardDelete&&(g.key==="Backspace"||g.key==="Delete")&&Br.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let y=Br.filter(h=>{let T=h.sourceHandle||"",I=h.targetHandle||"";return T.startsWith("tube-")||I.startsWith("tube-")?(a&&console.log("Cannot delete edge connected to tube handle",h),false):true});if(y.length>0){let h=new Set(y.map(I=>I.id)),T=J.current.filter(I=>!h.has(I.id));we(T),Eo([]),a&&console.log("Deleted edges:",y.map(I=>I.id));}}};return window.addEventListener("keydown",s),()=>window.removeEventListener("keydown",s)},[Br,we,a,Se.allowKeyboardDelete]);let qa=ot.useCallback((s,{nodeId:g,handleType:y})=>{a&&console.log("Connection started from",{nodeId:g,handleType:y});},[a]),Ja=ot.useCallback(s=>{a&&console.log("Connection ended",s);},[a]),Qa=ot.useCallback(()=>{if(Ne||!lt)return;let s=le(lt.id);if(s){if(s.type==="rack"){let g=s.data||{};if($e(g))return;let h=(g.face||"front")==="front"?"rear":"front";N?(N(s.id,h),P&&rt().filter(I=>I.parentId===s.id).forEach(I=>{P(I.id,h);})):be(T=>T.map(I=>I.id===s.id?{...I,data:{...I.data,face:h}}:I.parentId===s.id?{...I,data:{...I.data,view:h}}:I));return}if(Je(s)){if(lo(s))return;let g=s.data||{},y=Array.isArray(g.rearPorts)&&g.rearPorts.length>0,h=Array.isArray(g.ports)&&g.ports.length>0,I=(g.view||(y&&!h?"rear":"front"))==="front"?"rear":"front";P?P(s.id,I):be(H=>H.map($=>$.id===s.id?{...$,data:{...$.data,view:I}}:$));}}},[lt,le,N,P,be,rt,Ne,lo]),es=ot.useCallback(()=>{if(Ne||!w||!lt||!Je(lt))return;let s=le(lt.id),g=Ke(s);if(!s||!Je(s)||!g)return;let y=$t(s),T=gt.current.map(I=>I.id!==s.id?I:{...I,parentId:void 0,parentNode:void 0,extent:void 0,position:y,data:{...I.data,uPosition:void 0}});Zo(T);},[Ne,w,lt,le,$t,Zo,Ke]),ts=ot.useMemo(()=>{let s=Ro.current;return fe.map(g=>{let y=g,h=s.get(String(y.source)),T=s.get(String(y.target)),I=Rr(y.sourceHandle||"",h),H=Rr(y.targetHandle||"",T),$=Ue=>{if(!Ue||!Je(Ue))return;let Ce=Ue.data??{},it=typeof Ue.parentId=="string"?Ue.parentId:Ue.parentNode,W=it?s.get(it):void 0;if(W&&W.type==="rack"&&$e(W.data))return Bt(Ve(Ce));let He=Array.isArray(Ce.rearPorts)&&Ce.rearPorts.length>0,ne=Array.isArray(Ce.ports)&&Ce.ports.length>0;return [Ce.view||(He&&!ne?"rear":"front")]},S=$(h),K=$(T),oe=Ar(h),Ee=Ar(T),Ie=Je(h)&&!oe&&!!S&&!!I&&!S.includes(I),Fe=Je(T)&&!Ee&&!!K&&!!H&&!K.includes(H),Le=Ie||Fe,qe=g.style;if(Le)qe={...g.style,opacity:0,pointerEvents:"none",zIndex:0};else if(g.style&&g.style.opacity===0&&g.style.pointerEvents==="none"&&g.style.zIndex===0){let Ce={...g.style};delete Ce.opacity,delete Ce.pointerEvents,delete Ce.zIndex,qe=Object.keys(Ce).length>0?Ce:void 0;}return {...g,style:qe,className:Jn.has(g.id)?"edge-connecting":g.className}})},[fe,Jn,Ar]),Me=ot.useMemo(()=>lt?le(lt.id)??lt:null,[lt,le]),uo=ot.useMemo(()=>{if(!Me||!ke.enabled||Ne)return {showRearToggle:false,showDeRack:false,count:0};let s=Me.type==="rack"?!Zn(Me):Je(Me)?!lo(Me):false,g=ke.showRearToggle&&s,y=ke.showDeRack&&w&&!Ne&&Je(Me)&&!!Ke(Me);return {showRearToggle:g,showDeRack:y,count:(g?1:0)+(y?1:0)}},[Me,ke,w,Ne,Ke,lo,Zn]),Or=ot.useMemo(()=>{if(!Me||uo.count===0||!Ae.current)return null;let s=Ae.current.getBoundingClientRect();if(s.width<=0||s.height<=0)return null;let g=Me.positionAbsolute??$t(Me),y=Me.width||0,h=Me.height||0,T=uo.count>1?220:110,I=34;try{let H=Qe({x:g.x+y/2,y:g.y}),$=Qe({x:g.x+y/2,y:g.y+h}),S=H.x-s.left-T/2,K=H.y-s.top-I-10;return K<8&&(K=$.y-s.top+10),S=Math.max(8,Math.min(S,s.width-T-8)),K=Math.max(8,Math.min(K,s.height-I-8)),{left:S,top:K}}catch{return null}},[Me,uo,$t,Qe]),os=ii(R,v),rs=si(R,{touchAction:"none",...C});return jsxRuntime.jsxs("div",{ref:Ae,className:os,style:rs,children:[jsxRuntime.jsxs(reactflow.ReactFlow,{nodes:xe,edges:ts,onNodesChange:s=>{if(Ne)return;let g=Oa(s);g&&(L?n&&n(g):q.setState({nodes:g}));},onEdgesChange:s=>{if(Ne)return;let g=s.filter(y=>{if(y.type==="remove"){let h=J.current.find(T=>T.id===y.id);if(h){let T=h.sourceHandle||"",I=h.targetHandle||"";if(T.startsWith("tube-")||I.startsWith("tube-"))return a&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",h),false}}return true});if(g.length>0){let y=reactflow.applyEdgeChanges(g,J.current);_e(g),L?i&&i(y):q.setState({edges:y});}},onConnect:Ne?void 0:u??Ga,onConnectStart:qa,onConnectEnd:Ja,onEdgeUpdate:Ne?void 0:p??Xa,isValidConnection:m??Va,connectionMode:x,onNodeClick:ja,onNodeDoubleClick:Ya,onPaneClick:Za,onNodeDragStart:Wa,onNodeDrag:za,onNodeDragStop:Ua,onEdgeClick:Ka,onInit:D,nodeTypes:Xt.current,edgeTypes:Ba,defaultEdgeOptions:{zIndex:1e3,reconnectable:Se.edgesReconnectable},nodesDraggable:Se.nodesDraggable,nodesConnectable:Se.nodesConnectable,elementsSelectable:Se.elementsSelectable,edgesFocusable:Se.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:Se.connectOnClick,panOnDrag:Se.panOnDrag,panOnScroll:Se.panOnScroll,zoomOnScroll:Se.zoomOnScroll,zoomOnPinch:Se.zoomOnPinch,zoomOnDoubleClick:Se.zoomOnDoubleClick,preventScrolling:Re,onlyRenderVisibleElements:true,fitView:true,fitViewOptions:ee,proOptions:{hideAttribution:true},children:[jsxRuntime.jsx(reactflow.Background,{color:ai(R)}),Se.showControls&&jsxRuntime.jsx(reactflow.Controls,{showInteractive:Se.showInteractiveControl}),Se.showMiniMap&&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"})})]}),A&&jsxRuntime.jsx("button",{className:"download-button",onClick:Mr,disabled:nt,"aria-busy":nt,style:{position:"absolute",top:_.includes("top")?"10px":"auto",bottom:_.includes("bottom")?"10px":"auto",right:_.includes("right")?"10px":"auto",left:_.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:nt?"not-allowed":"pointer",opacity:nt?.7:1,transition:"all 0.2s ease",...se},children:nt?`${U}...`:U}),Me&&Or&&uo.count>0&&jsxRuntime.jsxs("div",{style:{position:"absolute",top:Or.top,left:Or.left,display:"flex",gap:8,zIndex:2e3},children:[uo.showRearToggle&&jsxRuntime.jsx("button",{onClick:s=>{s.preventDefault(),Qa();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let s=Me.data;if(Me.type==="rack")return (s?.face||"front")==="front"?"Switch to rear":"Switch to front";{let g=Array.isArray(s?.rearPorts)&&s.rearPorts.length>0,y=Array.isArray(s?.ports)&&s.ports.length>0;return (s?.view||(g&&!y?"rear":"front"))==="front"?"Switch to rear":"Switch to front"}})(),children:(()=>{let s=Me.data;if(Me.type==="rack")return (s?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front";{let g=Array.isArray(s?.rearPorts)&&s.rearPorts.length>0,y=Array.isArray(s?.ports)&&s.ports.length>0;return (s?.view||(g&&!y?"rear":"front"))==="front"?"\u21C4 Rear":"\u21C4 Front"}})()}),uo.showDeRack&&jsxRuntime.jsx("button",{onClick:s=>{s.preventDefault(),es();},style:{background:"#7f1d1d",color:"#fee2e2",border:"1px solid #b91c1c",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:"Remove device from rack so it can be moved/reassigned",children:"De-rack"})]})]})},zn=e=>jsxRuntime.jsx(reactflow.ReactFlowProvider,{children:jsxRuntime.jsx(rc,{...e})});var Un=class extends ot.Component{constructor(){super(...arguments);this.state={error:null};this.reset=()=>{this.setState({error:null});};}static getDerivedStateFromError(o){return {error:o}}componentDidCatch(o,r){this.props.onError?.(o,r);}render(){let{error:o}=this.state,{children:r,fallback:n}=this.props;return o?typeof n=="function"?n(o,this.reset):n??jsxRuntime.jsxs("div",{role:"alert",style:{padding:16,margin:8,border:"1px solid #e53e3e",borderRadius:4,backgroundColor:"#fff5f5",color:"#c53030"},children:[jsxRuntime.jsx("strong",{children:"Diagram error"}),": ",o.message,jsxRuntime.jsx("button",{type:"button",onClick:this.reset,style:{marginLeft:12,padding:"4px 8px",cursor:"pointer"},children:"Try again"})]}):r}};function jo(e,{rowHeight:t,tubeGap:o}){let r=[],n=[],i=e.kind??(e.tubeCount?"tube":"simple"),d=i==="tube"?Math.max(1,Math.min(24,e.tubeCount??1)):1,a=i==="tube"?Math.max(1,Math.min(24,e.fibersPerTube??12)):Math.max(1,Math.min(24,e.fiberCount??12)),c=Math.max(1,e.tubeStartIndex??1),l=Math.max(1,e.fiberStartIndex??1),b=0;for(let f=0;f<d;f+=1){let u=c+f,p=e.tubeColorMap?.[u];n.push({tubeIndex:u,y:b,label:`T${u}`,color:p??Xe(u)});for(let m=0;m<a;m+=1){let x=l+m,P=Jr(x);r.push({key:`${u}-${x}`,tubeIndex:i==="tube"?u:void 0,fiberIndex:x,y:b,color:qt(x),striped:Zt(x),backgroundImage:typeof P.backgroundImage=="string"?P.backgroundImage:void 0}),b+=t;}f<d-1&&(b+=o);}return {rows:r,tubeLabels:n,height:b}}var Vn=e=>typeof e=="object"&&e!==null,dc=e=>{if(!Vn(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&Vn(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&Vn(t.layout)}if(e.type==="fibre-flow-closure"){let t=e.data;return typeof t.label=="string"&&typeof t.width=="number"&&typeof t.height=="number"&&typeof t.headerHeight=="number"}return false},cc=e=>e==="fibre-flow"||e==="fibre-flow-link",lc=e=>typeof e.id=="string"&&e.id.length>0&&typeof e.source=="string"&&e.source.length>0&&typeof e.target=="string"&&e.target.length>0,uc=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",pc=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!lc(n))return;let i=o.get(n.id),d=cc(n.type)?n.type:i?.type??uc(n);r.push({...i??{},...n,type:d});}),r},ga=e=>`fiber-${e.tube??1}-${e.fiber}`,ba=e=>qt(e.fiber),ma=e=>Zt(e.fiber),fc=(e,t)=>{if(t)return t;if(!(typeof e!="number"||Number.isNaN(e)))return e>=1e3?`${(e/1e3).toFixed(1)} km`:`${Math.round(e)} m`},gc=(e,t,o,r,n,i)=>e?`${o} ${i}`:t?`0 ${n} ${r} ${i}`:"6 6",bc=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,data:a})=>{let[c,l,b]=reactflow.getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,curvature:.35}),f=typeof a?.lossDb=="number"?`${a.lossDb.toFixed(2)} dB`:"",u=a?.label??f,p=a?.sourceColor,m=a?.targetColor,x=a?.color??p??m??"#94a3b8",P=a?.sourceStriped??false,N=a?.targetStriped??false,v=a?.highlighted??true,C=a?.dimmed??false,F=a?.circuitId,w=a?.circuitLabel??F,R=a?.showCircuitId??false,D=p&&m&&p!==m,E=r-t,A=n-o,_=Math.sqrt(E*E+A*A),U=l-t,se=b-o,j=Math.sqrt(U*U+se*se),Y=_>0?j/_*100:50,ie=`fibre-flow-gradient-${e}`,z=P&&!N,V=N&&!P,B=P&&N,O=_*1.25,X=O/2,ee=12,M=Math.ceil(X*1.2/ee),L=Array(M).fill("6 6").join(" "),de=Math.ceil(X*1.2/ee),ae=Array(de).fill("6 6").join(" "),ce=R&&w,q=Math.max(u?u.length*6.2+16:0,ce?(w?.length||0)*5.5+16:0),ve=ce?32:16;return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx("defs",{children:D&&jsxRuntime.jsxs("linearGradient",{id:ie,x1:t,y1:o,x2:r,y2:n,gradientUnits:"userSpaceOnUse",children:[jsxRuntime.jsx("stop",{offset:"0%",stopColor:p}),jsxRuntime.jsx("stop",{offset:`${Y}%`,stopColor:p}),jsxRuntime.jsx("stop",{offset:`${Y}%`,stopColor:m}),jsxRuntime.jsx("stop",{offset:"100%",stopColor:m})]})}),D?jsxRuntime.jsx("path",{id:e,d:c,fill:"none",stroke:`url(#${ie})`,strokeWidth:v?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:C?.25:1,strokeOpacity:C?.25:1,style:{mixBlendMode:"normal"}}):jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:c,style:{stroke:x,strokeWidth:v?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:C?.25:1,strokeOpacity:C?.25:1,mixBlendMode:"normal"}}),(B||z||V)&&jsxRuntime.jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:v?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:gc(z,V,L,ae,X,O),strokeDashoffset:0,opacity:C?.2:.9,style:{mixBlendMode:"normal"}}),(u||ce)&&v&&jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:jsxRuntime.jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${b}px)`,width:q,height:ve,background:"rgba(248, 250, 252, 0.92)",border:"1px solid rgba(15, 23, 42, 0.4)",borderRadius:4,fontSize:10,fontFamily:"monospace",color:"rgba(15, 23, 42, 0.9)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none",padding:"2px 4px",zIndex:9999},children:[u&&jsxRuntime.jsx("div",{style:{lineHeight:1.2},children:u}),ce&&jsxRuntime.jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:u?2:0},children:w})]})})]})},mc=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,data:a})=>{let[c,l,b]=reactflow.getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:d,curvature:.2}),f=a?.label,u=a?.color??"#64748b";return jsxRuntime.jsxs(jsxRuntime.Fragment,{children:[jsxRuntime.jsx(reactflow.BaseEdge,{id:e,path:c,style:{stroke:u,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),f&&jsxRuntime.jsx(reactflow.EdgeLabelRenderer,{children:jsxRuntime.jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${b}px)`,padding:"2px 8px",background:"rgba(30, 41, 59, 0.9)",border:`1px solid ${u}`,borderRadius:10,fontSize:10,fontFamily:"monospace",color:"#e2e8f0",letterSpacing:.2,whiteSpace:"nowrap",pointerEvents:"none",zIndex:9999},children:f})})]})},hc=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:n,showTubeLabels:i,showFiberNumbers:d,layout:a,colorMode:c="dark"}=e,l=c==="light",b=8,f=12,u=-1,p=0,m=t.jacketColor??"#facc15",x=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",P=i&&x,N=o==="left"?b+p:p,v=o==="right"?b+p:p,C=o==="left"?reactflow.Position.Right:reactflow.Position.Left,F={width:4,height:4,borderRadius:"50%",background:m,border:`1px solid ${m}`,boxShadow:"0 0 1px rgba(0,0,0,0.4)",top:"50%",position:"absolute",...o==="left"?{left:0,transform:"translate(-50%, -50%)"}:{right:0,transform:"translate(50%, -50%)"}};return jsxRuntime.jsxs("div",{style:{position:"relative",width:n,height:a.height,fontFamily:"monospace",color:"inherit",overflow:"visible"},children:[jsxRuntime.jsx("div",{style:{position:"absolute",top:-18,left:o==="left"?0:void 0,right:o==="right"?0:void 0,fontSize:10,fontWeight:700,letterSpacing:.4,textTransform:"uppercase",background:l?"rgba(248, 250, 252, 0.95)":"rgba(15, 23, 42, 0.9)",color:l?"#1a1a1a":"#f8fafc",padding:"2px 6px",borderRadius:4,whiteSpace:"nowrap",maxWidth:n,overflow:"hidden",textOverflow:"ellipsis",zIndex:10,...o==="right"?{textAlign:"right"}:{}},children:t.label}),jsxRuntime.jsx("div",{style:{position:"absolute",top:0,bottom:0,width:b,left:o==="left"?0:void 0,right:o==="right"?0:void 0,borderRadius:4,background:x?"transparent":m,border:`1px solid ${m}`,boxShadow:x?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:x&&a.tubeLabels.map((w,R)=>{let D=a.rows.filter(j=>j.tubeIndex===w.tubeIndex);if(D.length===0)return null;let E=D[0].y,A=D[D.length-1].y+r,_=A-E,U=a.tubeLabels[R+1],se=U&&U.y-A>0;return jsxRuntime.jsx("div",{style:{position:"absolute",top:E,left:0,right:0,height:_,background:w.color,borderLeft:`2px solid ${w.color}`,borderRight:`2px solid ${w.color}`,borderTop:R===0?`2px solid ${w.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:se?"1px solid rgba(0,0,0,0.15)":`2px solid ${w.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:R===0&&!se||R===0?"4px 4px 0 0":se?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${w.tubeIndex}`)})}),!P&&jsxRuntime.jsx("div",{style:{position:"absolute",top:0,bottom:0,left:N,right:v,...o==="left"?{borderRight:`1px solid ${m}`}:{borderLeft:`1px solid ${m}`},pointerEvents:"none",zIndex:0}}),x&&a.tubeLabels.map((w,R)=>{let D=a.rows.filter(U=>U.tubeIndex===w.tubeIndex);if(D.length===0)return null;let E=D[0].y,_=D[D.length-1].y+r-E;return jsxRuntime.jsx("div",{style:{position:"absolute",top:E,left:N,right:v,height:_,...o==="left"?{borderRight:`2px solid ${w.color}`}:{borderLeft:`2px solid ${w.color}`},opacity:.5,pointerEvents:"none"}},`tube-border-${w.tubeIndex}`)}),a.rows.map(w=>{let R=`fiber-${w.tubeIndex??1}-${w.fiberIndex}`,D=w.y+r/2,E={position:"absolute",width:f,height:f,borderRadius:"50%",top:D,background:w.backgroundImage?w.backgroundImage:w.color,backgroundColor:w.color,border:`2px solid ${w.color}`,boxShadow:"0 0 6px rgba(0,0,0,0.3)",...o==="left"?{right:-f/2}:{left:-f/2},transform:"translateY(-50%)",zIndex:1e3,cursor:"crosshair","--fiber-bg":w.color,minWidth:f,minHeight:f};w.backgroundImage&&(E["--fiber-bg-image"]=w.backgroundImage);let A=o==="left"?{right:f+u,textAlign:"right"}:{left:f+u,textAlign:"left"};return jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx(reactflow.Handle,{id:R,type:"source",position:C,className:"fibre-flow-handle",style:E,isConnectable:true,"data-fiber-idx":w.fiberIndex,"data-tube-idx":w.tubeIndex,"data-fiber-color":w.color}),jsxRuntime.jsx(reactflow.Handle,{id:R,type:"target",position:C,className:"fibre-flow-handle",style:E,isConnectable:true,"data-fiber-idx":w.fiberIndex,"data-tube-idx":w.tubeIndex,"data-fiber-color":w.color}),d&&jsxRuntime.jsx("div",{style:{position:"absolute",top:w.y+r/2-6,...A,fontSize:8,fontWeight:600,color:l?"rgba(15, 23, 42, 0.7)":"rgba(148, 163, 184, 0.95)",whiteSpace:"nowrap",lineHeight:1},children:w.fiberIndex})]},w.key)}),jsxRuntime.jsx(reactflow.Handle,{id:"cable-run",type:"source",position:o==="left"?reactflow.Position.Left:reactflow.Position.Right,className:"cable-run-handle",style:F,isConnectable:true,"data-handle-type":"cable-run"}),jsxRuntime.jsx(reactflow.Handle,{id:"cable-run",type:"target",position:o==="left"?reactflow.Position.Left:reactflow.Position.Right,className:"cable-run-handle",style:F,isConnectable:true,"data-handle-type":"cable-run"})]})},yc=({data:e})=>{let t=e.colorMode==="light";return jsxRuntime.jsx("div",{style:{width:e.width,height:e.height,background:"transparent",border:t?"1px solid rgba(148, 163, 184, 0.3)":"1px solid rgba(148, 163, 184, 0.5)",borderRadius:12,boxShadow:t?"0 12px 24px rgba(0, 0, 0, 0.1)":"0 12px 24px rgba(15, 23, 42, 0.2)",position:"relative",pointerEvents:"none"},children:jsxRuntime.jsx("div",{style:{height:e.headerHeight,display:"flex",alignItems:"center",justifyContent:"center",fontFamily:"monospace",fontWeight:700,fontSize:12,letterSpacing:.6,textTransform:"uppercase",color:t?"rgba(15, 23, 42, 0.9)":"rgba(226, 232, 240, 0.9)",background:t?"rgba(241, 245, 249, 0.7)":"rgba(15, 23, 42, 0.6)",borderBottom:t?"1px solid rgba(148, 163, 184, 0.2)":"1px solid rgba(148, 163, 184, 0.35)",borderTopLeftRadius:12,borderTopRightRadius:12},children:e.label})})},wc=(e,t,o,r,n,i,d,a,c,l="dark")=>{let b=[],f=0;return e.forEach(u=>{let p=jo(u.leftCable,{rowHeight:o,tubeGap:r}),m=jo(u.rightCable,{rowHeight:o,tubeGap:r}),x=Math.max(p.height,m.height),P=i*2+d,N=32,v=16,C=P+v*2,F=x+N+v*2,w=`flow-closure-${u.id}`,R=`flow-cable-${u.id}-left`,D=`flow-cable-${u.id}-right`,E=t==="horizontal"?{x:f,y:0}:{x:0,y:f};f+=(t==="horizontal"?C:F)+n;let A=u.chamberId?`${u.id} - ${u.chamberId}`:u.id;b.push({id:w,type:"fibre-flow-closure",position:E,data:{label:A,width:C,height:F,headerHeight:N,colorMode:l},selectable:false,draggable:false,style:{width:C,height:F}});let _=N+v+(x-p.height)/2,U=N+v+(x-m.height)/2;b.push({id:R,type:"fibre-flow-cable",position:{x:v,y:_},parentId:w,extent:"parent",data:{label:u.leftCable.label,cable:u.leftCable,side:"left",rowHeight:o,columnWidth:i,showTubeLabels:a,showFiberNumbers:c,layout:p,colorMode:l},style:{width:i,height:p.height}}),b.push({id:D,type:"fibre-flow-cable",position:{x:v+P-i,y:U},parentId:w,extent:"parent",data:{label:u.rightCable.label,cable:u.rightCable,side:"right",rowHeight:o,columnWidth:i,showTubeLabels:a,showFiberNumbers:c,layout:m,colorMode:l},style:{width:i,height:m.height}});}),b},xc=(e,t,o,r=false)=>{let n=[],i=new Map,d=new Map,a=new Map;return (t??[]).forEach(c=>{c.color&&i.set(c.id,c.color),c.label&&d.set(c.id,c.label);}),e.forEach(c=>{let l=`flow-cable-${c.id}-left`,b=`flow-cable-${c.id}-right`;[{nodeId:l,cable:c.leftCable},{nodeId:b,cable:c.rightCable}].forEach(({nodeId:u,cable:p})=>{let m=a.get(p.id);if(m&&m.closureId!==c.id){let x=fc(p.distanceMeters??m.distanceMeters,p.distanceLabel??m.distanceLabel),P=p.jacketColor??m.jacketColor??"#64748b";n.push({id:`flow-link-${m.nodeId}-${u}`,type:"fibre-flow-link",source:m.nodeId,target:u,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:x,color:P}});}a.set(p.id,{nodeId:u,closureId:c.id,jacketColor:p.jacketColor,distanceLabel:p.distanceLabel,distanceMeters:p.distanceMeters});}),c.splices.forEach(u=>{let p=o?u.circuitId===o:true,m=!!o&&!p,x=u.circuitId?i.get(u.circuitId):void 0,P=u.circuitId?d.get(u.circuitId):void 0,N=u.color??x,v=ba(u.from),C=ba(u.to),F=ma(u.from),w=ma(u.to);n.push({id:`flow-edge-${c.id}-${u.id}`,type:"fibre-flow",source:l,target:b,sourceHandle:ga(u.from),targetHandle:ga(u.to),data:{lossDb:u.lossDb,label:u.label,color:N,sourceColor:v,targetColor:C,sourceStriped:F,targetStriped:w,highlighted:p,dimmed:m,circuitId:u.circuitId,circuitLabel:P,showCircuitId:r}});});}),n},Nc=({closures:e,circuits:t,highlightedCircuitId:o,layout:r="horizontal",rowHeight:n=20,tubeGap:i=10,closureGap:d=140,cableColumnWidth:a=32,spliceAreaWidth:c=260,showTubeLabels:l=true,showFiberNumbers:b=true,colorMode:f="dark",showCircuitId:u=false,className:p,style:m,readOnly:x=false,panOnDrag:P=true,panOnScroll:N=true,zoomOnScroll:v=true})=>{let C=ot.useMemo(()=>wc(e,r,n,i,d,a,c,l,b,f),[e,r,n,i,d,a,c,l,b,f]),F=ot.useMemo(()=>xc(e,t,o,u),[e,t,o,u]),[w,R]=ot.useState(C),[D,E]=ot.useState(F);ot.useEffect(()=>{R(C);},[C,R]),ot.useEffect(()=>{E(F);},[F,E]);let A=ot.useCallback((B,O)=>{if(!B||!O||!O.startsWith("fiber-"))return;let X=w.find(ce=>ce.id===B);if(!X||X.type!=="fibre-flow-cable")return;let ee=/^fiber-(\d+)-(\d+)$/.exec(O);if(!ee)return;let M=Number(ee[1]),L=Number(ee[2]),ae=X.data.layout.rows.find(ce=>(ce.tubeIndex??1)===M&&ce.fiberIndex===L);if(ae)return {color:ae.color,striped:ae.striped??false}},[w]),_=ot.useCallback(B=>{if(x||!B.source||!B.target||!B.sourceHandle||!B.targetHandle)return false;let O=w.find(de=>de.id===B.source),X=w.find(de=>de.id===B.target);if(!O||!X)return false;let ee=typeof B.sourceHandle=="string"&&B.sourceHandle.startsWith("fiber-"),M=typeof B.targetHandle=="string"&&B.targetHandle.startsWith("fiber-");return B.sourceHandle==="cable-run"||B.targetHandle==="cable-run"?true:ee&&M?O.type==="fibre-flow-cable"&&X.type==="fibre-flow-cable":false},[w,x]),U=ot.useCallback(B=>{if(x)return;let O=B.sourceHandle==="cable-run"||B.targetHandle==="cable-run",X=q=>typeof q=="string"&&q.startsWith("fiber-"),ee=X(B.sourceHandle),M=X(B.targetHandle),L=(q,ve,De)=>q.source===ve&&q.sourceHandle===De||q.target===ve&&q.targetHandle===De,de=O?void 0:A(B.source,B.sourceHandle),ae=O?void 0:A(B.target,B.targetHandle),ce=O?void 0:{sourceColor:de?.color,targetColor:ae?.color,color:de?.color??ae?.color,sourceStriped:de?.striped,targetStriped:ae?.striped};E(q=>{let ve=q.filter(De=>{let xe=ee&&L(De,B.source,B.sourceHandle),be=M&&L(De,B.target,B.targetHandle);return !(xe||be)});return reactflow.addEdge({...B,type:O?"fibre-flow-link":"fibre-flow",data:ce},ve)});},[A,x,E]),se=ot.useCallback((B,O)=>{if(x)return;let X=O.sourceHandle==="cable-run"||O.targetHandle==="cable-run",ee=X?void 0:A(O.source,O.sourceHandle),M=X?void 0:A(O.target,O.targetHandle),L=X?void 0:{sourceColor:ee?.color,targetColor:M?.color,color:ee?.color??M?.color,sourceStriped:ee?.striped,targetStriped:M?.striped},de=ce=>typeof ce=="string"&&ce.startsWith("fiber-"),ae=(ce,q,ve)=>ce.source===q&&ce.sourceHandle===ve||ce.target===q&&ce.targetHandle===ve;E(ce=>{let q=ce.filter(be=>be.id!==B.id),ve=de(O.sourceHandle),De=de(O.targetHandle),xe=q.filter(be=>{let fe=ve&&ae(be,O.source,O.sourceHandle),he=De&&ae(be,O.target,O.targetHandle);return !(fe||he)});return reactflow.addEdge({...O,type:X?"fibre-flow-link":"fibre-flow",data:L},xe)});},[A,x,E]),j=ot.useCallback(B=>{x||R(B.filter(dc));},[x,R]),Y=ot.useCallback(B=>{x||E(O=>pc(B,O));},[x,E]),ie=ot.useMemo(()=>({"fibre-flow-cable":hc,"fibre-flow-closure":yc}),[]),z=ot.useMemo(()=>({"fibre-flow":bc,"fibre-flow-link":mc}),[]),V={borderRadius:8,overflow:"hidden",...m};return jsxRuntime.jsx(zn,{nodes:w,edges:D,onNodesChange:j,onEdgesChange:Y,onConnect:U,onEdgeUpdate:se,isValidConnection:_,connectionMode:reactflow.ConnectionMode.Loose,nodeTypes:ie,edgeTypes:z,className:p,style:V,colorMode:f,readOnly:x,panOnDrag:P,panOnScroll:N,zoomOnScroll:v,fitViewOptions:{padding:.2}})},kc=e=>jsxRuntime.jsx(Nc,{...e});var vc=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:n=150,layout:i,showTubeLabels:d,showFiberNumbers:a=true,showCableLabel:c=true})=>{let l=ot.useMemo(()=>i??jo(e,{rowHeight:o,tubeGap:r}),[i,e,o,r]),b=26,f=10,u=18,p=t==="left"?n-u:u,m=8,x=t==="left"?6:n-b-18,P=e.jacketColor??"#facc15",N=d??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxRuntime.jsxs("div",{style:{position:"relative",width:n,height:l.height,fontFamily:"monospace",color:"inherit"},children:[c&&jsxRuntime.jsx("div",{style:{position:"absolute",top:-18,left:t==="left"?0:void 0,right:t==="right"?0:void 0,fontSize:10,fontWeight:700,letterSpacing:.4,textTransform:"uppercase",background:"rgba(15, 23, 42, 0.85)",color:"#f8fafc",padding:"2px 6px",borderRadius:4},children:e.label}),jsxRuntime.jsx("div",{style:{position:"absolute",top:0,bottom:0,width:b,left:t==="left"?0:void 0,right:t==="right"?0:void 0,borderRadius:14,background:`linear-gradient(90deg, ${P} 0%, ${P} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${P}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),N&&l.tubeLabels.map(v=>jsxRuntime.jsxs("div",{style:{position:"absolute",top:v.y+o/2-6,left:x,fontSize:9,fontWeight:700,textTransform:"uppercase",color:"rgba(15, 23, 42, 0.75)",background:"rgba(255, 255, 255, 0.6)",padding:"1px 6px 1px 4px",borderRadius:10,display:"flex",alignItems:"center",gap:4},children:[jsxRuntime.jsx("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:v.color,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 3px rgba(0,0,0,0.25)"}}),jsxRuntime.jsx("span",{children:v.label})]},`tube-${v.tubeIndex}`)),l.rows.map(v=>{let C=v.y+o/2-f/2,F=t==="left"?p-f/2-m:p+f/2+m;return jsxRuntime.jsxs(ot__default.default.Fragment,{children:[jsxRuntime.jsx("div",{style:{position:"absolute",top:C,left:p-f/2,width:f,height:f,borderRadius:"50%",backgroundColor:v.color,backgroundImage:v.backgroundImage,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 4px rgba(0,0,0,0.25)"}}),a&&jsxRuntime.jsx("div",{style:{position:"absolute",top:v.y+o/2-6,left:F,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:v.fiberIndex})]},v.key)})]})};var Na=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}}),ka=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}}),Pa=e=>{let t=n=>{if(!n)return;if(typeof n=="string")return n;let i=n.device;return typeof i=="object"&&i?i.id:i},o=t(e.termination_a),r=t(e.termination_b);return {id:`cable-${e.id}`,source:`device-${o}`,target:`device-${r}`,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}}},Tc=e=>{let t=[],o=[];return e.racks.forEach(r=>t.push(Na(r))),e.devices.forEach(r=>t.push(ka(r))),e.cables.forEach(r=>o.push(Pa(r))),{nodes:t,edges:o}},Rc=e=>{let t=e.filter(n=>n.type==="rack"),o=e.filter(n=>n.type==="device"),r=e.filter(n=>!["rack","device"].includes(n.type));return t.forEach((n,i)=>{n.position={x:i*300,y:100};}),o.forEach(n=>{if(n.parentId){let i=t.find(d=>d.id===n.parentId);if(i){let d=n.data.uPosition||1,a=n.data.uHeight||1;n.position={x:i.position.x+50,y:i.position.y+d*20-a*10};}}else n.position={x:Math.random()*400+100,y:Math.random()*200+50};}),r.forEach((n,i)=>{n.position={x:i*150+100,y:300};}),e};var Ca=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Sc="Interfaces",Ec="Management",Ic="Power",Xn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ht=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Fr=e=>{if(typeof e=="number"&&Number.isFinite(e))return e;if(typeof e=="string"&&e.trim().length>0){let t=Number(e);if(Number.isFinite(t))return t}},Dt=e=>{if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Fc=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",Hr=e=>Xn(e.custom_fields)?e.custom_fields:void 0,Dr=e=>Xn(e)?e:void 0,va=(e,t)=>{let o=Hr(e),r=Dr(o?.layout);return Fc(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},Ta=(e,t,o)=>{let r=Hr(e),n=Dr(r?.layout),i=Ht(o)??Ht(e.layout?.group)??Ht(e.port_group)??Ht(n?.group)??Ht(r?.port_group)??Ht(r?.portGroup)??Ht(r?.interface_group)??Ht(r?.interfaceGroup)??Ht(r?.group);return i||(t==="power_ac"||t==="power_c13"||t==="power_c19"?Ic:t==="console"||t==="mgmt"?Ec:Sc)},Ra=(e,t,o)=>{let r=Hr(e),n=Dr(r?.layout);return Dt(o)??Dt(e.layout?.connectorType)??Dt(e.layout?.connector_type)??Dt(e.connector_type)??Dt(n?.connectorType)??Dt(n?.connector_type)??Dt(r?.connectorType)??Dt(r?.connector_type)??Dt(t)},Sa=(e,t)=>{if(t==="C13")return "power_c13";if(t==="C19")return "power_c19";let o=(e??"").toLowerCase();return o.includes("c13")?"power_c13":o.includes("c19")?"power_c19":o.includes("power")||o.includes("pdu")?"power_ac":o.includes("fiber")||o.includes("sfp")||o.includes("qsfp")||o.includes("dac")?"fiber":o.includes("console")?"console":o.includes("mgmt")||o.includes("management")||o.includes("oob")?"mgmt":o.includes("usb")?"usb":"ethernet"},Ea=e=>{let t=(e??"").toLowerCase();if(t){if(t.includes("om3"))return "om3";if(t.includes("om4"))return "om4";if(t.includes("om5"))return "om5";if(t.includes("smf")||t.includes("singlemode"))return "smf";if(t.includes("cat5e"))return "cat5e";if(t.includes("cat6a"))return "cat6a";if(t.includes("cat6"))return "cat6";if(t.includes("cat7"))return "cat7";if(t.includes("fiber")||t.includes("sfp")||t.includes("qsfp"))return "fiber";if(t.includes("ethernet")||t.includes("rj45")||t.includes("1000base")||t.includes("10gbase")||t.includes("base-t"))return "ethernet"}},Hc=e=>{if(!Xn(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"&&["top","right","bottom","left"].includes(t.toLowerCase())?t.toLowerCase():void 0,r=Fr(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct),n=Fr(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels),i=Fr(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x),d=Fr(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y);if(!(o===void 0&&r===void 0&&n===void 0&&i===void 0&&d===void 0))return {side:o,offsetPercent:r,offsetPx:n,xPercent:i,yPercent:d}},Ia=(e,t,o)=>{if(!o)return;let r=Hr(e),n=Dr(r?.layout),i=[t?.position,t,e.layout?.position,e.layout,n?.position,n,r?.port_position,r?.portPosition,r?.position,r,e];for(let d of i){let a=Hc(d);if(a)return a}},Dc=(e,t)=>{let o=e.type?.value??e.type?.label??e.layout?.type??void 0,r=Ra(e,o),n=Sa(o,r),i=Ta(e,n);return {label:e.name,face:va(e),group:i,type:n,cableType:Ea(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:Ia(e,void 0,t)}},_c=e=>[...e].sort((t,o)=>{let r=typeof t.position=="number"?t.position:Number.MAX_SAFE_INTEGER,n=typeof o.position=="number"?o.position:Number.MAX_SAFE_INTEGER;return r!==n?r-n:t.name.localeCompare(o.name)}),Mc=(e,t)=>{let o=e.find(n=>n.name===t);if(o)return o;let r={name:t,ports:[]};return e.push(r),r},$c=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[],i=[];return _c(e.interfaces??[]).forEach((a,c)=>{let l=r?r({device:e,iface:a,index:c}):Dc(a,o);if(!l)return;let b=l.type??a.type?.value??a.type?.label??void 0,f=Ra(a,b,l.connectorType),u=Sa(b,f),p=va(a,l.face),m=Ta(a,u,l.group);Mc(p==="rear"?i:n,m).ports.push({id:l.id,label:l.label??a.name,connected:l.connected??!!(a.connected_endpoint||a.cable),type:u,cableType:Ea(l.cableType??a.type?.value??a.type?.label??void 0),connectorType:f,position:Ia(a,l,o)});}),{front:n,rear:i}},Fa=e=>({id:`rack-${e.id}`,type:"rack",position:{x:0,y:0},data:{label:e.name,status:e.status.value,uHeight:e.u_height,netboxId:e.id,netboxType:"rack",facilityId:e.facility_id,serial:e.serial,assetTag:e.asset_tag,site:e.site.name,role:e.role?.name,tenant:e.tenant?.name}}),Ha=(e,t={})=>{let o={label:e.name,status:e.status.value,deviceType:e.device_type.model,manufacturer:e.device_type.manufacturer.name,role:e.device_role.name,uHeight:1,uPosition:e.position||1,face:e.face||"front",netboxId:e.id,netboxType:"device",primaryIp4:e.primary_ip4?.address,primaryIp6:e.primary_ip6?.address,site:e.site.name,rack:e.rack?.name};if(t.includeInterfacePorts&&Array.isArray(e.interfaces)&&e.interfaces.length>0){let{front:r,rear:n}=$c(e,t);r.length>0&&(o.ports=r),n.length>0&&(o.rearPorts=n);}return {id:`device-${e.id}`,type:"device",position:{x:0,y:0},parentId:e.rack?`rack-${e.rack.id}`:void 0,extent:e.rack?"parent":void 0,data:o}},Da=e=>({id:`cable-${e.id}`,source:Ca(e.termination_a.device),target:Ca(e.termination_b.device),type:"fiber",data:{bandwidth:e.type.label,length:e.length||0,color:e.color,netboxId:e.id,netboxType:"cable",status:e.status.value,terminationA:e.termination_a.name,terminationB:e.termination_b.name}}),Ac=(e,t={})=>{let o=[],r=[],n=new Map;return e.racks.forEach(i=>{o.push(Fa(i));}),e.devices.forEach(i=>{let d=Ha(i,t);o.push(d),n.set(i.name,d.id);}),e.cables.forEach(i=>{let d=Da(i),a=(typeof i.termination_a.device.id=="number"?`device-${i.termination_a.device.id}`:void 0)??n.get(i.termination_a.device.name)??d.source,c=(typeof i.termination_b.device.id=="number"?`device-${i.termination_b.device.id}`:void 0)??n.get(i.termination_b.device.name)??d.target;r.push({...d,source:a,target:c});}),{nodes:o,edges:r}},Lc=(e,t)=>{let o=new Map,r=new Set;return e.filter(i=>i.position!==null).sort((i,d)=>(i.position||0)-(d.position||0)).forEach(i=>{i.position&&(o.set(i.id,i.position),r.add(i.position));}),o};function _r(e){let{items:t,checkOutOfBounds:o,checkConflicts:r}=e,n=[],i=[];for(let d of t){let a=o(d);a&&!a.isValid&&a.error&&i.push(a.error);}for(let d=0;d<t.length;d++){let a=t[d];for(let c=d+1;c<t.length;c++){let l=t[c],b=r(a,l);b&&b.hasConflict&&b.conflict&&n.push(b.conflict);}}return {isValid:n.length===0&&i.length===0,conflicts:n,outOfBounds:i}}var Co=class extends Error{constructor(o,r,n,i,d){super(`Device placement conflict: ${r} at U${n}-${n+i-1} in rack ${o}${d?` conflicts with ${d}`:""}`);this.rackId=o;this.deviceId=r;this.uPosition=n;this.uHeight=i;this.conflictWith=d;this.name="DevicePlacementError";}};function jn(e,t={}){let o=$e(e);return _r({items:e.devices,checkOutOfBounds:r=>r.unit+r.height-1>e.units?{isValid:false,error:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,rackUHeight:e.units}}:null,checkConflicts:(r,n)=>{let i=r.unit,d=r.unit+r.height-1,a=n.unit,c=n.unit+n.height-1;if(i<=c&&d>=a){if(o){let l=Ve(r),b=Ve(n);if(!Qo(l,b))return null}return {hasConflict:true,conflict:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,conflictWith:n.id}}}return null}})}function _a(e,t,o={}){let{deviceTypeMapping:r={}}=o,n=r[e.type]||"device",i=go(t,e.unit,e.height,e);return {id:e.id,type:n,position:i,parentId:t.id,extent:"parent",data:{label:e.name,status:e.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,frontImageUrl:e.frontImageUrl,rearImageUrl:e.rearImageUrl,frontImageAttribution:e.frontImageAttribution,rearImageAttribution:e.rearImageAttribution,imageFit:e.imageFit,imagePosition:e.imagePosition,imageRepeat:e.imageRepeat,stretchToFit:e.stretchToFit,rackWidthPx:t.data.rackWidthPx,rackLayout:t.data.rackLayout,rackFaceGapPx:t.data.rackFaceGapPx,mountMode:Ve(e)}}}function Bc(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:[],rackWidthPx:e.rackWidthPx,rackLayout:e.rackLayout,rackFaceGapPx:e.rackFaceGapPx}}}function Oc(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],i=[];if(r)for(let d of e){let a=jn(d,t);if(!a.isValid&&o==="strict"){let c=[];throw a.conflicts.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} conflicts with ${l.conflictWith}`);}),a.outOfBounds.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} exceeds rack height (${l.rackUHeight}U)`);}),new Co(d.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 d of e){let a=Bc(d);n.push(a);for(let c of d.devices)try{let l=_a(c,a,t);i.push(l);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let b=rr(a,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:Ve(c)}},i,c.unit);if(b!==c.unit){console.warn(`Device ${c.id} moved from U${c.unit} to U${b} due to conflict`);let f={...c,unit:b},u=_a(f,a,t);i.push(u);}else throw new Co(d.id,c.id,c.unit,c.height)}}}return n.push(...i),n}function Wc(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let i=e.filter(d=>Do(d.type)&&d.parentId===r.id).map(d=>({id:d.id,name:d.data.label,unit:d.data.uPosition||1,height:d.data.uHeight||1,type:d.data.deviceType||"server",width:d.data.width==="full"||d.data.width==="half"?d.data.width:void 0,ports:Array.isArray(d.data.ports)?d.data.ports:void 0,connections:d.data.connections,frontImageUrl:d.data.frontImageUrl,rearImageUrl:d.data.rearImageUrl,frontImageAttribution:d.data.frontImageAttribution,rearImageAttribution:d.data.rearImageAttribution,imageFit:d.data.imageFit,imagePosition:d.data.imagePosition,imageRepeat:d.data.imageRepeat,stretchToFit:d.data.stretchToFit,mountMode:Ve(d.data)}));t.push({id:r.id,name:r.data.label,position:r.position,units:r.data.uHeight||42,uNumberingDirection:r.data.uNumberingDirection||"bottom-up",customHeaderText:r.data.customHeaderText,rackLayout:r.data.rackLayout,rackFaceGapPx:r.data.rackFaceGapPx,devices:i,rackWidthPx:r.data.rackWidthPx});}return t}function zc(e,t,o,r){return e.map(n=>n.id!==t?n:{...n,devices:n.devices.map(i=>i.id!==o?i:{...i,unit:r})})}function Uc(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(i=>{if(i.id!==t)return i;if(n==="strict"&&!jn({...i,devices:[...i.devices,o]},r).isValid)throw new Co(t,o.id,o.unit,o.height);return {...i,devices:[...i.devices,o]}})}function Vc(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(n=>n.id!==o)})}var vo=class extends Error{constructor(o,r,n,i){super(`Splice placement conflict: ${r} at holder ${n} in tray ${o}${i?` conflicts with ${i}`:""}`);this.trayId=o;this.spliceId=r;this.holder=n;this.conflictWith=i;this.name="SplicePlacementError";}};function Yn(e,t={}){return _r({items:e.splices,checkOutOfBounds:o=>o.holder<1||o.holder>zt?{isValid:false,error:{spliceId:o.id,holder:o.holder,max:zt}}:null,checkConflicts:(o,r)=>o.holder===r.holder?{hasConflict:true,conflict:{spliceId:o.id,holder:o.holder,conflictWith:r.id}}:null})}function Ma(e,t){let o=e.mode==="ribbon",r=Vo(t,e.holder,o);return {id:e.id,type:"splice",position:r,parentId:t.id,extent:"parent",data:{label:e.name,holderPosition:e.holder,lossDb:e.lossDb,mode:e.mode||"single",ribbonFiberIds:e.ribbonFiberIds}}}function Gc(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function Xc(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],i=[];if(r)for(let d of e){let a=Yn(d,t);if(!a.isValid&&o==="strict"){let c=[];throw a.conflicts.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} conflicts with ${l.conflictWith}`);}),a.outOfBounds.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} is out of bounds (max: ${l.max})`);}),new vo(d.id,a.conflicts[0]?.spliceId||a.outOfBounds[0]?.spliceId||"unknown",a.conflicts[0]?.holder||a.outOfBounds[0]?.holder||1)}}for(let d of e){let a=Gc(d);n.push(a);for(let c of d.splices)try{let l=c.holder;if(o==="nearest"){let u={id:c.id,type:"splice",position:{x:0,y:0},data:{label:c.name,holderPosition:c.holder}},p=[...n,...i];Wo(a,u,c.holder,p)||(l=Uo(a,u,p,c.holder));}let b=l!==c.holder?{...c,holder:l}:c,f=Ma(b,a);i.push(f);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let b=[...n,...i],f=Uo(a,{id:c.id,data:{label:c.name,holderPosition:c.holder}},b,c.holder);if(f!==c.holder){console.warn(`Splice ${c.id} moved from holder ${c.holder} to holder ${f} due to conflict`);let u={...c,holder:f},p=Ma(u,a);i.push(p);}else throw new vo(d.id,c.id,c.holder)}}}return n.push(...i),n}function jc(e){let t=[],o=e.filter(r=>r.type==="splice-tray");for(let r of o){let i=e.filter(d=>d.type==="splice"&&d.parentId===r.id).map(d=>({id:d.id,name:d.data.label,holder:d.data.holderPosition||1,lossDb:d.data.lossDb,mode:d.data.mode||"single",ribbonFiberIds:d.data.ribbonFiberIds}));t.push({id:r.id,name:r.data.label,position:r.position,splices:i});}return t}function Yc(e,t,o,r){return e.map(n=>n.id!==t?n:{...n,splices:n.splices.map(i=>i.id!==o?i:{...i,holder:r})})}function Kc(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(i=>{if(i.id!==t)return i;if(n==="strict"&&!Yn({...i,splices:[...i.splices,o]},r).isValid)throw new vo(t,o.id,o.holder);return {...i,splices:[...i.splices,o]}})}function Zc(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}var $a=2;var pe=e=>typeof e=="string"?e.trim():"",xt=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},qc=e=>{let t=pe(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},Jc=(e,t)=>{if(t==="C13"||t==="C14")return "power_c13";if(t==="C19"||t==="C20")return "power_c19";if(t==="AC")return "power_ac";let o=(e??"").toLowerCase();return o.includes("c13")?"power_c13":o.includes("c19")?"power_c19":o.includes("power")||o.includes("pdu")?"power_ac":o.includes("fiber")||o.includes("sfp")||o.includes("qsfp")?"fiber":o.includes("console")?"console":o.includes("mgmt")||o.includes("management")?"mgmt":o.includes("usb")?"usb":"ethernet"},Qc=e=>{if(e==="power_c13")return "C13";if(e==="power_c19")return "C19";if(e==="power_ac")return "AC"},el=e=>e.toLowerCase().replace(/_/g,"-").trim(),tl=e=>e>=1?"rackable":"zero-u",ol=e=>(e??"").toLowerCase()==="half"?"half":"full",rl=(e,t,o,r)=>{let n=r.replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();return `${e}-b${t}-${n||`p${o}`}`},Aa=(e,t)=>`${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");function nl(e){let t=[],o=pe(e.manufacturer),r=pe(e.model),n=pe(e.role)||pe(e.deviceType)||pe(e.device_type)||"device",i=xt(e.uHeight)??xt(e.u_height)??0;o||t.push({severity:"warning",code:"MISSING_MANUFACTURER",message:"Template is missing manufacturer",path:"manufacturer"}),r||t.push({severity:"warning",code:"MISSING_MODEL",message:"Template is missing model",path:"model"});let d=pe(e.id)||pe(e.slug)||Aa(o,r)||"unknown",a=pe(e.slug)||Aa(o,r)||d,c=Array.isArray(e.ports)?e.ports:[],l=Array.isArray(e.rearPorts)?e.rearPorts:Array.isArray(e.rear_ports)?e.rear_ports:[],f=(Array.isArray(e.frontRearPortLinks)?e.frontRearPortLinks:Array.isArray(e.front_rear_port_links)?e.front_rear_port_links:[]).map(u=>({frontPortId:pe(u.frontPortId)||pe(u.front_port_id),rearPortId:pe(u.rearPortId)||pe(u.rear_port_id)}));return {id:d,slug:a,manufacturer:o,model:r,role:n,uHeight:i,width:pe(e.width)||void 0,frontBlocks:c,rearBlocks:l,rawLinks:f,frontImageUrl:pe(e.frontImageUrl)||pe(e.front_image_url)||void 0,rearImageUrl:pe(e.rearImageUrl)||pe(e.rear_image_url)||void 0,frontImageAttribution:pe(e.frontImageAttribution)||void 0,rearImageAttribution:pe(e.rearImageAttribution)||void 0,tags:Array.isArray(e.tags)?e.tags.map(pe).filter(Boolean):[],sourceRepository:pe(e.sourceRepository)||pe(e.source_repository)||void 0,sourcePath:pe(e.sourcePath)||pe(e.source_path)||void 0,issues:t}}function La(e,t,o){let r=pe(e.name)||`Block ${o+1}`,i=(Array.isArray(e.ports)?e.ports:[]).map((d,a)=>{let c=pe(d.label)||pe(d.name)||`Port ${a+1}`,l=qc(d.connectorType??d.connector_type),b=Jc(pe(d.type),l),f=l??Qc(b),p={id:pe(d.id)||rl(t,o,a,c),label:c,type:b,connectorType:f};if(d.position){let m=d.position,x=pe(m.side),P={},N=false;x&&["top","right","bottom","left"].includes(x)&&(P.side=x,N=true);let v=xt(m.offsetPercent)??xt(m.offset_percent);v!==void 0&&(P.offsetPercent=v,N=true);let C=xt(m.offsetPx)??xt(m.offset_px);C!==void 0&&(P.offsetPx=C,N=true);let F=xt(m.xPercent)??xt(m.x_percent);F!==void 0&&(P.xPercent=F,N=true);let w=xt(m.yPercent)??xt(m.y_percent);w!==void 0&&(P.yPercent=w,N=true),N&&(p.position=P);}return p});return {name:r,ports:i}}function il(e){let t=[],o=el(e.role),r=e.uHeight,n=tl(r),i=ol(e.width),d=e.frontBlocks.map((c,l)=>La(c,"front",l)),a=e.rearBlocks.map((c,l)=>La(c,"rear",l));return {role:o,mountClass:n,uHeight:r,width:i,frontFace:{portBlocks:d,imageUrl:e.frontImageUrl,imageAttribution:e.frontImageAttribution},rearFace:{portBlocks:a,imageUrl:e.rearImageUrl,imageAttribution:e.rearImageAttribution},issues:t}}function al(e,t){let o=new Set(e.portBlocks.map(i=>i.name)),r=new Set(t.portBlocks.map(i=>i.name)),n=[...o].filter(i=>r.has(i));return n.length===0?{front:e,rear:t}:{front:{...e,portBlocks:e.portBlocks.map(i=>n.includes(i.name)?{...i,name:`Front \xB7 ${i.name}`}:i)},rear:{...t,portBlocks:t.portBlocks.map(i=>n.includes(i.name)?{...i,name:`Rear \xB7 ${i.name}`}:i)}}}function sl(e){let t=[],{front:o,rear:r}=al(e.frontFace,e.rearFace),n=e.role;return (!n||n==="device")&&[...o.portBlocks,...r.portBlocks].some(d=>d.ports.some(a=>a.type&&a.type.startsWith("power")))&&e.mountClass==="zero-u"&&(n="pdu"),{frontFace:o,rearFace:r,mountClass:e.mountClass,role:n,issues:t}}function Yo(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function dl(e,t){let o=[],r=[];for(let p of t.frontFace.portBlocks)for(let m of p.ports)r.push({id:m.id,face:"front"});for(let p of t.rearFace.portBlocks)for(let m of p.ports)r.push({id:m.id,face:"rear"});let n=new Map;for(let{id:p}of r)n.set(p,(n.get(p)??0)+1);for(let[p,m]of n)m>1&&o.push({severity:"error",code:"DUPLICATE_PORT_ID",message:`Duplicate port id "${p}" found ${m} times`,path:`ports.${p}`});let i=e.frontBlocks.reduce((p,m)=>p+(Array.isArray(m.ports)?m.ports.length:0),0),d=e.rearBlocks.reduce((p,m)=>p+(Array.isArray(m.ports)?m.ports.length:0),0),a=Yo(t.frontFace),c=Yo(t.rearFace);a!==i&&o.push({severity:"error",code:"FRONT_PORT_COUNT_MISMATCH",message:`Front port count mismatch: raw=${i}, parsed=${a}`,path:"faces.front"}),c!==d&&o.push({severity:"error",code:"REAR_PORT_COUNT_MISMATCH",message:`Rear port count mismatch: raw=${d}, parsed=${c}`,path:"faces.rear"});let l=new Set(r.map(p=>p.id)),b=new Set(r.filter(p=>p.face==="front").map(p=>p.id)),f=new Set(r.filter(p=>p.face==="rear").map(p=>p.id));for(let p of e.rawLinks)p.frontPortId&&!b.has(p.frontPortId)&&!l.has(p.frontPortId)&&o.push({severity:"warning",code:"PASS_THROUGH_FRONT_PORT_MISSING",message:`Pass-through link references unknown front port "${p.frontPortId}"`,path:"frontRearPortLinks"}),p.rearPortId&&!f.has(p.rearPortId)&&!l.has(p.rearPortId)&&o.push({severity:"warning",code:"PASS_THROUGH_REAR_PORT_MISSING",message:`Pass-through link references unknown rear port "${p.rearPortId}"`,path:"frontRearPortLinks"});return {valid:!o.some(p=>p.severity==="error"),issues:o,portCounts:{front:a,rear:c}}}function cl(e,t,o){let r=e.rawLinks.filter(i=>!!i.frontPortId&&!!i.rearPortId).map(i=>({frontPortId:i.frontPortId,rearPortId:i.rearPortId})),n=e.sourceRepository?{kind:"netbox",repository:e.sourceRepository,path:e.sourcePath}:void 0;return {templateSchemaVersion:2,id:e.id,slug:e.slug,manufacturer:e.manufacturer,model:e.model,role:o.role,mountClass:o.mountClass,uHeight:t.uHeight,width:t.width,faces:{front:o.frontFace,rear:o.rearFace},frontRearPortLinks:r,images:{front:o.frontFace.imageUrl??null,rear:o.rearFace.imageUrl??null},source:n,tags:e.tags.length>0?e.tags:void 0}}function ll(e){let t=nl(e),o=il(t),r=sl(o),n=dl(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:cl(t,o,r),report:n}:{template:null,report:n}}function ul(e){return Yo(e)}function pl(e,t,o){let r=[],n=Yo(e.faces.front),i=Yo(e.faces.rear);return t!==n&&r.push({severity:"error",code:"RENDER_FRONT_COUNT_MISMATCH",message:`Rendered front handle count (${t}) does not match template (${n})`,path:"faces.front"}),o!==i&&r.push({severity:"error",code:"RENDER_REAR_COUNT_MISMATCH",message:`Rendered rear handle count (${o}) does not match template (${i})`,path:"faces.rear"}),r}
2
+ exports.COUPLERS_PER_PANEL=kd;exports.COUPLER_SLOT_HEIGHT_PX=Nr;exports.COUPLER_WIDTH_PX=Pd;exports.CableNode=Nn;exports.ClosureNode=_n;exports.CouplerNode=Cn;exports.DeviceNode=mo;exports.DevicePlacementError=Co;exports.DiagramErrorBoundary=Un;exports.FIBER_COLORS_12=li;exports.FiberEdge=ar;exports.FiberNode=qr;exports.FibreCableWithTubesExpanded=vc;exports.FibreFlowMap=kc;exports.FibreSplitNode=$n;exports.HANDLE_EXTENSION_PX=Ho;exports.MultiTubeCableNode=Pn;exports.NetworkDiagram=zn;exports.PANEL_BORDER_WIDTH=Li;exports.PANEL_HEADER_HEIGHT=io;exports.PANEL_HEIGHT_PX=xr;exports.PANEL_PADDING=no;exports.PANEL_TUBE_TRAY_SPACING=Bi;exports.PANEL_WIDTH_PX=wr;exports.POWER_CONNECTORS=tn;exports.PatchPanelNode=Fn;exports.PowerEdge=Qr;exports.RACK_HEADER_HEIGHT=vt;exports.RACK_WIDTH_PX=jr;exports.RackNode=Zr;exports.SpliceNode=pn;exports.SplicePlacementError=vo;exports.SpliceTrayNode=hn;exports.TEMPLATE_SCHEMA_VERSION=$a;exports.TubeNode=yn;exports.U_HEIGHT_PX=tt;exports.VerticalPDU=cn;exports.Width=Ni;exports.addDeviceToRack=Uc;exports.addSpliceToTray=Kc;exports.baseColorFor=Xe;exports.buildNodesFromRackConfig=Oc;exports.buildNodesFromSpliceConfig=Xc;exports.calculateClosureDimensions=Sn;exports.calculateCouplerRightX=vd;exports.calculateCouplerSlotSpacing=Rd;exports.calculateCouplerSpacing=ji;exports.calculateDevicePositionFromU=go;exports.calculatePanelDimensions=Rn;exports.calculateSlotPositionFromY=Gi;exports.calculateSplicePositionFromNumber=gd;exports.calculateUPositions=Lc;exports.calculateYFromSlotPosition=Xi;exports.countTemplateFacePorts=ul;exports.createNetworkDiagramStore=An;exports.createRackConfigFromNodes=Wc;exports.createSpliceConfigFromNodes=jc;exports.fiberSolidOrStriped=Jr;exports.findNearestRack=Sr;exports.findNextAvailableHolderPosition=Uo;exports.findNextAvailableUPosition=rr;exports.generateLayout=Rc;exports.getConnectorConfig=ki;exports.getCouplerDimensions=Tn;exports.getDeviceConnectorType=Bo;exports.getFiberColor=qt;exports.getInnerContentWidth=Vi;exports.getPDUPortType=dr;exports.getPanelHeight=Cd;exports.getPanelWidth=Ui;exports.getPowerPortStyle=eo;exports.getRackBounds=Qi;exports.getStatusColor=mt;exports.getTrayDimensions=Oi;exports.getTubeDimensions=kr;exports.inventoryCableToNetworkEdge=Pa;exports.inventoryDeviceToNetworkNode=ka;exports.inventoryRackToNetworkNode=Na;exports.inventoryToNetworkDiagram=Tc;exports.isHighPowerConnector=Ss;exports.isPointInRack=ea;exports.isStriped=Zt;exports.isUPositionAvailable=Kr;exports.netboxCableToNetworkEdge=Da;exports.netboxDeviceToNetworkNode=Ha;exports.netboxRackToNetworkNode=Fa;exports.netboxToNetworkDiagram=Ac;exports.parseNetboxTemplate=ll;exports.removeDeviceFromRack=Vc;exports.removeSpliceFromTray=Zc;exports.replaceEdge=Oe;exports.snapToCouplerPosition=Td;exports.snapToSplicePosition=gn;exports.snapToUPosition=or;exports.updateDeviceUPosition=ci;exports.updateDeviceUPositionInSchema=zc;exports.updateSpliceHolderPosition=Yc;exports.useDiagramEdges=On;exports.useDiagramNodes=Bn;exports.useNetworkDiagram=$d;exports.validateAndSnapDevice=cs;exports.validateRackDevicePlacements=jn;exports.validateRenderFidelity=pl;exports.validateSplicePlacements=Yn;//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map