import{j as e,r as p}from"./vendor-codemirror-B1SGo4xl.js";import{C as ae,a as ce,b as Ke,c as Ge,d as Ze}from"./card-BIfzBCEy.js";import{g as qe,f as es,B as S,D as Ve,a as Ne,b as ve,c as Se,d as Ce,e as ss,t as N}from"./index-Dungj95X.js";import{I as Ee}from"./input-CXoUQQLm.js";import{L as re}from"./label-CMpUoC87.js";import{B as $e}from"./badge-CGJlVD3L.js";import{S as le,a as ie,b as de,c as pe,d as ee}from"./select-CiTqGGhE.js";import{T as ts}from"./textarea-BxfjmLq5.js";import{k as _}from"./index-drGq01ok.js";import{h as _e,ad as Me,a4 as os,D as ns,N as as,B as cs,i as ue,G as rs,d as De,L as Le,R as ls,n as Re,P as is,ai as Ae,$ as ds,S as ps,T as ms}from"./vendor-icons-DmqcWdzX.js";import"./index-5FEebgvX.js";const me={cluster:"集群",loadbalancer:"Ingress",service:"Service",app:"Deployment",pod:"Pod",server:"Node",database:"数据库",external:"外部服务",custom:"自定义"},us=[{value:"database",label:"数据库",desc:"MySQL / Redis / PostgreSQL 等"},{value:"external",label:"外部服务",desc:"外部 API / CDN / DNS 等"},{value:"custom",label:"自定义",desc:"其他自定义节点"}],Q=x=>x.startsWith("custom-");function z(x,g="h-5 w-5"){switch(x){case"server":return e.jsx(_e,{"code-path":"src/components/kubernetes/topology-helpers.tsx:32:27",className:g});case"loadbalancer":return e.jsx(rs,{"code-path":"src/components/kubernetes/topology-helpers.tsx:33:33",className:g});case"cluster":return e.jsx(ue,{"code-path":"src/components/kubernetes/topology-helpers.tsx:34:28",className:g});case"app":return e.jsx(cs,{"code-path":"src/components/kubernetes/topology-helpers.tsx:35:24",className:g});case"service":return e.jsx(as,{"code-path":"src/components/kubernetes/topology-helpers.tsx:36:28",className:g});case"pod":return e.jsx(Me,{"code-path":"src/components/kubernetes/topology-helpers.tsx:37:24",className:g});case"database":return e.jsx(ns,{"code-path":"src/components/kubernetes/topology-helpers.tsx:38:29",className:g});case"external":return e.jsx(os,{"code-path":"src/components/kubernetes/topology-helpers.tsx:39:29",className:g});case"custom":return e.jsx(Me,{"code-path":"src/components/kubernetes/topology-helpers.tsx:40:27",className:g});default:return e.jsx(_e,{"code-path":"src/components/kubernetes/topology-helpers.tsx:41:21",className:g})}}function se(x){switch(x){case"server":return"bg-blue-500/20 text-blue-400 border-blue-500/30";case"loadbalancer":return"bg-purple-500/20 text-purple-400 border-purple-500/30";case"cluster":return"bg-cyan-500/20 text-cyan-400 border-cyan-500/30";case"app":return"bg-rose-500/20 text-rose-400 border-rose-500/30";case"service":return"bg-emerald-500/20 text-emerald-400 border-emerald-500/30";case"pod":return"bg-teal-500/20 text-teal-400 border-teal-500/30";case"database":return"bg-amber-500/20 text-amber-400 border-amber-500/30";case"external":return"bg-orange-500/20 text-orange-400 border-orange-500/30";case"custom":return"bg-slate-500/20 text-slate-400 border-slate-500/30";default:return"bg-slate-500/20 text-slate-400 border-slate-500/30"}}function hs(x,g,W,U,u,B=[]){const i=[],b=[],G=Math.max(1,g.length,W.length,U.length,B.length||u.length),d=Math.max(900,Math.min(G*140,2600)),T=[50,160,280,410,540,680],M=t=>{const r=Math.min(t,12);if(r===0)return[];if(r===1)return[d/2];const c=d/(r+1);return Array.from({length:r},(l,m)=>c*(m+1))},A=`cluster-${x.id}`;i.push({id:A,name:x.name||"集群",type:"cluster",x:d/2,y:T[0],data:{kind:"cluster",version:x.version,status:x.status,api_server:x.api_server,node_count:x.node_count,pod_count:x.pod_count}});const D=g.slice(0,12),te=M(D.length);D.forEach((t,r)=>{const c=`ingress-${t.id}`,l=Array.isArray(t.hosts)?t.hosts:t.hosts?JSON.parse(t.hosts):[],m=l.length?l.join(","):t.name||"",E=t.paths?t.paths:t.backend?`→${t.backend}`:"",J=E?`${m} ${E}`:m;i.push({id:c,name:J,type:"loadbalancer",x:te[r],y:T[1],data:{kind:"ingress",namespace:t.namespace,backend:t.backend,tls:t.tls,hosts:l}}),b.push({id:`e-${A}-${c}`,source:A,target:c,label:"route"})});const y=W.slice(0,12),Z=M(y.length);y.forEach((t,r)=>{const c=`service-${t.id}`;i.push({id:c,name:t.name,type:"service",x:Z[r],y:T[2],data:{kind:"service",namespace:t.namespace,type:t.type,cluster_ip:t.cluster_ip,external_ip:t.external_ip,selector:t.selector}})}),D.length>0&&y.length>0?D.forEach(t=>{const r=`ingress-${t.id}`,c=(t.backend||"").split(":")[0].trim();let l=y.filter(m=>m.name===c);l.length===0&&(l=y.filter(m=>m.namespace===t.namespace)),l.length===0&&(l=[y[0]]),l.forEach(m=>b.push({id:`e-${r}-service-${m.id}`,source:r,target:`service-${m.id}`,label:"→"}))}):y.length>0&&y.forEach(t=>b.push({id:`e-${A}-service-${t.id}`,source:A,target:`service-${t.id}`,label:"expose"}));const k=U.slice(0,12),oe=M(k.length);k.forEach((t,r)=>{const c=`deploy-${t.id}`;i.push({id:c,name:t.name,type:"app",x:oe[r],y:T[3],data:{kind:"deployment",namespace:t.namespace,replicas:t.replicas,ready_replicas:t.ready_replicas,available_replicas:t.available_replicas,image:t.image}})});const v=(B||[]).slice(0,12),j=M(v.length);v.forEach((t,r)=>{const c=`pod-${t.id||t.name}`;i.push({id:c,name:t.name||"pod",type:"pod",x:j[r],y:T[4],data:{kind:"pod",namespace:t.namespace,node:t.node_name||t.node,status:t.status,ip:t.ip}})}),k.length>0&&v.length>0&&k.forEach(t=>{const r=`deploy-${t.id}`;let c=v.filter(l=>l.namespace===t.namespace);c=c.filter(l=>(l.name||"").includes(t.name)||t.name&&(l.name||"").startsWith(t.name)),c.length===0&&(c=v.filter(l=>l.namespace===t.namespace).slice(0,3)),c.length===0&&(c=v.slice(0,2)),c.slice(0,3).forEach(l=>{const m=`pod-${l.id||l.name}`;b.push({id:`e-${r}-${m}`,source:r,target:m,label:"owns"})})}),y.length>0&&k.length>0&&y.forEach(t=>{const r=`service-${t.id}`;let c=[];try{const l=typeof t.selector=="string"?JSON.parse(t.selector||"{}"):t.selector||{},m=Object.entries(l);m.length>0&&(c=k.filter(E=>{let J={};try{J=typeof E.labels=="string"?JSON.parse(E.labels||"{}"):E.labels||{}}catch{}return m.every(([P,O])=>J[P]===O)}))}catch{}c.length===0&&(c=k.filter(l=>l.name===t.name)),c.length===0&&(c=k.filter(l=>l.namespace===t.namespace)),c.length===0&&(c=[k[0]]),c.slice(0,4).forEach(l=>b.push({id:`e-${r}-deploy-${l.id}`,source:r,target:`deploy-${l.id}`,label:"select"}))});const L=u.slice(0,12),V=M(L.length);L.forEach((t,r)=>{const c=`k8snode-${t.id}`;i.push({id:c,name:t.name,type:"server",x:V[r],y:T[5],data:{kind:"node",ip:t.ip,role:t.role,status:t.status,os:t.os,cpu:t.cpu,memory:t.memory,cpu_usage:t.cpu_usage,memory_usage:t.memory_usage,pod_count:t.pod_count}})});const I=L.filter(t=>(t.role||"").toLowerCase()==="worker"),C=I.length>0?I:L;return v.length>0&&C.length>0?v.forEach(t=>{const r=`pod-${t.id||t.name}`;C.slice(0,2).forEach(c=>b.push({id:`e-${r}-k8snode-${c.id}`,source:r,target:`k8snode-${c.id}`,label:"on"}))}):k.length>0&&C.length>0&&k.forEach(t=>{const r=`deploy-${t.id}`;C.slice(0,3).forEach(c=>b.push({id:`e-${r}-k8snode-${c.id}`,source:r,target:`k8snode-${c.id}`,label:"schedule"}))}),{nodes:i,edges:b}}function vs(){const{clusterCode:x}=qe(),g=es(),[W,U]=p.useState([]),[u,B]=p.useState(""),[i,b]=p.useState({nodes:[],edges:[]}),[F,G]=p.useState(!1),[d,T]=p.useState(null),[M,A]=p.useState(""),[D,te]=p.useState("all"),[y,Z]=p.useState(null),[k,oe]=p.useState({x:0,y:0}),v=p.useRef(null),[j,L]=p.useState(!1),[V,I]=p.useState(!1),[C,t]=p.useState(null),[,r]=p.useState(null),[c,l]=p.useState(!1),[m,E]=p.useState(1),[J,P]=p.useState(!1),[O,he]=p.useState(null),[w,H]=p.useState({name:"",type:"database",note:""}),xe=p.useCallback(async()=>{try{const n=(await _.getClusters())?.list||[];if(U(n),!u)if(x){const o=n.find(a=>(a.code||String(a.id))===x);o&&B(String(o.id))}else n.length>0&&B(String(n[0].id))}catch{U([])}},[x]);p.useEffect(()=>{xe()},[xe]);const ge=p.useCallback(async s=>{try{const o=await _.getTopology(s);if(o?.layout_data){const a=JSON.parse(o.layout_data);if(r(a),a.customNodes?.length>0){const h=Math.max(...a.customNodes.map(f=>{const R=f.id.match(/custom-(\d+)/);return R?parseInt(R[1]):0}));E(h+1)}return a}}catch{}return r(null),null},[]),K=p.useCallback(async()=>{if(u){G(!0);try{const s=$=>Array.isArray($)?$:$?.list||[],[n,o,a,h,f]=await Promise.all([_.getNodes(u).catch(()=>[]),_.getServices(u).catch(()=>[]),_.getDeployments(u).catch(()=>[]),_.getIngresses(u).catch(()=>[]),_.getPods(u).catch(()=>[])]),R=W.find($=>String($.id)===u)||{},X=hs(R,s(h),s(o),s(a),s(n),s(f)),Y=await ge(u);Y&&(Y.positions&&(X.nodes=X.nodes.map($=>{const ne=Y.positions[$.id];return ne?{...$,x:ne.x,y:ne.y}:$})),Y.customNodes&&(X.nodes=[...X.nodes,...Y.customNodes]),Y.customEdges&&(X.edges=[...X.edges,...Y.customEdges])),b(X)}catch{b({nodes:[],edges:[]})}finally{G(!1)}}},[u,W,ge]);p.useEffect(()=>{K()},[K]);const q=i.nodes.filter(s=>s.name.toLowerCase().includes(M.toLowerCase())&&(D==="all"||s.type===D)),be=new Set(q.map(s=>s.id)),ye=s=>{const n=v.current;if(!n)return{x:0,y:0};const o=n.createSVGPoint();o.x=s.clientX,o.y=s.clientY;const a=n.getScreenCTM();return a?{x:o.matrixTransform(a.inverse()).x,y:o.matrixTransform(a.inverse()).y}:{x:0,y:0}},Ie=(s,n)=>{if(V)return;s.stopPropagation();const o=ye(s);oe({x:o.x-n.x,y:o.y-n.y}),Z(n.id)},Pe=s=>{if(!y)return;const n=ye(s);b(o=>({...o,nodes:o.nodes.map(a=>a.id===y?{...a,x:n.x-k.x,y:n.y-k.y}:a)}))},ke=()=>Z(null),Oe=s=>{if(!y){if(V){if(!C)t(s.id),N.info(`已选择源节点: ${s.name},请点击目标节点`);else if(C===s.id)N.info("不能连接自身");else{const n={id:`custom-edge-${Date.now()}`,source:C,target:s.id,label:"connect"};b(o=>({...o,edges:[...o.edges,n]})),N.success("连线已添加"),t(null),I(!1)}return}T(s)}},Xe=()=>{he(null),H({name:"",type:"database",note:""}),P(!0)},we=s=>{he(s),H({name:s.name,type:s.type,note:s.data?.note||""}),P(!0)},Ye=()=>{if(!w.name.trim()){N.error("请输入节点名称");return}if(O)b(s=>({...s,nodes:s.nodes.map(n=>n.id===O.id?{...n,name:w.name,type:w.type,data:{...n.data,note:w.note}}:n)})),N.success("节点已更新");else{const n={id:`custom-${m}`,name:w.name,type:w.type,x:fe/2+(Math.random()-.5)*100,y:Te/2+(Math.random()-.5)*100,data:{kind:"custom",note:w.note}};b(o=>({...o,nodes:[...o.nodes,n]})),E(o=>o+1),N.success("节点已添加")}P(!1)},ze=async s=>{await g({title:"删除节点",description:`确定删除「${s.name}」?相关连线也会一并删除`,variant:"destructive"})&&(b(o=>({nodes:o.nodes.filter(a=>a.id!==s.id),edges:o.edges.filter(a=>a.source!==s.id&&a.target!==s.id)})),T(null),N.success("节点已删除"))},We=async s=>{if(!s.id.startsWith("custom-edge")){N.info("Kubernetes 原生关系不可删除");return}await g({title:"删除连线",description:"确定删除此自定义连线?",variant:"destructive"})&&(b(o=>({...o,edges:o.edges.filter(a=>a.id!==s.id)})),N.success("连线已删除"))},Be=async()=>{if(u){l(!0);try{const s={positions:Object.fromEntries(i.nodes.map(n=>[n.id,{x:n.x,y:n.y}])),customNodes:i.nodes.filter(n=>Q(n.id)),customEdges:i.edges.filter(n=>n.id.startsWith("custom-edge"))};await _.saveTopology(u,JSON.stringify(s)),N.success("布局已保存")}catch{N.error("保存失败")}finally{l(!1)}}},Je=async()=>{if(await g({title:"重置布局",description:"将清除已保存的布局并重新自动排列",variant:"destructive"})){try{await _.saveTopology(u,"")}catch{}r(null),L(!1),I(!1),t(null),await K(),N.success("布局已重置")}},Qe=i.nodes.length>0?Math.max(...i.nodes.map(s=>s.x))+80:900,Ue=i.nodes.length>0?Math.max(...i.nodes.map(s=>s.y))+80:700,fe=Math.max(Qe,900),Te=Math.max(Ue,700),je=s=>i.nodes.filter(n=>n.type===s).length,Fe=()=>{if(i.nodes.length===0)return null;const s=[60,180,320,480,640],n=["集群","Ingress","Service","Deployment","Node"];return e.jsxs("svg",{"code-path":"src/components/kubernetes/TopologyView.tsx:292:7",ref:v,width:"100%",height:"100%",viewBox:`0 0 ${fe} ${Te}`,className:"bg-slate-950 rounded-lg",preserveAspectRatio:"xMidYMin meet",onMouseMove:Pe,onMouseUp:ke,onMouseLeave:ke,children:[e.jsxs("defs",{"code-path":"src/components/kubernetes/TopologyView.tsx:294:9",children:[e.jsx("pattern",{"code-path":"src/components/kubernetes/TopologyView.tsx:295:11",id:"grid",width:"20",height:"20",patternUnits:"userSpaceOnUse",children:e.jsx("path",{"code-path":"src/components/kubernetes/TopologyView.tsx:296:13",d:"M 20 0 L 0 0 0 20",fill:"none",stroke:"#1e293b",strokeWidth:"0.5"})}),e.jsx("marker",{"code-path":"src/components/kubernetes/TopologyView.tsx:298:11",id:"arrowhead",markerWidth:"10",markerHeight:"7",refX:"28",refY:"3.5",orient:"auto",children:e.jsx("polygon",{"code-path":"src/components/kubernetes/TopologyView.tsx:299:13",points:"0 0, 10 3.5, 0 7",fill:V?"#f59e0b":"#475569"})})]}),e.jsx("rect",{"code-path":"src/components/kubernetes/TopologyView.tsx:302:9",width:"100%",height:"100%",fill:"url(#grid)"}),n.map((o,a)=>e.jsx("text",{"code-path":"src/components/kubernetes/TopologyView.tsx:304:11",x:14,y:s[a]+4,fill:"#475569",fontSize:"11",className:"font-medium select-none",children:o},o)),i.edges.map(o=>{const a=i.nodes.find(R=>R.id===o.source),h=i.nodes.find(R=>R.id===o.target);if(!a||!h||!be.has(a.id)||!be.has(h.id))return null;const f=o.id.startsWith("custom-edge");return e.jsxs("g",{"code-path":"src/components/kubernetes/TopologyView.tsx:312:13",className:j&&f?"cursor-pointer":"",onClick:()=>{j&&f&&We(o)},children:[e.jsx("line",{"code-path":"src/components/kubernetes/TopologyView.tsx:313:15",x1:a.x,y1:a.y,x2:h.x,y2:h.y,stroke:f?"#f59e0b":"#475569",strokeWidth:f?2:1.5,strokeDasharray:f?"6 3":void 0,markerEnd:"url(#arrowhead)",opacity:f?.8:.6}),j&&f&&e.jsx("text",{"code-path":"src/components/kubernetes/TopologyView.tsx:318:17",x:(a.x+h.x)/2,y:(a.y+h.y)/2,fill:"#f59e0b",fontSize:"10",textAnchor:"middle",className:"select-none pointer-events-none",children:"✕ 删除"})]},o.id)}),q.map(o=>{const a=Q(o.id),h=C===o.id;return e.jsxs("g",{"code-path":"src/components/kubernetes/TopologyView.tsx:328:13",transform:`translate(${o.x}, ${o.y})`,className:V?"cursor-crosshair":y===o.id?"cursor-grabbing":"cursor-grab",onMouseDown:f=>Ie(f,o),onClick:()=>Oe(o),onDoubleClick:()=>{j&&we(o)},children:[e.jsx("circle",{"code-path":"src/components/kubernetes/TopologyView.tsx:333:15",r:"28",fill:"#0f172a",stroke:h?"#f59e0b":d?.id===o.id?"#3b82f6":a?"#f59e0b":"#334155",strokeWidth:h||d?.id===o.id?3:2,strokeDasharray:a?"4 2":void 0,className:"transition-all hover:stroke-blue-500"}),e.jsx("foreignObject",{"code-path":"src/components/kubernetes/TopologyView.tsx:338:15",x:"-12",y:"-12",width:"24",height:"24",children:e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:339:17",className:`flex items-center justify-center w-full h-full ${se(o.type).split(" ")[1]}`,children:z(o.type)})}),e.jsx("text",{"code-path":"src/components/kubernetes/TopologyView.tsx:341:15",y:"45",fill:a?"#f59e0b":"#94a3b8",fontSize:"12",textAnchor:"middle",className:"font-medium select-none",children:o.name.length>20?o.name.slice(0,18)+"…":o.name})]},o.id)})]})},He=s=>{const n=s.data||{},o=Object.entries(n).filter(([a])=>a!=="kind");return o.length===0?null:e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:356:7",className:"grid grid-cols-2 gap-3",children:o.map(([a,h])=>e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:358:11",className:"p-2 rounded-lg bg-slate-800/50",children:[e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:359:13",className:"text-xs text-slate-500 mb-0.5",children:a}),e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:360:13",className:"text-sm text-slate-200 truncate",title:String(h),children:h==null?"—":String(h)})]},a))})};return e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:368:5",className:"space-y-6",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:370:7",className:"flex items-center justify-between",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:371:9",children:[e.jsx("h1",{"code-path":"src/components/kubernetes/TopologyView.tsx:372:11",className:"text-2xl font-bold text-slate-100",children:"架构拓扑"}),e.jsxs("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:373:11",className:"text-sm text-slate-500 mt-1",children:["Kubernetes 集群资源拓扑可视化 · 拖拽节点调整布局",j&&e.jsx("span",{"code-path":"src/components/kubernetes/TopologyView.tsx:375:26",className:"text-amber-400 ml-2",children:"· 编辑模式"}),V&&e.jsxs("span",{"code-path":"src/components/kubernetes/TopologyView.tsx:376:29",className:"text-amber-400 ml-1",children:["· 连线中",C?"(选择目标节点)":"(选择源节点)"]})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:379:9",className:"flex items-center gap-2",children:[e.jsxs(le,{"code-path":"src/components/kubernetes/TopologyView.tsx:380:11",value:u,onValueChange:s=>{B(s),T(null),L(!1)},children:[e.jsx(ie,{"code-path":"src/components/kubernetes/TopologyView.tsx:381:13",className:"w-44 h-9 bg-slate-800/50 border-slate-700 text-slate-200",children:e.jsx(de,{"code-path":"src/components/kubernetes/TopologyView.tsx:381:97",placeholder:"选择集群"})}),e.jsx(pe,{"code-path":"src/components/kubernetes/TopologyView.tsx:382:13",className:"bg-slate-800 border-slate-700",children:W.map(s=>e.jsx(ee,{"code-path":"src/components/kubernetes/TopologyView.tsx:383:36",value:String(s.id),children:s.name},s.id))})]}),e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:386:11",variant:j?"default":"outline",size:"sm",className:"h-9",onClick:()=>{L(!j),I(!1),t(null)},children:[e.jsx(De,{"code-path":"src/components/kubernetes/TopologyView.tsx:388:13",className:"h-4 w-4 mr-1"}),j?"退出编辑":"编辑"]}),e.jsx(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:390:11",variant:"outline",size:"icon",className:"h-9 w-9 border-slate-700 text-slate-400",onClick:K,disabled:F,children:F?e.jsx(Le,{"code-path":"src/components/kubernetes/TopologyView.tsx:391:24",className:"h-4 w-4 animate-spin"}):e.jsx(ls,{"code-path":"src/components/kubernetes/TopologyView.tsx:391:71",className:"h-4 w-4"})}),e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:393:11",variant:"outline",size:"sm",className:"h-9 text-xs border-blue-600/40 text-blue-400",onClick:async()=>{r(null),await K()},disabled:F,title:"忽略保存的布局,重新根据 K8s 资源自动生成关联 (Ingress路径→Svc→Deploy→Pod)",children:[e.jsx(Re,{"code-path":"src/components/kubernetes/TopologyView.tsx:404:13",className:"h-3.5 w-3.5 mr-1"})," 重新自动生成"]})]})]}),j&&e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:411:9",className:"flex items-center gap-2 p-3 rounded-lg bg-slate-800/50 border border-slate-700",children:[e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:412:11",size:"sm",variant:"outline",className:"border-slate-600 text-slate-200",onClick:Xe,children:[e.jsx(is,{"code-path":"src/components/kubernetes/TopologyView.tsx:413:13",className:"h-4 w-4 mr-1"}),"添加节点"]}),e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:415:11",size:"sm",variant:V?"default":"outline",className:V?"bg-amber-600 hover:bg-amber-700":"border-slate-600 text-slate-200",onClick:()=>{I(!V),t(null)},children:[e.jsx(Ae,{"code-path":"src/components/kubernetes/TopologyView.tsx:417:13",className:"h-4 w-4 mr-1"}),V?"取消连线":"添加连线"]}),e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:419:11",className:"h-5 w-px bg-slate-600"}),e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:420:11",size:"sm",variant:"outline",className:"border-emerald-600/30 text-emerald-400 hover:bg-emerald-600/10",onClick:Be,disabled:c,children:[e.jsx(ds,{"code-path":"src/components/kubernetes/TopologyView.tsx:421:13",className:"h-4 w-4 mr-1"}),c?"保存中...":"保存布局"]}),e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:423:11",size:"sm",variant:"outline",className:"border-red-500/30 text-red-400 hover:bg-red-500/10",onClick:Je,children:[e.jsx(Re,{"code-path":"src/components/kubernetes/TopologyView.tsx:424:13",className:"h-4 w-4 mr-1"}),"重置布局"]}),e.jsx("span",{"code-path":"src/components/kubernetes/TopologyView.tsx:426:11",className:"text-xs text-slate-500 ml-auto",children:"双击节点编辑 · 点击虚线删除 · 拖拽调整位置"})]}),e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:431:7",className:"grid grid-cols-2 md:grid-cols-5 gap-4",children:[{label:"总节点数",value:i.nodes.length,icon:e.jsx(ue,{"code-path":"src/components/kubernetes/TopologyView.tsx:433:64",className:"h-5 w-5"}),color:"text-blue-400",bg:"bg-blue-500/10"},{label:"连接数",value:i.edges.length,icon:e.jsx(Ae,{"code-path":"src/components/kubernetes/TopologyView.tsx:434:63",className:"h-5 w-5"}),color:"text-purple-400",bg:"bg-purple-500/10"},{label:"Service",value:je("service"),icon:z("service"),color:"text-emerald-400",bg:"bg-emerald-500/10"},{label:"Deployment",value:je("app"),icon:z("app"),color:"text-rose-400",bg:"bg-rose-500/10"},{label:"自定义",value:i.nodes.filter(s=>Q(s.id)).length,icon:z("custom"),color:"text-amber-400",bg:"bg-amber-500/10"}].map(s=>e.jsx(ae,{"code-path":"src/components/kubernetes/TopologyView.tsx:439:11",className:"bg-slate-900 border-slate-800",children:e.jsx(ce,{"code-path":"src/components/kubernetes/TopologyView.tsx:440:13",className:"p-4",children:e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:441:15",className:"flex items-center justify-between",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:442:17",children:[e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:443:19",className:"text-sm text-slate-500",children:s.label}),e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:444:19",className:`text-2xl font-bold ${s.color}`,children:s.value})]}),e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:446:17",className:`p-3 rounded-lg ${s.bg} ${s.color}`,children:s.icon})]})})},s.label))}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:454:7",className:"flex items-center gap-3",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:455:9",className:"relative w-48",children:[e.jsx(ps,{"code-path":"src/components/kubernetes/TopologyView.tsx:456:11",className:"absolute left-3 top-1/2 -translate-y-1/2 h-4 w-4 text-slate-500"}),e.jsx(Ee,{"code-path":"src/components/kubernetes/TopologyView.tsx:457:11",placeholder:"搜索节点...",value:M,onChange:s=>A(s.target.value),className:"pl-9 h-9 bg-slate-800/50 border-slate-700 text-slate-200"})]}),e.jsxs(le,{"code-path":"src/components/kubernetes/TopologyView.tsx:459:9",value:D,onValueChange:te,children:[e.jsx(ie,{"code-path":"src/components/kubernetes/TopologyView.tsx:460:11",className:"w-36 h-9 bg-slate-800/50 border-slate-700 text-slate-200",children:e.jsx(de,{"code-path":"src/components/kubernetes/TopologyView.tsx:460:95",placeholder:"节点类型"})}),e.jsxs(pe,{"code-path":"src/components/kubernetes/TopologyView.tsx:461:11",className:"bg-slate-800 border-slate-700",children:[e.jsx(ee,{"code-path":"src/components/kubernetes/TopologyView.tsx:462:13",value:"all",children:"全部类型"}),Object.entries(me).map(([s,n])=>e.jsx(ee,{"code-path":"src/components/kubernetes/TopologyView.tsx:463:63",value:s,children:n},s))]})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:469:7",className:"grid grid-cols-1 lg:grid-cols-4 gap-6",children:[e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:470:9",className:"lg:col-span-3",children:e.jsx(ae,{"code-path":"src/components/kubernetes/TopologyView.tsx:471:11",className:"bg-slate-900 border-slate-800",children:e.jsx(ce,{"code-path":"src/components/kubernetes/TopologyView.tsx:472:13",className:"p-4",children:e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:473:15",className:`h-[600px] overflow-auto ${V?"ring-2 ring-amber-500/30 rounded-lg":""}`,children:F?e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:475:19",className:"flex items-center justify-center h-full",children:e.jsx(Le,{"code-path":"src/components/kubernetes/TopologyView.tsx:475:76",className:"h-8 w-8 animate-spin text-slate-600"})}):i.nodes.length===0?e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:477:19",className:"flex flex-col items-center justify-center h-full text-slate-600",children:[e.jsx(ue,{"code-path":"src/components/kubernetes/TopologyView.tsx:478:21",className:"h-12 w-12 mb-3 opacity-50"}),e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:479:21",className:"text-sm",children:u?"该集群暂无拓扑数据":"请选择集群查看拓扑"})]}):Fe()})})})}),e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:486:9",children:e.jsxs(ae,{"code-path":"src/components/kubernetes/TopologyView.tsx:487:11",className:"bg-slate-900 border-slate-800",children:[e.jsxs(Ke,{"code-path":"src/components/kubernetes/TopologyView.tsx:488:13",className:"pb-2",children:[e.jsx(Ge,{"code-path":"src/components/kubernetes/TopologyView.tsx:489:15",className:"text-base text-slate-100",children:"节点列表"}),e.jsx(Ze,{"code-path":"src/components/kubernetes/TopologyView.tsx:490:15",className:"text-slate-500",children:"点击节点查看详情"})]}),e.jsx(ce,{"code-path":"src/components/kubernetes/TopologyView.tsx:492:13",children:e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:493:15",className:"space-y-2 max-h-[520px] overflow-auto",children:q.length===0?e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:495:19",className:"text-sm text-slate-600 text-center py-8",children:"暂无节点"}):q.map(s=>e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:498:21",className:`flex items-center gap-3 p-2 rounded-lg cursor-pointer transition-colors ${d?.id===s.id?"bg-blue-500/10 border border-blue-500/30":"hover:bg-slate-800/50"}`,onClick:()=>T(s),children:[e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:499:23",className:`p-2 rounded-lg ${se(s.type)}`,children:z(s.type)}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:500:23",className:"flex-1 min-w-0",children:[e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:501:25",className:"text-sm font-medium text-slate-200 truncate",children:s.name}),e.jsxs("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:502:25",className:"text-xs text-slate-500",children:[me[s.type]||s.type,Q(s.id)?" · 自定义":""]})]})]},s.id))})})]})})]}),e.jsx(Ve,{"code-path":"src/components/kubernetes/TopologyView.tsx:514:7",open:!!d,onOpenChange:()=>T(null),children:e.jsxs(Ne,{"code-path":"src/components/kubernetes/TopologyView.tsx:515:9",className:"bg-slate-900 border-slate-800 max-w-lg",children:[e.jsxs(ve,{"code-path":"src/components/kubernetes/TopologyView.tsx:516:11",children:[e.jsxs(Se,{"code-path":"src/components/kubernetes/TopologyView.tsx:517:13",className:"text-slate-100 flex items-center gap-2",children:[e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:518:15",className:`p-2 rounded-lg ${se(d?.type||"server")}`,children:d&&z(d.type)}),d?.name,d&&Q(d.id)&&e.jsx($e,{"code-path":"src/components/kubernetes/TopologyView.tsx:520:65",variant:"outline",className:"border-amber-500/30 text-amber-400 text-xs",children:"自定义"})]}),e.jsxs(Ce,{"code-path":"src/components/kubernetes/TopologyView.tsx:522:13",className:"text-slate-500",children:["类型: ",me[d?.type||""]||d?.type]})]}),d&&e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:525:13",className:"space-y-4",children:[He(d),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:527:15",children:[e.jsx("h4",{"code-path":"src/components/kubernetes/TopologyView.tsx:528:17",className:"text-sm font-medium text-slate-300 mb-2",children:"关联连接"}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:529:17",className:"space-y-2",children:[i.edges.filter(s=>s.source===d.id||s.target===d.id).map(s=>{const n=s.source===d.id,o=i.nodes.find(a=>a.id===(n?s.target:s.source));return o?e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:535:23",className:"flex items-center gap-2 p-2 rounded-lg bg-slate-800/50",children:[e.jsx("span",{"code-path":"src/components/kubernetes/TopologyView.tsx:536:25",className:"text-sm text-slate-400",children:n?"→":"←"}),e.jsx("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:537:25",className:`p-1 rounded ${se(o.type)}`,children:z(o.type,"h-4 w-4")}),e.jsx("span",{"code-path":"src/components/kubernetes/TopologyView.tsx:538:25",className:"text-sm text-slate-300",children:o.name}),e.jsx($e,{"code-path":"src/components/kubernetes/TopologyView.tsx:539:25",variant:"outline",className:"ml-auto border-slate-700 text-slate-400 text-xs",children:s.label})]},s.id):null}),i.edges.filter(s=>s.source===d.id||s.target===d.id).length===0&&e.jsx("p",{"code-path":"src/components/kubernetes/TopologyView.tsx:543:127",className:"text-xs text-slate-600",children:"无关联连接"})]})]}),j&&d&&e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:548:17",className:"flex gap-2 pt-2 border-t border-slate-700",children:[e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:549:19",size:"sm",variant:"outline",className:"border-slate-600 text-slate-200",onClick:()=>we(d),children:[e.jsx(De,{"code-path":"src/components/kubernetes/TopologyView.tsx:550:21",className:"h-3.5 w-3.5 mr-1"}),"编辑"]}),Q(d.id)&&e.jsxs(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:553:21",size:"sm",variant:"outline",className:"border-red-500/30 text-red-400 hover:bg-red-500/10",onClick:()=>ze(d),children:[e.jsx(ms,{"code-path":"src/components/kubernetes/TopologyView.tsx:554:23",className:"h-3.5 w-3.5 mr-1"}),"删除"]})]})]})]})}),e.jsx(Ve,{"code-path":"src/components/kubernetes/TopologyView.tsx:565:7",open:J,onOpenChange:P,children:e.jsxs(Ne,{"code-path":"src/components/kubernetes/TopologyView.tsx:566:9",className:"bg-slate-900 border-slate-800 max-w-md",children:[e.jsxs(ve,{"code-path":"src/components/kubernetes/TopologyView.tsx:567:11",children:[e.jsx(Se,{"code-path":"src/components/kubernetes/TopologyView.tsx:568:13",className:"text-slate-100",children:O?"编辑节点":"添加自定义节点"}),e.jsx(Ce,{"code-path":"src/components/kubernetes/TopologyView.tsx:569:13",className:"text-slate-500",children:O?"修改节点属性":"添加数据库、外部服务等非 Kubernetes 资源节点"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:571:11",className:"space-y-4",children:[e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:572:13",className:"space-y-2",children:[e.jsx(re,{"code-path":"src/components/kubernetes/TopologyView.tsx:573:15",className:"text-slate-300",children:"名称"}),e.jsx(Ee,{"code-path":"src/components/kubernetes/TopologyView.tsx:574:15",value:w.name,onChange:s=>H({...w,name:s.target.value}),placeholder:"如 MySQL 主库、Redis 集群",className:"bg-slate-800/50 border-slate-700 text-slate-200"})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:577:13",className:"space-y-2",children:[e.jsx(re,{"code-path":"src/components/kubernetes/TopologyView.tsx:578:15",className:"text-slate-300",children:"类型"}),e.jsxs(le,{"code-path":"src/components/kubernetes/TopologyView.tsx:579:15",value:w.type,onValueChange:s=>H({...w,type:s}),children:[e.jsx(ie,{"code-path":"src/components/kubernetes/TopologyView.tsx:580:17",className:"bg-slate-800/50 border-slate-700 text-slate-200",children:e.jsx(de,{"code-path":"src/components/kubernetes/TopologyView.tsx:580:92"})}),e.jsx(pe,{"code-path":"src/components/kubernetes/TopologyView.tsx:581:17",className:"bg-slate-800 border-slate-700",children:us.map(s=>e.jsxs(ee,{"code-path":"src/components/kubernetes/TopologyView.tsx:582:49",value:s.value,children:[s.label," — ",s.desc]},s.value))})]})]}),e.jsxs("div",{"code-path":"src/components/kubernetes/TopologyView.tsx:586:13",className:"space-y-2",children:[e.jsx(re,{"code-path":"src/components/kubernetes/TopologyView.tsx:587:15",className:"text-slate-300",children:"备注"}),e.jsx(ts,{"code-path":"src/components/kubernetes/TopologyView.tsx:588:15",value:w.note,onChange:s=>H({...w,note:s.target.value}),placeholder:"连接信息、用途说明等",rows:2,className:"bg-slate-800/50 border-slate-700 text-slate-200 resize-none"})]})]}),e.jsxs(ss,{"code-path":"src/components/kubernetes/TopologyView.tsx:592:11",children:[e.jsx(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:593:13",variant:"outline",className:"border-slate-700 text-slate-300",onClick:()=>P(!1),children:"取消"}),e.jsx(S,{"code-path":"src/components/kubernetes/TopologyView.tsx:594:13",onClick:Ye,children:O?"保存":"添加"})]})]})})]})}export{vs as TopologyView};