@skyhook-io/k8s-ui 1.5.2 → 1.5.4

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 (52) hide show
  1. package/package.json +1 -1
  2. package/src/components/audit/AuditAlerts.tsx +6 -0
  3. package/src/components/audit/AuditFindingsTable.tsx +83 -33
  4. package/src/components/gitops/ManagedResourcesList.tsx +2 -1
  5. package/src/components/logs/JsonLogLine.tsx +10 -7
  6. package/src/components/logs/LogCore.tsx +160 -63
  7. package/src/components/logs/LogToolbarSelects.tsx +17 -6
  8. package/src/components/logs/LogsViewer.tsx +8 -7
  9. package/src/components/logs/StructuredLogLine.tsx +46 -47
  10. package/src/components/logs/WorkloadLogsViewer.tsx +44 -34
  11. package/src/components/logs/log-palette.ts +222 -0
  12. package/src/components/logs/useLogBuffer.ts +6 -1
  13. package/src/components/resources/ResourcesView.tsx +183 -52
  14. package/src/components/resources/renderers/CNPGClusterRenderer.tsx +3 -2
  15. package/src/components/resources/renderers/CertificateRenderer.tsx +4 -3
  16. package/src/components/resources/renderers/ClusterComplianceReportRenderer.tsx +2 -1
  17. package/src/components/resources/renderers/ClusterExternalSecretRenderer.tsx +4 -3
  18. package/src/components/resources/renderers/ExposedSecretReportRenderer.tsx +2 -1
  19. package/src/components/resources/renderers/KnativeRevisionRenderer.tsx +2 -1
  20. package/src/components/resources/renderers/KyvernoPolicyReportRenderer.tsx +4 -3
  21. package/src/components/resources/renderers/PrometheusRuleRenderer.tsx +3 -2
  22. package/src/components/resources/renderers/SecretRenderer.tsx +10 -4
  23. package/src/components/resources/renderers/trivy-shared.tsx +3 -2
  24. package/src/components/resources/resource-utils-istio.ts +4 -3
  25. package/src/components/resources/resource-utils.ts +10 -2
  26. package/src/components/timeline/TimelineList.tsx +2 -1
  27. package/src/components/topology/GroupNode.tsx +2 -1
  28. package/src/components/topology/TopologyGraph.tsx +2 -1
  29. package/src/components/ui/Badge.tsx +2 -1
  30. package/src/components/ui/ClusterName.tsx +95 -0
  31. package/src/components/ui/EmptyState.tsx +118 -0
  32. package/src/components/ui/FilterPill.tsx +98 -0
  33. package/src/components/ui/ForceDeleteConfirmDialog.tsx +2 -1
  34. package/src/components/ui/ResourceBar.tsx +1 -1
  35. package/src/components/ui/Tooltip.tsx +43 -0
  36. package/src/components/ui/drawer-components.tsx +11 -0
  37. package/src/components/ui/index.ts +7 -0
  38. package/src/components/ui/provider-logos/aws-dark.png +0 -0
  39. package/src/components/ui/provider-logos/aws.png +0 -0
  40. package/src/components/ui/provider-logos/azure.svg +23 -0
  41. package/src/components/ui/provider-logos/gcp.png +0 -0
  42. package/src/components/ui/status-tone.test.ts +53 -0
  43. package/src/components/ui/status-tone.tsx +104 -0
  44. package/src/components/workload/WorkloadView.tsx +3 -3
  45. package/src/theme/components.css +7 -0
  46. package/src/utils/badge-colors.ts +1 -0
  47. package/src/utils/context-name.test.ts +106 -0
  48. package/src/utils/context-name.ts +25 -6
  49. package/src/utils/index.ts +1 -0
  50. package/src/utils/navigation.ts +4 -8
  51. package/src/utils/pluralize.test.ts +98 -0
  52. package/src/utils/pluralize.ts +60 -0
