@skyhook-io/k8s-ui 1.2.4 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/package.json +4 -3
  2. package/src/components/dock/BottomDock.tsx +24 -6
  3. package/src/components/dock/DockContext.tsx +9 -1
  4. package/src/components/dock/LocalTerminalTab.tsx +1 -1
  5. package/src/components/dock/NodeTerminalTab.tsx +1 -1
  6. package/src/components/dock/TerminalTab.tsx +2 -2
  7. package/src/components/gitops/GitOpsActions.tsx +12 -11
  8. package/src/components/gitops/GitOpsStatusBadge.tsx +6 -6
  9. package/src/components/logs/LogCore.tsx +8 -8
  10. package/src/components/logs/LogsViewer.tsx +8 -3
  11. package/src/components/logs/WorkloadLogsViewer.tsx +37 -9
  12. package/src/components/logs/useLogStream.ts +20 -0
  13. package/src/components/resources/ResourcesSidebar.tsx +10 -10
  14. package/src/components/resources/ResourcesView.tsx +49 -48
  15. package/src/components/resources/renderers/AlertRenderer.tsx +2 -2
  16. package/src/components/resources/renderers/ArgoApplicationRenderer.tsx +2 -2
  17. package/src/components/resources/renderers/CNPGClusterRenderer.tsx +1 -1
  18. package/src/components/resources/renderers/CertificateRenderer.tsx +3 -3
  19. package/src/components/resources/renderers/CertificateRequestRenderer.tsx +3 -3
  20. package/src/components/resources/renderers/ChallengeRenderer.tsx +2 -2
  21. package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +3 -3
  22. package/src/components/resources/renderers/ClusterIssuerRenderer.tsx +3 -3
  23. package/src/components/resources/renderers/ConfigAuditReportRenderer.tsx +2 -2
  24. package/src/components/resources/renderers/ContourHTTPProxyRenderer.tsx +1 -1
  25. package/src/components/resources/renderers/EventRenderer.tsx +1 -1
  26. package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +2 -2
  27. package/src/components/resources/renderers/ExternalSecretRenderer.tsx +2 -2
  28. package/src/components/resources/renderers/FluxHelmReleaseRenderer.tsx +1 -1
  29. package/src/components/resources/renderers/GRPCRouteRenderer.tsx +5 -5
  30. package/src/components/resources/renderers/GatewayClassRenderer.tsx +1 -1
  31. package/src/components/resources/renderers/GatewayRenderer.tsx +3 -3
  32. package/src/components/resources/renderers/GenericRenderer.tsx +1 -1
  33. package/src/components/resources/renderers/HPARenderer.tsx +1 -1
  34. package/src/components/resources/renderers/HTTPRouteRenderer.tsx +5 -5
  35. package/src/components/resources/renderers/HelmRepositoryRenderer.tsx +1 -1
  36. package/src/components/resources/renderers/IngressClassRenderer.tsx +1 -1
  37. package/src/components/resources/renderers/IngressRenderer.tsx +1 -1
  38. package/src/components/resources/renderers/IstioAuthorizationPolicyRenderer.tsx +10 -10
  39. package/src/components/resources/renderers/IstioDestinationRuleRenderer.tsx +1 -1
  40. package/src/components/resources/renderers/IstioGatewayRenderer.tsx +2 -2
  41. package/src/components/resources/renderers/IstioPeerAuthenticationRenderer.tsx +2 -2
  42. package/src/components/resources/renderers/IstioServiceEntryRenderer.tsx +6 -6
  43. package/src/components/resources/renderers/IstioVirtualServiceRenderer.tsx +5 -5
  44. package/src/components/resources/renderers/KarpenterEC2NodeClassRenderer.tsx +5 -5
  45. package/src/components/resources/renderers/KarpenterNodeClaimRenderer.tsx +2 -2
  46. package/src/components/resources/renderers/KarpenterNodePoolRenderer.tsx +4 -4
  47. package/src/components/resources/renderers/KedaScaledJobRenderer.tsx +3 -3
  48. package/src/components/resources/renderers/KedaScaledObjectRenderer.tsx +3 -3
  49. package/src/components/resources/renderers/KedaTriggerAuthRenderer.tsx +5 -5
  50. package/src/components/resources/renderers/KnativeConfigurationRenderer.tsx +2 -2
  51. package/src/components/resources/renderers/KnativeEventingRenderer.tsx +5 -5
  52. package/src/components/resources/renderers/KnativeFlowRenderer.tsx +4 -4
  53. package/src/components/resources/renderers/KnativeNetworkingRenderer.tsx +8 -8
  54. package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +3 -3
  55. package/src/components/resources/renderers/KnativeRouteRenderer.tsx +1 -1
  56. package/src/components/resources/renderers/KnativeServiceRenderer.tsx +2 -2
  57. package/src/components/resources/renderers/KnativeSourceRenderer.tsx +6 -6
  58. package/src/components/resources/renderers/KustomizationRenderer.tsx +1 -1
  59. package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +4 -4
  60. package/src/components/resources/renderers/NetworkPolicyRenderer.tsx +6 -6
  61. package/src/components/resources/renderers/NodeRenderer.tsx +5 -5
  62. package/src/components/resources/renderers/OrderRenderer.tsx +3 -3
  63. package/src/components/resources/renderers/PersistentVolumeRenderer.tsx +1 -1
  64. package/src/components/resources/renderers/PodDisruptionBudgetRenderer.tsx +1 -1
  65. package/src/components/resources/renderers/PodMonitorRenderer.tsx +3 -3
  66. package/src/components/resources/renderers/PodRenderer.tsx +10 -10
  67. package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +2 -2
  68. package/src/components/resources/renderers/RoleBindingRenderer.tsx +3 -3
  69. package/src/components/resources/renderers/RoleRenderer.tsx +8 -8
  70. package/src/components/resources/renderers/RolloutRenderer.tsx +1 -1
  71. package/src/components/resources/renderers/RuntimeClassRenderer.tsx +2 -2
  72. package/src/components/resources/renderers/SealedSecretRenderer.tsx +2 -2
  73. package/src/components/resources/renderers/SecretRenderer.tsx +3 -3
  74. package/src/components/resources/renderers/ServiceAccountRenderer.tsx +1 -1
  75. package/src/components/resources/renderers/ServiceMonitorRenderer.tsx +3 -3
  76. package/src/components/resources/renderers/ServiceRenderer.tsx +1 -1
  77. package/src/components/resources/renderers/SimpleRouteRenderer.tsx +5 -5
  78. package/src/components/resources/renderers/StorageClassRenderer.tsx +1 -1
  79. package/src/components/resources/renderers/TraefikIngressRouteRenderer.tsx +1 -1
  80. package/src/components/resources/renderers/VPARenderer.tsx +2 -2
  81. package/src/components/resources/renderers/VeleroBSLRenderer.tsx +2 -2
  82. package/src/components/resources/renderers/VeleroBackupRenderer.tsx +6 -6
  83. package/src/components/resources/renderers/VeleroRestoreRenderer.tsx +5 -5
  84. package/src/components/resources/renderers/VeleroScheduleRenderer.tsx +6 -6
  85. package/src/components/resources/renderers/VeleroVSLRenderer.tsx +1 -1
  86. package/src/components/resources/renderers/WebhookConfigRenderer.tsx +10 -10
  87. package/src/components/resources/renderers/WorkflowRenderer.tsx +2 -2
  88. package/src/components/resources/renderers/WorkflowTemplateRenderer.tsx +2 -2
  89. package/src/components/resources/renderers/WorkloadRenderer.tsx +1 -1
  90. package/src/components/resources/renderers/argo-cells.tsx +3 -3
  91. package/src/components/resources/renderers/certmanager-cells.tsx +6 -6
  92. package/src/components/resources/renderers/cnpg-cells.tsx +5 -5
  93. package/src/components/resources/renderers/eso-cells.tsx +4 -4
  94. package/src/components/resources/renderers/flux-cells.tsx +6 -6
  95. package/src/components/resources/renderers/istio-cells.tsx +9 -9
  96. package/src/components/resources/renderers/karpenter-cells.tsx +3 -3
  97. package/src/components/resources/renderers/keda-cells.tsx +2 -2
  98. package/src/components/resources/renderers/knative-cells.tsx +2 -2
  99. package/src/components/resources/renderers/kyverno-cells.tsx +3 -3
  100. package/src/components/resources/renderers/prometheus-cells.tsx +3 -3
  101. package/src/components/resources/renderers/trivy-cells.tsx +4 -4
  102. package/src/components/resources/renderers/velero-cells.tsx +4 -4
  103. package/src/components/shared/EditableYamlView.tsx +1 -1
  104. package/src/components/shared/ResourceActionsBar.tsx +17 -17
  105. package/src/components/shared/ResourceRendererDispatch.tsx +8 -7
  106. package/src/components/timeline/DiffViewer.tsx +131 -0
  107. package/src/components/timeline/TimelineList.tsx +817 -0
  108. package/src/components/timeline/index.ts +2 -0
  109. package/src/components/topology/GroupNode.tsx +189 -79
  110. package/src/components/topology/K8sResourceNode.tsx +5 -5
  111. package/src/components/topology/TopologyControls.tsx +2 -2
  112. package/src/components/topology/TopologyGraph.tsx +362 -62
  113. package/src/components/topology/layout.ts +288 -92
  114. package/src/components/topology/topology.css +112 -1
  115. package/src/components/ui/Badge.tsx +178 -0
  116. package/src/components/ui/HealthRing.tsx +70 -35
  117. package/src/components/ui/MetricsChart.tsx +2 -2
  118. package/src/components/ui/Toast.tsx +74 -27
  119. package/src/components/ui/drawer-components.tsx +12 -31
  120. package/src/components/workload/ResourceDetailDrawer.tsx +4 -4
  121. package/src/components/workload/WorkloadView.tsx +10 -10
  122. package/src/theme/components.css +195 -0
  123. package/src/theme/tailwind-theme.css +13 -13
  124. package/src/theme/variables.css +46 -29
  125. package/src/types/core.ts +41 -0
  126. package/src/utils/badge-colors.ts +54 -205
  127. package/src/utils/download.ts +18 -3
  128. package/src/utils/log-format.ts +0 -8
  129. package/tsconfig.json +0 -1
