@skyhook-io/k8s-ui 1.2.3 → 1.3.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.
Files changed (118) hide show
  1. package/package.json +3 -2
  2. package/src/components/dock/BottomDock.tsx +1 -1
  3. package/src/components/dock/LocalTerminalTab.tsx +1 -1
  4. package/src/components/dock/NodeTerminalTab.tsx +1 -1
  5. package/src/components/dock/TerminalTab.tsx +2 -2
  6. package/src/components/gitops/GitOpsActions.tsx +12 -11
  7. package/src/components/gitops/GitOpsStatusBadge.tsx +6 -6
  8. package/src/components/logs/LogCore.tsx +8 -8
  9. package/src/components/logs/WorkloadLogsViewer.tsx +29 -5
  10. package/src/components/logs/useLogStream.ts +20 -0
  11. package/src/components/resources/ResourcesSidebar.tsx +10 -10
  12. package/src/components/resources/ResourcesView.tsx +49 -48
  13. package/src/components/resources/renderers/AlertRenderer.tsx +2 -2
  14. package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +2 -2
  15. package/src/components/resources/renderers/CNPGClusterRenderer.tsx +1 -1
  16. package/src/components/resources/renderers/CertificateRenderer.tsx +3 -3
  17. package/src/components/resources/renderers/CertificateRequestRenderer.tsx +3 -3
  18. package/src/components/resources/renderers/ChallengeRenderer.tsx +2 -2
  19. package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +3 -3
  20. package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +3 -3
  21. package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +2 -2
  22. package/src/components/resources/renderers/ContourHTTPProxyRenderer.tsx +1 -1
  23. package/src/components/resources/renderers/EventRenderer.tsx +1 -1
  24. package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +2 -2
  25. package/src/components/resources/renderers/ExternalSecretRenderer.tsx +2 -2
  26. package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +1 -1
  27. package/src/components/resources/renderers/GRPCRouteRenderer.tsx +5 -5
  28. package/src/components/resources/renderers/GatewayClassRenderer.tsx +1 -1
  29. package/src/components/resources/renderers/GatewayRenderer.tsx +3 -3
  30. package/src/components/resources/renderers/GenericRenderer.tsx +1 -1
  31. package/src/components/resources/renderers/HPARenderer.tsx +1 -1
  32. package/src/components/resources/renderers/HTTPRouteRenderer.tsx +5 -5
  33. package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +1 -1
  34. package/src/components/resources/renderers/IngressClassRenderer.tsx +1 -1
  35. package/src/components/resources/renderers/IngressRenderer.tsx +1 -1
  36. package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +10 -10
  37. package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +1 -1
  38. package/src/components/resources/renderers/IstioGatewayRenderer.tsx +2 -2
  39. package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +2 -2
  40. package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +6 -6
  41. package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +5 -5
  42. package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +5 -5
  43. package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +2 -2
  44. package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +4 -4
  45. package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +3 -3
  46. package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +3 -3
  47. package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +5 -5
  48. package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +2 -2
  49. package/src/components/resources/renderers/KnativeEventingRenderer.tsx +5 -5
  50. package/src/components/resources/renderers/KnativeFlowRenderer.tsx +4 -4
  51. package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +8 -8
  52. package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +3 -3
  53. package/src/components/resources/renderers/KnativeRouteRenderer.tsx +1 -1
  54. package/src/components/resources/renderers/KnativeServiceRenderer.tsx +2 -2
  55. package/src/components/resources/renderers/KnativeSourceRenderer.tsx +6 -6
  56. package/src/components/resources/renderers/KustomizationRenderer.tsx +1 -1
  57. package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +4 -4
  58. package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +6 -6
  59. package/src/components/resources/renderers/NodeRenderer.tsx +5 -5
  60. package/src/components/resources/renderers/OrderRenderer.tsx +3 -3
  61. package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +1 -1
  62. package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +1 -1
  63. package/src/components/resources/renderers/PodMonitorRenderer.tsx +3 -3
  64. package/src/components/resources/renderers/PodRenderer.tsx +10 -10
  65. package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +2 -2
  66. package/src/components/resources/renderers/RoleBindingRenderer.tsx +3 -3
  67. package/src/components/resources/renderers/RoleRenderer.tsx +8 -8
  68. package/src/components/resources/renderers/RolloutRenderer.tsx +1 -1
  69. package/src/components/resources/renderers/RuntimeClassRenderer.tsx +2 -2
  70. package/src/components/resources/renderers/SealedSecretRenderer.tsx +2 -2
  71. package/src/components/resources/renderers/SecretRenderer.tsx +3 -3
  72. package/src/components/resources/renderers/ServiceAccountRenderer.tsx +1 -1
  73. package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +3 -3
  74. package/src/components/resources/renderers/ServiceRenderer.tsx +1 -1
  75. package/src/components/resources/renderers/SimpleRouteRenderer.tsx +5 -5
  76. package/src/components/resources/renderers/StorageClassRenderer.tsx +1 -1
  77. package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +1 -1
  78. package/src/components/resources/renderers/VPARenderer.tsx +2 -2
  79. package/src/components/resources/renderers/VeleroBSLRenderer.tsx +2 -2
  80. package/src/components/resources/renderers/VeleroBackupRenderer.tsx +6 -6
  81. package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +5 -5
  82. package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +6 -6
  83. package/src/components/resources/renderers/VeleroVSLRenderer.tsx +1 -1
  84. package/src/components/resources/renderers/WebhookConfigRenderer.tsx +10 -10
  85. package/src/components/resources/renderers/WorkflowRenderer.tsx +2 -2
  86. package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +2 -2
  87. package/src/components/resources/renderers/WorkloadRenderer.tsx +1 -1
  88. package/src/components/resources/renderers/argo-cells.tsx +3 -3
  89. package/src/components/resources/renderers/certmanager-cells.tsx +6 -6
  90. package/src/components/resources/renderers/cnpg-cells.tsx +5 -5
  91. package/src/components/resources/renderers/eso-cells.tsx +4 -4
  92. package/src/components/resources/renderers/flux-cells.tsx +6 -6
  93. package/src/components/resources/renderers/istio-cells.tsx +9 -9
  94. package/src/components/resources/renderers/karpenter-cells.tsx +3 -3
  95. package/src/components/resources/renderers/keda-cells.tsx +2 -2
  96. package/src/components/resources/renderers/knative-cells.tsx +2 -2
  97. package/src/components/resources/renderers/kyverno-cells.tsx +3 -3
  98. package/src/components/resources/renderers/prometheus-cells.tsx +3 -3
  99. package/src/components/resources/renderers/trivy-cells.tsx +4 -4
  100. package/src/components/resources/renderers/velero-cells.tsx +4 -4
  101. package/src/components/shared/EditableYamlView.tsx +1 -1
  102. package/src/components/shared/ResourceActionsBar.tsx +17 -17
  103. package/src/components/shared/ResourceRendererDispatch.tsx +8 -7
  104. package/src/components/topology/K8sResourceNode.tsx +5 -5
  105. package/src/components/topology/TopologyControls.tsx +2 -2
  106. package/src/components/topology/TopologyGraph.tsx +89 -23
  107. package/src/components/topology/topology.css +1 -1
  108. package/src/components/ui/Badge.tsx +178 -0
  109. package/src/components/ui/HealthRing.tsx +70 -35
  110. package/src/components/ui/MetricsChart.tsx +2 -2
  111. package/src/components/ui/drawer-components.tsx +12 -31
  112. package/src/components/workload/ResourceDetailDrawer.tsx +4 -4
  113. package/src/components/workload/WorkloadView.tsx +10 -10
  114. package/src/theme/components.css +195 -0
  115. package/src/theme/tailwind-theme.css +13 -13
  116. package/src/theme/variables.css +46 -29
  117. package/src/types/core.ts +2 -0
  118. package/src/utils/badge-colors.ts +54 -205
