@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.
- package/dist/blocks/apm-overview/index.d.ts +58 -0
- package/dist/blocks/cicd-builder/index.d.ts +47 -0
- package/dist/blocks/cloud-cost-dashboard/index.d.ts +49 -0
- package/dist/blocks/container-orchestrator/index.d.ts +63 -0
- package/dist/blocks/database-admin/index.d.ts +84 -0
- package/dist/blocks/gitops-sync-status/index.d.ts +45 -0
- package/dist/blocks/incident-manager/index.d.ts +44 -0
- package/dist/blocks/index.d.ts +10 -0
- package/dist/blocks/infrastructure-map/index.d.ts +32 -0
- package/dist/blocks/on-call-schedule/index.d.ts +43 -0
- package/dist/blocks/release-notes/index.d.ts +49 -0
- package/dist/components/index.d.ts +34 -0
- package/dist/components/waka-ad-banner/index.d.ts +36 -0
- package/dist/components/waka-ad-fallback/index.d.ts +33 -0
- package/dist/components/waka-ad-inline/index.d.ts +15 -0
- package/dist/components/waka-ad-interstitial/index.d.ts +26 -0
- package/dist/components/waka-ad-placeholder/index.d.ts +17 -0
- package/dist/components/waka-ad-provider/index.d.ts +103 -0
- package/dist/components/waka-ad-sidebar/index.d.ts +18 -0
- package/dist/components/waka-ad-sticky-footer/index.d.ts +17 -0
- package/dist/components/waka-alert-panel/index.d.ts +45 -0
- package/dist/components/waka-artifact-list/index.d.ts +32 -0
- package/dist/components/waka-build-matrix/index.d.ts +36 -0
- package/dist/components/waka-config-comparator/index.d.ts +37 -0
- package/dist/components/waka-container-list/index.d.ts +51 -0
- package/dist/components/waka-content-recommendation/index.d.ts +23 -0
- package/dist/components/waka-database-card/index.d.ts +46 -0
- package/dist/components/waka-dependency-tree/index.d.ts +38 -0
- package/dist/components/waka-env-var-editor/index.d.ts +30 -0
- package/dist/components/waka-feature-flag-row/index.d.ts +45 -0
- package/dist/components/waka-kubernetes-overview/index.d.ts +98 -0
- package/dist/components/waka-log-viewer/index.d.ts +38 -0
- package/dist/components/waka-migration-list/index.d.ts +36 -0
- package/dist/components/waka-outstream-video/index.d.ts +24 -0
- package/dist/components/waka-pod-card/index.d.ts +73 -0
- package/dist/components/waka-query-explain/index.d.ts +48 -0
- package/dist/components/waka-secret-card/index.d.ts +43 -0
- package/dist/components/waka-security-scan-result/index.d.ts +45 -0
- package/dist/components/waka-service-graph/index.d.ts +44 -0
- package/dist/components/waka-sponsored-badge/index.d.ts +20 -0
- package/dist/components/waka-sponsored-card/index.d.ts +25 -0
- package/dist/components/waka-sponsored-feed/index.d.ts +31 -0
- package/dist/components/waka-test-report/index.d.ts +60 -0
- package/dist/components/waka-trace-viewer/index.d.ts +36 -0
- package/dist/components/waka-video-ad/index.d.ts +32 -0
- package/dist/components/waka-video-overlay/index.d.ts +26 -0
- package/dist/index.cjs.js +251 -200
- package/dist/index.d.ts +1 -0
- package/dist/index.es.js +47315 -35823
- package/dist/utils/security.d.ts +96 -0
- package/package.json +4 -4
- package/src/blocks/apm-overview/index.tsx +672 -0
- package/src/blocks/cicd-builder/index.tsx +738 -0
- package/src/blocks/cloud-cost-dashboard/index.tsx +597 -0
- package/src/blocks/container-orchestrator/index.tsx +729 -0
- package/src/blocks/database-admin/index.tsx +679 -0
- package/src/blocks/gitops-sync-status/index.tsx +557 -0
- package/src/blocks/incident-manager/index.tsx +586 -0
- package/src/blocks/index.ts +119 -0
- package/src/blocks/infrastructure-map/index.tsx +638 -0
- package/src/blocks/on-call-schedule/index.tsx +615 -0
- package/src/blocks/release-notes/index.tsx +643 -0
- package/src/blocks/sidebar/index.tsx +6 -6
- package/src/components/DataTable/templates/index.tsx +3 -2
- package/src/components/index.ts +283 -0
- package/src/components/waka-3d-pie-chart/index.tsx +11 -11
- package/src/components/waka-achievement-unlock/index.tsx +16 -16
- package/src/components/waka-ad-banner/index.tsx +275 -0
- package/src/components/waka-ad-fallback/index.tsx +181 -0
- package/src/components/waka-ad-inline/index.tsx +103 -0
- package/src/components/waka-ad-interstitial/index.tsx +278 -0
- package/src/components/waka-ad-placeholder/index.tsx +84 -0
- package/src/components/waka-ad-provider/index.tsx +329 -0
- package/src/components/waka-ad-sidebar/index.tsx +113 -0
- package/src/components/waka-ad-sticky-footer/index.tsx +125 -0
- package/src/components/waka-alert-panel/index.tsx +493 -0
- package/src/components/waka-artifact-list/index.tsx +416 -0
- package/src/components/waka-badge-showcase/index.tsx +12 -11
- package/src/components/waka-build-matrix/index.tsx +396 -0
- package/src/components/waka-command-bar/index.tsx +2 -1
- package/src/components/waka-config-comparator/index.tsx +416 -0
- package/src/components/waka-container-list/index.tsx +475 -0
- package/src/components/waka-content-recommendation/index.tsx +294 -0
- package/src/components/waka-cost-breakdown/index.tsx +10 -10
- package/src/components/waka-database-card/index.tsx +473 -0
- package/src/components/waka-dependency-tree/index.tsx +542 -0
- package/src/components/waka-env-var-editor/index.tsx +417 -0
- package/src/components/waka-feature-flag-row/index.tsx +386 -0
- package/src/components/waka-funnel-chart/index.tsx +8 -8
- package/src/components/waka-health-pulse/index.tsx +6 -6
- package/src/components/waka-kubernetes-overview/index.tsx +536 -0
- package/src/components/waka-leaderboard/index.tsx +9 -9
- package/src/components/waka-log-viewer/index.tsx +386 -0
- package/src/components/waka-loot-box/index.tsx +20 -20
- package/src/components/waka-migration-list/index.tsx +487 -0
- package/src/components/waka-outstream-video/index.tsx +240 -0
- package/src/components/waka-player-card/index.tsx +5 -5
- package/src/components/waka-pod-card/index.tsx +528 -0
- package/src/components/waka-query-explain/index.tsx +657 -0
- package/src/components/waka-quota-bar/index.tsx +4 -4
- package/src/components/waka-radar-score/index.tsx +10 -10
- package/src/components/waka-scratch-card/index.tsx +5 -4
- package/src/components/waka-secret-card/index.tsx +371 -0
- package/src/components/waka-security-scan-result/index.tsx +473 -0
- package/src/components/waka-server-rack/index.tsx +28 -27
- package/src/components/waka-service-graph/index.tsx +445 -0
- package/src/components/waka-sponsored-badge/index.tsx +97 -0
- package/src/components/waka-sponsored-card/index.tsx +275 -0
- package/src/components/waka-sponsored-feed/index.tsx +127 -0
- package/src/components/waka-spotlight/index.tsx +2 -1
- package/src/components/waka-success-explosion/index.tsx +4 -4
- package/src/components/waka-test-report/index.tsx +469 -0
- package/src/components/waka-trace-viewer/index.tsx +490 -0
- package/src/components/waka-video-ad/index.tsx +406 -0
- package/src/components/waka-video-overlay/index.tsx +257 -0
- package/src/components/waka-xp-bar/index.tsx +13 -13
- package/src/styles/base.css +16 -0
- package/src/styles/tailwind.preset.js +12 -0
- package/src/styles/themes/forest.css +16 -0
- package/src/styles/themes/monochrome.css +16 -0
- package/src/styles/themes/perpetuity.css +16 -0
- package/src/styles/themes/sunset.css +16 -0
- 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
|
-
"
|
|
197
|
-
"
|
|
198
|
-
"
|
|
199
|
-
"
|
|
200
|
-
"
|
|
201
|
-
"
|
|
202
|
-
"
|
|
203
|
-
"
|
|
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: "
|
|
41
|
-
warning: "
|
|
42
|
-
critical: "
|
|
43
|
-
down: "
|
|
44
|
-
unknown: "
|
|
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
|
// ============================================
|