@@ -1,4 +1,5 @@
1
1
  import { clsx } from 'clsx'
2
+ import { SEVERITY_BADGE } from '../../utils/badge-colors'
2
3
  import {
3
4
  getPodStatus,
4
5
  getWorkloadStatus,
@@ -550,9 +551,9 @@ export function getResourceStatus(kind: string, data: any): { text: string; colo
550
551
  // Contour HTTPProxy
551
552
  if (k === 'httpproxies') {
552
553
  const s = getHTTPProxyStatus(data)
553
- if (s.status === 'healthy') return { text: s.label, color: 'bg-green-500/20 text-green-400' }
554
- if (s.status === 'unhealthy') return { text: s.label, color: 'bg-red-500/20 text-red-400' }
555
- if (s.status === 'degraded') return { text: s.label, color: 'bg-yellow-500/20 text-yellow-400' }
554
+ if (s.status === 'healthy') return { text: s.label, color: SEVERITY_BADGE.success }
555
+ if (s.status === 'unhealthy') return { text: s.label, color: SEVERITY_BADGE.error }
556
+ if (s.status === 'degraded') return { text: s.label, color: SEVERITY_BADGE.warning }
556
557
  return null
557
558
  }
558
559
 
@@ -587,9 +588,9 @@ export function getResourceStatus(kind: string, data: any): { text: string; colo
587
588
  const isWarning = warningPhases.includes(phase)
588
589
  return {
589
590
  text: phase,
590
- color: isHealthy ? 'bg-green-500/20 text-green-400' :
591
- isWarning ? 'bg-yellow-500/20 text-yellow-400' :
592
- 'bg-red-500/20 text-red-400'
591
+ color: isHealthy ? SEVERITY_BADGE.success :
592
+ isWarning ? SEVERITY_BADGE.warning :
593
+ SEVERITY_BADGE.error
593
594
  }
594
595
  }
595
596
 
@@ -601,7 +602,7 @@ export function getResourceStatus(kind: string, data: any): { text: string; colo
601
602
  const isReady = readyCondition.status === 'True'
602
603
  return {
603
604
  text: isReady ? 'Ready' : 'Not Ready',
604
- color: isReady ? 'bg-green-500/20 text-green-400' : 'bg-yellow-500/20 text-yellow-400'
605
+ color: isReady ? SEVERITY_BADGE.success : SEVERITY_BADGE.warning
605
606
  }
606
607
  }
607
608
  }
@@ -0,0 +1,131 @@
1
+ import { memo } from 'react'
2
+ import { clsx } from 'clsx'
3
+ import { ArrowRight, Plus, Minus, RefreshCw } from 'lucide-react'
4
+ import type { DiffInfo, FieldChange } from '../../types'
5
+
6
+ interface DiffViewerProps {
7
+ diff: DiffInfo
8
+ compact?: boolean
9
+ }
10
+
11
+ export const DiffViewer = memo(function DiffViewer({ diff, compact = false }: DiffViewerProps) {
12
+ if (!diff || diff.fields.length === 0) {
13
+ return null
14
+ }
15
+
16
+ if (compact) {
17
+ return (
18
+ <div className="text-xs text-theme-text-secondary flex items-center gap-1">
19
+ <RefreshCw className="w-3 h-3" />
20
+ <span>{diff.summary || `${diff.fields.length} field(s) changed`}</span>
21
+ </div>
22
+ )
23
+ }
24
+
25
+ return (
26
+ <div className="space-y-2">
27
+ {/* Summary */}
28
+ {diff.summary && (
29
+ <div className="text-sm font-medium text-theme-text-secondary flex items-center gap-2">
30
+ <RefreshCw className="w-4 h-4 text-blue-400" />
31
+ {diff.summary}
32
+ </div>
33
+ )}
34
+
35
+ {/* Field changes */}
36
+ <div className="space-y-1.5">
37
+ {diff.fields.map((field, idx) => (
38
+ <FieldChangeRow key={`${field.path}-${idx}`} field={field} />
39
+ ))}
40
+ </div>
41
+ </div>
42
+ )
43
+ })
44
+
45
+ interface FieldChangeRowProps {
46
+ field: FieldChange
47
+ }
48
+
49
+ function FieldChangeRow({ field }: FieldChangeRowProps) {
50
+ const isAdded = field.oldValue === null || field.oldValue === undefined
51
+ const isRemoved = field.newValue === null || field.newValue === undefined
52
+ const isModified = !isAdded && !isRemoved
53
+
54
+ return (
55
+ <div className="rounded bg-theme-surface/50 border border-theme-border px-3 py-2">
56
+ {/* Field path */}
57
+ <div className="text-xs font-mono text-theme-text-tertiary mb-1">{field.path}</div>
58
+
59
+ {/* Values */}
60
+ <div className="flex items-center gap-2 text-sm">
61
+ {isAdded ? (
62
+ <>
63
+ <Plus className="w-3.5 h-3.5 text-green-400 shrink-0" />
64
+ <span className="text-green-400">
65
+ {formatValue(field.newValue)}
66
+ </span>
67
+ </>
68
+ ) : isRemoved ? (
69
+ <>
70
+ <Minus className="w-3.5 h-3.5 text-red-400 shrink-0" />
71
+ <span className="text-red-400 line-through">
72
+ {formatValue(field.oldValue)}
73
+ </span>
74
+ </>
75
+ ) : isModified ? (
76
+ <>
77
+ <span className="text-red-400 line-through">
78
+ {formatValue(field.oldValue)}
79
+ </span>
80
+ <ArrowRight className="w-3.5 h-3.5 text-theme-text-tertiary shrink-0" />
81
+ <span className="text-green-400">
82
+ {formatValue(field.newValue)}
83
+ </span>
84
+ </>
85
+ ) : null}
86
+ </div>
87
+ </div>
88
+ )
89
+ }
90
+
91
+ function formatValue(value: unknown): string {
92
+ if (value === null || value === undefined) {
93
+ return 'null'
94
+ }
95
+ if (typeof value === 'object') {
96
+ try {
97
+ const str = JSON.stringify(value)
98
+ // Truncate long values
99
+ if (str.length > 100) {
100
+ return str.slice(0, 97) + '...'
101
+ }
102
+ return str
103
+ } catch {
104
+ return String(value)
105
+ }
106
+ }
107
+ return String(value)
108
+ }
109
+
110
+ // Inline diff badge for use in event cards
111
+ interface DiffBadgeProps {
112
+ diff: DiffInfo
113
+ }
114
+
115
+ export const DiffBadge = memo(function DiffBadge({ diff }: DiffBadgeProps) {
116
+ if (!diff || !diff.summary) {
117
+ return null
118
+ }
119
+
120
+ return (
121
+ <span
122
+ className={clsx(
123
+ 'badge',
124
+ 'bg-skyhook-500/10 text-skyhook-400 border border-skyhook-500/20'
125
+ )}
126
+ >
127
+ <RefreshCw className="w-3 h-3" />
128
+ {diff.summary}
129
+ </span>
130
+ )
131
+ })