@@ -0,0 +1,222 @@
1
+ /**
2
+ * Explicit color palettes for the log viewer.
3
+ *
4
+ * The log viewer is intentionally self-contained: it does NOT use theme tokens
5
+ * (`text-theme-*`, `bg-theme-*`, etc.) because those are driven by CSS
6
+ * `light-dark()` and don't resolve correctly through the log viewer's forced
7
+ * `color-scheme` container. Instead it flips between two explicit palettes
8
+ * based on its own `isDark` state (toggled by a Sun/Moon button in the
9
+ * toolbar, persisted to `localStorage['radar-logs-dark']`).
10
+ *
11
+ * All class strings are static literals so Tailwind's class scanner picks them
12
+ * up — do not construct them dynamically.
13
+ */
14
+
15
+ /** All color-related class strings used inside the log viewer. */
16
+ export interface LogPalette {
17
+ // Container / surfaces
18
+ containerBg: string
19
+ toolbarBg: string
20
+ toolbarBgMuted: string
21
+ menuBg: string
22
+ elevatedBg: string
23
+
24
+ // Borders
25
+ border: string
26
+ borderLight: string
27
+
28
+ // Text
29
+ textPrimary: string
30
+ textSecondary: string
31
+ textTertiary: string
32
+ textDisabled: string
33
+ /** Standalone error text (inline "error=..." in structured lines, inline validation errors). */
34
+ textError: string
35
+ /** Accent/link text — blue-family. Used for toolbar toggles, "select all" etc. */
36
+ textAccent: string
37
+
38
+ // Placeholder (plain class, applied via `placeholder-*` below)
39
+ placeholder: string
40
+
41
+ // Hover states
42
+ hoverBg: string
43
+ hoverSurface: string
44
+ hoverText: string
45
+ /** Active/selected toolbar controls inside the viewer. */
46
+ toolbarActive: string
47
+
48
+ // Row highlight (current search match)
49
+ currentMatchBg: string
50
+
51
+ // Level-filter button active colors (per-level, full className)
52
+ levelActiveError: string
53
+ levelActiveWarn: string
54
+ levelActiveInfo: string
55
+ levelActiveDebug: string
56
+
57
+ // Level-badge colors used inside StructuredLogLine
58
+ levelBadgeError: string
59
+ levelBadgeWarn: string
60
+ levelBadgeInfo: string
61
+ levelBadgeDebug: string
62
+ levelBadgeNeutral: string
63
+
64
+ /**
65
+ * Pod label colors for WorkloadLogsViewer (aggregated logs across pods).
66
+ * Pairs: one class for the name text, one for the filter-list dot.
67
+ * Pods are round-robined through this array.
68
+ */
69
+ podColors: Array<{ text: string; bg: string }>
70
+
71
+ /**
72
+ * Syntax-highlight colors for structured JSON/logfmt renderings.
73
+ * Applied as inline `style={{ color }}` (not classes) because the values
74
+ * come from log-format.ts and feed React's style prop.
75
+ */
76
+ syntaxKey: string
77
+ syntaxString: string
78
+ syntaxNumber: string
79
+ syntaxBoolean: string
80
+ syntaxNull: string
81
+ }
82
+
83
+ const DARK_PALETTE: LogPalette = {
84
+ containerBg: 'bg-slate-950',
85
+ toolbarBg: 'bg-slate-900',
86
+ toolbarBgMuted: 'bg-slate-900/60',
87
+ menuBg: 'bg-slate-900',
88
+ elevatedBg: 'bg-slate-800',
89
+
90
+ border: 'border-slate-800',
91
+ borderLight: 'border-slate-700',
92
+
93
+ textPrimary: 'text-slate-100',
94
+ textSecondary: 'text-slate-400',
95
+ textTertiary: 'text-slate-500',
96
+ textDisabled: 'text-slate-600',
97
+ textError: 'text-red-400',
98
+ textAccent: 'text-blue-400',
99
+
100
+ placeholder: 'placeholder-slate-600',
101
+
102
+ hoverBg: 'hover:bg-slate-800',
103
+ hoverSurface: 'hover:bg-slate-800/50',
104
+ hoverText: 'hover:text-slate-100',
105
+ toolbarActive: 'bg-slate-700 text-slate-100 hover:bg-slate-600',
106
+
107
+ currentMatchBg: 'bg-yellow-500/10',
108
+
109
+ levelActiveError: 'bg-red-500/20 text-red-400 border-red-500/40',
110
+ levelActiveWarn: 'bg-amber-500/20 text-amber-400 border-amber-500/40',
111
+ levelActiveInfo: 'bg-blue-500/20 text-blue-400 border-blue-500/40',
112
+ levelActiveDebug: 'bg-slate-700 text-slate-300 border-slate-600',
113
+
114
+ levelBadgeError: 'bg-red-500/20 text-red-400 border border-red-500/40',
115
+ levelBadgeWarn: 'bg-amber-500/20 text-amber-400 border border-amber-500/40',
116
+ levelBadgeInfo: 'bg-blue-500/20 text-blue-400 border border-blue-500/40',
117
+ levelBadgeDebug: 'bg-slate-700 text-slate-300 border border-slate-600',
118
+ levelBadgeNeutral: 'bg-slate-800 text-slate-400 border border-slate-700',
119
+
120
+ podColors: [
121
+ { text: 'text-blue-400', bg: 'bg-blue-400' },
122
+ { text: 'text-emerald-400', bg: 'bg-emerald-400' },
123
+ { text: 'text-amber-400', bg: 'bg-amber-400' },
124
+ { text: 'text-purple-400', bg: 'bg-purple-400' },
125
+ { text: 'text-pink-400', bg: 'bg-pink-400' },
126
+ { text: 'text-cyan-400', bg: 'bg-cyan-400' },
127
+ { text: 'text-orange-400', bg: 'bg-orange-400' },
128
+ { text: 'text-lime-400', bg: 'bg-lime-400' },
129
+ ],
130
+
131
+ // Hex values tuned for the `bg-slate-950` container.
132
+ syntaxKey: '#7cacf8',
133
+ syntaxString: '#73c991',
134
+ syntaxNumber: '#e5c07b',
135
+ syntaxBoolean: '#c678dd',
136
+ syntaxNull: '#808080',
137
+ }
138
+
139
+ const LIGHT_PALETTE: LogPalette = {
140
+ containerBg: 'bg-slate-50',
141
+ toolbarBg: 'bg-slate-100',
142
+ toolbarBgMuted: 'bg-slate-100/60',
143
+ menuBg: 'bg-white',
144
+ elevatedBg: 'bg-white',
145
+
146
+ border: 'border-slate-200',
147
+ borderLight: 'border-slate-300',
148
+
149
+ textPrimary: 'text-slate-900',
150
+ textSecondary: 'text-slate-600',
151
+ textTertiary: 'text-slate-400',
152
+ textDisabled: 'text-slate-300',
153
+ textError: 'text-red-700',
154
+ textAccent: 'text-blue-700',
155
+
156
+ placeholder: 'placeholder-slate-400',
157
+
158
+ hoverBg: 'hover:bg-slate-200',
159
+ hoverSurface: 'hover:bg-slate-200/60',
160
+ hoverText: 'hover:text-slate-900',
161
+ toolbarActive: 'bg-slate-200 text-slate-900 hover:bg-slate-300',
162
+
163
+ currentMatchBg: 'bg-yellow-200/60',
164
+
165
+ levelActiveError: 'bg-red-100 text-red-700 border-red-400',
166
+ levelActiveWarn: 'bg-amber-100 text-amber-700 border-amber-400',
167
+ levelActiveInfo: 'bg-blue-100 text-blue-700 border-blue-400',
168
+ levelActiveDebug: 'bg-slate-200 text-slate-700 border-slate-400',
169
+
170
+ levelBadgeError: 'bg-red-100 text-red-700 border border-red-400',
171
+ levelBadgeWarn: 'bg-amber-100 text-amber-700 border border-amber-400',
172
+ levelBadgeInfo: 'bg-blue-100 text-blue-700 border border-blue-400',
173
+ levelBadgeDebug: 'bg-slate-200 text-slate-700 border border-slate-400',
174
+ levelBadgeNeutral: 'bg-slate-100 text-slate-600 border border-slate-300',
175
+
176
+ podColors: [
177
+ { text: 'text-blue-700', bg: 'bg-blue-700' },
178
+ { text: 'text-emerald-700', bg: 'bg-emerald-700' },
179
+ { text: 'text-amber-700', bg: 'bg-amber-700' },
180
+ { text: 'text-purple-700', bg: 'bg-purple-700' },
181
+ { text: 'text-pink-700', bg: 'bg-pink-700' },
182
+ { text: 'text-cyan-700', bg: 'bg-cyan-700' },
183
+ { text: 'text-orange-700', bg: 'bg-orange-700' },
184
+ { text: 'text-lime-700', bg: 'bg-lime-700' },
185
+ ],
186
+
187
+ // Hex values tuned for the `bg-slate-50` container — darker so they read
188
+ // on a near-white background.
189
+ syntaxKey: '#0b63c0',
190
+ syntaxString: '#2b8a3e',
191
+ syntaxNumber: '#b95f00',
192
+ syntaxBoolean: '#7c3aed',
193
+ syntaxNull: '#6b7280',
194
+ }
195
+
196
+ /** Get the palette for the current dark/light mode. */
197
+ export function getLogPalette(isDark: boolean): LogPalette {
198
+ return isDark ? DARK_PALETTE : LIGHT_PALETTE
199
+ }
200
+
201
+ /** Per-level content color (log text body). */
202
+ export function getLogLevelColor(
203
+ level: 'error' | 'warn' | 'info' | 'debug' | 'unknown',
204
+ isDark: boolean,
205
+ ): string {
206
+ if (isDark) {
207
+ switch (level) {
208
+ case 'error': return 'text-red-400'
209
+ case 'warn': return 'text-amber-400'
210
+ case 'info': return 'text-blue-400'
211
+ case 'debug': return 'text-slate-400'
212
+ default: return 'text-slate-100'
213
+ }
214
+ }
215
+ switch (level) {
216
+ case 'error': return 'text-red-700'
217
+ case 'warn': return 'text-amber-600'
218
+ case 'info': return 'text-blue-700'
219
+ case 'debug': return 'text-slate-500'
220
+ default: return 'text-slate-900'
221
+ }
222
+ }
@@ -9,7 +9,12 @@ export interface LogEntry {
9
9
  content: string
10
10
  container: string
11
11
  pod?: string
12
- podColor?: string
12
+ /**
13
+ * Index into the current palette's `podColors` array. Stored as an index
14
+ * (not a resolved class) so the pod-label color can re-theme when the
15
+ * viewer's isDark state toggles at runtime.
16
+ */
17
+ podColorIndex?: number
13
18
  level: LogLevel
14
19
  isJson: boolean
15
20
  isLogfmt: boolean