@skyhook-io/k8s-ui 1.0.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 (193) hide show
  1. package/package.json +63 -0
  2. package/src/components/dock/BottomDock.tsx +204 -0
  3. package/src/components/dock/DockContext.tsx +212 -0
  4. package/src/components/dock/TerminalTab.tsx +333 -0
  5. package/src/components/dock/index.ts +3 -0
  6. package/src/components/gitops/GitOpsActions.tsx +227 -0
  7. package/src/components/gitops/GitOpsStatusBadge.tsx +221 -0
  8. package/src/components/gitops/ManagedResourcesList.tsx +210 -0
  9. package/src/components/gitops/SyncCountdown.tsx +146 -0
  10. package/src/components/gitops/index.ts +4 -0
  11. package/src/components/logs/JsonLogLine.tsx +90 -0
  12. package/src/components/logs/LogCore.tsx +553 -0
  13. package/src/components/logs/LogToolbarSelects.tsx +74 -0
  14. package/src/components/logs/LogsViewer.tsx +146 -0
  15. package/src/components/logs/WorkloadLogsViewer.tsx +263 -0
  16. package/src/components/logs/index.ts +13 -0
  17. package/src/components/logs/useLogBuffer.ts +138 -0
  18. package/src/components/logs/useLogSearch.ts +151 -0
  19. package/src/components/logs/useLogStream.ts +61 -0
  20. package/src/components/resources/ResourcesView.tsx +5494 -0
  21. package/src/components/resources/index.ts +17 -0
  22. package/src/components/resources/renderers/AlertRenderer.tsx +166 -0
  23. package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +233 -0
  24. package/src/components/resources/renderers/CNPGBackupRenderer.tsx +89 -0
  25. package/src/components/resources/renderers/CNPGClusterRenderer.tsx +194 -0
  26. package/src/components/resources/renderers/CNPGPoolerRenderer.tsx +79 -0
  27. package/src/components/resources/renderers/CNPGScheduledBackupRenderer.tsx +68 -0
  28. package/src/components/resources/renderers/CertificateRenderer.tsx +209 -0
  29. package/src/components/resources/renderers/CertificateRequestRenderer.tsx +123 -0
  30. package/src/components/resources/renderers/ChallengeRenderer.tsx +111 -0
  31. package/src/components/resources/renderers/ClusterComplianceReportRenderer.tsx +164 -0
  32. package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +140 -0
  33. package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +153 -0
  34. package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +221 -0
  35. package/src/components/resources/renderers/ConfigMapRenderer.tsx +124 -0
  36. package/src/components/resources/renderers/CronJobRenderer.tsx +86 -0
  37. package/src/components/resources/renderers/EventRenderer.tsx +175 -0
  38. package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +119 -0
  39. package/src/components/resources/renderers/ExternalSecretRenderer.tsx +172 -0
  40. package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +242 -0
  41. package/src/components/resources/renderers/GRPCRouteRenderer.tsx +263 -0
  42. package/src/components/resources/renderers/GatewayClassRenderer.tsx +68 -0
  43. package/src/components/resources/renderers/GatewayRenderer.tsx +218 -0
  44. package/src/components/resources/renderers/GenericRenderer.tsx +476 -0
  45. package/src/components/resources/renderers/GitRepositoryRenderer.tsx +154 -0
  46. package/src/components/resources/renderers/HPARenderer.tsx +164 -0
  47. package/src/components/resources/renderers/HTTPRouteRenderer.tsx +303 -0
  48. package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +167 -0
  49. package/src/components/resources/renderers/IngressClassRenderer.tsx +49 -0
  50. package/src/components/resources/renderers/IngressRenderer.tsx +104 -0
  51. package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +175 -0
  52. package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +176 -0
  53. package/src/components/resources/renderers/IstioGatewayRenderer.tsx +125 -0
  54. package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +84 -0
  55. package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +112 -0
  56. package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +288 -0
  57. package/src/components/resources/renderers/JobRenderer.tsx +103 -0
  58. package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +157 -0
  59. package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +188 -0
  60. package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +148 -0
  61. package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +90 -0
  62. package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +136 -0
  63. package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +151 -0
  64. package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +70 -0
  65. package/src/components/resources/renderers/KnativeEventingRenderer.tsx +309 -0
  66. package/src/components/resources/renderers/KnativeFlowRenderer.tsx +142 -0
  67. package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +232 -0
  68. package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +97 -0
  69. package/src/components/resources/renderers/KnativeRouteRenderer.tsx +74 -0
  70. package/src/components/resources/renderers/KnativeServiceRenderer.tsx +138 -0
  71. package/src/components/resources/renderers/KnativeSourceRenderer.tsx +220 -0
  72. package/src/components/resources/renderers/KustomizationRenderer.tsx +151 -0
  73. package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +352 -0
  74. package/src/components/resources/renderers/LeaseRenderer.tsx +93 -0
  75. package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +208 -0
  76. package/src/components/resources/renderers/NodeRenderer.tsx +282 -0
  77. package/src/components/resources/renderers/OCIRepositoryRenderer.tsx +153 -0
  78. package/src/components/resources/renderers/OrderRenderer.tsx +108 -0
  79. package/src/components/resources/renderers/PVCRenderer.tsx +98 -0
  80. package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +138 -0
  81. package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +126 -0
  82. package/src/components/resources/renderers/PodMonitorRenderer.tsx +63 -0
  83. package/src/components/resources/renderers/PodRenderer.tsx +677 -0
  84. package/src/components/resources/renderers/PriorityClassRenderer.tsx +50 -0
  85. package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +62 -0
  86. package/src/components/resources/renderers/ReplicaSetRenderer.tsx +71 -0
  87. package/src/components/resources/renderers/RoleBindingRenderer.tsx +97 -0
  88. package/src/components/resources/renderers/RoleRenderer.tsx +192 -0
  89. package/src/components/resources/renderers/RolloutRenderer.tsx +227 -0
  90. package/src/components/resources/renderers/RuntimeClassRenderer.tsx +75 -0
  91. package/src/components/resources/renderers/SbomReportRenderer.tsx +98 -0
  92. package/src/components/resources/renderers/SealedSecretRenderer.tsx +121 -0
  93. package/src/components/resources/renderers/SecretRenderer.tsx +321 -0
  94. package/src/components/resources/renderers/SecretStoreRenderer.tsx +111 -0
  95. package/src/components/resources/renderers/ServiceAccountRenderer.tsx +81 -0
  96. package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +65 -0
  97. package/src/components/resources/renderers/ServiceRenderer.tsx +98 -0
  98. package/src/components/resources/renderers/SimpleRouteRenderer.tsx +195 -0
  99. package/src/components/resources/renderers/StorageClassRenderer.tsx +82 -0
  100. package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +257 -0
  101. package/src/components/resources/renderers/VPARenderer.tsx +193 -0
  102. package/src/components/resources/renderers/VeleroBSLRenderer.tsx +73 -0
  103. package/src/components/resources/renderers/VeleroBackupRenderer.tsx +193 -0
  104. package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +161 -0
  105. package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +134 -0
  106. package/src/components/resources/renderers/VeleroVSLRenderer.tsx +36 -0
  107. package/src/components/resources/renderers/VulnerabilityReportRenderer.tsx +347 -0
  108. package/src/components/resources/renderers/WebhookConfigRenderer.tsx +156 -0
  109. package/src/components/resources/renderers/WorkflowRenderer.tsx +202 -0
  110. package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +91 -0
  111. package/src/components/resources/renderers/WorkloadRenderer.tsx +311 -0
  112. package/src/components/resources/renderers/argo-cells.tsx +118 -0
  113. package/src/components/resources/renderers/certmanager-cells.tsx +164 -0
  114. package/src/components/resources/renderers/cnpg-cells.tsx +161 -0
  115. package/src/components/resources/renderers/eso-cells.tsx +115 -0
  116. package/src/components/resources/renderers/flux-cells.tsx +253 -0
  117. package/src/components/resources/renderers/index.ts +105 -0
  118. package/src/components/resources/renderers/istio-cells.tsx +210 -0
  119. package/src/components/resources/renderers/karpenter-cells.tsx +107 -0
  120. package/src/components/resources/renderers/keda-cells.tsx +94 -0
  121. package/src/components/resources/renderers/knative-cells.tsx +396 -0
  122. package/src/components/resources/renderers/kyverno-cells.tsx +85 -0
  123. package/src/components/resources/renderers/prometheus-cells.tsx +74 -0
  124. package/src/components/resources/renderers/traefik-cells.tsx +120 -0
  125. package/src/components/resources/renderers/trivy-cells.tsx +153 -0
  126. package/src/components/resources/renderers/trivy-shared.tsx +67 -0
  127. package/src/components/resources/renderers/velero-cells.tsx +164 -0
  128. package/src/components/resources/resource-utils-argo.ts +155 -0
  129. package/src/components/resources/resource-utils-certmanager.ts +198 -0
  130. package/src/components/resources/resource-utils-cnpg.ts +344 -0
  131. package/src/components/resources/resource-utils-eso.ts +385 -0
  132. package/src/components/resources/resource-utils-flux.ts +186 -0
  133. package/src/components/resources/resource-utils-istio.ts +372 -0
  134. package/src/components/resources/resource-utils-karpenter.ts +150 -0
  135. package/src/components/resources/resource-utils-keda.ts +203 -0
  136. package/src/components/resources/resource-utils-knative.ts +218 -0
  137. package/src/components/resources/resource-utils-kyverno.ts +224 -0
  138. package/src/components/resources/resource-utils-prometheus.ts +159 -0
  139. package/src/components/resources/resource-utils-traefik.ts +180 -0
  140. package/src/components/resources/resource-utils-trivy.ts +146 -0
  141. package/src/components/resources/resource-utils-velero.ts +293 -0
  142. package/src/components/resources/resource-utils.ts +1558 -0
  143. package/src/components/shared/EditableYamlView.tsx +302 -0
  144. package/src/components/shared/ResourceActionsBar.tsx +924 -0
  145. package/src/components/shared/ResourceRendererDispatch.tsx +557 -0
  146. package/src/components/shared/index.ts +3 -0
  147. package/src/components/timeline/index.ts +1 -0
  148. package/src/components/timeline/shared.tsx +614 -0
  149. package/src/components/topology/GroupNode.tsx +198 -0
  150. package/src/components/topology/K8sResourceNode.tsx +440 -0
  151. package/src/components/topology/TopologyControls.tsx +62 -0
  152. package/src/components/topology/TopologyFilterSidebar.tsx +377 -0
  153. package/src/components/topology/TopologyGraph.tsx +748 -0
  154. package/src/components/topology/TopologySearch.tsx +304 -0
  155. package/src/components/topology/index.ts +7 -0
  156. package/src/components/topology/layout.ts +734 -0
  157. package/src/components/topology/layout.worker.ts +272 -0
  158. package/src/components/topology/topology.css +129 -0
  159. package/src/components/ui/CodeViewer.tsx +451 -0
  160. package/src/components/ui/ConfirmDialog.tsx +188 -0
  161. package/src/components/ui/ForceDeleteConfirmDialog.tsx +57 -0
  162. package/src/components/ui/HealthRing.tsx +72 -0
  163. package/src/components/ui/MetricsChart.tsx +259 -0
  164. package/src/components/ui/ResourceBar.tsx +68 -0
  165. package/src/components/ui/Toast.tsx +225 -0
  166. package/src/components/ui/Tooltip.tsx +165 -0
  167. package/src/components/ui/YamlEditor.tsx +280 -0
  168. package/src/components/ui/drawer-components.tsx +792 -0
  169. package/src/components/ui/index.ts +10 -0
  170. package/src/components/workload/ResourceDetailDrawer.tsx +158 -0
  171. package/src/components/workload/WorkloadView.tsx +1109 -0
  172. package/src/components/workload/index.ts +2 -0
  173. package/src/hooks/index.ts +9 -0
  174. package/src/hooks/useAnimatedUnmount.ts +30 -0
  175. package/src/hooks/useKeyboardShortcuts.tsx +336 -0
  176. package/src/hooks/useRefreshAnimation.ts +58 -0
  177. package/src/index.ts +35 -0
  178. package/src/types/core.ts +894 -0
  179. package/src/types/gitops.ts +458 -0
  180. package/src/types/index.ts +2 -0
  181. package/src/utils/animation.ts +40 -0
  182. package/src/utils/api-resources.ts +185 -0
  183. package/src/utils/badge-colors.ts +399 -0
  184. package/src/utils/context-name.ts +72 -0
  185. package/src/utils/download.ts +19 -0
  186. package/src/utils/format.ts +233 -0
  187. package/src/utils/index.ts +10 -0
  188. package/src/utils/log-format.ts +300 -0
  189. package/src/utils/navigation.ts +119 -0
  190. package/src/utils/resource-hierarchy.ts +630 -0
  191. package/src/utils/resource-icons.ts +206 -0
  192. package/src/vite-env.d.ts +1 -0
  193. package/tsconfig.json +24 -0
