@geekmidas/ui 1.0.2 → 10.0.0-alpha.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 (106) hide show
  1. package/dist/button-BB4n8b0z.mjs +46 -0
  2. package/dist/button-BB4n8b0z.mjs.map +1 -0
  3. package/dist/button-BSp9VyHi.cjs +58 -0
  4. package/dist/button-BSp9VyHi.cjs.map +1 -0
  5. package/dist/chunk-CUT6urMc.cjs +30 -0
  6. package/dist/components/data-display/index.cjs +27 -0
  7. package/dist/components/data-display/index.d.cts +2 -0
  8. package/dist/components/data-display/index.d.mts +2 -0
  9. package/dist/components/data-display/index.mjs +6 -0
  10. package/dist/components/feedback/index.cjs +26 -0
  11. package/dist/components/feedback/index.d.cts +2 -0
  12. package/dist/components/feedback/index.d.mts +2 -0
  13. package/dist/components/feedback/index.mjs +6 -0
  14. package/dist/components/layout/index.cjs +26 -0
  15. package/dist/components/layout/index.d.cts +2 -0
  16. package/dist/components/layout/index.d.mts +2 -0
  17. package/dist/components/layout/index.mjs +6 -0
  18. package/dist/components/ui/index.cjs +73 -0
  19. package/dist/components/ui/index.d.cts +2 -0
  20. package/dist/components/ui/index.d.mts +2 -0
  21. package/dist/components/ui/index.mjs +7 -0
  22. package/dist/data-display-BSUj4rIc.cjs +1318 -0
  23. package/dist/data-display-BSUj4rIc.cjs.map +1 -0
  24. package/dist/data-display-IcuThGEY.mjs +1186 -0
  25. package/dist/data-display-IcuThGEY.mjs.map +1 -0
  26. package/dist/feedback-B9rTsQdJ.cjs +505 -0
  27. package/dist/feedback-B9rTsQdJ.cjs.map +1 -0
  28. package/dist/feedback-DBLrs44v.mjs +379 -0
  29. package/dist/feedback-DBLrs44v.mjs.map +1 -0
  30. package/dist/hooks/index.cjs +1 -1
  31. package/dist/hooks/index.d.cts +1 -1
  32. package/dist/hooks/index.d.mts +1 -1
  33. package/dist/hooks/index.mjs +1 -1
  34. package/dist/{hooks-DuxmSO-h.cjs → hooks-C5O7RXTd.cjs} +3 -31
  35. package/dist/{hooks-DuxmSO-h.cjs.map → hooks-C5O7RXTd.cjs.map} +1 -1
  36. package/dist/{hooks-DBc-Cw9X.mjs → hooks-Dhkovxbo.mjs} +1 -1
  37. package/dist/{hooks-DBc-Cw9X.mjs.map → hooks-Dhkovxbo.mjs.map} +1 -1
  38. package/dist/index-B-vz6Li7.d.cts +102 -0
  39. package/dist/index-B-vz6Li7.d.cts.map +1 -0
  40. package/dist/index-CBBJ6vmK.d.cts +154 -0
  41. package/dist/index-CBBJ6vmK.d.cts.map +1 -0
  42. package/dist/index-CQFi0S-z.d.mts +154 -0
  43. package/dist/index-CQFi0S-z.d.mts.map +1 -0
  44. package/dist/index-D9EfJUyV.d.mts +102 -0
  45. package/dist/index-D9EfJUyV.d.mts.map +1 -0
  46. package/dist/{index-DmtSyJ1q.d.mts → index-DTIa7Ryw.d.cts} +1 -1
  47. package/dist/{index-DmtSyJ1q.d.mts.map → index-DTIa7Ryw.d.cts.map} +1 -1
  48. package/dist/{index-QNnnyGjB.d.cts → index-DvzSne29.d.mts} +1 -1
  49. package/dist/{index-QNnnyGjB.d.cts.map → index-DvzSne29.d.mts.map} +1 -1
  50. package/dist/index-H_bu5hU-.d.cts +329 -0
  51. package/dist/index-H_bu5hU-.d.cts.map +1 -0
  52. package/dist/index-MRiOaWmK.d.mts +329 -0
  53. package/dist/index-MRiOaWmK.d.mts.map +1 -0
  54. package/dist/index-X9DzrZ1v.d.cts +153 -0
  55. package/dist/index-X9DzrZ1v.d.cts.map +1 -0
  56. package/dist/index-jAsoga-e.d.mts +153 -0
  57. package/dist/index-jAsoga-e.d.mts.map +1 -0
  58. package/dist/index.cjs +144 -2560
  59. package/dist/index.d.cts +8 -727
  60. package/dist/index.d.mts +8 -727
  61. package/dist/index.mjs +12 -2428
  62. package/dist/layout-CIIQOb1x.mjs +387 -0
  63. package/dist/layout-CIIQOb1x.mjs.map +1 -0
  64. package/dist/layout-CcO0svmw.cjs +513 -0
  65. package/dist/layout-CcO0svmw.cjs.map +1 -0
  66. package/dist/lib/utils.cjs +3 -0
  67. package/dist/lib/utils.d.cts +2 -0
  68. package/dist/lib/utils.d.mts +2 -0
  69. package/dist/lib/utils.mjs +3 -0
  70. package/dist/styles/theme.cjs +1 -1
  71. package/dist/styles/theme.d.cts +1 -1
  72. package/dist/styles/theme.d.mts +1 -1
  73. package/dist/styles/theme.mjs +1 -1
  74. package/dist/table-CrFSBSDe.mjs +129 -0
  75. package/dist/table-CrFSBSDe.mjs.map +1 -0
  76. package/dist/table-DNX6iqH5.cjs +237 -0
  77. package/dist/table-DNX6iqH5.cjs.map +1 -0
  78. package/dist/{theme-BRGSS8qx.cjs → theme-BBoDSysS.cjs} +1 -1
  79. package/dist/{theme-BRGSS8qx.cjs.map → theme-BBoDSysS.cjs.map} +1 -1
  80. package/dist/{theme-vpDwDfcR.d.mts → theme-BsXPj5m4.d.cts} +1 -1
  81. package/dist/{theme-B5mGkTlU.d.cts.map → theme-BsXPj5m4.d.cts.map} +1 -1
  82. package/dist/{theme-DAiFBbyM.mjs → theme-DI0sgbjj.mjs} +1 -1
  83. package/dist/{theme-DAiFBbyM.mjs.map → theme-DI0sgbjj.mjs.map} +1 -1
  84. package/dist/{theme-B5mGkTlU.d.cts → theme-aIIK_kn9.d.mts} +1 -1
  85. package/dist/{theme-vpDwDfcR.d.mts.map → theme-aIIK_kn9.d.mts.map} +1 -1
  86. package/dist/tooltip-BuTZvLTX.cjs +82 -0
  87. package/dist/tooltip-BuTZvLTX.cjs.map +1 -0
  88. package/dist/tooltip-z8o59BXq.mjs +46 -0
  89. package/dist/tooltip-z8o59BXq.mjs.map +1 -0
  90. package/dist/ui-B6Pj_ZAW.mjs +296 -0
  91. package/dist/ui-B6Pj_ZAW.mjs.map +1 -0
  92. package/dist/ui-PFNfvwdv.cjs +542 -0
  93. package/dist/ui-PFNfvwdv.cjs.map +1 -0
  94. package/dist/utils-0J5jzmnT.mjs +11 -0
  95. package/dist/utils-0J5jzmnT.mjs.map +1 -0
  96. package/dist/utils-3XfDEz8-.d.cts +9 -0
  97. package/dist/utils-3XfDEz8-.d.cts.map +1 -0
  98. package/dist/utils-CgSGIxhd.d.mts +9 -0
  99. package/dist/utils-CgSGIxhd.d.mts.map +1 -0
  100. package/dist/utils-DTuzb7hO.cjs +17 -0
  101. package/dist/utils-DTuzb7hO.cjs.map +1 -0
  102. package/package.json +1 -1
  103. package/dist/index.cjs.map +0 -1
  104. package/dist/index.d.cts.map +0 -1
  105. package/dist/index.d.mts.map +0 -1
  106. package/dist/index.mjs.map +0 -1
