@wakastellar/ui 2.1.2 → 2.3.2

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 (123) hide show
  1. package/dist/blocks/apm-overview/index.d.ts +58 -0
  2. package/dist/blocks/cicd-builder/index.d.ts +47 -0
  3. package/dist/blocks/cloud-cost-dashboard/index.d.ts +49 -0
  4. package/dist/blocks/container-orchestrator/index.d.ts +63 -0
  5. package/dist/blocks/database-admin/index.d.ts +84 -0
  6. package/dist/blocks/gitops-sync-status/index.d.ts +45 -0
  7. package/dist/blocks/incident-manager/index.d.ts +44 -0
  8. package/dist/blocks/index.d.ts +10 -0
  9. package/dist/blocks/infrastructure-map/index.d.ts +32 -0
  10. package/dist/blocks/on-call-schedule/index.d.ts +43 -0
  11. package/dist/blocks/release-notes/index.d.ts +49 -0
  12. package/dist/components/index.d.ts +34 -0
  13. package/dist/components/waka-ad-banner/index.d.ts +36 -0
  14. package/dist/components/waka-ad-fallback/index.d.ts +33 -0
  15. package/dist/components/waka-ad-inline/index.d.ts +15 -0
  16. package/dist/components/waka-ad-interstitial/index.d.ts +26 -0
  17. package/dist/components/waka-ad-placeholder/index.d.ts +17 -0
  18. package/dist/components/waka-ad-provider/index.d.ts +103 -0
  19. package/dist/components/waka-ad-sidebar/index.d.ts +18 -0
  20. package/dist/components/waka-ad-sticky-footer/index.d.ts +17 -0
  21. package/dist/components/waka-alert-panel/index.d.ts +45 -0
  22. package/dist/components/waka-artifact-list/index.d.ts +32 -0
  23. package/dist/components/waka-build-matrix/index.d.ts +36 -0
  24. package/dist/components/waka-config-comparator/index.d.ts +37 -0
  25. package/dist/components/waka-container-list/index.d.ts +51 -0
  26. package/dist/components/waka-content-recommendation/index.d.ts +23 -0
  27. package/dist/components/waka-database-card/index.d.ts +46 -0
  28. package/dist/components/waka-dependency-tree/index.d.ts +38 -0
  29. package/dist/components/waka-env-var-editor/index.d.ts +30 -0
  30. package/dist/components/waka-feature-flag-row/index.d.ts +45 -0
  31. package/dist/components/waka-kubernetes-overview/index.d.ts +98 -0
  32. package/dist/components/waka-log-viewer/index.d.ts +38 -0
  33. package/dist/components/waka-migration-list/index.d.ts +36 -0
  34. package/dist/components/waka-outstream-video/index.d.ts +24 -0
  35. package/dist/components/waka-pod-card/index.d.ts +73 -0
  36. package/dist/components/waka-query-explain/index.d.ts +48 -0
  37. package/dist/components/waka-secret-card/index.d.ts +43 -0
  38. package/dist/components/waka-security-scan-result/index.d.ts +45 -0
  39. package/dist/components/waka-service-graph/index.d.ts +44 -0
  40. package/dist/components/waka-sponsored-badge/index.d.ts +20 -0
  41. package/dist/components/waka-sponsored-card/index.d.ts +25 -0
  42. package/dist/components/waka-sponsored-feed/index.d.ts +31 -0
  43. package/dist/components/waka-test-report/index.d.ts +60 -0
  44. package/dist/components/waka-trace-viewer/index.d.ts +36 -0
  45. package/dist/components/waka-video-ad/index.d.ts +32 -0
  46. package/dist/components/waka-video-overlay/index.d.ts +26 -0
  47. package/dist/index.cjs.js +251 -200
  48. package/dist/index.d.ts +1 -0
  49. package/dist/index.es.js +47315 -35823
  50. package/dist/utils/security.d.ts +96 -0
  51. package/package.json +4 -4
  52. package/src/blocks/apm-overview/index.tsx +672 -0
  53. package/src/blocks/cicd-builder/index.tsx +738 -0
  54. package/src/blocks/cloud-cost-dashboard/index.tsx +597 -0
  55. package/src/blocks/container-orchestrator/index.tsx +729 -0
  56. package/src/blocks/database-admin/index.tsx +679 -0
  57. package/src/blocks/gitops-sync-status/index.tsx +557 -0
  58. package/src/blocks/incident-manager/index.tsx +586 -0
  59. package/src/blocks/index.ts +119 -0
  60. package/src/blocks/infrastructure-map/index.tsx +638 -0
  61. package/src/blocks/on-call-schedule/index.tsx +615 -0
  62. package/src/blocks/release-notes/index.tsx +643 -0
  63. package/src/blocks/sidebar/index.tsx +6 -6
  64. package/src/components/DataTable/templates/index.tsx +3 -2
  65. package/src/components/index.ts +283 -0
  66. package/src/components/waka-3d-pie-chart/index.tsx +11 -11
  67. package/src/components/waka-achievement-unlock/index.tsx +16 -16
  68. package/src/components/waka-ad-banner/index.tsx +275 -0
  69. package/src/components/waka-ad-fallback/index.tsx +181 -0
  70. package/src/components/waka-ad-inline/index.tsx +103 -0
  71. package/src/components/waka-ad-interstitial/index.tsx +278 -0
  72. package/src/components/waka-ad-placeholder/index.tsx +84 -0
  73. package/src/components/waka-ad-provider/index.tsx +329 -0
  74. package/src/components/waka-ad-sidebar/index.tsx +113 -0
  75. package/src/components/waka-ad-sticky-footer/index.tsx +125 -0
  76. package/src/components/waka-alert-panel/index.tsx +493 -0
  77. package/src/components/waka-artifact-list/index.tsx +416 -0
  78. package/src/components/waka-badge-showcase/index.tsx +12 -11
  79. package/src/components/waka-build-matrix/index.tsx +396 -0
  80. package/src/components/waka-command-bar/index.tsx +2 -1
  81. package/src/components/waka-config-comparator/index.tsx +416 -0
  82. package/src/components/waka-container-list/index.tsx +475 -0
  83. package/src/components/waka-content-recommendation/index.tsx +294 -0
  84. package/src/components/waka-cost-breakdown/index.tsx +10 -10
  85. package/src/components/waka-database-card/index.tsx +473 -0
  86. package/src/components/waka-dependency-tree/index.tsx +542 -0
  87. package/src/components/waka-env-var-editor/index.tsx +417 -0
  88. package/src/components/waka-feature-flag-row/index.tsx +386 -0
  89. package/src/components/waka-funnel-chart/index.tsx +8 -8
  90. package/src/components/waka-health-pulse/index.tsx +6 -6
  91. package/src/components/waka-kubernetes-overview/index.tsx +536 -0
  92. package/src/components/waka-leaderboard/index.tsx +9 -9
  93. package/src/components/waka-log-viewer/index.tsx +386 -0
  94. package/src/components/waka-loot-box/index.tsx +20 -20
  95. package/src/components/waka-migration-list/index.tsx +487 -0
  96. package/src/components/waka-outstream-video/index.tsx +240 -0
  97. package/src/components/waka-player-card/index.tsx +5 -5
  98. package/src/components/waka-pod-card/index.tsx +528 -0
  99. package/src/components/waka-query-explain/index.tsx +657 -0
  100. package/src/components/waka-quota-bar/index.tsx +4 -4
  101. package/src/components/waka-radar-score/index.tsx +10 -10
  102. package/src/components/waka-scratch-card/index.tsx +5 -4
  103. package/src/components/waka-secret-card/index.tsx +371 -0
  104. package/src/components/waka-security-scan-result/index.tsx +473 -0
  105. package/src/components/waka-server-rack/index.tsx +28 -27
  106. package/src/components/waka-service-graph/index.tsx +445 -0
  107. package/src/components/waka-sponsored-badge/index.tsx +97 -0
  108. package/src/components/waka-sponsored-card/index.tsx +275 -0
  109. package/src/components/waka-sponsored-feed/index.tsx +127 -0
  110. package/src/components/waka-spotlight/index.tsx +2 -1
  111. package/src/components/waka-success-explosion/index.tsx +4 -4
  112. package/src/components/waka-test-report/index.tsx +469 -0
  113. package/src/components/waka-trace-viewer/index.tsx +490 -0
  114. package/src/components/waka-video-ad/index.tsx +406 -0
  115. package/src/components/waka-video-overlay/index.tsx +257 -0
  116. package/src/components/waka-xp-bar/index.tsx +13 -13
  117. package/src/styles/base.css +16 -0
  118. package/src/styles/tailwind.preset.js +12 -0
  119. package/src/styles/themes/forest.css +16 -0
  120. package/src/styles/themes/monochrome.css +16 -0
  121. package/src/styles/themes/perpetuity.css +16 -0
  122. package/src/styles/themes/sunset.css +16 -0
  123. package/src/styles/themes/twilight.css +16 -0
