@skyhook-io/k8s-ui 1.2.4 → 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.
- package/package.json +3 -2
- package/src/components/dock/BottomDock.tsx +1 -1
- package/src/components/dock/LocalTerminalTab.tsx +1 -1
- package/src/components/dock/NodeTerminalTab.tsx +1 -1
- package/src/components/dock/TerminalTab.tsx +2 -2
- package/src/components/gitops/GitOpsActions.tsx +12 -11
- package/src/components/gitops/GitOpsStatusBadge.tsx +6 -6
- package/src/components/logs/LogCore.tsx +8 -8
- package/src/components/logs/WorkloadLogsViewer.tsx +29 -5
- package/src/components/logs/useLogStream.ts +20 -0
- package/src/components/resources/ResourcesSidebar.tsx +10 -10
- package/src/components/resources/ResourcesView.tsx +49 -48
- package/src/components/resources/renderers/AlertRenderer.tsx +2 -2
- package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +2 -2
- package/src/components/resources/renderers/CNPGClusterRenderer.tsx +1 -1
- package/src/components/resources/renderers/CertificateRenderer.tsx +3 -3
- package/src/components/resources/renderers/CertificateRequestRenderer.tsx +3 -3
- package/src/components/resources/renderers/ChallengeRenderer.tsx +2 -2
- package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +3 -3
- package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +3 -3
- package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +2 -2
- package/src/components/resources/renderers/ContourHTTPProxyRenderer.tsx +1 -1
- package/src/components/resources/renderers/EventRenderer.tsx +1 -1
- package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +2 -2
- package/src/components/resources/renderers/ExternalSecretRenderer.tsx +2 -2
- package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +1 -1
- package/src/components/resources/renderers/GRPCRouteRenderer.tsx +5 -5
- package/src/components/resources/renderers/GatewayClassRenderer.tsx +1 -1
- package/src/components/resources/renderers/GatewayRenderer.tsx +3 -3
- package/src/components/resources/renderers/GenericRenderer.tsx +1 -1
- package/src/components/resources/renderers/HPARenderer.tsx +1 -1
- package/src/components/resources/renderers/HTTPRouteRenderer.tsx +5 -5
- package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +1 -1
- package/src/components/resources/renderers/IngressClassRenderer.tsx +1 -1
- package/src/components/resources/renderers/IngressRenderer.tsx +1 -1
- package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +10 -10
- package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +1 -1
- package/src/components/resources/renderers/IstioGatewayRenderer.tsx +2 -2
- package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +2 -2
- package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +6 -6
- package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +5 -5
- package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +5 -5
- package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +2 -2
- package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +4 -4
- package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +3 -3
- package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +3 -3
- package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +5 -5
- package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +2 -2
- package/src/components/resources/renderers/KnativeEventingRenderer.tsx +5 -5
- package/src/components/resources/renderers/KnativeFlowRenderer.tsx +4 -4
- package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +8 -8
- package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +3 -3
- package/src/components/resources/renderers/KnativeRouteRenderer.tsx +1 -1
- package/src/components/resources/renderers/KnativeServiceRenderer.tsx +2 -2
- package/src/components/resources/renderers/KnativeSourceRenderer.tsx +6 -6
- package/src/components/resources/renderers/KustomizationRenderer.tsx +1 -1
- package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +4 -4
- package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +6 -6
- package/src/components/resources/renderers/NodeRenderer.tsx +5 -5
- package/src/components/resources/renderers/OrderRenderer.tsx +3 -3
- package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +1 -1
- package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +1 -1
- package/src/components/resources/renderers/PodMonitorRenderer.tsx +3 -3
- package/src/components/resources/renderers/PodRenderer.tsx +10 -10
- package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +2 -2
- package/src/components/resources/renderers/RoleBindingRenderer.tsx +3 -3
- package/src/components/resources/renderers/RoleRenderer.tsx +8 -8
- package/src/components/resources/renderers/RolloutRenderer.tsx +1 -1
- package/src/components/resources/renderers/RuntimeClassRenderer.tsx +2 -2
- package/src/components/resources/renderers/SealedSecretRenderer.tsx +2 -2
- package/src/components/resources/renderers/SecretRenderer.tsx +3 -3
- package/src/components/resources/renderers/ServiceAccountRenderer.tsx +1 -1
- package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +3 -3
- package/src/components/resources/renderers/ServiceRenderer.tsx +1 -1
- package/src/components/resources/renderers/SimpleRouteRenderer.tsx +5 -5
- package/src/components/resources/renderers/StorageClassRenderer.tsx +1 -1
- package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +1 -1
- package/src/components/resources/renderers/VPARenderer.tsx +2 -2
- package/src/components/resources/renderers/VeleroBSLRenderer.tsx +2 -2
- package/src/components/resources/renderers/VeleroBackupRenderer.tsx +6 -6
- package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +5 -5
- package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +6 -6
- package/src/components/resources/renderers/VeleroVSLRenderer.tsx +1 -1
- package/src/components/resources/renderers/WebhookConfigRenderer.tsx +10 -10
- package/src/components/resources/renderers/WorkflowRenderer.tsx +2 -2
- package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +2 -2
- package/src/components/resources/renderers/WorkloadRenderer.tsx +1 -1
- package/src/components/resources/renderers/argo-cells.tsx +3 -3
- package/src/components/resources/renderers/certmanager-cells.tsx +6 -6
- package/src/components/resources/renderers/cnpg-cells.tsx +5 -5
- package/src/components/resources/renderers/eso-cells.tsx +4 -4
- package/src/components/resources/renderers/flux-cells.tsx +6 -6
- package/src/components/resources/renderers/istio-cells.tsx +9 -9
- package/src/components/resources/renderers/karpenter-cells.tsx +3 -3
- package/src/components/resources/renderers/keda-cells.tsx +2 -2
- package/src/components/resources/renderers/knative-cells.tsx +2 -2
- package/src/components/resources/renderers/kyverno-cells.tsx +3 -3
- package/src/components/resources/renderers/prometheus-cells.tsx +3 -3
- package/src/components/resources/renderers/trivy-cells.tsx +4 -4
- package/src/components/resources/renderers/velero-cells.tsx +4 -4
- package/src/components/shared/EditableYamlView.tsx +1 -1
- package/src/components/shared/ResourceActionsBar.tsx +17 -17
- package/src/components/shared/ResourceRendererDispatch.tsx +8 -7
- package/src/components/topology/K8sResourceNode.tsx +5 -5
- package/src/components/topology/TopologyControls.tsx +2 -2
- package/src/components/topology/TopologyGraph.tsx +89 -23
- package/src/components/topology/topology.css +1 -1
- package/src/components/ui/Badge.tsx +178 -0
- package/src/components/ui/HealthRing.tsx +70 -35
- package/src/components/ui/MetricsChart.tsx +2 -2
- package/src/components/ui/drawer-components.tsx +12 -31
- package/src/components/workload/ResourceDetailDrawer.tsx +4 -4
- package/src/components/workload/WorkloadView.tsx +10 -10
- package/src/theme/components.css +195 -0
- package/src/theme/tailwind-theme.css +13 -13
- package/src/theme/variables.css +46 -29
- package/src/types/core.ts +2 -0
- package/src/utils/badge-colors.ts +54 -205
- package/src/utils/log-format.ts +0 -8
|
@@ -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('
|
|
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('
|
|
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="
|
|
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('
|
|
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('
|
|
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('
|
|
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="
|
|
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('
|
|
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="
|
|
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('
|
|
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="
|
|
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="
|
|
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('
|
|
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="
|
|
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('
|
|
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
|
-
'
|
|
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('
|
|
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('
|
|
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
|
-
'
|
|
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="
|
|
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('
|
|
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('
|
|
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="
|
|
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('
|
|
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('
|
|
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="
|
|
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('
|
|
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="
|
|
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('
|
|
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
|
|
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
|
|
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
|
-
'
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
-
'
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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="
|
|
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
|
-
'
|
|
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('
|
|
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="
|
|
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
|
|
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="
|
|
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
|
|
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="
|
|
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="
|
|
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="
|
|
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('
|
|
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="
|
|
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
|
-
'
|
|
593
|
-
isReady ?
|
|
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
|
-
'
|
|
599
|
-
stateKey === 'running' ?
|
|
600
|
-
stateKey === 'waiting' ?
|
|
601
|
-
|
|
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="
|
|
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="
|
|
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="
|
|
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('
|
|
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="
|
|
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('
|
|
79
|
+
<span className={clsx('badge', getSubjectKindBadgeClass(subject.kind))}>
|
|
80
80
|
{subject.kind}
|
|
81
81
|
</span>
|
|
82
82
|
{subject.kind === 'ServiceAccount' ? (
|