@skyhook-io/radar-app 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +67 -0
- package/package.json +80 -0
- package/src/App.tsx +1538 -0
- package/src/RadarApp.tsx +145 -0
- package/src/api/apiResources.ts +28 -0
- package/src/api/client.ts +2583 -0
- package/src/api/config.ts +116 -0
- package/src/api/traffic.ts +139 -0
- package/src/components/ConnectionErrorView.tsx +272 -0
- package/src/components/ContextSwitcher.tsx +481 -0
- package/src/components/DebugOverlay.tsx +94 -0
- package/src/components/UserMenu.tsx +87 -0
- package/src/components/audit/AuditSettingsDialog.tsx +162 -0
- package/src/components/audit/AuditView.tsx +123 -0
- package/src/components/cost/CostTrendChart.tsx +388 -0
- package/src/components/cost/CostView.tsx +545 -0
- package/src/components/dock/BottomDock.tsx +96 -0
- package/src/components/dock/DockContext.tsx +11 -0
- package/src/components/dock/LocalTerminalTab.tsx +22 -0
- package/src/components/dock/LogsTab.tsx +26 -0
- package/src/components/dock/NodeTerminalTab.tsx +50 -0
- package/src/components/dock/TerminalTab.tsx +42 -0
- package/src/components/dock/TrafficFlowListTab.tsx +18 -0
- package/src/components/dock/WorkloadLogsTab.tsx +23 -0
- package/src/components/dock/index.ts +2 -0
- package/src/components/gitops/GitOpsActions.tsx +1 -0
- package/src/components/gitops/GitOpsStatusBadge.tsx +1 -0
- package/src/components/gitops/ManagedResourcesList.tsx +1 -0
- package/src/components/gitops/SyncCountdown.tsx +1 -0
- package/src/components/gitops/index.ts +4 -0
- package/src/components/helm/ChartBrowser.tsx +580 -0
- package/src/components/helm/HelmReleaseDrawer.tsx +774 -0
- package/src/components/helm/HelmView.tsx +475 -0
- package/src/components/helm/InstallWizard.tsx +1060 -0
- package/src/components/helm/ManifestDiffViewer.tsx +91 -0
- package/src/components/helm/ManifestViewer.tsx +61 -0
- package/src/components/helm/OwnedResources.tsx +465 -0
- package/src/components/helm/RevisionHistory.tsx +167 -0
- package/src/components/helm/ValuesDiffPreview.tsx +190 -0
- package/src/components/helm/ValuesViewer.tsx +365 -0
- package/src/components/helm/helm-utils.ts +37 -0
- package/src/components/home/ActivitySummary.tsx +262 -0
- package/src/components/home/CertificateHealthCard.tsx +105 -0
- package/src/components/home/ClusterHealthCard.tsx +483 -0
- package/src/components/home/CostCard.tsx +112 -0
- package/src/components/home/HealthRing.tsx +1 -0
- package/src/components/home/HelmSummary.tsx +129 -0
- package/src/components/home/HomeView.tsx +224 -0
- package/src/components/home/MCPSetupDialog.tsx +417 -0
- package/src/components/home/NetworkPolicyCoverageCard.tsx +109 -0
- package/src/components/home/TopologyPreview.tsx +219 -0
- package/src/components/home/TrafficSummary.tsx +154 -0
- package/src/components/logs/JsonLogLine.tsx +1 -0
- package/src/components/logs/LogCore.tsx +2 -0
- package/src/components/logs/LogsViewer.tsx +44 -0
- package/src/components/logs/WorkloadLogsViewer.tsx +40 -0
- package/src/components/logs/useLogBuffer.ts +2 -0
- package/src/components/logs/useLogSearch.ts +1 -0
- package/src/components/portforward/PortForwardButton.tsx +375 -0
- package/src/components/portforward/PortForwardManager.tsx +871 -0
- package/src/components/resource/PrometheusCharts.tsx +687 -0
- package/src/components/resource-drawer/ResourceDrawer.tsx +214 -0
- package/src/components/resources/ImageFilesystemModal.tsx +745 -0
- package/src/components/resources/PodFilesystemModal.tsx +407 -0
- package/src/components/resources/ResourceDetailDrawer.tsx +43 -0
- package/src/components/resources/ResourcesView.tsx +190 -0
- package/src/components/resources/drawer-components.tsx +1 -0
- package/src/components/resources/file-browser-utils.ts +35 -0
- package/src/components/resources/renderers/AlertRenderer.tsx +1 -0
- package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +17 -0
- package/src/components/resources/renderers/CNPGBackupRenderer.tsx +1 -0
- package/src/components/resources/renderers/CNPGClusterRenderer.tsx +1 -0
- package/src/components/resources/renderers/CNPGPoolerRenderer.tsx +1 -0
- package/src/components/resources/renderers/CNPGScheduledBackupRenderer.tsx +1 -0
- package/src/components/resources/renderers/CertificateRenderer.tsx +1 -0
- package/src/components/resources/renderers/CertificateRequestRenderer.tsx +1 -0
- package/src/components/resources/renderers/ChallengeRenderer.tsx +1 -0
- package/src/components/resources/renderers/ClusterComplianceReportRenderer.tsx +1 -0
- package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +1 -0
- package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +1 -0
- package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +1 -0
- package/src/components/resources/renderers/ConfigMapRenderer.tsx +1 -0
- package/src/components/resources/renderers/CronJobRenderer.tsx +1 -0
- package/src/components/resources/renderers/EventRenderer.tsx +1 -0
- package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +1 -0
- package/src/components/resources/renderers/ExternalSecretRenderer.tsx +1 -0
- package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +1 -0
- package/src/components/resources/renderers/GRPCRouteRenderer.tsx +1 -0
- package/src/components/resources/renderers/GatewayClassRenderer.tsx +1 -0
- package/src/components/resources/renderers/GatewayRenderer.tsx +1 -0
- package/src/components/resources/renderers/GenericRenderer.tsx +1 -0
- package/src/components/resources/renderers/GitRepositoryRenderer.tsx +1 -0
- package/src/components/resources/renderers/HPARenderer.tsx +1 -0
- package/src/components/resources/renderers/HTTPRouteRenderer.tsx +1 -0
- package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +1 -0
- package/src/components/resources/renderers/IngressClassRenderer.tsx +1 -0
- package/src/components/resources/renderers/IngressRenderer.tsx +1 -0
- package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +1 -0
- package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +1 -0
- package/src/components/resources/renderers/IstioGatewayRenderer.tsx +1 -0
- package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +1 -0
- package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +1 -0
- package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +1 -0
- package/src/components/resources/renderers/JobRenderer.tsx +1 -0
- package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +1 -0
- package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +1 -0
- package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +1 -0
- package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +1 -0
- package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +1 -0
- package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeEventingRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeFlowRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeRouteRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeServiceRenderer.tsx +1 -0
- package/src/components/resources/renderers/KnativeSourceRenderer.tsx +1 -0
- package/src/components/resources/renderers/KustomizationRenderer.tsx +1 -0
- package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +1 -0
- package/src/components/resources/renderers/LeaseRenderer.tsx +1 -0
- package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +1 -0
- package/src/components/resources/renderers/NodeRenderer.tsx +44 -0
- package/src/components/resources/renderers/OCIRepositoryRenderer.tsx +1 -0
- package/src/components/resources/renderers/OrderRenderer.tsx +1 -0
- package/src/components/resources/renderers/PVCRenderer.tsx +1 -0
- package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +1 -0
- package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +1 -0
- package/src/components/resources/renderers/PodMonitorRenderer.tsx +1 -0
- package/src/components/resources/renderers/PodRenderer.tsx +94 -0
- package/src/components/resources/renderers/PriorityClassRenderer.tsx +1 -0
- package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +1 -0
- package/src/components/resources/renderers/ReplicaSetRenderer.tsx +1 -0
- package/src/components/resources/renderers/RoleBindingRenderer.tsx +1 -0
- package/src/components/resources/renderers/RoleRenderer.tsx +1 -0
- package/src/components/resources/renderers/RolloutRenderer.tsx +1 -0
- package/src/components/resources/renderers/RuntimeClassRenderer.tsx +1 -0
- package/src/components/resources/renderers/SbomReportRenderer.tsx +1 -0
- package/src/components/resources/renderers/SealedSecretRenderer.tsx +1 -0
- package/src/components/resources/renderers/SecretRenderer.tsx +1 -0
- package/src/components/resources/renderers/SecretStoreRenderer.tsx +1 -0
- package/src/components/resources/renderers/ServiceAccountRenderer.tsx +1 -0
- package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +1 -0
- package/src/components/resources/renderers/ServiceRenderer.tsx +26 -0
- package/src/components/resources/renderers/SimpleRouteRenderer.tsx +1 -0
- package/src/components/resources/renderers/StorageClassRenderer.tsx +1 -0
- package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +1 -0
- package/src/components/resources/renderers/VPARenderer.tsx +1 -0
- package/src/components/resources/renderers/VeleroBSLRenderer.tsx +1 -0
- package/src/components/resources/renderers/VeleroBackupRenderer.tsx +1 -0
- package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +1 -0
- package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +1 -0
- package/src/components/resources/renderers/VeleroVSLRenderer.tsx +1 -0
- package/src/components/resources/renderers/VulnerabilityReportRenderer.tsx +1 -0
- package/src/components/resources/renderers/WebhookConfigRenderer.tsx +1 -0
- package/src/components/resources/renderers/WorkflowRenderer.tsx +1 -0
- package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +1 -0
- package/src/components/resources/renderers/WorkloadRenderer.tsx +52 -0
- package/src/components/resources/renderers/argo-cells.tsx +1 -0
- package/src/components/resources/renderers/certmanager-cells.tsx +1 -0
- package/src/components/resources/renderers/cnpg-cells.tsx +1 -0
- package/src/components/resources/renderers/eso-cells.tsx +1 -0
- package/src/components/resources/renderers/flux-cells.tsx +1 -0
- package/src/components/resources/renderers/index.ts +91 -0
- package/src/components/resources/renderers/istio-cells.tsx +1 -0
- package/src/components/resources/renderers/karpenter-cells.tsx +1 -0
- package/src/components/resources/renderers/keda-cells.tsx +1 -0
- package/src/components/resources/renderers/knative-cells.tsx +1 -0
- package/src/components/resources/renderers/kyverno-cells.tsx +1 -0
- package/src/components/resources/renderers/prometheus-cells.tsx +1 -0
- package/src/components/resources/renderers/traefik-cells.tsx +1 -0
- package/src/components/resources/renderers/trivy-cells.tsx +1 -0
- package/src/components/resources/renderers/trivy-shared.tsx +1 -0
- package/src/components/resources/renderers/velero-cells.tsx +1 -0
- package/src/components/resources/resource-utils-argo.ts +2 -0
- package/src/components/resources/resource-utils-certmanager.ts +2 -0
- package/src/components/resources/resource-utils-cnpg.ts +2 -0
- package/src/components/resources/resource-utils-eso.ts +2 -0
- package/src/components/resources/resource-utils-flux.ts +2 -0
- package/src/components/resources/resource-utils-istio.ts +2 -0
- package/src/components/resources/resource-utils-karpenter.ts +2 -0
- package/src/components/resources/resource-utils-keda.ts +2 -0
- package/src/components/resources/resource-utils-knative.ts +2 -0
- package/src/components/resources/resource-utils-kyverno.ts +2 -0
- package/src/components/resources/resource-utils-prometheus.ts +2 -0
- package/src/components/resources/resource-utils-traefik.ts +1 -0
- package/src/components/resources/resource-utils-trivy.ts +2 -0
- package/src/components/resources/resource-utils-velero.ts +2 -0
- package/src/components/resources/resource-utils.ts +5 -0
- package/src/components/settings/SettingsDialog.tsx +537 -0
- package/src/components/shared/CreateResourceDialog.tsx +17 -0
- package/src/components/shared/EditableYamlView.tsx +24 -0
- package/src/components/shared/LargeClusterNamespacePicker.tsx +70 -0
- package/src/components/shared/ResourceRendererDispatch.tsx +31 -0
- package/src/components/timeline/DiffViewer.tsx +1 -0
- package/src/components/timeline/TimelineList.tsx +69 -0
- package/src/components/timeline/TimelineSwimlanes.tsx +1308 -0
- package/src/components/timeline/TimelineView.tsx +157 -0
- package/src/components/timeline/shared.tsx +1 -0
- package/src/components/traffic/TrafficFilterSidebar.tsx +571 -0
- package/src/components/traffic/TrafficFlowList.tsx +415 -0
- package/src/components/traffic/TrafficFlowListContext.tsx +68 -0
- package/src/components/traffic/TrafficGraph.tsx +1546 -0
- package/src/components/traffic/TrafficView.tsx +1213 -0
- package/src/components/traffic/TrafficWizard.tsx +386 -0
- package/src/components/traffic/index.ts +3 -0
- package/src/components/ui/CodeViewer.tsx +8 -0
- package/src/components/ui/CommandPalette.tsx +460 -0
- package/src/components/ui/ConfirmDialog.tsx +1 -0
- package/src/components/ui/DiagnosticsOverlay.tsx +619 -0
- package/src/components/ui/ErrorBoundary.tsx +46 -0
- package/src/components/ui/ForceDeleteConfirmDialog.tsx +1 -0
- package/src/components/ui/Markdown.tsx +108 -0
- package/src/components/ui/MetricsChart.tsx +1 -0
- package/src/components/ui/NamespaceSelector.tsx +436 -0
- package/src/components/ui/ResourceBar.tsx +1 -0
- package/src/components/ui/ShortcutHelpOverlay.tsx +301 -0
- package/src/components/ui/Toast.tsx +1 -0
- package/src/components/ui/Tooltip.tsx +1 -0
- package/src/components/ui/UpdateNotification.tsx +299 -0
- package/src/components/ui/YamlEditor.tsx +1 -0
- package/src/components/workload/WorkloadView.tsx +532 -0
- package/src/context/ConnectionContext.tsx +173 -0
- package/src/context/ContextSwitchContext.tsx +56 -0
- package/src/context/NavCustomization.tsx +62 -0
- package/src/context/ThemeContext.tsx +97 -0
- package/src/contexts/CapabilitiesContext.tsx +130 -0
- package/src/hooks/useAnimatedUnmount.ts +1 -0
- package/src/hooks/useDesktopDownload.ts +41 -0
- package/src/hooks/useEventSource.ts +262 -0
- package/src/hooks/useFavorites.ts +69 -0
- package/src/hooks/useKeyboardShortcuts.tsx +7 -0
- package/src/hooks/useRefreshAnimation.ts +1 -0
- package/src/index.css +243 -0
- package/src/index.ts +17 -0
- package/src/main.tsx +158 -0
- package/src/types/gitops.ts +2 -0
- package/src/types.ts +3 -0
- package/src/utils/animation.ts +2 -0
- package/src/utils/badge-colors.ts +2 -0
- package/src/utils/context-name.ts +2 -0
- package/src/utils/desktop-download.ts +66 -0
- package/src/utils/desktop-open-folder.ts +21 -0
- package/src/utils/format.ts +2 -0
- package/src/utils/log-format.ts +12 -0
- package/src/utils/navigation.ts +23 -0
- package/src/utils/resource-hierarchy.ts +2 -0
- package/src/utils/resource-icons.ts +2 -0
- package/src/utils/skeleton-yaml.ts +2 -0
- package/src/utils/traffic-colors.ts +54 -0
- package/src/vite-env.d.ts +1 -0
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { memo } from 'react'
|
|
2
|
+
import { X, ExternalLink, Copy, Check } from 'lucide-react'
|
|
3
|
+
import { clsx } from 'clsx'
|
|
4
|
+
import { useState, useCallback } from 'react'
|
|
5
|
+
import type { TopologyNode, NodeKind, HealthStatus } from '../../types'
|
|
6
|
+
import { getKindBadgeBordered, healthToSeverity, SEVERITY_BADGE_BORDERED } from '../../utils/badge-colors'
|
|
7
|
+
|
|
8
|
+
interface ResourceDrawerProps {
|
|
9
|
+
node: TopologyNode
|
|
10
|
+
onClose: () => void
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
// Status badge colors using centralized severity
|
|
14
|
+
function getStatusBadge(status: HealthStatus) {
|
|
15
|
+
const severity = healthToSeverity(status)
|
|
16
|
+
return SEVERITY_BADGE_BORDERED[severity]
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
// Format data value for display
|
|
20
|
+
function formatValue(value: unknown): string {
|
|
21
|
+
if (value === null || value === undefined) return '-'
|
|
22
|
+
if (typeof value === 'boolean') return value ? 'Yes' : 'No'
|
|
23
|
+
if (typeof value === 'object') return JSON.stringify(value, null, 2)
|
|
24
|
+
return String(value)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
// Get display fields for each kind
|
|
28
|
+
function getDisplayFields(kind: NodeKind, data: Record<string, unknown>): Array<[string, unknown]> {
|
|
29
|
+
const common: Array<[string, unknown]> = data.namespace
|
|
30
|
+
? [['Namespace', data.namespace]]
|
|
31
|
+
: []
|
|
32
|
+
|
|
33
|
+
switch (kind) {
|
|
34
|
+
case 'Pod':
|
|
35
|
+
return [
|
|
36
|
+
...common,
|
|
37
|
+
['Phase', data.phase],
|
|
38
|
+
['Restarts', data.restarts],
|
|
39
|
+
['Containers', data.containers],
|
|
40
|
+
['Node', data.nodeName],
|
|
41
|
+
]
|
|
42
|
+
case 'Deployment':
|
|
43
|
+
case 'DaemonSet':
|
|
44
|
+
case 'StatefulSet':
|
|
45
|
+
return [
|
|
46
|
+
...common,
|
|
47
|
+
['Ready', `${data.readyReplicas ?? 0}/${data.totalReplicas ?? 0}`],
|
|
48
|
+
['Strategy', data.strategy],
|
|
49
|
+
]
|
|
50
|
+
case 'ReplicaSet':
|
|
51
|
+
return [
|
|
52
|
+
...common,
|
|
53
|
+
['Ready', `${data.readyReplicas ?? 0}/${data.totalReplicas ?? 0}`],
|
|
54
|
+
]
|
|
55
|
+
case 'Service':
|
|
56
|
+
return [
|
|
57
|
+
...common,
|
|
58
|
+
['Type', data.type],
|
|
59
|
+
['Cluster IP', data.clusterIP],
|
|
60
|
+
['Port', data.port],
|
|
61
|
+
]
|
|
62
|
+
case 'Ingress':
|
|
63
|
+
return [
|
|
64
|
+
...common,
|
|
65
|
+
['Hostname', data.hostname],
|
|
66
|
+
['TLS', data.tls],
|
|
67
|
+
]
|
|
68
|
+
case 'Gateway':
|
|
69
|
+
return [
|
|
70
|
+
...common,
|
|
71
|
+
['Listeners', data.listenerCount],
|
|
72
|
+
['Addresses', Array.isArray(data.addresses) ? (data.addresses as string[]).join(', ') : '-'],
|
|
73
|
+
]
|
|
74
|
+
case 'HTTPRoute':
|
|
75
|
+
case 'GRPCRoute':
|
|
76
|
+
case 'TCPRoute':
|
|
77
|
+
case 'TLSRoute':
|
|
78
|
+
return [
|
|
79
|
+
...common,
|
|
80
|
+
['Hostnames', Array.isArray(data.hostnames) ? (data.hostnames as string[]).join(', ') : '-'],
|
|
81
|
+
['Rules', data.rulesCount],
|
|
82
|
+
]
|
|
83
|
+
case 'ConfigMap':
|
|
84
|
+
return [
|
|
85
|
+
...common,
|
|
86
|
+
['Keys', data.keys],
|
|
87
|
+
]
|
|
88
|
+
case 'HorizontalPodAutoscaler':
|
|
89
|
+
return [
|
|
90
|
+
...common,
|
|
91
|
+
['Min Replicas', data.minReplicas],
|
|
92
|
+
['Max Replicas', data.maxReplicas],
|
|
93
|
+
['Current', data.current],
|
|
94
|
+
]
|
|
95
|
+
default:
|
|
96
|
+
return common
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export const ResourceDrawer = memo(function ResourceDrawer({
|
|
101
|
+
node,
|
|
102
|
+
onClose,
|
|
103
|
+
}: ResourceDrawerProps) {
|
|
104
|
+
const [copied, setCopied] = useState(false)
|
|
105
|
+
|
|
106
|
+
const copyName = useCallback(() => {
|
|
107
|
+
navigator.clipboard.writeText(node.name)
|
|
108
|
+
setCopied(true)
|
|
109
|
+
setTimeout(() => setCopied(false), 2000)
|
|
110
|
+
}, [node.name])
|
|
111
|
+
|
|
112
|
+
const fields = getDisplayFields(node.kind, node.data)
|
|
113
|
+
|
|
114
|
+
return (
|
|
115
|
+
<>
|
|
116
|
+
{/* Backdrop */}
|
|
117
|
+
<div
|
|
118
|
+
className="fixed inset-0 bg-black/50 z-40"
|
|
119
|
+
onClick={onClose}
|
|
120
|
+
/>
|
|
121
|
+
|
|
122
|
+
{/* Drawer */}
|
|
123
|
+
<div className="fixed right-0 top-0 bottom-0 w-96 bg-theme-surface border-l border-theme-border z-50 flex flex-col shadow-drawer">
|
|
124
|
+
{/* Header */}
|
|
125
|
+
<div className="flex items-start justify-between p-4 border-b border-theme-border">
|
|
126
|
+
<div className="flex-1 min-w-0">
|
|
127
|
+
<div className="flex items-center gap-2 mb-2">
|
|
128
|
+
<span
|
|
129
|
+
className={clsx(
|
|
130
|
+
'badge',
|
|
131
|
+
getKindBadgeBordered(node.kind)
|
|
132
|
+
)}
|
|
133
|
+
>
|
|
134
|
+
{node.kind}
|
|
135
|
+
</span>
|
|
136
|
+
<span
|
|
137
|
+
className={clsx(
|
|
138
|
+
'badge',
|
|
139
|
+
getStatusBadge(node.status)
|
|
140
|
+
)}
|
|
141
|
+
>
|
|
142
|
+
{node.status}
|
|
143
|
+
</span>
|
|
144
|
+
</div>
|
|
145
|
+
<div className="flex items-center gap-2">
|
|
146
|
+
<h2 className="text-lg font-semibold text-theme-text-primary truncate">
|
|
147
|
+
{node.name}
|
|
148
|
+
</h2>
|
|
149
|
+
<button
|
|
150
|
+
onClick={copyName}
|
|
151
|
+
className="p-1 text-theme-text-secondary hover:text-theme-text-primary hover:bg-theme-elevated rounded"
|
|
152
|
+
title="Copy name"
|
|
153
|
+
>
|
|
154
|
+
{copied ? (
|
|
155
|
+
<Check className="w-4 h-4 text-green-400" />
|
|
156
|
+
) : (
|
|
157
|
+
<Copy className="w-4 h-4" />
|
|
158
|
+
)}
|
|
159
|
+
</button>
|
|
160
|
+
</div>
|
|
161
|
+
</div>
|
|
162
|
+
<button
|
|
163
|
+
onClick={onClose}
|
|
164
|
+
className="p-2 text-theme-text-secondary hover:text-theme-text-primary hover:bg-theme-elevated rounded"
|
|
165
|
+
>
|
|
166
|
+
<X className="w-5 h-5" />
|
|
167
|
+
</button>
|
|
168
|
+
</div>
|
|
169
|
+
|
|
170
|
+
{/* Content */}
|
|
171
|
+
<div className="flex-1 overflow-y-auto p-4">
|
|
172
|
+
{/* Details */}
|
|
173
|
+
<section className="mb-6">
|
|
174
|
+
<h3 className="text-sm font-medium text-theme-text-secondary uppercase tracking-wide mb-3">
|
|
175
|
+
Details
|
|
176
|
+
</h3>
|
|
177
|
+
<div className="space-y-3">
|
|
178
|
+
{fields.map(([label, value]) => (
|
|
179
|
+
<div key={label as string}>
|
|
180
|
+
<dt className="text-xs text-theme-text-tertiary mb-0.5">{label as string}</dt>
|
|
181
|
+
<dd className="text-sm text-theme-text-primary">{formatValue(value)}</dd>
|
|
182
|
+
</div>
|
|
183
|
+
))}
|
|
184
|
+
</div>
|
|
185
|
+
</section>
|
|
186
|
+
|
|
187
|
+
{/* Raw data */}
|
|
188
|
+
<section>
|
|
189
|
+
<h3 className="text-sm font-medium text-theme-text-secondary uppercase tracking-wide mb-3">
|
|
190
|
+
Raw Data
|
|
191
|
+
</h3>
|
|
192
|
+
<pre className="bg-theme-base rounded-lg p-3 text-xs text-theme-text-secondary overflow-x-auto">
|
|
193
|
+
{JSON.stringify(node.data, null, 2)}
|
|
194
|
+
</pre>
|
|
195
|
+
</section>
|
|
196
|
+
</div>
|
|
197
|
+
|
|
198
|
+
{/* Footer */}
|
|
199
|
+
<div className="p-4 border-t border-theme-border">
|
|
200
|
+
<button
|
|
201
|
+
onClick={() => {
|
|
202
|
+
// TODO: Open kubectl command or link to dashboard
|
|
203
|
+
console.log('View in dashboard:', node)
|
|
204
|
+
}}
|
|
205
|
+
className="w-full flex items-center justify-center gap-2 px-4 py-2 btn-brand rounded-lg"
|
|
206
|
+
>
|
|
207
|
+
<ExternalLink className="w-4 h-4" />
|
|
208
|
+
View Full Resource
|
|
209
|
+
</button>
|
|
210
|
+
</div>
|
|
211
|
+
</div>
|
|
212
|
+
</>
|
|
213
|
+
)
|
|
214
|
+
})
|