@@ -28,7 +28,7 @@ export function BrokerRenderer({ data, onNavigate }: RendererProps) {
28
28
  <Section title="Overview" icon={Radio} defaultExpanded>
29
29
  <PropertyList>
30
30
  <Property label="Status" value={
31
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
31
+ <span className={clsx('badge', status.color)}>
32
32
  {status.text}
33
33
  </span>
34
34
  } />
@@ -91,7 +91,7 @@ export function TriggerRenderer({ data, onNavigate }: RendererProps) {
91
91
  <Section title="Overview" icon={Filter} defaultExpanded>
92
92
  <PropertyList>
93
93
  <Property label="Status" value={
94
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
94
+ <span className={clsx('badge', status.color)}>
95
95
  {status.text}
96
96
  </span>
97
97
  } />
@@ -122,7 +122,7 @@ export function TriggerRenderer({ data, onNavigate }: RendererProps) {
122
122
  <Section title={`Filter (${filterEntries.length} attributes)`} defaultExpanded>
123
123
  <div className="flex flex-wrap gap-1">
124
124
  {filterEntries.map(([key, val]) => (
125
- <span key={key} className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary">
125
+ <span key={key} className="badge bg-theme-elevated text-theme-text-secondary">
126
126
  {key}={String(val)}
127
127
  </span>
128
128
  ))}
@@ -176,7 +176,7 @@ export function ChannelRenderer({ data }: RendererProps) {
176
176
  <Section title="Overview" icon={Inbox} defaultExpanded>
177
177
  <PropertyList>
178
178
  <Property label="Status" value={
179
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
179
+ <span className={clsx('badge', status.color)}>
180
180
  {status.text}
181
181
  </span>
182
182
  } />
@@ -241,7 +241,7 @@ export function SubscriptionRenderer({ data, onNavigate }: RendererProps) {
241
241
  <Section title="Overview" icon={ArrowRightLeft} defaultExpanded>
242
242
  <PropertyList>
243
243
  <Property label="Status" value={
244
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
244
+ <span className={clsx('badge', status.color)}>
245
245
  {status.text}
246
246
  </span>
247
247
  } />
@@ -48,7 +48,7 @@ export function SequenceRenderer({ data, onNavigate }: RendererProps) {
48
48
  <Section title="Overview" icon={ListOrdered} defaultExpanded>
49
49
  <PropertyList>
50
50
  <Property label="Status" value={
51
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
51
+ <span className={clsx('badge', status.color)}>
52
52
  {status.text}
53
53
  </span>
54
54
  } />
@@ -65,7 +65,7 @@ export function SequenceRenderer({ data, onNavigate }: RendererProps) {
65
65
  <Section title={`Steps (${steps.length})`} defaultExpanded>
66
66
  <div className="space-y-2">
67
67
  {steps.map((step: any, i: number) => (
68
- <div key={i} className="bg-theme-elevated/30 rounded p-2 flex items-center gap-2">
68
+ <div key={i} className="card-inner flex items-center gap-2">
69
69
  <span className="text-xs font-medium text-theme-text-tertiary w-6 shrink-0">#{i + 1}</span>
70
70
  <RefDisplay ref={step} ns={ns} onNavigate={onNavigate} />
71
71
  </div>
@@ -97,7 +97,7 @@ export function ParallelRenderer({ data, onNavigate }: RendererProps) {
97
97
  <Section title="Overview" icon={GitFork} defaultExpanded>
98
98
  <PropertyList>
99
99
  <Property label="Status" value={
100
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
100
+ <span className={clsx('badge', status.color)}>
101
101
  {status.text}
102
102
  </span>
103
103
  } />
@@ -114,7 +114,7 @@ export function ParallelRenderer({ data, onNavigate }: RendererProps) {
114
114
  <Section title={`Branches (${branches.length})`} defaultExpanded>
115
115
  <div className="space-y-3">
116
116
  {branches.map((branch: any, i: number) => (
117
- <div key={i} className="bg-theme-elevated/30 rounded p-3">
117
+ <div key={i} className="card-inner-lg">
118
118
  <div className="text-sm font-medium text-theme-text-primary mb-2">Branch {i + 1}</div>
119
119
  <PropertyList>
120
120
  {branch.filter && (
@@ -27,7 +27,7 @@ export function KnativeIngressRenderer({ data }: RendererProps) {
27
27
  <Section title="Overview" icon={Network} defaultExpanded>
28
28
  <PropertyList>
29
29
  <Property label="Status" value={
30
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
30
+ <span className={clsx('badge', status.color)}>
31
31
  {status.text}
32
32
  </span>
33
33
  } />
@@ -40,10 +40,10 @@ export function KnativeIngressRenderer({ data }: RendererProps) {
40
40
  <Section title={`Rules (${rules.length})`} defaultExpanded>
41
41
  <div className="space-y-3">
42
42
  {rules.map((rule: any, i: number) => (
43
- <div key={i} className="bg-theme-elevated/30 rounded p-3">
43
+ <div key={i} className="card-inner-lg">
44
44
  <div className="flex flex-wrap gap-1 mb-2">
45
45
  {(rule.hosts || []).map((host: string, hi: number) => (
46
- <span key={hi} className="px-1.5 py-0.5 bg-blue-500/10 text-blue-400 rounded text-xs">
46
+ <span key={hi} className="badge-sm bg-blue-500/10 text-blue-400">
47
47
  {host}
48
48
  </span>
49
49
  ))}
@@ -104,7 +104,7 @@ export function KnativeCertificateRenderer({ data }: RendererProps) {
104
104
  <Section title="Overview" icon={ShieldCheck} defaultExpanded>
105
105
  <PropertyList>
106
106
  <Property label="Status" value={
107
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
107
+ <span className={clsx('badge', status.color)}>
108
108
  {status.text}
109
109
  </span>
110
110
  } />
@@ -117,7 +117,7 @@ export function KnativeCertificateRenderer({ data }: RendererProps) {
117
117
  <Section title={`DNS Names (${dnsNames.length})`} defaultExpanded>
118
118
  <div className="flex flex-wrap gap-1">
119
119
  {dnsNames.map((name: string, i: number) => (
120
- <span key={i} className="px-1.5 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary">
120
+ <span key={i} className="badge-sm bg-theme-elevated text-theme-text-secondary">
121
121
  {name}
122
122
  </span>
123
123
  ))}
@@ -152,13 +152,13 @@ export function ServerlessServiceRenderer({ data, onNavigate }: RendererProps) {
152
152
  <Section title="Overview" icon={Server} defaultExpanded>
153
153
  <PropertyList>
154
154
  <Property label="Status" value={
155
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
155
+ <span className={clsx('badge', status.color)}>
156
156
  {status.text}
157
157
  </span>
158
158
  } />
159
159
  <Property label="Mode" value={mode ? (
160
160
  <span className={clsx(
161
- 'px-2 py-0.5 rounded text-xs font-medium',
161
+ 'badge',
162
162
  mode === 'Proxy' ? 'bg-yellow-500/20 text-yellow-400' : 'bg-green-500/20 text-green-400'
163
163
  )}>
164
164
  {mode}
@@ -204,7 +204,7 @@ export function DomainMappingRenderer({ data, onNavigate }: RendererProps) {
204
204
  <Section title="Overview" icon={Globe} defaultExpanded>
205
205
  <PropertyList>
206
206
  <Property label="Status" value={
207
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
207
+ <span className={clsx('badge', status.color)}>
208
208
  {status.text}
209
209
  </span>
210
210
  } />
@@ -32,7 +32,7 @@ export function KnativeRevisionRenderer({ data }: KnativeRevisionRendererProps)
32
32
  <Section title="Overview" icon={Settings} defaultExpanded>
33
33
  <PropertyList>
34
34
  <Property label="Status" value={
35
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
35
+ <span className={clsx('badge', status.color)}>
36
36
  {status.text}
37
37
  </span>
38
38
  } />
@@ -42,7 +42,7 @@ export function KnativeRevisionRenderer({ data }: KnativeRevisionRendererProps)
42
42
  } />}
43
43
  {routingState && <Property label="Routing" value={
44
44
  <span className={clsx(
45
- 'px-2 py-0.5 rounded text-xs font-medium',
45
+ 'badge',
46
46
  routingState === 'active' ? 'bg-green-500/20 text-green-400' : 'bg-theme-hover text-theme-text-secondary'
47
47
  )}>
48
48
  {routingState}
@@ -61,7 +61,7 @@ export function KnativeRevisionRenderer({ data }: KnativeRevisionRendererProps)
61
61
  <Section title={`Containers (${containers.length})`} icon={Container} defaultExpanded>
62
62
  <div className="space-y-2">
63
63
  {containers.map((c: any, i: number) => (
64
- <div key={i} className="bg-theme-elevated/30 rounded p-2 text-sm">
64
+ <div key={i} className="card-inner text-sm">
65
65
  <div className="font-medium text-theme-text-primary">{c.name || 'container'}</div>
66
66
  <div className="text-xs text-theme-text-secondary truncate" title={c.image}>{c.image}</div>
67
67
  {c.ports && c.ports.length > 0 && (
@@ -21,7 +21,7 @@ export function KnativeRouteRenderer({ data, onNavigate }: KnativeRouteRendererP
21
21
  <Section title="Overview" icon={Route} defaultExpanded>
22
22
  <PropertyList>
23
23
  <Property label="Status" value={
24
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
24
+ <span className={clsx('badge', status.color)}>
25
25
  {status.text}
26
26
  </span>
27
27
  } />
@@ -34,7 +34,7 @@ export function KnativeServiceRenderer({ data, onNavigate }: KnativeServiceRende
34
34
  <Section title="Overview" icon={Globe} defaultExpanded>
35
35
  <PropertyList>
36
36
  <Property label="Status" value={
37
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
37
+ <span className={clsx('badge', status.color)}>
38
38
  {status.text}
39
39
  </span>
40
40
  } />
@@ -118,7 +118,7 @@ export function KnativeServiceRenderer({ data, onNavigate }: KnativeServiceRende
118
118
  <Section title="Template" icon={Container} defaultExpanded>
119
119
  <div className="space-y-2">
120
120
  {containers.map((c: any, i: number) => (
121
- <div key={i} className="bg-theme-elevated/30 rounded p-2 text-sm">
121
+ <div key={i} className="card-inner text-sm">
122
122
  <div className="font-medium text-theme-text-primary">{c.name || 'container'}</div>
123
123
  <div className="text-xs text-theme-text-secondary truncate" title={c.image}>{c.image}</div>
124
124
  {c.ports && c.ports.length > 0 && (
@@ -50,7 +50,7 @@ export function PingSourceRenderer({ data, onNavigate }: RendererProps) {
50
50
  <Section title="Overview" icon={Clock} defaultExpanded>
51
51
  <PropertyList>
52
52
  <Property label="Status" value={
53
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
53
+ <span className={clsx('badge', status.color)}>
54
54
  {status.text}
55
55
  </span>
56
56
  } />
@@ -86,7 +86,7 @@ export function ApiServerSourceRenderer({ data, onNavigate }: RendererProps) {
86
86
  <Section title="Overview" icon={Server} defaultExpanded>
87
87
  <PropertyList>
88
88
  <Property label="Status" value={
89
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
89
+ <span className={clsx('badge', status.color)}>
90
90
  {status.text}
91
91
  </span>
92
92
  } />
@@ -100,7 +100,7 @@ export function ApiServerSourceRenderer({ data, onNavigate }: RendererProps) {
100
100
  <Section title={`Watched Resources (${resources.length})`} defaultExpanded>
101
101
  <div className="space-y-1.5">
102
102
  {resources.map((r: any, i: number) => (
103
- <div key={i} className="bg-theme-elevated/30 rounded p-2 text-sm">
103
+ <div key={i} className="card-inner text-sm">
104
104
  <span className="text-theme-text-primary">{r.apiVersion}/{r.kind}</span>
105
105
  {r.selector && (
106
106
  <div className="text-xs text-theme-text-tertiary mt-0.5">
@@ -136,7 +136,7 @@ export function ContainerSourceRenderer({ data, onNavigate }: RendererProps) {
136
136
  <Section title="Overview" icon={Container} defaultExpanded>
137
137
  <PropertyList>
138
138
  <Property label="Status" value={
139
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
139
+ <span className={clsx('badge', status.color)}>
140
140
  {status.text}
141
141
  </span>
142
142
  } />
@@ -148,7 +148,7 @@ export function ContainerSourceRenderer({ data, onNavigate }: RendererProps) {
148
148
  <Section title={`Containers (${containers.length})`} defaultExpanded>
149
149
  <div className="space-y-2">
150
150
  {containers.map((c: any, i: number) => (
151
- <div key={i} className="bg-theme-elevated/30 rounded p-2 text-sm">
151
+ <div key={i} className="card-inner text-sm">
152
152
  <div className="font-medium text-theme-text-primary">{c.name || 'container'}</div>
153
153
  <div className="text-xs text-theme-text-secondary truncate" title={c.image}>{c.image}</div>
154
154
  {c.args && c.args.length > 0 && (
@@ -184,7 +184,7 @@ export function SinkBindingRenderer({ data, onNavigate }: RendererProps) {
184
184
  <Section title="Overview" icon={Link2} defaultExpanded>
185
185
  <PropertyList>
186
186
  <Property label="Status" value={
187
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', status.color)}>
187
+ <span className={clsx('badge', status.color)}>
188
188
  {status.text}
189
189
  </span>
190
190
  } />
@@ -101,7 +101,7 @@ export function KustomizationRenderer({ data }: KustomizationRendererProps) {
101
101
  {spec.healthChecks.map((check: any, idx: number) => (
102
102
  <div
103
103
  key={idx}
104
- className="text-sm px-2 py-1 bg-theme-elevated/30 rounded"
104
+ className="text-sm card-inner"
105
105
  >
106
106
  <span className="text-theme-text-tertiary">{check.kind}/</span>
107
107
  <span className="text-theme-text-primary">{check.name}</span>
@@ -76,7 +76,7 @@ function ResultRow({ result }: { result: any }) {
76
76
  </div>
77
77
  {expanded && message && (
78
78
  <div className="px-2 pb-2 pl-7">
79
- <div className="text-xs text-theme-text-secondary break-all bg-theme-elevated/30 rounded p-2">
79
+ <div className="text-xs text-theme-text-secondary break-all card-inner">
80
80
  {message}
81
81
  </div>
82
82
  {result.category && (
@@ -253,7 +253,7 @@ export function KyvernoPolicyRenderer({ data }: KyvernoPolicyRendererProps) {
253
253
  <PropertyList>
254
254
  <Property label="Failure Action" value={
255
255
  <span className={clsx(
256
- 'px-2 py-0.5 rounded text-xs font-medium',
256
+ 'badge',
257
257
  isEnforce ? 'bg-red-500/20 text-red-400' : 'bg-yellow-500/20 text-yellow-400',
258
258
  )}>
259
259
  {action}
@@ -301,7 +301,7 @@ export function KyvernoPolicyRenderer({ data }: KyvernoPolicyRendererProps) {
301
301
  <Section title={`Rules (${ruleCount})`} icon={FileWarning} defaultExpanded>
302
302
  <div className="space-y-2">
303
303
  {rules.map((rule, i) => (
304
- <div key={i} className="bg-theme-elevated/30 rounded-lg p-3">
304
+ <div key={i} className="card-inner-lg">
305
305
  <div className="flex items-center gap-2 mb-1">
306
306
  <span className="text-sm font-medium text-theme-text-primary">{rule.name}</span>
307
307
  <span className={clsx('px-1.5 py-0.5 rounded text-[10px] font-medium', ruleTypeColorMap[rule.type] || 'bg-theme-hover text-theme-text-tertiary')}>
@@ -325,7 +325,7 @@ export function KyvernoPolicyRenderer({ data }: KyvernoPolicyRendererProps) {
325
325
  {autogenRules.map((name: string) => (
326
326
  <span
327
327
  key={name}
328
- className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary"
328
+ className="badge bg-theme-elevated text-theme-text-secondary"
329
329
  >
330
330
  {name}
331
331
  </span>
@@ -34,7 +34,7 @@ export function NetworkPolicyRenderer({ data }: NetworkPolicyRendererProps) {
34
34
  {Object.entries(matchLabels).map(([k, v]) => (
35
35
  <span
36
36
  key={k}
37
- className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary"
37
+ className="badge bg-theme-elevated text-theme-text-secondary"
38
38
  >
39
39
  {k}={String(v)}
40
40
  </span>
@@ -50,7 +50,7 @@ export function NetworkPolicyRenderer({ data }: NetworkPolicyRendererProps) {
50
50
  <span
51
51
  key={type}
52
52
  className={clsx(
53
- 'px-2 py-0.5 rounded text-xs border',
53
+ 'badge',
54
54
  type === 'Ingress'
55
55
  ? 'bg-blue-500/20 text-blue-400 border-blue-500/30'
56
56
  : 'bg-purple-500/20 text-purple-400 border-purple-500/30'
@@ -106,7 +106,7 @@ function IngressEgressRuleCard({
106
106
  const ports: any[] = rule.ports || []
107
107
 
108
108
  return (
109
- <div className="bg-theme-elevated/30 rounded p-3">
109
+ <div className="card-inner-lg">
110
110
  {peers.length > 0 && (
111
111
  <div className="mb-2">
112
112
  <div className="text-xs text-theme-text-tertiary mb-1 capitalize">{direction}</div>
@@ -125,7 +125,7 @@ function IngressEgressRuleCard({
125
125
  {ports.map((port: any, j: number) => (
126
126
  <span
127
127
  key={j}
128
- className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary"
128
+ className="badge bg-theme-elevated text-theme-text-secondary"
129
129
  >
130
130
  {port.protocol || 'TCP'}/{port.port}
131
131
  </span>
@@ -153,7 +153,7 @@ function PeerEntry({ peer }: { peer: any }) {
153
153
  {Object.entries(labels).map(([k, v]) => (
154
154
  <span
155
155
  key={k}
156
- className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary"
156
+ className="badge bg-theme-elevated text-theme-text-secondary"
157
157
  >
158
158
  {k}={String(v)}
159
159
  </span>
@@ -177,7 +177,7 @@ function PeerEntry({ peer }: { peer: any }) {
177
177
  {Object.entries(labels).map(([k, v]) => (
178
178
  <span
179
179
  key={k}
180
- className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary"
180
+ className="badge bg-theme-elevated text-theme-text-secondary"
181
181
  >
182
182
  {k}={String(v)}
183
183
  </span>
@@ -163,7 +163,7 @@ export function NodeRenderer({ data, relationships, onViewPods, metrics, metrics
163
163
  {metricsHistory?.dataPoints && metricsHistory.dataPoints.length > 0 ? (
164
164
  <div className="space-y-4">
165
165
  {/* CPU Usage with Chart */}
166
- <div className="bg-theme-elevated/30 rounded-lg p-3">
166
+ <div className="card-inner-lg">
167
167
  <div className="text-xs text-theme-text-tertiary mb-1 flex items-center justify-between">
168
168
  <span>CPU</span>
169
169
  <span className="text-theme-text-quaternary">
@@ -179,7 +179,7 @@ export function NodeRenderer({ data, relationships, onViewPods, metrics, metrics
179
179
  </div>
180
180
 
181
181
  {/* Memory Usage with Chart */}
182
- <div className="bg-theme-elevated/30 rounded-lg p-3">
182
+ <div className="card-inner-lg">
183
183
  <div className="text-xs text-theme-text-tertiary mb-1 flex items-center justify-between">
184
184
  <span>Memory</span>
185
185
  <span className="text-theme-text-quaternary">
@@ -197,7 +197,7 @@ export function NodeRenderer({ data, relationships, onViewPods, metrics, metrics
197
197
  ) : metrics?.usage ? (
198
198
  /* Fallback to simple display if no history yet */
199
199
  <div className="space-y-3">
200
- <div className="bg-theme-elevated/30 rounded-lg p-3">
200
+ <div className="card-inner-lg">
201
201
  <div className="flex items-center justify-between mb-2">
202
202
  <span className="text-sm font-medium text-theme-text-primary">CPU</span>
203
203
  </div>
@@ -208,7 +208,7 @@ export function NodeRenderer({ data, relationships, onViewPods, metrics, metrics
208
208
  </span>
209
209
  </div>
210
210
  </div>
211
- <div className="bg-theme-elevated/30 rounded-lg p-3">
211
+ <div className="card-inner-lg">
212
212
  <div className="flex items-center justify-between mb-2">
213
213
  <span className="text-sm font-medium text-theme-text-primary">Memory</span>
214
214
  </div>
@@ -262,7 +262,7 @@ export function NodeRenderer({ data, relationships, onViewPods, metrics, metrics
262
262
  {taints.map((taint: any, i: number) => (
263
263
  <div key={`${taint.key}-${taint.effect}-${i}`} className="text-sm">
264
264
  <span className={clsx(
265
- 'px-2 py-0.5 rounded text-xs',
265
+ 'badge',
266
266
  taint.effect === 'NoSchedule' ? 'bg-yellow-500/20 text-yellow-400' :
267
267
  taint.effect === 'NoExecute' ? 'bg-red-500/20 text-red-400' :
268
268
  'bg-blue-500/20 text-blue-400'
@@ -55,7 +55,7 @@ export function OrderRenderer({ data }: { data: any }) {
55
55
  <Property
56
56
  label="State"
57
57
  value={
58
- <span className={clsx('px-2 py-0.5 rounded text-xs font-medium', getOrderStateBadge(state).color)}>
58
+ <span className={clsx('badge', getOrderStateBadge(state).color)}>
59
59
  {getOrderStateBadge(state).text}
60
60
  </span>
61
61
  }
@@ -69,7 +69,7 @@ export function OrderRenderer({ data }: { data: any }) {
69
69
  <Section title="Domains" icon={Globe}>
70
70
  <div className="flex flex-wrap gap-1.5">
71
71
  {dnsNames.map((name: string) => (
72
- <span key={name} className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary font-medium">
72
+ <span key={name} className="badge bg-theme-elevated text-theme-text-secondary">
73
73
  {name}
74
74
  </span>
75
75
  ))}
@@ -93,7 +93,7 @@ export function OrderRenderer({ data }: { data: any }) {
93
93
  <Section title={`Authorizations (${authorizations.length})`} icon={ShoppingCart}>
94
94
  <div className="space-y-1">
95
95
  {authorizations.map((auth: any, i: number) => (
96
- <div key={i} className="text-xs text-theme-text-secondary bg-theme-elevated/30 rounded p-2">
96
+ <div key={i} className="text-xs text-theme-text-secondary card-inner">
97
97
  {auth.url || `Authorization ${i + 1}`}
98
98
  </div>
99
99
  ))}
@@ -120,7 +120,7 @@ export function PersistentVolumeRenderer({ data, onNavigate }: PersistentVolumeR
120
120
  <div key={termIdx} className="space-y-1">
121
121
  {term.matchExpressions?.map((expr: any, exprIdx: number) => (
122
122
  <div key={exprIdx} className="flex flex-wrap gap-1">
123
- <span className="px-2 py-0.5 bg-theme-elevated rounded text-xs text-theme-text-secondary">
123
+ <span className="badge bg-theme-elevated text-theme-text-secondary">
124
124
  {expr.key} {expr.operator} {expr.values?.join(', ')}
125
125
  </span>
126
126
  </div>
@@ -86,7 +86,7 @@ export function PodDisruptionBudgetRenderer({ data }: PodDisruptionBudgetRendere
86
86
  <Property label="Expected Pods" value={expectedPods} />
87
87
  </PropertyList>
88
88
  {currentHealthy !== undefined && expectedPods !== undefined && expectedPods > 0 && (
89
- <div className="mt-3 bg-theme-elevated/30 rounded p-2 text-sm">
89
+ <div className="mt-3 card-inner text-sm">
90
90
  <div className="flex items-center justify-between">
91
91
  <span className="text-theme-text-secondary">Health</span>
92
92
  <span className={clsx(
@@ -28,19 +28,19 @@ export function PodMonitorRenderer({ data }: PodMonitorRendererProps) {
28
28
  <Section title={`Pod Metrics Endpoints (${endpoints.length})`} defaultExpanded>
29
29
  <div className="space-y-2">
30
30
  {endpoints.map((ep, i) => (
31
- <div key={i} className="bg-theme-elevated/30 rounded p-2 text-sm">
31
+ <div key={i} className="card-inner text-sm">
32
32
  <div className="flex items-center gap-2 flex-wrap">
33
33
  {ep.port && (
34
34
  <span className="text-theme-text-primary font-medium">{ep.port}</span>
35
35
  )}
36
36
  <span className="text-theme-text-secondary">{ep.path}</span>
37
37
  {ep.interval && (
38
- <span className="px-1.5 py-0.5 bg-theme-hover rounded text-xs text-theme-text-secondary">
38
+ <span className="badge-sm bg-theme-hover text-theme-text-secondary">
39
39
  every {ep.interval}
40
40
  </span>
41
41
  )}
42
42
  {ep.scheme && ep.scheme !== 'http' && (
43
- <span className="px-1.5 py-0.5 bg-theme-hover rounded text-xs text-theme-text-secondary">
43
+ <span className="badge-sm bg-theme-hover text-theme-text-secondary">
44
44
  {ep.scheme}
45
45
  </span>
46
46
  )}
@@ -3,7 +3,7 @@ import { Server, HardDrive, Terminal as TerminalIcon, FileText, Activity, Circle
3
3
  import { clsx } from 'clsx'
4
4
  import { Section, PropertyList, Property, ConditionsSection, CopyHandler, AlertBanner, ResourceLink } from '../../ui/drawer-components'
5
5
  import { formatResources, formatDuration } from '../resource-utils'
6
- import { getResourceStatusColor } from '../../../utils/badge-colors'
6
+ import { getResourceStatusColor, SEVERITY_BADGE_BORDERED } from '../../../utils/badge-colors'
7
7
  import type { ResolvedEnvFrom } from '../../../types'
8
8
  import { Tooltip } from '../../ui/Tooltip'
9
9
  import { MetricsChart } from '../../ui/MetricsChart'
@@ -479,7 +479,7 @@ export function PodRenderer({
479
479
  </button>
480
480
  </Tooltip>
481
481
  )}
482
- <span className={clsx('px-2 py-0.5 text-xs rounded', statusColor)}>
482
+ <span className={clsx('badge', statusColor)}>
483
483
  {statusLabel}
484
484
  </span>
485
485
  </div>
@@ -554,7 +554,7 @@ export function PodRenderer({
554
554
  const currentTerminated = status?.state?.terminated
555
555
 
556
556
  return (
557
- <div key={container.name} className="bg-theme-elevated/30 rounded-lg p-3">
557
+ <div key={container.name} className="card-inner-lg">
558
558
  <div className="flex items-center justify-between mb-2">
559
559
  <span className="text-sm font-medium text-theme-text-primary">{container.name}</span>
560
560
  <div className="flex items-center gap-2">
@@ -589,16 +589,16 @@ export function PodRenderer({
589
589
  </Tooltip>
590
590
  )}
591
591
  <span className={clsx(
592
- 'px-2 py-0.5 text-xs rounded',
593
- isReady ? 'bg-green-500/20 text-green-400' : 'bg-red-500/20 text-red-400'
592
+ 'badge',
593
+ isReady ? SEVERITY_BADGE_BORDERED.success : SEVERITY_BADGE_BORDERED.error
594
594
  )}>
595
595
  {isReady ? 'Ready' : 'Not Ready'}
596
596
  </span>
597
597
  <span className={clsx(
598
- 'px-2 py-0.5 text-xs rounded',
599
- stateKey === 'running' ? 'bg-green-500/20 text-green-400' :
600
- stateKey === 'waiting' ? 'bg-yellow-500/20 text-yellow-400' :
601
- 'bg-red-500/20 text-red-400'
598
+ 'badge',
599
+ stateKey === 'running' ? SEVERITY_BADGE_BORDERED.success :
600
+ stateKey === 'waiting' ? SEVERITY_BADGE_BORDERED.warning :
601
+ SEVERITY_BADGE_BORDERED.error
602
602
  )}>
603
603
  {stateKey}
604
604
  </span>
@@ -731,7 +731,7 @@ export function PodRenderer({
731
731
  const dataPoints = 'dataPoints' in historyContainer ? historyContainer.dataPoints : []
732
732
 
733
733
  return (
734
- <div key={historyContainer.name} className="bg-theme-elevated/30 rounded-lg p-3">
734
+ <div key={historyContainer.name} className="card-inner-lg">
735
735
  <div className="flex items-center justify-between mb-3">
736
736
  <span className="text-sm font-medium text-theme-text-primary">{historyContainer.name}</span>
737
737
  </div>
@@ -32,12 +32,12 @@ export function PrometheusRuleRenderer({ data }: PrometheusRuleRendererProps) {
32
32
  <Section title={`Rule Groups (${groups.length})`} defaultExpanded>
33
33
  <div className="space-y-2">
34
34
  {groups.map((group, i) => (
35
- <div key={i} className="bg-theme-elevated/30 rounded p-2 text-sm">
35
+ <div key={i} className="card-inner text-sm">
36
36
  <div className="flex items-center justify-between">
37
37
  <span className="text-theme-text-primary font-medium">{group.name}</span>
38
38
  <div className="flex items-center gap-2">
39
39
  {group.interval && (
40
- <span className="px-1.5 py-0.5 bg-theme-hover rounded text-xs text-theme-text-secondary">
40
+ <span className="badge-sm bg-theme-hover text-theme-text-secondary">
41
41
  {group.interval}
42
42
  </span>
43
43
  )}
@@ -58,7 +58,7 @@ export function RoleBindingRenderer({ data, onNavigate }: RoleBindingRendererPro
58
58
  label="Kind"
59
59
  value={
60
60
  roleRef.kind ? (
61
- <span className={clsx('px-2 py-0.5 rounded text-xs', getRoleRefKindBadgeClass(roleRef.kind))}>
61
+ <span className={clsx('badge', getRoleRefKindBadgeClass(roleRef.kind))}>
62
62
  {roleRef.kind}
63
63
  </span>
64
64
  ) : undefined
@@ -74,9 +74,9 @@ export function RoleBindingRenderer({ data, onNavigate }: RoleBindingRendererPro
74
74
  <Section title={`Subjects (${subjects.length})`} icon={Users} defaultExpanded>
75
75
  <div className="space-y-2">
76
76
  {subjects.map((subject: any, i: number) => (
77
- <div key={`${subject.kind}-${subject.name}-${i}`} className="bg-theme-elevated/30 rounded p-2 text-sm">
77
+ <div key={`${subject.kind}-${subject.name}-${i}`} className="card-inner text-sm">
78
78
  <div className="flex items-center gap-2">
79
- <span className={clsx('px-2 py-0.5 rounded text-xs', getSubjectKindBadgeClass(subject.kind))}>
79
+ <span className={clsx('badge', getSubjectKindBadgeClass(subject.kind))}>
80
80
  {subject.kind}
81
81
  </span>
82
82
  {subject.kind === 'ServiceAccount' ? (