@mp70/react-networks 0.5.0-alpha.0 → 0.5.0-rc.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +33 -20
- package/dist/index.css +34 -0
- package/dist/index.css.map +1 -1
- package/dist/index.d.mts +147 -73
- package/dist/index.d.ts +147 -73
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +2 -2
- package/dist/index.mjs.map +1 -1
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import Re,{useState,useMemo,useRef,useEffect,useSyncExternalStore,Component,useCallback}from'react';import {useReactFlow,Handle,Position,getBezierPath,BaseEdge,EdgeLabelRenderer,useUpdateNodeInternals,useEdges,addEdge,ReactFlowProvider,ConnectionMode,useNodesState,useEdgesState,applyNodeChanges,useOnSelectionChange,applyEdgeChanges,ReactFlow,Background,Controls,MiniMap,Panel,getSmoothStepPath,SmoothStepEdge}from'reactflow';import {toPng}from'html-to-image';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Fc=/-(source|target)$/i;function De(e){return e?e.replace(Fc,""):""}function rt(e){return typeof e=="string"&&e.includes("power")}function Eo(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:rt(t.type)?t.label:`${e}-${t.label}`}function Cn(e){let t=De(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}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 Ot(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,a=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",...a}}function Yi(e){let t=Tn[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function Hc(e){return Yi(e).amperage===16}function Dt(e){return e%10<8?"C13":"C19"}function En(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var _c=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Tr=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}},Mc=e=>e.trim().toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>0),Rn=e=>{if(e==="top"||e==="up")return "top";if(e==="right")return "right";if(e==="bottom"||e==="down")return "bottom";if(e==="left")return "left"},Ki=e=>e.includes("center")||e.includes("centre")||e.includes("middle")||e.includes("mid"),$c=(e,t)=>{let o=t.includes("left"),r=t.includes("right"),n=t.includes("top")||t.includes("up"),i=t.includes("bottom")||t.includes("down"),a=Ki(t);if(e==="top"||e==="bottom")return o&&a&&!r?34:r&&a&&!o?66:o&&!r?12:r&&!o?88:a?50:void 0;if(n&&a&&!i)return 34;if(i&&a&&!n)return 66;if(n&&!i)return 12;if(i&&!n)return 88;if(a)return 50},Ac=e=>{if(e.includes("front")||e.includes("rear")||e.includes("back"))return;let o=e.map(Rn).find(n=>n!==void 0);if(!o)return;let r=$c(o,e);if(r!==void 0)return {side:o,offsetPercent:r}},Lc=e=>{if(e.length===0)return;let t=e.includes("left"),o=e.includes("right"),r=Ki(e),n=e.includes("front")||e.includes("top")||e.includes("up"),i=e.includes("rear")||e.includes("back")||e.includes("bottom")||e.includes("down"),a;t&&r&&!o?a=34:o&&r&&!t?a=66:t&&!o?a=12:o&&!t?a=88:r&&(a=50);let s;if(n&&!i?s=22:i&&!n?s=78:r&&(s=50),!(a===void 0||s===void 0))return {xPercent:a,yPercent:s}},Er=e=>{let t=Mc(e);if(t.length!==0){if(t.length===1){let o=Rn(t[0]);return o?{side:o}:void 0}return Ac(t)??Lc(t)}},Bt=e=>{if(typeof e=="string")return Er(e);if(!_c(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"?Er(t):void 0,n=(typeof t=="string"?Rn(t.trim().toLowerCase()):void 0)??o?.side,i=Tr(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct)??o?.offsetPercent,a=Tr(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels)??o?.offsetPx,s=Tr(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x)??o?.xPercent,c=Tr(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y)??o?.yPercent;if(!(n===void 0&&i===void 0&&a===void 0&&s===void 0&&c===void 0))return {side:n,offsetPercent:i,offsetPx:a,xPercent:s,yPercent:c}};var Oc="Network Ports",Bc="Rear Network Ports",Wc="Power Ports",qi=8,zc=92;function Rr(e){return Math.max(0,Math.min(100,e))}function vn(e){if(e==="top"||e==="right"||e==="bottom"||e==="left")return e}function Ro(e){return Bt(e)}function Ji(e){let t=Ro(e.position);return typeof t?.xPercent=="number"&&typeof t?.yPercent=="number"}function Uc(e){let t=Ro(e.position);return typeof t?.offsetPercent=="number"||typeof t?.offsetPx=="number"}function Gc(e){return e.face==="rear"||e.face==="back"?"rear":e.face==="front"?"front":rt(e.type)?"rear":"front"}function Vc(e,t){return typeof e.group=="string"&&e.group.trim().length>0?e.group.trim():rt(e.type)?Wc:t==="rear"?Bc:Oc}function vr(e){return typeof e.port.order=="number"&&Number.isFinite(e.port.order)?e.port.order:e.index}function Xc(e,t){return t<=1?50:qi+e*(zc-qi)/(t-1)}function jc(e){let t=e.filter(n=>!!vn(Ro(n.port.position)?.side)&&!Ji(n.port)&&!Uc(n.port)),o=new Map,r=new Map;return t.forEach(n=>{let i=vn(Ro(n.port.position)?.side);if(!i)return;let a=r.get(i);if(a){a.push(n);return}r.set(i,[n]);}),r.forEach(n=>{let i=[...n].sort((a,s)=>{let c=vr(a)-vr(s);return c!==0?c:a.index-s.index});i.forEach((a,s)=>{o.set(a.index,Xc(s,i.length));});}),o}function Yc(e,t){let o=Ro(e.position),r=vn(o?.side);if(Ji(e)){let s={xPercent:Rr(o?.xPercent),yPercent:Rr(o?.yPercent)};return r&&(s.side=r),s}if(!r)return;let n={side:r};if(typeof o?.offsetPx=="number"&&Number.isFinite(o.offsetPx))return n.offsetPx=o.offsetPx,n;let a=(typeof o?.offsetPercent=="number"&&Number.isFinite(o.offsetPercent)?Rr(o.offsetPercent):void 0)??(typeof t=="number"?Rr(t):void 0);return typeof a=="number"&&(n.offsetPercent=a),n}function Kc(e,t){let o=Yc(e.port,t);return {id:e.port.id,label:e.port.label,connected:e.port.connected??false,type:e.port.type,cableType:e.port.cableType,connectorType:e.port.connectorType,compatibility:Array.isArray(e.port.compatibility)?[...e.port.compatibility]:void 0,...o?{position:o}:{}}}function Zi(e){return e.map(t=>({...t,ports:t.ports.map(o=>{let r=Ro(o.position);return {...o,...r?{position:r}:{position:void 0}}})}))}function Qi(e){let t=new Map;e.forEach((n,i)=>{if(typeof n.label!="string"||n.label.trim().length===0)return;let a=Gc(n),s=Vc(n,a),c=`${a}:${s}`,l=t.get(c);if(l){l.entries.push({index:i,port:{...n,label:n.label.trim()}});return}t.set(c,{face:a,groupName:s,entries:[{index:i,port:{...n,label:n.label.trim()}}]});});let o=[],r=[];return t.forEach(n=>{let i=[...n.entries].sort((c,l)=>{let b=vr(c)-vr(l);return b!==0?b:c.index-l.index}),a=jc(i),s={name:n.groupName,ports:i.map(c=>Kc(c,a.get(c.index)))};if(n.face==="rear"){r.push(s);return}o.push(s);}),{ports:o,rearPorts:r}}function Ze(e){return Array.isArray(e?.ports)?Qi(e.ports):{ports:Zi(Array.isArray(e?.portGroups)?e.portGroups:[]),rearPorts:Zi(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:[])}}function Dn(e){return Ze(e).ports}function Sn(e){return Ze(e).rearPorts}function Zo(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function ea(e){return Zo(Ze(e).ports)>0}function ta(e){return Zo(Ze(e).rearPorts)>0}function bt(e){let t=ea(e);return ta(e)&&!t?"rear":"front"}var qc=new Set(["patch-panel","closure","splice-tray"]),In=["frontImageUrl","rearImageUrl","frontImageAttribution","rearImageAttribution","imageFit","imagePosition","imageRepeat","stretchToFit"],Fn=["panelWidth","panelHeight","closureWidth","closureHeight","headerHeight"],Hn=["status","width","widthPx","height","header","color","colorMode","showUMarkers","customHeaderText","powerSide","rotation","rackWidthPx","rackFaceGapPx"],Zc=["view","face","handleSideMap"],Jc=new Set(["label","ports","portGroups","rearPortGroups","pduPortGroups","connections","netboxId","netboxType","inventoryId","inventoryType","uPosition","mountMode","rackLayout","slotPosition","holderPosition",...In,...Fn,...Hn,...Zc]);function ra(e){return {x:typeof e?.x=="number"?e.x:0,y:typeof e?.y=="number"?e.y:0}}function Qo(e){if(e)return {...e}}function Jo(e){return {...e,ports:e.ports.map(t=>({...t,compatibility:Array.isArray(t.compatibility)?[...t.compatibility]:void 0,position:Qo(t.position)}))}}function Qc(e){if(typeof e.parentId=="string")return e.parentId;let t=e.parentNode;return typeof t=="string"?t:void 0}function ed(e){return e.type==="vertical-pdu"?{kind:"pdu"}:e.type==="server"||e.type==="switch"||e.type==="router"||e.type==="device"?{kind:"equipment",subtype:typeof e.data?.deviceType=="string"&&e.data.deviceType.trim().length>0?e.data.deviceType:e.type}:e.type==="patch-panel"||e.type==="closure"||e.type==="splice-tray"?{kind:"container",subtype:e.type}:e.type==="fibre-split"?{kind:"splitter"}:e.type==="fibre-flow-cable"||e.type==="fibre-flow-closure"?{kind:e.type}:{kind:e.type}}function td(e){if(e.kind==="equipment"){let t=(e.subtype??"device").toLowerCase().replace(/_/g,"-");return t==="server"||t==="switch"||t==="router"?t:"device"}if(e.kind==="pdu")return "vertical-pdu";if(e.kind==="container"){let t=e.subtype??"patch-panel";return qc.has(t)?t:"patch-panel"}return e.kind==="splitter"?"fibre-split":e.kind}function od(e){let t={position:ra(e.position)},o=Qc(e);o&&(t.parentId=o),e.extent==="parent"&&(t.extent="parent");let r=e.data??{};return (typeof r.uPosition=="number"||r.mountMode==="front"||r.mountMode==="rear"||r.mountMode==="both"||r.rackLayout==="single-face"||r.rackLayout==="split-face")&&(t.rack={...typeof r.uPosition=="number"?{uPosition:r.uPosition}:{},...r.mountMode?{mountMode:r.mountMode}:{},...r.rackLayout?{rackLayout:r.rackLayout}:{},...typeof r.rackWidthPx=="number"?{rackWidthPx:r.rackWidthPx}:{},...typeof r.rackFaceGapPx=="number"?{rackFaceGapPx:r.rackFaceGapPx}:{}}),(typeof r.slotPosition=="number"||typeof r.holderPosition=="number")&&(t.container={...typeof r.slotPosition=="number"?{slotPosition:r.slotPosition}:{},...typeof r.holderPosition=="number"?{holderPosition:r.holderPosition}:{}}),t}function rd(e){let t=e.data??{},o={};Hn.forEach(i=>{let a=t[i];a!==void 0&&(o[i]=a);});let r=In.reduce((i,a)=>{let s=t[a];return s!==void 0&&(i[a]=s),i},{});Object.keys(r).length>0&&(o.images=r);let n=Fn.reduce((i,a)=>{let s=t[a];return typeof s=="number"&&(i[a]=s),i},{});return Object.keys(n).length>0&&(o.dimensions=n),Object.keys(o).length>0?o:void 0}function nd(e){let t=[],o=e.data??{};return o.netboxId!==void 0&&t.push({source:"netbox",id:o.netboxId,type:o.netboxType}),o.inventoryId!==void 0&&t.push({source:"inventory",id:o.inventoryId,type:o.inventoryType}),t.length>0?t:void 0}function id(e){let t=e.data??{},o={};return Object.entries(t).forEach(([r,n])=>{Jc.has(r)||(r==="rackWidthPx"||r==="rackFaceGapPx")&&e.type!=="rack"||(o[r]=n);}),Object.keys(o).length>0?o:void 0}function ad(e,t){let o={};if(e.forEach(r=>{let n=r.data??{},i={};(n.view==="front"||n.view==="rear")&&(i.view=n.view),(n.face==="front"||n.face==="rear")&&(i.face=n.face),n.handleSideMap&&typeof n.handleSideMap=="object"&&(i.handleSideMap={...n.handleSideMap}),Object.keys(i).length>0&&(o[r.id]=i);}),!(Object.keys(o).length===0&&!t?.metadata))return {...Object.keys(o).length>0?{nodeState:o}:{},...t?.metadata?{metadata:t.metadata}:{}}}function sd(e){let t=String(e??"").toLowerCase();return t.includes("power")?"power":t.includes("fiber")?"fiber":t.includes("console")||t.includes("mgmt")||t.includes("usb")?"generic":t.includes("ethernet")?"ethernet":"generic"}function cd(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups.map(Jo);let{ports:o,rearPorts:r}=Ze(t);if(r.length>0)return r.map(Jo);if(o.length>0)return o.map(Jo);let n=typeof t.powerPorts=="number"&&Number.isFinite(t.powerPorts)&&t.powerPorts>0?t.powerPorts:36;return [{name:"Power",ports:Array.from({length:n},(i,a)=>{let s=Dt(a);return {id:`${a+1}`,label:`${a+1}`,connected:false,type:s==="C19"?"power_c19":"power_c13",connectorType:s}})}]}function dd(e){return (e.type==="vertical-pdu"?[{face:"rear",blocks:cd(e)}]:(()=>{let{ports:o,rearPorts:r}=Ze(e.data);return [{face:"front",blocks:o.map(Jo)},{face:"rear",blocks:r.map(Jo)}]})()).flatMap(({face:o,blocks:r})=>r.flatMap(n=>n.ports.map(i=>({id:i.id??`${n.name}-${i.label}`,label:i.label,face:o,group:n.name,role:rt(i.type)?"power":"network",medium:sd(i.type),type:i.type,cableType:i.cableType,connector:i.connectorType,compatibility:Array.isArray(i.compatibility)?[...i.compatibility]:void 0,layout:Qo(i.position)}))))}function ld(e){let t=e.data??{};if(e.type==="tube"){let o=Math.max(1,Math.min(24,Number(t.fibersPerTube)||12)),r=Math.max(1,Number(t.tubeIndex)||1);return [...Array.from({length:o},(n,i)=>({id:`fiber-${i+1}`,label:`${i+1}`,role:"fiber",medium:"fiber"})),{id:`tube-${r}`,label:`Tube ${r}`,role:"tube",medium:"tube"}]}if(e.type==="cable"){let o=Math.max(1,Math.min(24,Number(t.fiberCount)||12));return [...Array.from({length:o},(r,n)=>({id:`fiber-${n+1}`,label:`${n+1}`,role:"fiber",medium:"fiber"})),{id:"cable-button",label:"Cable",role:"cable"}]}if(e.type==="multi-tube-cable"){let o=Math.max(1,Math.min(24,Number(t.tubeCount)||12)),r=Math.max(1,Number(t.tubeStartIndex)||1);return [...Array.from({length:o},(n,i)=>({id:`tube-${r+i}`,label:`${r+i}`,role:"tube",medium:"tube"})),{id:"cable-button",label:"Cable",role:"cable"}]}if(e.type==="splice")return [{id:"left",label:"Left",role:"splice",medium:"fiber"},{id:"right",label:"Right",role:"splice",medium:"fiber"}];if(e.type==="coupler"){let o=typeof t.couplerFiberCount=="number"&&[1,2,4].includes(t.couplerFiberCount)?t.couplerFiberCount:2;return [...Array.from({length:o},(r,n)=>({id:`left-${n+1}`,label:`${n+1}`,role:"coupler",medium:"fiber"})),...Array.from({length:o},(r,n)=>({id:`right-${n+1}`,label:`${n+1}`,role:"coupler",medium:"fiber"}))]}if(e.type==="fibre-split"){let o=Math.max(1,Math.min(2,Number(t.inputCount)||1)),r=Math.max(1,Math.min(64,Number(t.outputCount)||8));return [...Array.from({length:o},(n,i)=>({id:`input-${i+1}`,label:`Input ${i+1}`,role:"splitter",medium:"fiber"})),...Array.from({length:r},(n,i)=>({id:`output-${i+1}`,label:`Output ${i+1}`,role:"splitter",medium:"fiber"}))]}return []}function ud(e){let t=e.type==="vertical-pdu"||Array.isArray(e.data?.ports)||Array.isArray(e.data?.portGroups)||Array.isArray(e.data?.rearPortGroups)||Array.isArray(e.data?.pduPortGroups)?dd(e):ld(e);return t.length>0?t:void 0}function pd(e,t){if(!t||t.length===0)return t;let o=new Map((e??[]).map(r=>[r.id,r]));return t.map(r=>{let n=o.get(r.id);return n?{...n,...r,compatibility:r.compatibility??n.compatibility,layout:r.layout??n.layout}:r})}function fd(e,t){return e?{...e,...t,placement:t.placement,render:t.render,config:t.config,externalRefs:t.externalRefs,metadata:t.metadata??e.metadata,endpoints:pd(e.endpoints,t.endpoints)}:t}function _n(e,t){let o=new Map((t?.nodes??[]).map(a=>[a.id,a])),r=e.nodes.map(a=>fd(o.get(a.id),{id:a.id,...ed(a),label:a.data?.label??a.id,placement:od(a),render:rd(a),config:id(a),externalRefs:nd(a),metadata:o.get(a.id)?.metadata,endpoints:ud(a)})),n=new Map((t?.edges??[]).map(a=>[a.id,a])),i=e.edges.map(a=>{let s={id:a.id,source:{nodeId:a.source,endpointId:a.sourceHandle?De(a.sourceHandle):void 0},target:{nodeId:a.target,endpointId:a.targetHandle?De(a.targetHandle):void 0},type:a.type,hidden:a.hidden===true?true:void 0,data:a.data?{...a.data}:void 0,metadata:n.get(a.id)?.metadata},c=n.get(a.id);return c?{...c,...s}:s});return {nodes:r,edges:i,ui:ad(e.nodes,t?.ui),metadata:t?.metadata}}function gd(e){let t=new Map,o=r=>{if(!r.endpointId)return;let n=`${r.nodeId}:${De(r.endpointId)}`;t.set(n,(t.get(n)??0)+1);};return e.forEach(r=>{o(r.source),o(r.target);}),t}function na(e){if(e.type)return e.type;if(e.role==="power"||e.medium==="power"){let t=String(e.connector??"").toLowerCase();return t.includes("c19")||t.includes("c20")?"power_c19":t.includes("c13")||t.includes("c14")?"power_c13":"power_ac"}return e.medium==="fiber"?"fiber":(e.medium==="ethernet","ethernet")}function bd(e,t,o){return e.map(r=>({id:r.id,label:r.label,face:r.face==="rear"?"rear":r.face==="front"?"front":void 0,group:r.group,connected:(t.get(`${o}:${De(r.id)}`)??0)>0,type:na(r),cableType:r.cableType,connectorType:r.connector,compatibility:r.compatibility&&r.compatibility.length>0?[...r.compatibility]:void 0,position:Qo(r.layout)}))}function md(e,t,o){let r=new Map;return e.forEach(n=>{let i=n.group??"Ports",a=r.get(i),s={id:n.id,label:n.label,connected:(t.get(`${o}:${De(n.id)}`)??0)>0,type:na(n),cableType:n.cableType,connectorType:n.connector,compatibility:n.compatibility&&n.compatibility.length>0?[...n.compatibility]:void 0,position:Qo(n.layout)};if(a){a.push(s);return}r.set(i,[s]);}),[...r.entries()].map(([n,i])=>({name:n,ports:i.map(a=>({id:a.id,label:a.label,connected:a.connected??false,type:a.type,cableType:a.cableType,connectorType:a.connectorType,compatibility:a.compatibility,position:Qo(a.position)}))}))}function hd(e,t,o){if(!t&&!o)return e;let r={...e};return t&&(Hn.forEach(n=>{let i=t[n];i!==void 0&&(r[n]=i);}),t.images&&In.forEach(n=>{let i=t.images?.[n];i!==void 0&&(r[n]=i);}),t.dimensions&&Fn.forEach(n=>{let i=t.dimensions?.[n];typeof i=="number"&&(r[n]=i);})),o?.view&&(r.view=o.view),o?.face&&(r.face=o.face),o?.handleSideMap&&(r.handleSideMap={...o.handleSideMap}),r}function yd(e,t){if(!t||t.length===0)return e;let o={...e};return t.forEach(r=>{r.source==="netbox"&&(o.netboxId=r.id,r.type&&(o.netboxType=r.type)),r.source==="inventory"&&(o.inventoryId=r.id,r.type&&(o.inventoryType=r.type));}),o}function oa(e,t,o){if(!t)return;let r=De(t);if(!e)return r;if(e.kind==="equipment"){let n=(e.subtype??"").toLowerCase().replace(/_/g,"-"),i=e.endpoints?.find(s=>s.id===r),a=i?.role==="power"||i?.medium==="power";if((n==="switch"||n==="router")&&o==="target"&&!a)return `${r}-target`;if(n==="patch-panel"){let s=i?.face==="rear"?"rear":"front";if(o==="source"&&s==="front")return `${r}-source`;if(o==="target"&&s==="rear")return `${r}-target`}return r}return e.kind==="splitter"?`${r}-${o}`:r}function Mn(e){let t=gd(e.edges),o=e.ui?.nodeState??{},r=e.nodes.map(a=>{let s=td(a),c={label:a.label,...a.config??{}};if(c=hd(c,a.render,o[a.id]),c=yd(c,a.externalRefs),s==="device"||s==="server"||s==="switch"||s==="router")c.deviceType=a.subtype??(s==="device"?"device":s),a.endpoints&&a.endpoints.length>0&&(c.ports=bd(a.endpoints,t,a.id));else if(s==="vertical-pdu"){let l=(a.endpoints??[]).filter(b=>b.face!=="front");l.length>0&&(c.pduPortGroups=md(l,t,a.id),c.powerPorts=l.length);}return a.placement.rack&&(a.placement.rack.rackLayout&&(c.rackLayout=a.placement.rack.rackLayout),typeof a.placement.rack.rackWidthPx=="number"&&(c.rackWidthPx=a.placement.rack.rackWidthPx),typeof a.placement.rack.rackFaceGapPx=="number"&&(c.rackFaceGapPx=a.placement.rack.rackFaceGapPx)),s!=="rack"&&a.placement.rack&&(c.isRackMounted=true,typeof a.placement.rack.uPosition=="number"&&(c.uPosition=a.placement.rack.uPosition),a.placement.rack.mountMode&&(c.mountMode=a.placement.rack.mountMode)),a.placement.container&&(typeof a.placement.container.slotPosition=="number"&&(c.slotPosition=a.placement.container.slotPosition),typeof a.placement.container.holderPosition=="number"&&(c.holderPosition=a.placement.container.holderPosition)),{id:a.id,type:s,position:ra(a.placement.position),...a.placement.parentId?{parentId:a.placement.parentId}:{},...a.placement.extent?{extent:a.placement.extent}:{},data:c}}),n=new Map(e.nodes.map(a=>[a.id,a])),i=e.edges.map(a=>({id:a.id,source:a.source.nodeId,target:a.target.nodeId,...a.source.endpointId?{sourceHandle:oa(n.get(a.source.nodeId),a.source.endpointId,"source")}:{},...a.target.endpointId?{targetHandle:oa(n.get(a.target.nodeId),a.target.endpointId,"target")}:{},...a.type?{type:a.type}:{},...a.hidden===true?{hidden:true}:{},...a.data?{data:{...a.data}}:{}}));return {nodes:r,edges:i}}var ia=20,Wt=60,$n=300;var vo=5;function aa(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function sa(e,t){let r=aa(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function ca(e){return aa(e)==="light"?"#e5e5e5":"#2a2a2a"}function da(e,t){return {width:"100%",height:"100%",...t}}var la=["device","server","switch","router"],wd=[...la,"vertical-pdu"],Nd=new Set(la),kd=new Set(wd);function er(e){return typeof e=="string"&&Nd.has(e)}function xd(e){return typeof e=="string"&&kd.has(e)}function kt(e){return !!e&&er(e.type)}function Do(e){return !!e&&xd(e.type)}function ua(e){return typeof e=="string"&&e.trim().length>0}function An(e){let{ports:t,rearPorts:o}=Ze(e),r=Zo(t)>0||ua(e.frontImageUrl),n=Zo(o)>0||ua(e.rearImageUrl);if(r&&n)return "both";if(r)return "front";if(n)return "rear"}function pa(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let i=An(e);if(i)return i;if(e.view==="front"||e.view==="rear")return e.view;let a=o+r/2;return t>=a?"front":"rear"}var Pd=24;function Cd(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function _e(e){return Cd(e)==="split-face"}function St(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:Pd}function xt(e){return e?.rackWidthPx||300}function Ut(e){return xt(e)*1.75/19}function Dr(e){let t=xt(e);return _e(e)?t*2+St(e):t}function Pt(e){let t=e?.uHeight??42,o=Ut(e);return {width:Dr(e),height:60+t*o}}function Ln(e){return e.map(t=>{if(t.type!=="rack")return t;let o=Pt(t.data);return t.width===o.width&&t.height===o.height?t:{...t,width:o.width,height:o.height}})}function je(e){if(e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both")return e.mountMode;let t=An(e??{});return t||"both"}function zt(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Sr(e,t){let o=new Set(zt(e));return zt(t).some(n=>o.has(n))}function Ir(e,t){return _e(e)&&je(t)==="front"?xt(e)+St(e):0}function fa(e,t){return _e(e)&&je(t)==="both"?Dr(e):xt(e)}var ga=e=>{if(typeof e.parentId=="string")return e.parentId;if(typeof e.parentNode=="string")return e.parentNode},It=(e,t)=>typeof e=="number"&&Number.isFinite(e)&&e>0?Math.floor(e):t,Td=()=>"bottom-up",oo=e=>e.data.uNumberingDirection||Td(),Fr=(e,t,o)=>o==="bottom-up"?t-e+1:e,Hr=(e,t,o)=>o==="bottom-up"?t-e+1:e;var _r=(e,t,o,r)=>{let n=ga(e);if(!n||n!==t.id)return o;let i=It(e.data.uHeight,1),a=It(t.data.uHeight,42),s=oo(t),c=Ut(t.data),l=60,b=o.y-l,f=Math.round(b/c)+1,p;s==="bottom-up"?p=Fr(f,a,s)-i+1:p=Fr(f,a,s);let u=a-i+1,h=Math.max(1,Math.min(u,p));if(s==="top-down"&&p<=1&&(h=1),!to(t,e,h,r)){let N=Mr(t,e,r,h);if(N!==void 0)h=N;else {let k=It(e.data.uPosition,0);if(k>0&&to(t,e,k,r))h=k;else return {x:Ir(t.data,e.data),y:e.position?.y??o.y,uPosition:k>0?k:void 0}}}let x;if(s==="bottom-up"){let N=h+i-1,k=Hr(N,a,s);x=l+(k-1)*c-1;}else {let N=Hr(h,a,s);x=l+(N-1)*c-1;}return {x:Ir(t.data,e.data),y:x,uPosition:h}},to=(e,t,o,r)=>{let n=It(t.data.uHeight,1),i=It(e.data.uHeight,42);if(o<1||o+n-1>i)return false;let a=r.filter(l=>er(l.type)&&ga(l)===e.id&&l.id!==t.id),s=_e(e.data),c=je(t.data);for(let l of a){let b=It(l.data.uPosition,1),f=It(l.data.uHeight,1),p=o,u=o+n-1,h=b,x=b+f-1;if(p<=x&&u>=h){if(s){let N=je(l.data);if(!Sr(c,N))continue}return false}}return true},Mr=(e,t,o,r=1)=>{let n=It(t.data.uHeight,1),a=It(e.data.uHeight,42)-n+1;if(a<1)return;let s=Number.isFinite(r)?Math.floor(r):1,c=Math.max(1,Math.min(a,s));for(let l=c;l<=a;l++)if(to(e,t,l,o))return l;for(let l=1;l<c;l++)if(to(e,t,l,o))return l},So=(e,t,o=1,r)=>{let n=60,i=oo(e),a=e.data.uHeight||42,s=Ut(e.data),c=Hr(t,a,i),l;if(i==="bottom-up"){let b=t+o-1,f=Hr(b,a,i);l=n+(f-1)*s-1;}else l=n+(c-1)*s-1;return {x:Ir(e.data,r),y:l}},ba=(e,t,o)=>{let r=e.data.uHeight||1,n=So(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}}},Ed=(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?ba(e,t,i):e};function Ct(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var On=({data:e,selected:t,id:o,onViewChange:r,onRackFaceChange:n,isDragOver:i=false})=>{let{label:a,ports:s=0,status:c="active",uHeight:l=42,face:b="front",customHeaderText:f}=e,p=_e(e),u=Ut(e),h=Dr(e),x=Pt(e),N=xt(e),k=St(e),T={width:`${N}px`,height:"100%",boxSizing:"border-box",border:"1px solid rgba(156,163,175,0.35)",borderRadius:"6px",flexShrink:0,display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"4px",fontSize:"8px",color:"#9ca3af",fontWeight:"bold",textTransform:"uppercase",letterSpacing:"0.06em"},{getNodes:E,setNodes:C}=useReactFlow(),y=E(),[D,M]=useState(e.showUMarkers!==void 0?e.showUMarkers:true),O=()=>{let ee=oo({data:e})==="bottom-up"?"top-down":"bottom-up";C(V=>V.map(K=>K.id===o?{...K,data:{...K.data,uNumberingDirection:ee}}:K));},L=()=>{if(p)return;let A=b==="front"?"rear":"front";n?n(o,A):r?y.filter(V=>V.parentId===o).forEach(V=>{r(V.id,A);}):C(ee=>ee.map(V=>V.id===o?{...V,data:{...V.data,face:A}}:V.parentId===o?{...V,data:{...V.data,view:A}}:V));},z=()=>{let A=[],ee=60,V=oo({data:e});for(let K=1;K<=l;K++){let ie=ee+(K-1)*u-4,B=Fr(K,l,V);A.push(jsx("div",{style:{position:"absolute",left:"-35px",top:`${ie}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:`${u}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:B},K));}return A};return jsxs("div",{"data-testid":"rack-node",className:`rack-node ${t?"selected":""} ${i?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${Ct(c)}`,borderRadius:"8px",padding:0,width:`${h}px`,height:`${x.height}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:[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:[jsx("div",{style:{fontWeight:"bold",marginBottom:"4px"},children:a}),jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[f?jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:f}):jsxs("span",{children:[typeof s=="number"?s:0," ports"]})," \u2022 ",l,"U \u2022 ",p?"rear|front":b]}),jsxs("div",{style:{display:"flex",gap:"4px",position:"absolute",top:"4px",right:"4px"},children:[jsx("button",{onPointerDown:A=>{A.stopPropagation();},onMouseDown:A=>{A.stopPropagation();},onClick:A=>{A.stopPropagation(),A.preventDefault(),M(!D);},style:{background:D?"#10b981":"#374151",color:D?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${D?"Hide":"Show"} U markers`,children:"U"}),jsx("button",{onPointerDown:A=>{A.stopPropagation();},onMouseDown:A=>{A.stopPropagation();},onClick:A=>{A.stopPropagation(),A.preventDefault(),O();},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 ${oo({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:oo({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),!p&&jsx("button",{onPointerDown:A=>{A.stopPropagation();},onMouseDown:A=>{A.stopPropagation();},onClick:A=>{A.stopPropagation(),A.preventDefault(),L();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${b==="front"?"rear":"front"} view`,children:b==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${l*u}px`,overflow:"hidden"},children:p&&jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none",display:"flex",alignItems:"stretch"},children:[jsx("div",{"data-testid":"rack-face-rear",style:{...T,background:"linear-gradient(180deg, rgba(17,24,39,0.22) 0%, rgba(17,24,39,0.12) 100%)"},children:"Rear"}),jsx("div",{"data-testid":"rack-face-gap",style:{width:`${k}px`,display:"flex",justifyContent:"center",alignItems:"stretch",flexShrink:0},children:jsx("div",{"data-testid":"rack-face-divider",style:{width:"1px",height:"100%",background:"rgba(156,163,175,0.22)",borderRadius:"999px"}})}),jsx("div",{"data-testid":"rack-face-front",style:{...T,background:"linear-gradient(180deg, rgba(17,24,39,0.32) 0%, rgba(17,24,39,0.18) 100%)"},children:"Front"})]})}),D&&jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:z()})]})};var Bn=({data:e,selected:t})=>{let{label:o,status:r="active"}=e;return jsxs("div",{className:`fiber-node ${t?"selected":""}`,style:{background:"#1f2937",border:`2px solid ${Ct(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:[jsx(Handle,{type:"target",position:Position.Top}),jsx(Handle,{type:"source",position:Position.Bottom}),jsx(Handle,{type:"target",position:Position.Left}),jsx(Handle,{type:"source",position:Position.Right}),jsx("div",{style:{textAlign:"center"},children:jsx("div",{style:{fontSize:"8px",lineHeight:"1.2"},children:o})}),jsx("div",{style:{position:"absolute",bottom:"4px",left:"50%",transform:"translateX(-50%)",width:"8px",height:"8px",background:Ct(r),borderRadius:"50%"}})]})};var ma=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function Ke(e){let t=(e-1)%12;return ma[t]}function no(e){return e>12}function Ft(e,t){let o=t?.base??Ke(e),r=t?.striped??no(e),n=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:n}}function Wn(e){let t=Ft(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function io(e){return Ke(e)}function Ht(e){return e.map(t=>({base:Ke(t),striped:no(t)}))}function Id(e,t,o,r,n,i,a,s){let c=Ht(o),l=c.length,b=r?1.2:1,f=!!s?.highlight,p=r?2:1.5,u=s?.highlightWidth??p*3,h=s?.highlightColor??c[0]?.base??"#22d3ee";return jsxs(Fragment,{children:[f&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:h,strokeWidth:u,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${p}px`,"--rn-edge-highlight-to":`${u}px`}}),c.map((x,N)=>{let T=(l-N)*b;return jsx("path",{d:t,stroke:x.base,strokeWidth:T,fill:"none",strokeLinecap:"butt",opacity:x.striped?.9:1,style:n},`${e}-ribbon-${N}`)}),c.some(x=>x.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&s&&(s.bandwidth||s.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${i}px,${a}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:[s.bandwidth&&jsx("div",{children:s.bandwidth}),s.length&&jsxs("div",{children:[s.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var Lr=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:l={},className:b})=>{let[f,p,u]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a}),{bandwidth:h,length:x,color:N="#00FFFF",striped:k=false,ribbonFiberIds:T,isRibbon:E,highlight:C,highlightColor:y,highlightWidth:D}=s||{},M=!!C;if((E||T&&T.length>=6&&T.length<=12)&&T)return Id(e,f,T,c??false,l??{},p,u,s);let L=c?3:2,z=D??L*3,A={...l,stroke:N,strokeWidth:L,strokeDasharray:"none"};return jsxs(Fragment,{children:[M&&jsx(BaseEdge,{id:`${e}-highlight`,path:f,style:{...l,stroke:y??N,strokeWidth:z,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${L}px`,"--rn-edge-highlight-to":`${z}px`}}),jsx(BaseEdge,{id:e,path:f,style:A}),k&&jsx(BaseEdge,{id:`${e}-stripe`,path:f,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsx(EdgeLabelRenderer,{children:c&&s&&(h||x)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${p}px,${u}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${N}`,pointerEvents:"none",zIndex:9999},children:[h&&jsx("div",{children:h}),x&&jsxs("div",{children:[x,"m"]})]})})]})};var zn=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,style:s={},data:c,markerEnd:l})=>{let[b]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a}),f=c?.connectorType||"C13",p=c?.metadata??{},u=typeof c?.powerStrokeWidth=="number"?c.powerStrokeWidth:typeof p.strokeWidth=="number"?p.strokeWidth:void 0,h=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof p.strokeDasharray=="string"?p.strokeDasharray:void 0,x=typeof c?.powerOpacity=="number"?c.powerOpacity:typeof p.opacity=="number"?p.opacity:void 0;return jsx(BaseEdge,{id:e,path:b,markerEnd:l,style:(()=>{let T=u??(f==="C19"?5:3),E=h??(f==="C19"?"none":"6,3");return {...{stroke:c?.color||"#f59e0b",strokeWidth:T,strokeLinecap:"round",strokeLinejoin:"round",...x!==void 0?{opacity:x}:{}},strokeDasharray:E,...s}})()})};function Ad(e,t,o,r,n,i,a,s,c,l,b){let f=Ht(s),p=f.length,u=c?1.8:1.5,h=!!b?.highlight,x=c?3:2.5,N=b?.highlightWidth??x*3,k=b?.highlightColor??f[0]?.base??"#22d3ee",[T,E,C]=getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a});return jsxs(Fragment,{children:[h&&jsx(BaseEdge,{id:`${e}-highlight`,path:T,style:{...l,stroke:k,strokeWidth:N,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${x}px`,"--rn-edge-highlight-to":`${N}px`}}),f.map((y,D)=>{let O=(p-D)*u;return jsx("path",{d:T,stroke:y.base,strokeWidth:O,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:l},`${e}-ribbon-${D}`)}),f.some(y=>y.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:T,style:{...l,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:c&&b&&(b.bandwidth||b.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${E}px,${C}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&&jsx("div",{children:b.bandwidth}),b.length&&jsxs("div",{children:[b.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[s.length,"F"]})]})})]})}var Na=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:l={},...b})=>{let{color:f="#00FFFF",ribbonFiberIds:p,isRibbon:u,highlight:h,highlightColor:x,highlightWidth:N}=s||{},k=!!h;if((u||p&&p.length>=6&&p.length<=12)&&p)return Ad(e,t,o,r,n,i,a,p,c??false,l??{},s);let E=c?4:3,C=N??E*3,y={...l,stroke:f,strokeWidth:E};return jsxs(Fragment,{children:[k&&jsx(BaseEdge,{id:`${e}-highlight`,path:getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a})[0],style:{...l,stroke:x??f,strokeWidth:C,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${E}px`,"--rn-edge-highlight-to":`${C}px`}}),jsx(SmoothStepEdge,{...b,id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:y})]})};function Od({sourceX:e,sourceY:t,targetX:o,targetY:r,sourcePosition:n,targetPosition:i}){let a=n===Position.Left||n===Position.Right,s;if(a){let c=(e+o)/2;s=`M ${e},${t} L ${c},${t} L ${c},${r} L ${o},${r}`;}else {let c=(t+r)/2;s=`M ${e},${t} L ${e},${c} L ${o},${c} L ${o},${r}`;}return s}function Bd(e,t,o,r,n,i){let a=Ht(o),s=a.length,c=r?1.2:1,l=!!i?.highlight,b=r?2:1.5,f=i?.highlightWidth??b*3,p=i?.highlightColor??a[0]?.base??"#22d3ee",u=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),h=u?(parseFloat(u[1])+parseFloat(u[3]))/2:0,x=u?(parseFloat(u[2])+parseFloat(u[4]))/2:0;return jsxs(Fragment,{children:[l&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:p,strokeWidth:f,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${b}px`,"--rn-edge-highlight-to":`${f}px`}}),a.map((N,k)=>{let E=(s-k)*c;return jsx("path",{d:t,stroke:N.base,strokeWidth:E,fill:"none",strokeLinecap:"butt",opacity:N.striped?.9:1,style:n},`${e}-ribbon-${k}`)}),a.some(N=>N.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&i&&(i.bandwidth||i.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${h}px,${x}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${a[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[i.bandwidth&&jsx("div",{children:i.bandwidth}),i.length&&jsxs("div",{children:[i.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var Pa=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:l={},...b})=>{let{color:f="#00FFFF",striped:p=false,ribbonFiberIds:u,isRibbon:h,highlight:x,highlightColor:N,highlightWidth:k}=s||{},T=!!x,E=Od({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a});if((h||u&&u.length>=6&&u.length<=12)&&u)return Bd(e,E,u,c??false,l??{},s);let y=c?3:2,D=k??y*3,M={...l,stroke:f,strokeWidth:y,strokeDasharray:"none"};return jsxs(Fragment,{children:[T&&jsx(BaseEdge,{id:`${e}-highlight`,path:E,style:{...l,stroke:N??f,strokeWidth:D,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${y}px`,"--rn-edge-highlight-to":`${D}px`}}),jsx(BaseEdge,{id:e,path:E,style:M}),p&&jsx(BaseEdge,{id:`${e}-stripe`,path:E,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var Ea=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,style:s={},data:c,markerEnd:l,selected:b})=>{let{color:f="#6366f1",label:p,highlight:u,highlightColor:h,highlightWidth:x}=c||{},N=!!u,k=8,T=x??k*1.8,[E,C,y]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a}),D={...s,stroke:f,strokeWidth:k,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxs(Fragment,{children:[N&&jsx(BaseEdge,{id:`${e}-highlight`,path:E,style:{...s,stroke:h??f,strokeWidth:T,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${h??f}) drop-shadow(0 0 16px ${h??f})`,"--rn-edge-highlight-from":`${k}px`,"--rn-edge-highlight-to":`${T}px`}}),jsx(BaseEdge,{id:e,path:E,markerEnd:l,style:D}),p&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${C}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:p})})]})};var Ra=(o=>(o.FULL="full",o.HALF="half",o))(Ra||{});function Vd(e,t,o){return Math.max(t,Math.min(o,e))}function va(e){let t=(e??"center").trim().toLowerCase();if(t.endsWith("%")){let r=Number.parseFloat(t.slice(0,-1));if(Number.isFinite(r))return {mode:"percent",value:Vd(r/100,0,1)}}if(t.endsWith("px")){let r=Number.parseFloat(t.slice(0,-2));if(Number.isFinite(r))return {mode:"px",value:r}}if(t==="left"||t==="top")return {mode:"percent",value:0};if(t==="right"||t==="bottom")return {mode:"percent",value:1};if(t==="center")return {mode:"percent",value:.5};let o=Number.parseFloat(t);return Number.isFinite(o)?{mode:"px",value:o}:{mode:"percent",value:.5}}function Xd(e){let t=(e??"center").trim().split(/\s+/).filter(Boolean);if(t.length===0)return ["center","center"];if(t.length===1){let o=t[0].toLowerCase();return o==="top"||o==="bottom"?["center",o]:o==="left"||o==="right"?[o,"center"]:[o,"center"]}return [t[0],t[1]]}function Da(e,t,o){return o.mode==="px"?o.value:(e-t)*o.value}function Sa(e,t){return t===true||e==="fill"?"100% 100%":e==="none"?"auto":e==="contain-height"?"auto 100%":e==="scale-down"?"contain":e??"cover"}function Gn(e,t,o,r,n){if(!o||o.width<=0||o.height<=0)return;let i=o.width,a=o.height;if(r==="100% 100%")i=e,a=t;else if(r==="auto 100%"){let l=t/o.height;i=o.width*l,a=o.height*l;}else if(r==="cover"||r==="contain"){let l=r==="cover"?Math.max(e/o.width,t/o.height):Math.min(e/o.width,t/o.height);i=o.width*l,a=o.height*l;}let[s,c]=Xd(n);return {width:i,height:a,offsetX:Da(e,i,va(s)),offsetY:Da(t,a,va(c))}}var Yd="#6b7280",Kd="#374151",Vn="#10b981",qd="100% 100%",Br=1,Zd={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},Jd=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,Qd=/^data:image\//i,el=typeof window<"u"?Re.useLayoutEffect:Re.useEffect,Fa=new Map;function tl(e){return (e??"").toLowerCase().replace(/_/g,"-")}function ol(e){return !Jd.test(e)&&!e.startsWith("//")}function Ha(e){if(!e)return;let t=e.trim();if(t){if(ol(t))return t;try{let o=new URL(t),r=o.protocol.toLowerCase(),n=o.hostname.toLowerCase();return r==="https:"||r==="blob:"||r==="http:"&&(n==="127.0.0.1"||n==="localhost")?o.href:r==="data:"&&Qd.test(t)?t:void 0}catch{return}}}function rl(e){return `url(${JSON.stringify(e)})`}function Fo(e){return rt(e.type)}function jn(e,t){if(typeof e.connectorType=="string"&&e.connectorType.trim().length>0)return e.connectorType;let o=String(e.type??"").toLowerCase();return o.includes("c19")||o.includes("c20")?"C19":o.includes("c13")||o.includes("c14")?"C13":o.includes("power_ac")?"AC":En(t)}function _a(e,t){return Eo(e,t)}function nl(e,t,o,r,n){let i=t.length>0||!!r,a=o.length>0||!!n;return e||(i?"front":a?"rear":"front")}function il(e){let t=Fa.get(e);if(t)return t;let o=new Promise(r=>{if(typeof Image>"u"){r(void 0);return}let n=new Image;n.decoding="async",n.onload=()=>{if(n.naturalWidth>0&&n.naturalHeight>0){r({width:n.naturalWidth,height:n.naturalHeight});return}r(void 0);},n.onerror=()=>r(void 0),n.src=e;});return Fa.set(e,o),o}function Ma(e){let[t,o]=Re.useState(void 0);return Re.useEffect(()=>{let r=false;return e?(il(e).then(n=>{r||o(n);}),()=>{r=true;}):(o(void 0),()=>{r=true;})},[e]),t}function al(e){return Fo(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?Vn:e.cableType?Zd[e.cableType]??Vn:Vn}function sl(e){return e.connected?al(e):Yd}function $a(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 cl(e,t,o,r){let n=e<=3||t<=3,i=n?0:.5;return {width:`${e}px`,height:`${t}px`,minWidth:n?`${e}px`:void 0,minHeight:n?`${t}px`:void 0,background:o,border:`${i}px solid ${r}`,boxSizing:"border-box",borderRadius:"1px",cursor:"pointer",zIndex:2}}function Xn(e){let t=Math.max(5,Math.min(7,Math.round(e*.02))),o=Math.max(4,Math.min(5,Math.round(t*.7)));return {width:t,height:o}}function Ba(e){return e.type==="console"||e.type==="usb"}function Wa(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(4,Math.min(5,Math.round(t*.6)))}}function za(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(3,Math.min(4,Math.round(t*.5)))}}function dl(e,t){if(e.type!=="fiber")return;let o=t.toLowerCase(),r=e.label.toLowerCase(),n=String(e.id??"").toLowerCase(),i=`${o} ${r} ${n}`;return /osfp/.test(i)?"osfp":/qsfp(?:[-+ ]?dd|28|56|112)?/.test(i)?"qsfp":/sfp(?:\+|28|56)?|xfp/.test(i)?"sfp":/^et-/.test(r)||/^ethernet\d+\/\d+$/.test(r)?"qsfp":("sfp")}function Ua(e,t){let o=t.toLowerCase(),r=e.label.toLowerCase(),n=String(e.id??"").toLowerCase(),i=`${o} ${r} ${n}`;return !!(/rj45|8p8c/.test(i)||e.type==="ethernet"||e.type==="mgmt")}function ir(e){return Math.max(0,Math.min(100,e))}function Se(e,t,o){return Math.max(t,Math.min(o,e))}function Aa(e,t,o){let r=dl(e,t);if(r==="sfp"){let n=Se(Math.round(o.width*1.35),8,9);return {width:n,height:Se(Math.round(n/1.55),5,6)}}if(r==="qsfp"){let n=Se(Math.round(o.width*2),12,14);return {width:n,height:Se(Math.round(n/2.15),5,7)}}if(r==="osfp"){let n=Se(Math.round(o.width*2.4),15,17);return {width:n,height:Se(Math.round(n/1.7),8,10)}}if(Ua(e,t)){let n=Se(Math.round(o.width*1.35),8,9);return {width:n,height:Se(Math.round(n/2),4,5)}}return e.type==="usb"?za(o):Ba(e)?Wa(o):o}function zr(e){return typeof e.position?.xPercent=="number"&&typeof e.position?.yPercent=="number"}function ll(e,t,o,r){if(!zr(e))return;let n=ir(e.position?.xPercent),i=ir(e.position?.yPercent),a=r?.width??t,s=r?.height??o,c=r?.offsetX??0,l=r?.offsetY??0;return {x:c+a*n/100,y:l+s*i/100}}function La(e,t,o,r){let n=Xn(t),i=e.flatMap(N=>N.ports.filter(k=>!Fo(k)).map(k=>ll(k,t,o,r)).filter(k=>k!==void 0));if(i.length<2)return n;let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Math.max(n.height*.75,3),l=Math.max(n.width*.75,3);for(let N=0;N<i.length;N+=1){let k=i[N];for(let T=N+1;T<i.length;T+=1){let E=i[T],C=Math.abs(k.x-E.x),y=Math.abs(k.y-E.y);y<=c&&C>0&&(a=Math.min(a,C)),C<=l&&y>0&&(s=Math.min(s,y));}}let b=r?Se(n.width*.65,2.5,4.5):2,f=r?Se(n.height*.95,5,7.5):2,p=r?n.width*.9:n.width,u=Number.isFinite(a)?Se(a-b,r?2.5:3,p):p,h=r?Math.min(n.height*.48,u*.88):n.height,x=Number.isFinite(s)?Se(s-f,r?1.5:3,h):h;return {width:u,height:x}}function ul(e){switch(e){case "top":return Position.Top;case "right":return Position.Right;case "bottom":return Position.Bottom;case "left":return Position.Left;default:return Position.Top}}function pl(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 fl(e,t,o,r,n,i,a,s){if(!e.position)return;if(typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number"){let N=ir(e.position.xPercent),k=ir(e.position.yPercent),T=e.position.side??pl(N,k),E=i?.width??r,C=i?.height??n,y=i?.offsetX??0,D=i?.offsetY??0,M=t/2+Br,O=Math.max(M,r-t/2),L=o/2+Br,z=Math.max(L,n-o/2),A=y+E*N/100,ee=D+C*k/100,V=i?A:Se(A,M,O),K=i?ee:Se(ee,L,z);return {position:ul(T),style:{left:`${V-t/2-Br}px`,top:`${K-o/2-Br}px`,right:"initial",bottom:"initial",transform:"none"}}}if(!e.position.side)return;let l=e.position.side,b=typeof e.position.offsetPercent=="number"?ir(e.position.offsetPercent):void 0,f=typeof e.position.offsetPx=="number"?e.position.offsetPx:void 0,p=t/2,u=Math.max(p,r-t/2),h=o/2,x=Math.max(h,n-o/2);switch(l){case "top":{let N=f!==void 0?f:r*(b??50)/100,k=Se(N,p,u);return {position:Position.Top,style:{top:"0px",left:`${k}px`,right:void 0,bottom:void 0,transform:"translate(-50%, 50%)"}}}case "bottom":{let N=f!==void 0?f:r*(b??50)/100,k=Se(N,p,u);return {position:Position.Bottom,style:{bottom:"0px",left:`${k}px`,right:void 0,top:void 0,transform:"translate(-50%, -50%)"}}}case "left":{let N=f!==void 0?f:n*(b??50)/100,k=Se(N,h,x);return {position:Position.Left,style:{left:"0px",top:`${k}px`,right:void 0,bottom:void 0,transform:"translate(50%, -50%)"}}}case "right":{let N=f!==void 0?f:n*(b??50)/100,k=Se(N,h,x);return {position:Position.Right,style:{right:"0px",top:`${k}px`,left:void 0,bottom:void 0,transform:"translate(-50%, -50%)"}}}default:return}}function Ga(e,t,o,r){let n=o/2,i=Math.max(n,r-o/2);return t===1?(n+i)/2:n+e*(i-n)/(t-1)}function Va(e,t,o,r){let n=e%2===0,i=Math.ceil(t/2),a=Math.floor(t/2),s=Math.max(n?i:a,1),c=Math.floor(n?e/2:(e-1)/2),l=Ga(c,s,o,r);return n?{position:Position.Top,style:{transform:"translateY(50%)",left:`${l-o/2}px`}}:{position:Position.Bottom,style:{transform:"translateY(-50%)",left:`${l-o/2}px`}}}function Oa(e,t,o,r,n,i){let a=e%2===0,s=Math.ceil(t/2),c=Math.floor(t/2),l=Math.max(a?s:c,1),b=Math.floor(a?e/2:(e-1)/2),f=Ga(b,l,o,n),p=1,u=Se(Math.round(r*.75),1,4),h=Math.max(p,i-r-1),x=Se(p+r+u,p,h),N=a?p:x;return {position:Position.Top,style:{transform:"none",left:`${f-o/2}px`,top:`${N}px`,right:void 0,bottom:void 0}}}function gl(e,t,o,r,n){let i=jn(e,n),a=Ot(i),s;if(r<=20){let b=Math.max(2,r-a.height-2);s=`${o<=1?(2+b)/2:2+t*(b-2)/(o-1)}px`;}else s=`${25+t*50}%`;return {position:Position.Right,style:{transform:"translateX(-50%)",top:s,width:`${a.width}px`,height:`${a.height}px`,background:a.color,border:`1px solid ${a.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:a.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:a.borderRadius,clipPath:a.clipPath}}}function bl(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:Position.Top,style:{transform:"translateY(50%)",left:`${i}px`,right:void 0}}}return Va(e,t,o,r)}function ml(e,t,o,r,n,i,a,s,c){if(s==="patch-panel"||s==="switch")return Va(t,o,r,i);if(Fo(e)){let f=jn(e,c),p=Ot(f),u;if(a<=20){let N=Math.max(2,a-p.height-2);u=`${o<=1?(2+N)/2:2+t*(N-2)/(o-1)}px`;}else u=`${25+t*50}%`;return {position:Position.Left,style:{transform:"translateX(50%)",top:u,width:`${p.width}px`,height:`${p.height}px`,background:p.color,border:`1px solid ${p.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:p.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:p.borderRadius,clipPath:p.clipPath}}}return {position:Position.Right,style:{transform:"translate(-50%, -50%)",top:`${Se(o<=1?a/2:n/2+t*Math.max(a-n,0)/Math.max(o-1,1),n/2,Math.max(n/2,a-n/2))}px`}}}function hl(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 Ho=({id:e,data:t,selected:o})=>{let r=useUpdateNodeInternals(),{label:n,status:i="active",deviceType:a="server",manufacturer:s,uHeight:c=1,width:l="full",view:b,rackWidthPx:f,frontImageUrl:p,rearImageUrl:u,imageFit:h,imagePosition:x,imageRepeat:N,stretchToFit:k}=t,{ports:T,rearPorts:E}=Re.useMemo(()=>Ze(t),[t]),C=tl(a),y=f??300,D=t.isRackMounted===true&&h===void 0&&k!==true,M=Re.useMemo(()=>Sa(D?"fill":h,k),[h,D,k]),O=Re.useMemo(()=>Ha(p),[p]),L=Re.useMemo(()=>Ha(u),[u]),z=Ma(O),A=Ma(L),ee=_e(t),V=je(t),K=nl(b??bt(t),T,E,p,u),ie=Re.useMemo(()=>ee?zt(V):[K],[ee,V,K]),B=ie[0]??K,U=ee&&V==="both",W=t.isRackMounted===true?Ut(t):20,$=c*W,J=St(t),te=y+J,_=Re.useMemo(()=>Gn(y,$,z,M,x??"center"),[y,$,z,M,x]),F=Re.useMemo(()=>Gn(y,$,A,M,x??"center"),[y,$,A,M,x]),ae=Re.useMemo(()=>B==="rear"?F:_,[B,_,F]),de=B==="rear"?!!L:!!O,ne=t.isRackMounted===true&&de&&!U,j=B==="rear"?E:T,Te=Re.useMemo(()=>j.flatMap(se=>se.ports).filter(se=>!Fo(se)),[j]),Ie=Re.useMemo(()=>!ne||!((C==="switch"||C==="patch-panel"||C==="router")&&Te.length>=24)?false:Te.every(fe=>zr(fe)),[Te,C,ne]),ve=Re.useMemo(()=>[ee?"split":"single",V,ie.join(","),B,C,n,M,x??"center",_?`${_.width}:${_.height}:${_.offsetX}:${_.offsetY}`:"",F?`${F.width}:${F.height}:${F.offsetX}:${F.offsetY}`:"",$.toString(),y.toString(),te.toString(),$a(T),$a(E)].join("|"),[ee,V,ie,B,C,n,M,x,_,F,$,y,te,T,E]);el(()=>{r(e);},[ve,e,r]);let he=Re.useCallback(se=>{let fe=se==="rear"?L:O;return fe?{backgroundImage:rl(fe),backgroundSize:M==="100% 100%"?qd:M,backgroundPosition:x??"center",backgroundRepeat:N??"no-repeat"}:{}},[L,O,M,x,N]),nt=Re.useMemo(()=>he("front"),[he]),Qe=Re.useMemo(()=>he("rear"),[he]),Yt=B==="rear"?Qe:nt,be,pt;if(ee)be=`${fa(t,t)+4}px`,pt=void 0;else {let se=y+4,fe=Math.floor(y/2);be=l==="half"?`${fe}px`:`${se}px`,pt=l==="half"?`${fe}px`:void 0;}let it=C==="server"&&c===1,hr=Ct(i),Ee={"--rn-device-bg-image":U?"none":String(Yt.backgroundImage??"none"),"--rn-device-bg-position":String(Yt.backgroundPosition??"center"),"--rn-device-bg-repeat":String(Yt.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(Yt.backgroundSize??"cover"),"--rn-device-border-color":hr,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${$}px`,"--rn-device-left":pt??"auto","--rn-device-status-color":hr,"--rn-device-translate-y":it?"-1px":"0px","--rn-device-width":be},Me=Re.useMemo(()=>{if(!ne)return;let se={position:"absolute",top:"2px",zIndex:2,padding:0,justifyContent:"flex-start",pointerEvents:"none"},fe=c>1?24:8;if(!ae)return Ie?{...se,display:"none"}:{...se,left:"4px",right:`${fe}px`,alignItems:"flex-start"};let $e=4,Oe=Math.max(0,Math.floor(ae.offsetX)-$e),ct=Math.max(0,Math.floor(y-(ae.offsetX+ae.width))-$e);if(Math.max(Oe,ct)>=56){let dt=ct>Oe;return {...se,left:dt?"auto":`${$e}px`,right:dt?`${$e}px`:"auto",width:`${Math.max(48,Math.max(Oe,ct))}px`,alignItems:dt?"flex-end":"flex-start"}}return Ie?{...se,display:"none"}:{...se,left:"4px",right:`${fe}px`,alignItems:"flex-start"}},[ae,y,Ie,c,ne]),Kt=Re.useMemo(()=>{let se=new Set;for(let fe of T)for(let $e of fe.ports)se.add(_a(fe.name,$e));return se},[T]),yo=Re.useCallback((se,fe)=>fe==="rear"&&U&&Kt.has(se)?`${se}--rear`:se,[Kt,U]),qt=Re.useCallback((se,fe,$e=0,Oe=y)=>{let ct=[];if(se.length===0)return ct;let dt=fe==="rear"?F:_,Zt=Xn(Oe),Go=!!(dt&&se.some(Fe=>Fe.ports.some(Ge=>!Fo(Ge)&&zr(Ge)))),{width:wo,height:ht}=C==="switch"||C==="patch-panel"?Go?La(se,Oe,$,dt):Xn(Oe):La(se,Oe,$,dt),Vo=se.reduce((Fe,Ge)=>Fe+Ge.ports.length,0),yt=(C==="switch"||C==="patch-panel")&&Vo>=24,yr=C!=="switch"&&C!=="patch-panel"&&Vo>=24;for(let Fe of se)for(let Ge=0;Ge<Fe.ports.length;Ge+=1){let Ne=Fe.ports[Ge],wr=_a(Fe.name,Ne),Rt=Fo(Ne),et=wo,at=ht;if(Rt){let ge=jn(Ne,n),Qt=Ot(ge);et=Qt.width,at=Qt.height;}else if(Ne.type==="usb"){let ge=za(Zt);et=ge.width,at=ge.height;}else if(dt&&zr(Ne)){let ge=Aa(Ne,Fe.name,Zt);et=yr?wo:ge.width,at=ge.height;}else if(Ua(Ne,Fe.name)){let ge=Aa(Ne,Fe.name,Zt);et=ge.width,at=ge.height;}else if(Ba(Ne)){let ge=Wa(Zt);et=ge.width,at=ge.height;}let Xo=sl(Ne),Nr=Ne.connected?Xo:Kd,fn=cl(et,at,Xo,Nr),kr=fe==="front"?Rt?gl(Ne,Ge,Fe.ports.length,$,n):yt?Oa(Ge,Fe.ports.length,et,at,Oe,$):bl(Ge,Fe.ports.length,et,Oe):!Rt&&yt?Oa(Ge,Fe.ports.length,et,at,Oe,$):ml(Ne,Ge,Fe.ports.length,et,at,Oe,$,C,n),No=fl(Ne,et,at,Oe,$,dt),Jt=No?Rt?{position:No.position,style:{...kr.style,...No.style}}:No:kr,G={...{...fn,...Jt.style}};G.left!==void 0&&$e!==0&&(typeof G.left=="number"?G.left=`${G.left+$e}px`:G.left=`calc(${G.left} + ${$e}px)`),U&&G.left===void 0&&(Jt.position===Position.Left?(G.left=`${$e}px`,G.right=void 0):Jt.position===Position.Right&&(G.left=`${$e+Oe}px`,G.right=void 0));let wt=yo(wr,fe),oe=hl(Rt,C,fe,Ne.connected);if(oe.secondary){let ge=C==="switch"||C==="router"?{...G,background:"transparent",border:"none",opacity:0}:G,Qt=C==="switch"||C==="router"?`${Fe.name} - ${Ne.label} (input) ${Ne.connected?"(connected)":"(disconnected)"}`:`${Fe.name} - ${Ne.label} (${oe.secondary}) ${Ne.connected?"(connected)":"(disconnected)"}`;ct.push(jsx(Handle,{id:`${wt}-${oe.secondary}`,type:oe.secondary,position:Jt.position,style:ge,title:Qt},`${wt}-${oe.secondary}`));}ct.push(jsx(Handle,{id:wt,type:oe.primary,position:Jt.position,style:G,title:`${Fe.name} - ${Ne.label} ${Ne.connected?"(connected)":"(disconnected)"}`,children:Rt?Ge+1:void 0},wt));}return ct},[$,y,_,n,C,F,yo,U]),Uo=Re.useMemo(()=>{let se=[];for(let fe of ie){if(fe==="front"&&T.length>0){let $e=U?te:0;se.push(...qt(T,"front",$e,y));}fe==="rear"&&E.length>0&&se.push(...qt(E,"rear",0,y));}return se},[ie,T,E,qt,y,U,te]);return jsxs("div",{className:`device-node ${o?"selected":""} ${U?"device-node--split-both":""}`,style:Ee,children:[U&&jsxs("div",{className:"device-node__split-face-layer",style:{position:"absolute",inset:0,display:"flex",pointerEvents:"none",zIndex:0},children:[jsx("div",{className:"device-node__split-face device-node__split-face--rear",style:{width:`${y}px`,backgroundImage:String(Qe.backgroundImage??"none"),backgroundPosition:String(Qe.backgroundPosition??"center"),backgroundRepeat:String(Qe.backgroundRepeat??"no-repeat"),backgroundSize:String(Qe.backgroundSize??"cover")}}),jsx("div",{className:"device-node__face-bridge","data-testid":"device-face-bridge",style:{width:`${J}px`},children:jsx("div",{className:"device-node__face-bridge-line"})}),jsx("div",{className:"device-node__split-face device-node__split-face--front",style:{width:`${y}px`,backgroundImage:String(nt.backgroundImage??"none"),backgroundPosition:String(nt.backgroundPosition??"center"),backgroundRepeat:String(nt.backgroundRepeat??"no-repeat"),backgroundSize:String(nt.backgroundSize??"cover")}})]}),jsxs("div",{className:`device-node__content ${ne?"device-node__content--image-badge":""}`,style:Me??{position:"relative",zIndex:1},children:[jsx("div",{className:`device-node__label ${ne?"device-node__label--badge":""}`,children:n}),!ne&&c>1&&jsx("div",{className:"device-node__manufacturer",children:s})]}),c>1&&jsxs("div",{className:"device-node__u-indicator",children:[c,"U"]}),jsx("div",{className:"device-node__status-indicator"}),Uo]})};var Ur=20,_o=3,Vr=2,yl=1,Kn=2,ja=6,wl=12;function Yn(e){return Math.max(0,Math.min(100,e))}function qn(e,t,o){return Math.max(t,Math.min(o,e))}function Nl(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 Gr(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 kl(e,t){let o=Gr(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 xl(e){if(Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0)return e.pduPortGroups;let t=Sn(e);if(t.length>0)return t;let o=Dn(e);return o.length>0?o:[]}function Pl(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>Gr(Dt(r))??"C13"):Array.from({length:t},(o,r)=>{let n=Gr(e.portTypes?.[r]);return n||(Gr(Dt(r))??"C13")})}function Cl(e,t){let o=xl(e),r=Pl(e,t);if(o.length===0)return Array.from({length:t},(a,s)=>({id:`${s+1}`,label:`${s+1}`,connectorType:r[s]??"C13",groupName:"Power"}));let n=[],i=0;return o.forEach(a=>{a.ports.forEach(s=>{let c=r[i]??"C13";n.push({id:Eo(a.name,s),label:s.label,connectorType:kl(s,c),groupName:a.name,position:Bt(s.position)}),i+=1;});}),n}function Tl(e){return Ot(e.connectorType).height}function El(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t:Math.floor(t/2)}function Ya(e,t){let o=[],r=t>=0,n=r?qn(t,0,e.length):-1;for(let i=0;i<=e.length;i+=1)r&&i===n&&o.push({kind:"mgmt",height:wl}),i<e.length&&o.push({kind:"port",portIndex:i,height:Tl(e[i]),groupName:e[i].groupName});return o}function Ka(e,t){return e.kind==="port"&&t.kind==="port"?e.groupName===t.groupName?Kn:ja:Kn}function Rl(e,t){let o=Ya(e,t);if(o.length===0)return Math.max(Vr+_o+1,1);let r=0;for(let n=0;n<o.length;n+=1)r+=o[n].height,n<o.length-1&&(r+=Ka(o[n],o[n+1]));return Vr+r+_o}function vl(e,t,o){let r=Ya(e,o);if(r.length===0)return {portCenters:[]};let n=[];for(let x=0;x<r.length-1;x+=1)n.push(Ka(r[x],r[x+1]));let i=r.reduce((x,N)=>x+N.height,0),a=n.reduce((x,N)=>x+N,0),s=i+a,c=Math.max(t-Vr-_o,1),l=0,b=n,f=Math.max(0,c-s);if(f>0)if(n.length===0)l=f/2;else {let x=n.map(k=>k===ja?1.2:1),N=x.reduce((k,T)=>k+T,0);b=n.map((k,T)=>N<=0?k:k+f*x[T]/N);}let p=[],u,h=Vr+l;for(let x=0;x<r.length;x+=1){let N=r[x],k=h+N.height/2;N.kind==="mgmt"?u=k:p[N.portIndex]=k,h+=N.height,x<r.length-1&&(h+=b[x]??Kn);}return {portCenters:p,mgmtCenterY:u}}function Dl(e,t,o,r,n,i){if(!e)return {position:Position.Right,leftPx:Math.round((r-n)/2)-1,topPx:t-i/2};let a=e.side,s=a==="left"?Position.Left:a==="top"?Position.Top:a==="bottom"?Position.Bottom:Position.Right,c=typeof e.offsetPercent=="number"?Yn(e.offsetPercent):void 0,l=typeof e.offsetPx=="number"?e.offsetPx:void 0,b=typeof e.xPercent=="number"?Yn(e.xPercent):void 0,f=typeof e.yPercent=="number"?Yn(e.yPercent):void 0;if(b!==void 0&&f!==void 0){let h=a??Nl(b,f),x=h==="left"?Position.Left:h==="top"?Position.Top:h==="bottom"?Position.Bottom:Position.Right,N=Math.max(o-_o,1),k=r*b/100,T=qn(N*f/100,i/2,Math.max(i/2,o-i/2));return {position:x,leftPx:k-n/2,topPx:T-i/2}}let p=b!==void 0?r*b/100:r-n/2-1,u=f!==void 0?Math.max(o-_o,1)*f/100:t;return a==="top"||a==="bottom"?(l!==void 0?p=l:c!==void 0&&(p=r*c/100),u=a==="top"?i/2:o-i/2):(l!==void 0?u=l:c!==void 0&&(u=Math.max(o-_o,1)*c/100),a==="left"?p=n/2:a==="right"&&(p=r-n/2-1)),u=qn(u,i/2,Math.max(i/2,o-i/2)),{position:s,leftPx:p-n/2,topPx:u-i/2}}function Sl(e,t){return 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:[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"}),jsx(Handle,{type:"source",position: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 Jn=({data:e,selected:t})=>{let{label:o,status:r="active",heightCm:n=100,powerPorts:i=36,widthPx:a=15,mgmt_unit:s}=e,c=Math.max(0,i),l=Cl(e,c),b=El(s,l.length),f=n*4.2,p=Rl(l,b),u=Math.max(f-Ur,p),h=Math.max(a-yl*2,1),x=Ur+u,N=vl(l,u,b);return jsxs("div",{className:`vertical-pdu-node ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${Ct(r)}`,borderRadius:"2px",padding:0,width:`${a}px`,height:`${x}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 1px 3px rgba(0,0,0,0.3)",boxSizing:"border-box",position:"relative",display:"flex",flexDirection:"column"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"linear-gradient(90deg, #4a5568 0%, #2d3748 50%, #4a5568 100%)",padding:"2px",position:"relative",height:`${Ur}px`,display:"flex",flexDirection:"column",justifyContent:"center",borderBottom:"1px solid #4a5568"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"6px",color:"#e2e8f0"},children:o})}),jsxs("div",{style:{flex:1,background:"linear-gradient(180deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",position:"relative",minHeight:`${x-Ur}px`,overflow:"hidden"},children:[typeof N.mgmtCenterY=="number"?Sl(N.mgmtCenterY,h):null,l.map((k,T)=>{let E=N.portCenters[T]??u/2,C=Ot(k.connectorType),y=Dl(k.position,E,u,h,C.width,C.height);return jsx(Handle,{type:"source",position:y.position,id:k.id,style:{position:"absolute",left:`${y.leftPx}px`,top:`${y.topPx}px`,right:"initial",bottom:"initial",width:`${C.width}px`,height:`${C.height}px`,background:C.color,border:`1px solid ${C.borderColor}`,boxSizing:"border-box",transform:"none",cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:C.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:C.borderRadius,clipPath:C.clipPath},title:`${k.groupName} - ${k.label} (${k.connectorType})`,children:k.label},`handle-${k.id}`)})]})]})};var ti=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:n="single",ribbonFiberIds:i}=e||{},a=useEdges(),s=a.find(y=>y.target===o&&y.targetHandle==="left"),c=a.find(y=>y.source===o&&y.sourceHandle==="right"),l=a.find(y=>y.target===o&&y.targetHandle==="right"),b=c||l,f=s?.data?.color||"#555",p=b?.data?.color||"#555",u=n==="ribbon",h=s?.data?.ribbonFiberIds||i,x=b?.data?.ribbonFiberIds||i,N=u&&h?Ht(h):null,k=u&&x?Ht(x):null,T=!!s&&!!b;return jsxs("div",{className:`splice-node ${t?"selected":""}`,style:{width:u?85:69,height:u?20:16,borderRadius:8,border:"none",outline:"none",position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"none"},children:[u&&N&&k?jsxs("div",{style:{position:"absolute",inset:0,borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none",display:"grid",gridTemplateColumns:"1fr 1fr"},children:[jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:N.map((y,D)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`left-${D}`))}),jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:k.map((y,D)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`right-${D}`))})]}):jsxs("div",{style:{position:"absolute",inset:0,display:"grid",gridTemplateColumns:"1fr 1fr",borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none"},children:[jsx("div",{style:{background:f}}),jsx("div",{style:{background:p}})]}),jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),T&&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"&&jsxs("div",{className:"splice-text-label animate-in",style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",fontSize:u?8:9,fontFamily:"monospace",pointerEvents:"none",zIndex:3,fontWeight:"bold",gap:"2px"},children:[jsx("div",{children:`${r.toFixed(2)} dB`}),u&&i&&jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[i.length,"F"]})]}),jsx(Handle,{type:"target",position:Position.Left,id:"left",isConnectable:true,style:{width:12,height:u&&N?20:12,borderRadius:u&&N?"6px":"50%",border:"none",background:u&&N?`linear-gradient(to bottom, ${N.map(y=>y.base).join(", ")})`:f,zIndex:100,cursor:"crosshair",left:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"source",position:Position.Right,id:"right",isConnectable:true,style:{width:12,height:u&&k?20:12,borderRadius:u&&k?"6px":"50%",border:"none",background:u&&k?`linear-gradient(to bottom, ${k.map(y=>y.base).join(", ")})`:p,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"target",position:Position.Right,id:"right",isConnectable:true,style:{width:12,height:u&&k?20:12,borderRadius:u&&k?"6px":"50%",border:"none",background:u&&k?`linear-gradient(to bottom, ${k.map(y=>y.base).join(", ")})`:p,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var dr=20,Xr=36;var co=32,qa=4,Vt=12,Fl=69,lo=80,oi=(lo-Fl)/2;var ri=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",i=n?Xr:dr,a=n?32:16,s=co,c=o.y-s,l=Math.round(c/i)+1,f=Math.max(1,Math.min(Vt,l));if(!cr(t,e,f,r)){let h=lr(t,e,r,f);if(h!==f){let x=(i-a)/2;return {x:oi,y:s+(h-1)*i+x,holderPosition:h}}}let p=(i-a)/2,u=s+(f-1)*i+p;return {x:oi,y:u,holderPosition:f}},cr=(e,t,o,r)=>!r.filter(i=>i.parentId===e.id&&i.type==="splice"&&i.id!==t.id).some(i=>i.data.holderPosition===o),lr=(e,t,o,r=1)=>{for(let n=r;n<=Vt;n++)if(cr(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(cr(e,t,n,o))return n;return 1},Hl=(e,t)=>ur(e,t,false),ur=(e,t,o=false)=>{let r=co,n=o?Xr:dr,a=(n-(o?32:16))/2,s=r+(t-1)*n+a;return {x:oi,y:s}};var ai=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,n]=useState(false),i=()=>{if(!r)return null;let a=[],s=co;for(let c=1;c<=Vt;c++){let l=s+(c-1)*dr;a.push(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:`${dr}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",c]},c));}return a};return jsxs("div",{className:`splice-tray-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${lo}px`,height:`${co+Vt*Xr+qa}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:[jsxs("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#1f2937",padding:"2px",position:"relative",height:`${co}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"8px"},children:[jsx("div",{style:{fontWeight:"bold",fontSize:"10px"},children:o}),jsx("button",{onPointerDown:a=>{a.stopPropagation();},onMouseDown:a=>{a.stopPropagation();},onClick:a=>{a.stopPropagation(),a.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(),jsx("div",{style:{position:"absolute",top:co,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var si=({data:e,selected:t,id:o})=>{let{fibersPerTube:r=12,tubeIndex:n=1,startOn:i="left-center"}=e||{},a=e?.mode==="ribbon"||e?.ribbon===true,s=useEdges(),c=`tube-${n}`,l=s.find(V=>V.source===o&&V.sourceHandle===c||V.target===o&&V.targetHandle===c),b=l?.data?.color,f=Ke((n-1)%12+1),p=b||f,u=Math.max(1,Math.min(24,Number(r)||12)),h=14,x=4,N=1,k=2,T=20,E=u*h+(u-1)*x,C=Math.max(60,E+N*2+k*2),y=i==="left"?Position.Left:i==="right"?Position.Right:Position.Bottom,D=y!==Position.Bottom,M=D?14:20,O=D?8:20,L=D?`inset ${y===Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",z=l?p:D?`linear-gradient(${y===Position.Left?"to right":"to left"}, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)), ${p}`:`radial-gradient(circle, ${p} 40%, transparent 70%)`,A={width:M,height:O,borderRadius:D?6:"50%",opacity:l?.3:.9,pointerEvents:"auto",background:z,backgroundColor:p,border:l?`2px solid ${p}`:`3px dashed ${p}`,cursor:"crosshair","--fiber-bg":p,boxShadow:l?L:`${L}${L!=="none"?", ":""}0 0 8px ${p}`,transition:"opacity 0.2s, box-shadow 0.2s",...y===Position.Left?{left:-(M-4)}:y===Position.Right?{right:-(M-4)}:{}},ee=useMemo(()=>{let V=[],K=C-k*2-N*2,ie,B,U=false;i==="left"?(ie=N,B=Position.Top):i==="right"?(ie=N+K-E,B=Position.Top,U=true):(ie=N+(K-E)/2,B=Position.Top);for(let W=0;W<u;W++){let $=U?u-W:W+1,J=`fiber-${$}`,te=s.find(Ie=>Ie.source===o&&Ie.sourceHandle===J||Ie.target===o&&Ie.targetHandle===J),_=!!te&&(te.data?.isRibbon||te.data?.ribbonFiberIds&&Array.isArray(te.data.ribbonFiberIds)),F=te?.data?.color,ae=typeof te?.data?.striped=="boolean"?te.data.striped:void 0,de=Ft($);a||_?de=Ft($,{base:"#808080",striped:false}):(F||ae!==void 0)&&(de=Ft($,{...F?{base:F}:{},...ae!==void 0?{striped:ae}:{}}));let ne=ie+W*(h+x),j=N,Te={position:"absolute",left:`${ne}px`,top:`${j}px`,width:h,height:h,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":de.base,backgroundColor:de.base};de.backgroundImage&&(Te["--fiber-bg-image"]=de.backgroundImage),V.push(jsxs(Re.Fragment,{children:[jsx(Handle,{id:J,type:"target",position:B,className:"tube-fiber-handle",isConnectable:true,style:Te,"data-fiber-idx":$,"data-fiber-color":de.base}),jsx(Handle,{id:J,type:"source",position:B,className:"tube-fiber-handle",isConnectable:true,style:Te,"data-fiber-idx":$,"data-fiber-color":de.base})]},`fiber-${$}`));}return V},[u,i,C,s,o,h,x,N,k,E,a]);return jsxs("div",{style:{width:C,height:T,borderRadius:4,background:"#111827",border:`${k}px solid ${t?"#3b82f6":p}`,position:"relative",boxShadow:t?`0 0 0 ${k}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:N,boxSizing:"border-box",overflow:"visible"},children:[ee,jsx(Handle,{id:c,type:"target",position:y,isConnectable:true,className:"tube-connection-handle",style:A,"data-tube-idx":n,"data-tube-color":p,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"}),jsx(Handle,{id:c,type:"source",position:y,isConnectable:true,className:"tube-connection-handle",style:A,"data-tube-idx":n,"data-tube-color":p,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"})]})};var li=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:n,color:i,rotation:a}=e||{},s=Re.useRef(null);Re.useEffect(()=>{if(s.current){let B=typeof a=="number"?a:0;s.current.style.transform=`rotate(${B}deg)`,s.current.style.transformOrigin="center center";}},[a]);let c=Math.max(1,Math.min(24,Number(o)||12)),l=10,b=2,f=6,p=f+l+4,u=60,h=Math.max(120,c*(l+b)+f*2),N=n??`${c}f Cable`,k=r?`Cable ID ${r}`:void 0,T=Ke(1),E=i||T,C=t?"#3b82f6":E,y=typeof a=="number"?a:0,D=B=>{let U=(B%360+360)%360;return U>=315||U<45?Position.Top:U>=45&&U<135?Position.Right:U>=135&&U<225?Position.Bottom:Position.Left},M=()=>{let B=[],U=D(y);for(let W=0;W<c;W++){let $=W+1,J=Ft($),te=J.base,_=f+W*(l+b),F=-5,ae=J.backgroundImage?J.backgroundImage:te,de={position:"absolute",left:`${_}px`,top:`${F}px`,width:l,height:l,borderRadius:"50%",border:"none",background:ae,backgroundColor:te,zIndex:10,cursor:"pointer","--fiber-bg":te};J.backgroundImage&&(de["--fiber-bg-image"]=J.backgroundImage);let ne=`fiber-${$}`;B.push(jsxs(Re.Fragment,{children:[jsx(Handle,{id:ne,type:"target",position:U,className:"tube-fiber-handle",isConnectable:true,style:de,"data-fiber-idx":$,"data-fiber-color":te}),jsx(Handle,{id:ne,type:"source",position:U,className:"tube-fiber-handle",isConnectable:true,style:de,"data-fiber-idx":$,"data-fiber-color":te})]},`fiber-${$}`));}return B},O="cable-button",L=8,z={width:L,height:L,borderRadius:"50%",background:E,backgroundColor:E,border:`1px solid ${E}`,cursor:"pointer",zIndex:10},A=2,V=(B=>{let U=(B%360+360)%360;return U>=315||U<45?Position.Bottom:U>=45&&U<135?Position.Left:U>=135&&U<225?Position.Top:Position.Right})(y),K={width:h,height:u,position:"relative",transform:`rotate(${y}deg)`,transformOrigin:"center center","--rotation":`${y}deg`},ie={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${A}px solid ${C}`,boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:f,paddingTop:p,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2};return jsx("div",{ref:s,style:K,children:jsxs("div",{style:ie,children:[M(),jsx(Handle,{id:O,type:"source",position:V,className:"cable-button-handle",isConnectable:true,style:z,"data-handle-type":"cable-button","data-cable-color":E}),jsx(Handle,{id:O,type:"target",position:V,className:"cable-button-handle",isConnectable:true,style:z,"data-handle-type":"cable-button","data-cable-color":E}),jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2,transform:"translateX(2px)"},children:[jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:N}),k&&jsx("div",{style:{fontSize:10,opacity:.8},children:k})]})]})})};var pi=({data:e,selected:t})=>{let{tubeCount:o=12,fibersPerTube:r=12,fiberCount:n,cableId:i="CBL-002",label:a,tubeStartIndex:s=1,color:c}=e||{},l=Math.max(1,Math.min(24,Number(o)||12)),b=Math.max(1,Number(s)||1),f=14,p=10,u=3,h=6,x=h+p+4,N=60,k=Math.max(120,l*(f+u)+h*2),T=n??l*(Number(r)||12),E=a??`${T}f Cable`,C=i?`Cable ID ${i}`:void 0,y=Ke(b),D=c||y,M=t?"#3b82f6":D,O=()=>{let V=[];for(let K=0;K<l;K++){let ie=b+K,B=Ft(ie),U=B.base,W=h+K*(f+u),$=-5,J=B.backgroundImage?B.backgroundImage:U,te={position:"absolute",left:`${W}px`,top:`${$}px`,width:f,height:p,borderRadius:6,border:"none",background:J,backgroundColor:U,zIndex:10,cursor:"pointer","--fiber-bg":U};B.backgroundImage&&(te["--fiber-bg-image"]=B.backgroundImage);let _=`tube-${ie}`;V.push(jsxs(Re.Fragment,{children:[jsx(Handle,{id:_,type:"target",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,style:te,"data-fiber-idx":ie,"data-tube-idx":ie,"data-tube-color":U}),jsx(Handle,{id:_,type:"source",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,style:te,"data-fiber-idx":ie,"data-tube-idx":ie,"data-tube-color":U})]},`tube-${ie}`));}return V},L="cable-button",z=8,A={width:z,height:z,borderRadius:"50%",background:D,backgroundColor:D,border:`1px solid ${D}`,cursor:"pointer",zIndex:10};return jsxs("div",{style:{width:k,height:N,borderRadius:4,background:"#111827",border:`2px solid ${M}`,position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:h,paddingTop:x,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[O(),jsx(Handle,{id:L,type:"source",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,style:A,"data-handle-type":"cable-button","data-cable-color":D}),jsx(Handle,{id:L,type:"target",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,style:A,"data-handle-type":"cable-button","data-cable-color":D}),jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2},children:[jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:E}),C&&jsx("div",{style:{fontSize:10,opacity:.8},children:C})]})]})};var fi=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:n,label:i,portLabelsLeft:a,portLabelsRight:s}=e||{},c=useEdges(),l=typeof n=="number"&&[1,2,4].includes(n)?n:2,b=Math.max(1,Math.min(4,l)),f=9,p=3,u=3,h=60,x=30,N=b*f+(b-1)*p,k=Math.max(x,N+u*2),T=Math.max(h,80),E=(D,M)=>{let O=`${D}-${M+1}`;return c.find(z=>z.source===o&&z.sourceHandle===O||z.target===o&&z.targetHandle===O)?.data?.color||"#555"},C=D=>{let M=[],O=D==="left"?Position.Left:Position.Right,L=D==="left"?a:s;for(let z=0;z<b;z++){let A=z+1,ee=`${D}-${A}`,V=E(D,z),B=u+(k-N)/2+z*(f+p),U={position:"absolute",left:D==="left"?-5:void 0,right:D==="right"?-5:void 0,top:`${B}px`,width:f,height:f,borderRadius:"50%",border:"none",background:V,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};M.push(jsxs(Re.Fragment,{children:[jsx(Handle,{id:ee,type:"target",position:O,isConnectable:true,style:U}),jsx(Handle,{id:ee,type:"source",position:O,isConnectable:true,style:U})]},ee)),L&&L[z]&&M.push(jsx("div",{style:{position:"absolute",left:D==="left"?-30:void 0,right:D==="right"?-30:void 0,top:`${B}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:D==="left"?"right":"left",width:"25px"},children:L[z]},`${ee}-label`));}return M},y=i||`${r}-${b}f`;return jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:T,height:k,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:`${u}px`,boxSizing:"border-box"},children:[C("left"),jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:y})}),C("right")]})};var fo=32,en=30,Wl=24,zl=80,Jr=400,Qr=300,ns=2,po=8,is=120;function bi(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,a=3,s=60,c=30,l=r*n+(r-1)*i,b=Math.max(c,l+a*2);return {width:Math.max(s,80),height:b}}function tn(e){let{fibersPerTube:t=12}=e.data||{},o=Math.max(1,Math.min(24,Number(t)||12)),r=14,n=4,i=1,a=2,s=20,c=o*r+(o-1)*n;return {width:Math.max(60,c+i*2+a*2),height:s}}function as(e){return {width:lo,height:0}}function ss(e){return e.type==="coupler"?bi(e):e.type==="tube"?tn(e):e.type==="splice-tray"?as():{width:80,height:30}}function gi(e){let t=0;for(let o of e){let r=ss(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function cs(e,t=0){let o=t;for(let r of e){let n=ss(r),i=(r.position?.y||0)+n.height;i>o&&(o=i);}return o}function ds(e){return e.data?.panelWidth||Jr}function Ul(e){return e.data?.panelHeight||Qr}function ls(e){return ds(e)-ns*2-po*2}function Gl(e,t){return ls(e)-t}function us(e,t=en){return Math.floor(e/t)+1}function ps(e,t=en){return (e-1)*t}function Vl(e,t,o){let r=en,n=us(o.y,r),i=ps(n,r);return {x:o.x,y:i,slotPosition:n}}function mi(e,t){if(t.length===0)return {width:e.data?.panelWidth||Jr,height:e.data?.panelHeight||Qr};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 p of t)if(p.type==="tube"){let u=tn(p);u.width>c&&(c=u.width);}else if(p.type==="coupler"){let u=bi(p);u.width>l&&(l=u.width);}let b=c+is+lo+l+vo,f=0;i=f+b+f;}else i=gi(t)+4;i=Math.max(e.data?.panelWidth||Jr,i);let a=cs(t,fo),s=Math.max(e.data?.panelHeight||Qr,a+po);return {width:i,height:s}}function fs(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 Xl(e,t,o){return fs(e,t,o)}var ts=20,os=400,rs=300;function hi(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||os,height:e.data?.closureHeight||e.data?.panelHeight||rs};let o=t.some(s=>s.type==="tube"),r=t.some(s=>s.type==="splice-tray"),n;if(o&&r){let s=0,c=0,l=0,b=t.filter(p=>p.type==="tube"),f=t.filter(p=>p.type==="splice-tray");if(b.length>0&&f.length>0){let p=f.map(h=>h.position?.x||0),u=p.reduce((h,x)=>h+x,0)/p.length;for(let h of b){let x=tn(h);(h.position?.x||0)<u?x.width>s&&(s=x.width):x.width>c&&(c=x.width);}f.length>0&&(l=lo),n=po+s+ts+l+ts+c+vo;}else n=gi(t)+po+vo;}else n=gi(t)+po+vo;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||os,n);let i=cs(t,fo),a=Math.max(e.data?.closureHeight||e.data?.panelHeight||rs,i+po);return {width:n,height:a}}var Ni=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:n,panelWidth:i,panelHeight:a}=e||{},{getNodes:s,setNodes:c}=useReactFlow(),l=useRef(false),b=useRef([]),f=useMemo(()=>{let E=s().filter(C=>C.parentId===o);return (E.length!==b.current.length||E.some((C,y)=>C.id!==b.current[y]?.id))&&(b.current=E),b.current},[s,o]),p=useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:i,panelHeight:a}}),[o,e,i,a]),u=useMemo(()=>i&&a?{width:i,height:a}:f.length===0?{width:i||400,height:a||300}:mi(p,f),[f,p,i,a]);useEffect(()=>{if(i&&a||l.current)return;let T=i,E=a,C=Math.abs((T||0)-u.width),y=Math.abs((E||0)-u.height);(C>1||y>1)&&(l.current=true,c(D=>D.map(M=>M.id===o?{...M,data:{...M.data,panelWidth:u.width,panelHeight:u.height}}:M)),setTimeout(()=>{l.current=false;},0));},[o,u.width,u.height,i,a,c]);let h=u.width,x=u.height,N=fo,k=n||r;return jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${h}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:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${N}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"6px 6px 0 0",borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:k})}),jsx("div",{style:{position:"absolute",top:N,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var Pi=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:n,closureWidth:i,closureHeight:a,panelWidth:s,panelHeight:c}=e||{},{getNodes:l,setNodes:b}=useReactFlow(),f=useRef(false),p=useRef([]),u=useMemo(()=>{let D=l().filter(M=>M.parentId===o);return (D.length!==p.current.length||D.some((M,O)=>M.id!==p.current[O]?.id))&&(p.current=D),p.current},[l,o]),h=useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:i||s,closureHeight:a||c}}),[o,e,i,a,s,c]),x=useMemo(()=>i&&a?{width:i,height:a}:s&&c?{width:s,height:c}:u.length===0?{width:i||s||400,height:a||c||300}:hi(h,u),[u,h,i,a,s,c]);useEffect(()=>{if(i&&a||s&&c||f.current)return;let y=i||s,D=a||c,M=Math.abs((y||0)-x.width),O=Math.abs((D||0)-x.height);(M>1||O>1)&&(f.current=true,b(L=>L.map(z=>z.id===o?{...z,data:{...z.data,closureWidth:x.width,closureHeight:x.height}}:z)),setTimeout(()=>{f.current=false;},0));},[o,x.width,x.height,i,a,s,c,b]);let N=x.width,k=x.height,T=fo,E=n||r,C=N/2;return jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${C}px ${C}px 12px 12px`,padding:0,width:`${N}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",overflow:"hidden"},children:[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:`${C}px ${C}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:E})}),jsx("div",{style:{position:"absolute",top:T,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var Ti=({data:e,selected:t,id:o})=>{let{label:r,splitterType:n="splitter",inputCount:i=1,outputCount:a=8}=e||{},s=useEdges(),c=r||(n==="WDM"?"WDM":"Splitter"),l=9,b=3,f=3,p=50,u=30,h=Math.min(Math.max(i||1,1),2),x=h*l+(h-1)*b,N=Math.min(a||8,48),k=N*l+(N-1)*b,T=Math.max(x,k),E=Math.max(u,T+f*2),C=Math.max(p,50),y=K=>s.find(B=>B.source===o&&B.sourceHandle===K||B.target===o&&B.targetHandle===K)?.data?.color||"#555",D=()=>{let K=[],ie=f+(E-x)/2;for(let B=0;B<h;B++){let U=`input-${B+1}`,W=ie+B*(l+b),$=y(U),J={position:"absolute",left:-5,top:`${W}px`,width:l,height:l,borderRadius:"50%",border:"none",background:$,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};K.push(jsxs(Re.Fragment,{children:[jsx(Handle,{id:`${U}-target`,type:"target",position:Position.Left,isConnectable:true,style:J}),jsx(Handle,{id:`${U}-source`,type:"source",position:Position.Left,isConnectable:true,style:J})]},U));}return K},M=()=>{let K=[],ie=f+(E-k)/2;for(let B=0;B<N;B++){let U=`output-${B+1}`,W=ie+B*(l+b),$=y(U),J={position:"absolute",right:-5,top:`${W}px`,width:l,height:l,borderRadius:"50%",border:"none",background:$,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};K.push(jsxs(Re.Fragment,{children:[jsx(Handle,{id:`${U}-target`,type:"target",position:Position.Right,isConnectable:true,style:J}),jsx(Handle,{id:`${U}-source`,type:"source",position:Position.Right,isConnectable:true,style:J})]},U));}return K},O=Math.max(x+f*4,u*.6),L=(E-O)/2,z=L+O,A=0,ee=E,V=t?"#3b82f6":"#4b5563";return jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:C,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:[jsx("svg",{width:C,height:E,viewBox:`0 0 ${C} ${E}`,style:{position:"absolute",top:0,left:0,width:`${C}px`,height:`${E}px`,pointerEvents:"none",zIndex:0},children:jsx("polygon",{points:`0,${L} 0,${z} ${C},${ee} ${C},${A}`,fill:"#1f2937",stroke:V,strokeWidth:"2"})}),D(),jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:c})}),M()]})};var hs=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",nn=(e,t)=>hs(e)||hs(t),ue=(e,t)=>t?e?.type==="fibre-split"?De(t):De(t):t||"";var ys="--rear",ws=new WeakMap;function $o(e){if(typeof e!="string")return;let t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");return t.length>0?t:void 0}function eu(e){let t=new Set;return e.forEach(o=>{o&&t.add(o);}),[...t]}function Ns(...e){let t=e.map(o=>$o(o)).filter(o=>!!o);if(t.some(o=>o.includes("c13")))return "c13";if(t.some(o=>o.includes("c14")))return "c14";if(t.some(o=>o.includes("c19")))return "c19";if(t.some(o=>o.includes("c20")))return "c20";if(t.some(o=>o.includes("ac")))return "ac"}function Ei(e){let t=[$o(e.type),$o(e.cableType),$o(e.connectorType),$o(e.handleId)].filter(o=>!!o);if(t.some(o=>o.includes("fiber")||o.includes("smf")||o.includes("mmf")||o.includes("qsfp")||o.includes("sfp")||o.includes("lc")||o.includes("sc")))return "fiber";if(t.some(o=>o.includes("ethernet")||o.startsWith("eth")||o.includes("rj45")||o.includes("base-t")))return "ethernet"}function fr(e){if(Array.isArray(e.compatibility)&&e.compatibility.length>0)return eu(e.compatibility.map(o=>$o(o)));if(e.kind==="power"||rt(e.type)){let o=Ns(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(e.kind==="network"){let o=Ei(e);return o?[`network:${o}`]:["network"]}let t=rt(e.type)?"power":Ei(e)?"network":void 0;if(t==="power"){let o=Ns(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(t==="network"){let o=Ei(e);return o?[`network:${o}`]:["network"]}return []}function tu(e){let t=e.data??{},o=typeof t.powerPorts=="number"&&Number.isFinite(t.powerPorts)&&t.powerPorts>0?t.powerPorts:36;return [{name:"Power",ports:Array.from({length:o},(r,n)=>{let i=Dt(n);return {id:`${n+1}`,label:`${n+1}`,connected:false,type:i==="C19"?"power_c19":"power_c13",connectorType:i}})}]}function ou(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups;let{ports:o,rearPorts:r}=Ze(t);return r.length>0?r:o.length>0?o:tu(e)}function ru(e){let t=e?.data;if(!e||!t||typeof t!="object")return new Map;let o=ws.get(t);if(o)return o;let r=new Map,n=(i,a)=>{a.forEach(s=>{s.ports.forEach(c=>{let l=Eo(s.name,{id:c.id,label:c.label,type:rt(c.type)?c.type:void 0});r.set(l,{face:i,kind:rt(c.type)?"power":"network",compatibility:fr({compatibility:c.compatibility,kind:rt(c.type)?"power":"network",type:c.type,cableType:c.cableType,connectorType:c.connectorType,handleId:l})});});});};if(e.type==="vertical-pdu")n("rear",ou(e));else {let{ports:i,rearPorts:a}=Ze(t);n("front",i),n("rear",a);}return ws.set(t,r),r}function nu(e,t){if(!e)return "unknown";if(t?.type==="vertical-pdu"||Cn(e)||/^\d+$/.test(e))return "power";let o=e.toLowerCase(),r=o.startsWith("net-")||o.startsWith("port-")||o.startsWith("uplink-")||o.includes("fiber")||o.includes("ports"),n=/^[a-z0-9]+-\d+$/i.test(e)&&!o.startsWith("pwr")&&!o.startsWith("power");return r||n?"network":"unknown"}function iu(e,t,o){if(!e)return [];if(t==="power")return o?.type==="vertical-pdu"&&/^\d+$/.test(e)?fr({kind:t,connectorType:Dt(Math.max(Number(e)-1,0)),handleId:e}):fr({kind:t,handleId:e});if(t==="network"){let r=e.toLowerCase();return fr({kind:t,handleId:e,type:r.includes("fiber")||r.includes("qsfp")||r.includes("sfp")?"fiber":r.startsWith("eth")||r.startsWith("net-")||r.startsWith("port-")?"ethernet":void 0})}return []}function go(e,t){let o=De(t);if(!o)return {normalizedHandle:"",kind:"unknown",compatibility:[]};let r=o,n;r.endsWith(ys)&&(r=r.slice(0,-ys.length),n="rear");let i=ru(e).get(r),l=(e?.data??{}).handleSideMap?.[r]??n??i?.face;l||(r==="net-top"||r==="net-bottom"?l="front":(r==="pwr-left-1"||r==="pwr-left-2"||r==="net-right-1"||r==="net-right-2"||Cn(r))&&(l="rear"));let b=i?.kind??nu(r,e);return {normalizedHandle:r,face:l,kind:b,compatibility:i?.compatibility.length?i.compatibility:iu(r,b,e)}}function au(e,t){if(e.length===0||t.length===0)return true;let o=new Set(t);return e.some(r=>o.has(r))}function su(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),n=nn(o,r);if(!n){let _=go(o,e.sourceHandle),F=go(r,e.targetHandle),ae=_.kind,de=F.kind;if(ae!=="unknown"&&de!=="unknown"&&ae!==de)return {valid:false,reason:`Cannot connect ${ae} handle to ${de} handle`};if(!au(_.compatibility,F.compatibility))return {valid:false,reason:`Incompatible endpoints: ${e.sourceHandle} does not match ${e.targetHandle}`};let ne=ae==="power"&&de==="power",j=o?.type==="vertical-pdu"||r?.type==="vertical-pdu";if(ne&&!j)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let i=ue(o,e.sourceHandle),a=ue(r,e.targetHandle),s=t.edges.some(_=>e.ignoreEdgeId&&_.id===e.ignoreEdgeId?false:_.source===e.source?ue(o,_.sourceHandle)===i:_.target===e.source?ue(o,_.targetHandle)===i:false),c=t.edges.some(_=>e.ignoreEdgeId&&_.id===e.ignoreEdgeId?false:_.target===e.target?ue(r,_.targetHandle)===a:_.source===e.target?ue(r,_.sourceHandle)===a:false);if((s||c)&&!n)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 l=(_,F)=>(_?.type==="tube"||_?.type==="cable")&&!!F&&F.startsWith("fiber-"),b=(_,F)=>(_?.type==="tube"||_?.type==="multi-tube-cable")&&!!F&&F.startsWith("tube-"),f=(_,F)=>_?.type==="multi-tube-cable"&&!!F&&F.startsWith("tube-"),p=(_,F)=>_?.type==="tube"&&!!F&&F.startsWith("tube-"),u=(_,F)=>(_?.type==="cable"||_?.type==="multi-tube-cable")&&F==="cable-button",h=(_,F)=>_?.type==="splice"&&(F==="left"||F==="right"),x=(_,F)=>_?.type==="coupler"&&!!F&&(F.startsWith("left-")||F.startsWith("right-")),N=(_,F)=>{if(_?.type!=="fibre-split"||!F)return false;let ae=ue(_,F);return ae.startsWith("input-")||ae.startsWith("output-")};if(!n)return {valid:true};if(o?.type==="splice"&&r?.type==="splice"){let _=o.data?.mode==="ribbon",F=r.data?.mode==="ribbon";if(_!==F)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let k=l(o,e.sourceHandle),T=l(r,e.targetHandle),E=h(o,e.sourceHandle),C=h(r,e.targetHandle),y=x(o,e.sourceHandle),D=x(r,e.targetHandle),M=N(o,e.sourceHandle),O=N(r,e.targetHandle),L=u(o,e.sourceHandle),z=u(r,e.targetHandle),A=f(o,e.sourceHandle),ee=f(r,e.targetHandle),V=p(o,e.sourceHandle),K=p(r,e.targetHandle),ie=b(o,e.sourceHandle),B=b(r,e.targetHandle);return k&&C||T&&E||(E&&(D||O)||C&&(y||M))||(y&&(D||O||C)||D&&(y||M||E))||L&&z||(A&&K||ee&&V)?{valid:true}:ie&&B?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}function an(e,t){if(!t)return;let o=go(t,e).face;return o==="front"||o==="rear"?o:void 0}function Ri(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(p=>p(o));},subscribe:f=>(r.add(f),()=>r.delete(f)),selectEdgeZIndex:f=>{let p=k=>{if(typeof k.parentId=="string")return k.parentId;let T=k.parentNode;if(typeof T=="string")return T},u=k=>{let T=p(k),E=T?o.nodes.find(y=>y.id===T&&y.type==="rack"):void 0;return E&&_e(E.data)?zt(je(k.data)):[k.data?.view||bt(k.data)]},h=(k,T)=>{let E=o.nodes.find(K=>K.id===k);if(!(!!E&&(E.type==="device"||E.type==="server"||E.type==="switch"||E.type==="router"))||!E||E.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let D=u(E),M=an(T||"",E);if(M)return D.includes(M)?1e3:500;let O=(T||"").toString().replace(/-(source|target)$/i,""),L=O.toLowerCase(),z=L.startsWith("pwr")||L.startsWith("power"),A=L.startsWith("net-")||L.startsWith("port-")||L.startsWith("uplink-")||L.includes("fiber")||L.includes("ports"),ee=/^[A-Z0-9]+-\d+$/i.test(O)&&!L.startsWith("pwr")&&!L.startsWith("power"),V=A||ee;if(z)return D.includes("rear")?1e3:500;if(V)return D.includes("front")?1e3:500},x=h(f.target,f.targetHandle);if(x!==void 0)return x;let N=h(f.source,f.sourceHandle);return N!==void 0?N:1e3},validateConnection:f=>(t.validateConnection||su)(f,o),selectNodeById:f=>o.nodes.find(p=>p.id===f),selectConnectedEdges:f=>o.edges.filter(p=>p.source===f||p.target===f)}}function cu(e){let t=n=>e.subscribe(i=>n()),o=()=>e.getState();return useSyncExternalStore(t,o,o)}function Di(e){let t=r=>e.subscribe(n=>r()),o=()=>e.getState().nodes;return useSyncExternalStore(t,o,o)}function Si(e){let t=r=>e.subscribe(n=>r()),o=()=>e.getState().edges;return useSyncExternalStore(t,o,o)}function ks(e){return e.selectEdgeZIndex}function xs(e){let{width:t,height:o}=Pt(e.data),r=e.position.x,n=e.position.x+t,i=e.position.y,a=e.position.y+o;return {left:r,right:n,top:i,bottom:a}}function Ps(e,t){let o=xs(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function sn(e,t){let o=null,r=1/0;for(let n of t){if(!Ps(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 Ue(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,findBy:i,matchOn:a=i,data:s}=e,c=i==="source"?o.sourceHandle:o.targetHandle,l=i==="source"?o.source:o.target;if(!c||!l)return null;let b=De(c),f=t.find(k=>a==="source"?k.source===l&&De(k.sourceHandle)===b:k.target===l&&De(k.targetHandle)===b);if(!f)return null;let p=t.filter(k=>k.id!==f.id),u=addEdge(o,p),h=u[u.length-1],x=n({...o,id:h.id,type:r}),N={...h,type:r,zIndex:x,style:{...h.style,zIndex:x},data:s!==void 0?s:h.data};return [...u.slice(0,-1),N]}function lu(e,t){return !e||!t?"unknown":go(e,t).kind}function bo(e,t){return lu(e,t)==="power"}function Es(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}var qe=({type:e,children:t})=>{let o=Re.useRef(null),r=Re.useCallback(n=>{if(o.current=n,n){let i=n.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]);return Re.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]),jsx("div",{ref:r,style:{width:"100%",height:"100%"},children:t})},Pu=(e,t,o)=>({rack:r=>jsx(qe,{type:"rack",children:jsx(On,{...r,onViewChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsx(qe,{type:"fiber",children:jsx(Bn,{...r})}),device:r=>jsx(qe,{type:"device",children:jsx(Ho,{...r})}),server:r=>jsx(qe,{type:"server",children:jsx(Ho,{...r})}),switch:r=>jsx(qe,{type:"switch",children:jsx(Ho,{...r})}),router:r=>jsx(qe,{type:"router",children:jsx(Ho,{...r})}),"vertical-pdu":r=>jsx(qe,{type:"vertical-pdu",children:jsx(Jn,{...r})}),splice:r=>jsx(qe,{type:"splice",children:jsx(ti,{...r})}),"splice-tray":r=>jsx(qe,{type:"splice-tray",children:jsx(ai,{...r})}),tube:r=>jsx(qe,{type:"tube",children:jsx(si,{...r})}),cable:r=>jsx(qe,{type:"cable",children:jsx(li,{...r})}),"multi-tube-cable":r=>jsx(qe,{type:"multi-tube-cable",children:jsx(pi,{...r})}),coupler:r=>jsx(qe,{type:"coupler",children:jsx(fi,{...r})}),"patch-panel":r=>jsx(qe,{type:"patch-panel",children:jsx(Ni,{...r})}),closure:r=>jsx(qe,{type:"closure",children:jsx(Pi,{...r})}),"fibre-split":r=>jsx(qe,{type:"fibre-split",children:jsx(Ti,{...r})})});function Rs(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 vs(e,t,o){let r=e.sourceHandle,n=e.targetHandle;return Rs(t)&&r&&!bo(t,r)&&(r=De(r)),Rs(o)&&n&&!bo(o,n)&&(n=`${De(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var Cu={fiber:Lr,ethernet:Lr,power:zn,smoothstep:Na,step:Pa,"thick-cable":Ea},Tu=8192,Eu=8192,Ru=2048,vu=4;function gr(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function Du(e){if(e)return {...e,width:gr(e.width,1,Tu),height:gr(e.height,1,Eu),padding:gr(e.padding,0,Ru),pixelRatio:gr(e.pixelRatio,.1,vu),quality:gr(e.quality,0,1)}}var Ds=({nodes:e,edges:t,initialNodes:o,initialEdges:r,onNodesChange:n,onEdgesChange:i,store:a,debug:s,onNodeClick:c,onEdgeClick:l,nodeTypes:b,edgeTypes:f,onConnect:p,onEdgeUpdate:u,isValidConnection:h,connectionMode:x,onViewChange:N,onRackFaceChange:k,className:T,style:E,alignRacksToBottom:C,reAssignable:y=true,colorMode:D="dark",onInit:M,onFlowMethods:O,showDownloadButton:L=false,downloadButtonPosition:z="top-right",downloadButtonText:A="Download Image",downloadButtonStyle:ee,useSmoothstepEdgesForTubes:V=false,readOnly:K=false,interaction:ie,actionPanel:B,connectOnClick:U=true,panOnDrag:W=true,panOnScroll:$=true,zoomOnScroll:J=true,fitViewOptions:te})=>{let _=useCallback((d,g)=>{let w=new Map,m=[],v=[],S=(I,H)=>!I||!H?false:!!(I.startsWith("tube-")||H.type==="splice"&&(I==="left"||I==="right")||I==="cable-button");for(let I of d){if(!I.source||!I.target||!I.sourceHandle||!I.targetHandle){s&&console.warn("Invalid edge skipped (missing source/target/handles):",I);continue}let H=g.find(We=>We.id===I.source),R=g.find(We=>We.id===I.target),X=`${I.source}:${I.sourceHandle}`,pe=w.get(X),Pe=S(I.sourceHandle,H),Be=`${I.target}:${I.targetHandle}`,Ve=w.get(Be),tt=S(I.targetHandle,R);if(pe&&!Pe){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:X,existingEdge:pe.id,duplicateEdge:I.id}),v.push(I);continue}if(Ve&&!tt){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Be,existingEdge:Ve.id,duplicateEdge:I.id}),v.push(I);continue}m.push(I),pe||w.set(X,I),Ve||w.set(Be,I);}return s&&v.length>0&&console.log(`Filtered ${v.length} duplicate edge(s) from initial edges`),m},[s]),F=Array.isArray(e)&&Array.isArray(t),ae=Re.useMemo(()=>F?e||[]:o||e||[],[F,e,o]),de=Re.useMemo(()=>F?t||[]:r||t||[],[F,t,r]),ne=Re.useMemo(()=>_(de,ae),[de,ae,_]),j=Re.useMemo(()=>a||Ri({nodes:Ln(ae),edges:ne,debug:s}),[a,F,s,ne]),Te=Di(j),Ie=Si(j),[ve,he]=useNodesState(Te),[nt,Qe,Yt]=useEdgesState(Ie),be=ks(j),pt=useRef(null),[it,hr]=useState(false);useEffect(()=>{let d=()=>{hr(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return d(),window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)},[]);let Ee=K===true,Me=useMemo(()=>{let g={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!it,edgesFocusable:!it,edgesReconnectable:true,connectOnClick:U,panOnDrag:W,panOnScroll:$&&!it,zoomOnScroll:J&&!it,zoomOnPinch:!it,zoomOnDoubleClick:!it,allowKeyboardDelete:true,showControls:true,showMiniMap:!it,showInteractiveControl:true},...ie??{}};return Ee?{...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},[it,U,W,$,J,ie,Ee]),Kt=useMemo(()=>({enabled:B?.enabled??true,showRearToggle:B?.showRearToggle??true,showDeRack:B?.showDeRack??true}),[B]),{toObject:yo,setViewport:qt,setNodes:Uo,setEdges:se,getNodes:fe,getEdges:$e,fitView:Oe,flowToScreenPosition:ct}=useReactFlow(),dt=useRef(n),Zt=useRef(i),Go=useRef(F),wo=useRef(j),ht=useRef({toObject:yo,setViewport:qt,setReactFlowNodes:Uo,setReactFlowEdges:se,getNodes:fe,getEdges:$e,fitView:Oe});useEffect(()=>{dt.current=n;},[n]),useEffect(()=>{Zt.current=i;},[i]),useEffect(()=>{Go.current=F;},[F]),useEffect(()=>{wo.current=j;},[j]),useEffect(()=>{ht.current={toObject:yo,setViewport:qt,setReactFlowNodes:Uo,setReactFlowEdges:se,getNodes:fe,getEdges:$e,fitView:Oe};},[yo,qt,Uo,se,fe,$e,Oe]);let Vo=useMemo(()=>({toObject:()=>ht.current.toObject(),setViewport:d=>{ht.current.setViewport(d);},setNodes:d=>{if(ht.current.setReactFlowNodes(d),Go.current){dt.current?.(d);return}wo.current.setState({nodes:d});},setEdges:d=>{if(ht.current.setReactFlowEdges(d),Go.current){Zt.current?.(d);return}wo.current.setState({edges:d});},toImage:d=>pt.current?toPng(pt.current,Du(d)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>ht.current.getNodes(),getEdges:()=>ht.current.getEdges(),fitView:d=>{let{fitView:g,getNodes:w}=ht.current;if(d?.nodes&&Array.isArray(d.nodes)&&d.nodes.length>0){let S=d.nodes.map(R=>w().find(X=>X.id===R)).filter(R=>R!==void 0),{nodes:I,...H}=d;g({...H,nodes:S});return}let{nodes:m,...v}=d||{};g(v);}}),[]);useEffect(()=>{O?.(Vo);},[O,Vo]);let[yt,yr]=useState(false),Fe=useCallback(()=>{if(!yt){if(!pt.current){s&&console.error("ReactFlow wrapper ref is not available");return}yr(true),toPng(pt.current,{filter:d=>!(d?.classList?.contains("react-flow__minimap")||d?.classList?.contains("react-flow__controls")||d?.classList?.contains("react-flow__attribution")||d?.classList?.contains("download-button")||d?.tagName==="BUTTON"),backgroundColor:D==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(d=>{let g=document.createElement("a");g.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,g.href=d,g.click();}).catch(d=>{s&&console.error("Error downloading image:",d);}).finally(()=>{yr(false);});}},[D,s,yt]),[Ge,Ne]=useState(null),wr=useRef(null),Rt=useRef(N),et=useRef(k);useEffect(()=>{Rt.current=N;},[N]),useEffect(()=>{et.current=k;},[k]),useEffect(()=>{wr.current=Ge;},[Ge]);let at=useCallback((d,g)=>{Rt.current?.(d,g);},[]),Xo=useCallback((d,g)=>{et.current?.(d,g);},[]),Nr=useCallback(()=>wr.current,[]),fn=useMemo(()=>({...Pu(at,Xo,Nr),...b??{}}),[at,Xo,Nr,b]),kr=useMemo(()=>({...Cu,...f??{}}),[f]),No=useMemo(()=>({zIndex:1e3,reconnectable:Me.edgesReconnectable}),[Me.edgesReconnectable]),Jt=useMemo(()=>({hideAttribution:true}),[]),ft=useRef(ve);useEffect(()=>{ft.current=ve;},[ve]);let G=useRef(nt);useEffect(()=>{G.current=nt;},[nt]),useEffect(()=>{he(Te);},[Te,he]),useEffect(()=>{Qe(Ie);},[Ie,Qe]),useEffect(()=>{if(F&&t){let d=_(t,e||[]);d.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-d.length} duplicate(s) removed`),i?.(d));}},[F,t,e,_,i,s]),useEffect(()=>{F&&j.setState({nodes:Ss(e||[],j.getState().nodes)});},[F,e,j]),useEffect(()=>{F&&j.setState({edges:Is(t||[],j.getState().edges)});},[F,t,j]),useEffect(()=>{if(!C||!ve||ve.length===0)return;let d=ve.filter(R=>R.type==="rack");if(d.length===0)return;let g=d.map(R=>{let X=Pt(R.data).height;return (R.position?.y||0)+X}),w=Math.min(...g),m=Math.max(...g);if(m-w<20)return;let S=m,I=ve.map(R=>{if(R.type!=="rack")return R;let X=Pt(R.data).height,pe=(R.position?.y||0)+X,Pe=S-pe;return Math.abs(Pe)<5?R:{...R,position:{x:R.position?.x||0,y:(R.position?.y||0)+Pe}}});if(I.some((R,X)=>{let pe=ve[X]?.position,Pe=R.position;return pe?.x!==Pe?.x||pe?.y!==Pe?.y})){if(F){n?.(I);return}j.setState({nodes:I});}},[C,ve,F,n,j]);let wt=useRef(new Map);useEffect(()=>{let d=new Map;ve.forEach(g=>{d.set(g.id,g);}),wt.current=d;},[ve]);let oe=useCallback(d=>wt.current.get(d),[]),ge=useCallback(d=>{if(!d)return;if(typeof d.parentId=="string")return d.parentId;let g=d.parentNode;if(typeof g=="string")return g},[]),Qt=useCallback(d=>{let g=ge(d);if(!g)return;let w=oe(g);if(!(!w||w.type!=="rack"))return w},[oe,ge]),Li=useCallback(d=>!d||d.type!=="rack"?false:_e(d.data),[]),ko=useCallback(d=>{if(!d||!kt(d))return false;let g=Qt(d);return g?_e(g.data):false},[Qt]),gn=useCallback(d=>{if(!d||d.type!=="device")return false;let g=d.data?.deviceType;return typeof g=="string"&&g.toLowerCase().replace(/_/g,"-")==="patch-panel"},[]),jo=useCallback(d=>{ft.current=d;let g=new Map;d.forEach(w=>{g.set(w.id,w);}),wt.current=g,he(d),F?n?.(d):j.setState({nodes:d});},[F,j,he,n]),xe=useCallback(d=>{G.current=d,Qe(d),F?i?.(d):j.setState({edges:d});},[F,j,Qe,i]),At=useCallback(d=>{if(d.positionAbsolute)return d.positionAbsolute;let g=d.position?.x||0,w=d.position?.y||0,m=ge(d),v=new Set;for(;m&&!v.has(m);){v.add(m);let S=oe(m);if(!S)break;if(S.positionAbsolute){g+=S.positionAbsolute.x,w+=S.positionAbsolute.y;break}g+=S.position?.x||0,w+=S.position?.y||0,m=ge(S);}return {x:g,y:w}},[oe,ge]),xr=useCallback(d=>{let g=At(d),w=d.width||0,m=d.height||0;return {x:g.x+w/2,y:g.y+m/2}},[At]),Oi=useCallback(d=>Pt(d.data),[]),xo=useCallback((d,g,w)=>{let{width:m,height:v}=Oi(d),S=g.width||0,I=g.height||0,H=Math.max(0,m-S),R=g.type==="vertical-pdu"?60:0,X=Math.max(R,v-I);return {x:Math.max(0,Math.min(w.x,H)),y:Math.max(R,Math.min(w.y,X))}},[Oi]),Yo=useCallback((d,g)=>{if(!d||!g)return;let w=oe(d);if(!w)return;let m=g.replace(/-(source|target)$/i,"");if(w.type==="fibre-split"&&m.startsWith("output-")){let S=G.current.filter(I=>I.target===d&&(I.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"));if(S.length>0){let I=S[0]?.data?.color;if(I)return {color:I}}}if((w.type==="tube"||w.type==="cable")&&g.startsWith("fiber-")){let S=g.replace("fiber-",""),I=parseInt(S,10);if(I>=1&&I<=24){let H=io(I),R=I>12;return {color:H,striped:R}}}if((w.type==="multi-tube-cable"||w.type==="tube")&&g.startsWith("tube-")){let S=g.replace("tube-",""),I=parseInt(S,10);if(I>=1&&I<=24){let H=Ke(I),R=I>12;return {color:H,striped:R}}}let v=w.data;if(v.color)return {color:v.color}},[oe]),Bi=useRef(new Map);useEffect(()=>{Qe(d=>{let g=false,w=d.map(m=>{let v=be(m);return Bi.current.get(m.id)!==v?(g=true,Bi.current.set(m.id,v),{...m,zIndex:v,style:{...m.style,zIndex:v}}):m});return g?w:d});},[ve,Qe,be]),useEffect(()=>{let d=ve.map(w=>{if(w.type==="coupler"&&w.parentId){let m=oe(w.parentId);if(m&&(m.type==="patch-panel"||m.type==="closure")&&(!w.extent||w.extent!=="parent"))return {...w,extent:"parent"}}if(w.type==="splice"&&w.parentId&&w.data.holderPosition&&(!w.position||w.position.x===0&&w.position.y===0)){let m=oe(w.parentId);if(m&&m.type==="splice-tray"){let v=w.data.mode==="ribbon",S=ur(m,w.data.holderPosition,v);return {...w,position:S}}}if(kt(w)&&w.parentId&&w.data.uPosition&&(!w.position||w.position.x===0&&w.position.y===0)){let m=oe(w.parentId);if(m){let v=w.data.uHeight||1,S=So(m,w.data.uPosition,v,w.data);return {...w,position:S}}}if(w.type==="vertical-pdu"&&w.parentId){let m=oe(w.parentId);if(m&&m.type==="rack"){let v=xo(m,w,w.position||{x:0,y:60});if(w.extent!=="parent"||!w.position||w.position.x!==v.x||w.position.y!==v.y)return {...w,extent:"parent",position:v}}}return w});d.some((w,m)=>{let v=ve[m];return w.extent!==v.extent||w.position?.x!==v.position?.x||w.position?.y!==v.position?.y})&&he(d);},[ve,he,oe,xo]);let Wi=useCallback(d=>{if(Ee)return null;let g=new Map,w=new Map,m=new Set,v=d.map(H=>{if(H.type==="position"&&H.position){let R=oe(H.id);if(R&&R.type==="coupler"&&R.parentId){let X=oe(R.parentId);if(X&&(X.type==="patch-panel"||X.type==="closure"))return (!R.extent||R.extent!=="parent")&&m.add(R.id),{...H,position:R.position||{x:0,y:0}}}if(R&&(R.type==="tube"||R.type==="splice-tray")&&R.parentId){let X=oe(R.parentId);if(X&&X.type==="closure")return (!R.extent||R.extent!=="parent")&&m.add(R.id),{...H,position:R.position||{x:0,y:0}}}if(R&&R.type==="splice"&&R.parentId){let X=oe(R.parentId);if(X&&X.type==="splice-tray"){let pe=ri(R,X,H.position,ft.current);return pe.holderPosition!==void 0&&g.set(R.id,pe.holderPosition),{...H,position:{x:pe.x,y:pe.y}}}}if(R&&kt(R)&&R.parentId){let X=oe(R.parentId);if(X&&X.type==="rack"){let pe=_r(R,X,H.position,ft.current);return pe.uPosition!==void 0&&w.set(R.id,pe.uPosition),{...H,position:{x:pe.x,y:pe.y}}}}if(R&&R.type==="vertical-pdu"&&R.parentId){let X=oe(R.parentId);if(X&&X.type==="rack")return (!R.extent||R.extent!=="parent")&&m.add(R.id),{...H,position:xo(X,R,H.position)}}}return H}),S=applyNodeChanges(v,ft.current).map(H=>{let R=H;m.has(H.id)&&(R={...R,extent:"parent"});let X=g.get(H.id);X!==void 0&&(R={...R,data:{...R.data,holderPosition:X}});let pe=w.get(H.id);return pe!==void 0&&(R={...R,data:{...R.data,uPosition:pe}}),R});S=Ln(S),ft.current=S;let I=new Map;return S.forEach(H=>{I.set(H.id,H);}),wt.current=I,he(S),S},[he,oe,Ee,xo]),dc=useCallback((d,g)=>{Ne(null);},[]),lc=useCallback((d,g,w)=>{let m=ge(g);if(!y||!Do(g)||m){Ne(null);return}let v=ft.current.filter(R=>R.type==="rack").map(R=>R),S=xr(g),H=sn(S,v)?.id??null;Ne(R=>R===H?R:H);},[y,xr,ge]),uc=useCallback((d,g,w)=>{Ne(null);let m=ge(g);if(!y||!Do(g)||m)return;let v=At(g),S=ft.current.filter(le=>le.type==="rack").map(le=>le),I=xr(g),H=sn(I,S),R=ft.current;if(!H)return;let X={x:v.x-H.position.x,y:v.y-H.position.y},pe=xo(H,g,X);if(g.type==="vertical-pdu"){let le=R.map(ce=>ce.id!==g.id?ce:{...ce,parentId:H.id,extent:"parent",position:pe,data:{...ce.data,rackLayout:_e(H.data)?"split-face":"single-face",rackWidthPx:xt(H.data),rackFaceGapPx:St(H.data)}});jo(le);return}let Pe=R.find(le=>le.id===g.id)||g,Be=_e(H.data),Ve=xt(H.data),tt=St(H.data),We=Be?pa(Pe.data,X.x,Ve,tt):"both",Xe=Be&&We==="front"?Ve+tt:0,ot=We==="rear"?"rear":We==="front"?"front":Pe.data.view==="front"||Pe.data.view==="rear"?Pe.data.view:void 0,He={...Pe,parentId:H.id,extent:"parent",position:{x:Xe,y:X.y},data:{...Pe.data,rackLayout:Be?"split-face":"single-face",rackWidthPx:Ve,rackFaceGapPx:tt,mountMode:We,view:ot}},Le=R.filter(le=>le.id!==g.id).concat(He),Ye=_r(He,H,He.position,Le);if(Ye.uPosition===void 0||!to(H,He,Ye.uPosition,Le))return;let q=R.map(le=>le.id!==g.id?le:{...le,parentId:H.id,extent:"parent",position:{x:Ye.x,y:Ye.y},data:{...le.data,rackLayout:Be?"split-face":"single-face",rackWidthPx:Ve,rackFaceGapPx:tt,mountMode:We,view:ot,uPosition:Ye.uPosition??le.data.uPosition}});jo(q);},[y,At,xr,jo,ge,xo]),pc=useCallback(d=>{if(!d.source||!d.target||!d.sourceHandle||!d.targetHandle)return true;let g=oe(d.source),w=oe(d.target),m=ue(g,d.sourceHandle),v=ue(w,d.targetHandle),S=G.current.some(Q=>Q.source===d.source?ue(g,Q.sourceHandle)===m:Q.target===d.source?ue(g,Q.targetHandle)===m:false),I=G.current.some(Q=>Q.target===d.target?ue(w,Q.targetHandle)===v:Q.source===d.target?ue(w,Q.sourceHandle)===v:false);if(S&&s&&console.log("Connection will replace: Source handle already connected",{source:d.source,sourceHandle:d.sourceHandle,existingEdges:G.current.filter(Q=>Q.source===d.source&&Q.sourceHandle===d.sourceHandle||Q.target===d.source&&Q.targetHandle===d.sourceHandle)}),I&&s&&console.log("Connection will replace: Target handle already connected",{target:d.target,targetHandle:d.targetHandle,existingEdges:G.current.filter(Q=>Q.target===d.target&&Q.targetHandle===d.targetHandle||Q.source===d.target&&Q.sourceHandle===d.targetHandle)}),!nn(g,w))return true;if(g?.type==="splice"&&w?.type==="splice"){let Q=g.data?.mode==="ribbon",ye=w.data?.mode==="ribbon";if(Q!==ye)return s&&console.log("Connection rejected: Ribbon splices can only connect to other ribbon splices",d),false}let R=(Q,ye)=>(Q?.type==="tube"||Q?.type==="cable")&&!!ye&&ye.startsWith("fiber-"),X=(Q,ye)=>(Q?.type==="tube"||Q?.type==="multi-tube-cable")&&!!ye&&ye.startsWith("tube-"),pe=(Q,ye)=>Q?.type==="multi-tube-cable"&&!!ye&&ye.startsWith("tube-"),Pe=(Q,ye)=>Q?.type==="tube"&&!!ye&&ye.startsWith("tube-"),Be=(Q,ye)=>(Q?.type==="cable"||Q?.type==="multi-tube-cable")&&ye==="cable-button",Ve=(Q,ye)=>Q?.type==="splice"&&(ye==="left"||ye==="right"),tt=(Q,ye)=>Q?.type==="coupler"&&!!ye&&(ye.startsWith("left-")||ye.startsWith("right-")),We=(Q,ye)=>{if(Q?.type!=="fibre-split"||!ye)return false;let P=ye.replace(/-(source|target)$/i,"");return P.startsWith("input-")||P.startsWith("output-")},Xe=R(g,d.sourceHandle),ot=R(w,d.targetHandle),He=Ve(g,d.sourceHandle),Le=Ve(w,d.targetHandle),Ye=tt(g,d.sourceHandle),q=tt(w,d.targetHandle),le=We(g,d.sourceHandle),ce=We(w,d.targetHandle),Pr=Be(g,d.sourceHandle),yn=Be(w,d.targetHandle),Co=pe(g,d.sourceHandle),To=pe(w,d.targetHandle),wn=Pe(g,d.sourceHandle),Nn=Pe(w,d.targetHandle),Cr=X(g,d.sourceHandle),kn=X(w,d.targetHandle);return Xe&&Le||ot&&He||(He&&(q||ce)||Le&&(Ye||le))||(Ye&&(q||ce||Le)||q&&(Ye||le||He))||Pr&&yn||(Co&&Nn||To&&wn)?true:Cr&&kn?(s&&console.log("Connection rejected: Tube handles can only connect between cable and tube nodes",d),false):(s&&console.log("Connection rejected: Connection not allowed by fiber rules",d),false)},[oe,s]),fc=useCallback(d=>{if(Ee)return;s&&console.log("onConnect called:",d);let g=oe(d.source),w=oe(d.target);s&&(console.log("onConnect: sourceNode type:",g?.type,"targetNode type:",w?.type),console.log("onConnect: sourceHandle:",d.sourceHandle,"targetHandle:",d.targetHandle));let m=vs(d,g,w),v=j.validateConnection({source:m.source??null,target:m.target??null,sourceHandle:m.sourceHandle,targetHandle:m.targetHandle});if(!v.valid&&!(v.reason??"").includes("already connected")){s&&console.warn(`Connection rejected: ${v.reason}`);return}let S=g?.type==="vertical-pdu",I=g?.type==="vertical-pdu"||w?.type==="vertical-pdu",H=bo(g,m.sourceHandle),R=bo(w,m.targetHandle),X=H&&R&&I,pe=g?.data,Pe=g?.type==="switch"||g?.type==="device"&&pe?.deviceType==="switch",Be=R,Ve=!!m.targetHandle&&(m.targetHandle.startsWith("net-")||m.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(De(m.targetHandle))),tt=!!m.sourceHandle&&(m.sourceHandle.startsWith("net-")||m.sourceHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(De(m.sourceHandle))),We=w?.type==="switch"||w?.type==="device"&&w.data?.deviceType==="switch",Xe=w?.type==="vertical-pdu",ot=H,He=g?.type==="tube"&&w?.type==="multi-tube-cable",Le=g?.type==="multi-tube-cable"&&w?.type==="tube",Ye=He||Le,q=m.sourceHandle==="cable-button"&&m.targetHandle==="cable-button",le="fiber";X?le="power":q?le="thick-cable":Ye&&(le=V?"smoothstep":"fiber");let ce,Pr=Es(w),yn=Es(g);if(Pr||yn){let P=w?.data,Y=g?.data,ke=Pr?P.ribbonFiberIds:Y.ribbonFiberIds;ke&&Array.isArray(ke)&&ke.length>=6&&ke.length<=12&&(ce={ribbonFiberIds:ke,isRibbon:true});}if(!ce&&(le==="fiber"||le==="smoothstep")&&!S){let P;He?P=Yo(m.target,m.targetHandle):P=Yo(m.source,m.sourceHandle),P&&(ce={color:P.color,striped:P.striped,isRibbon:false});}else if(le==="thick-cable"&&q){let P=g?.data;ce={color:P?.color||(P?.tubeStartIndex?Ke(P.tubeStartIndex):"#6366f1")};}let Co=ue(g,m.sourceHandle),To=ue(w,m.targetHandle),wn=G.current.some(P=>P.source===m.source?ue(g,P.sourceHandle)===Co:P.target===m.source?ue(g,P.targetHandle)===Co:false),Nn=G.current.some(P=>P.target===m.target?ue(w,P.targetHandle)===To:P.source===m.target?ue(w,P.sourceHandle)===To:false);if(wn||Nn){let P=new Set;for(let Y of G.current){if(Y.source===m.source&&ue(g,Y.sourceHandle)===Co){P.add(Y.id);continue}if(Y.target===m.source&&ue(g,Y.targetHandle)===Co){P.add(Y.id);continue}if(Y.source===m.target&&ue(w,Y.sourceHandle)===To){P.add(Y.id);continue}Y.target===m.target&&ue(w,Y.targetHandle)===To&&P.add(Y.id);}if(P.size>0){let Y=G.current.filter(Nt=>!P.has(Nt.id)),ke=addEdge(m,Y);if(ke.length===Y.length)s&&console.warn("Handle replacement skipped: addEdge did not create a new edge",m);else {let Nt=ke[ke.length-1],Lt=be({...m,id:Nt.id,type:le}),eo={...Nt,type:le,zIndex:Lt,style:{...Nt.style,zIndex:Lt},data:ce!==void 0?ce:Nt.data};xe([...ke.slice(0,-1),eo]),s&&console.log("Handle replacement: Replaced",P.size,"edge(s)");return}}}if(w?.type==="splice"&&(d.targetHandle==="left"||d.targetHandle==="right")&&d.target&&d.targetHandle){let P=G.current.find(Y=>Y.target===d.target&&Y.targetHandle===d.targetHandle||Y.source===d.target&&Y.sourceHandle===d.targetHandle);if(P){s&&(console.log("Splice target handle replacement: Found existing edge",P.id,"on splice handle",d.targetHandle),console.log("Existing edge details:",{id:P.id,source:P.source,target:P.target,sourceHandle:P.sourceHandle,targetHandle:P.targetHandle,data:P.data}));let Y=d.source&&d.sourceHandle?G.current.find(vt=>vt.source===d.source&&vt.sourceHandle===d.sourceHandle):null;s&&Y&&console.log("Splice target handle replacement: Also found existing source edge",Y.id);let ke=new Set;P&&ke.add(P.id),Y&&Y.id!==P.id&&ke.add(Y.id);let Nt=G.current.filter(vt=>!ke.has(vt.id));s&&console.log("Splice target handle replacement: Removing",ke.size,"edge(s), creating new connection");let Lt=`edge-${d.source}-${d.sourceHandle}-${d.target}-${d.targetHandle}-${Date.now()}`,eo=be({...d,id:Lt,type:"fiber"}),qo={id:Lt,source:d.source,target:d.target,sourceHandle:d.sourceHandle,targetHandle:d.targetHandle,type:"fiber",zIndex:eo,style:{zIndex:eo},data:ce!==void 0?ce:{}},Pn=[...Nt,qo];xe(Pn),s&&console.log("Splice target handle replacement: Successfully replaced edge with new edge",qo.id);return}}if(g?.type==="splice"&&d.sourceHandle==="right"&&d.source&&d.sourceHandle){let P=G.current.find(Y=>Y.source===d.source&&Y.sourceHandle===d.sourceHandle||Y.target===d.source&&Y.targetHandle===d.sourceHandle);if(P){s&&console.log("Splice source handle replacement: Found existing edge",P.id,"on splice handle",d.sourceHandle);let Y=d.target&&d.targetHandle?G.current.find(vt=>vt.target===d.target&&vt.targetHandle===d.targetHandle):null;s&&Y&&console.log("Splice source handle replacement: Also found existing target edge",Y.id);let ke=new Set;P&&ke.add(P.id),Y&&Y.id!==P.id&&ke.add(Y.id);let Nt=G.current.filter(vt=>!ke.has(vt.id));s&&console.log("Splice source handle replacement: Removing",ke.size,"edge(s), creating new connection");let Lt=`edge-${d.source}-${d.sourceHandle}-${d.target}-${d.targetHandle}-${Date.now()}`,eo=be({...d,id:Lt,type:"fiber"}),qo={id:Lt,source:d.source,target:d.target,sourceHandle:d.sourceHandle,targetHandle:d.targetHandle,type:"fiber",zIndex:eo,style:{zIndex:eo},data:ce!==void 0?ce:{}},Pn=[...Nt,qo];xe(Pn),s&&console.log("Splice source handle replacement: Successfully replaced edge with new edge",qo.id);return}}if((g?.type==="tube"||g?.type==="cable")&&d.sourceHandle?.startsWith("fiber-")&&d.source&&d.sourceHandle){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"source",data:ce});if(P){xe(P);return}}if((w?.type==="tube"||w?.type==="cable")&&d.targetHandle?.startsWith("fiber-")&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"target",data:ce});if(P){xe(P);return}}if((g?.type==="multi-tube-cable"||g?.type==="tube")&&d.sourceHandle?.startsWith("tube-")&&d.source&&d.sourceHandle){let P=Ue({edges:G.current,connection:m,edgeType:le,selectEdgeZIndex:be,findBy:"source",data:ce});if(P){xe(P);return}}if((w?.type==="multi-tube-cable"||w?.type==="tube")&&d.targetHandle?.startsWith("tube-")&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:le,selectEdgeZIndex:be,findBy:"target",data:ce});if(P){xe(P);return}}if(g?.type==="coupler"&&(d.sourceHandle?.startsWith("left-")||d.sourceHandle?.startsWith("right-"))){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"source",data:ce});if(P){xe(P);return}}if(w?.type==="coupler"&&(d.targetHandle?.startsWith("left-")||d.targetHandle?.startsWith("right-"))){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"target",data:ce});if(P){xe(P);return}}if(q&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let P=g?.data,Y=P?.color||(P?.tubeStartIndex?Ke(P.tubeStartIndex):"#6366f1"),ke=Ue({edges:G.current,connection:m,edgeType:"thick-cable",selectEdgeZIndex:be,findBy:"source",data:{color:Y}});if(ke){xe(ke);return}if(ke=Ue({edges:G.current,connection:m,edgeType:"thick-cable",selectEdgeZIndex:be,findBy:"target",data:{color:Y}}),ke){xe(ke);return}}if(S&&Be&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:"power",selectEdgeZIndex:be,findBy:"target",data:ce});if(P){xe(P);return}}if(Xe&&ot&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:"power",selectEdgeZIndex:be,findBy:"source",matchOn:"target",data:ce});if(P){xe(P);return}}if(Pe&&Ve&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"target",data:ce});if(P){xe(P);return}}if(We&&tt&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"target",matchOn:"source",data:ce});if(P){xe(P);return}}let Cr=j.validateConnection({source:m.source??null,target:m.target??null,sourceHandle:m.sourceHandle,targetHandle:m.targetHandle});if(!Cr.valid){if(S&&d.source&&d.sourceHandle){let P=Ue({edges:G.current,connection:m,edgeType:Be?"power":"fiber",selectEdgeZIndex:be,findBy:"source",data:ce});if(P){xe(P);return}}if(Xe&&d.source&&d.sourceHandle){let P=Ue({edges:G.current,connection:m,edgeType:"power",selectEdgeZIndex:be,findBy:"source",matchOn:"target",data:ce});if(P){xe(P);return}}if(Pe&&d.source&&d.sourceHandle){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"source",data:ce});if(P){xe(P);return}}if(We&&d.target&&d.targetHandle){let P=Ue({edges:G.current,connection:m,edgeType:"fiber",selectEdgeZIndex:be,findBy:"target",matchOn:"source",data:ce});if(P){xe(P);return}}s&&console.warn(`Connection rejected: ${Cr.reason}`);return}let kn=G.current.some(P=>P.source===m.source&&P.sourceHandle===m.sourceHandle||P.target===m.source&&P.targetHandle===m.sourceHandle),Gi=G.current.some(P=>P.target===m.target&&P.targetHandle===m.targetHandle||P.source===m.target&&P.sourceHandle===m.targetHandle),xn=(P,Y)=>!P||!Y?false:!!(P.startsWith("tube-")||Y.type==="splice"&&(P==="left"||P==="right")||P==="cable-button"),Vi=xn(m.sourceHandle||"",g),Xi=xn(m.targetHandle||"",w);if(kn&&!Vi){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:d.source,sourceHandle:m.sourceHandle,existingEdges:G.current.filter(P=>P.source===m.source&&P.sourceHandle===m.sourceHandle||P.target===m.source&&P.targetHandle===m.sourceHandle)});return}if(Gi&&!Xi){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:m.target,targetHandle:m.targetHandle,existingEdges:G.current.filter(P=>P.target===m.target&&P.targetHandle===m.targetHandle||P.source===m.target&&P.sourceHandle===m.targetHandle)});return}let ji={...m,type:le,zIndex:be({...m,id:"temp-id"}),data:ce},Q=addEdge(ji,G.current),ye=Q[Q.length-1];ye&&(Ui(P=>new Set(P).add(ye.id)),setTimeout(()=>{Ui(P=>{let Y=new Set(P);return Y.delete(ye.id),Y});},1e3)),xe(Q);},[xe,j,be,oe,s,Yo,V,Ee]),gc=useCallback((d,g)=>{if(Ee||!g.source||!g.target||!g.sourceHandle||!g.targetHandle)return;let w=oe(g.source),m=oe(g.target),v=vs(g,w,m),S=ue(w,v.sourceHandle),I=ue(m,v.targetHandle),H=G.current.some(q=>{if(q.id===d.id)return false;let le=q.source===v.source&&ue(w,q.sourceHandle)===S||q.target===v.source&&ue(w,q.targetHandle)===S,ce=q.target===v.target&&ue(m,q.targetHandle)===I||q.source===v.target&&ue(m,q.sourceHandle)===I;return le||ce}),R=j.validateConnection({source:v.source??null,target:v.target??null,sourceHandle:v.sourceHandle,targetHandle:v.targetHandle,ignoreEdgeId:d.id});if(!R.valid&&!((R.reason??"").includes("already connected")&&H)){s&&console.warn(`Edge update rejected: ${R.reason}`);return}let X=w?.type==="vertical-pdu"||m?.type==="vertical-pdu",pe=bo(w,v.sourceHandle),Pe=bo(m,v.targetHandle),Be=pe&&Pe&&X,Ve=w?.type==="tube"&&m?.type==="multi-tube-cable",tt=w?.type==="multi-tube-cable"&&m?.type==="tube",We=Ve||tt,Xe;Be?Xe="power":We?Xe=V?"smoothstep":"fiber":Xe="fiber";let ot;if(Xe==="fiber"||Xe==="smoothstep"){let q=Yo(v.source,v.sourceHandle);q&&(ot={color:q.color,striped:q.striped});}let Ye=G.current.filter(q=>{if(q.id===d.id)return true;let le=q.source===v.source&&ue(w,q.sourceHandle)===S||q.target===v.source&&ue(w,q.targetHandle)===S,ce=q.target===v.target&&ue(m,q.targetHandle)===I||q.source===v.target&&ue(m,q.sourceHandle)===I;return !(le||ce)}).map(q=>q.id===d.id?{...q,source:v.source,target:v.target,sourceHandle:v.sourceHandle,targetHandle:v.targetHandle,type:Xe,data:ot!==void 0?{...q.data,...ot}:q.data,zIndex:be({...v,id:q.id,type:Xe}),style:{...q.style,zIndex:be({...v,id:q.id,type:Xe})}}:q);xe(Ye);},[xe,oe,Yo,be,V,s,j,Ee]),bc=useCallback((d,g)=>{if(it){c&&c(g);return}let w=d.metaKey||d.ctrlKey,m=fe(),v=g,S=ge(g);if(g.type==="tube"&&S&&!w){let I=m.find(H=>H.id===S&&(H.type==="cable"||H.type==="multi-tube-cable"));I&&(v=I);}if(bn(v),Ko([]),he(I=>I.map(H=>{let R=H.id===v.id;return H.selected===R?H:{...H,selected:R}})),w&&kt(v)&&!ko(v)){let I=v.data||{},H=I.view||bt(I),R=H==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${v.id} from ${H} to ${R}`),N&&N(v.id,R);}c&&c(v);},[N,c,s,fe,he,it,ge,ko]),mc=useCallback(()=>{},[]),hc=useCallback((d,g)=>{bn(null),Ko([g]),he(w=>w.map(m=>m.selected?{...m,selected:false}:m)),c?.(null),l&&l(g);},[l,c,he]),yc=useCallback(()=>{bn(null),Ko([]),he(d=>d.map(g=>g.selected?{...g,selected:false}:g)),c?.(null);},[c,he]),[gt,bn]=useState(null),[zi,Ui]=useState(new Set),[mn,Ko]=useState([]),wc=useCallback(({edges:d})=>{Ko(d||[]);},[]);useOnSelectionChange({onChange:wc}),useEffect(()=>{let d=g=>{if(Me.allowKeyboardDelete&&(g.key==="Backspace"||g.key==="Delete")&&mn.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let w=mn.filter(m=>{let v=m.sourceHandle||"",S=m.targetHandle||"";return v.startsWith("tube-")||S.startsWith("tube-")?(s&&console.log("Cannot delete edge connected to tube handle",m),false):true});if(w.length>0){let m=new Set(w.map(S=>S.id)),v=G.current.filter(S=>!m.has(S.id));xe(v),Ko([]),s&&console.log("Deleted edges:",w.map(S=>S.id));}}};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[mn,xe,s,Me.allowKeyboardDelete]);let Nc=useCallback((d,{nodeId:g,handleType:w})=>{s&&console.log("Connection started from",{nodeId:g,handleType:w});},[s]),kc=useCallback(d=>{s&&console.log("Connection ended",d);},[s]),xc=useCallback(()=>{if(Ee||!gt)return;let d=oe(gt.id);if(d){if(d.type==="rack"){let g=d.data||{};if(_e(g))return;let m=(g.face||"front")==="front"?"rear":"front";k?(k(d.id,m),N&&fe().filter(S=>S.parentId===d.id).forEach(S=>{N(S.id,m);})):he(v=>v.map(S=>S.id===d.id?{...S,data:{...S.data,face:m}}:S.parentId===d.id?{...S,data:{...S.data,view:m}}:S));return}if(kt(d)){if(ko(d))return;let g=d.data||{},m=(g.view||bt(g))==="front"?"rear":"front";N?N(d.id,m):he(v=>v.map(S=>S.id===d.id?{...S,data:{...S.data,view:m}}:S));}}},[gt,oe,k,N,he,fe,Ee,ko]),Pc=useCallback(()=>{if(Ee||!y||!gt||!Do(gt))return;let d=oe(gt.id),g=ge(d);if(!d||!Do(d)||!g)return;let w=At(d),v=ft.current.map(S=>S.id!==d.id?S:{...S,parentId:void 0,parentNode:void 0,extent:void 0,position:w,data:{...S.data,uPosition:void 0}});jo(v);},[Ee,y,gt,oe,At,jo,ge]),Cc=useMemo(()=>{let d=wt.current;return nt.map(g=>{let w=g,m=d.get(String(w.source)),v=d.get(String(w.target)),S=an(w.sourceHandle||"",m),I=an(w.targetHandle||"",v),H=He=>{if(!He||!kt(He))return;let Le=He.data??{},Ye=typeof He.parentId=="string"?He.parentId:He.parentNode,q=Ye?d.get(Ye):void 0;return q&&q.type==="rack"&&_e(q.data)?zt(je(Le)):[Le.view||bt(Le)]},R=H(m),X=H(v),pe=gn(m),Pe=gn(v),Be=kt(m)&&!pe&&!!R&&!!S&&!R.includes(S),Ve=kt(v)&&!Pe&&!!X&&!!I&&!X.includes(I),Xe=Be||Ve,ot=g.style;if(Xe)ot={...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 Le={...g.style};delete Le.opacity,delete Le.pointerEvents,delete Le.zIndex,ot=Object.keys(Le).length>0?Le:void 0;}return {...g,style:ot,className:zi.has(g.id)?"edge-connecting":g.className}})},[nt,zi,gn]),Ae=useMemo(()=>gt?oe(gt.id)??gt:null,[gt,oe]),Po=useMemo(()=>{if(!Ae||!Kt.enabled||Ee)return {showRearToggle:false,showDeRack:false,count:0};let d=Ae.type==="rack"?!Li(Ae):kt(Ae)?!ko(Ae):false,g=Kt.showRearToggle&&d,w=Kt.showDeRack&&y&&!Ee&&Do(Ae)&&!!ge(Ae);return {showRearToggle:g,showDeRack:w,count:(g?1:0)+(w?1:0)}},[Ae,Kt,y,Ee,ge,ko,Li]),hn=useMemo(()=>{if(!Ae||Po.count===0||!pt.current)return null;let d=pt.current.getBoundingClientRect();if(d.width<=0||d.height<=0)return null;let g=Ae.positionAbsolute??At(Ae),w=Ae.width||0,m=Ae.height||0,v=Po.count>1?220:110,S=34;try{let I=ct({x:g.x+w/2,y:g.y}),H=ct({x:g.x+w/2,y:g.y+m}),R=I.x-d.left-v/2,X=I.y-d.top-S-10;return X<8&&(X=H.y-d.top+10),R=Math.max(8,Math.min(R,d.width-v-8)),X=Math.max(8,Math.min(X,d.height-S-8)),{left:R,top:X}}catch{return null}},[Ae,Po,At,ct]),Tc=sa(D,T),Ec=da(D,{touchAction:"none",...E}),Rc=p??fc,vc=u??gc,Dc=h??pc,Sc=useCallback(d=>{if(Ee)return;let g=Wi(d);if(g){if(!F){j.setState({nodes:g});return}n?.(g);}},[Ee,Wi,F,j,n]),Ic=useCallback(d=>{if(Ee)return;let g=d.filter(m=>{if(m.type==="remove"){let v=G.current.find(S=>S.id===m.id);if(v){let S=v.sourceHandle||"",I=v.targetHandle||"";if(S.startsWith("tube-")||I.startsWith("tube-"))return s&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",v),false}}return true});if(g.length===0)return;let w=applyEdgeChanges(g,G.current);if(Yt(g),!F){j.setState({edges:w});return}i?.(w);},[Ee,s,Yt,F,j,i]);return jsxs("div",{ref:pt,className:Tc,style:Ec,children:[jsxs(ReactFlow,{nodes:ve,edges:Cc,onNodesChange:Sc,onEdgesChange:Ic,onConnect:Ee?void 0:Rc,onConnectStart:Nc,onConnectEnd:kc,onEdgeUpdate:Ee?void 0:vc,isValidConnection:Dc,connectionMode:x,onNodeClick:bc,onNodeDoubleClick:mc,onPaneClick:yc,onNodeDragStart:dc,onNodeDrag:lc,onNodeDragStop:uc,onEdgeClick:hc,onInit:M,nodeTypes:fn,edgeTypes:kr,defaultEdgeOptions:No,nodesDraggable:Me.nodesDraggable,nodesConnectable:Me.nodesConnectable,elementsSelectable:Me.elementsSelectable,edgesFocusable:Me.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:Me.connectOnClick,panOnDrag:Me.panOnDrag,panOnScroll:Me.panOnScroll,maxZoom:4,zoomOnScroll:Me.zoomOnScroll,zoomOnPinch:Me.zoomOnPinch,zoomOnDoubleClick:Me.zoomOnDoubleClick,preventScrolling:it,onlyRenderVisibleElements:true,fitView:true,fitViewOptions:te,proOptions:Jt,children:[jsx(Background,{color:ca(D)}),Me.showControls&&jsx(Controls,{showInteractive:Me.showInteractiveControl}),Me.showMiniMap&&jsx(MiniMap,{}),jsx(Panel,{position:"bottom-right",className:"react-networks-attribution",children:jsx("a",{href:"https://github.com/MP70/react-networks",target:"_blank",rel:"noopener noreferrer",className:"react-networks-attribution-link",children:"react-networks"})})]}),L&&jsx("button",{className:"download-button",onClick:Fe,disabled:yt,"aria-busy":yt,style:{position:"absolute",top:z.includes("top")?"10px":"auto",bottom:z.includes("bottom")?"10px":"auto",right:z.includes("right")?"10px":"auto",left:z.includes("left")?"10px":"auto",zIndex:1e3,background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:"4px",padding:"0.5rem 0.75rem",fontSize:"0.875rem",cursor:yt?"not-allowed":"pointer",opacity:yt?.7:1,transition:"all 0.2s ease",...ee},children:yt?`${A}...`:A}),Ae&&hn&&Po.count>0&&jsxs("div",{style:{position:"absolute",top:hn.top,left:hn.left,display:"flex",gap:8,zIndex:2e3},children:[Po.showRearToggle&&jsx("button",{onClick:d=>{d.preventDefault(),xc();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let d=Ae.data;return Ae.type==="rack"?(d?.face||"front")==="front"?"Switch to rear":"Switch to front":(d?.view||bt(d))==="front"?"Switch to rear":"Switch to front"})(),children:(()=>{let d=Ae.data;return Ae.type==="rack"?(d?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front":(d?.view||bt(d))==="front"?"\u21C4 Rear":"\u21C4 Front"})()}),Po.showDeRack&&jsx("button",{onClick:d=>{d.preventDefault(),Pc();},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"})]})]})},Su=e=>{let{document:t,initialDocument:o,onDocumentChange:r,onNodesChange:n,onEdgesChange:i,...a}=e,s=t!==void 0||o!==void 0,c=t!==void 0,[l,b]=useState(()=>o),f=t??l,p=useMemo(()=>f?Mn(f):null,[f]),u=useCallback(C=>C?{nodes:Ss(C.nodes,h.current?.nodes??[]),edges:Is(C.edges,h.current?.edges??[])}:null,[]),h=useRef(p),x=useRef(f),N=useMemo(()=>u(p),[p,u]);useEffect(()=>{h.current=N;},[N]),useEffect(()=>{x.current=f;},[f]);let k=useCallback((C,y)=>{let D=_n({nodes:C,edges:y},x.current);h.current={nodes:C,edges:y},x.current=D,c||b(D),r?.(D);},[c,r]),T=useCallback(C=>{let y=h.current?.edges??[];k(C,y),n?.(C);},[k,n]),E=useCallback(C=>{let y=h.current?.nodes??[];k(y,C),i?.(C);},[k,i]);if(s){let C=N??{nodes:[],edges:[]};return jsx(Ds,{...a,nodes:C.nodes,edges:C.edges,onNodesChange:T,onEdgesChange:E})}return jsx(Ds,{...e})};function Ss(e,t){let o=new Map(t.map(r=>[r.id,r]));return e.map(r=>{let n=o.get(r.id),i=r.type==="rack"?Pt(r.data):null;if(!n)return i?{...r,width:i.width,height:i.height}:r;let a={...r,...n.selected!==void 0?{selected:n.selected}:{},...n.dragging!==void 0?{dragging:n.dragging}:{},...n.resizing!==void 0?{resizing:n.resizing}:{}};return i?{...a,width:i.width,height:i.height}:{...a,...typeof n.width=="number"?{width:n.width}:{},...typeof n.height=="number"?{height:n.height}:{},...n.measured?{measured:n.measured}:{}}})}function Is(e,t){let o=new Map(t.map(r=>[r.id,r]));return e.map(r=>{let n=o.get(r.id);return n?{...r,...n.selected!==void 0?{selected:n.selected}:{}}:r})}var Fi=e=>jsx(ReactFlowProvider,{children:jsx(Su,{...e})});var Hi=class extends 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??jsxs("div",{role:"alert",style:{padding:16,margin:8,border:"1px solid #e53e3e",borderRadius:4,backgroundColor:"#fff5f5",color:"#c53030"},children:[jsx("strong",{children:"Diagram error"}),": ",o.message,jsx("button",{type:"button",onClick:this.reset,style:{marginLeft:12,padding:"4px 8px",cursor:"pointer"},children:"Try again"})]}):r}};function br(e,{rowHeight:t,tubeGap:o}){let r=[],n=[],i=e.kind??(e.tubeCount?"tube":"simple"),a=i==="tube"?Math.max(1,Math.min(24,e.tubeCount??1)):1,s=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<a;f+=1){let p=c+f,u=e.tubeColorMap?.[p];n.push({tubeIndex:p,y:b,label:`T${p}`,color:u??Ke(p)});for(let h=0;h<s;h+=1){let x=l+h,N=Wn(x);r.push({key:`${p}-${x}`,tubeIndex:i==="tube"?p:void 0,fiberIndex:x,y:b,color:io(x),striped:no(x),backgroundImage:typeof N.backgroundImage=="string"?N.backgroundImage:void 0}),b+=t;}f<a-1&&(b+=o);}return {rows:r,tubeLabels:n,height:b}}var _i=e=>typeof e=="object"&&e!==null,Mu=e=>{if(!_i(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&_i(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&_i(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},$u=e=>e==="fibre-flow"||e==="fibre-flow-link",Au=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,Lu=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",Ou=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!Au(n))return;let i=o.get(n.id),a=$u(n.type)?n.type:i?.type??Lu(n);r.push({...i??{},...n,type:a});}),r},$s=e=>`fiber-${e.tube??1}-${e.fiber}`,As=e=>io(e.fiber),Ls=e=>no(e.fiber),Bu=(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`},Wu=(e,t,o,r,n,i)=>e?`${o} ${i}`:t?`0 ${n} ${r} ${i}`:"6 6",zu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s})=>{let[c,l,b]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,curvature:.35}),f=typeof s?.lossDb=="number"?`${s.lossDb.toFixed(2)} dB`:"",p=s?.label??f,u=s?.sourceColor,h=s?.targetColor,x=s?.color??u??h??"#94a3b8",N=s?.sourceStriped??false,k=s?.targetStriped??false,T=s?.highlighted??true,E=s?.dimmed??false,C=s?.circuitId,y=s?.circuitLabel??C,D=s?.showCircuitId??false,M=u&&h&&u!==h,O=r-t,L=n-o,z=Math.sqrt(O*O+L*L),A=l-t,ee=b-o,V=Math.sqrt(A*A+ee*ee),K=z>0?V/z*100:50,ie=`fibre-flow-gradient-${e}`,B=N&&!k,U=k&&!N,W=N&&k,$=z*1.25,J=$/2,te=12,_=Math.ceil(J*1.2/te),F=Array(_).fill("6 6").join(" "),ae=Math.ceil(J*1.2/te),de=Array(ae).fill("6 6").join(" "),ne=D&&y,j=Math.max(p?p.length*6.2+16:0,ne?(y?.length||0)*5.5+16:0),Te=ne?32:16;return jsxs(Fragment,{children:[jsx("defs",{children:M&&jsxs("linearGradient",{id:ie,x1:t,y1:o,x2:r,y2:n,gradientUnits:"userSpaceOnUse",children:[jsx("stop",{offset:"0%",stopColor:u}),jsx("stop",{offset:`${K}%`,stopColor:u}),jsx("stop",{offset:`${K}%`,stopColor:h}),jsx("stop",{offset:"100%",stopColor:h})]})}),M?jsx("path",{id:e,d:c,fill:"none",stroke:`url(#${ie})`,strokeWidth:T?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:E?.25:1,strokeOpacity:E?.25:1,style:{mixBlendMode:"normal"}}):jsx(BaseEdge,{id:e,path:c,style:{stroke:x,strokeWidth:T?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:E?.25:1,strokeOpacity:E?.25:1,mixBlendMode:"normal"}}),(W||B||U)&&jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:T?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:Wu(B,U,F,de,J,$),strokeDashoffset:0,opacity:E?.2:.9,style:{mixBlendMode:"normal"}}),(p||ne)&&T&&jsx(EdgeLabelRenderer,{children:jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${b}px)`,width:j,height:Te,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:[p&&jsx("div",{style:{lineHeight:1.2},children:p}),ne&&jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:p?2:0},children:y})]})})]})},Uu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s})=>{let[c,l,b]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,curvature:.2}),f=s?.label,p=s?.color??"#64748b";return jsxs(Fragment,{children:[jsx(BaseEdge,{id:e,path:c,style:{stroke:p,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),f&&jsx(EdgeLabelRenderer,{children: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 ${p}`,borderRadius:10,fontSize:10,fontFamily:"monospace",color:"#e2e8f0",letterSpacing:.2,whiteSpace:"nowrap",pointerEvents:"none",zIndex:9999},children:f})})]})},Gu=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:n,showTubeLabels:i,showFiberNumbers:a,layout:s,colorMode:c="dark"}=e,l=c==="light",b=8,f=12,p=-1,u=0,h=t.jacketColor??"#facc15",x=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",N=i&&x,k=o==="left"?b+u:u,T=o==="right"?b+u:u,E=o==="left"?Position.Right:Position.Left,C={width:4,height:4,borderRadius:"50%",background:h,border:`1px solid ${h}`,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 jsxs("div",{style:{position:"relative",width:n,height:s.height,fontFamily:"monospace",color:"inherit",overflow:"visible"},children:[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}),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":h,border:`1px solid ${h}`,boxShadow:x?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:x&&s.tubeLabels.map((y,D)=>{let M=s.rows.filter(V=>V.tubeIndex===y.tubeIndex);if(M.length===0)return null;let O=M[0].y,L=M[M.length-1].y+r,z=L-O,A=s.tubeLabels[D+1],ee=A&&A.y-L>0;return jsx("div",{style:{position:"absolute",top:O,left:0,right:0,height:z,background:y.color,borderLeft:`2px solid ${y.color}`,borderRight:`2px solid ${y.color}`,borderTop:D===0?`2px solid ${y.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:ee?"1px solid rgba(0,0,0,0.15)":`2px solid ${y.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:D===0&&!ee||D===0?"4px 4px 0 0":ee?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${y.tubeIndex}`)})}),!N&&jsx("div",{style:{position:"absolute",top:0,bottom:0,left:k,right:T,...o==="left"?{borderRight:`1px solid ${h}`}:{borderLeft:`1px solid ${h}`},pointerEvents:"none",zIndex:0}}),x&&s.tubeLabels.map((y,D)=>{let M=s.rows.filter(A=>A.tubeIndex===y.tubeIndex);if(M.length===0)return null;let O=M[0].y,z=M[M.length-1].y+r-O;return jsx("div",{style:{position:"absolute",top:O,left:k,right:T,height:z,...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 D=`fiber-${y.tubeIndex??1}-${y.fiberIndex}`,M=y.y+r/2,O={position:"absolute",width:f,height:f,borderRadius:"50%",top:M,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&&(O["--fiber-bg-image"]=y.backgroundImage);let L=o==="left"?{right:f+p,textAlign:"right"}:{left:f+p,textAlign:"left"};return jsxs(Re.Fragment,{children:[jsx(Handle,{id:D,type:"source",position:E,className:"fibre-flow-handle",style:O,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),jsx(Handle,{id:D,type:"target",position:E,className:"fibre-flow-handle",style:O,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),a&&jsx("div",{style:{position:"absolute",top:y.y+r/2-6,...L,fontSize:8,fontWeight:600,color:l?"rgba(15, 23, 42, 0.7)":"rgba(148, 163, 184, 0.95)",whiteSpace:"nowrap",lineHeight:1},children:y.fiberIndex})]},y.key)}),jsx(Handle,{id:"cable-run",type:"source",position:o==="left"?Position.Left:Position.Right,className:"cable-run-handle",style:C,isConnectable:true,"data-handle-type":"cable-run"}),jsx(Handle,{id:"cable-run",type:"target",position:o==="left"?Position.Left:Position.Right,className:"cable-run-handle",style:C,isConnectable:true,"data-handle-type":"cable-run"})]})},Vu=({data:e})=>{let t=e.colorMode==="light";return 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: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})})},Xu=(e,t,o,r,n,i,a,s,c,l="dark")=>{let b=[],f=0;return e.forEach(p=>{let u=br(p.leftCable,{rowHeight:o,tubeGap:r}),h=br(p.rightCable,{rowHeight:o,tubeGap:r}),x=Math.max(u.height,h.height),N=i*2+a,k=32,T=16,E=N+T*2,C=x+k+T*2,y=`flow-closure-${p.id}`,D=`flow-cable-${p.id}-left`,M=`flow-cable-${p.id}-right`,O=t==="horizontal"?{x:f,y:0}:{x:0,y:f};f+=(t==="horizontal"?E:C)+n;let L=p.chamberId?`${p.id} - ${p.chamberId}`:p.id;b.push({id:y,type:"fibre-flow-closure",position:O,data:{label:L,width:E,height:C,headerHeight:k,colorMode:l},selectable:false,draggable:false,style:{width:E,height:C}});let z=k+T+(x-u.height)/2,A=k+T+(x-h.height)/2;b.push({id:D,type:"fibre-flow-cable",position:{x:T,y:z},parentId:y,extent:"parent",data:{label:p.leftCable.label,cable:p.leftCable,side:"left",rowHeight:o,columnWidth:i,showTubeLabels:s,showFiberNumbers:c,layout:u,colorMode:l},style:{width:i,height:u.height}}),b.push({id:M,type:"fibre-flow-cable",position:{x:T+N-i,y:A},parentId:y,extent:"parent",data:{label:p.rightCable.label,cable:p.rightCable,side:"right",rowHeight:o,columnWidth:i,showTubeLabels:s,showFiberNumbers:c,layout:h,colorMode:l},style:{width:i,height:h.height}});}),b},ju=(e,t,o,r=false)=>{let n=[],i=new Map,a=new Map,s=new Map;return (t??[]).forEach(c=>{c.color&&i.set(c.id,c.color),c.label&&a.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:p,cable:u})=>{let h=s.get(u.id);if(h&&h.closureId!==c.id){let x=Bu(u.distanceMeters??h.distanceMeters,u.distanceLabel??h.distanceLabel),N=u.jacketColor??h.jacketColor??"#64748b";n.push({id:`flow-link-${h.nodeId}-${p}`,type:"fibre-flow-link",source:h.nodeId,target:p,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:x,color:N}});}s.set(u.id,{nodeId:p,closureId:c.id,jacketColor:u.jacketColor,distanceLabel:u.distanceLabel,distanceMeters:u.distanceMeters});}),c.splices.forEach(p=>{let u=o?p.circuitId===o:true,h=!!o&&!u,x=p.circuitId?i.get(p.circuitId):void 0,N=p.circuitId?a.get(p.circuitId):void 0,k=p.color??x,T=As(p.from),E=As(p.to),C=Ls(p.from),y=Ls(p.to);n.push({id:`flow-edge-${c.id}-${p.id}`,type:"fibre-flow",source:l,target:b,sourceHandle:$s(p.from),targetHandle:$s(p.to),data:{lossDb:p.lossDb,label:p.label,color:k,sourceColor:T,targetColor:E,sourceStriped:C,targetStriped:y,highlighted:u,dimmed:h,circuitId:p.circuitId,circuitLabel:N,showCircuitId:r}});});}),n},Yu=({closures:e,circuits:t,highlightedCircuitId:o,layout:r="horizontal",rowHeight:n=20,tubeGap:i=10,closureGap:a=140,cableColumnWidth:s=32,spliceAreaWidth:c=260,showTubeLabels:l=true,showFiberNumbers:b=true,colorMode:f="dark",showCircuitId:p=false,className:u,style:h,readOnly:x=false,panOnDrag:N=true,panOnScroll:k=true,zoomOnScroll:T=true})=>{let E=useMemo(()=>Xu(e,r,n,i,a,s,c,l,b,f),[e,r,n,i,a,s,c,l,b,f]),C=useMemo(()=>ju(e,t,o,p),[e,t,o,p]),[y,D]=useState(E),[M,O]=useState(C);useEffect(()=>{D(E);},[E,D]),useEffect(()=>{O(C);},[C,O]);let L=useCallback((W,$)=>{if(!W||!$||!$.startsWith("fiber-"))return;let J=y.find(ne=>ne.id===W);if(!J||J.type!=="fibre-flow-cable")return;let te=/^fiber-(\d+)-(\d+)$/.exec($);if(!te)return;let _=Number(te[1]),F=Number(te[2]),de=J.data.layout.rows.find(ne=>(ne.tubeIndex??1)===_&&ne.fiberIndex===F);if(de)return {color:de.color,striped:de.striped??false}},[y]),z=useCallback(W=>{if(x||!W.source||!W.target||!W.sourceHandle||!W.targetHandle)return false;let $=y.find(ae=>ae.id===W.source),J=y.find(ae=>ae.id===W.target);if(!$||!J)return false;let te=typeof W.sourceHandle=="string"&&W.sourceHandle.startsWith("fiber-"),_=typeof W.targetHandle=="string"&&W.targetHandle.startsWith("fiber-");return W.sourceHandle==="cable-run"||W.targetHandle==="cable-run"?true:te&&_?$.type==="fibre-flow-cable"&&J.type==="fibre-flow-cable":false},[y,x]),A=useCallback(W=>{if(x)return;let $=W.sourceHandle==="cable-run"||W.targetHandle==="cable-run",J=j=>typeof j=="string"&&j.startsWith("fiber-"),te=J(W.sourceHandle),_=J(W.targetHandle),F=(j,Te,Ie)=>j.source===Te&&j.sourceHandle===Ie||j.target===Te&&j.targetHandle===Ie,ae=$?void 0:L(W.source,W.sourceHandle),de=$?void 0:L(W.target,W.targetHandle),ne=$?void 0:{sourceColor:ae?.color,targetColor:de?.color,color:ae?.color??de?.color,sourceStriped:ae?.striped,targetStriped:de?.striped};O(j=>{let Te=j.filter(Ie=>{let ve=te&&F(Ie,W.source,W.sourceHandle),he=_&&F(Ie,W.target,W.targetHandle);return !(ve||he)});return addEdge({...W,type:$?"fibre-flow-link":"fibre-flow",data:ne},Te)});},[L,x,O]),ee=useCallback((W,$)=>{if(x)return;let J=$.sourceHandle==="cable-run"||$.targetHandle==="cable-run",te=J?void 0:L($.source,$.sourceHandle),_=J?void 0:L($.target,$.targetHandle),F=J?void 0:{sourceColor:te?.color,targetColor:_?.color,color:te?.color??_?.color,sourceStriped:te?.striped,targetStriped:_?.striped},ae=ne=>typeof ne=="string"&&ne.startsWith("fiber-"),de=(ne,j,Te)=>ne.source===j&&ne.sourceHandle===Te||ne.target===j&&ne.targetHandle===Te;O(ne=>{let j=ne.filter(he=>he.id!==W.id),Te=ae($.sourceHandle),Ie=ae($.targetHandle),ve=j.filter(he=>{let nt=Te&&de(he,$.source,$.sourceHandle),Qe=Ie&&de(he,$.target,$.targetHandle);return !(nt||Qe)});return addEdge({...$,type:J?"fibre-flow-link":"fibre-flow",data:F},ve)});},[L,x,O]),V=useCallback(W=>{x||D(W.filter(Mu));},[x,D]),K=useCallback(W=>{x||O($=>Ou(W,$));},[x,O]),ie=useMemo(()=>({"fibre-flow-cable":Gu,"fibre-flow-closure":Vu}),[]),B=useMemo(()=>({"fibre-flow":zu,"fibre-flow-link":Uu}),[]),U={borderRadius:8,overflow:"hidden",...h};return jsx(Fi,{nodes:y,edges:M,onNodesChange:V,onEdgesChange:K,onConnect:A,onEdgeUpdate:ee,isValidConnection:z,connectionMode:ConnectionMode.Loose,nodeTypes:ie,edgeTypes:B,className:u,style:U,colorMode:f,readOnly:x,panOnDrag:N,panOnScroll:k,zoomOnScroll:T,fitViewOptions:{padding:.2}})},Ku=e=>jsx(Yu,{...e});var Ju=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:n=150,layout:i,showTubeLabels:a,showFiberNumbers:s=true,showCableLabel:c=true})=>{let l=useMemo(()=>i??br(e,{rowHeight:o,tubeGap:r}),[i,e,o,r]),b=26,f=10,p=18,u=t==="left"?n-p:p,h=8,x=t==="left"?6:n-b-18,N=e.jacketColor??"#facc15",k=a??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxs("div",{style:{position:"relative",width:n,height:l.height,fontFamily:"monospace",color:"inherit"},children:[c&&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}),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, ${N} 0%, ${N} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${N}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),k&&l.tubeLabels.map(T=>jsxs("div",{style:{position:"absolute",top:T.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:[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)"}}),jsx("span",{children:T.label})]},`tube-${T.tubeIndex}`)),l.rows.map(T=>{let E=T.y+o/2-f/2,C=t==="left"?u-f/2-h:u+f/2+h;return jsxs(Re.Fragment,{children:[jsx("div",{style:{position:"absolute",top:E,left:u-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&&jsx("div",{style:{position:"absolute",top:T.y+o/2-6,left:C,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:T.fiberIndex})]},T.key)})]})};var Us=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}}),Gs=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}}),Vs=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}}},Qu=e=>{let t=[],o=[];return e.racks.forEach(r=>t.push(Us(r))),e.devices.forEach(r=>t.push(Gs(r))),e.cables.forEach(r=>o.push(Vs(r))),{nodes:t,edges:o}},ep=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(a=>a.id===n.parentId);if(i){let a=n.data.uPosition||1,s=n.data.uHeight||1;n.position={x:i.position.x+50,y:i.position.y+a*20-s*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 Xs=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,tp="Interfaces",op="Management",rp="Power",js=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Mt=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0};var $t=e=>{if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},np=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",ln=e=>js(e.custom_fields)?e.custom_fields:void 0,un=e=>js(e)?e:void 0,Ys=(e,t)=>{let o=ln(e),r=un(o?.layout);return np(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},Ks=(e,t,o)=>{let r=ln(e),n=un(r?.layout),i=Mt(o)??Mt(e.layout?.group)??Mt(e.port_group)??Mt(n?.group)??Mt(r?.port_group)??Mt(r?.portGroup)??Mt(r?.interface_group)??Mt(r?.interfaceGroup)??Mt(r?.group);return i||(t==="power_ac"||t==="power_c13"||t==="power_c19"?rp:t==="console"||t==="mgmt"?op:tp)},qs=(e,t,o)=>{let r=ln(e),n=un(r?.layout);return $t(o)??$t(e.layout?.connectorType)??$t(e.layout?.connector_type)??$t(e.connector_type)??$t(n?.connectorType)??$t(n?.connector_type)??$t(r?.connectorType)??$t(r?.connector_type)??$t(t)},Zs=(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"},Js=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"}},ip=e=>typeof e=="string"?Er(e):Bt(e),Qs=(e,t,o)=>{if(!o)return;let r=ln(e),n=un(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 a of i){let s=ip(a);if(s)return s}},ap=(e,t)=>{let o=e.type?.value??e.type?.label??e.layout?.type??void 0,r=qs(e,o),n=Zs(o,r),i=Ks(e,n);return {label:e.name,face:Ys(e),group:i,type:n,cableType:Js(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:Qs(e,void 0,t)}},sp=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)}),cp=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[];return sp(e.interfaces??[]).forEach((a,s)=>{let c=r?r({device:e,iface:a,index:s}):ap(a,o);if(!c)return;let l=c.type??a.type?.value??a.type?.label??void 0,b=qs(a,l,c.connectorType),f=Zs(l,b),p=Ys(a,c.face),u=Ks(a,f,c.group);n.push({id:c.id,label:c.label??a.name,face:p,group:u,connected:c.connected??!!(a.connected_endpoint||a.cable),type:f,cableType:Js(c.cableType??a.type?.value??a.type?.label??void 0),connectorType:b,position:Qs(a,c,o)});}),n},ec=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}}),tc=(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 r=cp(e,t);r.length>0&&(o.ports=r);}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}},oc=e=>({id:`cable-${e.id}`,source:Xs(e.termination_a.device),target:Xs(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}}),dp=(e,t={})=>{let o=[],r=[],n=new Map;return e.racks.forEach(i=>{o.push(ec(i));}),e.devices.forEach(i=>{let a=tc(i,t);o.push(a),n.set(i.name,a.id);}),e.cables.forEach(i=>{let a=oc(i),s=(typeof i.termination_a.device.id=="number"?`device-${i.termination_a.device.id}`:void 0)??n.get(i.termination_a.device.name)??a.source,c=(typeof i.termination_b.device.id=="number"?`device-${i.termination_b.device.id}`:void 0)??n.get(i.termination_b.device.name)??a.target;r.push({...a,source:s,target:c});}),{nodes:o,edges:r}},lp=(e,t)=>{let o=new Map,r=new Set;return e.filter(i=>i.position!==null).sort((i,a)=>(i.position||0)-(a.position||0)).forEach(i=>{i.position&&(o.set(i.id,i.position),r.add(i.position));}),o};function pn(e){let{items:t,checkOutOfBounds:o,checkConflicts:r}=e,n=[],i=[];for(let a of t){let s=o(a);s&&!s.isValid&&s.error&&i.push(s.error);}for(let a=0;a<t.length;a++){let s=t[a];for(let c=a+1;c<t.length;c++){let l=t[c],b=r(s,l);b&&b.hasConflict&&b.conflict&&n.push(b.conflict);}}return {isValid:n.length===0&&i.length===0,conflicts:n,outOfBounds:i}}var Wo=class extends Error{constructor(o,r,n,i,a){super(`Device placement conflict: ${r} at U${n}-${n+i-1} in rack ${o}${a?` conflicts with ${a}`:""}`);this.rackId=o;this.deviceId=r;this.uPosition=n;this.uHeight=i;this.conflictWith=a;this.name="DevicePlacementError";}};function $i(e,t={}){let o=_e(e);return pn({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,a=r.unit+r.height-1,s=n.unit,c=n.unit+n.height-1;if(i<=c&&a>=s){if(o){let l=je(r),b=je(n);if(!Sr(l,b))return null}return {hasConflict:true,conflict:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,conflictWith:n.id}}}return null}})}function rc(e,t,o={}){let{deviceTypeMapping:r={}}=o,n=r[e.type]||"device",i=So(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,isRackMounted:true,width:e.width||"full",role:e.role,ports:e.ports,portGroups:e.portGroups,rearPortGroups:e.rearPortGroups,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:je(e)}}}function up(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,rackWidthPx:e.rackWidthPx,rackLayout:e.rackLayout,rackFaceGapPx:e.rackFaceGapPx}}}function pp(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],i=[];if(r)for(let a of e){let s=$i(a,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} conflicts with ${l.conflictWith}`);}),s.outOfBounds.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} exceeds rack height (${l.rackUHeight}U)`);}),new Wo(a.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 a of e){let s=up(a);n.push(s);for(let c of a.devices)try{let l=rc(c,s,t);i.push(l);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let b=Mr(s,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:je(c)}},i,c.unit);if(b!==void 0&&b!==c.unit){console.warn(`Device ${c.id} moved from U${c.unit} to U${b} due to conflict`);let f={...c,unit:b},p=rc(f,s,t);i.push(p);}else throw new Wo(a.id,c.id,c.unit,c.height)}}}return n.push(...i),n}function fp(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let i=e.filter(a=>er(a.type)&&a.parentId===r.id).map(a=>({id:a.id,name:a.data.label,unit:a.data.uPosition||1,height:a.data.uHeight||1,type:a.data.deviceType||"server",width:a.data.width==="full"||a.data.width==="half"?a.data.width:void 0,ports:Array.isArray(a.data.ports)?a.data.ports:void 0,portGroups:Array.isArray(a.data.portGroups)?a.data.portGroups:void 0,rearPortGroups:Array.isArray(a.data.rearPortGroups)?a.data.rearPortGroups:void 0,connections:a.data.connections,frontImageUrl:a.data.frontImageUrl,rearImageUrl:a.data.rearImageUrl,frontImageAttribution:a.data.frontImageAttribution,rearImageAttribution:a.data.rearImageAttribution,imageFit:a.data.imageFit,imagePosition:a.data.imagePosition,imageRepeat:a.data.imageRepeat,stretchToFit:a.data.stretchToFit,mountMode:je(a.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 gp(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 bp(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(i=>{if(i.id!==t)return i;if(n==="strict"&&!$i({...i,devices:[...i.devices,o]},r).isValid)throw new Wo(t,o.id,o.unit,o.height);return {...i,devices:[...i.devices,o]}})}function mp(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(n=>n.id!==o)})}var zo=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 Ai(e,t={}){return pn({items:e.splices,checkOutOfBounds:o=>o.holder<1||o.holder>Vt?{isValid:false,error:{spliceId:o.id,holder:o.holder,max:Vt}}:null,checkConflicts:(o,r)=>o.holder===r.holder?{hasConflict:true,conflict:{spliceId:o.id,holder:o.holder,conflictWith:r.id}}:null})}function nc(e,t){let o=e.mode==="ribbon",r=ur(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 hp(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function yp(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],i=[];if(r)for(let a of e){let s=Ai(a,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} conflicts with ${l.conflictWith}`);}),s.outOfBounds.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} is out of bounds (max: ${l.max})`);}),new zo(a.id,s.conflicts[0]?.spliceId||s.outOfBounds[0]?.spliceId||"unknown",s.conflicts[0]?.holder||s.outOfBounds[0]?.holder||1)}}for(let a of e){let s=hp(a);n.push(s);for(let c of a.splices)try{let l=c.holder;if(o==="nearest"){let p={id:c.id,type:"splice",position:{x:0,y:0},data:{label:c.name,holderPosition:c.holder}},u=[...n,...i];cr(s,p,c.holder,u)||(l=lr(s,p,u,c.holder));}let b=l!==c.holder?{...c,holder:l}:c,f=nc(b,s);i.push(f);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let b=[...n,...i],f=lr(s,{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 p={...c,holder:f},u=nc(p,s);i.push(u);}else throw new zo(a.id,c.id,c.holder)}}}return n.push(...i),n}function wp(e){let t=[],o=e.filter(r=>r.type==="splice-tray");for(let r of o){let i=e.filter(a=>a.type==="splice"&&a.parentId===r.id).map(a=>({id:a.id,name:a.data.label,holder:a.data.holderPosition||1,lossDb:a.data.lossDb,mode:a.data.mode||"single",ribbonFiberIds:a.data.ribbonFiberIds}));t.push({id:r.id,name:r.data.label,position:r.position,splices:i});}return t}function Np(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 kp(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(i=>{if(i.id!==t)return i;if(n==="strict"&&!Ai({...i,splices:[...i.splices,o]},r).isValid)throw new zo(t,o.id,o.holder);return {...i,splices:[...i.splices,o]}})}function xp(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}var ic=2;var me=e=>typeof e=="string"?e.trim():"",ac=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},Pp=e=>{let t=me(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},Cp=(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"},Tp=e=>{if(e==="power_c13")return "C13";if(e==="power_c19")return "C19";if(e==="power_ac")return "AC"},Ep=e=>e.toLowerCase().replace(/_/g,"-").trim(),Rp=e=>e>=1?"rackable":"zero-u",vp=e=>(e??"").toLowerCase()==="half"?"half":"full",Dp=(e,t,o,r)=>{let n=r.replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();return `${e}-b${t}-${n||`p${o}`}`},sc=(e,t)=>`${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");function Sp(e){let t=[],o=me(e.manufacturer),r=me(e.model),n=me(e.role)||me(e.deviceType)||me(e.device_type)||"device",i=ac(e.uHeight)??ac(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 a=me(e.id)||me(e.slug)||sc(o,r)||"unknown",s=me(e.slug)||sc(o,r)||a,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(p=>({frontPortId:me(p.frontPortId)||me(p.front_port_id),rearPortId:me(p.rearPortId)||me(p.rear_port_id)}));return {id:a,slug:s,manufacturer:o,model:r,role:n,uHeight:i,width:me(e.width)||void 0,frontBlocks:c,rearBlocks:l,rawLinks:f,frontImageUrl:me(e.frontImageUrl)||me(e.front_image_url)||void 0,rearImageUrl:me(e.rearImageUrl)||me(e.rear_image_url)||void 0,frontImageAttribution:me(e.frontImageAttribution)||void 0,rearImageAttribution:me(e.rearImageAttribution)||void 0,tags:Array.isArray(e.tags)?e.tags.map(me).filter(Boolean):[],sourceRepository:me(e.sourceRepository)||me(e.source_repository)||void 0,sourcePath:me(e.sourcePath)||me(e.source_path)||void 0,issues:t}}function cc(e,t,o){let r=me(e.name)||`Block ${o+1}`,i=(Array.isArray(e.ports)?e.ports:[]).map((a,s)=>{let c=me(a.label)||me(a.name)||`Port ${s+1}`,l=Pp(a.connectorType??a.connector_type),b=Cp(me(a.type),l),f=l??Tp(b),u={id:me(a.id)||Dp(t,o,s,c),label:c,type:b,connectorType:f};if(a.position){let h=Bt(a.position);h&&(u.position=h);}return u});return {name:r,ports:i}}function Ip(e){let t=[],o=Ep(e.role),r=e.uHeight,n=Rp(r),i=vp(e.width),a=e.frontBlocks.map((c,l)=>cc(c,"front",l)),s=e.rearBlocks.map((c,l)=>cc(c,"rear",l));return {role:o,mountClass:n,uHeight:r,width:i,frontFace:{portBlocks:a,imageUrl:e.frontImageUrl,imageAttribution:e.frontImageAttribution},rearFace:{portBlocks:s,imageUrl:e.rearImageUrl,imageAttribution:e.rearImageAttribution},issues:t}}function Fp(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 Hp(e){let t=[],{front:o,rear:r}=Fp(e.frontFace,e.rearFace),n=e.role;return (!n||n==="device")&&[...o.portBlocks,...r.portBlocks].some(a=>a.ports.some(s=>s.type&&s.type.startsWith("power")))&&e.mountClass==="zero-u"&&(n="pdu"),{frontFace:o,rearFace:r,mountClass:e.mountClass,role:n,issues:t}}function mr(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function _p(e,t){let o=[],r=[];for(let u of t.frontFace.portBlocks)for(let h of u.ports)r.push({id:h.id,face:"front"});for(let u of t.rearFace.portBlocks)for(let h of u.ports)r.push({id:h.id,face:"rear"});let n=new Map;for(let{id:u}of r)n.set(u,(n.get(u)??0)+1);for(let[u,h]of n)h>1&&o.push({severity:"error",code:"DUPLICATE_PORT_ID",message:`Duplicate port id "${u}" found ${h} times`,path:`ports.${u}`});let i=e.frontBlocks.reduce((u,h)=>u+(Array.isArray(h.ports)?h.ports.length:0),0),a=e.rearBlocks.reduce((u,h)=>u+(Array.isArray(h.ports)?h.ports.length:0),0),s=mr(t.frontFace),c=mr(t.rearFace);s!==i&&o.push({severity:"error",code:"FRONT_PORT_COUNT_MISMATCH",message:`Front port count mismatch: raw=${i}, parsed=${s}`,path:"faces.front"}),c!==a&&o.push({severity:"error",code:"REAR_PORT_COUNT_MISMATCH",message:`Rear port count mismatch: raw=${a}, parsed=${c}`,path:"faces.rear"});let l=new Set(r.map(u=>u.id)),b=new Set(r.filter(u=>u.face==="front").map(u=>u.id)),f=new Set(r.filter(u=>u.face==="rear").map(u=>u.id));for(let u of e.rawLinks)u.frontPortId&&!b.has(u.frontPortId)&&!l.has(u.frontPortId)&&o.push({severity:"warning",code:"PASS_THROUGH_FRONT_PORT_MISSING",message:`Pass-through link references unknown front port "${u.frontPortId}"`,path:"frontRearPortLinks"}),u.rearPortId&&!f.has(u.rearPortId)&&!l.has(u.rearPortId)&&o.push({severity:"warning",code:"PASS_THROUGH_REAR_PORT_MISSING",message:`Pass-through link references unknown rear port "${u.rearPortId}"`,path:"frontRearPortLinks"});return {valid:!o.some(u=>u.severity==="error"),issues:o,portCounts:{front:s,rear:c}}}function Mp(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 $p(e){let t=Sp(e),o=Ip(t),r=Hp(o),n=_p(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:Mp(t,o,r),report:n}:{template:null,report:n}}function Ap(e){return mr(e)}function Lp(e,t,o){let r=[],n=mr(e.faces.front),i=mr(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
|
-
export{
|
|
1
|
+
import Ce,{useState,useMemo,useRef,useEffect,Component,useCallback,useSyncExternalStore}from'react';import {useReactFlow,Handle,Position,getBezierPath,BaseEdge,EdgeLabelRenderer,useUpdateNodeInternals,useEdges,addEdge,ReactFlowProvider,ConnectionMode,useNodesState,useEdgesState,applyNodeChanges,useOnSelectionChange,applyEdgeChanges,ReactFlow,Background,Controls,MiniMap,Panel,getSmoothStepPath,SmoothStepEdge}from'reactflow';import {toPng}from'html-to-image';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Xc=/-(source|target)$/i,Yc=/--rear$/i;function $t(e){return e?e.replace(Xc,""):""}function Je(e){return $t(e).replace(Yc,"")}function Qe(e){return typeof e=="string"&&e.includes("power")}function Tt(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:Qe(t.type)?t.label:`${e}-${t.label}`}function Hn(e){let t=$t(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}var _n={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 Vt(e){let t=_n[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,a=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",...a}}function oa(e){let t=_n[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function Kc(e){return oa(e).amperage===16}function At(e){return e%10<8?"C13":"C19"}function Mn(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var qc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),So=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}},Zc=e=>e.trim().toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>0),$n=e=>{if(e==="top"||e==="up")return "top";if(e==="right")return "right";if(e==="bottom"||e==="down")return "bottom";if(e==="left")return "left"},ra=e=>e.includes("center")||e.includes("centre")||e.includes("middle")||e.includes("mid"),Jc=(e,t)=>{let o=t.includes("left"),r=t.includes("right"),n=t.includes("top")||t.includes("up"),i=t.includes("bottom")||t.includes("down"),a=ra(t);if(e==="top"||e==="bottom")return o&&a&&!r?34:r&&a&&!o?66:o&&!r?12:r&&!o?88:a?50:void 0;if(n&&a&&!i)return 34;if(i&&a&&!n)return 66;if(n&&!i)return 12;if(i&&!n)return 88;if(a)return 50},Qc=e=>{if(e.includes("front")||e.includes("rear")||e.includes("back"))return;let o=e.map($n).find(n=>n!==void 0);if(!o)return;let r=Jc(o,e);if(r!==void 0)return {side:o,offsetPercent:r}},ed=e=>{if(e.length===0)return;let t=e.includes("left"),o=e.includes("right"),r=ra(e),n=e.includes("front")||e.includes("top")||e.includes("up"),i=e.includes("rear")||e.includes("back")||e.includes("bottom")||e.includes("down"),a;t&&r&&!o?a=34:o&&r&&!t?a=66:t&&!o?a=12:o&&!t?a=88:r&&(a=50);let s;if(n&&!i?s=22:i&&!n?s=78:r&&(s=50),!(a===void 0||s===void 0))return {xPercent:a,yPercent:s}},Ar=e=>{let t=Zc(e);if(t.length!==0){if(t.length===1){let o=$n(t[0]);return o?{side:o}:void 0}return Qc(t)??ed(t)}},jt=e=>{if(typeof e=="string")return Ar(e);if(!qc(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"?Ar(t):void 0,n=(typeof t=="string"?$n(t.trim().toLowerCase()):void 0)??o?.side,i=So(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct)??o?.offsetPercent,a=So(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels)??o?.offsetPx,s=So(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x)??o?.xPercent,c=So(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y)??o?.yPercent,l=So(e.widthPercent??e.width_percent??e.widthPct??e.width_pct??e.wPercent??e.w_percent),g=So(e.heightPercent??e.height_percent??e.heightPct??e.height_pct??e.hPercent??e.h_percent);if(!(n===void 0&&i===void 0&&a===void 0&&s===void 0&&c===void 0&&l===void 0&&g===void 0))return {side:n,offsetPercent:i,offsetPx:a,xPercent:s,yPercent:c,widthPercent:l,heightPercent:g}};var td="Network Ports",od="Rear Network Ports",rd="Power Ports",na=8,nd=92;function Io(e){return Math.max(0,Math.min(100,e))}function An(e){if(e==="top"||e==="right"||e==="bottom"||e==="left")return e}function Fo(e){return jt(e)}function aa(e){let t=Fo(e.position);return typeof t?.xPercent=="number"&&typeof t?.yPercent=="number"}function id(e){let t=Fo(e.position);return typeof t?.offsetPercent=="number"||typeof t?.offsetPx=="number"}function ad(e){return e.face==="rear"||e.face==="back"?"rear":e.face==="front"?"front":Qe(e.type)?"rear":"front"}function sd(e,t){return typeof e.group=="string"&&e.group.trim().length>0?e.group.trim():Qe(e.type)?rd:t==="rear"?od:td}function Lr(e){return typeof e.port.order=="number"&&Number.isFinite(e.port.order)?e.port.order:e.index}function cd(e,t){return t<=1?50:na+e*(nd-na)/(t-1)}function dd(e){let t=e.filter(n=>!!An(Fo(n.port.position)?.side)&&!aa(n.port)&&!id(n.port)),o=new Map,r=new Map;return t.forEach(n=>{let i=An(Fo(n.port.position)?.side);if(!i)return;let a=r.get(i);if(a){a.push(n);return}r.set(i,[n]);}),r.forEach(n=>{let i=[...n].sort((a,s)=>{let c=Lr(a)-Lr(s);return c!==0?c:a.index-s.index});i.forEach((a,s)=>{o.set(a.index,cd(s,i.length));});}),o}function ld(e,t){let o=Fo(e.position),r=An(o?.side);if(aa(e)){let s={xPercent:Io(o?.xPercent),yPercent:Io(o?.yPercent)};return typeof o?.widthPercent=="number"&&Number.isFinite(o.widthPercent)&&(s.widthPercent=Io(o.widthPercent)),typeof o?.heightPercent=="number"&&Number.isFinite(o.heightPercent)&&(s.heightPercent=Io(o.heightPercent)),r&&(s.side=r),s}if(!r)return;let n={side:r};if(typeof o?.offsetPx=="number"&&Number.isFinite(o.offsetPx))return n.offsetPx=o.offsetPx,n;let a=(typeof o?.offsetPercent=="number"&&Number.isFinite(o.offsetPercent)?Io(o.offsetPercent):void 0)??(typeof t=="number"?Io(t):void 0);return typeof a=="number"&&(n.offsetPercent=a),n}function ud(e,t){let o=ld(e.port,t);return {id:e.port.id,label:e.port.label,sourceTypeLabel:e.port.sourceTypeLabel,connected:e.port.connected??false,type:e.port.type,cableType:e.port.cableType,connectorType:e.port.connectorType,compatibility:Array.isArray(e.port.compatibility)?[...e.port.compatibility]:void 0,...o?{position:o}:{}}}function ia(e){return e.map(t=>({...t,ports:t.ports.map(o=>{let r=Fo(o.position);return {...o,...r?{position:r}:{position:void 0}}})}))}function sa(e){let t=new Map;e.forEach((n,i)=>{if(typeof n.label!="string"||n.label.trim().length===0)return;let a=ad(n),s=sd(n,a),c=`${a}:${s}`,l=t.get(c);if(l){l.entries.push({index:i,port:{...n,label:n.label.trim()}});return}t.set(c,{face:a,groupName:s,entries:[{index:i,port:{...n,label:n.label.trim()}}]});});let o=[],r=[];return t.forEach(n=>{let i=[...n.entries].sort((c,l)=>{let g=Lr(c)-Lr(l);return g!==0?g:c.index-l.index}),a=dd(i),s={name:n.groupName,ports:i.map(c=>ud(c,a.get(c.index)))};if(n.face==="rear"){r.push(s);return}o.push(s);}),{ports:o,rearPorts:r}}function Ie(e){return Array.isArray(e?.ports)?sa(e.ports):{ports:ia(Array.isArray(e?.portGroups)?e.portGroups:[]),rearPorts:ia(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:[])}}function Ln(e){return Ie(e).ports}function Bn(e){return Ie(e).rearPorts}function ir(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function ca(e){return ir(Ie(e).ports)>0}function da(e){return ir(Ie(e).rearPorts)>0}function Ho(e){let t=ca(e);return da(e)&&!t?"rear":"front"}var pd=new Set(["patch-panel","closure","splice-tray"]),On=["frontImageUrl","rearImageUrl","frontImageAttribution","rearImageAttribution","imageFit","imagePosition","imageRepeat","stretchToFit"],Wn=["panelWidth","panelHeight","closureWidth","closureHeight","headerHeight"],zn=["status","width","widthPx","height","header","color","colorMode","showUMarkers","customHeaderText","powerSide","rotation","rackWidthPx","rackFaceGapPx"],fd=["face","handleSideMap"],gd=new Set(["label","ports","portGroups","rearPortGroups","pduPortGroups","connections","netboxId","netboxType","inventoryId","inventoryType","uPosition","mountMode","rackLayout","slotPosition","holderPosition",...On,...Wn,...zn,...fd]);function ua(e){return {x:typeof e?.x=="number"?e.x:0,y:typeof e?.y=="number"?e.y:0}}function sr(e){if(e)return {...e}}function ar(e){return {...e,ports:e.ports.map(t=>({...t,compatibility:Array.isArray(t.compatibility)?[...t.compatibility]:void 0,position:sr(t.position)}))}}function md(e){if(typeof e.parentId=="string")return e.parentId;let t=e.parentNode;return typeof t=="string"?t:void 0}function bd(e){return e.type==="vertical-pdu"?{kind:"pdu"}:e.type==="server"||e.type==="switch"||e.type==="router"||e.type==="device"?{kind:"equipment",subtype:typeof e.data?.deviceType=="string"&&e.data.deviceType.trim().length>0?e.data.deviceType:e.type}:e.type==="patch-panel"||e.type==="closure"||e.type==="splice-tray"?{kind:"container",subtype:e.type}:e.type==="fibre-split"?{kind:"splitter"}:e.type==="fibre-flow-cable"||e.type==="fibre-flow-closure"?{kind:e.type}:{kind:e.type}}function hd(e){if(e.kind==="equipment"){let t=(e.subtype??"device").toLowerCase().replace(/_/g,"-");return t==="server"||t==="switch"||t==="router"?t:"device"}if(e.kind==="pdu")return "vertical-pdu";if(e.kind==="container"){let t=e.subtype??"patch-panel";return pd.has(t)?t:"patch-panel"}return e.kind==="splitter"?"fibre-split":e.kind}function yd(e){let t={position:ua(e.position)},o=md(e);o&&(t.parentId=o),e.extent==="parent"&&(t.extent="parent");let r=e.data??{};return (typeof r.uPosition=="number"||r.mountMode==="front"||r.mountMode==="rear"||r.mountMode==="both"||r.rackLayout==="single-face"||r.rackLayout==="split-face")&&(t.rack={...typeof r.uPosition=="number"?{uPosition:r.uPosition}:{},...r.mountMode?{mountMode:r.mountMode}:{},...r.rackLayout?{rackLayout:r.rackLayout}:{},...typeof r.rackWidthPx=="number"?{rackWidthPx:r.rackWidthPx}:{},...typeof r.rackFaceGapPx=="number"?{rackFaceGapPx:r.rackFaceGapPx}:{}}),(typeof r.slotPosition=="number"||typeof r.holderPosition=="number")&&(t.container={...typeof r.slotPosition=="number"?{slotPosition:r.slotPosition}:{},...typeof r.holderPosition=="number"?{holderPosition:r.holderPosition}:{}}),t}function wd(e){let t=e.data??{},o={};zn.forEach(i=>{let a=t[i];a!==void 0&&(o[i]=a);});let r=On.reduce((i,a)=>{let s=t[a];return s!==void 0&&(i[a]=s),i},{});Object.keys(r).length>0&&(o.images=r);let n=Wn.reduce((i,a)=>{let s=t[a];return typeof s=="number"&&(i[a]=s),i},{});return Object.keys(n).length>0&&(o.dimensions=n),Object.keys(o).length>0?o:void 0}function Nd(e){let t=[],o=e.data??{};return o.netboxId!==void 0&&t.push({source:"netbox",id:o.netboxId,type:o.netboxType}),o.inventoryId!==void 0&&t.push({source:"inventory",id:o.inventoryId,type:o.inventoryType}),t.length>0?t:void 0}function xd(e){let t=e.data??{},o={};return Object.entries(t).forEach(([r,n])=>{gd.has(r)||(r==="rackWidthPx"||r==="rackFaceGapPx")&&e.type!=="rack"||(o[r]=n);}),Object.keys(o).length>0?o:void 0}function kd(e,t){let o={};if(e.forEach(r=>{let n=r.data??{},i={},a=n.face==="front"||n.face==="rear"?n.face:void 0;a&&(i.face=a),n.handleSideMap&&typeof n.handleSideMap=="object"&&(i.handleSideMap={...n.handleSideMap}),Object.keys(i).length>0&&(o[r.id]=i);}),!(Object.keys(o).length===0&&!t?.metadata))return {...Object.keys(o).length>0?{nodeState:o}:{},...t?.metadata?{metadata:t.metadata}:{}}}function Pd(e){let t=String(e??"").toLowerCase();return t.includes("power")?"power":t.includes("fiber")?"fiber":t.includes("console")||t.includes("mgmt")||t.includes("usb")?"generic":t.includes("ethernet")?"ethernet":"generic"}function Td(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups.map(ar);let{ports:o,rearPorts:r}=Ie(t);if(r.length>0)return r.map(ar);if(o.length>0)return o.map(ar);let n=typeof t.powerPorts=="number"&&Number.isFinite(t.powerPorts)&&t.powerPorts>0?t.powerPorts:36;return [{name:"Power",ports:Array.from({length:n},(i,a)=>{let s=At(a);return {id:`${a+1}`,label:`${a+1}`,connected:false,type:s==="C19"?"power_c19":"power_c13",connectorType:s}})}]}function Cd(e){return (e.type==="vertical-pdu"?[{face:"rear",blocks:Td(e)}]:(()=>{let{ports:o,rearPorts:r}=Ie(e.data);return [{face:"front",blocks:o.map(ar)},{face:"rear",blocks:r.map(ar)}]})()).flatMap(({face:o,blocks:r})=>r.flatMap(n=>n.ports.map(i=>({id:i.id??`${n.name}-${i.label}`,label:i.label,face:o,group:n.name,role:Qe(i.type)?"power":"network",medium:Pd(i.type),type:i.type,cableType:i.cableType,connector:i.connectorType,compatibility:Array.isArray(i.compatibility)?[...i.compatibility]:void 0,layout:sr(i.position)}))))}function Rd(e){let t=e.data??{};if(e.type==="tube"){let o=Math.max(1,Math.min(24,Number(t.fibersPerTube)||12)),r=Math.max(1,Number(t.tubeIndex)||1);return [...Array.from({length:o},(n,i)=>({id:`fiber-${i+1}`,label:`${i+1}`,role:"fiber",medium:"fiber"})),{id:`tube-${r}`,label:`Tube ${r}`,role:"tube",medium:"tube"}]}if(e.type==="cable"){let o=Math.max(1,Math.min(24,Number(t.fiberCount)||12));return [...Array.from({length:o},(r,n)=>({id:`fiber-${n+1}`,label:`${n+1}`,role:"fiber",medium:"fiber"})),{id:"cable-button",label:"Cable",role:"cable"}]}if(e.type==="multi-tube-cable"){let o=Math.max(1,Math.min(24,Number(t.tubeCount)||12)),r=Math.max(1,Number(t.tubeStartIndex)||1);return [...Array.from({length:o},(n,i)=>({id:`tube-${r+i}`,label:`${r+i}`,role:"tube",medium:"tube"})),{id:"cable-button",label:"Cable",role:"cable"}]}if(e.type==="splice")return [{id:"left",label:"Left",role:"splice",medium:"fiber"},{id:"right",label:"Right",role:"splice",medium:"fiber"}];if(e.type==="coupler"){let o=typeof t.couplerFiberCount=="number"&&[1,2,4].includes(t.couplerFiberCount)?t.couplerFiberCount:2;return [...Array.from({length:o},(r,n)=>({id:`left-${n+1}`,label:`${n+1}`,role:"coupler",medium:"fiber"})),...Array.from({length:o},(r,n)=>({id:`right-${n+1}`,label:`${n+1}`,role:"coupler",medium:"fiber"}))]}if(e.type==="fibre-split"){let o=Math.max(1,Math.min(2,Number(t.inputCount)||1)),r=Math.max(1,Math.min(64,Number(t.outputCount)||8));return [...Array.from({length:o},(n,i)=>({id:`input-${i+1}`,label:`Input ${i+1}`,role:"splitter",medium:"fiber"})),...Array.from({length:r},(n,i)=>({id:`output-${i+1}`,label:`Output ${i+1}`,role:"splitter",medium:"fiber"}))]}return []}function Ed(e){let t=e.type==="vertical-pdu"||Array.isArray(e.data?.ports)||Array.isArray(e.data?.portGroups)||Array.isArray(e.data?.rearPortGroups)||Array.isArray(e.data?.pduPortGroups)?Cd(e):Rd(e);return t.length>0?t:void 0}function vd(e,t){if(!t||t.length===0)return t;let o=new Map((e??[]).map(r=>[r.id,r]));return t.map(r=>{let n=o.get(r.id);return n?{...n,...r,compatibility:r.compatibility??n.compatibility,layout:r.layout??n.layout}:r})}function Dd(e,t){return e?{...e,...t,placement:t.placement,render:t.render,config:t.config,externalRefs:t.externalRefs,metadata:t.metadata??e.metadata,endpoints:vd(e.endpoints,t.endpoints)}:t}function oo(e,t){let o=new Map((t?.nodes??[]).map(a=>[a.id,a])),r=e.nodes.map(a=>Dd(o.get(a.id),{id:a.id,...bd(a),label:a.data?.label??a.id,placement:yd(a),render:wd(a),config:xd(a),externalRefs:Nd(a),metadata:o.get(a.id)?.metadata,endpoints:Ed(a)})),n=new Map((t?.edges??[]).map(a=>[a.id,a])),i=e.edges.map(a=>{let s={id:a.id,source:{nodeId:a.source,endpointId:a.sourceHandle?Je(a.sourceHandle):void 0},target:{nodeId:a.target,endpointId:a.targetHandle?Je(a.targetHandle):void 0},type:a.type,hidden:a.hidden===true?true:void 0,data:a.data?{...a.data}:void 0,metadata:n.get(a.id)?.metadata},c=n.get(a.id);return c?{...c,...s}:s});return {nodes:r,edges:i,ui:kd(e.nodes,t?.ui),metadata:t?.metadata}}function Sd(e){let t=new Map,o=r=>{if(!r.endpointId)return;let n=`${r.nodeId}:${Je(r.endpointId)}`;t.set(n,(t.get(n)??0)+1);};return e.forEach(r=>{o(r.source),o(r.target);}),t}function pa(e){if(e.type)return e.type;if(e.role==="power"||e.medium==="power"){let t=String(e.connector??"").toLowerCase();return t.includes("c19")||t.includes("c20")?"power_c19":t.includes("c13")||t.includes("c14")?"power_c13":"power_ac"}return e.medium==="fiber"?"fiber":(e.medium==="ethernet","ethernet")}function Id(e,t,o){return e.map(r=>({id:r.id,label:r.label,face:r.face==="rear"?"rear":r.face==="front"?"front":void 0,group:r.group,connected:(t.get(`${o}:${Je(r.id)}`)??0)>0,type:pa(r),cableType:r.cableType,connectorType:r.connector,compatibility:r.compatibility&&r.compatibility.length>0?[...r.compatibility]:void 0,position:sr(r.layout)}))}function Fd(e,t,o){let r=new Map;return e.forEach(n=>{let i=n.group??"Ports",a=r.get(i),s={id:n.id,label:n.label,connected:(t.get(`${o}:${Je(n.id)}`)??0)>0,type:pa(n),cableType:n.cableType,connectorType:n.connector,compatibility:n.compatibility&&n.compatibility.length>0?[...n.compatibility]:void 0,position:sr(n.layout)};if(a){a.push(s);return}r.set(i,[s]);}),[...r.entries()].map(([n,i])=>({name:n,ports:i.map(a=>({id:a.id,label:a.label,connected:a.connected??false,type:a.type,cableType:a.cableType,connectorType:a.connectorType,compatibility:a.compatibility,position:sr(a.position)}))}))}function Hd(e,t,o){if(!t&&!o)return e;let r={...e};t&&(zn.forEach(i=>{let a=t[i];a!==void 0&&(r[i]=a);}),t.images&&On.forEach(i=>{let a=t.images?.[i];a!==void 0&&(r[i]=a);}),t.dimensions&&Wn.forEach(i=>{let a=t.dimensions?.[i];typeof a=="number"&&(r[i]=a);}));let n=o?.face;return n&&(r.face=n),o?.handleSideMap&&(r.handleSideMap={...o.handleSideMap}),r}function _d(e,t){if(!t||t.length===0)return e;let o={...e};return t.forEach(r=>{r.source==="netbox"&&(o.netboxId=r.id,r.type&&(o.netboxType=r.type)),r.source==="inventory"&&(o.inventoryId=r.id,r.type&&(o.inventoryType=r.type));}),o}function la(e,t,o){if(!t)return;let r=Je(t);if(!e)return r;if(e.kind==="equipment"){let n=(e.subtype??"").toLowerCase().replace(/_/g,"-"),i=e.endpoints?.find(s=>s.id===r),a=i?.role==="power"||i?.medium==="power";if((n==="switch"||n==="router")&&o==="target"&&!a)return `${r}-target`;if(n==="patch-panel"){let s=i?.face==="rear"?"rear":"front";if(o==="source"&&s==="front")return `${r}-source`;if(o==="target"&&s==="rear")return `${r}-target`}return r}return e.kind==="splitter"?`${r}-${o}`:r}function Un(e){let t=Sd(e.edges),o=e.ui?.nodeState??{},r=e.nodes.map(a=>{let s=hd(a),c={label:a.label,...a.config??{}};if(c=Hd(c,a.render,o[a.id]),c=_d(c,a.externalRefs),s==="device"||s==="server"||s==="switch"||s==="router")c.deviceType=a.subtype??(s==="device"?"device":s),a.endpoints&&a.endpoints.length>0&&(c.ports=Id(a.endpoints,t,a.id));else if(s==="vertical-pdu"){let l=(a.endpoints??[]).filter(g=>g.face!=="front");l.length>0&&(c.pduPortGroups=Fd(l,t,a.id),c.powerPorts=l.length);}return a.placement.rack&&(a.placement.rack.rackLayout&&(c.rackLayout=a.placement.rack.rackLayout),typeof a.placement.rack.rackWidthPx=="number"&&(c.rackWidthPx=a.placement.rack.rackWidthPx),typeof a.placement.rack.rackFaceGapPx=="number"&&(c.rackFaceGapPx=a.placement.rack.rackFaceGapPx)),s!=="rack"&&a.placement.rack&&(c.isRackMounted=true,typeof a.placement.rack.uPosition=="number"&&(c.uPosition=a.placement.rack.uPosition),a.placement.rack.mountMode&&(c.mountMode=a.placement.rack.mountMode)),a.placement.container&&(typeof a.placement.container.slotPosition=="number"&&(c.slotPosition=a.placement.container.slotPosition),typeof a.placement.container.holderPosition=="number"&&(c.holderPosition=a.placement.container.holderPosition)),{id:a.id,type:s,position:ua(a.placement.position),...a.placement.parentId?{parentId:a.placement.parentId}:{},...a.placement.extent?{extent:a.placement.extent}:{},data:c}}),n=new Map(e.nodes.map(a=>[a.id,a])),i=e.edges.map(a=>({id:a.id,source:a.source.nodeId,target:a.target.nodeId,...a.source.endpointId?{sourceHandle:la(n.get(a.source.nodeId),a.source.endpointId,"source")}:{},...a.target.endpointId?{targetHandle:la(n.get(a.target.nodeId),a.target.endpointId,"target")}:{},...a.type?{type:a.type}:{},...a.hidden===true?{hidden:true}:{},...a.data?{data:{...a.data}}:{}}));return {nodes:r,edges:i}}var fa=20,Xt=60,Gn=300;var _o=5;function ga(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function ma(e,t){let r=ga(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function ba(e){return ga(e)==="light"?"#e5e5e5":"#2a2a2a"}function ha(e,t){return {width:"100%",height:"100%",...t}}var ya=["device","server","switch","router"],Md=[...ya,"vertical-pdu"],$d=new Set(ya),Ad=new Set(Md);function cr(e){return typeof e=="string"&&$d.has(e)}function Ld(e){return typeof e=="string"&&Ad.has(e)}function pt(e){return !!e&&cr(e.type)}function Mo(e){return !!e&&Ld(e.type)}function wa(e){return typeof e=="string"&&e.trim().length>0}function Vn(e){let{ports:t,rearPorts:o}=Ie(e),r=ir(t)>0||wa(e.frontImageUrl),n=ir(o)>0||wa(e.rearImageUrl);if(r&&n)return "both";if(r)return "front";if(n)return "rear"}function Bd(e){if(e.face==="front"||e.face==="rear")return e.face}function Na(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let i=Vn(e);if(i)return i;let a=Bd(e);if(a)return a;let s=o+r/2;return t>=s?"front":"rear"}var Od=24;function Wd(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function Fe(e){return Wd(e)==="split-face"}function Lt(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:Od}function Ct(e){return e?.rackWidthPx||300}function Kt(e){return Ct(e)*1.75/19}function Br(e){let t=Ct(e);return Fe(e)?t*2+Lt(e):t}function Rt(e){let t=e?.uHeight??42,o=Kt(e);return {width:Br(e),height:60+t*o}}function jn(e){return e.map(t=>{if(t.type!=="rack")return t;let o=Rt(t.data);return t.width===o.width&&t.height===o.height?t:{...t,width:o.width,height:o.height}})}function Ue(e){if(e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both")return e.mountMode;let t=Vn(e??{});return t||"both"}function Yt(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Or(e,t){let o=new Set(Yt(e));return Yt(t).some(n=>o.has(n))}function Wr(e,t){return Fe(e)&&Ue(t)==="front"?Ct(e)+Lt(e):0}function xa(e,t){return Fe(e)&&Ue(t)==="both"?Br(e):Ct(e)}var ka=e=>{if(typeof e.parentId=="string")return e.parentId;if(typeof e.parentNode=="string")return e.parentNode},Bt=(e,t)=>typeof e=="number"&&Number.isFinite(e)&&e>0?Math.floor(e):t,zd=()=>"bottom-up",no=e=>e.data.uNumberingDirection||zd(),zr=(e,t,o)=>o==="bottom-up"?t-e+1:e,Ur=(e,t,o)=>o==="bottom-up"?t-e+1:e;var Gr=(e,t,o,r)=>{let n=ka(e);if(!n||n!==t.id)return o;let i=Bt(e.data.uHeight,1),a=Bt(t.data.uHeight,42),s=no(t),c=Kt(t.data),l=60,g=o.y-l,f=Math.round(g/c)+1,u;s==="bottom-up"?u=zr(f,a,s)-i+1:u=zr(f,a,s);let p=a-i+1,h=Math.max(1,Math.min(p,u));if(s==="top-down"&&u<=1&&(h=1),!ro(t,e,h,r)){let x=Vr(t,e,r,h);if(x!==void 0)h=x;else {let k=Bt(e.data.uPosition,0);if(k>0&&ro(t,e,k,r))h=k;else return {x:Wr(t.data,e.data),y:e.position?.y??o.y,uPosition:k>0?k:void 0}}}let N;if(s==="bottom-up"){let x=h+i-1,k=Ur(x,a,s);N=l+(k-1)*c-1;}else {let x=Ur(h,a,s);N=l+(x-1)*c-1;}return {x:Wr(t.data,e.data),y:N,uPosition:h}},ro=(e,t,o,r)=>{let n=Bt(t.data.uHeight,1),i=Bt(e.data.uHeight,42);if(o<1||o+n-1>i)return false;let a=r.filter(l=>cr(l.type)&&ka(l)===e.id&&l.id!==t.id),s=Fe(e.data),c=Ue(t.data);for(let l of a){let g=Bt(l.data.uPosition,1),f=Bt(l.data.uHeight,1),u=o,p=o+n-1,h=g,N=g+f-1;if(u<=N&&p>=h){if(s){let x=Ue(l.data);if(!Or(c,x))continue}return false}}return true},Vr=(e,t,o,r=1)=>{let n=Bt(t.data.uHeight,1),a=Bt(e.data.uHeight,42)-n+1;if(a<1)return;let s=Number.isFinite(r)?Math.floor(r):1,c=Math.max(1,Math.min(a,s));for(let l=c;l<=a;l++)if(ro(e,t,l,o))return l;for(let l=1;l<c;l++)if(ro(e,t,l,o))return l},$o=(e,t,o=1,r)=>{let n=60,i=no(e),a=e.data.uHeight||42,s=Kt(e.data),c=Ur(t,a,i),l;if(i==="bottom-up"){let g=t+o-1,f=Ur(g,a,i);l=n+(f-1)*s-1;}else l=n+(c-1)*s-1;return {x:Wr(e.data,r),y:l}},Pa=(e,t,o)=>{let r=e.data.uHeight||1,n=$o(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}}},Ud=(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?Pa(e,t,i):e};function Et(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var Xn=({data:e,selected:t,id:o,onFaceChange:r,onRackFaceChange:n,isDragOver:i=false})=>{let{label:a,ports:s=0,status:c="active",uHeight:l=42,face:g="front",customHeaderText:f}=e,u=Fe(e),p=Kt(e),h=Br(e),N=Rt(e),x=Ct(e),k=Lt(e),C={width:`${x}px`,height:"100%",boxSizing:"border-box",border:"1px solid rgba(156,163,175,0.35)",borderRadius:"6px",flexShrink:0,display:"flex",alignItems:"flex-start",justifyContent:"center",paddingTop:"4px",fontSize:"8px",color:"#9ca3af",fontWeight:"bold",textTransform:"uppercase",letterSpacing:"0.06em"},{getNodes:v,setNodes:P}=useReactFlow(),[y,I]=useState(e.showUMarkers!==void 0?e.showUMarkers:true),M=()=>{let q=no({data:e})==="bottom-up"?"top-down":"bottom-up";P(V=>V.map(j=>j.id===o?{...j,data:{...j.data,uNumberingDirection:q}}:j));},B=()=>{if(u)return;let F=g==="front"?"rear":"front";n?n(o,F):r?v().filter(V=>V.parentId===o).forEach(V=>{r(V.id,F);}):P(q=>q.map(V=>V.id===o?{...V,data:{...V.data,face:F}}:V.parentId===o?{...V,data:{...V.data,face:F}}:V));},U=()=>{let F=[],q=60,V=no({data:e});for(let j=1;j<=l;j++){let re=q+(j-1)*p-4,ne=zr(j,l,V);F.push(jsx("div",{style:{position:"absolute",left:"-35px",top:`${re}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:`${p}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:ne},j));}return F};return jsxs("div",{"data-testid":"rack-node",className:`rack-node ${t?"selected":""} ${i?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${Et(c)}`,borderRadius:"8px",padding:0,width:`${h}px`,height:`${N.height}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:[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:[jsx("div",{style:{fontWeight:"bold",marginBottom:"4px"},children:a}),jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[f?jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:f}):jsxs("span",{children:[typeof s=="number"?s:0," ports"]})," \u2022 ",l,"U \u2022 ",u?"rear|front":g]}),jsxs("div",{style:{display:"flex",gap:"4px",position:"absolute",top:"4px",right:"4px"},children:[jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),I(!y);},style:{background:y?"#10b981":"#374151",color:y?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${y?"Hide":"Show"} U markers`,children:"U"}),jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),M();},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 ${no({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:no({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),!u&&jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),B();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${g==="front"?"rear":"front"} face`,children:g==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${l*p}px`,overflow:"hidden"},children:u&&jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none",display:"flex",alignItems:"stretch"},children:[jsx("div",{"data-testid":"rack-face-rear",style:{...C,background:"linear-gradient(180deg, rgba(17,24,39,0.22) 0%, rgba(17,24,39,0.12) 100%)"},children:"Rear"}),jsx("div",{"data-testid":"rack-face-gap",style:{width:`${k}px`,display:"flex",justifyContent:"center",alignItems:"stretch",flexShrink:0},children:jsx("div",{"data-testid":"rack-face-divider",style:{width:"1px",height:"100%",background:"rgba(156,163,175,0.22)",borderRadius:"999px"}})}),jsx("div",{"data-testid":"rack-face-front",style:{...C,background:"linear-gradient(180deg, rgba(17,24,39,0.32) 0%, rgba(17,24,39,0.18) 100%)"},children:"Front"})]})}),y&&jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:U()})]})};var Yn=({data:e,selected:t})=>{let{label:o,status:r="active"}=e;return jsxs("div",{className:`fiber-node ${t?"selected":""}`,style:{background:"#1f2937",border:`2px solid ${Et(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:[jsx(Handle,{type:"target",position:Position.Top}),jsx(Handle,{type:"source",position:Position.Bottom}),jsx(Handle,{type:"target",position:Position.Left}),jsx(Handle,{type:"source",position:Position.Right}),jsx("div",{style:{textAlign:"center"},children:jsx("div",{style:{fontSize:"8px",lineHeight:"1.2"},children:o})}),jsx("div",{style:{position:"absolute",bottom:"4px",left:"50%",transform:"translateX(-50%)",width:"8px",height:"8px",background:Et(r),borderRadius:"50%"}})]})};var Ta=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function je(e){let t=(e-1)%12;return Ta[t]}function ao(e){return e>12}function Ot(e,t){let o=t?.base??je(e),r=t?.striped??ao(e),n=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:n}}function Kn(e){let t=Ot(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function so(e){return je(e)}function Wt(e){return e.map(t=>({base:je(t),striped:ao(t)}))}function Yd(e,t,o,r,n,i,a,s){let c=Wt(o),l=c.length,g=r?1.2:1,f=!!s?.highlight,u=r?2:1.5,p=s?.highlightWidth??u*3,h=s?.highlightColor??c[0]?.base??"#22d3ee";return jsxs(Fragment,{children:[f&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:h,strokeWidth:p,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${u}px`,"--rn-edge-highlight-to":`${p}px`}}),c.map((N,x)=>{let C=(l-x)*g;return jsx("path",{d:t,stroke:N.base,strokeWidth:C,fill:"none",strokeLinecap:"butt",opacity:N.striped?.9:1,style:n},`${e}-ribbon-${x}`)}),c.some(N=>N.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&s&&(s.bandwidth||s.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${i}px,${a}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:[s.bandwidth&&jsx("div",{children:s.bandwidth}),s.length&&jsxs("div",{children:[s.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var Yr=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:l={},className:g})=>{let[f,u,p]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a}),{bandwidth:h,length:N,color:x="#00FFFF",striped:k=false,ribbonFiberIds:C,isRibbon:v,highlight:P,highlightColor:y,highlightWidth:I}=s||{},M=!!P;if((v||C&&C.length>=6&&C.length<=12)&&C)return Yd(e,f,C,c??false,l??{},u,p,s);let U=c?3:2,F=I??U*3,q={...l,stroke:x,strokeWidth:U,strokeDasharray:"none"};return jsxs(Fragment,{children:[M&&jsx(BaseEdge,{id:`${e}-highlight`,path:f,style:{...l,stroke:y??x,strokeWidth:F,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${U}px`,"--rn-edge-highlight-to":`${F}px`}}),jsx(BaseEdge,{id:e,path:f,style:q}),k&&jsx(BaseEdge,{id:`${e}-stripe`,path:f,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsx(EdgeLabelRenderer,{children:c&&s&&(h||N)&&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 ${x}`,pointerEvents:"none",zIndex:9999},children:[h&&jsx("div",{children:h}),N&&jsxs("div",{children:[N,"m"]})]})})]})};var qn=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,style:s={},data:c,markerEnd:l})=>{let[g]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a}),f=c?.connectorType||"C13",u=c?.metadata??{},p=typeof c?.powerStrokeWidth=="number"?c.powerStrokeWidth:typeof u.strokeWidth=="number"?u.strokeWidth:void 0,h=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof u.strokeDasharray=="string"?u.strokeDasharray:void 0,N=typeof c?.powerOpacity=="number"?c.powerOpacity:typeof u.opacity=="number"?u.opacity:void 0;return jsx(BaseEdge,{id:e,path:g,markerEnd:l,style:(()=>{let C=p??(f==="C19"?5:3),v=h??(f==="C19"?"none":"6,3");return {...{stroke:c?.color||"#f59e0b",strokeWidth:C,strokeLinecap:"round",strokeLinejoin:"round",...N!==void 0?{opacity:N}:{}},strokeDasharray:v,...s}})()})};function el(e,t,o,r,n,i,a,s,c,l,g){let f=Wt(s),u=f.length,p=c?1.8:1.5,h=!!g?.highlight,N=c?3:2.5,x=g?.highlightWidth??N*3,k=g?.highlightColor??f[0]?.base??"#22d3ee",[C,v,P]=getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a});return jsxs(Fragment,{children:[h&&jsx(BaseEdge,{id:`${e}-highlight`,path:C,style:{...l,stroke:k,strokeWidth:x,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${N}px`,"--rn-edge-highlight-to":`${x}px`}}),f.map((y,I)=>{let B=(u-I)*p;return jsx("path",{d:C,stroke:y.base,strokeWidth:B,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:l},`${e}-ribbon-${I}`)}),f.some(y=>y.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:C,style:{...l,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:c&&g&&(g.bandwidth||g.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${v}px,${P}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:[g.bandwidth&&jsx("div",{children:g.bandwidth}),g.length&&jsxs("div",{children:[g.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[s.length,"F"]})]})})]})}var va=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:l={},...g})=>{let{color:f="#00FFFF",ribbonFiberIds:u,isRibbon:p,highlight:h,highlightColor:N,highlightWidth:x}=s||{},k=!!h;if((p||u&&u.length>=6&&u.length<=12)&&u)return el(e,t,o,r,n,i,a,u,c??false,l??{},s);let v=c?4:3,P=x??v*3,y={...l,stroke:f,strokeWidth:v};return jsxs(Fragment,{children:[k&&jsx(BaseEdge,{id:`${e}-highlight`,path:getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a})[0],style:{...l,stroke:N??f,strokeWidth:P,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${v}px`,"--rn-edge-highlight-to":`${P}px`}}),jsx(SmoothStepEdge,{...g,id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:y})]})};function ol({sourceX:e,sourceY:t,targetX:o,targetY:r,sourcePosition:n,targetPosition:i}){let a=n===Position.Left||n===Position.Right,s;if(a){let c=(e+o)/2;s=`M ${e},${t} L ${c},${t} L ${c},${r} L ${o},${r}`;}else {let c=(t+r)/2;s=`M ${e},${t} L ${e},${c} L ${o},${c} L ${o},${r}`;}return s}function rl(e,t,o,r,n,i){let a=Wt(o),s=a.length,c=r?1.2:1,l=!!i?.highlight,g=r?2:1.5,f=i?.highlightWidth??g*3,u=i?.highlightColor??a[0]?.base??"#22d3ee",p=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),h=p?(parseFloat(p[1])+parseFloat(p[3]))/2:0,N=p?(parseFloat(p[2])+parseFloat(p[4]))/2:0;return jsxs(Fragment,{children:[l&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:u,strokeWidth:f,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${g}px`,"--rn-edge-highlight-to":`${f}px`}}),a.map((x,k)=>{let v=(s-k)*c;return jsx("path",{d:t,stroke:x.base,strokeWidth:v,fill:"none",strokeLinecap:"butt",opacity:x.striped?.9:1,style:n},`${e}-ribbon-${k}`)}),a.some(x=>x.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&i&&(i.bandwidth||i.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${h}px,${N}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${a[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[i.bandwidth&&jsx("div",{children:i.bandwidth}),i.length&&jsxs("div",{children:[i.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var Ia=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s,selected:c,style:l={},...g})=>{let{color:f="#00FFFF",striped:u=false,ribbonFiberIds:p,isRibbon:h,highlight:N,highlightColor:x,highlightWidth:k}=s||{},C=!!N,v=ol({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a});if((h||p&&p.length>=6&&p.length<=12)&&p)return rl(e,v,p,c??false,l??{},s);let y=c?3:2,I=k??y*3,M={...l,stroke:f,strokeWidth:y,strokeDasharray:"none"};return jsxs(Fragment,{children:[C&&jsx(BaseEdge,{id:`${e}-highlight`,path:v,style:{...l,stroke:x??f,strokeWidth:I,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${y}px`,"--rn-edge-highlight-to":`${I}px`}}),jsx(BaseEdge,{id:e,path:v,style:M}),u&&jsx(BaseEdge,{id:`${e}-stripe`,path:v,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var _a=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,style:s={},data:c,markerEnd:l,selected:g})=>{let{color:f="#6366f1",label:u,highlight:p,highlightColor:h,highlightWidth:N}=c||{},x=!!p,k=8,C=N??k*1.8,[v,P,y]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:i,targetX:r,targetY:n,targetPosition:a}),I={...s,stroke:f,strokeWidth:k,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxs(Fragment,{children:[x&&jsx(BaseEdge,{id:`${e}-highlight`,path:v,style:{...s,stroke:h??f,strokeWidth:C,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${h??f}) drop-shadow(0 0 16px ${h??f})`,"--rn-edge-highlight-from":`${k}px`,"--rn-edge-highlight-to":`${C}px`}}),jsx(BaseEdge,{id:e,path:v,markerEnd:l,style:I}),u&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${P}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:u})})]})};var Ma=(o=>(o.FULL="full",o.HALF="half",o))(Ma||{});function cl(e,t,o){return Math.max(t,Math.min(o,e))}function $a(e){let t=(e??"center").trim().toLowerCase();if(t.endsWith("%")){let r=Number.parseFloat(t.slice(0,-1));if(Number.isFinite(r))return {mode:"percent",value:cl(r/100,0,1)}}if(t.endsWith("px")){let r=Number.parseFloat(t.slice(0,-2));if(Number.isFinite(r))return {mode:"px",value:r}}if(t==="left"||t==="top")return {mode:"percent",value:0};if(t==="right"||t==="bottom")return {mode:"percent",value:1};if(t==="center")return {mode:"percent",value:.5};let o=Number.parseFloat(t);return Number.isFinite(o)?{mode:"px",value:o}:{mode:"percent",value:.5}}function dl(e){let t=(e??"center").trim().split(/\s+/).filter(Boolean);if(t.length===0)return ["center","center"];if(t.length===1){let o=t[0].toLowerCase();return o==="top"||o==="bottom"?["center",o]:o==="left"||o==="right"?[o,"center"]:[o,"center"]}return [t[0],t[1]]}function Aa(e,t,o){return o.mode==="px"?o.value:(e-t)*o.value}function La(e,t){return t===true||e==="fill"?"100% 100%":e==="none"?"auto":e==="contain-height"?"auto 100%":e==="scale-down"?"contain":e??"cover"}function Jn(e,t,o,r,n){if(!o||o.width<=0||o.height<=0)return;let i=o.width,a=o.height;if(r==="100% 100%")i=e,a=t;else if(r==="auto 100%"){let l=t/o.height;i=o.width*l,a=o.height*l;}else if(r==="cover"||r==="contain"){let l=r==="cover"?Math.max(e/o.width,t/o.height):Math.min(e/o.width,t/o.height);i=o.width*l,a=o.height*l;}let[s,c]=dl(n);return {width:i,height:a,offsetX:Aa(e,i,$a(s)),offsetY:Aa(t,a,$a(c))}}var ll={rj45:{width:8,height:4,borderRadius:"2px"},sfp:{width:8,height:5,borderRadius:"2px"},qsfp:{width:12,height:6,borderRadius:"2px"},osfp:{width:15,height:9,borderRadius:"3px"},console:{width:8,height:4,borderRadius:"2px"},usb:{width:7,height:4,borderRadius:"2px"},power_c13:{width:10,height:7,borderRadius:"0px"},power_c19:{width:12,height:10,borderRadius:"3px"},power_ac:{width:10,height:7,borderRadius:"2px"}};function ul(e){return [e.group,e.sourceTypeLabel,e.label,e.id,e.connectorType].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ").toLowerCase()}function qr(e){let t=String(e.type??"").toLowerCase(),o=String(e.label??"").toLowerCase(),r=ul(e);return t==="power_c19"?"power_c19":t==="power_c13"?"power_c13":t==="power_ac"?"power_ac":t==="usb"?"usb":t==="ethernet"||t==="mgmt"?"rj45":/osfp/.test(r)?"osfp":/qsfp(?:[-+ ]?dd|28|56|112)?|xfp/.test(r)||/^et-/.test(o)||/^ethernet\d+\/\d+$/.test(o)?"qsfp":/sfp(?:\+|28|56)?|cfp|lc(?:\s+duplex)?|coupler|fibre\s*port|fiber\s*port/.test(r)||/^(xe|ge|fe|te)-/.test(o)?"sfp":/rj45|8p8c/.test(r)?"rj45":t==="console"?"console":t==="fiber"?"sfp":"generic"}function Qn(e){let t=typeof e=="string"?e:qr(e);if(t!=="generic")return ll[t]}var fl="#6b7280",gl="#374151",ei="#10b981",ml="100% 100%",Zr=1,bl={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},hl=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,yl=/^data:image\//i,wl=typeof window<"u"?Ce.useLayoutEffect:Ce.useEffect,Oa=new Map;function Nl(e){return (e??"").toLowerCase().replace(/_/g,"-")}function xl(e){return !hl.test(e)&&!e.startsWith("//")}function Wa(e){if(!e)return;let t=e.trim();if(t){if(xl(t))return t;try{let o=new URL(t),r=o.protocol.toLowerCase(),n=o.hostname.toLowerCase();return r==="https:"||r==="blob:"||r==="http:"&&(n==="127.0.0.1"||n==="localhost")?o.href:r==="data:"&&yl.test(t)?t:void 0}catch{return}}}function kl(e){return `url(${JSON.stringify(e)})`}function Pl(e){switch(e){case "100% 100%":return "fill";case "auto":return "none";case "auto 100%":return "contain";case "contain":return "contain";case "cover":default:return "cover"}}function Lo(e){return Qe(e.type)}function oi(e,t){if(typeof e.connectorType=="string"&&e.connectorType.trim().length>0)return e.connectorType;let o=String(e.type??"").toLowerCase();return o.includes("c19")||o.includes("c20")?"C19":o.includes("c13")||o.includes("c14")?"C13":o.includes("power_ac")?"AC":Mn(t)}function za(e,t){return Tt(e,t)}function Tl(e,t,o,r,n){let i=t.length>0||!!r,a=o.length>0||!!n;return e||(i?"front":a?"rear":"front")}function Cl(e){let t=Oa.get(e);if(t)return t;let o=new Promise(r=>{if(typeof Image>"u"){r(void 0);return}let n=new Image;n.decoding="async",n.onload=()=>{if(n.naturalWidth>0&&n.naturalHeight>0){r({width:n.naturalWidth,height:n.naturalHeight});return}r(void 0);},n.onerror=()=>r(void 0),n.src=e;});return Oa.set(e,o),o}function Ua(e){let[t,o]=Ce.useState(void 0);return Ce.useEffect(()=>{let r=false;return e?(Cl(e).then(n=>{r||o(n);}),()=>{r=true;}):(o(void 0),()=>{r=true;})},[e]),t}function Rl(e){return Lo(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?ei:e.cableType?bl[e.cableType]??ei:ei}function El(e){return e.connected?Rl(e):fl}function Ga(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 vl(e,t,o,r){let n=e<=3||t<=3,i=n?0:.5;return {width:`${e}px`,height:`${t}px`,minWidth:n?`${e}px`:void 0,minHeight:n?`${t}px`:void 0,background:o,border:`${i}px solid ${r}`,boxSizing:"border-box",borderRadius:"1px",cursor:"pointer",zIndex:2}}function ti(e){let t=Math.max(5,Math.min(7,Math.round(e*.02))),o=Math.max(4,Math.min(5,Math.round(t*.7)));return {width:t,height:o}}function Ya(e){return e.type==="console"||e.type==="usb"}function Ka(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(4,Math.min(5,Math.round(t*.6)))}}function qa(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(3,Math.min(4,Math.round(t*.5)))}}function Za(e,t){return qr({type:e.type,label:e.label,id:String(e.id??""),group:t,sourceTypeLabel:e.sourceTypeLabel,connectorType:e.connectorType})}function uo(e){return Math.max(0,Math.min(100,e))}function Ye(e,t,o){return Math.max(t,Math.min(o,e))}function Va(e,t,o,r){if(r&&typeof e.position?.widthPercent=="number"&&Number.isFinite(e.position.widthPercent)&&e.position.widthPercent>0&&typeof e.position?.heightPercent=="number"&&Number.isFinite(e.position.heightPercent)&&e.position.heightPercent>0){let i=r.width*uo(e.position.widthPercent)/100,a=r.height*uo(e.position.heightPercent)/100;return {width:Ye(i,2,r.width),height:Ye(a,1.5,r.height)}}let n=Qn({type:e.type,label:e.label,id:String(e.id??""),group:t,sourceTypeLabel:e.sourceTypeLabel,connectorType:e.connectorType});return n?{width:n.width,height:n.height}:e.type==="usb"?qa(o):Ya(e)?Ka(o):o}function Dl(e){switch(e){case Position.Bottom:return {top:1,right:1,bottom:4,left:1};case Position.Left:return {top:1,right:1,bottom:1,left:4};case Position.Right:return {top:1,right:4,bottom:1,left:1};case Position.Top:default:return {top:4,right:1,bottom:1,left:1}}}function Sl(e,t,o,r){if(!(!r||!fr(e))&&Za(e,t)==="sfp")return Dl(o)}function fr(e){return typeof e.position?.xPercent=="number"&&typeof e.position?.yPercent=="number"}function Il(e,t,o,r){if(!fr(e))return;let n=uo(e.position?.xPercent),i=uo(e.position?.yPercent),a=r?.width??t,s=r?.height??o,c=r?.offsetX??0,l=r?.offsetY??0;return {x:c+a*n/100,y:l+s*i/100}}function ja(e,t,o,r){let n=ti(t),i=e.flatMap(x=>x.ports.filter(k=>!Lo(k)).map(k=>Il(k,t,o,r)).filter(k=>k!==void 0));if(i.length<2)return n;let a=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Math.max(n.height*.75,3),l=Math.max(n.width*.75,3);for(let x=0;x<i.length;x+=1){let k=i[x];for(let C=x+1;C<i.length;C+=1){let v=i[C],P=Math.abs(k.x-v.x),y=Math.abs(k.y-v.y);y<=c&&P>0&&(a=Math.min(a,P)),P<=l&&y>0&&(s=Math.min(s,y));}}let g=r?Ye(n.width*.65,2.5,4.5):2,f=r?Ye(n.height*.95,5,7.5):2,u=r?n.width*.9:n.width,p=Number.isFinite(a)?Ye(a-g,r?2.5:3,u):u,h=r?Math.min(n.height*.48,p*.88):n.height,N=Number.isFinite(s)?Ye(s-f,r?1.5:3,h):h;return {width:p,height:N}}function Fl(e){switch(e){case "top":return Position.Top;case "right":return Position.Right;case "bottom":return Position.Bottom;case "left":return Position.Left;default:return Position.Top}}function Hl(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 _l(e,t,o,r,n,i,a,s){if(!e.position)return;if(typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number"){let x=uo(e.position.xPercent),k=uo(e.position.yPercent),C=e.position.side??Hl(x,k),v=i?.width??r,P=i?.height??n,y=i?.offsetX??0,I=i?.offsetY??0,M=t/2+Zr,B=Math.max(M,r-t/2),U=o/2+Zr,F=Math.max(U,n-o/2),q=y+v*x/100,V=I+P*k/100,j=i?q:Ye(q,M,B),re=i?V:Ye(V,U,F);return {position:Fl(C),style:{left:`${j-t/2-Zr}px`,top:`${re-o/2-Zr}px`,right:"initial",bottom:"initial",transform:"none"}}}if(!e.position.side)return;let l=e.position.side,g=typeof e.position.offsetPercent=="number"?uo(e.position.offsetPercent):void 0,f=typeof e.position.offsetPx=="number"?e.position.offsetPx:void 0,u=t/2,p=Math.max(u,r-t/2),h=o/2,N=Math.max(h,n-o/2);switch(l){case "top":{let x=f!==void 0?f:r*(g??50)/100,k=Ye(x,u,p);return {position:Position.Top,style:{top:"0px",left:`${k}px`,right:void 0,bottom:void 0,transform:"translate(-50%, 50%)"}}}case "bottom":{let x=f!==void 0?f:r*(g??50)/100,k=Ye(x,u,p);return {position:Position.Bottom,style:{bottom:"0px",left:`${k}px`,right:void 0,top:void 0,transform:"translate(-50%, -50%)"}}}case "left":{let x=f!==void 0?f:n*(g??50)/100,k=Ye(x,h,N);return {position:Position.Left,style:{left:"0px",top:`${k}px`,right:void 0,bottom:void 0,transform:"translate(50%, -50%)"}}}case "right":{let x=f!==void 0?f:n*(g??50)/100,k=Ye(x,h,N);return {position:Position.Right,style:{right:"0px",top:`${k}px`,left:void 0,bottom:void 0,transform:"translate(-50%, -50%)"}}}default:return}}function Ja(e,t,o,r){let n=o/2,i=Math.max(n,r-o/2);return t===1?(n+i)/2:n+e*(i-n)/(t-1)}function Qa(e,t,o,r){let n=e%2===0,i=Math.ceil(t/2),a=Math.floor(t/2),s=Math.max(n?i:a,1),c=Math.floor(n?e/2:(e-1)/2),l=Ja(c,s,o,r);return n?{position:Position.Top,style:{transform:"translateY(50%)",left:`${l-o/2}px`}}:{position:Position.Bottom,style:{transform:"translateY(-50%)",left:`${l-o/2}px`}}}function Xa(e,t,o,r,n,i){let a=e%2===0,s=Math.ceil(t/2),c=Math.floor(t/2),l=Math.max(a?s:c,1),g=Math.floor(a?e/2:(e-1)/2),f=Ja(g,l,o,n),u=1,p=Ye(Math.round(r*.75),1,4),h=Math.max(u,i-r-1),N=Ye(u+r+p,u,h),x=a?u:N;return {position:Position.Top,style:{transform:"none",left:`${f-o/2}px`,top:`${x}px`,right:void 0,bottom:void 0}}}function Ml(e,t,o,r,n){let i=oi(e,n),a=Vt(i),s;if(r<=20){let g=Math.max(2,r-a.height-2);s=`${o<=1?(2+g)/2:2+t*(g-2)/(o-1)}px`;}else s=`${25+t*50}%`;return {position:Position.Right,style:{transform:"translateX(-50%)",top:s,width:`${a.width}px`,height:`${a.height}px`,background:a.color,border:`1px solid ${a.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:a.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:a.borderRadius,clipPath:a.clipPath}}}function $l(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:Position.Top,style:{transform:"translateY(50%)",left:`${i}px`,right:void 0}}}return Qa(e,t,o,r)}function Al(e,t,o,r,n,i,a,s,c){if(s==="patch-panel"||s==="switch")return Qa(t,o,r,i);if(Lo(e)){let f=oi(e,c),u=Vt(f),p;if(a<=20){let x=Math.max(2,a-u.height-2);p=`${o<=1?(2+x)/2:2+t*(x-2)/(o-1)}px`;}else p=`${25+t*50}%`;return {position: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:Position.Right,style:{transform:"translate(-50%, -50%)",top:`${Ye(o<=1?a/2:n/2+t*Math.max(a-n,0)/Math.max(o-1,1),n/2,Math.max(n/2,a-n/2))}px`}}}function Ll(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 Bo=({id:e,data:t,selected:o})=>{let r=useUpdateNodeInternals(),{label:n,status:i="active",deviceType:a="server",manufacturer:s,uHeight:c=1,width:l="full",face:g,rackWidthPx:f,frontImageUrl:u,rearImageUrl:p,imageFit:h,imagePosition:N,imageRepeat:x,stretchToFit:k}=t,{ports:C,rearPorts:v}=Ce.useMemo(()=>Ie(t),[t]),P=Nl(a),y=f??300,I=t.isRackMounted===true&&h===void 0&&k!==true,M=Ce.useMemo(()=>La(I?"fill":h,k),[h,I,k]),B=Ce.useMemo(()=>Wa(u),[u]),U=Ce.useMemo(()=>Wa(p),[p]),F=Ua(B),q=Ua(U),V=Fe(t),j=Ue(t),re=Tl(g,C,v,u,p),ne=Ce.useMemo(()=>V?Yt(j):[re],[V,j,re]),H=ne[0]??re,_=V&&j==="both",ie=t.isRackMounted===true?Kt(t):20,W=c*ie,L=Lt(t),te=y+L,de=Ce.useMemo(()=>Jn(y,W,F,M,N??"center"),[y,W,F,M,N]),ge=Ce.useMemo(()=>Jn(y,W,q,M,N??"center"),[y,W,q,M,N]),X=Ce.useMemo(()=>H==="rear"?ge:de,[H,de,ge]),he=H==="rear"?!!U:!!B,we=t.isRackMounted===true&&he&&!_,A=H==="rear"?v:C,z=Ce.useMemo(()=>A.flatMap(se=>se.ports).filter(se=>!Lo(se)),[A]),Te=Ce.useMemo(()=>!we||!((P==="switch"||P==="patch-panel"||P==="router")&&z.length>=24)?false:z.every(Ne=>fr(Ne)),[z,P,we]),et=Ce.useMemo(()=>[V?"split":"single",j,ne.join(","),H,P,n,M,N??"center",de?`${de.width}:${de.height}:${de.offsetX}:${de.offsetY}`:"",ge?`${ge.width}:${ge.height}:${ge.offsetX}:${ge.offsetY}`:"",W.toString(),y.toString(),te.toString(),Ga(C),Ga(v)].join("|"),[V,j,ne,H,P,n,M,N,de,ge,W,y,te,C,v]);wl(()=>{r(e);},[et,e,r]);let St=Ce.useCallback(se=>{let Ne=se==="rear"?U:B;return Ne?{backgroundImage:kl(Ne),backgroundSize:M==="100% 100%"?ml:M,backgroundPosition:N??"center",backgroundRepeat:x??"no-repeat"}:{}},[U,B,M,N,x]),le=Ce.useMemo(()=>St("front"),[St]),tt=Ce.useMemo(()=>St("rear"),[St]),Ge=H==="rear"?tt:le,qo=Ce.useMemo(()=>Pl(M),[M]),xe,Se;if(V)xe=`${xa(t,t)+4}px`,Se=void 0;else {let se=y+4,Ne=Math.floor(y/2);xe=l==="half"?`${Ne}px`:`${se}px`,Se=l==="half"?`${Ne}px`:void 0;}let xo=P==="server"&&c===1,ko=Et(i),Zo={"--rn-device-bg-image":_?"none":String(Ge.backgroundImage??"none"),"--rn-device-bg-position":String(Ge.backgroundPosition??"center"),"--rn-device-bg-repeat":String(Ge.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(Ge.backgroundSize??"cover"),"--rn-device-border-color":ko,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${W}px`,"--rn-device-left":Se??"auto","--rn-device-status-color":ko,"--rn-device-translate-y":xo?"-1px":"0px","--rn-device-width":xe},Jo=Ce.useMemo(()=>{if(!we)return;let se={position:"absolute",top:"2px",zIndex:2,padding:0,justifyContent:"flex-start",pointerEvents:"none"},Ne=c>1?24:8;if(!X)return Te?{...se,display:"none"}:{...se,left:"4px",right:`${Ne}px`,alignItems:"flex-start"};let $e=4,We=Math.max(0,Math.floor(X.offsetX)-$e),st=Math.max(0,Math.floor(y-(X.offsetX+X.width))-$e);if(Math.max(We,st)>=56){let Ve=st>We;return {...se,left:Ve?"auto":`${$e}px`,right:Ve?`${$e}px`:"auto",width:`${Math.max(48,Math.max(We,st))}px`,alignItems:Ve?"flex-end":"flex-start"}}return Te?{...se,display:"none"}:{...se,left:"4px",right:`${Ne}px`,alignItems:"flex-start"}},[X,y,Te,c,we]),Po=Ce.useMemo(()=>{let se=new Set;for(let Ne of C)for(let $e of Ne.ports)se.add(za(Ne.name,$e));return se},[C]),yt=Ce.useCallback((se,Ne)=>Ne==="rear"&&_&&Po.has(se)?`${se}--rear`:se,[Po,_]),eo=Ce.useCallback((se,Ne,$e=0,We=y)=>{let st=[];if(se.length===0)return st;let Ve=Ne==="rear"?ge:de,ot=ti(We),Cr=!!(Ve&&se.some(Ee=>Ee.ports.some(ze=>!Lo(ze)&&fr(ze)))),{width:wt,height:Rr}=P==="switch"||P==="patch-panel"?Cr?ja(se,We,W,Ve):ti(We):ja(se,We,W,Ve),Er=se.reduce((Ee,ze)=>Ee+ze.ports.length,0),er=(P==="switch"||P==="patch-panel")&&Er>=24,To=P!=="switch"&&P!=="patch-panel"&&Er>=24;for(let Ee of se)for(let ze=0;ze<Ee.ports.length;ze+=1){let ke=Ee.ports[ze],vr=za(Ee.name,ke),It=Lo(ke),Gt=Za(ke,Ee.name),qe=wt,ct=Rr;if(It){let Pe=oi(ke,n),Ft=Vt(Pe);qe=Ft.width,ct=Ft.height;}else if(ke.type==="usb"){let Pe=qa(ot);qe=Pe.width,ct=Pe.height;}else if(Gt==="sfp"||Gt==="qsfp"||Gt==="osfp"){let Pe=Va(ke,Ee.name,ot,Ve);Ve&&fr(ke)?qe=To?wt:Pe.width:qe=Pe.width,ct=Pe.height;}else if(Gt==="rj45"||Gt==="console"){let Pe=Va(ke,Ee.name,ot,Ve);qe=Pe.width,ct=Pe.height;}else if(Ya(ke)){let Pe=Ka(ot);qe=Pe.width,ct=Pe.height;}let Dr=El(ke),Rn=ke.connected?Dr:gl,Nt=vl(qe,ct,Dr,Rn),J=Ne==="front"?It?Ml(ke,ze,Ee.ports.length,W,n):er?Xa(ze,Ee.ports.length,qe,ct,We,W):$l(ze,Ee.ports.length,qe,We):!It&&er?Xa(ze,Ee.ports.length,qe,ct,We,W):Al(ke,ze,Ee.ports.length,qe,ct,We,W,P,n),xt=_l(ke,qe,ct,We,W,Ve),ee=xt?It?{position:xt.position,style:{...J.style,...xt.style}}:xt:J,ve=Sl(ke,Ee.name,ee.position,Ve),Sr=ve?{"--rn-hit-expand-top":`${ve.top}px`,"--rn-hit-expand-right":`${ve.right}px`,"--rn-hit-expand-bottom":`${ve.bottom}px`,"--rn-hit-expand-left":`${ve.left}px`}:{},tr=ve?"rn-port-hitbox":void 0,Ae={...{...Nt,...ee.style,...Sr}};Ae.left!==void 0&&$e!==0&&(typeof Ae.left=="number"?Ae.left=`${Ae.left+$e}px`:Ae.left=`calc(${Ae.left} + ${$e}px)`),_&&Ae.left===void 0&&(ee.position===Position.Left?(Ae.left=`${$e}px`,Ae.right=void 0):ee.position===Position.Right&&(Ae.left=`${$e+We}px`,Ae.right=void 0));let kt=yt(vr,Ne),ue=Ll(It,P,Ne,ke.connected);if(ue.secondary){let Pe=P==="switch"||P==="router"?{...Ae,background:"transparent",border:"none",opacity:0}:Ae,Ft=P==="switch"||P==="router"?`${Ee.name} - ${ke.label} (input) ${ke.connected?"(connected)":"(disconnected)"}`:`${Ee.name} - ${ke.label} (${ue.secondary}) ${ke.connected?"(connected)":"(disconnected)"}`;st.push(jsx(Handle,{id:`${kt}-${ue.secondary}`,type:ue.secondary,position:ee.position,className:tr,style:Pe,title:Ft},`${kt}-${ue.secondary}`));}st.push(jsx(Handle,{id:kt,type:ue.primary,position:ee.position,className:tr,style:Ae,title:`${Ee.name} - ${ke.label} ${ke.connected?"(connected)":"(disconnected)"}`,children:It?ze+1:void 0},kt));}return st},[W,y,de,n,P,ge,yt,_]),Qo=Ce.useMemo(()=>{let se=[];for(let Ne of ne){if(Ne==="front"&&C.length>0){let $e=_?te:0;se.push(...eo(C,"front",$e,y));}Ne==="rear"&&v.length>0&&se.push(...eo(v,"rear",0,y));}return se},[ne,C,v,eo,y,_,te]);return jsxs("div",{className:`device-node ${o?"selected":""} ${_?"device-node--split-both":""}`,style:Zo,children:[!_&&he&&jsx("div",{className:"device-node__image-layer","aria-hidden":"true",children:jsx("img",{className:"device-node__image",src:H==="rear"?U:B,alt:"",draggable:false,style:{objectFit:qo,objectPosition:N??"center"}})}),_&&jsxs("div",{className:"device-node__split-face-layer",style:{position:"absolute",inset:0,display:"flex",pointerEvents:"none",zIndex:0},children:[jsx("div",{className:"device-node__split-face device-node__split-face--rear",style:{width:`${y}px`,backgroundImage:String(tt.backgroundImage??"none"),backgroundPosition:String(tt.backgroundPosition??"center"),backgroundRepeat:String(tt.backgroundRepeat??"no-repeat"),backgroundSize:String(tt.backgroundSize??"cover")},children:U?jsx("img",{className:"device-node__image",src:U,alt:"",draggable:false,style:{objectFit:qo,objectPosition:N??"center"}}):null}),jsx("div",{className:"device-node__face-bridge","data-testid":"device-face-bridge",style:{width:`${L}px`},children:jsx("div",{className:"device-node__face-bridge-line"})}),jsx("div",{className:"device-node__split-face device-node__split-face--front",style:{width:`${y}px`,backgroundImage:String(le.backgroundImage??"none"),backgroundPosition:String(le.backgroundPosition??"center"),backgroundRepeat:String(le.backgroundRepeat??"no-repeat"),backgroundSize:String(le.backgroundSize??"cover")},children:B?jsx("img",{className:"device-node__image",src:B,alt:"",draggable:false,style:{objectFit:qo,objectPosition:N??"center"}}):null})]}),jsxs("div",{className:`device-node__content ${we?"device-node__content--image-badge":""}`,style:Jo??{position:"relative",zIndex:1},children:[jsx("div",{className:`device-node__label ${we?"device-node__label--badge":""}`,children:n}),!we&&c>1&&jsx("div",{className:"device-node__manufacturer",children:s})]}),c>1&&jsxs("div",{className:"device-node__u-indicator",children:[c,"U"]}),jsx("div",{className:"device-node__status-indicator"}),Qo]})};var Qr=20,Oo=3,tn=2,Bl=1,ni=2,ts=6,Ol=12;function ri(e){return Math.max(0,Math.min(100,e))}function ii(e,t,o){return Math.max(t,Math.min(o,e))}function Wl(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 en(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 zl(e,t){let o=en(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 Ul(e){if(Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0)return e.pduPortGroups;let t=Bn(e);if(t.length>0)return t;let o=Ln(e);return o.length>0?o:[]}function Gl(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>en(At(r))??"C13"):Array.from({length:t},(o,r)=>{let n=en(e.portTypes?.[r]);return n||(en(At(r))??"C13")})}function Vl(e,t){let o=Ul(e),r=Gl(e,t);if(o.length===0)return Array.from({length:t},(a,s)=>({id:`${s+1}`,label:`${s+1}`,connectorType:r[s]??"C13",groupName:"Power"}));let n=[],i=0;return o.forEach(a=>{a.ports.forEach(s=>{let c=r[i]??"C13";n.push({id:Tt(a.name,s),label:s.label,connectorType:zl(s,c),groupName:a.name,position:jt(s.position)}),i+=1;});}),n}function jl(e){return Vt(e.connectorType).height}function Xl(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t:Math.floor(t/2)}function os(e,t){let o=[],r=t>=0,n=r?ii(t,0,e.length):-1;for(let i=0;i<=e.length;i+=1)r&&i===n&&o.push({kind:"mgmt",height:Ol}),i<e.length&&o.push({kind:"port",portIndex:i,height:jl(e[i]),groupName:e[i].groupName});return o}function rs(e,t){return e.kind==="port"&&t.kind==="port"?e.groupName===t.groupName?ni:ts:ni}function Yl(e,t){let o=os(e,t);if(o.length===0)return Math.max(tn+Oo+1,1);let r=0;for(let n=0;n<o.length;n+=1)r+=o[n].height,n<o.length-1&&(r+=rs(o[n],o[n+1]));return tn+r+Oo}function Kl(e,t,o){let r=os(e,o);if(r.length===0)return {portCenters:[]};let n=[];for(let N=0;N<r.length-1;N+=1)n.push(rs(r[N],r[N+1]));let i=r.reduce((N,x)=>N+x.height,0),a=n.reduce((N,x)=>N+x,0),s=i+a,c=Math.max(t-tn-Oo,1),l=0,g=n,f=Math.max(0,c-s);if(f>0)if(n.length===0)l=f/2;else {let N=n.map(k=>k===ts?1.2:1),x=N.reduce((k,C)=>k+C,0);g=n.map((k,C)=>x<=0?k:k+f*N[C]/x);}let u=[],p,h=tn+l;for(let N=0;N<r.length;N+=1){let x=r[N],k=h+x.height/2;x.kind==="mgmt"?p=k:u[x.portIndex]=k,h+=x.height,N<r.length-1&&(h+=g[N]??ni);}return {portCenters:u,mgmtCenterY:p}}function ql(e,t,o,r,n,i){if(!e)return {position:Position.Right,leftPx:Math.round((r-n)/2)-1,topPx:t-i/2};let a=e.side,s=a==="left"?Position.Left:a==="top"?Position.Top:a==="bottom"?Position.Bottom:Position.Right,c=typeof e.offsetPercent=="number"?ri(e.offsetPercent):void 0,l=typeof e.offsetPx=="number"?e.offsetPx:void 0,g=typeof e.xPercent=="number"?ri(e.xPercent):void 0,f=typeof e.yPercent=="number"?ri(e.yPercent):void 0;if(g!==void 0&&f!==void 0){let h=a??Wl(g,f),N=h==="left"?Position.Left:h==="top"?Position.Top:h==="bottom"?Position.Bottom:Position.Right,x=Math.max(o-Oo,1),k=r*g/100,C=ii(x*f/100,i/2,Math.max(i/2,o-i/2));return {position:N,leftPx:k-n/2,topPx:C-i/2}}let u=g!==void 0?r*g/100:r-n/2-1,p=f!==void 0?Math.max(o-Oo,1)*f/100:t;return a==="top"||a==="bottom"?(l!==void 0?u=l:c!==void 0&&(u=r*c/100),p=a==="top"?i/2:o-i/2):(l!==void 0?p=l:c!==void 0&&(p=Math.max(o-Oo,1)*c/100),a==="left"?u=n/2:a==="right"&&(u=r-n/2-1)),p=ii(p,i/2,Math.max(i/2,o-i/2)),{position:s,leftPx:u-n/2,topPx:p-i/2}}function Zl(e,t){return 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:[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"}),jsx(Handle,{type:"source",position: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 si=({data:e,selected:t})=>{let{label:o,status:r="active",heightCm:n=100,powerPorts:i=36,widthPx:a=15,mgmt_unit:s}=e,c=Math.max(0,i),l=Vl(e,c),g=Xl(s,l.length),f=n*4.2,u=Yl(l,g),p=Math.max(f-Qr,u),h=Math.max(a-Bl*2,1),N=Qr+p,x=Kl(l,p,g);return jsxs("div",{className:`vertical-pdu-node ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${Et(r)}`,borderRadius:"2px",padding:0,width:`${a}px`,height:`${N}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 1px 3px rgba(0,0,0,0.3)",boxSizing:"border-box",position:"relative",display:"flex",flexDirection:"column"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"linear-gradient(90deg, #4a5568 0%, #2d3748 50%, #4a5568 100%)",padding:"2px",position:"relative",height:`${Qr}px`,display:"flex",flexDirection:"column",justifyContent:"center",borderBottom:"1px solid #4a5568"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"6px",color:"#e2e8f0"},children:o})}),jsxs("div",{style:{flex:1,background:"linear-gradient(180deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",position:"relative",minHeight:`${N-Qr}px`,overflow:"hidden"},children:[typeof x.mgmtCenterY=="number"?Zl(x.mgmtCenterY,h):null,l.map((k,C)=>{let v=x.portCenters[C]??p/2,P=Vt(k.connectorType),y=ql(k.position,v,p,h,P.width,P.height);return jsx(Handle,{type:"source",position:y.position,id:k.id,style:{position:"absolute",left:`${y.leftPx}px`,top:`${y.topPx}px`,right:"initial",bottom:"initial",width:`${P.width}px`,height:`${P.height}px`,background:P.color,border:`1px solid ${P.borderColor}`,boxSizing:"border-box",transform:"none",cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:P.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:P.borderRadius,clipPath:P.clipPath},title:`${k.groupName} - ${k.label} (${k.connectorType})`,children:k.label},`handle-${k.id}`)})]})]})};var li=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:n="single",ribbonFiberIds:i}=e||{},a=useEdges(),s=a.find(y=>y.target===o&&y.targetHandle==="left"),c=a.find(y=>y.source===o&&y.sourceHandle==="right"),l=a.find(y=>y.target===o&&y.targetHandle==="right"),g=c||l,f=s?.data?.color||"#555",u=g?.data?.color||"#555",p=n==="ribbon",h=s?.data?.ribbonFiberIds||i,N=g?.data?.ribbonFiberIds||i,x=p&&h?Wt(h):null,k=p&&N?Wt(N):null,C=!!s&&!!g;return 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&&x&&k?jsxs("div",{style:{position:"absolute",inset:0,borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none",display:"grid",gridTemplateColumns:"1fr 1fr"},children:[jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:x.map((y,I)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`left-${I}`))}),jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:k.map((y,I)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`right-${I}`))})]}):jsxs("div",{style:{position:"absolute",inset:0,display:"grid",gridTemplateColumns:"1fr 1fr",borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none"},children:[jsx("div",{style:{background:f}}),jsx("div",{style:{background:u}})]}),jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),C&&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}}),C&&typeof r=="number"&&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:[jsx("div",{children:`${r.toFixed(2)} dB`}),p&&i&&jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[i.length,"F"]})]}),jsx(Handle,{type:"target",position:Position.Left,id:"left",isConnectable:true,style:{width:12,height:p&&x?20:12,borderRadius:p&&x?"6px":"50%",border:"none",background:p&&x?`linear-gradient(to bottom, ${x.map(y=>y.base).join(", ")})`:f,zIndex:100,cursor:"crosshair",left:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"source",position:Position.Right,id:"right",isConnectable:true,style:{width:12,height:p&&k?20:12,borderRadius:p&&k?"6px":"50%",border:"none",background:p&&k?`linear-gradient(to bottom, ${k.map(y=>y.base).join(", ")})`:u,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"target",position:Position.Right,id:"right",isConnectable:true,style:{width:12,height:p&&k?20:12,borderRadius:p&&k?"6px":"50%",border:"none",background:p&&k?`linear-gradient(to bottom, ${k.map(y=>y.base).join(", ")})`:u,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var hr=20,on=36;var po=32,ns=4,Zt=12,Ql=69,fo=80,ui=(fo-Ql)/2;var pi=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",i=n?on:hr,a=n?32:16,s=po,c=o.y-s,l=Math.round(c/i)+1,f=Math.max(1,Math.min(Zt,l));if(!br(t,e,f,r)){let h=yr(t,e,r,f);if(h!==f){let N=(i-a)/2;return {x:ui,y:s+(h-1)*i+N,holderPosition:h}}}let u=(i-a)/2,p=s+(f-1)*i+u;return {x:ui,y:p,holderPosition:f}},br=(e,t,o,r)=>!r.filter(i=>i.parentId===e.id&&i.type==="splice"&&i.id!==t.id).some(i=>i.data.holderPosition===o),yr=(e,t,o,r=1)=>{for(let n=r;n<=Zt;n++)if(br(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(br(e,t,n,o))return n;return 1},eu=(e,t)=>wr(e,t,false),wr=(e,t,o=false)=>{let r=po,n=o?on:hr,a=(n-(o?32:16))/2,s=r+(t-1)*n+a;return {x:ui,y:s}};var mi=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,n]=useState(false),i=()=>{if(!r)return null;let a=[],s=po;for(let c=1;c<=Zt;c++){let l=s+(c-1)*hr;a.push(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:`${hr}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",c]},c));}return a};return jsxs("div",{className:`splice-tray-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${fo}px`,height:`${po+Zt*on+ns}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:[jsxs("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#1f2937",padding:"2px",position:"relative",height:`${po}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"8px"},children:[jsx("div",{style:{fontWeight:"bold",fontSize:"10px"},children:o}),jsx("button",{onPointerDown:a=>{a.stopPropagation();},onMouseDown:a=>{a.stopPropagation();},onClick:a=>{a.stopPropagation(),a.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(),jsx("div",{style:{position:"absolute",top:po,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var bi=({data:e,selected:t,id:o})=>{let{fibersPerTube:r=12,tubeIndex:n=1,startOn:i="left-center"}=e||{},a=e?.mode==="ribbon"||e?.ribbon===true,s=useEdges(),c=`tube-${n}`,l=s.find(j=>j.source===o&&j.sourceHandle===c||j.target===o&&j.targetHandle===c),g=l?.data?.color,f=je((n-1)%12+1),u=g||f,p=Math.max(1,Math.min(24,Number(r)||12)),h=14,N=4,x=1,k=2,C=20,v=p*h+(p-1)*N,P=Math.max(60,v+x*2+k*2),y=i==="left"?Position.Left:i==="right"?Position.Right:Position.Bottom,I=y!==Position.Bottom,M=I?14:20,B=I?8:20,U=I?`inset ${y===Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",F=l?u:I?`linear-gradient(${y===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%)`,q={width:M,height:B,borderRadius:I?6:"50%",opacity:l?.3:.9,pointerEvents:"auto",background:F,backgroundColor:u,border:l?`2px solid ${u}`:`3px dashed ${u}`,cursor:"crosshair","--fiber-bg":u,boxShadow:l?U:`${U}${U!=="none"?", ":""}0 0 8px ${u}`,transition:"opacity 0.2s, box-shadow 0.2s",...y===Position.Left?{left:-(M-4)}:y===Position.Right?{right:-(M-4)}:{}},V=useMemo(()=>{let j=[],re=P-k*2-x*2,ne,H,_=false;i==="left"?(ne=x,H=Position.Top):i==="right"?(ne=x+re-v,H=Position.Top,_=true):(ne=x+(re-v)/2,H=Position.Top);for(let ie=0;ie<p;ie++){let W=_?p-ie:ie+1,L=`fiber-${W}`,te=s.find(Te=>Te.source===o&&Te.sourceHandle===L||Te.target===o&&Te.targetHandle===L),de=!!te&&(te.data?.isRibbon||te.data?.ribbonFiberIds&&Array.isArray(te.data.ribbonFiberIds)),ge=te?.data?.color,X=typeof te?.data?.striped=="boolean"?te.data.striped:void 0,he=Ot(W);a||de?he=Ot(W,{base:"#808080",striped:false}):(ge||X!==void 0)&&(he=Ot(W,{...ge?{base:ge}:{},...X!==void 0?{striped:X}:{}}));let we=ne+ie*(h+N),A=x,z={position:"absolute",left:`${we}px`,top:`${A}px`,width:h,height:h,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":he.base,backgroundColor:he.base};he.backgroundImage&&(z["--fiber-bg-image"]=he.backgroundImage),j.push(jsxs(Ce.Fragment,{children:[jsx(Handle,{id:L,type:"target",position:H,className:"tube-fiber-handle",isConnectable:true,style:z,"data-fiber-idx":W,"data-fiber-color":he.base}),jsx(Handle,{id:L,type:"source",position:H,className:"tube-fiber-handle",isConnectable:true,style:z,"data-fiber-idx":W,"data-fiber-color":he.base})]},`fiber-${W}`));}return j},[p,i,P,s,o,h,N,x,k,v,a]);return jsxs("div",{style:{width:P,height:C,borderRadius:4,background:"#111827",border:`${k}px solid ${t?"#3b82f6":u}`,position:"relative",boxShadow:t?`0 0 0 ${k}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:x,boxSizing:"border-box",overflow:"visible"},children:[V,jsx(Handle,{id:c,type:"target",position:y,isConnectable:true,className:"tube-connection-handle",style:q,"data-tube-idx":n,"data-tube-color":u,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"}),jsx(Handle,{id:c,type:"source",position:y,isConnectable:true,className:"tube-connection-handle",style:q,"data-tube-idx":n,"data-tube-color":u,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"})]})};var wi=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:n,color:i,rotation:a}=e||{},s=Ce.useRef(null);Ce.useEffect(()=>{if(s.current){let H=typeof a=="number"?a:0;s.current.style.transform=`rotate(${H}deg)`,s.current.style.transformOrigin="center center";}},[a]);let c=Math.max(1,Math.min(24,Number(o)||12)),l=10,g=2,f=6,u=f+l+4,p=60,h=Math.max(120,c*(l+g)+f*2),x=n??`${c}f Cable`,k=r?`Cable ID ${r}`:void 0,C=je(1),v=i||C,P=t?"#3b82f6":v,y=typeof a=="number"?a:0,I=H=>{let _=(H%360+360)%360;return _>=315||_<45?Position.Top:_>=45&&_<135?Position.Right:_>=135&&_<225?Position.Bottom:Position.Left},M=()=>{let H=[],_=I(y);for(let ie=0;ie<c;ie++){let W=ie+1,L=Ot(W),te=L.base,de=f+ie*(l+g),ge=-5,X=L.backgroundImage?L.backgroundImage:te,he={position:"absolute",left:`${de}px`,top:`${ge}px`,width:l,height:l,borderRadius:"50%",border:"none",background:X,backgroundColor:te,zIndex:10,cursor:"pointer","--fiber-bg":te};L.backgroundImage&&(he["--fiber-bg-image"]=L.backgroundImage);let we=`fiber-${W}`;H.push(jsxs(Ce.Fragment,{children:[jsx(Handle,{id:we,type:"target",position:_,className:"tube-fiber-handle",isConnectable:true,style:he,"data-fiber-idx":W,"data-fiber-color":te}),jsx(Handle,{id:we,type:"source",position:_,className:"tube-fiber-handle",isConnectable:true,style:he,"data-fiber-idx":W,"data-fiber-color":te})]},`fiber-${W}`));}return H},B="cable-button",U=8,F={width:U,height:U,borderRadius:"50%",background:v,backgroundColor:v,border:`1px solid ${v}`,cursor:"pointer",zIndex:10},q=2,j=(H=>{let _=(H%360+360)%360;return _>=315||_<45?Position.Bottom:_>=45&&_<135?Position.Left:_>=135&&_<225?Position.Top:Position.Right})(y),re={width:h,height:p,position:"relative",transform:`rotate(${y}deg)`,transformOrigin:"center center","--rotation":`${y}deg`},ne={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${q}px solid ${P}`,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 jsx("div",{ref:s,style:re,children:jsxs("div",{style:ne,children:[M(),jsx(Handle,{id:B,type:"source",position:j,className:"cable-button-handle",isConnectable:true,style:F,"data-handle-type":"cable-button","data-cable-color":v}),jsx(Handle,{id:B,type:"target",position:j,className:"cable-button-handle",isConnectable:true,style:F,"data-handle-type":"cable-button","data-cable-color":v}),jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2,transform:"translateX(2px)"},children:[jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:x}),k&&jsx("div",{style:{fontSize:10,opacity:.8},children:k})]})]})})};var xi=({data:e,selected:t})=>{let{tubeCount:o=12,fibersPerTube:r=12,fiberCount:n,cableId:i="CBL-002",label:a,tubeStartIndex:s=1,color:c}=e||{},l=Math.max(1,Math.min(24,Number(o)||12)),g=Math.max(1,Number(s)||1),f=14,u=10,p=3,h=6,N=h+u+4,x=60,k=Math.max(120,l*(f+p)+h*2),C=n??l*(Number(r)||12),v=a??`${C}f Cable`,P=i?`Cable ID ${i}`:void 0,y=je(g),I=c||y,M=t?"#3b82f6":I,B=()=>{let j=[];for(let re=0;re<l;re++){let ne=g+re,H=Ot(ne),_=H.base,ie=h+re*(f+p),W=-5,L=H.backgroundImage?H.backgroundImage:_,te={position:"absolute",left:`${ie}px`,top:`${W}px`,width:f,height:u,borderRadius:6,border:"none",background:L,backgroundColor:_,zIndex:10,cursor:"pointer","--fiber-bg":_};H.backgroundImage&&(te["--fiber-bg-image"]=H.backgroundImage);let de=`tube-${ne}`;j.push(jsxs(Ce.Fragment,{children:[jsx(Handle,{id:de,type:"target",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,style:te,"data-fiber-idx":ne,"data-tube-idx":ne,"data-tube-color":_}),jsx(Handle,{id:de,type:"source",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,style:te,"data-fiber-idx":ne,"data-tube-idx":ne,"data-tube-color":_})]},`tube-${ne}`));}return j},U="cable-button",F=8,q={width:F,height:F,borderRadius:"50%",background:I,backgroundColor:I,border:`1px solid ${I}`,cursor:"pointer",zIndex:10};return jsxs("div",{style:{width:k,height:x,borderRadius:4,background:"#111827",border:`2px solid ${M}`,position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:h,paddingTop:N,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[B(),jsx(Handle,{id:U,type:"source",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,style:q,"data-handle-type":"cable-button","data-cable-color":I}),jsx(Handle,{id:U,type:"target",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,style:q,"data-handle-type":"cable-button","data-cable-color":I}),jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2},children:[jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:v}),P&&jsx("div",{style:{fontSize:10,opacity:.8},children:P})]})]})};var ki=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:n,label:i,portLabelsLeft:a,portLabelsRight:s}=e||{},c=useEdges(),l=typeof n=="number"&&[1,2,4].includes(n)?n:2,g=Math.max(1,Math.min(4,l)),f=9,u=3,p=3,h=60,N=30,x=g*f+(g-1)*u,k=Math.max(N,x+p*2),C=Math.max(h,80),v=(I,M)=>{let B=`${I}-${M+1}`;return c.find(F=>F.source===o&&F.sourceHandle===B||F.target===o&&F.targetHandle===B)?.data?.color||"#555"},P=I=>{let M=[],B=I==="left"?Position.Left:Position.Right,U=I==="left"?a:s;for(let F=0;F<g;F++){let q=F+1,V=`${I}-${q}`,j=v(I,F),H=p+(k-x)/2+F*(f+u),_={position:"absolute",left:I==="left"?-5:void 0,right:I==="right"?-5:void 0,top:`${H}px`,width:f,height:f,borderRadius:"50%",border:"none",background:j,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};M.push(jsxs(Ce.Fragment,{children:[jsx(Handle,{id:V,type:"target",position:B,isConnectable:true,style:_}),jsx(Handle,{id:V,type:"source",position:B,isConnectable:true,style:_})]},V)),U&&U[F]&&M.push(jsx("div",{style:{position:"absolute",left:I==="left"?-30:void 0,right:I==="right"?-30:void 0,top:`${H}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:I==="left"?"right":"left",width:"25px"},children:U[F]},`${V}-label`));}return M},y=i||`${r}-${g}f`;return jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:C,height:k,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:[P("left"),jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:y})}),P("right")]})};var bo=32,un=30,cu=24,du=80,dn=400,ln=300,ps=2,mo=8,fs=120;function Ti(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,a=3,s=60,c=30,l=r*n+(r-1)*i,g=Math.max(c,l+a*2);return {width:Math.max(s,80),height:g}}function pn(e){let{fibersPerTube:t=12}=e.data||{},o=Math.max(1,Math.min(24,Number(t)||12)),r=14,n=4,i=1,a=2,s=20,c=o*r+(o-1)*n;return {width:Math.max(60,c+i*2+a*2),height:s}}function gs(e){return {width:fo,height:0}}function ms(e){return e.type==="coupler"?Ti(e):e.type==="tube"?pn(e):e.type==="splice-tray"?gs():{width:80,height:30}}function Pi(e){let t=0;for(let o of e){let r=ms(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function bs(e,t=0){let o=t;for(let r of e){let n=ms(r),i=(r.position?.y||0)+n.height;i>o&&(o=i);}return o}function hs(e){return e.data?.panelWidth||dn}function lu(e){return e.data?.panelHeight||ln}function ys(e){return hs(e)-ps*2-mo*2}function uu(e,t){return ys(e)-t}function ws(e,t=un){return Math.floor(e/t)+1}function Ns(e,t=un){return (e-1)*t}function pu(e,t,o){let r=un,n=ws(o.y,r),i=Ns(n,r);return {x:o.x,y:i,slotPosition:n}}function Ci(e,t){if(t.length===0)return {width:e.data?.panelWidth||dn,height:e.data?.panelHeight||ln};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=pn(u);p.width>c&&(c=p.width);}else if(u.type==="coupler"){let p=Ti(u);p.width>l&&(l=p.width);}let g=c+fs+fo+l+_o,f=0;i=f+g+f;}else i=Pi(t)+4;i=Math.max(e.data?.panelWidth||dn,i);let a=bs(t,bo),s=Math.max(e.data?.panelHeight||ln,a+mo);return {width:i,height:s}}function xs(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 fu(e,t,o){return xs(e,t,o)}var ds=20,ls=400,us=300;function Ri(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||ls,height:e.data?.closureHeight||e.data?.panelHeight||us};let o=t.some(s=>s.type==="tube"),r=t.some(s=>s.type==="splice-tray"),n;if(o&&r){let s=0,c=0,l=0,g=t.filter(u=>u.type==="tube"),f=t.filter(u=>u.type==="splice-tray");if(g.length>0&&f.length>0){let u=f.map(h=>h.position?.x||0),p=u.reduce((h,N)=>h+N,0)/u.length;for(let h of g){let N=pn(h);(h.position?.x||0)<p?N.width>s&&(s=N.width):N.width>c&&(c=N.width);}f.length>0&&(l=fo),n=mo+s+ds+l+ds+c+_o;}else n=Pi(t)+mo+_o;}else n=Pi(t)+mo+_o;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||ls,n);let i=bs(t,bo),a=Math.max(e.data?.closureHeight||e.data?.panelHeight||us,i+mo);return {width:n,height:a}}var Di=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:n,panelWidth:i,panelHeight:a}=e||{},{getNodes:s,setNodes:c}=useReactFlow(),l=useRef(false),g=useRef([]),f=useMemo(()=>{let v=s().filter(P=>P.parentId===o);return (v.length!==g.current.length||v.some((P,y)=>P.id!==g.current[y]?.id))&&(g.current=v),g.current},[s,o]),u=useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:i,panelHeight:a}}),[o,e,i,a]),p=useMemo(()=>i&&a?{width:i,height:a}:f.length===0?{width:i||400,height:a||300}:Ci(u,f),[f,u,i,a]);useEffect(()=>{if(i&&a||l.current)return;let C=i,v=a,P=Math.abs((C||0)-p.width),y=Math.abs((v||0)-p.height);(P>1||y>1)&&(l.current=true,c(I=>I.map(M=>M.id===o?{...M,data:{...M.data,panelWidth:p.width,panelHeight:p.height}}:M)),setTimeout(()=>{l.current=false;},0));},[o,p.width,p.height,i,a,c]);let h=p.width,N=p.height,x=bo,k=n||r;return jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${h}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"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${x}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:"6px 6px 0 0",borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:k})}),jsx("div",{style:{position:"absolute",top:x,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var Fi=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:n,closureWidth:i,closureHeight:a,panelWidth:s,panelHeight:c}=e||{},{getNodes:l,setNodes:g}=useReactFlow(),f=useRef(false),u=useRef([]),p=useMemo(()=>{let I=l().filter(M=>M.parentId===o);return (I.length!==u.current.length||I.some((M,B)=>M.id!==u.current[B]?.id))&&(u.current=I),u.current},[l,o]),h=useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:i||s,closureHeight:a||c}}),[o,e,i,a,s,c]),N=useMemo(()=>i&&a?{width:i,height:a}:s&&c?{width:s,height:c}:p.length===0?{width:i||s||400,height:a||c||300}:Ri(h,p),[p,h,i,a,s,c]);useEffect(()=>{if(i&&a||s&&c||f.current)return;let y=i||s,I=a||c,M=Math.abs((y||0)-N.width),B=Math.abs((I||0)-N.height);(M>1||B>1)&&(f.current=true,g(U=>U.map(F=>F.id===o?{...F,data:{...F.data,closureWidth:N.width,closureHeight:N.height}}:F)),setTimeout(()=>{f.current=false;},0));},[o,N.width,N.height,i,a,s,c,g]);let x=N.width,k=N.height,C=bo,v=n||r,P=x/2;return jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${P}px ${P}px 12px 12px`,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",overflow:"hidden"},children:[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:`${P}px ${P}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:v})}),jsx("div",{style:{position:"absolute",top:C,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var _i=({data:e,selected:t,id:o})=>{let{label:r,splitterType:n="splitter",inputCount:i=1,outputCount:a=8}=e||{},s=useEdges(),c=r||(n==="WDM"?"WDM":"Splitter"),l=9,g=3,f=3,u=50,p=30,h=Math.min(Math.max(i||1,1),2),N=h*l+(h-1)*g,x=Math.min(a||8,48),k=x*l+(x-1)*g,C=Math.max(N,k),v=Math.max(p,C+f*2),P=Math.max(u,50),y=re=>s.find(H=>H.source===o&&H.sourceHandle===re||H.target===o&&H.targetHandle===re)?.data?.color||"#555",I=()=>{let re=[],ne=f+(v-N)/2;for(let H=0;H<h;H++){let _=`input-${H+1}`,ie=ne+H*(l+g),W=y(_),L={position:"absolute",left:-5,top:`${ie}px`,width:l,height:l,borderRadius:"50%",border:"none",background:W,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};re.push(jsxs(Ce.Fragment,{children:[jsx(Handle,{id:`${_}-target`,type:"target",position:Position.Left,isConnectable:true,style:L}),jsx(Handle,{id:`${_}-source`,type:"source",position:Position.Left,isConnectable:true,style:L})]},_));}return re},M=()=>{let re=[],ne=f+(v-k)/2;for(let H=0;H<x;H++){let _=`output-${H+1}`,ie=ne+H*(l+g),W=y(_),L={position:"absolute",right:-5,top:`${ie}px`,width:l,height:l,borderRadius:"50%",border:"none",background:W,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};re.push(jsxs(Ce.Fragment,{children:[jsx(Handle,{id:`${_}-target`,type:"target",position:Position.Right,isConnectable:true,style:L}),jsx(Handle,{id:`${_}-source`,type:"source",position:Position.Right,isConnectable:true,style:L})]},_));}return re},B=Math.max(N+f*4,p*.6),U=(v-B)/2,F=U+B,q=0,V=v,j=t?"#3b82f6":"#4b5563";return jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:P,height:v,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:[jsx("svg",{width:P,height:v,viewBox:`0 0 ${P} ${v}`,style:{position:"absolute",top:0,left:0,width:`${P}px`,height:`${v}px`,pointerEvents:"none",zIndex:0},children:jsx("polygon",{points:`0,${U} 0,${F} ${P},${V} ${P},${q}`,fill:"#1f2937",stroke:j,strokeWidth:"2"})}),I(),jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:c})}),M()]})};var Cs=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",mn=(e,t)=>Cs(e)||Cs(t),fe=(e,t)=>t?e?.type==="fibre-split"?Je(t):Je(t):t||"";var Rs="--rear",Es=new WeakMap;function zo(e){if(typeof e!="string")return;let t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");return t.length>0?t:void 0}function xu(e){let t=new Set;return e.forEach(o=>{o&&t.add(o);}),[...t]}function vs(...e){let t=e.map(o=>zo(o)).filter(o=>!!o);if(t.some(o=>o.includes("c13")))return "c13";if(t.some(o=>o.includes("c14")))return "c14";if(t.some(o=>o.includes("c19")))return "c19";if(t.some(o=>o.includes("c20")))return "c20";if(t.some(o=>o.includes("ac")))return "ac"}function Mi(e){let t=[zo(e.type),zo(e.cableType),zo(e.connectorType),zo(e.handleId)].filter(o=>!!o);if(t.some(o=>o.includes("fiber")||o.includes("smf")||o.includes("mmf")||o.includes("qsfp")||o.includes("sfp")||o.includes("lc")||o.includes("sc")))return "fiber";if(t.some(o=>o.includes("ethernet")||o.startsWith("eth")||o.includes("rj45")||o.includes("base-t")))return "ethernet"}function xr(e){if(Array.isArray(e.compatibility)&&e.compatibility.length>0)return xu(e.compatibility.map(o=>zo(o)));if(e.kind==="power"||Qe(e.type)){let o=vs(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(e.kind==="network"){let o=Mi(e);return o?[`network:${o}`]:["network"]}let t=Qe(e.type)?"power":Mi(e)?"network":void 0;if(t==="power"){let o=vs(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(t==="network"){let o=Mi(e);return o?[`network:${o}`]:["network"]}return []}function ku(e){let t=e.data??{},o=typeof t.powerPorts=="number"&&Number.isFinite(t.powerPorts)&&t.powerPorts>0?t.powerPorts:36;return [{name:"Power",ports:Array.from({length:o},(r,n)=>{let i=At(n);return {id:`${n+1}`,label:`${n+1}`,connected:false,type:i==="C19"?"power_c19":"power_c13",connectorType:i}})}]}function Pu(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups;let{ports:o,rearPorts:r}=Ie(t);return r.length>0?r:o.length>0?o:ku(e)}function Tu(e){let t=e?.data;if(!e||!t||typeof t!="object")return new Map;let o=Es.get(t);if(o)return o;let r=new Map,n=(i,a)=>{a.forEach(s=>{s.ports.forEach(c=>{let l=Tt(s.name,{id:c.id,label:c.label,type:Qe(c.type)?c.type:void 0});r.set(l,{face:i,kind:Qe(c.type)?"power":"network",compatibility:xr({compatibility:c.compatibility,kind:Qe(c.type)?"power":"network",type:c.type,cableType:c.cableType,connectorType:c.connectorType,handleId:l})});});});};if(e.type==="vertical-pdu")n("rear",Pu(e));else {let{ports:i,rearPorts:a}=Ie(t);n("front",i),n("rear",a);}return Es.set(t,r),r}function Cu(e,t){if(!e)return "unknown";if(t?.type==="vertical-pdu"||Hn(e)||/^\d+$/.test(e))return "power";let o=e.toLowerCase(),r=o.startsWith("net-")||o.startsWith("port-")||o.startsWith("uplink-")||o.includes("fiber")||o.includes("ports"),n=/^[a-z0-9]+-\d+$/i.test(e)&&!o.startsWith("pwr")&&!o.startsWith("power");return r||n?"network":"unknown"}function Ru(e,t,o){if(!e)return [];if(t==="power")return o?.type==="vertical-pdu"&&/^\d+$/.test(e)?xr({kind:t,connectorType:At(Math.max(Number(e)-1,0)),handleId:e}):xr({kind:t,handleId:e});if(t==="network"){let r=e.toLowerCase();return xr({kind:t,handleId:e,type:r.includes("fiber")||r.includes("qsfp")||r.includes("sfp")?"fiber":r.startsWith("eth")||r.startsWith("net-")||r.startsWith("port-")?"ethernet":void 0})}return []}function ho(e,t){let o=$t(t);if(!o)return {normalizedHandle:"",kind:"unknown",compatibility:[]};let r=o,n;r.endsWith(Rs)&&(r=r.slice(0,-Rs.length),n="rear");let i=Tu(e).get(r),l=(e?.data??{}).handleSideMap?.[r]??n??i?.face;l||(r==="net-top"||r==="net-bottom"?l="front":(r==="pwr-left-1"||r==="pwr-left-2"||r==="net-right-1"||r==="net-right-2"||Hn(r))&&(l="rear"));let g=i?.kind??Cu(r,e);return {normalizedHandle:r,face:l,kind:g,compatibility:i?.compatibility.length?i.compatibility:Ru(r,g,e)}}function Eu(e,t){if(e.length===0||t.length===0)return true;let o=new Set(t);return e.some(r=>o.has(r))}function Ai(e){let t=new Map;for(let o of e)t.set(o.id,o);return t}function $i(e,t,o=Ai(t.nodes)){if(!e.source||!e.target||!e.sourceHandle||!e.targetHandle)return {valid:true};let r=o.get(e.source),n=o.get(e.target),i=mn(r,n);if(!i){let A=ho(r,e.sourceHandle),z=ho(n,e.targetHandle),Te=A.kind,et=z.kind;if(Te!=="unknown"&&et!=="unknown"&&Te!==et)return {valid:false,reason:`Cannot connect ${Te} handle to ${et} handle`};if(!Eu(A.compatibility,z.compatibility))return {valid:false,reason:`Incompatible endpoints: ${e.sourceHandle} does not match ${e.targetHandle}`};let St=Te==="power"&&et==="power",le=r?.type==="vertical-pdu"||n?.type==="vertical-pdu";if(St&&!le)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let a=fe(r,e.sourceHandle),s=fe(n,e.targetHandle),c=false,l=false;for(let A of t.edges)if(!(e.ignoreEdgeId&&A.id===e.ignoreEdgeId)&&(!c&&A.source===e.source&&(c=fe(r,A.sourceHandle)===a),!c&&A.target===e.source&&(c=fe(r,A.targetHandle)===a),!l&&A.target===e.target&&(l=fe(n,A.targetHandle)===s),!l&&A.source===e.target&&(l=fe(n,A.sourceHandle)===s),c&&l))break;if((c||l)&&!i)return c?{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 g=(A,z)=>(A?.type==="tube"||A?.type==="cable")&&!!z&&z.startsWith("fiber-"),f=(A,z)=>(A?.type==="tube"||A?.type==="multi-tube-cable")&&!!z&&z.startsWith("tube-"),u=(A,z)=>A?.type==="multi-tube-cable"&&!!z&&z.startsWith("tube-"),p=(A,z)=>A?.type==="tube"&&!!z&&z.startsWith("tube-"),h=(A,z)=>(A?.type==="cable"||A?.type==="multi-tube-cable")&&z==="cable-button",N=(A,z)=>A?.type==="splice"&&(z==="left"||z==="right"),x=(A,z)=>A?.type==="coupler"&&!!z&&(z.startsWith("left-")||z.startsWith("right-")),k=(A,z)=>{if(A?.type!=="fibre-split"||!z)return false;let Te=fe(A,z);return Te.startsWith("input-")||Te.startsWith("output-")},C=(A,z)=>A?.type==="fibre-split"&&!!z&&fe(A,z).startsWith("output-");if(!i)return {valid:true};if(r?.type==="splice"&&n?.type==="splice"){let A=r.data?.mode==="ribbon",z=n.data?.mode==="ribbon";if(A!==z)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let v=g(r,e.sourceHandle),P=g(n,e.targetHandle),y=N(r,e.sourceHandle),I=N(n,e.targetHandle),M=x(r,e.sourceHandle),B=x(n,e.targetHandle),U=k(r,e.sourceHandle),F=k(n,e.targetHandle),q=C(r,e.sourceHandle),V=C(n,e.targetHandle),j=h(r,e.sourceHandle),re=h(n,e.targetHandle),ne=u(r,e.sourceHandle),H=u(n,e.targetHandle),_=p(r,e.sourceHandle),ie=p(n,e.targetHandle),W=f(r,e.sourceHandle),L=f(n,e.targetHandle);return v&&I||P&&y||(y&&(B||F)||I&&(M||q))||(M&&(B||F||I)||B&&(M||U||y))||(q&&(I||P||B)||V&&(y||v||M))||j&&re||(ne&&ie||H&&_)?{valid:true}:W&&L?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}function bn(e,t){if(!t)return;let o=ho(t,e).face;return o==="front"||o==="rear"?o:void 0}function Li(e={},t={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},r=Ai(o.nodes),n=new Set;return {getState:()=>o,setState:u=>{o={...o,...u},u.nodes&&(r=Ai(o.nodes)),n.forEach(p=>p(o));},subscribe:u=>(n.add(u),()=>n.delete(u)),selectEdgeZIndex:u=>{let p=C=>{if(typeof C.parentId=="string")return C.parentId;let v=C.parentNode;if(typeof v=="string")return v},h=C=>{let v=p(C),P=v?r.get(v):void 0;return P?.type!=="rack"?[C.data?.face||Ho(C.data)]:P&&Fe(P.data)?Yt(Ue(C.data)):[C.data?.face||Ho(C.data)]},N=(C,v)=>{let P=r.get(C);if(!(!!P&&(P.type==="device"||P.type==="server"||P.type==="switch"||P.type==="router"))||!P||P.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let M=h(P),B=bn(v||"",P);if(B)return M.includes(B)?1e3:500;let U=(v||"").toString().replace(/-(source|target)$/i,""),F=U.toLowerCase(),q=F.startsWith("pwr")||F.startsWith("power"),V=F.startsWith("net-")||F.startsWith("port-")||F.startsWith("uplink-")||F.includes("fiber")||F.includes("ports"),j=/^[A-Z0-9]+-\d+$/i.test(U)&&!F.startsWith("pwr")&&!F.startsWith("power"),re=V||j;if(q)return M.includes("rear")?1e3:500;if(re)return M.includes("front")?1e3:500},x=N(u.target,u.targetHandle);if(x!==void 0)return x;let k=N(u.source,u.sourceHandle);return k!==void 0?k:1e3},validateConnection:u=>{let p=t.validateConnection||$i;return p===$i?$i(u,o,r):p(u,o)},selectNodeById:u=>r.get(u),selectConnectedEdges:u=>o.edges.filter(p=>p.source===u||p.target===u)}}var Du=e=>e,Su=e=>e.nodes,Iu=e=>e.edges;function Bi(e,t){let o=useCallback(n=>e.subscribe(i=>n()),[e]),r=useCallback(()=>t(e.getState()),[e,t]);return useSyncExternalStore(o,r,r)}function Fu(e){return Bi(e,Du)}function Oi(e){return Bi(e,Su)}function Wi(e){return Bi(e,Iu)}function Ss(e){return e.selectEdgeZIndex}function Oe(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,findBy:i,matchOn:a=i,data:s}=e,c=i==="source"?o.sourceHandle:o.targetHandle,l=i==="source"?o.source:o.target;if(!c||!l)return null;let g=Je(c),f=t.find(k=>a==="source"?k.source===l&&Je(k.sourceHandle)===g:k.target===l&&Je(k.targetHandle)===g);if(!f)return null;let u=t.filter(k=>k.id!==f.id),p=addEdge(o,u),h=p[p.length-1],N=n({...o,id:h.id,type:r}),x={...h,type:r,zIndex:N,style:{...h.style,zIndex:N},data:s!==void 0?s:h.data};return [...p.slice(0,-1),x]}function _u(e,t){return !e||!t?"unknown":ho(e,t).kind}function yo(e,t){return _u(e,t)==="power"}function Hs(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}function _s(e,t,o,r,n,i,a){let s=false,c=false;for(let l of e)if(!s&&t&&l.source===t&&(s=fe(o,l.sourceHandle)===r),!s&&t&&l.target===t&&(s=fe(o,l.targetHandle)===r),!c&&n&&l.target===n&&(c=fe(i,l.targetHandle)===a),!c&&n&&l.source===n&&(c=fe(i,l.sourceHandle)===a),s&&c)break;return {source:s,target:c}}function Ms(e,t,o,r){let n=`edge-${e.source}-${e.sourceHandle}-${e.target}-${e.targetHandle}-${Date.now()}`,i=o({...e,id:n,type:t});return {id:n,source:e.source,target:e.target,sourceHandle:e.sourceHandle,targetHandle:e.targetHandle,type:t,zIndex:i,style:{zIndex:i},data:r??{}}}var Xe=({type:e,children:t})=>{let o=Ce.useRef(null),r=Ce.useCallback(n=>{if(o.current=n,n){let i=n.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]);return Ce.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]),jsx("div",{ref:r,style:{width:"100%",height:"100%"},children:t})},Yu=(e,t,o)=>({rack:r=>jsx(Xe,{type:"rack",children:jsx(Xn,{...r,onFaceChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsx(Xe,{type:"fiber",children:jsx(Yn,{...r})}),device:r=>jsx(Xe,{type:"device",children:jsx(Bo,{...r})}),server:r=>jsx(Xe,{type:"server",children:jsx(Bo,{...r})}),switch:r=>jsx(Xe,{type:"switch",children:jsx(Bo,{...r})}),router:r=>jsx(Xe,{type:"router",children:jsx(Bo,{...r})}),"vertical-pdu":r=>jsx(Xe,{type:"vertical-pdu",children:jsx(si,{...r})}),splice:r=>jsx(Xe,{type:"splice",children:jsx(li,{...r})}),"splice-tray":r=>jsx(Xe,{type:"splice-tray",children:jsx(mi,{...r})}),tube:r=>jsx(Xe,{type:"tube",children:jsx(bi,{...r})}),cable:r=>jsx(Xe,{type:"cable",children:jsx(wi,{...r})}),"multi-tube-cable":r=>jsx(Xe,{type:"multi-tube-cable",children:jsx(xi,{...r})}),coupler:r=>jsx(Xe,{type:"coupler",children:jsx(ki,{...r})}),"patch-panel":r=>jsx(Xe,{type:"patch-panel",children:jsx(Di,{...r})}),closure:r=>jsx(Xe,{type:"closure",children:jsx(Fi,{...r})}),"fibre-split":r=>jsx(Xe,{type:"fibre-split",children:jsx(_i,{...r})})});function $s(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 Uo(e){return e?.face==="front"||e?.face==="rear"?e.face:Ho(e)}function As(e,t){return {...e,face:t}}function Ku(e,t){let o=e.data??{},r=new Set,n=c=>{r.add(c),r.add(`${c}-source`),r.add(`${c}-target`);};if(e.type==="vertical-pdu"){let c=Array.isArray(o.pduPortGroups)&&o.pduPortGroups.length>0?o.pduPortGroups:Ie(o).rearPorts.length>0?Ie(o).rearPorts:Ie(o).ports;if(c.length>0)c.forEach(l=>{l.ports.forEach(g=>n(Tt(l.name,g)));});else if(typeof o.powerPorts=="number"&&o.powerPorts>0)for(let l=1;l<=o.powerPorts;l+=1)n(`${l}`);return n("mgmt-net-1"),r}let{ports:i,rearPorts:a}=Ie(o),s=new Set;return i.forEach(c=>{c.ports.forEach(l=>{let g=Tt(c.name,l);s.add(g),t.includes("front")&&n(g);});}),t.includes("rear")&&a.forEach(c=>{c.ports.forEach(l=>{let g=Tt(c.name,l);n(g),t.includes("front")&&s.has(g)&&n(`${g}--rear`);});}),r}function Ls(e,t,o){let r=e.sourceHandle,n=e.targetHandle;return $s(t)&&r&&!yo(t,r)&&(r=$t(r)),$s(o)&&n&&!yo(o,n)&&(n=`${$t(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var qu={fiber:Yr,ethernet:Yr,power:qn,smoothstep:va,step:Ia,"thick-cable":_a},Zu=8192,Ju=8192,Qu=2048,ep=4;function kr(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function tp(e){if(e)return {...e,width:kr(e.width,1,Zu),height:kr(e.height,1,Ju),padding:kr(e.padding,0,Qu),pixelRatio:kr(e.pixelRatio,.1,ep),quality:kr(e.quality,0,1)}}var Bs=({nodes:e,edges:t,initialNodes:o,initialEdges:r,onNodesChange:n,onEdgesChange:i,store:a,debug:s,onNodeClick:c,onEdgeClick:l,nodeTypes:g,edgeTypes:f,onConnect:u,onEdgeUpdate:p,isValidConnection:h,connectionMode:N,onFaceChange:x,onRackFaceChange:k,className:C,style:v,alignRacksToBottom:P,reAssignable:y=true,colorMode:I="dark",onInit:M,onFlowMethods:B,showDownloadButton:U=false,downloadButtonPosition:F="top-right",downloadButtonText:q="Download Image",downloadButtonStyle:V,useSmoothstepEdgesForTubes:j=false,readOnly:re=false,interaction:ne,actionPanel:H,fitViewOptions:_,onlyRenderVisibleElements:ie=false})=>{let W=useCallback((d,m)=>{let w=new Map,b=[],T=[],E=new Map(m.map(S=>[S.id,S])),$=(S,D)=>!S||!D?false:!!(S.startsWith("tube-")||D.type==="splice"&&(S==="left"||S==="right")||S==="cable-button");for(let S of d){if(!S.source||!S.target){s&&console.warn("Invalid edge skipped (missing source/target):",S);continue}let D=E.get(S.source),Y=E.get(S.target),ae=S.sourceHandle?`${S.source}:${S.sourceHandle}`:void 0,ye=ae?w.get(ae):void 0,_e=S.sourceHandle?$(S.sourceHandle,D):false,Me=S.targetHandle?`${S.target}:${S.targetHandle}`:void 0,Le=Me?w.get(Me):void 0,rt=S.targetHandle?$(S.targetHandle,Y):false;if(ye&&!_e){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:ae,existingEdge:ye.id,duplicateEdge:S.id}),T.push(S);continue}if(Le&&!rt){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Me,existingEdge:Le.id,duplicateEdge:S.id}),T.push(S);continue}b.push(S),ae&&!ye&&w.set(ae,S),Me&&!Le&&w.set(Me,S);}return s&&T.length>0&&console.log(`Filtered ${T.length} duplicate edge(s) from initial edges`),b},[s]),L=Array.isArray(e)&&Array.isArray(t),te=Ce.useMemo(()=>L?e||[]:o||e||[],[L,e,o]),de=Ce.useMemo(()=>L?t||[]:r||t||[],[L,t,r]),ge=Ce.useMemo(()=>W(de,te),[de,te,W]),X=Ce.useMemo(()=>a||Li({nodes:jn(te),edges:ge,debug:s}),[a,L,s,ge]),he=Oi(X),we=Wi(X),[A,z]=useNodesState(he),[Te,et,St]=useEdgesState(we),le=Ss(X),tt=useRef(null),[Ge,qo]=useState(false);useEffect(()=>{let d=()=>{qo(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return d(),window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)},[]);let xe=re===true,Se=useMemo(()=>{let m={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!Ge,edgesFocusable:!Ge,edgesReconnectable:true,connectOnClick:true,panOnDrag:true,panOnScroll:!Ge,zoomOnScroll:!Ge,zoomOnPinch:!Ge,zoomOnDoubleClick:!Ge,allowKeyboardDelete:true,showControls:true,showMiniMap:!Ge,showInteractiveControl:true},...ne??{}};return xe?{...m,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}:m},[Ge,ne,xe]),xo=useMemo(()=>({enabled:H?.enabled??true,showRearToggle:H?.showRearToggle??true,showDeRack:H?.showDeRack??true}),[H]),{toObject:ko,setViewport:Zo,setNodes:Jo,setEdges:Po,getNodes:yt,getEdges:eo,fitView:Qo,flowToScreenPosition:se,getIntersectingNodes:Ne}=useReactFlow(),$e=useRef(n),We=useRef(i),st=useRef(L),Ve=useRef(X),ot=useRef({toObject:ko,setViewport:Zo,setReactFlowNodes:Jo,setReactFlowEdges:Po,getNodes:yt,getEdges:eo,fitView:Qo});useEffect(()=>{$e.current=n;},[n]),useEffect(()=>{We.current=i;},[i]),useEffect(()=>{st.current=L;},[L]),useEffect(()=>{Ve.current=X;},[X]),useEffect(()=>{ot.current={toObject:ko,setViewport:Zo,setReactFlowNodes:Jo,setReactFlowEdges:Po,getNodes:yt,getEdges:eo,fitView:Qo};},[ko,Zo,Jo,Po,yt,eo,Qo]);let Cr=useMemo(()=>({toObject:()=>ot.current.toObject(),setViewport:d=>{ot.current.setViewport(d);},setNodes:d=>{if(ot.current.setReactFlowNodes(d),st.current){$e.current?.(d);return}Ve.current.setState({nodes:d});},setEdges:d=>{if(ot.current.setReactFlowEdges(d),st.current){We.current?.(d);return}Ve.current.setState({edges:d});},toImage:d=>tt.current?toPng(tt.current,tp(d)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>ot.current.getNodes(),getEdges:()=>ot.current.getEdges(),fitView:d=>{let{fitView:m,getNodes:w}=ot.current;if(d?.nodes&&Array.isArray(d.nodes)&&d.nodes.length>0){let E=d.nodes.map(D=>w().find(Y=>Y.id===D)).filter(D=>D!==void 0),{nodes:$,...S}=d;m({...S,nodes:E});return}let{nodes:b,...T}=d||{};m(T);}}),[]);useEffect(()=>{B?.(Cr);},[B,Cr]);let[wt,Rr]=useState(false),Er=useCallback(()=>{if(!wt){if(!tt.current){s&&console.error("ReactFlow wrapper ref is not available");return}Rr(true),toPng(tt.current,{filter:d=>!(d?.classList?.contains("react-flow__minimap")||d?.classList?.contains("react-flow__controls")||d?.classList?.contains("react-flow__attribution")||d?.classList?.contains("download-button")||d?.tagName==="BUTTON"),backgroundColor:I==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(d=>{let m=document.createElement("a");m.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,m.href=d,m.click();}).catch(d=>{s&&console.error("Error downloading image:",d);}).finally(()=>{Rr(false);});}},[I,s,wt]),[er,To]=useState(null),Ee=useRef(null),ze=useRef(x),ke=useRef(k);useEffect(()=>{ze.current=x;},[x]),useEffect(()=>{ke.current=k;},[k]),useEffect(()=>{Ee.current=er;},[er]);let vr=useCallback((d,m)=>{ze.current?.(d,m);},[]),It=useCallback((d,m)=>{ke.current?.(d,m);},[]),Gt=useCallback(()=>Ee.current,[]),qe=useMemo(()=>({...Yu(vr,It,Gt),...g??{}}),[vr,It,Gt,g]),ct=useMemo(()=>({...qu,...f??{}}),[f]),Dr=useMemo(()=>({zIndex:1e3,reconnectable:Se.edgesReconnectable}),[Se.edgesReconnectable]),Rn=useMemo(()=>({hideAttribution:true}),[]),Nt=useRef(A);useEffect(()=>{Nt.current=A;},[A]);let J=useRef(Te);useEffect(()=>{J.current=Te;},[Te]),useEffect(()=>{z(he);},[he,z]),useEffect(()=>{et(we);},[we,et]),useEffect(()=>{if(L&&t){let d=W(t,e||[]);d.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-d.length} duplicate(s) removed`),i?.(d));}},[L,t,e,W,i,s]),useEffect(()=>{L&&X.setState({nodes:Os(e||[],X.getState().nodes)});},[L,e,X]),useEffect(()=>{L&&X.setState({edges:Ws(t||[],X.getState().edges)});},[L,t,X]),useEffect(()=>{if(!P||!A||A.length===0)return;let d=A.filter(D=>D.type==="rack");if(d.length===0)return;let m=d.map(D=>{let Y=Rt(D.data).height;return (D.position?.y||0)+Y}),w=Math.min(...m),b=Math.max(...m);if(b-w<20)return;let E=b,$=A.map(D=>{if(D.type!=="rack")return D;let Y=Rt(D.data).height,ae=(D.position?.y||0)+Y,ye=E-ae;return Math.abs(ye)<5?D:{...D,position:{x:D.position?.x||0,y:(D.position?.y||0)+ye}}});if($.some((D,Y)=>{let ae=A[Y]?.position,ye=D.position;return ae?.x!==ye?.x||ae?.y!==ye?.y})){if(L){n?.($);return}X.setState({nodes:$});}},[P,A,L,n,X]);let xt=useRef(new Map);useEffect(()=>{let d=new Map;A.forEach(m=>{d.set(m.id,m);}),xt.current=d;},[A]);let ee=useCallback(d=>xt.current.get(d),[]),ve=useCallback(d=>{if(!d)return;if(typeof d.parentId=="string")return d.parentId;let m=d.parentNode;if(typeof m=="string")return m},[]),Sr=useCallback(d=>{let m=ve(d);if(!m)return;let w=ee(m);if(!(!w||w.type!=="rack"))return w},[ee,ve]),tr=useCallback(d=>!d||d.type!=="rack"?false:Fe(d.data),[]),to=useCallback(d=>{if(!d||!pt(d))return false;let m=Sr(d);return m?Fe(m.data):false},[Sr]),Ae=useCallback(d=>{if(!d||d.type!=="device")return false;let m=d.data?.deviceType;return typeof m=="string"&&m.toLowerCase().replace(/_/g,"-")==="patch-panel"},[]),kt=useCallback(d=>{Nt.current=d;let m=new Map;d.forEach(w=>{m.set(w.id,w);}),xt.current=m,z(d),L?n?.(d):X.setState({nodes:d});},[L,X,z,n]),ue=useCallback(d=>{J.current=d,et(d),L?i?.(d):X.setState({edges:d});},[L,X,et,i]),Pe=useCallback(d=>{if(d.positionAbsolute)return d.positionAbsolute;let m=d.position?.x||0,w=d.position?.y||0,b=ve(d),T=new Set;for(;b&&!T.has(b);){T.add(b);let E=ee(b);if(!E)break;if(E.positionAbsolute){m+=E.positionAbsolute.x,w+=E.positionAbsolute.y;break}m+=E.position?.x||0,w+=E.position?.y||0,b=ve(E);}return {x:m,y:w}},[ee,ve]),Ft=useCallback(d=>{let m=Pe(d),w=d.width||0,b=d.height||0;return {x:m.x+w/2,y:m.y+b/2}},[Pe]),Ir=useCallback((d,m)=>{let w=Ne({x:d.x,y:d.y,width:1,height:1},true).filter(E=>E.id!==m&&E.type==="rack"),b=null,T=1/0;for(let E of w){let $=Math.hypot(d.x-E.position.x,d.y-E.position.y);$<T&&(T=$,b=E);}return b},[Ne]),Ki=useCallback(d=>Rt(d.data),[]),Co=useCallback((d,m,w)=>{let{width:b,height:T}=Ki(d),E=m.width||0,$=m.height||0,S=Math.max(0,b-E),D=m.type==="vertical-pdu"?60:0,Y=Math.max(D,T-$);return {x:Math.max(0,Math.min(w.x,S)),y:Math.max(D,Math.min(w.y,Y))}},[Ki]),or=useCallback((d,m)=>{if(!d||!m)return;let w=ee(d);if(!w)return;let b=m.replace(/-(source|target)$/i,"");if(w.type==="fibre-split"&&b.startsWith("output-"))for(let E of J.current){if(E.target!==d||!(E.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"))continue;let $=E.data?.color;if($)return {color:$}}if((w.type==="tube"||w.type==="cable")&&m.startsWith("fiber-")){let E=m.replace("fiber-",""),$=parseInt(E,10);if($>=1&&$<=24){let S=so($),D=$>12;return {color:S,striped:D}}}if((w.type==="multi-tube-cable"||w.type==="tube")&&m.startsWith("tube-")){let E=m.replace("tube-",""),$=parseInt(E,10);if($>=1&&$<=24){let S=je($),D=$>12;return {color:S,striped:D}}}let T=w.data;if(T.color)return {color:T.color}},[ee]),qi=useRef(new Map);useEffect(()=>{et(d=>{let m=false,w=d.map(b=>{let T=le(b);return qi.current.get(b.id)!==T?(m=true,qi.current.set(b.id,T),{...b,zIndex:T,style:{...b.style,zIndex:T}}):b});return m?w:d});},[A,et,le]),useEffect(()=>{let d=A.map(w=>{if(w.type==="coupler"&&w.parentId){let b=ee(w.parentId);if(b&&(b.type==="patch-panel"||b.type==="closure")&&(!w.extent||w.extent!=="parent"))return {...w,extent:"parent"}}if(w.type==="splice"&&w.parentId&&w.data.holderPosition&&(!w.position||w.position.x===0&&w.position.y===0)){let b=ee(w.parentId);if(b&&b.type==="splice-tray"){let T=w.data.mode==="ribbon",E=wr(b,w.data.holderPosition,T);return {...w,position:E}}}if(pt(w)&&w.parentId&&w.data.uPosition&&(!w.position||w.position.x===0&&w.position.y===0)){let b=ee(w.parentId);if(b){let T=w.data.uHeight||1,E=$o(b,w.data.uPosition,T,w.data);return {...w,position:E}}}if(w.type==="vertical-pdu"&&w.parentId){let b=ee(w.parentId);if(b&&b.type==="rack"){let T=Co(b,w,w.position||{x:0,y:60});if(w.extent!=="parent"||!w.position||w.position.x!==T.x||w.position.y!==T.y)return {...w,extent:"parent",position:T}}}return w});d.some((w,b)=>{let T=A[b];return w.extent!==T.extent||w.position?.x!==T.position?.x||w.position?.y!==T.position?.y})&&z(d);},[A,z,ee,Co]);let Zi=useCallback(d=>{if(xe)return null;let m=new Map,w=new Map,b=new Set,T=d.map(S=>{if(S.type==="position"&&S.position){let D=ee(S.id);if(D&&D.type==="coupler"&&D.parentId){let Y=ee(D.parentId);if(Y&&(Y.type==="patch-panel"||Y.type==="closure"))return (!D.extent||D.extent!=="parent")&&b.add(D.id),{...S,position:D.position||{x:0,y:0}}}if(D&&(D.type==="tube"||D.type==="splice-tray")&&D.parentId){let Y=ee(D.parentId);if(Y&&Y.type==="closure")return (!D.extent||D.extent!=="parent")&&b.add(D.id),{...S,position:D.position||{x:0,y:0}}}if(D&&D.type==="splice"&&D.parentId){let Y=ee(D.parentId);if(Y&&Y.type==="splice-tray"){let ae=pi(D,Y,S.position,Nt.current);return ae.holderPosition!==void 0&&m.set(D.id,ae.holderPosition),{...S,position:{x:ae.x,y:ae.y}}}}if(D&&pt(D)&&D.parentId){let Y=ee(D.parentId);if(Y&&Y.type==="rack"){let ae=Gr(D,Y,S.position,Nt.current);return ae.uPosition!==void 0&&w.set(D.id,ae.uPosition),{...S,position:{x:ae.x,y:ae.y}}}}if(D&&D.type==="vertical-pdu"&&D.parentId){let Y=ee(D.parentId);if(Y&&Y.type==="rack")return (!D.extent||D.extent!=="parent")&&b.add(D.id),{...S,position:Co(Y,D,S.position)}}}return S}),E=applyNodeChanges(T,Nt.current).map(S=>{let D=S;b.has(S.id)&&(D={...D,extent:"parent"});let Y=m.get(S.id);Y!==void 0&&(D={...D,data:{...D.data,holderPosition:Y}});let ae=w.get(S.id);return ae!==void 0&&(D={...D,data:{...D.data,uPosition:ae}}),D});E=jn(E),Nt.current=E;let $=new Map;return E.forEach(S=>{$.set(S.id,S);}),xt.current=$,z(E),E},[z,ee,xe,Co]),Tc=useCallback((d,m)=>{To(null);},[]),Cc=useCallback((d,m,w)=>{let b=ve(m);if(!y||!Mo(m)||b){To(null);return}let T=Ft(m),$=Ir(T,m.id)?.id??null;To(S=>S===$?S:$);},[y,Ft,ve,Ir]),Rc=useCallback((d,m,w)=>{To(null);let b=ve(m);if(!y||!Mo(m)||b)return;let T=Pe(m),E=Ft(m),$=Ir(E,m.id),S=Nt.current;if(!$)return;let D={x:T.x-$.position.x,y:T.y-$.position.y},Y=Co($,m,D);if(m.type==="vertical-pdu"){let G=S.map(pe=>pe.id!==m.id?pe:{...pe,parentId:$.id,extent:"parent",position:Y,data:{...pe.data,rackLayout:Fe($.data)?"split-face":"single-face",rackWidthPx:Ct($.data),rackFaceGapPx:Lt($.data)}});kt(G);return}let ae=S.find(G=>G.id===m.id)||m,ye=Fe($.data),_e=Ct($.data),Me=Lt($.data),Le=ye?Na(ae.data,D.x,_e,Me):"both",rt=ye&&Le==="front"?_e+Me:0,Be=Le==="rear"?"rear":Le==="front"?"front":Uo(ae.data),Ze={...ae,parentId:$.id,extent:"parent",position:{x:rt,y:D.y},data:{...ae.data,rackLayout:ye?"split-face":"single-face",rackWidthPx:_e,rackFaceGapPx:Me,mountMode:Le,face:Be}},Pt=S.filter(G=>G.id!==m.id).concat(Ze),dt=Gr(Ze,$,Ze.position,Pt);if(dt.uPosition===void 0||!ro($,Ze,dt.uPosition,Pt))return;let lt=S.map(G=>G.id!==m.id?G:{...G,parentId:$.id,extent:"parent",position:{x:dt.x,y:dt.y},data:{...G.data,rackLayout:ye?"split-face":"single-face",rackWidthPx:_e,rackFaceGapPx:Me,mountMode:Le,face:Be,uPosition:dt.uPosition??G.data.uPosition}});kt(lt);},[y,Pe,Ft,kt,ve,Co,Ir]),Ec=useCallback(d=>{if(!d.source||!d.target||!d.sourceHandle||!d.targetHandle)return true;let m=ee(d.source),w=ee(d.target),b=fe(m,d.sourceHandle),T=fe(w,d.targetHandle),E=_s(J.current,d.source,m,b,d.target,w,T),$=E.source,S=E.target;if($&&s&&console.log("Connection will replace: Source handle already connected",{source:d.source,sourceHandle:d.sourceHandle,existingEdges:J.current.filter(O=>O.source===d.source&&O.sourceHandle===d.sourceHandle||O.target===d.source&&O.targetHandle===d.sourceHandle)}),S&&s&&console.log("Connection will replace: Target handle already connected",{target:d.target,targetHandle:d.targetHandle,existingEdges:J.current.filter(O=>O.target===d.target&&O.targetHandle===d.targetHandle||O.source===d.target&&O.sourceHandle===d.targetHandle)}),!mn(m,w))return true;if(m?.type==="splice"&&w?.type==="splice"){let O=m.data?.mode==="ribbon",oe=w.data?.mode==="ribbon";if(O!==oe)return s&&console.log("Connection rejected: Ribbon splices can only connect to other ribbon splices",d),false}let Y=(O,oe)=>(O?.type==="tube"||O?.type==="cable")&&!!oe&&oe.startsWith("fiber-"),ae=(O,oe)=>(O?.type==="tube"||O?.type==="multi-tube-cable")&&!!oe&&oe.startsWith("tube-"),ye=(O,oe)=>O?.type==="multi-tube-cable"&&!!oe&&oe.startsWith("tube-"),_e=(O,oe)=>O?.type==="tube"&&!!oe&&oe.startsWith("tube-"),Me=(O,oe)=>(O?.type==="cable"||O?.type==="multi-tube-cable")&&oe==="cable-button",Le=(O,oe)=>O?.type==="splice"&&(oe==="left"||oe==="right"),rt=(O,oe)=>O?.type==="coupler"&&!!oe&&(oe.startsWith("left-")||oe.startsWith("right-")),Be=(O,oe)=>{if(O?.type!=="fibre-split"||!oe)return false;let bt=oe.replace(/-(source|target)$/i,"");return bt.startsWith("input-")||bt.startsWith("output-")},Ze=(O,oe)=>O?.type!=="fibre-split"||!oe?false:oe.replace(/-(source|target)$/i,"").startsWith("output-"),Pt=Y(m,d.sourceHandle),dt=Y(w,d.targetHandle),lt=Le(m,d.sourceHandle),G=Le(w,d.targetHandle),pe=rt(m,d.sourceHandle),ce=rt(w,d.targetHandle),ut=Be(m,d.sourceHandle),nt=Be(w,d.targetHandle),Ht=Ze(m,d.sourceHandle),_t=Ze(w,d.targetHandle),Fr=Me(m,d.sourceHandle),Sn=Me(w,d.targetHandle),In=ye(m,d.sourceHandle),Hr=ye(w,d.targetHandle),vo=_e(m,d.sourceHandle),Do=_e(w,d.targetHandle),_r=ae(m,d.sourceHandle),Fn=ae(w,d.targetHandle);return Pt&&G||dt&<||(lt&&(ce||nt)||G&&(pe||Ht))||(pe&&(ce||nt||G)||ce&&(pe||ut||lt))||(Ht&&(G||dt||ce)||_t&&(lt||Pt||pe))||Fr&&Sn||(In&&Do||Hr&&vo)?true:_r&&Fn?(s&&console.log("Connection rejected: Tube handles can only connect between cable and tube nodes",d),false):(s&&console.log("Connection rejected: Connection not allowed by fiber rules",d),false)},[ee,s]),vc=useCallback(d=>{if(xe)return;s&&console.log("onConnect called:",d);let m=ee(d.source),w=ee(d.target);s&&(console.log("onConnect: sourceNode type:",m?.type,"targetNode type:",w?.type),console.log("onConnect: sourceHandle:",d.sourceHandle,"targetHandle:",d.targetHandle));let b=Ls(d,m,w),T=X.validateConnection({source:b.source??null,target:b.target??null,sourceHandle:b.sourceHandle,targetHandle:b.targetHandle});if(!T.valid&&!(T.reason??"").includes("already connected")){s&&console.warn(`Connection rejected: ${T.reason}`);return}let E=m?.type==="vertical-pdu",$=m?.type==="vertical-pdu"||w?.type==="vertical-pdu",S=yo(m,b.sourceHandle),D=yo(w,b.targetHandle),Y=S&&D&&$,ae=m?.data,ye=m?.type==="switch"||m?.type==="device"&&ae?.deviceType==="switch",_e=D,Me=!!b.targetHandle&&(b.targetHandle.startsWith("net-")||b.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test($t(b.targetHandle))),Le=!!b.sourceHandle&&(b.sourceHandle.startsWith("net-")||b.sourceHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test($t(b.sourceHandle))),rt=w?.type==="switch"||w?.type==="device"&&w.data?.deviceType==="switch",Be=w?.type==="vertical-pdu",Ze=S,Pt=m?.type==="tube"&&w?.type==="multi-tube-cable",dt=m?.type==="multi-tube-cable"&&w?.type==="tube",lt=Pt||dt,G=b.sourceHandle==="cable-button"&&b.targetHandle==="cable-button",pe="fiber";Y?pe="power":G?pe="thick-cable":lt&&(pe=j?"smoothstep":"fiber");let ce,ut=Hs(w),nt=Hs(m);if(ut||nt){let R=w?.data,K=m?.data,O=ut?R.ribbonFiberIds:K.ribbonFiberIds;O&&Array.isArray(O)&&O.length>=6&&O.length<=12&&(ce={ribbonFiberIds:O,isRibbon:true});}if(!ce&&(pe==="fiber"||pe==="smoothstep")&&!E){let R;Pt?R=or(b.target,b.targetHandle):R=or(b.source,b.sourceHandle),R&&(ce={color:R.color,striped:R.striped,isRibbon:false});}else if(pe==="thick-cable"&&G){let R=m?.data;ce={color:R?.color||(R?.tubeStartIndex?je(R.tubeStartIndex):"#6366f1")};}let Ht=fe(m,b.sourceHandle),_t=fe(w,b.targetHandle),Fr=_s(J.current,b.source,m,Ht,b.target,w,_t),Sn=Fr.source,In=Fr.target;if(Sn||In){let R=new Set;for(let K of J.current){if(K.source===b.source&&fe(m,K.sourceHandle)===Ht){R.add(K.id);continue}if(K.target===b.source&&fe(m,K.targetHandle)===Ht){R.add(K.id);continue}if(K.source===b.target&&fe(w,K.sourceHandle)===_t){R.add(K.id);continue}K.target===b.target&&fe(w,K.targetHandle)===_t&&R.add(K.id);}if(R.size>0){let K=J.current.filter(oe=>!R.has(oe.id)),O=addEdge(b,K);if(O.length===K.length)s&&console.warn("Handle replacement skipped: addEdge did not create a new edge",b);else {let oe=O[O.length-1],bt=le({...b,id:oe.id,type:pe}),nr={...oe,type:pe,zIndex:bt,style:{...oe.style,zIndex:bt},data:ce!==void 0?ce:oe.data};ue([...O.slice(0,-1),nr]),s&&console.log("Handle replacement: Replaced",R.size,"edge(s)");return}}}if(w?.type==="splice"&&(d.targetHandle==="left"||d.targetHandle==="right")&&d.target&&d.targetHandle){let R=J.current.find(K=>K.target===d.target&&K.targetHandle===d.targetHandle||K.source===d.target&&K.sourceHandle===d.targetHandle);if(R){s&&(console.log("Splice target handle replacement: Found existing edge",R.id,"on splice handle",d.targetHandle),console.log("Existing edge details:",{id:R.id,source:R.source,target:R.target,sourceHandle:R.sourceHandle,targetHandle:R.targetHandle,data:R.data}));let K=d.source&&d.sourceHandle?J.current.find(Mt=>Mt.source===d.source&&Mt.sourceHandle===d.sourceHandle):null;s&&K&&console.log("Splice target handle replacement: Also found existing source edge",K.id);let O=new Set;R&&O.add(R.id),K&&K.id!==R.id&&O.add(K.id);let oe=J.current.filter(Mt=>!O.has(Mt.id));s&&console.log("Splice target handle replacement: Removing",O.size,"edge(s), creating new connection");let bt=Ms(d,"fiber",le,ce),nr=[...oe,bt];ue(nr),s&&console.log("Splice target handle replacement: Successfully replaced edge with new edge",bt.id);return}}if(m?.type==="splice"&&d.sourceHandle==="right"&&d.source&&d.sourceHandle){let R=J.current.find(K=>K.source===d.source&&K.sourceHandle===d.sourceHandle||K.target===d.source&&K.targetHandle===d.sourceHandle);if(R){s&&console.log("Splice source handle replacement: Found existing edge",R.id,"on splice handle",d.sourceHandle);let K=d.target&&d.targetHandle?J.current.find(Mt=>Mt.target===d.target&&Mt.targetHandle===d.targetHandle):null;s&&K&&console.log("Splice source handle replacement: Also found existing target edge",K.id);let O=new Set;R&&O.add(R.id),K&&K.id!==R.id&&O.add(K.id);let oe=J.current.filter(Mt=>!O.has(Mt.id));s&&console.log("Splice source handle replacement: Removing",O.size,"edge(s), creating new connection");let bt=Ms(d,"fiber",le,ce),nr=[...oe,bt];ue(nr),s&&console.log("Splice source handle replacement: Successfully replaced edge with new edge",bt.id);return}}if((m?.type==="tube"||m?.type==="cable")&&d.sourceHandle?.startsWith("fiber-")&&d.source&&d.sourceHandle){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"source",data:ce});if(R){ue(R);return}}if((w?.type==="tube"||w?.type==="cable")&&d.targetHandle?.startsWith("fiber-")&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"target",data:ce});if(R){ue(R);return}}if((m?.type==="multi-tube-cable"||m?.type==="tube")&&d.sourceHandle?.startsWith("tube-")&&d.source&&d.sourceHandle){let R=Oe({edges:J.current,connection:b,edgeType:pe,selectEdgeZIndex:le,findBy:"source",data:ce});if(R){ue(R);return}}if((w?.type==="multi-tube-cable"||w?.type==="tube")&&d.targetHandle?.startsWith("tube-")&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:pe,selectEdgeZIndex:le,findBy:"target",data:ce});if(R){ue(R);return}}if(m?.type==="coupler"&&(d.sourceHandle?.startsWith("left-")||d.sourceHandle?.startsWith("right-"))){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"source",data:ce});if(R){ue(R);return}}if(w?.type==="coupler"&&(d.targetHandle?.startsWith("left-")||d.targetHandle?.startsWith("right-"))){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"target",data:ce});if(R){ue(R);return}}if(G&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let R=m?.data,K=R?.color||(R?.tubeStartIndex?je(R.tubeStartIndex):"#6366f1"),O=Oe({edges:J.current,connection:b,edgeType:"thick-cable",selectEdgeZIndex:le,findBy:"source",data:{color:K}});if(O){ue(O);return}if(O=Oe({edges:J.current,connection:b,edgeType:"thick-cable",selectEdgeZIndex:le,findBy:"target",data:{color:K}}),O){ue(O);return}}if(E&&_e&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:"power",selectEdgeZIndex:le,findBy:"target",data:ce});if(R){ue(R);return}}if(Be&&Ze&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:"power",selectEdgeZIndex:le,findBy:"source",matchOn:"target",data:ce});if(R){ue(R);return}}if(ye&&Me&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"target",data:ce});if(R){ue(R);return}}if(rt&&Le&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"target",matchOn:"source",data:ce});if(R){ue(R);return}}let Hr=X.validateConnection({source:b.source??null,target:b.target??null,sourceHandle:b.sourceHandle,targetHandle:b.targetHandle});if(!Hr.valid){if(E&&d.source&&d.sourceHandle){let R=Oe({edges:J.current,connection:b,edgeType:_e?"power":"fiber",selectEdgeZIndex:le,findBy:"source",data:ce});if(R){ue(R);return}}if(Be&&d.source&&d.sourceHandle){let R=Oe({edges:J.current,connection:b,edgeType:"power",selectEdgeZIndex:le,findBy:"source",matchOn:"target",data:ce});if(R){ue(R);return}}if(ye&&d.source&&d.sourceHandle){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"source",data:ce});if(R){ue(R);return}}if(rt&&d.target&&d.targetHandle){let R=Oe({edges:J.current,connection:b,edgeType:"fiber",selectEdgeZIndex:le,findBy:"target",matchOn:"source",data:ce});if(R){ue(R);return}}s&&console.warn(`Connection rejected: ${Hr.reason}`);return}let vo=false,Do=false;for(let R of J.current)if(!vo&&(R.source===b.source&&R.sourceHandle===b.sourceHandle||R.target===b.source&&R.targetHandle===b.sourceHandle)&&(vo=true),!Do&&(R.target===b.target&&R.targetHandle===b.targetHandle||R.source===b.target&&R.sourceHandle===b.targetHandle)&&(Do=true),vo&&Do)break;let _r=(R,K)=>!R||!K?false:!!(R.startsWith("tube-")||K.type==="splice"&&(R==="left"||R==="right")||R==="cable-button"),Fn=_r(b.sourceHandle||"",m),ea=_r(b.targetHandle||"",w);if(vo&&!Fn){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:d.source,sourceHandle:b.sourceHandle,existingEdges:J.current.filter(R=>R.source===b.source&&R.sourceHandle===b.sourceHandle||R.target===b.source&&R.targetHandle===b.sourceHandle)});return}if(Do&&!ea){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:b.target,targetHandle:b.targetHandle,existingEdges:J.current.filter(R=>R.target===b.target&&R.targetHandle===b.targetHandle||R.source===b.target&&R.sourceHandle===b.targetHandle)});return}let ta={...b,type:pe,zIndex:le({...b,id:"temp-id"}),data:ce},Mr=addEdge(ta,J.current),$r=Mr[Mr.length-1];$r&&(Qi(R=>new Set(R).add($r.id)),setTimeout(()=>{Qi(R=>{let K=new Set(R);return K.delete($r.id),K});},1e3)),ue(Mr);},[ue,X,le,ee,s,or,j,xe]),Dc=useCallback((d,m)=>{if(xe||!m.source||!m.target||!m.sourceHandle||!m.targetHandle)return;let w=ee(m.source),b=ee(m.target),T=Ls(m,w,b),E=fe(w,T.sourceHandle),$=fe(b,T.targetHandle),S=J.current.some(G=>{if(G.id===d.id)return false;let pe=G.source===T.source&&fe(w,G.sourceHandle)===E||G.target===T.source&&fe(w,G.targetHandle)===E,ce=G.target===T.target&&fe(b,G.targetHandle)===$||G.source===T.target&&fe(b,G.sourceHandle)===$;return pe||ce}),D=X.validateConnection({source:T.source??null,target:T.target??null,sourceHandle:T.sourceHandle,targetHandle:T.targetHandle,ignoreEdgeId:d.id});if(!D.valid&&!((D.reason??"").includes("already connected")&&S)){s&&console.warn(`Edge update rejected: ${D.reason}`);return}let Y=w?.type==="vertical-pdu"||b?.type==="vertical-pdu",ae=yo(w,T.sourceHandle),ye=yo(b,T.targetHandle),_e=ae&&ye&&Y,Me=w?.type==="tube"&&b?.type==="multi-tube-cable",Le=w?.type==="multi-tube-cable"&&b?.type==="tube",rt=Me||Le,Be;_e?Be="power":rt?Be=j?"smoothstep":"fiber":Be="fiber";let Ze;if(Be==="fiber"||Be==="smoothstep"){let G=or(T.source,T.sourceHandle);G&&(Ze={color:G.color,striped:G.striped});}let lt=J.current.filter(G=>{if(G.id===d.id)return true;let pe=G.source===T.source&&fe(w,G.sourceHandle)===E||G.target===T.source&&fe(w,G.targetHandle)===E,ce=G.target===T.target&&fe(b,G.targetHandle)===$||G.source===T.target&&fe(b,G.sourceHandle)===$;return !(pe||ce)}).map(G=>{if(G.id===d.id){let pe=le({...T,id:G.id,type:Be});return {...G,source:T.source,target:T.target,sourceHandle:T.sourceHandle,targetHandle:T.targetHandle,type:Be,data:Ze!==void 0?{...G.data,...Ze}:G.data,zIndex:pe,style:{...G.style,zIndex:pe}}}return G});ue(lt);},[ue,ee,or,le,j,s,X,xe]),Ro=useCallback(d=>{z(m=>{let w=false,b=m.map(T=>{let E=d!==null&&T.id===d;return T.selected===E?T:(w=true,{...T,selected:E})});return w?b:m});},[z]),Sc=useCallback((d,m)=>{if(Ge){c&&c(m);return}let w=d.metaKey||d.ctrlKey,b=yt(),T=m,E=ve(m);if(m.type==="tube"&&E&&!w){let $=b.find(S=>S.id===E&&(S.type==="cable"||S.type==="multi-tube-cable"));$&&(T=$);}if(En(T),rr([]),Ro(T.id),w&&pt(T)&&!to(T)){let $=T.data||{},S=Uo($),D=S==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${T.id} from ${S} to ${D}`),x&&x(T.id,D);}c&&c(T);},[x,c,s,yt,Ge,ve,to,Ro]),Ic=useCallback(()=>{},[]),Fc=useCallback((d,m)=>{En(null),rr([m]),Ro(null),c?.(null),l&&l(m);},[l,c,Ro]),Hc=useCallback(()=>{En(null),rr([]),Ro(null),c?.(null);},[c,Ro]),[mt,En]=useState(null),[Ji,Qi]=useState(new Set),[vn,rr]=useState([]),_c=useCallback(({edges:d})=>{rr(d||[]);},[]);useOnSelectionChange({onChange:_c}),useEffect(()=>{let d=m=>{if(Se.allowKeyboardDelete&&(m.key==="Backspace"||m.key==="Delete")&&vn.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let w=vn.filter(b=>{let T=b.sourceHandle||"",E=b.targetHandle||"";return T.startsWith("tube-")||E.startsWith("tube-")?(s&&console.log("Cannot delete edge connected to tube handle",b),false):true});if(w.length>0){let b=new Set(w.map(E=>E.id)),T=J.current.filter(E=>!b.has(E.id));ue(T),rr([]),s&&console.log("Deleted edges:",w.map(E=>E.id));}}};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[vn,ue,s,Se.allowKeyboardDelete]);let Mc=useCallback((d,{nodeId:m,handleType:w})=>{s&&console.log("Connection started from",{nodeId:m,handleType:w});},[s]),$c=useCallback(d=>{s&&console.log("Connection ended",d);},[s]),Ac=useCallback(()=>{if(xe||!mt)return;let d=ee(mt.id);if(d){if(d.type==="rack"){let m=d.data||{};if(Fe(m))return;let b=(m.face||"front")==="front"?"rear":"front";k?(k(d.id,b),x&&yt().filter(E=>E.parentId===d.id).forEach(E=>{x(E.id,b);})):z(T=>T.map(E=>E.id===d.id?{...E,data:{...E.data,face:b}}:E.parentId===d.id?{...E,data:As(E.data,b)}:E));return}if(pt(d)){if(to(d))return;let m=d.data||{},b=Uo(m)==="front"?"rear":"front";x?x(d.id,b):z(T=>T.map(E=>E.id===d.id?{...E,data:As(E.data,b)}:E));}}},[mt,ee,k,x,z,yt,xe,to]),Lc=useCallback(()=>{if(xe||!y||!mt||!Mo(mt))return;let d=ee(mt.id),m=ve(d);if(!d||!Mo(d)||!m)return;let w=Pe(d),T=Nt.current.map(E=>E.id!==d.id?E:{...E,parentId:void 0,parentNode:void 0,extent:void 0,position:w,data:{...E.data,uPosition:void 0}});kt(T);},[xe,y,mt,ee,Pe,kt,ve]),Bc=useMemo(()=>{let d=xt.current,m=new Map,w=(b,T)=>{let E=`${b.id}:${T.join("|")}`,$=m.get(E);if($)return $;let S=Ku(b,T);return m.set(E,S),S};return Te.reduce((b,T)=>{let E=T,$=d.get(String(E.source)),S=d.get(String(E.target)),D=bn(E.sourceHandle||"",$),Y=bn(E.targetHandle||"",S),ae=ut=>{if(!ut||!pt(ut))return;let nt=ut.data??{},Ht=typeof ut.parentId=="string"?ut.parentId:ut.parentNode,_t=Ht?d.get(Ht):void 0;return _t&&_t.type==="rack"&&Fe(_t.data)?Yt(Ue(nt)):[Uo(nt)]},ye=ae($),_e=ae(S),Me=Ae($),Le=Ae(S),rt=pt($)&&!Me&&!!ye&&!!D&&!ye.includes(D),Be=pt(S)&&!Le&&!!_e&&!!Y&&!_e.includes(Y);if(rt||Be)return b;let lt=!E.sourceHandle||!pt($)||!ye||w($,ye).has(E.sourceHandle),G=!E.targetHandle||!pt(S)||!_e||w(S,_e).has(E.targetHandle);if(!lt||!G)return b;let pe=T.style;if(T.style&&T.style.opacity===0&&T.style.pointerEvents==="none"&&T.style.zIndex===0){let nt={...T.style};delete nt.opacity,delete nt.pointerEvents,delete nt.zIndex,pe=Object.keys(nt).length>0?nt:void 0;}let ce=Ji.has(T.id)?"edge-connecting":T.className;return b.push(pe===T.style&&ce===T.className?T:{...T,style:pe,className:ce}),b},[])},[Te,Ji,Ae]),He=useMemo(()=>mt?ee(mt.id)??mt:null,[mt,ee]),Eo=useMemo(()=>{if(!He||!xo.enabled||xe)return {showRearToggle:false,showDeRack:false,count:0};let d=He.type==="rack"?!tr(He):pt(He)?!to(He):false,m=xo.showRearToggle&&d,w=xo.showDeRack&&y&&!xe&&Mo(He)&&!!ve(He);return {showRearToggle:m,showDeRack:w,count:(m?1:0)+(w?1:0)}},[He,xo,y,xe,ve,to,tr]),Dn=useMemo(()=>{if(!He||Eo.count===0||!tt.current)return null;let d=tt.current.getBoundingClientRect();if(d.width<=0||d.height<=0)return null;let m=He.positionAbsolute??Pe(He),w=He.width||0,b=He.height||0,T=Eo.count>1?220:110,E=34;try{let $=se({x:m.x+w/2,y:m.y}),S=se({x:m.x+w/2,y:m.y+b}),D=$.x-d.left-T/2,Y=$.y-d.top-E-10;return Y<8&&(Y=S.y-d.top+10),D=Math.max(8,Math.min(D,d.width-T-8)),Y=Math.max(8,Math.min(Y,d.height-E-8)),{left:D,top:Y}}catch{return null}},[He,Eo,Pe,se]),Oc=ma(I,C),Wc=ha(I,{touchAction:"none",...v}),zc=u??vc,Uc=p??Dc,Gc=h??Ec,Vc=useCallback(d=>{if(xe)return;let m=Zi(d);if(m){if(!L){X.setState({nodes:m});return}n?.(m);}},[xe,Zi,L,X,n]),jc=useCallback(d=>{if(xe)return;let m=d.filter(b=>{if(b.type==="remove"){let T=J.current.find(E=>E.id===b.id);if(T){let E=T.sourceHandle||"",$=T.targetHandle||"";if(E.startsWith("tube-")||$.startsWith("tube-"))return s&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",T),false}}return true});if(m.length===0)return;let w=applyEdgeChanges(m,J.current);if(St(m),!L){X.setState({edges:w});return}i?.(w);},[xe,s,St,L,X,i]);return jsxs("div",{ref:tt,className:Oc,style:Wc,children:[jsxs(ReactFlow,{nodes:A,edges:Bc,onNodesChange:Vc,onEdgesChange:jc,onConnect:xe?void 0:zc,onConnectStart:Mc,onConnectEnd:$c,onEdgeUpdate:xe?void 0:Uc,isValidConnection:Gc,connectionMode:N??ConnectionMode.Loose,onNodeClick:Sc,onNodeDoubleClick:Ic,onPaneClick:Hc,onNodeDragStart:Tc,onNodeDrag:Cc,onNodeDragStop:Rc,onEdgeClick:Fc,onInit:M,nodeTypes:qe,edgeTypes:ct,defaultEdgeOptions:Dr,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,maxZoom:4,zoomOnScroll:Se.zoomOnScroll,zoomOnPinch:Se.zoomOnPinch,zoomOnDoubleClick:Se.zoomOnDoubleClick,preventScrolling:Ge,onlyRenderVisibleElements:ie,fitView:true,fitViewOptions:_,proOptions:Rn,children:[jsx(Background,{color:ba(I)}),Se.showControls&&jsx(Controls,{showInteractive:Se.showInteractiveControl}),Se.showMiniMap&&jsx(MiniMap,{}),jsx(Panel,{position:"bottom-right",className:"react-networks-attribution",children:jsx("a",{href:"https://github.com/MP70/react-networks",target:"_blank",rel:"noopener noreferrer",className:"react-networks-attribution-link",children:"react-networks"})})]}),U&&jsx("button",{className:"download-button",onClick:Er,disabled:wt,"aria-busy":wt,style:{position:"absolute",top:F.includes("top")?"10px":"auto",bottom:F.includes("bottom")?"10px":"auto",right:F.includes("right")?"10px":"auto",left:F.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:wt?"not-allowed":"pointer",opacity:wt?.7:1,transition:"all 0.2s ease",...V},children:wt?`${q}...`:q}),He&&Dn&&Eo.count>0&&jsxs("div",{style:{position:"absolute",top:Dn.top,left:Dn.left,display:"flex",gap:8,zIndex:2e3},children:[Eo.showRearToggle&&jsx("button",{onClick:d=>{d.preventDefault(),Ac();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let d=He.data;return He.type==="rack"?(d?.face||"front")==="front"?"Switch to rear":"Switch to front":Uo(d)==="front"?"Switch to rear":"Switch to front"})(),children:(()=>{let d=He.data;return He.type==="rack"?(d?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front":Uo(d)==="front"?"\u21C4 Rear":"\u21C4 Front"})()}),Eo.showDeRack&&jsx("button",{onClick:d=>{d.preventDefault(),Lc();},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"})]})]})},op=e=>{let{document:t,initialDocument:o,onDocumentChange:r,onNodesChange:n,onEdgesChange:i,...a}=e,s=t!==void 0||o!==void 0,c=t!==void 0,[l,g]=useState(()=>o),f=t??l,u=useMemo(()=>f?Un(f):null,[f]),p=useCallback(P=>P?{nodes:Os(P.nodes,h.current?.nodes??[]),edges:Ws(P.edges,h.current?.edges??[])}:null,[]),h=useRef(u),N=useRef(f),x=useMemo(()=>p(u),[u,p]);useEffect(()=>{h.current=x;},[x]),useEffect(()=>{N.current=f;},[f]);let k=useCallback((P,y)=>{let I=oo({nodes:P,edges:y},N.current);h.current={nodes:P,edges:y},N.current=I,c||g(I),r?.(I);},[c,r]),C=useCallback(P=>{let y=h.current?.edges??[];k(P,y),n?.(P);},[k,n]),v=useCallback(P=>{let y=h.current?.nodes??[];k(y,P),i?.(P);},[k,i]);if(s){let P=x??{nodes:[],edges:[]};return jsx(Bs,{...a,nodes:P.nodes,edges:P.edges,onNodesChange:C,onEdgesChange:v})}return jsx(Bs,{...e})};function Os(e,t){let o=new Map(t.map(r=>[r.id,r]));return e.map(r=>{let n=o.get(r.id),i=r.type==="rack"?Rt(r.data):null;if(!n)return i?{...r,width:i.width,height:i.height}:r;let a={...r,...n.selected!==void 0?{selected:n.selected}:{},...n.dragging!==void 0?{dragging:n.dragging}:{},...n.resizing!==void 0?{resizing:n.resizing}:{}};return i?{...a,width:i.width,height:i.height}:{...a,...typeof n.width=="number"?{width:n.width}:{},...typeof n.height=="number"?{height:n.height}:{},...n.measured?{measured:n.measured}:{}}})}function Ws(e,t){let o=new Map(t.map(r=>[r.id,r]));return e.map(r=>{let n=o.get(r.id);return n?{...r,...n.selected!==void 0?{selected:n.selected}:{}}:r})}var Ui=e=>jsx(ReactFlowProvider,{children:jsx(op,{...e})});var Gi=class extends 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??jsxs("div",{role:"alert",style:{padding:16,margin:8,border:"1px solid #e53e3e",borderRadius:4,backgroundColor:"#fff5f5",color:"#c53030"},children:[jsx("strong",{children:"Diagram error"}),": ",o.message,jsx("button",{type:"button",onClick:this.reset,style:{marginLeft:12,padding:"4px 8px",cursor:"pointer"},children:"Try again"})]}):r}};function Pr(e,{rowHeight:t,tubeGap:o}){let r=[],n=[],i=e.kind??(e.tubeCount?"tube":"simple"),a=i==="tube"?Math.max(1,Math.min(24,e.tubeCount??1)):1,s=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),g=0;for(let f=0;f<a;f+=1){let u=c+f,p=e.tubeColorMap?.[u];n.push({tubeIndex:u,y:g,label:`T${u}`,color:p??je(u)});for(let h=0;h<s;h+=1){let N=l+h,x=Kn(N);r.push({key:`${u}-${N}`,tubeIndex:i==="tube"?u:void 0,fiberIndex:N,y:g,color:so(N),striped:ao(N),backgroundImage:typeof x.backgroundImage=="string"?x.backgroundImage:void 0}),g+=t;}f<a-1&&(g+=o);}return {rows:r,tubeLabels:n,height:g}}var Vi=e=>typeof e=="object"&&e!==null,sp=e=>{if(!Vi(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&Vi(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&Vi(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},cp=e=>e==="fibre-flow"||e==="fibre-flow-link",dp=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,lp=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",wn=e=>typeof e=="string"&&e.startsWith("fiber-"),Nn=(e,t,o)=>e.source===t&&e.sourceHandle===o||e.target===t&&e.targetHandle===o,up=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!dp(n))return;let i=o.get(n.id),a=cp(n.type)?n.type:i?.type??lp(n);r.push({...i??{},...n,type:a});}),r},js=e=>`fiber-${e.tube??1}-${e.fiber}`,Xs=e=>so(e.fiber),Ys=e=>ao(e.fiber),pp=(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`},fp=(e,t,o,r,n,i)=>e?`${o} ${i}`:t?`0 ${n} ${r} ${i}`:"6 6",gp=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s})=>{let[c,l,g]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,curvature:.35}),f=typeof s?.lossDb=="number"?`${s.lossDb.toFixed(2)} dB`:"",u=s?.label??f,p=s?.sourceColor,h=s?.targetColor,N=s?.color??p??h??"#94a3b8",x=s?.sourceStriped??false,k=s?.targetStriped??false,C=s?.highlighted??true,v=s?.dimmed??false,P=s?.circuitId,y=s?.circuitLabel??P,I=s?.showCircuitId??false,M=p&&h&&p!==h,B=r-t,U=n-o,F=Math.sqrt(B*B+U*U),q=l-t,V=g-o,j=Math.sqrt(q*q+V*V),re=F>0?j/F*100:50,ne=`fibre-flow-gradient-${e}`,H=x&&!k,_=k&&!x,ie=x&&k,W=F*1.25,L=W/2,te=12,de=Math.ceil(L*1.2/te),ge=Array(de).fill("6 6").join(" "),X=Math.ceil(L*1.2/te),he=Array(X).fill("6 6").join(" "),we=I&&y,A=Math.max(u?u.length*6.2+16:0,we?(y?.length||0)*5.5+16:0),z=we?32:16;return jsxs(Fragment,{children:[jsx("defs",{children:M&&jsxs("linearGradient",{id:ne,x1:t,y1:o,x2:r,y2:n,gradientUnits:"userSpaceOnUse",children:[jsx("stop",{offset:"0%",stopColor:p}),jsx("stop",{offset:`${re}%`,stopColor:p}),jsx("stop",{offset:`${re}%`,stopColor:h}),jsx("stop",{offset:"100%",stopColor:h})]})}),M?jsx("path",{id:e,d:c,fill:"none",stroke:`url(#${ne})`,strokeWidth:C?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:v?.25:1,strokeOpacity:v?.25:1,style:{mixBlendMode:"normal"}}):jsx(BaseEdge,{id:e,path:c,style:{stroke:N,strokeWidth:C?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:v?.25:1,strokeOpacity:v?.25:1,mixBlendMode:"normal"}}),(ie||H||_)&&jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:C?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:fp(H,_,ge,he,L,W),strokeDashoffset:0,opacity:v?.2:.9,style:{mixBlendMode:"normal"}}),(u||we)&&C&&jsx(EdgeLabelRenderer,{children:jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${g}px)`,width:A,height:z,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&&jsx("div",{style:{lineHeight:1.2},children:u}),we&&jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:u?2:0},children:y})]})})]})},mp=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,data:s})=>{let[c,l,g]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:i,targetPosition:a,curvature:.2}),f=s?.label,u=s?.color??"#64748b";return jsxs(Fragment,{children:[jsx(BaseEdge,{id:e,path:c,style:{stroke:u,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),f&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${g}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})})]})},bp=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:n,showTubeLabels:i,showFiberNumbers:a,layout:s,colorMode:c="dark"}=e,l=c==="light",g=8,f=12,u=-1,p=0,h=t.jacketColor??"#facc15",N=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",x=i&&N,k=o==="left"?g+p:p,C=o==="right"?g+p:p,v=o==="left"?Position.Right:Position.Left,P={width:4,height:4,borderRadius:"50%",background:h,border:`1px solid ${h}`,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 jsxs("div",{style:{position:"relative",width:n,height:s.height,fontFamily:"monospace",color:"inherit",overflow:"visible"},children:[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}),jsx("div",{style:{position:"absolute",top:0,bottom:0,width:g,left:o==="left"?0:void 0,right:o==="right"?0:void 0,borderRadius:4,background:N?"transparent":h,border:`1px solid ${h}`,boxShadow:N?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:N&&s.tubeLabels.map((y,I)=>{let M=s.rows.filter(j=>j.tubeIndex===y.tubeIndex);if(M.length===0)return null;let B=M[0].y,U=M[M.length-1].y+r,F=U-B,q=s.tubeLabels[I+1],V=q&&q.y-U>0;return jsx("div",{style:{position:"absolute",top:B,left:0,right:0,height:F,background:y.color,borderLeft:`2px solid ${y.color}`,borderRight:`2px solid ${y.color}`,borderTop:I===0?`2px solid ${y.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:V?"1px solid rgba(0,0,0,0.15)":`2px solid ${y.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:I===0&&!V||I===0?"4px 4px 0 0":V?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${y.tubeIndex}`)})}),!x&&jsx("div",{style:{position:"absolute",top:0,bottom:0,left:k,right:C,...o==="left"?{borderRight:`1px solid ${h}`}:{borderLeft:`1px solid ${h}`},pointerEvents:"none",zIndex:0}}),N&&s.tubeLabels.map((y,I)=>{let M=s.rows.filter(q=>q.tubeIndex===y.tubeIndex);if(M.length===0)return null;let B=M[0].y,F=M[M.length-1].y+r-B;return jsx("div",{style:{position:"absolute",top:B,left:k,right:C,height:F,...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 I=`fiber-${y.tubeIndex??1}-${y.fiberIndex}`,M=y.y+r/2,B={position:"absolute",width:f,height:f,borderRadius:"50%",top:M,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&&(B["--fiber-bg-image"]=y.backgroundImage);let U=o==="left"?{right:f+u,textAlign:"right"}:{left:f+u,textAlign:"left"};return jsxs(Ce.Fragment,{children:[jsx(Handle,{id:I,type:"source",position:v,className:"fibre-flow-handle",style:B,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),jsx(Handle,{id:I,type:"target",position:v,className:"fibre-flow-handle",style:B,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),a&&jsx("div",{style:{position:"absolute",top:y.y+r/2-6,...U,fontSize:8,fontWeight:600,color:l?"rgba(15, 23, 42, 0.7)":"rgba(148, 163, 184, 0.95)",whiteSpace:"nowrap",lineHeight:1},children:y.fiberIndex})]},y.key)}),jsx(Handle,{id:"cable-run",type:"source",position:o==="left"?Position.Left:Position.Right,className:"cable-run-handle",style:P,isConnectable:true,"data-handle-type":"cable-run"}),jsx(Handle,{id:"cable-run",type:"target",position:o==="left"?Position.Left:Position.Right,className:"cable-run-handle",style:P,isConnectable:true,"data-handle-type":"cable-run"})]})},hp=({data:e})=>{let t=e.colorMode==="light";return 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: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})})},yp=(e,t,o,r,n,i,a,s,c,l="dark")=>{let g=[],f=0;return e.forEach(u=>{let p=Pr(u.leftCable,{rowHeight:o,tubeGap:r}),h=Pr(u.rightCable,{rowHeight:o,tubeGap:r}),N=Math.max(p.height,h.height),x=i*2+a,k=32,C=16,v=x+C*2,P=N+k+C*2,y=`flow-closure-${u.id}`,I=`flow-cable-${u.id}-left`,M=`flow-cable-${u.id}-right`,B=t==="horizontal"?{x:f,y:0}:{x:0,y:f};f+=(t==="horizontal"?v:P)+n;let U=u.chamberId?`${u.id} - ${u.chamberId}`:u.id;g.push({id:y,type:"fibre-flow-closure",position:B,data:{label:U,width:v,height:P,headerHeight:k,colorMode:l},selectable:false,draggable:false,style:{width:v,height:P}});let F=k+C+(N-p.height)/2,q=k+C+(N-h.height)/2;g.push({id:I,type:"fibre-flow-cable",position:{x:C,y:F},parentId:y,extent:"parent",data:{label:u.leftCable.label,cable:u.leftCable,side:"left",rowHeight:o,columnWidth:i,showTubeLabels:s,showFiberNumbers:c,layout:p,colorMode:l},style:{width:i,height:p.height}}),g.push({id:M,type:"fibre-flow-cable",position:{x:C+x-i,y:q},parentId:y,extent:"parent",data:{label:u.rightCable.label,cable:u.rightCable,side:"right",rowHeight:o,columnWidth:i,showTubeLabels:s,showFiberNumbers:c,layout:h,colorMode:l},style:{width:i,height:h.height}});}),g},wp=(e,t,o,r=false)=>{let n=[],i=new Map,a=new Map,s=new Map;return (t??[]).forEach(c=>{c.color&&i.set(c.id,c.color),c.label&&a.set(c.id,c.label);}),e.forEach(c=>{let l=`flow-cable-${c.id}-left`,g=`flow-cable-${c.id}-right`;[{nodeId:l,cable:c.leftCable},{nodeId:g,cable:c.rightCable}].forEach(({nodeId:u,cable:p})=>{let h=s.get(p.id);if(h&&h.closureId!==c.id){let N=pp(p.distanceMeters??h.distanceMeters,p.distanceLabel??h.distanceLabel),x=p.jacketColor??h.jacketColor??"#64748b";n.push({id:`flow-link-${h.nodeId}-${u}`,type:"fibre-flow-link",source:h.nodeId,target:u,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:N,color:x}});}s.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,h=!!o&&!p,N=u.circuitId?i.get(u.circuitId):void 0,x=u.circuitId?a.get(u.circuitId):void 0,k=u.color??N,C=Xs(u.from),v=Xs(u.to),P=Ys(u.from),y=Ys(u.to);n.push({id:`flow-edge-${c.id}-${u.id}`,type:"fibre-flow",source:l,target:g,sourceHandle:js(u.from),targetHandle:js(u.to),data:{lossDb:u.lossDb,label:u.label,color:k,sourceColor:C,targetColor:v,sourceStriped:P,targetStriped:y,highlighted:p,dimmed:h,circuitId:u.circuitId,circuitLabel:x,showCircuitId:r}});});}),n},Np=({closures:e,circuits:t,highlightedCircuitId:o,layout:r="horizontal",rowHeight:n=20,tubeGap:i=10,closureGap:a=140,cableColumnWidth:s=32,spliceAreaWidth:c=260,showTubeLabels:l=true,showFiberNumbers:g=true,colorMode:f="dark",showCircuitId:u=false,className:p,style:h,readOnly:N=false,interaction:x})=>{let k=useMemo(()=>yp(e,r,n,i,a,s,c,l,g,f),[e,r,n,i,a,s,c,l,g,f]),C=useMemo(()=>wp(e,t,o,u),[e,t,o,u]),[v,P]=useState(k),[y,I]=useState(C);useEffect(()=>{P(k);},[k,P]),useEffect(()=>{I(C);},[C,I]);let M=useCallback((H,_)=>{if(!H||!_||!_.startsWith("fiber-"))return;let ie=v.find(X=>X.id===H);if(!ie||ie.type!=="fibre-flow-cable")return;let W=/^fiber-(\d+)-(\d+)$/.exec(_);if(!W)return;let L=Number(W[1]),te=Number(W[2]),ge=ie.data.layout.rows.find(X=>(X.tubeIndex??1)===L&&X.fiberIndex===te);if(ge)return {color:ge.color,striped:ge.striped??false}},[v]),B=useCallback(H=>{if(N||!H.source||!H.target||!H.sourceHandle||!H.targetHandle)return false;let _=v.find(de=>de.id===H.source),ie=v.find(de=>de.id===H.target);if(!_||!ie)return false;let W=typeof H.sourceHandle=="string"&&H.sourceHandle.startsWith("fiber-"),L=typeof H.targetHandle=="string"&&H.targetHandle.startsWith("fiber-");return H.sourceHandle==="cable-run"||H.targetHandle==="cable-run"?true:W&&L?_.type==="fibre-flow-cable"&&ie.type==="fibre-flow-cable":false},[v,N]),U=useCallback(H=>{if(N)return;let _=H.sourceHandle==="cable-run"||H.targetHandle==="cable-run",ie=wn(H.sourceHandle),W=wn(H.targetHandle),L=_?void 0:M(H.source,H.sourceHandle),te=_?void 0:M(H.target,H.targetHandle),de=_?void 0:{sourceColor:L?.color,targetColor:te?.color,color:L?.color??te?.color,sourceStriped:L?.striped,targetStriped:te?.striped};I(ge=>{let X=ge.filter(he=>{let we=ie&&Nn(he,H.source,H.sourceHandle),A=W&&Nn(he,H.target,H.targetHandle);return !(we||A)});return addEdge({...H,type:_?"fibre-flow-link":"fibre-flow",data:de},X)});},[M,N,I]),F=useCallback((H,_)=>{if(N)return;let ie=_.sourceHandle==="cable-run"||_.targetHandle==="cable-run",W=ie?void 0:M(_.source,_.sourceHandle),L=ie?void 0:M(_.target,_.targetHandle),te=ie?void 0:{sourceColor:W?.color,targetColor:L?.color,color:W?.color??L?.color,sourceStriped:W?.striped,targetStriped:L?.striped};I(de=>{let ge=de.filter(A=>A.id!==H.id),X=wn(_.sourceHandle),he=wn(_.targetHandle),we=ge.filter(A=>{let z=X&&Nn(A,_.source,_.sourceHandle),Te=he&&Nn(A,_.target,_.targetHandle);return !(z||Te)});return addEdge({..._,type:ie?"fibre-flow-link":"fibre-flow",data:te},we)});},[M,N,I]),q=useCallback(H=>{N||P(H.filter(sp));},[N,P]),V=useCallback(H=>{N||I(_=>up(H,_));},[N,I]),j=useMemo(()=>({"fibre-flow-cable":bp,"fibre-flow-closure":hp}),[]),re=useMemo(()=>({"fibre-flow":gp,"fibre-flow-link":mp}),[]),ne={borderRadius:8,overflow:"hidden",...h};return jsx(Ui,{nodes:v,edges:y,onNodesChange:q,onEdgesChange:V,onConnect:U,onEdgeUpdate:F,isValidConnection:B,connectionMode:ConnectionMode.Loose,nodeTypes:j,edgeTypes:re,className:p,style:ne,colorMode:f,readOnly:N,interaction:x,fitViewOptions:{padding:.2}})},xp=e=>jsx(Np,{...e});var Tp=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:n=150,layout:i,showTubeLabels:a,showFiberNumbers:s=true,showCableLabel:c=true})=>{let l=useMemo(()=>i??Pr(e,{rowHeight:o,tubeGap:r}),[i,e,o,r]),g=26,f=10,u=18,p=t==="left"?n-u:u,h=8,N=t==="left"?6:n-g-18,x=e.jacketColor??"#facc15",k=a??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxs("div",{style:{position:"relative",width:n,height:l.height,fontFamily:"monospace",color:"inherit"},children:[c&&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}),jsx("div",{style:{position:"absolute",top:0,bottom:0,width:g,left:t==="left"?0:void 0,right:t==="right"?0:void 0,borderRadius:14,background:`linear-gradient(90deg, ${x} 0%, ${x} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${x}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),k&&l.tubeLabels.map(C=>jsxs("div",{style:{position:"absolute",top:C.y+o/2-6,left:N,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:[jsx("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:C.color,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 3px rgba(0,0,0,0.25)"}}),jsx("span",{children:C.label})]},`tube-${C.tubeIndex}`)),l.rows.map(C=>{let v=C.y+o/2-f/2,P=t==="left"?p-f/2-h:p+f/2+h;return jsxs(Ce.Fragment,{children:[jsx("div",{style:{position:"absolute",top:v,left:p-f/2,width:f,height:f,borderRadius:"50%",backgroundColor:C.color,backgroundImage:C.backgroundImage,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 4px rgba(0,0,0,0.25)"}}),s&&jsx("div",{style:{position:"absolute",top:C.y+o/2-6,left:P,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:C.fiberIndex})]},C.key)})]})};var Qs=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(a=>a.id===n.parentId);if(i){let a=n.data.uPosition||1,s=n.data.uHeight||1;n.position={x:i.position.x+50,y:i.position.y+a*20-s*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};function xn(e){if(e==null)return;if(typeof e=="number")return `device-${e}`;let t=e.trim();if(t)return t.startsWith("device-")?t:/^\d+$/.test(t)?`device-${t}`:t}function kn(e){if(!e)return;if(typeof e=="string")return e;let t=e.device;return typeof t=="object"&&t?t.id:t}var ec=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}}),tc=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,face: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}}),oc=e=>{let t=kn(e.termination_a),o=kn(e.termination_b);return {id:`cable-${e.id}`,source:xn(t)??"device-unknown-source",target:xn(o)??"device-unknown-target",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}}},rc=e=>{let t=[],o=[],r=new Map;return e.racks.forEach(n=>t.push(ec(n))),e.devices.forEach(n=>{let i=tc(n);t.push(i),r.set(n.name,i.id);}),e.cables.forEach(n=>{let i=oc(n),a=kn(n.termination_a),s=kn(n.termination_b);o.push({...i,source:(typeof a=="string"?r.get(a):void 0)??xn(a)??i.source,target:(typeof s=="string"?r.get(s):void 0)??xn(s)??i.target});}),{nodes:t,edges:o}},Cp=e=>oo(rc(e)),Rp=e=>Qs(e);var nc=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Ep="Interfaces",vp="Management",Dp="Power",ic=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),zt=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Ut=e=>{if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Sp=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",Pn=e=>ic(e.custom_fields)?e.custom_fields:void 0,Tn=e=>ic(e)?e:void 0,ac=(e,t)=>{let o=Pn(e),r=Tn(o?.layout);return Sp(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},sc=(e,t,o)=>{let r=Pn(e),n=Tn(r?.layout),i=zt(o)??zt(e.layout?.group)??zt(e.port_group)??zt(n?.group)??zt(r?.port_group)??zt(r?.portGroup)??zt(r?.interface_group)??zt(r?.interfaceGroup)??zt(r?.group);return i||(t==="power_ac"||t==="power_c13"||t==="power_c19"?Dp:t==="console"||t==="mgmt"?vp:Ep)},cc=(e,t,o)=>{let r=Pn(e),n=Tn(r?.layout);return Ut(o)??Ut(e.layout?.connectorType)??Ut(e.layout?.connector_type)??Ut(e.connector_type)??Ut(n?.connectorType)??Ut(n?.connector_type)??Ut(r?.connectorType)??Ut(r?.connector_type)??Ut(t)},dc=(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"},lc=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"}},Ip=e=>typeof e=="string"?Ar(e):jt(e),uc=(e,t,o)=>{if(!o)return;let r=Pn(e),n=Tn(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 a of i){let s=Ip(a);if(s)return s}},Fp=(e,t)=>{let o=e.type?.value??e.type?.label??e.layout?.type??void 0,r=cc(e,o),n=dc(o,r),i=sc(e,n);return {id:e.name,label:e.name,face:ac(e),group:i,type:n,cableType:lc(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:uc(e,void 0,t)}},Hp=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)}),_p=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[];return Hp(e.interfaces??[]).forEach((a,s)=>{let c=r?r({device:e,iface:a,index:s}):Fp(a,o);if(!c)return;let l=c.type??a.type?.value??a.type?.label??void 0,g=cc(a,l,c.connectorType),f=dc(l,g),u=ac(a,c.face),p=sc(a,f,c.group);n.push({id:c.id,label:c.label??a.name,face:u,group:p,connected:c.connected??!!(a.connected_endpoint||a.cable),type:f,cableType:lc(c.cableType??a.type?.value??a.type?.label??void 0),connectorType:g,position:uc(a,c,o)});}),n},pc=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}}),fc=(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:e.device_type.u_height??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 r=_p(e,t);r.length>0&&(o.ports=r);}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}},gc=e=>({id:`cable-${e.id}`,source:nc(e.termination_a.device),sourceHandle:e.termination_a.name,target:nc(e.termination_b.device),targetHandle:e.termination_b.name,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}}),mc=(e,t={})=>{let o=[],r=[],n=new Map;return e.racks.forEach(i=>{o.push(pc(i));}),e.devices.forEach(i=>{let a=fc(i,t);o.push(a),n.set(i.name,a.id);}),e.cables.forEach(i=>{let a=gc(i),s=(typeof i.termination_a.device.id=="number"?`device-${i.termination_a.device.id}`:void 0)??n.get(i.termination_a.device.name)??a.source,c=(typeof i.termination_b.device.id=="number"?`device-${i.termination_b.device.id}`:void 0)??n.get(i.termination_b.device.name)??a.target;r.push({...a,source:s,target:c});}),{nodes:o,edges:r}},Mp=(e,t={})=>oo(mc(e,t)),$p=(e,t)=>{let o=new Map,r=new Set;return e.filter(i=>i.position!==null).sort((i,a)=>(i.position||0)-(a.position||0)).forEach(i=>{i.position&&(o.set(i.id,i.position),r.add(i.position));}),o};function Cn(e){let{items:t,checkOutOfBounds:o,checkConflicts:r}=e,n=[],i=[];for(let a of t){let s=o(a);s&&!s.isValid&&s.error&&i.push(s.error);}for(let a=0;a<t.length;a++){let s=t[a];for(let c=a+1;c<t.length;c++){let l=t[c],g=r(s,l);g&&g.hasConflict&&g.conflict&&n.push(g.conflict);}}return {isValid:n.length===0&&i.length===0,conflicts:n,outOfBounds:i}}var Yo=class extends Error{constructor(o,r,n,i,a){super(`Device placement conflict: ${r} at U${n}-${n+i-1} in rack ${o}${a?` conflicts with ${a}`:""}`);this.rackId=o;this.deviceId=r;this.uPosition=n;this.uHeight=i;this.conflictWith=a;this.name="DevicePlacementError";}};function Xi(e,t={}){let o=Fe(e);return Cn({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,a=r.unit+r.height-1,s=n.unit,c=n.unit+n.height-1;if(i<=c&&a>=s){if(o){let l=Ue(r),g=Ue(n);if(!Or(l,g))return null}return {hasConflict:true,conflict:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,conflictWith:n.id}}}return null}})}function bc(e,t,o={}){let{deviceTypeMapping:r={}}=o,n=r[e.type]||"device",i=$o(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,isRackMounted:true,width:e.width||"full",role:e.role,ports:e.ports,portGroups:e.portGroups,rearPortGroups:e.rearPortGroups,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:Ue(e)}}}function Ap(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,rackWidthPx:e.rackWidthPx,rackLayout:e.rackLayout,rackFaceGapPx:e.rackFaceGapPx}}}function Lp(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],i=[];if(r)for(let a of e){let s=Xi(a,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} conflicts with ${l.conflictWith}`);}),s.outOfBounds.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} exceeds rack height (${l.rackUHeight}U)`);}),new Yo(a.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 a of e){let s=Ap(a);n.push(s);for(let c of a.devices)try{let l=bc(c,s,t);i.push(l);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let g=Vr(s,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:Ue(c)}},i,c.unit);if(g!==void 0&&g!==c.unit){console.warn(`Device ${c.id} moved from U${c.unit} to U${g} due to conflict`);let f={...c,unit:g},u=bc(f,s,t);i.push(u);}else throw new Yo(a.id,c.id,c.unit,c.height)}}}return n.push(...i),n}function Bp(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let i=e.filter(a=>cr(a.type)&&a.parentId===r.id).map(a=>({id:a.id,name:a.data.label,unit:a.data.uPosition||1,height:a.data.uHeight||1,type:a.data.deviceType||"server",width:a.data.width==="full"||a.data.width==="half"?a.data.width:void 0,ports:Array.isArray(a.data.ports)?a.data.ports:void 0,portGroups:Array.isArray(a.data.portGroups)?a.data.portGroups:void 0,rearPortGroups:Array.isArray(a.data.rearPortGroups)?a.data.rearPortGroups:void 0,connections:a.data.connections,frontImageUrl:a.data.frontImageUrl,rearImageUrl:a.data.rearImageUrl,frontImageAttribution:a.data.frontImageAttribution,rearImageAttribution:a.data.rearImageAttribution,imageFit:a.data.imageFit,imagePosition:a.data.imagePosition,imageRepeat:a.data.imageRepeat,stretchToFit:a.data.stretchToFit,mountMode:Ue(a.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 Op(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 Wp(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(i=>{if(i.id!==t)return i;if(n==="strict"&&!Xi({...i,devices:[...i.devices,o]},r).isValid)throw new Yo(t,o.id,o.unit,o.height);return {...i,devices:[...i.devices,o]}})}function zp(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(n=>n.id!==o)})}var Ko=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 Yi(e,t={}){return Cn({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 hc(e,t){let o=e.mode==="ribbon",r=wr(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 Up(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function Gp(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],i=[];if(r)for(let a of e){let s=Yi(a,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} conflicts with ${l.conflictWith}`);}),s.outOfBounds.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} is out of bounds (max: ${l.max})`);}),new Ko(a.id,s.conflicts[0]?.spliceId||s.outOfBounds[0]?.spliceId||"unknown",s.conflicts[0]?.holder||s.outOfBounds[0]?.holder||1)}}for(let a of e){let s=Up(a);n.push(s);for(let c of a.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];br(s,u,c.holder,p)||(l=yr(s,u,p,c.holder));}let g=l!==c.holder?{...c,holder:l}:c,f=hc(g,s);i.push(f);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let g=[...n,...i],f=yr(s,{id:c.id,data:{label:c.name,holderPosition:c.holder}},g,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=hc(u,s);i.push(p);}else throw new Ko(a.id,c.id,c.holder)}}}return n.push(...i),n}function Vp(e){let t=[],o=e.filter(r=>r.type==="splice-tray");for(let r of o){let i=e.filter(a=>a.type==="splice"&&a.parentId===r.id).map(a=>({id:a.id,name:a.data.label,holder:a.data.holderPosition||1,lossDb:a.data.lossDb,mode:a.data.mode||"single",ribbonFiberIds:a.data.ribbonFiberIds}));t.push({id:r.id,name:r.data.label,position:r.position,splices:i});}return t}function jp(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 Xp(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(i=>{if(i.id!==t)return i;if(n==="strict"&&!Yi({...i,splices:[...i.splices,o]},r).isValid)throw new Ko(t,o.id,o.holder);return {...i,splices:[...i.splices,o]}})}function Yp(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}function yc(e){let{width:t,height:o}=Rt(e.data),r=e.position.x,n=e.position.x+t,i=e.position.y,a=e.position.y+o;return {left:r,right:n,top:i,bottom:a}}function wc(e,t){let o=yc(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function Kp(e,t){let o=null,r=1/0;for(let n of t){if(!wc(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}var Nc=2;var me=e=>typeof e=="string"?e.trim():"",xc=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},qp=e=>{let t=me(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},Zp=(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"},Jp=e=>{if(e==="power_c13")return "C13";if(e==="power_c19")return "C19";if(e==="power_ac")return "AC"},Qp=e=>e.toLowerCase().replace(/_/g,"-").trim(),ef=e=>e>=1?"rackable":"zero-u",tf=e=>(e??"").toLowerCase()==="half"?"half":"full",of=(e,t,o,r)=>{let n=r.replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();return `${e}-b${t}-${n||`p${o}`}`},kc=(e,t)=>`${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");function rf(e){let t=[],o=me(e.manufacturer),r=me(e.model),n=me(e.role)||me(e.deviceType)||me(e.device_type)||"device",i=xc(e.uHeight)??xc(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 a=me(e.id)||me(e.slug)||kc(o,r)||"unknown",s=me(e.slug)||kc(o,r)||a,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:me(u.frontPortId)||me(u.front_port_id),rearPortId:me(u.rearPortId)||me(u.rear_port_id)}));return {id:a,slug:s,manufacturer:o,model:r,role:n,uHeight:i,width:me(e.width)||void 0,frontBlocks:c,rearBlocks:l,rawLinks:f,frontImageUrl:me(e.frontImageUrl)||me(e.front_image_url)||void 0,rearImageUrl:me(e.rearImageUrl)||me(e.rear_image_url)||void 0,frontImageAttribution:me(e.frontImageAttribution)||void 0,rearImageAttribution:me(e.rearImageAttribution)||void 0,tags:Array.isArray(e.tags)?e.tags.map(me).filter(Boolean):[],sourceRepository:me(e.sourceRepository)||me(e.source_repository)||void 0,sourcePath:me(e.sourcePath)||me(e.source_path)||void 0,issues:t}}function Pc(e,t,o){let r=me(e.name)||`Block ${o+1}`,i=(Array.isArray(e.ports)?e.ports:[]).map((a,s)=>{let c=me(a.label)||me(a.name)||`Port ${s+1}`,l=qp(a.connectorType??a.connector_type),g=Zp(me(a.type),l),f=l??Jp(g),p={id:me(a.id)||of(t,o,s,c),label:c,type:g,connectorType:f};if(a.position){let h=jt(a.position);h&&(p.position=h);}return p});return {name:r,ports:i}}function nf(e){let t=[],o=Qp(e.role),r=e.uHeight,n=ef(r),i=tf(e.width),a=e.frontBlocks.map((c,l)=>Pc(c,"front",l)),s=e.rearBlocks.map((c,l)=>Pc(c,"rear",l));return {role:o,mountClass:n,uHeight:r,width:i,frontFace:{portBlocks:a,imageUrl:e.frontImageUrl,imageAttribution:e.frontImageAttribution},rearFace:{portBlocks:s,imageUrl:e.rearImageUrl,imageAttribution:e.rearImageAttribution},issues:t}}function af(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 sf(e){let t=[],{front:o,rear:r}=af(e.frontFace,e.rearFace),n=e.role;return (!n||n==="device")&&[...o.portBlocks,...r.portBlocks].some(a=>a.ports.some(s=>s.type&&s.type.startsWith("power")))&&e.mountClass==="zero-u"&&(n="pdu"),{frontFace:o,rearFace:r,mountClass:e.mountClass,role:n,issues:t}}function Tr(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function cf(e,t){let o=[],r=[];for(let p of t.frontFace.portBlocks)for(let h of p.ports)r.push({id:h.id,face:"front"});for(let p of t.rearFace.portBlocks)for(let h of p.ports)r.push({id:h.id,face:"rear"});let n=new Map;for(let{id:p}of r)n.set(p,(n.get(p)??0)+1);for(let[p,h]of n)h>1&&o.push({severity:"error",code:"DUPLICATE_PORT_ID",message:`Duplicate port id "${p}" found ${h} times`,path:`ports.${p}`});let i=e.frontBlocks.reduce((p,h)=>p+(Array.isArray(h.ports)?h.ports.length:0),0),a=e.rearBlocks.reduce((p,h)=>p+(Array.isArray(h.ports)?h.ports.length:0),0),s=Tr(t.frontFace),c=Tr(t.rearFace);s!==i&&o.push({severity:"error",code:"FRONT_PORT_COUNT_MISMATCH",message:`Front port count mismatch: raw=${i}, parsed=${s}`,path:"faces.front"}),c!==a&&o.push({severity:"error",code:"REAR_PORT_COUNT_MISMATCH",message:`Rear port count mismatch: raw=${a}, parsed=${c}`,path:"faces.rear"});let l=new Set(r.map(p=>p.id)),g=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&&!g.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:s,rear:c}}}function df(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 lf(e){let t=rf(e),o=nf(t),r=sf(o),n=cf(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:df(t,o,r),report:n}:{template:null,report:n}}function uf(e){return Tr(e)}function pf(e,t,o){let r=[],n=Tr(e.faces.front),i=Tr(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
|
+
export{cu as COUPLERS_PER_PANEL,un as COUPLER_SLOT_HEIGHT_PX,du as COUPLER_WIDTH_PX,wi as CableNode,Fi as ClosureNode,ki as CouplerNode,Bo as DeviceNode,Yo as DevicePlacementError,Gi as DiagramErrorBoundary,Ta as FIBER_COLORS_12,Yr as FiberEdge,Yn as FiberNode,Tp as FibreCableWithTubesExpanded,xp as FibreFlowMap,_i as FibreSplitNode,_o as HANDLE_EXTENSION_PX,xi as MultiTubeCableNode,Ui as NetworkDiagram,ps as PANEL_BORDER_WIDTH,bo as PANEL_HEADER_HEIGHT,ln as PANEL_HEIGHT_PX,mo as PANEL_PADDING,fs as PANEL_TUBE_TRAY_SPACING,dn as PANEL_WIDTH_PX,_n as POWER_CONNECTORS,Di as PatchPanelNode,qn as PowerEdge,Xt as RACK_HEADER_HEIGHT,Gn as RACK_WIDTH_PX,Xn as RackNode,li as SpliceNode,Ko as SplicePlacementError,mi as SpliceTrayNode,Nc as TEMPLATE_SCHEMA_VERSION,bi as TubeNode,fa as U_HEIGHT_PX,si as VerticalPDU,Ma as Width,Wp as addDeviceToRack,Xp as addSpliceToTray,je as baseColorFor,Lp as buildNodesFromRackConfig,Gp as buildNodesFromSpliceConfig,sa as buildPortBlocksFromPorts,Ri as calculateClosureDimensions,uu as calculateCouplerRightX,fu as calculateCouplerSlotSpacing,xs as calculateCouplerSpacing,$o as calculateDevicePositionFromU,Ci as calculatePanelDimensions,ws as calculateSlotPositionFromY,eu as calculateSplicePositionFromNumber,$p as calculateUPositions,Ns as calculateYFromSlotPosition,uf as countTemplateFacePorts,Li as createNetworkDiagramStore,Bp as createRackConfigFromNodes,Vp as createSpliceConfigFromNodes,Un as diagramDocumentToNetworkGraph,Kn as fiberSolidOrStriped,Kp as findNearestRack,yr as findNextAvailableHolderPosition,Vr as findNextAvailableUPosition,Rp as generateLayout,oa as getConnectorConfig,Ti as getCouplerDimensions,Ho as getDefaultDeviceFace,Mn as getDeviceConnectorType,ho as getEndpointMetadata,so as getFiberColor,Ln as getFrontPortBlocks,ys as getInnerContentWidth,At as getPDUPortType,lu as getPanelHeight,hs as getPanelWidth,Vt as getPowerPortStyle,yc as getRackBounds,Bn as getRearPortBlocks,Ie as getResolvedPortBlocks,Qn as getStandardPortVisualDimensions,Et as getStatusColor,gs as getTrayDimensions,pn as getTubeDimensions,ca as hasFrontPorts,da as hasRearPorts,oc as inventoryCableToNetworkEdge,tc as inventoryDeviceToNetworkNode,ec as inventoryRackToNetworkNode,Cp as inventoryToDiagramDocument,rc as inventoryToNetworkDiagram,Kc as isHighPowerConnector,wc as isPointInRack,ao as isStriped,ro as isUPositionAvailable,gc as netboxCableToNetworkEdge,fc as netboxDeviceToNetworkNode,pc as netboxRackToNetworkNode,Mp as netboxToDiagramDocument,mc as netboxToNetworkDiagram,oo as networkGraphToDiagramDocument,lf as parseNetboxTemplate,zp as removeDeviceFromRack,Yp as removeSpliceFromTray,Oe as replaceEdge,xr as resolveEndpointCompatibilityKeys,qr as resolvePortVisualKind,pu as snapToCouplerPosition,pi as snapToSplicePosition,Gr as snapToUPosition,Pa as updateDeviceUPosition,Op as updateDeviceUPositionInSchema,jp as updateSpliceHolderPosition,Wi as useDiagramEdges,Oi as useDiagramNodes,Fu as useNetworkDiagram,Ud as validateAndSnapDevice,Xi as validateRackDevicePlacements,pf as validateRenderFidelity,Yi as validateSplicePlacements};//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|