@@ -0,0 +1,386 @@
1
+ "use client"
2
+
3
+ import * as React from "react"
4
+ import { cn } from "../../utils/cn"
5
+ import { Button } from "../button"
6
+ import { Badge } from "../badge"
7
+ import { Switch } from "../switch"
8
+ import { Progress } from "../progress"
9
+ import { Input } from "../input"
10
+ import {
11
+ Tooltip,
12
+ TooltipContent,
13
+ TooltipProvider,
14
+ TooltipTrigger,
15
+ } from "../tooltip"
16
+ import {
17
+ DropdownMenu,
18
+ DropdownMenuContent,
19
+ DropdownMenuItem,
20
+ DropdownMenuSeparator,
21
+ DropdownMenuTrigger,
22
+ } from "../dropdown-menu"
23
+ import {
24
+ Flag,
25
+ MoreVertical,
26
+ Users,
27
+ Percent,
28
+ Calendar,
29
+ History,
30
+ Trash2,
31
+ Copy,
32
+ Edit,
33
+ Eye,
34
+ Clock,
35
+ Target,
36
+ } from "lucide-react"
37
+
38
+ export type FeatureFlagStatus = "enabled" | "disabled" | "percentage" | "segment"
39
+
40
+ export interface FeatureFlagSegment {
41
+ id: string
42
+ name: string
43
+ description?: string
44
+ }
45
+
46
+ export interface FeatureFlag {
47
+ id: string
48
+ key: string
49
+ name: string
50
+ description?: string
51
+ status: FeatureFlagStatus
52
+ enabled: boolean
53
+ percentage?: number
54
+ segments?: FeatureFlagSegment[]
55
+ createdAt: Date
56
+ updatedAt: Date
57
+ createdBy?: string
58
+ environment?: string
59
+ tags?: string[]
60
+ }
61
+
62
+ export interface WakaFeatureFlagRowProps {
63
+ /** Feature flag data */
64
+ flag: FeatureFlag
65
+ /** Callback when toggling the flag */
66
+ onToggle?: (enabled: boolean) => void
67
+ /** Callback when changing percentage */
68
+ onPercentageChange?: (percentage: number) => void
69
+ /** Callback when editing the flag */
70
+ onEdit?: () => void
71
+ /** Callback when deleting the flag */
72
+ onDelete?: () => void
73
+ /** Callback when viewing history */
74
+ onViewHistory?: () => void
75
+ /** Callback when duplicating the flag */
76
+ onDuplicate?: () => void
77
+ /** Read-only mode */
78
+ readOnly?: boolean
79
+ /** Compact mode */
80
+ compact?: boolean
81
+ /** Custom class name */
82
+ className?: string
83
+ }
84
+
85
+ const statusConfig: Record<FeatureFlagStatus, { label: string; color: string }> = {
86
+ enabled: { label: "Enabled", color: "bg-green-500" },
87
+ disabled: { label: "Disabled", color: "bg-gray-500" },
88
+ percentage: { label: "Percentage", color: "bg-blue-500" },
89
+ segment: { label: "Segment", color: "bg-purple-500" },
90
+ }
91
+
92
+ function formatDate(date: Date): string {
93
+ return date.toLocaleDateString("fr-FR", {
94
+ day: "2-digit",
95
+ month: "short",
96
+ })
97
+ }
98
+
99
+ export function WakaFeatureFlagRow({
100
+ flag,
101
+ onToggle,
102
+ onPercentageChange,
103
+ onEdit,
104
+ onDelete,
105
+ onViewHistory,
106
+ onDuplicate,
107
+ readOnly = false,
108
+ compact = false,
109
+ className,
110
+ }: WakaFeatureFlagRowProps) {
111
+ const [localPercentage, setLocalPercentage] = React.useState(flag.percentage || 0)
112
+ const statusConf = statusConfig[flag.status]
113
+
114
+ const handlePercentageChange = (value: string) => {
115
+ const num = Math.min(100, Math.max(0, parseInt(value) || 0))
116
+ setLocalPercentage(num)
117
+ }
118
+
119
+ const handlePercentageBlur = () => {
120
+ if (localPercentage !== flag.percentage) {
121
+ onPercentageChange?.(localPercentage)
122
+ }
123
+ }
124
+
125
+ if (compact) {
126
+ return (
127
+ <div
128
+ className={cn(
129
+ "flex items-center gap-3 p-2 border-b hover:bg-muted/30 transition-colors",
130
+ !flag.enabled && "opacity-60",
131
+ className
132
+ )}
133
+ >
134
+ <Flag className={cn("h-4 w-4 shrink-0", flag.enabled ? "text-green-500" : "text-muted-foreground")} />
135
+
136
+ <div className="flex-1 min-w-0">
137
+ <div className="flex items-center gap-2">
138
+ <code className="font-medium text-sm truncate">{flag.key}</code>
139
+ {flag.environment && (
140
+ <Badge variant="outline" className="text-xs">
141
+ {flag.environment}
142
+ </Badge>
143
+ )}
144
+ </div>
145
+ </div>
146
+
147
+ {flag.status === "percentage" && (
148
+ <Badge variant="secondary" className="text-xs">
149
+ <Percent className="h-3 w-3 mr-1" />
150
+ {flag.percentage}%
151
+ </Badge>
152
+ )}
153
+
154
+ {flag.status === "segment" && flag.segments && (
155
+ <Badge variant="secondary" className="text-xs">
156
+ <Users className="h-3 w-3 mr-1" />
157
+ {flag.segments.length}
158
+ </Badge>
159
+ )}
160
+
161
+ <Switch
162
+ checked={flag.enabled}
163
+ onCheckedChange={onToggle}
164
+ disabled={readOnly}
165
+ />
166
+ </div>
167
+ )
168
+ }
169
+
170
+ return (
171
+ <div
172
+ className={cn(
173
+ "border rounded-lg p-4 transition-all",
174
+ flag.enabled ? "bg-green-500/5 border-green-500/30" : "bg-muted/30",
175
+ className
176
+ )}
177
+ >
178
+ <div className="flex items-start gap-4">
179
+ {/* Flag icon */}
180
+ <div className={cn(
181
+ "w-10 h-10 rounded-lg flex items-center justify-center shrink-0",
182
+ flag.enabled ? "bg-green-500/20" : "bg-muted"
183
+ )}>
184
+ <Flag className={cn("h-5 w-5", flag.enabled ? "text-green-500" : "text-muted-foreground")} />
185
+ </div>
186
+
187
+ {/* Main content */}
188
+ <div className="flex-1 min-w-0">
189
+ <div className="flex items-center gap-2 flex-wrap">
190
+ <code className="font-semibold">{flag.key}</code>
191
+ <Badge className={cn("text-white text-xs", statusConf.color)}>
192
+ {statusConf.label}
193
+ </Badge>
194
+ {flag.environment && (
195
+ <Badge variant="outline" className="text-xs">
196
+ {flag.environment}
197
+ </Badge>
198
+ )}
199
+ {flag.tags?.map((tag) => (
200
+ <Badge key={tag} variant="secondary" className="text-xs">
201
+ {tag}
202
+ </Badge>
203
+ ))}
204
+ </div>
205
+
206
+ <div className="text-sm font-medium mt-1">{flag.name}</div>
207
+
208
+ {flag.description && (
209
+ <p className="text-sm text-muted-foreground mt-1">{flag.description}</p>
210
+ )}
211
+
212
+ {/* Status-specific controls */}
213
+ {flag.status === "percentage" && (
214
+ <div className="mt-3 space-y-2">
215
+ <div className="flex items-center gap-3">
216
+ <Percent className="h-4 w-4 text-muted-foreground" />
217
+ <div className="flex-1 max-w-xs">
218
+ <Progress value={localPercentage} className="h-2" />
219
+ </div>
220
+ <div className="flex items-center gap-1">
221
+ <Input
222
+ type="number"
223
+ min={0}
224
+ max={100}
225
+ value={localPercentage}
226
+ onChange={(e) => handlePercentageChange(e.target.value)}
227
+ onBlur={handlePercentageBlur}
228
+ className="w-16 h-8 text-center"
229
+ disabled={readOnly}
230
+ />
231
+ <span className="text-sm text-muted-foreground">%</span>
232
+ </div>
233
+ </div>
234
+ <p className="text-xs text-muted-foreground">
235
+ {localPercentage}% of users will see this feature
236
+ </p>
237
+ </div>
238
+ )}
239
+
240
+ {flag.status === "segment" && flag.segments && flag.segments.length > 0 && (
241
+ <div className="mt-3">
242
+ <div className="flex items-center gap-2 text-sm text-muted-foreground mb-2">
243
+ <Target className="h-4 w-4" />
244
+ Targeting {flag.segments.length} segment{flag.segments.length > 1 ? "s" : ""}
245
+ </div>
246
+ <div className="flex flex-wrap gap-2">
247
+ {flag.segments.map((segment) => (
248
+ <TooltipProvider key={segment.id}>
249
+ <Tooltip>
250
+ <TooltipTrigger>
251
+ <Badge variant="secondary" className="text-xs">
252
+ <Users className="h-3 w-3 mr-1" />
253
+ {segment.name}
254
+ </Badge>
255
+ </TooltipTrigger>
256
+ {segment.description && (
257
+ <TooltipContent>{segment.description}</TooltipContent>
258
+ )}
259
+ </Tooltip>
260
+ </TooltipProvider>
261
+ ))}
262
+ </div>
263
+ </div>
264
+ )}
265
+
266
+ {/* Metadata */}
267
+ <div className="flex items-center gap-4 mt-3 text-xs text-muted-foreground">
268
+ <span className="flex items-center gap-1">
269
+ <Calendar className="h-3 w-3" />
270
+ Created {formatDate(flag.createdAt)}
271
+ {flag.createdBy && ` by ${flag.createdBy}`}
272
+ </span>
273
+ <span className="flex items-center gap-1">
274
+ <Clock className="h-3 w-3" />
275
+ Updated {formatDate(flag.updatedAt)}
276
+ </span>
277
+ </div>
278
+ </div>
279
+
280
+ {/* Toggle and actions */}
281
+ <div className="flex items-center gap-2 shrink-0">
282
+ <Switch
283
+ checked={flag.enabled}
284
+ onCheckedChange={onToggle}
285
+ disabled={readOnly}
286
+ />
287
+
288
+ <DropdownMenu>
289
+ <DropdownMenuTrigger asChild>
290
+ <Button variant="ghost" size="sm" className="h-8 w-8 p-0">
291
+ <MoreVertical className="h-4 w-4" />
292
+ </Button>
293
+ </DropdownMenuTrigger>
294
+ <DropdownMenuContent align="end">
295
+ {onEdit && (
296
+ <DropdownMenuItem onClick={onEdit}>
297
+ <Edit className="h-4 w-4 mr-2" />
298
+ Edit
299
+ </DropdownMenuItem>
300
+ )}
301
+ {onViewHistory && (
302
+ <DropdownMenuItem onClick={onViewHistory}>
303
+ <History className="h-4 w-4 mr-2" />
304
+ View History
305
+ </DropdownMenuItem>
306
+ )}
307
+ {onDuplicate && (
308
+ <DropdownMenuItem onClick={onDuplicate}>
309
+ <Copy className="h-4 w-4 mr-2" />
310
+ Duplicate
311
+ </DropdownMenuItem>
312
+ )}
313
+ {onDelete && (
314
+ <>
315
+ <DropdownMenuSeparator />
316
+ <DropdownMenuItem onClick={onDelete} className="text-destructive">
317
+ <Trash2 className="h-4 w-4 mr-2" />
318
+ Delete
319
+ </DropdownMenuItem>
320
+ </>
321
+ )}
322
+ </DropdownMenuContent>
323
+ </DropdownMenu>
324
+ </div>
325
+ </div>
326
+ </div>
327
+ )
328
+ }
329
+
330
+ // Default sample feature flags for demo
331
+ export const defaultFeatureFlags: FeatureFlag[] = [
332
+ {
333
+ id: "1",
334
+ key: "new_checkout_flow",
335
+ name: "New Checkout Flow",
336
+ description: "Enable the redesigned checkout experience with improved UX",
337
+ status: "percentage",
338
+ enabled: true,
339
+ percentage: 25,
340
+ createdAt: new Date(Date.now() - 30 * 24 * 3600000),
341
+ updatedAt: new Date(Date.now() - 2 * 24 * 3600000),
342
+ createdBy: "product-team",
343
+ environment: "production",
344
+ tags: ["checkout", "experiment"],
345
+ },
346
+ {
347
+ id: "2",
348
+ key: "dark_mode_v2",
349
+ name: "Dark Mode V2",
350
+ description: "Updated dark mode with better contrast and accessibility",
351
+ status: "enabled",
352
+ enabled: true,
353
+ createdAt: new Date(Date.now() - 60 * 24 * 3600000),
354
+ updatedAt: new Date(Date.now() - 7 * 24 * 3600000),
355
+ environment: "production",
356
+ tags: ["ui", "accessibility"],
357
+ },
358
+ {
359
+ id: "3",
360
+ key: "beta_features",
361
+ name: "Beta Features Access",
362
+ description: "Allow access to beta features for selected user segments",
363
+ status: "segment",
364
+ enabled: true,
365
+ segments: [
366
+ { id: "s1", name: "Beta Testers", description: "Users who opted into beta program" },
367
+ { id: "s2", name: "Premium Users", description: "Users with premium subscription" },
368
+ ],
369
+ createdAt: new Date(Date.now() - 90 * 24 * 3600000),
370
+ updatedAt: new Date(Date.now() - 1 * 24 * 3600000),
371
+ createdBy: "engineering",
372
+ environment: "production",
373
+ },
374
+ {
375
+ id: "4",
376
+ key: "legacy_api",
377
+ name: "Legacy API Support",
378
+ description: "Maintain backward compatibility with v1 API",
379
+ status: "disabled",
380
+ enabled: false,
381
+ createdAt: new Date(Date.now() - 180 * 24 * 3600000),
382
+ updatedAt: new Date(Date.now() - 14 * 24 * 3600000),
383
+ environment: "production",
384
+ tags: ["deprecated"],
385
+ },
386
+ ]
@@ -193,14 +193,14 @@ function formatValue(
193
193
  // ============================================================================
194
194
 
195
195
  const defaultColors = [
196
- "#3b82f6", // blue-500
197
- "#6366f1", // indigo-500
198
- "#8b5cf6", // violet-500
199
- "#a855f7", // purple-500
200
- "#d946ef", // fuchsia-500
201
- "#ec4899", // pink-500
202
- "#f43f5e", // rose-500
203
- "#ef4444", // red-500
196
+ "hsl(var(--chart-1))",
197
+ "hsl(var(--chart-2))",
198
+ "hsl(var(--chart-3))",
199
+ "hsl(var(--chart-4))",
200
+ "hsl(var(--chart-5))",
201
+ "hsl(var(--primary))",
202
+ "hsl(var(--info))",
203
+ "hsl(var(--destructive))",
204
204
  ]
205
205
 
206
206
  function getStageColor(index: number, stage: FunnelStage): string {
@@ -33,15 +33,15 @@ export interface WakaHealthPulseProps {
33
33
  }
34
34
 
35
35
  // ============================================
36
- // DEFAULT COLORS
36
+ // DEFAULT COLORS (using CSS variables for theme support)
37
37
  // ============================================
38
38
 
39
39
  const defaultColors: Record<HealthStatus, string> = {
40
- healthy: "#22c55e",
41
- warning: "#eab308",
42
- critical: "#ef4444",
43
- down: "#6b7280",
44
- unknown: "#a855f7",
40
+ healthy: "hsl(var(--success))",
41
+ warning: "hsl(var(--warning))",
42
+ critical: "hsl(var(--destructive))",
43
+ down: "hsl(var(--muted-foreground))",
44
+ unknown: "hsl(var(--chart-3))",
45
45
  }
46
46
 
47
47
  // ============================================