@mp70/react-networks 0.7.0 → 0.7.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{document-adapter-B-6MM_tj.d.mts → document-adapter-Jn_0jy4m.d.mts} +2 -2
- package/dist/{document-adapter-B-6MM_tj.d.ts → document-adapter-Jn_0jy4m.d.ts} +2 -2
- package/dist/index.d.mts +24 -41
- package/dist/index.d.ts +24 -41
- 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/dist/model.d.mts +2 -2
- package/dist/model.d.ts +2 -2
- package/package.json +1 -1
package/dist/index.mjs
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
import ue,{useState,useMemo,useRef,useEffect,Component,useCallback,useSyncExternalStore}from'react';import {useStoreApi,getBezierPath,BaseEdge,EdgeLabelRenderer,getSmoothStepPath,SmoothStepEdge,useUpdateNodeInternals,Position,Handle,useEdges,useReactFlow,ReactFlowProvider,addEdge,ConnectionMode,useNodesState,useEdgesState,applyNodeChanges,useOnSelectionChange,applyEdgeChanges,ReactFlow,Background,Controls,MiniMap,Panel}from'reactflow';export{ConnectionMode,Position}from'reactflow';import {toPng}from'html-to-image';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Pa=/-(source|target)$/i,Vn=/--(rear|front)$/i;function lt(e){return e?e.replace(Pa,""):""}function Ee(e){return lt(e).replace(Vn,"")}function Re(e){return typeof e=="string"&&e.toLowerCase().includes("power")}function yt(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:Re(t.type)?t.label:`${e}-${t.label}`}function ar(e){let t=lt(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}function Wd(e,t,o){return !t||(typeof o?.portType=="string"&&o.portType.length>0?Re(o.portType):ar(e))?e:`${lt(e)}-${t}`}var Ud=/^\d+$/,Gd=/^fiber-(\d+)-(\d+)$/,Vd=/^fiber-(\d+)$/,jd=/^tube-(\d+)$/,Xd=/^(left|right)-(\d+)$/,Yd=/^(input|output)-(\d+)$/;function Kd(e){if(Ud.test(e))return {kind:"outlet",outlet:Number(e)};let t=Gd.exec(e);if(t)return {kind:"fiber",tube:Number(t[1]),fiber:Number(t[2])};let o=Vd.exec(e);if(o)return {kind:"fiber",fiber:Number(o[1])};let r=jd.exec(e);if(r)return {kind:"tube",tube:Number(r[1])};if(e==="left"||e==="right")return {kind:"splice-side",side:e};let n=Xd.exec(e);if(n)return {kind:"side-port",side:n[1],index:Number(n[2])};let a=Yd.exec(e);return a?{kind:"split-io",io:a[1],index:Number(a[2])}:e==="cable-button"?{kind:"cable-button"}:{kind:"port"}}function zt(e){let t=e??"",o=Pa.exec(t),r=o?t.slice(0,t.length-o[0].length):t,n=Vn.exec(r),a=n?r.slice(0,r.length-n[0].length):r,i={raw:t,base:a,shape:Kd(a)};return o&&(i.direction=o[1].toLowerCase()),n&&(i.faceAlias=n[1].toLowerCase()),i}function To(e,t){return t===void 0?`fiber-${e}`:`fiber-${t}-${e}`}function jn(e){return `tube-${e}`}function qd(e){return e}function sr(e,t){return `${e}-${t}`}function Zd(e,t){return `${e}-${t}`}function Xr(e,t){return `${e.replace(Vn,"")}--${t}`}function Jd(e){return e.replace(/\+/g,"")}function Qd(e){let{shape:t}=zt(e);if(t.kind==="splice-side")return t.side==="left"?"right":"left";if(t.kind==="side-port")return sr(t.side==="left"?"right":"left",t.index)}var Xn={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 Wt(e){let t=Xn[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,a=o?10:r?7:5*1.3,i=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:a,color:t.color,borderColor:t.borderColor,fontSize:o?"3px":r?"3.5px":"4px",...i}}function Da(e){let t=Xn[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function el(e){return Da(e).amperage===16}function vt(e){return e%10<8?"C13":"C19"}function Yn(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var tl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),vo=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}},ol=e=>e.trim().toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>0),Kn=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"},Ca=e=>e.includes("center")||e.includes("centre")||e.includes("middle")||e.includes("mid"),rl=(e,t)=>{let o=t.includes("left"),r=t.includes("right"),n=t.includes("top")||t.includes("up"),a=t.includes("bottom")||t.includes("down"),i=Ca(t);if(e==="top"||e==="bottom")return o&&i&&!r?34:r&&i&&!o?66:o&&!r?12:r&&!o?88:i?50:void 0;if(n&&i&&!a)return 34;if(a&&i&&!n)return 66;if(n&&!a)return 12;if(a&&!n)return 88;if(i)return 50},nl=e=>{if(e.includes("front")||e.includes("rear")||e.includes("back"))return;let o=e.map(Kn).find(n=>n!==void 0);if(!o)return;let r=rl(o,e);if(r!==void 0)return {side:o,offsetPercent:r}},il=e=>{if(e.length===0)return;let t=e.includes("left"),o=e.includes("right"),r=Ca(e),n=e.includes("front")||e.includes("top")||e.includes("up"),a=e.includes("rear")||e.includes("back")||e.includes("bottom")||e.includes("down"),i;t&&r&&!o?i=34:o&&r&&!t?i=66:t&&!o?i=12:o&&!t?i=88:r&&(i=50);let s;if(n&&!a?s=22:a&&!n?s=78:r&&(s=50),!(i===void 0||s===void 0))return {xPercent:i,yPercent:s}},cr=e=>{let t=ol(e);if(t.length!==0){if(t.length===1){let o=Kn(t[0]);return o?{side:o}:void 0}return nl(t)??il(t)}},it=e=>{if(typeof e=="string")return cr(e);if(!tl(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"?cr(t):void 0,n=(typeof t=="string"?Kn(t.trim().toLowerCase()):void 0)??o?.side,a=vo(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct)??o?.offsetPercent,i=vo(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels)??o?.offsetPx,s=vo(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x)??o?.xPercent,c=vo(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y)??o?.yPercent,d=vo(e.widthPercent??e.width_percent??e.widthPct??e.width_pct??e.wPercent??e.w_percent),f=vo(e.heightPercent??e.height_percent??e.heightPct??e.height_pct??e.hPercent??e.h_percent);if(!(n===void 0&&a===void 0&&i===void 0&&s===void 0&&c===void 0&&d===void 0&&f===void 0))return {side:n,offsetPercent:a,offsetPx:i,xPercent:s,yPercent:c,widthPercent:d,heightPercent:f}};var al="Network Ports",sl="Rear Network Ports",cl="Power Ports",Ea=8,dl=92;function Io(e){return Math.max(0,Math.min(100,e))}function Zn(e){if(e==="top"||e==="right"||e==="bottom"||e==="left")return e}function So(e){return it(e)}function Ra(e){let t=So(e.position);return typeof t?.xPercent=="number"&&typeof t?.yPercent=="number"}function ll(e){let t=So(e.position);return typeof t?.offsetPercent=="number"||typeof t?.offsetPx=="number"}function ul(e){return e.face==="rear"||e.face==="back"?"rear":e.face==="front"?"front":Re(e.type)?"rear":"front"}function pl(e,t){return typeof e.group=="string"&&e.group.trim().length>0?e.group.trim():Re(e.type)?cl:t==="rear"?sl:al}function Kr(e){return typeof e.port.order=="number"&&Number.isFinite(e.port.order)?e.port.order:e.index}function fl(e,t){return t<=1?50:Ea+e*(dl-Ea)/(t-1)}function gl(e){let t=e.filter(n=>!!Zn(So(n.port.position)?.side)&&!Ra(n.port)&&!ll(n.port)),o=new Map,r=new Map;return t.forEach(n=>{let a=Zn(So(n.port.position)?.side);if(!a)return;let i=r.get(a);if(i){i.push(n);return}r.set(a,[n]);}),r.forEach(n=>{let a=[...n].sort((i,s)=>{let c=Kr(i)-Kr(s);return c!==0?c:i.index-s.index});a.forEach((i,s)=>{o.set(i.index,fl(s,a.length));});}),o}function ml(e,t){let o=So(e.position),r=Zn(o?.side);if(Ra(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 i=(typeof o?.offsetPercent=="number"&&Number.isFinite(o.offsetPercent)?Io(o.offsetPercent):void 0)??(typeof t=="number"?Io(t):void 0);return typeof i=="number"&&(n.offsetPercent=i),n}function bl(e,t){let o=ml(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 Yr(e){return e.map(t=>({...t,ports:t.ports.map(o=>{let r=So(o.position);return {...o,...r?{position:r}:{position:void 0}}})}))}function qn(e){return Array.isArray(e)&&e.length>0&&e.every(t=>t!==null&&typeof t=="object"&&typeof t.name=="string"&&Array.isArray(t.ports))}function hl(e){return Array.isArray(e)&&e.length>0&&e.every(t=>t!==null&&typeof t=="object"&&typeof t.label=="string"&&!(typeof t.name=="string"&&Array.isArray(t.ports)))}function qr(e){let t=new Map;e.forEach((n,a)=>{if(typeof n.label!="string"||n.label.trim().length===0)return;let i=ul(n),s=pl(n,i),c=`${i}:${s}`,d=t.get(c);if(d){d.entries.push({index:a,port:{...n,label:n.label.trim()}});return}t.set(c,{face:i,groupName:s,entries:[{index:a,port:{...n,label:n.label.trim()}}]});});let o=[],r=[];return t.forEach(n=>{let a=[...n.entries].sort((c,d)=>{let f=Kr(c)-Kr(d);return f!==0?f:c.index-d.index}),i=gl(a),s={name:n.groupName,ports:a.map(c=>bl(c,i.get(c.index)))};if(n.face==="rear"){r.push(s);return}o.push(s);}),{ports:o,rearPorts:r}}function Le(e){return qn(e?.ports)?{ports:Yr(e.ports),rearPorts:Yr(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:qn(e?.rearPorts)?e.rearPorts:[])}:hl(e?.ports)?qr(e.ports):{ports:Yr(Array.isArray(e?.portGroups)?e.portGroups:[]),rearPorts:Yr(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:qn(e?.rearPorts)?e.rearPorts:[])}}function Jn(e){return Le(e).ports}function Qn(e){return Le(e).rearPorts}function dr(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function Ta(e){return dr(Le(e).ports)>0}function va(e){return dr(Le(e).rearPorts)>0}function Fo(e){let t=Ta(e);return va(e)&&!t?"rear":"front"}var yl=new Set(["patch-panel","closure","splice-tray"]),ei=["frontImageUrl","rearImageUrl","frontImageAttribution","rearImageAttribution","imageFit","imagePosition","imageRepeat","stretchToFit"],ti=["panelWidth","panelHeight","closureWidth","closureHeight","headerHeight"],oi=["status","width","widthPx","height","header","color","colorMode","showUMarkers","customHeaderText","powerSide","rotation","rackWidthPx","rackFaceGapPx"],wl=["face","handleSideMap"],Nl=new Set(["label","ports","portGroups","rearPortGroups","pduPortGroups","connections","netboxId","netboxType","inventoryId","inventoryType","uPosition","mountMode","rackLayout","slotPosition","holderPosition",...ei,...ti,...oi,...wl]);function Sa(e){return {x:typeof e?.x=="number"?e.x:0,y:typeof e?.y=="number"?e.y:0}}function ur(e){if(e)return {...e}}function lr(e){return {...e,ports:e.ports.map(t=>({...t,compatibility:Array.isArray(t.compatibility)?[...t.compatibility]:void 0,position:ur(t.position)}))}}function xl(e){if(typeof e.parentId=="string")return e.parentId;let t=e.parentNode;return typeof t=="string"?t:void 0}function kl(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 Pl(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 yl.has(t)?t:"patch-panel"}return e.kind==="splitter"?"fibre-split":e.kind}function Dl(e){let t={position:Sa(e.position)},o=xl(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 Cl(e){let t=e.data??{},o={};oi.forEach(a=>{let i=t[a];i!==void 0&&(o[a]=i);});let r=ei.reduce((a,i)=>{let s=t[i];return s!==void 0&&(a[i]=s),a},{});Object.keys(r).length>0&&(o.images=r);let n=ti.reduce((a,i)=>{let s=t[i];return typeof s=="number"&&(a[i]=s),a},{});return Object.keys(n).length>0&&(o.dimensions=n),Object.keys(o).length>0?o:void 0}function El(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 Rl(e){let t=e.data??{},o={};return Object.entries(t).forEach(([r,n])=>{Nl.has(r)||(r==="rackWidthPx"||r==="rackFaceGapPx")&&e.type!=="rack"||(o[r]=n);}),Object.keys(o).length>0?o:void 0}function Tl(e,t){let o={};if(e.forEach(r=>{let n=r.data??{},a={},i=n.face==="front"||n.face==="rear"?n.face:void 0;i&&(a.face=i),n.handleSideMap&&typeof n.handleSideMap=="object"&&(a.handleSideMap={...n.handleSideMap}),Object.keys(a).length>0&&(o[r.id]=a);}),!(Object.keys(o).length===0&&!t?.metadata))return {...Object.keys(o).length>0?{nodeState:o}:{},...t?.metadata?{metadata:t.metadata}:{}}}function vl(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")||t.includes("rj45")?"ethernet":"generic"}function Il(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups.map(lr);let{ports:o,rearPorts:r}=Le(t);if(r.length>0)return r.map(lr);if(o.length>0)return o.map(lr);let n=typeof t.powerPorts=="number"&&Number.isFinite(t.powerPorts)&&t.powerPorts>0?t.powerPorts:36;return [{name:"Power",ports:Array.from({length:n},(a,i)=>{let s=vt(i);return {id:`${i+1}`,label:`${i+1}`,connected:false,type:s==="C19"?"power_c19":"power_c13",connectorType:s}})}]}function Sl(e){return (e.type==="vertical-pdu"?[{face:"rear",blocks:Il(e)}]:(()=>{let{ports:o,rearPorts:r}=Le(e.data);return [{face:"front",blocks:o.map(lr)},{face:"rear",blocks:r.map(lr)}]})()).flatMap(({face:o,blocks:r})=>r.flatMap(n=>n.ports.map(a=>({id:a.id??`${n.name}-${a.label}`,label:a.label,face:o,group:n.name,role:Re(a.type)?"power":"network",medium:vl(a.type),type:a.type,cableType:a.cableType,connector:a.connectorType,compatibility:Array.isArray(a.compatibility)?[...a.compatibility]:void 0,layout:ur(a.position)}))))}function Fl(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,a)=>({id:`fiber-${a+1}`,label:`${a+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,a)=>({id:`tube-${r+a}`,label:`${r+a}`,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,a)=>({id:`input-${a+1}`,label:`Input ${a+1}`,role:"splitter",medium:"fiber"})),...Array.from({length:r},(n,a)=>({id:`output-${a+1}`,label:`Output ${a+1}`,role:"splitter",medium:"fiber"}))]}return []}function _l(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)?Sl(e):Fl(e);return t.length>0?t:void 0}function Hl(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 Ml(e,t){return e?{...e,...t,placement:t.placement,render:t.render,config:t.config,externalRefs:t.externalRefs,metadata:t.metadata??e.metadata,endpoints:Hl(e.endpoints,t.endpoints)}:t}function Qt(e,t){let o=new Map((t?.nodes??[]).map(i=>[i.id,i])),r=e.nodes.map(i=>Ml(o.get(i.id),{id:i.id,...kl(i),label:i.data?.label??i.id,placement:Dl(i),render:Cl(i),config:Rl(i),externalRefs:El(i),metadata:o.get(i.id)?.metadata,endpoints:_l(i)})),n=new Map((t?.edges??[]).map(i=>[i.id,i])),a=e.edges.map(i=>{let s={id:i.id,source:{nodeId:i.source,endpointId:i.sourceHandle?Ee(i.sourceHandle):void 0},target:{nodeId:i.target,endpointId:i.targetHandle?Ee(i.targetHandle):void 0},type:i.type,hidden:i.hidden===true?true:void 0,data:i.data?{...i.data}:void 0,metadata:n.get(i.id)?.metadata},c=n.get(i.id);return c?{...c,...s}:s});return {nodes:r,edges:a,ui:Tl(e.nodes,t?.ui),metadata:t?.metadata}}function Al(e){let t=new Map,o=r=>{if(!r.endpointId)return;let n=`${r.nodeId}:${Ee(r.endpointId)}`;t.set(n,(t.get(n)??0)+1);};return e.forEach(r=>{o(r.source),o(r.target);}),t}function Fa(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 $l(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}:${Ee(r.id)}`)??0)>0,type:Fa(r),cableType:r.cableType,connectorType:r.connector,compatibility:r.compatibility&&r.compatibility.length>0?[...r.compatibility]:void 0,position:ur(r.layout)}))}function Ll(e,t,o){let r=new Map;return e.forEach(n=>{let a=n.group??"Ports",i=r.get(a),s={id:n.id,label:n.label,connected:(t.get(`${o}:${Ee(n.id)}`)??0)>0,type:Fa(n),cableType:n.cableType,connectorType:n.connector,compatibility:n.compatibility&&n.compatibility.length>0?[...n.compatibility]:void 0,position:ur(n.layout)};if(i){i.push(s);return}r.set(a,[s]);}),[...r.entries()].map(([n,a])=>({name:n,ports:a.map(i=>({id:i.id,label:i.label,connected:i.connected??false,type:i.type,cableType:i.cableType,connectorType:i.connectorType,compatibility:i.compatibility,position:ur(i.position)}))}))}function Bl(e,t,o){if(!t&&!o)return e;let r={...e};t&&(oi.forEach(a=>{let i=t[a];i!==void 0&&(r[a]=i);}),t.images&&ei.forEach(a=>{let i=t.images?.[a];i!==void 0&&(r[a]=i);}),t.dimensions&&ti.forEach(a=>{let i=t.dimensions?.[a];typeof i=="number"&&(r[a]=i);}));let n=o?.face;return n&&(r.face=n),o?.handleSideMap&&(r.handleSideMap={...o.handleSideMap}),r}function Ol(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 Ia(e,t,o){if(!t)return;let r=Ee(t);if(!e)return r;if(e.kind==="equipment"){let n=(e.subtype??"").toLowerCase().replace(/_/g,"-"),a=e.endpoints?.find(s=>s.id===r),i=a?.role==="power"||a?.medium==="power";if((n==="switch"||n==="router")&&o==="target"&&!i)return `${r}-target`;if(n==="patch-panel"){let s=a?.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}function ri(e){let t=Al(e.edges),o=e.ui?.nodeState??{},r=e.nodes.map(i=>{let s=Pl(i),c={label:i.label,...i.config??{}};if(c=Bl(c,i.render,o[i.id]),c=Ol(c,i.externalRefs),s==="device"||s==="server"||s==="switch"||s==="router")c.deviceType=i.subtype??(s==="device"?"device":s),i.endpoints&&i.endpoints.length>0&&(c.ports=$l(i.endpoints,t,i.id));else if(s==="vertical-pdu"){let d=(i.endpoints??[]).filter(f=>f.face!=="front");d.length>0&&(c.pduPortGroups=Ll(d,t,i.id),c.powerPorts=d.length);}return i.placement.rack&&(i.placement.rack.rackLayout&&(c.rackLayout=i.placement.rack.rackLayout),typeof i.placement.rack.rackWidthPx=="number"&&(c.rackWidthPx=i.placement.rack.rackWidthPx),typeof i.placement.rack.rackFaceGapPx=="number"&&(c.rackFaceGapPx=i.placement.rack.rackFaceGapPx)),s!=="rack"&&i.placement.rack&&(c.isRackMounted=true,typeof i.placement.rack.uPosition=="number"&&(c.uPosition=i.placement.rack.uPosition),i.placement.rack.mountMode&&(c.mountMode=i.placement.rack.mountMode)),i.placement.container&&(typeof i.placement.container.slotPosition=="number"&&(c.slotPosition=i.placement.container.slotPosition),typeof i.placement.container.holderPosition=="number"&&(c.holderPosition=i.placement.container.holderPosition)),{id:i.id,type:s,position:Sa(i.placement.position),...i.placement.parentId?{parentId:i.placement.parentId}:{},...i.placement.extent?{extent:i.placement.extent}:{},data:c}}),n=new Map(e.nodes.map(i=>[i.id,i])),a=e.edges.map(i=>({id:i.id,source:i.source.nodeId,target:i.target.nodeId,...i.source.endpointId?{sourceHandle:Ia(n.get(i.source.nodeId),i.source.endpointId,"source")}:{},...i.target.endpointId?{targetHandle:Ia(n.get(i.target.nodeId),i.target.endpointId,"target")}:{},...i.type?{type:i.type}:{},...i.hidden===true?{hidden:true}:{},...i.data?{data:{...i.data}}:{}}));return {nodes:r,edges:a}}var _a=20,Ut=60,ni=300;var _o=5;function Ha(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=Ha(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function Aa(e){return Ha(e)==="light"?"#e5e5e5":"#2a2a2a"}function $a(e,t){return {width:"100%",height:"100%",...t}}var La=["device","server","switch","router"],zl=[...La,"vertical-pdu"],Wl=new Set(La),Ul=new Set(zl);function eo(e){return typeof e=="string"&&Wl.has(e)}function Gl(e){return typeof e=="string"&&Ul.has(e)}function to(e){return !!e&&eo(e.type)}function Ho(e){return !!e&&Gl(e.type)}var Ba=(o=>(o.FULL="full",o.HALF="half",o))(Ba||{});function Oa(e){return typeof e=="string"&&e.trim().length>0}function ii(e){let{ports:t,rearPorts:o}=Le(e),r=dr(t)>0||Oa(e.frontImageUrl),n=dr(o)>0||Oa(e.rearImageUrl);if(r&&n)return "both";if(r)return "front";if(n)return "rear"}function Vl(e){if(e.face==="front"||e.face==="rear")return e.face}function za(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let a=ii(e);if(a)return a;let i=Vl(e);if(i)return i;let s=o+r/2;return t>=s?"front":"rear"}var jl=24,Xl=4;function Yl(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function Ie(e){return Yl(e)==="split-face"}function It(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:jl}function wt(e){return e?.rackWidthPx||300}function Gt(e){return wt(e)*1.75/19}function Zr(e){let t=wt(e);return Ie(e)?t*2+It(e):t}function Nt(e){let t=e?.uHeight??42,o=Gt(e);return {width:Zr(e),height:60+t*o}}function ai(e){return e.map(t=>{if(t.type!=="rack")return t;let o=Nt(t.data);return t.width===o.width&&t.height===o.height?t:{...t,width:o.width,height:o.height}})}function Ge(e){if(e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both")return e.mountMode;let t=ii(e??{});return t||"both"}function Mo(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Jr(e,t){let o=new Set(Mo(e));return Mo(t).some(n=>o.has(n))}function Qr(e,t){return Ie(e)&&Ge(t)==="front"?wt(e)+It(e):0}function Wa(e,t){return t.isRackMounted!==true||t.splitFaceLayout?e:t.deviceWidth==="half"?Math.floor(e/2):e+Xl}function Ua(e,t){return Ie(e)&&Ge(t)==="both"?Zr(e):wt(e)}var Ga=e=>{if(typeof e.parentId=="string")return e.parentId;if(typeof e.parentNode=="string")return e.parentNode},St=(e,t)=>typeof e=="number"&&Number.isFinite(e)&&e>0?Math.floor(e):t,Kl=()=>"bottom-up",ro=e=>e.data.uNumberingDirection||Kl(),en=(e,t,o)=>o==="bottom-up"?t-e+1:e,tn=(e,t,o)=>o==="bottom-up"?t-e+1:e;var on=(e,t,o,r)=>{let n=Ga(e);if(!n||n!==t.id)return o;let a=St(e.data.uHeight,1),i=St(t.data.uHeight,42),s=ro(t),c=Gt(t.data),d=60,f=o.y-d,g=Math.round(f/c)+1,l;s==="bottom-up"?l=en(g,i,s)-a+1:l=en(g,i,s);let u=i-a+1,m=Math.max(1,Math.min(u,l));if(s==="top-down"&&l<=1&&(m=1),!oo(t,e,m,r)){let h=rn(t,e,r,m);if(h!==void 0)m=h;else {let x=St(e.data.uPosition,0);if(x>0&&oo(t,e,x,r))m=x;else return {x:Qr(t.data,e.data),y:e.position?.y??o.y,uPosition:x>0?x:void 0}}}let w;if(s==="bottom-up"){let h=m+a-1,x=tn(h,i,s);w=d+(x-1)*c-1;}else {let h=tn(m,i,s);w=d+(h-1)*c-1;}return {x:Qr(t.data,e.data),y:w,uPosition:m}},oo=(e,t,o,r)=>{let n=St(t.data.uHeight,1),a=St(e.data.uHeight,42);if(o<1||o+n-1>a)return false;let i=r.filter(d=>eo(d.type)&&Ga(d)===e.id&&d.id!==t.id),s=Ie(e.data),c=Ge(t.data);for(let d of i){let f=St(d.data.uPosition,1),g=St(d.data.uHeight,1),l=o,u=o+n-1,m=f,w=f+g-1;if(l<=w&&u>=m){if(s){let h=Ge(d.data);if(!Jr(c,h))continue}return false}}return true},rn=(e,t,o,r=1)=>{let n=St(t.data.uHeight,1),i=St(e.data.uHeight,42)-n+1;if(i<1)return;let s=Number.isFinite(r)?Math.floor(r):1,c=Math.max(1,Math.min(i,s));for(let d=c;d<=i;d++)if(oo(e,t,d,o))return d;for(let d=1;d<c;d++)if(oo(e,t,d,o))return d},Ao=(e,t,o=1,r)=>{let n=60,a=ro(e),i=e.data.uHeight||42,s=Gt(e.data),c=tn(t,i,a),d;if(a==="bottom-up"){let f=t+o-1,g=tn(f,i,a);d=n+(g-1)*s-1;}else d=n+(c-1)*s-1;return {x:Qr(e.data,r),y:d}},Va=(e,t,o)=>{let r=e.data.uHeight||1,n=Ao(t,o,r,e.data),a=Array.isArray(e.data.ports)?e.data.ports:void 0;return {...e,position:n,data:{...e.data,ports:a,uPosition:o}}},ql=(e,t)=>{let o=e.data.uPosition||1,r=e.data.uHeight||1,n=t.data.uHeight||42,a=Math.max(1,Math.min(n-r+1,o));return a!==o?Va(e,t,a):e};function xt(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var eu=({data:e,selected:t,id:o,onFaceChange:r,onRackFaceChange:n,isDragOver:a=false})=>{let{label:i,ports:s=0,status:c="active",uHeight:d=42,face:f="front",customHeaderText:g}=e,l=Ie(e),u=Gt(e),m=Zr(e),w=Nt(e),h=wt(e),x=It(e),P={width:`${h}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"},E=useStoreApi(),[D,y]=useState(e.showUMarkers!==void 0?e.showUMarkers:true),R=()=>{let A=ro({data:e})==="bottom-up"?"top-down":"bottom-up",{getNodes:L,setNodes:O}=E.getState();O(L().map(z=>z.id===o?{...z,data:{...z.data,uNumberingDirection:A}}:z));},_=()=>{if(l)return;let F=f==="front"?"rear":"front";if(n)n(o,F);else if(r)E.getState().getNodes().filter(L=>L.parentId===o).forEach(L=>{r(L.id,F);});else {let{getNodes:A,setNodes:L}=E.getState();L(A().map(O=>O.id===o?{...O,data:{...O.data,face:F}}:O.parentId===o?{...O,data:{...O.data,face:F}}:O));}},M=()=>{let F=[],A=60,L=ro({data:e});for(let O=1;O<=d;O++){let z=A+(O-1)*u-4,Q=en(O,d,L);F.push(jsx("div",{style:{position:"absolute",left:"-35px",top:`${z}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:Q},O));}return F};return jsxs("div",{"data-testid":"rack-node",className:`rack-node ${t?"selected":""} ${a?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${xt(c)}`,borderRadius:"8px",padding:0,width:`${m}px`,height:`${w.height}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:a?"0 0 20px #3b82f6, 0 0 40px #3b82f6, 0 0 60px #3b82f6":t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",transition:"box-shadow 0.2s ease-in-out"},children:[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:i}),jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[g?jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:g}):jsxs("span",{children:[typeof s=="number"?s:0," ports"]})," \u2022 ",d,"U \u2022 ",l?"rear|front":f]}),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(),y(!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:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),R();},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 ${ro({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:ro({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),!l&&jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),_();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${f==="front"?"rear":"front"} face`,children:f==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${d*u}px`,overflow:"hidden"},children:l&&jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none",display:"flex",alignItems:"stretch"},children:[jsx("div",{"data-testid":"rack-face-rear",style:{...P,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:`${x}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:{...P,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:M()})]})},si=ue.memo(eu,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.data===t.data&&e.isDragOver===t.isDragOver);var ci=({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 ${xt(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:xt(r),borderRadius:"50%"}})]})};var ja=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function Ve(e){let t=(e-1)%12;return ja[t]}function io(e){return e>12}function Ft(e,t){let o=t?.base??Ve(e),r=t?.striped??io(e),n=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:n}}function di(e){let t=Ft(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function ao(e){return Ve(e)}function _t(e){return e.map(t=>({base:Ve(t),striped:io(t)}))}function nu(e,t,o,r,n,a,i,s){let c=_t(o),d=c.length,f=r?1.2:1,g=!!s?.highlight,l=r?2:1.5,u=s?.highlightWidth??l*3,m=s?.highlightColor??c[0]?.base??"#22d3ee";return jsxs(Fragment,{children:[g&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:m,strokeWidth:u,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${l}px`,"--rn-edge-highlight-to":`${u}px`}}),c.map((w,h)=>{let P=(d-h)*f;return jsx("path",{d:t,stroke:w.base,strokeWidth:P,fill:"none",strokeLinecap:"butt",opacity:w.striped?.9:1,style:n},`${e}-ribbon-${h}`)}),c.some(w=>w.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(${a}px,${i}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 iu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:d={},className:f})=>{let[g,l,u]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),{bandwidth:m,length:w,color:h="#00FFFF",striped:x=false,ribbonFiberIds:P,isRibbon:E,highlight:D,highlightColor:y,highlightWidth:R}=s||{},_=!!D;if((E||P&&P.length>=6&&P.length<=12)&&P)return nu(e,g,P,c??false,d??{},l,u,s);let F=c?3:2,A=R??F*3,L={...d,stroke:h,strokeWidth:F,strokeDasharray:"none"};return jsxs(Fragment,{children:[_&&jsx(BaseEdge,{id:`${e}-highlight`,path:g,style:{...d,stroke:y??h,strokeWidth:A,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${F}px`,"--rn-edge-highlight-to":`${A}px`}}),jsx(BaseEdge,{id:e,path:g,style:L}),x&&jsx(BaseEdge,{id:`${e}-stripe`,path:g,style:{...d,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsx(EdgeLabelRenderer,{children:c&&s&&(m||w)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px,${u}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${h}`,pointerEvents:"none",zIndex:9999},children:[m&&jsx("div",{children:m}),w&&jsxs("div",{children:[w,"m"]})]})})]})},sn=ue.memo(iu);var cu=.7,qa=.28,Lo=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,du=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,style:s={},data:c,markerEnd:d})=>{let[f]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),g=c?.connectorType||"C13",l=c?.metadata??{},u=Lo(c?.powerStrokeWidth)??Lo(l.strokeWidth),m=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof l.strokeDasharray=="string"?l.strokeDasharray:void 0,w=Lo(s.opacity)??Lo(c?.opacity)??Lo(c?.powerOpacity)??Lo(l.opacity),h=R=>{let M=u??(g==="C19"?5:3),F=m??(g==="C19"?"none":"6,3");return {stroke:c?.color||"#f59e0b",strokeWidth:M,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:F,...R!==void 0?{opacity:R}:{},...s}},x=!!c?.highlight,P=c?.highlightColor??c?.color??"#f59e0b",E=h(x?w!==void 0?Math.min(w,qa):qa:w),D=typeof E.strokeWidth=="number"?E.strokeWidth:3,y=c?.highlightWidth??D*2.5;return jsxs(Fragment,{children:[x?jsx(BaseEdge,{id:`${e}-highlight`,path:f,markerEnd:d,style:{...E,stroke:P,strokeWidth:y,opacity:cu,strokeDasharray:"14 10","--rn-edge-highlight-from":`${D}px`,"--rn-edge-highlight-to":`${y}px`}}):null,jsx(BaseEdge,{id:e,path:f,markerEnd:d,style:E})]})},li=ue.memo(du);function mu(e,t,o,r,n,a,i,s,c,d,f){let g=_t(s),l=g.length,u=c?1.8:1.5,m=!!f?.highlight,w=c?3:2.5,h=f?.highlightWidth??w*3,x=f?.highlightColor??g[0]?.base??"#22d3ee",[P,E,D]=getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i});return jsxs(Fragment,{children:[m&&jsx(BaseEdge,{id:`${e}-highlight`,path:P,style:{...d,stroke:x,strokeWidth:h,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${w}px`,"--rn-edge-highlight-to":`${h}px`}}),g.map((y,R)=>{let M=(l-R)*u;return jsx("path",{d:P,stroke:y.base,strokeWidth:M,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:d},`${e}-ribbon-${R}`)}),g.some(y=>y.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:P,style:{...d,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:c&&f&&(f.bandwidth||f.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${E}px,${D}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${g[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[f.bandwidth&&jsx("div",{children:f.bandwidth}),f.length&&jsxs("div",{children:[f.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[s.length,"F"]})]})})]})}var bu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:d={},...f})=>{let{color:g="#00FFFF",ribbonFiberIds:l,isRibbon:u,highlight:m,highlightColor:w,highlightWidth:h}=s||{},x=!!m;if((u||l&&l.length>=6&&l.length<=12)&&l)return mu(e,t,o,r,n,a,i,l,c??false,d??{},s);let E=c?4:3,D=h??E*3,y={...d,stroke:g,strokeWidth:E};return jsxs(Fragment,{children:[x&&jsx(BaseEdge,{id:`${e}-highlight`,path:getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i})[0],style:{...d,stroke:w??g,strokeWidth:D,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${E}px`,"--rn-edge-highlight-to":`${D}px`}}),jsx(SmoothStepEdge,{...f,id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:y})]})},Qa=ue.memo(bu);function yu({sourceX:e,sourceY:t,targetX:o,targetY:r,sourcePosition:n,targetPosition:a}){let i=n===Position.Left||n===Position.Right,s;if(i){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 wu(e,t,o,r,n,a){let i=_t(o),s=i.length,c=r?1.2:1,d=!!a?.highlight,f=r?2:1.5,g=a?.highlightWidth??f*3,l=a?.highlightColor??i[0]?.base??"#22d3ee",u=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),m=u?(parseFloat(u[1])+parseFloat(u[3]))/2:0,w=u?(parseFloat(u[2])+parseFloat(u[4]))/2:0;return jsxs(Fragment,{children:[d&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:l,strokeWidth:g,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${f}px`,"--rn-edge-highlight-to":`${g}px`}}),i.map((h,x)=>{let E=(s-x)*c;return jsx("path",{d:t,stroke:h.base,strokeWidth:E,fill:"none",strokeLinecap:"butt",opacity:h.striped?.9:1,style:n},`${e}-ribbon-${x}`)}),i.some(h=>h.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&a&&(a.bandwidth||a.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${m}px,${w}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${i[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[a.bandwidth&&jsx("div",{children:a.bandwidth}),a.length&&jsxs("div",{children:[a.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var os=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:d={},...f})=>{let{color:g="#00FFFF",striped:l=false,ribbonFiberIds:u,isRibbon:m,highlight:w,highlightColor:h,highlightWidth:x}=s||{},P=!!w,E=yu({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i});if((m||u&&u.length>=6&&u.length<=12)&&u)return wu(e,E,u,c??false,d??{},s);let y=c?3:2,R=x??y*3,_={...d,stroke:g,strokeWidth:y,strokeDasharray:"none"};return jsxs(Fragment,{children:[P&&jsx(BaseEdge,{id:`${e}-highlight`,path:E,style:{...d,stroke:h??g,strokeWidth:R,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${y}px`,"--rn-edge-highlight-to":`${R}px`}}),jsx(BaseEdge,{id:e,path:E,style:_}),l&&jsx(BaseEdge,{id:`${e}-stripe`,path:E,style:{...d,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var is=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,style:s={},data:c,markerEnd:d,selected:f})=>{let{color:g="#6366f1",label:l,highlight:u,highlightColor:m,highlightWidth:w}=c||{},h=!!u,x=8,P=w??x*1.8,[E,D,y]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),R={...s,stroke:g,strokeWidth:x,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxs(Fragment,{children:[h&&jsx(BaseEdge,{id:`${e}-highlight`,path:E,style:{...s,stroke:m??g,strokeWidth:P,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${m??g}) drop-shadow(0 0 16px ${m??g})`,"--rn-edge-highlight-from":`${x}px`,"--rn-edge-highlight-to":`${P}px`}}),jsx(BaseEdge,{id:e,path:E,markerEnd:d,style:R}),l&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${D}px,${y}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${g}`,pointerEvents:"none",zIndex:9999},children:l})})]})};function Du(e,t,o){return Math.max(t,Math.min(o,e))}function as(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:Du(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 Cu(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 ss(e,t,o){return o.mode==="px"?o.value:(e-t)*o.value}function cs(e,t){return t===true||e==="fill"?"100% 100%":e==="none"?"auto":e==="contain-height"?"auto 100%":e==="scale-down"?"contain":e??"cover"}function pi(e,t,o,r,n){if(!o||o.width<=0||o.height<=0)return;let a=o.width,i=o.height;if(r==="100% 100%")a=e,i=t;else if(r==="auto 100%"){let d=t/o.height;a=o.width*d,i=o.height*d;}else if(r==="cover"||r==="contain"){let d=r==="cover"?Math.max(e/o.width,t/o.height):Math.min(e/o.width,t/o.height);a=o.width*d,i=o.height*d;}let[s,c]=Cu(n);return {width:a,height:i,offsetX:ss(e,a,as(s)),offsetY:ss(t,i,as(c))}}var Eu={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 Ru(e){return [e.group,e.sourceTypeLabel,e.label,e.id,e.connectorType].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ").toLowerCase()}function dn(e){let t=String(e.type??"").toLowerCase(),o=String(e.label??"").toLowerCase(),r=Ru(e);return t==="power_c19"?"power_c19":t==="power_c13"?"power_c13":t==="power_ac"?"power_ac":t==="usb"?"usb":t==="rj45"||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 fi(e){let t=typeof e=="string"?e:dn(e);if(t!=="generic")return Eu[t]}var Tu={portClickEnabled:false},ls=ue.createContext(Tu),gi=ls.Provider;function mi(){return ue.useContext(ls)}function bi(e,t,o){return e?.length?e.some(r=>r.nodeId===t&&r.handleId===o):false}var Iu="#6b7280",Su="#374151",hi="#10b981",Fu="100% 100%",ln=1,_u={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},Hu=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,Mu=/^data:image\//i,Au=typeof window<"u"?ue.useLayoutEffect:ue.useEffect,ps=new Map;function $u(e){return (e??"").toLowerCase().replace(/_/g,"-")}function Lu(e){return !Hu.test(e)&&!e.startsWith("//")}function fs(e){if(!e)return;let t=e.trim();if(t){if(Lu(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:"&&Mu.test(t)?t:void 0}catch{return}}}function Bu(e){return `url(${JSON.stringify(e)})`}function Ou(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 Bo(e){return Re(e.type)}function Ni(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":Yn(t)}function yi(e,t){return yt(e,t)}function zu(e,t,o,r,n){let a=t.length>0||!!r,i=o.length>0||!!n;return e||(a?"front":i?"rear":"front")}function Wu(e){let t=ps.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 ps.set(e,o),o}function gs(e){let[t,o]=ue.useState(void 0);return ue.useEffect(()=>{let r=false;return e?(Wu(e).then(n=>{r||o(n);}),()=>{r=true;}):(o(void 0),()=>{r=true;})},[e]),t}function Uu(e){return Bo(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?hi:e.cableType?_u[e.cableType]??hi:hi}function Gu(e){return e.connected?Uu(e):Iu}function ms(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 Vu(e,t,o,r){let n=e<=3||t<=3,a=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:`${a}px solid ${r}`,boxSizing:"border-box",borderRadius:"1px",cursor:"pointer",zIndex:2}}function wi(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 ws(e){return e.type==="console"||e.type==="usb"}function Ns(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(4,Math.min(5,Math.round(t*.6)))}}function xs(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(3,Math.min(4,Math.round(t*.5)))}}function ks(e,t){return dn({type:e.type,label:e.label,id:String(e.id??""),group:t,sourceTypeLabel:e.sourceTypeLabel,connectorType:e.connectorType})}function lo(e){return Math.max(0,Math.min(100,e))}function je(e,t,o){return Math.max(t,Math.min(o,e))}function bs(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 a=r.width*lo(e.position.widthPercent)/100,i=r.height*lo(e.position.heightPercent)/100;return {width:je(a,2,r.width),height:je(i,1.5,r.height)}}let n=fi({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"?xs(o):ws(e)?Ns(o):o}function ju(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 Xu(e,t,o,r){if(!(!r||!br(e))&&ks(e,t)==="sfp")return ju(o)}function br(e){return typeof e.position?.xPercent=="number"&&typeof e.position?.yPercent=="number"}function Yu(e,t,o,r){if(!br(e))return;let n=lo(e.position?.xPercent),a=lo(e.position?.yPercent),i=r?.width??t,s=r?.height??o,c=r?.offsetX??0,d=r?.offsetY??0;return {x:c+i*n/100,y:d+s*a/100}}function hs(e,t,o,r){let n=wi(t),a=e.flatMap(h=>h.ports.filter(x=>!Bo(x)).map(x=>Yu(x,t,o,r)).filter(x=>x!==void 0));if(a.length<2)return n;let i=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Math.max(n.height*.75,3),d=Math.max(n.width*.75,3);for(let h=0;h<a.length;h+=1){let x=a[h];for(let P=h+1;P<a.length;P+=1){let E=a[P],D=Math.abs(x.x-E.x),y=Math.abs(x.y-E.y);y<=c&&D>0&&(i=Math.min(i,D)),D<=d&&y>0&&(s=Math.min(s,y));}}let f=r?je(n.width*.65,2.5,4.5):2,g=r?je(n.height*.95,5,7.5):2,l=r?n.width*.9:n.width,u=Number.isFinite(i)?je(i-f,r?2.5:3,l):l,m=r?Math.min(n.height*.48,u*.88):n.height,w=Number.isFinite(s)?je(s-g,r?1.5:3,m):m;return {width:u,height:w}}function Ku(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 qu(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 Zu(e,t,o,r,n,a,i,s){if(!e.position)return;if(typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number"){let h=lo(e.position.xPercent),x=lo(e.position.yPercent),P=e.position.side??qu(h,x),E=a?.width??r,D=a?.height??n,y=a?.offsetX??0,R=a?.offsetY??0,_=t/2+ln,M=Math.max(_,r-t/2),F=o/2+ln,A=Math.max(F,n-o/2),L=y+E*h/100,O=R+D*x/100,z=a?L:je(L,_,M),Q=a?O:je(O,F,A);return {position:Ku(P),style:{left:`${z-t/2-ln}px`,top:`${Q-o/2-ln}px`,right:"initial",bottom:"initial",transform:"none"}}}if(!e.position.side)return;let d=e.position.side,f=typeof e.position.offsetPercent=="number"?lo(e.position.offsetPercent):void 0,g=typeof e.position.offsetPx=="number"?e.position.offsetPx:void 0,l=t/2,u=Math.max(l,r-t/2),m=o/2,w=Math.max(m,n-o/2);switch(d){case "top":{let h=g!==void 0?g:r*(f??50)/100,x=je(h,l,u);return {position:Position.Top,style:{top:"0px",left:`${x}px`,right:void 0,bottom:void 0,transform:"translate(-50%, 50%)"}}}case "bottom":{let h=g!==void 0?g:r*(f??50)/100,x=je(h,l,u);return {position:Position.Bottom,style:{bottom:"0px",left:`${x}px`,right:void 0,top:void 0,transform:"translate(-50%, -50%)"}}}case "left":{let h=g!==void 0?g:n*(f??50)/100,x=je(h,m,w);return {position:Position.Left,style:{left:"0px",top:`${x}px`,right:void 0,bottom:void 0,transform:"translate(50%, -50%)"}}}case "right":{let h=g!==void 0?g:n*(f??50)/100,x=je(h,m,w);return {position:Position.Right,style:{right:"0px",top:`${x}px`,left:void 0,bottom:void 0,transform:"translate(-50%, -50%)"}}}default:return}}function Ps(e,t,o,r){let n=o/2,a=Math.max(n,r-o/2);return t===1?(n+a)/2:n+e*(a-n)/(t-1)}function Ds(e,t,o,r){let n=e%2===0,a=Math.ceil(t/2),i=Math.floor(t/2),s=Math.max(n?a:i,1),c=Math.floor(n?e/2:(e-1)/2),d=Ps(c,s,o,r);return n?{position:Position.Top,style:{transform:"translateY(50%)",left:`${d-o/2}px`}}:{position:Position.Bottom,style:{transform:"translateY(-50%)",left:`${d-o/2}px`}}}function ys(e,t,o,r,n,a){let i=e%2===0,s=Math.ceil(t/2),c=Math.floor(t/2),d=Math.max(i?s:c,1),f=Math.floor(i?e/2:(e-1)/2),g=Ps(f,d,o,n),l=1,u=je(Math.round(r*.75),1,4),m=Math.max(l,a-r-1),w=je(l+r+u,l,m),h=i?l:w;return {position:Position.Top,style:{transform:"none",left:`${g-o/2}px`,top:`${h}px`,right:void 0,bottom:void 0}}}function Ju(e,t,o,r,n){let a=Ni(e,n),i=Wt(a),s;if(r<=20){let f=Math.max(2,r-i.height-2);s=`${o<=1?(2+f)/2:2+t*(f-2)/(o-1)}px`;}else s=`${25+t*50}%`;return {position:Position.Right,style:{transform:"translateX(-50%)",top:s,width:`${i.width}px`,height:`${i.height}px`,background:i.color,border:`1px solid ${i.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:i.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:i.borderRadius,clipPath:i.clipPath}}}function Qu(e,t,o,r){if(t===1){let n=Math.max(6,Math.round(r*.04)),a=Math.max(o/2,r-n-o/2);return {position:Position.Top,style:{transform:"translateY(50%)",left:`${a}px`,right:void 0}}}return Ds(e,t,o,r)}function ep(e,t,o,r,n,a,i,s,c){if(s==="patch-panel"||s==="switch")return Ds(t,o,r,a);if(Bo(e)){let g=Ni(e,c),l=Wt(g),u;if(i<=20){let h=Math.max(2,i-l.height-2);u=`${o<=1?(2+h)/2:2+t*(h-2)/(o-1)}px`;}else u=`${25+t*50}%`;return {position:Position.Left,style:{transform:"translateX(50%)",top:u,width:`${l.width}px`,height:`${l.height}px`,background:l.color,border:`1px solid ${l.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:l.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:l.borderRadius,clipPath:l.clipPath}}}return {position:Position.Right,style:{transform:"translate(-50%, -50%)",top:`${je(o<=1?i/2:n/2+t*Math.max(i-n,0)/Math.max(o-1,1),n/2,Math.max(n/2,i-n/2))}px`}}}function tp(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 op=({id:e,data:t,selected:o})=>{let r=useUpdateNodeInternals(),{highlightedPortHandles:n,onPortClick:a,portClickEnabled:i}=mi(),{label:s,status:c="active",deviceType:d="server",manufacturer:f,uHeight:g=1,width:l="full",face:u,rackWidthPx:m,frontImageUrl:w,rearImageUrl:h,imageFit:x,imagePosition:P,imageRepeat:E,stretchToFit:D,showDeviceImages:y=true}=t,{ports:R,rearPorts:_}=ue.useMemo(()=>Le(t),[t]),M=$u(d),F=m??300,A=t.isRackMounted===true&&x===void 0&&D!==true,L=ue.useMemo(()=>cs(A?"fill":x,D),[x,A,D]),O=ue.useMemo(()=>fs(w),[w]),z=ue.useMemo(()=>fs(h),[h]),Q=gs(O),re=gs(z),I=Ie(t),H=Ge(t),Z=zu(u,R,_,w,h),V=ue.useMemo(()=>I?Mo(H):[Z],[I,H,Z]),j=V[0]??Z,X=I&&H==="both",we=t.isRackMounted===true?Gt(t):20,ee=g*we,Ne=It(t),fe=F+Ne,ne=ue.useMemo(()=>Wa(F,{isRackMounted:t.isRackMounted,splitFaceLayout:I,deviceWidth:l}),[t.isRackMounted,F,I,l]),me=ue.useMemo(()=>pi(ne,ee,Q,L,P??"center"),[ne,ee,Q,L,P]),De=ue.useMemo(()=>pi(ne,ee,re,L,P??"center"),[ne,ee,re,L,P]),Xe=ue.useMemo(()=>j==="rear"?De:me,[j,me,De]),wo=y&&(j==="rear"?!!z:!!O),tt=t.isRackMounted===true&&wo&&!X,le=j==="rear"?_:R,Yt=ue.useMemo(()=>le.flatMap(G=>G.ports).filter(G=>!Bo(G)),[le]),No=ue.useMemo(()=>!tt||!((M==="switch"||M==="patch-panel"||M==="router")&&Yt.length>=24)?false:Yt.every(J=>br(J)),[Yt,M,tt]),Fr=ue.useMemo(()=>[I?"split":"single",H,V.join(","),j,M,s,L,P??"center",me?`${me.width}:${me.height}:${me.offsetX}:${me.offsetY}`:"",De?`${De.width}:${De.height}:${De.offsetX}:${De.offsetY}`:"",ee.toString(),ne.toString(),fe.toString(),ms(R),ms(_)].join("|"),[I,H,V,j,M,s,L,P,me,De,ee,ne,fe,R,_]);Au(()=>{r(e);},[Fr,e,r]);let oe=ue.useCallback(G=>{let J=G==="rear"?z:O;return J?{backgroundImage:Bu(J),backgroundSize:L==="100% 100%"?Fu:L,backgroundPosition:P??"center",backgroundRepeat:E??"no-repeat"}:{}},[z,O,L,P,E]),Dt=ue.useMemo(()=>oe("front"),[oe]),Ct=ue.useMemo(()=>oe("rear"),[oe]),he=j==="rear"?Ct:Dt,Me=ue.useMemo(()=>Ou(L),[L]),Et,ft;if(I)Et=`${Ua(t,t)+4}px`,ft=void 0;else {let G=F+4,J=Math.floor(F/2);Et=l==="half"?`${J}px`:`${G}px`,ft=l==="half"?`${J}px`:void 0;}let _r=M==="server"&&g===1,ot=xt(c),Rt={"--rn-device-bg-image":y&&!X?String(he.backgroundImage??"none"):"none","--rn-device-bg-position":String(he.backgroundPosition??"center"),"--rn-device-bg-repeat":String(he.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(he.backgroundSize??"cover"),"--rn-device-border-color":ot,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${ee}px`,"--rn-device-left":ft??"auto","--rn-device-status-color":ot,"--rn-device-translate-y":_r?"-1px":"0px","--rn-device-width":Et},qe=ue.useMemo(()=>{if(!tt)return;let G={position:"absolute",top:"2px",zIndex:2,padding:0,justifyContent:"flex-start",pointerEvents:"none"},J=g>1?24:8;if(!Xe)return No?{...G,display:"none"}:{...G,left:"4px",right:`${J}px`,alignItems:"flex-start"};let be=4,xe=Math.max(0,Math.floor(Xe.offsetX)-be),Fe=Math.max(0,Math.floor(ne-(Xe.offsetX+Xe.width))-be);if(Math.max(xe,Fe)>=56){let rt=Fe>xe;return {...G,left:rt?"auto":`${be}px`,right:rt?`${be}px`:"auto",width:`${Math.max(48,Math.max(xe,Fe))}px`,alignItems:rt?"flex-end":"flex-start"}}return No?{...G,display:"none"}:{...G,left:"4px",right:`${J}px`,alignItems:"flex-start"}},[Xe,ne,No,g,tt]),Hr=ue.useMemo(()=>{let G=new Set;for(let J of R)for(let be of J.ports)G.add(yi(J.name,be));return G},[R]),ye=ue.useMemo(()=>{let G=new Set;for(let J of _)for(let be of J.ports)G.add(yi(J.name,be));return G},[_]),Ce=ue.useCallback((G,J,be=false)=>J==="rear"&&(X||be)&&Hr.has(G)?Xr(G,"rear"):J==="front"&&be&&ye.has(G)?Xr(G,"front"):G,[Hr,ye,X]),gt=ue.useCallback((G,J,be=0,xe=ne,Fe=false)=>{let rt=[];if(G.length===0)return rt;let nt=J==="rear"?De:me,Kt=wi(xe),Mr=!!(nt&&G.some(se=>se.ports.some(Ae=>!Bo(Ae)&&br(Ae)))),{width:Zo,height:Jo}=M==="switch"||M==="patch-panel"?Mr?hs(G,xe,ee,nt):wi(xe):hs(G,xe,ee,nt),xo=G.reduce((se,Ae)=>se+Ae.ports.length,0),st=(M==="switch"||M==="patch-panel")&&xo>=24,Ar=M!=="switch"&&M!=="patch-panel"&&xo>=24;for(let se of G)for(let Ae=0;Ae<se.ports.length;Ae+=1){let ge=se.ports[Ae],$r=yi(se.name,ge),ct=Bo(ge),At=ks(ge,se.name),We=Zo,Ze=Jo;if(ct){let te=Ni(ge,s),Lt=Wt(te);We=Lt.width,Ze=Lt.height;}else if(ge.type==="usb"){let te=xs(Kt);We=te.width,Ze=te.height;}else if(At==="sfp"||At==="qsfp"||At==="osfp"){let te=bs(ge,se.name,Kt,nt);nt&&br(ge)?We=Ar?Zo:te.width:We=te.width,Ze=te.height;}else if(At==="rj45"||At==="console"){let te=bs(ge,se.name,Kt,nt);We=te.width,Ze=te.height;}else if(ws(ge)){let te=Ns(Kt);We=te.width,Ze=te.height;}let Qo=Gu(ge),Lr=ge.connected?Qo:Su,Br=Vu(We,Ze,Qo,Lr),er=J==="front"?ct?Ju(ge,Ae,se.ports.length,ee,s):st?ys(Ae,se.ports.length,We,Ze,xe,ee):Qu(Ae,se.ports.length,We,xe):!ct&&st?ys(Ae,se.ports.length,We,Ze,xe,ee):ep(ge,Ae,se.ports.length,We,Ze,xe,ee,M,s),Ye=Zu(ge,We,Ze,xe,ee,nt),Ke=Ye?ct?{position:Ye.position,style:{...er.style,...Ye.style}}:Ye:er,mt=Xu(ge,se.name,Ke.position,nt),ko=mt?{"--rn-hit-expand-top":`${mt.top}px`,"--rn-hit-expand-right":`${mt.right}px`,"--rn-hit-expand-bottom":`${mt.bottom}px`,"--rn-hit-expand-left":`${mt.left}px`}:{},Or=mt?"rn-port-hitbox":void 0,Oe={...{...Br,...Ke.style,...ko}};Oe.left!==void 0&&be!==0&&(typeof Oe.left=="number"?Oe.left=`${Oe.left+be}px`:Oe.left=`calc(${Oe.left} + ${be}px)`),X&&Oe.left===void 0&&(Ke.position===Position.Left?(Oe.left=`${be}px`,Oe.right=void 0):Ke.position===Position.Right&&(Oe.left=`${be+xe}px`,Oe.right=void 0));let $t=Ce($r,J,Fe),bt=!Fe&&bi(n,e,$t),Te=Fe?{opacity:0,pointerEvents:"none"}:{},Po=[Or,Fe?"rn-port-handle--ghost":void 0,!Fe&&i?"rn-port-handle--clickable":void 0,bt?"rn-port-handle--highlighted":void 0].filter(Boolean).join(" "),K=tp(ct,M,J,ge.connected);if(K.secondary){let te=M==="switch"||M==="router"?{...Oe,background:"transparent",border:"none",opacity:0}:Oe,Lt=M==="switch"||M==="router"?`${se.name} - ${ge.label} (input) ${ge.connected?"(connected)":"(disconnected)"}`:`${se.name} - ${ge.label} (${K.secondary}) ${ge.connected?"(connected)":"(disconnected)"}`;rt.push(jsx(Handle,{id:`${$t}-${K.secondary}`,type:K.secondary,position:Ke.position,className:[Or,Fe?"rn-port-handle--ghost":void 0].filter(Boolean).join(" ")||void 0,style:{...te,...Te},title:Fe?`${Lt} (hidden face)`:Lt},`${$t}-${K.secondary}`));}rt.push(jsx(Handle,{id:$t,type:K.primary,position:Ke.position,className:Po||void 0,style:{...Oe,...Te},title:`${se.name} - ${ge.label} ${ge.connected?"(connected)":"(disconnected)"}${Fe?" (hidden face)":""}`,onClick:!Fe&&i&&a?te=>{te.stopPropagation(),a({nodeId:e,handleId:$t,groupName:se.name,portLabel:ge.label,face:J});}:void 0,children:ct&&!Fe?Ae+1:void 0},$t));}return rt},[ee,ne,me,n,e,s,M,a,i,De,Ce,X]),qo=ue.useMemo(()=>{let G=[];for(let J of V){if(J==="front"&&R.length>0){let be=X?fe:0;G.push(...gt(R,"front",be,ne));}J==="rear"&&_.length>0&&G.push(...gt(_,"rear",0,ne));}if(M==="patch-panel"){let J=new Set(V);!J.has("front")&&R.length>0&&G.push(...gt(R,"front",0,ne,true)),!J.has("rear")&&_.length>0&&G.push(...gt(_,"rear",0,ne,true));}return G},[V,R,_,gt,ne,X,fe,M]);return jsxs("div",{className:`device-node ${o?"selected":""} ${X?"device-node--split-both":""}`,style:Rt,children:[y&&!X&&wo&&jsx("div",{className:"device-node__image-layer","aria-hidden":"true",children:jsx("img",{className:"device-node__image",src:j==="rear"?z:O,alt:"",draggable:false,style:{objectFit:Me,objectPosition:P??"center"}})}),y&&X&&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:`${F}px`,backgroundImage:String(Ct.backgroundImage??"none"),backgroundPosition:String(Ct.backgroundPosition??"center"),backgroundRepeat:String(Ct.backgroundRepeat??"no-repeat"),backgroundSize:String(Ct.backgroundSize??"cover")},children:z?jsx("img",{className:"device-node__image",src:z,alt:"",draggable:false,style:{objectFit:Me,objectPosition:P??"center"}}):null}),jsx("div",{className:"device-node__face-bridge","data-testid":"device-face-bridge",style:{width:`${Ne}px`},children:jsx("div",{className:"device-node__face-bridge-line"})}),jsx("div",{className:"device-node__split-face device-node__split-face--front",style:{width:`${F}px`,backgroundImage:String(Dt.backgroundImage??"none"),backgroundPosition:String(Dt.backgroundPosition??"center"),backgroundRepeat:String(Dt.backgroundRepeat??"no-repeat"),backgroundSize:String(Dt.backgroundSize??"cover")},children:O?jsx("img",{className:"device-node__image",src:O,alt:"",draggable:false,style:{objectFit:Me,objectPosition:P??"center"}}):null})]}),jsxs("div",{className:`device-node__content ${tt?"device-node__content--image-badge":""}`,style:qe??{position:"relative",zIndex:1},children:[jsx("div",{className:`device-node__label ${tt?"device-node__label--badge":""}`,children:s}),!tt&&g>1&&jsx("div",{className:"device-node__manufacturer",children:f})]}),g>1&&jsxs("div",{className:"device-node__u-indicator",children:[g,"U"]}),jsx("div",{className:"device-node__status-indicator"}),qo]})},Oo=ue.memo(op,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var pn=20,zo=3,gn=2,np=1,ki=2,Es=6,ip=12;function xi(e){return Math.max(0,Math.min(100,e))}function Pi(e,t,o){return Math.max(t,Math.min(o,e))}function ap(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 fn(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 sp(e,t){let o=fn(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 cp(e){if(Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0)return e.pduPortGroups;let t=Qn(e);if(t.length>0)return t;let o=Jn(e);return o.length>0?o:[]}function dp(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>fn(vt(r))??"C13"):Array.from({length:t},(o,r)=>{let n=fn(e.portTypes?.[r]);return n||(fn(vt(r))??"C13")})}function lp(e,t){let o=cp(e),r=dp(e,t);if(o.length===0)return Array.from({length:t},(i,s)=>({id:`${s+1}`,label:`${s+1}`,connectorType:r[s]??"C13",groupName:"Power"}));let n=[],a=0;return o.forEach(i=>{i.ports.forEach(s=>{let c=r[a]??"C13";n.push({id:yt(i.name,s),label:s.label,connectorType:sp(s,c),groupName:i.name,position:it(s.position)}),a+=1;});}),n}function up(e){return Wt(e.connectorType).height}function pp(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t:Math.floor(t/2)}function Rs(e,t){let o=[],r=t>=0,n=r?Pi(t,0,e.length):-1;for(let a=0;a<=e.length;a+=1)r&&a===n&&o.push({kind:"mgmt",height:ip}),a<e.length&&o.push({kind:"port",portIndex:a,height:up(e[a]),groupName:e[a].groupName});return o}function Ts(e,t){return e.kind==="port"&&t.kind==="port"?e.groupName===t.groupName?ki:Es:ki}function fp(e,t){let o=Rs(e,t);if(o.length===0)return Math.max(gn+zo+1,1);let r=0;for(let n=0;n<o.length;n+=1)r+=o[n].height,n<o.length-1&&(r+=Ts(o[n],o[n+1]));return gn+r+zo}function gp(e,t,o){let r=Rs(e,o);if(r.length===0)return {portCenters:[]};let n=[];for(let w=0;w<r.length-1;w+=1)n.push(Ts(r[w],r[w+1]));let a=r.reduce((w,h)=>w+h.height,0),i=n.reduce((w,h)=>w+h,0),s=a+i,c=Math.max(t-gn-zo,1),d=0,f=n,g=Math.max(0,c-s);if(g>0)if(n.length===0)d=g/2;else {let w=n.map(x=>x===Es?1.2:1),h=w.reduce((x,P)=>x+P,0);f=n.map((x,P)=>h<=0?x:x+g*w[P]/h);}let l=[],u,m=gn+d;for(let w=0;w<r.length;w+=1){let h=r[w],x=m+h.height/2;h.kind==="mgmt"?u=x:l[h.portIndex]=x,m+=h.height,w<r.length-1&&(m+=f[w]??ki);}return {portCenters:l,mgmtCenterY:u}}function mp(e,t,o,r,n,a){if(!e)return {position:Position.Right,leftPx:Math.round((r-n)/2)-1,topPx:t-a/2};let i=e.side,s=i==="left"?Position.Left:i==="top"?Position.Top:i==="bottom"?Position.Bottom:Position.Right,c=typeof e.offsetPercent=="number"?xi(e.offsetPercent):void 0,d=typeof e.offsetPx=="number"?e.offsetPx:void 0,f=typeof e.xPercent=="number"?xi(e.xPercent):void 0,g=typeof e.yPercent=="number"?xi(e.yPercent):void 0;if(f!==void 0&&g!==void 0){let m=i??ap(f,g),w=m==="left"?Position.Left:m==="top"?Position.Top:m==="bottom"?Position.Bottom:Position.Right,h=Math.max(o-zo,1),x=r*f/100,P=Pi(h*g/100,a/2,Math.max(a/2,o-a/2));return {position:w,leftPx:x-n/2,topPx:P-a/2}}let l=f!==void 0?r*f/100:r-n/2-1,u=g!==void 0?Math.max(o-zo,1)*g/100:t;return i==="top"||i==="bottom"?(d!==void 0?l=d:c!==void 0&&(l=r*c/100),u=i==="top"?a/2:o-a/2):(d!==void 0?u=d:c!==void 0&&(u=Math.max(o-zo,1)*c/100),i==="left"?l=n/2:i==="right"&&(l=r-n/2-1)),u=Pi(u,a/2,Math.max(a/2,o-a/2)),{position:s,leftPx:l-n/2,topPx:u-a/2}}function bp(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 hp=({data:e,selected:t})=>{let{label:o,status:r="active",heightCm:n=100,powerPorts:a=36,widthPx:i=15,mgmt_unit:s}=e,c=Math.max(0,a),d=lp(e,c),f=pp(s,d.length),g=n*4.2,l=fp(d,f),u=Math.max(g-pn,l),m=Math.max(i-np*2,1),w=pn+u,h=gp(d,u,f);return jsxs("div",{className:`vertical-pdu-node ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${xt(r)}`,borderRadius:"2px",padding:0,width:`${i}px`,height:`${w}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:`${pn}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:`${w-pn}px`,overflow:"hidden"},children:[typeof h.mgmtCenterY=="number"?bp(h.mgmtCenterY,m):null,d.map((x,P)=>{let E=h.portCenters[P]??u/2,D=Wt(x.connectorType),y=mp(x.position,E,u,m,D.width,D.height);return jsx(Handle,{type:"source",position:y.position,id:x.id,style:{position:"absolute",left:`${y.leftPx}px`,top:`${y.topPx}px`,right:"initial",bottom:"initial",width:`${D.width}px`,height:`${D.height}px`,background:D.color,border:`1px solid ${D.borderColor}`,boxSizing:"border-box",transform:"none",cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:D.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:D.borderRadius,clipPath:D.clipPath},title:`${x.groupName} - ${x.label} (${x.connectorType})`,children:x.label},`handle-${x.id}`)})]})]})},Ci=ue.memo(hp,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var Ei=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:n="single",ribbonFiberIds:a}=e||{},i=useEdges(),s=i.find(y=>y.target===o&&y.targetHandle==="left"),c=i.find(y=>y.source===o&&y.sourceHandle==="right"),d=i.find(y=>y.target===o&&y.targetHandle==="right"),f=c||d,g=s?.data?.color||"#555",l=f?.data?.color||"#555",u=n==="ribbon",m=s?.data?.ribbonFiberIds||a,w=f?.data?.ribbonFiberIds||a,h=u&&m?_t(m):null,x=u&&w?_t(w):null,P=!!s&&!!f;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&&h&&x?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:h.map((y,R)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`left-${R}`))}),jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:x.map((y,R)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`right-${R}`))})]}):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:g}}),jsx("div",{style:{background:l}})]}),jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),P&&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}}),P&&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&&a&&jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[a.length,"F"]})]}),jsx(Handle,{type:"source",position:Position.Left,id:"left",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:{width:12,height:u&&h?20:12,borderRadius:u&&h?"6px":"50%",border:"none",background:u&&h?`linear-gradient(to bottom, ${h.map(y=>y.base).join(", ")})`:g,zIndex:100,cursor:"crosshair",left:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"source",position:Position.Right,id:"right",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:{width:12,height:u&&x?20:12,borderRadius:u&&x?"6px":"50%",border:"none",background:u&&x?`linear-gradient(to bottom, ${x.map(y=>y.base).join(", ")})`:l,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var Nr=20,mn=36;var uo=32,Ss=4,jt=12,wp=69,po=80,Ri=(po-wp)/2;var Ti=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",a=n?mn:Nr,i=n?32:16,s=uo,c=o.y-s,d=Math.round(c/a)+1,g=Math.max(1,Math.min(jt,d));if(!wr(t,e,g,r)){let m=xr(t,e,r,g);if(m!==g){let w=(a-i)/2;return {x:Ri,y:s+(m-1)*a+w,holderPosition:m}}}let l=(a-i)/2,u=s+(g-1)*a+l;return {x:Ri,y:u,holderPosition:g}},wr=(e,t,o,r)=>!r.filter(a=>a.parentId===e.id&&a.type==="splice"&&a.id!==t.id).some(a=>a.data.holderPosition===o),xr=(e,t,o,r=1)=>{for(let n=r;n<=jt;n++)if(wr(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(wr(e,t,n,o))return n;return 1},Np=(e,t)=>kr(e,t,false),kr=(e,t,o=false)=>{let r=uo,n=o?mn:Nr,i=(n-(o?32:16))/2,s=r+(t-1)*n+i;return {x:Ri,y:s}};var Si=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,n]=useState(false),a=()=>{if(!r)return null;let i=[],s=uo;for(let c=1;c<=jt;c++){let d=s+(c-1)*Nr;i.push(jsxs("div",{style:{position:"absolute",left:"-35px",top:`${d}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:`${Nr}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",c]},c));}return i};return jsxs("div",{className:`splice-tray-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${po}px`,height:`${uo+jt*mn+Ss}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:`${uo}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:i=>{i.stopPropagation();},onMouseDown:i=>{i.stopPropagation();},onClick:i=>{i.stopPropagation(),i.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"})]}),a(),jsx("div",{style:{position:"absolute",top:uo,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var Fi=({data:e,selected:t,id:o})=>{let{fibersPerTube:r=12,tubeIndex:n=1,startOn:a="left-center"}=e||{},i=e?.mode==="ribbon"||e?.ribbon===true,s=useEdges(),c=jn(n),d=s.find(z=>z.source===o&&z.sourceHandle===c||z.target===o&&z.targetHandle===c),f=d?.data?.color,g=Ve((n-1)%12+1),l=f||g,u=Math.max(1,Math.min(24,Number(r)||12)),m=14,w=4,h=1,x=2,P=20,E=u*m+(u-1)*w,D=Math.max(60,E+h*2+x*2),y=a==="left"?Position.Left:a==="right"?Position.Right:Position.Bottom,R=y!==Position.Bottom,_=R?14:20,M=R?8:20,F=R?`inset ${y===Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",A=d?l:R?`linear-gradient(${y===Position.Left?"to right":"to left"}, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)), ${l}`:`radial-gradient(circle, ${l} 40%, transparent 70%)`,L={width:_,height:M,borderRadius:R?6:"50%",opacity:d?.3:.9,pointerEvents:"auto",background:A,backgroundColor:l,border:d?`2px solid ${l}`:`3px dashed ${l}`,cursor:"crosshair","--fiber-bg":l,boxShadow:d?F:`${F}${F!=="none"?", ":""}0 0 8px ${l}`,transition:"opacity 0.2s, box-shadow 0.2s",...y===Position.Left?{left:-(_-4)}:y===Position.Right?{right:-(_-4)}:{}},O=useMemo(()=>{let z=[],Q=D-x*2-h*2,re,I,H=false;a==="left"?(re=h,I=Position.Top):a==="right"?(re=h+Q-E,I=Position.Top,H=true):(re=h+(Q-E)/2,I=Position.Top);for(let Z=0;Z<u;Z++){let V=H?u-Z:Z+1,j=To(V),X=s.find(Xe=>Xe.source===o&&Xe.sourceHandle===j||Xe.target===o&&Xe.targetHandle===j),we=!!X&&(X.data?.isRibbon||X.data?.ribbonFiberIds&&Array.isArray(X.data.ribbonFiberIds)),ee=X?.data?.color,Ne=typeof X?.data?.striped=="boolean"?X.data.striped:void 0,fe=Ft(V);i||we?fe=Ft(V,{base:"#808080",striped:false}):(ee||Ne!==void 0)&&(fe=Ft(V,{...ee?{base:ee}:{},...Ne!==void 0?{striped:Ne}:{}}));let ne=re+Z*(m+w),me=h,De={position:"absolute",left:`${ne}px`,top:`${me}px`,width:m,height:m,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":fe.base,backgroundColor:fe.base};fe.backgroundImage&&(De["--fiber-bg-image"]=fe.backgroundImage),z.push(jsx(Handle,{id:j,type:"source",position:I,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:De,"data-fiber-idx":V,"data-fiber-color":fe.base},`fiber-${V}`));}return z},[u,a,D,s,o,m,w,h,x,E,i]);return jsxs("div",{style:{width:D,height:P,borderRadius:4,background:"#111827",border:`${x}px solid ${t?"#3b82f6":l}`,position:"relative",boxShadow:t?`0 0 0 ${x}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:h,boxSizing:"border-box",overflow:"visible"},children:[O,jsx(Handle,{id:c,type:"source",position:y,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,className:"tube-connection-handle",style:L,"data-tube-idx":n,"data-tube-color":l,title:d?"Connected - drag to reconnect":"Drag to connect cable tube"})]})};var _i=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:n,color:a,rotation:i}=e||{},s=ue.useRef(null);ue.useEffect(()=>{if(s.current){let I=typeof i=="number"?i:0;s.current.style.transform=`rotate(${I}deg)`,s.current.style.transformOrigin="center center";}},[i]);let c=Math.max(1,Math.min(24,Number(o)||12)),d=10,f=2,g=6,l=g+d+4,u=60,m=Math.max(120,c*(d+f)+g*2),h=n??`${c}f Cable`,x=r?`Cable ID ${r}`:void 0,P=Ve(1),E=a||P,D=t?"#3b82f6":E,y=typeof i=="number"?i:0,R=I=>{let H=(I%360+360)%360;return H>=315||H<45?Position.Top:H>=45&&H<135?Position.Right:H>=135&&H<225?Position.Bottom:Position.Left},_=()=>{let I=[],H=R(y);for(let Z=0;Z<c;Z++){let V=Z+1,j=Ft(V),X=j.base,we=g+Z*(d+f),ee=-5,Ne=j.backgroundImage?j.backgroundImage:X,fe={position:"absolute",left:`${we}px`,top:`${ee}px`,width:d,height:d,borderRadius:"50%",border:"none",background:Ne,backgroundColor:X,zIndex:10,cursor:"pointer","--fiber-bg":X};j.backgroundImage&&(fe["--fiber-bg-image"]=j.backgroundImage);let ne=`fiber-${V}`;I.push(jsx(Handle,{id:ne,type:"source",position:H,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:fe,"data-fiber-idx":V,"data-fiber-color":X},`fiber-${V}`));}return I},M="cable-button",F=8,A={width:F,height:F,borderRadius:"50%",background:E,backgroundColor:E,border:`1px solid ${E}`,cursor:"pointer",zIndex:10},L=2,z=(I=>{let H=(I%360+360)%360;return H>=315||H<45?Position.Bottom:H>=45&&H<135?Position.Left:H>=135&&H<225?Position.Top:Position.Right})(y),Q={width:m,height:u,position:"relative",transform:`rotate(${y}deg)`,transformOrigin:"center center","--rotation":`${y}deg`},re={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${L}px solid ${D}`,boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:g,paddingTop:l,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:Q,children:jsxs("div",{style:re,children:[_(),jsx(Handle,{id:M,type:"source",position:z,className:"cable-button-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:A,"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:h}),x&&jsx("div",{style:{fontSize:10,opacity:.8},children:x})]})]})})};var Hi=({data:e,selected:t})=>{let{tubeCount:o=12,fibersPerTube:r=12,fiberCount:n,cableId:a="CBL-002",label:i,tubeStartIndex:s=1,color:c}=e||{},d=Math.max(1,Math.min(24,Number(o)||12)),f=Math.max(1,Number(s)||1),g=14,l=10,u=3,m=6,w=m+l+4,h=60,x=Math.max(120,d*(g+u)+m*2),P=n??d*(Number(r)||12),E=i??`${P}f Cable`,D=a?`Cable ID ${a}`:void 0,y=Ve(f),R=c||y,_=t?"#3b82f6":R,M=()=>{let z=[];for(let Q=0;Q<d;Q++){let re=f+Q,I=Ft(re),H=I.base,Z=m+Q*(g+u),V=-5,j=I.backgroundImage?I.backgroundImage:H,X={position:"absolute",left:`${Z}px`,top:`${V}px`,width:g,height:l,borderRadius:6,border:"none",background:j,backgroundColor:H,zIndex:10,cursor:"pointer","--fiber-bg":H};I.backgroundImage&&(X["--fiber-bg-image"]=I.backgroundImage);let we=`tube-${re}`;z.push(jsx(Handle,{id:we,type:"source",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:X,"data-fiber-idx":re,"data-tube-idx":re,"data-tube-color":H},`tube-${re}`));}return z},F="cable-button",A=8,L={width:A,height:A,borderRadius:"50%",background:R,backgroundColor:R,border:`1px solid ${R}`,cursor:"pointer",zIndex:10};return jsxs("div",{style:{width:x,height:h,borderRadius:4,background:"#111827",border:`2px solid ${_}`,position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:m,paddingTop:w,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[M(),jsx(Handle,{id:F,type:"source",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:L,"data-handle-type":"cable-button","data-cable-color":R}),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}),D&&jsx("div",{style:{fontSize:10,opacity:.8},children:D})]})]})};var Mi=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:n,label:a,portLabelsLeft:i,portLabelsRight:s}=e||{},c=useEdges(),d=typeof n=="number"&&[1,2,4].includes(n)?n:2,f=Math.max(1,Math.min(4,d)),g=9,l=3,u=3,m=60,w=30,h=f*g+(f-1)*l,x=Math.max(w,h+u*2),P=Math.max(m,80),E=(R,_)=>{let M=sr(R,_+1);return c.find(A=>A.source===o&&A.sourceHandle===M||A.target===o&&A.targetHandle===M)?.data?.color||"#555"},D=R=>{let _=[],M=R==="left"?Position.Left:Position.Right,F=R==="left"?i:s;for(let A=0;A<f;A++){let L=A+1,O=sr(R,L),z=E(R,A),I=u+(x-h)/2+A*(g+l),H={position:"absolute",left:R==="left"?-5:void 0,right:R==="right"?-5:void 0,top:`${I}px`,width:g,height:g,borderRadius:"50%",border:"none",background:z,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};_.push(jsx(Handle,{id:O,type:"source",position:M,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:H},O)),F&&F[A]&&_.push(jsx("div",{style:{position:"absolute",left:R==="left"?-30:void 0,right:R==="right"?-30:void 0,top:`${I}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:R==="left"?"right":"left",width:"25px"},children:F[A]},`${O}-label`));}return _},y=a||`${r}-${f}f`;return jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:P,height:x,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:[D("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})}),D("right")]})};var go=32,Nn=30,Tp=24,vp=80,yn=400,wn=300,Gs=2,fo=8,Vs=120;function $i(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,a=3,i=3,s=60,c=30,d=r*n+(r-1)*a,f=Math.max(c,d+i*2);return {width:Math.max(s,80),height:f}}function xn(e){let{fibersPerTube:t=12}=e.data||{},o=Math.max(1,Math.min(24,Number(t)||12)),r=14,n=4,a=1,i=2,s=20,c=o*r+(o-1)*n;return {width:Math.max(60,c+a*2+i*2),height:s}}function js(e){return {width:po,height:0}}function Xs(e){return e.type==="coupler"?$i(e):e.type==="tube"?xn(e):e.type==="splice-tray"?js():{width:80,height:30}}function Ai(e){let t=0;for(let o of e){let r=Xs(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function Ys(e,t=0){let o=t;for(let r of e){let n=Xs(r),a=(r.position?.y||0)+n.height;a>o&&(o=a);}return o}function Ks(e){return e.data?.panelWidth||yn}function Ip(e){return e.data?.panelHeight||wn}function qs(e){return Ks(e)-Gs*2-fo*2}function Sp(e,t){return qs(e)-t}function Zs(e,t=Nn){return Math.floor(e/t)+1}function Js(e,t=Nn){return (e-1)*t}function Fp(e,t,o){let r=Nn,n=Zs(o.y,r),a=Js(n,r);return {x:o.x,y:a,slotPosition:n}}function Li(e,t){if(t.length===0)return {width:e.data?.panelWidth||yn,height:e.data?.panelHeight||wn};let o=t.some(c=>c.type==="tube"),r=t.some(c=>c.type==="splice-tray"),n=t.some(c=>c.type==="coupler"),a;if(o&&r&&n){let c=0,d=0;for(let l of t)if(l.type==="tube"){let u=xn(l);u.width>c&&(c=u.width);}else if(l.type==="coupler"){let u=$i(l);u.width>d&&(d=u.width);}let f=c+Vs+po+d+_o,g=0;a=g+f+g;}else a=Ai(t)+4;a=Math.max(e.data?.panelWidth||yn,a);let i=Ys(t,go),s=Math.max(e.data?.panelHeight||wn,i+fo);return {width:a,height:s}}function Qs(e,t,o){if(e===0)return 0;if(e===1)return t;let r=e*t,n=o-r,a=Math.max(5,n/(e-1));return t+a}function _p(e,t,o){return Qs(e,t,o)}var zs=20,Ws=400,Us=300;function Bi(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||Ws,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,d=0,f=t.filter(l=>l.type==="tube"),g=t.filter(l=>l.type==="splice-tray");if(f.length>0&&g.length>0){let l=g.map(m=>m.position?.x||0),u=l.reduce((m,w)=>m+w,0)/l.length;for(let m of f){let w=xn(m);(m.position?.x||0)<u?w.width>s&&(s=w.width):w.width>c&&(c=w.width);}g.length>0&&(d=po),n=fo+s+zs+d+zs+c+_o;}else n=Ai(t)+fo+_o;}else n=Ai(t)+fo+_o;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||Ws,n);let a=Ys(t,go),i=Math.max(e.data?.closureHeight||e.data?.panelHeight||Us,a+fo);return {width:n,height:i}}var Wi=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:n,panelWidth:a,panelHeight:i}=e||{},{getNodes:s,setNodes:c}=useReactFlow(),d=useRef(false),f=useRef([]),g=useMemo(()=>{let E=s().filter(D=>D.parentId===o);return (E.length!==f.current.length||E.some((D,y)=>D.id!==f.current[y]?.id))&&(f.current=E),f.current},[s,o]),l=useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:a,panelHeight:i}}),[o,e,a,i]),u=useMemo(()=>a&&i?{width:a,height:i}:g.length===0?{width:a||400,height:i||300}:Li(l,g),[g,l,a,i]);useEffect(()=>{if(a&&i||d.current)return;let P=a,E=i,D=Math.abs((P||0)-u.width),y=Math.abs((E||0)-u.height);(D>1||y>1)&&(d.current=true,c(R=>R.map(_=>_.id===o?{..._,data:{..._.data,panelWidth:u.width,panelHeight:u.height}}:_)),setTimeout(()=>{d.current=false;},0));},[o,u.width,u.height,a,i,c]);let m=u.width,w=u.height,h=go,x=n||r;return jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${m}px`,height:`${w}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:`${h}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:x})}),jsx("div",{style:{position:"absolute",top:h,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var Vi=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:n,closureWidth:a,closureHeight:i,panelWidth:s,panelHeight:c}=e||{},{getNodes:d,setNodes:f}=useReactFlow(),g=useRef(false),l=useRef([]),u=useMemo(()=>{let R=d().filter(_=>_.parentId===o);return (R.length!==l.current.length||R.some((_,M)=>_.id!==l.current[M]?.id))&&(l.current=R),l.current},[d,o]),m=useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:a||s,closureHeight:i||c}}),[o,e,a,i,s,c]),w=useMemo(()=>a&&i?{width:a,height:i}:s&&c?{width:s,height:c}:u.length===0?{width:a||s||400,height:i||c||300}:Bi(m,u),[u,m,a,i,s,c]);useEffect(()=>{if(a&&i||s&&c||g.current)return;let y=a||s,R=i||c,_=Math.abs((y||0)-w.width),M=Math.abs((R||0)-w.height);(_>1||M>1)&&(g.current=true,f(F=>F.map(A=>A.id===o?{...A,data:{...A.data,closureWidth:w.width,closureHeight:w.height}}:A)),setTimeout(()=>{g.current=false;},0));},[o,w.width,w.height,a,i,s,c,f]);let h=w.width,x=w.height,P=go,E=n||r,D=h/2;return jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${D}px ${D}px 12px 12px`,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",overflow:"hidden"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${P}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:`${D}px ${D}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:E})}),jsx("div",{style:{position:"absolute",top:P,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var ji=({data:e,selected:t,id:o})=>{let{label:r,splitterType:n="splitter",inputCount:a=1,outputCount:i=8}=e||{},s=useEdges(),c=r||(n==="WDM"?"WDM":"Splitter"),d=9,f=3,g=3,l=50,u=30,m=Math.min(Math.max(a||1,1),2),w=m*d+(m-1)*f,h=Math.min(i||8,48),x=h*d+(h-1)*f,P=Math.max(w,x),E=Math.max(u,P+g*2),D=Math.max(l,50),y=Q=>{let re=Ee(Q);return s.find(H=>H.source===o&&Ee(H.sourceHandle)===re||H.target===o&&Ee(H.targetHandle)===re)?.data?.color||"#555"},R=()=>{let Q=[],re=g+(E-w)/2;for(let I=0;I<m;I++){let H=`input-${I+1}`,Z=re+I*(d+f),V=y(H),j={position:"absolute",left:-5,top:`${Z}px`,width:d,height:d,borderRadius:"50%",border:"none",background:V,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};Q.push(jsx(Handle,{id:H,type:"source",position:Position.Left,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:j},H));}return Q},_=()=>{let Q=[],re=g+(E-x)/2;for(let I=0;I<h;I++){let H=`output-${I+1}`,Z=re+I*(d+f),V=y(H),j={position:"absolute",right:-5,top:`${Z}px`,width:d,height:d,borderRadius:"50%",border:"none",background:V,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};Q.push(jsx(Handle,{id:H,type:"source",position:Position.Right,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:j},H));}return Q},M=Math.max(w+g*4,u*.6),F=(E-M)/2,A=F+M,L=0,O=E,z=t?"#3b82f6":"#4b5563";return jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:D,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:`${g}px`,boxSizing:"border-box"},children:[jsx("svg",{width:D,height:E,viewBox:`0 0 ${D} ${E}`,style:{position:"absolute",top:0,left:0,width:`${D}px`,height:`${E}px`,pointerEvents:"none",zIndex:0},children:jsx("polygon",{points:`0,${F} 0,${A} ${D},${O} ${D},${L}`,fill:"#1f2937",stroke:z,strokeWidth:"2"})}),R(),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})}),_()]})};var nc=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",Dr=(e,t)=>nc(e)||nc(t),ce=(e,t)=>t?Ee(t):"";function ic(e,t){if(!e||!t)return "other";let{shape:o}=zt(t);switch(e.type){case "tube":return o.kind==="fiber"?"tube-fiber":o.kind==="tube"?"tube-tube":"other";case "cable":return o.kind==="fiber"?"tube-fiber":o.kind==="cable-button"?"cable-button":"other";case "multi-tube-cable":return o.kind==="tube"?"cable-tube":o.kind==="cable-button"?"cable-button":"other";case "splice":return o.kind==="splice-side"?"splice-side":"other";case "coupler":return o.kind==="side-port"?"coupler-port":"other";case "fibre-split":return o.kind==="split-io"?o.io==="input"?"splitter-input":"splitter-output":"other";default:return "other"}}var Wp=new Set(["tube-fiber>splice-side","splice-side>tube-fiber","splice-side>coupler-port","coupler-port>splice-side","splice-side>splitter-input","splice-side>splitter-output","splitter-output>splice-side","coupler-port>coupler-port","coupler-port>splitter-input","splitter-input>coupler-port","coupler-port>splitter-output","splitter-output>coupler-port","splitter-output>tube-fiber","tube-fiber>splitter-output","cable-button>cable-button","cable-tube>tube-tube","tube-tube>cable-tube"]);function ac(e){return e==="tube-tube"||e==="cable-tube"}function kn(e,t,o,r){if(e?.type==="splice"&&o?.type==="splice"){let i=e.data?.mode==="ribbon",s=o.data?.mode==="ribbon";if(i!==s)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let n=ic(e,t),a=ic(o,r);return Wp.has(`${n}>${a}`)?{valid:true}:ac(n)&&ac(a)?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}var sc=new WeakMap;function Uo(e){if(typeof e!="string")return;let t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");return t.length>0?t:void 0}function Up(e){let t=new Set;return e.forEach(o=>{o&&t.add(o);}),[...t]}function cc(...e){let t=e.map(o=>Uo(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 Xi(e){let t=[Uo(e.type),Uo(e.cableType),Uo(e.connectorType),Uo(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 Cr(e){if(Array.isArray(e.compatibility)&&e.compatibility.length>0)return Up(e.compatibility.map(o=>Uo(o)));if(e.kind==="power"||Re(e.type)){let o=cc(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(e.kind==="network"){let o=Xi(e);return o?[`network:${o}`]:["network"]}let t=Re(e.type)?"power":Xi(e)?"network":void 0;if(t==="power"){let o=cc(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(t==="network"){let o=Xi(e);return o?[`network:${o}`]:["network"]}return []}function Gp(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 a=vt(n);return {id:`${n+1}`,label:`${n+1}`,connected:false,type:a==="C19"?"power_c19":"power_c13",connectorType:a}})}]}function Vp(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups;let{ports:o,rearPorts:r}=Le(t);return r.length>0?r:o.length>0?o:Gp(e)}function jp(e){let t=e?.data;if(!e||!t||typeof t!="object")return new Map;let o=sc.get(t);if(o)return o;let r=new Map,n=(a,i)=>{i.forEach(s=>{s.ports.forEach(c=>{let d=yt(s.name,{id:c.id,label:c.label,type:Re(c.type)?c.type:void 0});r.set(d,{face:a,kind:Re(c.type)?"power":"network",compatibility:Cr({compatibility:c.compatibility,kind:Re(c.type)?"power":"network",type:c.type,cableType:c.cableType,connectorType:c.connectorType,handleId:d})});});});};if(e.type==="vertical-pdu")n("rear",Vp(e));else {let{ports:a,rearPorts:i}=Le(t);n("front",a),n("rear",i);}return sc.set(t,r),r}function Xp(e,t){if(!e)return "unknown";if(t?.type==="vertical-pdu"||ar(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 Yp(e,t,o){if(!e)return [];if(t==="power")return o?.type==="vertical-pdu"&&/^\d+$/.test(e)?Cr({kind:t,connectorType:vt(Math.max(Number(e)-1,0)),handleId:e}):Cr({kind:t,handleId:e});if(t==="network"){let r=e.toLowerCase();return Cr({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 mo(e,t){let o=lt(t);if(!o)return {normalizedHandle:"",kind:"unknown",compatibility:[]};let r=zt(o),n=r.base,a=r.faceAlias,i=jp(e).get(n),f=(e?.data??{}).handleSideMap?.[n]??a??i?.face;f||(n==="net-top"||n==="net-bottom"?f="front":(n==="pwr-left-1"||n==="pwr-left-2"||n==="net-right-1"||n==="net-right-2"||ar(n))&&(f="rear"));let g=i?.kind??Xp(n,e);return {normalizedHandle:n,face:f,kind:g,compatibility:i?.compatibility.length?i.compatibility:Yp(n,g,e)}}function Kp(e,t){if(e.length===0||t.length===0)return true;let o=new Set(t);return e.some(r=>o.has(r))}function Ki(e){let t=new Map;for(let o of e)t.set(o.id,o);return t}function Yi(e,t,o=Ki(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),a=Dr(r,n);if(!a){let f=mo(r,e.sourceHandle),g=mo(n,e.targetHandle),l=f.kind,u=g.kind;if(l!=="unknown"&&u!=="unknown"&&l!==u)return {valid:false,reason:`Cannot connect ${l} handle to ${u} handle`};if(!Kp(f.compatibility,g.compatibility))return {valid:false,reason:`Incompatible endpoints: ${e.sourceHandle} does not match ${e.targetHandle}`};let m=l==="power"&&u==="power",w=r?.type==="vertical-pdu"||n?.type==="vertical-pdu";if(m&&!w)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let i=ce(r,e.sourceHandle),s=ce(n,e.targetHandle),c=false,d=false;for(let f of t.edges)if(!(e.ignoreEdgeId&&f.id===e.ignoreEdgeId)&&(!c&&f.source===e.source&&(c=ce(r,f.sourceHandle)===i),!c&&f.target===e.source&&(c=ce(r,f.targetHandle)===i),!d&&f.target===e.target&&(d=ce(n,f.targetHandle)===s),!d&&f.source===e.target&&(d=ce(n,f.sourceHandle)===s),c&&d))break;return (c||d)&&!a?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`}:a?kn(r,e.sourceHandle,n,e.targetHandle):{valid:true}}function qp(e,t){if(!t)return;let o=mo(t,e).face;return o==="front"||o==="rear"?o:void 0}function qi(e={},t={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},r=Ki(o.nodes),n=new Set;return {getState:()=>o,setState:l=>{o={...o,...l},l.nodes&&(r=Ki(o.nodes)),n.forEach(u=>u(o));},subscribe:l=>(n.add(l),()=>n.delete(l)),selectEdgeZIndex:l=>{let u=P=>{if(typeof P.parentId=="string")return P.parentId;let E=P.parentNode;if(typeof E=="string")return E},m=P=>{let E=u(P),D=E?r.get(E):void 0;return D?.type!=="rack"?[P.data?.face||Fo(P.data)]:D&&Ie(D.data)?Mo(Ge(P.data)):[P.data?.face||Fo(P.data)]},w=(P,E)=>{let D=r.get(P);if(!(!!D&&(D.type==="device"||D.type==="server"||D.type==="switch"||D.type==="router"))||!D||D.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let _=m(D),M=qp(E||"",D);if(M)return _.includes(M)?1e3:500;let F=lt(E),A=F.toLowerCase(),L=A.startsWith("pwr")||A.startsWith("power"),O=A.startsWith("net-")||A.startsWith("port-")||A.startsWith("uplink-")||A.includes("fiber")||A.includes("ports"),z=/^[A-Z0-9]+-\d+$/i.test(F)&&!A.startsWith("pwr")&&!A.startsWith("power"),Q=O||z;if(L)return _.includes("rear")?1e3:500;if(Q)return _.includes("front")?1e3:500},h=w(l.target,l.targetHandle);if(h!==void 0)return h;let x=w(l.source,l.sourceHandle);return x!==void 0?x:1e3},validateConnection:l=>{let u=t.validateConnection||Yi;return u===Yi?Yi(l,o,r):u(l,o)},selectNodeById:l=>r.get(l),selectConnectedEdges:l=>o.edges.filter(u=>u.source===l||u.target===l)}}var Jp=e=>e,Qp=e=>e.nodes,ef=e=>e.edges;function Zi(e,t){let o=useCallback(n=>e.subscribe(a=>n()),[e]),r=useCallback(()=>t(e.getState()),[e,t]);return useSyncExternalStore(o,r,r)}function tf(e){return Zi(e,Jp)}function Ji(e){return Zi(e,Qp)}function Qi(e){return Zi(e,ef)}function lc(e){return e.selectEdgeZIndex}var of=0;function Pn(e,t,o,r){let n=`edge-${e.source}-${e.sourceHandle}-${e.target}-${e.targetHandle}-${Date.now()}-${of+=1}`,a=o({...e,id:n,type:t});return {id:n,source:e.source,target:e.target,sourceHandle:e.sourceHandle,targetHandle:e.targetHandle,type:t,zIndex:a,style:{zIndex:a},data:r??{}}}function uc(e,t,o,r){return e.source===t&&r(e.sourceHandle)===o||e.target===t&&r(e.targetHandle)===o}function pc(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,sourcePolicy:a,targetPolicy:i,normalizeSourceHandle:s,normalizeTargetHandle:c,data:d}=e,{source:f,target:g,sourceHandle:l,targetHandle:u}=o;if(!f||!g||!l||!u)return null;let m=s(l),w=c(u),h=t.filter(y=>uc(y,f,m,s)),x=t.filter(y=>uc(y,g,w,c)),P=new Set;if(a.replaceable&&h.length>=a.capacity&&h.forEach(y=>P.add(y.id)),i.replaceable&&x.length>=i.capacity&&x.forEach(y=>P.add(y.id)),P.size===0)return null;let E=t.filter(y=>!P.has(y.id)),D=Pn(o,r,n,d);return {edges:[...E,D],replacedEdgeIds:[...P]}}function rf(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,findBy:a,matchOn:i=a,data:s}=e,c=a==="source"?o.sourceHandle:o.targetHandle,d=a==="source"?o.source:o.target;if(!c||!d)return null;let f=Ee(c),g=t.find(m=>i==="source"?m.source===d&&Ee(m.sourceHandle)===f:m.target===d&&Ee(m.targetHandle)===f);if(!g)return null;let l=t.filter(m=>m.id!==g.id),u=Pn(o,r,n,s);return [...l,u]}function nf(e,t){return !e||!t?"unknown":mo(e,t).kind}function bo(e,t){return nf(e,t)==="power"}var af=.25;function Er(e){return (e.highlightedNodeIds?.length??0)>0||(e.highlightedEdgeIds?.length??0)>0}function fc(e,t){return Er(t)?t.highlightedNodeIds?.includes(e)??false:true}function gc(e,t,o){return !Er(o)||o.highlightedEdgeIds?.includes(e)?true:o.connectEdgesToHighlightedNodes??(o.highlightedEdgeIds?.length??0)===0?!!(o.highlightedNodeIds?.includes(t.source)||o.highlightedNodeIds?.includes(t.target)):false}function mc(e){return typeof e!="number"||Number.isNaN(e)?.25:Math.min(1,Math.max(0,e))}function ea(e,t){if(!t.dimUnhighlighted||!Er(t))return e;let o=mc(t.dimOpacity);return e.map(r=>fc(r.id,t)?r:{...r,style:{...r.style??{},opacity:o}})}function ta(e,t){if(!t.dimUnhighlighted||!Er(t))return e;let o=mc(t.dimOpacity);return e.map(r=>gc(r.id,r,t)?r:{...r,style:{...r.style??{},opacity:o},data:{...r.data??{},opacity:o}})}var sf=new Set(["device","server","switch","router","patch-panel"]);function bc(e){return e.type?sf.has(e.type)||eo(e.type):false}var oa=(e,t)=>e.position?.x===t.position?.x&&e.position?.y===t.position?.y&&e.positionAbsolute?.x===t.positionAbsolute?.x&&e.positionAbsolute?.y===t.positionAbsolute?.y&&e.dragging===t.dragging&&e.selected===t.selected&&e.width===t.width&&e.height===t.height;function ra(e,t,o){let{showDeviceImages:r}=t??{};if(r===void 0){if(!o||o.length!==e.length)return e;let i=false,s=e.map((c,d)=>{let f=o[d];return f?.id===c.id&&f.data===c.data&&oa(f,c)?f:(i=true,c)});return i?s:o}let n=false,a=e.map((i,s)=>{if(!bc(i)){let d=o?.[s];return d?.id===i.id&&d.data===i.data&&oa(d,i)?d:(d!==i&&(n=true),i)}let c=i.data??{};if(c.showDeviceImages!==void 0){let d=o?.[s];return d?.id===i.id&&d.data===i.data&&oa(d,i)?d:(d!==i&&(n=true),i)}return n=true,{...i,data:{...c,showDeviceImages:r}}});return !n&&o?o:a}function yc(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}function wc(e,t,o,r,n,a,i){let s=false,c=false;for(let d of e)if(!s&&t&&d.source===t&&(s=ce(o,d.sourceHandle)===r),!s&&t&&d.target===t&&(s=ce(o,d.targetHandle)===r),!c&&n&&d.target===n&&(c=ce(a,d.targetHandle)===i),!c&&n&&d.source===n&&(c=ce(a,d.sourceHandle)===i),s&&c)break;return {source:s,target:c}}var ze=({type:e,children:t})=>{let o=ue.useRef(null),r=ue.useCallback(n=>{if(o.current=n,n){let a=n.parentElement,i=0;for(;a&&!a.classList.contains("react-flow__node")&&i<10;)a=a.parentElement,i++;a&&a.classList.contains("react-flow__node")&&a.setAttribute("data-type",e);}},[e]);return ue.useEffect(()=>{if(o.current){let n=o.current.parentElement,a=0;for(;n&&!n.classList.contains("react-flow__node")&&a<10;)n=n.parentElement,a++;n&&n.classList.contains("react-flow__node")&&n.setAttribute("data-type",e);}},[e]),jsx("div",{ref:r,style:{width:"100%",height:"100%"},children:t})},xf=(e,t,o)=>({rack:r=>jsx(ze,{type:"rack",children:jsx(si,{...r,onFaceChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsx(ze,{type:"fiber",children:jsx(ci,{...r})}),device:r=>jsx(ze,{type:"device",children:jsx(Oo,{...r})}),server:r=>jsx(ze,{type:"server",children:jsx(Oo,{...r})}),switch:r=>jsx(ze,{type:"switch",children:jsx(Oo,{...r})}),router:r=>jsx(ze,{type:"router",children:jsx(Oo,{...r})}),"vertical-pdu":r=>jsx(ze,{type:"vertical-pdu",children:jsx(Ci,{...r})}),splice:r=>jsx(ze,{type:"splice",children:jsx(Ei,{...r})}),"splice-tray":r=>jsx(ze,{type:"splice-tray",children:jsx(Si,{...r})}),tube:r=>jsx(ze,{type:"tube",children:jsx(Fi,{...r})}),cable:r=>jsx(ze,{type:"cable",children:jsx(_i,{...r})}),"multi-tube-cable":r=>jsx(ze,{type:"multi-tube-cable",children:jsx(Hi,{...r})}),coupler:r=>jsx(ze,{type:"coupler",children:jsx(Mi,{...r})}),"patch-panel":r=>jsx(ze,{type:"patch-panel",children:jsx(Wi,{...r})}),closure:r=>jsx(ze,{type:"closure",children:jsx(Vi,{...r})}),"fibre-split":r=>jsx(ze,{type:"fibre-split",children:jsx(ji,{...r})})});function Nc(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 Rr(e){return e?.face==="front"||e?.face==="rear"?e.face:Fo(e)}function xc(e,t){return {...e,face:t}}function kc(e,t,o){let r=e.sourceHandle,n=e.targetHandle;return Nc(t)&&r&&!bo(t,r)&&(r=lt(r)),Nc(o)&&n&&!bo(o,n)&&(n=`${lt(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var kf={fiber:sn,ethernet:sn,power:li,smoothstep:Qa,step:os,"thick-cable":is},Pf=8192,Df=8192,Cf=2048,Ef=4;function Tr(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function Rf(e){if(e)return {...e,width:Tr(e.width,1,Pf),height:Tr(e.height,1,Df),padding:Tr(e.padding,0,Cf),pixelRatio:Tr(e.pixelRatio,.1,Ef),quality:Tr(e.quality,0,1)}}var Pc=({nodes:e,edges:t,initialNodes:o,initialEdges:r,onNodesChange:n,onEdgesChange:a,store:i,debug:s,onNodeClick:c,onEdgeClick:d,nodeTypes:f,edgeTypes:g,onConnect:l,onEdgeUpdate:u,isValidConnection:m,connectionMode:w,onFaceChange:h,onRackFaceChange:x,className:P,style:E,alignRacksToBottom:D,reAssignable:y=true,colorMode:R="dark",onInit:_,onFlowMethods:M,showDownloadButton:F=false,downloadButtonPosition:A="top-right",downloadButtonText:L="Download Image",downloadButtonStyle:O,useSmoothstepEdgesForTubes:z=false,readOnly:Q=false,interaction:re,actionPanel:I,fitViewOptions:H,minZoom:Z=.1,maxZoom:V=4,onlyRenderVisibleElements:j=false,highlightedNodeIds:X,highlightedEdgeIds:we,dimUnhighlighted:ee,dimOpacity:Ne,connectEdgesToHighlightedNodes:fe,showDeviceImages:ne,highlightedPortHandles:me,onPortClick:De,connectionRadius:Xe,onConnectRejected:wo})=>{let tt=useCallback((p,b)=>{let N=new Map,k=[],C=[],v=new Map(b.map(S=>[S.id,S])),$=(S,T)=>!S||!T?false:!!(S.startsWith("tube-")||T.type==="splice"&&(S==="left"||S==="right")||S==="cable-button");for(let S of p){if(!S.source||!S.target){s&&console.warn("Invalid edge skipped (missing source/target):",S);continue}let T=v.get(S.source),B=v.get(S.target),Y=S.sourceHandle?`${S.source}:${S.sourceHandle}`:void 0,_e=Y?N.get(Y):void 0,ht=S.sourceHandle?$(S.sourceHandle,T):false,Ue=S.targetHandle?`${S.target}:${S.targetHandle}`:void 0,Je=Ue?N.get(Ue):void 0,Zt=S.targetHandle?$(S.targetHandle,B):false;if(_e&&!ht){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:Y,existingEdge:_e.id,duplicateEdge:S.id}),C.push(S);continue}if(Je&&!Zt){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Ue,existingEdge:Je.id,duplicateEdge:S.id}),C.push(S);continue}k.push(S),Y&&!_e&&N.set(Y,S),Ue&&!Je&&N.set(Ue,S);}return s&&C.length>0&&console.log(`Filtered ${C.length} duplicate edge(s) from initial edges`),k},[s]),le=Array.isArray(e)&&Array.isArray(t),Yt=ue.useMemo(()=>le?e||[]:o||e||[],[le,e,o]),No=ue.useMemo(()=>le?t||[]:r||t||[],[le,t,r]),Fr=ue.useMemo(()=>tt(No,Yt),[No,Yt,tt]),oe=ue.useMemo(()=>i||qi({nodes:ai(Yt),edges:Fr,debug:s}),[i,le,s,Fr]),Dt=Ji(oe),Ct=Qi(oe),[he,Me]=useNodesState(Dt),[Et,ft,_r]=useEdgesState(Ct),ot=lc(oe),Rt=useRef(null),[qe,Hr]=useState(false);useEffect(()=>{let p=()=>{Hr(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return p(),window.addEventListener("resize",p),()=>window.removeEventListener("resize",p)},[]);let ye=Q===true,Ce=useMemo(()=>{let b={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!qe,edgesFocusable:!qe,edgesReconnectable:true,connectOnClick:true,panOnDrag:true,panOnScroll:!qe,zoomOnScroll:!qe,zoomOnPinch:!qe,zoomOnDoubleClick:!qe,allowKeyboardDelete:true,showControls:true,showMiniMap:!qe,showInteractiveControl:true},...re??{}};return ye?{...b,nodesDraggable:false,nodesConnectable:false,elementsSelectable:b.elementsSelectable!==false,edgesFocusable:false,edgesReconnectable:false,connectOnClick:false,allowKeyboardDelete:false,showInteractiveControl:false}:b},[qe,re,ye]),gt=useMemo(()=>({enabled:I?.enabled??true,showRearToggle:I?.showRearToggle??true,showDeRack:I?.showDeRack??true}),[I]),{toObject:qo,setViewport:G,setNodes:J,setEdges:be,getNodes:xe,getEdges:Fe,fitView:rt,flowToScreenPosition:nt,getIntersectingNodes:Kt}=useReactFlow(),Mr=useRef(n),Zo=useRef(a),Jo=useRef(le),xo=useRef(oe),st=useRef({toObject:qo,setViewport:G,setReactFlowNodes:J,setReactFlowEdges:be,getNodes:xe,getEdges:Fe,fitView:rt});useEffect(()=>{Mr.current=n;},[n]),useEffect(()=>{Zo.current=a;},[a]),useEffect(()=>{Jo.current=le;},[le]),useEffect(()=>{xo.current=oe;},[oe]),useEffect(()=>{st.current={toObject:qo,setViewport:G,setReactFlowNodes:J,setReactFlowEdges:be,getNodes:xe,getEdges:Fe,fitView:rt};},[qo,G,J,be,xe,Fe,rt]);let Ar=useMemo(()=>({toObject:()=>st.current.toObject(),setViewport:p=>{st.current.setViewport(p);},setNodes:p=>{if(st.current.setReactFlowNodes(p),Jo.current){Mr.current?.(p);return}xo.current.setState({nodes:p});},setEdges:p=>{if(st.current.setReactFlowEdges(p),Jo.current){Zo.current?.(p);return}xo.current.setState({edges:p});},toImage:p=>Rt.current?toPng(Rt.current,Rf(p)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>st.current.getNodes(),getEdges:()=>st.current.getEdges(),fitView:p=>{let{fitView:b,getNodes:N}=st.current;if(p?.nodes&&Array.isArray(p.nodes)&&p.nodes.length>0){let v=p.nodes.map(T=>N().find(B=>B.id===T)).filter(T=>T!==void 0),{nodes:$,...S}=p;b({...S,nodes:v});return}let{nodes:k,...C}=p||{};b(C);}}),[]);useEffect(()=>{M?.(Ar);},[M,Ar]);let[se,Ae]=useState(false),ge=useCallback(()=>{if(!se){if(!Rt.current){s&&console.error("ReactFlow wrapper ref is not available");return}Ae(true),toPng(Rt.current,{filter:p=>!(p?.classList?.contains("react-flow__minimap")||p?.classList?.contains("react-flow__controls")||p?.classList?.contains("react-flow__attribution")||p?.classList?.contains("react-networks-attribution")||p?.classList?.contains("download-button")||p?.tagName==="BUTTON"),backgroundColor:R==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(p=>{let b=document.createElement("a");b.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,b.href=p,b.click();}).catch(p=>{s&&console.error("Error downloading image:",p);}).finally(()=>{Ae(false);});}},[R,s,se]),[$r,ct]=useState(null),At=useRef(null),We=useRef(h),Ze=useRef(x);useEffect(()=>{We.current=h;},[h]),useEffect(()=>{Ze.current=x;},[x]),useEffect(()=>{At.current=$r;},[$r]);let Qo=useCallback((p,b)=>{We.current?.(p,b);},[]),Lr=useCallback((p,b)=>{Ze.current?.(p,b);},[]),Br=useCallback(()=>At.current,[]),er=useRef(wo);useEffect(()=>{er.current=wo;},[wo]);let Ye=useCallback((p,b,N)=>{er.current?.({connection:p,reason:b,phase:N});},[]),Ke=useRef(null),mt=useRef(false),ko=useCallback(p=>{let b=Ke.current;Ke.current=null,b&&Ye(b.connection,b.reason,p);},[Ye]),Or=useMemo(()=>({...xf(Qo,Lr,Br),...f??{}}),[Qo,Lr,Br,f]),pa=useMemo(()=>({...kf,...g??{}}),[g]),Oe=useMemo(()=>({zIndex:1e3,reconnectable:Ce.edgesReconnectable}),[Ce.edgesReconnectable]),$t=useMemo(()=>({hideAttribution:true}),[]),bt=useRef(he);useEffect(()=>{bt.current=he;},[he]);let Te=useRef(Et);useEffect(()=>{Te.current=Et;},[Et]),useEffect(()=>{Me(Dt);},[Dt,Me]),useEffect(()=>{ft(Ct);},[Ct,ft]),useEffect(()=>{if(le&&t){let p=tt(t,e||[]);p.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-p.length} duplicate(s) removed`),a?.(p));}},[le,t,e,tt,a,s]),useEffect(()=>{le&&oe.setState({nodes:Dc(e||[],oe.getState().nodes)});},[le,e,oe]),useEffect(()=>{le&&oe.setState({edges:Cc(t||[],oe.getState().edges)});},[le,t,oe]),useEffect(()=>{if(!D||!he||he.length===0||he.some(T=>T.dragging))return;let p=he.filter(T=>T.type==="rack");if(p.length===0)return;let b=p.map(T=>{let B=Nt(T.data).height;return (T.position?.y||0)+B}),N=Math.min(...b),k=Math.max(...b);if(k-N<20)return;let v=k,$=he.map(T=>{if(T.type!=="rack")return T;let B=Nt(T.data).height,Y=(T.position?.y||0)+B,_e=v-Y;return Math.abs(_e)<5?T:{...T,position:{x:T.position?.x||0,y:(T.position?.y||0)+_e}}});if($.some((T,B)=>{let Y=he[B]?.position,_e=T.position;return Y?.x!==_e?.x||Y?.y!==_e?.y})){if(le){n?.($);return}oe.setState({nodes:$});}},[D,he,le,n,oe]);let Po=useRef(new Map);useEffect(()=>{let p=new Map;he.forEach(b=>{p.set(b.id,b);}),Po.current=p;},[he]);let K=useCallback(p=>Po.current.get(p),[]),te=useCallback(p=>{if(!p)return;if(typeof p.parentId=="string")return p.parentId;let b=p.parentNode;if(typeof b=="string")return b},[]),Lt=useCallback(p=>{let b=te(p);if(!b)return;let N=K(b);if(!(!N||N.type!=="rack"))return N},[K,te]),fa=useCallback(p=>!p||p.type!=="rack"?false:Ie(p.data),[]),Do=useCallback(p=>{if(!p||!to(p))return false;let b=Lt(p);return b?Ie(b.data):false},[Lt]),tr=useCallback(p=>{bt.current=p;let b=new Map;p.forEach(N=>{b.set(N.id,N);}),Po.current=b,Me(p),le?n?.(p):oe.setState({nodes:p});},[le,oe,Me,n]),qt=useCallback(p=>{Te.current=p,ft(p),le?a?.(p):oe.setState({edges:p});},[le,oe,ft,a]),Bt=useCallback(p=>{if(p.positionAbsolute)return p.positionAbsolute;let b=p.position?.x||0,N=p.position?.y||0,k=te(p),C=new Set;for(;k&&!C.has(k);){C.add(k);let v=K(k);if(!v)break;if(v.positionAbsolute){b+=v.positionAbsolute.x,N+=v.positionAbsolute.y;break}b+=v.position?.x||0,N+=v.position?.y||0,k=te(v);}return {x:b,y:N}},[K,te]),zr=useCallback(p=>{let b=Bt(p),N=p.width||0,k=p.height||0;return {x:b.x+N/2,y:b.y+k/2}},[Bt]),Wr=useCallback((p,b)=>{let N=Kt({x:p.x,y:p.y,width:1,height:1},true).filter(v=>v.id!==b&&v.type==="rack"),k=null,C=1/0;for(let v of N){let $=Math.hypot(p.x-v.position.x,p.y-v.position.y);$<C&&(C=$,k=v);}return k},[Kt]),ga=useCallback(p=>Nt(p.data),[]),Co=useCallback((p,b,N)=>{let{width:k,height:C}=ga(p),v=b.width||0,$=b.height||0,S=Math.max(0,k-v),T=b.type==="vertical-pdu"?60:0,B=Math.max(T,C-$);return {x:Math.max(0,Math.min(N.x,S)),y:Math.max(T,Math.min(N.y,B))}},[ga]),or=useCallback((p,b)=>{if(!p||!b)return;let N=K(p);if(!N)return;let k=b.replace(/-(source|target)$/i,"");if(N.type==="fibre-split"&&k.startsWith("output-"))for(let v of Te.current){if(v.target!==p||!(v.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"))continue;let $=v.data?.color;if($)return {color:$}}if((N.type==="tube"||N.type==="cable")&&b.startsWith("fiber-")){let v=b.replace("fiber-",""),$=parseInt(v,10);if($>=1&&$<=24){let S=ao($),T=$>12;return {color:S,striped:T}}}if((N.type==="multi-tube-cable"||N.type==="tube")&&b.startsWith("tube-")){let v=b.replace("tube-",""),$=parseInt(v,10);if($>=1&&$<=24){let S=Ve($),T=$>12;return {color:S,striped:T}}}let C=N.data;if(C.color)return {color:C.color}},[K]),ma=useRef(new Map);useEffect(()=>{ft(p=>{let b=false,N=p.map(k=>{let C=ot(k);return ma.current.get(k.id)!==C?(b=true,ma.current.set(k.id,C),{...k,zIndex:C,style:{...k.style,zIndex:C}}):k});return b?N:p});},[he,ft,ot]),useEffect(()=>{let p=he.map(N=>{if(N.type==="coupler"&&N.parentId){let k=K(N.parentId);if(k&&(k.type==="patch-panel"||k.type==="closure")&&(!N.extent||N.extent!=="parent"))return {...N,extent:"parent"}}if(N.type==="splice"&&N.parentId&&N.data.holderPosition&&(!N.position||N.position.x===0&&N.position.y===0)){let k=K(N.parentId);if(k&&k.type==="splice-tray"){let C=N.data.mode==="ribbon",v=kr(k,N.data.holderPosition,C);return {...N,position:v}}}if(to(N)&&N.parentId&&N.data.uPosition&&(!N.position||N.position.x===0&&N.position.y===0)){let k=K(N.parentId);if(k){let C=N.data.uHeight||1,v=Ao(k,N.data.uPosition,C,N.data);return {...N,position:v}}}if(N.type==="vertical-pdu"&&N.parentId){let k=K(N.parentId);if(k&&k.type==="rack"){let C=Co(k,N,N.position||{x:0,y:60});if(N.extent!=="parent"||!N.position||N.position.x!==C.x||N.position.y!==C.y)return {...N,extent:"parent",position:C}}}return N});p.some((N,k)=>{let C=he[k];return N.extent!==C.extent||N.position?.x!==C.position?.x||N.position?.y!==C.position?.y})&&Me(p);},[he,Me,K,Co]);let ba=useCallback(p=>{if(ye)return null;let b=new Map,N=new Map,k=new Set,C=p.map(S=>{if(S.type==="position"&&S.position){let T=K(S.id);if(T&&T.type==="coupler"&&T.parentId){let B=K(T.parentId);if(B&&(B.type==="patch-panel"||B.type==="closure"))return (!T.extent||T.extent!=="parent")&&k.add(T.id),{...S,position:T.position||{x:0,y:0}}}if(T&&(T.type==="tube"||T.type==="splice-tray")&&T.parentId){let B=K(T.parentId);if(B&&B.type==="closure")return (!T.extent||T.extent!=="parent")&&k.add(T.id),{...S,position:T.position||{x:0,y:0}}}if(T&&T.type==="splice"&&T.parentId){let B=K(T.parentId);if(B&&B.type==="splice-tray"){let Y=Ti(T,B,S.position,bt.current);return Y.holderPosition!==void 0&&b.set(T.id,Y.holderPosition),{...S,position:{x:Y.x,y:Y.y}}}}if(T&&to(T)&&T.parentId){let B=K(T.parentId);if(B&&B.type==="rack"){let Y=on(T,B,S.position,bt.current);return Y.uPosition!==void 0&&N.set(T.id,Y.uPosition),{...S,position:{x:Y.x,y:Y.y}}}}if(T&&T.type==="vertical-pdu"&&T.parentId){let B=K(T.parentId);if(B&&B.type==="rack")return (!T.extent||T.extent!=="parent")&&k.add(T.id),{...S,position:Co(B,T,S.position)}}}return S}),v=applyNodeChanges(C,bt.current).map(S=>{let T=S;k.has(S.id)&&(T={...T,extent:"parent"});let B=b.get(S.id);B!==void 0&&(T={...T,data:{...T.data,holderPosition:B}});let Y=N.get(S.id);return Y!==void 0&&(T={...T,data:{...T.data,uPosition:Y}}),T});v=ai(v),bt.current=v;let $=new Map;return v.forEach(S=>{$.set(S.id,S);}),Po.current=$,Me(v),v},[Me,K,ye,Co]),pd=useCallback((p,b)=>{ct(null);},[]),fd=useCallback((p,b,N)=>{let k=te(b);if(!y||!Ho(b)||k){ct(null);return}let C=zr(b),$=Wr(C,b.id)?.id??null;ct(S=>S===$?S:$);},[y,zr,te,Wr]),gd=useCallback((p,b,N)=>{ct(null);let k=te(b);if(!y||!Ho(b)||k)return;let C=Bt(b),v=zr(b),$=Wr(v,b.id),S=bt.current;if(!$)return;let T={x:C.x-$.position.x,y:C.y-$.position.y},B=Co($,b,T);if(b.type==="vertical-pdu"){let $e=S.map(q=>q.id!==b.id?q:{...q,parentId:$.id,extent:"parent",position:B,data:{...q.data,rackLayout:Ie($.data)?"split-face":"single-face",rackWidthPx:wt($.data),rackFaceGapPx:It($.data)}});tr($e);return}let Y=S.find($e=>$e.id===b.id)||b,_e=Ie($.data),ht=wt($.data),Ue=It($.data),Je=_e?za(Y.data,T.x,ht,Ue):"both",Zt=_e&&Je==="front"?ht+Ue:0,Jt=Je==="rear"?"rear":Je==="front"?"front":Rr(Y.data),ke={...Y,parentId:$.id,extent:"parent",position:{x:Zt,y:T.y},data:{...Y.data,rackLayout:_e?"split-face":"single-face",rackWidthPx:ht,rackFaceGapPx:Ue,mountMode:Je,face:Jt}},Qe=S.filter($e=>$e.id!==b.id).concat(ke),Tt=on(ke,$,ke.position,Qe);if(Tt.uPosition===void 0||!oo($,ke,Tt.uPosition,Qe))return;let Vr=S.map($e=>$e.id!==b.id?$e:{...$e,parentId:$.id,extent:"parent",position:{x:Tt.x,y:Tt.y},data:{...$e.data,rackLayout:_e?"split-face":"single-face",rackWidthPx:ht,rackFaceGapPx:Ue,mountMode:Je,face:Jt,uPosition:Tt.uPosition??$e.data.uPosition}});tr(Vr);},[y,Bt,zr,tr,te,Co,Wr]),md=useCallback(p=>{if(!p.source||!p.target||!p.sourceHandle||!p.targetHandle)return true;let b=K(p.source),N=K(p.target),k=ce(b,p.sourceHandle),C=ce(N,p.targetHandle),v=wc(Te.current,p.source,b,k,p.target,N,C),$=v.source,S=v.target;if($&&s&&console.log("Connection will replace: Source handle already connected",{source:p.source,sourceHandle:p.sourceHandle,existingEdges:Te.current.filter(Y=>Y.source===p.source&&Y.sourceHandle===p.sourceHandle||Y.target===p.source&&Y.targetHandle===p.sourceHandle)}),S&&s&&console.log("Connection will replace: Target handle already connected",{target:p.target,targetHandle:p.targetHandle,existingEdges:Te.current.filter(Y=>Y.target===p.target&&Y.targetHandle===p.targetHandle||Y.source===p.target&&Y.sourceHandle===p.targetHandle)}),!Dr(b,N))return Ke.current=null,true;let B=kn(b,p.sourceHandle,N,p.targetHandle);return B.valid?(Ke.current=null,true):(s&&console.log(`Connection rejected: ${B.reason}`,p),Ke.current={connection:p,reason:B.reason??"Connection not allowed by fiber rules"},false)},[K,s]),bd=useCallback(p=>{if(ye)return;s&&console.log("onConnect called:",p);let b=K(p.source),N=K(p.target);s&&(console.log("onConnect: sourceNode type:",b?.type,"targetNode type:",N?.type),console.log("onConnect: sourceHandle:",p.sourceHandle,"targetHandle:",p.targetHandle));let k=kc(p,b,N),C=oe.validateConnection({source:k.source??null,target:k.target??null,sourceHandle:k.sourceHandle,targetHandle:k.targetHandle});if(!C.valid&&!(C.reason??"").includes("already connected")){s&&console.warn(`Connection rejected: ${C.reason}`),Ye(p,C.reason??"Connection not allowed","connect");return}let v=b?.type==="vertical-pdu",$=b?.type==="vertical-pdu"||N?.type==="vertical-pdu",S=bo(b,k.sourceHandle),T=bo(N,k.targetHandle),B=S&&T&&$,Y=b?.data,_e=b?.type==="switch"||b?.type==="device"&&Y?.deviceType==="switch",ht=N?.type==="switch"||N?.type==="device"&&N.data?.deviceType==="switch",Ue=b?.type==="tube"&&N?.type==="multi-tube-cable",Je=b?.type==="multi-tube-cable"&&N?.type==="tube",Zt=Ue||Je,Jt=k.sourceHandle==="cable-button"&&k.targetHandle==="cable-button",ke="fiber";B?ke="power":Jt?ke="thick-cable":Zt&&(ke=z?"smoothstep":"fiber");let Qe,Tt=yc(N),Vr=yc(b);if(Tt||Vr){let ie=N?.data,nr=b?.data,ir=Tt?ie.ribbonFiberIds:nr.ribbonFiberIds;ir&&Array.isArray(ir)&&ir.length>=6&&ir.length<=12&&(Qe={ribbonFiberIds:ir,isRibbon:true});}if(!Qe&&(ke==="fiber"||ke==="smoothstep")&&!v){let ie;Ue?ie=or(k.target,k.targetHandle):ie=or(k.source,k.sourceHandle),ie&&(Qe={color:ie.color,striped:ie.striped,isRibbon:false});}else if(ke==="thick-cable"&&Jt){let ie=b?.data;Qe={color:ie?.color||(ie?.tubeStartIndex?Ve(ie.tubeStartIndex):"#6366f1")};}let $e=Dr(b,N),q=!$e&&!S&&!!k.sourceHandle,Ot=!$e&&!T&&!!k.targetHandle,xa=$e||B||q&&Ot&&(_e||ht),Wn=pc({edges:Te.current,connection:k,edgeType:ke,selectEdgeZIndex:ot,sourcePolicy:{capacity:1,replaceable:xa},targetPolicy:{capacity:1,replaceable:xa},normalizeSourceHandle:ie=>ce(b,ie),normalizeTargetHandle:ie=>ce(N,ie),data:Qe});if(Wn){qt(Wn.edges),s&&console.log("Handle replacement: Replaced",Wn.replacedEdgeIds.length,"edge(s)");return}let Un=oe.validateConnection({source:k.source??null,target:k.target??null,sourceHandle:k.sourceHandle,targetHandle:k.targetHandle});if(!Un.valid){s&&console.warn(`Connection rejected: ${Un.reason}`),Ye(p,Un.reason??"Connection not allowed","connect");return}let Bd=ce(b,k.sourceHandle),Od=ce(N,k.targetHandle),ka=wc(Te.current,k.source,b,Bd,k.target,N,Od);if(ka.source){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:p.source,sourceHandle:k.sourceHandle,existingEdges:Te.current.filter(ie=>ie.source===k.source&&ie.sourceHandle===k.sourceHandle||ie.target===k.source&&ie.targetHandle===k.sourceHandle)}),Ye(p,`Source handle ${k.sourceHandle} is already connected`,"connect");return}if(ka.target){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:k.target,targetHandle:k.targetHandle,existingEdges:Te.current.filter(ie=>ie.target===k.target&&ie.targetHandle===k.targetHandle||ie.source===k.target&&ie.sourceHandle===k.targetHandle)}),Ye(p,`Target handle ${k.targetHandle} is already connected`,"connect");return}let Gn=Pn(k,ke,ot,Qe),zd=[...Te.current,Gn];ya(ie=>new Set(ie).add(Gn.id)),setTimeout(()=>{ya(ie=>{let nr=new Set(ie);return nr.delete(Gn.id),nr});},1e3),qt(zd);},[qt,oe,ot,K,s,or,z,ye,Ye]),hd=useCallback((p,b)=>{if(ye||!b.source||!b.target||!b.sourceHandle||!b.targetHandle)return;let N=K(b.source),k=K(b.target),C=kc(b,N,k),v=ce(N,C.sourceHandle),$=ce(k,C.targetHandle),S=Te.current.some(q=>{if(q.id===p.id)return false;let Ot=q.source===C.source&&ce(N,q.sourceHandle)===v||q.target===C.source&&ce(N,q.targetHandle)===v,jr=q.target===C.target&&ce(k,q.targetHandle)===$||q.source===C.target&&ce(k,q.sourceHandle)===$;return Ot||jr}),T=oe.validateConnection({source:C.source??null,target:C.target??null,sourceHandle:C.sourceHandle,targetHandle:C.targetHandle,ignoreEdgeId:p.id});if(!T.valid&&!((T.reason??"").includes("already connected")&&S)){s&&console.warn(`Edge update rejected: ${T.reason}`),Ye(b,T.reason??"Reconnection not allowed","reconnect");return}let B=N?.type==="vertical-pdu"||k?.type==="vertical-pdu",Y=bo(N,C.sourceHandle),_e=bo(k,C.targetHandle),ht=Y&&_e&&B,Ue=N?.type==="tube"&&k?.type==="multi-tube-cable",Je=N?.type==="multi-tube-cable"&&k?.type==="tube",Zt=Ue||Je,Jt=C.sourceHandle==="cable-button"&&C.targetHandle==="cable-button",ke;ht?ke="power":Jt?ke="thick-cable":Zt?ke=z?"smoothstep":"fiber":ke="fiber";let Qe;if(ke==="fiber"||ke==="smoothstep"){let q=or(C.source,C.sourceHandle);q&&(Qe={color:q.color,striped:q.striped});}let $e=Te.current.filter(q=>{if(q.id===p.id)return true;let Ot=q.source===C.source&&ce(N,q.sourceHandle)===v||q.target===C.source&&ce(N,q.targetHandle)===v,jr=q.target===C.target&&ce(k,q.targetHandle)===$||q.source===C.target&&ce(k,q.sourceHandle)===$;return !(Ot||jr)}).map(q=>{if(q.id===p.id){let Ot=ot({...C,id:q.id,type:ke});return {...q,source:C.source,target:C.target,sourceHandle:C.sourceHandle,targetHandle:C.targetHandle,type:ke,data:Qe!==void 0?{...q.data,...Qe}:q.data,zIndex:Ot,style:{...q.style,zIndex:Ot}}}return q});qt($e);},[qt,K,or,ot,z,s,oe,ye,Ye]),Eo=useCallback(p=>{Me(b=>{let N=false,k=b.map(C=>{let v=p!==null&&C.id===p;return C.selected===v?C:(N=true,{...C,selected:v})});return N?k:b});},[Me]),yd=useCallback((p,b)=>{if(qe){c&&c(b);return}let N=p.metaKey||p.ctrlKey,k=xe(),C=b,v=te(b);if(b.type==="tube"&&v&&!N){let $=k.find(S=>S.id===v&&(S.type==="cable"||S.type==="multi-tube-cable"));$&&(C=$);}if(Bn(C),rr([]),Eo(C.id),N&&to(C)&&!Do(C)){let $=C.data||{},S=Rr($),T=S==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${C.id} from ${S} to ${T}`),h&&h(C.id,T);}c&&c(C);},[h,c,s,xe,qe,te,Do,Eo]),wd=useCallback(()=>{},[]),Nd=useCallback((p,b)=>{Bn(null),rr([b]),Eo(null),c?.(null),d&&d(b);},[d,c,Eo]),xd=useCallback(()=>{Bn(null),rr([]),Eo(null),c?.(null);},[c,Eo]),[dt,Bn]=useState(null),[ha,ya]=useState(new Set),[On,rr]=useState([]),kd=useCallback(({edges:p})=>{rr(p||[]);},[]);useOnSelectionChange({onChange:kd}),useEffect(()=>{let p=b=>{if(Ce.allowKeyboardDelete&&(b.key==="Backspace"||b.key==="Delete")&&On.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let N=On.filter(k=>{let C=k.sourceHandle||"",v=k.targetHandle||"";return C.startsWith("tube-")||v.startsWith("tube-")?(s&&console.log("Cannot delete edge connected to tube handle",k),false):true});if(N.length>0){let k=new Set(N.map(v=>v.id)),C=Te.current.filter(v=>!k.has(v.id));qt(C),rr([]),s&&console.log("Deleted edges:",N.map(v=>v.id));}}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[On,qt,s,Ce.allowKeyboardDelete]);let Pd=useCallback((p,{nodeId:b,handleType:N})=>{Ke.current=null,s&&console.log("Connection started from",{nodeId:b,handleType:N});},[s]),Dd=useCallback(p=>{mt.current||ko("connect"),s&&console.log("Connection ended",p);},[s,ko]),Cd=useCallback(()=>{mt.current=true,Ke.current=null;},[]),Ed=useCallback(()=>{ko("reconnect"),mt.current=false;},[ko]),Rd=useCallback(()=>{if(ye&&!x&&!h||!dt)return;let p=K(dt.id);if(p){if(p.type==="rack"){let b=p.data||{};if(Ie(b))return;let k=(b.face||"front")==="front"?"rear":"front";x?(x(p.id,k),h&&xe().filter(v=>v.parentId===p.id).forEach(v=>{h(v.id,k);})):Me(C=>C.map(v=>v.id===p.id?{...v,data:{...v.data,face:k}}:v.parentId===p.id?{...v,data:xc(v.data,k)}:v));return}if(to(p)){if(Do(p))return;let b=p.data||{},k=Rr(b)==="front"?"rear":"front";h?h(p.id,k):Me(C=>C.map(v=>v.id===p.id?{...v,data:xc(v.data,k)}:v));}}},[dt,K,x,h,Me,xe,ye,Do]),Td=useCallback(()=>{if(ye||!y||!dt||!Ho(dt))return;let p=K(dt.id),b=te(p);if(!p||!Ho(p)||!b)return;let N=Bt(p),C=bt.current.map(v=>v.id!==p.id?v:{...v,parentId:void 0,parentNode:void 0,extent:void 0,position:N,data:{...v.data,uPosition:void 0}});tr(C);},[ye,y,dt,K,Bt,tr,te]),wa=useMemo(()=>Et.map(p=>{let b=ot(p)<1e3,N=ha.has(p.id)?"edge-connecting":p.className,k=b||p.hidden===true;return N===p.className&&k===(p.hidden===true)?p:{...p,...N!==p.className?{className:N}:{},hidden:k?true:void 0}}),[Et,ha,ot]),Ur=useMemo(()=>({highlightedNodeIds:X,highlightedEdgeIds:we,dimUnhighlighted:ee,dimOpacity:Ne,connectEdgesToHighlightedNodes:fe}),[fe,Ne,ee,we,X]),Na=useRef([]),Gr=useMemo(()=>ra(he,{showDeviceImages:ne},Na.current),[he,ne]);useEffect(()=>{Na.current=Gr;},[Gr]);let vd=useMemo(()=>ea(Gr,Ur),[Ur,Gr]),Id=useMemo(()=>({highlightedPortHandles:me,onPortClick:De,portClickEnabled:!!De}),[me,De]),Sd=useMemo(()=>ta(wa,Ur),[Ur,wa]),ve=useMemo(()=>dt?K(dt.id)??dt:null,[dt,K]),Ro=useMemo(()=>{if(!ve||!gt.enabled)return {showRearToggle:false,showDeRack:false,count:0};let p=ve.type==="rack"?!fa(ve):to(ve)?!Do(ve):false,b=gt.showRearToggle&&p,N=gt.showDeRack&&y&&!ye&&Ho(ve)&&!!te(ve);return {showRearToggle:b,showDeRack:N,count:(b?1:0)+(N?1:0)}},[ve,gt,y,ye,te,Do,fa]),zn=useMemo(()=>{if(!ve||Ro.count===0||!Rt.current)return null;let p=Rt.current.getBoundingClientRect();if(p.width<=0||p.height<=0)return null;let b=ve.positionAbsolute??Bt(ve),N=ve.width||0,k=ve.height||0,C=Ro.count>1?220:110,v=34;try{let $=nt({x:b.x+N/2,y:b.y}),S=nt({x:b.x+N/2,y:b.y+k}),T=$.x-p.left-C/2,B=$.y-p.top-v-10;return B<8&&(B=S.y-p.top+10),T=Math.max(8,Math.min(T,p.width-C-8)),B=Math.max(8,Math.min(B,p.height-v-8)),{left:T,top:B}}catch{return null}},[ve,Ro,Bt,nt]),Fd=Ma(R,P),_d=$a(R,{touchAction:"none",...E}),Hd=l??bd,Md=u??hd,Ad=m??md,$d=useCallback(p=>{if(ye)return;let b=ba(p);if(b){if(!le){oe.setState({nodes:b});return}n?.(b);}},[ye,ba,le,oe,n]),Ld=useCallback(p=>{if(ye)return;let b=p.filter(k=>{if(k.type==="remove"){let C=Te.current.find(v=>v.id===k.id);if(C){let v=C.sourceHandle||"",$=C.targetHandle||"";if(v.startsWith("tube-")||$.startsWith("tube-"))return s&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",C),false}}return true});if(b.length===0)return;let N=applyEdgeChanges(b,Te.current);if(_r(b),!le){oe.setState({edges:N});return}a?.(N);},[ye,s,_r,le,oe,a]);return jsx("div",{ref:Rt,className:Fd,style:_d,children:jsxs(gi,{value:Id,children:[jsxs(ReactFlow,{nodes:vd,edges:Sd,onNodesChange:$d,onEdgesChange:Ld,onConnect:ye?void 0:Hd,onConnectStart:Pd,onConnectEnd:Dd,onEdgeUpdate:ye?void 0:Md,onEdgeUpdateStart:Cd,onEdgeUpdateEnd:Ed,isValidConnection:Ad,connectionMode:w??ConnectionMode.Loose,connectionRadius:Xe,onNodeClick:yd,onNodeDoubleClick:wd,onPaneClick:xd,onNodeDragStart:pd,onNodeDrag:fd,onNodeDragStop:gd,onEdgeClick:Nd,onInit:_,nodeTypes:Or,edgeTypes:pa,defaultEdgeOptions:Oe,nodesDraggable:Ce.nodesDraggable,nodesConnectable:Ce.nodesConnectable,elementsSelectable:Ce.elementsSelectable,edgesFocusable:Ce.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:Ce.connectOnClick,panOnDrag:Ce.panOnDrag,panOnScroll:Ce.panOnScroll,minZoom:Z,maxZoom:V,zoomOnScroll:Ce.zoomOnScroll,zoomOnPinch:Ce.zoomOnPinch,zoomOnDoubleClick:Ce.zoomOnDoubleClick,preventScrolling:qe,onlyRenderVisibleElements:j,fitView:true,fitViewOptions:H,proOptions:$t,children:[jsx(Background,{color:Aa(R)}),Ce.showControls&&jsx(Controls,{showInteractive:Ce.showInteractiveControl}),Ce.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"})})]}),F&&jsx("button",{className:"download-button",onClick:ge,disabled:se,"aria-busy":se,style:{position:"absolute",top:A.includes("top")?"10px":"auto",bottom:A.includes("bottom")?"10px":"auto",right:A.includes("right")?"10px":"auto",left:A.includes("left")?"10px":"auto",zIndex:1e3,background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:"4px",padding:"0.5rem 0.75rem",fontSize:"0.875rem",cursor:se?"not-allowed":"pointer",opacity:se?.7:1,transition:"all 0.2s ease",...O},children:se?`${L}...`:L}),ve&&zn&&Ro.count>0&&jsxs("div",{style:{position:"absolute",top:zn.top,left:zn.left,display:"flex",gap:8,zIndex:2e3},children:[Ro.showRearToggle&&jsx("button",{onClick:p=>{p.preventDefault(),Rd();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let p=ve.data;return ve.type==="rack"?(p?.face||"front")==="front"?"Switch to rear":"Switch to front":Rr(p)==="front"?"Switch to rear":"Switch to front"})(),children:(()=>{let p=ve.data;return ve.type==="rack"?(p?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front":Rr(p)==="front"?"\u21C4 Rear":"\u21C4 Front"})()}),Ro.showDeRack&&jsx("button",{onClick:p=>{p.preventDefault(),Td();},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"})]})]})})},Tf=e=>{let{document:t,initialDocument:o,onDocumentChange:r,onNodesChange:n,onEdgesChange:a,...i}=e,s=t!==void 0||o!==void 0,c=t!==void 0,[d,f]=useState(()=>o),g=t??d,l=useMemo(()=>g?ri(g):null,[g]),u=useCallback(D=>D?{nodes:Dc(D.nodes,m.current?.nodes??[]),edges:Cc(D.edges,m.current?.edges??[])}:null,[]),m=useRef(l),w=useRef(g),h=useMemo(()=>u(l),[l,u]);useEffect(()=>{m.current=h;},[h]),useEffect(()=>{w.current=g;},[g]);let x=useCallback((D,y)=>{let R=Qt({nodes:D,edges:y},w.current);m.current={nodes:D,edges:y},w.current=R,c||f(R),r?.(R);},[c,r]),P=useCallback(D=>{let y=m.current?.edges??[];x(D,y),n?.(D);},[x,n]),E=useCallback(D=>{let y=m.current?.nodes??[];x(y,D),a?.(D);},[x,a]);if(s){let D=h??{nodes:[],edges:[]};return jsx(Pc,{...i,nodes:D.nodes,edges:D.edges,onNodesChange:P,onEdgesChange:E})}return jsx(Pc,{...e})};function Dc(e,t){let o=new Map(t.map(a=>[a.id,a])),r=true,n=e.map(a=>{let i=o.get(a.id),s=a.type==="rack"?Nt(a.data):null;if(!i)return r=false,s?{...a,width:s.width,height:s.height}:a;if(i.data===a.data&&i.position?.x===a.position?.x&&i.position?.y===a.position?.y&&i.positionAbsolute?.x===a.positionAbsolute?.x&&i.positionAbsolute?.y===a.positionAbsolute?.y&&i.selected===a.selected&&i.dragging===a.dragging&&i.resizing===a.resizing&&(!s||i.width===s.width&&i.height===s.height))return i;r=false;let d={...i.data===a.data?i:a,position:a.position,...a.positionAbsolute!==void 0?{positionAbsolute:a.positionAbsolute}:{},...i.selected!==void 0?{selected:i.selected}:{},...i.dragging!==void 0?{dragging:i.dragging}:{},...i.resizing!==void 0?{resizing:i.resizing}:{}};return s?{...d,width:s.width,height:s.height}:{...d,...typeof i.width=="number"?{width:i.width}:{},...typeof i.height=="number"?{height:i.height}:{},...i.measured?{measured:i.measured}:{}}});return r&&n.length===t.length?t:n}function Cc(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 ia=e=>jsx(ReactFlowProvider,{children:jsx(Tf,{...e})});var aa=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 vr(e,{rowHeight:t,tubeGap:o}){let r=[],n=[],a=e.kind??(e.tubeCount?"tube":"simple"),i=a==="tube"?Math.max(1,Math.min(24,e.tubeCount??1)):1,s=a==="tube"?Math.max(1,Math.min(24,e.fibersPerTube??12)):Math.max(1,Math.min(24,e.fiberCount??12)),c=Math.max(1,e.tubeStartIndex??1),d=Math.max(1,e.fiberStartIndex??1),f=0;for(let g=0;g<i;g+=1){let l=c+g,u=e.tubeColorMap?.[l];n.push({tubeIndex:l,y:f,label:`T${l}`,color:u??Ve(l)});for(let m=0;m<s;m+=1){let w=d+m,h=di(w);r.push({key:`${l}-${w}`,tubeIndex:a==="tube"?l:void 0,fiberIndex:w,y:f,color:ao(w),striped:io(w),backgroundImage:typeof h.backgroundImage=="string"?h.backgroundImage:void 0}),f+=t;}g<i-1&&(f+=o);}return {rows:r,tubeLabels:n,height:f}}var sa=e=>typeof e=="object"&&e!==null,_f=e=>{if(!sa(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&sa(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&sa(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},Hf=e=>e==="fibre-flow"||e==="fibre-flow-link",Mf=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,Af=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",En=e=>typeof e=="string"&&e.startsWith("fiber-"),Rn=(e,t,o)=>e.source===t&&e.sourceHandle===o||e.target===t&&e.targetHandle===o,$f=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!Mf(n))return;let a=o.get(n.id),i=Hf(n.type)?n.type:a?.type??Af(n);r.push({...a??{},...n,type:i});}),r},Ic=e=>To(e.fiber,e.tube??1),Sc=e=>ao(e.fiber),Fc=e=>io(e.fiber),Lf=(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`},Bf=(e,t,o,r,n,a)=>e?`${o} ${a}`:t?`0 ${n} ${r} ${a}`:"6 6",Of=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s})=>{let[c,d,f]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,curvature:.35}),g=typeof s?.lossDb=="number"?`${s.lossDb.toFixed(2)} dB`:"",l=s?.label??g,u=s?.sourceColor,m=s?.targetColor,w=s?.color??u??m??"#94a3b8",h=s?.sourceStriped??false,x=s?.targetStriped??false,P=s?.highlighted??true,E=s?.dimmed??false,D=s?.circuitId,y=s?.circuitLabel??D,R=s?.showCircuitId??false,_=u&&m&&u!==m,M=r-t,F=n-o,A=Math.sqrt(M*M+F*F),L=d-t,O=f-o,z=Math.sqrt(L*L+O*O),Q=A>0?z/A*100:50,re=`fibre-flow-gradient-${e}`,I=h&&!x,H=x&&!h,Z=h&&x,V=A*1.25,j=V/2,X=12,we=Math.ceil(j*1.2/X),ee=Array(we).fill("6 6").join(" "),Ne=Math.ceil(j*1.2/X),fe=Array(Ne).fill("6 6").join(" "),ne=R&&y,me=Math.max(l?l.length*6.2+16:0,ne?(y?.length||0)*5.5+16:0),De=ne?32:16;return jsxs(Fragment,{children:[jsx("defs",{children:_&&jsxs("linearGradient",{id:re,x1:t,y1:o,x2:r,y2:n,gradientUnits:"userSpaceOnUse",children:[jsx("stop",{offset:"0%",stopColor:u}),jsx("stop",{offset:`${Q}%`,stopColor:u}),jsx("stop",{offset:`${Q}%`,stopColor:m}),jsx("stop",{offset:"100%",stopColor:m})]})}),_?jsx("path",{id:e,d:c,fill:"none",stroke:`url(#${re})`,strokeWidth:P?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:w,strokeWidth:P?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:E?.25:1,strokeOpacity:E?.25:1,mixBlendMode:"normal"}}),(Z||I||H)&&jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:P?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:Bf(I,H,ee,fe,j,V),strokeDashoffset:0,opacity:E?.2:.9,style:{mixBlendMode:"normal"}}),(l||ne)&&P&&jsx(EdgeLabelRenderer,{children:jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${d}px, ${f}px)`,width:me,height:De,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:[l&&jsx("div",{style:{lineHeight:1.2},children:l}),ne&&jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:l?2:0},children:y})]})})]})},zf=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s})=>{let[c,d,f]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,curvature:.2}),g=s?.label,l=s?.color??"#64748b";return jsxs(Fragment,{children:[jsx(BaseEdge,{id:e,path:c,style:{stroke:l,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),g&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${d}px, ${f}px)`,padding:"2px 8px",background:"rgba(30, 41, 59, 0.9)",border:`1px solid ${l}`,borderRadius:10,fontSize:10,fontFamily:"monospace",color:"#e2e8f0",letterSpacing:.2,whiteSpace:"nowrap",pointerEvents:"none",zIndex:9999},children:g})})]})},Wf=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:n,showTubeLabels:a,showFiberNumbers:i,layout:s,colorMode:c="dark"}=e,d=c==="light",f=8,g=12,l=-1,u=0,m=t.jacketColor??"#facc15",w=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",h=a&&w,x=o==="left"?f+u:u,P=o==="right"?f+u:u,E=o==="left"?Position.Right:Position.Left,D={width:4,height:4,borderRadius:"50%",background:m,border:`1px solid ${m}`,boxShadow:"0 0 1px rgba(0,0,0,0.4)",top:"50%",position:"absolute",...o==="left"?{left:0,transform:"translate(-50%, -50%)"}:{right:0,transform:"translate(50%, -50%)"}};return 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:d?"rgba(248, 250, 252, 0.95)":"rgba(15, 23, 42, 0.9)",color:d?"#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:f,left:o==="left"?0:void 0,right:o==="right"?0:void 0,borderRadius:4,background:w?"transparent":m,border:`1px solid ${m}`,boxShadow:w?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:w&&s.tubeLabels.map((y,R)=>{let _=s.rows.filter(z=>z.tubeIndex===y.tubeIndex);if(_.length===0)return null;let M=_[0].y,F=_[_.length-1].y+r,A=F-M,L=s.tubeLabels[R+1],O=L&&L.y-F>0;return jsx("div",{style:{position:"absolute",top:M,left:0,right:0,height:A,background:y.color,borderLeft:`2px solid ${y.color}`,borderRight:`2px solid ${y.color}`,borderTop:R===0?`2px solid ${y.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:O?"1px solid rgba(0,0,0,0.15)":`2px solid ${y.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:R===0&&!O||R===0?"4px 4px 0 0":O?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${y.tubeIndex}`)})}),!h&&jsx("div",{style:{position:"absolute",top:0,bottom:0,left:x,right:P,...o==="left"?{borderRight:`1px solid ${m}`}:{borderLeft:`1px solid ${m}`},pointerEvents:"none",zIndex:0}}),w&&s.tubeLabels.map((y,R)=>{let _=s.rows.filter(L=>L.tubeIndex===y.tubeIndex);if(_.length===0)return null;let M=_[0].y,A=_[_.length-1].y+r-M;return jsx("div",{style:{position:"absolute",top:M,left:x,right:P,height:A,...o==="left"?{borderRight:`2px solid ${y.color}`}:{borderLeft:`2px solid ${y.color}`},opacity:.5,pointerEvents:"none"}},`tube-border-${y.tubeIndex}`)}),s.rows.map(y=>{let R=To(y.fiberIndex,y.tubeIndex??1),_=y.y+r/2,M={position:"absolute",width:g,height:g,borderRadius:"50%",top:_,background:y.backgroundImage?y.backgroundImage:y.color,backgroundColor:y.color,border:`2px solid ${y.color}`,boxShadow:"0 0 6px rgba(0,0,0,0.3)",...o==="left"?{right:-g/2}:{left:-g/2},transform:"translateY(-50%)",zIndex:1e3,cursor:"crosshair","--fiber-bg":y.color,minWidth:g,minHeight:g};y.backgroundImage&&(M["--fiber-bg-image"]=y.backgroundImage);let F=o==="left"?{right:g+l,textAlign:"right"}:{left:g+l,textAlign:"left"};return jsxs(ue.Fragment,{children:[jsx(Handle,{id:R,type:"source",position:E,className:"fibre-flow-handle",style:M,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),jsx(Handle,{id:R,type:"target",position:E,className:"fibre-flow-handle",style:M,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),i&&jsx("div",{style:{position:"absolute",top:y.y+r/2-6,...F,fontSize:8,fontWeight:600,color:d?"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:D,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:D,isConnectable:true,"data-handle-type":"cable-run"})]})},Uf=({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})})},Gf=(e,t,o,r,n,a,i,s,c,d="dark")=>{let f=[],g=0;return e.forEach(l=>{let u=vr(l.leftCable,{rowHeight:o,tubeGap:r}),m=vr(l.rightCable,{rowHeight:o,tubeGap:r}),w=Math.max(u.height,m.height),h=a*2+i,x=32,P=16,E=h+P*2,D=w+x+P*2,y=`flow-closure-${l.id}`,R=`flow-cable-${l.id}-left`,_=`flow-cable-${l.id}-right`,M=t==="horizontal"?{x:g,y:0}:{x:0,y:g};g+=(t==="horizontal"?E:D)+n;let F=l.chamberId?`${l.id} - ${l.chamberId}`:l.id;f.push({id:y,type:"fibre-flow-closure",position:M,data:{label:F,width:E,height:D,headerHeight:x,colorMode:d},selectable:false,draggable:false,style:{width:E,height:D}});let A=x+P+(w-u.height)/2,L=x+P+(w-m.height)/2;f.push({id:R,type:"fibre-flow-cable",position:{x:P,y:A},parentId:y,extent:"parent",data:{label:l.leftCable.label,cable:l.leftCable,side:"left",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:c,layout:u,colorMode:d},style:{width:a,height:u.height}}),f.push({id:_,type:"fibre-flow-cable",position:{x:P+h-a,y:L},parentId:y,extent:"parent",data:{label:l.rightCable.label,cable:l.rightCable,side:"right",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:c,layout:m,colorMode:d},style:{width:a,height:m.height}});}),f},Vf=(e,t,o,r=false)=>{let n=[],a=new Map,i=new Map,s=new Map;return (t??[]).forEach(c=>{c.color&&a.set(c.id,c.color),c.label&&i.set(c.id,c.label);}),e.forEach(c=>{let d=`flow-cable-${c.id}-left`,f=`flow-cable-${c.id}-right`;[{nodeId:d,cable:c.leftCable},{nodeId:f,cable:c.rightCable}].forEach(({nodeId:l,cable:u})=>{let m=s.get(u.id);if(m&&m.closureId!==c.id){let w=Lf(u.distanceMeters??m.distanceMeters,u.distanceLabel??m.distanceLabel),h=u.jacketColor??m.jacketColor??"#64748b";n.push({id:`flow-link-${m.nodeId}-${l}`,type:"fibre-flow-link",source:m.nodeId,target:l,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:w,color:h}});}s.set(u.id,{nodeId:l,closureId:c.id,jacketColor:u.jacketColor,distanceLabel:u.distanceLabel,distanceMeters:u.distanceMeters});}),c.splices.forEach(l=>{let u=o?l.circuitId===o:true,m=!!o&&!u,w=l.circuitId?a.get(l.circuitId):void 0,h=l.circuitId?i.get(l.circuitId):void 0,x=l.color??w,P=Sc(l.from),E=Sc(l.to),D=Fc(l.from),y=Fc(l.to);n.push({id:`flow-edge-${c.id}-${l.id}`,type:"fibre-flow",source:d,target:f,sourceHandle:Ic(l.from),targetHandle:Ic(l.to),data:{lossDb:l.lossDb,label:l.label,color:x,sourceColor:P,targetColor:E,sourceStriped:D,targetStriped:y,highlighted:u,dimmed:m,circuitId:l.circuitId,circuitLabel:h,showCircuitId:r}});});}),n},jf=({closures:e,circuits:t,highlightedCircuitId:o,layout:r="horizontal",rowHeight:n=20,tubeGap:a=10,closureGap:i=140,cableColumnWidth:s=32,spliceAreaWidth:c=260,showTubeLabels:d=true,showFiberNumbers:f=true,colorMode:g="dark",showCircuitId:l=false,className:u,style:m,readOnly:w=false,interaction:h})=>{let x=useMemo(()=>Gf(e,r,n,a,i,s,c,d,f,g),[e,r,n,a,i,s,c,d,f,g]),P=useMemo(()=>Vf(e,t,o,l),[e,t,o,l]),[E,D]=useState(x),[y,R]=useState(P);useEffect(()=>{D(x);},[x,D]),useEffect(()=>{R(P);},[P,R]);let _=useCallback((I,H)=>{if(!I||!H||!H.startsWith("fiber-"))return;let Z=E.find(Ne=>Ne.id===I);if(!Z||Z.type!=="fibre-flow-cable")return;let{shape:V}=zt(H);if(V.kind!=="fiber"||V.tube===void 0)return;let j=V.tube,X=V.fiber,ee=Z.data.layout.rows.find(Ne=>(Ne.tubeIndex??1)===j&&Ne.fiberIndex===X);if(ee)return {color:ee.color,striped:ee.striped??false}},[E]),M=useCallback(I=>{if(w||!I.source||!I.target||!I.sourceHandle||!I.targetHandle)return false;let H=E.find(we=>we.id===I.source),Z=E.find(we=>we.id===I.target);if(!H||!Z)return false;let V=typeof I.sourceHandle=="string"&&I.sourceHandle.startsWith("fiber-"),j=typeof I.targetHandle=="string"&&I.targetHandle.startsWith("fiber-");return I.sourceHandle==="cable-run"||I.targetHandle==="cable-run"?true:V&&j?H.type==="fibre-flow-cable"&&Z.type==="fibre-flow-cable":false},[E,w]),F=useCallback(I=>{if(w)return;let H=I.sourceHandle==="cable-run"||I.targetHandle==="cable-run",Z=En(I.sourceHandle),V=En(I.targetHandle),j=H?void 0:_(I.source,I.sourceHandle),X=H?void 0:_(I.target,I.targetHandle),we=H?void 0:{sourceColor:j?.color,targetColor:X?.color,color:j?.color??X?.color,sourceStriped:j?.striped,targetStriped:X?.striped};R(ee=>{let Ne=ee.filter(fe=>{let ne=Z&&Rn(fe,I.source,I.sourceHandle),me=V&&Rn(fe,I.target,I.targetHandle);return !(ne||me)});return addEdge({...I,type:H?"fibre-flow-link":"fibre-flow",data:we},Ne)});},[_,w,R]),A=useCallback((I,H)=>{if(w)return;let Z=H.sourceHandle==="cable-run"||H.targetHandle==="cable-run",V=Z?void 0:_(H.source,H.sourceHandle),j=Z?void 0:_(H.target,H.targetHandle),X=Z?void 0:{sourceColor:V?.color,targetColor:j?.color,color:V?.color??j?.color,sourceStriped:V?.striped,targetStriped:j?.striped};R(we=>{let ee=we.filter(me=>me.id!==I.id),Ne=En(H.sourceHandle),fe=En(H.targetHandle),ne=ee.filter(me=>{let De=Ne&&Rn(me,H.source,H.sourceHandle),Xe=fe&&Rn(me,H.target,H.targetHandle);return !(De||Xe)});return addEdge({...H,type:Z?"fibre-flow-link":"fibre-flow",data:X},ne)});},[_,w,R]),L=useCallback(I=>{w||D(I.filter(_f));},[w,D]),O=useCallback(I=>{w||R(H=>$f(I,H));},[w,R]),z=useMemo(()=>({"fibre-flow-cable":Wf,"fibre-flow-closure":Uf}),[]),Q=useMemo(()=>({"fibre-flow":Of,"fibre-flow-link":zf}),[]),re={borderRadius:8,overflow:"hidden",...m};return jsx(ia,{nodes:E,edges:y,onNodesChange:L,onEdgesChange:O,onConnect:F,onEdgeUpdate:A,isValidConnection:M,connectionMode:ConnectionMode.Loose,nodeTypes:z,edgeTypes:Q,className:u,style:re,colorMode:g,readOnly:w,interaction:h,fitViewOptions:{padding:.2}})},Xf=e=>jsx(jf,{...e});var qf=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:n=150,layout:a,showTubeLabels:i,showFiberNumbers:s=true,showCableLabel:c=true})=>{let d=useMemo(()=>a??vr(e,{rowHeight:o,tubeGap:r}),[a,e,o,r]),f=26,g=10,l=18,u=t==="left"?n-l:l,m=8,w=t==="left"?6:n-f-18,h=e.jacketColor??"#facc15",x=i??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxs("div",{style:{position:"relative",width:n,height:d.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:f,left:t==="left"?0:void 0,right:t==="right"?0:void 0,borderRadius:14,background:`linear-gradient(90deg, ${h} 0%, ${h} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${h}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),x&&d.tubeLabels.map(P=>jsxs("div",{style:{position:"absolute",top:P.y+o/2-6,left:w,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:P.color,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 3px rgba(0,0,0,0.25)"}}),jsx("span",{children:P.label})]},`tube-${P.tubeIndex}`)),d.rows.map(P=>{let E=P.y+o/2-g/2,D=t==="left"?u-g/2-m:u+g/2+m;return jsxs(ue.Fragment,{children:[jsx("div",{style:{position:"absolute",top:E,left:u-g/2,width:g,height:g,borderRadius:"50%",backgroundColor:P.color,backgroundImage:P.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:P.y+o/2-6,left:D,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:P.fiberIndex})]},P.key)})]})};var $c=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,a)=>{n.position={x:a*300,y:100};}),o.forEach(n=>{if(n.parentId){let a=t.find(i=>i.id===n.parentId);if(a){let i=n.data.uPosition||1,s=n.data.uHeight||1;n.position={x:a.position.x+50,y:a.position.y+i*20-s*10};}}else n.position={x:Math.random()*400+100,y:Math.random()*200+50};}),r.forEach((n,a)=>{n.position={x:a*150+100,y:300};}),e};function Tn(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 vn(e){if(!e)return;if(typeof e=="string")return e;let t=e.device;return typeof t=="object"&&t?t.id:t}var Lc=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}}),Bc=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=vn(e.termination_a),o=vn(e.termination_b);return {id:`cable-${e.id}`,source:Tn(t)??"device-unknown-source",target:Tn(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}}},zc=e=>{let t=[],o=[],r=new Map;return e.racks.forEach(n=>t.push(Lc(n))),e.devices.forEach(n=>{let a=Bc(n);t.push(a),r.set(n.name,a.id);}),e.cables.forEach(n=>{let a=Oc(n),i=vn(n.termination_a),s=vn(n.termination_b);o.push({...a,source:(typeof i=="string"?r.get(i):void 0)??Tn(i)??a.source,target:(typeof s=="string"?r.get(s):void 0)??Tn(s)??a.target});}),{nodes:t,edges:o}},Zf=e=>Qt(zc(e)),Jf=e=>$c(e);var Wc=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Qf="Interfaces",eg="Management",tg="Power",Uc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ht=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Mt=e=>{if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},og=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",In=e=>Uc(e.custom_fields)?e.custom_fields:void 0,Sn=e=>Uc(e)?e:void 0,Gc=(e,t)=>{let o=In(e),r=Sn(o?.layout);return og(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},Vc=(e,t,o)=>{let r=In(e),n=Sn(r?.layout),a=Ht(o)??Ht(e.layout?.group)??Ht(e.port_group)??Ht(n?.group)??Ht(r?.port_group)??Ht(r?.portGroup)??Ht(r?.interface_group)??Ht(r?.interfaceGroup)??Ht(r?.group);return a||(t==="power_ac"||t==="power_c13"||t==="power_c19"?tg:t==="console"||t==="mgmt"?eg:Qf)},jc=(e,t,o)=>{let r=In(e),n=Sn(r?.layout);return Mt(o)??Mt(e.layout?.connectorType)??Mt(e.layout?.connector_type)??Mt(e.connector_type)??Mt(n?.connectorType)??Mt(n?.connector_type)??Mt(r?.connectorType)??Mt(r?.connector_type)??Mt(t)},Xc=(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":o.includes("rj45")||o.includes("rj-45")?"rj45":"ethernet"},Yc=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"}},rg=e=>typeof e=="string"?cr(e):it(e),Kc=(e,t,o)=>{if(!o)return;let r=In(e),n=Sn(r?.layout),a=[t?.position,t,e.layout?.position,e.layout,n?.position,n,r?.port_position,r?.portPosition,r?.position,r,e];for(let i of a){let s=rg(i);if(s)return s}},ng=(e,t)=>{let o=e.type?.value??e.type?.label??e.layout?.type??void 0,r=jc(e,o),n=Xc(o,r),a=Vc(e,n);return {id:e.name,label:e.name,face:Gc(e),group:a,type:n,cableType:Yc(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:Kc(e,void 0,t)}},ig=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)}),ag=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[];return ig(e.interfaces??[]).forEach((i,s)=>{let c=r?r({device:e,iface:i,index:s}):ng(i,o);if(!c)return;let d=c.type??i.type?.value??i.type?.label??void 0,f=jc(i,d,c.connectorType),g=Xc(d,f),l=Gc(i,c.face),u=Vc(i,g,c.group);n.push({id:c.id,label:c.label??i.name,face:l,group:u,connected:c.connected??!!(i.connected_endpoint||i.cable),type:g,cableType:Yc(c.cableType??i.type?.value??i.type?.label??void 0),connectorType:f,position:Kc(i,c,o)});}),n},qc=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}}),Zc=(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=ag(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}},Jc=e=>({id:`cable-${e.id}`,source:Wc(e.termination_a.device),sourceHandle:e.termination_a.name,target:Wc(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}}),Qc=(e,t={})=>{let o=[],r=[],n=new Map;return e.racks.forEach(a=>{o.push(qc(a));}),e.devices.forEach(a=>{let i=Zc(a,t);o.push(i),n.set(a.name,i.id);}),e.cables.forEach(a=>{let i=Jc(a),s=(typeof a.termination_a.device.id=="number"?`device-${a.termination_a.device.id}`:void 0)??n.get(a.termination_a.device.name)??i.source,c=(typeof a.termination_b.device.id=="number"?`device-${a.termination_b.device.id}`:void 0)??n.get(a.termination_b.device.name)??i.target;r.push({...i,source:s,target:c});}),{nodes:o,edges:r}},sg=(e,t={})=>Qt(Qc(e,t)),cg=(e,t)=>{let o=new Map,r=new Set;return e.filter(a=>a.position!==null).sort((a,i)=>(a.position||0)-(i.position||0)).forEach(a=>{a.position&&(o.set(a.id,a.position),r.add(a.position));}),o};function Fn(e){let{items:t,checkOutOfBounds:o,checkConflicts:r}=e,n=[],a=[];for(let i of t){let s=o(i);s&&!s.isValid&&s.error&&a.push(s.error);}for(let i=0;i<t.length;i++){let s=t[i];for(let c=i+1;c<t.length;c++){let d=t[c],f=r(s,d);f&&f.hasConflict&&f.conflict&&n.push(f.conflict);}}return {isValid:n.length===0&&a.length===0,conflicts:n,outOfBounds:a}}var dg=yt,lg="Network Ports",ug="Rear Network Ports",pg="Power Ports",_n=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Be=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},ed=e=>{let t=Be(e)?.toLowerCase();if(t==="front")return "front";if(t==="rear"||t==="back")return "rear"},Hn=e=>{let t=Be(e)?.toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},fg=e=>Re(e)?"rear":"front",gg=({face:e,type:t})=>Re(t)?pg:e==="rear"?ug:lg;function An(e){return ed(e.face)??fg(e.type)}var mg=An;function $n(e){return Be(e.group)??gg({face:An(e),type:e.type})}var bg=$n;function Mn(e){if(!Array.isArray(e))return;let t=e.map(o=>{if(!_n(o))return null;let r=Be(o.label);if(!r)return null;let n=Be(o.type),a=An({face:ed(o.face),type:n}),i=$n({face:a,group:Be(o.group),type:n}),s=it(o.position??o),c=typeof o.order=="number"&&Number.isFinite(o.order)?o.order:void 0;return {...Be(o.id)?{id:Be(o.id)}:{},label:r,face:a,group:i,connected:typeof o.connected=="boolean"?o.connected:void 0,...n?{type:n}:{},...Be(o.cableType)?{cableType:Be(o.cableType)}:{},...Hn(o.connectorType)?{connectorType:Hn(o.connectorType)}:{},...typeof c=="number"?{order:c}:{},...s?{position:s}:{}}}).filter(o=>o!==null);return t.length>0?t:void 0}var hg=Mn;function Ir(e,t){return Array.isArray(e)?e.flatMap(o=>!_n(o)||!Array.isArray(o.ports)?[]:o.ports.map((r,n)=>{if(!_n(r))return null;let a=Be(r.label);if(!a)return null;let i=Be(r.type),s=$n({face:t,group:Be(o.name),type:i}),c=it(r.position??r),d=typeof r.order=="number"&&Number.isFinite(r.order)?r.order:n;return {...Be(r.id)?{id:Be(r.id)}:{},label:a,face:t,group:s,connected:typeof r.connected=="boolean"?r.connected:void 0,...i?{type:i}:{},...Be(r.cableType)?{cableType:Be(r.cableType)}:{},...Hn(r.connectorType)?{connectorType:Hn(r.connectorType)}:{},order:d,...c?{position:c}:{}}}).filter(r=>r!==null)):[]}function Ln(e){if(_n(e)){let r=Mn(e.ports);if(r)return r;let n=Ir(e.ports,"front"),a=n.length>0?n:Ir(e.portGroups,"front"),i=Ir(e.rearPortGroups,"rear"),s=i.length>0?i:Ir(e.rearPorts,"rear"),c=[...a,...s];return c.length>0?c:void 0}let t=Mn(e);if(t)return t;let o=Ir(e,"front");return o.length>0?o:void 0}var yg=Ln;function td({portGroups:e,rearPortGroups:t}){let o=[],r=(n,a)=>{n?.forEach(i=>{i.ports.forEach((s,c)=>{o.push({...typeof s.id=="string"&&s.id.trim().length>0?{id:s.id}:{},label:s.label,face:a,group:i.name,connected:s.connected,...s.type?{type:s.type}:{},...s.cableType?{cableType:s.cableType}:{},...s.connectorType?{connectorType:s.connectorType}:{},order:c,...s.position?{position:s.position}:{}});});});};return r(e,"front"),r(t,"rear"),o}var wg=td;function da(e){if(!Array.isArray(e)||e.length===0)return {portGroups:[],rearPortGroups:[]};let{ports:t,rearPorts:o}=qr(e);return {portGroups:t,rearPortGroups:o}}var Ng=da;function od(e,t,o={}){let r=yt(e,t);if(Re(t.type))return [r];let n=String(o.deviceType??"").toLowerCase(),a=o.face??"front";return n==="switch"||n==="router"?[r,`${r}-target`]:n==="patch-panel"||n==="patch_panel"?a==="rear"?[r,`${r}-target`]:[r,`${r}-source`]:[r]}function rd(e,t,o={}){let r=o.sanitizeHandle??(c=>Ee(c)),n=r(t),{ports:a,rearPorts:i}=Le(e),s=(c,d)=>{for(let f of c)for(let g of f.ports)if(od(f.name,g,{deviceType:o.deviceType,face:d}).some(u=>r(u)===n))return {port:g,blockName:f.name,face:d}};return s(a,"front")??s(i,"rear")}function xg(e,t,o={}){return rd(e,t,o)!==void 0}function kg(e){return da(e)}var Yo=class extends Error{constructor(o,r,n,a,i){super(`Device placement conflict: ${r} at U${n}-${n+a-1} in rack ${o}${i?` conflicts with ${i}`:""}`);this.rackId=o;this.deviceId=r;this.uPosition=n;this.uHeight=a;this.conflictWith=i;this.name="DevicePlacementError";}};function la(e,t={}){let o=Ie(e);return Fn({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 a=r.unit,i=r.unit+r.height-1,s=n.unit,c=n.unit+n.height-1;if(a<=c&&i>=s){if(o){let d=Ge(r),f=Ge(n);if(!Jr(d,f))return null}return {hasConflict:true,conflict:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,conflictWith:n.id}}}return null}})}function nd(e,t,o={}){let{deviceTypeMapping:r={}}=o,n=r[e.type]||"device",a=Ao(t,e.unit,e.height,e);return {id:e.id,type:n,position:a,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??e.rearPorts,connections:e.connections,frontImageUrl:e.frontImageUrl,rearImageUrl:e.rearImageUrl,frontImageAttribution:e.frontImageAttribution,rearImageAttribution:e.rearImageAttribution,imageFit:e.imageFit,imagePosition:e.imagePosition,imageRepeat:e.imageRepeat,stretchToFit:e.stretchToFit,rackWidthPx:t.data.rackWidthPx,rackLayout:t.data.rackLayout,rackFaceGapPx:t.data.rackFaceGapPx,mountMode:Ge(e)}}}function Pg(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 Dg(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=la(i,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(d=>{c.push(`Device ${d.deviceId} at U${d.uPosition}-${d.uPosition+d.uHeight-1} conflicts with ${d.conflictWith}`);}),s.outOfBounds.forEach(d=>{c.push(`Device ${d.deviceId} at U${d.uPosition}-${d.uPosition+d.uHeight-1} exceeds rack height (${d.rackUHeight}U)`);}),new Yo(i.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 i of e){let s=Pg(i);n.push(s);for(let c of i.devices)try{let d=nd(c,s,t);a.push(d);}catch(d){if(o==="strict")throw d;if(o==="nearest"){let f=rn(s,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:Ge(c)}},a,c.unit);if(f!==void 0&&f!==c.unit){console.warn(`Device ${c.id} moved from U${c.unit} to U${f} due to conflict`);let g={...c,unit:f},l=nd(g,s,t);a.push(l);}else throw new Yo(i.id,c.id,c.unit,c.height)}}}return n.push(...a),n}function Cg(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let a=e.filter(i=>eo(i.type)&&i.parentId===r.id).sort((i,s)=>{let c=i.data.uPosition||1,d=s.data.uPosition||1;return c!==d?c-d:i.id.localeCompare(s.id)}).map(i=>{let s=Ln(i.data);return {id:i.id,name:i.data.label,unit:i.data.uPosition||1,height:i.data.uHeight||1,type:i.data.deviceType||"server",width:i.data.width==="full"||i.data.width==="half"?i.data.width:void 0,ports:s,portGroups:Array.isArray(i.data.portGroups)?i.data.portGroups:void 0,rearPortGroups:Array.isArray(i.data.rearPortGroups)?i.data.rearPortGroups:void 0,role:typeof i.data.role=="string"?i.data.role:void 0,status:i.data.status,connections:i.data.connections,frontImageUrl:i.data.frontImageUrl,rearImageUrl:i.data.rearImageUrl,frontImageAttribution:i.data.frontImageAttribution,rearImageAttribution:i.data.rearImageAttribution,imageFit:i.data.imageFit,imagePosition:i.data.imagePosition,imageRepeat:i.data.imageRepeat,stretchToFit:i.data.stretchToFit,mountMode:Ge(i.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:a,rackWidthPx:r.data.rackWidthPx});}return t}function Eg(e,t,o,r){return e.map(n=>n.id!==t?n:{...n,devices:n.devices.map(a=>a.id!==o?a:{...a,unit:r})})}function Rg(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!la({...a,devices:[...a.devices,o]},r).isValid)throw new Yo(t,o.id,o.unit,o.height);return {...a,devices:[...a.devices,o]}})}function Tg(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,a){super(`Splice placement conflict: ${r} at holder ${n} in tray ${o}${a?` conflicts with ${a}`:""}`);this.trayId=o;this.spliceId=r;this.holder=n;this.conflictWith=a;this.name="SplicePlacementError";}};function ua(e,t={}){return Fn({items:e.splices,checkOutOfBounds:o=>o.holder<1||o.holder>jt?{isValid:false,error:{spliceId:o.id,holder:o.holder,max:jt}}:null,checkConflicts:(o,r)=>o.holder===r.holder?{hasConflict:true,conflict:{spliceId:o.id,holder:o.holder,conflictWith:r.id}}:null})}function id(e,t){let o=e.mode==="ribbon",r=kr(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 vg(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function Ig(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=ua(i,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(d=>{c.push(`Splice ${d.spliceId} at holder ${d.holder} conflicts with ${d.conflictWith}`);}),s.outOfBounds.forEach(d=>{c.push(`Splice ${d.spliceId} at holder ${d.holder} is out of bounds (max: ${d.max})`);}),new Ko(i.id,s.conflicts[0]?.spliceId||s.outOfBounds[0]?.spliceId||"unknown",s.conflicts[0]?.holder||s.outOfBounds[0]?.holder||1)}}for(let i of e){let s=vg(i);n.push(s);for(let c of i.splices)try{let d=c.holder;if(o==="nearest"){let l={id:c.id,type:"splice",position:{x:0,y:0},data:{label:c.name,holderPosition:c.holder}},u=[...n,...a];wr(s,l,c.holder,u)||(d=xr(s,l,u,c.holder));}let f=d!==c.holder?{...c,holder:d}:c,g=id(f,s);a.push(g);}catch(d){if(o==="strict")throw d;if(o==="nearest"){let f=[...n,...a],g=xr(s,{id:c.id,data:{label:c.name,holderPosition:c.holder}},f,c.holder);if(g!==c.holder){console.warn(`Splice ${c.id} moved from holder ${c.holder} to holder ${g} due to conflict`);let l={...c,holder:g},u=id(l,s);a.push(u);}else throw new Ko(i.id,c.id,c.holder)}}}return n.push(...a),n}function Sg(e){let t=[],o=e.filter(r=>r.type==="splice-tray");for(let r of o){let a=e.filter(i=>i.type==="splice"&&i.parentId===r.id).map(i=>({id:i.id,name:i.data.label,holder:i.data.holderPosition||1,lossDb:i.data.lossDb,mode:i.data.mode||"single",ribbonFiberIds:i.data.ribbonFiberIds}));t.push({id:r.id,name:r.data.label,position:r.position,splices:a});}return t}function Fg(e,t,o,r){return e.map(n=>n.id!==t?n:{...n,splices:n.splices.map(a=>a.id!==o?a:{...a,holder:r})})}function _g(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!ua({...a,splices:[...a.splices,o]},r).isValid)throw new Ko(t,o.id,o.holder);return {...a,splices:[...a.splices,o]}})}function Hg(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}function Mg(e,t,o={}){let r=o.direction??"horizontal",n=o.spacing??220,a=o.origin??{x:0,y:0},i=e.map((c,d)=>({id:c.id,type:c.type??"fiber",position:r==="vertical"?{x:a.x,y:a.y+d*n}:{x:a.x+d*n,y:a.y},data:c.data??{label:c.id}})),s=t.map(c=>({id:c.id,source:c.source,target:c.target,type:c.type??"fiber",data:c.data}));return {nodes:i,edges:s}}function ad(e){let{width:t,height:o}=Nt(e.data),r=e.position.x,n=e.position.x+t,a=e.position.y,i=e.position.y+o;return {left:r,right:n,top:a,bottom:i}}function sd(e,t){let o=ad(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function Ag(e,t){let o=null,r=1/0;for(let n of t){if(!sd(e,n))continue;let a=Math.sqrt(Math.pow(e.x-n.position.x,2)+Math.pow(e.y-n.position.y,2));a<r&&(r=a,o=n);}return o}var cd=2;var ae=e=>typeof e=="string"?e.trim():"",dd=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},$g=e=>{let t=ae(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},Lg=(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":o.includes("rj45")||o.includes("rj-45")?"rj45":"ethernet"},Bg=e=>{if(e==="power_c13")return "C13";if(e==="power_c19")return "C19";if(e==="power_ac")return "AC"},Og=e=>e.toLowerCase().replace(/_/g,"-").trim(),zg=e=>e>=1?"rackable":"zero-u",Wg=e=>(e??"").toLowerCase()==="half"?"half":"full",Ug=(e,t,o,r)=>{let n=r.replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();return `${e}-b${t}-${n||`p${o}`}`},ld=(e,t)=>`${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");function Gg(e){let t=[],o=ae(e.manufacturer),r=ae(e.model),n=ae(e.role)||ae(e.deviceType)||ae(e.device_type)||"device",a=dd(e.uHeight)??dd(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 i=ae(e.id)||ae(e.slug)||ld(o,r)||"unknown",s=ae(e.slug)||ld(o,r)||i,c=Array.isArray(e.ports)?e.ports:[],d=Array.isArray(e.rearPorts)?e.rearPorts:Array.isArray(e.rear_ports)?e.rear_ports:[],g=(Array.isArray(e.frontRearPortLinks)?e.frontRearPortLinks:Array.isArray(e.front_rear_port_links)?e.front_rear_port_links:[]).map(l=>({frontPortId:ae(l.frontPortId)||ae(l.front_port_id),rearPortId:ae(l.rearPortId)||ae(l.rear_port_id)}));return {id:i,slug:s,manufacturer:o,model:r,role:n,uHeight:a,width:ae(e.width)||void 0,frontBlocks:c,rearBlocks:d,rawLinks:g,frontImageUrl:ae(e.frontImageUrl)||ae(e.front_image_url)||void 0,rearImageUrl:ae(e.rearImageUrl)||ae(e.rear_image_url)||void 0,frontImageAttribution:ae(e.frontImageAttribution)||void 0,rearImageAttribution:ae(e.rearImageAttribution)||void 0,tags:Array.isArray(e.tags)?e.tags.map(ae).filter(Boolean):[],sourceRepository:ae(e.sourceRepository)||ae(e.source_repository)||void 0,sourcePath:ae(e.sourcePath)||ae(e.source_path)||void 0,issues:t}}function ud(e,t,o){let r=ae(e.name)||`Block ${o+1}`,a=(Array.isArray(e.ports)?e.ports:[]).map((i,s)=>{let c=ae(i.label)||ae(i.name)||`Port ${s+1}`,d=$g(i.connectorType??i.connector_type),f=Lg(ae(i.type),d),g=d??Bg(f),u={id:ae(i.id)||Ug(t,o,s,c),label:c,type:f,connectorType:g};if(i.position){let m=it(i.position);m&&(u.position=m);}return u});return {name:r,ports:a}}function Vg(e){let t=[],o=Og(e.role),r=e.uHeight,n=zg(r),a=Wg(e.width),i=e.frontBlocks.map((c,d)=>ud(c,"front",d)),s=e.rearBlocks.map((c,d)=>ud(c,"rear",d));return {role:o,mountClass:n,uHeight:r,width:a,frontFace:{portBlocks:i,imageUrl:e.frontImageUrl,imageAttribution:e.frontImageAttribution},rearFace:{portBlocks:s,imageUrl:e.rearImageUrl,imageAttribution:e.rearImageAttribution},issues:t}}function jg(e,t){let o=new Set(e.portBlocks.map(a=>a.name)),r=new Set(t.portBlocks.map(a=>a.name)),n=[...o].filter(a=>r.has(a));return n.length===0?{front:e,rear:t}:{front:{...e,portBlocks:e.portBlocks.map(a=>n.includes(a.name)?{...a,name:`Front \xB7 ${a.name}`}:a)},rear:{...t,portBlocks:t.portBlocks.map(a=>n.includes(a.name)?{...a,name:`Rear \xB7 ${a.name}`}:a)}}}function Xg(e){let t=[],{front:o,rear:r}=jg(e.frontFace,e.rearFace),n=e.role;return (!n||n==="device")&&[...o.portBlocks,...r.portBlocks].some(i=>i.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 Sr(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function Yg(e,t){let o=[],r=[];for(let u of t.frontFace.portBlocks)for(let m of u.ports)r.push({id:m.id,face:"front"});for(let u of t.rearFace.portBlocks)for(let m of u.ports)r.push({id:m.id,face:"rear"});let n=new Map;for(let{id:u}of r)n.set(u,(n.get(u)??0)+1);for(let[u,m]of n)m>1&&o.push({severity:"error",code:"DUPLICATE_PORT_ID",message:`Duplicate port id "${u}" found ${m} times`,path:`ports.${u}`});let a=e.frontBlocks.reduce((u,m)=>u+(Array.isArray(m.ports)?m.ports.length:0),0),i=e.rearBlocks.reduce((u,m)=>u+(Array.isArray(m.ports)?m.ports.length:0),0),s=Sr(t.frontFace),c=Sr(t.rearFace);s!==a&&o.push({severity:"error",code:"FRONT_PORT_COUNT_MISMATCH",message:`Front port count mismatch: raw=${a}, parsed=${s}`,path:"faces.front"}),c!==i&&o.push({severity:"error",code:"REAR_PORT_COUNT_MISMATCH",message:`Rear port count mismatch: raw=${i}, parsed=${c}`,path:"faces.rear"});let d=new Set(r.map(u=>u.id)),f=new Set(r.filter(u=>u.face==="front").map(u=>u.id)),g=new Set(r.filter(u=>u.face==="rear").map(u=>u.id));for(let u of e.rawLinks)u.frontPortId&&!f.has(u.frontPortId)&&!d.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&&!g.has(u.rearPortId)&&!d.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 Kg(e,t,o){let r=e.rawLinks.filter(a=>!!a.frontPortId&&!!a.rearPortId).map(a=>({frontPortId:a.frontPortId,rearPortId:a.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 qg(e){let t=Gg(e),o=Vg(t),r=Xg(o),n=Yg(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:Kg(t,o,r),report:n}:{template:null,report:n}}function Zg(e){return Sr(e)}function Jg(e,t,o){let r=[],n=Sr(e.faces.front),a=Sr(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!==a&&r.push({severity:"error",code:"RENDER_REAR_COUNT_MISMATCH",message:`Rendered rear handle count (${o}) does not match template (${a})`,path:"faces.rear"}),r}
|
|
2
|
-
export{
|
|
1
|
+
import ce,{useState,useMemo,useRef,useEffect,Component,useCallback,useSyncExternalStore}from'react';import {useStoreApi,Handle,Position,getBezierPath,BaseEdge,EdgeLabelRenderer,getSmoothStepPath,SmoothStepEdge,useUpdateNodeInternals,useEdges,useReactFlow,ReactFlowProvider,addEdge,ConnectionMode,useNodesState,useEdgesState,applyNodeChanges,useOnSelectionChange,applyEdgeChanges,ReactFlow,Background,Controls,MiniMap,Panel}from'reactflow';export{ConnectionMode,Position}from'reactflow';import {toPng}from'html-to-image';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Ca=/-(source|target)$/i,Vn=/--(rear|front)$/i;function lt(e){return e?e.replace(Ca,""):""}function Re(e){return lt(e).replace(Vn,"")}function Te(e){return typeof e=="string"&&e.toLowerCase().includes("power")}function bt(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:Te(t.type)?t.label:`${e}-${t.label}`}function sr(e){let t=lt(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}function Gd(e,t,o){return !t||(typeof o?.portType=="string"&&o.portType.length>0?Te(o.portType):sr(e))?e:`${lt(e)}-${t}`}var Vd=/^\d+$/,jd=/^fiber-(\d+)-(\d+)$/,Xd=/^fiber-(\d+)$/,Yd=/^tube-(\d+)$/,Kd=/^(left|right)-(\d+)$/,qd=/^(input|output)-(\d+)$/;function Zd(e){if(Vd.test(e))return {kind:"outlet",outlet:Number(e)};let t=jd.exec(e);if(t)return {kind:"fiber",tube:Number(t[1]),fiber:Number(t[2])};let o=Xd.exec(e);if(o)return {kind:"fiber",fiber:Number(o[1])};let r=Yd.exec(e);if(r)return {kind:"tube",tube:Number(r[1])};if(e==="left"||e==="right")return {kind:"splice-side",side:e};let n=Kd.exec(e);if(n)return {kind:"side-port",side:n[1],index:Number(n[2])};let a=qd.exec(e);return a?{kind:"split-io",io:a[1],index:Number(a[2])}:e==="cable-button"?{kind:"cable-button"}:{kind:"port"}}function zt(e){let t=e??"",o=Ca.exec(t),r=o?t.slice(0,t.length-o[0].length):t,n=Vn.exec(r),a=n?r.slice(0,r.length-n[0].length):r,i={raw:t,base:a,shape:Zd(a)};return o&&(i.direction=o[1].toLowerCase()),n&&(i.faceAlias=n[1].toLowerCase()),i}function vo(e,t){return t===void 0?`fiber-${e}`:`fiber-${t}-${e}`}function jn(e){return `tube-${e}`}function Jd(e){return e}function cr(e,t){return `${e}-${t}`}function Qd(e,t){return `${e}-${t}`}function Gr(e,t){return `${e.replace(Vn,"")}--${t}`}function el(e){return e.replace(/\+/g,"")}function tl(e){let{shape:t}=zt(e);if(t.kind==="splice-side")return t.side==="left"?"right":"left";if(t.kind==="side-port")return cr(t.side==="left"?"right":"left",t.index)}var Xn={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 Wt(e){let t=Xn[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,a=o?10:r?7:5*1.3,i=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:a,color:t.color,borderColor:t.borderColor,fontSize:o?"3px":r?"3.5px":"4px",...i}}function Ea(e){let t=Xn[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function ol(e){return Ea(e).amperage===16}function Rt(e){return e%10<8?"C13":"C19"}function Yn(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var rl=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Io=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}},nl=e=>e.trim().toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>0),Kn=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"),il=(e,t)=>{let o=t.includes("left"),r=t.includes("right"),n=t.includes("top")||t.includes("up"),a=t.includes("bottom")||t.includes("down"),i=Ra(t);if(e==="top"||e==="bottom")return o&&i&&!r?34:r&&i&&!o?66:o&&!r?12:r&&!o?88:i?50:void 0;if(n&&i&&!a)return 34;if(a&&i&&!n)return 66;if(n&&!a)return 12;if(a&&!n)return 88;if(i)return 50},al=e=>{if(e.includes("front")||e.includes("rear")||e.includes("back"))return;let o=e.map(Kn).find(n=>n!==void 0);if(!o)return;let r=il(o,e);if(r!==void 0)return {side:o,offsetPercent:r}},sl=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"),a=e.includes("rear")||e.includes("back")||e.includes("bottom")||e.includes("down"),i;t&&r&&!o?i=34:o&&r&&!t?i=66:t&&!o?i=12:o&&!t?i=88:r&&(i=50);let s;if(n&&!a?s=22:a&&!n?s=78:r&&(s=50),!(i===void 0||s===void 0))return {xPercent:i,yPercent:s}},dr=e=>{let t=nl(e);if(t.length!==0){if(t.length===1){let o=Kn(t[0]);return o?{side:o}:void 0}return al(t)??sl(t)}},nt=e=>{if(typeof e=="string")return dr(e);if(!rl(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"?dr(t):void 0,n=(typeof t=="string"?Kn(t.trim().toLowerCase()):void 0)??o?.side,a=Io(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct)??o?.offsetPercent,i=Io(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels)??o?.offsetPx,s=Io(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x)??o?.xPercent,c=Io(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y)??o?.yPercent,d=Io(e.widthPercent??e.width_percent??e.widthPct??e.width_pct??e.wPercent??e.w_percent),f=Io(e.heightPercent??e.height_percent??e.heightPct??e.height_pct??e.hPercent??e.h_percent);if(!(n===void 0&&a===void 0&&i===void 0&&s===void 0&&c===void 0&&d===void 0&&f===void 0))return {side:n,offsetPercent:a,offsetPx:i,xPercent:s,yPercent:c,widthPercent:d,heightPercent:f}};var cl="Network Ports",dl="Rear Network Ports",ll="Power Ports",Ta=8,ul=92;function So(e){return Math.max(0,Math.min(100,e))}function Zn(e){if(e==="top"||e==="right"||e==="bottom"||e==="left")return e}function Fo(e){return nt(e)}function va(e){let t=Fo(e.position);return typeof t?.xPercent=="number"&&typeof t?.yPercent=="number"}function pl(e){let t=Fo(e.position);return typeof t?.offsetPercent=="number"||typeof t?.offsetPx=="number"}function fl(e){return e.face==="rear"||e.face==="back"?"rear":e.face==="front"?"front":Te(e.type)?"rear":"front"}function gl(e,t){return typeof e.group=="string"&&e.group.trim().length>0?e.group.trim():Te(e.type)?ll:t==="rear"?dl:cl}function jr(e){return typeof e.port.order=="number"&&Number.isFinite(e.port.order)?e.port.order:e.index}function ml(e,t){return t<=1?50:Ta+e*(ul-Ta)/(t-1)}function bl(e){let t=e.filter(n=>!!Zn(Fo(n.port.position)?.side)&&!va(n.port)&&!pl(n.port)),o=new Map,r=new Map;return t.forEach(n=>{let a=Zn(Fo(n.port.position)?.side);if(!a)return;let i=r.get(a);if(i){i.push(n);return}r.set(a,[n]);}),r.forEach(n=>{let a=[...n].sort((i,s)=>{let c=jr(i)-jr(s);return c!==0?c:i.index-s.index});a.forEach((i,s)=>{o.set(i.index,ml(s,a.length));});}),o}function hl(e,t){let o=Fo(e.position),r=Zn(o?.side);if(va(e)){let s={xPercent:So(o?.xPercent),yPercent:So(o?.yPercent)};return typeof o?.widthPercent=="number"&&Number.isFinite(o.widthPercent)&&(s.widthPercent=So(o.widthPercent)),typeof o?.heightPercent=="number"&&Number.isFinite(o.heightPercent)&&(s.heightPercent=So(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 i=(typeof o?.offsetPercent=="number"&&Number.isFinite(o.offsetPercent)?So(o.offsetPercent):void 0)??(typeof t=="number"?So(t):void 0);return typeof i=="number"&&(n.offsetPercent=i),n}function yl(e,t){let o=hl(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 Vr(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 qn(e){return Array.isArray(e)&&e.length>0&&e.every(t=>t!==null&&typeof t=="object"&&typeof t.name=="string"&&Array.isArray(t.ports))}function wl(e){return Array.isArray(e)&&e.length>0&&e.every(t=>t!==null&&typeof t=="object"&&typeof t.label=="string"&&!(typeof t.name=="string"&&Array.isArray(t.ports)))}function Xr(e){let t=new Map;e.forEach((n,a)=>{if(typeof n.label!="string"||n.label.trim().length===0)return;let i=fl(n),s=gl(n,i),c=`${i}:${s}`,d=t.get(c);if(d){d.entries.push({index:a,port:{...n,label:n.label.trim()}});return}t.set(c,{face:i,groupName:s,entries:[{index:a,port:{...n,label:n.label.trim()}}]});});let o=[],r=[];return t.forEach(n=>{let a=[...n.entries].sort((c,d)=>{let f=jr(c)-jr(d);return f!==0?f:c.index-d.index}),i=bl(a),s={name:n.groupName,ports:a.map(c=>yl(c,i.get(c.index)))};if(n.face==="rear"){r.push(s);return}o.push(s);}),{ports:o,rearPorts:r}}function Le(e){return qn(e?.ports)?{ports:Vr(e.ports),rearPorts:Vr(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:qn(e?.rearPorts)?e.rearPorts:[])}:wl(e?.ports)?Xr(e.ports):{ports:Vr(Array.isArray(e?.portGroups)?e.portGroups:[]),rearPorts:Vr(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:qn(e?.rearPorts)?e.rearPorts:[])}}function Jn(e){return Le(e).ports}function Qn(e){return Le(e).rearPorts}function lr(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function Ia(e){return lr(Le(e).ports)>0}function Sa(e){return lr(Le(e).rearPorts)>0}function _o(e){let t=Ia(e);return Sa(e)&&!t?"rear":"front"}var Nl=new Set(["patch-panel","closure","splice-tray"]),ei=["frontImageUrl","rearImageUrl","frontImageAttribution","rearImageAttribution","imageFit","imagePosition","imageRepeat","stretchToFit"],ti=["panelWidth","panelHeight","closureWidth","closureHeight","headerHeight"],oi=["status","width","widthPx","height","header","color","colorMode","showUMarkers","customHeaderText","powerSide","rotation","rackWidthPx","rackFaceGapPx"],xl=["face","handleSideMap"],kl=new Set(["label","ports","portGroups","rearPortGroups","pduPortGroups","connections","netboxId","netboxType","inventoryId","inventoryType","uPosition","mountMode","rackLayout","slotPosition","holderPosition",...ei,...ti,...oi,...xl]);function _a(e){return {x:typeof e?.x=="number"?e.x:0,y:typeof e?.y=="number"?e.y:0}}function pr(e){if(e)return {...e}}function ur(e){return {...e,ports:e.ports.map(t=>({...t,compatibility:Array.isArray(t.compatibility)?[...t.compatibility]:void 0,position:pr(t.position)}))}}function Pl(e){if(typeof e.parentId=="string")return e.parentId;let t=e.parentNode;return typeof t=="string"?t:void 0}function Dl(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 Cl(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 Nl.has(t)?t:"patch-panel"}return e.kind==="splitter"?"fibre-split":e.kind}function El(e){let t={position:_a(e.position)},o=Pl(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 Rl(e){let t=e.data??{},o={};oi.forEach(a=>{let i=t[a];i!==void 0&&(o[a]=i);});let r=ei.reduce((a,i)=>{let s=t[i];return s!==void 0&&(a[i]=s),a},{});Object.keys(r).length>0&&(o.images=r);let n=ti.reduce((a,i)=>{let s=t[i];return typeof s=="number"&&(a[i]=s),a},{});return Object.keys(n).length>0&&(o.dimensions=n),Object.keys(o).length>0?o:void 0}function Tl(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 vl(e){let t=e.data??{},o={};return Object.entries(t).forEach(([r,n])=>{kl.has(r)||(r==="rackWidthPx"||r==="rackFaceGapPx")&&e.type!=="rack"||(o[r]=n);}),Object.keys(o).length>0?o:void 0}function Il(e,t){let o={};if(e.forEach(r=>{let n=r.data??{},a={},i=n.face==="front"||n.face==="rear"?n.face:void 0;i&&(a.face=i),n.handleSideMap&&typeof n.handleSideMap=="object"&&(a.handleSideMap={...n.handleSideMap}),Object.keys(a).length>0&&(o[r.id]=a);}),!(Object.keys(o).length===0&&!t?.metadata))return {...Object.keys(o).length>0?{nodeState:o}:{},...t?.metadata?{metadata:t.metadata}:{}}}function Sl(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")||t.includes("rj45")?"ethernet":"generic"}function Fl(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups.map(ur);let{ports:o,rearPorts:r}=Le(t);if(r.length>0)return r.map(ur);if(o.length>0)return o.map(ur);let n=typeof t.powerPorts=="number"&&Number.isFinite(t.powerPorts)&&t.powerPorts>0?t.powerPorts:36;return [{name:"Power",ports:Array.from({length:n},(a,i)=>{let s=Rt(i);return {id:`${i+1}`,label:`${i+1}`,connected:false,type:s==="C19"?"power_c19":"power_c13",connectorType:s}})}]}function _l(e){return (e.type==="vertical-pdu"?[{face:"rear",blocks:Fl(e)}]:(()=>{let{ports:o,rearPorts:r}=Le(e.data);return [{face:"front",blocks:o.map(ur)},{face:"rear",blocks:r.map(ur)}]})()).flatMap(({face:o,blocks:r})=>r.flatMap(n=>n.ports.map(a=>({id:a.id??`${n.name}-${a.label}`,label:a.label,face:o,group:n.name,role:Te(a.type)?"power":"network",medium:Sl(a.type),type:a.type,cableType:a.cableType,connector:a.connectorType,compatibility:Array.isArray(a.compatibility)?[...a.compatibility]:void 0,layout:pr(a.position)}))))}function Hl(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,a)=>({id:`fiber-${a+1}`,label:`${a+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,a)=>({id:`tube-${r+a}`,label:`${r+a}`,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,a)=>({id:`input-${a+1}`,label:`Input ${a+1}`,role:"splitter",medium:"fiber"})),...Array.from({length:r},(n,a)=>({id:`output-${a+1}`,label:`Output ${a+1}`,role:"splitter",medium:"fiber"}))]}return []}function Ml(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)?_l(e):Hl(e);return t.length>0?t:void 0}function Al(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 $l(e,t){return e?{...e,...t,placement:t.placement,render:t.render,config:t.config,externalRefs:t.externalRefs,metadata:t.metadata??e.metadata,endpoints:Al(e.endpoints,t.endpoints)}:t}function to(e,t){let o=new Map((t?.nodes??[]).map(i=>[i.id,i])),r=e.nodes.map(i=>$l(o.get(i.id),{id:i.id,...Dl(i),label:i.data?.label??i.id,placement:El(i),render:Rl(i),config:vl(i),externalRefs:Tl(i),metadata:o.get(i.id)?.metadata,endpoints:Ml(i)})),n=new Map((t?.edges??[]).map(i=>[i.id,i])),a=e.edges.map(i=>{let s={id:i.id,source:{nodeId:i.source,endpointId:i.sourceHandle?Re(i.sourceHandle):void 0},target:{nodeId:i.target,endpointId:i.targetHandle?Re(i.targetHandle):void 0},type:i.type,hidden:i.hidden===true?true:void 0,data:i.data?{...i.data}:void 0,metadata:n.get(i.id)?.metadata},c=n.get(i.id);return c?{...c,...s}:s});return {nodes:r,edges:a,ui:Il(e.nodes,t?.ui),metadata:t?.metadata}}function Ll(e){let t=new Map,o=r=>{if(!r.endpointId)return;let n=`${r.nodeId}:${Re(r.endpointId)}`;t.set(n,(t.get(n)??0)+1);};return e.forEach(r=>{o(r.source),o(r.target);}),t}function Ha(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 Bl(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}:${Re(r.id)}`)??0)>0,type:Ha(r),cableType:r.cableType,connectorType:r.connector,compatibility:r.compatibility&&r.compatibility.length>0?[...r.compatibility]:void 0,position:pr(r.layout)}))}function Ol(e,t,o){let r=new Map;return e.forEach(n=>{let a=n.group??"Ports",i=r.get(a),s={id:n.id,label:n.label,connected:(t.get(`${o}:${Re(n.id)}`)??0)>0,type:Ha(n),cableType:n.cableType,connectorType:n.connector,compatibility:n.compatibility&&n.compatibility.length>0?[...n.compatibility]:void 0,position:pr(n.layout)};if(i){i.push(s);return}r.set(a,[s]);}),[...r.entries()].map(([n,a])=>({name:n,ports:a.map(i=>({id:i.id,label:i.label,connected:i.connected??false,type:i.type,cableType:i.cableType,connectorType:i.connectorType,compatibility:i.compatibility,position:pr(i.position)}))}))}function zl(e,t,o){if(!t&&!o)return e;let r={...e};t&&(oi.forEach(a=>{let i=t[a];i!==void 0&&(r[a]=i);}),t.images&&ei.forEach(a=>{let i=t.images?.[a];i!==void 0&&(r[a]=i);}),t.dimensions&&ti.forEach(a=>{let i=t.dimensions?.[a];typeof i=="number"&&(r[a]=i);}));let n=o?.face;return n&&(r.face=n),o?.handleSideMap&&(r.handleSideMap={...o.handleSideMap}),r}function Wl(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 Fa(e,t,o){if(!t)return;let r=Re(t);if(!e)return r;if(e.kind==="equipment"){let n=(e.subtype??"").toLowerCase().replace(/_/g,"-"),a=e.endpoints?.find(s=>s.id===r),i=a?.role==="power"||a?.medium==="power";if((n==="switch"||n==="router")&&o==="target"&&!i)return `${r}-target`;if(n==="patch-panel"){let s=a?.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}function ri(e){let t=Ll(e.edges),o=e.ui?.nodeState??{},r=e.nodes.map(i=>{let s=Cl(i),c={label:i.label,...i.config??{}};if(c=zl(c,i.render,o[i.id]),c=Wl(c,i.externalRefs),s==="device"||s==="server"||s==="switch"||s==="router")c.deviceType=i.subtype??(s==="device"?"device":s),i.endpoints&&i.endpoints.length>0&&(c.ports=Bl(i.endpoints,t,i.id));else if(s==="vertical-pdu"){let d=(i.endpoints??[]).filter(f=>f.face!=="front");d.length>0&&(c.pduPortGroups=Ol(d,t,i.id),c.powerPorts=d.length);}return i.placement.rack&&(i.placement.rack.rackLayout&&(c.rackLayout=i.placement.rack.rackLayout),typeof i.placement.rack.rackWidthPx=="number"&&(c.rackWidthPx=i.placement.rack.rackWidthPx),typeof i.placement.rack.rackFaceGapPx=="number"&&(c.rackFaceGapPx=i.placement.rack.rackFaceGapPx)),s!=="rack"&&i.placement.rack&&(c.isRackMounted=true,typeof i.placement.rack.uPosition=="number"&&(c.uPosition=i.placement.rack.uPosition),i.placement.rack.mountMode&&(c.mountMode=i.placement.rack.mountMode)),i.placement.container&&(typeof i.placement.container.slotPosition=="number"&&(c.slotPosition=i.placement.container.slotPosition),typeof i.placement.container.holderPosition=="number"&&(c.holderPosition=i.placement.container.holderPosition)),{id:i.id,type:s,position:_a(i.placement.position),...i.placement.parentId?{parentId:i.placement.parentId}:{},...i.placement.extent?{extent:i.placement.extent}:{},data:c}}),n=new Map(e.nodes.map(i=>[i.id,i])),a=e.edges.map(i=>({id:i.id,source:i.source.nodeId,target:i.target.nodeId,...i.source.endpointId?{sourceHandle:Fa(n.get(i.source.nodeId),i.source.endpointId,"source")}:{},...i.target.endpointId?{targetHandle:Fa(n.get(i.target.nodeId),i.target.endpointId,"target")}:{},...i.type?{type:i.type}:{},...i.hidden===true?{hidden:true}:{},...i.data?{data:{...i.data}}:{}}));return {nodes:r,edges:a}}var Ma=20,Ut=60,ni=300;var Ho=5;function Aa(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function $a(e,t){let r=Aa(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function La(e){return Aa(e)==="light"?"#e5e5e5":"#2a2a2a"}function Ba(e,t){return {width:"100%",height:"100%",...t}}var Oa=["device","server","switch","router"],Ul=[...Oa,"vertical-pdu"],Gl=new Set(Oa),Vl=new Set(Ul);function oo(e){return typeof e=="string"&&Gl.has(e)}function jl(e){return typeof e=="string"&&Vl.has(e)}function ro(e){return !!e&&oo(e.type)}function Mo(e){return !!e&&jl(e.type)}var za=(o=>(o.FULL="full",o.HALF="half",o))(za||{});function Wa(e){return typeof e=="string"&&e.trim().length>0}function ii(e){let{ports:t,rearPorts:o}=Le(e),r=lr(t)>0||Wa(e.frontImageUrl),n=lr(o)>0||Wa(e.rearImageUrl);if(r&&n)return "both";if(r)return "front";if(n)return "rear"}function Xl(e){if(e.face==="front"||e.face==="rear")return e.face}function Ua(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let a=ii(e);if(a)return a;let i=Xl(e);if(i)return i;let s=o+r/2;return t>=s?"front":"rear"}var Yl=24,Kl=4;function ql(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function Ie(e){return ql(e)==="split-face"}function Tt(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:Yl}function ht(e){return e?.rackWidthPx||300}function Gt(e){return ht(e)*1.75/19}function Yr(e){let t=ht(e);return Ie(e)?t*2+Tt(e):t}function yt(e){let t=e?.uHeight??42,o=Gt(e);return {width:Yr(e),height:60+t*o}}function ai(e){return e.map(t=>{if(t.type!=="rack")return t;let o=yt(t.data);return t.width===o.width&&t.height===o.height?t:{...t,width:o.width,height:o.height}})}function Ve(e){if(e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both")return e.mountMode;let t=ii(e??{});return t||"both"}function Ao(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Kr(e,t){let o=new Set(Ao(e));return Ao(t).some(n=>o.has(n))}function qr(e,t){return Ie(e)&&Ve(t)==="front"?ht(e)+Tt(e):0}function Ga(e,t){return t.isRackMounted!==true||t.splitFaceLayout?e:t.deviceWidth==="half"?Math.floor(e/2):e+Kl}function Va(e,t){return Ie(e)&&Ve(t)==="both"?Yr(e):ht(e)}var ja=e=>{if(typeof e.parentId=="string")return e.parentId;if(typeof e.parentNode=="string")return e.parentNode},vt=(e,t)=>typeof e=="number"&&Number.isFinite(e)&&e>0?Math.floor(e):t,Zl=()=>"bottom-up",io=e=>e.data.uNumberingDirection||Zl(),Zr=(e,t,o)=>o==="bottom-up"?t-e+1:e,Jr=(e,t,o)=>o==="bottom-up"?t-e+1:e;var Qr=(e,t,o,r)=>{let n=ja(e);if(!n||n!==t.id)return o;let a=vt(e.data.uHeight,1),i=vt(t.data.uHeight,42),s=io(t),c=Gt(t.data),d=60,f=o.y-d,g=Math.round(f/c)+1,l;s==="bottom-up"?l=Zr(g,i,s)-a+1:l=Zr(g,i,s);let u=i-a+1,m=Math.max(1,Math.min(u,l));if(s==="top-down"&&l<=1&&(m=1),!no(t,e,m,r)){let h=en(t,e,r,m);if(h!==void 0)m=h;else {let x=vt(e.data.uPosition,0);if(x>0&&no(t,e,x,r))m=x;else return {x:qr(t.data,e.data),y:e.position?.y??o.y,uPosition:x>0?x:void 0}}}let w;if(s==="bottom-up"){let h=m+a-1,x=Jr(h,i,s);w=d+(x-1)*c-1;}else {let h=Jr(m,i,s);w=d+(h-1)*c-1;}return {x:qr(t.data,e.data),y:w,uPosition:m}},no=(e,t,o,r)=>{let n=vt(t.data.uHeight,1),a=vt(e.data.uHeight,42);if(o<1||o+n-1>a)return false;let i=r.filter(d=>oo(d.type)&&ja(d)===e.id&&d.id!==t.id),s=Ie(e.data),c=Ve(t.data);for(let d of i){let f=vt(d.data.uPosition,1),g=vt(d.data.uHeight,1),l=o,u=o+n-1,m=f,w=f+g-1;if(l<=w&&u>=m){if(s){let h=Ve(d.data);if(!Kr(c,h))continue}return false}}return true},en=(e,t,o,r=1)=>{let n=vt(t.data.uHeight,1),i=vt(e.data.uHeight,42)-n+1;if(i<1)return;let s=Number.isFinite(r)?Math.floor(r):1,c=Math.max(1,Math.min(i,s));for(let d=c;d<=i;d++)if(no(e,t,d,o))return d;for(let d=1;d<c;d++)if(no(e,t,d,o))return d},$o=(e,t,o=1,r)=>{let n=60,a=io(e),i=e.data.uHeight||42,s=Gt(e.data),c=Jr(t,i,a),d;if(a==="bottom-up"){let f=t+o-1,g=Jr(f,i,a);d=n+(g-1)*s-1;}else d=n+(c-1)*s-1;return {x:qr(e.data,r),y:d}},Xa=(e,t,o)=>{let r=e.data.uHeight||1,n=$o(t,o,r,e.data),a=Array.isArray(e.data.ports)?e.data.ports:void 0;return {...e,position:n,data:{...e.data,ports:a,uPosition:o}}},Jl=(e,t)=>{let o=e.data.uPosition||1,r=e.data.uHeight||1,n=t.data.uHeight||42,a=Math.max(1,Math.min(n-r+1,o));return a!==o?Xa(e,t,a):e};function wt(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var ou=({data:e,selected:t,id:o,onFaceChange:r,onRackFaceChange:n,isDragOver:a=false})=>{let{label:i,ports:s=0,status:c="active",uHeight:d=42,face:f="front",customHeaderText:g}=e,l=Ie(e),u=Gt(e),m=Yr(e),w=yt(e),h=ht(e),x=Tt(e),P={width:`${h}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"},E=useStoreApi(),[D,y]=useState(e.showUMarkers!==void 0?e.showUMarkers:true),R=()=>{let A=io({data:e})==="bottom-up"?"top-down":"bottom-up",{getNodes:L,setNodes:z}=E.getState();z(L().map(W=>W.id===o?{...W,data:{...W.data,uNumberingDirection:A}}:W));},_=()=>{if(l)return;let F=f==="front"?"rear":"front";if(n)n(o,F);else if(r)E.getState().getNodes().filter(L=>L.parentId===o).forEach(L=>{r(L.id,F);});else {let{getNodes:A,setNodes:L}=E.getState();L(A().map(z=>z.id===o?{...z,data:{...z.data,face:F}}:z.parentId===o?{...z,data:{...z.data,face:F}}:z));}},M=()=>{let F=[],A=60,L=io({data:e});for(let z=1;z<=d;z++){let W=A+(z-1)*u-4,Q=Zr(z,d,L);F.push(jsx("div",{style:{position:"absolute",left:"-35px",top:`${W}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:Q},z));}return F};return jsxs("div",{"data-testid":"rack-node",className:`rack-node ${t?"selected":""} ${a?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${wt(c)}`,borderRadius:"8px",padding:0,width:`${m}px`,height:`${w.height}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:a?"0 0 20px #3b82f6, 0 0 40px #3b82f6, 0 0 60px #3b82f6":t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",transition:"box-shadow 0.2s ease-in-out"},children:[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:i}),jsxs("div",{style:{fontSize:"10px",color:"#9ca3af"},children:[g?jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:g}):jsxs("span",{children:[typeof s=="number"?s:0," ports"]})," \u2022 ",d,"U \u2022 ",l?"rear|front":f]}),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(),y(!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:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),R();},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 ${io({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:io({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),!l&&jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),_();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${f==="front"?"rear":"front"} face`,children:f==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${d*u}px`,overflow:"hidden"},children:l&&jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none",display:"flex",alignItems:"stretch"},children:[jsx("div",{"data-testid":"rack-face-rear",style:{...P,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:`${x}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:{...P,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:M()})]})},si=ce.memo(ou,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.data===t.data&&e.isDragOver===t.isDragOver);var nu=({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 ${wt(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:wt(r),borderRadius:"50%"}})]})},ci=ce.memo(nu);var Ya=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function je(e){let t=(e-1)%12;return Ya[t]}function so(e){return e>12}function It(e,t){let o=t?.base??je(e),r=t?.striped??so(e),n=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:n}}function di(e){let t=It(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function co(e){return je(e)}function St(e){return e.map(t=>({base:je(t),striped:so(t)}))}function cu(e,t,o,r,n,a,i,s){let c=St(o),d=c.length,f=r?1.2:1,g=!!s?.highlight,l=r?2:1.5,u=s?.highlightWidth??l*3,m=s?.highlightColor??c[0]?.base??"#22d3ee";return jsxs(Fragment,{children:[g&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:m,strokeWidth:u,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${l}px`,"--rn-edge-highlight-to":`${u}px`}}),c.map((w,h)=>{let P=(d-h)*f;return jsx("path",{d:t,stroke:w.base,strokeWidth:P,fill:"none",strokeLinecap:"butt",opacity:w.striped?.9:1,style:n},`${e}-ribbon-${h}`)}),c.some(w=>w.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(${a}px,${i}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 du=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:d={},className:f})=>{let[g,l,u]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),{bandwidth:m,length:w,color:h="#00FFFF",striped:x=false,ribbonFiberIds:P,isRibbon:E,highlight:D,highlightColor:y,highlightWidth:R}=s||{},_=!!D;if((E||P&&P.length>=6&&P.length<=12)&&P)return cu(e,g,P,c??false,d??{},l,u,s);let F=c?3:2,A=R??F*3,L={...d,stroke:h,strokeWidth:F,strokeDasharray:"none"};return jsxs(Fragment,{children:[_&&jsx(BaseEdge,{id:`${e}-highlight`,path:g,style:{...d,stroke:y??h,strokeWidth:A,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${F}px`,"--rn-edge-highlight-to":`${A}px`}}),jsx(BaseEdge,{id:e,path:g,style:L}),x&&jsx(BaseEdge,{id:`${e}-stripe`,path:g,style:{...d,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsx(EdgeLabelRenderer,{children:c&&s&&(m||w)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px,${u}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${h}`,pointerEvents:"none",zIndex:9999},children:[m&&jsx("div",{children:m}),w&&jsxs("div",{children:[w,"m"]})]})})]})},rn=ce.memo(du);var pu=.7,Ja=.28,Bo=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,fu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,style:s={},data:c,markerEnd:d})=>{let[f]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),g=c?.connectorType||"C13",l=c?.metadata??{},u=Bo(c?.powerStrokeWidth)??Bo(l.strokeWidth),m=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof l.strokeDasharray=="string"?l.strokeDasharray:void 0,w=Bo(s.opacity)??Bo(c?.opacity)??Bo(c?.powerOpacity)??Bo(l.opacity),h=R=>{let M=u??(g==="C19"?5:3),F=m??(g==="C19"?"none":"6,3");return {stroke:c?.color||"#f59e0b",strokeWidth:M,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:F,...R!==void 0?{opacity:R}:{},...s}},x=!!c?.highlight,P=c?.highlightColor??c?.color??"#f59e0b",E=h(x?w!==void 0?Math.min(w,Ja):Ja:w),D=typeof E.strokeWidth=="number"?E.strokeWidth:3,y=c?.highlightWidth??D*2.5;return jsxs(Fragment,{children:[x?jsx(BaseEdge,{id:`${e}-highlight`,path:f,markerEnd:d,style:{...E,stroke:P,strokeWidth:y,opacity:pu,strokeDasharray:"14 10","--rn-edge-highlight-from":`${D}px`,"--rn-edge-highlight-to":`${y}px`}}):null,jsx(BaseEdge,{id:e,path:f,markerEnd:d,style:E})]})},li=ce.memo(fu);function wu(e,t,o,r,n,a,i,s,c,d,f){let g=St(s),l=g.length,u=c?1.8:1.5,m=!!f?.highlight,w=c?3:2.5,h=f?.highlightWidth??w*3,x=f?.highlightColor??g[0]?.base??"#22d3ee",[P,E,D]=getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i});return jsxs(Fragment,{children:[m&&jsx(BaseEdge,{id:`${e}-highlight`,path:P,style:{...d,stroke:x,strokeWidth:h,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${w}px`,"--rn-edge-highlight-to":`${h}px`}}),g.map((y,R)=>{let M=(l-R)*u;return jsx("path",{d:P,stroke:y.base,strokeWidth:M,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:d},`${e}-ribbon-${R}`)}),g.some(y=>y.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:P,style:{...d,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:c&&f&&(f.bandwidth||f.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${E}px,${D}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${g[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[f.bandwidth&&jsx("div",{children:f.bandwidth}),f.length&&jsxs("div",{children:[f.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[s.length,"F"]})]})})]})}var Nu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:d={},...f})=>{let{color:g="#00FFFF",ribbonFiberIds:l,isRibbon:u,highlight:m,highlightColor:w,highlightWidth:h}=s||{},x=!!m;if((u||l&&l.length>=6&&l.length<=12)&&l)return wu(e,t,o,r,n,a,i,l,c??false,d??{},s);let E=c?4:3,D=h??E*3,y={...d,stroke:g,strokeWidth:E};return jsxs(Fragment,{children:[x&&jsx(BaseEdge,{id:`${e}-highlight`,path:getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i})[0],style:{...d,stroke:w??g,strokeWidth:D,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${E}px`,"--rn-edge-highlight-to":`${D}px`}}),jsx(SmoothStepEdge,{...f,id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:y})]})},ts=ce.memo(Nu);function Pu({sourceX:e,sourceY:t,targetX:o,targetY:r,sourcePosition:n,targetPosition:a}){let i=n===Position.Left||n===Position.Right,s;if(i){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 Du(e,t,o,r,n,a){let i=St(o),s=i.length,c=r?1.2:1,d=!!a?.highlight,f=r?2:1.5,g=a?.highlightWidth??f*3,l=a?.highlightColor??i[0]?.base??"#22d3ee",u=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),m=u?(parseFloat(u[1])+parseFloat(u[3]))/2:0,w=u?(parseFloat(u[2])+parseFloat(u[4]))/2:0;return jsxs(Fragment,{children:[d&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:l,strokeWidth:g,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${f}px`,"--rn-edge-highlight-to":`${g}px`}}),i.map((h,x)=>{let E=(s-x)*c;return jsx("path",{d:t,stroke:h.base,strokeWidth:E,fill:"none",strokeLinecap:"butt",opacity:h.striped?.9:1,style:n},`${e}-ribbon-${x}`)}),i.some(h=>h.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&a&&(a.bandwidth||a.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${m}px,${w}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${i[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[a.bandwidth&&jsx("div",{children:a.bandwidth}),a.length&&jsxs("div",{children:[a.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[o.length,"F"]})]})})]})}var Cu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:d={},...f})=>{let{color:g="#00FFFF",striped:l=false,ribbonFiberIds:u,isRibbon:m,highlight:w,highlightColor:h,highlightWidth:x}=s||{},P=!!w,E=Pu({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i});if((m||u&&u.length>=6&&u.length<=12)&&u)return Du(e,E,u,c??false,d??{},s);let y=c?3:2,R=x??y*3,_={...d,stroke:g,strokeWidth:y,strokeDasharray:"none"};return jsxs(Fragment,{children:[P&&jsx(BaseEdge,{id:`${e}-highlight`,path:E,style:{...d,stroke:h??g,strokeWidth:R,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${y}px`,"--rn-edge-highlight-to":`${R}px`}}),jsx(BaseEdge,{id:e,path:E,style:_}),l&&jsx(BaseEdge,{id:`${e}-stripe`,path:E,style:{...d,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})},ns=ce.memo(Cu);var vu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,style:s={},data:c,markerEnd:d,selected:f})=>{let{color:g="#6366f1",label:l,highlight:u,highlightColor:m,highlightWidth:w}=c||{},h=!!u,x=8,P=w??x*1.8,[E,D,y]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),R={...s,stroke:g,strokeWidth:x,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxs(Fragment,{children:[h&&jsx(BaseEdge,{id:`${e}-highlight`,path:E,style:{...s,stroke:m??g,strokeWidth:P,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${m??g}) drop-shadow(0 0 16px ${m??g})`,"--rn-edge-highlight-from":`${x}px`,"--rn-edge-highlight-to":`${P}px`}}),jsx(BaseEdge,{id:e,path:E,markerEnd:d,style:R}),l&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${D}px,${y}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${g}`,pointerEvents:"none",zIndex:9999},children:l})})]})},ss=ce.memo(vu);function Fu(e,t,o){return Math.max(t,Math.min(o,e))}function cs(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:Fu(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 _u(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 ds(e,t,o){return o.mode==="px"?o.value:(e-t)*o.value}function ls(e,t){return t===true||e==="fill"?"100% 100%":e==="none"?"auto":e==="contain-height"?"auto 100%":e==="scale-down"?"contain":e??"cover"}function pi(e,t,o,r,n){if(!o||o.width<=0||o.height<=0)return;let a=o.width,i=o.height;if(r==="100% 100%")a=e,i=t;else if(r==="auto 100%"){let d=t/o.height;a=o.width*d,i=o.height*d;}else if(r==="cover"||r==="contain"){let d=r==="cover"?Math.max(e/o.width,t/o.height):Math.min(e/o.width,t/o.height);a=o.width*d,i=o.height*d;}let[s,c]=_u(n);return {width:a,height:i,offsetX:ds(e,a,cs(s)),offsetY:ds(t,i,cs(c))}}var Hu={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 Mu(e){return [e.group,e.sourceTypeLabel,e.label,e.id,e.connectorType].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ").toLowerCase()}function an(e){let t=String(e.type??"").toLowerCase(),o=String(e.label??"").toLowerCase(),r=Mu(e);return t==="power_c19"?"power_c19":t==="power_c13"?"power_c13":t==="power_ac"?"power_ac":t==="usb"?"usb":t==="rj45"||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 fi(e){let t=typeof e=="string"?e:an(e);if(t!=="generic")return Hu[t]}var Au={portClickEnabled:false},ps=ce.createContext(Au),gi=ps.Provider;function mi(){return ce.useContext(ps)}function bi(e,t,o){return e?.length?e.some(r=>r.nodeId===t&&r.handleId===o):false}var Lu="#6b7280",Bu="#374151",hi="#10b981",Ou="100% 100%",sn=1,zu={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},Wu=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,Uu=/^data:image\//i,Gu=typeof window<"u"?ce.useLayoutEffect:ce.useEffect,gs=new Map;function Vu(e){return (e??"").toLowerCase().replace(/_/g,"-")}function ju(e){return !Wu.test(e)&&!e.startsWith("//")}function ms(e){if(!e)return;let t=e.trim();if(t){if(ju(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:"&&Uu.test(t)?t:void 0}catch{return}}}function Xu(e){return `url(${JSON.stringify(e)})`}function Yu(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 Oo(e){return Te(e.type)}function Ni(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":Yn(t)}function yi(e,t){return bt(e,t)}function Ku(e,t,o,r,n){let a=t.length>0||!!r,i=o.length>0||!!n;return e||(a?"front":i?"rear":"front")}function qu(e){let t=gs.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 gs.set(e,o),o}function bs(e){let[t,o]=ce.useState(void 0);return ce.useEffect(()=>{let r=false;return e?(qu(e).then(n=>{r||o(n);}),()=>{r=true;}):(o(void 0),()=>{r=true;})},[e]),t}function Zu(e){return Oo(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?hi:e.cableType?zu[e.cableType]??hi:hi}function Ju(e){return e.connected?Zu(e):Lu}function hs(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 Qu(e,t,o,r){let n=e<=3||t<=3,a=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:`${a}px solid ${r}`,boxSizing:"border-box",borderRadius:"1px",cursor:"pointer",zIndex:2}}function wi(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 xs(e){return e.type==="console"||e.type==="usb"}function ks(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(4,Math.min(5,Math.round(t*.6)))}}function Ps(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(3,Math.min(4,Math.round(t*.5)))}}function Ds(e,t){return an({type:e.type,label:e.label,id:String(e.id??""),group:t,sourceTypeLabel:e.sourceTypeLabel,connectorType:e.connectorType})}function po(e){return Math.max(0,Math.min(100,e))}function Xe(e,t,o){return Math.max(t,Math.min(o,e))}function ys(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 a=r.width*po(e.position.widthPercent)/100,i=r.height*po(e.position.heightPercent)/100;return {width:Xe(a,2,r.width),height:Xe(i,1.5,r.height)}}let n=fi({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"?Ps(o):xs(e)?ks(o):o}function ep(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 tp(e,t,o,r){if(!(!r||!hr(e))&&Ds(e,t)==="sfp")return ep(o)}function hr(e){return typeof e.position?.xPercent=="number"&&typeof e.position?.yPercent=="number"}function op(e,t,o,r){if(!hr(e))return;let n=po(e.position?.xPercent),a=po(e.position?.yPercent),i=r?.width??t,s=r?.height??o,c=r?.offsetX??0,d=r?.offsetY??0;return {x:c+i*n/100,y:d+s*a/100}}function ws(e,t,o,r){let n=wi(t),a=e.flatMap(h=>h.ports.filter(x=>!Oo(x)).map(x=>op(x,t,o,r)).filter(x=>x!==void 0));if(a.length<2)return n;let i=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Math.max(n.height*.75,3),d=Math.max(n.width*.75,3);for(let h=0;h<a.length;h+=1){let x=a[h];for(let P=h+1;P<a.length;P+=1){let E=a[P],D=Math.abs(x.x-E.x),y=Math.abs(x.y-E.y);y<=c&&D>0&&(i=Math.min(i,D)),D<=d&&y>0&&(s=Math.min(s,y));}}let f=r?Xe(n.width*.65,2.5,4.5):2,g=r?Xe(n.height*.95,5,7.5):2,l=r?n.width*.9:n.width,u=Number.isFinite(i)?Xe(i-f,r?2.5:3,l):l,m=r?Math.min(n.height*.48,u*.88):n.height,w=Number.isFinite(s)?Xe(s-g,r?1.5:3,m):m;return {width:u,height:w}}function rp(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 np(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 ip(e,t,o,r,n,a,i,s){if(!e.position)return;if(typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number"){let h=po(e.position.xPercent),x=po(e.position.yPercent),P=e.position.side??np(h,x),E=a?.width??r,D=a?.height??n,y=a?.offsetX??0,R=a?.offsetY??0,_=t/2+sn,M=Math.max(_,r-t/2),F=o/2+sn,A=Math.max(F,n-o/2),L=y+E*h/100,z=R+D*x/100,W=a?L:Xe(L,_,M),Q=a?z:Xe(z,F,A);return {position:rp(P),style:{left:`${W-t/2-sn}px`,top:`${Q-o/2-sn}px`,right:"initial",bottom:"initial",transform:"none"}}}if(!e.position.side)return;let d=e.position.side,f=typeof e.position.offsetPercent=="number"?po(e.position.offsetPercent):void 0,g=typeof e.position.offsetPx=="number"?e.position.offsetPx:void 0,l=t/2,u=Math.max(l,r-t/2),m=o/2,w=Math.max(m,n-o/2);switch(d){case "top":{let h=g!==void 0?g:r*(f??50)/100,x=Xe(h,l,u);return {position:Position.Top,style:{top:"0px",left:`${x}px`,right:void 0,bottom:void 0,transform:"translate(-50%, 50%)"}}}case "bottom":{let h=g!==void 0?g:r*(f??50)/100,x=Xe(h,l,u);return {position:Position.Bottom,style:{bottom:"0px",left:`${x}px`,right:void 0,top:void 0,transform:"translate(-50%, -50%)"}}}case "left":{let h=g!==void 0?g:n*(f??50)/100,x=Xe(h,m,w);return {position:Position.Left,style:{left:"0px",top:`${x}px`,right:void 0,bottom:void 0,transform:"translate(50%, -50%)"}}}case "right":{let h=g!==void 0?g:n*(f??50)/100,x=Xe(h,m,w);return {position:Position.Right,style:{right:"0px",top:`${x}px`,left:void 0,bottom:void 0,transform:"translate(-50%, -50%)"}}}default:return}}function Cs(e,t,o,r){let n=o/2,a=Math.max(n,r-o/2);return t===1?(n+a)/2:n+e*(a-n)/(t-1)}function Es(e,t,o,r){let n=e%2===0,a=Math.ceil(t/2),i=Math.floor(t/2),s=Math.max(n?a:i,1),c=Math.floor(n?e/2:(e-1)/2),d=Cs(c,s,o,r);return n?{position:Position.Top,style:{transform:"translateY(50%)",left:`${d-o/2}px`}}:{position:Position.Bottom,style:{transform:"translateY(-50%)",left:`${d-o/2}px`}}}function Ns(e,t,o,r,n,a){let i=e%2===0,s=Math.ceil(t/2),c=Math.floor(t/2),d=Math.max(i?s:c,1),f=Math.floor(i?e/2:(e-1)/2),g=Cs(f,d,o,n),l=1,u=Xe(Math.round(r*.75),1,4),m=Math.max(l,a-r-1),w=Xe(l+r+u,l,m),h=i?l:w;return {position:Position.Top,style:{transform:"none",left:`${g-o/2}px`,top:`${h}px`,right:void 0,bottom:void 0}}}function ap(e,t,o,r,n){let a=Ni(e,n),i=Wt(a),s;if(r<=20){let f=Math.max(2,r-i.height-2);s=`${o<=1?(2+f)/2:2+t*(f-2)/(o-1)}px`;}else s=`${25+t*50}%`;return {position:Position.Right,style:{transform:"translateX(-50%)",top:s,width:`${i.width}px`,height:`${i.height}px`,background:i.color,border:`1px solid ${i.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:i.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:i.borderRadius,clipPath:i.clipPath}}}function sp(e,t,o,r){if(t===1){let n=Math.max(6,Math.round(r*.04)),a=Math.max(o/2,r-n-o/2);return {position:Position.Top,style:{transform:"translateY(50%)",left:`${a}px`,right:void 0}}}return Es(e,t,o,r)}function cp(e,t,o,r,n,a,i,s,c){if(s==="patch-panel"||s==="switch")return Es(t,o,r,a);if(Oo(e)){let g=Ni(e,c),l=Wt(g),u;if(i<=20){let h=Math.max(2,i-l.height-2);u=`${o<=1?(2+h)/2:2+t*(h-2)/(o-1)}px`;}else u=`${25+t*50}%`;return {position:Position.Left,style:{transform:"translateX(50%)",top:u,width:`${l.width}px`,height:`${l.height}px`,background:l.color,border:`1px solid ${l.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:l.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:l.borderRadius,clipPath:l.clipPath}}}return {position:Position.Right,style:{transform:"translate(-50%, -50%)",top:`${Xe(o<=1?i/2:n/2+t*Math.max(i-n,0)/Math.max(o-1,1),n/2,Math.max(n/2,i-n/2))}px`}}}function dp(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 lp=({id:e,data:t,selected:o})=>{let r=useUpdateNodeInternals(),{highlightedPortHandles:n,onPortClick:a,portClickEnabled:i}=mi(),{label:s,status:c="active",deviceType:d="server",manufacturer:f,uHeight:g=1,width:l="full",face:u,rackWidthPx:m,frontImageUrl:w,rearImageUrl:h,imageFit:x,imagePosition:P,imageRepeat:E,stretchToFit:D,showDeviceImages:y=true}=t,{ports:R,rearPorts:_}=ce.useMemo(()=>Le(t),[t]),M=Vu(d),F=m??300,A=t.isRackMounted===true&&x===void 0&&D!==true,L=ce.useMemo(()=>ls(A?"fill":x,D),[x,A,D]),z=ce.useMemo(()=>ms(w),[w]),W=ce.useMemo(()=>ms(h),[h]),Q=bs(z),oe=bs(W),I=Ie(t),H=Ve(t),Z=Ku(u,R,_,w,h),j=ce.useMemo(()=>I?Ao(H):[Z],[I,H,Z]),X=j[0]??Z,Y=I&&H==="both",ye=t.isRackMounted===true?Gt(t):20,ee=g*ye,we=Tt(t),pe=F+we,re=ce.useMemo(()=>Ga(F,{isRackMounted:t.isRackMounted,splitFaceLayout:I,deviceWidth:l}),[t.isRackMounted,F,I,l]),fe=ce.useMemo(()=>pi(re,ee,Q,L,P??"center"),[re,ee,Q,L,P]),Ce=ce.useMemo(()=>pi(re,ee,oe,L,P??"center"),[re,ee,oe,L,P]),Ye=ce.useMemo(()=>X==="rear"?Ce:fe,[X,fe,Ce]),No=y&&(X==="rear"?!!W:!!z),tt=t.isRackMounted===true&&No&&!Y,de=X==="rear"?_:R,Kt=ce.useMemo(()=>de.flatMap(V=>V.ports).filter(V=>!Oo(V)),[de]),xo=ce.useMemo(()=>!tt||!((M==="switch"||M==="patch-panel"||M==="router")&&Kt.length>=24)?false:Kt.every(J=>hr(J)),[Kt,M,tt]),An=ce.useMemo(()=>[I?"split":"single",H,j.join(","),X,M,s,L,P??"center",fe?`${fe.width}:${fe.height}:${fe.offsetX}:${fe.offsetY}`:"",Ce?`${Ce.width}:${Ce.height}:${Ce.offsetX}:${Ce.offsetY}`:"",ee.toString(),re.toString(),pe.toString(),hs(R),hs(_)].join("|"),[I,H,j,X,M,s,L,P,fe,Ce,ee,re,pe,R,_]);Gu(()=>{r(e);},[An,e,r]);let Ht=ce.useCallback(V=>{let J=V==="rear"?W:z;return J?{backgroundImage:Xu(J),backgroundSize:L==="100% 100%"?Ou:L,backgroundPosition:P??"center",backgroundRepeat:E??"no-repeat"}:{}},[W,z,L,P,E]),te=ce.useMemo(()=>Ht("front"),[Ht]),kt=ce.useMemo(()=>Ht("rear"),[Ht]),Mt=X==="rear"?kt:te,Ne=ce.useMemo(()=>Yu(L),[L]),Ae,Pt;if(I)Ae=`${Va(t,t)+4}px`,Pt=void 0;else {let V=F+4,J=Math.floor(F/2);Ae=l==="half"?`${J}px`:`${V}px`,Pt=l==="half"?`${J}px`:void 0;}let At=M==="server"&&g===1,Zo=wt(c),at={"--rn-device-bg-image":y&&!Y?String(Mt.backgroundImage??"none"):"none","--rn-device-bg-position":String(Mt.backgroundPosition??"center"),"--rn-device-bg-repeat":String(Mt.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(Mt.backgroundSize??"cover"),"--rn-device-border-color":Zo,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${ee}px`,"--rn-device-left":Pt??"auto","--rn-device-status-color":Zo,"--rn-device-translate-y":At?"-1px":"0px","--rn-device-width":Ae},Dt=ce.useMemo(()=>{if(!tt)return;let V={position:"absolute",top:"2px",zIndex:2,padding:0,justifyContent:"flex-start",pointerEvents:"none"},J=g>1?24:8;if(!Ye)return xo?{...V,display:"none"}:{...V,left:"4px",right:`${J}px`,alignItems:"flex-start"};let ge=4,Fe=Math.max(0,Math.floor(Ye.offsetX)-ge),xe=Math.max(0,Math.floor(re-(Ye.offsetX+Ye.width))-ge);if(Math.max(Fe,xe)>=56){let ot=xe>Fe;return {...V,left:ot?"auto":`${ge}px`,right:ot?`${ge}px`:"auto",width:`${Math.max(48,Math.max(Fe,xe))}px`,alignItems:ot?"flex-end":"flex-start"}}return xo?{...V,display:"none"}:{...V,left:"4px",right:`${J}px`,alignItems:"flex-start"}},[Ye,re,xo,g,tt]),Ke=ce.useMemo(()=>{let V=new Set;for(let J of R)for(let ge of J.ports)V.add(yi(J.name,ge));return V},[R]),_r=ce.useMemo(()=>{let V=new Set;for(let J of _)for(let ge of J.ports)V.add(yi(J.name,ge));return V},[_]),me=ce.useCallback((V,J,ge=false)=>J==="rear"&&(Y||ge)&&Ke.has(V)?Gr(V,"rear"):J==="front"&&ge&&_r.has(V)?Gr(V,"front"):V,[Ke,_r,Y]),be=ce.useCallback((V,J,ge=0,Fe=re,xe=false)=>{let ot=[];if(V.length===0)return ot;let rt=J==="rear"?Ce:fe,$t=wi(Fe),Hr=!!(rt&&V.some(he=>he.ports.some(ke=>!Oo(ke)&&hr(ke)))),{width:Jo,height:Mr}=M==="switch"||M==="patch-panel"?Hr?ws(V,Fe,ee,rt):wi(Fe):ws(V,Fe,ee,rt),Po=V.reduce((he,ke)=>he+ke.ports.length,0),Do=(M==="switch"||M==="patch-panel")&&Po>=24,ft=M!=="switch"&&M!=="patch-panel"&&Po>=24;for(let he of V)for(let ke=0;ke<he.ports.length;ke+=1){let le=he.ports[ke],$n=yi(he.name,le),Ct=Oo(le),gt=Ds(le,he.name),Ue=Jo,Ze=Mr;if(Ct){let B=Ni(le,s),Ee=Wt(B);Ue=Ee.width,Ze=Ee.height;}else if(le.type==="usb"){let B=Ps($t);Ue=B.width,Ze=B.height;}else if(gt==="sfp"||gt==="qsfp"||gt==="osfp"){let B=ys(le,he.name,$t,rt);rt&&hr(le)?Ue=ft?Jo:B.width:Ue=B.width,Ze=B.height;}else if(gt==="rj45"||gt==="console"){let B=ys(le,he.name,$t,rt);Ue=B.width,Ze=B.height;}else if(xs(le)){let B=ks($t);Ue=B.width,Ze=B.height;}let Qo=Ju(le),Ar=le.connected?Qo:Bu,$r=Qu(Ue,Ze,Qo,Ar),er=J==="front"?Ct?ap(le,ke,he.ports.length,ee,s):Do?Ns(ke,he.ports.length,Ue,Ze,Fe,ee):sp(ke,he.ports.length,Ue,Fe):!Ct&&Do?Ns(ke,he.ports.length,Ue,Ze,Fe,ee):cp(le,ke,he.ports.length,Ue,Ze,Fe,ee,M,s),qt=ip(le,Ue,Ze,Fe,ee,rt),Oe=qt?Ct?{position:qt.position,style:{...er.style,...qt.style}}:qt:er,qe=tp(le,he.name,Oe.position,rt),tr=qe?{"--rn-hit-expand-top":`${qe.top}px`,"--rn-hit-expand-right":`${qe.right}px`,"--rn-hit-expand-bottom":`${qe.bottom}px`,"--rn-hit-expand-left":`${qe.left}px`}:{},Zt=qe?"rn-port-hitbox":void 0,ze={...{...$r,...Oe.style,...tr}};ze.left!==void 0&&ge!==0&&(typeof ze.left=="number"?ze.left=`${ze.left+ge}px`:ze.left=`calc(${ze.left} + ${ge}px)`),Y&&ze.left===void 0&&(Oe.position===Position.Left?(ze.left=`${ge}px`,ze.right=void 0):Oe.position===Position.Right&&(ze.left=`${ge+Fe}px`,ze.right=void 0));let Lt=me($n,J,xe),Ln=!xe&&bi(n,e,Lt),st=xe?{opacity:0,pointerEvents:"none"}:{},_e=[Zt,xe?"rn-port-handle--ghost":void 0,!xe&&i?"rn-port-handle--clickable":void 0,Ln?"rn-port-handle--highlighted":void 0].filter(Boolean).join(" "),ct=dp(Ct,M,J,le.connected);if(ct.secondary){let B=M==="switch"||M==="router"?{...ze,background:"transparent",border:"none",opacity:0}:ze,Ee=M==="switch"||M==="router"?`${he.name} - ${le.label} (input) ${le.connected?"(connected)":"(disconnected)"}`:`${he.name} - ${le.label} (${ct.secondary}) ${le.connected?"(connected)":"(disconnected)"}`;ot.push(jsx(Handle,{id:`${Lt}-${ct.secondary}`,type:ct.secondary,position:Oe.position,className:[Zt,xe?"rn-port-handle--ghost":void 0].filter(Boolean).join(" ")||void 0,style:{...B,...st},title:xe?`${Ee} (hidden face)`:Ee},`${Lt}-${ct.secondary}`));}ot.push(jsx(Handle,{id:Lt,type:ct.primary,position:Oe.position,className:_e||void 0,style:{...ze,...st},title:`${he.name} - ${le.label} ${le.connected?"(connected)":"(disconnected)"}${xe?" (hidden face)":""}`,onClick:!xe&&i&&a?B=>{B.stopPropagation(),a({nodeId:e,handleId:Lt,groupName:he.name,portLabel:le.label,face:J});}:void 0,children:Ct&&!xe?ke+1:void 0},Lt));}return ot},[ee,re,fe,n,e,s,M,a,i,Ce,me,Y]),ko=ce.useMemo(()=>{let V=[];for(let J of j){if(J==="front"&&R.length>0){let ge=Y?pe:0;V.push(...be(R,"front",ge,re));}J==="rear"&&_.length>0&&V.push(...be(_,"rear",0,re));}if(M==="patch-panel"){let J=new Set(j);!J.has("front")&&R.length>0&&V.push(...be(R,"front",0,re,true)),!J.has("rear")&&_.length>0&&V.push(...be(_,"rear",0,re,true));}return V},[j,R,_,be,re,Y,pe,M]);return jsxs("div",{className:`device-node ${o?"selected":""} ${Y?"device-node--split-both":""}`,style:at,children:[y&&!Y&&No&&jsx("div",{className:"device-node__image-layer","aria-hidden":"true",children:jsx("img",{className:"device-node__image",src:X==="rear"?W:z,alt:"",draggable:false,style:{objectFit:Ne,objectPosition:P??"center"}})}),y&&Y&&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:`${F}px`,backgroundImage:String(kt.backgroundImage??"none"),backgroundPosition:String(kt.backgroundPosition??"center"),backgroundRepeat:String(kt.backgroundRepeat??"no-repeat"),backgroundSize:String(kt.backgroundSize??"cover")},children:W?jsx("img",{className:"device-node__image",src:W,alt:"",draggable:false,style:{objectFit:Ne,objectPosition:P??"center"}}):null}),jsx("div",{className:"device-node__face-bridge","data-testid":"device-face-bridge",style:{width:`${we}px`},children:jsx("div",{className:"device-node__face-bridge-line"})}),jsx("div",{className:"device-node__split-face device-node__split-face--front",style:{width:`${F}px`,backgroundImage:String(te.backgroundImage??"none"),backgroundPosition:String(te.backgroundPosition??"center"),backgroundRepeat:String(te.backgroundRepeat??"no-repeat"),backgroundSize:String(te.backgroundSize??"cover")},children:z?jsx("img",{className:"device-node__image",src:z,alt:"",draggable:false,style:{objectFit:Ne,objectPosition:P??"center"}}):null})]}),jsxs("div",{className:`device-node__content ${tt?"device-node__content--image-badge":""}`,style:Dt??{position:"relative",zIndex:1},children:[jsx("div",{className:`device-node__label ${tt?"device-node__label--badge":""}`,children:s}),!tt&&g>1&&jsx("div",{className:"device-node__manufacturer",children:f})]}),g>1&&jsxs("div",{className:"device-node__u-indicator",children:[g,"U"]}),jsx("div",{className:"device-node__status-indicator"}),ko]})},zo=ce.memo(lp,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var dn=20,Wo=3,un=2,pp=1,ki=2,Ts=6,fp=12;function xi(e){return Math.max(0,Math.min(100,e))}function Pi(e,t,o){return Math.max(t,Math.min(o,e))}function gp(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 ln(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 mp(e,t){let o=ln(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 bp(e){if(Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0)return e.pduPortGroups;let t=Qn(e);if(t.length>0)return t;let o=Jn(e);return o.length>0?o:[]}function hp(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>ln(Rt(r))??"C13"):Array.from({length:t},(o,r)=>{let n=ln(e.portTypes?.[r]);return n||(ln(Rt(r))??"C13")})}function yp(e,t){let o=bp(e),r=hp(e,t);if(o.length===0)return Array.from({length:t},(i,s)=>({id:`${s+1}`,label:`${s+1}`,connectorType:r[s]??"C13",groupName:"Power"}));let n=[],a=0;return o.forEach(i=>{i.ports.forEach(s=>{let c=r[a]??"C13";n.push({id:bt(i.name,s),label:s.label,connectorType:mp(s,c),groupName:i.name,position:nt(s.position)}),a+=1;});}),n}function wp(e){return Wt(e.connectorType).height}function Np(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t:Math.floor(t/2)}function vs(e,t){let o=[],r=t>=0,n=r?Pi(t,0,e.length):-1;for(let a=0;a<=e.length;a+=1)r&&a===n&&o.push({kind:"mgmt",height:fp}),a<e.length&&o.push({kind:"port",portIndex:a,height:wp(e[a]),groupName:e[a].groupName});return o}function Is(e,t){return e.kind==="port"&&t.kind==="port"?e.groupName===t.groupName?ki:Ts:ki}function xp(e,t){let o=vs(e,t);if(o.length===0)return Math.max(un+Wo+1,1);let r=0;for(let n=0;n<o.length;n+=1)r+=o[n].height,n<o.length-1&&(r+=Is(o[n],o[n+1]));return un+r+Wo}function kp(e,t,o){let r=vs(e,o);if(r.length===0)return {portCenters:[]};let n=[];for(let w=0;w<r.length-1;w+=1)n.push(Is(r[w],r[w+1]));let a=r.reduce((w,h)=>w+h.height,0),i=n.reduce((w,h)=>w+h,0),s=a+i,c=Math.max(t-un-Wo,1),d=0,f=n,g=Math.max(0,c-s);if(g>0)if(n.length===0)d=g/2;else {let w=n.map(x=>x===Ts?1.2:1),h=w.reduce((x,P)=>x+P,0);f=n.map((x,P)=>h<=0?x:x+g*w[P]/h);}let l=[],u,m=un+d;for(let w=0;w<r.length;w+=1){let h=r[w],x=m+h.height/2;h.kind==="mgmt"?u=x:l[h.portIndex]=x,m+=h.height,w<r.length-1&&(m+=f[w]??ki);}return {portCenters:l,mgmtCenterY:u}}function Pp(e,t,o,r,n,a){if(!e)return {position:Position.Right,leftPx:Math.round((r-n)/2)-1,topPx:t-a/2};let i=e.side,s=i==="left"?Position.Left:i==="top"?Position.Top:i==="bottom"?Position.Bottom:Position.Right,c=typeof e.offsetPercent=="number"?xi(e.offsetPercent):void 0,d=typeof e.offsetPx=="number"?e.offsetPx:void 0,f=typeof e.xPercent=="number"?xi(e.xPercent):void 0,g=typeof e.yPercent=="number"?xi(e.yPercent):void 0;if(f!==void 0&&g!==void 0){let m=i??gp(f,g),w=m==="left"?Position.Left:m==="top"?Position.Top:m==="bottom"?Position.Bottom:Position.Right,h=Math.max(o-Wo,1),x=r*f/100,P=Pi(h*g/100,a/2,Math.max(a/2,o-a/2));return {position:w,leftPx:x-n/2,topPx:P-a/2}}let l=f!==void 0?r*f/100:r-n/2-1,u=g!==void 0?Math.max(o-Wo,1)*g/100:t;return i==="top"||i==="bottom"?(d!==void 0?l=d:c!==void 0&&(l=r*c/100),u=i==="top"?a/2:o-a/2):(d!==void 0?u=d:c!==void 0&&(u=Math.max(o-Wo,1)*c/100),i==="left"?l=n/2:i==="right"&&(l=r-n/2-1)),u=Pi(u,a/2,Math.max(a/2,o-a/2)),{position:s,leftPx:l-n/2,topPx:u-a/2}}function Dp(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 Cp=({data:e,selected:t})=>{let{label:o,status:r="active",heightCm:n=100,powerPorts:a=36,widthPx:i=15,mgmt_unit:s}=e,c=Math.max(0,a),d=yp(e,c),f=Np(s,d.length),g=n*4.2,l=xp(d,f),u=Math.max(g-dn,l),m=Math.max(i-pp*2,1),w=dn+u,h=kp(d,u,f);return jsxs("div",{className:`vertical-pdu-node ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${wt(r)}`,borderRadius:"2px",padding:0,width:`${i}px`,height:`${w}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:`${dn}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:`${w-dn}px`,overflow:"hidden"},children:[typeof h.mgmtCenterY=="number"?Dp(h.mgmtCenterY,m):null,d.map((x,P)=>{let E=h.portCenters[P]??u/2,D=Wt(x.connectorType),y=Pp(x.position,E,u,m,D.width,D.height);return jsx(Handle,{type:"source",position:y.position,id:x.id,style:{position:"absolute",left:`${y.leftPx}px`,top:`${y.topPx}px`,right:"initial",bottom:"initial",width:`${D.width}px`,height:`${D.height}px`,background:D.color,border:`1px solid ${D.borderColor}`,boxSizing:"border-box",transform:"none",cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:D.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:D.borderRadius,clipPath:D.clipPath},title:`${x.groupName} - ${x.label} (${x.connectorType})`,children:x.label},`handle-${x.id}`)})]})]})},Ci=ce.memo(Cp,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var Tp=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:n="single",ribbonFiberIds:a}=e||{},i=useEdges(),s=i.find(y=>y.target===o&&y.targetHandle==="left"),c=i.find(y=>y.source===o&&y.sourceHandle==="right"),d=i.find(y=>y.target===o&&y.targetHandle==="right"),f=c||d,g=s?.data?.color||"#555",l=f?.data?.color||"#555",u=n==="ribbon",m=s?.data?.ribbonFiberIds||a,w=f?.data?.ribbonFiberIds||a,h=u&&m?St(m):null,x=u&&w?St(w):null,P=!!s&&!!f;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&&h&&x?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:h.map((y,R)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`left-${R}`))}),jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:x.map((y,R)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`right-${R}`))})]}):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:g}}),jsx("div",{style:{background:l}})]}),jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),P&&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}}),P&&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&&a&&jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[a.length,"F"]})]}),jsx(Handle,{type:"source",position:Position.Left,id:"left",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:{width:12,height:u&&h?20:12,borderRadius:u&&h?"6px":"50%",border:"none",background:u&&h?`linear-gradient(to bottom, ${h.map(y=>y.base).join(", ")})`:g,zIndex:100,cursor:"crosshair",left:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"source",position:Position.Right,id:"right",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:{width:12,height:u&&x?20:12,borderRadius:u&&x?"6px":"50%",border:"none",background:u&&x?`linear-gradient(to bottom, ${x.map(y=>y.base).join(", ")})`:l,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})},Ei=ce.memo(Tp);var xr=20,pn=36;var fo=32,_s=4,jt=12,vp=69,go=80,Ri=(go-vp)/2;var Ti=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",a=n?pn:xr,i=n?32:16,s=fo,c=o.y-s,d=Math.round(c/a)+1,g=Math.max(1,Math.min(jt,d));if(!Nr(t,e,g,r)){let m=kr(t,e,r,g);if(m!==g){let w=(a-i)/2;return {x:Ri,y:s+(m-1)*a+w,holderPosition:m}}}let l=(a-i)/2,u=s+(g-1)*a+l;return {x:Ri,y:u,holderPosition:g}},Nr=(e,t,o,r)=>!r.filter(a=>a.parentId===e.id&&a.type==="splice"&&a.id!==t.id).some(a=>a.data.holderPosition===o),kr=(e,t,o,r=1)=>{for(let n=r;n<=jt;n++)if(Nr(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(Nr(e,t,n,o))return n;return 1},Ip=(e,t)=>Pr(e,t,false),Pr=(e,t,o=false)=>{let r=fo,n=o?pn:xr,i=(n-(o?32:16))/2,s=r+(t-1)*n+i;return {x:Ri,y:s}};var _p=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,n]=useState(false),a=()=>{if(!r)return null;let i=[],s=fo;for(let c=1;c<=jt;c++){let d=s+(c-1)*xr;i.push(jsxs("div",{style:{position:"absolute",left:"-35px",top:`${d}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:`${xr}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:["H",c]},c));}return i};return jsxs("div",{className:`splice-tray-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${go}px`,height:`${fo+jt*pn+_s}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:`${fo}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:i=>{i.stopPropagation();},onMouseDown:i=>{i.stopPropagation();},onClick:i=>{i.stopPropagation(),i.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"})]}),a(),jsx("div",{style:{position:"absolute",top:fo,left:0,right:0,bottom:0,pointerEvents:"none"}})]})},Si=ce.memo(_p);var $p=({data:e,selected:t,id:o})=>{let{fibersPerTube:r=12,tubeIndex:n=1,startOn:a="left-center"}=e||{},i=e?.mode==="ribbon"||e?.ribbon===true,s=useEdges(),c=jn(n),d=s.find(W=>W.source===o&&W.sourceHandle===c||W.target===o&&W.targetHandle===c),f=d?.data?.color,g=je((n-1)%12+1),l=f||g,u=Math.max(1,Math.min(24,Number(r)||12)),m=14,w=4,h=1,x=2,P=20,E=u*m+(u-1)*w,D=Math.max(60,E+h*2+x*2),y=a==="left"?Position.Left:a==="right"?Position.Right:Position.Bottom,R=y!==Position.Bottom,_=R?14:20,M=R?8:20,F=R?`inset ${y===Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",A=d?l:R?`linear-gradient(${y===Position.Left?"to right":"to left"}, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)), ${l}`:`radial-gradient(circle, ${l} 40%, transparent 70%)`,L={width:_,height:M,borderRadius:R?6:"50%",opacity:d?.3:.9,pointerEvents:"auto",background:A,backgroundColor:l,border:d?`2px solid ${l}`:`3px dashed ${l}`,cursor:"crosshair","--fiber-bg":l,boxShadow:d?F:`${F}${F!=="none"?", ":""}0 0 8px ${l}`,transition:"opacity 0.2s, box-shadow 0.2s",...y===Position.Left?{left:-(_-4)}:y===Position.Right?{right:-(_-4)}:{}},z=useMemo(()=>{let W=[],Q=D-x*2-h*2,oe,I,H=false;a==="left"?(oe=h,I=Position.Top):a==="right"?(oe=h+Q-E,I=Position.Top,H=true):(oe=h+(Q-E)/2,I=Position.Top);for(let Z=0;Z<u;Z++){let j=H?u-Z:Z+1,X=vo(j),Y=s.find(Ye=>Ye.source===o&&Ye.sourceHandle===X||Ye.target===o&&Ye.targetHandle===X),ye=!!Y&&(Y.data?.isRibbon||Y.data?.ribbonFiberIds&&Array.isArray(Y.data.ribbonFiberIds)),ee=Y?.data?.color,we=typeof Y?.data?.striped=="boolean"?Y.data.striped:void 0,pe=It(j);i||ye?pe=It(j,{base:"#808080",striped:false}):(ee||we!==void 0)&&(pe=It(j,{...ee?{base:ee}:{},...we!==void 0?{striped:we}:{}}));let re=oe+Z*(m+w),fe=h,Ce={position:"absolute",left:`${re}px`,top:`${fe}px`,width:m,height:m,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":pe.base,backgroundColor:pe.base};pe.backgroundImage&&(Ce["--fiber-bg-image"]=pe.backgroundImage),W.push(jsx(Handle,{id:X,type:"source",position:I,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:Ce,"data-fiber-idx":j,"data-fiber-color":pe.base},`fiber-${j}`));}return W},[u,a,D,s,o,m,w,h,x,E,i]);return jsxs("div",{style:{width:D,height:P,borderRadius:4,background:"#111827",border:`${x}px solid ${t?"#3b82f6":l}`,position:"relative",boxShadow:t?`0 0 0 ${x}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:h,boxSizing:"border-box",overflow:"visible"},children:[z,jsx(Handle,{id:c,type:"source",position:y,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,className:"tube-connection-handle",style:L,"data-tube-idx":n,"data-tube-color":l,title:d?"Connected - drag to reconnect":"Drag to connect cable tube"})]})},Fi=ce.memo($p);var Bp=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:n,color:a,rotation:i}=e||{},s=ce.useRef(null);ce.useEffect(()=>{if(s.current){let I=typeof i=="number"?i:0;s.current.style.transform=`rotate(${I}deg)`,s.current.style.transformOrigin="center center";}},[i]);let c=Math.max(1,Math.min(24,Number(o)||12)),d=10,f=2,g=6,l=g+d+4,u=60,m=Math.max(120,c*(d+f)+g*2),h=n??`${c}f Cable`,x=r?`Cable ID ${r}`:void 0,P=je(1),E=a||P,D=t?"#3b82f6":E,y=typeof i=="number"?i:0,R=I=>{let H=(I%360+360)%360;return H>=315||H<45?Position.Top:H>=45&&H<135?Position.Right:H>=135&&H<225?Position.Bottom:Position.Left},_=()=>{let I=[],H=R(y);for(let Z=0;Z<c;Z++){let j=Z+1,X=It(j),Y=X.base,ye=g+Z*(d+f),ee=-5,we=X.backgroundImage?X.backgroundImage:Y,pe={position:"absolute",left:`${ye}px`,top:`${ee}px`,width:d,height:d,borderRadius:"50%",border:"none",background:we,backgroundColor:Y,zIndex:10,cursor:"pointer","--fiber-bg":Y};X.backgroundImage&&(pe["--fiber-bg-image"]=X.backgroundImage);let re=`fiber-${j}`;I.push(jsx(Handle,{id:re,type:"source",position:H,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:pe,"data-fiber-idx":j,"data-fiber-color":Y},`fiber-${j}`));}return I},M="cable-button",F=8,A={width:F,height:F,borderRadius:"50%",background:E,backgroundColor:E,border:`1px solid ${E}`,cursor:"pointer",zIndex:10},L=2,W=(I=>{let H=(I%360+360)%360;return H>=315||H<45?Position.Bottom:H>=45&&H<135?Position.Left:H>=135&&H<225?Position.Top:Position.Right})(y),Q={width:m,height:u,position:"relative",transform:`rotate(${y}deg)`,transformOrigin:"center center","--rotation":`${y}deg`},oe={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${L}px solid ${D}`,boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:g,paddingTop:l,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:Q,children:jsxs("div",{style:oe,children:[_(),jsx(Handle,{id:M,type:"source",position:W,className:"cable-button-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:A,"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:h}),x&&jsx("div",{style:{fontSize:10,opacity:.8},children:x})]})]})})},Hi=ce.memo(Bp);var zp=({data:e,selected:t})=>{let{tubeCount:o=12,fibersPerTube:r=12,fiberCount:n,cableId:a="CBL-002",label:i,tubeStartIndex:s=1,color:c}=e||{},d=Math.max(1,Math.min(24,Number(o)||12)),f=Math.max(1,Number(s)||1),g=14,l=10,u=3,m=6,w=m+l+4,h=60,x=Math.max(120,d*(g+u)+m*2),P=n??d*(Number(r)||12),E=i??`${P}f Cable`,D=a?`Cable ID ${a}`:void 0,y=je(f),R=c||y,_=t?"#3b82f6":R,M=()=>{let W=[];for(let Q=0;Q<d;Q++){let oe=f+Q,I=It(oe),H=I.base,Z=m+Q*(g+u),j=-5,X=I.backgroundImage?I.backgroundImage:H,Y={position:"absolute",left:`${Z}px`,top:`${j}px`,width:g,height:l,borderRadius:6,border:"none",background:X,backgroundColor:H,zIndex:10,cursor:"pointer","--fiber-bg":H};I.backgroundImage&&(Y["--fiber-bg-image"]=I.backgroundImage);let ye=`tube-${oe}`;W.push(jsx(Handle,{id:ye,type:"source",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:Y,"data-fiber-idx":oe,"data-tube-idx":oe,"data-tube-color":H},`tube-${oe}`));}return W},F="cable-button",A=8,L={width:A,height:A,borderRadius:"50%",background:R,backgroundColor:R,border:`1px solid ${R}`,cursor:"pointer",zIndex:10};return jsxs("div",{style:{width:x,height:h,borderRadius:4,background:"#111827",border:`2px solid ${_}`,position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:m,paddingTop:w,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[M(),jsx(Handle,{id:F,type:"source",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:L,"data-handle-type":"cable-button","data-cable-color":R}),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}),D&&jsx("div",{style:{fontSize:10,opacity:.8},children:D})]})]})},Mi=ce.memo(zp);var Vp=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:n,label:a,portLabelsLeft:i,portLabelsRight:s}=e||{},c=useEdges(),d=typeof n=="number"&&[1,2,4].includes(n)?n:2,f=Math.max(1,Math.min(4,d)),g=9,l=3,u=3,m=60,w=30,h=f*g+(f-1)*l,x=Math.max(w,h+u*2),P=Math.max(m,80),E=(R,_)=>{let M=cr(R,_+1);return c.find(A=>A.source===o&&A.sourceHandle===M||A.target===o&&A.targetHandle===M)?.data?.color||"#555"},D=R=>{let _=[],M=R==="left"?Position.Left:Position.Right,F=R==="left"?i:s;for(let A=0;A<f;A++){let L=A+1,z=cr(R,L),W=E(R,A),I=u+(x-h)/2+A*(g+l),H={position:"absolute",left:R==="left"?-5:void 0,right:R==="right"?-5:void 0,top:`${I}px`,width:g,height:g,borderRadius:"50%",border:"none",background:W,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};_.push(jsx(Handle,{id:z,type:"source",position:M,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:H},z)),F&&F[A]&&_.push(jsx("div",{style:{position:"absolute",left:R==="left"?-30:void 0,right:R==="right"?-30:void 0,top:`${I}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:R==="left"?"right":"left",width:"25px"},children:F[A]},`${z}-label`));}return _},y=a||`${r}-${f}f`;return jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:P,height:x,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:[D("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})}),D("right")]})},Ai=ce.memo(Vp);var bo=32,hn=30,Xp=24,Yp=80,mn=400,bn=300,Vs=2,mo=8,js=120;function Li(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,a=3,i=3,s=60,c=30,d=r*n+(r-1)*a,f=Math.max(c,d+i*2);return {width:Math.max(s,80),height:f}}function yn(e){let{fibersPerTube:t=12}=e.data||{},o=Math.max(1,Math.min(24,Number(t)||12)),r=14,n=4,a=1,i=2,s=20,c=o*r+(o-1)*n;return {width:Math.max(60,c+a*2+i*2),height:s}}function Xs(e){return {width:go,height:0}}function Ys(e){return e.type==="coupler"?Li(e):e.type==="tube"?yn(e):e.type==="splice-tray"?Xs():{width:80,height:30}}function $i(e){let t=0;for(let o of e){let r=Ys(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function Ks(e,t=0){let o=t;for(let r of e){let n=Ys(r),a=(r.position?.y||0)+n.height;a>o&&(o=a);}return o}function qs(e){return e.data?.panelWidth||mn}function Kp(e){return e.data?.panelHeight||bn}function Zs(e){return qs(e)-Vs*2-mo*2}function qp(e,t){return Zs(e)-t}function Js(e,t=hn){return Math.floor(e/t)+1}function Qs(e,t=hn){return (e-1)*t}function Zp(e,t,o){let r=hn,n=Js(o.y,r),a=Qs(n,r);return {x:o.x,y:a,slotPosition:n}}function Bi(e,t){if(t.length===0)return {width:e.data?.panelWidth||mn,height:e.data?.panelHeight||bn};let o=t.some(c=>c.type==="tube"),r=t.some(c=>c.type==="splice-tray"),n=t.some(c=>c.type==="coupler"),a;if(o&&r&&n){let c=0,d=0;for(let l of t)if(l.type==="tube"){let u=yn(l);u.width>c&&(c=u.width);}else if(l.type==="coupler"){let u=Li(l);u.width>d&&(d=u.width);}let f=c+js+go+d+Ho,g=0;a=g+f+g;}else a=$i(t)+4;a=Math.max(e.data?.panelWidth||mn,a);let i=Ks(t,bo),s=Math.max(e.data?.panelHeight||bn,i+mo);return {width:a,height:s}}function ec(e,t,o){if(e===0)return 0;if(e===1)return t;let r=e*t,n=o-r,a=Math.max(5,n/(e-1));return t+a}function Jp(e,t,o){return ec(e,t,o)}var Ws=20,Us=400,Gs=300;function Oi(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||Us,height:e.data?.closureHeight||e.data?.panelHeight||Gs};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,d=0,f=t.filter(l=>l.type==="tube"),g=t.filter(l=>l.type==="splice-tray");if(f.length>0&&g.length>0){let l=g.map(m=>m.position?.x||0),u=l.reduce((m,w)=>m+w,0)/l.length;for(let m of f){let w=yn(m);(m.position?.x||0)<u?w.width>s&&(s=w.width):w.width>c&&(c=w.width);}g.length>0&&(d=go),n=mo+s+Ws+d+Ws+c+Ho;}else n=$i(t)+mo+Ho;}else n=$i(t)+mo+Ho;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||Us,n);let a=Ks(t,bo),i=Math.max(e.data?.closureHeight||e.data?.panelHeight||Gs,a+mo);return {width:n,height:i}}var of=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:n,panelWidth:a,panelHeight:i}=e||{},{getNodes:s,setNodes:c}=useReactFlow(),d=useRef(false),f=useRef([]),g=useMemo(()=>{let E=s().filter(D=>D.parentId===o);return (E.length!==f.current.length||E.some((D,y)=>D.id!==f.current[y]?.id))&&(f.current=E),f.current},[s,o]),l=useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:a,panelHeight:i}}),[o,e,a,i]),u=useMemo(()=>a&&i?{width:a,height:i}:g.length===0?{width:a||400,height:i||300}:Bi(l,g),[g,l,a,i]);useEffect(()=>{if(a&&i||d.current)return;let P=a,E=i,D=Math.abs((P||0)-u.width),y=Math.abs((E||0)-u.height);(D>1||y>1)&&(d.current=true,c(R=>R.map(_=>_.id===o?{..._,data:{..._.data,panelWidth:u.width,panelHeight:u.height}}:_)),setTimeout(()=>{d.current=false;},0));},[o,u.width,u.height,a,i,c]);let m=u.width,w=u.height,h=bo,x=n||r;return jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${m}px`,height:`${w}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:`${h}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:x})}),jsx("div",{style:{position:"absolute",top:h,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})},Ui=ce.memo(of);var cf=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:n,closureWidth:a,closureHeight:i,panelWidth:s,panelHeight:c}=e||{},{getNodes:d,setNodes:f}=useReactFlow(),g=useRef(false),l=useRef([]),u=useMemo(()=>{let R=d().filter(_=>_.parentId===o);return (R.length!==l.current.length||R.some((_,M)=>_.id!==l.current[M]?.id))&&(l.current=R),l.current},[d,o]),m=useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:a||s,closureHeight:i||c}}),[o,e,a,i,s,c]),w=useMemo(()=>a&&i?{width:a,height:i}:s&&c?{width:s,height:c}:u.length===0?{width:a||s||400,height:i||c||300}:Oi(m,u),[u,m,a,i,s,c]);useEffect(()=>{if(a&&i||s&&c||g.current)return;let y=a||s,R=i||c,_=Math.abs((y||0)-w.width),M=Math.abs((R||0)-w.height);(_>1||M>1)&&(g.current=true,f(F=>F.map(A=>A.id===o?{...A,data:{...A.data,closureWidth:w.width,closureHeight:w.height}}:A)),setTimeout(()=>{g.current=false;},0));},[o,w.width,w.height,a,i,s,c,f]);let h=w.width,x=w.height,P=bo,E=n||r,D=h/2;return jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${D}px ${D}px 12px 12px`,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",overflow:"hidden"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${P}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:`${D}px ${D}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:E})}),jsx("div",{style:{position:"absolute",top:P,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})},ji=ce.memo(cf);var pf=({data:e,selected:t,id:o})=>{let{label:r,splitterType:n="splitter",inputCount:a=1,outputCount:i=8}=e||{},s=useEdges(),c=r||(n==="WDM"?"WDM":"Splitter"),d=9,f=3,g=3,l=50,u=30,m=Math.min(Math.max(a||1,1),2),w=m*d+(m-1)*f,h=Math.min(i||8,48),x=h*d+(h-1)*f,P=Math.max(w,x),E=Math.max(u,P+g*2),D=Math.max(l,50),y=Q=>{let oe=Re(Q);return s.find(H=>H.source===o&&Re(H.sourceHandle)===oe||H.target===o&&Re(H.targetHandle)===oe)?.data?.color||"#555"},R=()=>{let Q=[],oe=g+(E-w)/2;for(let I=0;I<m;I++){let H=`input-${I+1}`,Z=oe+I*(d+f),j=y(H),X={position:"absolute",left:-5,top:`${Z}px`,width:d,height:d,borderRadius:"50%",border:"none",background:j,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};Q.push(jsx(Handle,{id:H,type:"source",position:Position.Left,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:X},H));}return Q},_=()=>{let Q=[],oe=g+(E-x)/2;for(let I=0;I<h;I++){let H=`output-${I+1}`,Z=oe+I*(d+f),j=y(H),X={position:"absolute",right:-5,top:`${Z}px`,width:d,height:d,borderRadius:"50%",border:"none",background:j,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};Q.push(jsx(Handle,{id:H,type:"source",position:Position.Right,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:X},H));}return Q},M=Math.max(w+g*4,u*.6),F=(E-M)/2,A=F+M,L=0,z=E,W=t?"#3b82f6":"#4b5563";return jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:D,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:`${g}px`,boxSizing:"border-box"},children:[jsx("svg",{width:D,height:E,viewBox:`0 0 ${D} ${E}`,style:{position:"absolute",top:0,left:0,width:`${D}px`,height:`${E}px`,pointerEvents:"none",zIndex:0},children:jsx("polygon",{points:`0,${F} 0,${A} ${D},${z} ${D},${L}`,fill:"#1f2937",stroke:W,strokeWidth:"2"})}),R(),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})}),_()]})},Xi=ce.memo(pf);var ic=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",Cr=(e,t)=>ic(e)||ic(t),ae=(e,t)=>t?Re(t):"";function ac(e,t){if(!e||!t)return "other";let{shape:o}=zt(t);switch(e.type){case "tube":return o.kind==="fiber"?"tube-fiber":o.kind==="tube"?"tube-tube":"other";case "cable":return o.kind==="fiber"?"tube-fiber":o.kind==="cable-button"?"cable-button":"other";case "multi-tube-cable":return o.kind==="tube"?"cable-tube":o.kind==="cable-button"?"cable-button":"other";case "splice":return o.kind==="splice-side"?"splice-side":"other";case "coupler":return o.kind==="side-port"?"coupler-port":"other";case "fibre-split":return o.kind==="split-io"?o.io==="input"?"splitter-input":"splitter-output":"other";default:return "other"}}var gf=new Set(["tube-fiber>splice-side","splice-side>tube-fiber","splice-side>coupler-port","coupler-port>splice-side","splice-side>splitter-input","splice-side>splitter-output","splitter-output>splice-side","coupler-port>coupler-port","coupler-port>splitter-input","splitter-input>coupler-port","coupler-port>splitter-output","splitter-output>coupler-port","splitter-output>tube-fiber","tube-fiber>splitter-output","cable-button>cable-button","cable-tube>tube-tube","tube-tube>cable-tube"]);function sc(e){return e==="tube-tube"||e==="cable-tube"}function wn(e,t,o,r){if(e?.type==="splice"&&o?.type==="splice"){let i=e.data?.mode==="ribbon",s=o.data?.mode==="ribbon";if(i!==s)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let n=ac(e,t),a=ac(o,r);return gf.has(`${n}>${a}`)?{valid:true}:sc(n)&&sc(a)?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}var cc=new WeakMap;function Go(e){if(typeof e!="string")return;let t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");return t.length>0?t:void 0}function mf(e){let t=new Set;return e.forEach(o=>{o&&t.add(o);}),[...t]}function dc(...e){let t=e.map(o=>Go(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 Yi(e){let t=[Go(e.type),Go(e.cableType),Go(e.connectorType),Go(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 Er(e){if(Array.isArray(e.compatibility)&&e.compatibility.length>0)return mf(e.compatibility.map(o=>Go(o)));if(e.kind==="power"||Te(e.type)){let o=dc(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(e.kind==="network"){let o=Yi(e);return o?[`network:${o}`]:["network"]}let t=Te(e.type)?"power":Yi(e)?"network":void 0;if(t==="power"){let o=dc(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(t==="network"){let o=Yi(e);return o?[`network:${o}`]:["network"]}return []}function bf(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 a=Rt(n);return {id:`${n+1}`,label:`${n+1}`,connected:false,type:a==="C19"?"power_c19":"power_c13",connectorType:a}})}]}function hf(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups;let{ports:o,rearPorts:r}=Le(t);return r.length>0?r:o.length>0?o:bf(e)}function yf(e){let t=e?.data;if(!e||!t||typeof t!="object")return new Map;let o=cc.get(t);if(o)return o;let r=new Map,n=(a,i)=>{i.forEach(s=>{s.ports.forEach(c=>{let d=bt(s.name,{id:c.id,label:c.label,type:Te(c.type)?c.type:void 0});r.set(d,{face:a,kind:Te(c.type)?"power":"network",compatibility:Er({compatibility:c.compatibility,kind:Te(c.type)?"power":"network",type:c.type,cableType:c.cableType,connectorType:c.connectorType,handleId:d})});});});};if(e.type==="vertical-pdu")n("rear",hf(e));else {let{ports:a,rearPorts:i}=Le(t);n("front",a),n("rear",i);}return cc.set(t,r),r}function wf(e,t){if(!e)return "unknown";if(t?.type==="vertical-pdu"||sr(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 Nf(e,t,o){if(!e)return [];if(t==="power")return o?.type==="vertical-pdu"&&/^\d+$/.test(e)?Er({kind:t,connectorType:Rt(Math.max(Number(e)-1,0)),handleId:e}):Er({kind:t,handleId:e});if(t==="network"){let r=e.toLowerCase();return Er({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=lt(t);if(!o)return {normalizedHandle:"",kind:"unknown",compatibility:[]};let r=zt(o),n=r.base,a=r.faceAlias,i=yf(e).get(n),f=(e?.data??{}).handleSideMap?.[n]??a??i?.face;f||(n==="net-top"||n==="net-bottom"?f="front":(n==="pwr-left-1"||n==="pwr-left-2"||n==="net-right-1"||n==="net-right-2"||sr(n))&&(f="rear"));let g=i?.kind??wf(n,e);return {normalizedHandle:n,face:f,kind:g,compatibility:i?.compatibility.length?i.compatibility:Nf(n,g,e)}}function xf(e,t){if(e.length===0||t.length===0)return true;let o=new Set(t);return e.some(r=>o.has(r))}function qi(e){let t=new Map;for(let o of e)t.set(o.id,o);return t}function Ki(e,t,o=qi(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),a=Cr(r,n);if(!a){let f=ho(r,e.sourceHandle),g=ho(n,e.targetHandle),l=f.kind,u=g.kind;if(l!=="unknown"&&u!=="unknown"&&l!==u)return {valid:false,reason:`Cannot connect ${l} handle to ${u} handle`};if(!xf(f.compatibility,g.compatibility))return {valid:false,reason:`Incompatible endpoints: ${e.sourceHandle} does not match ${e.targetHandle}`};let m=l==="power"&&u==="power",w=r?.type==="vertical-pdu"||n?.type==="vertical-pdu";if(m&&!w)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let i=ae(r,e.sourceHandle),s=ae(n,e.targetHandle),c=false,d=false;for(let f of t.edges)if(!(e.ignoreEdgeId&&f.id===e.ignoreEdgeId)&&(!c&&f.source===e.source&&(c=ae(r,f.sourceHandle)===i),!c&&f.target===e.source&&(c=ae(r,f.targetHandle)===i),!d&&f.target===e.target&&(d=ae(n,f.targetHandle)===s),!d&&f.source===e.target&&(d=ae(n,f.sourceHandle)===s),c&&d))break;return (c||d)&&!a?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`}:a?wn(r,e.sourceHandle,n,e.targetHandle):{valid:true}}function kf(e,t){if(!t)return;let o=ho(t,e).face;return o==="front"||o==="rear"?o:void 0}function Zi(e={},t={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},r=qi(o.nodes),n=new Set;return {getState:()=>o,setState:l=>{o={...o,...l},l.nodes&&(r=qi(o.nodes)),n.forEach(u=>u(o));},subscribe:l=>(n.add(l),()=>n.delete(l)),selectEdgeZIndex:l=>{let u=P=>{if(typeof P.parentId=="string")return P.parentId;let E=P.parentNode;if(typeof E=="string")return E},m=P=>{let E=u(P),D=E?r.get(E):void 0;return D?.type!=="rack"?[P.data?.face||_o(P.data)]:D&&Ie(D.data)?Ao(Ve(P.data)):[P.data?.face||_o(P.data)]},w=(P,E)=>{let D=r.get(P);if(!(!!D&&(D.type==="device"||D.type==="server"||D.type==="switch"||D.type==="router"))||!D||D.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let _=m(D),M=kf(E||"",D);if(M)return _.includes(M)?1e3:500;let F=lt(E),A=F.toLowerCase(),L=A.startsWith("pwr")||A.startsWith("power"),z=A.startsWith("net-")||A.startsWith("port-")||A.startsWith("uplink-")||A.includes("fiber")||A.includes("ports"),W=/^[A-Z0-9]+-\d+$/i.test(F)&&!A.startsWith("pwr")&&!A.startsWith("power"),Q=z||W;if(L)return _.includes("rear")?1e3:500;if(Q)return _.includes("front")?1e3:500},h=w(l.target,l.targetHandle);if(h!==void 0)return h;let x=w(l.source,l.sourceHandle);return x!==void 0?x:1e3},validateConnection:l=>{let u=t.validateConnection||Ki;return u===Ki?Ki(l,o,r):u(l,o)},selectNodeById:l=>r.get(l),selectConnectedEdges:l=>o.edges.filter(u=>u.source===l||u.target===l)}}var Df=e=>e,Cf=e=>e.nodes,Ef=e=>e.edges;function Ji(e,t){let o=useCallback(n=>e.subscribe(a=>n()),[e]),r=useCallback(()=>t(e.getState()),[e,t]);return useSyncExternalStore(o,r,r)}function Rf(e){return Ji(e,Df)}function Qi(e){return Ji(e,Cf)}function ea(e){return Ji(e,Ef)}function uc(e){return e.selectEdgeZIndex}var Tf=0;function Nn(e,t,o,r){let n=`edge-${e.source}-${e.sourceHandle}-${e.target}-${e.targetHandle}-${Date.now()}-${Tf+=1}`,a=o({...e,id:n,type:t});return {id:n,source:e.source,target:e.target,sourceHandle:e.sourceHandle,targetHandle:e.targetHandle,type:t,zIndex:a,style:{zIndex:a},data:r??{}}}function pc(e,t,o,r){return e.source===t&&r(e.sourceHandle)===o||e.target===t&&r(e.targetHandle)===o}function fc(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,sourcePolicy:a,targetPolicy:i,normalizeSourceHandle:s,normalizeTargetHandle:c,data:d}=e,{source:f,target:g,sourceHandle:l,targetHandle:u}=o;if(!f||!g||!l||!u)return null;let m=s(l),w=c(u),h=t.filter(y=>pc(y,f,m,s)),x=t.filter(y=>pc(y,g,w,c)),P=new Set;if(a.replaceable&&h.length>=a.capacity&&h.forEach(y=>P.add(y.id)),i.replaceable&&x.length>=i.capacity&&x.forEach(y=>P.add(y.id)),P.size===0)return null;let E=t.filter(y=>!P.has(y.id)),D=Nn(o,r,n,d);return {edges:[...E,D],replacedEdgeIds:[...P]}}function vf(e){let{edges:t,connection:o,edgeType:r,selectEdgeZIndex:n,findBy:a,matchOn:i=a,data:s}=e,c=a==="source"?o.sourceHandle:o.targetHandle,d=a==="source"?o.source:o.target;if(!c||!d)return null;let f=Re(c),g=t.find(m=>i==="source"?m.source===d&&Re(m.sourceHandle)===f:m.target===d&&Re(m.targetHandle)===f);if(!g)return null;let l=t.filter(m=>m.id!==g.id),u=Nn(o,r,n,s);return [...l,u]}function If(e,t){return !e||!t?"unknown":ho(e,t).kind}function yo(e,t){return If(e,t)==="power"}var Sf=.25;function Rr(e){return (e.highlightedNodeIds?.length??0)>0||(e.highlightedEdgeIds?.length??0)>0}function gc(e,t){return Rr(t)?t.highlightedNodeIds?.includes(e)??false:true}function mc(e,t,o){return !Rr(o)||o.highlightedEdgeIds?.includes(e)?true:o.connectEdgesToHighlightedNodes??(o.highlightedEdgeIds?.length??0)===0?!!(o.highlightedNodeIds?.includes(t.source)||o.highlightedNodeIds?.includes(t.target)):false}function bc(e){return typeof e!="number"||Number.isNaN(e)?.25:Math.min(1,Math.max(0,e))}function ta(e,t){if(!t.dimUnhighlighted||!Rr(t))return e;let o=bc(t.dimOpacity);return e.map(r=>gc(r.id,t)?r:{...r,style:{...r.style??{},opacity:o}})}function oa(e,t){if(!t.dimUnhighlighted||!Rr(t))return e;let o=bc(t.dimOpacity);return e.map(r=>mc(r.id,r,t)?r:{...r,style:{...r.style??{},opacity:o},data:{...r.data??{},opacity:o}})}var Ff=new Set(["device","server","switch","router","patch-panel"]);function hc(e){return e.type?Ff.has(e.type)||oo(e.type):false}var ra=(e,t)=>e.position?.x===t.position?.x&&e.position?.y===t.position?.y&&e.positionAbsolute?.x===t.positionAbsolute?.x&&e.positionAbsolute?.y===t.positionAbsolute?.y&&e.dragging===t.dragging&&e.selected===t.selected&&e.width===t.width&&e.height===t.height;function na(e,t,o){let{showDeviceImages:r}=t??{};if(r===void 0){if(!o||o.length!==e.length)return e;let i=false,s=e.map((c,d)=>{let f=o[d];return f?.id===c.id&&f.data===c.data&&ra(f,c)?f:(i=true,c)});return i?s:o}let n=false,a=e.map((i,s)=>{if(!hc(i)){let d=o?.[s];return d?.id===i.id&&d.data===i.data&&ra(d,i)?d:(d!==i&&(n=true),i)}let c=i.data??{};if(c.showDeviceImages!==void 0){let d=o?.[s];return d?.id===i.id&&d.data===i.data&&ra(d,i)?d:(d!==i&&(n=true),i)}return n=true,{...i,data:{...c,showDeviceImages:r}}});return !n&&o?o:a}function wc(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}function Nc(e,t,o,r,n,a,i){let s=false,c=false;for(let d of e)if(!s&&t&&d.source===t&&(s=ae(o,d.sourceHandle)===r),!s&&t&&d.target===t&&(s=ae(o,d.targetHandle)===r),!c&&n&&d.target===n&&(c=ae(a,d.targetHandle)===i),!c&&n&&d.source===n&&(c=ae(a,d.sourceHandle)===i),s&&c)break;return {source:s,target:c}}var We=({type:e,children:t})=>{let o=ce.useRef(null),r=ce.useCallback(n=>{if(o.current=n,n){let a=n.parentElement,i=0;for(;a&&!a.classList.contains("react-flow__node")&&i<10;)a=a.parentElement,i++;a&&a.classList.contains("react-flow__node")&&a.setAttribute("data-type",e);}},[e]);return ce.useEffect(()=>{if(o.current){let n=o.current.parentElement,a=0;for(;n&&!n.classList.contains("react-flow__node")&&a<10;)n=n.parentElement,a++;n&&n.classList.contains("react-flow__node")&&n.setAttribute("data-type",e);}},[e]),jsx("div",{ref:r,style:{width:"100%",height:"100%"},children:t})},jf=(e,t,o)=>({rack:r=>jsx(We,{type:"rack",children:jsx(si,{...r,onFaceChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsx(We,{type:"fiber",children:jsx(ci,{...r})}),device:r=>jsx(We,{type:"device",children:jsx(zo,{...r})}),server:r=>jsx(We,{type:"server",children:jsx(zo,{...r})}),switch:r=>jsx(We,{type:"switch",children:jsx(zo,{...r})}),router:r=>jsx(We,{type:"router",children:jsx(zo,{...r})}),"vertical-pdu":r=>jsx(We,{type:"vertical-pdu",children:jsx(Ci,{...r})}),splice:r=>jsx(We,{type:"splice",children:jsx(Ei,{...r})}),"splice-tray":r=>jsx(We,{type:"splice-tray",children:jsx(Si,{...r})}),tube:r=>jsx(We,{type:"tube",children:jsx(Fi,{...r})}),cable:r=>jsx(We,{type:"cable",children:jsx(Hi,{...r})}),"multi-tube-cable":r=>jsx(We,{type:"multi-tube-cable",children:jsx(Mi,{...r})}),coupler:r=>jsx(We,{type:"coupler",children:jsx(Ai,{...r})}),"patch-panel":r=>jsx(We,{type:"patch-panel",children:jsx(Ui,{...r})}),closure:r=>jsx(We,{type:"closure",children:jsx(ji,{...r})}),"fibre-split":r=>jsx(We,{type:"fibre-split",children:jsx(Xi,{...r})})});function xc(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 Tr(e){return e?.face==="front"||e?.face==="rear"?e.face:_o(e)}function kc(e,t){return {...e,face:t}}function Pc(e,t,o){let r=e.sourceHandle,n=e.targetHandle;return xc(t)&&r&&!yo(t,r)&&(r=lt(r)),xc(o)&&n&&!yo(o,n)&&(n=`${lt(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var Xf={fiber:rn,ethernet:rn,power:li,smoothstep:ts,step:ns,"thick-cable":ss},Yf=8192,Kf=8192,qf=2048,Zf=4;function vr(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function Jf(e){if(e)return {...e,width:vr(e.width,1,Yf),height:vr(e.height,1,Kf),padding:vr(e.padding,0,qf),pixelRatio:vr(e.pixelRatio,.1,Zf),quality:vr(e.quality,0,1)}}var Dc=({nodes:e,edges:t,initialNodes:o,initialEdges:r,onNodesChange:n,onEdgesChange:a,store:i,debug:s,onNodeClick:c,onEdgeClick:d,nodeTypes:f,edgeTypes:g,onConnect:l,onEdgeUpdate:u,isValidConnection:m,connectionMode:w,onFaceChange:h,onRackFaceChange:x,className:P,style:E,alignRacksToBottom:D,reAssignable:y=true,colorMode:R="dark",onInit:_,onFlowMethods:M,showDownloadButton:F=false,downloadButtonPosition:A="top-right",downloadButtonText:L="Download Image",downloadButtonStyle:z,useSmoothstepEdgesForTubes:W=false,readOnly:Q=false,interaction:oe,actionPanel:I,fitViewOptions:H,minZoom:Z=.1,maxZoom:j=4,onlyRenderVisibleElements:X=false,highlightedNodeIds:Y,highlightedEdgeIds:ye,dimUnhighlighted:ee,dimOpacity:we,connectEdgesToHighlightedNodes:pe,showDeviceImages:re,highlightedPortHandles:fe,onPortClick:Ce,connectionRadius:Ye,onConnectRejected:No})=>{let tt=useCallback((p,b)=>{let N=new Map,k=[],C=[],v=new Map(b.map(S=>[S.id,S])),$=(S,T)=>!S||!T?false:!!(S.startsWith("tube-")||T.type==="splice"&&(S==="left"||S==="right")||S==="cable-button");for(let S of p){if(!S.source||!S.target){s&&console.warn("Invalid edge skipped (missing source/target):",S);continue}let T=v.get(S.source),O=v.get(S.target),K=S.sourceHandle?`${S.source}:${S.sourceHandle}`:void 0,He=K?N.get(K):void 0,mt=S.sourceHandle?$(S.sourceHandle,T):false,Ge=S.targetHandle?`${S.target}:${S.targetHandle}`:void 0,Je=Ge?N.get(Ge):void 0,Qt=S.targetHandle?$(S.targetHandle,O):false;if(He&&!mt){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:K,existingEdge:He.id,duplicateEdge:S.id}),C.push(S);continue}if(Je&&!Qt){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Ge,existingEdge:Je.id,duplicateEdge:S.id}),C.push(S);continue}k.push(S),K&&!He&&N.set(K,S),Ge&&!Je&&N.set(Ge,S);}return s&&C.length>0&&console.log(`Filtered ${C.length} duplicate edge(s) from initial edges`),k},[s]),de=Array.isArray(e)&&Array.isArray(t),Kt=ce.useMemo(()=>de?e||[]:o||e||[],[de,e,o]),xo=ce.useMemo(()=>de?t||[]:r||t||[],[de,t,r]),An=ce.useMemo(()=>tt(xo,Kt),[xo,Kt,tt]),Ht=ce.useRef(null),te=ce.useMemo(()=>i||(Ht.current===null&&(Ht.current=Zi({nodes:ai(Kt),edges:An,debug:s})),Ht.current),[i]),kt=Qi(te),Mt=ea(te),[Ne,Ae]=useNodesState(kt),[Pt,At,Zo]=useEdgesState(Mt),at=uc(te),Dt=useRef(null),[Ke,_r]=useState(false);useEffect(()=>{let p=()=>{_r(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return p(),window.addEventListener("resize",p),()=>window.removeEventListener("resize",p)},[]);let me=Q===true,be=useMemo(()=>{let b={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!Ke,edgesFocusable:!Ke,edgesReconnectable:true,connectOnClick:true,panOnDrag:true,panOnScroll:!Ke,zoomOnScroll:!Ke,zoomOnPinch:!Ke,zoomOnDoubleClick:!Ke,allowKeyboardDelete:true,showControls:true,showMiniMap:!Ke,showInteractiveControl:true},...oe??{}};return me?{...b,nodesDraggable:false,nodesConnectable:false,elementsSelectable:b.elementsSelectable!==false,edgesFocusable:false,edgesReconnectable:false,connectOnClick:false,allowKeyboardDelete:false,showInteractiveControl:false}:b},[Ke,oe,me]),ko=useMemo(()=>({enabled:I?.enabled??true,showRearToggle:I?.showRearToggle??true,showDeRack:I?.showDeRack??true}),[I]),{toObject:V,setViewport:J,setNodes:ge,setEdges:Fe,getNodes:xe,getEdges:ot,fitView:rt,flowToScreenPosition:$t,getIntersectingNodes:Hr}=useReactFlow(),Jo=useRef(n),Mr=useRef(a),Po=useRef(de),Do=useRef(te),ft=useRef({toObject:V,setViewport:J,setReactFlowNodes:ge,setReactFlowEdges:Fe,getNodes:xe,getEdges:ot,fitView:rt});useEffect(()=>{Jo.current=n;},[n]),useEffect(()=>{Mr.current=a;},[a]),useEffect(()=>{Po.current=de;},[de]),useEffect(()=>{Do.current=te;},[te]),useEffect(()=>{ft.current={toObject:V,setViewport:J,setReactFlowNodes:ge,setReactFlowEdges:Fe,getNodes:xe,getEdges:ot,fitView:rt};},[V,J,ge,Fe,xe,ot,rt]);let he=useMemo(()=>({toObject:()=>ft.current.toObject(),setViewport:p=>{ft.current.setViewport(p);},setNodes:p=>{if(ft.current.setReactFlowNodes(p),Po.current){Jo.current?.(p);return}Do.current.setState({nodes:p});},setEdges:p=>{if(ft.current.setReactFlowEdges(p),Po.current){Mr.current?.(p);return}Do.current.setState({edges:p});},toImage:p=>Dt.current?toPng(Dt.current,Jf(p)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>ft.current.getNodes(),getEdges:()=>ft.current.getEdges(),fitView:p=>{let{fitView:b,getNodes:N}=ft.current;if(p?.nodes&&Array.isArray(p.nodes)&&p.nodes.length>0){let v=p.nodes.map(T=>N().find(O=>O.id===T)).filter(T=>T!==void 0),{nodes:$,...S}=p;b({...S,nodes:v});return}let{nodes:k,...C}=p||{};b(C);}}),[]);useEffect(()=>{M?.(he);},[M,he]);let[ke,le]=useState(false),$n=useCallback(()=>{if(!ke){if(!Dt.current){s&&console.error("ReactFlow wrapper ref is not available");return}le(true),toPng(Dt.current,{filter:p=>!(p?.classList?.contains("react-flow__minimap")||p?.classList?.contains("react-flow__controls")||p?.classList?.contains("react-flow__attribution")||p?.classList?.contains("react-networks-attribution")||p?.classList?.contains("download-button")||p?.tagName==="BUTTON"),backgroundColor:R==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(p=>{let b=document.createElement("a");b.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,b.href=p,b.click();}).catch(p=>{s&&console.error("Error downloading image:",p);}).finally(()=>{le(false);});}},[R,s,ke]),[Ct,gt]=useState(null),Ue=useRef(null),Ze=useRef(h),Qo=useRef(x);useEffect(()=>{Ze.current=h;},[h]),useEffect(()=>{Qo.current=x;},[x]),useEffect(()=>{Ue.current=Ct;},[Ct]);let Ar=useCallback((p,b)=>{Ze.current?.(p,b);},[]),$r=useCallback((p,b)=>{Qo.current?.(p,b);},[]),er=useCallback(()=>Ue.current,[]),qt=useRef(No);useEffect(()=>{qt.current=No;},[No]);let Oe=useCallback((p,b,N)=>{qt.current?.({connection:p,reason:b,phase:N});},[]),qe=useRef(null),tr=useRef(false),Zt=useCallback(p=>{let b=qe.current;qe.current=null,b&&Oe(b.connection,b.reason,p);},[Oe]),fa=useMemo(()=>({...jf(Ar,$r,er),...f??{}}),[Ar,$r,er,f]),ze=useMemo(()=>({...Xf,...g??{}}),[g]),Lt=useMemo(()=>({zIndex:1e3,reconnectable:be.edgesReconnectable}),[be.edgesReconnectable]),Ln=useMemo(()=>({hideAttribution:true}),[]),st=useRef(Ne);useEffect(()=>{st.current=Ne;},[Ne]);let _e=useRef(Pt);useEffect(()=>{_e.current=Pt;},[Pt]),useEffect(()=>{Ae(kt);},[kt,Ae]),useEffect(()=>{At(Mt);},[Mt,At]),useEffect(()=>{if(de&&t){let p=tt(t,e||[]);p.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-p.length} duplicate(s) removed`),a?.(p));}},[de,t,e,tt,a,s]),useEffect(()=>{de&&te.setState({nodes:Cc(e||[],te.getState().nodes)});},[de,e,te]),useEffect(()=>{de&&te.setState({edges:Ec(t||[],te.getState().edges)});},[de,t,te]),useEffect(()=>{if(!D||!Ne||Ne.length===0||Ne.some(T=>T.dragging))return;let p=Ne.filter(T=>T.type==="rack");if(p.length===0)return;let b=p.map(T=>{let O=yt(T.data).height;return (T.position?.y||0)+O}),N=Math.min(...b),k=Math.max(...b);if(k-N<20)return;let v=k,$=Ne.map(T=>{if(T.type!=="rack")return T;let O=yt(T.data).height,K=(T.position?.y||0)+O,He=v-K;return Math.abs(He)<5?T:{...T,position:{x:T.position?.x||0,y:(T.position?.y||0)+He}}});if($.some((T,O)=>{let K=Ne[O]?.position,He=T.position;return K?.x!==He?.x||K?.y!==He?.y})){if(de){n?.($);return}te.setState({nodes:$});}},[D,Ne,de,n,te]);let ct=useRef(new Map);useEffect(()=>{let p=new Map;Ne.forEach(b=>{p.set(b.id,b);}),ct.current=p;},[Ne]);let B=useCallback(p=>ct.current.get(p),[]),Ee=useCallback(p=>{if(!p)return;if(typeof p.parentId=="string")return p.parentId;let b=p.parentNode;if(typeof b=="string")return b},[]),ga=useCallback(p=>{let b=Ee(p);if(!b)return;let N=B(b);if(!(!N||N.type!=="rack"))return N},[B,Ee]),ma=useCallback(p=>!p||p.type!=="rack"?false:Ie(p.data),[]),Co=useCallback(p=>{if(!p||!ro(p))return false;let b=ga(p);return b?Ie(b.data):false},[ga]),or=useCallback(p=>{st.current=p;let b=new Map;p.forEach(N=>{b.set(N.id,N);}),ct.current=b,Ae(p),de?n?.(p):te.setState({nodes:p});},[de,te,Ae,n]),Jt=useCallback(p=>{_e.current=p,At(p),de?a?.(p):te.setState({edges:p});},[de,te,At,a]),Bt=useCallback(p=>{if(p.positionAbsolute)return p.positionAbsolute;let b=p.position?.x||0,N=p.position?.y||0,k=Ee(p),C=new Set;for(;k&&!C.has(k);){C.add(k);let v=B(k);if(!v)break;if(v.positionAbsolute){b+=v.positionAbsolute.x,N+=v.positionAbsolute.y;break}b+=v.position?.x||0,N+=v.position?.y||0,k=Ee(v);}return {x:b,y:N}},[B,Ee]),Lr=useCallback(p=>{let b=Bt(p),N=p.width||0,k=p.height||0;return {x:b.x+N/2,y:b.y+k/2}},[Bt]),Br=useCallback((p,b)=>{let N=Hr({x:p.x,y:p.y,width:1,height:1},true).filter(v=>v.id!==b&&v.type==="rack"),k=null,C=1/0;for(let v of N){let $=Math.hypot(p.x-v.position.x,p.y-v.position.y);$<C&&(C=$,k=v);}return k},[Hr]),ba=useCallback(p=>yt(p.data),[]),Eo=useCallback((p,b,N)=>{let{width:k,height:C}=ba(p),v=b.width||0,$=b.height||0,S=Math.max(0,k-v),T=b.type==="vertical-pdu"?60:0,O=Math.max(T,C-$);return {x:Math.max(0,Math.min(N.x,S)),y:Math.max(T,Math.min(N.y,O))}},[ba]),rr=useCallback((p,b)=>{if(!p||!b)return;let N=B(p);if(!N)return;let k=b.replace(/-(source|target)$/i,"");if(N.type==="fibre-split"&&k.startsWith("output-"))for(let v of _e.current){if(v.target!==p||!(v.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"))continue;let $=v.data?.color;if($)return {color:$}}if((N.type==="tube"||N.type==="cable")&&b.startsWith("fiber-")){let v=b.replace("fiber-",""),$=parseInt(v,10);if($>=1&&$<=24){let S=co($),T=$>12;return {color:S,striped:T}}}if((N.type==="multi-tube-cable"||N.type==="tube")&&b.startsWith("tube-")){let v=b.replace("tube-",""),$=parseInt(v,10);if($>=1&&$<=24){let S=je($),T=$>12;return {color:S,striped:T}}}let C=N.data;if(C.color)return {color:C.color}},[B]),ha=useRef(new Map);useEffect(()=>{At(p=>{let b=false,N=p.map(k=>{let C=at(k);return ha.current.get(k.id)!==C?(b=true,ha.current.set(k.id,C),{...k,zIndex:C,style:{...k.style,zIndex:C}}):k});return b?N:p});},[Ne,At,at]),useEffect(()=>{let p=Ne.map(N=>{if(N.type==="coupler"&&N.parentId){let k=B(N.parentId);if(k&&(k.type==="patch-panel"||k.type==="closure")&&(!N.extent||N.extent!=="parent"))return {...N,extent:"parent"}}if(N.type==="splice"&&N.parentId&&N.data.holderPosition&&(!N.position||N.position.x===0&&N.position.y===0)){let k=B(N.parentId);if(k&&k.type==="splice-tray"){let C=N.data.mode==="ribbon",v=Pr(k,N.data.holderPosition,C);return {...N,position:v}}}if(ro(N)&&N.parentId&&N.data.uPosition&&(!N.position||N.position.x===0&&N.position.y===0)){let k=B(N.parentId);if(k){let C=N.data.uHeight||1,v=$o(k,N.data.uPosition,C,N.data);return {...N,position:v}}}if(N.type==="vertical-pdu"&&N.parentId){let k=B(N.parentId);if(k&&k.type==="rack"){let C=Eo(k,N,N.position||{x:0,y:60});if(N.extent!=="parent"||!N.position||N.position.x!==C.x||N.position.y!==C.y)return {...N,extent:"parent",position:C}}}return N});p.some((N,k)=>{let C=Ne[k];return N.extent!==C.extent||N.position?.x!==C.position?.x||N.position?.y!==C.position?.y})&&Ae(p);},[Ne,Ae,B,Eo]);let ya=useCallback(p=>{if(me)return null;let b=new Map,N=new Map,k=new Set,C=p.map(S=>{if(S.type==="position"&&S.position){let T=B(S.id);if(T&&T.type==="coupler"&&T.parentId){let O=B(T.parentId);if(O&&(O.type==="patch-panel"||O.type==="closure"))return (!T.extent||T.extent!=="parent")&&k.add(T.id),{...S,position:T.position||{x:0,y:0}}}if(T&&(T.type==="tube"||T.type==="splice-tray")&&T.parentId){let O=B(T.parentId);if(O&&O.type==="closure")return (!T.extent||T.extent!=="parent")&&k.add(T.id),{...S,position:T.position||{x:0,y:0}}}if(T&&T.type==="splice"&&T.parentId){let O=B(T.parentId);if(O&&O.type==="splice-tray"){let K=Ti(T,O,S.position,st.current);return K.holderPosition!==void 0&&b.set(T.id,K.holderPosition),{...S,position:{x:K.x,y:K.y}}}}if(T&&ro(T)&&T.parentId){let O=B(T.parentId);if(O&&O.type==="rack"){let K=Qr(T,O,S.position,st.current);return K.uPosition!==void 0&&N.set(T.id,K.uPosition),{...S,position:{x:K.x,y:K.y}}}}if(T&&T.type==="vertical-pdu"&&T.parentId){let O=B(T.parentId);if(O&&O.type==="rack")return (!T.extent||T.extent!=="parent")&&k.add(T.id),{...S,position:Eo(O,T,S.position)}}}return S}),v=applyNodeChanges(C,st.current).map(S=>{let T=S;k.has(S.id)&&(T={...T,extent:"parent"});let O=b.get(S.id);O!==void 0&&(T={...T,data:{...T.data,holderPosition:O}});let K=N.get(S.id);return K!==void 0&&(T={...T,data:{...T.data,uPosition:K}}),T});v=ai(v),st.current=v;let $=new Map;return v.forEach(S=>{$.set(S.id,S);}),ct.current=$,Ae(v),v},[Ae,B,me,Eo]),gd=useCallback((p,b)=>{gt(null);},[]),md=useCallback((p,b,N)=>{let k=Ee(b);if(!y||!Mo(b)||k){gt(null);return}let C=Lr(b),$=Br(C,b.id)?.id??null;gt(S=>S===$?S:$);},[y,Lr,Ee,Br]),bd=useCallback((p,b,N)=>{gt(null);let k=Ee(b);if(!y||!Mo(b)||k)return;let C=Bt(b),v=Lr(b),$=Br(v,b.id),S=st.current;if(!$)return;let T={x:C.x-$.position.x,y:C.y-$.position.y},O=Eo($,b,T);if(b.type==="vertical-pdu"){let $e=S.map(q=>q.id!==b.id?q:{...q,parentId:$.id,extent:"parent",position:O,data:{...q.data,rackLayout:Ie($.data)?"split-face":"single-face",rackWidthPx:ht($.data),rackFaceGapPx:Tt($.data)}});or($e);return}let K=S.find($e=>$e.id===b.id)||b,He=Ie($.data),mt=ht($.data),Ge=Tt($.data),Je=He?Ua(K.data,T.x,mt,Ge):"both",Qt=He&&Je==="front"?mt+Ge:0,eo=Je==="rear"?"rear":Je==="front"?"front":Tr(K.data),Pe={...K,parentId:$.id,extent:"parent",position:{x:Qt,y:T.y},data:{...K.data,rackLayout:He?"split-face":"single-face",rackWidthPx:mt,rackFaceGapPx:Ge,mountMode:Je,face:eo}},Qe=S.filter($e=>$e.id!==b.id).concat(Pe),Et=Qr(Pe,$,Pe.position,Qe);if(Et.uPosition===void 0||!no($,Pe,Et.uPosition,Qe))return;let Wr=S.map($e=>$e.id!==b.id?$e:{...$e,parentId:$.id,extent:"parent",position:{x:Et.x,y:Et.y},data:{...$e.data,rackLayout:He?"split-face":"single-face",rackWidthPx:mt,rackFaceGapPx:Ge,mountMode:Je,face:eo,uPosition:Et.uPosition??$e.data.uPosition}});or(Wr);},[y,Bt,Lr,or,Ee,Eo,Br]),hd=useCallback(p=>{if(!p.source||!p.target||!p.sourceHandle||!p.targetHandle)return true;let b=B(p.source),N=B(p.target),k=ae(b,p.sourceHandle),C=ae(N,p.targetHandle),v=Nc(_e.current,p.source,b,k,p.target,N,C),$=v.source,S=v.target;if($&&s&&console.log("Connection will replace: Source handle already connected",{source:p.source,sourceHandle:p.sourceHandle,existingEdges:_e.current.filter(K=>K.source===p.source&&K.sourceHandle===p.sourceHandle||K.target===p.source&&K.targetHandle===p.sourceHandle)}),S&&s&&console.log("Connection will replace: Target handle already connected",{target:p.target,targetHandle:p.targetHandle,existingEdges:_e.current.filter(K=>K.target===p.target&&K.targetHandle===p.targetHandle||K.source===p.target&&K.sourceHandle===p.targetHandle)}),!Cr(b,N))return qe.current=null,true;let O=wn(b,p.sourceHandle,N,p.targetHandle);return O.valid?(qe.current=null,true):(s&&console.log(`Connection rejected: ${O.reason}`,p),qe.current={connection:p,reason:O.reason??"Connection not allowed by fiber rules"},false)},[B,s]),yd=useCallback(p=>{if(me)return;s&&console.log("onConnect called:",p);let b=B(p.source),N=B(p.target);s&&(console.log("onConnect: sourceNode type:",b?.type,"targetNode type:",N?.type),console.log("onConnect: sourceHandle:",p.sourceHandle,"targetHandle:",p.targetHandle));let k=Pc(p,b,N),C=te.validateConnection({source:k.source??null,target:k.target??null,sourceHandle:k.sourceHandle,targetHandle:k.targetHandle});if(!C.valid&&!(C.reason??"").includes("already connected")){s&&console.warn(`Connection rejected: ${C.reason}`),Oe(p,C.reason??"Connection not allowed","connect");return}let v=b?.type==="vertical-pdu",$=b?.type==="vertical-pdu"||N?.type==="vertical-pdu",S=yo(b,k.sourceHandle),T=yo(N,k.targetHandle),O=S&&T&&$,K=b?.data,He=b?.type==="switch"||b?.type==="device"&&K?.deviceType==="switch",mt=N?.type==="switch"||N?.type==="device"&&N.data?.deviceType==="switch",Ge=b?.type==="tube"&&N?.type==="multi-tube-cable",Je=b?.type==="multi-tube-cable"&&N?.type==="tube",Qt=Ge||Je,eo=k.sourceHandle==="cable-button"&&k.targetHandle==="cable-button",Pe="fiber";O?Pe="power":eo?Pe="thick-cable":Qt&&(Pe=W?"smoothstep":"fiber");let Qe,Et=wc(N),Wr=wc(b);if(Et||Wr){let ne=N?.data,ir=b?.data,ar=Et?ne.ribbonFiberIds:ir.ribbonFiberIds;ar&&Array.isArray(ar)&&ar.length>=6&&ar.length<=12&&(Qe={ribbonFiberIds:ar,isRibbon:true});}if(!Qe&&(Pe==="fiber"||Pe==="smoothstep")&&!v){let ne;Ge?ne=rr(k.target,k.targetHandle):ne=rr(k.source,k.sourceHandle),ne&&(Qe={color:ne.color,striped:ne.striped,isRibbon:false});}else if(Pe==="thick-cable"&&eo){let ne=b?.data;Qe={color:ne?.color||(ne?.tubeStartIndex?je(ne.tubeStartIndex):"#6366f1")};}let $e=Cr(b,N),q=!$e&&!S&&!!k.sourceHandle,Ot=!$e&&!T&&!!k.targetHandle,Pa=$e||O||q&&Ot&&(He||mt),Wn=fc({edges:_e.current,connection:k,edgeType:Pe,selectEdgeZIndex:at,sourcePolicy:{capacity:1,replaceable:Pa},targetPolicy:{capacity:1,replaceable:Pa},normalizeSourceHandle:ne=>ae(b,ne),normalizeTargetHandle:ne=>ae(N,ne),data:Qe});if(Wn){Jt(Wn.edges),s&&console.log("Handle replacement: Replaced",Wn.replacedEdgeIds.length,"edge(s)");return}let Un=te.validateConnection({source:k.source??null,target:k.target??null,sourceHandle:k.sourceHandle,targetHandle:k.targetHandle});if(!Un.valid){s&&console.warn(`Connection rejected: ${Un.reason}`),Oe(p,Un.reason??"Connection not allowed","connect");return}let zd=ae(b,k.sourceHandle),Wd=ae(N,k.targetHandle),Da=Nc(_e.current,k.source,b,zd,k.target,N,Wd);if(Da.source){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:p.source,sourceHandle:k.sourceHandle,existingEdges:_e.current.filter(ne=>ne.source===k.source&&ne.sourceHandle===k.sourceHandle||ne.target===k.source&&ne.targetHandle===k.sourceHandle)}),Oe(p,`Source handle ${k.sourceHandle} is already connected`,"connect");return}if(Da.target){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:k.target,targetHandle:k.targetHandle,existingEdges:_e.current.filter(ne=>ne.target===k.target&&ne.targetHandle===k.targetHandle||ne.source===k.target&&ne.sourceHandle===k.targetHandle)}),Oe(p,`Target handle ${k.targetHandle} is already connected`,"connect");return}let Gn=Nn(k,Pe,at,Qe),Ud=[..._e.current,Gn];Na(ne=>new Set(ne).add(Gn.id)),setTimeout(()=>{Na(ne=>{let ir=new Set(ne);return ir.delete(Gn.id),ir});},1e3),Jt(Ud);},[Jt,te,at,B,s,rr,W,me,Oe]),wd=useCallback((p,b)=>{if(me||!b.source||!b.target||!b.sourceHandle||!b.targetHandle)return;let N=B(b.source),k=B(b.target),C=Pc(b,N,k),v=ae(N,C.sourceHandle),$=ae(k,C.targetHandle),S=_e.current.some(q=>{if(q.id===p.id)return false;let Ot=q.source===C.source&&ae(N,q.sourceHandle)===v||q.target===C.source&&ae(N,q.targetHandle)===v,Ur=q.target===C.target&&ae(k,q.targetHandle)===$||q.source===C.target&&ae(k,q.sourceHandle)===$;return Ot||Ur}),T=te.validateConnection({source:C.source??null,target:C.target??null,sourceHandle:C.sourceHandle,targetHandle:C.targetHandle,ignoreEdgeId:p.id});if(!T.valid&&!((T.reason??"").includes("already connected")&&S)){s&&console.warn(`Edge update rejected: ${T.reason}`),Oe(b,T.reason??"Reconnection not allowed","reconnect");return}let O=N?.type==="vertical-pdu"||k?.type==="vertical-pdu",K=yo(N,C.sourceHandle),He=yo(k,C.targetHandle),mt=K&&He&&O,Ge=N?.type==="tube"&&k?.type==="multi-tube-cable",Je=N?.type==="multi-tube-cable"&&k?.type==="tube",Qt=Ge||Je,eo=C.sourceHandle==="cable-button"&&C.targetHandle==="cable-button",Pe;mt?Pe="power":eo?Pe="thick-cable":Qt?Pe=W?"smoothstep":"fiber":Pe="fiber";let Qe;if(Pe==="fiber"||Pe==="smoothstep"){let q=rr(C.source,C.sourceHandle);q&&(Qe={color:q.color,striped:q.striped});}let $e=_e.current.filter(q=>{if(q.id===p.id)return true;let Ot=q.source===C.source&&ae(N,q.sourceHandle)===v||q.target===C.source&&ae(N,q.targetHandle)===v,Ur=q.target===C.target&&ae(k,q.targetHandle)===$||q.source===C.target&&ae(k,q.sourceHandle)===$;return !(Ot||Ur)}).map(q=>{if(q.id===p.id){let Ot=at({...C,id:q.id,type:Pe});return {...q,source:C.source,target:C.target,sourceHandle:C.sourceHandle,targetHandle:C.targetHandle,type:Pe,data:Qe!==void 0?{...q.data,...Qe}:q.data,zIndex:Ot,style:{...q.style,zIndex:Ot}}}return q});Jt($e);},[Jt,B,rr,at,W,s,te,me,Oe]),Ro=useCallback(p=>{Ae(b=>{let N=false,k=b.map(C=>{let v=p!==null&&C.id===p;return C.selected===v?C:(N=true,{...C,selected:v})});return N?k:b});},[Ae]),Nd=useCallback((p,b)=>{if(Ke){c&&c(b);return}let N=p.metaKey||p.ctrlKey,k=xe(),C=b,v=Ee(b);if(b.type==="tube"&&v&&!N){let $=k.find(S=>S.id===v&&(S.type==="cable"||S.type==="multi-tube-cable"));$&&(C=$);}if(Bn(C),nr([]),Ro(C.id),N&&ro(C)&&!Co(C)){let $=C.data||{},S=Tr($),T=S==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${C.id} from ${S} to ${T}`),h&&h(C.id,T);}c&&c(C);},[h,c,s,xe,Ke,Ee,Co,Ro]),xd=useCallback(()=>{},[]),kd=useCallback((p,b)=>{Bn(null),nr([b]),Ro(null),c?.(null),d&&d(b);},[d,c,Ro]),Pd=useCallback(()=>{Bn(null),nr([]),Ro(null),c?.(null);},[c,Ro]),[dt,Bn]=useState(null),[wa,Na]=useState(new Set),[On,nr]=useState([]),Dd=useCallback(({edges:p})=>{nr(p||[]);},[]);useOnSelectionChange({onChange:Dd}),useEffect(()=>{let p=b=>{if(be.allowKeyboardDelete&&(b.key==="Backspace"||b.key==="Delete")&&On.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let N=On.filter(k=>{let C=k.sourceHandle||"",v=k.targetHandle||"";return C.startsWith("tube-")||v.startsWith("tube-")?(s&&console.log("Cannot delete edge connected to tube handle",k),false):true});if(N.length>0){let k=new Set(N.map(v=>v.id)),C=_e.current.filter(v=>!k.has(v.id));Jt(C),nr([]),s&&console.log("Deleted edges:",N.map(v=>v.id));}}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[On,Jt,s,be.allowKeyboardDelete]);let Cd=useCallback((p,{nodeId:b,handleType:N})=>{qe.current=null,s&&console.log("Connection started from",{nodeId:b,handleType:N});},[s]),Ed=useCallback(p=>{tr.current||Zt("connect"),s&&console.log("Connection ended",p);},[s,Zt]),Rd=useCallback(()=>{tr.current=true,qe.current=null;},[]),Td=useCallback(()=>{Zt("reconnect"),tr.current=false;},[Zt]),vd=useCallback(()=>{if(me&&!x&&!h||!dt)return;let p=B(dt.id);if(p){if(p.type==="rack"){let b=p.data||{};if(Ie(b))return;let k=(b.face||"front")==="front"?"rear":"front";x?(x(p.id,k),h&&xe().filter(v=>v.parentId===p.id).forEach(v=>{h(v.id,k);})):Ae(C=>C.map(v=>v.id===p.id?{...v,data:{...v.data,face:k}}:v.parentId===p.id?{...v,data:kc(v.data,k)}:v));return}if(ro(p)){if(Co(p))return;let b=p.data||{},k=Tr(b)==="front"?"rear":"front";h?h(p.id,k):Ae(C=>C.map(v=>v.id===p.id?{...v,data:kc(v.data,k)}:v));}}},[dt,B,x,h,Ae,xe,me,Co]),Id=useCallback(()=>{if(me||!y||!dt||!Mo(dt))return;let p=B(dt.id),b=Ee(p);if(!p||!Mo(p)||!b)return;let N=Bt(p),C=st.current.map(v=>v.id!==p.id?v:{...v,parentId:void 0,parentNode:void 0,extent:void 0,position:N,data:{...v.data,uPosition:void 0}});or(C);},[me,y,dt,B,Bt,or,Ee]),xa=useMemo(()=>Pt.map(p=>{let b=at(p)<1e3,N=wa.has(p.id)?"edge-connecting":p.className,k=b||p.hidden===true;return N===p.className&&k===(p.hidden===true)?p:{...p,...N!==p.className?{className:N}:{},hidden:k?true:void 0}}),[Pt,wa,at]),Or=useMemo(()=>({highlightedNodeIds:Y,highlightedEdgeIds:ye,dimUnhighlighted:ee,dimOpacity:we,connectEdgesToHighlightedNodes:pe}),[pe,we,ee,ye,Y]),ka=useRef([]),zr=useMemo(()=>na(Ne,{showDeviceImages:re},ka.current),[Ne,re]);useEffect(()=>{ka.current=zr;},[zr]);let Sd=useMemo(()=>ta(zr,Or),[Or,zr]),Fd=useMemo(()=>({highlightedPortHandles:fe,onPortClick:Ce,portClickEnabled:!!Ce}),[fe,Ce]),_d=useMemo(()=>oa(xa,Or),[Or,xa]),ve=useMemo(()=>dt?B(dt.id)??dt:null,[dt,B]),To=useMemo(()=>{if(!ve||!ko.enabled)return {showRearToggle:false,showDeRack:false,count:0};let p=ve.type==="rack"?!ma(ve):ro(ve)?!Co(ve):false,b=ko.showRearToggle&&p,N=ko.showDeRack&&y&&!me&&Mo(ve)&&!!Ee(ve);return {showRearToggle:b,showDeRack:N,count:(b?1:0)+(N?1:0)}},[ve,ko,y,me,Ee,Co,ma]),zn=useMemo(()=>{if(!ve||To.count===0||!Dt.current)return null;let p=Dt.current.getBoundingClientRect();if(p.width<=0||p.height<=0)return null;let b=ve.positionAbsolute??Bt(ve),N=ve.width||0,k=ve.height||0,C=To.count>1?220:110,v=34;try{let $=$t({x:b.x+N/2,y:b.y}),S=$t({x:b.x+N/2,y:b.y+k}),T=$.x-p.left-C/2,O=$.y-p.top-v-10;return O<8&&(O=S.y-p.top+10),T=Math.max(8,Math.min(T,p.width-C-8)),O=Math.max(8,Math.min(O,p.height-v-8)),{left:T,top:O}}catch{return null}},[ve,To,Bt,$t]),Hd=$a(R,P),Md=Ba(R,{touchAction:"none",...E}),Ad=l??yd,$d=u??wd,Ld=m??hd,Bd=useCallback(p=>{if(me)return;let b=ya(p);if(b){if(!de){te.setState({nodes:b});return}n?.(b);}},[me,ya,de,te,n]),Od=useCallback(p=>{if(me)return;let b=p.filter(k=>{if(k.type==="remove"){let C=_e.current.find(v=>v.id===k.id);if(C){let v=C.sourceHandle||"",$=C.targetHandle||"";if(v.startsWith("tube-")||$.startsWith("tube-"))return s&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",C),false}}return true});if(b.length===0)return;let N=applyEdgeChanges(b,_e.current);if(Zo(b),!de){te.setState({edges:N});return}a?.(N);},[me,s,Zo,de,te,a]);return jsx("div",{ref:Dt,className:Hd,style:Md,children:jsxs(gi,{value:Fd,children:[jsxs(ReactFlow,{nodes:Sd,edges:_d,onNodesChange:Bd,onEdgesChange:Od,onConnect:me?void 0:Ad,onConnectStart:Cd,onConnectEnd:Ed,onEdgeUpdate:me?void 0:$d,onEdgeUpdateStart:Rd,onEdgeUpdateEnd:Td,isValidConnection:Ld,connectionMode:w??ConnectionMode.Loose,connectionRadius:Ye,onNodeClick:Nd,onNodeDoubleClick:xd,onPaneClick:Pd,onNodeDragStart:gd,onNodeDrag:md,onNodeDragStop:bd,onEdgeClick:kd,onInit:_,nodeTypes:fa,edgeTypes:ze,defaultEdgeOptions:Lt,nodesDraggable:be.nodesDraggable,nodesConnectable:be.nodesConnectable,elementsSelectable:be.elementsSelectable,edgesFocusable:be.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:be.connectOnClick,panOnDrag:be.panOnDrag,panOnScroll:be.panOnScroll,minZoom:Z,maxZoom:j,zoomOnScroll:be.zoomOnScroll,zoomOnPinch:be.zoomOnPinch,zoomOnDoubleClick:be.zoomOnDoubleClick,preventScrolling:Ke,onlyRenderVisibleElements:X,fitView:true,fitViewOptions:H,proOptions:Ln,children:[jsx(Background,{color:La(R)}),be.showControls&&jsx(Controls,{showInteractive:be.showInteractiveControl}),be.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"})})]}),F&&jsx("button",{className:"download-button",onClick:$n,disabled:ke,"aria-busy":ke,style:{position:"absolute",top:A.includes("top")?"10px":"auto",bottom:A.includes("bottom")?"10px":"auto",right:A.includes("right")?"10px":"auto",left:A.includes("left")?"10px":"auto",zIndex:1e3,background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:"4px",padding:"0.5rem 0.75rem",fontSize:"0.875rem",cursor:ke?"not-allowed":"pointer",opacity:ke?.7:1,transition:"all 0.2s ease",...z},children:ke?`${L}...`:L}),ve&&zn&&To.count>0&&jsxs("div",{style:{position:"absolute",top:zn.top,left:zn.left,display:"flex",gap:8,zIndex:2e3},children:[To.showRearToggle&&jsx("button",{onClick:p=>{p.preventDefault(),vd();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let p=ve.data;return ve.type==="rack"?(p?.face||"front")==="front"?"Switch to rear":"Switch to front":Tr(p)==="front"?"Switch to rear":"Switch to front"})(),children:(()=>{let p=ve.data;return ve.type==="rack"?(p?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front":Tr(p)==="front"?"\u21C4 Rear":"\u21C4 Front"})()}),To.showDeRack&&jsx("button",{onClick:p=>{p.preventDefault(),Id();},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"})]})]})})},Qf=e=>{let{document:t,initialDocument:o,onDocumentChange:r,onNodesChange:n,onEdgesChange:a,...i}=e,s=t!==void 0||o!==void 0,c=t!==void 0,[d,f]=useState(()=>o),g=t??d,l=useMemo(()=>g?ri(g):null,[g]),u=useCallback(D=>D?{nodes:Cc(D.nodes,m.current?.nodes??[]),edges:Ec(D.edges,m.current?.edges??[])}:null,[]),m=useRef(l),w=useRef(g),h=useMemo(()=>u(l),[l,u]);useEffect(()=>{m.current=h;},[h]),useEffect(()=>{w.current=g;},[g]);let x=useCallback((D,y)=>{let R=to({nodes:D,edges:y},w.current);m.current={nodes:D,edges:y},w.current=R,c||f(R),r?.(R);},[c,r]),P=useCallback(D=>{let y=m.current?.edges??[];x(D,y),n?.(D);},[x,n]),E=useCallback(D=>{let y=m.current?.nodes??[];x(y,D),a?.(D);},[x,a]);if(s){let D=h??{nodes:[],edges:[]};return jsx(Dc,{...i,nodes:D.nodes,edges:D.edges,onNodesChange:P,onEdgesChange:E})}return jsx(Dc,{...e})};function Cc(e,t){let o=new Map(t.map(a=>[a.id,a])),r=true,n=e.map(a=>{let i=o.get(a.id),s=a.type==="rack"?yt(a.data):null;if(!i)return r=false,s?{...a,width:s.width,height:s.height}:a;if(i.data===a.data&&i.position?.x===a.position?.x&&i.position?.y===a.position?.y&&i.positionAbsolute?.x===a.positionAbsolute?.x&&i.positionAbsolute?.y===a.positionAbsolute?.y&&i.selected===a.selected&&i.dragging===a.dragging&&i.resizing===a.resizing&&(!s||i.width===s.width&&i.height===s.height))return i;r=false;let d={...i.data===a.data?i:a,position:a.position,...a.positionAbsolute!==void 0?{positionAbsolute:a.positionAbsolute}:{},...i.selected!==void 0?{selected:i.selected}:{},...i.dragging!==void 0?{dragging:i.dragging}:{},...i.resizing!==void 0?{resizing:i.resizing}:{}};return s?{...d,width:s.width,height:s.height}:{...d,...typeof i.width=="number"?{width:i.width}:{},...typeof i.height=="number"?{height:i.height}:{},...i.measured?{measured:i.measured}:{}}});return r&&n.length===t.length?t:n}function Ec(e,t){let o=new Map(t.map(a=>[a.id,a])),r=true,n=e.map(a=>{let i=o.get(a.id);if(!i)return r=false,a;let s=a;return i.data===s.data&&i.source===s.source&&i.target===s.target&&i.sourceHandle===s.sourceHandle&&i.targetHandle===s.targetHandle&&i.type===s.type&&i.animated===s.animated&&i.hidden===s.hidden&&i.label===s.label&&i.className===s.className&&i.style===s.style&&i.zIndex===s.zIndex&&(s.selected===void 0||i.selected===s.selected)?i:(r=false,{...a,...i.selected!==void 0?{selected:i.selected}:{}})});return r&&n.length===t.length?t:n}var aa=e=>jsx(ReactFlowProvider,{children:jsx(Qf,{...e})});var sa=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 Ir(e,{rowHeight:t,tubeGap:o}){let r=[],n=[],a=e.kind??(e.tubeCount?"tube":"simple"),i=a==="tube"?Math.max(1,Math.min(24,e.tubeCount??1)):1,s=a==="tube"?Math.max(1,Math.min(24,e.fibersPerTube??12)):Math.max(1,Math.min(24,e.fiberCount??12)),c=Math.max(1,e.tubeStartIndex??1),d=Math.max(1,e.fiberStartIndex??1),f=0;for(let g=0;g<i;g+=1){let l=c+g,u=e.tubeColorMap?.[l];n.push({tubeIndex:l,y:f,label:`T${l}`,color:u??je(l)});for(let m=0;m<s;m+=1){let w=d+m,h=di(w);r.push({key:`${l}-${w}`,tubeIndex:a==="tube"?l:void 0,fiberIndex:w,y:f,color:co(w),striped:so(w),backgroundImage:typeof h.backgroundImage=="string"?h.backgroundImage:void 0}),f+=t;}g<i-1&&(f+=o);}return {rows:r,tubeLabels:n,height:f}}var ca=e=>typeof e=="object"&&e!==null,ng=e=>{if(!ca(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&ca(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&ca(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},ig=e=>e==="fibre-flow"||e==="fibre-flow-link",ag=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,sg=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",Pn=e=>typeof e=="string"&&e.startsWith("fiber-"),Dn=(e,t,o)=>e.source===t&&e.sourceHandle===o||e.target===t&&e.targetHandle===o,cg=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!ag(n))return;let a=o.get(n.id),i=ig(n.type)?n.type:a?.type??sg(n);r.push({...a??{},...n,type:i});}),r},Sc=e=>vo(e.fiber,e.tube??1),Fc=e=>co(e.fiber),_c=e=>so(e.fiber),dg=(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`},lg=(e,t,o,r,n,a)=>e?`${o} ${a}`:t?`0 ${n} ${r} ${a}`:"6 6",ug=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s})=>{let[c,d,f]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,curvature:.35}),g=typeof s?.lossDb=="number"?`${s.lossDb.toFixed(2)} dB`:"",l=s?.label??g,u=s?.sourceColor,m=s?.targetColor,w=s?.color??u??m??"#94a3b8",h=s?.sourceStriped??false,x=s?.targetStriped??false,P=s?.highlighted??true,E=s?.dimmed??false,D=s?.circuitId,y=s?.circuitLabel??D,R=s?.showCircuitId??false,_=u&&m&&u!==m,M=r-t,F=n-o,A=Math.sqrt(M*M+F*F),L=d-t,z=f-o,W=Math.sqrt(L*L+z*z),Q=A>0?W/A*100:50,oe=`fibre-flow-gradient-${e}`,I=h&&!x,H=x&&!h,Z=h&&x,j=A*1.25,X=j/2,Y=12,ye=Math.ceil(X*1.2/Y),ee=Array(ye).fill("6 6").join(" "),we=Math.ceil(X*1.2/Y),pe=Array(we).fill("6 6").join(" "),re=R&&y,fe=Math.max(l?l.length*6.2+16:0,re?(y?.length||0)*5.5+16:0),Ce=re?32:16;return jsxs(Fragment,{children:[jsx("defs",{children:_&&jsxs("linearGradient",{id:oe,x1:t,y1:o,x2:r,y2:n,gradientUnits:"userSpaceOnUse",children:[jsx("stop",{offset:"0%",stopColor:u}),jsx("stop",{offset:`${Q}%`,stopColor:u}),jsx("stop",{offset:`${Q}%`,stopColor:m}),jsx("stop",{offset:"100%",stopColor:m})]})}),_?jsx("path",{id:e,d:c,fill:"none",stroke:`url(#${oe})`,strokeWidth:P?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:w,strokeWidth:P?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:E?.25:1,strokeOpacity:E?.25:1,mixBlendMode:"normal"}}),(Z||I||H)&&jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:P?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:lg(I,H,ee,pe,X,j),strokeDashoffset:0,opacity:E?.2:.9,style:{mixBlendMode:"normal"}}),(l||re)&&P&&jsx(EdgeLabelRenderer,{children:jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${d}px, ${f}px)`,width:fe,height:Ce,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:[l&&jsx("div",{style:{lineHeight:1.2},children:l}),re&&jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:l?2:0},children:y})]})})]})},pg=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s})=>{let[c,d,f]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,curvature:.2}),g=s?.label,l=s?.color??"#64748b";return jsxs(Fragment,{children:[jsx(BaseEdge,{id:e,path:c,style:{stroke:l,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),g&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${d}px, ${f}px)`,padding:"2px 8px",background:"rgba(30, 41, 59, 0.9)",border:`1px solid ${l}`,borderRadius:10,fontSize:10,fontFamily:"monospace",color:"#e2e8f0",letterSpacing:.2,whiteSpace:"nowrap",pointerEvents:"none",zIndex:9999},children:g})})]})},fg=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:n,showTubeLabels:a,showFiberNumbers:i,layout:s,colorMode:c="dark"}=e,d=c==="light",f=8,g=12,l=-1,u=0,m=t.jacketColor??"#facc15",w=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",h=a&&w,x=o==="left"?f+u:u,P=o==="right"?f+u:u,E=o==="left"?Position.Right:Position.Left,D={width:4,height:4,borderRadius:"50%",background:m,border:`1px solid ${m}`,boxShadow:"0 0 1px rgba(0,0,0,0.4)",top:"50%",position:"absolute",...o==="left"?{left:0,transform:"translate(-50%, -50%)"}:{right:0,transform:"translate(50%, -50%)"}};return 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:d?"rgba(248, 250, 252, 0.95)":"rgba(15, 23, 42, 0.9)",color:d?"#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:f,left:o==="left"?0:void 0,right:o==="right"?0:void 0,borderRadius:4,background:w?"transparent":m,border:`1px solid ${m}`,boxShadow:w?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:w&&s.tubeLabels.map((y,R)=>{let _=s.rows.filter(W=>W.tubeIndex===y.tubeIndex);if(_.length===0)return null;let M=_[0].y,F=_[_.length-1].y+r,A=F-M,L=s.tubeLabels[R+1],z=L&&L.y-F>0;return jsx("div",{style:{position:"absolute",top:M,left:0,right:0,height:A,background:y.color,borderLeft:`2px solid ${y.color}`,borderRight:`2px solid ${y.color}`,borderTop:R===0?`2px solid ${y.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:z?"1px solid rgba(0,0,0,0.15)":`2px solid ${y.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:R===0&&!z||R===0?"4px 4px 0 0":z?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${y.tubeIndex}`)})}),!h&&jsx("div",{style:{position:"absolute",top:0,bottom:0,left:x,right:P,...o==="left"?{borderRight:`1px solid ${m}`}:{borderLeft:`1px solid ${m}`},pointerEvents:"none",zIndex:0}}),w&&s.tubeLabels.map((y,R)=>{let _=s.rows.filter(L=>L.tubeIndex===y.tubeIndex);if(_.length===0)return null;let M=_[0].y,A=_[_.length-1].y+r-M;return jsx("div",{style:{position:"absolute",top:M,left:x,right:P,height:A,...o==="left"?{borderRight:`2px solid ${y.color}`}:{borderLeft:`2px solid ${y.color}`},opacity:.5,pointerEvents:"none"}},`tube-border-${y.tubeIndex}`)}),s.rows.map(y=>{let R=vo(y.fiberIndex,y.tubeIndex??1),_=y.y+r/2,M={position:"absolute",width:g,height:g,borderRadius:"50%",top:_,background:y.backgroundImage?y.backgroundImage:y.color,backgroundColor:y.color,border:`2px solid ${y.color}`,boxShadow:"0 0 6px rgba(0,0,0,0.3)",...o==="left"?{right:-g/2}:{left:-g/2},transform:"translateY(-50%)",zIndex:1e3,cursor:"crosshair","--fiber-bg":y.color,minWidth:g,minHeight:g};y.backgroundImage&&(M["--fiber-bg-image"]=y.backgroundImage);let F=o==="left"?{right:g+l,textAlign:"right"}:{left:g+l,textAlign:"left"};return jsxs(ce.Fragment,{children:[jsx(Handle,{id:R,type:"source",position:E,className:"fibre-flow-handle",style:M,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),jsx(Handle,{id:R,type:"target",position:E,className:"fibre-flow-handle",style:M,isConnectable:true,"data-fiber-idx":y.fiberIndex,"data-tube-idx":y.tubeIndex,"data-fiber-color":y.color}),i&&jsx("div",{style:{position:"absolute",top:y.y+r/2-6,...F,fontSize:8,fontWeight:600,color:d?"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:D,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:D,isConnectable:true,"data-handle-type":"cable-run"})]})},gg=({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})})},mg=(e,t,o,r,n,a,i,s,c,d="dark")=>{let f=[],g=0;return e.forEach(l=>{let u=Ir(l.leftCable,{rowHeight:o,tubeGap:r}),m=Ir(l.rightCable,{rowHeight:o,tubeGap:r}),w=Math.max(u.height,m.height),h=a*2+i,x=32,P=16,E=h+P*2,D=w+x+P*2,y=`flow-closure-${l.id}`,R=`flow-cable-${l.id}-left`,_=`flow-cable-${l.id}-right`,M=t==="horizontal"?{x:g,y:0}:{x:0,y:g};g+=(t==="horizontal"?E:D)+n;let F=l.chamberId?`${l.id} - ${l.chamberId}`:l.id;f.push({id:y,type:"fibre-flow-closure",position:M,data:{label:F,width:E,height:D,headerHeight:x,colorMode:d},selectable:false,draggable:false,style:{width:E,height:D}});let A=x+P+(w-u.height)/2,L=x+P+(w-m.height)/2;f.push({id:R,type:"fibre-flow-cable",position:{x:P,y:A},parentId:y,extent:"parent",data:{label:l.leftCable.label,cable:l.leftCable,side:"left",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:c,layout:u,colorMode:d},style:{width:a,height:u.height}}),f.push({id:_,type:"fibre-flow-cable",position:{x:P+h-a,y:L},parentId:y,extent:"parent",data:{label:l.rightCable.label,cable:l.rightCable,side:"right",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:c,layout:m,colorMode:d},style:{width:a,height:m.height}});}),f},bg=(e,t,o,r=false)=>{let n=[],a=new Map,i=new Map,s=new Map;return (t??[]).forEach(c=>{c.color&&a.set(c.id,c.color),c.label&&i.set(c.id,c.label);}),e.forEach(c=>{let d=`flow-cable-${c.id}-left`,f=`flow-cable-${c.id}-right`;[{nodeId:d,cable:c.leftCable},{nodeId:f,cable:c.rightCable}].forEach(({nodeId:l,cable:u})=>{let m=s.get(u.id);if(m&&m.closureId!==c.id){let w=dg(u.distanceMeters??m.distanceMeters,u.distanceLabel??m.distanceLabel),h=u.jacketColor??m.jacketColor??"#64748b";n.push({id:`flow-link-${m.nodeId}-${l}`,type:"fibre-flow-link",source:m.nodeId,target:l,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:w,color:h}});}s.set(u.id,{nodeId:l,closureId:c.id,jacketColor:u.jacketColor,distanceLabel:u.distanceLabel,distanceMeters:u.distanceMeters});}),c.splices.forEach(l=>{let u=o?l.circuitId===o:true,m=!!o&&!u,w=l.circuitId?a.get(l.circuitId):void 0,h=l.circuitId?i.get(l.circuitId):void 0,x=l.color??w,P=Fc(l.from),E=Fc(l.to),D=_c(l.from),y=_c(l.to);n.push({id:`flow-edge-${c.id}-${l.id}`,type:"fibre-flow",source:d,target:f,sourceHandle:Sc(l.from),targetHandle:Sc(l.to),data:{lossDb:l.lossDb,label:l.label,color:x,sourceColor:P,targetColor:E,sourceStriped:D,targetStriped:y,highlighted:u,dimmed:m,circuitId:l.circuitId,circuitLabel:h,showCircuitId:r}});});}),n},hg=({closures:e,circuits:t,highlightedCircuitId:o,layout:r="horizontal",rowHeight:n=20,tubeGap:a=10,closureGap:i=140,cableColumnWidth:s=32,spliceAreaWidth:c=260,showTubeLabels:d=true,showFiberNumbers:f=true,colorMode:g="dark",showCircuitId:l=false,className:u,style:m,readOnly:w=false,interaction:h})=>{let x=useMemo(()=>mg(e,r,n,a,i,s,c,d,f,g),[e,r,n,a,i,s,c,d,f,g]),P=useMemo(()=>bg(e,t,o,l),[e,t,o,l]),[E,D]=useState(x),[y,R]=useState(P);useEffect(()=>{D(x);},[x,D]),useEffect(()=>{R(P);},[P,R]);let _=useCallback((I,H)=>{if(!I||!H||!H.startsWith("fiber-"))return;let Z=E.find(we=>we.id===I);if(!Z||Z.type!=="fibre-flow-cable")return;let{shape:j}=zt(H);if(j.kind!=="fiber"||j.tube===void 0)return;let X=j.tube,Y=j.fiber,ee=Z.data.layout.rows.find(we=>(we.tubeIndex??1)===X&&we.fiberIndex===Y);if(ee)return {color:ee.color,striped:ee.striped??false}},[E]),M=useCallback(I=>{if(w||!I.source||!I.target||!I.sourceHandle||!I.targetHandle)return false;let H=E.find(ye=>ye.id===I.source),Z=E.find(ye=>ye.id===I.target);if(!H||!Z)return false;let j=typeof I.sourceHandle=="string"&&I.sourceHandle.startsWith("fiber-"),X=typeof I.targetHandle=="string"&&I.targetHandle.startsWith("fiber-");return I.sourceHandle==="cable-run"||I.targetHandle==="cable-run"?true:j&&X?H.type==="fibre-flow-cable"&&Z.type==="fibre-flow-cable":false},[E,w]),F=useCallback(I=>{if(w)return;let H=I.sourceHandle==="cable-run"||I.targetHandle==="cable-run",Z=Pn(I.sourceHandle),j=Pn(I.targetHandle),X=H?void 0:_(I.source,I.sourceHandle),Y=H?void 0:_(I.target,I.targetHandle),ye=H?void 0:{sourceColor:X?.color,targetColor:Y?.color,color:X?.color??Y?.color,sourceStriped:X?.striped,targetStriped:Y?.striped};R(ee=>{let we=ee.filter(pe=>{let re=Z&&Dn(pe,I.source,I.sourceHandle),fe=j&&Dn(pe,I.target,I.targetHandle);return !(re||fe)});return addEdge({...I,type:H?"fibre-flow-link":"fibre-flow",data:ye},we)});},[_,w,R]),A=useCallback((I,H)=>{if(w)return;let Z=H.sourceHandle==="cable-run"||H.targetHandle==="cable-run",j=Z?void 0:_(H.source,H.sourceHandle),X=Z?void 0:_(H.target,H.targetHandle),Y=Z?void 0:{sourceColor:j?.color,targetColor:X?.color,color:j?.color??X?.color,sourceStriped:j?.striped,targetStriped:X?.striped};R(ye=>{let ee=ye.filter(fe=>fe.id!==I.id),we=Pn(H.sourceHandle),pe=Pn(H.targetHandle),re=ee.filter(fe=>{let Ce=we&&Dn(fe,H.source,H.sourceHandle),Ye=pe&&Dn(fe,H.target,H.targetHandle);return !(Ce||Ye)});return addEdge({...H,type:Z?"fibre-flow-link":"fibre-flow",data:Y},re)});},[_,w,R]),L=useCallback(I=>{w||D(I.filter(ng));},[w,D]),z=useCallback(I=>{w||R(H=>cg(I,H));},[w,R]),W=useMemo(()=>({"fibre-flow-cable":fg,"fibre-flow-closure":gg}),[]),Q=useMemo(()=>({"fibre-flow":ug,"fibre-flow-link":pg}),[]),oe={borderRadius:8,overflow:"hidden",...m};return jsx(aa,{nodes:E,edges:y,onNodesChange:L,onEdgesChange:z,onConnect:F,onEdgeUpdate:A,isValidConnection:M,connectionMode:ConnectionMode.Loose,nodeTypes:W,edgeTypes:Q,className:u,style:oe,colorMode:g,readOnly:w,interaction:h,fitViewOptions:{padding:.2}})},yg=e=>jsx(hg,{...e});var Ng=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:n=150,layout:a,showTubeLabels:i,showFiberNumbers:s=true,showCableLabel:c=true})=>{let d=useMemo(()=>a??Ir(e,{rowHeight:o,tubeGap:r}),[a,e,o,r]),f=26,g=10,l=18,u=t==="left"?n-l:l,m=8,w=t==="left"?6:n-f-18,h=e.jacketColor??"#facc15",x=i??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxs("div",{style:{position:"relative",width:n,height:d.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:f,left:t==="left"?0:void 0,right:t==="right"?0:void 0,borderRadius:14,background:`linear-gradient(90deg, ${h} 0%, ${h} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${h}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),x&&d.tubeLabels.map(P=>jsxs("div",{style:{position:"absolute",top:P.y+o/2-6,left:w,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:P.color,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 3px rgba(0,0,0,0.25)"}}),jsx("span",{children:P.label})]},`tube-${P.tubeIndex}`)),d.rows.map(P=>{let E=P.y+o/2-g/2,D=t==="left"?u-g/2-m:u+g/2+m;return jsxs(ce.Fragment,{children:[jsx("div",{style:{position:"absolute",top:E,left:u-g/2,width:g,height:g,borderRadius:"50%",backgroundColor:P.color,backgroundImage:P.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:P.y+o/2-6,left:D,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:P.fiberIndex})]},P.key)})]})},xg=ce.memo(Ng);var Bc=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,a)=>{n.position={x:a*300,y:100};}),o.forEach(n=>{if(n.parentId){let a=t.find(i=>i.id===n.parentId);if(a){let i=n.data.uPosition||1,s=n.data.uHeight||1;n.position={x:a.position.x+50,y:a.position.y+i*20-s*10};}}else n.position={x:Math.random()*400+100,y:Math.random()*200+50};}),r.forEach((n,a)=>{n.position={x:a*150+100,y:300};}),e};function Cn(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 En(e){if(!e)return;if(typeof e=="string")return e;let t=e.device;return typeof t=="object"&&t?t.id:t}var Oc=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}}),zc=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}}),Wc=e=>{let t=En(e.termination_a),o=En(e.termination_b);return {id:`cable-${e.id}`,source:Cn(t)??"device-unknown-source",target:Cn(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}}},Uc=e=>{let t=[],o=[],r=new Map;return e.racks.forEach(n=>t.push(Oc(n))),e.devices.forEach(n=>{let a=zc(n);t.push(a),r.set(n.name,a.id);}),e.cables.forEach(n=>{let a=Wc(n),i=En(n.termination_a),s=En(n.termination_b);o.push({...a,source:(typeof i=="string"?r.get(i):void 0)??Cn(i)??a.source,target:(typeof s=="string"?r.get(s):void 0)??Cn(s)??a.target});}),{nodes:t,edges:o}},kg=e=>to(Uc(e)),Pg=e=>Bc(e);var Gc=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Dg="Interfaces",Cg="Management",Eg="Power",Vc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ft=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},_t=e=>{if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Rg=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",Rn=e=>Vc(e.custom_fields)?e.custom_fields:void 0,Tn=e=>Vc(e)?e:void 0,jc=(e,t)=>{let o=Rn(e),r=Tn(o?.layout);return Rg(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},Xc=(e,t,o)=>{let r=Rn(e),n=Tn(r?.layout),a=Ft(o)??Ft(e.layout?.group)??Ft(e.port_group)??Ft(n?.group)??Ft(r?.port_group)??Ft(r?.portGroup)??Ft(r?.interface_group)??Ft(r?.interfaceGroup)??Ft(r?.group);return a||(t==="power_ac"||t==="power_c13"||t==="power_c19"?Eg:t==="console"||t==="mgmt"?Cg:Dg)},Yc=(e,t,o)=>{let r=Rn(e),n=Tn(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)},Kc=(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":o.includes("rj45")||o.includes("rj-45")?"rj45":"ethernet"},qc=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"}},Tg=e=>typeof e=="string"?dr(e):nt(e),Zc=(e,t,o)=>{if(!o)return;let r=Rn(e),n=Tn(r?.layout),a=[t?.position,t,e.layout?.position,e.layout,n?.position,n,r?.port_position,r?.portPosition,r?.position,r,e];for(let i of a){let s=Tg(i);if(s)return s}},vg=(e,t)=>{let o=e.type?.value??e.type?.label??e.layout?.type??void 0,r=Yc(e,o),n=Kc(o,r),a=Xc(e,n);return {id:e.name,label:e.name,face:jc(e),group:a,type:n,cableType:qc(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:Zc(e,void 0,t)}},Ig=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)}),Sg=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[];return Ig(e.interfaces??[]).forEach((i,s)=>{let c=r?r({device:e,iface:i,index:s}):vg(i,o);if(!c)return;let d=c.type??i.type?.value??i.type?.label??void 0,f=Yc(i,d,c.connectorType),g=Kc(d,f),l=jc(i,c.face),u=Xc(i,g,c.group);n.push({id:c.id,label:c.label??i.name,face:l,group:u,connected:c.connected??!!(i.connected_endpoint||i.cable),type:g,cableType:qc(c.cableType??i.type?.value??i.type?.label??void 0),connectorType:f,position:Zc(i,c,o)});}),n},Jc=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}}),Qc=(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=Sg(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}},ed=e=>({id:`cable-${e.id}`,source:Gc(e.termination_a.device),sourceHandle:e.termination_a.name,target:Gc(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}}),td=(e,t={})=>{let o=[],r=[],n=new Map;return e.racks.forEach(a=>{o.push(Jc(a));}),e.devices.forEach(a=>{let i=Qc(a,t);o.push(i),n.set(a.name,i.id);}),e.cables.forEach(a=>{let i=ed(a),s=(typeof a.termination_a.device.id=="number"?`device-${a.termination_a.device.id}`:void 0)??n.get(a.termination_a.device.name)??i.source,c=(typeof a.termination_b.device.id=="number"?`device-${a.termination_b.device.id}`:void 0)??n.get(a.termination_b.device.name)??i.target;r.push({...i,source:s,target:c});}),{nodes:o,edges:r}},Fg=(e,t={})=>to(td(e,t)),_g=(e,t)=>{let o=new Map,r=new Set;return e.filter(a=>a.position!==null).sort((a,i)=>(a.position||0)-(i.position||0)).forEach(a=>{a.position&&(o.set(a.id,a.position),r.add(a.position));}),o};function vn(e){let{items:t,checkOutOfBounds:o,checkConflicts:r}=e,n=[],a=[];for(let i of t){let s=o(i);s&&!s.isValid&&s.error&&a.push(s.error);}for(let i=0;i<t.length;i++){let s=t[i];for(let c=i+1;c<t.length;c++){let d=t[c],f=r(s,d);f&&f.hasConflict&&f.conflict&&n.push(f.conflict);}}return {isValid:n.length===0&&a.length===0,conflicts:n,outOfBounds:a}}var Hg=bt,Mg="Network Ports",Ag="Rear Network Ports",$g="Power Ports",In=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Be=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},od=e=>{let t=Be(e)?.toLowerCase();if(t==="front")return "front";if(t==="rear"||t==="back")return "rear"},Sn=e=>{let t=Be(e)?.toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Lg=e=>Te(e)?"rear":"front",Bg=({face:e,type:t})=>Te(t)?$g:e==="rear"?Ag:Mg;function _n(e){return od(e.face)??Lg(e.type)}var Og=_n;function Hn(e){return Be(e.group)??Bg({face:_n(e),type:e.type})}var zg=Hn;function Fn(e){if(!Array.isArray(e))return;let t=e.map(o=>{if(!In(o))return null;let r=Be(o.label);if(!r)return null;let n=Be(o.type),a=_n({face:od(o.face),type:n}),i=Hn({face:a,group:Be(o.group),type:n}),s=nt(o.position??o),c=typeof o.order=="number"&&Number.isFinite(o.order)?o.order:void 0;return {...Be(o.id)?{id:Be(o.id)}:{},label:r,face:a,group:i,connected:typeof o.connected=="boolean"?o.connected:void 0,...n?{type:n}:{},...Be(o.cableType)?{cableType:Be(o.cableType)}:{},...Sn(o.connectorType)?{connectorType:Sn(o.connectorType)}:{},...typeof c=="number"?{order:c}:{},...s?{position:s}:{}}}).filter(o=>o!==null);return t.length>0?t:void 0}var Wg=Fn;function Sr(e,t){return Array.isArray(e)?e.flatMap(o=>!In(o)||!Array.isArray(o.ports)?[]:o.ports.map((r,n)=>{if(!In(r))return null;let a=Be(r.label);if(!a)return null;let i=Be(r.type),s=Hn({face:t,group:Be(o.name),type:i}),c=nt(r.position??r),d=typeof r.order=="number"&&Number.isFinite(r.order)?r.order:n;return {...Be(r.id)?{id:Be(r.id)}:{},label:a,face:t,group:s,connected:typeof r.connected=="boolean"?r.connected:void 0,...i?{type:i}:{},...Be(r.cableType)?{cableType:Be(r.cableType)}:{},...Sn(r.connectorType)?{connectorType:Sn(r.connectorType)}:{},order:d,...c?{position:c}:{}}}).filter(r=>r!==null)):[]}function Mn(e){if(In(e)){let r=Fn(e.ports);if(r)return r;let n=Sr(e.ports,"front"),a=n.length>0?n:Sr(e.portGroups,"front"),i=Sr(e.rearPortGroups,"rear"),s=i.length>0?i:Sr(e.rearPorts,"rear"),c=[...a,...s];return c.length>0?c:void 0}let t=Fn(e);if(t)return t;let o=Sr(e,"front");return o.length>0?o:void 0}var Ug=Mn;function rd({portGroups:e,rearPortGroups:t}){let o=[],r=(n,a)=>{n?.forEach(i=>{i.ports.forEach((s,c)=>{o.push({...typeof s.id=="string"&&s.id.trim().length>0?{id:s.id}:{},label:s.label,face:a,group:i.name,connected:s.connected,...s.type?{type:s.type}:{},...s.cableType?{cableType:s.cableType}:{},...s.connectorType?{connectorType:s.connectorType}:{},order:c,...s.position?{position:s.position}:{}});});});};return r(e,"front"),r(t,"rear"),o}var Gg=rd;function la(e){if(!Array.isArray(e)||e.length===0)return {portGroups:[],rearPortGroups:[]};let{ports:t,rearPorts:o}=Xr(e);return {portGroups:t,rearPortGroups:o}}var Vg=la;function nd(e,t,o={}){let r=bt(e,t);if(Te(t.type))return [r];let n=String(o.deviceType??"").toLowerCase(),a=o.face??"front";return n==="switch"||n==="router"?[r,`${r}-target`]:n==="patch-panel"||n==="patch_panel"?a==="rear"?[r,`${r}-target`]:[r,`${r}-source`]:[r]}function id(e,t,o={}){let r=o.sanitizeHandle??(c=>Re(c)),n=r(t),{ports:a,rearPorts:i}=Le(e),s=(c,d)=>{for(let f of c)for(let g of f.ports)if(nd(f.name,g,{deviceType:o.deviceType,face:d}).some(u=>r(u)===n))return {port:g,blockName:f.name,face:d}};return s(a,"front")??s(i,"rear")}function jg(e,t,o={}){return id(e,t,o)!==void 0}function Xg(e){return la(e)}var Ko=class extends Error{constructor(o,r,n,a,i){super(`Device placement conflict: ${r} at U${n}-${n+a-1} in rack ${o}${i?` conflicts with ${i}`:""}`);this.rackId=o;this.deviceId=r;this.uPosition=n;this.uHeight=a;this.conflictWith=i;this.name="DevicePlacementError";}};function ua(e,t={}){let o=Ie(e);return vn({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 a=r.unit,i=r.unit+r.height-1,s=n.unit,c=n.unit+n.height-1;if(a<=c&&i>=s){if(o){let d=Ve(r),f=Ve(n);if(!Kr(d,f))return null}return {hasConflict:true,conflict:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,conflictWith:n.id}}}return null}})}function ad(e,t,o={}){let{deviceTypeMapping:r={}}=o,n=r[e.type]||"device",a=$o(t,e.unit,e.height,e);return {id:e.id,type:n,position:a,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??e.rearPorts,connections:e.connections,frontImageUrl:e.frontImageUrl,rearImageUrl:e.rearImageUrl,frontImageAttribution:e.frontImageAttribution,rearImageAttribution:e.rearImageAttribution,imageFit:e.imageFit,imagePosition:e.imagePosition,imageRepeat:e.imageRepeat,stretchToFit:e.stretchToFit,rackWidthPx:t.data.rackWidthPx,rackLayout:t.data.rackLayout,rackFaceGapPx:t.data.rackFaceGapPx,mountMode:Ve(e)}}}function Yg(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 Kg(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=ua(i,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(d=>{c.push(`Device ${d.deviceId} at U${d.uPosition}-${d.uPosition+d.uHeight-1} conflicts with ${d.conflictWith}`);}),s.outOfBounds.forEach(d=>{c.push(`Device ${d.deviceId} at U${d.uPosition}-${d.uPosition+d.uHeight-1} exceeds rack height (${d.rackUHeight}U)`);}),new Ko(i.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 i of e){let s=Yg(i);n.push(s);for(let c of i.devices)try{let d=ad(c,s,t);a.push(d);}catch(d){if(o==="strict")throw d;if(o==="nearest"){let f=en(s,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:Ve(c)}},a,c.unit);if(f!==void 0&&f!==c.unit){console.warn(`Device ${c.id} moved from U${c.unit} to U${f} due to conflict`);let g={...c,unit:f},l=ad(g,s,t);a.push(l);}else throw new Ko(i.id,c.id,c.unit,c.height)}}}return n.push(...a),n}function qg(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let a=e.filter(i=>oo(i.type)&&i.parentId===r.id).sort((i,s)=>{let c=i.data.uPosition||1,d=s.data.uPosition||1;return c!==d?c-d:i.id.localeCompare(s.id)}).map(i=>{let s=Mn(i.data);return {id:i.id,name:i.data.label,unit:i.data.uPosition||1,height:i.data.uHeight||1,type:i.data.deviceType||"server",width:i.data.width==="full"||i.data.width==="half"?i.data.width:void 0,ports:s,portGroups:Array.isArray(i.data.portGroups)?i.data.portGroups:void 0,rearPortGroups:Array.isArray(i.data.rearPortGroups)?i.data.rearPortGroups:void 0,role:typeof i.data.role=="string"?i.data.role:void 0,status:i.data.status,connections:i.data.connections,frontImageUrl:i.data.frontImageUrl,rearImageUrl:i.data.rearImageUrl,frontImageAttribution:i.data.frontImageAttribution,rearImageAttribution:i.data.rearImageAttribution,imageFit:i.data.imageFit,imagePosition:i.data.imagePosition,imageRepeat:i.data.imageRepeat,stretchToFit:i.data.stretchToFit,mountMode:Ve(i.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:a,rackWidthPx:r.data.rackWidthPx});}return t}function Zg(e,t,o,r){return e.map(n=>n.id!==t?n:{...n,devices:n.devices.map(a=>a.id!==o?a:{...a,unit:r})})}function Jg(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!ua({...a,devices:[...a.devices,o]},r).isValid)throw new Ko(t,o.id,o.unit,o.height);return {...a,devices:[...a.devices,o]}})}function Qg(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(n=>n.id!==o)})}var qo=class extends Error{constructor(o,r,n,a){super(`Splice placement conflict: ${r} at holder ${n} in tray ${o}${a?` conflicts with ${a}`:""}`);this.trayId=o;this.spliceId=r;this.holder=n;this.conflictWith=a;this.name="SplicePlacementError";}};function pa(e,t={}){return vn({items:e.splices,checkOutOfBounds:o=>o.holder<1||o.holder>jt?{isValid:false,error:{spliceId:o.id,holder:o.holder,max:jt}}:null,checkConflicts:(o,r)=>o.holder===r.holder?{hasConflict:true,conflict:{spliceId:o.id,holder:o.holder,conflictWith:r.id}}:null})}function sd(e,t){let o=e.mode==="ribbon",r=Pr(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 em(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function tm(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=pa(i,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(d=>{c.push(`Splice ${d.spliceId} at holder ${d.holder} conflicts with ${d.conflictWith}`);}),s.outOfBounds.forEach(d=>{c.push(`Splice ${d.spliceId} at holder ${d.holder} is out of bounds (max: ${d.max})`);}),new qo(i.id,s.conflicts[0]?.spliceId||s.outOfBounds[0]?.spliceId||"unknown",s.conflicts[0]?.holder||s.outOfBounds[0]?.holder||1)}}for(let i of e){let s=em(i);n.push(s);for(let c of i.splices)try{let d=c.holder;if(o==="nearest"){let l={id:c.id,type:"splice",position:{x:0,y:0},data:{label:c.name,holderPosition:c.holder}},u=[...n,...a];Nr(s,l,c.holder,u)||(d=kr(s,l,u,c.holder));}let f=d!==c.holder?{...c,holder:d}:c,g=sd(f,s);a.push(g);}catch(d){if(o==="strict")throw d;if(o==="nearest"){let f=[...n,...a],g=kr(s,{id:c.id,data:{label:c.name,holderPosition:c.holder}},f,c.holder);if(g!==c.holder){console.warn(`Splice ${c.id} moved from holder ${c.holder} to holder ${g} due to conflict`);let l={...c,holder:g},u=sd(l,s);a.push(u);}else throw new qo(i.id,c.id,c.holder)}}}return n.push(...a),n}function om(e){let t=[],o=e.filter(r=>r.type==="splice-tray");for(let r of o){let a=e.filter(i=>i.type==="splice"&&i.parentId===r.id).map(i=>({id:i.id,name:i.data.label,holder:i.data.holderPosition||1,lossDb:i.data.lossDb,mode:i.data.mode||"single",ribbonFiberIds:i.data.ribbonFiberIds}));t.push({id:r.id,name:r.data.label,position:r.position,splices:a});}return t}function rm(e,t,o,r){return e.map(n=>n.id!==t?n:{...n,splices:n.splices.map(a=>a.id!==o?a:{...a,holder:r})})}function nm(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!pa({...a,splices:[...a.splices,o]},r).isValid)throw new qo(t,o.id,o.holder);return {...a,splices:[...a.splices,o]}})}function im(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}function am(e,t,o={}){let r=o.direction??"horizontal",n=o.spacing??220,a=o.origin??{x:0,y:0},i=e.map((c,d)=>({id:c.id,type:c.type??"fiber",position:r==="vertical"?{x:a.x,y:a.y+d*n}:{x:a.x+d*n,y:a.y},data:c.data??{label:c.id}})),s=t.map(c=>({id:c.id,source:c.source,target:c.target,type:c.type??"fiber",data:c.data}));return {nodes:i,edges:s}}function cd(e){let{width:t,height:o}=yt(e.data),r=e.position.x,n=e.position.x+t,a=e.position.y,i=e.position.y+o;return {left:r,right:n,top:a,bottom:i}}function dd(e,t){let o=cd(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function sm(e,t){let o=null,r=1/0;for(let n of t){if(!dd(e,n))continue;let a=Math.sqrt(Math.pow(e.x-n.position.x,2)+Math.pow(e.y-n.position.y,2));a<r&&(r=a,o=n);}return o}var ld=2;var ie=e=>typeof e=="string"?e.trim():"",ud=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},cm=e=>{let t=ie(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},dm=(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":o.includes("rj45")||o.includes("rj-45")?"rj45":"ethernet"},lm=e=>{if(e==="power_c13")return "C13";if(e==="power_c19")return "C19";if(e==="power_ac")return "AC"},um=e=>e.toLowerCase().replace(/_/g,"-").trim(),pm=e=>e>=1?"rackable":"zero-u",fm=e=>(e??"").toLowerCase()==="half"?"half":"full",gm=(e,t,o,r)=>{let n=r.replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();return `${e}-b${t}-${n||`p${o}`}`},pd=(e,t)=>`${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");function mm(e){let t=[],o=ie(e.manufacturer),r=ie(e.model),n=ie(e.role)||ie(e.deviceType)||ie(e.device_type)||"device",a=ud(e.uHeight)??ud(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 i=ie(e.id)||ie(e.slug)||pd(o,r)||"unknown",s=ie(e.slug)||pd(o,r)||i,c=Array.isArray(e.ports)?e.ports:[],d=Array.isArray(e.rearPorts)?e.rearPorts:Array.isArray(e.rear_ports)?e.rear_ports:[],g=(Array.isArray(e.frontRearPortLinks)?e.frontRearPortLinks:Array.isArray(e.front_rear_port_links)?e.front_rear_port_links:[]).map(l=>({frontPortId:ie(l.frontPortId)||ie(l.front_port_id),rearPortId:ie(l.rearPortId)||ie(l.rear_port_id)}));return {id:i,slug:s,manufacturer:o,model:r,role:n,uHeight:a,width:ie(e.width)||void 0,frontBlocks:c,rearBlocks:d,rawLinks:g,frontImageUrl:ie(e.frontImageUrl)||ie(e.front_image_url)||void 0,rearImageUrl:ie(e.rearImageUrl)||ie(e.rear_image_url)||void 0,frontImageAttribution:ie(e.frontImageAttribution)||void 0,rearImageAttribution:ie(e.rearImageAttribution)||void 0,tags:Array.isArray(e.tags)?e.tags.map(ie).filter(Boolean):[],sourceRepository:ie(e.sourceRepository)||ie(e.source_repository)||void 0,sourcePath:ie(e.sourcePath)||ie(e.source_path)||void 0,issues:t}}function fd(e,t,o){let r=ie(e.name)||`Block ${o+1}`,a=(Array.isArray(e.ports)?e.ports:[]).map((i,s)=>{let c=ie(i.label)||ie(i.name)||`Port ${s+1}`,d=cm(i.connectorType??i.connector_type),f=dm(ie(i.type),d),g=d??lm(f),u={id:ie(i.id)||gm(t,o,s,c),label:c,type:f,connectorType:g};if(i.position){let m=nt(i.position);m&&(u.position=m);}return u});return {name:r,ports:a}}function bm(e){let t=[],o=um(e.role),r=e.uHeight,n=pm(r),a=fm(e.width),i=e.frontBlocks.map((c,d)=>fd(c,"front",d)),s=e.rearBlocks.map((c,d)=>fd(c,"rear",d));return {role:o,mountClass:n,uHeight:r,width:a,frontFace:{portBlocks:i,imageUrl:e.frontImageUrl,imageAttribution:e.frontImageAttribution},rearFace:{portBlocks:s,imageUrl:e.rearImageUrl,imageAttribution:e.rearImageAttribution},issues:t}}function hm(e,t){let o=new Set(e.portBlocks.map(a=>a.name)),r=new Set(t.portBlocks.map(a=>a.name)),n=[...o].filter(a=>r.has(a));return n.length===0?{front:e,rear:t}:{front:{...e,portBlocks:e.portBlocks.map(a=>n.includes(a.name)?{...a,name:`Front \xB7 ${a.name}`}:a)},rear:{...t,portBlocks:t.portBlocks.map(a=>n.includes(a.name)?{...a,name:`Rear \xB7 ${a.name}`}:a)}}}function ym(e){let t=[],{front:o,rear:r}=hm(e.frontFace,e.rearFace),n=e.role;return (!n||n==="device")&&[...o.portBlocks,...r.portBlocks].some(i=>i.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 Fr(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function wm(e,t){let o=[],r=[];for(let u of t.frontFace.portBlocks)for(let m of u.ports)r.push({id:m.id,face:"front"});for(let u of t.rearFace.portBlocks)for(let m of u.ports)r.push({id:m.id,face:"rear"});let n=new Map;for(let{id:u}of r)n.set(u,(n.get(u)??0)+1);for(let[u,m]of n)m>1&&o.push({severity:"error",code:"DUPLICATE_PORT_ID",message:`Duplicate port id "${u}" found ${m} times`,path:`ports.${u}`});let a=e.frontBlocks.reduce((u,m)=>u+(Array.isArray(m.ports)?m.ports.length:0),0),i=e.rearBlocks.reduce((u,m)=>u+(Array.isArray(m.ports)?m.ports.length:0),0),s=Fr(t.frontFace),c=Fr(t.rearFace);s!==a&&o.push({severity:"error",code:"FRONT_PORT_COUNT_MISMATCH",message:`Front port count mismatch: raw=${a}, parsed=${s}`,path:"faces.front"}),c!==i&&o.push({severity:"error",code:"REAR_PORT_COUNT_MISMATCH",message:`Rear port count mismatch: raw=${i}, parsed=${c}`,path:"faces.rear"});let d=new Set(r.map(u=>u.id)),f=new Set(r.filter(u=>u.face==="front").map(u=>u.id)),g=new Set(r.filter(u=>u.face==="rear").map(u=>u.id));for(let u of e.rawLinks)u.frontPortId&&!f.has(u.frontPortId)&&!d.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&&!g.has(u.rearPortId)&&!d.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 Nm(e,t,o){let r=e.rawLinks.filter(a=>!!a.frontPortId&&!!a.rearPortId).map(a=>({frontPortId:a.frontPortId,rearPortId:a.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 xm(e){let t=mm(e),o=bm(t),r=ym(o),n=wm(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:Nm(t,o,r),report:n}:{template:null,report:n}}function km(e){return Fr(e)}function Pm(e,t,o){let r=[],n=Fr(e.faces.front),a=Fr(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!==a&&r.push({severity:"error",code:"RENDER_REAR_COUNT_MISMATCH",message:`Rendered rear handle count (${o}) does not match template (${a})`,path:"faces.rear"}),r}
|
|
2
|
+
export{Xp as COUPLERS_PER_PANEL,hn as COUPLER_SLOT_HEIGHT_PX,Yp as COUPLER_WIDTH_PX,Hi as CableNode,ji as ClosureNode,Ai as CouplerNode,Sf as DEFAULT_DIAGRAM_DIM_OPACITY,zo as DeviceNode,Ko as DevicePlacementError,sa as DiagramErrorBoundary,gi as DiagramPortProvider,Ya as FIBER_COLORS_12,rn as FiberEdge,ci as FiberNode,xg as FibreCableWithTubesExpanded,yg as FibreFlowMap,Xi as FibreSplitNode,Ho as HANDLE_EXTENSION_PX,Mi as MultiTubeCableNode,aa as NetworkDiagram,Vs as PANEL_BORDER_WIDTH,bo as PANEL_HEADER_HEIGHT,bn as PANEL_HEIGHT_PX,mo as PANEL_PADDING,js as PANEL_TUBE_TRAY_SPACING,mn as PANEL_WIDTH_PX,Xn as POWER_CONNECTORS,Ui as PatchPanelNode,li as PowerEdge,Ut as RACK_HEADER_HEIGHT,ni as RACK_WIDTH_PX,si as RackNode,Ei as SpliceNode,qo as SplicePlacementError,Si as SpliceTrayNode,ld as TEMPLATE_SCHEMA_VERSION,Fi as TubeNode,Ma as U_HEIGHT_PX,Ci as VerticalPDU,za as Width,Jg as addDeviceToRack,nm as addSpliceToTray,na as applyDeviceDisplayToNodes,oa as applyDiagramFocusToEdges,ta as applyDiagramFocusToNodes,Gd as applyDirectionalPortHandleId,Gr as applyFaceAliasHandleId,je as baseColorFor,cr as buildCouplerHandleId,la as buildDevicePortGroupsFromPorts,vo as buildFiberHandleId,Kg as buildNodesFromRackConfig,tm as buildNodesFromSpliceConfig,am as buildPathLayoutGraph,Xr as buildPortBlocksFromPorts,bt as buildPortHandleId,Hg as buildReactNetworksHandleId,Vg as buildReactNetworksPortGroupsFromPorts,Jd as buildSpliceHandleId,Qd as buildSplitIoHandleId,jn as buildTubeHandleId,Oi as calculateClosureDimensions,qp as calculateCouplerRightX,Jp as calculateCouplerSlotSpacing,ec as calculateCouplerSpacing,$o as calculateDevicePositionFromU,Bi as calculatePanelDimensions,Js as calculateSlotPositionFromY,Ip as calculateSplicePositionFromNumber,_g as calculateUPositions,Qs as calculateYFromSlotPosition,km as countTemplateFacePorts,Zi as createNetworkDiagramStore,qg as createRackConfigFromNodes,om as createSpliceConfigFromNodes,id as describePortHandle,ri as diagramDocumentToNetworkGraph,di as fiberSolidOrStriped,sm as findNearestRack,kr as findNextAvailableHolderPosition,en as findNextAvailableUPosition,rd as flattenDevicePortsFromGroups,Gg as flattenReactNetworksPortGroups,Pg as generateLayout,Ea as getConnectorConfig,Li as getCouplerDimensions,_o as getDefaultDeviceFace,Yn as getDeviceConnectorType,ho as getEndpointMetadata,co as getFiberColor,Jn as getFrontPortBlocks,Zs as getInnerContentWidth,tl as getOppositeSideHandleId,Rt as getPDUPortType,Kp as getPanelHeight,qs as getPanelWidth,Wt as getPowerPortStyle,cd as getRackBounds,Qn as getRearPortBlocks,Le as getResolvedPortBlocks,fi as getStandardPortVisualDimensions,wt as getStatusColor,Xs as getTrayDimensions,yn as getTubeDimensions,Rr as hasDiagramFocus,Ia as hasFrontPorts,Sa as hasRearPorts,Wc as inventoryCableToNetworkEdge,zc as inventoryDeviceToNetworkNode,Oc as inventoryRackToNetworkNode,kg as inventoryToDiagramDocument,Uc as inventoryToNetworkDiagram,hc as isDeviceDiagramNode,bi as isDiagramPortHandleHighlighted,mc as isEdgeInDiagramFocus,ol as isHighPowerConnector,gc as isNodeInDiagramFocus,dd as isPointInRack,Te as isPowerPortType,so as isStriped,no as isUPositionAvailable,nd as listPossiblePortHandleIds,sr as looksLikePowerHandleId,ed as netboxCableToNetworkEdge,Qc as netboxDeviceToNetworkNode,Jc as netboxRackToNetworkNode,Fg as netboxToDiagramDocument,td as netboxToNetworkDiagram,to as networkGraphToDiagramDocument,Fn as normalizeDevicePorts,lt as normalizeDirectionalHandleId,Re as normalizeHandleId,nt as normalizePortPositionInput,Wg as normalizeReactNetworksPorts,zt as parseHandleId,xm as parseNetboxTemplate,dr as parseSemanticPortPosition,Qg as removeDeviceFromRack,im as removeSpliceFromTray,vf as replaceEdge,Xg as resolveDevicePortBlocksFromFlatPorts,_n as resolveDevicePortFace,Hn as resolveDevicePortGroup,Er as resolveEndpointCompatibilityKeys,Mn as resolveNodeDevicePorts,an as resolvePortVisualKind,Ug as resolveReactNetworksNodePorts,Og as resolveReactNetworksPortFace,zg as resolveReactNetworksPortGroup,el as sanitizeHandleIdForMatching,Zp as snapToCouplerPosition,Ti as snapToSplicePosition,Qr as snapToUPosition,Xa as updateDeviceUPosition,Zg as updateDeviceUPositionInSchema,rm as updateSpliceHolderPosition,ea as useDiagramEdges,Qi as useDiagramNodes,mi as useDiagramPortInteraction,Rf as useNetworkDiagram,Jl as validateAndSnapDevice,jg as validatePortHandleOnNodeData,ua as validateRackDevicePlacements,Pm as validateRenderFidelity,pa as validateSplicePlacements};//# sourceMappingURL=index.mjs.map
|
|
3
3
|
//# sourceMappingURL=index.mjs.map
|