@@ -0,0 +1,557 @@
1
+ import { clsx } from 'clsx'
2
+ import {
3
+ getPodStatus,
4
+ getWorkloadStatus,
5
+ getJobStatus,
6
+ getCronJobStatus,
7
+ getHPAStatus,
8
+ getServiceStatus,
9
+ getNodeStatus,
10
+ getPVCStatus,
11
+ getRolloutStatus,
12
+ getWorkflowStatus,
13
+ getCertificateStatus,
14
+ getPVStatus,
15
+ getClusterIssuerStatus,
16
+ getIssuerStatus,
17
+ getOrderState,
18
+ getChallengeState,
19
+ getCertificateRequestStatus,
20
+ getGatewayStatus,
21
+ getGatewayClassStatus,
22
+ getRouteStatus,
23
+ getSealedSecretStatus,
24
+ getPDBStatus,
25
+ getGitRepositoryStatus,
26
+ getOCIRepositoryStatus,
27
+ getHelmRepositoryStatus,
28
+ getKustomizationStatus,
29
+ getFluxHelmReleaseStatus,
30
+ getFluxAlertStatus,
31
+ getArgoApplicationStatus,
32
+ getVulnerabilityReportStatus,
33
+ getConfigAuditReportStatus,
34
+ getExposedSecretReportStatus,
35
+ getRbacAssessmentReportStatus,
36
+ getClusterComplianceReportStatus,
37
+ getSbomReportStatus,
38
+ } from '../resources/resource-utils'
39
+ import {
40
+ LabelsSection,
41
+ AnnotationsSection,
42
+ MetadataSection,
43
+ EventsSection,
44
+ RelatedResourcesSection,
45
+ ExternalLinksSection,
46
+ AppInfoSection,
47
+ } from '../ui/drawer-components'
48
+ import { getNodePoolStatus, getNodeClaimStatus, getEC2NodeClassStatus } from '../resources/resource-utils-karpenter'
49
+ import { getScaledObjectStatus, getScaledJobStatus } from '../resources/resource-utils-keda'
50
+ import { getServiceMonitorStatus, getPrometheusRuleStatus, getPodMonitorStatus } from '../resources/resource-utils-prometheus'
51
+ import { getPolicyReportStatus, getKyvernoPolicyStatus } from '../resources/resource-utils-kyverno'
52
+ import { getBackupStatus, getRestoreStatus, getScheduleStatus, getBSLStatus } from '../resources/resource-utils-velero'
53
+ import {
54
+ getVirtualServiceStatus,
55
+ getDestinationRuleStatus,
56
+ getIstioGatewayStatus,
57
+ getServiceEntryStatus,
58
+ getPeerAuthenticationStatus,
59
+ getAuthorizationPolicyStatus,
60
+ } from '../resources/resource-utils-istio'
61
+ import { getCNPGClusterStatus, getCNPGBackupStatus, getCNPGScheduledBackupStatus, getCNPGPoolerStatus } from '../resources/resource-utils-cnpg'
62
+ import { getExternalSecretStatus, getClusterExternalSecretStatus, getSecretStoreStatus, getClusterSecretStoreStatus } from '../resources/resource-utils-eso'
63
+ import {
64
+ getKnativeConditionStatus,
65
+ getRevisionStatus,
66
+ } from '../resources/resource-utils-knative'
67
+ import {
68
+ PodRenderer,
69
+ WorkloadRenderer,
70
+ ReplicaSetRenderer,
71
+ ServiceRenderer,
72
+ IngressRenderer,
73
+ ConfigMapRenderer,
74
+ SecretRenderer,
75
+ JobRenderer,
76
+ CronJobRenderer,
77
+ HPARenderer,
78
+ NodeRenderer,
79
+ PVCRenderer,
80
+ RolloutRenderer,
81
+ CertificateRenderer,
82
+ WorkflowRenderer,
83
+ PersistentVolumeRenderer,
84
+ StorageClassRenderer,
85
+ CertificateRequestRenderer,
86
+ ClusterIssuerRenderer,
87
+ IssuerRenderer,
88
+ OrderRenderer,
89
+ ChallengeRenderer,
90
+ GatewayRenderer,
91
+ GatewayClassRenderer,
92
+ HTTPRouteRenderer,
93
+ GRPCRouteRenderer,
94
+ SimpleRouteRenderer,
95
+ SealedSecretRenderer,
96
+ WorkflowTemplateRenderer,
97
+ NetworkPolicyRenderer,
98
+ PodDisruptionBudgetRenderer,
99
+ ServiceAccountRenderer,
100
+ RoleRenderer,
101
+ RoleBindingRenderer,
102
+ WebhookConfigRenderer,
103
+ EventRenderer,
104
+ GenericRenderer,
105
+ GitRepositoryRenderer,
106
+ OCIRepositoryRenderer,
107
+ HelmRepositoryRenderer,
108
+ KustomizationRenderer,
109
+ FluxHelmReleaseRenderer,
110
+ AlertRenderer,
111
+ ArgoApplicationRenderer,
112
+ VulnerabilityReportRenderer,
113
+ ConfigAuditReportRenderer,
114
+ ExposedSecretReportRenderer,
115
+ ClusterComplianceReportRenderer,
116
+ SbomReportRenderer,
117
+ KarpenterNodePoolRenderer,
118
+ KarpenterNodeClaimRenderer,
119
+ KarpenterEC2NodeClassRenderer,
120
+ KedaScaledObjectRenderer,
121
+ KedaScaledJobRenderer,
122
+ KedaTriggerAuthRenderer,
123
+ VPARenderer,
124
+ ServiceMonitorRenderer,
125
+ PrometheusRuleRenderer,
126
+ PodMonitorRenderer,
127
+ PolicyReportRenderer,
128
+ KyvernoPolicyRenderer,
129
+ VeleroBackupRenderer,
130
+ VeleroRestoreRenderer,
131
+ VeleroScheduleRenderer,
132
+ VeleroBSLRenderer,
133
+ VeleroVSLRenderer,
134
+ CNPGClusterRenderer,
135
+ CNPGBackupRenderer,
136
+ CNPGScheduledBackupRenderer,
137
+ CNPGPoolerRenderer,
138
+ ExternalSecretRenderer,
139
+ ClusterExternalSecretRenderer,
140
+ SecretStoreRenderer,
141
+ IstioVirtualServiceRenderer,
142
+ IstioDestinationRuleRenderer,
143
+ IstioGatewayRenderer,
144
+ IstioServiceEntryRenderer,
145
+ IstioPeerAuthenticationRenderer,
146
+ IstioAuthorizationPolicyRenderer,
147
+ KnativeServiceRenderer,
148
+ KnativeRevisionRenderer,
149
+ KnativeRouteRenderer,
150
+ KnativeConfigurationRenderer,
151
+ KnativeIngressRenderer,
152
+ KnativeCertificateRenderer,
153
+ ServerlessServiceRenderer,
154
+ BrokerRenderer,
155
+ TriggerRenderer,
156
+ EventTypeRenderer,
157
+ ChannelRenderer,
158
+ InMemoryChannelRenderer,
159
+ SubscriptionRenderer,
160
+ PingSourceRenderer,
161
+ ApiServerSourceRenderer,
162
+ ContainerSourceRenderer,
163
+ SinkBindingRenderer,
164
+ SequenceRenderer,
165
+ ParallelRenderer,
166
+ DomainMappingRenderer,
167
+ IngressClassRenderer,
168
+ PriorityClassRenderer,
169
+ RuntimeClassRenderer,
170
+ LeaseRenderer,
171
+ TraefikIngressRouteRenderer,
172
+ } from '../resources/renderers'
173
+ import type { SelectedResource, Relationships, ResourceRef, SecretCertificateInfo } from '../../types'
174
+
175
+ // Known resource types with specific renderers (module-level to avoid re-allocation)
176
+ const KNOWN_KINDS = new Set([
177
+ 'pods', 'deployments', 'statefulsets', 'daemonsets', 'replicasets',
178
+ 'services', 'ingresses', 'configmaps', 'secrets', 'jobs', 'cronjobs',
179
+ 'hpas', 'horizontalpodautoscalers', 'nodes', 'persistentvolumeclaims',
180
+ 'rollouts', 'certificates', 'workflows', 'persistentvolumes',
181
+ 'storageclasses', 'certificaterequests', 'clusterissuers', 'issuers',
182
+ 'orders', 'challenges',
183
+ 'gateways', 'gatewayclasses', 'httproutes', 'grpcroutes', 'tcproutes', 'tlsroutes', 'sealedsecrets', 'workflowtemplates',
184
+ 'networkpolicies', 'poddisruptionbudgets', 'serviceaccounts',
185
+ 'roles', 'clusterroles', 'rolebindings', 'clusterrolebindings',
186
+ 'events', 'gitrepositories', 'ocirepositories', 'helmrepositories',
187
+ 'kustomizations', 'helmreleases', 'alerts', 'applications',
188
+ 'nodepools', 'nodeclaims', 'ec2nodeclasses', 'scaledobjects', 'scaledjobs',
189
+ 'triggerauthentications', 'clustertriggerauthentications',
190
+ 'servicemonitors', 'prometheusrules', 'podmonitors',
191
+ 'policyreports', 'clusterpolicyreports', 'kyvernopolicies', 'clusterpolicies',
192
+ 'vulnerabilityreports', 'configauditreports', 'exposedsecretreports',
193
+ 'rbacassessmentreports', 'clusterrbacassessmentreports',
194
+ 'clustercompliancereports', 'sbomreports', 'clustersbomreports',
195
+ 'infraassessmentreports', 'clusterinfraassessmentreports',
196
+ 'verticalpodautoscalers',
197
+ 'backups', 'restores', 'schedules', 'backupstoragelocations', 'volumesnapshotlocations',
198
+ 'externalsecrets', 'clusterexternalsecrets', 'secretstores', 'clustersecretstores',
199
+ 'clusters', 'scheduledbackups', 'poolers',
200
+ 'virtualservices', 'destinationrules', 'serviceentries',
201
+ 'peerauthentications', 'authorizationpolicies',
202
+ 'mutatingwebhookconfigurations', 'validatingwebhookconfigurations',
203
+ 'ingressclasses', 'priorityclasses', 'runtimeclasses', 'leases',
204
+ 'knativeservices', 'knativeconfigurations', 'knativerevisions', 'knativeroutes',
205
+ 'brokers', 'triggers', 'eventtypes', 'pingsources', 'apiserversources', 'containersources', 'sinkbindings',
206
+ 'channels', 'inmemorychannels', 'subscriptions', 'sequences', 'parallels',
207
+ 'knativeingresses', 'knativecertificates', 'serverlessservices', 'domainmappings',
208
+ 'ingressroutes', 'ingressroutetcps', 'ingressrouteudps',
209
+ ])
210
+
211
+ // ============================================================================
212
+ // RESOURCE CONTENT - Delegates to specific renderers
213
+ // ============================================================================
214
+
215
+ interface ResourceRendererDispatchProps {
216
+ resource: SelectedResource
217
+ data: any
218
+ relationships?: Relationships
219
+ certificateInfo?: SecretCertificateInfo
220
+ onCopy: (text: string, key: string) => void
221
+ copied: string | null
222
+ onNavigate?: (ref: ResourceRef) => void
223
+ onSaveSecretValue?: (yaml: string) => Promise<void>
224
+ isSavingSecret?: boolean
225
+ /** Set to false to skip common trailing sections (events, labels, annotations, metadata, metrics, related) */
226
+ showCommonSections?: boolean
227
+ /** Set to false to skip Prometheus charts (useful when a parent view has a dedicated Metrics tab) */
228
+ showMetrics?: boolean
229
+ /** When provided, container-level Logs buttons call this instead of opening the dock */
230
+ onOpenLogs?: (podName: string, containerName: string) => void
231
+ /** Optional hint shown in the Events section (e.g. link to Timeline tab) */
232
+ eventsHint?: React.ReactNode
233
+ /** When provided, sidebar sections (related resources, events, labels, annotations, metadata) are passed to this render prop instead of being rendered inline */
234
+ renderSidebar?: (sections: React.ReactNode) => React.ReactNode
235
+ /** Resource events — injected by the platform wrapper */
236
+ events?: any[]
237
+ /** Whether events are still loading */
238
+ eventsLoading?: boolean
239
+ /** Render prop for Prometheus metrics charts — injected by the platform wrapper */
240
+ renderMetrics?: (props: { kind: string; namespace: string; name: string }) => React.ReactNode
241
+ }
242
+
243
+ export function ResourceRendererDispatch({
244
+ resource,
245
+ data,
246
+ relationships,
247
+ certificateInfo,
248
+ onCopy,
249
+ copied,
250
+ onNavigate,
251
+ onSaveSecretValue,
252
+ isSavingSecret,
253
+ showCommonSections = true,
254
+ showMetrics = true,
255
+ onOpenLogs,
256
+ eventsHint,
257
+ renderSidebar,
258
+ events,
259
+ eventsLoading,
260
+ renderMetrics,
261
+ }: ResourceRendererDispatchProps) {
262
+ const kind = resource.kind.toLowerCase()
263
+
264
+ const isKnownKind = KNOWN_KINDS.has(kind)
265
+
266
+ const sidebarContent = showCommonSections && (
267
+ <>
268
+ <RelatedResourcesSection relationships={relationships} onNavigate={onNavigate} />
269
+ {kind !== 'events' && <EventsSection events={events || []} isLoading={eventsLoading ?? false} hint={eventsHint} />}
270
+ <LabelsSection data={data} />
271
+ <AnnotationsSection data={data} />
272
+ <MetadataSection data={data} />
273
+ </>
274
+ )
275
+
276
+ return (
277
+ <div className={renderSidebar ? 'lg:flex' : ''}>
278
+ <div className={clsx('p-4 space-y-4', renderSidebar && 'lg:flex-1 lg:min-w-0')}>
279
+ {/* Kind-specific content - delegates to modular renderers */}
280
+ {kind === 'pods' && <PodRenderer data={data} onCopy={onCopy} copied={copied} onNavigate={onNavigate} onOpenLogs={onOpenLogs} />}
281
+ {['deployments', 'statefulsets', 'daemonsets'].includes(kind) && <WorkloadRenderer kind={kind} data={data} onNavigate={onNavigate} />}
282
+ {kind === 'replicasets' && <ReplicaSetRenderer data={data} />}
283
+ {kind === 'services' && !data?.apiVersion?.includes('serving.knative.dev') && <ServiceRenderer data={data} onCopy={onCopy} copied={copied} />}
284
+ {kind === 'ingresses' && !data?.apiVersion?.includes('networking.internal.knative.dev') && <IngressRenderer data={data} onNavigate={onNavigate} />}
285
+ {kind === 'configmaps' && <ConfigMapRenderer data={data} />}
286
+ {kind === 'secrets' && <SecretRenderer data={data} certificateInfo={certificateInfo} resourceData={data} onSaveSecretValue={onSaveSecretValue} isSaving={isSavingSecret} />}
287
+ {kind === 'jobs' && <JobRenderer data={data} />}
288
+ {kind === 'cronjobs' && <CronJobRenderer data={data} onNavigate={onNavigate} />}
289
+ {(kind === 'hpas' || kind === 'horizontalpodautoscalers') && <HPARenderer data={data} onNavigate={onNavigate} />}
290
+ {kind === 'nodes' && <NodeRenderer data={data} relationships={relationships} />}
291
+ {kind === 'persistentvolumeclaims' && <PVCRenderer data={data} onNavigate={onNavigate} />}
292
+ {kind === 'rollouts' && <RolloutRenderer data={data} />}
293
+ {kind === 'certificates' && !data?.apiVersion?.includes('networking.internal.knative.dev') && <CertificateRenderer data={data} />}
294
+ {kind === 'workflows' && <WorkflowRenderer data={data} />}
295
+ {kind === 'persistentvolumes' && <PersistentVolumeRenderer data={data} onNavigate={onNavigate} />}
296
+ {kind === 'storageclasses' && <StorageClassRenderer data={data} />}
297
+ {kind === 'certificaterequests' && <CertificateRequestRenderer data={data} />}
298
+ {kind === 'clusterissuers' && <ClusterIssuerRenderer data={data} />}
299
+ {kind === 'issuers' && <IssuerRenderer data={data} />}
300
+ {kind === 'orders' && <OrderRenderer data={data} />}
301
+ {kind === 'challenges' && <ChallengeRenderer data={data} />}
302
+ {kind === 'gateways' && (data.apiVersion?.includes('networking.istio.io') ? <IstioGatewayRenderer data={data} /> : <GatewayRenderer data={data} onNavigate={onNavigate} />)}
303
+ {kind === 'gatewayclasses' && <GatewayClassRenderer data={data} />}
304
+ {kind === 'httproutes' && <HTTPRouteRenderer data={data} onNavigate={onNavigate} />}
305
+ {kind === 'grpcroutes' && <GRPCRouteRenderer data={data} onNavigate={onNavigate} />}
306
+ {kind === 'tcproutes' && <SimpleRouteRenderer data={data} kind="TCPRoute" onNavigate={onNavigate} />}
307
+ {kind === 'tlsroutes' && <SimpleRouteRenderer data={data} kind="TLSRoute" onNavigate={onNavigate} />}
308
+ {kind === 'sealedsecrets' && <SealedSecretRenderer data={data} />}
309
+ {kind === 'workflowtemplates' && <WorkflowTemplateRenderer data={data} />}
310
+ {kind === 'networkpolicies' && <NetworkPolicyRenderer data={data} />}
311
+ {kind === 'poddisruptionbudgets' && <PodDisruptionBudgetRenderer data={data} />}
312
+ {kind === 'serviceaccounts' && <ServiceAccountRenderer data={data} />}
313
+ {(kind === 'roles' || kind === 'clusterroles') && <RoleRenderer data={data} />}
314
+ {(kind === 'rolebindings' || kind === 'clusterrolebindings') && <RoleBindingRenderer data={data} onNavigate={onNavigate} />}
315
+ {kind === 'events' && <EventRenderer data={data} onNavigate={onNavigate} />}
316
+ {kind === 'gitrepositories' && <GitRepositoryRenderer data={data} />}
317
+ {kind === 'ocirepositories' && <OCIRepositoryRenderer data={data} />}
318
+ {kind === 'helmrepositories' && <HelmRepositoryRenderer data={data} />}
319
+ {kind === 'kustomizations' && <KustomizationRenderer data={data} />}
320
+ {kind === 'helmreleases' && <FluxHelmReleaseRenderer data={data} />}
321
+ {kind === 'alerts' && <AlertRenderer data={data} />}
322
+ {kind === 'applications' && <ArgoApplicationRenderer data={data} />}
323
+ {kind === 'nodepools' && <KarpenterNodePoolRenderer data={data} onNavigate={onNavigate} />}
324
+ {kind === 'nodeclaims' && <KarpenterNodeClaimRenderer data={data} onNavigate={onNavigate} />}
325
+ {kind === 'ec2nodeclasses' && <KarpenterEC2NodeClassRenderer data={data} />}
326
+ {kind === 'scaledobjects' && <KedaScaledObjectRenderer data={data} onNavigate={onNavigate} />}
327
+ {kind === 'scaledjobs' && <KedaScaledJobRenderer data={data} />}
328
+ {(kind === 'triggerauthentications' || kind === 'clustertriggerauthentications') && <KedaTriggerAuthRenderer data={data} onNavigate={onNavigate} />}
329
+ {kind === 'vulnerabilityreports' && <VulnerabilityReportRenderer data={data} />}
330
+ {kind === 'configauditreports' && <ConfigAuditReportRenderer data={data} />}
331
+ {kind === 'exposedsecretreports' && <ExposedSecretReportRenderer data={data} />}
332
+ {(kind === 'rbacassessmentreports' || kind === 'clusterrbacassessmentreports' || kind === 'infraassessmentreports' || kind === 'clusterinfraassessmentreports') && <ConfigAuditReportRenderer data={data} />}
333
+ {kind === 'clustercompliancereports' && <ClusterComplianceReportRenderer data={data} />}
334
+ {(kind === 'sbomreports' || kind === 'clustersbomreports') && <SbomReportRenderer data={data} />}
335
+ {kind === 'verticalpodautoscalers' && <VPARenderer data={data} onNavigate={onNavigate} />}
336
+ {kind === 'servicemonitors' && <ServiceMonitorRenderer data={data} />}
337
+ {kind === 'prometheusrules' && <PrometheusRuleRenderer data={data} />}
338
+ {kind === 'podmonitors' && <PodMonitorRenderer data={data} />}
339
+ {(kind === 'policyreports' || kind === 'clusterpolicyreports') && <PolicyReportRenderer data={data} />}
340
+ {(kind === 'kyvernopolicies' || kind === 'clusterpolicies') && <KyvernoPolicyRenderer data={data} />}
341
+ {kind === 'backups' && data.apiVersion?.includes('cnpg.io') && <CNPGBackupRenderer data={data} onNavigate={onNavigate} />}
342
+ {kind === 'backups' && !data.apiVersion?.includes('cnpg.io') && <VeleroBackupRenderer data={data} />}
343
+ {kind === 'restores' && <VeleroRestoreRenderer data={data} />}
344
+ {kind === 'schedules' && <VeleroScheduleRenderer data={data} />}
345
+ {kind === 'backupstoragelocations' && <VeleroBSLRenderer data={data} />}
346
+ {kind === 'volumesnapshotlocations' && <VeleroVSLRenderer data={data} />}
347
+ {kind === 'externalsecrets' && <ExternalSecretRenderer data={data} onNavigate={onNavigate} />}
348
+ {kind === 'clusterexternalsecrets' && <ClusterExternalSecretRenderer data={data} />}
349
+ {(kind === 'secretstores' || kind === 'clustersecretstores') && <SecretStoreRenderer data={data} />}
350
+ {kind === 'clusters' && <CNPGClusterRenderer data={data} onNavigate={onNavigate} />}
351
+ {kind === 'scheduledbackups' && <CNPGScheduledBackupRenderer data={data} onNavigate={onNavigate} />}
352
+ {kind === 'poolers' && <CNPGPoolerRenderer data={data} onNavigate={onNavigate} />}
353
+ {kind === 'virtualservices' && <IstioVirtualServiceRenderer data={data} onNavigate={onNavigate} />}
354
+ {kind === 'destinationrules' && <IstioDestinationRuleRenderer data={data} onNavigate={onNavigate} />}
355
+ {kind === 'serviceentries' && <IstioServiceEntryRenderer data={data} />}
356
+ {kind === 'peerauthentications' && <IstioPeerAuthenticationRenderer data={data} />}
357
+ {kind === 'authorizationpolicies' && <IstioAuthorizationPolicyRenderer data={data} />}
358
+ {kind === 'mutatingwebhookconfigurations' && <WebhookConfigRenderer data={data} isMutating />}
359
+ {kind === 'validatingwebhookconfigurations' && <WebhookConfigRenderer data={data} />}
360
+ {kind === 'ingressclasses' && <IngressClassRenderer data={data} />}
361
+ {kind === 'priorityclasses' && <PriorityClassRenderer data={data} />}
362
+ {kind === 'runtimeclasses' && <RuntimeClassRenderer data={data} />}
363
+ {kind === 'leases' && <LeaseRenderer data={data} />}
364
+ {/* Knative Serving */}
365
+ {(kind === 'services' && data?.apiVersion?.includes('serving.knative.dev')) && <KnativeServiceRenderer data={data} onNavigate={onNavigate} />}
366
+ {kind === 'knativeservices' && <KnativeServiceRenderer data={data} onNavigate={onNavigate} />}
367
+ {kind === 'knativeconfigurations' && <KnativeConfigurationRenderer data={data} onNavigate={onNavigate} />}
368
+ {kind === 'knativerevisions' && <KnativeRevisionRenderer data={data} onNavigate={onNavigate} />}
369
+ {kind === 'knativeroutes' && <KnativeRouteRenderer data={data} onNavigate={onNavigate} />}
370
+ {(kind === 'ingresses' && data?.apiVersion?.includes('networking.internal.knative.dev')) && <KnativeIngressRenderer data={data} />}
371
+ {kind === 'knativeingresses' && <KnativeIngressRenderer data={data} />}
372
+ {(kind === 'certificates' && data?.apiVersion?.includes('networking.internal.knative.dev')) && <KnativeCertificateRenderer data={data} />}
373
+ {kind === 'knativecertificates' && <KnativeCertificateRenderer data={data} />}
374
+ {kind === 'serverlessservices' && <ServerlessServiceRenderer data={data} onNavigate={onNavigate} />}
375
+ {kind === 'domainmappings' && <DomainMappingRenderer data={data} onNavigate={onNavigate} />}
376
+ {/* Knative Eventing */}
377
+ {kind === 'brokers' && <BrokerRenderer data={data} onNavigate={onNavigate} />}
378
+ {kind === 'triggers' && <TriggerRenderer data={data} onNavigate={onNavigate} />}
379
+ {kind === 'pingsources' && <PingSourceRenderer data={data} onNavigate={onNavigate} />}
380
+ {kind === 'apiserversources' && <ApiServerSourceRenderer data={data} onNavigate={onNavigate} />}
381
+ {kind === 'containersources' && <ContainerSourceRenderer data={data} onNavigate={onNavigate} />}
382
+ {kind === 'sinkbindings' && <SinkBindingRenderer data={data} onNavigate={onNavigate} />}
383
+ {kind === 'eventtypes' && <EventTypeRenderer data={data} />}
384
+ {kind === 'channels' && <ChannelRenderer data={data} onNavigate={onNavigate} />}
385
+ {kind === 'inmemorychannels' && <InMemoryChannelRenderer data={data} onNavigate={onNavigate} />}
386
+ {kind === 'subscriptions' && <SubscriptionRenderer data={data} onNavigate={onNavigate} />}
387
+ {kind === 'sequences' && <SequenceRenderer data={data} onNavigate={onNavigate} />}
388
+ {kind === 'parallels' && <ParallelRenderer data={data} onNavigate={onNavigate} />}
389
+
390
+ {/* Traefik */}
391
+ {(kind === 'ingressroutes' || kind === 'ingressroutetcps' || kind === 'ingressrouteudps') && <TraefikIngressRouteRenderer data={data} onNavigate={onNavigate} />}
392
+
393
+ {/* Generic renderer for CRDs and unknown resource types */}
394
+ {!isKnownKind && <GenericRenderer data={data} />}
395
+
396
+ {/* Common sections - can be disabled when parent handles them separately */}
397
+ {showCommonSections && (
398
+ <>
399
+ <AppInfoSection data={data} />
400
+ <ExternalLinksSection data={data} />
401
+
402
+ {/* Prometheus Metrics Charts — skip for Pending pods, and when parent has dedicated Metrics tab */}
403
+ {showMetrics && renderMetrics && !(kind === 'pods' && data?.status?.phase === 'Pending') && (
404
+ renderMetrics({ kind: data?.kind || resource.kind, namespace: resource.namespace, name: resource.name })
405
+ )}
406
+
407
+ {/* Sidebar sections rendered inline when no renderSidebar */}
408
+ {!renderSidebar && sidebarContent}
409
+ </>
410
+ )}
411
+ </div>
412
+ {renderSidebar && sidebarContent && renderSidebar(sidebarContent)}
413
+ </div>
414
+ )
415
+ }
416
+
417
+ // ============================================================================
418
+ // RESOURCE STATUS HELPER
419
+ // ============================================================================
420
+
421
+ export function getResourceStatus(kind: string, data: any): { text: string; color: string } | null {
422
+ if (!data) return null
423
+ const k = kind.toLowerCase()
424
+
425
+ if (k === 'pods') return getPodStatus(data)
426
+ if (['deployments', 'statefulsets', 'replicasets', 'daemonsets'].includes(k)) return getWorkloadStatus(data, k)
427
+ if (k === 'services') {
428
+ if (data.apiVersion?.includes('serving.knative.dev')) {
429
+ const status = getKnativeConditionStatus(data)
430
+ return { text: status.text, color: status.color }
431
+ }
432
+ return getServiceStatus(data)
433
+ }
434
+ if (k === 'jobs') return getJobStatus(data)
435
+ if (k === 'cronjobs') return getCronJobStatus(data)
436
+ if (k === 'hpas' || k === 'horizontalpodautoscalers') return getHPAStatus(data)
437
+ if (k === 'nodes') return getNodeStatus(data)
438
+ if (k === 'persistentvolumeclaims') return getPVCStatus(data)
439
+ if (k === 'rollouts') return getRolloutStatus(data)
440
+ if (k === 'workflows') return getWorkflowStatus(data)
441
+ if (k === 'certificates') {
442
+ if (data.apiVersion?.includes('networking.internal.knative.dev')) {
443
+ const status = getKnativeConditionStatus(data)
444
+ return { text: status.text, color: status.color }
445
+ }
446
+ return getCertificateStatus(data)
447
+ }
448
+ if (k === 'persistentvolumes') return getPVStatus(data)
449
+ if (k === 'certificaterequests') return getCertificateRequestStatus(data)
450
+ if (k === 'clusterissuers') return getClusterIssuerStatus(data)
451
+ if (k === 'issuers') return getIssuerStatus(data)
452
+ if (k === 'orders') return getOrderState(data)
453
+ if (k === 'challenges') return getChallengeState(data)
454
+ if (k === 'gateways') {
455
+ if (data.apiVersion?.includes('networking.istio.io')) return getIstioGatewayStatus(data)
456
+ return getGatewayStatus(data)
457
+ }
458
+ if (k === 'gatewayclasses') return getGatewayClassStatus(data)
459
+ if (k === 'httproutes' || k === 'grpcroutes' || k === 'tcproutes' || k === 'tlsroutes') return getRouteStatus(data)
460
+ if (k === 'sealedsecrets') return getSealedSecretStatus(data)
461
+ if (k === 'poddisruptionbudgets') return getPDBStatus(data)
462
+ if (k === 'gitrepositories') return getGitRepositoryStatus(data)
463
+ if (k === 'ocirepositories') return getOCIRepositoryStatus(data)
464
+ if (k === 'helmrepositories') return getHelmRepositoryStatus(data)
465
+ if (k === 'kustomizations') return getKustomizationStatus(data)
466
+ if (k === 'helmreleases') return getFluxHelmReleaseStatus(data)
467
+ if (k === 'alerts') return getFluxAlertStatus(data)
468
+ if (k === 'applications') return getArgoApplicationStatus(data)
469
+ if (k === 'nodepools') return getNodePoolStatus(data)
470
+ if (k === 'nodeclaims') return getNodeClaimStatus(data)
471
+ if (k === 'ec2nodeclasses') return getEC2NodeClassStatus(data)
472
+ if (k === 'scaledobjects') return getScaledObjectStatus(data)
473
+ if (k === 'scaledjobs') return getScaledJobStatus(data)
474
+ if (k === 'servicemonitors') return getServiceMonitorStatus(data)
475
+ if (k === 'prometheusrules') return getPrometheusRuleStatus(data)
476
+ if (k === 'podmonitors') return getPodMonitorStatus(data)
477
+ if (k === 'vulnerabilityreports') return getVulnerabilityReportStatus(data)
478
+ if (k === 'configauditreports') return getConfigAuditReportStatus(data)
479
+ if (k === 'exposedsecretreports') return getExposedSecretReportStatus(data)
480
+ if (k === 'rbacassessmentreports' || k === 'clusterrbacassessmentreports' || k === 'infraassessmentreports' || k === 'clusterinfraassessmentreports') return getRbacAssessmentReportStatus(data)
481
+ if (k === 'clustercompliancereports') return getClusterComplianceReportStatus(data)
482
+ if (k === 'sbomreports' || k === 'clustersbomreports') return getSbomReportStatus(data)
483
+ if (k === 'policyreports' || k === 'clusterpolicyreports') return getPolicyReportStatus(data)
484
+ if (k === 'kyvernopolicies' || k === 'clusterpolicies') return getKyvernoPolicyStatus(data)
485
+ if (k === 'backups') {
486
+ if (data.apiVersion?.includes('cnpg.io')) return getCNPGBackupStatus(data)
487
+ return getBackupStatus(data)
488
+ }
489
+ if (k === 'restores') return getRestoreStatus(data)
490
+ if (k === 'schedules') return getScheduleStatus(data)
491
+ if (k === 'backupstoragelocations') return getBSLStatus(data)
492
+ if (k === 'externalsecrets') return getExternalSecretStatus(data)
493
+ if (k === 'clusterexternalsecrets') return getClusterExternalSecretStatus(data)
494
+ if (k === 'secretstores') return getSecretStoreStatus(data)
495
+ if (k === 'clustersecretstores') return getClusterSecretStoreStatus(data)
496
+ if (k === 'clusters') return getCNPGClusterStatus(data)
497
+ if (k === 'scheduledbackups') return getCNPGScheduledBackupStatus(data)
498
+ if (k === 'poolers') return getCNPGPoolerStatus(data)
499
+ if (k === 'virtualservices') return getVirtualServiceStatus(data)
500
+ if (k === 'destinationrules') return getDestinationRuleStatus(data)
501
+ if (k === 'serviceentries') return getServiceEntryStatus(data)
502
+ if (k === 'peerauthentications') return getPeerAuthenticationStatus(data)
503
+ if (k === 'authorizationpolicies') return getAuthorizationPolicyStatus(data)
504
+
505
+ // Knative Revisions have custom status logic (scaled-to-zero, activating)
506
+ if (k === 'knativerevisions') {
507
+ const status = getRevisionStatus(data)
508
+ return { text: status.text, color: status.color }
509
+ }
510
+
511
+ // All other Knative resources use the standard Ready condition pattern
512
+ const knativeConditionKinds = [
513
+ 'knativeservices', 'knativeconfigurations', 'knativeroutes',
514
+ 'brokers', 'triggers',
515
+ 'pingsources', 'apiserversources', 'containersources', 'sinkbindings',
516
+ 'channels', 'inmemorychannels', 'subscriptions',
517
+ 'sequences', 'parallels',
518
+ 'domainmappings', 'knativeingresses', 'knativecertificates', 'serverlessservices',
519
+ ]
520
+ if (knativeConditionKinds.includes(k) || (k === 'ingresses' && data.apiVersion?.includes('networking.internal.knative.dev'))) {
521
+ const status = getKnativeConditionStatus(data)
522
+ return { text: status.text, color: status.color }
523
+ }
524
+
525
+ // Generic status extraction
526
+ const status = data.status
527
+ if (status) {
528
+ if (status.phase) {
529
+ const phase = String(status.phase)
530
+ const healthyPhases = ['Running', 'Active', 'Succeeded', 'Ready', 'Healthy', 'Available', 'Bound']
531
+ const warningPhases = ['Pending', 'Progressing', 'Unknown', 'Terminating']
532
+ const isHealthy = healthyPhases.includes(phase)
533
+ const isWarning = warningPhases.includes(phase)
534
+ return {
535
+ text: phase,
536
+ color: isHealthy ? 'bg-green-500/20 text-green-400' :
537
+ isWarning ? 'bg-yellow-500/20 text-yellow-400' :
538
+ 'bg-red-500/20 text-red-400'
539
+ }
540
+ }
541
+
542
+ if (status.conditions && Array.isArray(status.conditions)) {
543
+ const readyCondition = status.conditions.find((c: any) =>
544
+ c.type === 'Ready' || c.type === 'Available' || c.type === 'Progressing'
545
+ )
546
+ if (readyCondition) {
547
+ const isReady = readyCondition.status === 'True'
548
+ return {
549
+ text: isReady ? 'Ready' : 'Not Ready',
550
+ color: isReady ? 'bg-green-500/20 text-green-400' : 'bg-yellow-500/20 text-yellow-400'
551
+ }
552
+ }
553
+ }
554
+ }
555
+
556
+ return null
557
+ }
@@ -0,0 +1,3 @@
1
+ export { ResourceRendererDispatch, getResourceStatus } from './ResourceRendererDispatch'
2
+ export { EditableYamlView, SaveSuccessAnimation } from './EditableYamlView'
3
+ export { ResourceActionsBar, RevisionHistoryDialog } from './ResourceActionsBar'
@@ -0,0 +1 @@
1
+ export * from './shared'