@mp70/react-networks 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.mjs CHANGED
@@ -1,3 +1,3 @@
1
- import xe,{useState,useMemo,useRef,useEffect,Component,useCallback,useSyncExternalStore}from'react';import {useStoreApi,getBezierPath,BaseEdge,EdgeLabelRenderer,getSmoothStepPath,SmoothStepEdge,useUpdateNodeInternals,Position,Handle,useEdges,useReactFlow,addEdge,ReactFlowProvider,ConnectionMode,useNodesState,useEdgesState,applyNodeChanges,useOnSelectionChange,applyEdgeChanges,ReactFlow,Background,Controls,MiniMap,Panel}from'reactflow';import {toPng}from'html-to-image';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var $d=/-(source|target)$/i,Ld=/--rear$/i;function Ct(e){return e?e.replace($d,""):""}function Ge(e){return Ct(e).replace(Ld,"")}function $e(e){return typeof e=="string"&&e.toLowerCase().includes("power")}function Nt(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:$e(t.type)?t.label:`${e}-${t.label}`}function Xr(e){let t=Ct(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}var Jn={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 jt(e){let t=Jn[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 Fa(e){let t=Jn[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function Bd(e){return Fa(e).amperage===16}function $t(e){return e%10<8?"C13":"C19"}function Qn(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var Od=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Lo=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}},Wd=e=>e.trim().toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>0),ei=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"},Ha=e=>e.includes("center")||e.includes("centre")||e.includes("middle")||e.includes("mid"),zd=(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=Ha(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},Gd=e=>{if(e.includes("front")||e.includes("rear")||e.includes("back"))return;let o=e.map(ei).find(n=>n!==void 0);if(!o)return;let r=zd(o,e);if(r!==void 0)return {side:o,offsetPercent:r}},Ud=e=>{if(e.length===0)return;let t=e.includes("left"),o=e.includes("right"),r=Ha(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}},fr=e=>{let t=Wd(e);if(t.length!==0){if(t.length===1){let o=ei(t[0]);return o?{side:o}:void 0}return Gd(t)??Ud(t)}},lt=e=>{if(typeof e=="string")return fr(e);if(!Od(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"?fr(t):void 0,n=(typeof t=="string"?ei(t.trim().toLowerCase()):void 0)??o?.side,a=Lo(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct)??o?.offsetPercent,i=Lo(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels)??o?.offsetPx,s=Lo(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x)??o?.xPercent,c=Lo(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y)??o?.yPercent,l=Lo(e.widthPercent??e.width_percent??e.widthPct??e.width_pct??e.wPercent??e.w_percent),g=Lo(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&&l===void 0&&g===void 0))return {side:n,offsetPercent:a,offsetPx:i,xPercent:s,yPercent:c,widthPercent:l,heightPercent:g}};var Vd="Network Ports",jd="Rear Network Ports",Xd="Power Ports",_a=8,Yd=92;function Bo(e){return Math.max(0,Math.min(100,e))}function oi(e){if(e==="top"||e==="right"||e==="bottom"||e==="left")return e}function Oo(e){return lt(e)}function Ma(e){let t=Oo(e.position);return typeof t?.xPercent=="number"&&typeof t?.yPercent=="number"}function Kd(e){let t=Oo(e.position);return typeof t?.offsetPercent=="number"||typeof t?.offsetPx=="number"}function qd(e){return e.face==="rear"||e.face==="back"?"rear":e.face==="front"?"front":$e(e.type)?"rear":"front"}function Zd(e,t){return typeof e.group=="string"&&e.group.trim().length>0?e.group.trim():$e(e.type)?Xd:t==="rear"?jd:Vd}function Kr(e){return typeof e.port.order=="number"&&Number.isFinite(e.port.order)?e.port.order:e.index}function Jd(e,t){return t<=1?50:_a+e*(Yd-_a)/(t-1)}function Qd(e){let t=e.filter(n=>!!oi(Oo(n.port.position)?.side)&&!Ma(n.port)&&!Kd(n.port)),o=new Map,r=new Map;return t.forEach(n=>{let a=oi(Oo(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,Jd(s,a.length));});}),o}function el(e,t){let o=Oo(e.position),r=oi(o?.side);if(Ma(e)){let s={xPercent:Bo(o?.xPercent),yPercent:Bo(o?.yPercent)};return typeof o?.widthPercent=="number"&&Number.isFinite(o.widthPercent)&&(s.widthPercent=Bo(o.widthPercent)),typeof o?.heightPercent=="number"&&Number.isFinite(o.heightPercent)&&(s.heightPercent=Bo(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)?Bo(o.offsetPercent):void 0)??(typeof t=="number"?Bo(t):void 0);return typeof i=="number"&&(n.offsetPercent=i),n}function tl(e,t){let o=el(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=Oo(o.position);return {...o,...r?{position:r}:{position:void 0}}})}))}function ti(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 ol(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=qd(n),s=Zd(n,i),c=`${i}:${s}`,l=t.get(c);if(l){l.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,l)=>{let g=Kr(c)-Kr(l);return g!==0?g:c.index-l.index}),i=Qd(a),s={name:n.groupName,ports:a.map(c=>tl(c,i.get(c.index)))};if(n.face==="rear"){r.push(s);return}o.push(s);}),{ports:o,rearPorts:r}}function Ue(e){return ti(e?.ports)?{ports:Yr(e.ports),rearPorts:Yr(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:ti(e?.rearPorts)?e.rearPorts:[])}:ol(e?.ports)?qr(e.ports):{ports:Yr(Array.isArray(e?.portGroups)?e.portGroups:[]),rearPorts:Yr(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:ti(e?.rearPorts)?e.rearPorts:[])}}function ri(e){return Ue(e).ports}function ni(e){return Ue(e).rearPorts}function gr(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function Aa(e){return gr(Ue(e).ports)>0}function $a(e){return gr(Ue(e).rearPorts)>0}function Wo(e){let t=Aa(e);return $a(e)&&!t?"rear":"front"}var rl=new Set(["patch-panel","closure","splice-tray"]),ii=["frontImageUrl","rearImageUrl","frontImageAttribution","rearImageAttribution","imageFit","imagePosition","imageRepeat","stretchToFit"],ai=["panelWidth","panelHeight","closureWidth","closureHeight","headerHeight"],si=["status","width","widthPx","height","header","color","colorMode","showUMarkers","customHeaderText","powerSide","rotation","rackWidthPx","rackFaceGapPx"],nl=["face","handleSideMap"],il=new Set(["label","ports","portGroups","rearPortGroups","pduPortGroups","connections","netboxId","netboxType","inventoryId","inventoryType","uPosition","mountMode","rackLayout","slotPosition","holderPosition",...ii,...ai,...si,...nl]);function Ba(e){return {x:typeof e?.x=="number"?e.x:0,y:typeof e?.y=="number"?e.y:0}}function br(e){if(e)return {...e}}function mr(e){return {...e,ports:e.ports.map(t=>({...t,compatibility:Array.isArray(t.compatibility)?[...t.compatibility]:void 0,position:br(t.position)}))}}function al(e){if(typeof e.parentId=="string")return e.parentId;let t=e.parentNode;return typeof t=="string"?t:void 0}function sl(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 rl.has(t)?t:"patch-panel"}return e.kind==="splitter"?"fibre-split":e.kind}function dl(e){let t={position:Ba(e.position)},o=al(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 ll(e){let t=e.data??{},o={};si.forEach(a=>{let i=t[a];i!==void 0&&(o[a]=i);});let r=ii.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=ai.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 ul(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 pl(e){let t=e.data??{},o={};return Object.entries(t).forEach(([r,n])=>{il.has(r)||(r==="rackWidthPx"||r==="rackFaceGapPx")&&e.type!=="rack"||(o[r]=n);}),Object.keys(o).length>0?o:void 0}function fl(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 gl(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 ml(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups.map(mr);let{ports:o,rearPorts:r}=Ue(t);if(r.length>0)return r.map(mr);if(o.length>0)return o.map(mr);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=$t(i);return {id:`${i+1}`,label:`${i+1}`,connected:false,type:s==="C19"?"power_c19":"power_c13",connectorType:s}})}]}function bl(e){return (e.type==="vertical-pdu"?[{face:"rear",blocks:ml(e)}]:(()=>{let{ports:o,rearPorts:r}=Ue(e.data);return [{face:"front",blocks:o.map(mr)},{face:"rear",blocks:r.map(mr)}]})()).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:$e(a.type)?"power":"network",medium:gl(a.type),type:a.type,cableType:a.cableType,connector:a.connectorType,compatibility:Array.isArray(a.compatibility)?[...a.compatibility]:void 0,layout:br(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 yl(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)?bl(e):hl(e);return t.length>0?t:void 0}function wl(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 Nl(e,t){return e?{...e,...t,placement:t.placement,render:t.render,config:t.config,externalRefs:t.externalRefs,metadata:t.metadata??e.metadata,endpoints:wl(e.endpoints,t.endpoints)}:t}function io(e,t){let o=new Map((t?.nodes??[]).map(i=>[i.id,i])),r=e.nodes.map(i=>Nl(o.get(i.id),{id:i.id,...sl(i),label:i.data?.label??i.id,placement:dl(i),render:ll(i),config:pl(i),externalRefs:ul(i),metadata:o.get(i.id)?.metadata,endpoints:yl(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?Ge(i.sourceHandle):void 0},target:{nodeId:i.target,endpointId:i.targetHandle?Ge(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:fl(e.nodes,t?.ui),metadata:t?.metadata}}function xl(e){let t=new Map,o=r=>{if(!r.endpointId)return;let n=`${r.nodeId}:${Ge(r.endpointId)}`;t.set(n,(t.get(n)??0)+1);};return e.forEach(r=>{o(r.source),o(r.target);}),t}function Oa(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 kl(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}:${Ge(r.id)}`)??0)>0,type:Oa(r),cableType:r.cableType,connectorType:r.connector,compatibility:r.compatibility&&r.compatibility.length>0?[...r.compatibility]:void 0,position:br(r.layout)}))}function Pl(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}:${Ge(n.id)}`)??0)>0,type:Oa(n),cableType:n.cableType,connectorType:n.connector,compatibility:n.compatibility&&n.compatibility.length>0?[...n.compatibility]:void 0,position:br(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:br(i.position)}))}))}function Dl(e,t,o){if(!t&&!o)return e;let r={...e};t&&(si.forEach(a=>{let i=t[a];i!==void 0&&(r[a]=i);}),t.images&&ii.forEach(a=>{let i=t.images?.[a];i!==void 0&&(r[a]=i);}),t.dimensions&&ai.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 Tl(e,t){if(!t||t.length===0)return e;let o={...e};return t.forEach(r=>{r.source==="netbox"&&(o.netboxId=r.id,r.type&&(o.netboxType=r.type)),r.source==="inventory"&&(o.inventoryId=r.id,r.type&&(o.inventoryType=r.type));}),o}function La(e,t,o){if(!t)return;let r=Ge(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}-${o}`:r}function ci(e){let t=xl(e.edges),o=e.ui?.nodeState??{},r=e.nodes.map(i=>{let s=cl(i),c={label:i.label,...i.config??{}};if(c=Dl(c,i.render,o[i.id]),c=Tl(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=kl(i.endpoints,t,i.id));else if(s==="vertical-pdu"){let l=(i.endpoints??[]).filter(g=>g.face!=="front");l.length>0&&(c.pduPortGroups=Pl(l,t,i.id),c.powerPorts=l.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:Ba(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:La(n.get(i.source.nodeId),i.source.endpointId,"source")}:{},...i.target.endpointId?{targetHandle:La(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 Wa=20,Xt=60,di=300;var zo=5;function za(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function Ga(e,t){let r=za(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function Ua(e){return za(e)==="light"?"#e5e5e5":"#2a2a2a"}function Va(e,t){return {width:"100%",height:"100%",...t}}var ja=["device","server","switch","router"],Cl=[...ja,"vertical-pdu"],Rl=new Set(ja),El=new Set(Cl);function ao(e){return typeof e=="string"&&Rl.has(e)}function vl(e){return typeof e=="string"&&El.has(e)}function so(e){return !!e&&ao(e.type)}function Go(e){return !!e&&vl(e.type)}var Xa=(o=>(o.FULL="full",o.HALF="half",o))(Xa||{});function Ya(e){return typeof e=="string"&&e.trim().length>0}function li(e){let{ports:t,rearPorts:o}=Ue(e),r=gr(t)>0||Ya(e.frontImageUrl),n=gr(o)>0||Ya(e.rearImageUrl);if(r&&n)return "both";if(r)return "front";if(n)return "rear"}function Il(e){if(e.face==="front"||e.face==="rear")return e.face}function Ka(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let a=li(e);if(a)return a;let i=Il(e);if(i)return i;let s=o+r/2;return t>=s?"front":"rear"}var Sl=24,Fl=4;function Hl(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function _e(e){return Hl(e)==="split-face"}function Lt(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:Sl}function Rt(e){return e?.rackWidthPx||300}function Yt(e){return Rt(e)*1.75/19}function Zr(e){let t=Rt(e);return _e(e)?t*2+Lt(e):t}function Et(e){let t=e?.uHeight??42,o=Yt(e);return {width:Zr(e),height:60+t*o}}function ui(e){return e.map(t=>{if(t.type!=="rack")return t;let o=Et(t.data);return t.width===o.width&&t.height===o.height?t:{...t,width:o.width,height:o.height}})}function ot(e){if(e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both")return e.mountMode;let t=li(e??{});return t||"both"}function Uo(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Jr(e,t){let o=new Set(Uo(e));return Uo(t).some(n=>o.has(n))}function Qr(e,t){return _e(e)&&ot(t)==="front"?Rt(e)+Lt(e):0}function qa(e,t){return t.isRackMounted!==true||t.splitFaceLayout?e:t.deviceWidth==="half"?Math.floor(e/2):e+Fl}function Za(e,t){return _e(e)&&ot(t)==="both"?Zr(e):Rt(e)}var Ja=e=>{if(typeof e.parentId=="string")return e.parentId;if(typeof e.parentNode=="string")return e.parentNode},Bt=(e,t)=>typeof e=="number"&&Number.isFinite(e)&&e>0?Math.floor(e):t,_l=()=>"bottom-up",lo=e=>e.data.uNumberingDirection||_l(),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=Ja(e);if(!n||n!==t.id)return o;let a=Bt(e.data.uHeight,1),i=Bt(t.data.uHeight,42),s=lo(t),c=Yt(t.data),l=60,g=o.y-l,f=Math.round(g/c)+1,u;s==="bottom-up"?u=en(f,i,s)-a+1:u=en(f,i,s);let p=i-a+1,h=Math.max(1,Math.min(p,u));if(s==="top-down"&&u<=1&&(h=1),!co(t,e,h,r)){let y=rn(t,e,r,h);if(y!==void 0)h=y;else {let N=Bt(e.data.uPosition,0);if(N>0&&co(t,e,N,r))h=N;else return {x:Qr(t.data,e.data),y:e.position?.y??o.y,uPosition:N>0?N:void 0}}}let x;if(s==="bottom-up"){let y=h+a-1,N=tn(y,i,s);x=l+(N-1)*c-1;}else {let y=tn(h,i,s);x=l+(y-1)*c-1;}return {x:Qr(t.data,e.data),y:x,uPosition:h}},co=(e,t,o,r)=>{let n=Bt(t.data.uHeight,1),a=Bt(e.data.uHeight,42);if(o<1||o+n-1>a)return false;let i=r.filter(l=>ao(l.type)&&Ja(l)===e.id&&l.id!==t.id),s=_e(e.data),c=ot(t.data);for(let l of i){let g=Bt(l.data.uPosition,1),f=Bt(l.data.uHeight,1),u=o,p=o+n-1,h=g,x=g+f-1;if(u<=x&&p>=h){if(s){let y=ot(l.data);if(!Jr(c,y))continue}return false}}return true},rn=(e,t,o,r=1)=>{let n=Bt(t.data.uHeight,1),i=Bt(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 l=c;l<=i;l++)if(co(e,t,l,o))return l;for(let l=1;l<c;l++)if(co(e,t,l,o))return l},Vo=(e,t,o=1,r)=>{let n=60,a=lo(e),i=e.data.uHeight||42,s=Yt(e.data),c=tn(t,i,a),l;if(a==="bottom-up"){let g=t+o-1,f=tn(g,i,a);l=n+(f-1)*s-1;}else l=n+(c-1)*s-1;return {x:Qr(e.data,r),y:l}},Qa=(e,t,o)=>{let r=e.data.uHeight||1,n=Vo(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}}},Ml=(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?Qa(e,t,a):e};function vt(e){switch(e){case "active":return "#10b981";case "inactive":return "#ef4444";case "maintenance":return "#f59e0b";default:return "#6b7280"}}var Bl=({data:e,selected:t,id:o,onFaceChange:r,onRackFaceChange:n,isDragOver:a=false})=>{let{label:i,ports:s=0,status:c="active",uHeight:l=42,face:g="front",customHeaderText:f}=e,u=_e(e),p=Yt(e),h=Zr(e),x=Et(e),y=Rt(e),N=Lt(e),D={width:`${y}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"},C=useStoreApi(),[P,k]=useState(e.showUMarkers!==void 0?e.showUMarkers:true),E=()=>{let L=lo({data:e})==="bottom-up"?"top-down":"bottom-up",{getNodes:z,setNodes:U}=C.getState();U(z().map(j=>j.id===o?{...j,data:{...j.data,uNumberingDirection:L}}:j));},_=()=>{if(u)return;let F=g==="front"?"rear":"front";if(n)n(o,F);else if(r)C.getState().getNodes().filter(z=>z.parentId===o).forEach(z=>{r(z.id,F);});else {let{getNodes:L,setNodes:z}=C.getState();z(L().map(U=>U.id===o?{...U,data:{...U.data,face:F}}:U.parentId===o?{...U,data:{...U.data,face:F}}:U));}},A=()=>{let F=[],L=60,z=lo({data:e});for(let U=1;U<=l;U++){let j=L+(U-1)*p-4,re=en(U,l,z);F.push(jsx("div",{style:{position:"absolute",left:"-35px",top:`${j}px`,background:"#374151",color:"#9ca3af",padding:"2px 4px",borderRadius:"2px",fontSize:"8px",fontWeight:"bold",width:"28px",textAlign:"center",border:"1px solid #4b5563",zIndex:10,height:`${p}px`,display:"flex",alignItems:"center",justifyContent:"center",lineHeight:1},children:re},U));}return F};return jsxs("div",{"data-testid":"rack-node",className:`rack-node ${t?"selected":""} ${a?"drag-over":""}`,style:{background:"transparent",border:`2px solid ${vt(c)}`,borderRadius:"8px",padding:0,width:`${h}px`,height:`${x.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:[f?jsx("span",{style:{color:"#fbbf24",fontWeight:"bold"},children:f}):jsxs("span",{children:[typeof s=="number"?s:0," ports"]})," \u2022 ",l,"U \u2022 ",u?"rear|front":g]}),jsxs("div",{style:{display:"flex",gap:"4px",position:"absolute",top:"4px",right:"4px"},children:[jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),k(!P);},style:{background:P?"#10b981":"#374151",color:P?"#ffffff":"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`${P?"Hide":"Show"} U markers`,children:"U"}),jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),E();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch U numbering to ${lo({data:e})==="bottom-up"?"top-down":"bottom-up"}`,children:lo({data:e})==="bottom-up"?"\u2191\u2193":"\u2193\u2191"}),!u&&jsx("button",{onPointerDown:F=>{F.stopPropagation();},onMouseDown:F=>{F.stopPropagation();},onClick:F=>{F.stopPropagation(),F.preventDefault(),_();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch to ${g==="front"?"rear":"front"} face`,children:g==="front"?"\u21C4 Rear":"\u21C4 Front"})]})]}),jsx("div",{style:{flex:1,background:"transparent",position:"relative",minHeight:`${l*p}px`,overflow:"hidden"},children:u&&jsxs("div",{style:{position:"absolute",inset:0,pointerEvents:"none",display:"flex",alignItems:"stretch"},children:[jsx("div",{"data-testid":"rack-face-rear",style:{...D,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:`${N}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:{...D,background:"linear-gradient(180deg, rgba(17,24,39,0.32) 0%, rgba(17,24,39,0.18) 100%)"},children:"Front"})]})}),P&&jsx("div",{style:{position:"absolute",top:0,left:0,right:0,bottom:0,pointerEvents:"none"},children:A()})]})},pi=xe.memo(Bl,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.data===t.data&&e.isDragOver===t.isDragOver);var fi=({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 ${vt(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:vt(r),borderRadius:"50%"}})]})};var es=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function Ke(e){let t=(e-1)%12;return es[t]}function po(e){return e>12}function Ot(e,t){let o=t?.base??Ke(e),r=t?.striped??po(e),n=r?`repeating-linear-gradient(45deg, ${o} 0 6px, #000 6px 9px)`:void 0;return {base:o,striped:r,backgroundImage:n}}function gi(e){let t=Ot(e);return t.backgroundImage?{background:t.base,backgroundImage:t.backgroundImage}:{background:t.base}}function fo(e){return Ke(e)}function Wt(e){return e.map(t=>({base:Ke(t),striped:po(t)}))}function Gl(e,t,o,r,n,a,i,s){let c=Wt(o),l=c.length,g=r?1.2:1,f=!!s?.highlight,u=r?2:1.5,p=s?.highlightWidth??u*3,h=s?.highlightColor??c[0]?.base??"#22d3ee";return jsxs(Fragment,{children:[f&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:h,strokeWidth:p,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${u}px`,"--rn-edge-highlight-to":`${p}px`}}),c.map((x,y)=>{let D=(l-y)*g;return jsx("path",{d:t,stroke:x.base,strokeWidth:D,fill:"none",strokeLinecap:"butt",opacity:x.striped?.9:1,style:n},`${e}-ribbon-${y}`)}),c.some(x=>x.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:t,style:{...n,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:r&&s&&(s.bandwidth||s.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${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 Ul=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:l={},className:g})=>{let[f,u,p]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),{bandwidth:h,length:x,color:y="#00FFFF",striped:N=false,ribbonFiberIds:D,isRibbon:C,highlight:P,highlightColor:k,highlightWidth:E}=s||{},_=!!P;if((C||D&&D.length>=6&&D.length<=12)&&D)return Gl(e,f,D,c??false,l??{},u,p,s);let F=c?3:2,L=E??F*3,z={...l,stroke:y,strokeWidth:F,strokeDasharray:"none"};return jsxs(Fragment,{children:[_&&jsx(BaseEdge,{id:`${e}-highlight`,path:f,style:{...l,stroke:k??y,strokeWidth:L,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${F}px`,"--rn-edge-highlight-to":`${L}px`}}),jsx(BaseEdge,{id:e,path:f,style:z}),N&&jsx(BaseEdge,{id:`${e}-stripe`,path:f,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}}),jsx(EdgeLabelRenderer,{children:c&&s&&(h||x)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${u}px,${p}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${y}`,pointerEvents:"none",zIndex:9999},children:[h&&jsx("div",{children:h}),x&&jsxs("div",{children:[x,"m"]})]})})]})},sn=xe.memo(Ul);var Xl=.7,ns=.28,Xo=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,Yl=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,style:s={},data:c,markerEnd:l})=>{let[g]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),f=c?.connectorType||"C13",u=c?.metadata??{},p=Xo(c?.powerStrokeWidth)??Xo(u.strokeWidth),h=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof u.strokeDasharray=="string"?u.strokeDasharray:void 0,x=Xo(s.opacity)??Xo(c?.opacity)??Xo(c?.powerOpacity)??Xo(u.opacity),y=E=>{let A=p??(f==="C19"?5:3),F=h??(f==="C19"?"none":"6,3");return {stroke:c?.color||"#f59e0b",strokeWidth:A,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:F,...E!==void 0?{opacity:E}:{},...s}},N=!!c?.highlight,D=c?.highlightColor??c?.color??"#f59e0b",C=y(N?x!==void 0?Math.min(x,ns):ns:x),P=typeof C.strokeWidth=="number"?C.strokeWidth:3,k=c?.highlightWidth??P*2.5;return jsxs(Fragment,{children:[N?jsx(BaseEdge,{id:`${e}-highlight`,path:g,markerEnd:l,style:{...C,stroke:D,strokeWidth:k,opacity:Xl,strokeDasharray:"14 10","--rn-edge-highlight-from":`${P}px`,"--rn-edge-highlight-to":`${k}px`}}):null,jsx(BaseEdge,{id:e,path:g,markerEnd:l,style:C})]})},mi=xe.memo(Yl);function eu(e,t,o,r,n,a,i,s,c,l,g){let f=Wt(s),u=f.length,p=c?1.8:1.5,h=!!g?.highlight,x=c?3:2.5,y=g?.highlightWidth??x*3,N=g?.highlightColor??f[0]?.base??"#22d3ee",[D,C,P]=getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i});return jsxs(Fragment,{children:[h&&jsx(BaseEdge,{id:`${e}-highlight`,path:D,style:{...l,stroke:N,strokeWidth:y,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${x}px`,"--rn-edge-highlight-to":`${y}px`}}),f.map((k,E)=>{let A=(u-E)*p;return jsx("path",{d:D,stroke:k.base,strokeWidth:A,fill:"none",strokeLinecap:"butt",opacity:k.striped?.9:1,style:l},`${e}-ribbon-${E}`)}),f.some(k=>k.striped)&&jsx(BaseEdge,{id:`${e}-ribbon-stripe`,path:D,style:{...l,stroke:"#000",strokeWidth:1,strokeDasharray:"3 3",opacity:.4}}),jsx(EdgeLabelRenderer,{children:c&&g&&(g.bandwidth||g.length)&&jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${C}px,${P}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${f[0]?.base||"#00FFFF"}`,pointerEvents:"none",zIndex:9999},children:[g.bandwidth&&jsx("div",{children:g.bandwidth}),g.length&&jsxs("div",{children:[g.length,"m"]}),jsxs("div",{style:{fontSize:"8px",opacity:.8},children:[s.length,"F"]})]})})]})}var tu=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:l={},...g})=>{let{color:f="#00FFFF",ribbonFiberIds:u,isRibbon:p,highlight:h,highlightColor:x,highlightWidth:y}=s||{},N=!!h;if((p||u&&u.length>=6&&u.length<=12)&&u)return eu(e,t,o,r,n,a,i,u,c??false,l??{},s);let C=c?4:3,P=y??C*3,k={...l,stroke:f,strokeWidth:C};return jsxs(Fragment,{children:[N&&jsx(BaseEdge,{id:`${e}-highlight`,path:getSmoothStepPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i})[0],style:{...l,stroke:x??f,strokeWidth:P,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${C}px`,"--rn-edge-highlight-to":`${P}px`}}),jsx(SmoothStepEdge,{...g,id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:k})]})},ss=xe.memo(tu);function ru({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 nu(e,t,o,r,n,a){let i=Wt(o),s=i.length,c=r?1.2:1,l=!!a?.highlight,g=r?2:1.5,f=a?.highlightWidth??g*3,u=a?.highlightColor??i[0]?.base??"#22d3ee",p=t.match(/M\s+([\d.]+),([\d.]+).*L\s+([\d.]+),([\d.]+)/),h=p?(parseFloat(p[1])+parseFloat(p[3]))/2:0,x=p?(parseFloat(p[2])+parseFloat(p[4]))/2:0;return jsxs(Fragment,{children:[l&&jsx(BaseEdge,{id:`${e}-highlight`,path:t,style:{...n,stroke:u,strokeWidth:f,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${g}px`,"--rn-edge-highlight-to":`${f}px`}}),i.map((y,N)=>{let C=(s-N)*c;return jsx("path",{d:t,stroke:y.base,strokeWidth:C,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:n},`${e}-ribbon-${N}`)}),i.some(y=>y.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(${h}px,${x}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 ls=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s,selected:c,style:l={},...g})=>{let{color:f="#00FFFF",striped:u=false,ribbonFiberIds:p,isRibbon:h,highlight:x,highlightColor:y,highlightWidth:N}=s||{},D=!!x,C=ru({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i});if((h||p&&p.length>=6&&p.length<=12)&&p)return nu(e,C,p,c??false,l??{},s);let k=c?3:2,E=N??k*3,_={...l,stroke:f,strokeWidth:k,strokeDasharray:"none"};return jsxs(Fragment,{children:[D&&jsx(BaseEdge,{id:`${e}-highlight`,path:C,style:{...l,stroke:y??f,strokeWidth:E,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${k}px`,"--rn-edge-highlight-to":`${E}px`}}),jsx(BaseEdge,{id:e,path:C,style:_}),u&&jsx(BaseEdge,{id:`${e}-stripe`,path:C,style:{...l,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var fs=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,style:s={},data:c,markerEnd:l,selected:g})=>{let{color:f="#6366f1",label:u,highlight:p,highlightColor:h,highlightWidth:x}=c||{},y=!!p,N=8,D=x??N*1.8,[C,P,k]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),E={...s,stroke:f,strokeWidth:N,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxs(Fragment,{children:[y&&jsx(BaseEdge,{id:`${e}-highlight`,path:C,style:{...s,stroke:h??f,strokeWidth:D,opacity:.85,strokeDasharray:"18 12",filter:`drop-shadow(0 0 8px ${h??f}) drop-shadow(0 0 16px ${h??f})`,"--rn-edge-highlight-from":`${N}px`,"--rn-edge-highlight-to":`${D}px`}}),jsx(BaseEdge,{id:e,path:C,markerEnd:l,style:E}),u&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${P}px,${k}px)`,background:"#1f2937",padding:"4px 8px",borderRadius:"4px",fontSize:"10px",color:"white",fontFamily:"monospace",border:`1px solid ${f}`,pointerEvents:"none",zIndex:9999},children:u})})]})};function du(e,t,o){return Math.max(t,Math.min(o,e))}function gs(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 lu(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 ms(e,t,o){return o.mode==="px"?o.value:(e-t)*o.value}function bs(e,t){return t===true||e==="fill"?"100% 100%":e==="none"?"auto":e==="contain-height"?"auto 100%":e==="scale-down"?"contain":e??"cover"}function hi(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 l=t/o.height;a=o.width*l,i=o.height*l;}else if(r==="cover"||r==="contain"){let l=r==="cover"?Math.max(e/o.width,t/o.height):Math.min(e/o.width,t/o.height);a=o.width*l,i=o.height*l;}let[s,c]=lu(n);return {width:a,height:i,offsetX:ms(e,a,gs(s)),offsetY:ms(t,i,gs(c))}}var uu={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 pu(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=pu(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 yi(e){let t=typeof e=="string"?e:dn(e);if(t!=="generic")return uu[t]}var fu={portClickEnabled:false},ys=xe.createContext(fu),wi=ys.Provider;function Ni(){return xe.useContext(ys)}function xi(e,t,o){return e?.length?e.some(r=>r.nodeId===t&&r.handleId===o):false}var mu="#6b7280",bu="#374151",ki="#10b981",hu="100% 100%",ln=1,yu={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+\-.]*:/,Nu=/^data:image\//i,xu=typeof window<"u"?xe.useLayoutEffect:xe.useEffect,Ns=new Map;function ku(e){return (e??"").toLowerCase().replace(/_/g,"-")}function Pu(e){return !wu.test(e)&&!e.startsWith("//")}function xs(e){if(!e)return;let t=e.trim();if(t){if(Pu(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:"&&Nu.test(t)?t:void 0}catch{return}}}function Du(e){return `url(${JSON.stringify(e)})`}function Tu(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 Yo(e){return $e(e.type)}function Di(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":Qn(t)}function ks(e,t){return Nt(e,t)}function Cu(e,t,o,r,n){let a=t.length>0||!!r,i=o.length>0||!!n;return e||(a?"front":i?"rear":"front")}function Ru(e){let t=Ns.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 Ns.set(e,o),o}function Ps(e){let[t,o]=xe.useState(void 0);return xe.useEffect(()=>{let r=false;return e?(Ru(e).then(n=>{r||o(n);}),()=>{r=true;}):(o(void 0),()=>{r=true;})},[e]),t}function Eu(e){return Yo(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?ki:e.cableType?yu[e.cableType]??ki:ki}function vu(e){return e.connected?Eu(e):mu}function Ds(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 Iu(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 Pi(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 Es(e){return e.type==="console"||e.type==="usb"}function vs(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(4,Math.min(5,Math.round(t*.6)))}}function Is(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(3,Math.min(4,Math.round(t*.5)))}}function Ss(e,t){return dn({type:e.type,label:e.label,id:String(e.id??""),group:t,sourceTypeLabel:e.sourceTypeLabel,connectorType:e.connectorType})}function bo(e){return Math.max(0,Math.min(100,e))}function rt(e,t,o){return Math.max(t,Math.min(o,e))}function Ts(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*bo(e.position.widthPercent)/100,i=r.height*bo(e.position.heightPercent)/100;return {width:rt(a,2,r.width),height:rt(i,1.5,r.height)}}let n=yi({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"?Is(o):Es(e)?vs(o):o}function Su(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 Fu(e,t,o,r){if(!(!r||!xr(e))&&Ss(e,t)==="sfp")return Su(o)}function xr(e){return typeof e.position?.xPercent=="number"&&typeof e.position?.yPercent=="number"}function Hu(e,t,o,r){if(!xr(e))return;let n=bo(e.position?.xPercent),a=bo(e.position?.yPercent),i=r?.width??t,s=r?.height??o,c=r?.offsetX??0,l=r?.offsetY??0;return {x:c+i*n/100,y:l+s*a/100}}function Cs(e,t,o,r){let n=Pi(t),a=e.flatMap(y=>y.ports.filter(N=>!Yo(N)).map(N=>Hu(N,t,o,r)).filter(N=>N!==void 0));if(a.length<2)return n;let i=Number.POSITIVE_INFINITY,s=Number.POSITIVE_INFINITY,c=Math.max(n.height*.75,3),l=Math.max(n.width*.75,3);for(let y=0;y<a.length;y+=1){let N=a[y];for(let D=y+1;D<a.length;D+=1){let C=a[D],P=Math.abs(N.x-C.x),k=Math.abs(N.y-C.y);k<=c&&P>0&&(i=Math.min(i,P)),P<=l&&k>0&&(s=Math.min(s,k));}}let g=r?rt(n.width*.65,2.5,4.5):2,f=r?rt(n.height*.95,5,7.5):2,u=r?n.width*.9:n.width,p=Number.isFinite(i)?rt(i-g,r?2.5:3,u):u,h=r?Math.min(n.height*.48,p*.88):n.height,x=Number.isFinite(s)?rt(s-f,r?1.5:3,h):h;return {width:p,height:x}}function _u(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 Mu(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 Au(e,t,o,r,n,a,i,s){if(!e.position)return;if(typeof e.position.xPercent=="number"&&typeof e.position.yPercent=="number"){let y=bo(e.position.xPercent),N=bo(e.position.yPercent),D=e.position.side??Mu(y,N),C=a?.width??r,P=a?.height??n,k=a?.offsetX??0,E=a?.offsetY??0,_=t/2+ln,A=Math.max(_,r-t/2),F=o/2+ln,L=Math.max(F,n-o/2),z=k+C*y/100,U=E+P*N/100,j=a?z:rt(z,_,A),re=a?U:rt(U,F,L);return {position:_u(D),style:{left:`${j-t/2-ln}px`,top:`${re-o/2-ln}px`,right:"initial",bottom:"initial",transform:"none"}}}if(!e.position.side)return;let l=e.position.side,g=typeof e.position.offsetPercent=="number"?bo(e.position.offsetPercent):void 0,f=typeof e.position.offsetPx=="number"?e.position.offsetPx:void 0,u=t/2,p=Math.max(u,r-t/2),h=o/2,x=Math.max(h,n-o/2);switch(l){case "top":{let y=f!==void 0?f:r*(g??50)/100,N=rt(y,u,p);return {position:Position.Top,style:{top:"0px",left:`${N}px`,right:void 0,bottom:void 0,transform:"translate(-50%, 50%)"}}}case "bottom":{let y=f!==void 0?f:r*(g??50)/100,N=rt(y,u,p);return {position:Position.Bottom,style:{bottom:"0px",left:`${N}px`,right:void 0,top:void 0,transform:"translate(-50%, -50%)"}}}case "left":{let y=f!==void 0?f:n*(g??50)/100,N=rt(y,h,x);return {position:Position.Left,style:{left:"0px",top:`${N}px`,right:void 0,bottom:void 0,transform:"translate(50%, -50%)"}}}case "right":{let y=f!==void 0?f:n*(g??50)/100,N=rt(y,h,x);return {position:Position.Right,style:{right:"0px",top:`${N}px`,left:void 0,bottom:void 0,transform:"translate(-50%, -50%)"}}}default:return}}function Fs(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 Hs(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),l=Fs(c,s,o,r);return n?{position:Position.Top,style:{transform:"translateY(50%)",left:`${l-o/2}px`}}:{position:Position.Bottom,style:{transform:"translateY(-50%)",left:`${l-o/2}px`}}}function Rs(e,t,o,r,n,a){let i=e%2===0,s=Math.ceil(t/2),c=Math.floor(t/2),l=Math.max(i?s:c,1),g=Math.floor(i?e/2:(e-1)/2),f=Fs(g,l,o,n),u=1,p=rt(Math.round(r*.75),1,4),h=Math.max(u,a-r-1),x=rt(u+r+p,u,h),y=i?u:x;return {position:Position.Top,style:{transform:"none",left:`${f-o/2}px`,top:`${y}px`,right:void 0,bottom:void 0}}}function $u(e,t,o,r,n){let a=Di(e,n),i=jt(a),s;if(r<=20){let g=Math.max(2,r-i.height-2);s=`${o<=1?(2+g)/2:2+t*(g-2)/(o-1)}px`;}else s=`${25+t*50}%`;return {position:Position.Right,style:{transform:"translateX(-50%)",top:s,width:`${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 Lu(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 Hs(e,t,o,r)}function Bu(e,t,o,r,n,a,i,s,c){if(s==="patch-panel"||s==="switch")return Hs(t,o,r,a);if(Yo(e)){let f=Di(e,c),u=jt(f),p;if(i<=20){let y=Math.max(2,i-u.height-2);p=`${o<=1?(2+y)/2:2+t*(y-2)/(o-1)}px`;}else p=`${25+t*50}%`;return {position:Position.Left,style:{transform:"translateX(50%)",top:p,width:`${u.width}px`,height:`${u.height}px`,background:u.color,border:`1px solid ${u.borderColor}`,zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:u.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:u.borderRadius,clipPath:u.clipPath}}}return {position:Position.Right,style:{transform:"translate(-50%, -50%)",top:`${rt(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 Ou(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 Wu=({id:e,data:t,selected:o})=>{let r=useUpdateNodeInternals(),{highlightedPortHandles:n,onPortClick:a,portClickEnabled:i}=Ni(),{label:s,status:c="active",deviceType:l="server",manufacturer:g,uHeight:f=1,width:u="full",face:p,rackWidthPx:h,frontImageUrl:x,rearImageUrl:y,imageFit:N,imagePosition:D,imageRepeat:C,stretchToFit:P,showDeviceImages:k=true}=t,{ports:E,rearPorts:_}=xe.useMemo(()=>Ue(t),[t]),A=ku(l),F=h??300,L=t.isRackMounted===true&&N===void 0&&P!==true,z=xe.useMemo(()=>bs(L?"fill":N,P),[N,L,P]),U=xe.useMemo(()=>xs(x),[x]),j=xe.useMemo(()=>xs(y),[y]),re=Ps(U),se=Ps(j),S=_e(t),M=ot(t),te=Cu(p,E,_,x,y),Z=xe.useMemo(()=>S?Uo(M):[te],[S,M,te]),X=Z[0]??te,J=S&&M==="both",ke=t.isRackMounted===true?Yt(t):20,ie=f*ke,Te=Lt(t),me=F+Te,ce=xe.useMemo(()=>qa(F,{isRackMounted:t.isRackMounted,splitFaceLayout:S,deviceWidth:u}),[t.isRackMounted,F,S,u]),O=xe.useMemo(()=>hi(ce,ie,re,z,D??"center"),[ce,ie,re,z,D]),$=xe.useMemo(()=>hi(ce,ie,se,z,D??"center"),[ce,ie,se,z,D]),Pe=xe.useMemo(()=>X==="rear"?$:O,[X,O,$]),kt=k&&(X==="rear"?!!j:!!U),ct=t.isRackMounted===true&&kt&&!J,de=X==="rear"?_:E,Qt=xe.useMemo(()=>de.flatMap(Q=>Q.ports).filter(Q=>!Yo(Q)),[de]),eo=xe.useMemo(()=>!ct||!((A==="switch"||A==="patch-panel"||A==="router")&&Qt.length>=24)?false:Qt.every(be=>xr(be)),[Qt,A,ct]),Ie=xe.useMemo(()=>[S?"split":"single",M,Z.join(","),X,A,s,z,D??"center",O?`${O.width}:${O.height}:${O.offsetX}:${O.offsetY}`:"",$?`${$.width}:${$.height}:${$.offsetX}:${$.offsetY}`:"",ie.toString(),ce.toString(),me.toString(),Ds(E),Ds(_)].join("|"),[S,M,Z,X,A,s,z,D,O,$,ie,ce,me,E,_]);xu(()=>{r(e);},[Ie,e,r]);let Me=xe.useCallback(Q=>{let be=Q==="rear"?j:U;return be?{backgroundImage:Du(be),backgroundSize:z==="100% 100%"?hu:z,backgroundPosition:D??"center",backgroundRepeat:C??"no-repeat"}:{}},[j,U,z,D,C]),ft=xe.useMemo(()=>Me("front"),[Me]),dt=xe.useMemo(()=>Me("rear"),[Me]),to=X==="rear"?dt:ft,fe=xe.useMemo(()=>Tu(z),[z]),gt,Je;if(S)gt=`${Za(t,t)+4}px`,Je=void 0;else {let Q=F+4,be=Math.floor(F/2);gt=u==="half"?`${be}px`:`${Q}px`,Je=u==="half"?`${be}px`:void 0;}let Gn=A==="server"&&f===1,Ce=vt(c),Se={"--rn-device-bg-image":k&&!J?String(to.backgroundImage??"none"):"none","--rn-device-bg-position":String(to.backgroundPosition??"center"),"--rn-device-bg-repeat":String(to.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(to.backgroundSize??"cover"),"--rn-device-border-color":Ce,"--rn-device-box-shadow":o?"0 0 0 1px #3b82f6":"0 1px 2px rgba(0,0,0,0.1)","--rn-device-height":`${ie}px`,"--rn-device-left":Je??"auto","--rn-device-status-color":Ce,"--rn-device-translate-y":Gn?"-1px":"0px","--rn-device-width":gt},Co=xe.useMemo(()=>{if(!ct)return;let Q={position:"absolute",top:"2px",zIndex:2,padding:0,justifyContent:"flex-start",pointerEvents:"none"},be=f>1?24:8;if(!Pe)return eo?{...Q,display:"none"}:{...Q,left:"4px",right:`${be}px`,alignItems:"flex-start"};let Fe=4,Ae=Math.max(0,Math.floor(Pe.offsetX)-Fe),mt=Math.max(0,Math.floor(ce-(Pe.offsetX+Pe.width))-Fe);if(Math.max(Ae,mt)>=56){let Qe=mt>Ae;return {...Q,left:Qe?"auto":`${Fe}px`,right:Qe?`${Fe}px`:"auto",width:`${Math.max(48,Math.max(Ae,mt))}px`,alignItems:Qe?"flex-end":"flex-start"}}return eo?{...Q,display:"none"}:{...Q,left:"4px",right:`${be}px`,alignItems:"flex-start"}},[Pe,ce,eo,f,ct]),Ro=xe.useMemo(()=>{let Q=new Set;for(let be of E)for(let Fe of be.ports)Q.add(ks(be.name,Fe));return Q},[E]),Eo=xe.useCallback((Q,be)=>be==="rear"&&J&&Ro.has(Q)?`${Q}--rear`:Q,[Ro,J]),oo=xe.useCallback((Q,be,Fe=0,Ae=ce)=>{let mt=[];if(Q.length===0)return mt;let Qe=be==="rear"?$:O,ro=Pi(Ae),ar=!!(Qe&&Q.some(Re=>Re.ports.some(Oe=>!Yo(Oe)&&xr(Oe)))),{width:vo,height:Pt}=A==="switch"||A==="patch-panel"?ar?Cs(Q,Ae,ie,Qe):Pi(Ae):Cs(Q,Ae,ie,Qe),sr=Q.reduce((Re,Oe)=>Re+Oe.ports.length,0),Dt=(A==="switch"||A==="patch-panel")&&sr>=24,Mr=A!=="switch"&&A!=="patch-panel"&&sr>=24;for(let Re of Q)for(let Oe=0;Oe<Re.ports.length;Oe+=1){let he=Re.ports[Oe],Ar=ks(Re.name,he),Ft=Yo(he),Ut=Ss(he,Re.name),et=vo,it=Pt;if(Ft){let Ne=Di(he,s),_t=jt(Ne);et=_t.width,it=_t.height;}else if(he.type==="usb"){let Ne=Is(ro);et=Ne.width,it=Ne.height;}else if(Ut==="sfp"||Ut==="qsfp"||Ut==="osfp"){let Ne=Ts(he,Re.name,ro,Qe);Qe&&xr(he)?et=Mr?vo:Ne.width:et=Ne.width,it=Ne.height;}else if(Ut==="rj45"||Ut==="console"){let Ne=Ts(he,Re.name,ro,Qe);et=Ne.width,it=Ne.height;}else if(Es(he)){let Ne=vs(ro);et=Ne.width,it=Ne.height;}let cr=vu(he),Un=he.connected?cr:bu,Vn=Iu(et,it,cr,Un),$r=be==="front"?Ft?$u(he,Oe,Re.ports.length,ie,s):Dt?Rs(Oe,Re.ports.length,et,it,Ae,ie):Lu(Oe,Re.ports.length,et,Ae):!Ft&&Dt?Rs(Oe,Re.ports.length,et,it,Ae,ie):Bu(he,Oe,Re.ports.length,et,it,Ae,ie,A,s),Io=Au(he,et,it,Ae,ie,Qe),tt=Io?Ft?{position:Io.position,style:{...$r.style,...Io.style}}:Io:$r,K=Fu(he,Re.name,tt.position,Qe),So=K?{"--rn-hit-expand-top":`${K.top}px`,"--rn-hit-expand-right":`${K.right}px`,"--rn-hit-expand-bottom":`${K.bottom}px`,"--rn-hit-expand-left":`${K.left}px`}:{},ne=K?"rn-port-hitbox":void 0,We={...{...Vn,...tt.style,...So}};We.left!==void 0&&Fe!==0&&(typeof We.left=="number"?We.left=`${We.left+Fe}px`:We.left=`calc(${We.left} + ${Fe}px)`),J&&We.left===void 0&&(tt.position===Position.Left?(We.left=`${Fe}px`,We.right=void 0):tt.position===Position.Right&&(We.left=`${Fe+Ae}px`,We.right=void 0));let Ht=Eo(Ar,be),Vt=xi(n,e,Ht),no=[ne,i?"rn-port-handle--clickable":void 0,Vt?"rn-port-handle--highlighted":void 0].filter(Boolean).join(" "),le=Ou(Ft,A,be,he.connected);if(le.secondary){let Ne=A==="switch"||A==="router"?{...We,background:"transparent",border:"none",opacity:0}:We,_t=A==="switch"||A==="router"?`${Re.name} - ${he.label} (input) ${he.connected?"(connected)":"(disconnected)"}`:`${Re.name} - ${he.label} (${le.secondary}) ${he.connected?"(connected)":"(disconnected)"}`;mt.push(jsx(Handle,{id:`${Ht}-${le.secondary}`,type:le.secondary,position:tt.position,className:ne,style:Ne,title:_t},`${Ht}-${le.secondary}`));}mt.push(jsx(Handle,{id:Ht,type:le.primary,position:tt.position,className:no||void 0,style:We,title:`${Re.name} - ${he.label} ${he.connected?"(connected)":"(disconnected)"}`,onClick:i&&a?Ne=>{Ne.stopPropagation(),a({nodeId:e,handleId:Ht,groupName:Re.name,portLabel:he.label,face:be});}:void 0,children:Ft?Oe+1:void 0},Ht));}return mt},[ie,ce,O,n,e,s,A,a,i,$,Eo,J]),ir=xe.useMemo(()=>{let Q=[];for(let be of Z){if(be==="front"&&E.length>0){let Fe=J?me:0;Q.push(...oo(E,"front",Fe,ce));}be==="rear"&&_.length>0&&Q.push(...oo(_,"rear",0,ce));}return Q},[Z,E,_,oo,ce,J,me]);return jsxs("div",{className:`device-node ${o?"selected":""} ${J?"device-node--split-both":""}`,style:Se,children:[k&&!J&&kt&&jsx("div",{className:"device-node__image-layer","aria-hidden":"true",children:jsx("img",{className:"device-node__image",src:X==="rear"?j:U,alt:"",draggable:false,style:{objectFit:fe,objectPosition:D??"center"}})}),k&&J&&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(dt.backgroundImage??"none"),backgroundPosition:String(dt.backgroundPosition??"center"),backgroundRepeat:String(dt.backgroundRepeat??"no-repeat"),backgroundSize:String(dt.backgroundSize??"cover")},children:j?jsx("img",{className:"device-node__image",src:j,alt:"",draggable:false,style:{objectFit:fe,objectPosition:D??"center"}}):null}),jsx("div",{className:"device-node__face-bridge","data-testid":"device-face-bridge",style:{width:`${Te}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(ft.backgroundImage??"none"),backgroundPosition:String(ft.backgroundPosition??"center"),backgroundRepeat:String(ft.backgroundRepeat??"no-repeat"),backgroundSize:String(ft.backgroundSize??"cover")},children:U?jsx("img",{className:"device-node__image",src:U,alt:"",draggable:false,style:{objectFit:fe,objectPosition:D??"center"}}):null})]}),jsxs("div",{className:`device-node__content ${ct?"device-node__content--image-badge":""}`,style:Co??{position:"relative",zIndex:1},children:[jsx("div",{className:`device-node__label ${ct?"device-node__label--badge":""}`,children:s}),!ct&&f>1&&jsx("div",{className:"device-node__manufacturer",children:g})]}),f>1&&jsxs("div",{className:"device-node__u-indicator",children:[f,"U"]}),jsx("div",{className:"device-node__status-indicator"}),ir]})},Ko=xe.memo(Wu,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var pn=20,qo=3,gn=2,Gu=1,Ci=2,Ms=6,Uu=12;function Ti(e){return Math.max(0,Math.min(100,e))}function Ri(e,t,o){return Math.max(t,Math.min(o,e))}function Vu(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 ju(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 Xu(e){if(Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0)return e.pduPortGroups;let t=ni(e);if(t.length>0)return t;let o=ri(e);return o.length>0?o:[]}function Yu(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>fn($t(r))??"C13"):Array.from({length:t},(o,r)=>{let n=fn(e.portTypes?.[r]);return n||(fn($t(r))??"C13")})}function Ku(e,t){let o=Xu(e),r=Yu(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:Nt(i.name,s),label:s.label,connectorType:ju(s,c),groupName:i.name,position:lt(s.position)}),a+=1;});}),n}function qu(e){return jt(e.connectorType).height}function Zu(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t:Math.floor(t/2)}function As(e,t){let o=[],r=t>=0,n=r?Ri(t,0,e.length):-1;for(let a=0;a<=e.length;a+=1)r&&a===n&&o.push({kind:"mgmt",height:Uu}),a<e.length&&o.push({kind:"port",portIndex:a,height:qu(e[a]),groupName:e[a].groupName});return o}function $s(e,t){return e.kind==="port"&&t.kind==="port"?e.groupName===t.groupName?Ci:Ms:Ci}function Ju(e,t){let o=As(e,t);if(o.length===0)return Math.max(gn+qo+1,1);let r=0;for(let n=0;n<o.length;n+=1)r+=o[n].height,n<o.length-1&&(r+=$s(o[n],o[n+1]));return gn+r+qo}function Qu(e,t,o){let r=As(e,o);if(r.length===0)return {portCenters:[]};let n=[];for(let x=0;x<r.length-1;x+=1)n.push($s(r[x],r[x+1]));let a=r.reduce((x,y)=>x+y.height,0),i=n.reduce((x,y)=>x+y,0),s=a+i,c=Math.max(t-gn-qo,1),l=0,g=n,f=Math.max(0,c-s);if(f>0)if(n.length===0)l=f/2;else {let x=n.map(N=>N===Ms?1.2:1),y=x.reduce((N,D)=>N+D,0);g=n.map((N,D)=>y<=0?N:N+f*x[D]/y);}let u=[],p,h=gn+l;for(let x=0;x<r.length;x+=1){let y=r[x],N=h+y.height/2;y.kind==="mgmt"?p=N:u[y.portIndex]=N,h+=y.height,x<r.length-1&&(h+=g[x]??Ci);}return {portCenters:u,mgmtCenterY:p}}function ep(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"?Ti(e.offsetPercent):void 0,l=typeof e.offsetPx=="number"?e.offsetPx:void 0,g=typeof e.xPercent=="number"?Ti(e.xPercent):void 0,f=typeof e.yPercent=="number"?Ti(e.yPercent):void 0;if(g!==void 0&&f!==void 0){let h=i??Vu(g,f),x=h==="left"?Position.Left:h==="top"?Position.Top:h==="bottom"?Position.Bottom:Position.Right,y=Math.max(o-qo,1),N=r*g/100,D=Ri(y*f/100,a/2,Math.max(a/2,o-a/2));return {position:x,leftPx:N-n/2,topPx:D-a/2}}let u=g!==void 0?r*g/100:r-n/2-1,p=f!==void 0?Math.max(o-qo,1)*f/100:t;return i==="top"||i==="bottom"?(l!==void 0?u=l:c!==void 0&&(u=r*c/100),p=i==="top"?a/2:o-a/2):(l!==void 0?p=l:c!==void 0&&(p=Math.max(o-qo,1)*c/100),i==="left"?u=n/2:i==="right"&&(u=r-n/2-1)),p=Ri(p,a/2,Math.max(a/2,o-a/2)),{position:s,leftPx:u-n/2,topPx:p-a/2}}function tp(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 op=({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),l=Ku(e,c),g=Zu(s,l.length),f=n*4.2,u=Ju(l,g),p=Math.max(f-pn,u),h=Math.max(i-Gu*2,1),x=pn+p,y=Qu(l,p,g);return jsxs("div",{className:`vertical-pdu-node ${t?"selected":""}`,style:{background:"linear-gradient(90deg, #2d3748 0%, #1a202c 50%, #2d3748 100%)",border:`1px solid ${vt(r)}`,borderRadius:"2px",padding:0,width:`${i}px`,height:`${x}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 1px 3px rgba(0,0,0,0.3)",boxSizing:"border-box",position:"relative",display:"flex",flexDirection:"column"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"linear-gradient(90deg, #4a5568 0%, #2d3748 50%, #4a5568 100%)",padding:"2px",position:"relative",height:`${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:`${x-pn}px`,overflow:"hidden"},children:[typeof y.mgmtCenterY=="number"?tp(y.mgmtCenterY,h):null,l.map((N,D)=>{let C=y.portCenters[D]??p/2,P=jt(N.connectorType),k=ep(N.position,C,p,h,P.width,P.height);return jsx(Handle,{type:"source",position:k.position,id:N.id,style:{position:"absolute",left:`${k.leftPx}px`,top:`${k.topPx}px`,right:"initial",bottom:"initial",width:`${P.width}px`,height:`${P.height}px`,background:P.color,border:`1px solid ${P.borderColor}`,boxSizing:"border-box",transform:"none",cursor:"pointer",zIndex:10,display:"flex",alignItems:"center",justifyContent:"center",fontSize:P.fontSize,color:"#1a1a1a",fontFamily:"monospace",fontWeight:"bold",borderRadius:P.borderRadius,clipPath:P.clipPath},title:`${N.groupName} - ${N.label} (${N.connectorType})`,children:N.label},`handle-${N.id}`)})]})]})},vi=xe.memo(op,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var Fi=({data:e,selected:t,id:o})=>{let{lossDb:r,mode:n="single",ribbonFiberIds:a}=e||{},i=useEdges(),s=i.find(k=>k.target===o&&k.targetHandle==="left"),c=i.find(k=>k.source===o&&k.sourceHandle==="right"),l=i.find(k=>k.target===o&&k.targetHandle==="right"),g=c||l,f=s?.data?.color||"#555",u=g?.data?.color||"#555",p=n==="ribbon",h=s?.data?.ribbonFiberIds||a,x=g?.data?.ribbonFiberIds||a,y=p&&h?Wt(h):null,N=p&&x?Wt(x):null,D=!!s&&!!g;return jsxs("div",{className:`splice-node ${t?"selected":""}`,style:{width:p?85:69,height:p?20:16,borderRadius:8,border:"none",outline:"none",position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"none"},children:[p&&y&&N?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:y.map((k,E)=>jsx("div",{style:{flex:1,background:k.base,opacity:k.striped?.9:1}},`left-${E}`))}),jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:N.map((k,E)=>jsx("div",{style:{flex:1,background:k.base,opacity:k.striped?.9:1}},`right-${E}`))})]}):jsxs("div",{style:{position:"absolute",inset:0,display:"grid",gridTemplateColumns:"1fr 1fr",borderRadius:8,overflow:"hidden",opacity:.75,pointerEvents:"none"},children:[jsx("div",{style:{background:f}}),jsx("div",{style:{background:u}})]}),jsx("div",{className:"splice-text-overlay",style:{position:"absolute",inset:0,borderRadius:8,pointerEvents:"none",zIndex:1,background:"transparent"}}),D&&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}}),D&&typeof r=="number"&&jsxs("div",{className:"splice-text-label animate-in",style:{position:"absolute",inset:0,display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",fontSize:p?8:9,fontFamily:"monospace",pointerEvents:"none",zIndex:3,fontWeight:"bold",gap:"2px"},children:[jsx("div",{children:`${r.toFixed(2)} dB`}),p&&a&&jsxs("div",{style:{fontSize:"7px",opacity:.8},children:[a.length,"F"]})]}),jsx(Handle,{type:"target",position:Position.Left,id:"left",isConnectable:true,style:{width:12,height:p&&y?20:12,borderRadius:p&&y?"6px":"50%",border:"none",background:p&&y?`linear-gradient(to bottom, ${y.map(k=>k.base).join(", ")})`:f,zIndex:100,cursor:"crosshair",left:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"source",position:Position.Right,id:"right",isConnectable:true,style:{width:12,height:p&&N?20:12,borderRadius:p&&N?"6px":"50%",border:"none",background:p&&N?`linear-gradient(to bottom, ${N.map(k=>k.base).join(", ")})`:u,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}}),jsx(Handle,{type:"target",position:Position.Right,id:"right",isConnectable:true,style:{width:12,height:p&&N?20:12,borderRadius:p&&N?"6px":"50%",border:"none",background:p&&N?`linear-gradient(to bottom, ${N.map(k=>k.base).join(", ")})`:u,zIndex:100,cursor:"crosshair",right:-6,top:"50%",transform:"translateY(-50%)"}})]})};var Tr=20,mn=36;var ho=32,Ls=4,qt=12,np=69,yo=80,Hi=(yo-np)/2;var _i=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",a=n?mn:Tr,i=n?32:16,s=ho,c=o.y-s,l=Math.round(c/a)+1,f=Math.max(1,Math.min(qt,l));if(!Dr(t,e,f,r)){let h=Cr(t,e,r,f);if(h!==f){let x=(a-i)/2;return {x:Hi,y:s+(h-1)*a+x,holderPosition:h}}}let u=(a-i)/2,p=s+(f-1)*a+u;return {x:Hi,y:p,holderPosition:f}},Dr=(e,t,o,r)=>!r.filter(a=>a.parentId===e.id&&a.type==="splice"&&a.id!==t.id).some(a=>a.data.holderPosition===o),Cr=(e,t,o,r=1)=>{for(let n=r;n<=qt;n++)if(Dr(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(Dr(e,t,n,o))return n;return 1},ip=(e,t)=>Rr(e,t,false),Rr=(e,t,o=false)=>{let r=ho,n=o?mn:Tr,i=(n-(o?32:16))/2,s=r+(t-1)*n+i;return {x:Hi,y:s}};var $i=({data:e,selected:t})=>{let{label:o="Splice Tray"}=e||{},[r,n]=useState(false),a=()=>{if(!r)return null;let i=[],s=ho;for(let c=1;c<=qt;c++){let l=s+(c-1)*Tr;i.push(jsxs("div",{style:{position:"absolute",left:"-35px",top:`${l}px`,background:"#374151",color:"#9ca3af",padding:"2px 4px",borderRadius:"2px",fontSize:"8px",fontWeight:"bold",width:"28px",textAlign:"center",border:"1px solid #4b5563",zIndex:10,height:`${Tr}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:`${yo}px`,height:`${ho+qt*mn+Ls}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:`${ho}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:ho,left:0,right:0,bottom:0,pointerEvents:"none"}})]})};var Li=({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=`tube-${n}`,l=s.find(j=>j.source===o&&j.sourceHandle===c||j.target===o&&j.targetHandle===c),g=l?.data?.color,f=Ke((n-1)%12+1),u=g||f,p=Math.max(1,Math.min(24,Number(r)||12)),h=14,x=4,y=1,N=2,D=20,C=p*h+(p-1)*x,P=Math.max(60,C+y*2+N*2),k=a==="left"?Position.Left:a==="right"?Position.Right:Position.Bottom,E=k!==Position.Bottom,_=E?14:20,A=E?8:20,F=E?`inset ${k===Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",L=l?u:E?`linear-gradient(${k===Position.Left?"to right":"to left"}, rgba(0, 0, 0, 0.45), rgba(0, 0, 0, 0)), ${u}`:`radial-gradient(circle, ${u} 40%, transparent 70%)`,z={width:_,height:A,borderRadius:E?6:"50%",opacity:l?.3:.9,pointerEvents:"auto",background:L,backgroundColor:u,border:l?`2px solid ${u}`:`3px dashed ${u}`,cursor:"crosshair","--fiber-bg":u,boxShadow:l?F:`${F}${F!=="none"?", ":""}0 0 8px ${u}`,transition:"opacity 0.2s, box-shadow 0.2s",...k===Position.Left?{left:-(_-4)}:k===Position.Right?{right:-(_-4)}:{}},U=useMemo(()=>{let j=[],re=P-N*2-y*2,se,S,M=false;a==="left"?(se=y,S=Position.Top):a==="right"?(se=y+re-C,S=Position.Top,M=true):(se=y+(re-C)/2,S=Position.Top);for(let te=0;te<p;te++){let Z=M?p-te:te+1,X=`fiber-${Z}`,J=s.find(Pe=>Pe.source===o&&Pe.sourceHandle===X||Pe.target===o&&Pe.targetHandle===X),ke=!!J&&(J.data?.isRibbon||J.data?.ribbonFiberIds&&Array.isArray(J.data.ribbonFiberIds)),ie=J?.data?.color,Te=typeof J?.data?.striped=="boolean"?J.data.striped:void 0,me=Ot(Z);i||ke?me=Ot(Z,{base:"#808080",striped:false}):(ie||Te!==void 0)&&(me=Ot(Z,{...ie?{base:ie}:{},...Te!==void 0?{striped:Te}:{}}));let ce=se+te*(h+x),O=y,$={position:"absolute",left:`${ce}px`,top:`${O}px`,width:h,height:h,borderRadius:"50%",border:"none",zIndex:10,cursor:"pointer","--fiber-bg":me.base,backgroundColor:me.base};me.backgroundImage&&($["--fiber-bg-image"]=me.backgroundImage),j.push(jsxs(xe.Fragment,{children:[jsx(Handle,{id:X,type:"target",position:S,className:"tube-fiber-handle",isConnectable:true,style:$,"data-fiber-idx":Z,"data-fiber-color":me.base}),jsx(Handle,{id:X,type:"source",position:S,className:"tube-fiber-handle",isConnectable:true,style:$,"data-fiber-idx":Z,"data-fiber-color":me.base})]},`fiber-${Z}`));}return j},[p,a,P,s,o,h,x,y,N,C,i]);return jsxs("div",{style:{width:P,height:D,borderRadius:4,background:"#111827",border:`${N}px solid ${t?"#3b82f6":u}`,position:"relative",boxShadow:t?`0 0 0 ${N}px #3b82f6`:"0 2px 4px rgba(0,0,0,0.2)",padding:y,boxSizing:"border-box",overflow:"visible"},children:[U,jsx(Handle,{id:c,type:"target",position:k,isConnectable:true,className:"tube-connection-handle",style:z,"data-tube-idx":n,"data-tube-color":u,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"}),jsx(Handle,{id:c,type:"source",position:k,isConnectable:true,className:"tube-connection-handle",style:z,"data-tube-idx":n,"data-tube-color":u,title:l?"Connected - drag to reconnect":"Drag to connect cable tube"})]})};var Wi=({data:e,selected:t})=>{let{fiberCount:o,cableId:r="CBL-002",label:n,color:a,rotation:i}=e||{},s=xe.useRef(null);xe.useEffect(()=>{if(s.current){let S=typeof i=="number"?i:0;s.current.style.transform=`rotate(${S}deg)`,s.current.style.transformOrigin="center center";}},[i]);let c=Math.max(1,Math.min(24,Number(o)||12)),l=10,g=2,f=6,u=f+l+4,p=60,h=Math.max(120,c*(l+g)+f*2),y=n??`${c}f Cable`,N=r?`Cable ID ${r}`:void 0,D=Ke(1),C=a||D,P=t?"#3b82f6":C,k=typeof i=="number"?i:0,E=S=>{let M=(S%360+360)%360;return M>=315||M<45?Position.Top:M>=45&&M<135?Position.Right:M>=135&&M<225?Position.Bottom:Position.Left},_=()=>{let S=[],M=E(k);for(let te=0;te<c;te++){let Z=te+1,X=Ot(Z),J=X.base,ke=f+te*(l+g),ie=-5,Te=X.backgroundImage?X.backgroundImage:J,me={position:"absolute",left:`${ke}px`,top:`${ie}px`,width:l,height:l,borderRadius:"50%",border:"none",background:Te,backgroundColor:J,zIndex:10,cursor:"pointer","--fiber-bg":J};X.backgroundImage&&(me["--fiber-bg-image"]=X.backgroundImage);let ce=`fiber-${Z}`;S.push(jsxs(xe.Fragment,{children:[jsx(Handle,{id:ce,type:"target",position:M,className:"tube-fiber-handle",isConnectable:true,style:me,"data-fiber-idx":Z,"data-fiber-color":J}),jsx(Handle,{id:ce,type:"source",position:M,className:"tube-fiber-handle",isConnectable:true,style:me,"data-fiber-idx":Z,"data-fiber-color":J})]},`fiber-${Z}`));}return S},A="cable-button",F=8,L={width:F,height:F,borderRadius:"50%",background:C,backgroundColor:C,border:`1px solid ${C}`,cursor:"pointer",zIndex:10},z=2,j=(S=>{let M=(S%360+360)%360;return M>=315||M<45?Position.Bottom:M>=45&&M<135?Position.Left:M>=135&&M<225?Position.Top:Position.Right})(k),re={width:h,height:p,position:"relative",transform:`rotate(${k}deg)`,transformOrigin:"center center","--rotation":`${k}deg`},se={width:"100%",height:"100%",borderRadius:4,background:"#111827",border:`${z}px solid ${P}`,boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",padding:f,paddingTop:u,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2};return jsx("div",{ref:s,style:re,children:jsxs("div",{style:se,children:[_(),jsx(Handle,{id:A,type:"source",position:j,className:"cable-button-handle",isConnectable:true,style:L,"data-handle-type":"cable-button","data-cable-color":C}),jsx(Handle,{id:A,type:"target",position:j,className:"cable-button-handle",isConnectable:true,style:L,"data-handle-type":"cable-button","data-cable-color":C}),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:y}),N&&jsx("div",{style:{fontSize:10,opacity:.8},children:N})]})]})})};var Gi=({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||{},l=Math.max(1,Math.min(24,Number(o)||12)),g=Math.max(1,Number(s)||1),f=14,u=10,p=3,h=6,x=h+u+4,y=60,N=Math.max(120,l*(f+p)+h*2),D=n??l*(Number(r)||12),C=i??`${D}f Cable`,P=a?`Cable ID ${a}`:void 0,k=Ke(g),E=c||k,_=t?"#3b82f6":E,A=()=>{let j=[];for(let re=0;re<l;re++){let se=g+re,S=Ot(se),M=S.base,te=h+re*(f+p),Z=-5,X=S.backgroundImage?S.backgroundImage:M,J={position:"absolute",left:`${te}px`,top:`${Z}px`,width:f,height:u,borderRadius:6,border:"none",background:X,backgroundColor:M,zIndex:10,cursor:"pointer","--fiber-bg":M};S.backgroundImage&&(J["--fiber-bg-image"]=S.backgroundImage);let ke=`tube-${se}`;j.push(jsxs(xe.Fragment,{children:[jsx(Handle,{id:ke,type:"target",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,style:J,"data-fiber-idx":se,"data-tube-idx":se,"data-tube-color":M}),jsx(Handle,{id:ke,type:"source",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,style:J,"data-fiber-idx":se,"data-tube-idx":se,"data-tube-color":M})]},`tube-${se}`));}return j},F="cable-button",L=8,z={width:L,height:L,borderRadius:"50%",background:E,backgroundColor:E,border:`1px solid ${E}`,cursor:"pointer",zIndex:10};return jsxs("div",{style:{width:N,height:y,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:h,paddingTop:x,boxSizing:"border-box",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",textAlign:"center",gap:2},children:[A(),jsx(Handle,{id:F,type:"source",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,style:z,"data-handle-type":"cable-button","data-cable-color":E}),jsx(Handle,{id:F,type:"target",position:Position.Bottom,className:"cable-button-handle",isConnectable:true,style:z,"data-handle-type":"cable-button","data-cable-color":E}),jsxs("div",{style:{display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",gap:2},children:[jsx("div",{style:{fontSize:11,fontWeight:600,textTransform:"uppercase",letterSpacing:.5},children:C}),P&&jsx("div",{style:{fontSize:10,opacity:.8},children:P})]})]})};var Ui=({data:e,selected:t,id:o})=>{let{connector:r="LC",couplerFiberCount:n,label:a,portLabelsLeft:i,portLabelsRight:s}=e||{},c=useEdges(),l=typeof n=="number"&&[1,2,4].includes(n)?n:2,g=Math.max(1,Math.min(4,l)),f=9,u=3,p=3,h=60,x=30,y=g*f+(g-1)*u,N=Math.max(x,y+p*2),D=Math.max(h,80),C=(E,_)=>{let A=`${E}-${_+1}`;return c.find(L=>L.source===o&&L.sourceHandle===A||L.target===o&&L.targetHandle===A)?.data?.color||"#555"},P=E=>{let _=[],A=E==="left"?Position.Left:Position.Right,F=E==="left"?i:s;for(let L=0;L<g;L++){let z=L+1,U=`${E}-${z}`,j=C(E,L),S=p+(N-y)/2+L*(f+u),M={position:"absolute",left:E==="left"?-5:void 0,right:E==="right"?-5:void 0,top:`${S}px`,width:f,height:f,borderRadius:"50%",border:"none",background:j,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};_.push(jsxs(xe.Fragment,{children:[jsx(Handle,{id:U,type:"target",position:A,isConnectable:true,style:M}),jsx(Handle,{id:U,type:"source",position:A,isConnectable:true,style:M})]},U)),F&&F[L]&&_.push(jsx("div",{style:{position:"absolute",left:E==="left"?-30:void 0,right:E==="right"?-30:void 0,top:`${S}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:E==="left"?"right":"left",width:"25px"},children:F[L]},`${U}-label`));}return _},k=a||`${r}-${g}f`;return jsxs("div",{className:`coupler-node ${t?"selected":""}`,style:{width:D,height:N,borderRadius:4,border:`2px solid ${t?"#3b82f6":"#4b5563"}`,background:"#1f2937",position:"relative",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",display:"flex",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",fontSize:"10px",padding:`${p}px`,boxSizing:"border-box"},children:[P("left"),jsx("div",{style:{position:"absolute",top:"50%",left:"50%",transform:"translate(-50%, -50%)",textAlign:"center",pointerEvents:"none",zIndex:1},children:jsx("div",{style:{fontWeight:"bold",fontSize:"9px"},children:k})}),P("right")]})};var xo=32,Pn=30,fp=24,gp=80,xn=400,kn=300,js=2,No=8,Xs=120;function ji(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,l=r*n+(r-1)*a,g=Math.max(c,l+i*2);return {width:Math.max(s,80),height:g}}function Dn(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 Ys(e){return {width:yo,height:0}}function Ks(e){return e.type==="coupler"?ji(e):e.type==="tube"?Dn(e):e.type==="splice-tray"?Ys():{width:80,height:30}}function Vi(e){let t=0;for(let o of e){let r=Ks(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function qs(e,t=0){let o=t;for(let r of e){let n=Ks(r),a=(r.position?.y||0)+n.height;a>o&&(o=a);}return o}function Zs(e){return e.data?.panelWidth||xn}function mp(e){return e.data?.panelHeight||kn}function Js(e){return Zs(e)-js*2-No*2}function bp(e,t){return Js(e)-t}function Qs(e,t=Pn){return Math.floor(e/t)+1}function ec(e,t=Pn){return (e-1)*t}function hp(e,t,o){let r=Pn,n=Qs(o.y,r),a=ec(n,r);return {x:o.x,y:a,slotPosition:n}}function Xi(e,t){if(t.length===0)return {width:e.data?.panelWidth||xn,height:e.data?.panelHeight||kn};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,l=0;for(let u of t)if(u.type==="tube"){let p=Dn(u);p.width>c&&(c=p.width);}else if(u.type==="coupler"){let p=ji(u);p.width>l&&(l=p.width);}let g=c+Xs+yo+l+zo,f=0;a=f+g+f;}else a=Vi(t)+4;a=Math.max(e.data?.panelWidth||xn,a);let i=qs(t,xo),s=Math.max(e.data?.panelHeight||kn,i+No);return {width:a,height:s}}function tc(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 yp(e,t,o){return tc(e,t,o)}var Gs=20,Us=400,Vs=300;function Yi(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||Us,height:e.data?.closureHeight||e.data?.panelHeight||Vs};let o=t.some(s=>s.type==="tube"),r=t.some(s=>s.type==="splice-tray"),n;if(o&&r){let s=0,c=0,l=0,g=t.filter(u=>u.type==="tube"),f=t.filter(u=>u.type==="splice-tray");if(g.length>0&&f.length>0){let u=f.map(h=>h.position?.x||0),p=u.reduce((h,x)=>h+x,0)/u.length;for(let h of g){let x=Dn(h);(h.position?.x||0)<p?x.width>s&&(s=x.width):x.width>c&&(c=x.width);}f.length>0&&(l=yo),n=No+s+Gs+l+Gs+c+zo;}else n=Vi(t)+No+zo;}else n=Vi(t)+No+zo;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||Us,n);let a=qs(t,xo),i=Math.max(e.data?.closureHeight||e.data?.panelHeight||Vs,a+No);return {width:n,height:i}}var Zi=({data:e,selected:t,id:o})=>{let{label:r="Patch Panel",header:n,panelWidth:a,panelHeight:i}=e||{},{getNodes:s,setNodes:c}=useReactFlow(),l=useRef(false),g=useRef([]),f=useMemo(()=>{let C=s().filter(P=>P.parentId===o);return (C.length!==g.current.length||C.some((P,k)=>P.id!==g.current[k]?.id))&&(g.current=C),g.current},[s,o]),u=useMemo(()=>({id:o,type:"patch-panel",position:{x:0,y:0},data:{...e,panelWidth:a,panelHeight:i}}),[o,e,a,i]),p=useMemo(()=>a&&i?{width:a,height:i}:f.length===0?{width:a||400,height:i||300}:Xi(u,f),[f,u,a,i]);useEffect(()=>{if(a&&i||l.current)return;let D=a,C=i,P=Math.abs((D||0)-p.width),k=Math.abs((C||0)-p.height);(P>1||k>1)&&(l.current=true,c(E=>E.map(_=>_.id===o?{..._,data:{..._.data,panelWidth:p.width,panelHeight:p.height}}:_)),setTimeout(()=>{l.current=false;},0));},[o,p.width,p.height,a,i,c]);let h=p.width,x=p.height,y=xo,N=n||r;return jsxs("div",{className:`patch-panel-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:"8px",padding:0,width:`${h}px`,height:`${x}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#1f2937",boxSizing:"border-box"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${y}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:N})}),jsx("div",{style:{position:"absolute",top:y,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var ea=({data:e,selected:t,id:o})=>{let{label:r="Closure",header:n,closureWidth:a,closureHeight:i,panelWidth:s,panelHeight:c}=e||{},{getNodes:l,setNodes:g}=useReactFlow(),f=useRef(false),u=useRef([]),p=useMemo(()=>{let E=l().filter(_=>_.parentId===o);return (E.length!==u.current.length||E.some((_,A)=>_.id!==u.current[A]?.id))&&(u.current=E),u.current},[l,o]),h=useMemo(()=>({id:o,type:"closure",position:{x:0,y:0},data:{...e,closureWidth:a||s,closureHeight:i||c}}),[o,e,a,i,s,c]),x=useMemo(()=>a&&i?{width:a,height:i}:s&&c?{width:s,height:c}:p.length===0?{width:a||s||400,height:i||c||300}:Yi(h,p),[p,h,a,i,s,c]);useEffect(()=>{if(a&&i||s&&c||f.current)return;let k=a||s,E=i||c,_=Math.abs((k||0)-x.width),A=Math.abs((E||0)-x.height);(_>1||A>1)&&(f.current=true,g(F=>F.map(L=>L.id===o?{...L,data:{...L.data,closureWidth:x.width,closureHeight:x.height}}:L)),setTimeout(()=>{f.current=false;},0));},[o,x.width,x.height,a,i,s,c,g]);let y=x.width,N=x.height,D=xo,C=n||r,P=y/2;return jsxs("div",{className:`closure-node ${t?"selected":""}`,style:{background:"transparent",border:"none",borderRadius:`${P}px ${P}px 12px 12px`,padding:0,width:`${y}px`,height:`${N}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column",backgroundColor:"#1f2937",boxSizing:"border-box",overflow:"hidden"},children:[jsx("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#374151",padding:"6px 12px",position:"relative",height:`${D}px`,display:"flex",flexDirection:"row",alignItems:"center",justifyContent:"center",gap:"6px",borderRadius:`${P}px ${P}px 0 0`,borderBottom:"1px solid #4b5563"},children:jsx("div",{style:{fontWeight:"bold",fontSize:"11px"},children:C})}),jsx("div",{style:{position:"absolute",top:D,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var oa=({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"),l=9,g=3,f=3,u=50,p=30,h=Math.min(Math.max(a||1,1),2),x=h*l+(h-1)*g,y=Math.min(i||8,48),N=y*l+(y-1)*g,D=Math.max(x,N),C=Math.max(p,D+f*2),P=Math.max(u,50),k=re=>s.find(S=>S.source===o&&S.sourceHandle===re||S.target===o&&S.targetHandle===re)?.data?.color||"#555",E=()=>{let re=[],se=f+(C-x)/2;for(let S=0;S<h;S++){let M=`input-${S+1}`,te=se+S*(l+g),Z=k(M),X={position:"absolute",left:-5,top:`${te}px`,width:l,height:l,borderRadius:"50%",border:"none",background:Z,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};re.push(jsxs(xe.Fragment,{children:[jsx(Handle,{id:`${M}-target`,type:"target",position:Position.Left,isConnectable:true,style:X}),jsx(Handle,{id:`${M}-source`,type:"source",position:Position.Left,isConnectable:true,style:X})]},M));}return re},_=()=>{let re=[],se=f+(C-N)/2;for(let S=0;S<y;S++){let M=`output-${S+1}`,te=se+S*(l+g),Z=k(M),X={position:"absolute",right:-5,top:`${te}px`,width:l,height:l,borderRadius:"50%",border:"none",background:Z,zIndex:100,cursor:"crosshair",transform:"translateY(-50%)"};re.push(jsxs(xe.Fragment,{children:[jsx(Handle,{id:`${M}-target`,type:"target",position:Position.Right,isConnectable:true,style:X}),jsx(Handle,{id:`${M}-source`,type:"source",position:Position.Right,isConnectable:true,style:X})]},M));}return re},A=Math.max(x+f*4,p*.6),F=(C-A)/2,L=F+A,z=0,U=C,j=t?"#3b82f6":"#4b5563";return jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:P,height:C,position:"relative",background:"transparent",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.2)",display:"flex",alignItems:"center",justifyContent:"center",color:"#e5e7eb",fontFamily:"monospace",fontSize:"10px",padding:`${f}px`,boxSizing:"border-box"},children:[jsx("svg",{width:P,height:C,viewBox:`0 0 ${P} ${C}`,style:{position:"absolute",top:0,left:0,width:`${P}px`,height:`${C}px`,pointerEvents:"none",zIndex:0},children:jsx("polygon",{points:`0,${F} 0,${L} ${P},${U} ${P},${z}`,fill:"#1f2937",stroke:j,strokeWidth:"2"})}),E(),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 ic=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",Rn=(e,t)=>ic(e)||ic(t),pe=(e,t)=>t?e?.type==="fibre-split"?Ge(t):Ge(t):t||"";var ac="--rear",sc=new WeakMap;function Jo(e){if(typeof e!="string")return;let t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");return t.length>0?t:void 0}function Cp(e){let t=new Set;return e.forEach(o=>{o&&t.add(o);}),[...t]}function cc(...e){let t=e.map(o=>Jo(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 ra(e){let t=[Jo(e.type),Jo(e.cableType),Jo(e.connectorType),Jo(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 vr(e){if(Array.isArray(e.compatibility)&&e.compatibility.length>0)return Cp(e.compatibility.map(o=>Jo(o)));if(e.kind==="power"||$e(e.type)){let o=cc(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(e.kind==="network"){let o=ra(e);return o?[`network:${o}`]:["network"]}let t=$e(e.type)?"power":ra(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=ra(e);return o?[`network:${o}`]:["network"]}return []}function Rp(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=$t(n);return {id:`${n+1}`,label:`${n+1}`,connected:false,type:a==="C19"?"power_c19":"power_c13",connectorType:a}})}]}function Ep(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups;let{ports:o,rearPorts:r}=Ue(t);return r.length>0?r:o.length>0?o:Rp(e)}function vp(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 l=Nt(s.name,{id:c.id,label:c.label,type:$e(c.type)?c.type:void 0});r.set(l,{face:a,kind:$e(c.type)?"power":"network",compatibility:vr({compatibility:c.compatibility,kind:$e(c.type)?"power":"network",type:c.type,cableType:c.cableType,connectorType:c.connectorType,handleId:l})});});});};if(e.type==="vertical-pdu")n("rear",Ep(e));else {let{ports:a,rearPorts:i}=Ue(t);n("front",a),n("rear",i);}return sc.set(t,r),r}function Ip(e,t){if(!e)return "unknown";if(t?.type==="vertical-pdu"||Xr(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 Sp(e,t,o){if(!e)return [];if(t==="power")return o?.type==="vertical-pdu"&&/^\d+$/.test(e)?vr({kind:t,connectorType:$t(Math.max(Number(e)-1,0)),handleId:e}):vr({kind:t,handleId:e});if(t==="network"){let r=e.toLowerCase();return vr({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 ko(e,t){let o=Ct(t);if(!o)return {normalizedHandle:"",kind:"unknown",compatibility:[]};let r=o,n;r.endsWith(ac)&&(r=r.slice(0,-ac.length),n="rear");let a=vp(e).get(r),l=(e?.data??{}).handleSideMap?.[r]??n??a?.face;l||(r==="net-top"||r==="net-bottom"?l="front":(r==="pwr-left-1"||r==="pwr-left-2"||r==="net-right-1"||r==="net-right-2"||Xr(r))&&(l="rear"));let g=a?.kind??Ip(r,e);return {normalizedHandle:r,face:l,kind:g,compatibility:a?.compatibility.length?a.compatibility:Sp(r,g,e)}}function Fp(e,t){if(e.length===0||t.length===0)return true;let o=new Set(t);return e.some(r=>o.has(r))}function ia(e){let t=new Map;for(let o of e)t.set(o.id,o);return t}function na(e,t,o=ia(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=Rn(r,n);if(!a){let O=ko(r,e.sourceHandle),$=ko(n,e.targetHandle),Pe=O.kind,kt=$.kind;if(Pe!=="unknown"&&kt!=="unknown"&&Pe!==kt)return {valid:false,reason:`Cannot connect ${Pe} handle to ${kt} handle`};if(!Fp(O.compatibility,$.compatibility))return {valid:false,reason:`Incompatible endpoints: ${e.sourceHandle} does not match ${e.targetHandle}`};let ct=Pe==="power"&&kt==="power",de=r?.type==="vertical-pdu"||n?.type==="vertical-pdu";if(ct&&!de)return {valid:false,reason:"Power connections must include a PDU endpoint"}}let i=pe(r,e.sourceHandle),s=pe(n,e.targetHandle),c=false,l=false;for(let O of t.edges)if(!(e.ignoreEdgeId&&O.id===e.ignoreEdgeId)&&(!c&&O.source===e.source&&(c=pe(r,O.sourceHandle)===i),!c&&O.target===e.source&&(c=pe(r,O.targetHandle)===i),!l&&O.target===e.target&&(l=pe(n,O.targetHandle)===s),!l&&O.source===e.target&&(l=pe(n,O.sourceHandle)===s),c&&l))break;if((c||l)&&!a)return c?{valid:false,reason:`Source handle ${e.sourceHandle} on node ${e.source} is already connected`}:{valid:false,reason:`Target handle ${e.targetHandle} on node ${e.target} is already connected`};let g=(O,$)=>(O?.type==="tube"||O?.type==="cable")&&!!$&&$.startsWith("fiber-"),f=(O,$)=>(O?.type==="tube"||O?.type==="multi-tube-cable")&&!!$&&$.startsWith("tube-"),u=(O,$)=>O?.type==="multi-tube-cable"&&!!$&&$.startsWith("tube-"),p=(O,$)=>O?.type==="tube"&&!!$&&$.startsWith("tube-"),h=(O,$)=>(O?.type==="cable"||O?.type==="multi-tube-cable")&&$==="cable-button",x=(O,$)=>O?.type==="splice"&&($==="left"||$==="right"),y=(O,$)=>O?.type==="coupler"&&!!$&&($.startsWith("left-")||$.startsWith("right-")),N=(O,$)=>{if(O?.type!=="fibre-split"||!$)return false;let Pe=pe(O,$);return Pe.startsWith("input-")||Pe.startsWith("output-")},D=(O,$)=>O?.type==="fibre-split"&&!!$&&pe(O,$).startsWith("output-");if(!a)return {valid:true};if(r?.type==="splice"&&n?.type==="splice"){let O=r.data?.mode==="ribbon",$=n.data?.mode==="ribbon";if(O!==$)return {valid:false,reason:"Ribbon splices can only connect to other ribbon splices"}}let C=g(r,e.sourceHandle),P=g(n,e.targetHandle),k=x(r,e.sourceHandle),E=x(n,e.targetHandle),_=y(r,e.sourceHandle),A=y(n,e.targetHandle),F=N(r,e.sourceHandle),L=N(n,e.targetHandle),z=D(r,e.sourceHandle),U=D(n,e.targetHandle),j=h(r,e.sourceHandle),re=h(n,e.targetHandle),se=u(r,e.sourceHandle),S=u(n,e.targetHandle),M=p(r,e.sourceHandle),te=p(n,e.targetHandle),Z=f(r,e.sourceHandle),X=f(n,e.targetHandle);return C&&E||P&&k||(k&&(A||L)||E&&(_||z))||(_&&(A||L||E)||A&&(_||F||k))||(z&&(E||P||A)||U&&(k||C||_))||j&&re||(se&&te||S&&M)?{valid:true}:Z&&X?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}function Hp(e,t){if(!t)return;let o=ko(t,e).face;return o==="front"||o==="rear"?o:void 0}function aa(e={},t={}){let o={nodes:e.nodes??[],edges:e.edges??[],debug:e.debug??false},r=ia(o.nodes),n=new Set;return {getState:()=>o,setState:u=>{o={...o,...u},u.nodes&&(r=ia(o.nodes)),n.forEach(p=>p(o));},subscribe:u=>(n.add(u),()=>n.delete(u)),selectEdgeZIndex:u=>{let p=D=>{if(typeof D.parentId=="string")return D.parentId;let C=D.parentNode;if(typeof C=="string")return C},h=D=>{let C=p(D),P=C?r.get(C):void 0;return P?.type!=="rack"?[D.data?.face||Wo(D.data)]:P&&_e(P.data)?Uo(ot(D.data)):[D.data?.face||Wo(D.data)]},x=(D,C)=>{let P=r.get(D);if(!(!!P&&(P.type==="device"||P.type==="server"||P.type==="switch"||P.type==="router"))||!P||P.data?.deviceType?.toLowerCase().replace(/_/g,"-")==="patch-panel")return;let _=h(P),A=Hp(C||"",P);if(A)return _.includes(A)?1e3:500;let F=(C||"").toString().replace(/-(source|target)$/i,""),L=F.toLowerCase(),z=L.startsWith("pwr")||L.startsWith("power"),U=L.startsWith("net-")||L.startsWith("port-")||L.startsWith("uplink-")||L.includes("fiber")||L.includes("ports"),j=/^[A-Z0-9]+-\d+$/i.test(F)&&!L.startsWith("pwr")&&!L.startsWith("power"),re=U||j;if(z)return _.includes("rear")?1e3:500;if(re)return _.includes("front")?1e3:500},y=x(u.target,u.targetHandle);if(y!==void 0)return y;let N=x(u.source,u.sourceHandle);return N!==void 0?N:1e3},validateConnection:u=>{let p=t.validateConnection||na;return p===na?na(u,o,r):p(u,o)},selectNodeById:u=>r.get(u),selectConnectedEdges:u=>o.edges.filter(p=>p.source===u||p.target===u)}}var Mp=e=>e,Ap=e=>e.nodes,$p=e=>e.edges;function sa(e,t){let o=useCallback(n=>e.subscribe(a=>n()),[e]),r=useCallback(()=>t(e.getState()),[e,t]);return useSyncExternalStore(o,r,r)}function Lp(e){return sa(e,Mp)}function ca(e){return sa(e,Ap)}function da(e){return sa(e,$p)}function lc(e){return e.selectEdgeZIndex}function Le(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,l=a==="source"?o.source:o.target;if(!c||!l)return null;let g=Ge(c),f=t.find(N=>i==="source"?N.source===l&&Ge(N.sourceHandle)===g:N.target===l&&Ge(N.targetHandle)===g);if(!f)return null;let u=t.filter(N=>N.id!==f.id),p=addEdge(o,u),h=p[p.length-1],x=n({...o,id:h.id,type:r}),y={...h,type:r,zIndex:x,style:{...h.style,zIndex:x},data:s!==void 0?s:h.data};return [...p.slice(0,-1),y]}function Op(e,t){return !e||!t?"unknown":ko(e,t).kind}function Po(e,t){return Op(e,t)==="power"}var Wp=.25;function Ir(e){return (e.highlightedNodeIds?.length??0)>0||(e.highlightedEdgeIds?.length??0)>0}function uc(e,t){return Ir(t)?t.highlightedNodeIds?.includes(e)??false:true}function pc(e,t,o){return !Ir(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 fc(e){return typeof e!="number"||Number.isNaN(e)?.25:Math.min(1,Math.max(0,e))}function la(e,t){if(!t.dimUnhighlighted||!Ir(t))return e;let o=fc(t.dimOpacity);return e.map(r=>uc(r.id,t)?r:{...r,style:{...r.style??{},opacity:o}})}function ua(e,t){if(!t.dimUnhighlighted||!Ir(t))return e;let o=fc(t.dimOpacity);return e.map(r=>pc(r.id,r,t)?r:{...r,style:{...r.style??{},opacity:o},data:{...r.data??{},opacity:o}})}var zp=new Set(["device","server","switch","router","patch-panel"]);function gc(e){return e.type?zp.has(e.type)||ao(e.type):false}var pa=(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 fa(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,l)=>{let g=o[l];return g?.id===c.id&&g.data===c.data&&pa(g,c)?g:(i=true,c)});return i?s:o}let n=false,a=e.map((i,s)=>{if(!gc(i)){let l=o?.[s];return l?.id===i.id&&l.data===i.data&&pa(l,i)?l:(l!==i&&(n=true),i)}let c=i.data??{};if(c.showDeviceImages!==void 0){let l=o?.[s];return l?.id===i.id&&l.data===i.data&&pa(l,i)?l:(l!==i&&(n=true),i)}return n=true,{...i,data:{...c,showDeviceImages:r}}});return !n&&o?o:a}function hc(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}function yc(e,t,o,r,n,a,i){let s=false,c=false;for(let l of e)if(!s&&t&&l.source===t&&(s=pe(o,l.sourceHandle)===r),!s&&t&&l.target===t&&(s=pe(o,l.targetHandle)===r),!c&&n&&l.target===n&&(c=pe(a,l.targetHandle)===i),!c&&n&&l.source===n&&(c=pe(a,l.sourceHandle)===i),s&&c)break;return {source:s,target:c}}function wc(e,t,o,r){let n=`edge-${e.source}-${e.sourceHandle}-${e.target}-${e.targetHandle}-${Date.now()}`,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??{}}}var qe=({type:e,children:t})=>{let o=xe.useRef(null),r=xe.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 xe.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})},of=(e,t,o)=>({rack:r=>jsx(qe,{type:"rack",children:jsx(pi,{...r,onFaceChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsx(qe,{type:"fiber",children:jsx(fi,{...r})}),device:r=>jsx(qe,{type:"device",children:jsx(Ko,{...r})}),server:r=>jsx(qe,{type:"server",children:jsx(Ko,{...r})}),switch:r=>jsx(qe,{type:"switch",children:jsx(Ko,{...r})}),router:r=>jsx(qe,{type:"router",children:jsx(Ko,{...r})}),"vertical-pdu":r=>jsx(qe,{type:"vertical-pdu",children:jsx(vi,{...r})}),splice:r=>jsx(qe,{type:"splice",children:jsx(Fi,{...r})}),"splice-tray":r=>jsx(qe,{type:"splice-tray",children:jsx($i,{...r})}),tube:r=>jsx(qe,{type:"tube",children:jsx(Li,{...r})}),cable:r=>jsx(qe,{type:"cable",children:jsx(Wi,{...r})}),"multi-tube-cable":r=>jsx(qe,{type:"multi-tube-cable",children:jsx(Gi,{...r})}),coupler:r=>jsx(qe,{type:"coupler",children:jsx(Ui,{...r})}),"patch-panel":r=>jsx(qe,{type:"patch-panel",children:jsx(Zi,{...r})}),closure:r=>jsx(qe,{type:"closure",children:jsx(ea,{...r})}),"fibre-split":r=>jsx(qe,{type:"fibre-split",children:jsx(oa,{...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 Sr(e){return e?.face==="front"||e?.face==="rear"?e.face:Wo(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&&!Po(t,r)&&(r=Ct(r)),Nc(o)&&n&&!Po(o,n)&&(n=`${Ct(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var rf={fiber:sn,ethernet:sn,power:mi,smoothstep:ss,step:ls,"thick-cable":fs},nf=8192,af=8192,sf=2048,cf=4;function Fr(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function df(e){if(e)return {...e,width:Fr(e.width,1,nf),height:Fr(e.height,1,af),padding:Fr(e.padding,0,sf),pixelRatio:Fr(e.pixelRatio,.1,cf),quality:Fr(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:l,nodeTypes:g,edgeTypes:f,onConnect:u,onEdgeUpdate:p,isValidConnection:h,connectionMode:x,onFaceChange:y,onRackFaceChange:N,className:D,style:C,alignRacksToBottom:P,reAssignable:k=true,colorMode:E="dark",onInit:_,onFlowMethods:A,showDownloadButton:F=false,downloadButtonPosition:L="top-right",downloadButtonText:z="Download Image",downloadButtonStyle:U,useSmoothstepEdgesForTubes:j=false,readOnly:re=false,interaction:se,actionPanel:S,fitViewOptions:M,onlyRenderVisibleElements:te=false,highlightedNodeIds:Z,highlightedEdgeIds:X,dimUnhighlighted:J,dimOpacity:ke,connectEdgesToHighlightedNodes:ie,showDeviceImages:Te,highlightedPortHandles:me,onPortClick:ce})=>{let O=useCallback((d,m)=>{let w=new Map,b=[],R=[],v=new Map(m.map(H=>[H.id,H])),B=(H,I)=>!H||!I?false:!!(H.startsWith("tube-")||I.type==="splice"&&(H==="left"||H==="right")||H==="cable-button");for(let H of d){if(!H.source||!H.target){s&&console.warn("Invalid edge skipped (missing source/target):",H);continue}let I=v.get(H.source),Y=v.get(H.target),ae=H.sourceHandle?`${H.source}:${H.sourceHandle}`:void 0,Ee=ae?w.get(ae):void 0,nt=H.sourceHandle?B(H.sourceHandle,I):false,ze=H.targetHandle?`${H.target}:${H.targetHandle}`:void 0,Xe=ze?w.get(ze):void 0,ht=H.targetHandle?B(H.targetHandle,Y):false;if(Ee&&!nt){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:ae,existingEdge:Ee.id,duplicateEdge:H.id}),R.push(H);continue}if(Xe&&!ht){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:ze,existingEdge:Xe.id,duplicateEdge:H.id}),R.push(H);continue}b.push(H),ae&&!Ee&&w.set(ae,H),ze&&!Xe&&w.set(ze,H);}return s&&R.length>0&&console.log(`Filtered ${R.length} duplicate edge(s) from initial edges`),b},[s]),$=Array.isArray(e)&&Array.isArray(t),Pe=xe.useMemo(()=>$?e||[]:o||e||[],[$,e,o]),kt=xe.useMemo(()=>$?t||[]:r||t||[],[$,t,r]),ct=xe.useMemo(()=>O(kt,Pe),[kt,Pe,O]),de=xe.useMemo(()=>i||aa({nodes:ui(Pe),edges:ct,debug:s}),[i,$,s,ct]),Qt=ca(de),eo=da(de),[Ie,Me]=useNodesState(Qt),[ft,dt,to]=useEdgesState(eo),fe=lc(de),gt=useRef(null),[Je,Gn]=useState(false);useEffect(()=>{let d=()=>{Gn(window.innerWidth<=768||/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));};return d(),window.addEventListener("resize",d),()=>window.removeEventListener("resize",d)},[]);let Ce=re===true,Se=useMemo(()=>{let m={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!Je,edgesFocusable:!Je,edgesReconnectable:true,connectOnClick:true,panOnDrag:true,panOnScroll:!Je,zoomOnScroll:!Je,zoomOnPinch:!Je,zoomOnDoubleClick:!Je,allowKeyboardDelete:true,showControls:true,showMiniMap:!Je,showInteractiveControl:true},...se??{}};return Ce?{...m,nodesDraggable:false,nodesConnectable:false,elementsSelectable:m.elementsSelectable!==false,edgesFocusable:false,edgesReconnectable:false,connectOnClick:false,allowKeyboardDelete:false,showInteractiveControl:false}:m},[Je,se,Ce]),Co=useMemo(()=>({enabled:S?.enabled??true,showRearToggle:S?.showRearToggle??true,showDeRack:S?.showDeRack??true}),[S]),{toObject:Ro,setViewport:Eo,setNodes:oo,setEdges:ir,getNodes:Q,getEdges:be,fitView:Fe,flowToScreenPosition:Ae,getIntersectingNodes:mt}=useReactFlow(),Qe=useRef(n),ro=useRef(a),ar=useRef($),vo=useRef(de),Pt=useRef({toObject:Ro,setViewport:Eo,setReactFlowNodes:oo,setReactFlowEdges:ir,getNodes:Q,getEdges:be,fitView:Fe});useEffect(()=>{Qe.current=n;},[n]),useEffect(()=>{ro.current=a;},[a]),useEffect(()=>{ar.current=$;},[$]),useEffect(()=>{vo.current=de;},[de]),useEffect(()=>{Pt.current={toObject:Ro,setViewport:Eo,setReactFlowNodes:oo,setReactFlowEdges:ir,getNodes:Q,getEdges:be,fitView:Fe};},[Ro,Eo,oo,ir,Q,be,Fe]);let sr=useMemo(()=>({toObject:()=>Pt.current.toObject(),setViewport:d=>{Pt.current.setViewport(d);},setNodes:d=>{if(Pt.current.setReactFlowNodes(d),ar.current){Qe.current?.(d);return}vo.current.setState({nodes:d});},setEdges:d=>{if(Pt.current.setReactFlowEdges(d),ar.current){ro.current?.(d);return}vo.current.setState({edges:d});},toImage:d=>gt.current?toPng(gt.current,df(d)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>Pt.current.getNodes(),getEdges:()=>Pt.current.getEdges(),fitView:d=>{let{fitView:m,getNodes:w}=Pt.current;if(d?.nodes&&Array.isArray(d.nodes)&&d.nodes.length>0){let v=d.nodes.map(I=>w().find(Y=>Y.id===I)).filter(I=>I!==void 0),{nodes:B,...H}=d;m({...H,nodes:v});return}let{nodes:b,...R}=d||{};m(R);}}),[]);useEffect(()=>{A?.(sr);},[A,sr]);let[Dt,Mr]=useState(false),Re=useCallback(()=>{if(!Dt){if(!gt.current){s&&console.error("ReactFlow wrapper ref is not available");return}Mr(true),toPng(gt.current,{filter:d=>!(d?.classList?.contains("react-flow__minimap")||d?.classList?.contains("react-flow__controls")||d?.classList?.contains("react-flow__attribution")||d?.classList?.contains("react-networks-attribution")||d?.classList?.contains("download-button")||d?.tagName==="BUTTON"),backgroundColor:E==="light"?"#ffffff":"#1a1a1a",pixelRatio:2}).then(d=>{let m=document.createElement("a");m.download=`network-diagram-${new Date().toISOString().split("T")[0]}.png`,m.href=d,m.click();}).catch(d=>{s&&console.error("Error downloading image:",d);}).finally(()=>{Mr(false);});}},[E,s,Dt]),[Oe,he]=useState(null),Ar=useRef(null),Ft=useRef(y),Ut=useRef(N);useEffect(()=>{Ft.current=y;},[y]),useEffect(()=>{Ut.current=N;},[N]),useEffect(()=>{Ar.current=Oe;},[Oe]);let et=useCallback((d,m)=>{Ft.current?.(d,m);},[]),it=useCallback((d,m)=>{Ut.current?.(d,m);},[]),cr=useCallback(()=>Ar.current,[]),Un=useMemo(()=>({...of(et,it,cr),...g??{}}),[et,it,cr,g]),Vn=useMemo(()=>({...rf,...f??{}}),[f]),$r=useMemo(()=>({zIndex:1e3,reconnectable:Se.edgesReconnectable}),[Se.edgesReconnectable]),Io=useMemo(()=>({hideAttribution:true}),[]),tt=useRef(Ie);useEffect(()=>{tt.current=Ie;},[Ie]);let K=useRef(ft);useEffect(()=>{K.current=ft;},[ft]),useEffect(()=>{Me(Qt);},[Qt,Me]),useEffect(()=>{dt(eo);},[eo,dt]),useEffect(()=>{if($&&t){let d=O(t,e||[]);d.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-d.length} duplicate(s) removed`),a?.(d));}},[$,t,e,O,a,s]),useEffect(()=>{$&&de.setState({nodes:Dc(e||[],de.getState().nodes)});},[$,e,de]),useEffect(()=>{$&&de.setState({edges:Tc(t||[],de.getState().edges)});},[$,t,de]),useEffect(()=>{if(!P||!Ie||Ie.length===0||Ie.some(I=>I.dragging))return;let d=Ie.filter(I=>I.type==="rack");if(d.length===0)return;let m=d.map(I=>{let Y=Et(I.data).height;return (I.position?.y||0)+Y}),w=Math.min(...m),b=Math.max(...m);if(b-w<20)return;let v=b,B=Ie.map(I=>{if(I.type!=="rack")return I;let Y=Et(I.data).height,ae=(I.position?.y||0)+Y,Ee=v-ae;return Math.abs(Ee)<5?I:{...I,position:{x:I.position?.x||0,y:(I.position?.y||0)+Ee}}});if(B.some((I,Y)=>{let ae=Ie[Y]?.position,Ee=I.position;return ae?.x!==Ee?.x||ae?.y!==Ee?.y})){if($){n?.(B);return}de.setState({nodes:B});}},[P,Ie,$,n,de]);let So=useRef(new Map);useEffect(()=>{let d=new Map;Ie.forEach(m=>{d.set(m.id,m);}),So.current=d;},[Ie]);let ne=useCallback(d=>So.current.get(d),[]),je=useCallback(d=>{if(!d)return;if(typeof d.parentId=="string")return d.parentId;let m=d.parentNode;if(typeof m=="string")return m},[]),We=useCallback(d=>{let m=je(d);if(!m)return;let w=ne(m);if(!(!w||w.type!=="rack"))return w},[ne,je]),Ht=useCallback(d=>!d||d.type!=="rack"?false:_e(d.data),[]),Vt=useCallback(d=>{if(!d||!so(d))return false;let m=We(d);return m?_e(m.data):false},[We]),no=useCallback(d=>{tt.current=d;let m=new Map;d.forEach(w=>{m.set(w.id,w);}),So.current=m,Me(d),$?n?.(d):de.setState({nodes:d});},[$,de,Me,n]),le=useCallback(d=>{K.current=d,dt(d),$?a?.(d):de.setState({edges:d});},[$,de,dt,a]),Ne=useCallback(d=>{if(d.positionAbsolute)return d.positionAbsolute;let m=d.position?.x||0,w=d.position?.y||0,b=je(d),R=new Set;for(;b&&!R.has(b);){R.add(b);let v=ne(b);if(!v)break;if(v.positionAbsolute){m+=v.positionAbsolute.x,w+=v.positionAbsolute.y;break}m+=v.position?.x||0,w+=v.position?.y||0,b=je(v);}return {x:m,y:w}},[ne,je]),_t=useCallback(d=>{let m=Ne(d),w=d.width||0,b=d.height||0;return {x:m.x+w/2,y:m.y+b/2}},[Ne]),Lr=useCallback((d,m)=>{let w=mt({x:d.x,y:d.y,width:1,height:1},true).filter(v=>v.id!==m&&v.type==="rack"),b=null,R=1/0;for(let v of w){let B=Math.hypot(d.x-v.position.x,d.y-v.position.y);B<R&&(R=B,b=v);}return b},[mt]),ka=useCallback(d=>Et(d.data),[]),Fo=useCallback((d,m,w)=>{let{width:b,height:R}=ka(d),v=m.width||0,B=m.height||0,H=Math.max(0,b-v),I=m.type==="vertical-pdu"?60:0,Y=Math.max(I,R-B);return {x:Math.max(0,Math.min(w.x,H)),y:Math.max(I,Math.min(w.y,Y))}},[ka]),dr=useCallback((d,m)=>{if(!d||!m)return;let w=ne(d);if(!w)return;let b=m.replace(/-(source|target)$/i,"");if(w.type==="fibre-split"&&b.startsWith("output-"))for(let v of K.current){if(v.target!==d||!(v.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"))continue;let B=v.data?.color;if(B)return {color:B}}if((w.type==="tube"||w.type==="cable")&&m.startsWith("fiber-")){let v=m.replace("fiber-",""),B=parseInt(v,10);if(B>=1&&B<=24){let H=fo(B),I=B>12;return {color:H,striped:I}}}if((w.type==="multi-tube-cable"||w.type==="tube")&&m.startsWith("tube-")){let v=m.replace("tube-",""),B=parseInt(v,10);if(B>=1&&B<=24){let H=Ke(B),I=B>12;return {color:H,striped:I}}}let R=w.data;if(R.color)return {color:R.color}},[ne]),Pa=useRef(new Map);useEffect(()=>{dt(d=>{let m=false,w=d.map(b=>{let R=fe(b);return Pa.current.get(b.id)!==R?(m=true,Pa.current.set(b.id,R),{...b,zIndex:R,style:{...b.style,zIndex:R}}):b});return m?w:d});},[Ie,dt,fe]),useEffect(()=>{let d=Ie.map(w=>{if(w.type==="coupler"&&w.parentId){let b=ne(w.parentId);if(b&&(b.type==="patch-panel"||b.type==="closure")&&(!w.extent||w.extent!=="parent"))return {...w,extent:"parent"}}if(w.type==="splice"&&w.parentId&&w.data.holderPosition&&(!w.position||w.position.x===0&&w.position.y===0)){let b=ne(w.parentId);if(b&&b.type==="splice-tray"){let R=w.data.mode==="ribbon",v=Rr(b,w.data.holderPosition,R);return {...w,position:v}}}if(so(w)&&w.parentId&&w.data.uPosition&&(!w.position||w.position.x===0&&w.position.y===0)){let b=ne(w.parentId);if(b){let R=w.data.uHeight||1,v=Vo(b,w.data.uPosition,R,w.data);return {...w,position:v}}}if(w.type==="vertical-pdu"&&w.parentId){let b=ne(w.parentId);if(b&&b.type==="rack"){let R=Fo(b,w,w.position||{x:0,y:60});if(w.extent!=="parent"||!w.position||w.position.x!==R.x||w.position.y!==R.y)return {...w,extent:"parent",position:R}}}return w});d.some((w,b)=>{let R=Ie[b];return w.extent!==R.extent||w.position?.x!==R.position?.x||w.position?.y!==R.position?.y})&&Me(d);},[Ie,Me,ne,Fo]);let Da=useCallback(d=>{if(Ce)return null;let m=new Map,w=new Map,b=new Set,R=d.map(H=>{if(H.type==="position"&&H.position){let I=ne(H.id);if(I&&I.type==="coupler"&&I.parentId){let Y=ne(I.parentId);if(Y&&(Y.type==="patch-panel"||Y.type==="closure"))return (!I.extent||I.extent!=="parent")&&b.add(I.id),{...H,position:I.position||{x:0,y:0}}}if(I&&(I.type==="tube"||I.type==="splice-tray")&&I.parentId){let Y=ne(I.parentId);if(Y&&Y.type==="closure")return (!I.extent||I.extent!=="parent")&&b.add(I.id),{...H,position:I.position||{x:0,y:0}}}if(I&&I.type==="splice"&&I.parentId){let Y=ne(I.parentId);if(Y&&Y.type==="splice-tray"){let ae=_i(I,Y,H.position,tt.current);return ae.holderPosition!==void 0&&m.set(I.id,ae.holderPosition),{...H,position:{x:ae.x,y:ae.y}}}}if(I&&so(I)&&I.parentId){let Y=ne(I.parentId);if(Y&&Y.type==="rack"){let ae=on(I,Y,H.position,tt.current);return ae.uPosition!==void 0&&w.set(I.id,ae.uPosition),{...H,position:{x:ae.x,y:ae.y}}}}if(I&&I.type==="vertical-pdu"&&I.parentId){let Y=ne(I.parentId);if(Y&&Y.type==="rack")return (!I.extent||I.extent!=="parent")&&b.add(I.id),{...H,position:Fo(Y,I,H.position)}}}return H}),v=applyNodeChanges(R,tt.current).map(H=>{let I=H;b.has(H.id)&&(I={...I,extent:"parent"});let Y=m.get(H.id);Y!==void 0&&(I={...I,data:{...I.data,holderPosition:Y}});let ae=w.get(H.id);return ae!==void 0&&(I={...I,data:{...I.data,uPosition:ae}}),I});v=ui(v),tt.current=v;let B=new Map;return v.forEach(H=>{B.set(H.id,H);}),So.current=B,Me(v),v},[Me,ne,Ce,Fo]),pd=useCallback((d,m)=>{he(null);},[]),fd=useCallback((d,m,w)=>{let b=je(m);if(!k||!Go(m)||b){he(null);return}let R=_t(m),B=Lr(R,m.id)?.id??null;he(H=>H===B?H:B);},[k,_t,je,Lr]),gd=useCallback((d,m,w)=>{he(null);let b=je(m);if(!k||!Go(m)||b)return;let R=Ne(m),v=_t(m),B=Lr(v,m.id),H=tt.current;if(!B)return;let I={x:R.x-B.position.x,y:R.y-B.position.y},Y=Fo(B,m,I);if(m.type==="vertical-pdu"){let G=H.map(ye=>ye.id!==m.id?ye:{...ye,parentId:B.id,extent:"parent",position:Y,data:{...ye.data,rackLayout:_e(B.data)?"split-face":"single-face",rackWidthPx:Rt(B.data),rackFaceGapPx:Lt(B.data)}});no(G);return}let ae=H.find(G=>G.id===m.id)||m,Ee=_e(B.data),nt=Rt(B.data),ze=Lt(B.data),Xe=Ee?Ka(ae.data,I.x,nt,ze):"both",ht=Ee&&Xe==="front"?nt+ze:0,Ye=Xe==="rear"?"rear":Xe==="front"?"front":Sr(ae.data),at={...ae,parentId:B.id,extent:"parent",position:{x:ht,y:I.y},data:{...ae.data,rackLayout:Ee?"split-face":"single-face",rackWidthPx:nt,rackFaceGapPx:ze,mountMode:Xe,face:Ye}},Mt=H.filter(G=>G.id!==m.id).concat(at),yt=on(at,B,at.position,Mt);if(yt.uPosition===void 0||!co(B,at,yt.uPosition,Mt))return;let Tt=H.map(G=>G.id!==m.id?G:{...G,parentId:B.id,extent:"parent",position:{x:yt.x,y:yt.y},data:{...G.data,rackLayout:Ee?"split-face":"single-face",rackWidthPx:nt,rackFaceGapPx:ze,mountMode:Xe,face:Ye,uPosition:yt.uPosition??G.data.uPosition}});no(Tt);},[k,Ne,_t,no,je,Fo,Lr]),md=useCallback(d=>{if(!d.source||!d.target||!d.sourceHandle||!d.targetHandle)return true;let m=ne(d.source),w=ne(d.target),b=pe(m,d.sourceHandle),R=pe(w,d.targetHandle),v=yc(K.current,d.source,m,b,d.target,w,R),B=v.source,H=v.target;if(B&&s&&console.log("Connection will replace: Source handle already connected",{source:d.source,sourceHandle:d.sourceHandle,existingEdges:K.current.filter(W=>W.source===d.source&&W.sourceHandle===d.sourceHandle||W.target===d.source&&W.targetHandle===d.sourceHandle)}),H&&s&&console.log("Connection will replace: Target handle already connected",{target:d.target,targetHandle:d.targetHandle,existingEdges:K.current.filter(W=>W.target===d.target&&W.targetHandle===d.targetHandle||W.source===d.target&&W.sourceHandle===d.targetHandle)}),!Rn(m,w))return true;if(m?.type==="splice"&&w?.type==="splice"){let W=m.data?.mode==="ribbon",oe=w.data?.mode==="ribbon";if(W!==oe)return s&&console.log("Connection rejected: Ribbon splices can only connect to other ribbon splices",d),false}let Y=(W,oe)=>(W?.type==="tube"||W?.type==="cable")&&!!oe&&oe.startsWith("fiber-"),ae=(W,oe)=>(W?.type==="tube"||W?.type==="multi-tube-cable")&&!!oe&&oe.startsWith("tube-"),Ee=(W,oe)=>W?.type==="multi-tube-cable"&&!!oe&&oe.startsWith("tube-"),nt=(W,oe)=>W?.type==="tube"&&!!oe&&oe.startsWith("tube-"),ze=(W,oe)=>(W?.type==="cable"||W?.type==="multi-tube-cable")&&oe==="cable-button",Xe=(W,oe)=>W?.type==="splice"&&(oe==="left"||oe==="right"),ht=(W,oe)=>W?.type==="coupler"&&!!oe&&(oe.startsWith("left-")||oe.startsWith("right-")),Ye=(W,oe)=>{if(W?.type!=="fibre-split"||!oe)return false;let wt=oe.replace(/-(source|target)$/i,"");return wt.startsWith("input-")||wt.startsWith("output-")},at=(W,oe)=>W?.type!=="fibre-split"||!oe?false:oe.replace(/-(source|target)$/i,"").startsWith("output-"),Mt=Y(m,d.sourceHandle),yt=Y(w,d.targetHandle),Tt=Xe(m,d.sourceHandle),G=Xe(w,d.targetHandle),ye=ht(m,d.sourceHandle),ue=ht(w,d.targetHandle),Or=Ye(m,d.sourceHandle),Wr=Ye(w,d.targetHandle),Mo=at(m,d.sourceHandle),ur=at(w,d.targetHandle),zr=ze(m,d.sourceHandle),Kn=ze(w,d.targetHandle),qn=Ee(m,d.sourceHandle),Gr=Ee(w,d.targetHandle),Ao=nt(m,d.sourceHandle),$o=nt(w,d.targetHandle),Ur=ae(m,d.sourceHandle),Zn=ae(w,d.targetHandle);return Mt&&G||yt&&Tt||(Tt&&(ue||Wr)||G&&(ye||Mo))||(ye&&(ue||Wr||G)||ue&&(ye||Or||Tt))||(Mo&&(G||yt||ue)||ur&&(Tt||Mt||ye))||zr&&Kn||(qn&&$o||Gr&&Ao)?true:Ur&&Zn?(s&&console.log("Connection rejected: Tube handles can only connect between cable and tube nodes",d),false):(s&&console.log("Connection rejected: Connection not allowed by fiber rules",d),false)},[ne,s]),bd=useCallback(d=>{if(Ce)return;s&&console.log("onConnect called:",d);let m=ne(d.source),w=ne(d.target);s&&(console.log("onConnect: sourceNode type:",m?.type,"targetNode type:",w?.type),console.log("onConnect: sourceHandle:",d.sourceHandle,"targetHandle:",d.targetHandle));let b=kc(d,m,w),R=de.validateConnection({source:b.source??null,target:b.target??null,sourceHandle:b.sourceHandle,targetHandle:b.targetHandle});if(!R.valid&&!(R.reason??"").includes("already connected")){s&&console.warn(`Connection rejected: ${R.reason}`);return}let v=m?.type==="vertical-pdu",B=m?.type==="vertical-pdu"||w?.type==="vertical-pdu",H=Po(m,b.sourceHandle),I=Po(w,b.targetHandle),Y=H&&I&&B,ae=m?.data,Ee=m?.type==="switch"||m?.type==="device"&&ae?.deviceType==="switch",nt=I,ze=!!b.targetHandle&&(b.targetHandle.startsWith("net-")||b.targetHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(Ct(b.targetHandle))),Xe=!!b.sourceHandle&&(b.sourceHandle.startsWith("net-")||b.sourceHandle.startsWith("port-")||/^[A-Z0-9]+-\d+$/i.test(Ct(b.sourceHandle))),ht=w?.type==="switch"||w?.type==="device"&&w.data?.deviceType==="switch",Ye=w?.type==="vertical-pdu",at=H,Mt=m?.type==="tube"&&w?.type==="multi-tube-cable",yt=m?.type==="multi-tube-cable"&&w?.type==="tube",Tt=Mt||yt,G=b.sourceHandle==="cable-button"&&b.targetHandle==="cable-button",ye="fiber";Y?ye="power":G?ye="thick-cable":Tt&&(ye=j?"smoothstep":"fiber");let ue,Or=hc(w),Wr=hc(m);if(Or||Wr){let T=w?.data,V=m?.data,W=Or?T.ribbonFiberIds:V.ribbonFiberIds;W&&Array.isArray(W)&&W.length>=6&&W.length<=12&&(ue={ribbonFiberIds:W,isRibbon:true});}if(!ue&&(ye==="fiber"||ye==="smoothstep")&&!v){let T;Mt?T=dr(b.target,b.targetHandle):T=dr(b.source,b.sourceHandle),T&&(ue={color:T.color,striped:T.striped,isRibbon:false});}else if(ye==="thick-cable"&&G){let T=m?.data;ue={color:T?.color||(T?.tubeStartIndex?Ke(T.tubeStartIndex):"#6366f1")};}let Mo=pe(m,b.sourceHandle),ur=pe(w,b.targetHandle),zr=yc(K.current,b.source,m,Mo,b.target,w,ur),Kn=zr.source,qn=zr.target;if(Kn||qn){let T=new Set;for(let V of K.current){if(V.source===b.source&&pe(m,V.sourceHandle)===Mo){T.add(V.id);continue}if(V.target===b.source&&pe(m,V.targetHandle)===Mo){T.add(V.id);continue}if(V.source===b.target&&pe(w,V.sourceHandle)===ur){T.add(V.id);continue}V.target===b.target&&pe(w,V.targetHandle)===ur&&T.add(V.id);}if(T.size>0){let V=K.current.filter(oe=>!T.has(oe.id)),W=addEdge(b,V);if(W.length===V.length)s&&console.warn("Handle replacement skipped: addEdge did not create a new edge",b);else {let oe=W[W.length-1],wt=fe({...b,id:oe.id,type:ye}),pr={...oe,type:ye,zIndex:wt,style:{...oe.style,zIndex:wt},data:ue!==void 0?ue:oe.data};le([...W.slice(0,-1),pr]),s&&console.log("Handle replacement: Replaced",T.size,"edge(s)");return}}}if(w?.type==="splice"&&(d.targetHandle==="left"||d.targetHandle==="right")&&d.target&&d.targetHandle){let T=K.current.find(V=>V.target===d.target&&V.targetHandle===d.targetHandle||V.source===d.target&&V.sourceHandle===d.targetHandle);if(T){s&&(console.log("Splice target handle replacement: Found existing edge",T.id,"on splice handle",d.targetHandle),console.log("Existing edge details:",{id:T.id,source:T.source,target:T.target,sourceHandle:T.sourceHandle,targetHandle:T.targetHandle,data:T.data}));let V=d.source&&d.sourceHandle?K.current.find(At=>At.source===d.source&&At.sourceHandle===d.sourceHandle):null;s&&V&&console.log("Splice target handle replacement: Also found existing source edge",V.id);let W=new Set;T&&W.add(T.id),V&&V.id!==T.id&&W.add(V.id);let oe=K.current.filter(At=>!W.has(At.id));s&&console.log("Splice target handle replacement: Removing",W.size,"edge(s), creating new connection");let wt=wc(d,"fiber",fe,ue),pr=[...oe,wt];le(pr),s&&console.log("Splice target handle replacement: Successfully replaced edge with new edge",wt.id);return}}if(m?.type==="splice"&&d.sourceHandle==="right"&&d.source&&d.sourceHandle){let T=K.current.find(V=>V.source===d.source&&V.sourceHandle===d.sourceHandle||V.target===d.source&&V.targetHandle===d.sourceHandle);if(T){s&&console.log("Splice source handle replacement: Found existing edge",T.id,"on splice handle",d.sourceHandle);let V=d.target&&d.targetHandle?K.current.find(At=>At.target===d.target&&At.targetHandle===d.targetHandle):null;s&&V&&console.log("Splice source handle replacement: Also found existing target edge",V.id);let W=new Set;T&&W.add(T.id),V&&V.id!==T.id&&W.add(V.id);let oe=K.current.filter(At=>!W.has(At.id));s&&console.log("Splice source handle replacement: Removing",W.size,"edge(s), creating new connection");let wt=wc(d,"fiber",fe,ue),pr=[...oe,wt];le(pr),s&&console.log("Splice source handle replacement: Successfully replaced edge with new edge",wt.id);return}}if((m?.type==="tube"||m?.type==="cable")&&d.sourceHandle?.startsWith("fiber-")&&d.source&&d.sourceHandle){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"source",data:ue});if(T){le(T);return}}if((w?.type==="tube"||w?.type==="cable")&&d.targetHandle?.startsWith("fiber-")&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"target",data:ue});if(T){le(T);return}}if((m?.type==="multi-tube-cable"||m?.type==="tube")&&d.sourceHandle?.startsWith("tube-")&&d.source&&d.sourceHandle){let T=Le({edges:K.current,connection:b,edgeType:ye,selectEdgeZIndex:fe,findBy:"source",data:ue});if(T){le(T);return}}if((w?.type==="multi-tube-cable"||w?.type==="tube")&&d.targetHandle?.startsWith("tube-")&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:ye,selectEdgeZIndex:fe,findBy:"target",data:ue});if(T){le(T);return}}if(m?.type==="coupler"&&(d.sourceHandle?.startsWith("left-")||d.sourceHandle?.startsWith("right-"))){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"source",data:ue});if(T){le(T);return}}if(w?.type==="coupler"&&(d.targetHandle?.startsWith("left-")||d.targetHandle?.startsWith("right-"))){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"target",data:ue});if(T){le(T);return}}if(G&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let T=m?.data,V=T?.color||(T?.tubeStartIndex?Ke(T.tubeStartIndex):"#6366f1"),W=Le({edges:K.current,connection:b,edgeType:"thick-cable",selectEdgeZIndex:fe,findBy:"source",data:{color:V}});if(W){le(W);return}if(W=Le({edges:K.current,connection:b,edgeType:"thick-cable",selectEdgeZIndex:fe,findBy:"target",data:{color:V}}),W){le(W);return}}if(v&&nt&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:"power",selectEdgeZIndex:fe,findBy:"target",data:ue});if(T){le(T);return}}if(Ye&&at&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:"power",selectEdgeZIndex:fe,findBy:"source",matchOn:"target",data:ue});if(T){le(T);return}}if(Ee&&ze&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"target",data:ue});if(T){le(T);return}}if(ht&&Xe&&d.source&&d.sourceHandle&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"target",matchOn:"source",data:ue});if(T){le(T);return}}let Gr=de.validateConnection({source:b.source??null,target:b.target??null,sourceHandle:b.sourceHandle,targetHandle:b.targetHandle});if(!Gr.valid){if(v&&d.source&&d.sourceHandle){let T=Le({edges:K.current,connection:b,edgeType:nt?"power":"fiber",selectEdgeZIndex:fe,findBy:"source",data:ue});if(T){le(T);return}}if(Ye&&d.source&&d.sourceHandle){let T=Le({edges:K.current,connection:b,edgeType:"power",selectEdgeZIndex:fe,findBy:"source",matchOn:"target",data:ue});if(T){le(T);return}}if(Ee&&d.source&&d.sourceHandle){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"source",data:ue});if(T){le(T);return}}if(ht&&d.target&&d.targetHandle){let T=Le({edges:K.current,connection:b,edgeType:"fiber",selectEdgeZIndex:fe,findBy:"target",matchOn:"source",data:ue});if(T){le(T);return}}s&&console.warn(`Connection rejected: ${Gr.reason}`);return}let Ao=false,$o=false;for(let T of K.current)if(!Ao&&(T.source===b.source&&T.sourceHandle===b.sourceHandle||T.target===b.source&&T.targetHandle===b.sourceHandle)&&(Ao=true),!$o&&(T.target===b.target&&T.targetHandle===b.targetHandle||T.source===b.target&&T.sourceHandle===b.targetHandle)&&($o=true),Ao&&$o)break;let Ur=(T,V)=>!T||!V?false:!!(T.startsWith("tube-")||V.type==="splice"&&(T==="left"||T==="right")||T==="cable-button"),Zn=Ur(b.sourceHandle||"",m),Ia=Ur(b.targetHandle||"",w);if(Ao&&!Zn){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:d.source,sourceHandle:b.sourceHandle,existingEdges:K.current.filter(T=>T.source===b.source&&T.sourceHandle===b.sourceHandle||T.target===b.source&&T.targetHandle===b.sourceHandle)});return}if($o&&!Ia){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:b.target,targetHandle:b.targetHandle,existingEdges:K.current.filter(T=>T.target===b.target&&T.targetHandle===b.targetHandle||T.source===b.target&&T.sourceHandle===b.targetHandle)});return}let Sa={...b,type:ye,zIndex:fe({...b,id:"temp-id"}),data:ue},Vr=addEdge(Sa,K.current),jr=Vr[Vr.length-1];jr&&(Ca(T=>new Set(T).add(jr.id)),setTimeout(()=>{Ca(T=>{let V=new Set(T);return V.delete(jr.id),V});},1e3)),le(Vr);},[le,de,fe,ne,s,dr,j,Ce]),hd=useCallback((d,m)=>{if(Ce||!m.source||!m.target||!m.sourceHandle||!m.targetHandle)return;let w=ne(m.source),b=ne(m.target),R=kc(m,w,b),v=pe(w,R.sourceHandle),B=pe(b,R.targetHandle),H=K.current.some(G=>{if(G.id===d.id)return false;let ye=G.source===R.source&&pe(w,G.sourceHandle)===v||G.target===R.source&&pe(w,G.targetHandle)===v,ue=G.target===R.target&&pe(b,G.targetHandle)===B||G.source===R.target&&pe(b,G.sourceHandle)===B;return ye||ue}),I=de.validateConnection({source:R.source??null,target:R.target??null,sourceHandle:R.sourceHandle,targetHandle:R.targetHandle,ignoreEdgeId:d.id});if(!I.valid&&!((I.reason??"").includes("already connected")&&H)){s&&console.warn(`Edge update rejected: ${I.reason}`);return}let Y=w?.type==="vertical-pdu"||b?.type==="vertical-pdu",ae=Po(w,R.sourceHandle),Ee=Po(b,R.targetHandle),nt=ae&&Ee&&Y,ze=w?.type==="tube"&&b?.type==="multi-tube-cable",Xe=w?.type==="multi-tube-cable"&&b?.type==="tube",ht=ze||Xe,Ye;nt?Ye="power":ht?Ye=j?"smoothstep":"fiber":Ye="fiber";let at;if(Ye==="fiber"||Ye==="smoothstep"){let G=dr(R.source,R.sourceHandle);G&&(at={color:G.color,striped:G.striped});}let Tt=K.current.filter(G=>{if(G.id===d.id)return true;let ye=G.source===R.source&&pe(w,G.sourceHandle)===v||G.target===R.source&&pe(w,G.targetHandle)===v,ue=G.target===R.target&&pe(b,G.targetHandle)===B||G.source===R.target&&pe(b,G.sourceHandle)===B;return !(ye||ue)}).map(G=>{if(G.id===d.id){let ye=fe({...R,id:G.id,type:Ye});return {...G,source:R.source,target:R.target,sourceHandle:R.sourceHandle,targetHandle:R.targetHandle,type:Ye,data:at!==void 0?{...G.data,...at}:G.data,zIndex:ye,style:{...G.style,zIndex:ye}}}return G});le(Tt);},[le,ne,dr,fe,j,s,de,Ce]),Ho=useCallback(d=>{Me(m=>{let w=false,b=m.map(R=>{let v=d!==null&&R.id===d;return R.selected===v?R:(w=true,{...R,selected:v})});return w?b:m});},[Me]),yd=useCallback((d,m)=>{if(Je){c&&c(m);return}let w=d.metaKey||d.ctrlKey,b=Q(),R=m,v=je(m);if(m.type==="tube"&&v&&!w){let B=b.find(H=>H.id===v&&(H.type==="cable"||H.type==="multi-tube-cable"));B&&(R=B);}if(jn(R),lr([]),Ho(R.id),w&&so(R)&&!Vt(R)){let B=R.data||{},H=Sr(B),I=H==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${R.id} from ${H} to ${I}`),y&&y(R.id,I);}c&&c(R);},[y,c,s,Q,Je,je,Vt,Ho]),wd=useCallback(()=>{},[]),Nd=useCallback((d,m)=>{jn(null),lr([m]),Ho(null),c?.(null),l&&l(m);},[l,c,Ho]),xd=useCallback(()=>{jn(null),lr([]),Ho(null),c?.(null);},[c,Ho]),[bt,jn]=useState(null),[Ta,Ca]=useState(new Set),[Xn,lr]=useState([]),kd=useCallback(({edges:d})=>{lr(d||[]);},[]);useOnSelectionChange({onChange:kd}),useEffect(()=>{let d=m=>{if(Se.allowKeyboardDelete&&(m.key==="Backspace"||m.key==="Delete")&&Xn.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let w=Xn.filter(b=>{let R=b.sourceHandle||"",v=b.targetHandle||"";return R.startsWith("tube-")||v.startsWith("tube-")?(s&&console.log("Cannot delete edge connected to tube handle",b),false):true});if(w.length>0){let b=new Set(w.map(v=>v.id)),R=K.current.filter(v=>!b.has(v.id));le(R),lr([]),s&&console.log("Deleted edges:",w.map(v=>v.id));}}};return window.addEventListener("keydown",d),()=>window.removeEventListener("keydown",d)},[Xn,le,s,Se.allowKeyboardDelete]);let Pd=useCallback((d,{nodeId:m,handleType:w})=>{s&&console.log("Connection started from",{nodeId:m,handleType:w});},[s]),Dd=useCallback(d=>{s&&console.log("Connection ended",d);},[s]),Td=useCallback(()=>{if(Ce&&!N&&!y||!bt)return;let d=ne(bt.id);if(d){if(d.type==="rack"){let m=d.data||{};if(_e(m))return;let b=(m.face||"front")==="front"?"rear":"front";N?(N(d.id,b),y&&Q().filter(v=>v.parentId===d.id).forEach(v=>{y(v.id,b);})):Me(R=>R.map(v=>v.id===d.id?{...v,data:{...v.data,face:b}}:v.parentId===d.id?{...v,data:xc(v.data,b)}:v));return}if(so(d)){if(Vt(d))return;let m=d.data||{},b=Sr(m)==="front"?"rear":"front";y?y(d.id,b):Me(R=>R.map(v=>v.id===d.id?{...v,data:xc(v.data,b)}:v));}}},[bt,ne,N,y,Me,Q,Ce,Vt]),Cd=useCallback(()=>{if(Ce||!k||!bt||!Go(bt))return;let d=ne(bt.id),m=je(d);if(!d||!Go(d)||!m)return;let w=Ne(d),R=tt.current.map(v=>v.id!==d.id?v:{...v,parentId:void 0,parentNode:void 0,extent:void 0,position:w,data:{...v.data,uPosition:void 0}});no(R);},[Ce,k,bt,ne,Ne,no,je]),Ra=useMemo(()=>ft.map(d=>{let m=fe(d)<1e3,w=Ta.has(d.id)?"edge-connecting":d.className,b=m||d.hidden===true;return w===d.className&&b===(d.hidden===true)?d:{...d,...w!==d.className?{className:w}:{},hidden:b?true:void 0}}),[ft,Ta,fe]),Br=useMemo(()=>({highlightedNodeIds:Z,highlightedEdgeIds:X,dimUnhighlighted:J,dimOpacity:ke,connectEdgesToHighlightedNodes:ie}),[ie,ke,J,X,Z]),Ea=useRef([]),va=useMemo(()=>{let d=Ea.current,m=fa(Ie,{showDeviceImages:Te},d);return Ea.current=m,m},[Ie,Te]),Rd=useMemo(()=>la(va,Br),[Br,va]),Ed=useMemo(()=>({highlightedPortHandles:me,onPortClick:ce,portClickEnabled:!!ce}),[me,ce]),vd=useMemo(()=>ua(Ra,Br),[Br,Ra]),He=useMemo(()=>bt?ne(bt.id)??bt:null,[bt,ne]),_o=useMemo(()=>{if(!He||!Co.enabled)return {showRearToggle:false,showDeRack:false,count:0};let d=He.type==="rack"?!Ht(He):so(He)?!Vt(He):false,m=Co.showRearToggle&&d,w=Co.showDeRack&&k&&!Ce&&Go(He)&&!!je(He);return {showRearToggle:m,showDeRack:w,count:(m?1:0)+(w?1:0)}},[He,Co,k,Ce,je,Vt,Ht]),Yn=useMemo(()=>{if(!He||_o.count===0||!gt.current)return null;let d=gt.current.getBoundingClientRect();if(d.width<=0||d.height<=0)return null;let m=He.positionAbsolute??Ne(He),w=He.width||0,b=He.height||0,R=_o.count>1?220:110,v=34;try{let B=Ae({x:m.x+w/2,y:m.y}),H=Ae({x:m.x+w/2,y:m.y+b}),I=B.x-d.left-R/2,Y=B.y-d.top-v-10;return Y<8&&(Y=H.y-d.top+10),I=Math.max(8,Math.min(I,d.width-R-8)),Y=Math.max(8,Math.min(Y,d.height-v-8)),{left:I,top:Y}}catch{return null}},[He,_o,Ne,Ae]),Id=Ga(E,D),Sd=Va(E,{touchAction:"none",...C}),Fd=u??bd,Hd=p??hd,_d=h??md,Md=useCallback(d=>{if(Ce)return;let m=Da(d);if(m){if(!$){de.setState({nodes:m});return}n?.(m);}},[Ce,Da,$,de,n]),Ad=useCallback(d=>{if(Ce)return;let m=d.filter(b=>{if(b.type==="remove"){let R=K.current.find(v=>v.id===b.id);if(R){let v=R.sourceHandle||"",B=R.targetHandle||"";if(v.startsWith("tube-")||B.startsWith("tube-"))return s&&console.log("Edge deletion blocked: Edge connected to tube handle is not detachable",R),false}}return true});if(m.length===0)return;let w=applyEdgeChanges(m,K.current);if(to(m),!$){de.setState({edges:w});return}a?.(w);},[Ce,s,to,$,de,a]);return jsx("div",{ref:gt,className:Id,style:Sd,children:jsxs(wi,{value:Ed,children:[jsxs(ReactFlow,{nodes:Rd,edges:vd,onNodesChange:Md,onEdgesChange:Ad,onConnect:Ce?void 0:Fd,onConnectStart:Pd,onConnectEnd:Dd,onEdgeUpdate:Ce?void 0:Hd,isValidConnection:_d,connectionMode:x??ConnectionMode.Loose,onNodeClick:yd,onNodeDoubleClick:wd,onPaneClick:xd,onNodeDragStart:pd,onNodeDrag:fd,onNodeDragStop:gd,onEdgeClick:Nd,onInit:_,nodeTypes:Un,edgeTypes:Vn,defaultEdgeOptions:$r,nodesDraggable:Se.nodesDraggable,nodesConnectable:Se.nodesConnectable,elementsSelectable:Se.elementsSelectable,edgesFocusable:Se.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:Se.connectOnClick,panOnDrag:Se.panOnDrag,panOnScroll:Se.panOnScroll,maxZoom:4,zoomOnScroll:Se.zoomOnScroll,zoomOnPinch:Se.zoomOnPinch,zoomOnDoubleClick:Se.zoomOnDoubleClick,preventScrolling:Je,onlyRenderVisibleElements:te,fitView:true,fitViewOptions:M,proOptions:Io,children:[jsx(Background,{color:Ua(E)}),Se.showControls&&jsx(Controls,{showInteractive:Se.showInteractiveControl}),Se.showMiniMap&&jsx(MiniMap,{}),jsx(Panel,{position:"bottom-right",className:"react-networks-attribution",children:jsx("a",{href:"https://github.com/MP70/react-networks",target:"_blank",rel:"noopener noreferrer",className:"react-networks-attribution-link",children:"react-networks"})})]}),F&&jsx("button",{className:"download-button",onClick:Re,disabled:Dt,"aria-busy":Dt,style:{position:"absolute",top:L.includes("top")?"10px":"auto",bottom:L.includes("bottom")?"10px":"auto",right:L.includes("right")?"10px":"auto",left:L.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:Dt?"not-allowed":"pointer",opacity:Dt?.7:1,transition:"all 0.2s ease",...U},children:Dt?`${z}...`:z}),He&&Yn&&_o.count>0&&jsxs("div",{style:{position:"absolute",top:Yn.top,left:Yn.left,display:"flex",gap:8,zIndex:2e3},children:[_o.showRearToggle&&jsx("button",{onClick:d=>{d.preventDefault(),Td();},style:{background:"#374151",color:"#e5e7eb",border:"1px solid #4b5563",borderRadius:4,padding:"6px 10px",fontSize:11,fontFamily:"monospace",cursor:"pointer"},title:(()=>{let d=He.data;return He.type==="rack"?(d?.face||"front")==="front"?"Switch to rear":"Switch to front":Sr(d)==="front"?"Switch to rear":"Switch to front"})(),children:(()=>{let d=He.data;return He.type==="rack"?(d?.face||"front")==="front"?"\u21C4 Rear":"\u21C4 Front":Sr(d)==="front"?"\u21C4 Rear":"\u21C4 Front"})()}),_o.showDeRack&&jsx("button",{onClick:d=>{d.preventDefault(),Cd();},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"})]})]})})},lf=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,[l,g]=useState(()=>o),f=t??l,u=useMemo(()=>f?ci(f):null,[f]),p=useCallback(P=>P?{nodes:Dc(P.nodes,h.current?.nodes??[]),edges:Tc(P.edges,h.current?.edges??[])}:null,[]),h=useRef(u),x=useRef(f),y=useMemo(()=>p(u),[u,p]);useEffect(()=>{h.current=y;},[y]),useEffect(()=>{x.current=f;},[f]);let N=useCallback((P,k)=>{let E=io({nodes:P,edges:k},x.current);h.current={nodes:P,edges:k},x.current=E,c||g(E),r?.(E);},[c,r]),D=useCallback(P=>{let k=h.current?.edges??[];N(P,k),n?.(P);},[N,n]),C=useCallback(P=>{let k=h.current?.nodes??[];N(k,P),a?.(P);},[N,a]);if(s){let P=y??{nodes:[],edges:[]};return jsx(Pc,{...i,nodes:P.nodes,edges:P.edges,onNodesChange:D,onEdgesChange:C})}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"?Et(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 l={...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?{...l,width:s.width,height:s.height}:{...l,...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 Tc(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 ma=e=>jsx(ReactFlowProvider,{children:jsx(lf,{...e})});var ba=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 Hr(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),l=Math.max(1,e.fiberStartIndex??1),g=0;for(let f=0;f<i;f+=1){let u=c+f,p=e.tubeColorMap?.[u];n.push({tubeIndex:u,y:g,label:`T${u}`,color:p??Ke(u)});for(let h=0;h<s;h+=1){let x=l+h,y=gi(x);r.push({key:`${u}-${x}`,tubeIndex:a==="tube"?u:void 0,fiberIndex:x,y:g,color:fo(x),striped:po(x),backgroundImage:typeof y.backgroundImage=="string"?y.backgroundImage:void 0}),g+=t;}f<i-1&&(g+=o);}return {rows:r,tubeLabels:n,height:g}}var ha=e=>typeof e=="object"&&e!==null,mf=e=>{if(!ha(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&ha(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&ha(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},bf=e=>e==="fibre-flow"||e==="fibre-flow-link",hf=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,yf=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",In=e=>typeof e=="string"&&e.startsWith("fiber-"),Sn=(e,t,o)=>e.source===t&&e.sourceHandle===o||e.target===t&&e.targetHandle===o,wf=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!hf(n))return;let a=o.get(n.id),i=bf(n.type)?n.type:a?.type??yf(n);r.push({...a??{},...n,type:i});}),r},Ic=e=>`fiber-${e.tube??1}-${e.fiber}`,Sc=e=>fo(e.fiber),Fc=e=>po(e.fiber),Nf=(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`},xf=(e,t,o,r,n,a)=>e?`${o} ${a}`:t?`0 ${n} ${r} ${a}`:"6 6",kf=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s})=>{let[c,l,g]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,curvature:.35}),f=typeof s?.lossDb=="number"?`${s.lossDb.toFixed(2)} dB`:"",u=s?.label??f,p=s?.sourceColor,h=s?.targetColor,x=s?.color??p??h??"#94a3b8",y=s?.sourceStriped??false,N=s?.targetStriped??false,D=s?.highlighted??true,C=s?.dimmed??false,P=s?.circuitId,k=s?.circuitLabel??P,E=s?.showCircuitId??false,_=p&&h&&p!==h,A=r-t,F=n-o,L=Math.sqrt(A*A+F*F),z=l-t,U=g-o,j=Math.sqrt(z*z+U*U),re=L>0?j/L*100:50,se=`fibre-flow-gradient-${e}`,S=y&&!N,M=N&&!y,te=y&&N,Z=L*1.25,X=Z/2,J=12,ke=Math.ceil(X*1.2/J),ie=Array(ke).fill("6 6").join(" "),Te=Math.ceil(X*1.2/J),me=Array(Te).fill("6 6").join(" "),ce=E&&k,O=Math.max(u?u.length*6.2+16:0,ce?(k?.length||0)*5.5+16:0),$=ce?32:16;return jsxs(Fragment,{children:[jsx("defs",{children:_&&jsxs("linearGradient",{id:se,x1:t,y1:o,x2:r,y2:n,gradientUnits:"userSpaceOnUse",children:[jsx("stop",{offset:"0%",stopColor:p}),jsx("stop",{offset:`${re}%`,stopColor:p}),jsx("stop",{offset:`${re}%`,stopColor:h}),jsx("stop",{offset:"100%",stopColor:h})]})}),_?jsx("path",{id:e,d:c,fill:"none",stroke:`url(#${se})`,strokeWidth:D?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:C?.25:1,strokeOpacity:C?.25:1,style:{mixBlendMode:"normal"}}):jsx(BaseEdge,{id:e,path:c,style:{stroke:x,strokeWidth:D?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:C?.25:1,strokeOpacity:C?.25:1,mixBlendMode:"normal"}}),(te||S||M)&&jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:D?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:xf(S,M,ie,me,X,Z),strokeDashoffset:0,opacity:C?.2:.9,style:{mixBlendMode:"normal"}}),(u||ce)&&D&&jsx(EdgeLabelRenderer,{children:jsxs("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${g}px)`,width:O,height:$,background:"rgba(248, 250, 252, 0.92)",border:"1px solid rgba(15, 23, 42, 0.4)",borderRadius:4,fontSize:10,fontFamily:"monospace",color:"rgba(15, 23, 42, 0.9)",display:"flex",flexDirection:"column",alignItems:"center",justifyContent:"center",pointerEvents:"none",padding:"2px 4px",zIndex:9999},children:[u&&jsx("div",{style:{lineHeight:1.2},children:u}),ce&&jsx("div",{style:{fontSize:8,opacity:.8,lineHeight:1.2,marginTop:u?2:0},children:k})]})})]})},Pf=({id:e,sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,data:s})=>{let[c,l,g]=getBezierPath({sourceX:t,sourceY:o,targetX:r,targetY:n,sourcePosition:a,targetPosition:i,curvature:.2}),f=s?.label,u=s?.color??"#64748b";return jsxs(Fragment,{children:[jsx(BaseEdge,{id:e,path:c,style:{stroke:u,strokeWidth:3,opacity:.85,strokeDasharray:"8 10"}}),f&&jsx(EdgeLabelRenderer,{children:jsx("div",{style:{position:"absolute",transform:`translate(-50%, -50%) translate(${l}px, ${g}px)`,padding:"2px 8px",background:"rgba(30, 41, 59, 0.9)",border:`1px solid ${u}`,borderRadius:10,fontSize:10,fontFamily:"monospace",color:"#e2e8f0",letterSpacing:.2,whiteSpace:"nowrap",pointerEvents:"none",zIndex:9999},children:f})})]})},Df=({data:e})=>{let{cable:t,side:o,rowHeight:r,columnWidth:n,showTubeLabels:a,showFiberNumbers:i,layout:s,colorMode:c="dark"}=e,l=c==="light",g=8,f=12,u=-1,p=0,h=t.jacketColor??"#facc15",x=(t.kind??(t.tubeCount?"tube":"simple"))==="tube",y=a&&x,N=o==="left"?g+p:p,D=o==="right"?g+p:p,C=o==="left"?Position.Right:Position.Left,P={width:4,height:4,borderRadius:"50%",background:h,border:`1px solid ${h}`,boxShadow:"0 0 1px rgba(0,0,0,0.4)",top:"50%",position:"absolute",...o==="left"?{left:0,transform:"translate(-50%, -50%)"}:{right:0,transform:"translate(50%, -50%)"}};return jsxs("div",{style:{position:"relative",width:n,height:s.height,fontFamily:"monospace",color:"inherit",overflow:"visible"},children:[jsx("div",{style:{position:"absolute",top:-18,left:o==="left"?0:void 0,right:o==="right"?0:void 0,fontSize:10,fontWeight:700,letterSpacing:.4,textTransform:"uppercase",background:l?"rgba(248, 250, 252, 0.95)":"rgba(15, 23, 42, 0.9)",color:l?"#1a1a1a":"#f8fafc",padding:"2px 6px",borderRadius:4,whiteSpace:"nowrap",maxWidth:n,overflow:"hidden",textOverflow:"ellipsis",zIndex:10,...o==="right"?{textAlign:"right"}:{}},children:t.label}),jsx("div",{style:{position:"absolute",top:0,bottom:0,width:g,left:o==="left"?0:void 0,right:o==="right"?0:void 0,borderRadius:4,background:x?"transparent":h,border:`1px solid ${h}`,boxShadow:x?"none":"inset 0 0 3px rgba(0,0,0,0.3)",overflow:"hidden"},children:x&&s.tubeLabels.map((k,E)=>{let _=s.rows.filter(j=>j.tubeIndex===k.tubeIndex);if(_.length===0)return null;let A=_[0].y,F=_[_.length-1].y+r,L=F-A,z=s.tubeLabels[E+1],U=z&&z.y-F>0;return jsx("div",{style:{position:"absolute",top:A,left:0,right:0,height:L,background:k.color,borderLeft:`2px solid ${k.color}`,borderRight:`2px solid ${k.color}`,borderTop:E===0?`2px solid ${k.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:U?"1px solid rgba(0,0,0,0.15)":`2px solid ${k.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:E===0&&!U||E===0?"4px 4px 0 0":U?"0":"0 0 4px 4px",zIndex:2}},`tube-segment-${k.tubeIndex}`)})}),!y&&jsx("div",{style:{position:"absolute",top:0,bottom:0,left:N,right:D,...o==="left"?{borderRight:`1px solid ${h}`}:{borderLeft:`1px solid ${h}`},pointerEvents:"none",zIndex:0}}),x&&s.tubeLabels.map((k,E)=>{let _=s.rows.filter(z=>z.tubeIndex===k.tubeIndex);if(_.length===0)return null;let A=_[0].y,L=_[_.length-1].y+r-A;return jsx("div",{style:{position:"absolute",top:A,left:N,right:D,height:L,...o==="left"?{borderRight:`2px solid ${k.color}`}:{borderLeft:`2px solid ${k.color}`},opacity:.5,pointerEvents:"none"}},`tube-border-${k.tubeIndex}`)}),s.rows.map(k=>{let E=`fiber-${k.tubeIndex??1}-${k.fiberIndex}`,_=k.y+r/2,A={position:"absolute",width:f,height:f,borderRadius:"50%",top:_,background:k.backgroundImage?k.backgroundImage:k.color,backgroundColor:k.color,border:`2px solid ${k.color}`,boxShadow:"0 0 6px rgba(0,0,0,0.3)",...o==="left"?{right:-f/2}:{left:-f/2},transform:"translateY(-50%)",zIndex:1e3,cursor:"crosshair","--fiber-bg":k.color,minWidth:f,minHeight:f};k.backgroundImage&&(A["--fiber-bg-image"]=k.backgroundImage);let F=o==="left"?{right:f+u,textAlign:"right"}:{left:f+u,textAlign:"left"};return jsxs(xe.Fragment,{children:[jsx(Handle,{id:E,type:"source",position:C,className:"fibre-flow-handle",style:A,isConnectable:true,"data-fiber-idx":k.fiberIndex,"data-tube-idx":k.tubeIndex,"data-fiber-color":k.color}),jsx(Handle,{id:E,type:"target",position:C,className:"fibre-flow-handle",style:A,isConnectable:true,"data-fiber-idx":k.fiberIndex,"data-tube-idx":k.tubeIndex,"data-fiber-color":k.color}),i&&jsx("div",{style:{position:"absolute",top:k.y+r/2-6,...F,fontSize:8,fontWeight:600,color:l?"rgba(15, 23, 42, 0.7)":"rgba(148, 163, 184, 0.95)",whiteSpace:"nowrap",lineHeight:1},children:k.fiberIndex})]},k.key)}),jsx(Handle,{id:"cable-run",type:"source",position:o==="left"?Position.Left:Position.Right,className:"cable-run-handle",style:P,isConnectable:true,"data-handle-type":"cable-run"}),jsx(Handle,{id:"cable-run",type:"target",position:o==="left"?Position.Left:Position.Right,className:"cable-run-handle",style:P,isConnectable:true,"data-handle-type":"cable-run"})]})},Tf=({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})})},Cf=(e,t,o,r,n,a,i,s,c,l="dark")=>{let g=[],f=0;return e.forEach(u=>{let p=Hr(u.leftCable,{rowHeight:o,tubeGap:r}),h=Hr(u.rightCable,{rowHeight:o,tubeGap:r}),x=Math.max(p.height,h.height),y=a*2+i,N=32,D=16,C=y+D*2,P=x+N+D*2,k=`flow-closure-${u.id}`,E=`flow-cable-${u.id}-left`,_=`flow-cable-${u.id}-right`,A=t==="horizontal"?{x:f,y:0}:{x:0,y:f};f+=(t==="horizontal"?C:P)+n;let F=u.chamberId?`${u.id} - ${u.chamberId}`:u.id;g.push({id:k,type:"fibre-flow-closure",position:A,data:{label:F,width:C,height:P,headerHeight:N,colorMode:l},selectable:false,draggable:false,style:{width:C,height:P}});let L=N+D+(x-p.height)/2,z=N+D+(x-h.height)/2;g.push({id:E,type:"fibre-flow-cable",position:{x:D,y:L},parentId:k,extent:"parent",data:{label:u.leftCable.label,cable:u.leftCable,side:"left",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:c,layout:p,colorMode:l},style:{width:a,height:p.height}}),g.push({id:_,type:"fibre-flow-cable",position:{x:D+y-a,y:z},parentId:k,extent:"parent",data:{label:u.rightCable.label,cable:u.rightCable,side:"right",rowHeight:o,columnWidth:a,showTubeLabels:s,showFiberNumbers:c,layout:h,colorMode:l},style:{width:a,height:h.height}});}),g},Rf=(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 l=`flow-cable-${c.id}-left`,g=`flow-cable-${c.id}-right`;[{nodeId:l,cable:c.leftCable},{nodeId:g,cable:c.rightCable}].forEach(({nodeId:u,cable:p})=>{let h=s.get(p.id);if(h&&h.closureId!==c.id){let x=Nf(p.distanceMeters??h.distanceMeters,p.distanceLabel??h.distanceLabel),y=p.jacketColor??h.jacketColor??"#64748b";n.push({id:`flow-link-${h.nodeId}-${u}`,type:"fibre-flow-link",source:h.nodeId,target:u,sourceHandle:"cable-run",targetHandle:"cable-run",data:{label:x,color:y}});}s.set(p.id,{nodeId:u,closureId:c.id,jacketColor:p.jacketColor,distanceLabel:p.distanceLabel,distanceMeters:p.distanceMeters});}),c.splices.forEach(u=>{let p=o?u.circuitId===o:true,h=!!o&&!p,x=u.circuitId?a.get(u.circuitId):void 0,y=u.circuitId?i.get(u.circuitId):void 0,N=u.color??x,D=Sc(u.from),C=Sc(u.to),P=Fc(u.from),k=Fc(u.to);n.push({id:`flow-edge-${c.id}-${u.id}`,type:"fibre-flow",source:l,target:g,sourceHandle:Ic(u.from),targetHandle:Ic(u.to),data:{lossDb:u.lossDb,label:u.label,color:N,sourceColor:D,targetColor:C,sourceStriped:P,targetStriped:k,highlighted:p,dimmed:h,circuitId:u.circuitId,circuitLabel:y,showCircuitId:r}});});}),n},Ef=({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:l=true,showFiberNumbers:g=true,colorMode:f="dark",showCircuitId:u=false,className:p,style:h,readOnly:x=false,interaction:y})=>{let N=useMemo(()=>Cf(e,r,n,a,i,s,c,l,g,f),[e,r,n,a,i,s,c,l,g,f]),D=useMemo(()=>Rf(e,t,o,u),[e,t,o,u]),[C,P]=useState(N),[k,E]=useState(D);useEffect(()=>{P(N);},[N,P]),useEffect(()=>{E(D);},[D,E]);let _=useCallback((S,M)=>{if(!S||!M||!M.startsWith("fiber-"))return;let te=C.find(Te=>Te.id===S);if(!te||te.type!=="fibre-flow-cable")return;let Z=/^fiber-(\d+)-(\d+)$/.exec(M);if(!Z)return;let X=Number(Z[1]),J=Number(Z[2]),ie=te.data.layout.rows.find(Te=>(Te.tubeIndex??1)===X&&Te.fiberIndex===J);if(ie)return {color:ie.color,striped:ie.striped??false}},[C]),A=useCallback(S=>{if(x||!S.source||!S.target||!S.sourceHandle||!S.targetHandle)return false;let M=C.find(ke=>ke.id===S.source),te=C.find(ke=>ke.id===S.target);if(!M||!te)return false;let Z=typeof S.sourceHandle=="string"&&S.sourceHandle.startsWith("fiber-"),X=typeof S.targetHandle=="string"&&S.targetHandle.startsWith("fiber-");return S.sourceHandle==="cable-run"||S.targetHandle==="cable-run"?true:Z&&X?M.type==="fibre-flow-cable"&&te.type==="fibre-flow-cable":false},[C,x]),F=useCallback(S=>{if(x)return;let M=S.sourceHandle==="cable-run"||S.targetHandle==="cable-run",te=In(S.sourceHandle),Z=In(S.targetHandle),X=M?void 0:_(S.source,S.sourceHandle),J=M?void 0:_(S.target,S.targetHandle),ke=M?void 0:{sourceColor:X?.color,targetColor:J?.color,color:X?.color??J?.color,sourceStriped:X?.striped,targetStriped:J?.striped};E(ie=>{let Te=ie.filter(me=>{let ce=te&&Sn(me,S.source,S.sourceHandle),O=Z&&Sn(me,S.target,S.targetHandle);return !(ce||O)});return addEdge({...S,type:M?"fibre-flow-link":"fibre-flow",data:ke},Te)});},[_,x,E]),L=useCallback((S,M)=>{if(x)return;let te=M.sourceHandle==="cable-run"||M.targetHandle==="cable-run",Z=te?void 0:_(M.source,M.sourceHandle),X=te?void 0:_(M.target,M.targetHandle),J=te?void 0:{sourceColor:Z?.color,targetColor:X?.color,color:Z?.color??X?.color,sourceStriped:Z?.striped,targetStriped:X?.striped};E(ke=>{let ie=ke.filter(O=>O.id!==S.id),Te=In(M.sourceHandle),me=In(M.targetHandle),ce=ie.filter(O=>{let $=Te&&Sn(O,M.source,M.sourceHandle),Pe=me&&Sn(O,M.target,M.targetHandle);return !($||Pe)});return addEdge({...M,type:te?"fibre-flow-link":"fibre-flow",data:J},ce)});},[_,x,E]),z=useCallback(S=>{x||P(S.filter(mf));},[x,P]),U=useCallback(S=>{x||E(M=>wf(S,M));},[x,E]),j=useMemo(()=>({"fibre-flow-cable":Df,"fibre-flow-closure":Tf}),[]),re=useMemo(()=>({"fibre-flow":kf,"fibre-flow-link":Pf}),[]),se={borderRadius:8,overflow:"hidden",...h};return jsx(ma,{nodes:C,edges:k,onNodesChange:z,onEdgesChange:U,onConnect:F,onEdgeUpdate:L,isValidConnection:A,connectionMode:ConnectionMode.Loose,nodeTypes:j,edgeTypes:re,className:p,style:se,colorMode:f,readOnly:x,interaction:y,fitViewOptions:{padding:.2}})},vf=e=>jsx(Ef,{...e});var Ff=({cable:e,side:t,rowHeight:o=22,tubeGap:r=10,columnWidth:n=150,layout:a,showTubeLabels:i,showFiberNumbers:s=true,showCableLabel:c=true})=>{let l=useMemo(()=>a??Hr(e,{rowHeight:o,tubeGap:r}),[a,e,o,r]),g=26,f=10,u=18,p=t==="left"?n-u:u,h=8,x=t==="left"?6:n-g-18,y=e.jacketColor??"#facc15",N=i??(e.kind??(e.tubeCount?"tube":"simple"))==="tube";return jsxs("div",{style:{position:"relative",width:n,height:l.height,fontFamily:"monospace",color:"inherit"},children:[c&&jsx("div",{style:{position:"absolute",top:-18,left:t==="left"?0:void 0,right:t==="right"?0:void 0,fontSize:10,fontWeight:700,letterSpacing:.4,textTransform:"uppercase",background:"rgba(15, 23, 42, 0.85)",color:"#f8fafc",padding:"2px 6px",borderRadius:4},children:e.label}),jsx("div",{style:{position:"absolute",top:0,bottom:0,width:g,left:t==="left"?0:void 0,right:t==="right"?0:void 0,borderRadius:14,background:`linear-gradient(90deg, ${y} 0%, ${y} 60%, rgba(0,0,0,0.25) 100%)`,border:`2px solid ${y}`,boxShadow:"inset 0 0 6px rgba(0,0,0,0.4)"}}),N&&l.tubeLabels.map(D=>jsxs("div",{style:{position:"absolute",top:D.y+o/2-6,left:x,fontSize:9,fontWeight:700,textTransform:"uppercase",color:"rgba(15, 23, 42, 0.75)",background:"rgba(255, 255, 255, 0.6)",padding:"1px 6px 1px 4px",borderRadius:10,display:"flex",alignItems:"center",gap:4},children:[jsx("span",{style:{width:8,height:8,borderRadius:"50%",backgroundColor:D.color,border:"1px solid rgba(0, 0, 0, 0.4)",boxShadow:"0 0 3px rgba(0,0,0,0.25)"}}),jsx("span",{children:D.label})]},`tube-${D.tubeIndex}`)),l.rows.map(D=>{let C=D.y+o/2-f/2,P=t==="left"?p-f/2-h:p+f/2+h;return jsxs(xe.Fragment,{children:[jsx("div",{style:{position:"absolute",top:C,left:p-f/2,width:f,height:f,borderRadius:"50%",backgroundColor:D.color,backgroundImage:D.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:D.y+o/2-6,left:P,transform:t==="left"?"translateX(-100%)":"none",fontSize:10,fontWeight:600,color:"rgba(15, 23, 42, 0.75)"},children:D.fiberIndex})]},D.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 Fn(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 Hn(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=Hn(e.termination_a),o=Hn(e.termination_b);return {id:`cable-${e.id}`,source:Fn(t)??"device-unknown-source",target:Fn(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}}},Wc=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=Hn(n.termination_a),s=Hn(n.termination_b);o.push({...a,source:(typeof i=="string"?r.get(i):void 0)??Fn(i)??a.source,target:(typeof s=="string"?r.get(s):void 0)??Fn(s)??a.target});}),{nodes:t,edges:o}},Hf=e=>io(Wc(e)),_f=e=>$c(e);var zc=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Mf="Interfaces",Af="Management",$f="Power",Gc=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),zt=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Gt=e=>{if(typeof e!="string")return;let t=e.trim().toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Lf=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",_n=e=>Gc(e.custom_fields)?e.custom_fields:void 0,Mn=e=>Gc(e)?e:void 0,Uc=(e,t)=>{let o=_n(e),r=Mn(o?.layout);return Lf(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},Vc=(e,t,o)=>{let r=_n(e),n=Mn(r?.layout),a=zt(o)??zt(e.layout?.group)??zt(e.port_group)??zt(n?.group)??zt(r?.port_group)??zt(r?.portGroup)??zt(r?.interface_group)??zt(r?.interfaceGroup)??zt(r?.group);return a||(t==="power_ac"||t==="power_c13"||t==="power_c19"?$f:t==="console"||t==="mgmt"?Af:Mf)},jc=(e,t,o)=>{let r=_n(e),n=Mn(r?.layout);return Gt(o)??Gt(e.layout?.connectorType)??Gt(e.layout?.connector_type)??Gt(e.connector_type)??Gt(n?.connectorType)??Gt(n?.connector_type)??Gt(r?.connectorType)??Gt(r?.connector_type)??Gt(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"}},Bf=e=>typeof e=="string"?fr(e):lt(e),Kc=(e,t,o)=>{if(!o)return;let r=_n(e),n=Mn(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=Bf(i);if(s)return s}},Of=(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:Uc(e),group:a,type:n,cableType:Yc(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:Kc(e,void 0,t)}},Wf=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)}),zf=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[];return Wf(e.interfaces??[]).forEach((i,s)=>{let c=r?r({device:e,iface:i,index:s}):Of(i,o);if(!c)return;let l=c.type??i.type?.value??i.type?.label??void 0,g=jc(i,l,c.connectorType),f=Xc(l,g),u=Uc(i,c.face),p=Vc(i,f,c.group);n.push({id:c.id,label:c.label??i.name,face:u,group:p,connected:c.connected??!!(i.connected_endpoint||i.cable),type:f,cableType:Yc(c.cableType??i.type?.value??i.type?.label??void 0),connectorType:g,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=zf(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:zc(e.termination_a.device),sourceHandle:e.termination_a.name,target:zc(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}},Gf=(e,t={})=>io(Qc(e,t)),Uf=(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 An(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 l=t[c],g=r(s,l);g&&g.hasConflict&&g.conflict&&n.push(g.conflict);}}return {isValid:n.length===0&&a.length===0,conflicts:n,outOfBounds:a}}var Vf="Network Ports",jf="Rear Network Ports",Xf="Power Ports",$n=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Ve=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},td=e=>{let t=Ve(e)?.toLowerCase();if(t==="front")return "front";if(t==="rear"||t==="back")return "rear"},Ln=e=>{let t=Ve(e)?.toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Yf=e=>$e(e)?"rear":"front",Kf=({face:e,type:t})=>$e(t)?Xf:e==="rear"?jf:Vf;function On(e){return td(e.face)??Yf(e.type)}var qf=On;function Wn(e){return Ve(e.group)??Kf({face:On(e),type:e.type})}var Zf=Wn;function Bn(e){if(!Array.isArray(e))return;let t=e.map(o=>{if(!$n(o))return null;let r=Ve(o.label);if(!r)return null;let n=Ve(o.type),a=On({face:td(o.face),type:n}),i=Wn({face:a,group:Ve(o.group),type:n}),s=lt(o.position??o),c=typeof o.order=="number"&&Number.isFinite(o.order)?o.order:void 0;return {...Ve(o.id)?{id:Ve(o.id)}:{},label:r,face:a,group:i,connected:typeof o.connected=="boolean"?o.connected:void 0,...n?{type:n}:{},...Ve(o.cableType)?{cableType:Ve(o.cableType)}:{},...Ln(o.connectorType)?{connectorType:Ln(o.connectorType)}:{},...typeof c=="number"?{order:c}:{},...s?{position:s}:{}}}).filter(o=>o!==null);return t.length>0?t:void 0}var Jf=Bn;function ed(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=Ve(r.label);if(!a)return null;let i=Ve(r.type),s=Wn({face:t,group:Ve(o.name),type:i}),c=lt(r.position??r),l=typeof r.order=="number"&&Number.isFinite(r.order)?r.order:n;return {...Ve(r.id)?{id:Ve(r.id)}:{},label:a,face:t,group:s,connected:typeof r.connected=="boolean"?r.connected:void 0,...i?{type:i}:{},...Ve(r.cableType)?{cableType:Ve(r.cableType)}:{},...Ln(r.connectorType)?{connectorType:Ln(r.connectorType)}:{},order:l,...c?{position:c}:{}}}).filter(r=>r!==null)):[]}function zn(e){if($n(e)){let t=Bn(e.ports);if(t)return t;let o=ed(e.portGroups,"front"),r=ed(e.rearPortGroups,"rear"),n=[...o,...r];return n.length>0?n:void 0}return Bn(e)}var Qf=zn;function od({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 eg=od;function wa(e){if(!Array.isArray(e)||e.length===0)return {portGroups:[],rearPortGroups:[]};let{ports:t,rearPorts:o}=qr(e);return {portGroups:t,rearPortGroups:o}}var tg=wa;function rd(e,t,o={}){let r=Nt(e,t);if(t.type==="power_ac"||t.type==="power_c13"||t.type==="power_c19")return [r];let a=String(o.deviceType??"").toLowerCase(),i=o.face??"front";return a==="switch"||a==="router"?[r,`${r}-target`]:a==="patch-panel"||a==="patch_panel"?i==="rear"?[r,`${r}-target`]:[r,`${r}-source`]:[r]}function og(e,t,o={}){let r=o.sanitizeHandle??(c=>Ge(c)),n=r(t),{ports:a,rearPorts:i}=Ue(e),s=(c,l)=>{for(let g of c)for(let f of g.ports)if(rd(g.name,f,{deviceType:o.deviceType,face:l}).some(p=>r(p)===n))return true;return false};return !!(s(a,"front")||s(i,"rear"))}function rg(e){return wa(e)}var rr=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 Na(e,t={}){let o=_e(e);return An({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 l=ot(r),g=ot(n);if(!Jr(l,g))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=Vo(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:ot(e)}}}function ng(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 ig(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=Na(i,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} conflicts with ${l.conflictWith}`);}),s.outOfBounds.forEach(l=>{c.push(`Device ${l.deviceId} at U${l.uPosition}-${l.uPosition+l.uHeight-1} exceeds rack height (${l.rackUHeight}U)`);}),new rr(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=ng(i);n.push(s);for(let c of i.devices)try{let l=nd(c,s,t);a.push(l);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let g=rn(s,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:ot(c)}},a,c.unit);if(g!==void 0&&g!==c.unit){console.warn(`Device ${c.id} moved from U${c.unit} to U${g} due to conflict`);let f={...c,unit:g},u=nd(f,s,t);a.push(u);}else throw new rr(i.id,c.id,c.unit,c.height)}}}return n.push(...a),n}function ag(e){let t=[],o=e.filter(r=>r.type==="rack");for(let r of o){let a=e.filter(i=>ao(i.type)&&i.parentId===r.id).sort((i,s)=>{let c=i.data.uPosition||1,l=s.data.uPosition||1;return c!==l?c-l:i.id.localeCompare(s.id)}).map(i=>{let s=zn(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:ot(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 sg(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 cg(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!Na({...a,devices:[...a.devices,o]},r).isValid)throw new rr(t,o.id,o.unit,o.height);return {...a,devices:[...a.devices,o]}})}function dg(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(n=>n.id!==o)})}var nr=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 xa(e,t={}){return An({items:e.splices,checkOutOfBounds:o=>o.holder<1||o.holder>qt?{isValid:false,error:{spliceId:o.id,holder:o.holder,max:qt}}: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=Rr(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 lg(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function ug(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=xa(i,t);if(!s.isValid&&o==="strict"){let c=[];throw s.conflicts.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} conflicts with ${l.conflictWith}`);}),s.outOfBounds.forEach(l=>{c.push(`Splice ${l.spliceId} at holder ${l.holder} is out of bounds (max: ${l.max})`);}),new nr(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=lg(i);n.push(s);for(let c of i.splices)try{let l=c.holder;if(o==="nearest"){let u={id:c.id,type:"splice",position:{x:0,y:0},data:{label:c.name,holderPosition:c.holder}},p=[...n,...a];Dr(s,u,c.holder,p)||(l=Cr(s,u,p,c.holder));}let g=l!==c.holder?{...c,holder:l}:c,f=id(g,s);a.push(f);}catch(l){if(o==="strict")throw l;if(o==="nearest"){let g=[...n,...a],f=Cr(s,{id:c.id,data:{label:c.name,holderPosition:c.holder}},g,c.holder);if(f!==c.holder){console.warn(`Splice ${c.id} moved from holder ${c.holder} to holder ${f} due to conflict`);let u={...c,holder:f},p=id(u,s);a.push(p);}else throw new nr(i.id,c.id,c.holder)}}}return n.push(...a),n}function pg(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 gg(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!xa({...a,splices:[...a.splices,o]},r).isValid)throw new nr(t,o.id,o.holder);return {...a,splices:[...a.splices,o]}})}function mg(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}function bg(e,t,o={}){let r=o.direction??"horizontal",n=o.spacing??220,a=o.origin??{x:0,y:0},i=e.map((c,l)=>({id:c.id,type:c.type??"fiber",position:r==="vertical"?{x:a.x,y:a.y+l*n}:{x:a.x+l*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}=Et(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 hg(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 ge=e=>typeof e=="string"?e.trim():"",dd=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},yg=e=>{let t=ge(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},wg=(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"},Ng=e=>{if(e==="power_c13")return "C13";if(e==="power_c19")return "C19";if(e==="power_ac")return "AC"},xg=e=>e.toLowerCase().replace(/_/g,"-").trim(),kg=e=>e>=1?"rackable":"zero-u",Pg=e=>(e??"").toLowerCase()==="half"?"half":"full",Dg=(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 Tg(e){let t=[],o=ge(e.manufacturer),r=ge(e.model),n=ge(e.role)||ge(e.deviceType)||ge(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=ge(e.id)||ge(e.slug)||ld(o,r)||"unknown",s=ge(e.slug)||ld(o,r)||i,c=Array.isArray(e.ports)?e.ports:[],l=Array.isArray(e.rearPorts)?e.rearPorts:Array.isArray(e.rear_ports)?e.rear_ports:[],f=(Array.isArray(e.frontRearPortLinks)?e.frontRearPortLinks:Array.isArray(e.front_rear_port_links)?e.front_rear_port_links:[]).map(u=>({frontPortId:ge(u.frontPortId)||ge(u.front_port_id),rearPortId:ge(u.rearPortId)||ge(u.rear_port_id)}));return {id:i,slug:s,manufacturer:o,model:r,role:n,uHeight:a,width:ge(e.width)||void 0,frontBlocks:c,rearBlocks:l,rawLinks:f,frontImageUrl:ge(e.frontImageUrl)||ge(e.front_image_url)||void 0,rearImageUrl:ge(e.rearImageUrl)||ge(e.rear_image_url)||void 0,frontImageAttribution:ge(e.frontImageAttribution)||void 0,rearImageAttribution:ge(e.rearImageAttribution)||void 0,tags:Array.isArray(e.tags)?e.tags.map(ge).filter(Boolean):[],sourceRepository:ge(e.sourceRepository)||ge(e.source_repository)||void 0,sourcePath:ge(e.sourcePath)||ge(e.source_path)||void 0,issues:t}}function ud(e,t,o){let r=ge(e.name)||`Block ${o+1}`,a=(Array.isArray(e.ports)?e.ports:[]).map((i,s)=>{let c=ge(i.label)||ge(i.name)||`Port ${s+1}`,l=yg(i.connectorType??i.connector_type),g=wg(ge(i.type),l),f=l??Ng(g),p={id:ge(i.id)||Dg(t,o,s,c),label:c,type:g,connectorType:f};if(i.position){let h=lt(i.position);h&&(p.position=h);}return p});return {name:r,ports:a}}function Cg(e){let t=[],o=xg(e.role),r=e.uHeight,n=kg(r),a=Pg(e.width),i=e.frontBlocks.map((c,l)=>ud(c,"front",l)),s=e.rearBlocks.map((c,l)=>ud(c,"rear",l));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 Rg(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 Eg(e){let t=[],{front:o,rear:r}=Rg(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 _r(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function vg(e,t){let o=[],r=[];for(let p of t.frontFace.portBlocks)for(let h of p.ports)r.push({id:h.id,face:"front"});for(let p of t.rearFace.portBlocks)for(let h of p.ports)r.push({id:h.id,face:"rear"});let n=new Map;for(let{id:p}of r)n.set(p,(n.get(p)??0)+1);for(let[p,h]of n)h>1&&o.push({severity:"error",code:"DUPLICATE_PORT_ID",message:`Duplicate port id "${p}" found ${h} times`,path:`ports.${p}`});let a=e.frontBlocks.reduce((p,h)=>p+(Array.isArray(h.ports)?h.ports.length:0),0),i=e.rearBlocks.reduce((p,h)=>p+(Array.isArray(h.ports)?h.ports.length:0),0),s=_r(t.frontFace),c=_r(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 l=new Set(r.map(p=>p.id)),g=new Set(r.filter(p=>p.face==="front").map(p=>p.id)),f=new Set(r.filter(p=>p.face==="rear").map(p=>p.id));for(let p of e.rawLinks)p.frontPortId&&!g.has(p.frontPortId)&&!l.has(p.frontPortId)&&o.push({severity:"warning",code:"PASS_THROUGH_FRONT_PORT_MISSING",message:`Pass-through link references unknown front port "${p.frontPortId}"`,path:"frontRearPortLinks"}),p.rearPortId&&!f.has(p.rearPortId)&&!l.has(p.rearPortId)&&o.push({severity:"warning",code:"PASS_THROUGH_REAR_PORT_MISSING",message:`Pass-through link references unknown rear port "${p.rearPortId}"`,path:"frontRearPortLinks"});return {valid:!o.some(p=>p.severity==="error"),issues:o,portCounts:{front:s,rear:c}}}function Ig(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 Sg(e){let t=Tg(e),o=Cg(t),r=Eg(o),n=vg(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:Ig(t,o,r),report:n}:{template:null,report:n}}function Fg(e){return _r(e)}function Hg(e,t,o){let r=[],n=_r(e.faces.front),a=_r(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{fp as COUPLERS_PER_PANEL,Pn as COUPLER_SLOT_HEIGHT_PX,gp as COUPLER_WIDTH_PX,Wi as CableNode,ea as ClosureNode,Ui as CouplerNode,Wp as DEFAULT_DIAGRAM_DIM_OPACITY,Ko as DeviceNode,rr as DevicePlacementError,ba as DiagramErrorBoundary,wi as DiagramPortProvider,es as FIBER_COLORS_12,sn as FiberEdge,fi as FiberNode,Ff as FibreCableWithTubesExpanded,vf as FibreFlowMap,oa as FibreSplitNode,zo as HANDLE_EXTENSION_PX,Gi as MultiTubeCableNode,ma as NetworkDiagram,js as PANEL_BORDER_WIDTH,xo as PANEL_HEADER_HEIGHT,kn as PANEL_HEIGHT_PX,No as PANEL_PADDING,Xs as PANEL_TUBE_TRAY_SPACING,xn as PANEL_WIDTH_PX,Jn as POWER_CONNECTORS,Zi as PatchPanelNode,mi as PowerEdge,Xt as RACK_HEADER_HEIGHT,di as RACK_WIDTH_PX,pi as RackNode,Fi as SpliceNode,nr as SplicePlacementError,$i as SpliceTrayNode,cd as TEMPLATE_SCHEMA_VERSION,Li as TubeNode,Wa as U_HEIGHT_PX,vi as VerticalPDU,Xa as Width,cg as addDeviceToRack,gg as addSpliceToTray,fa as applyDeviceDisplayToNodes,ua as applyDiagramFocusToEdges,la as applyDiagramFocusToNodes,Ke as baseColorFor,wa as buildDevicePortGroupsFromPorts,ig as buildNodesFromRackConfig,ug as buildNodesFromSpliceConfig,bg as buildPathLayoutGraph,qr as buildPortBlocksFromPorts,Nt as buildPortHandleId,Nt as buildReactNetworksHandleId,tg as buildReactNetworksPortGroupsFromPorts,Yi as calculateClosureDimensions,bp as calculateCouplerRightX,yp as calculateCouplerSlotSpacing,tc as calculateCouplerSpacing,Vo as calculateDevicePositionFromU,Xi as calculatePanelDimensions,Qs as calculateSlotPositionFromY,ip as calculateSplicePositionFromNumber,Uf as calculateUPositions,ec as calculateYFromSlotPosition,Fg as countTemplateFacePorts,aa as createNetworkDiagramStore,ag as createRackConfigFromNodes,pg as createSpliceConfigFromNodes,ci as diagramDocumentToNetworkGraph,gi as fiberSolidOrStriped,hg as findNearestRack,Cr as findNextAvailableHolderPosition,rn as findNextAvailableUPosition,od as flattenDevicePortsFromGroups,eg as flattenReactNetworksPortGroups,_f as generateLayout,Fa as getConnectorConfig,ji as getCouplerDimensions,Wo as getDefaultDeviceFace,Qn as getDeviceConnectorType,ko as getEndpointMetadata,fo as getFiberColor,ri as getFrontPortBlocks,Js as getInnerContentWidth,$t as getPDUPortType,mp as getPanelHeight,Zs as getPanelWidth,jt as getPowerPortStyle,ad as getRackBounds,ni as getRearPortBlocks,Ue as getResolvedPortBlocks,yi as getStandardPortVisualDimensions,vt as getStatusColor,Ys as getTrayDimensions,Dn as getTubeDimensions,Ir as hasDiagramFocus,Aa as hasFrontPorts,$a as hasRearPorts,Oc as inventoryCableToNetworkEdge,Bc as inventoryDeviceToNetworkNode,Lc as inventoryRackToNetworkNode,Hf as inventoryToDiagramDocument,Wc as inventoryToNetworkDiagram,gc as isDeviceDiagramNode,xi as isDiagramPortHandleHighlighted,pc as isEdgeInDiagramFocus,Bd as isHighPowerConnector,uc as isNodeInDiagramFocus,sd as isPointInRack,$e as isPowerPortType,po as isStriped,co as isUPositionAvailable,rd as listPossiblePortHandleIds,Xr as looksLikePowerHandleId,Jc as netboxCableToNetworkEdge,Zc as netboxDeviceToNetworkNode,qc as netboxRackToNetworkNode,Gf as netboxToDiagramDocument,Qc as netboxToNetworkDiagram,io as networkGraphToDiagramDocument,Bn as normalizeDevicePorts,Ct as normalizeDirectionalHandleId,Ge as normalizeHandleId,lt as normalizePortPositionInput,Jf as normalizeReactNetworksPorts,Sg as parseNetboxTemplate,fr as parseSemanticPortPosition,dg as removeDeviceFromRack,mg as removeSpliceFromTray,Le as replaceEdge,rg as resolveDevicePortBlocksFromFlatPorts,On as resolveDevicePortFace,Wn as resolveDevicePortGroup,vr as resolveEndpointCompatibilityKeys,zn as resolveNodeDevicePorts,dn as resolvePortVisualKind,Qf as resolveReactNetworksNodePorts,qf as resolveReactNetworksPortFace,Zf as resolveReactNetworksPortGroup,hp as snapToCouplerPosition,_i as snapToSplicePosition,on as snapToUPosition,Qa as updateDeviceUPosition,sg as updateDeviceUPositionInSchema,fg as updateSpliceHolderPosition,da as useDiagramEdges,ca as useDiagramNodes,Ni as useDiagramPortInteraction,Lp as useNetworkDiagram,Ml as validateAndSnapDevice,og as validatePortHandleOnNodeData,Na as validateRackDevicePlacements,Hg as validateRenderFidelity,xa as validateSplicePlacements};//# sourceMappingURL=index.mjs.map
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';import {toPng}from'html-to-image';import {jsxs,jsx,Fragment}from'react/jsx-runtime';var Id=/-(source|target)$/i,Sd=/--rear$/i;function zt(e){return e?e.replace(Id,""):""}function Re(e){return zt(e).replace(Sd,"")}function _e(e){return typeof e=="string"&&e.toLowerCase().includes("power")}function ut(e,t){return typeof t.id=="string"&&t.id.length>0?t.id:_e(t.type)?t.label:`${e}-${t.label}`}function Br(e){let t=zt(e).toLowerCase();return t.startsWith("pwr")||t.includes("power")}var Ln={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=Ln[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 fa(e){let t=Ln[e];if(!t)throw new Error(`Unknown connector type: ${e}`);return t}function Fd(e){return fa(e).amperage===16}function Tt(e){return e%10<8?"C13":"C19"}function Bn(e){let t=e.toLowerCase();return t.includes("mx304")||t.includes("mx480")||t.includes("mx960")?"C20":"C14"}var _d=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Co=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}},Hd=e=>e.trim().toLowerCase().split(/[^a-z0-9]+/).filter(t=>t.length>0),On=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"},ga=e=>e.includes("center")||e.includes("centre")||e.includes("middle")||e.includes("mid"),Md=(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=ga(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},Ad=e=>{if(e.includes("front")||e.includes("rear")||e.includes("back"))return;let o=e.map(On).find(n=>n!==void 0);if(!o)return;let r=Md(o,e);if(r!==void 0)return {side:o,offsetPercent:r}},$d=e=>{if(e.length===0)return;let t=e.includes("left"),o=e.includes("right"),r=ga(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}},tr=e=>{let t=Hd(e);if(t.length!==0){if(t.length===1){let o=On(t[0]);return o?{side:o}:void 0}return Ad(t)??$d(t)}},nt=e=>{if(typeof e=="string")return tr(e);if(!_d(e))return;let t=e.side??e.port_side??e.portSide,o=typeof t=="string"?tr(t):void 0,n=(typeof t=="string"?On(t.trim().toLowerCase()):void 0)??o?.side,a=Co(e.offsetPercent??e.offset_percent??e.offsetPct??e.offset_pct)??o?.offsetPercent,i=Co(e.offsetPx??e.offset_px??e.offsetPixels??e.offset_pixels)??o?.offsetPx,s=Co(e.xPercent??e.x_percent??e.xPct??e.x_pct??e.horizontalPercent??e.horizontal_percent??e.x)??o?.xPercent,c=Co(e.yPercent??e.y_percent??e.yPct??e.y_pct??e.verticalPercent??e.vertical_percent??e.y)??o?.yPercent,d=Co(e.widthPercent??e.width_percent??e.widthPct??e.width_pct??e.wPercent??e.w_percent),f=Co(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 Ld="Network Ports",Bd="Rear Network Ports",Od="Power Ports",ma=8,zd=92;function Ro(e){return Math.max(0,Math.min(100,e))}function Wn(e){if(e==="top"||e==="right"||e==="bottom"||e==="left")return e}function Eo(e){return nt(e)}function ba(e){let t=Eo(e.position);return typeof t?.xPercent=="number"&&typeof t?.yPercent=="number"}function Wd(e){let t=Eo(e.position);return typeof t?.offsetPercent=="number"||typeof t?.offsetPx=="number"}function Gd(e){return e.face==="rear"||e.face==="back"?"rear":e.face==="front"?"front":_e(e.type)?"rear":"front"}function Ud(e,t){return typeof e.group=="string"&&e.group.trim().length>0?e.group.trim():_e(e.type)?Od:t==="rear"?Bd:Ld}function zr(e){return typeof e.port.order=="number"&&Number.isFinite(e.port.order)?e.port.order:e.index}function Vd(e,t){return t<=1?50:ma+e*(zd-ma)/(t-1)}function jd(e){let t=e.filter(n=>!!Wn(Eo(n.port.position)?.side)&&!ba(n.port)&&!Wd(n.port)),o=new Map,r=new Map;return t.forEach(n=>{let a=Wn(Eo(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=zr(i)-zr(s);return c!==0?c:i.index-s.index});a.forEach((i,s)=>{o.set(i.index,Vd(s,a.length));});}),o}function Xd(e,t){let o=Eo(e.position),r=Wn(o?.side);if(ba(e)){let s={xPercent:Ro(o?.xPercent),yPercent:Ro(o?.yPercent)};return typeof o?.widthPercent=="number"&&Number.isFinite(o.widthPercent)&&(s.widthPercent=Ro(o.widthPercent)),typeof o?.heightPercent=="number"&&Number.isFinite(o.heightPercent)&&(s.heightPercent=Ro(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)?Ro(o.offsetPercent):void 0)??(typeof t=="number"?Ro(t):void 0);return typeof i=="number"&&(n.offsetPercent=i),n}function Yd(e,t){let o=Xd(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 Or(e){return e.map(t=>({...t,ports:t.ports.map(o=>{let r=Eo(o.position);return {...o,...r?{position:r}:{position:void 0}}})}))}function zn(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 Kd(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 Wr(e){let t=new Map;e.forEach((n,a)=>{if(typeof n.label!="string"||n.label.trim().length===0)return;let i=Gd(n),s=Ud(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=zr(c)-zr(d);return f!==0?f:c.index-d.index}),i=jd(a),s={name:n.groupName,ports:a.map(c=>Yd(c,i.get(c.index)))};if(n.face==="rear"){r.push(s);return}o.push(s);}),{ports:o,rearPorts:r}}function Le(e){return zn(e?.ports)?{ports:Or(e.ports),rearPorts:Or(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:zn(e?.rearPorts)?e.rearPorts:[])}:Kd(e?.ports)?Wr(e.ports):{ports:Or(Array.isArray(e?.portGroups)?e.portGroups:[]),rearPorts:Or(Array.isArray(e?.rearPortGroups)?e.rearPortGroups:zn(e?.rearPorts)?e.rearPorts:[])}}function Gn(e){return Le(e).ports}function Un(e){return Le(e).rearPorts}function or(e){return Array.isArray(e)?e.reduce((t,o)=>t+(Array.isArray(o.ports)?o.ports.length:0),0):0}function ha(e){return or(Le(e).ports)>0}function ya(e){return or(Le(e).rearPorts)>0}function vo(e){let t=ha(e);return ya(e)&&!t?"rear":"front"}var qd=new Set(["patch-panel","closure","splice-tray"]),Vn=["frontImageUrl","rearImageUrl","frontImageAttribution","rearImageAttribution","imageFit","imagePosition","imageRepeat","stretchToFit"],jn=["panelWidth","panelHeight","closureWidth","closureHeight","headerHeight"],Xn=["status","width","widthPx","height","header","color","colorMode","showUMarkers","customHeaderText","powerSide","rotation","rackWidthPx","rackFaceGapPx"],Zd=["face","handleSideMap"],Jd=new Set(["label","ports","portGroups","rearPortGroups","pduPortGroups","connections","netboxId","netboxType","inventoryId","inventoryType","uPosition","mountMode","rackLayout","slotPosition","holderPosition",...Vn,...jn,...Xn,...Zd]);function Na(e){return {x:typeof e?.x=="number"?e.x:0,y:typeof e?.y=="number"?e.y:0}}function nr(e){if(e)return {...e}}function rr(e){return {...e,ports:e.ports.map(t=>({...t,compatibility:Array.isArray(t.compatibility)?[...t.compatibility]:void 0,position:nr(t.position)}))}}function Qd(e){if(typeof e.parentId=="string")return e.parentId;let t=e.parentNode;return typeof t=="string"?t:void 0}function el(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 tl(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 qd.has(t)?t:"patch-panel"}return e.kind==="splitter"?"fibre-split":e.kind}function ol(e){let t={position:Na(e.position)},o=Qd(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={};Xn.forEach(a=>{let i=t[a];i!==void 0&&(o[a]=i);});let r=Vn.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=jn.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 nl(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 il(e){let t=e.data??{},o={};return Object.entries(t).forEach(([r,n])=>{Jd.has(r)||(r==="rackWidthPx"||r==="rackFaceGapPx")&&e.type!=="rack"||(o[r]=n);}),Object.keys(o).length>0?o:void 0}function al(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 cl(e){let t=e.data??{};if(Array.isArray(t.pduPortGroups)&&t.pduPortGroups.length>0)return t.pduPortGroups.map(rr);let{ports:o,rearPorts:r}=Le(t);if(r.length>0)return r.map(rr);if(o.length>0)return o.map(rr);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=Tt(i);return {id:`${i+1}`,label:`${i+1}`,connected:false,type:s==="C19"?"power_c19":"power_c13",connectorType:s}})}]}function dl(e){return (e.type==="vertical-pdu"?[{face:"rear",blocks:cl(e)}]:(()=>{let{ports:o,rearPorts:r}=Le(e.data);return [{face:"front",blocks:o.map(rr)},{face:"rear",blocks:r.map(rr)}]})()).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:_e(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:nr(a.position)}))))}function ll(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 ul(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)?dl(e):ll(e);return t.length>0?t:void 0}function pl(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 fl(e,t){return e?{...e,...t,placement:t.placement,render:t.render,config:t.config,externalRefs:t.externalRefs,metadata:t.metadata??e.metadata,endpoints:pl(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=>fl(o.get(i.id),{id:i.id,...el(i),label:i.data?.label??i.id,placement:ol(i),render:rl(i),config:il(i),externalRefs:nl(i),metadata:o.get(i.id)?.metadata,endpoints:ul(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:al(e.nodes,t?.ui),metadata:t?.metadata}}function gl(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 xa(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 ml(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:xa(r),cableType:r.cableType,connectorType:r.connector,compatibility:r.compatibility&&r.compatibility.length>0?[...r.compatibility]:void 0,position:nr(r.layout)}))}function bl(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:xa(n),cableType:n.cableType,connectorType:n.connector,compatibility:n.compatibility&&n.compatibility.length>0?[...n.compatibility]:void 0,position:nr(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:nr(i.position)}))}))}function hl(e,t,o){if(!t&&!o)return e;let r={...e};t&&(Xn.forEach(a=>{let i=t[a];i!==void 0&&(r[a]=i);}),t.images&&Vn.forEach(a=>{let i=t.images?.[a];i!==void 0&&(r[a]=i);}),t.dimensions&&jn.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 yl(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 wa(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 Yn(e){let t=gl(e.edges),o=e.ui?.nodeState??{},r=e.nodes.map(i=>{let s=tl(i),c={label:i.label,...i.config??{}};if(c=hl(c,i.render,o[i.id]),c=yl(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=ml(i.endpoints,t,i.id));else if(s==="vertical-pdu"){let d=(i.endpoints??[]).filter(f=>f.face!=="front");d.length>0&&(c.pduPortGroups=bl(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:Na(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:wa(n.get(i.source.nodeId),i.source.endpointId,"source")}:{},...i.target.endpointId?{targetHandle:wa(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 ka=20,Gt=60,Kn=300;var To=5;function Pa(e){return e==="system"?typeof window<"u"&&window.matchMedia&&window.matchMedia("(prefers-color-scheme: light)").matches?"light":"dark":e}function Da(e,t){let r=Pa(e)==="light"?"react-flow-light":"react-flow-dark";return t?`${r} ${t}`:r}function Ca(e){return Pa(e)==="light"?"#e5e5e5":"#2a2a2a"}function Ra(e,t){return {width:"100%",height:"100%",...t}}var Ea=["device","server","switch","router"],wl=[...Ea,"vertical-pdu"],Nl=new Set(Ea),xl=new Set(wl);function eo(e){return typeof e=="string"&&Nl.has(e)}function kl(e){return typeof e=="string"&&xl.has(e)}function to(e){return !!e&&eo(e.type)}function Io(e){return !!e&&kl(e.type)}var va=(o=>(o.FULL="full",o.HALF="half",o))(va||{});function Ta(e){return typeof e=="string"&&e.trim().length>0}function qn(e){let{ports:t,rearPorts:o}=Le(e),r=or(t)>0||Ta(e.frontImageUrl),n=or(o)>0||Ta(e.rearImageUrl);if(r&&n)return "both";if(r)return "front";if(n)return "rear"}function Pl(e){if(e.face==="front"||e.face==="rear")return e.face}function Ia(e,t,o,r){let n=e.mountMode;if(n==="front"||n==="rear"||n==="both")return n;let a=qn(e);if(a)return a;let i=Pl(e);if(i)return i;let s=o+r/2;return t>=s?"front":"rear"}var Dl=24,Cl=4;function Rl(e){return e?.rackLayout==="split-face"?"split-face":"single-face"}function Te(e){return Rl(e)==="split-face"}function It(e){return typeof e?.rackFaceGapPx=="number"&&Number.isFinite(e.rackFaceGapPx)&&e.rackFaceGapPx>=0?e.rackFaceGapPx:Dl}function ht(e){return e?.rackWidthPx||300}function Ut(e){return ht(e)*1.75/19}function Gr(e){let t=ht(e);return Te(e)?t*2+It(e):t}function yt(e){let t=e?.uHeight??42,o=Ut(e);return {width:Gr(e),height:60+t*o}}function Zn(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 Ue(e){if(e?.mountMode==="front"||e?.mountMode==="rear"||e?.mountMode==="both")return e.mountMode;let t=qn(e??{});return t||"both"}function So(e){return e==="front"?["front"]:e==="rear"?["rear"]:["front","rear"]}function Ur(e,t){let o=new Set(So(e));return So(t).some(n=>o.has(n))}function Vr(e,t){return Te(e)&&Ue(t)==="front"?ht(e)+It(e):0}function Sa(e,t){return t.isRackMounted!==true||t.splitFaceLayout?e:t.deviceWidth==="half"?Math.floor(e/2):e+Cl}function Fa(e,t){return Te(e)&&Ue(t)==="both"?Gr(e):ht(e)}var _a=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,El=()=>"bottom-up",ro=e=>e.data.uNumberingDirection||El(),jr=(e,t,o)=>o==="bottom-up"?t-e+1:e,Xr=(e,t,o)=>o==="bottom-up"?t-e+1:e;var Yr=(e,t,o,r)=>{let n=_a(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=Ut(t.data),d=60,f=o.y-d,g=Math.round(f/c)+1,l;s==="bottom-up"?l=jr(g,i,s)-a+1:l=jr(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=Kr(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:Vr(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=Xr(h,i,s);w=d+(x-1)*c-1;}else {let h=Xr(m,i,s);w=d+(h-1)*c-1;}return {x:Vr(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)&&_a(d)===e.id&&d.id!==t.id),s=Te(e.data),c=Ue(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=Ue(d.data);if(!Ur(c,h))continue}return false}}return true},Kr=(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},Fo=(e,t,o=1,r)=>{let n=60,a=ro(e),i=e.data.uHeight||42,s=Ut(e.data),c=Xr(t,i,a),d;if(a==="bottom-up"){let f=t+o-1,g=Xr(f,i,a);d=n+(g-1)*s-1;}else d=n+(c-1)*s-1;return {x:Vr(e.data,r),y:d}},Ha=(e,t,o)=>{let r=e.data.uHeight||1,n=Fo(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}}},vl=(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?Ha(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 Fl=({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=Te(e),u=Ut(e),m=Gr(e),w=yt(e),h=ht(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"},R=useStoreApi(),[D,y]=useState(e.showUMarkers!==void 0?e.showUMarkers:true),E=()=>{let A=ro({data:e})==="bottom-up"?"top-down":"bottom-up",{getNodes:L,setNodes:B}=R.getState();B(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)R.getState().getNodes().filter(L=>L.parentId===o).forEach(L=>{r(L.id,F);});else {let{getNodes:A,setNodes:L}=R.getState();L(A().map(B=>B.id===o?{...B,data:{...B.data,face:F}}:B.parentId===o?{...B,data:{...B.data,face:F}}:B));}},M=()=>{let F=[],A=60,L=ro({data:e});for(let B=1;B<=d;B++){let z=A+(B-1)*u-4,Q=jr(B,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},B));}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(),E();},style:{background:"#374151",color:"#9ca3af",border:"1px solid #4b5563",borderRadius:"2px",padding:"2px 6px",fontSize:"8px",cursor:"pointer",fontFamily:"monospace"},title:`Switch U numbering to ${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()})]})},Jn=ue.memo(Fl,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.data===t.data&&e.isDragOver===t.isDragOver);var Qn=({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%"}})]})};var Ma=["#1f77b4","#ff7f0e","#2ca02c","#8c564b","#708090","#ffffff","#d62728","#000000","#ffdf00","#8a2be2","#ff69b4","#00ffff"];function Ve(e){let t=(e-1)%12;return Ma[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 ei(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 Al(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 $l=({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:R,highlight:D,highlightColor:y,highlightWidth:E}=s||{},_=!!D;if((R||P&&P.length>=6&&P.length<=12)&&P)return Al(e,g,P,c??false,d??{},l,u,s);let F=c?3:2,A=E??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"]})]})})]})},Jr=ue.memo($l);var Ol=.7,Ba=.28,Ho=e=>typeof e=="number"&&Number.isFinite(e)?e:void 0,zl=({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=Ho(c?.powerStrokeWidth)??Ho(l.strokeWidth),m=typeof c?.powerStrokeDasharray=="string"?c.powerStrokeDasharray:typeof l.strokeDasharray=="string"?l.strokeDasharray:void 0,w=Ho(s.opacity)??Ho(c?.opacity)??Ho(c?.powerOpacity)??Ho(l.opacity),h=E=>{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,...E!==void 0?{opacity:E}:{},...s}},x=!!c?.highlight,P=c?.highlightColor??c?.color??"#f59e0b",R=h(x?w!==void 0?Math.min(w,Ba):Ba:w),D=typeof R.strokeWidth=="number"?R.strokeWidth:3,y=c?.highlightWidth??D*2.5;return jsxs(Fragment,{children:[x?jsx(BaseEdge,{id:`${e}-highlight`,path:f,markerEnd:d,style:{...R,stroke:P,strokeWidth:y,opacity:Ol,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:R})]})},ti=ue.memo(zl);function Xl(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,R,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,E)=>{let M=(l-E)*u;return jsx("path",{d:P,stroke:y.base,strokeWidth:M,fill:"none",strokeLinecap:"butt",opacity:y.striped?.9:1,style:d},`${e}-ribbon-${E}`)}),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(${R}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 Yl=({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 Xl(e,t,o,r,n,a,i,l,c??false,d??{},s);let R=c?4:3,D=h??R*3,y={...d,stroke:g,strokeWidth:R};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":`${R}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})]})},Wa=ue.memo(Yl);function ql({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 Zl(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 R=(s-x)*c;return jsx("path",{d:t,stroke:h.base,strokeWidth:R,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 Va=({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,R=ql({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i});if((m||u&&u.length>=6&&u.length<=12)&&u)return Zl(e,R,u,c??false,d??{},s);let y=c?3:2,E=x??y*3,_={...d,stroke:g,strokeWidth:y,strokeDasharray:"none"};return jsxs(Fragment,{children:[P&&jsx(BaseEdge,{id:`${e}-highlight`,path:R,style:{...d,stroke:h??g,strokeWidth:E,opacity:.7,strokeDasharray:"14 10","--rn-edge-highlight-from":`${y}px`,"--rn-edge-highlight-to":`${E}px`}}),jsx(BaseEdge,{id:e,path:R,style:_}),l&&jsx(BaseEdge,{id:`${e}-stripe`,path:R,style:{...d,stroke:"#000",strokeWidth:1.5,strokeDasharray:"6 6",opacity:.9}})]})};var Ya=({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,[R,D,y]=getBezierPath({sourceX:t,sourceY:o,sourcePosition:a,targetX:r,targetY:n,targetPosition:i}),E={...s,stroke:g,strokeWidth:x,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:"none"};return jsxs(Fragment,{children:[h&&jsx(BaseEdge,{id:`${e}-highlight`,path:R,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:R,markerEnd:d,style:E}),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 ou(e,t,o){return Math.max(t,Math.min(o,e))}function Ka(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:ou(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 ru(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 qa(e,t,o){return o.mode==="px"?o.value:(e-t)*o.value}function Za(e,t){return t===true||e==="fill"?"100% 100%":e==="none"?"auto":e==="contain-height"?"auto 100%":e==="scale-down"?"contain":e??"cover"}function ri(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]=ru(n);return {width:a,height:i,offsetX:qa(e,a,Ka(s)),offsetY:qa(t,i,Ka(c))}}var nu={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 iu(e){return [e.group,e.sourceTypeLabel,e.label,e.id,e.connectorType].filter(t=>typeof t=="string"&&t.trim().length>0).join(" ").toLowerCase()}function en(e){let t=String(e.type??"").toLowerCase(),o=String(e.label??"").toLowerCase(),r=iu(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 ni(e){let t=typeof e=="string"?e:en(e);if(t!=="generic")return nu[t]}var au={portClickEnabled:false},Qa=ue.createContext(au),ii=Qa.Provider;function ai(){return ue.useContext(Qa)}function si(e,t,o){return e?.length?e.some(r=>r.nodeId===t&&r.handleId===o):false}var cu="#6b7280",du="#374151",ci="#10b981",lu="100% 100%",tn=1,uu={smf:"#fbbf24",cat6:"#8b5cf6",om3:"#06b6d4",om4:"#8b5cf6",om5:"#84cc16",cat5e:"#3b82f6",cat6a:"#ef4444",cat7:"#f97316",fiber:"#3b82f6",ethernet:"#10b981"},pu=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,fu=/^data:image\//i,gu=typeof window<"u"?ue.useLayoutEffect:ue.useEffect,ts=new Map;function mu(e){return (e??"").toLowerCase().replace(/_/g,"-")}function bu(e){return !pu.test(e)&&!e.startsWith("//")}function os(e){if(!e)return;let t=e.trim();if(t){if(bu(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:"&&fu.test(t)?t:void 0}catch{return}}}function hu(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 Mo(e){return _e(e.type)}function ui(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":Bn(t)}function di(e,t){return ut(e,t)}function wu(e,t,o,r,n){let a=t.length>0||!!r,i=o.length>0||!!n;return e||(a?"front":i?"rear":"front")}function Nu(e){let t=ts.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 ts.set(e,o),o}function rs(e){let[t,o]=ue.useState(void 0);return ue.useEffect(()=>{let r=false;return e?(Nu(e).then(n=>{r||o(n);}),()=>{r=true;}):(o(void 0),()=>{r=true;})},[e]),t}function xu(e){return Mo(e)?e.type==="power_c19"?"#fbbf24":"#f59e0b":e.type==="console"||e.type==="mgmt"?"#8b5cf6":e.type==="usb"?ci:e.cableType?uu[e.cableType]??ci:ci}function ku(e){return e.connected?xu(e):cu}function ns(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 Pu(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 li(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 cs(e){return e.type==="console"||e.type==="usb"}function ds(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(4,Math.min(5,Math.round(t*.6)))}}function ls(e){let t=Math.max(e.width+1,7);return {width:t,height:Math.max(3,Math.min(4,Math.round(t*.5)))}}function us(e,t){return en({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 is(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=ni({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"?ls(o):cs(e)?ds(o):o}function Du(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 Cu(e,t,o,r){if(!(!r||!dr(e))&&us(e,t)==="sfp")return Du(o)}function dr(e){return typeof e.position?.xPercent=="number"&&typeof e.position?.yPercent=="number"}function Ru(e,t,o,r){if(!dr(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 as(e,t,o,r){let n=li(t),a=e.flatMap(h=>h.ports.filter(x=>!Mo(x)).map(x=>Ru(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 R=a[P],D=Math.abs(x.x-R.x),y=Math.abs(x.y-R.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 Eu(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 vu(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 Tu(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??vu(h,x),R=a?.width??r,D=a?.height??n,y=a?.offsetX??0,E=a?.offsetY??0,_=t/2+tn,M=Math.max(_,r-t/2),F=o/2+tn,A=Math.max(F,n-o/2),L=y+R*h/100,B=E+D*x/100,z=a?L:je(L,_,M),Q=a?B:je(B,F,A);return {position:Eu(P),style:{left:`${z-t/2-tn}px`,top:`${Q-o/2-tn}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 fs(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 ss(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 Iu(e,t,o,r,n){let a=ui(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 Su(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 fs(e,t,o,r)}function Fu(e,t,o,r,n,a,i,s,c){if(s==="patch-panel"||s==="switch")return fs(t,o,r,a);if(Mo(e)){let g=ui(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 _u(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 Hu=({id:e,data:t,selected:o})=>{let r=useUpdateNodeInternals(),{highlightedPortHandles:n,onPortClick:a,portClickEnabled:i}=ai(),{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:R,stretchToFit:D,showDeviceImages:y=true}=t,{ports:E,rearPorts:_}=ue.useMemo(()=>Le(t),[t]),M=mu(d),F=m??300,A=t.isRackMounted===true&&x===void 0&&D!==true,L=ue.useMemo(()=>Za(A?"fill":x,D),[x,A,D]),B=ue.useMemo(()=>os(w),[w]),z=ue.useMemo(()=>os(h),[h]),Q=rs(B),oe=rs(z),I=Te(t),H=Ue(t),q=wu(u,E,_,w,h),Y=ue.useMemo(()=>I?So(H):[q],[I,H,q]),U=Y[0]??q,V=I&&H==="both",Ne=t.isRackMounted===true?Ut(t):20,ee=g*Ne,xe=It(t),pe=F+xe,re=ue.useMemo(()=>Sa(F,{isRackMounted:t.isRackMounted,splitFaceLayout:I,deviceWidth:l}),[t.isRackMounted,F,I,l]),be=ue.useMemo(()=>ri(re,ee,Q,L,P??"center"),[re,ee,Q,L,P]),Ce=ue.useMemo(()=>ri(re,ee,oe,L,P??"center"),[re,ee,oe,L,P]),Xe=ue.useMemo(()=>U==="rear"?Ce:be,[U,be,Ce]),wo=y&&(U==="rear"?!!z:!!B),Qe=t.isRackMounted===true&&wo&&!V,le=U==="rear"?_:E,Yt=ue.useMemo(()=>le.flatMap(G=>G.ports).filter(G=>!Mo(G)),[le]),No=ue.useMemo(()=>!Qe||!((M==="switch"||M==="patch-panel"||M==="router")&&Yt.length>=24)?false:Yt.every(Z=>dr(Z)),[Yt,M,Qe]),Dr=ue.useMemo(()=>[I?"split":"single",H,Y.join(","),U,M,s,L,P??"center",be?`${be.width}:${be.height}:${be.offsetX}:${be.offsetY}`:"",Ce?`${Ce.width}:${Ce.height}:${Ce.offsetX}:${Ce.offsetY}`:"",ee.toString(),re.toString(),pe.toString(),ns(E),ns(_)].join("|"),[I,H,Y,U,M,s,L,P,be,Ce,ee,re,pe,E,_]);gu(()=>{r(e);},[Dr,e,r]);let te=ue.useCallback(G=>{let Z=G==="rear"?z:B;return Z?{backgroundImage:hu(Z),backgroundSize:L==="100% 100%"?lu:L,backgroundPosition:P??"center",backgroundRepeat:R??"no-repeat"}:{}},[z,B,L,P,R]),kt=ue.useMemo(()=>te("front"),[te]),Pt=ue.useMemo(()=>te("rear"),[te]),ye=U==="rear"?Pt:kt,Me=ue.useMemo(()=>yu(L),[L]),Dt,gt;if(I)Dt=`${Fa(t,t)+4}px`,gt=void 0;else {let G=F+4,Z=Math.floor(F/2);Dt=l==="half"?`${Z}px`:`${G}px`,gt=l==="half"?`${Z}px`:void 0;}let Cr=M==="server"&&g===1,et=wt(c),Ct={"--rn-device-bg-image":y&&!V?String(ye.backgroundImage??"none"):"none","--rn-device-bg-position":String(ye.backgroundPosition??"center"),"--rn-device-bg-repeat":String(ye.backgroundRepeat??"no-repeat"),"--rn-device-bg-size":String(ye.backgroundSize??"cover"),"--rn-device-border-color":et,"--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":gt??"auto","--rn-device-status-color":et,"--rn-device-translate-y":Cr?"-1px":"0px","--rn-device-width":Dt},Ye=ue.useMemo(()=>{if(!Qe)return;let G={position:"absolute",top:"2px",zIndex:2,padding:0,justifyContent:"flex-start",pointerEvents:"none"},Z=g>1?24:8;if(!Xe)return No?{...G,display:"none"}:{...G,left:"4px",right:`${Z}px`,alignItems:"flex-start"};let he=4,ke=Math.max(0,Math.floor(Xe.offsetX)-he),Ie=Math.max(0,Math.floor(re-(Xe.offsetX+Xe.width))-he);if(Math.max(ke,Ie)>=56){let tt=Ie>ke;return {...G,left:tt?"auto":`${he}px`,right:tt?`${he}px`:"auto",width:`${Math.max(48,Math.max(ke,Ie))}px`,alignItems:tt?"flex-end":"flex-start"}}return No?{...G,display:"none"}:{...G,left:"4px",right:`${Z}px`,alignItems:"flex-start"}},[Xe,re,No,g,Qe]),Rr=ue.useMemo(()=>{let G=new Set;for(let Z of E)for(let he of Z.ports)G.add(di(Z.name,he));return G},[E]),we=ue.useMemo(()=>{let G=new Set;for(let Z of _)for(let he of Z.ports)G.add(di(Z.name,he));return G},[_]),Ee=ue.useCallback((G,Z,he=false)=>Z==="rear"&&(V||he)&&Rr.has(G)?`${G}--rear`:Z==="front"&&he&&we.has(G)?`${G}--front`:G,[Rr,we,V]),mt=ue.useCallback((G,Z,he=0,ke=re,Ie=false)=>{let tt=[];if(G.length===0)return tt;let ot=Z==="rear"?Ce:be,Kt=li(ke),Er=!!(ot&&G.some(se=>se.ports.some(Ae=>!Mo(Ae)&&dr(Ae)))),{width:Xo,height:Yo}=M==="switch"||M==="patch-panel"?Er?as(G,ke,ee,ot):li(ke):as(G,ke,ee,ot),xo=G.reduce((se,Ae)=>se+Ae.ports.length,0),at=(M==="switch"||M==="patch-panel")&&xo>=24,vr=M!=="switch"&&M!=="patch-panel"&&xo>=24;for(let se of G)for(let Ae=0;Ae<se.ports.length;Ae+=1){let fe=se.ports[Ae],Tr=di(se.name,fe),st=Mo(fe),At=us(fe,se.name),We=Xo,Ke=Yo;if(st){let ge=ui(fe,s),dt=Wt(ge);We=dt.width,Ke=dt.height;}else if(fe.type==="usb"){let ge=ls(Kt);We=ge.width,Ke=ge.height;}else if(At==="sfp"||At==="qsfp"||At==="osfp"){let ge=is(fe,se.name,Kt,ot);ot&&dr(fe)?We=vr?Xo:ge.width:We=ge.width,Ke=ge.height;}else if(At==="rj45"||At==="console"){let ge=is(fe,se.name,Kt,ot);We=ge.width,Ke=ge.height;}else if(cs(fe)){let ge=ds(Kt);We=ge.width,Ke=ge.height;}let Ko=ku(fe),Ir=fe.connected?Ko:du,Sr=Pu(We,Ke,Ko,Ir),qo=Z==="front"?st?Iu(fe,Ae,se.ports.length,ee,s):at?ss(Ae,se.ports.length,We,Ke,ke,ee):Su(Ae,se.ports.length,We,ke):!st&&at?ss(Ae,se.ports.length,We,Ke,ke,ee):Fu(fe,Ae,se.ports.length,We,Ke,ke,ee,M,s),rt=Tu(fe,We,Ke,ke,ee,ot),$t=rt?st?{position:rt.position,style:{...qo.style,...rt.style}}:rt:qo,Lt=Cu(fe,se.name,$t.position,ot),Sn=Lt?{"--rn-hit-expand-top":`${Lt.top}px`,"--rn-hit-expand-right":`${Lt.right}px`,"--rn-hit-expand-bottom":`${Lt.bottom}px`,"--rn-hit-expand-left":`${Lt.left}px`}:{},Fr=Lt?"rn-port-hitbox":void 0,ne={...{...Sr,...$t.style,...Sn}};ne.left!==void 0&&he!==0&&(typeof ne.left=="number"?ne.left=`${ne.left+he}px`:ne.left=`calc(${ne.left} + ${he}px)`),V&&ne.left===void 0&&($t.position===Position.Left?(ne.left=`${he}px`,ne.right=void 0):$t.position===Position.Right&&(ne.left=`${he+ke}px`,ne.right=void 0));let ct=Ee(Tr,Z,Ie),J=!Ie&&si(n,e,ct),Se=Ie?{opacity:0,pointerEvents:"none"}:{},_r=[Fr,Ie?"rn-port-handle--ghost":void 0,!Ie&&i?"rn-port-handle--clickable":void 0,J?"rn-port-handle--highlighted":void 0].filter(Boolean).join(" "),Et=_u(st,M,Z,fe.connected);if(Et.secondary){let ge=M==="switch"||M==="router"?{...ne,background:"transparent",border:"none",opacity:0}:ne,dt=M==="switch"||M==="router"?`${se.name} - ${fe.label} (input) ${fe.connected?"(connected)":"(disconnected)"}`:`${se.name} - ${fe.label} (${Et.secondary}) ${fe.connected?"(connected)":"(disconnected)"}`;tt.push(jsx(Handle,{id:`${ct}-${Et.secondary}`,type:Et.secondary,position:$t.position,className:[Fr,Ie?"rn-port-handle--ghost":void 0].filter(Boolean).join(" ")||void 0,style:{...ge,...Se},title:Ie?`${dt} (hidden face)`:dt},`${ct}-${Et.secondary}`));}tt.push(jsx(Handle,{id:ct,type:Et.primary,position:$t.position,className:_r||void 0,style:{...ne,...Se},title:`${se.name} - ${fe.label} ${fe.connected?"(connected)":"(disconnected)"}${Ie?" (hidden face)":""}`,onClick:!Ie&&i&&a?ge=>{ge.stopPropagation(),a({nodeId:e,handleId:ct,groupName:se.name,portLabel:fe.label,face:Z});}:void 0,children:st&&!Ie?Ae+1:void 0},ct));}return tt},[ee,re,be,n,e,s,M,a,i,Ce,Ee,V]),jo=ue.useMemo(()=>{let G=[];for(let Z of Y){if(Z==="front"&&E.length>0){let he=V?pe:0;G.push(...mt(E,"front",he,re));}Z==="rear"&&_.length>0&&G.push(...mt(_,"rear",0,re));}if(M==="patch-panel"){let Z=new Set(Y);!Z.has("front")&&E.length>0&&G.push(...mt(E,"front",0,re,true)),!Z.has("rear")&&_.length>0&&G.push(...mt(_,"rear",0,re,true));}return G},[Y,E,_,mt,re,V,pe,M]);return jsxs("div",{className:`device-node ${o?"selected":""} ${V?"device-node--split-both":""}`,style:Ct,children:[y&&!V&&wo&&jsx("div",{className:"device-node__image-layer","aria-hidden":"true",children:jsx("img",{className:"device-node__image",src:U==="rear"?z:B,alt:"",draggable:false,style:{objectFit:Me,objectPosition:P??"center"}})}),y&&V&&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(Pt.backgroundImage??"none"),backgroundPosition:String(Pt.backgroundPosition??"center"),backgroundRepeat:String(Pt.backgroundRepeat??"no-repeat"),backgroundSize:String(Pt.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:`${xe}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(kt.backgroundImage??"none"),backgroundPosition:String(kt.backgroundPosition??"center"),backgroundRepeat:String(kt.backgroundRepeat??"no-repeat"),backgroundSize:String(kt.backgroundSize??"cover")},children:B?jsx("img",{className:"device-node__image",src:B,alt:"",draggable:false,style:{objectFit:Me,objectPosition:P??"center"}}):null})]}),jsxs("div",{className:`device-node__content ${Qe?"device-node__content--image-badge":""}`,style:Ye??{position:"relative",zIndex:1},children:[jsx("div",{className:`device-node__label ${Qe?"device-node__label--badge":""}`,children:s}),!Qe&&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"}),jo]})},Ao=ue.memo(Hu,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var rn=20,$o=3,an=2,Au=1,fi=2,ms=6,$u=12;function pi(e){return Math.max(0,Math.min(100,e))}function gi(e,t,o){return Math.max(t,Math.min(o,e))}function Lu(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 nn(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 Bu(e,t){let o=nn(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 Ou(e){if(Array.isArray(e.pduPortGroups)&&e.pduPortGroups.length>0)return e.pduPortGroups;let t=Un(e);if(t.length>0)return t;let o=Gn(e);return o.length>0?o:[]}function zu(e,t){return !Array.isArray(e.portTypes)||e.portTypes.length===0?Array.from({length:t},(o,r)=>nn(Tt(r))??"C13"):Array.from({length:t},(o,r)=>{let n=nn(e.portTypes?.[r]);return n||(nn(Tt(r))??"C13")})}function Wu(e,t){let o=Ou(e),r=zu(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:ut(i.name,s),label:s.label,connectorType:Bu(s,c),groupName:i.name,position:nt(s.position)}),a+=1;});}),n}function Gu(e){return Wt(e.connectorType).height}function Uu(e,t){return !e||t<=0?-1:e==="top"?0:e==="bottom"?t:Math.floor(t/2)}function bs(e,t){let o=[],r=t>=0,n=r?gi(t,0,e.length):-1;for(let a=0;a<=e.length;a+=1)r&&a===n&&o.push({kind:"mgmt",height:$u}),a<e.length&&o.push({kind:"port",portIndex:a,height:Gu(e[a]),groupName:e[a].groupName});return o}function hs(e,t){return e.kind==="port"&&t.kind==="port"?e.groupName===t.groupName?fi:ms:fi}function Vu(e,t){let o=bs(e,t);if(o.length===0)return Math.max(an+$o+1,1);let r=0;for(let n=0;n<o.length;n+=1)r+=o[n].height,n<o.length-1&&(r+=hs(o[n],o[n+1]));return an+r+$o}function ju(e,t,o){let r=bs(e,o);if(r.length===0)return {portCenters:[]};let n=[];for(let w=0;w<r.length-1;w+=1)n.push(hs(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-an-$o,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===ms?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=an+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]??fi);}return {portCenters:l,mgmtCenterY:u}}function Xu(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"?pi(e.offsetPercent):void 0,d=typeof e.offsetPx=="number"?e.offsetPx:void 0,f=typeof e.xPercent=="number"?pi(e.xPercent):void 0,g=typeof e.yPercent=="number"?pi(e.yPercent):void 0;if(f!==void 0&&g!==void 0){let m=i??Lu(f,g),w=m==="left"?Position.Left:m==="top"?Position.Top:m==="bottom"?Position.Bottom:Position.Right,h=Math.max(o-$o,1),x=r*f/100,P=gi(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-$o,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-$o,1)*c/100),i==="left"?l=n/2:i==="right"&&(l=r-n/2-1)),u=gi(u,a/2,Math.max(a/2,o-a/2)),{position:s,leftPx:l-n/2,topPx:u-a/2}}function Yu(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 Ku=({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=Wu(e,c),f=Uu(s,d.length),g=n*4.2,l=Vu(d,f),u=Math.max(g-rn,l),m=Math.max(i-Au*2,1),w=rn+u,h=ju(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:`${rn}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-rn}px`,overflow:"hidden"},children:[typeof h.mgmtCenterY=="number"?Yu(h.mgmtCenterY,m):null,d.map((x,P)=>{let R=h.portCenters[P]??u/2,D=Wt(x.connectorType),y=Xu(x.position,R,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}`)})]})]})},bi=ue.memo(Ku,(e,t)=>e.id===t.id&&e.selected===t.selected&&e.dragging===t.dragging&&e.data===t.data);var hi=({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,E)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`left-${E}`))}),jsx("div",{style:{display:"flex",flexDirection:"column",width:"100%",height:"100%"},children:x.map((y,E)=>jsx("div",{style:{flex:1,background:y.base,opacity:y.striped?.9:1}},`right-${E}`))})]}):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 fr=20,sn=36;var uo=32,Ns=4,jt=12,Zu=69,po=80,yi=(po-Zu)/2;var wi=(e,t,o,r)=>{if(!e.parentId||e.parentId!==t.id)return o;let n=e.data?.mode==="ribbon",a=n?sn:fr,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(!pr(t,e,g,r)){let m=gr(t,e,r,g);if(m!==g){let w=(a-i)/2;return {x:yi,y:s+(m-1)*a+w,holderPosition:m}}}let l=(a-i)/2,u=s+(g-1)*a+l;return {x:yi,y:u,holderPosition:g}},pr=(e,t,o,r)=>!r.filter(a=>a.parentId===e.id&&a.type==="splice"&&a.id!==t.id).some(a=>a.data.holderPosition===o),gr=(e,t,o,r=1)=>{for(let n=r;n<=jt;n++)if(pr(e,t,n,o))return n;for(let n=r-1;n>=1;n--)if(pr(e,t,n,o))return n;return 1},Ju=(e,t)=>mr(e,t,false),mr=(e,t,o=false)=>{let r=uo,n=o?sn:fr,i=(n-(o?32:16))/2,s=r+(t-1)*n+i;return {x:yi,y:s}};var ki=({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)*fr;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:`${fr}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*sn+Ns}px`,color:"white",fontFamily:"monospace",fontSize:"12px",boxShadow:t?"0 0 0 2px #3b82f6":"0 2px 4px rgba(0,0,0,0.1)",position:"relative",display:"flex",flexDirection:"column"},children:[jsxs("div",{style:{textAlign:"center",marginBottom:0,zIndex:2,background:"#1f2937",padding:"2px",position:"relative",height:`${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 Pi=({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=`tube-${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,R=u*m+(u-1)*w,D=Math.max(60,R+h*2+x*2),y=a==="left"?Position.Left:a==="right"?Position.Right:Position.Bottom,E=y!==Position.Bottom,_=E?14:20,M=E?8:20,F=E?`inset ${y===Position.Left?"-4px":"4px"} 0 0 rgba(0, 0, 0, 0.35)`:"none",A=d?l:E?`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:E?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)}:{}},B=useMemo(()=>{let z=[],Q=D-x*2-h*2,oe,I,H=false;a==="left"?(oe=h,I=Position.Top):a==="right"?(oe=h+Q-R,I=Position.Top,H=true):(oe=h+(Q-R)/2,I=Position.Top);for(let q=0;q<u;q++){let Y=H?u-q:q+1,U=`fiber-${Y}`,V=s.find(Xe=>Xe.source===o&&Xe.sourceHandle===U||Xe.target===o&&Xe.targetHandle===U),Ne=!!V&&(V.data?.isRibbon||V.data?.ribbonFiberIds&&Array.isArray(V.data.ribbonFiberIds)),ee=V?.data?.color,xe=typeof V?.data?.striped=="boolean"?V.data.striped:void 0,pe=Ft(Y);i||Ne?pe=Ft(Y,{base:"#808080",striped:false}):(ee||xe!==void 0)&&(pe=Ft(Y,{...ee?{base:ee}:{},...xe!==void 0?{striped:xe}:{}}));let re=oe+q*(m+w),be=h,Ce={position:"absolute",left:`${re}px`,top:`${be}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),z.push(jsx(Handle,{id:U,type:"source",position:I,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:Ce,"data-fiber-idx":Y,"data-fiber-color":pe.base},`fiber-${Y}`));}return z},[u,a,D,s,o,m,w,h,x,R,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:[B,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 Di=({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),R=a||P,D=t?"#3b82f6":R,y=typeof i=="number"?i:0,E=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=E(y);for(let q=0;q<c;q++){let Y=q+1,U=Ft(Y),V=U.base,Ne=g+q*(d+f),ee=-5,xe=U.backgroundImage?U.backgroundImage:V,pe={position:"absolute",left:`${Ne}px`,top:`${ee}px`,width:d,height:d,borderRadius:"50%",border:"none",background:xe,backgroundColor:V,zIndex:10,cursor:"pointer","--fiber-bg":V};U.backgroundImage&&(pe["--fiber-bg-image"]=U.backgroundImage);let re=`fiber-${Y}`;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":Y,"data-fiber-color":V},`fiber-${Y}`));}return I},M="cable-button",F=8,A={width:F,height:F,borderRadius:"50%",background:R,backgroundColor:R,border:`1px solid ${R}`,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`},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:z,className:"cable-button-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:A,"data-handle-type":"cable-button","data-cable-color":R}),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 Ci=({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),R=i??`${P}f Cable`,D=a?`Cable ID ${a}`:void 0,y=Ve(f),E=c||y,_=t?"#3b82f6":E,M=()=>{let z=[];for(let Q=0;Q<d;Q++){let oe=f+Q,I=Ft(oe),H=I.base,q=m+Q*(g+u),Y=-5,U=I.backgroundImage?I.backgroundImage:H,V={position:"absolute",left:`${q}px`,top:`${Y}px`,width:g,height:l,borderRadius:6,border:"none",background:U,backgroundColor:H,zIndex:10,cursor:"pointer","--fiber-bg":H};I.backgroundImage&&(V["--fiber-bg-image"]=I.backgroundImage);let Ne=`tube-${oe}`;z.push(jsx(Handle,{id:Ne,type:"source",position:Position.Top,className:"tube-fiber-handle",isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:V,"data-fiber-idx":oe,"data-tube-idx":oe,"data-tube-color":H},`tube-${oe}`));}return z},F="cable-button",A=8,L={width:A,height:A,borderRadius:"50%",background:E,backgroundColor:E,border:`1px solid ${E}`,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":E}),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:R}),D&&jsx("div",{style:{fontSize:10,opacity:.8},children:D})]})]})};var Ri=({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),R=(E,_)=>{let M=`${E}-${_+1}`;return c.find(A=>A.source===o&&A.sourceHandle===M||A.target===o&&A.targetHandle===M)?.data?.color||"#555"},D=E=>{let _=[],M=E==="left"?Position.Left:Position.Right,F=E==="left"?i:s;for(let A=0;A<f;A++){let L=A+1,B=`${E}-${L}`,z=R(E,A),I=u+(x-h)/2+A*(g+l),H={position:"absolute",left:E==="left"?-5:void 0,right:E==="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:B,type:"source",position:M,isConnectable:true,isConnectableStart:true,isConnectableEnd:true,style:H},B)),F&&F[A]&&_.push(jsx("div",{style:{position:"absolute",left:E==="left"?-30:void 0,right:E==="right"?-30:void 0,top:`${I}px`,transform:"translateY(-50%)",fontSize:"8px",color:"#9ca3af",fontFamily:"monospace",pointerEvents:"none",textAlign:E==="left"?"right":"left",width:"25px"},children:F[A]},`${B}-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,pn=30,ap=24,sp=80,ln=400,un=300,_s=2,fo=8,Hs=120;function vi(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 fn(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 Ms(e){return {width:po,height:0}}function As(e){return e.type==="coupler"?vi(e):e.type==="tube"?fn(e):e.type==="splice-tray"?Ms():{width:80,height:30}}function Ei(e){let t=0;for(let o of e){let r=As(o),n=(o.position?.x||0)+r.width;n>t&&(t=n);}return t}function $s(e,t=0){let o=t;for(let r of e){let n=As(r),a=(r.position?.y||0)+n.height;a>o&&(o=a);}return o}function Ls(e){return e.data?.panelWidth||ln}function cp(e){return e.data?.panelHeight||un}function Bs(e){return Ls(e)-_s*2-fo*2}function dp(e,t){return Bs(e)-t}function Os(e,t=pn){return Math.floor(e/t)+1}function zs(e,t=pn){return (e-1)*t}function lp(e,t,o){let r=pn,n=Os(o.y,r),a=zs(n,r);return {x:o.x,y:a,slotPosition:n}}function Ti(e,t){if(t.length===0)return {width:e.data?.panelWidth||ln,height:e.data?.panelHeight||un};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=fn(l);u.width>c&&(c=u.width);}else if(l.type==="coupler"){let u=vi(l);u.width>d&&(d=u.width);}let f=c+Hs+po+d+To,g=0;a=g+f+g;}else a=Ei(t)+4;a=Math.max(e.data?.panelWidth||ln,a);let i=$s(t,go),s=Math.max(e.data?.panelHeight||un,i+fo);return {width:a,height:s}}function Ws(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 up(e,t,o){return Ws(e,t,o)}var Is=20,Ss=400,Fs=300;function Ii(e,t){if(t.length===0)return {width:e.data?.closureWidth||e.data?.panelWidth||Ss,height:e.data?.closureHeight||e.data?.panelHeight||Fs};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=fn(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+Is+d+Is+c+To;}else n=Ei(t)+fo+To;}else n=Ei(t)+fo+To;n=Math.max(e.data?.closureWidth||e.data?.panelWidth||Ss,n);let a=$s(t,go),i=Math.max(e.data?.closureHeight||e.data?.panelHeight||Fs,a+fo);return {width:n,height:i}}var _i=({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 R=s().filter(D=>D.parentId===o);return (R.length!==f.current.length||R.some((D,y)=>D.id!==f.current[y]?.id))&&(f.current=R),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}:Ti(l,g),[g,l,a,i]);useEffect(()=>{if(a&&i||d.current)return;let P=a,R=i,D=Math.abs((P||0)-u.width),y=Math.abs((R||0)-u.height);(D>1||y>1)&&(d.current=true,c(E=>E.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 Ai=({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 E=d().filter(_=>_.parentId===o);return (E.length!==l.current.length||E.some((_,M)=>_.id!==l.current[M]?.id))&&(l.current=E),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}:Ii(m,u),[u,m,a,i,s,c]);useEffect(()=>{if(a&&i||s&&c||g.current)return;let y=a||s,E=i||c,_=Math.abs((y||0)-w.width),M=Math.abs((E||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,R=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:R})}),jsx("div",{style:{position:"absolute",top:P,left:0,right:0,bottom:0,pointerEvents:"none",overflow:"visible"}})]})};var $i=({data:e,selected:t,id:o})=>{let{label:r,splitterType:n="splitter",inputCount: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),R=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"},E=()=>{let Q=[],oe=g+(R-w)/2;for(let I=0;I<m;I++){let H=`input-${I+1}`,q=oe+I*(d+f),Y=y(H),U={position:"absolute",left:-5,top:`${q}px`,width:d,height:d,borderRadius:"50%",border:"none",background:Y,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:U},H));}return Q},_=()=>{let Q=[],oe=g+(R-x)/2;for(let I=0;I<h;I++){let H=`output-${I+1}`,q=oe+I*(d+f),Y=y(H),U={position:"absolute",right:-5,top:`${q}px`,width:d,height:d,borderRadius:"50%",border:"none",background:Y,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:U},H));}return Q},M=Math.max(w+g*4,u*.6),F=(R-M)/2,A=F+M,L=0,B=R,z=t?"#3b82f6":"#4b5563";return jsxs("div",{className:`trapezoid-node ${t?"selected":""}`,style:{width:D,height:R,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:R,viewBox:`0 0 ${D} ${R}`,style:{position:"absolute",top:0,left:0,width:`${D}px`,height:`${R}px`,pointerEvents:"none",zIndex:0},children:jsx("polygon",{points:`0,${F} 0,${A} ${D},${B} ${D},${L}`,fill:"#1f2937",stroke:z,strokeWidth:"2"})}),E(),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 Xs=e=>e?.type==="tube"||e?.type==="splice"||e?.type==="coupler"||e?.type==="fibre-split"||e?.type==="cable"||e?.type==="multi-tube-cable",hr=(e,t)=>Xs(e)||Xs(t),ce=(e,t)=>t?Re(t):"";function Ys(e,t){if(!e||!t)return "other";switch(e.type){case "tube":return t.startsWith("fiber-")?"tube-fiber":t.startsWith("tube-")?"tube-tube":"other";case "cable":return t.startsWith("fiber-")?"tube-fiber":t==="cable-button"?"cable-button":"other";case "multi-tube-cable":return t.startsWith("tube-")?"cable-tube":t==="cable-button"?"cable-button":"other";case "splice":return t==="left"||t==="right"?"splice-side":"other";case "coupler":return t.startsWith("left-")||t.startsWith("right-")?"coupler-port":"other";case "fibre-split":{let o=Re(t);return o.startsWith("input-")?"splitter-input":o.startsWith("output-")?"splitter-output":"other"}default:return "other"}}var Np=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 Ks(e){return e==="tube-tube"||e==="cable-tube"}function gn(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=Ys(e,t),a=Ys(o,r);return Np.has(`${n}>${a}`)?{valid:true}:Ks(n)&&Ks(a)?{valid:false,reason:"Tube handles can only connect between cable and tube nodes"}:{valid:false,reason:"Connection not allowed by fiber rules"}}var qs="--rear",Zs=new WeakMap;function Bo(e){if(typeof e!="string")return;let t=e.trim().toLowerCase().replace(/[\s_]+/g,"-");return t.length>0?t:void 0}function xp(e){let t=new Set;return e.forEach(o=>{o&&t.add(o);}),[...t]}function Js(...e){let t=e.map(o=>Bo(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 Li(e){let t=[Bo(e.type),Bo(e.cableType),Bo(e.connectorType),Bo(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 yr(e){if(Array.isArray(e.compatibility)&&e.compatibility.length>0)return xp(e.compatibility.map(o=>Bo(o)));if(e.kind==="power"||_e(e.type)){let o=Js(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(e.kind==="network"){let o=Li(e);return o?[`network:${o}`]:["network"]}let t=_e(e.type)?"power":Li(e)?"network":void 0;if(t==="power"){let o=Js(e.connectorType,e.type,e.handleId);return o?[`power:${o}`]:["power"]}if(t==="network"){let o=Li(e);return o?[`network:${o}`]:["network"]}return []}function kp(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=Tt(n);return {id:`${n+1}`,label:`${n+1}`,connected:false,type:a==="C19"?"power_c19":"power_c13",connectorType:a}})}]}function Pp(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:kp(e)}function Dp(e){let t=e?.data;if(!e||!t||typeof t!="object")return new Map;let o=Zs.get(t);if(o)return o;let r=new Map,n=(a,i)=>{i.forEach(s=>{s.ports.forEach(c=>{let d=ut(s.name,{id:c.id,label:c.label,type:_e(c.type)?c.type:void 0});r.set(d,{face:a,kind:_e(c.type)?"power":"network",compatibility:yr({compatibility:c.compatibility,kind:_e(c.type)?"power":"network",type:c.type,cableType:c.cableType,connectorType:c.connectorType,handleId:d})});});});};if(e.type==="vertical-pdu")n("rear",Pp(e));else {let{ports:a,rearPorts:i}=Le(t);n("front",a),n("rear",i);}return Zs.set(t,r),r}function Cp(e,t){if(!e)return "unknown";if(t?.type==="vertical-pdu"||Br(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 Rp(e,t,o){if(!e)return [];if(t==="power")return o?.type==="vertical-pdu"&&/^\d+$/.test(e)?yr({kind:t,connectorType:Tt(Math.max(Number(e)-1,0)),handleId:e}):yr({kind:t,handleId:e});if(t==="network"){let r=e.toLowerCase();return yr({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=zt(t);if(!o)return {normalizedHandle:"",kind:"unknown",compatibility:[]};let r=o,n;r.endsWith(qs)&&(r=r.slice(0,-qs.length),n="rear");let a=Dp(e).get(r),d=(e?.data??{}).handleSideMap?.[r]??n??a?.face;d||(r==="net-top"||r==="net-bottom"?d="front":(r==="pwr-left-1"||r==="pwr-left-2"||r==="net-right-1"||r==="net-right-2"||Br(r))&&(d="rear"));let f=a?.kind??Cp(r,e);return {normalizedHandle:r,face:d,kind:f,compatibility:a?.compatibility.length?a.compatibility:Rp(r,f,e)}}function Ep(e,t){if(e.length===0||t.length===0)return true;let o=new Set(t);return e.some(r=>o.has(r))}function Oi(e){let t=new Map;for(let o of e)t.set(o.id,o);return t}function Bi(e,t,o=Oi(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=hr(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(!Ep(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?gn(r,e.sourceHandle,n,e.targetHandle):{valid:true}}function vp(e,t){if(!t)return;let o=mo(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=Oi(o.nodes),n=new Set;return {getState:()=>o,setState:l=>{o={...o,...l},l.nodes&&(r=Oi(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 R=P.parentNode;if(typeof R=="string")return R},m=P=>{let R=u(P),D=R?r.get(R):void 0;return D?.type!=="rack"?[P.data?.face||vo(P.data)]:D&&Te(D.data)?So(Ue(P.data)):[P.data?.face||vo(P.data)]},w=(P,R)=>{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=vp(R||"",D);if(M)return _.includes(M)?1e3:500;let F=(R||"").toString().replace(/-(source|target)$/i,""),A=F.toLowerCase(),L=A.startsWith("pwr")||A.startsWith("power"),B=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=B||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||Bi;return u===Bi?Bi(l,o,r):u(l,o)},selectNodeById:l=>r.get(l),selectConnectedEdges:l=>o.edges.filter(u=>u.source===l||u.target===l)}}var Ip=e=>e,Sp=e=>e.nodes,Fp=e=>e.edges;function Wi(e,t){let o=useCallback(n=>e.subscribe(a=>n()),[e]),r=useCallback(()=>t(e.getState()),[e,t]);return useSyncExternalStore(o,r,r)}function _p(e){return Wi(e,Ip)}function Gi(e){return Wi(e,Sp)}function Ui(e){return Wi(e,Fp)}function ec(e){return e.selectEdgeZIndex}var Hp=0;function mn(e,t,o,r){let n=`edge-${e.source}-${e.sourceHandle}-${e.target}-${e.targetHandle}-${Date.now()}-${Hp+=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 tc(e,t,o,r){return e.source===t&&r(e.sourceHandle)===o||e.target===t&&r(e.targetHandle)===o}function oc(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=>tc(y,f,m,s)),x=t.filter(y=>tc(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 R=t.filter(y=>!P.has(y.id)),D=mn(o,r,n,d);return {edges:[...R,D],replacedEdgeIds:[...P]}}function Mp(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=mn(o,r,n,s);return [...l,u]}function Ap(e,t){return !e||!t?"unknown":mo(e,t).kind}function bo(e,t){return Ap(e,t)==="power"}var $p=.25;function wr(e){return (e.highlightedNodeIds?.length??0)>0||(e.highlightedEdgeIds?.length??0)>0}function rc(e,t){return wr(t)?t.highlightedNodeIds?.includes(e)??false:true}function nc(e,t,o){return !wr(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 ic(e){return typeof e!="number"||Number.isNaN(e)?.25:Math.min(1,Math.max(0,e))}function Vi(e,t){if(!t.dimUnhighlighted||!wr(t))return e;let o=ic(t.dimOpacity);return e.map(r=>rc(r.id,t)?r:{...r,style:{...r.style??{},opacity:o}})}function ji(e,t){if(!t.dimUnhighlighted||!wr(t))return e;let o=ic(t.dimOpacity);return e.map(r=>nc(r.id,r,t)?r:{...r,style:{...r.style??{},opacity:o},data:{...r.data??{},opacity:o}})}var Lp=new Set(["device","server","switch","router","patch-panel"]);function ac(e){return e.type?Lp.has(e.type)||eo(e.type):false}var Xi=(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 Yi(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&&Xi(f,c)?f:(i=true,c)});return i?s:o}let n=false,a=e.map((i,s)=>{if(!ac(i)){let d=o?.[s];return d?.id===i.id&&d.data===i.data&&Xi(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&&Xi(d,i)?d:(d!==i&&(n=true),i)}return n=true,{...i,data:{...c,showDeviceImages:r}}});return !n&&o?o:a}function cc(e){return !e||e.type!=="splice"?false:e.data?.mode==="ribbon"}function dc(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})},Jp=(e,t,o)=>({rack:r=>jsx(ze,{type:"rack",children:jsx(Jn,{...r,onFaceChange:e,onRackFaceChange:t,isDragOver:o?o()===r.id:false})}),fiber:r=>jsx(ze,{type:"fiber",children:jsx(Qn,{...r})}),device:r=>jsx(ze,{type:"device",children:jsx(Ao,{...r})}),server:r=>jsx(ze,{type:"server",children:jsx(Ao,{...r})}),switch:r=>jsx(ze,{type:"switch",children:jsx(Ao,{...r})}),router:r=>jsx(ze,{type:"router",children:jsx(Ao,{...r})}),"vertical-pdu":r=>jsx(ze,{type:"vertical-pdu",children:jsx(bi,{...r})}),splice:r=>jsx(ze,{type:"splice",children:jsx(hi,{...r})}),"splice-tray":r=>jsx(ze,{type:"splice-tray",children:jsx(ki,{...r})}),tube:r=>jsx(ze,{type:"tube",children:jsx(Pi,{...r})}),cable:r=>jsx(ze,{type:"cable",children:jsx(Di,{...r})}),"multi-tube-cable":r=>jsx(ze,{type:"multi-tube-cable",children:jsx(Ci,{...r})}),coupler:r=>jsx(ze,{type:"coupler",children:jsx(Ri,{...r})}),"patch-panel":r=>jsx(ze,{type:"patch-panel",children:jsx(_i,{...r})}),closure:r=>jsx(ze,{type:"closure",children:jsx(Ai,{...r})}),"fibre-split":r=>jsx(ze,{type:"fibre-split",children:jsx($i,{...r})})});function lc(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 Nr(e){return e?.face==="front"||e?.face==="rear"?e.face:vo(e)}function uc(e,t){return {...e,face:t}}function pc(e,t,o){let r=e.sourceHandle,n=e.targetHandle;return lc(t)&&r&&!bo(t,r)&&(r=zt(r)),lc(o)&&n&&!bo(o,n)&&(n=`${zt(n)}-target`),r===e.sourceHandle&&n===e.targetHandle?e:{...e,sourceHandle:r,targetHandle:n}}var Qp={fiber:Jr,ethernet:Jr,power:ti,smoothstep:Wa,step:Va,"thick-cable":Ya},ef=8192,tf=8192,of=2048,rf=4;function xr(e,t,o){if(!(typeof e!="number"||Number.isNaN(e)))return Math.min(o,Math.max(t,e))}function nf(e){if(e)return {...e,width:xr(e.width,1,ef),height:xr(e.height,1,tf),padding:xr(e.padding,0,of),pixelRatio:xr(e.pixelRatio,.1,rf),quality:xr(e.quality,0,1)}}var fc=({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:R,alignRacksToBottom:D,reAssignable:y=true,colorMode:E="dark",onInit:_,onFlowMethods:M,showDownloadButton:F=false,downloadButtonPosition:A="top-right",downloadButtonText:L="Download Image",downloadButtonStyle:B,useSmoothstepEdgesForTubes:z=false,readOnly:Q=false,interaction:oe,actionPanel:I,fitViewOptions:H,minZoom:q=.1,maxZoom:Y=4,onlyRenderVisibleElements:U=false,highlightedNodeIds:V,highlightedEdgeIds:Ne,dimUnhighlighted:ee,dimOpacity:xe,connectEdgesToHighlightedNodes:pe,showDeviceImages:re,highlightedPortHandles:be,onPortClick:Ce,connectionRadius:Xe,onConnectRejected:wo})=>{let Qe=useCallback((p,b)=>{let N=new Map,k=[],C=[],T=new Map(b.map(S=>[S.id,S])),$=(S,v)=>!S||!v?false:!!(S.startsWith("tube-")||v.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 v=T.get(S.source),O=T.get(S.target),j=S.sourceHandle?`${S.source}:${S.sourceHandle}`:void 0,Fe=j?N.get(j):void 0,bt=S.sourceHandle?$(S.sourceHandle,v):false,Ge=S.targetHandle?`${S.target}:${S.targetHandle}`:void 0,qe=Ge?N.get(Ge):void 0,Zt=S.targetHandle?$(S.targetHandle,O):false;if(Fe&&!bt){s&&console.warn("Duplicate connection detected on source handle, removing:",{handle:j,existingEdge:Fe.id,duplicateEdge:S.id}),C.push(S);continue}if(qe&&!Zt){s&&console.warn("Duplicate connection detected on target handle, removing:",{handle:Ge,existingEdge:qe.id,duplicateEdge:S.id}),C.push(S);continue}k.push(S),j&&!Fe&&N.set(j,S),Ge&&!qe&&N.set(Ge,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]),Dr=ue.useMemo(()=>Qe(No,Yt),[No,Yt,Qe]),te=ue.useMemo(()=>i||zi({nodes:Zn(Yt),edges:Dr,debug:s}),[i,le,s,Dr]),kt=Gi(te),Pt=Ui(te),[ye,Me]=useNodesState(kt),[Dt,gt,Cr]=useEdgesState(Pt),et=ec(te),Ct=useRef(null),[Ye,Rr]=useState(false);useEffect(()=>{let p=()=>{Rr(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 we=Q===true,Ee=useMemo(()=>{let b={...{nodesDraggable:true,nodesConnectable:true,elementsSelectable:!Ye,edgesFocusable:!Ye,edgesReconnectable:true,connectOnClick:true,panOnDrag:true,panOnScroll:!Ye,zoomOnScroll:!Ye,zoomOnPinch:!Ye,zoomOnDoubleClick:!Ye,allowKeyboardDelete:true,showControls:true,showMiniMap:!Ye,showInteractiveControl:true},...oe??{}};return we?{...b,nodesDraggable:false,nodesConnectable:false,elementsSelectable:b.elementsSelectable!==false,edgesFocusable:false,edgesReconnectable:false,connectOnClick:false,allowKeyboardDelete:false,showInteractiveControl:false}:b},[Ye,oe,we]),mt=useMemo(()=>({enabled:I?.enabled??true,showRearToggle:I?.showRearToggle??true,showDeRack:I?.showDeRack??true}),[I]),{toObject:jo,setViewport:G,setNodes:Z,setEdges:he,getNodes:ke,getEdges:Ie,fitView:tt,flowToScreenPosition:ot,getIntersectingNodes:Kt}=useReactFlow(),Er=useRef(n),Xo=useRef(a),Yo=useRef(le),xo=useRef(te),at=useRef({toObject:jo,setViewport:G,setReactFlowNodes:Z,setReactFlowEdges:he,getNodes:ke,getEdges:Ie,fitView:tt});useEffect(()=>{Er.current=n;},[n]),useEffect(()=>{Xo.current=a;},[a]),useEffect(()=>{Yo.current=le;},[le]),useEffect(()=>{xo.current=te;},[te]),useEffect(()=>{at.current={toObject:jo,setViewport:G,setReactFlowNodes:Z,setReactFlowEdges:he,getNodes:ke,getEdges:Ie,fitView:tt};},[jo,G,Z,he,ke,Ie,tt]);let vr=useMemo(()=>({toObject:()=>at.current.toObject(),setViewport:p=>{at.current.setViewport(p);},setNodes:p=>{if(at.current.setReactFlowNodes(p),Yo.current){Er.current?.(p);return}xo.current.setState({nodes:p});},setEdges:p=>{if(at.current.setReactFlowEdges(p),Yo.current){Xo.current?.(p);return}xo.current.setState({edges:p});},toImage:p=>Ct.current?toPng(Ct.current,nf(p)):Promise.reject(new Error("ReactFlow wrapper not available")),getNodes:()=>at.current.getNodes(),getEdges:()=>at.current.getEdges(),fitView:p=>{let{fitView:b,getNodes:N}=at.current;if(p?.nodes&&Array.isArray(p.nodes)&&p.nodes.length>0){let T=p.nodes.map(v=>N().find(O=>O.id===v)).filter(v=>v!==void 0),{nodes:$,...S}=p;b({...S,nodes:T});return}let{nodes:k,...C}=p||{};b(C);}}),[]);useEffect(()=>{M?.(vr);},[M,vr]);let[se,Ae]=useState(false),fe=useCallback(()=>{if(!se){if(!Ct.current){s&&console.error("ReactFlow wrapper ref is not available");return}Ae(true),toPng(Ct.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:E==="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);});}},[E,s,se]),[Tr,st]=useState(null),At=useRef(null),We=useRef(h),Ke=useRef(x);useEffect(()=>{We.current=h;},[h]),useEffect(()=>{Ke.current=x;},[x]),useEffect(()=>{At.current=Tr;},[Tr]);let Ko=useCallback((p,b)=>{We.current?.(p,b);},[]),Ir=useCallback((p,b)=>{Ke.current?.(p,b);},[]),Sr=useCallback(()=>At.current,[]),qo=useRef(wo);useEffect(()=>{qo.current=wo;},[wo]);let rt=useCallback((p,b,N)=>{qo.current?.({connection:p,reason:b,phase:N});},[]),$t=useMemo(()=>({...Jp(Ko,Ir,Sr),...f??{}}),[Ko,Ir,Sr,f]),Lt=useMemo(()=>({...Qp,...g??{}}),[g]),Sn=useMemo(()=>({zIndex:1e3,reconnectable:Ee.edgesReconnectable}),[Ee.edgesReconnectable]),Fr=useMemo(()=>({hideAttribution:true}),[]),Rt=useRef(ye);useEffect(()=>{Rt.current=ye;},[ye]);let ne=useRef(Dt);useEffect(()=>{ne.current=Dt;},[Dt]),useEffect(()=>{Me(kt);},[kt,Me]),useEffect(()=>{gt(Pt);},[Pt,gt]),useEffect(()=>{if(le&&t){let p=Qe(t,e||[]);p.length!==t.length&&(s&&console.warn(`Controlled edges had ${t.length-p.length} duplicate(s) removed`),a?.(p));}},[le,t,e,Qe,a,s]),useEffect(()=>{le&&te.setState({nodes:gc(e||[],te.getState().nodes)});},[le,e,te]),useEffect(()=>{le&&te.setState({edges:mc(t||[],te.getState().edges)});},[le,t,te]),useEffect(()=>{if(!D||!ye||ye.length===0||ye.some(v=>v.dragging))return;let p=ye.filter(v=>v.type==="rack");if(p.length===0)return;let b=p.map(v=>{let O=yt(v.data).height;return (v.position?.y||0)+O}),N=Math.min(...b),k=Math.max(...b);if(k-N<20)return;let T=k,$=ye.map(v=>{if(v.type!=="rack")return v;let O=yt(v.data).height,j=(v.position?.y||0)+O,Fe=T-j;return Math.abs(Fe)<5?v:{...v,position:{x:v.position?.x||0,y:(v.position?.y||0)+Fe}}});if($.some((v,O)=>{let j=ye[O]?.position,Fe=v.position;return j?.x!==Fe?.x||j?.y!==Fe?.y})){if(le){n?.($);return}te.setState({nodes:$});}},[D,ye,le,n,te]);let ct=useRef(new Map);useEffect(()=>{let p=new Map;ye.forEach(b=>{p.set(b.id,b);}),ct.current=p;},[ye]);let J=useCallback(p=>ct.current.get(p),[]),Se=useCallback(p=>{if(!p)return;if(typeof p.parentId=="string")return p.parentId;let b=p.parentNode;if(typeof b=="string")return b},[]),_r=useCallback(p=>{let b=Se(p);if(!b)return;let N=J(b);if(!(!N||N.type!=="rack"))return N},[J,Se]),Et=useCallback(p=>!p||p.type!=="rack"?false:Te(p.data),[]),ge=useCallback(p=>{if(!p||!to(p))return false;let b=_r(p);return b?Te(b.data):false},[_r]),dt=useCallback(p=>{Rt.current=p;let b=new Map;p.forEach(N=>{b.set(N.id,N);}),ct.current=b,Me(p),le?n?.(p):te.setState({nodes:p});},[le,te,Me,n]),qt=useCallback(p=>{ne.current=p,gt(p),le?a?.(p):te.setState({edges:p});},[le,te,gt,a]),Bt=useCallback(p=>{if(p.positionAbsolute)return p.positionAbsolute;let b=p.position?.x||0,N=p.position?.y||0,k=Se(p),C=new Set;for(;k&&!C.has(k);){C.add(k);let T=J(k);if(!T)break;if(T.positionAbsolute){b+=T.positionAbsolute.x,N+=T.positionAbsolute.y;break}b+=T.position?.x||0,N+=T.position?.y||0,k=Se(T);}return {x:b,y:N}},[J,Se]),Hr=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]),Mr=useCallback((p,b)=>{let N=Kt({x:p.x,y:p.y,width:1,height:1},true).filter(T=>T.id!==b&&T.type==="rack"),k=null,C=1/0;for(let T of N){let $=Math.hypot(p.x-T.position.x,p.y-T.position.y);$<C&&(C=$,k=T);}return k},[Kt]),ra=useCallback(p=>yt(p.data),[]),ko=useCallback((p,b,N)=>{let{width:k,height:C}=ra(p),T=b.width||0,$=b.height||0,S=Math.max(0,k-T),v=b.type==="vertical-pdu"?60:0,O=Math.max(v,C-$);return {x:Math.max(0,Math.min(N.x,S)),y:Math.max(v,Math.min(N.y,O))}},[ra]),Zo=useCallback((p,b)=>{if(!p||!b)return;let N=J(p);if(!N)return;let k=b.replace(/-(source|target)$/i,"");if(N.type==="fibre-split"&&k.startsWith("output-"))for(let T of ne.current){if(T.target!==p||!(T.targetHandle||"").replace(/-(source|target)$/i,"").startsWith("input-"))continue;let $=T.data?.color;if($)return {color:$}}if((N.type==="tube"||N.type==="cable")&&b.startsWith("fiber-")){let T=b.replace("fiber-",""),$=parseInt(T,10);if($>=1&&$<=24){let S=ao($),v=$>12;return {color:S,striped:v}}}if((N.type==="multi-tube-cable"||N.type==="tube")&&b.startsWith("tube-")){let T=b.replace("tube-",""),$=parseInt(T,10);if($>=1&&$<=24){let S=Ve($),v=$>12;return {color:S,striped:v}}}let C=N.data;if(C.color)return {color:C.color}},[J]),na=useRef(new Map);useEffect(()=>{gt(p=>{let b=false,N=p.map(k=>{let C=et(k);return na.current.get(k.id)!==C?(b=true,na.current.set(k.id,C),{...k,zIndex:C,style:{...k.style,zIndex:C}}):k});return b?N:p});},[ye,gt,et]),useEffect(()=>{let p=ye.map(N=>{if(N.type==="coupler"&&N.parentId){let k=J(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=J(N.parentId);if(k&&k.type==="splice-tray"){let C=N.data.mode==="ribbon",T=mr(k,N.data.holderPosition,C);return {...N,position:T}}}if(to(N)&&N.parentId&&N.data.uPosition&&(!N.position||N.position.x===0&&N.position.y===0)){let k=J(N.parentId);if(k){let C=N.data.uHeight||1,T=Fo(k,N.data.uPosition,C,N.data);return {...N,position:T}}}if(N.type==="vertical-pdu"&&N.parentId){let k=J(N.parentId);if(k&&k.type==="rack"){let C=ko(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=ye[k];return N.extent!==C.extent||N.position?.x!==C.position?.x||N.position?.y!==C.position?.y})&&Me(p);},[ye,Me,J,ko]);let ia=useCallback(p=>{if(we)return null;let b=new Map,N=new Map,k=new Set,C=p.map(S=>{if(S.type==="position"&&S.position){let v=J(S.id);if(v&&v.type==="coupler"&&v.parentId){let O=J(v.parentId);if(O&&(O.type==="patch-panel"||O.type==="closure"))return (!v.extent||v.extent!=="parent")&&k.add(v.id),{...S,position:v.position||{x:0,y:0}}}if(v&&(v.type==="tube"||v.type==="splice-tray")&&v.parentId){let O=J(v.parentId);if(O&&O.type==="closure")return (!v.extent||v.extent!=="parent")&&k.add(v.id),{...S,position:v.position||{x:0,y:0}}}if(v&&v.type==="splice"&&v.parentId){let O=J(v.parentId);if(O&&O.type==="splice-tray"){let j=wi(v,O,S.position,Rt.current);return j.holderPosition!==void 0&&b.set(v.id,j.holderPosition),{...S,position:{x:j.x,y:j.y}}}}if(v&&to(v)&&v.parentId){let O=J(v.parentId);if(O&&O.type==="rack"){let j=Yr(v,O,S.position,Rt.current);return j.uPosition!==void 0&&N.set(v.id,j.uPosition),{...S,position:{x:j.x,y:j.y}}}}if(v&&v.type==="vertical-pdu"&&v.parentId){let O=J(v.parentId);if(O&&O.type==="rack")return (!v.extent||v.extent!=="parent")&&k.add(v.id),{...S,position:ko(O,v,S.position)}}}return S}),T=applyNodeChanges(C,Rt.current).map(S=>{let v=S;k.has(S.id)&&(v={...v,extent:"parent"});let O=b.get(S.id);O!==void 0&&(v={...v,data:{...v.data,holderPosition:O}});let j=N.get(S.id);return j!==void 0&&(v={...v,data:{...v.data,uPosition:j}}),v});T=Zn(T),Rt.current=T;let $=new Map;return T.forEach(S=>{$.set(S.id,S);}),ct.current=$,Me(T),T},[Me,J,we,ko]),od=useCallback((p,b)=>{st(null);},[]),rd=useCallback((p,b,N)=>{let k=Se(b);if(!y||!Io(b)||k){st(null);return}let C=Hr(b),$=Mr(C,b.id)?.id??null;st(S=>S===$?S:$);},[y,Hr,Se,Mr]),nd=useCallback((p,b,N)=>{st(null);let k=Se(b);if(!y||!Io(b)||k)return;let C=Bt(b),T=Hr(b),$=Mr(T,b.id),S=Rt.current;if(!$)return;let v={x:C.x-$.position.x,y:C.y-$.position.y},O=ko($,b,v);if(b.type==="vertical-pdu"){let $e=S.map(K=>K.id!==b.id?K:{...K,parentId:$.id,extent:"parent",position:O,data:{...K.data,rackLayout:Te($.data)?"split-face":"single-face",rackWidthPx:ht($.data),rackFaceGapPx:It($.data)}});dt($e);return}let j=S.find($e=>$e.id===b.id)||b,Fe=Te($.data),bt=ht($.data),Ge=It($.data),qe=Fe?Ia(j.data,v.x,bt,Ge):"both",Zt=Fe&&qe==="front"?bt+Ge:0,Jt=qe==="rear"?"rear":qe==="front"?"front":Nr(j.data),Pe={...j,parentId:$.id,extent:"parent",position:{x:Zt,y:v.y},data:{...j.data,rackLayout:Fe?"split-face":"single-face",rackWidthPx:bt,rackFaceGapPx:Ge,mountMode:qe,face:Jt}},Ze=S.filter($e=>$e.id!==b.id).concat(Pe),vt=Yr(Pe,$,Pe.position,Ze);if(vt.uPosition===void 0||!oo($,Pe,vt.uPosition,Ze))return;let $r=S.map($e=>$e.id!==b.id?$e:{...$e,parentId:$.id,extent:"parent",position:{x:vt.x,y:vt.y},data:{...$e.data,rackLayout:Fe?"split-face":"single-face",rackWidthPx:bt,rackFaceGapPx:Ge,mountMode:qe,face:Jt,uPosition:vt.uPosition??$e.data.uPosition}});dt($r);},[y,Bt,Hr,dt,Se,ko,Mr]),id=useCallback(p=>{if(!p.source||!p.target||!p.sourceHandle||!p.targetHandle)return true;let b=J(p.source),N=J(p.target),k=ce(b,p.sourceHandle),C=ce(N,p.targetHandle),T=dc(ne.current,p.source,b,k,p.target,N,C),$=T.source,S=T.target;if($&&s&&console.log("Connection will replace: Source handle already connected",{source:p.source,sourceHandle:p.sourceHandle,existingEdges:ne.current.filter(j=>j.source===p.source&&j.sourceHandle===p.sourceHandle||j.target===p.source&&j.targetHandle===p.sourceHandle)}),S&&s&&console.log("Connection will replace: Target handle already connected",{target:p.target,targetHandle:p.targetHandle,existingEdges:ne.current.filter(j=>j.target===p.target&&j.targetHandle===p.targetHandle||j.source===p.target&&j.sourceHandle===p.targetHandle)}),!hr(b,N))return true;let O=gn(b,p.sourceHandle,N,p.targetHandle);return O.valid?true:(s&&console.log(`Connection rejected: ${O.reason}`,p),false)},[J,s]),ad=useCallback(p=>{if(we)return;s&&console.log("onConnect called:",p);let b=J(p.source),N=J(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}`),rt(p,C.reason??"Connection not allowed","connect");return}let T=b?.type==="vertical-pdu",$=b?.type==="vertical-pdu"||N?.type==="vertical-pdu",S=bo(b,k.sourceHandle),v=bo(N,k.targetHandle),O=S&&v&&$,j=b?.data,Fe=b?.type==="switch"||b?.type==="device"&&j?.deviceType==="switch",bt=N?.type==="switch"||N?.type==="device"&&N.data?.deviceType==="switch",Ge=b?.type==="tube"&&N?.type==="multi-tube-cable",qe=b?.type==="multi-tube-cable"&&N?.type==="tube",Zt=Ge||qe,Jt=k.sourceHandle==="cable-button"&&k.targetHandle==="cable-button",Pe="fiber";O?Pe="power":Jt?Pe="thick-cable":Zt&&(Pe=z?"smoothstep":"fiber");let Ze,vt=cc(N),$r=cc(b);if(vt||$r){let ie=N?.data,Qo=b?.data,er=vt?ie.ribbonFiberIds:Qo.ribbonFiberIds;er&&Array.isArray(er)&&er.length>=6&&er.length<=12&&(Ze={ribbonFiberIds:er,isRibbon:true});}if(!Ze&&(Pe==="fiber"||Pe==="smoothstep")&&!T){let ie;Ge?ie=Zo(k.target,k.targetHandle):ie=Zo(k.source,k.sourceHandle),ie&&(Ze={color:ie.color,striped:ie.striped,isRibbon:false});}else if(Pe==="thick-cable"&&Jt){let ie=b?.data;Ze={color:ie?.color||(ie?.tubeStartIndex?Ve(ie.tubeStartIndex):"#6366f1")};}let $e=hr(b,N),K=!$e&&!S&&!!k.sourceHandle,Ot=!$e&&!v&&!!k.targetHandle,ua=$e||O||K&&Ot&&(Fe||bt),Mn=oc({edges:ne.current,connection:k,edgeType:Pe,selectEdgeZIndex:et,sourcePolicy:{capacity:1,replaceable:ua},targetPolicy:{capacity:1,replaceable:ua},normalizeSourceHandle:ie=>ce(b,ie),normalizeTargetHandle:ie=>ce(N,ie),data:Ze});if(Mn){qt(Mn.edges),s&&console.log("Handle replacement: Replaced",Mn.replacedEdgeIds.length,"edge(s)");return}let An=te.validateConnection({source:k.source??null,target:k.target??null,sourceHandle:k.sourceHandle,targetHandle:k.targetHandle});if(!An.valid){s&&console.warn(`Connection rejected: ${An.reason}`),rt(p,An.reason??"Connection not allowed","connect");return}let Ed=ce(b,k.sourceHandle),vd=ce(N,k.targetHandle),pa=dc(ne.current,k.source,b,Ed,k.target,N,vd);if(pa.source){s&&console.warn("FINAL SAFETY CHECK: Source handle already connected, rejecting duplicate connection",{source:p.source,sourceHandle:k.sourceHandle,existingEdges:ne.current.filter(ie=>ie.source===k.source&&ie.sourceHandle===k.sourceHandle||ie.target===k.source&&ie.targetHandle===k.sourceHandle)}),rt(p,`Source handle ${k.sourceHandle} is already connected`,"connect");return}if(pa.target){s&&console.warn("FINAL SAFETY CHECK: Target handle already connected, rejecting duplicate connection",{target:k.target,targetHandle:k.targetHandle,existingEdges:ne.current.filter(ie=>ie.target===k.target&&ie.targetHandle===k.targetHandle||ie.source===k.target&&ie.sourceHandle===k.targetHandle)}),rt(p,`Target handle ${k.targetHandle} is already connected`,"connect");return}let $n=mn(k,Pe,et,Ze),Td=[...ne.current,$n];sa(ie=>new Set(ie).add($n.id)),setTimeout(()=>{sa(ie=>{let Qo=new Set(ie);return Qo.delete($n.id),Qo});},1e3),qt(Td);},[qt,te,et,J,s,Zo,z,we,rt]),sd=useCallback((p,b)=>{if(we||!b.source||!b.target||!b.sourceHandle||!b.targetHandle)return;let N=J(b.source),k=J(b.target),C=pc(b,N,k),T=ce(N,C.sourceHandle),$=ce(k,C.targetHandle),S=ne.current.some(K=>{if(K.id===p.id)return false;let Ot=K.source===C.source&&ce(N,K.sourceHandle)===T||K.target===C.source&&ce(N,K.targetHandle)===T,Lr=K.target===C.target&&ce(k,K.targetHandle)===$||K.source===C.target&&ce(k,K.sourceHandle)===$;return Ot||Lr}),v=te.validateConnection({source:C.source??null,target:C.target??null,sourceHandle:C.sourceHandle,targetHandle:C.targetHandle,ignoreEdgeId:p.id});if(!v.valid&&!((v.reason??"").includes("already connected")&&S)){s&&console.warn(`Edge update rejected: ${v.reason}`),rt(b,v.reason??"Reconnection not allowed","reconnect");return}let O=N?.type==="vertical-pdu"||k?.type==="vertical-pdu",j=bo(N,C.sourceHandle),Fe=bo(k,C.targetHandle),bt=j&&Fe&&O,Ge=N?.type==="tube"&&k?.type==="multi-tube-cable",qe=N?.type==="multi-tube-cable"&&k?.type==="tube",Zt=Ge||qe,Jt=C.sourceHandle==="cable-button"&&C.targetHandle==="cable-button",Pe;bt?Pe="power":Jt?Pe="thick-cable":Zt?Pe=z?"smoothstep":"fiber":Pe="fiber";let Ze;if(Pe==="fiber"||Pe==="smoothstep"){let K=Zo(C.source,C.sourceHandle);K&&(Ze={color:K.color,striped:K.striped});}let $e=ne.current.filter(K=>{if(K.id===p.id)return true;let Ot=K.source===C.source&&ce(N,K.sourceHandle)===T||K.target===C.source&&ce(N,K.targetHandle)===T,Lr=K.target===C.target&&ce(k,K.targetHandle)===$||K.source===C.target&&ce(k,K.sourceHandle)===$;return !(Ot||Lr)}).map(K=>{if(K.id===p.id){let Ot=et({...C,id:K.id,type:Pe});return {...K,source:C.source,target:C.target,sourceHandle:C.sourceHandle,targetHandle:C.targetHandle,type:Pe,data:Ze!==void 0?{...K.data,...Ze}:K.data,zIndex:Ot,style:{...K.style,zIndex:Ot}}}return K});qt($e);},[qt,J,Zo,et,z,s,te,we,rt]),Po=useCallback(p=>{Me(b=>{let N=false,k=b.map(C=>{let T=p!==null&&C.id===p;return C.selected===T?C:(N=true,{...C,selected:T})});return N?k:b});},[Me]),cd=useCallback((p,b)=>{if(Ye){c&&c(b);return}let N=p.metaKey||p.ctrlKey,k=ke(),C=b,T=Se(b);if(b.type==="tube"&&T&&!N){let $=k.find(S=>S.id===T&&(S.type==="cable"||S.type==="multi-tube-cable"));$&&(C=$);}if(Fn(C),Jo([]),Po(C.id),N&&to(C)&&!ge(C)){let $=C.data||{},S=Nr($),v=S==="front"?"rear":"front";s&&console.log(`Command+click: Toggling device ${C.id} from ${S} to ${v}`),h&&h(C.id,v);}c&&c(C);},[h,c,s,ke,Ye,Se,ge,Po]),dd=useCallback(()=>{},[]),ld=useCallback((p,b)=>{Fn(null),Jo([b]),Po(null),c?.(null),d&&d(b);},[d,c,Po]),ud=useCallback(()=>{Fn(null),Jo([]),Po(null),c?.(null);},[c,Po]),[lt,Fn]=useState(null),[aa,sa]=useState(new Set),[_n,Jo]=useState([]),pd=useCallback(({edges:p})=>{Jo(p||[]);},[]);useOnSelectionChange({onChange:pd}),useEffect(()=>{let p=b=>{if(Ee.allowKeyboardDelete&&(b.key==="Backspace"||b.key==="Delete")&&_n.length>0){if(document.activeElement?.tagName==="INPUT"||document.activeElement?.tagName==="TEXTAREA")return;let N=_n.filter(k=>{let C=k.sourceHandle||"",T=k.targetHandle||"";return C.startsWith("tube-")||T.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(T=>T.id)),C=ne.current.filter(T=>!k.has(T.id));qt(C),Jo([]),s&&console.log("Deleted edges:",N.map(T=>T.id));}}};return window.addEventListener("keydown",p),()=>window.removeEventListener("keydown",p)},[_n,qt,s,Ee.allowKeyboardDelete]);let fd=useCallback((p,{nodeId:b,handleType:N})=>{s&&console.log("Connection started from",{nodeId:b,handleType:N});},[s]),gd=useCallback(p=>{s&&console.log("Connection ended",p);},[s]),md=useCallback(()=>{if(we&&!x&&!h||!lt)return;let p=J(lt.id);if(p){if(p.type==="rack"){let b=p.data||{};if(Te(b))return;let k=(b.face||"front")==="front"?"rear":"front";x?(x(p.id,k),h&&ke().filter(T=>T.parentId===p.id).forEach(T=>{h(T.id,k);})):Me(C=>C.map(T=>T.id===p.id?{...T,data:{...T.data,face:k}}:T.parentId===p.id?{...T,data:uc(T.data,k)}:T));return}if(to(p)){if(ge(p))return;let b=p.data||{},k=Nr(b)==="front"?"rear":"front";h?h(p.id,k):Me(C=>C.map(T=>T.id===p.id?{...T,data:uc(T.data,k)}:T));}}},[lt,J,x,h,Me,ke,we,ge]),bd=useCallback(()=>{if(we||!y||!lt||!Io(lt))return;let p=J(lt.id),b=Se(p);if(!p||!Io(p)||!b)return;let N=Bt(p),C=Rt.current.map(T=>T.id!==p.id?T:{...T,parentId:void 0,parentNode:void 0,extent:void 0,position:N,data:{...T.data,uPosition:void 0}});dt(C);},[we,y,lt,J,Bt,dt,Se]),ca=useMemo(()=>Dt.map(p=>{let b=et(p)<1e3,N=aa.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}}),[Dt,aa,et]),Ar=useMemo(()=>({highlightedNodeIds:V,highlightedEdgeIds:Ne,dimUnhighlighted:ee,dimOpacity:xe,connectEdgesToHighlightedNodes:pe}),[pe,xe,ee,Ne,V]),da=useRef([]),la=useMemo(()=>{let p=da.current,b=Yi(ye,{showDeviceImages:re},p);return da.current=b,b},[ye,re]),hd=useMemo(()=>Vi(la,Ar),[Ar,la]),yd=useMemo(()=>({highlightedPortHandles:be,onPortClick:Ce,portClickEnabled:!!Ce}),[be,Ce]),wd=useMemo(()=>ji(ca,Ar),[Ar,ca]),ve=useMemo(()=>lt?J(lt.id)??lt:null,[lt,J]),Do=useMemo(()=>{if(!ve||!mt.enabled)return {showRearToggle:false,showDeRack:false,count:0};let p=ve.type==="rack"?!Et(ve):to(ve)?!ge(ve):false,b=mt.showRearToggle&&p,N=mt.showDeRack&&y&&!we&&Io(ve)&&!!Se(ve);return {showRearToggle:b,showDeRack:N,count:(b?1:0)+(N?1:0)}},[ve,mt,y,we,Se,ge,Et]),Hn=useMemo(()=>{if(!ve||Do.count===0||!Ct.current)return null;let p=Ct.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=Do.count>1?220:110,T=34;try{let $=ot({x:b.x+N/2,y:b.y}),S=ot({x:b.x+N/2,y:b.y+k}),v=$.x-p.left-C/2,O=$.y-p.top-T-10;return O<8&&(O=S.y-p.top+10),v=Math.max(8,Math.min(v,p.width-C-8)),O=Math.max(8,Math.min(O,p.height-T-8)),{left:v,top:O}}catch{return null}},[ve,Do,Bt,ot]),Nd=Da(E,P),xd=Ra(E,{touchAction:"none",...R}),kd=l??ad,Pd=u??sd,Dd=m??id,Cd=useCallback(p=>{if(we)return;let b=ia(p);if(b){if(!le){te.setState({nodes:b});return}n?.(b);}},[we,ia,le,te,n]),Rd=useCallback(p=>{if(we)return;let b=p.filter(k=>{if(k.type==="remove"){let C=ne.current.find(T=>T.id===k.id);if(C){let T=C.sourceHandle||"",$=C.targetHandle||"";if(T.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,ne.current);if(Cr(b),!le){te.setState({edges:N});return}a?.(N);},[we,s,Cr,le,te,a]);return jsx("div",{ref:Ct,className:Nd,style:xd,children:jsxs(ii,{value:yd,children:[jsxs(ReactFlow,{nodes:hd,edges:wd,onNodesChange:Cd,onEdgesChange:Rd,onConnect:we?void 0:kd,onConnectStart:fd,onConnectEnd:gd,onEdgeUpdate:we?void 0:Pd,isValidConnection:Dd,connectionMode:w??ConnectionMode.Loose,connectionRadius:Xe,onNodeClick:cd,onNodeDoubleClick:dd,onPaneClick:ud,onNodeDragStart:od,onNodeDrag:rd,onNodeDragStop:nd,onEdgeClick:ld,onInit:_,nodeTypes:$t,edgeTypes:Lt,defaultEdgeOptions:Sn,nodesDraggable:Ee.nodesDraggable,nodesConnectable:Ee.nodesConnectable,elementsSelectable:Ee.elementsSelectable,edgesFocusable:Ee.edgesFocusable,elevateNodesOnSelect:false,selectNodesOnDrag:false,connectOnClick:Ee.connectOnClick,panOnDrag:Ee.panOnDrag,panOnScroll:Ee.panOnScroll,minZoom:q,maxZoom:Y,zoomOnScroll:Ee.zoomOnScroll,zoomOnPinch:Ee.zoomOnPinch,zoomOnDoubleClick:Ee.zoomOnDoubleClick,preventScrolling:Ye,onlyRenderVisibleElements:U,fitView:true,fitViewOptions:H,proOptions:Fr,children:[jsx(Background,{color:Ca(E)}),Ee.showControls&&jsx(Controls,{showInteractive:Ee.showInteractiveControl}),Ee.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:fe,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",...B},children:se?`${L}...`:L}),ve&&Hn&&Do.count>0&&jsxs("div",{style:{position:"absolute",top:Hn.top,left:Hn.left,display:"flex",gap:8,zIndex:2e3},children:[Do.showRearToggle&&jsx("button",{onClick:p=>{p.preventDefault(),md();},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":Nr(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":Nr(p)==="front"?"\u21C4 Rear":"\u21C4 Front"})()}),Do.showDeRack&&jsx("button",{onClick:p=>{p.preventDefault(),bd();},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"})]})]})})},af=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?Yn(g):null,[g]),u=useCallback(D=>D?{nodes:gc(D.nodes,m.current?.nodes??[]),edges:mc(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 E=Qt({nodes:D,edges:y},w.current);m.current={nodes:D,edges:y},w.current=E,c||f(E),r?.(E);},[c,r]),P=useCallback(D=>{let y=m.current?.edges??[];x(D,y),n?.(D);},[x,n]),R=useCallback(D=>{let y=m.current?.nodes??[];x(y,D),a?.(D);},[x,a]);if(s){let D=h??{nodes:[],edges:[]};return jsx(fc,{...i,nodes:D.nodes,edges:D.edges,onNodesChange:P,onEdgesChange:R})}return jsx(fc,{...e})};function gc(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 mc(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 qi=e=>jsx(ReactFlowProvider,{children:jsx(af,{...e})});var Zi=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 kr(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=ei(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 Ji=e=>typeof e=="object"&&e!==null,uf=e=>{if(!Ji(e.data))return false;if(e.type==="fibre-flow-cable"){let t=e.data;return typeof t.label=="string"&&Ji(t.cable)&&(t.side==="left"||t.side==="right")&&typeof t.rowHeight=="number"&&typeof t.columnWidth=="number"&&typeof t.showTubeLabels=="boolean"&&typeof t.showFiberNumbers=="boolean"&&Ji(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},pf=e=>e==="fibre-flow"||e==="fibre-flow-link",ff=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,gf=e=>e.sourceHandle==="cable-run"||e.targetHandle==="cable-run"?"fibre-flow-link":"fibre-flow",yn=e=>typeof e=="string"&&e.startsWith("fiber-"),wn=(e,t,o)=>e.source===t&&e.sourceHandle===o||e.target===t&&e.targetHandle===o,mf=(e,t=[])=>{let o=new Map(t.map(n=>[n.id,n])),r=[];return e.forEach(n=>{if(!ff(n))return;let a=o.get(n.id),i=pf(n.type)?n.type:a?.type??gf(n);r.push({...a??{},...n,type:i});}),r},Nc=e=>`fiber-${e.tube??1}-${e.fiber}`,xc=e=>ao(e.fiber),kc=e=>io(e.fiber),bf=(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`},hf=(e,t,o,r,n,a)=>e?`${o} ${a}`:t?`0 ${n} ${r} ${a}`:"6 6",yf=({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,R=s?.dimmed??false,D=s?.circuitId,y=s?.circuitLabel??D,E=s?.showCircuitId??false,_=u&&m&&u!==m,M=r-t,F=n-o,A=Math.sqrt(M*M+F*F),L=d-t,B=f-o,z=Math.sqrt(L*L+B*B),Q=A>0?z/A*100:50,oe=`fibre-flow-gradient-${e}`,I=h&&!x,H=x&&!h,q=h&&x,Y=A*1.25,U=Y/2,V=12,Ne=Math.ceil(U*1.2/V),ee=Array(Ne).fill("6 6").join(" "),xe=Math.ceil(U*1.2/V),pe=Array(xe).fill("6 6").join(" "),re=E&&y,be=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:R?.25:1,strokeOpacity:R?.25:1,style:{mixBlendMode:"normal"}}):jsx(BaseEdge,{id:e,path:c,style:{stroke:w,strokeWidth:P?4:3,strokeLinecap:"round",strokeLinejoin:"round",opacity:R?.25:1,strokeOpacity:R?.25:1,mixBlendMode:"normal"}}),(q||I||H)&&jsx("path",{id:`${e}-stripe`,d:c,fill:"none",stroke:"#000",strokeWidth:P?1.6:1.3,strokeLinecap:"round",strokeLinejoin:"round",strokeDasharray:hf(I,H,ee,pe,U,Y),strokeDashoffset:0,opacity:R?.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:be,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})]})})]})},wf=({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})})]})},Nf=({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,R=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,E)=>{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[E+1],B=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:E===0?`2px solid ${y.color}`:"1px solid rgba(0,0,0,0.15)",borderBottom:B?"1px solid rgba(0,0,0,0.15)":`2px solid ${y.color}`,boxShadow:"inset 0 0 3px rgba(0,0,0,0.1)",borderRadius:E===0&&!B||E===0?"4px 4px 0 0":B?"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,E)=>{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 E=`fiber-${y.tubeIndex??1}-${y.fiberIndex}`,_=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:E,type:"source",position:R,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:E,type:"target",position:R,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"})]})},xf=({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})})},kf=(e,t,o,r,n,a,i,s,c,d="dark")=>{let f=[],g=0;return e.forEach(l=>{let u=kr(l.leftCable,{rowHeight:o,tubeGap:r}),m=kr(l.rightCable,{rowHeight:o,tubeGap:r}),w=Math.max(u.height,m.height),h=a*2+i,x=32,P=16,R=h+P*2,D=w+x+P*2,y=`flow-closure-${l.id}`,E=`flow-cable-${l.id}-left`,_=`flow-cable-${l.id}-right`,M=t==="horizontal"?{x:g,y:0}:{x:0,y:g};g+=(t==="horizontal"?R: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:R,height:D,headerHeight:x,colorMode:d},selectable:false,draggable:false,style:{width:R,height:D}});let A=x+P+(w-u.height)/2,L=x+P+(w-m.height)/2;f.push({id:E,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},Pf=(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=bf(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=xc(l.from),R=xc(l.to),D=kc(l.from),y=kc(l.to);n.push({id:`flow-edge-${c.id}-${l.id}`,type:"fibre-flow",source:d,target:f,sourceHandle:Nc(l.from),targetHandle:Nc(l.to),data:{lossDb:l.lossDb,label:l.label,color:x,sourceColor:P,targetColor:R,sourceStriped:D,targetStriped:y,highlighted:u,dimmed:m,circuitId:l.circuitId,circuitLabel:h,showCircuitId:r}});});}),n},Df=({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(()=>kf(e,r,n,a,i,s,c,d,f,g),[e,r,n,a,i,s,c,d,f,g]),P=useMemo(()=>Pf(e,t,o,l),[e,t,o,l]),[R,D]=useState(x),[y,E]=useState(P);useEffect(()=>{D(x);},[x,D]),useEffect(()=>{E(P);},[P,E]);let _=useCallback((I,H)=>{if(!I||!H||!H.startsWith("fiber-"))return;let q=R.find(xe=>xe.id===I);if(!q||q.type!=="fibre-flow-cable")return;let Y=/^fiber-(\d+)-(\d+)$/.exec(H);if(!Y)return;let U=Number(Y[1]),V=Number(Y[2]),ee=q.data.layout.rows.find(xe=>(xe.tubeIndex??1)===U&&xe.fiberIndex===V);if(ee)return {color:ee.color,striped:ee.striped??false}},[R]),M=useCallback(I=>{if(w||!I.source||!I.target||!I.sourceHandle||!I.targetHandle)return false;let H=R.find(Ne=>Ne.id===I.source),q=R.find(Ne=>Ne.id===I.target);if(!H||!q)return false;let Y=typeof I.sourceHandle=="string"&&I.sourceHandle.startsWith("fiber-"),U=typeof I.targetHandle=="string"&&I.targetHandle.startsWith("fiber-");return I.sourceHandle==="cable-run"||I.targetHandle==="cable-run"?true:Y&&U?H.type==="fibre-flow-cable"&&q.type==="fibre-flow-cable":false},[R,w]),F=useCallback(I=>{if(w)return;let H=I.sourceHandle==="cable-run"||I.targetHandle==="cable-run",q=yn(I.sourceHandle),Y=yn(I.targetHandle),U=H?void 0:_(I.source,I.sourceHandle),V=H?void 0:_(I.target,I.targetHandle),Ne=H?void 0:{sourceColor:U?.color,targetColor:V?.color,color:U?.color??V?.color,sourceStriped:U?.striped,targetStriped:V?.striped};E(ee=>{let xe=ee.filter(pe=>{let re=q&&wn(pe,I.source,I.sourceHandle),be=Y&&wn(pe,I.target,I.targetHandle);return !(re||be)});return addEdge({...I,type:H?"fibre-flow-link":"fibre-flow",data:Ne},xe)});},[_,w,E]),A=useCallback((I,H)=>{if(w)return;let q=H.sourceHandle==="cable-run"||H.targetHandle==="cable-run",Y=q?void 0:_(H.source,H.sourceHandle),U=q?void 0:_(H.target,H.targetHandle),V=q?void 0:{sourceColor:Y?.color,targetColor:U?.color,color:Y?.color??U?.color,sourceStriped:Y?.striped,targetStriped:U?.striped};E(Ne=>{let ee=Ne.filter(be=>be.id!==I.id),xe=yn(H.sourceHandle),pe=yn(H.targetHandle),re=ee.filter(be=>{let Ce=xe&&wn(be,H.source,H.sourceHandle),Xe=pe&&wn(be,H.target,H.targetHandle);return !(Ce||Xe)});return addEdge({...H,type:q?"fibre-flow-link":"fibre-flow",data:V},re)});},[_,w,E]),L=useCallback(I=>{w||D(I.filter(uf));},[w,D]),B=useCallback(I=>{w||E(H=>mf(I,H));},[w,E]),z=useMemo(()=>({"fibre-flow-cable":Nf,"fibre-flow-closure":xf}),[]),Q=useMemo(()=>({"fibre-flow":yf,"fibre-flow-link":wf}),[]),oe={borderRadius:8,overflow:"hidden",...m};return jsx(qi,{nodes:R,edges:y,onNodesChange:L,onEdgesChange:B,onConnect:F,onEdgeUpdate:A,isValidConnection:M,connectionMode:ConnectionMode.Loose,nodeTypes:z,edgeTypes:Q,className:u,style:oe,colorMode:g,readOnly:w,interaction:h,fitViewOptions:{padding:.2}})},Cf=e=>jsx(Df,{...e});var vf=({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??kr(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 R=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:R,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 Ec=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 Nn(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 xn(e){if(!e)return;if(typeof e=="string")return e;let t=e.device;return typeof t=="object"&&t?t.id:t}var vc=e=>({id:`rack-${e.id}`,type:"rack",position:{x:0,y:0},data:{label:e.name,status:typeof e.status=="object"&&e.status?e.status.value:e.status,uHeight:e.u_height??e.units??42,inventoryId:e.id,inventoryType:"rack",facilityId:e.facility_id,serial:e.serial,assetTag:e.asset_tag,site:typeof e.site=="object"&&e.site?e.site.name:e.site,role:typeof e.role=="object"&&e.role?e.role.name:e.role,tenant:typeof e.tenant=="object"&&e.tenant?e.tenant.name:e.tenant}}),Tc=e=>({id:`device-${e.id}`,type:"device",position:{x:0,y:0},parentId:e.rack?`rack-${typeof e.rack=="object"&&e.rack?e.rack.id:e.rack}`:void 0,extent:e.rack?"parent":void 0,data:{label:e.name,status:typeof e.status=="object"&&e.status?e.status.value:e.status,deviceType:e.device_type?.model??e.model,manufacturer:e.device_type?.manufacturer?.name??e.manufacturer,role:typeof e.device_role=="object"&&e.device_role?e.device_role.name:e.role,uHeight:e.device_type?.u_height??e.u_height??1,uPosition:e.position||1,face:e.face||"front",inventoryId:e.id,inventoryType:"device",primaryIp4:typeof e.primary_ip4=="object"&&e.primary_ip4?e.primary_ip4.address:e.primary_ip4,primaryIp6:typeof e.primary_ip6=="object"&&e.primary_ip6?e.primary_ip6.address:e.primary_ip6,site:typeof e.site=="object"&&e.site?e.site.name:e.site,rack:typeof e.rack=="object"&&e.rack?e.rack.name:e.rack}}),Ic=e=>{let t=xn(e.termination_a),o=xn(e.termination_b);return {id:`cable-${e.id}`,source:Nn(t)??"device-unknown-source",target:Nn(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}}},Sc=e=>{let t=[],o=[],r=new Map;return e.racks.forEach(n=>t.push(vc(n))),e.devices.forEach(n=>{let a=Tc(n);t.push(a),r.set(n.name,a.id);}),e.cables.forEach(n=>{let a=Ic(n),i=xn(n.termination_a),s=xn(n.termination_b);o.push({...a,source:(typeof i=="string"?r.get(i):void 0)??Nn(i)??a.source,target:(typeof s=="string"?r.get(s):void 0)??Nn(s)??a.target});}),{nodes:t,edges:o}},Tf=e=>Qt(Sc(e)),If=e=>Ec(e);var Fc=e=>typeof e.id=="number"?`device-${e.id}`:`device-${e.name}`,Sf="Interfaces",Ff="Management",_f="Power",_c=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},Hf=e=>typeof e=="string"&&e.toLowerCase()==="rear"?"rear":"front",kn=e=>_c(e.custom_fields)?e.custom_fields:void 0,Pn=e=>_c(e)?e:void 0,Hc=(e,t)=>{let o=kn(e),r=Pn(o?.layout);return Hf(t??e.layout?.face??e.face??r?.face??o?.port_face??o?.portFace??o?.face)},Mc=(e,t,o)=>{let r=kn(e),n=Pn(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"?_f:t==="console"||t==="mgmt"?Ff:Sf)},Ac=(e,t,o)=>{let r=kn(e),n=Pn(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)},$c=(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"},Lc=e=>{let t=(e??"").toLowerCase();if(t){if(t.includes("om3"))return "om3";if(t.includes("om4"))return "om4";if(t.includes("om5"))return "om5";if(t.includes("smf")||t.includes("singlemode"))return "smf";if(t.includes("cat5e"))return "cat5e";if(t.includes("cat6a"))return "cat6a";if(t.includes("cat6"))return "cat6";if(t.includes("cat7"))return "cat7";if(t.includes("fiber")||t.includes("sfp")||t.includes("qsfp"))return "fiber";if(t.includes("ethernet")||t.includes("rj45")||t.includes("1000base")||t.includes("10gbase")||t.includes("base-t"))return "ethernet"}},Mf=e=>typeof e=="string"?tr(e):nt(e),Bc=(e,t,o)=>{if(!o)return;let r=kn(e),n=Pn(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=Mf(i);if(s)return s}},Af=(e,t)=>{let o=e.type?.value??e.type?.label??e.layout?.type??void 0,r=Ac(e,o),n=$c(o,r),a=Mc(e,n);return {id:e.name,label:e.name,face:Hc(e),group:a,type:n,cableType:Lc(o),connected:!!(e.connected_endpoint||e.cable),connectorType:r,position:Bc(e,void 0,t)}},$f=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)}),Lf=(e,t)=>{let{includePortPositions:o=false,mapInterfaceToPort:r}=t,n=[];return $f(e.interfaces??[]).forEach((i,s)=>{let c=r?r({device:e,iface:i,index:s}):Af(i,o);if(!c)return;let d=c.type??i.type?.value??i.type?.label??void 0,f=Ac(i,d,c.connectorType),g=$c(d,f),l=Hc(i,c.face),u=Mc(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:Lc(c.cableType??i.type?.value??i.type?.label??void 0),connectorType:f,position:Bc(i,c,o)});}),n},Oc=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=Lf(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}},Wc=e=>({id:`cable-${e.id}`,source:Fc(e.termination_a.device),sourceHandle:e.termination_a.name,target:Fc(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}}),Gc=(e,t={})=>{let o=[],r=[],n=new Map;return e.racks.forEach(a=>{o.push(Oc(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=Wc(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}},Bf=(e,t={})=>Qt(Gc(e,t)),Of=(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 Dn(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 zf="Network Ports",Wf="Rear Network Ports",Gf="Power Ports",Cn=e=>typeof e=="object"&&e!==null&&!Array.isArray(e),Oe=e=>{if(typeof e!="string")return;let t=e.trim();return t.length>0?t:void 0},Vc=e=>{let t=Oe(e)?.toLowerCase();if(t==="front")return "front";if(t==="rear"||t==="back")return "rear"},Rn=e=>{let t=Oe(e)?.toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20")return t},Uf=e=>_e(e)?"rear":"front",Vf=({face:e,type:t})=>_e(t)?Gf:e==="rear"?Wf:zf;function vn(e){return Vc(e.face)??Uf(e.type)}var jf=vn;function Tn(e){return Oe(e.group)??Vf({face:vn(e),type:e.type})}var Xf=Tn;function En(e){if(!Array.isArray(e))return;let t=e.map(o=>{if(!Cn(o))return null;let r=Oe(o.label);if(!r)return null;let n=Oe(o.type),a=vn({face:Vc(o.face),type:n}),i=Tn({face:a,group:Oe(o.group),type:n}),s=nt(o.position??o),c=typeof o.order=="number"&&Number.isFinite(o.order)?o.order:void 0;return {...Oe(o.id)?{id:Oe(o.id)}:{},label:r,face:a,group:i,connected:typeof o.connected=="boolean"?o.connected:void 0,...n?{type:n}:{},...Oe(o.cableType)?{cableType:Oe(o.cableType)}:{},...Rn(o.connectorType)?{connectorType:Rn(o.connectorType)}:{},...typeof c=="number"?{order:c}:{},...s?{position:s}:{}}}).filter(o=>o!==null);return t.length>0?t:void 0}var Yf=En;function Uc(e,t){return Array.isArray(e)?e.flatMap(o=>!Cn(o)||!Array.isArray(o.ports)?[]:o.ports.map((r,n)=>{if(!Cn(r))return null;let a=Oe(r.label);if(!a)return null;let i=Oe(r.type),s=Tn({face:t,group:Oe(o.name),type:i}),c=nt(r.position??r),d=typeof r.order=="number"&&Number.isFinite(r.order)?r.order:n;return {...Oe(r.id)?{id:Oe(r.id)}:{},label:a,face:t,group:s,connected:typeof r.connected=="boolean"?r.connected:void 0,...i?{type:i}:{},...Oe(r.cableType)?{cableType:Oe(r.cableType)}:{},...Rn(r.connectorType)?{connectorType:Rn(r.connectorType)}:{},order:d,...c?{position:c}:{}}}).filter(r=>r!==null)):[]}function In(e){if(Cn(e)){let t=En(e.ports);if(t)return t;let o=Uc(e.portGroups,"front"),r=Uc(e.rearPortGroups,"rear"),n=[...o,...r];return n.length>0?n:void 0}return En(e)}var Kf=In;function jc({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 qf=jc;function ea(e){if(!Array.isArray(e)||e.length===0)return {portGroups:[],rearPortGroups:[]};let{ports:t,rearPorts:o}=Wr(e);return {portGroups:t,rearPortGroups:o}}var Zf=ea;function Xc(e,t,o={}){let r=ut(e,t);if(t.type==="power_ac"||t.type==="power_c13"||t.type==="power_c19")return [r];let a=String(o.deviceType??"").toLowerCase(),i=o.face??"front";return a==="switch"||a==="router"?[r,`${r}-target`]:a==="patch-panel"||a==="patch_panel"?i==="rear"?[r,`${r}-target`]:[r,`${r}-source`]:[r]}function Jf(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(Xc(f.name,g,{deviceType:o.deviceType,face:d}).some(u=>r(u)===n))return true;return false};return !!(s(a,"front")||s(i,"rear"))}function Qf(e){return ea(e)}var Uo=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 ta(e,t={}){let o=Te(e);return Dn({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=Ue(r),f=Ue(n);if(!Ur(d,f))return null}return {hasConflict:true,conflict:{deviceId:r.id,uPosition:r.unit,uHeight:r.height,conflictWith:n.id}}}return null}})}function Yc(e,t,o={}){let{deviceTypeMapping:r={}}=o,n=r[e.type]||"device",a=Fo(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:Ue(e)}}}function eg(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 tg(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=ta(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 Uo(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=eg(i);n.push(s);for(let c of i.devices)try{let d=Yc(c,s,t);a.push(d);}catch(d){if(o==="strict")throw d;if(o==="nearest"){let f=Kr(s,{id:c.id,data:{label:c.name,uHeight:c.height,mountMode:Ue(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=Yc(g,s,t);a.push(l);}else throw new Uo(i.id,c.id,c.unit,c.height)}}}return n.push(...a),n}function og(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=In(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:Ue(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 rg(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 ng(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!ta({...a,devices:[...a.devices,o]},r).isValid)throw new Uo(t,o.id,o.unit,o.height);return {...a,devices:[...a.devices,o]}})}function ig(e,t,o){return e.map(r=>r.id!==t?r:{...r,devices:r.devices.filter(n=>n.id!==o)})}var Vo=class extends Error{constructor(o,r,n,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 oa(e,t={}){return Dn({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 Kc(e,t){let o=e.mode==="ribbon",r=mr(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 ag(e){return {id:e.id,type:"splice-tray",position:e.position,data:{label:e.name,status:"active"}}}function sg(e,t={}){let{conflictPolicy:o="strict",validatePlacements:r=true}=t,n=[],a=[];if(r)for(let i of e){let s=oa(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 Vo(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=ag(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];pr(s,l,c.holder,u)||(d=gr(s,l,u,c.holder));}let f=d!==c.holder?{...c,holder:d}:c,g=Kc(f,s);a.push(g);}catch(d){if(o==="strict")throw d;if(o==="nearest"){let f=[...n,...a],g=gr(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=Kc(l,s);a.push(u);}else throw new Vo(i.id,c.id,c.holder)}}}return n.push(...a),n}function cg(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 dg(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 lg(e,t,o,r={}){let{conflictPolicy:n="strict"}=r;return e.map(a=>{if(a.id!==t)return a;if(n==="strict"&&!oa({...a,splices:[...a.splices,o]},r).isValid)throw new Vo(t,o.id,o.holder);return {...a,splices:[...a.splices,o]}})}function ug(e,t,o){return e.map(r=>r.id!==t?r:{...r,splices:r.splices.filter(n=>n.id!==o)})}function pg(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 qc(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 Zc(e,t){let o=qc(t);return e.x>=o.left&&e.x<=o.right&&e.y>=o.top&&e.y<=o.bottom}function fg(e,t){let o=null,r=1/0;for(let n of t){if(!Zc(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 Jc=2;var ae=e=>typeof e=="string"?e.trim():"",Qc=e=>{if(typeof e=="number"&&Number.isFinite(e))return e},gg=e=>{let t=ae(e).toUpperCase();if(t==="C13"||t==="C14"||t==="C19"||t==="C20"||t==="AC")return t},mg=(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"},hg=e=>e.toLowerCase().replace(/_/g,"-").trim(),yg=e=>e>=1?"rackable":"zero-u",wg=e=>(e??"").toLowerCase()==="half"?"half":"full",Ng=(e,t,o,r)=>{let n=r.replace(/[^a-zA-Z0-9_-]/g,"-").toLowerCase();return `${e}-b${t}-${n||`p${o}`}`},ed=(e,t)=>`${e}-${t}`.toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-|-$/g,"");function xg(e){let t=[],o=ae(e.manufacturer),r=ae(e.model),n=ae(e.role)||ae(e.deviceType)||ae(e.device_type)||"device",a=Qc(e.uHeight)??Qc(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)||ed(o,r)||"unknown",s=ae(e.slug)||ed(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 td(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=gg(i.connectorType??i.connector_type),f=mg(ae(i.type),d),g=d??bg(f),u={id:ae(i.id)||Ng(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 kg(e){let t=[],o=hg(e.role),r=e.uHeight,n=yg(r),a=wg(e.width),i=e.frontBlocks.map((c,d)=>td(c,"front",d)),s=e.rearBlocks.map((c,d)=>td(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 Pg(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 Dg(e){let t=[],{front:o,rear:r}=Pg(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 Pr(e){return e.portBlocks.reduce((t,o)=>t+o.ports.length,0)}function Cg(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=Pr(t.frontFace),c=Pr(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 Rg(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 Eg(e){let t=xg(e),o=kg(t),r=Dg(o),n=Cg(t,r);return n.issues.push(...t.issues,...o.issues,...r.issues),n.valid?{template:Rg(t,o,r),report:n}:{template:null,report:n}}function vg(e){return Pr(e)}function Tg(e,t,o){let r=[],n=Pr(e.faces.front),a=Pr(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{ap as COUPLERS_PER_PANEL,pn as COUPLER_SLOT_HEIGHT_PX,sp as COUPLER_WIDTH_PX,Di as CableNode,Ai as ClosureNode,Ri as CouplerNode,$p as DEFAULT_DIAGRAM_DIM_OPACITY,Ao as DeviceNode,Uo as DevicePlacementError,Zi as DiagramErrorBoundary,ii as DiagramPortProvider,Ma as FIBER_COLORS_12,Jr as FiberEdge,Qn as FiberNode,vf as FibreCableWithTubesExpanded,Cf as FibreFlowMap,$i as FibreSplitNode,To as HANDLE_EXTENSION_PX,Ci as MultiTubeCableNode,qi as NetworkDiagram,_s as PANEL_BORDER_WIDTH,go as PANEL_HEADER_HEIGHT,un as PANEL_HEIGHT_PX,fo as PANEL_PADDING,Hs as PANEL_TUBE_TRAY_SPACING,ln as PANEL_WIDTH_PX,Ln as POWER_CONNECTORS,_i as PatchPanelNode,ti as PowerEdge,Gt as RACK_HEADER_HEIGHT,Kn as RACK_WIDTH_PX,Jn as RackNode,hi as SpliceNode,Vo as SplicePlacementError,ki as SpliceTrayNode,Jc as TEMPLATE_SCHEMA_VERSION,Pi as TubeNode,ka as U_HEIGHT_PX,bi as VerticalPDU,va as Width,ng as addDeviceToRack,lg as addSpliceToTray,Yi as applyDeviceDisplayToNodes,ji as applyDiagramFocusToEdges,Vi as applyDiagramFocusToNodes,Ve as baseColorFor,ea as buildDevicePortGroupsFromPorts,tg as buildNodesFromRackConfig,sg as buildNodesFromSpliceConfig,pg as buildPathLayoutGraph,Wr as buildPortBlocksFromPorts,ut as buildPortHandleId,ut as buildReactNetworksHandleId,Zf as buildReactNetworksPortGroupsFromPorts,Ii as calculateClosureDimensions,dp as calculateCouplerRightX,up as calculateCouplerSlotSpacing,Ws as calculateCouplerSpacing,Fo as calculateDevicePositionFromU,Ti as calculatePanelDimensions,Os as calculateSlotPositionFromY,Ju as calculateSplicePositionFromNumber,Of as calculateUPositions,zs as calculateYFromSlotPosition,vg as countTemplateFacePorts,zi as createNetworkDiagramStore,og as createRackConfigFromNodes,cg as createSpliceConfigFromNodes,Yn as diagramDocumentToNetworkGraph,ei as fiberSolidOrStriped,fg as findNearestRack,gr as findNextAvailableHolderPosition,Kr as findNextAvailableUPosition,jc as flattenDevicePortsFromGroups,qf as flattenReactNetworksPortGroups,If as generateLayout,fa as getConnectorConfig,vi as getCouplerDimensions,vo as getDefaultDeviceFace,Bn as getDeviceConnectorType,mo as getEndpointMetadata,ao as getFiberColor,Gn as getFrontPortBlocks,Bs as getInnerContentWidth,Tt as getPDUPortType,cp as getPanelHeight,Ls as getPanelWidth,Wt as getPowerPortStyle,qc as getRackBounds,Un as getRearPortBlocks,Le as getResolvedPortBlocks,ni as getStandardPortVisualDimensions,wt as getStatusColor,Ms as getTrayDimensions,fn as getTubeDimensions,wr as hasDiagramFocus,ha as hasFrontPorts,ya as hasRearPorts,Ic as inventoryCableToNetworkEdge,Tc as inventoryDeviceToNetworkNode,vc as inventoryRackToNetworkNode,Tf as inventoryToDiagramDocument,Sc as inventoryToNetworkDiagram,ac as isDeviceDiagramNode,si as isDiagramPortHandleHighlighted,nc as isEdgeInDiagramFocus,Fd as isHighPowerConnector,rc as isNodeInDiagramFocus,Zc as isPointInRack,_e as isPowerPortType,io as isStriped,oo as isUPositionAvailable,Xc as listPossiblePortHandleIds,Br as looksLikePowerHandleId,Wc as netboxCableToNetworkEdge,zc as netboxDeviceToNetworkNode,Oc as netboxRackToNetworkNode,Bf as netboxToDiagramDocument,Gc as netboxToNetworkDiagram,Qt as networkGraphToDiagramDocument,En as normalizeDevicePorts,zt as normalizeDirectionalHandleId,Re as normalizeHandleId,nt as normalizePortPositionInput,Yf as normalizeReactNetworksPorts,Eg as parseNetboxTemplate,tr as parseSemanticPortPosition,ig as removeDeviceFromRack,ug as removeSpliceFromTray,Mp as replaceEdge,Qf as resolveDevicePortBlocksFromFlatPorts,vn as resolveDevicePortFace,Tn as resolveDevicePortGroup,yr as resolveEndpointCompatibilityKeys,In as resolveNodeDevicePorts,en as resolvePortVisualKind,Kf as resolveReactNetworksNodePorts,jf as resolveReactNetworksPortFace,Xf as resolveReactNetworksPortGroup,lp as snapToCouplerPosition,wi as snapToSplicePosition,Yr as snapToUPosition,Ha as updateDeviceUPosition,rg as updateDeviceUPositionInSchema,dg as updateSpliceHolderPosition,Ui as useDiagramEdges,Gi as useDiagramNodes,ai as useDiagramPortInteraction,_p as useNetworkDiagram,vl as validateAndSnapDevice,Jf as validatePortHandleOnNodeData,ta as validateRackDevicePlacements,Tg as validateRenderFidelity,oa as validateSplicePlacements};//# sourceMappingURL=index.mjs.map
3
3
  //# sourceMappingURL=index.mjs.map