@@ -0,0 +1,1318 @@
1
+ const require_chunk = require('./chunk-CUT6urMc.cjs');
2
+ const require_utils = require('./utils-DTuzb7hO.cjs');
3
+ const require_button = require('./button-BSp9VyHi.cjs');
4
+ const require_table = require('./table-DNX6iqH5.cjs');
5
+ const date_fns = require_chunk.__toESM(require("date-fns"));
6
+ const recharts = require_chunk.__toESM(require("recharts"));
7
+ const react_jsx_runtime = require_chunk.__toESM(require("react/jsx-runtime"));
8
+ const lucide_react = require_chunk.__toESM(require("lucide-react"));
9
+ const react = require_chunk.__toESM(require("react"));
10
+ const class_variance_authority = require_chunk.__toESM(require("class-variance-authority"));
11
+
12
+ //#region src/components/data-display/charts/area-time-series-chart.tsx
13
+ const COLOR_MAP = {
14
+ blue: "hsl(217, 91%, 60%)",
15
+ red: "hsl(0, 84%, 60%)",
16
+ green: "hsl(142, 71%, 45%)",
17
+ amber: "hsl(38, 92%, 50%)",
18
+ purple: "hsl(263, 70%, 50%)"
19
+ };
20
+ function AreaTimeSeriesChart({ data, primaryLabel = "Value", secondaryLabel, primaryColor = "blue", secondaryColor = "red", timeFormat = "HH:mm", valueFormatter = (v) => v.toLocaleString(), className, showLegend }) {
21
+ if (data.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
22
+ className: "h-48 flex items-center justify-center text-sm text-muted-foreground",
23
+ children: "No data available"
24
+ });
25
+ const hasSecondary = secondaryLabel && data.some((p) => p.secondaryValue !== void 0);
26
+ const chartData = data.map((point) => ({
27
+ time: (0, date_fns.format)(new Date(point.timestamp), timeFormat),
28
+ timestamp: point.timestamp,
29
+ [primaryLabel]: point.value,
30
+ ...hasSecondary && secondaryLabel ? { [secondaryLabel]: point.secondaryValue ?? 0 } : {}
31
+ }));
32
+ const primaryColorValue = COLOR_MAP[primaryColor] ?? primaryColor;
33
+ const secondaryColorValue = COLOR_MAP[secondaryColor] ?? secondaryColor;
34
+ const shouldShowLegend = showLegend ?? hasSecondary;
35
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
36
+ className: require_utils.cn("h-48", className),
37
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.ResponsiveContainer, {
38
+ width: "100%",
39
+ height: "100%",
40
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(recharts.AreaChart, {
41
+ data: chartData,
42
+ children: [
43
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("defs", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("linearGradient", {
44
+ id: "primaryGradient",
45
+ x1: "0",
46
+ y1: "0",
47
+ x2: "0",
48
+ y2: "1",
49
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("stop", {
50
+ offset: "5%",
51
+ stopColor: primaryColorValue,
52
+ stopOpacity: .3
53
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("stop", {
54
+ offset: "95%",
55
+ stopColor: primaryColorValue,
56
+ stopOpacity: 0
57
+ })]
58
+ }), hasSecondary && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("linearGradient", {
59
+ id: "secondaryGradient",
60
+ x1: "0",
61
+ y1: "0",
62
+ x2: "0",
63
+ y2: "1",
64
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("stop", {
65
+ offset: "5%",
66
+ stopColor: secondaryColorValue,
67
+ stopOpacity: .3
68
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("stop", {
69
+ offset: "95%",
70
+ stopColor: secondaryColorValue,
71
+ stopOpacity: 0
72
+ })]
73
+ })] }),
74
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.XAxis, {
75
+ dataKey: "time",
76
+ tick: {
77
+ fill: "hsl(var(--muted-foreground))",
78
+ fontSize: 12
79
+ },
80
+ axisLine: false,
81
+ tickLine: false
82
+ }),
83
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.YAxis, {
84
+ tick: {
85
+ fill: "hsl(var(--muted-foreground))",
86
+ fontSize: 12
87
+ },
88
+ axisLine: false,
89
+ tickLine: false,
90
+ tickFormatter: valueFormatter,
91
+ width: 50
92
+ }),
93
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Tooltip, { content: ({ active, payload, label }) => {
94
+ if (!active || !payload?.length) return null;
95
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
96
+ className: "rounded-lg border bg-popover px-3 py-2 text-sm shadow-md",
97
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
98
+ className: "font-medium mb-1",
99
+ children: label
100
+ }), payload.map((entry, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
101
+ className: "flex items-center gap-2 text-muted-foreground",
102
+ children: [
103
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
104
+ className: "w-2 h-2 rounded-full",
105
+ style: { backgroundColor: entry.color }
106
+ }),
107
+ entry.name,
108
+ ": ",
109
+ valueFormatter(entry.value)
110
+ ]
111
+ }, index))]
112
+ });
113
+ } }),
114
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Area, {
115
+ type: "monotone",
116
+ dataKey: primaryLabel,
117
+ stroke: primaryColorValue,
118
+ fill: "url(#primaryGradient)",
119
+ strokeWidth: 2
120
+ }),
121
+ hasSecondary && secondaryLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Area, {
122
+ type: "monotone",
123
+ dataKey: secondaryLabel,
124
+ stroke: secondaryColorValue,
125
+ fill: "url(#secondaryGradient)",
126
+ strokeWidth: 2
127
+ })
128
+ ]
129
+ })
130
+ }), shouldShowLegend && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
131
+ className: "flex justify-center gap-4 mt-2",
132
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
133
+ className: "flex items-center gap-2 text-xs",
134
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
135
+ className: "w-3 h-3 rounded-full",
136
+ style: { backgroundColor: primaryColorValue }
137
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
138
+ className: "text-muted-foreground",
139
+ children: primaryLabel
140
+ })]
141
+ }), hasSecondary && secondaryLabel && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
142
+ className: "flex items-center gap-2 text-xs",
143
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
144
+ className: "w-3 h-3 rounded-full",
145
+ style: { backgroundColor: secondaryColorValue }
146
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
147
+ className: "text-muted-foreground",
148
+ children: secondaryLabel
149
+ })]
150
+ })]
151
+ })]
152
+ });
153
+ }
154
+
155
+ //#endregion
156
+ //#region src/components/data-display/charts/bar-list-chart.tsx
157
+ function BarListChart({ data, valueFormatter = (v) => v.toLocaleString(), onItemClick, className, emptyMessage = "No data available", color = "hsl(217, 91%, 60%)" }) {
158
+ if (data.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
159
+ className: "h-48 flex items-center justify-center text-sm text-muted-foreground",
160
+ children: emptyMessage
161
+ });
162
+ const maxValue = Math.max(...data.map((d) => d.value));
163
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
164
+ className: require_utils.cn("space-y-3", className),
165
+ children: data.map((item, index) => {
166
+ const percentage = maxValue > 0 ? item.value / maxValue * 100 : 0;
167
+ const isClickable = !!onItemClick;
168
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
169
+ className: require_utils.cn("group", isClickable && "cursor-pointer"),
170
+ onClick: () => onItemClick?.(item),
171
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
172
+ className: "flex items-center justify-between mb-1",
173
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
174
+ className: require_utils.cn("text-sm truncate flex-1 mr-4", isClickable && "group-hover:text-foreground"),
175
+ children: item.name
176
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
177
+ className: "text-sm font-medium tabular-nums",
178
+ children: valueFormatter(item.value)
179
+ })]
180
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
181
+ className: "h-2 bg-muted rounded-full overflow-hidden",
182
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
183
+ className: require_utils.cn("h-full rounded-full transition-all duration-300", isClickable && "group-hover:opacity-80"),
184
+ style: {
185
+ width: `${percentage}%`,
186
+ backgroundColor: color
187
+ }
188
+ })
189
+ })]
190
+ }, index);
191
+ })
192
+ });
193
+ }
194
+
195
+ //#endregion
196
+ //#region src/components/data-display/charts/latency-percentiles-chart.tsx
197
+ function defaultFormatDuration(ms) {
198
+ if (ms < 1) return "<1ms";
199
+ if (ms < 1e3) return `${Math.round(ms)}ms`;
200
+ return `${(ms / 1e3).toFixed(2)}s`;
201
+ }
202
+ const PERCENTILE_COLORS = {
203
+ p50: "hsl(217, 91%, 60%)",
204
+ p95: "hsl(38, 92%, 50%)",
205
+ p99: "hsl(0, 84%, 60%)"
206
+ };
207
+ function LatencyPercentilesChart({ p50, p95, p99, className, valueFormatter = defaultFormatDuration }) {
208
+ const chartData = [
209
+ {
210
+ name: "p50",
211
+ label: "p50 (Median)",
212
+ value: p50,
213
+ color: PERCENTILE_COLORS.p50
214
+ },
215
+ {
216
+ name: "p95",
217
+ label: "p95",
218
+ value: p95,
219
+ color: PERCENTILE_COLORS.p95
220
+ },
221
+ {
222
+ name: "p99",
223
+ label: "p99",
224
+ value: p99,
225
+ color: PERCENTILE_COLORS.p99
226
+ }
227
+ ];
228
+ if (p99 === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
229
+ className: "h-48 flex items-center justify-center text-sm text-muted-foreground",
230
+ children: "No data available"
231
+ });
232
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
233
+ className: require_utils.cn("h-48", className),
234
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.ResponsiveContainer, {
235
+ width: "100%",
236
+ height: "100%",
237
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(recharts.BarChart, {
238
+ data: chartData,
239
+ layout: "vertical",
240
+ barSize: 20,
241
+ children: [
242
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.XAxis, {
243
+ type: "number",
244
+ tickFormatter: valueFormatter,
245
+ tick: {
246
+ fill: "hsl(var(--muted-foreground))",
247
+ fontSize: 12
248
+ },
249
+ axisLine: false,
250
+ tickLine: false
251
+ }),
252
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.YAxis, {
253
+ type: "category",
254
+ dataKey: "label",
255
+ width: 90,
256
+ tick: {
257
+ fill: "hsl(var(--muted-foreground))",
258
+ fontSize: 12
259
+ },
260
+ axisLine: false,
261
+ tickLine: false
262
+ }),
263
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Tooltip, { content: ({ active, payload }) => {
264
+ if (!active || !payload?.length) return null;
265
+ const item = payload[0]?.payload;
266
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
267
+ className: "rounded-lg border bg-popover px-3 py-2 text-sm shadow-md",
268
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
269
+ className: "font-medium",
270
+ children: item.label
271
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
272
+ className: "text-muted-foreground",
273
+ children: valueFormatter(item.value)
274
+ })]
275
+ });
276
+ } }),
277
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Bar, {
278
+ dataKey: "value",
279
+ radius: [
280
+ 0,
281
+ 4,
282
+ 4,
283
+ 0
284
+ ],
285
+ children: chartData.map((entry, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Cell, { fill: entry.color }, `cell-${index}`))
286
+ })
287
+ ]
288
+ })
289
+ })
290
+ });
291
+ }
292
+
293
+ //#endregion
294
+ //#region src/components/data-display/charts/status-distribution-chart.tsx
295
+ const STATUS_CONFIG = {
296
+ "2xx": {
297
+ label: "2xx Success",
298
+ color: "hsl(142, 71%, 45%)"
299
+ },
300
+ "3xx": {
301
+ label: "3xx Redirect",
302
+ color: "hsl(217, 91%, 60%)"
303
+ },
304
+ "4xx": {
305
+ label: "4xx Client Error",
306
+ color: "hsl(38, 92%, 50%)"
307
+ },
308
+ "5xx": {
309
+ label: "5xx Server Error",
310
+ color: "hsl(0, 84%, 60%)"
311
+ }
312
+ };
313
+ function StatusDistributionChart({ data, className }) {
314
+ const chartData = Object.entries(data).filter(([, value]) => value > 0).map(([key, value]) => ({
315
+ name: STATUS_CONFIG[key].label,
316
+ value,
317
+ color: STATUS_CONFIG[key].color
318
+ }));
319
+ const total = chartData.reduce((sum, d) => sum + d.value, 0);
320
+ if (total === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
321
+ className: "h-48 flex items-center justify-center text-sm text-muted-foreground",
322
+ children: "No data available"
323
+ });
324
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
325
+ className: require_utils.cn("h-48", className),
326
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.ResponsiveContainer, {
327
+ width: "100%",
328
+ height: "100%",
329
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(recharts.PieChart, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Pie, {
330
+ data: chartData,
331
+ cx: "50%",
332
+ cy: "50%",
333
+ innerRadius: 50,
334
+ outerRadius: 70,
335
+ paddingAngle: 2,
336
+ dataKey: "value",
337
+ nameKey: "name",
338
+ children: chartData.map((entry, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Cell, { fill: entry.color }, `cell-${index}`))
339
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(recharts.Tooltip, { content: ({ active, payload }) => {
340
+ if (!active || !payload?.length) return null;
341
+ const item = payload[0];
342
+ const percent = (item.value / total * 100).toFixed(1);
343
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
344
+ className: "rounded-lg border bg-popover px-3 py-2 text-sm shadow-md",
345
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
346
+ className: "font-medium",
347
+ children: item.name
348
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
349
+ className: "text-muted-foreground",
350
+ children: [
351
+ item.value.toLocaleString(),
352
+ " (",
353
+ percent,
354
+ "%)"
355
+ ]
356
+ })]
357
+ });
358
+ } })] })
359
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
360
+ className: "flex flex-wrap justify-center gap-4 mt-2",
361
+ children: chartData.map((item) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
362
+ className: "flex items-center gap-2 text-xs",
363
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
364
+ className: "w-3 h-3 rounded-full",
365
+ style: { backgroundColor: item.color }
366
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
367
+ className: "text-muted-foreground",
368
+ children: item.name
369
+ })]
370
+ }, item.name))
371
+ })]
372
+ });
373
+ }
374
+
375
+ //#endregion
376
+ //#region src/components/data-display/charts/time-range-selector.tsx
377
+ const defaultPresets = [
378
+ {
379
+ label: "1h",
380
+ value: "1h"
381
+ },
382
+ {
383
+ label: "6h",
384
+ value: "6h"
385
+ },
386
+ {
387
+ label: "24h",
388
+ value: "24h"
389
+ },
390
+ {
391
+ label: "7d",
392
+ value: "7d"
393
+ }
394
+ ];
395
+ function getPresetRange(preset) {
396
+ const end = /* @__PURE__ */ new Date();
397
+ switch (preset) {
398
+ case "1h": return {
399
+ start: (0, date_fns.subHours)(end, 1),
400
+ end
401
+ };
402
+ case "6h": return {
403
+ start: (0, date_fns.subHours)(end, 6),
404
+ end
405
+ };
406
+ case "24h": return {
407
+ start: (0, date_fns.subHours)(end, 24),
408
+ end
409
+ };
410
+ case "7d": return {
411
+ start: (0, date_fns.subDays)(end, 7),
412
+ end
413
+ };
414
+ default: return {
415
+ start: (0, date_fns.subHours)(end, 1),
416
+ end
417
+ };
418
+ }
419
+ }
420
+ function TimeRangeSelector({ value, onChange, presets = defaultPresets, className }) {
421
+ const handlePresetClick = (preset) => {
422
+ const range = getPresetRange(preset);
423
+ onChange({
424
+ preset,
425
+ ...range
426
+ });
427
+ };
428
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
429
+ className: require_utils.cn("flex items-center gap-2", className),
430
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
431
+ className: "flex rounded-md border border-border overflow-hidden",
432
+ children: presets.map(({ label, value: preset }, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
433
+ type: "button",
434
+ onClick: () => handlePresetClick(preset),
435
+ className: require_utils.cn("px-3 py-1.5 text-sm font-medium transition-colors", value.preset === preset ? "bg-primary text-primary-foreground" : "bg-card hover:bg-muted text-foreground", index > 0 && "border-l border-border"),
436
+ children: label
437
+ }, preset))
438
+ })
439
+ });
440
+ }
441
+ /**
442
+ * Create a time range from a preset
443
+ */
444
+ function createTimeRange(preset = "1h") {
445
+ const range = getPresetRange(preset);
446
+ return {
447
+ preset,
448
+ ...range
449
+ };
450
+ }
451
+
452
+ //#endregion
453
+ //#region src/components/data-display/data-table.tsx
454
+ function DataTableInner({ className, columns, data, getRowKey = (_, index) => index, sortColumn, sortDirection, onSortChange, pagination = false, page = 1, pageSize = 10, totalItems, onPageChange, onPageSizeChange, pageSizeOptions = [
455
+ 10,
456
+ 20,
457
+ 50,
458
+ 100
459
+ ], loading = false, emptyState, onRowClick, selectedKeys, striped = false, hoverable = true, compact = false,...props }, ref) {
460
+ const total = totalItems ?? data.length;
461
+ const totalPages = Math.ceil(total / pageSize);
462
+ const handleSort = (columnKey) => {
463
+ if (!onSortChange) return;
464
+ if (sortColumn === columnKey) onSortChange(columnKey, sortDirection === "asc" ? "desc" : "asc");
465
+ else onSortChange(columnKey, "asc");
466
+ };
467
+ const getSortIcon = (columnKey) => {
468
+ if (sortColumn !== columnKey) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ArrowUpDown, { className: "ml-1 h-3.5 w-3.5 text-muted-foreground" });
469
+ return sortDirection === "asc" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ArrowUp, { className: "ml-1 h-3.5 w-3.5" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ArrowDown, { className: "ml-1 h-3.5 w-3.5" });
470
+ };
471
+ const getAlignClass = (align) => {
472
+ switch (align) {
473
+ case "center": return "text-center";
474
+ case "right": return "text-right";
475
+ default: return "text-left";
476
+ }
477
+ };
478
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
479
+ ref,
480
+ className: require_utils.cn("w-full", className),
481
+ ...props,
482
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
483
+ className: "rounded-md border border-border overflow-hidden",
484
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_table.Table, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableHeader, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableRow, {
485
+ className: "hover:bg-transparent",
486
+ children: columns.map((column) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableHead, {
487
+ className: require_utils.cn(getAlignClass(column.align), column.sortable && "cursor-pointer select-none", compact ? "py-2" : "py-3", column.headerClassName),
488
+ style: { width: column.width },
489
+ onClick: column.sortable ? () => handleSort(column.key) : void 0,
490
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
491
+ className: require_utils.cn("flex items-center", column.align === "center" && "justify-center", column.align === "right" && "justify-end"),
492
+ children: [column.header, column.sortable && getSortIcon(column.key)]
493
+ })
494
+ }, column.key))
495
+ }) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableBody, { children: loading ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableRow, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableCell, {
496
+ colSpan: columns.length,
497
+ className: "h-24 text-center text-muted-foreground",
498
+ children: "Loading..."
499
+ }) }) : data.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableRow, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableCell, {
500
+ colSpan: columns.length,
501
+ className: "h-24 text-center text-muted-foreground",
502
+ children: emptyState ?? "No data available"
503
+ }) }) : data.map((row, rowIndex) => {
504
+ const rowKey = getRowKey(row, rowIndex);
505
+ const isSelected = selectedKeys?.has(rowKey);
506
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableRow, {
507
+ className: require_utils.cn(striped && rowIndex % 2 === 1 && "bg-surface/50", hoverable && "hover:bg-surface-hover cursor-pointer", isSelected && "bg-accent/10", onRowClick && "cursor-pointer"),
508
+ onClick: onRowClick ? () => onRowClick(row, rowIndex) : void 0,
509
+ children: columns.map((column) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.TableCell, {
510
+ className: require_utils.cn(getAlignClass(column.align), compact ? "py-2" : "py-3", column.cellClassName),
511
+ children: column.cell ? column.cell(row, rowIndex) : column.accessor ? column.accessor(row) : row[column.key]
512
+ }, column.key))
513
+ }, rowKey);
514
+ }) })] })
515
+ }), pagination && totalPages > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
516
+ className: "flex items-center justify-between px-2 py-4",
517
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
518
+ className: "flex items-center gap-2 text-sm text-muted-foreground",
519
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "Rows per page:" }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(require_table.Select, {
520
+ value: String(pageSize),
521
+ onValueChange: (value) => onPageSizeChange?.(Number(value)),
522
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.SelectTrigger, {
523
+ className: "h-8 w-[70px]",
524
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.SelectValue, {})
525
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.SelectContent, { children: pageSizeOptions.map((size) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_table.SelectItem, {
526
+ value: String(size),
527
+ children: size
528
+ }, size)) })]
529
+ })]
530
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
531
+ className: "flex items-center gap-2",
532
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
533
+ className: "text-sm text-muted-foreground",
534
+ children: [
535
+ "Page ",
536
+ page,
537
+ " of ",
538
+ totalPages
539
+ ]
540
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
541
+ className: "flex items-center gap-1",
542
+ children: [
543
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
544
+ variant: "outline",
545
+ size: "icon",
546
+ className: "h-8 w-8",
547
+ onClick: () => onPageChange?.(1),
548
+ disabled: page <= 1,
549
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronsLeft, { className: "h-4 w-4" })
550
+ }),
551
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
552
+ variant: "outline",
553
+ size: "icon",
554
+ className: "h-8 w-8",
555
+ onClick: () => onPageChange?.(page - 1),
556
+ disabled: page <= 1,
557
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronLeft, { className: "h-4 w-4" })
558
+ }),
559
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
560
+ variant: "outline",
561
+ size: "icon",
562
+ className: "h-8 w-8",
563
+ onClick: () => onPageChange?.(page + 1),
564
+ disabled: page >= totalPages,
565
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, { className: "h-4 w-4" })
566
+ }),
567
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(require_button.Button, {
568
+ variant: "outline",
569
+ size: "icon",
570
+ className: "h-8 w-8",
571
+ onClick: () => onPageChange?.(totalPages),
572
+ disabled: page >= totalPages,
573
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronsRight, { className: "h-4 w-4" })
574
+ })
575
+ ]
576
+ })]
577
+ })]
578
+ })]
579
+ });
580
+ }
581
+ const DataTable = react.forwardRef(DataTableInner);
582
+
583
+ //#endregion
584
+ //#region src/components/data-display/json-viewer.tsx
585
+ const JsonViewer = react.forwardRef(({ className, data, defaultExpanded = true, expandDepth = 2, copyable = true, keyClassName, valueClassName,...props }, ref) => {
586
+ const [copied, setCopied] = react.useState(false);
587
+ const handleCopy = async () => {
588
+ await navigator.clipboard.writeText(JSON.stringify(data, null, 2));
589
+ setCopied(true);
590
+ setTimeout(() => setCopied(false), 2e3);
591
+ };
592
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
593
+ ref,
594
+ className: require_utils.cn("relative rounded-md bg-surface border border-border font-mono text-sm", className),
595
+ ...props,
596
+ children: [copyable && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
597
+ type: "button",
598
+ onClick: handleCopy,
599
+ className: "absolute right-2 top-2 p-1.5 rounded-md hover:bg-surface-hover text-muted-foreground hover:text-foreground transition-colors",
600
+ "aria-label": "Copy JSON",
601
+ children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Check, { className: "h-4 w-4 text-green-500" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.Copy, { className: "h-4 w-4" })
602
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
603
+ className: "p-3 overflow-auto",
604
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(JsonNode, {
605
+ data,
606
+ depth: 0,
607
+ defaultExpanded,
608
+ expandDepth,
609
+ keyClassName,
610
+ valueClassName
611
+ })
612
+ })]
613
+ });
614
+ });
615
+ JsonViewer.displayName = "JsonViewer";
616
+ function JsonNode({ data, depth, defaultExpanded, expandDepth, keyClassName, valueClassName, propertyKey, isLast = true }) {
617
+ const [expanded, setExpanded] = react.useState(defaultExpanded && depth < expandDepth);
618
+ const indent = depth * 16;
619
+ if (data === null) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
620
+ className: "inline",
621
+ children: [
622
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
623
+ className: require_utils.cn("text-purple-400", keyClassName),
624
+ children: [
625
+ "\"",
626
+ propertyKey,
627
+ "\""
628
+ ]
629
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
630
+ className: "text-muted-foreground",
631
+ children: ": "
632
+ })] }),
633
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
634
+ className: require_utils.cn("text-orange-400", valueClassName),
635
+ children: "null"
636
+ }),
637
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
638
+ className: "text-muted-foreground",
639
+ children: ","
640
+ })
641
+ ]
642
+ });
643
+ if (data === void 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
644
+ className: "inline",
645
+ children: [
646
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
647
+ className: require_utils.cn("text-purple-400", keyClassName),
648
+ children: [
649
+ "\"",
650
+ propertyKey,
651
+ "\""
652
+ ]
653
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
654
+ className: "text-muted-foreground",
655
+ children: ": "
656
+ })] }),
657
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
658
+ className: require_utils.cn("text-gray-500", valueClassName),
659
+ children: "undefined"
660
+ }),
661
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
662
+ className: "text-muted-foreground",
663
+ children: ","
664
+ })
665
+ ]
666
+ });
667
+ if (typeof data === "boolean") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
668
+ className: "inline",
669
+ children: [
670
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
671
+ className: require_utils.cn("text-purple-400", keyClassName),
672
+ children: [
673
+ "\"",
674
+ propertyKey,
675
+ "\""
676
+ ]
677
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
678
+ className: "text-muted-foreground",
679
+ children: ": "
680
+ })] }),
681
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
682
+ className: require_utils.cn("text-blue-400", valueClassName),
683
+ children: String(data)
684
+ }),
685
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
686
+ className: "text-muted-foreground",
687
+ children: ","
688
+ })
689
+ ]
690
+ });
691
+ if (typeof data === "number") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
692
+ className: "inline",
693
+ children: [
694
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
695
+ className: require_utils.cn("text-purple-400", keyClassName),
696
+ children: [
697
+ "\"",
698
+ propertyKey,
699
+ "\""
700
+ ]
701
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
702
+ className: "text-muted-foreground",
703
+ children: ": "
704
+ })] }),
705
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
706
+ className: require_utils.cn("text-amber-400", valueClassName),
707
+ children: data
708
+ }),
709
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
710
+ className: "text-muted-foreground",
711
+ children: ","
712
+ })
713
+ ]
714
+ });
715
+ if (typeof data === "string") return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
716
+ className: "inline",
717
+ children: [
718
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
719
+ className: require_utils.cn("text-purple-400", keyClassName),
720
+ children: [
721
+ "\"",
722
+ propertyKey,
723
+ "\""
724
+ ]
725
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
726
+ className: "text-muted-foreground",
727
+ children: ": "
728
+ })] }),
729
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
730
+ className: require_utils.cn("text-green-400", valueClassName),
731
+ children: [
732
+ "\"",
733
+ data,
734
+ "\""
735
+ ]
736
+ }),
737
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
738
+ className: "text-muted-foreground",
739
+ children: ","
740
+ })
741
+ ]
742
+ });
743
+ if (Array.isArray(data)) {
744
+ if (data.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
745
+ className: "inline",
746
+ children: [
747
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
748
+ className: require_utils.cn("text-purple-400", keyClassName),
749
+ children: [
750
+ "\"",
751
+ propertyKey,
752
+ "\""
753
+ ]
754
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
755
+ className: "text-muted-foreground",
756
+ children: ": "
757
+ })] }),
758
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
759
+ className: "text-muted-foreground",
760
+ children: "[]"
761
+ }),
762
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
763
+ className: "text-muted-foreground",
764
+ children: ","
765
+ })
766
+ ]
767
+ });
768
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
769
+ className: "inline-block",
770
+ children: [
771
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
772
+ className: "inline-flex items-center cursor-pointer hover:text-foreground text-muted-foreground",
773
+ onClick: () => setExpanded(!expanded),
774
+ children: [
775
+ expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronDown, { className: "h-3.5 w-3.5 mr-0.5" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, { className: "h-3.5 w-3.5 mr-0.5" }),
776
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
777
+ className: require_utils.cn("text-purple-400", keyClassName),
778
+ children: [
779
+ "\"",
780
+ propertyKey,
781
+ "\""
782
+ ]
783
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
784
+ className: "text-muted-foreground",
785
+ children: ": "
786
+ })] }),
787
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
788
+ className: "text-muted-foreground",
789
+ children: "["
790
+ }),
791
+ !expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
792
+ className: "text-muted-foreground mx-1",
793
+ children: [data.length, " items"]
794
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
795
+ className: "text-muted-foreground",
796
+ children: "]"
797
+ })] })
798
+ ]
799
+ }),
800
+ expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
801
+ style: { paddingLeft: indent + 16 },
802
+ children: data.map((item, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(JsonNode, {
803
+ data: item,
804
+ depth: depth + 1,
805
+ defaultExpanded,
806
+ expandDepth,
807
+ keyClassName,
808
+ valueClassName,
809
+ isLast: index === data.length - 1
810
+ }) }, index))
811
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
812
+ className: "text-muted-foreground",
813
+ children: "]"
814
+ })] }),
815
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
816
+ className: "text-muted-foreground",
817
+ children: ","
818
+ })
819
+ ]
820
+ });
821
+ }
822
+ if (typeof data === "object") {
823
+ const entries = Object.entries(data);
824
+ if (entries.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
825
+ className: "inline",
826
+ children: [
827
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
828
+ className: require_utils.cn("text-purple-400", keyClassName),
829
+ children: [
830
+ "\"",
831
+ propertyKey,
832
+ "\""
833
+ ]
834
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
835
+ className: "text-muted-foreground",
836
+ children: ": "
837
+ })] }),
838
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
839
+ className: "text-muted-foreground",
840
+ children: "{}"
841
+ }),
842
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
843
+ className: "text-muted-foreground",
844
+ children: ","
845
+ })
846
+ ]
847
+ });
848
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
849
+ className: "inline-block",
850
+ children: [
851
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
852
+ className: "inline-flex items-center cursor-pointer hover:text-foreground text-muted-foreground",
853
+ onClick: () => setExpanded(!expanded),
854
+ children: [
855
+ expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronDown, { className: "h-3.5 w-3.5 mr-0.5" }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(lucide_react.ChevronRight, { className: "h-3.5 w-3.5 mr-0.5" }),
856
+ propertyKey && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
857
+ className: require_utils.cn("text-purple-400", keyClassName),
858
+ children: [
859
+ "\"",
860
+ propertyKey,
861
+ "\""
862
+ ]
863
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
864
+ className: "text-muted-foreground",
865
+ children: ": "
866
+ })] }),
867
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
868
+ className: "text-muted-foreground",
869
+ children: "{"
870
+ }),
871
+ !expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
872
+ className: "text-muted-foreground mx-1",
873
+ children: "..."
874
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
875
+ className: "text-muted-foreground",
876
+ children: "}"
877
+ })] })
878
+ ]
879
+ }),
880
+ expanded && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
881
+ style: { paddingLeft: indent + 16 },
882
+ children: entries.map(([key, value], index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(JsonNode, {
883
+ data: value,
884
+ depth: depth + 1,
885
+ defaultExpanded,
886
+ expandDepth,
887
+ keyClassName,
888
+ valueClassName,
889
+ propertyKey: key,
890
+ isLast: index === entries.length - 1
891
+ }) }, key))
892
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
893
+ className: "text-muted-foreground",
894
+ children: "}"
895
+ })] }),
896
+ !isLast && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
897
+ className: "text-muted-foreground",
898
+ children: ","
899
+ })
900
+ ]
901
+ });
902
+ }
903
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
904
+ className: require_utils.cn("text-muted-foreground", valueClassName),
905
+ children: String(data)
906
+ });
907
+ }
908
+
909
+ //#endregion
910
+ //#region src/components/data-display/sparkline.tsx
911
+ const Sparkline = react.forwardRef(({ className, data, width = 100, height = 32, color = "currentColor", strokeWidth = 2, filled = false, fillOpacity = .2, showDots = false, curved = true, min: minProp, max: maxProp,...props }, ref) => {
912
+ if (data.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
913
+ ref,
914
+ className: require_utils.cn("text-accent", className),
915
+ width,
916
+ height,
917
+ viewBox: `0 0 ${width} ${height}`,
918
+ ...props
919
+ });
920
+ const min = minProp ?? Math.min(...data);
921
+ const max = maxProp ?? Math.max(...data);
922
+ const range = max - min || 1;
923
+ const padding = strokeWidth;
924
+ const chartWidth = width - padding * 2;
925
+ const chartHeight = height - padding * 2;
926
+ const points = data.map((value, index) => {
927
+ const x = padding + index / (data.length - 1 || 1) * chartWidth;
928
+ const y = padding + chartHeight - (value - min) / range * chartHeight;
929
+ return {
930
+ x,
931
+ y
932
+ };
933
+ });
934
+ let pathD;
935
+ if (curved && points.length > 2) pathD = points.reduce((acc, point, index) => {
936
+ if (index === 0) return `M ${point.x},${point.y}`;
937
+ const prev = points[index - 1];
938
+ const cpX = (prev.x + point.x) / 2;
939
+ return `${acc} Q ${prev.x},${prev.y} ${cpX},${(prev.y + point.y) / 2} T ${point.x},${point.y}`;
940
+ }, "");
941
+ else pathD = points.map((point, index) => index === 0 ? `M ${point.x},${point.y}` : `L ${point.x},${point.y}`).join(" ");
942
+ const fillPathD = filled ? `${pathD} L ${points[points.length - 1]?.x},${height - padding} L ${points[0]?.x},${height - padding} Z` : "";
943
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
944
+ ref,
945
+ className: require_utils.cn("text-accent", className),
946
+ width,
947
+ height,
948
+ viewBox: `0 0 ${width} ${height}`,
949
+ ...props,
950
+ children: [
951
+ filled && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
952
+ d: fillPathD,
953
+ fill: color,
954
+ opacity: fillOpacity,
955
+ strokeWidth: 0
956
+ }),
957
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
958
+ d: pathD,
959
+ fill: "none",
960
+ stroke: color,
961
+ strokeWidth,
962
+ strokeLinecap: "round",
963
+ strokeLinejoin: "round"
964
+ }),
965
+ showDots && points.map((point, index) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
966
+ cx: point.x,
967
+ cy: point.y,
968
+ r: strokeWidth + 1,
969
+ fill: color
970
+ }, index))
971
+ ]
972
+ });
973
+ });
974
+ Sparkline.displayName = "Sparkline";
975
+ const SparkBar = react.forwardRef(({ className, data, width = 100, height = 32, color = "currentColor", gap = .2, min: minProp = 0, max: maxProp, radius = 2,...props }, ref) => {
976
+ if (data.length === 0) return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
977
+ ref,
978
+ className: require_utils.cn("text-accent", className),
979
+ width,
980
+ height,
981
+ viewBox: `0 0 ${width} ${height}`,
982
+ ...props
983
+ });
984
+ const min = minProp;
985
+ const max = maxProp ?? Math.max(...data);
986
+ const range = max - min || 1;
987
+ const barWidth = width / data.length;
988
+ const gapWidth = barWidth * gap;
989
+ const actualBarWidth = barWidth - gapWidth;
990
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
991
+ ref,
992
+ className: require_utils.cn("text-accent", className),
993
+ width,
994
+ height,
995
+ viewBox: `0 0 ${width} ${height}`,
996
+ ...props,
997
+ children: data.map((value, index) => {
998
+ const barHeight = (value - min) / range * height;
999
+ const x = index * barWidth + gapWidth / 2;
1000
+ const y = height - barHeight;
1001
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
1002
+ x,
1003
+ y,
1004
+ width: actualBarWidth,
1005
+ height: barHeight,
1006
+ fill: color,
1007
+ rx: radius,
1008
+ ry: radius
1009
+ }, index);
1010
+ })
1011
+ });
1012
+ });
1013
+ SparkBar.displayName = "SparkBar";
1014
+ const MetricCard = react.forwardRef(({ className, title, value, description, sparklineData, trend, trendValue, icon,...props }, ref) => {
1015
+ const trendColor = trend === "up" ? "text-green-500" : trend === "down" ? "text-red-500" : "text-muted-foreground";
1016
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1017
+ ref,
1018
+ className: require_utils.cn("rounded-lg border border-border bg-surface p-4", className),
1019
+ ...props,
1020
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1021
+ className: "flex items-center justify-between",
1022
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1023
+ className: "text-sm font-medium text-muted-foreground",
1024
+ children: title
1025
+ }), icon && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1026
+ className: "text-muted-foreground",
1027
+ children: icon
1028
+ })]
1029
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1030
+ className: "mt-2 flex items-end justify-between",
1031
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1032
+ className: "text-2xl font-bold text-foreground",
1033
+ children: value
1034
+ }), (description || trendValue) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1035
+ className: "mt-1 flex items-center gap-1",
1036
+ children: [trendValue && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1037
+ className: require_utils.cn("text-xs font-medium", trendColor),
1038
+ children: trendValue
1039
+ }), description && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1040
+ className: "text-xs text-muted-foreground",
1041
+ children: description
1042
+ })]
1043
+ })] }), sparklineData && sparklineData.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Sparkline, {
1044
+ data: sparklineData,
1045
+ width: 80,
1046
+ height: 32,
1047
+ filled: true,
1048
+ className: trend === "up" ? "text-green-500" : trend === "down" ? "text-red-500" : "text-accent"
1049
+ })]
1050
+ })]
1051
+ });
1052
+ });
1053
+ MetricCard.displayName = "MetricCard";
1054
+
1055
+ //#endregion
1056
+ //#region src/components/data-display/timeline.tsx
1057
+ const timelineVariants = (0, class_variance_authority.cva)("relative", {
1058
+ variants: { orientation: {
1059
+ vertical: "flex flex-col",
1060
+ horizontal: "flex flex-row"
1061
+ } },
1062
+ defaultVariants: { orientation: "vertical" }
1063
+ });
1064
+ const Timeline = react.forwardRef(({ className, orientation = "vertical", children,...props }, ref) => {
1065
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1066
+ ref,
1067
+ className: require_utils.cn(timelineVariants({
1068
+ orientation,
1069
+ className
1070
+ })),
1071
+ ...props,
1072
+ children
1073
+ });
1074
+ });
1075
+ Timeline.displayName = "Timeline";
1076
+ const timelineItemVariants = (0, class_variance_authority.cva)("relative flex", {
1077
+ variants: { orientation: {
1078
+ vertical: "flex-row gap-4 pb-8 last:pb-0",
1079
+ horizontal: "flex-col gap-2 pr-8 last:pr-0"
1080
+ } },
1081
+ defaultVariants: { orientation: "vertical" }
1082
+ });
1083
+ const TimelineItem = react.forwardRef(({ className, orientation = "vertical", active, children,...props }, ref) => {
1084
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1085
+ ref,
1086
+ className: require_utils.cn(timelineItemVariants({
1087
+ orientation,
1088
+ className
1089
+ })),
1090
+ "data-active": active,
1091
+ ...props,
1092
+ children
1093
+ });
1094
+ });
1095
+ TimelineItem.displayName = "TimelineItem";
1096
+ const timelineIndicatorVariants = (0, class_variance_authority.cva)("flex items-center justify-center rounded-full border-2 shrink-0", {
1097
+ variants: {
1098
+ size: {
1099
+ sm: "h-3 w-3",
1100
+ md: "h-4 w-4",
1101
+ lg: "h-6 w-6"
1102
+ },
1103
+ variant: {
1104
+ default: "border-border bg-surface",
1105
+ primary: "border-accent bg-accent",
1106
+ success: "border-green-500 bg-green-500",
1107
+ warning: "border-amber-500 bg-amber-500",
1108
+ error: "border-red-500 bg-red-500",
1109
+ info: "border-blue-500 bg-blue-500",
1110
+ muted: "border-muted-foreground bg-muted"
1111
+ }
1112
+ },
1113
+ defaultVariants: {
1114
+ size: "md",
1115
+ variant: "default"
1116
+ }
1117
+ });
1118
+ const TimelineIndicator = react.forwardRef(({ className, size, variant, showLine = true, linePosition = "after", orientation = "vertical", children,...props }, ref) => {
1119
+ const isVertical = orientation === "vertical";
1120
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1121
+ ref,
1122
+ className: require_utils.cn("relative flex items-center", isVertical ? "flex-col" : "flex-row"),
1123
+ children: [
1124
+ showLine && (linePosition === "before" || linePosition === "both") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_utils.cn("bg-border", isVertical ? "w-0.5 flex-1" : "h-0.5 flex-1") }),
1125
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1126
+ className: require_utils.cn(timelineIndicatorVariants({
1127
+ size,
1128
+ variant,
1129
+ className
1130
+ })),
1131
+ ...props,
1132
+ children
1133
+ }),
1134
+ showLine && (linePosition === "after" || linePosition === "both") && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", { className: require_utils.cn("bg-border", isVertical ? "w-0.5 flex-1" : "h-0.5 flex-1") })
1135
+ ]
1136
+ });
1137
+ });
1138
+ TimelineIndicator.displayName = "TimelineIndicator";
1139
+ const TimelineConnector = react.forwardRef(({ className, orientation = "vertical",...props }, ref) => {
1140
+ const isVertical = orientation === "vertical";
1141
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1142
+ ref,
1143
+ className: require_utils.cn("bg-border", isVertical ? "absolute left-[7px] top-4 bottom-0 w-0.5" : "absolute top-[7px] left-4 right-0 h-0.5", className),
1144
+ ...props
1145
+ });
1146
+ });
1147
+ TimelineConnector.displayName = "TimelineConnector";
1148
+ const TimelineContent = react.forwardRef(({ className, children,...props }, ref) => {
1149
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1150
+ ref,
1151
+ className: require_utils.cn("flex-1 pt-0.5", className),
1152
+ ...props,
1153
+ children
1154
+ });
1155
+ });
1156
+ TimelineContent.displayName = "TimelineContent";
1157
+ const TimelineTitle = react.forwardRef(({ className, children,...props }, ref) => {
1158
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("h4", {
1159
+ ref,
1160
+ className: require_utils.cn("text-sm font-medium text-foreground", className),
1161
+ ...props,
1162
+ children
1163
+ });
1164
+ });
1165
+ TimelineTitle.displayName = "TimelineTitle";
1166
+ const TimelineDescription = react.forwardRef(({ className, children,...props }, ref) => {
1167
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
1168
+ ref,
1169
+ className: require_utils.cn("text-sm text-muted-foreground", className),
1170
+ ...props,
1171
+ children
1172
+ });
1173
+ });
1174
+ TimelineDescription.displayName = "TimelineDescription";
1175
+ const TimelineTime = react.forwardRef(({ className, children,...props }, ref) => {
1176
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1177
+ ref,
1178
+ className: require_utils.cn("text-xs text-muted-foreground", className),
1179
+ ...props,
1180
+ children
1181
+ });
1182
+ });
1183
+ TimelineTime.displayName = "TimelineTime";
1184
+
1185
+ //#endregion
1186
+ Object.defineProperty(exports, 'AreaTimeSeriesChart', {
1187
+ enumerable: true,
1188
+ get: function () {
1189
+ return AreaTimeSeriesChart;
1190
+ }
1191
+ });
1192
+ Object.defineProperty(exports, 'BarListChart', {
1193
+ enumerable: true,
1194
+ get: function () {
1195
+ return BarListChart;
1196
+ }
1197
+ });
1198
+ Object.defineProperty(exports, 'DataTable', {
1199
+ enumerable: true,
1200
+ get: function () {
1201
+ return DataTable;
1202
+ }
1203
+ });
1204
+ Object.defineProperty(exports, 'JsonViewer', {
1205
+ enumerable: true,
1206
+ get: function () {
1207
+ return JsonViewer;
1208
+ }
1209
+ });
1210
+ Object.defineProperty(exports, 'LatencyPercentilesChart', {
1211
+ enumerable: true,
1212
+ get: function () {
1213
+ return LatencyPercentilesChart;
1214
+ }
1215
+ });
1216
+ Object.defineProperty(exports, 'MetricCard', {
1217
+ enumerable: true,
1218
+ get: function () {
1219
+ return MetricCard;
1220
+ }
1221
+ });
1222
+ Object.defineProperty(exports, 'SparkBar', {
1223
+ enumerable: true,
1224
+ get: function () {
1225
+ return SparkBar;
1226
+ }
1227
+ });
1228
+ Object.defineProperty(exports, 'Sparkline', {
1229
+ enumerable: true,
1230
+ get: function () {
1231
+ return Sparkline;
1232
+ }
1233
+ });
1234
+ Object.defineProperty(exports, 'StatusDistributionChart', {
1235
+ enumerable: true,
1236
+ get: function () {
1237
+ return StatusDistributionChart;
1238
+ }
1239
+ });
1240
+ Object.defineProperty(exports, 'TimeRangeSelector', {
1241
+ enumerable: true,
1242
+ get: function () {
1243
+ return TimeRangeSelector;
1244
+ }
1245
+ });
1246
+ Object.defineProperty(exports, 'Timeline', {
1247
+ enumerable: true,
1248
+ get: function () {
1249
+ return Timeline;
1250
+ }
1251
+ });
1252
+ Object.defineProperty(exports, 'TimelineConnector', {
1253
+ enumerable: true,
1254
+ get: function () {
1255
+ return TimelineConnector;
1256
+ }
1257
+ });
1258
+ Object.defineProperty(exports, 'TimelineContent', {
1259
+ enumerable: true,
1260
+ get: function () {
1261
+ return TimelineContent;
1262
+ }
1263
+ });
1264
+ Object.defineProperty(exports, 'TimelineDescription', {
1265
+ enumerable: true,
1266
+ get: function () {
1267
+ return TimelineDescription;
1268
+ }
1269
+ });
1270
+ Object.defineProperty(exports, 'TimelineIndicator', {
1271
+ enumerable: true,
1272
+ get: function () {
1273
+ return TimelineIndicator;
1274
+ }
1275
+ });
1276
+ Object.defineProperty(exports, 'TimelineItem', {
1277
+ enumerable: true,
1278
+ get: function () {
1279
+ return TimelineItem;
1280
+ }
1281
+ });
1282
+ Object.defineProperty(exports, 'TimelineTime', {
1283
+ enumerable: true,
1284
+ get: function () {
1285
+ return TimelineTime;
1286
+ }
1287
+ });
1288
+ Object.defineProperty(exports, 'TimelineTitle', {
1289
+ enumerable: true,
1290
+ get: function () {
1291
+ return TimelineTitle;
1292
+ }
1293
+ });
1294
+ Object.defineProperty(exports, 'createTimeRange', {
1295
+ enumerable: true,
1296
+ get: function () {
1297
+ return createTimeRange;
1298
+ }
1299
+ });
1300
+ Object.defineProperty(exports, 'timelineIndicatorVariants', {
1301
+ enumerable: true,
1302
+ get: function () {
1303
+ return timelineIndicatorVariants;
1304
+ }
1305
+ });
1306
+ Object.defineProperty(exports, 'timelineItemVariants', {
1307
+ enumerable: true,
1308
+ get: function () {
1309
+ return timelineItemVariants;
1310
+ }
1311
+ });
1312
+ Object.defineProperty(exports, 'timelineVariants', {
1313
+ enumerable: true,
1314
+ get: function () {
1315
+ return timelineVariants;
1316
+ }
1317
+ });
1318
+ //# sourceMappingURL=data-display-BSUj4rIc.cjs.map