@geekmidas/ui 9.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 @@
1
+ {"version":3,"file":"data-display-IcuThGEY.mjs","names":["COLOR_MAP: Record<string, string>","ms: number","defaultPresets: Array<{ label: string; value: TimeRangePreset }>","preset: TimeRangePreset","ref: React.ForwardedRef<HTMLDivElement>","columnKey: string","align?: 'left' | 'center' | 'right'","pathD: string"],"sources":["../src/components/data-display/charts/area-time-series-chart.tsx","../src/components/data-display/charts/bar-list-chart.tsx","../src/components/data-display/charts/latency-percentiles-chart.tsx","../src/components/data-display/charts/status-distribution-chart.tsx","../src/components/data-display/charts/time-range-selector.tsx","../src/components/data-display/data-table.tsx","../src/components/data-display/json-viewer.tsx","../src/components/data-display/sparkline.tsx","../src/components/data-display/timeline.tsx"],"sourcesContent":["'use client';\n\nimport { format } from 'date-fns';\nimport {\n\tArea,\n\tAreaChart,\n\tResponsiveContainer,\n\tTooltip,\n\tXAxis,\n\tYAxis,\n} from 'recharts';\nimport { cn } from '../../../lib/utils';\n\nexport interface TimeSeriesDataPoint {\n\ttimestamp: number;\n\tvalue: number;\n\tsecondaryValue?: number;\n}\n\nexport interface AreaTimeSeriesChartProps {\n\tdata: TimeSeriesDataPoint[];\n\t/** Label for the primary value */\n\tprimaryLabel?: string;\n\t/** Label for the secondary value (optional) */\n\tsecondaryLabel?: string;\n\t/** Color for primary series */\n\tprimaryColor?: string;\n\t/** Color for secondary series */\n\tsecondaryColor?: string;\n\t/** Time format pattern (date-fns) */\n\ttimeFormat?: string;\n\t/** Value formatter */\n\tvalueFormatter?: (value: number) => string;\n\t/** Chart className */\n\tclassName?: string;\n\t/** Show legend */\n\tshowLegend?: boolean;\n}\n\nconst COLOR_MAP: Record<string, string> = {\n\tblue: 'hsl(217, 91%, 60%)',\n\tred: 'hsl(0, 84%, 60%)',\n\tgreen: 'hsl(142, 71%, 45%)',\n\tamber: 'hsl(38, 92%, 50%)',\n\tpurple: 'hsl(263, 70%, 50%)',\n};\n\nexport function AreaTimeSeriesChart({\n\tdata,\n\tprimaryLabel = 'Value',\n\tsecondaryLabel,\n\tprimaryColor = 'blue',\n\tsecondaryColor = 'red',\n\ttimeFormat = 'HH:mm',\n\tvalueFormatter = (v) => v.toLocaleString(),\n\tclassName,\n\tshowLegend,\n}: AreaTimeSeriesChartProps) {\n\tif (data.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"h-48 flex items-center justify-center text-sm text-muted-foreground\">\n\t\t\t\tNo data available\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst hasSecondary =\n\t\tsecondaryLabel && data.some((p) => p.secondaryValue !== undefined);\n\n\tconst chartData = data.map((point) => ({\n\t\ttime: format(new Date(point.timestamp), timeFormat),\n\t\ttimestamp: point.timestamp,\n\t\t[primaryLabel]: point.value,\n\t\t...(hasSecondary && secondaryLabel\n\t\t\t? { [secondaryLabel]: point.secondaryValue ?? 0 }\n\t\t\t: {}),\n\t}));\n\n\tconst primaryColorValue = COLOR_MAP[primaryColor] ?? primaryColor;\n\tconst secondaryColorValue = COLOR_MAP[secondaryColor] ?? secondaryColor;\n\n\tconst shouldShowLegend = showLegend ?? hasSecondary;\n\n\treturn (\n\t\t<div className={cn('h-48', className)}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<AreaChart data={chartData}>\n\t\t\t\t\t<defs>\n\t\t\t\t\t\t<linearGradient id=\"primaryGradient\" x1=\"0\" y1=\"0\" x2=\"0\" y2=\"1\">\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\toffset=\"5%\"\n\t\t\t\t\t\t\t\tstopColor={primaryColorValue}\n\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\toffset=\"95%\"\n\t\t\t\t\t\t\t\tstopColor={primaryColorValue}\n\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t{hasSecondary && (\n\t\t\t\t\t\t\t<linearGradient\n\t\t\t\t\t\t\t\tid=\"secondaryGradient\"\n\t\t\t\t\t\t\t\tx1=\"0\"\n\t\t\t\t\t\t\t\ty1=\"0\"\n\t\t\t\t\t\t\t\tx2=\"0\"\n\t\t\t\t\t\t\t\ty2=\"1\"\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"5%\"\n\t\t\t\t\t\t\t\t\tstopColor={secondaryColorValue}\n\t\t\t\t\t\t\t\t\tstopOpacity={0.3}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t<stop\n\t\t\t\t\t\t\t\t\toffset=\"95%\"\n\t\t\t\t\t\t\t\t\tstopColor={secondaryColorValue}\n\t\t\t\t\t\t\t\t\tstopOpacity={0}\n\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t</linearGradient>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</defs>\n\t\t\t\t\t<XAxis\n\t\t\t\t\t\tdataKey=\"time\"\n\t\t\t\t\t\ttick={{ fill: 'hsl(var(--muted-foreground))', fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<YAxis\n\t\t\t\t\t\ttick={{ fill: 'hsl(var(--muted-foreground))', fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t\ttickFormatter={valueFormatter}\n\t\t\t\t\t\twidth={50}\n\t\t\t\t\t/>\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tcontent={({ active, payload, label }) => {\n\t\t\t\t\t\t\tif (!active || !payload?.length) return null;\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div className=\"rounded-lg border bg-popover px-3 py-2 text-sm shadow-md\">\n\t\t\t\t\t\t\t\t\t<p className=\"font-medium mb-1\">{label}</p>\n\t\t\t\t\t\t\t\t\t{payload.map((entry, index) => (\n\t\t\t\t\t\t\t\t\t\t<p\n\t\t\t\t\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\t\t\t\t\tclassName=\"flex items-center gap-2 text-muted-foreground\"\n\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\t\t\t\t\tclassName=\"w-2 h-2 rounded-full\"\n\t\t\t\t\t\t\t\t\t\t\t\tstyle={{ backgroundColor: entry.color }}\n\t\t\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t\t\t\t{entry.name}: {valueFormatter(entry.value as number)}\n\t\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<Area\n\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\tdataKey={primaryLabel}\n\t\t\t\t\t\tstroke={primaryColorValue}\n\t\t\t\t\t\tfill=\"url(#primaryGradient)\"\n\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t/>\n\t\t\t\t\t{hasSecondary && secondaryLabel && (\n\t\t\t\t\t\t<Area\n\t\t\t\t\t\t\ttype=\"monotone\"\n\t\t\t\t\t\t\tdataKey={secondaryLabel}\n\t\t\t\t\t\t\tstroke={secondaryColorValue}\n\t\t\t\t\t\t\tfill=\"url(#secondaryGradient)\"\n\t\t\t\t\t\t\tstrokeWidth={2}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</AreaChart>\n\t\t\t</ResponsiveContainer>\n\t\t\t{shouldShowLegend && (\n\t\t\t\t<div className=\"flex justify-center gap-4 mt-2\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-xs\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"w-3 h-3 rounded-full\"\n\t\t\t\t\t\t\tstyle={{ backgroundColor: primaryColorValue }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">{primaryLabel}</span>\n\t\t\t\t\t</div>\n\t\t\t\t\t{hasSecondary && secondaryLabel && (\n\t\t\t\t\t\t<div className=\"flex items-center gap-2 text-xs\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName=\"w-3 h-3 rounded-full\"\n\t\t\t\t\t\t\t\tstyle={{ backgroundColor: secondaryColorValue }}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{secondaryLabel}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { cn } from '../../../lib/utils';\n\nexport interface BarListItem {\n\tname: string;\n\tvalue: number;\n}\n\nexport interface BarListChartProps<T extends BarListItem> {\n\tdata: T[];\n\t/** Value formatter */\n\tvalueFormatter?: (value: number) => string;\n\t/** Click handler */\n\tonItemClick?: (item: T) => void;\n\t/** Chart className */\n\tclassName?: string;\n\t/** Empty state message */\n\temptyMessage?: string;\n\t/** Bar color */\n\tcolor?: string;\n}\n\nexport function BarListChart<T extends BarListItem>({\n\tdata,\n\tvalueFormatter = (v) => v.toLocaleString(),\n\tonItemClick,\n\tclassName,\n\temptyMessage = 'No data available',\n\tcolor = 'hsl(217, 91%, 60%)',\n}: BarListChartProps<T>) {\n\tif (data.length === 0) {\n\t\treturn (\n\t\t\t<div className=\"h-48 flex items-center justify-center text-sm text-muted-foreground\">\n\t\t\t\t{emptyMessage}\n\t\t\t</div>\n\t\t);\n\t}\n\n\tconst maxValue = Math.max(...data.map((d) => d.value));\n\n\treturn (\n\t\t<div className={cn('space-y-3', className)}>\n\t\t\t{data.map((item, index) => {\n\t\t\t\tconst percentage = maxValue > 0 ? (item.value / maxValue) * 100 : 0;\n\t\t\t\tconst isClickable = !!onItemClick;\n\n\t\t\t\treturn (\n\t\t\t\t\t<div\n\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\tclassName={cn('group', isClickable && 'cursor-pointer')}\n\t\t\t\t\t\tonClick={() => onItemClick?.(item)}\n\t\t\t\t\t>\n\t\t\t\t\t\t<div className=\"flex items-center justify-between mb-1\">\n\t\t\t\t\t\t\t<span\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'text-sm truncate flex-1 mr-4',\n\t\t\t\t\t\t\t\t\tisClickable && 'group-hover:text-foreground',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t{item.name}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-sm font-medium tabular-nums\">\n\t\t\t\t\t\t\t\t{valueFormatter(item.value)}\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<div className=\"h-2 bg-muted rounded-full overflow-hidden\">\n\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t'h-full rounded-full transition-all duration-300',\n\t\t\t\t\t\t\t\t\tisClickable && 'group-hover:opacity-80',\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\tstyle={{\n\t\t\t\t\t\t\t\t\twidth: `${percentage}%`,\n\t\t\t\t\t\t\t\t\tbackgroundColor: color,\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t);\n\t\t\t})}\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport {\n\tBar,\n\tBarChart,\n\tCell,\n\tResponsiveContainer,\n\tTooltip,\n\tXAxis,\n\tYAxis,\n} from 'recharts';\nimport { cn } from '../../../lib/utils';\n\nexport interface LatencyPercentilesChartProps {\n\tp50: number;\n\tp95: number;\n\tp99: number;\n\tclassName?: string;\n\t/** Custom formatter for duration values (default: ms/s format) */\n\tvalueFormatter?: (ms: number) => string;\n}\n\nfunction defaultFormatDuration(ms: number): string {\n\tif (ms < 1) return '<1ms';\n\tif (ms < 1000) return `${Math.round(ms)}ms`;\n\treturn `${(ms / 1000).toFixed(2)}s`;\n}\n\nconst PERCENTILE_COLORS = {\n\tp50: 'hsl(217, 91%, 60%)',\n\tp95: 'hsl(38, 92%, 50%)',\n\tp99: 'hsl(0, 84%, 60%)',\n};\n\nexport function LatencyPercentilesChart({\n\tp50,\n\tp95,\n\tp99,\n\tclassName,\n\tvalueFormatter = defaultFormatDuration,\n}: LatencyPercentilesChartProps) {\n\tconst chartData = [\n\t\t{\n\t\t\tname: 'p50',\n\t\t\tlabel: 'p50 (Median)',\n\t\t\tvalue: p50,\n\t\t\tcolor: PERCENTILE_COLORS.p50,\n\t\t},\n\t\t{ name: 'p95', label: 'p95', value: p95, color: PERCENTILE_COLORS.p95 },\n\t\t{ name: 'p99', label: 'p99', value: p99, color: PERCENTILE_COLORS.p99 },\n\t];\n\n\tif (p99 === 0) {\n\t\treturn (\n\t\t\t<div className=\"h-48 flex items-center justify-center text-sm text-muted-foreground\">\n\t\t\t\tNo data available\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('h-48', className)}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<BarChart data={chartData} layout=\"vertical\" barSize={20}>\n\t\t\t\t\t<XAxis\n\t\t\t\t\t\ttype=\"number\"\n\t\t\t\t\t\ttickFormatter={valueFormatter}\n\t\t\t\t\t\ttick={{ fill: 'hsl(var(--muted-foreground))', fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<YAxis\n\t\t\t\t\t\ttype=\"category\"\n\t\t\t\t\t\tdataKey=\"label\"\n\t\t\t\t\t\twidth={90}\n\t\t\t\t\t\ttick={{ fill: 'hsl(var(--muted-foreground))', fontSize: 12 }}\n\t\t\t\t\t\taxisLine={false}\n\t\t\t\t\t\ttickLine={false}\n\t\t\t\t\t/>\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tcontent={({ active, payload }) => {\n\t\t\t\t\t\t\tif (!active || !payload?.length) return null;\n\t\t\t\t\t\t\tconst item = payload[0]?.payload as (typeof chartData)[number];\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div className=\"rounded-lg border bg-popover px-3 py-2 text-sm shadow-md\">\n\t\t\t\t\t\t\t\t\t<p className=\"font-medium\">{item.label}</p>\n\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{valueFormatter(item.value)}\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t\t<Bar dataKey=\"value\" radius={[0, 4, 4, 0]}>\n\t\t\t\t\t\t{chartData.map((entry, index) => (\n\t\t\t\t\t\t\t<Cell key={`cell-${index}`} fill={entry.color} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Bar>\n\t\t\t\t</BarChart>\n\t\t\t</ResponsiveContainer>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { Cell, Pie, PieChart, ResponsiveContainer, Tooltip } from 'recharts';\nimport { cn } from '../../../lib/utils';\n\nexport interface StatusDistributionData {\n\t'2xx': number;\n\t'3xx': number;\n\t'4xx': number;\n\t'5xx': number;\n}\n\nexport interface StatusDistributionChartProps {\n\tdata: StatusDistributionData;\n\tclassName?: string;\n}\n\nconst STATUS_CONFIG = {\n\t'2xx': { label: '2xx Success', color: 'hsl(142, 71%, 45%)' },\n\t'3xx': { label: '3xx Redirect', color: 'hsl(217, 91%, 60%)' },\n\t'4xx': { label: '4xx Client Error', color: 'hsl(38, 92%, 50%)' },\n\t'5xx': { label: '5xx Server Error', color: 'hsl(0, 84%, 60%)' },\n} as const;\n\nexport function StatusDistributionChart({\n\tdata,\n\tclassName,\n}: StatusDistributionChartProps) {\n\tconst chartData = (\n\t\tObject.entries(data) as [keyof StatusDistributionData, number][]\n\t)\n\t\t.filter(([, value]) => value > 0)\n\t\t.map(([key, value]) => ({\n\t\t\tname: STATUS_CONFIG[key].label,\n\t\t\tvalue,\n\t\t\tcolor: STATUS_CONFIG[key].color,\n\t\t}));\n\n\tconst total = chartData.reduce((sum, d) => sum + d.value, 0);\n\n\tif (total === 0) {\n\t\treturn (\n\t\t\t<div className=\"h-48 flex items-center justify-center text-sm text-muted-foreground\">\n\t\t\t\tNo data available\n\t\t\t</div>\n\t\t);\n\t}\n\n\treturn (\n\t\t<div className={cn('h-48', className)}>\n\t\t\t<ResponsiveContainer width=\"100%\" height=\"100%\">\n\t\t\t\t<PieChart>\n\t\t\t\t\t<Pie\n\t\t\t\t\t\tdata={chartData}\n\t\t\t\t\t\tcx=\"50%\"\n\t\t\t\t\t\tcy=\"50%\"\n\t\t\t\t\t\tinnerRadius={50}\n\t\t\t\t\t\touterRadius={70}\n\t\t\t\t\t\tpaddingAngle={2}\n\t\t\t\t\t\tdataKey=\"value\"\n\t\t\t\t\t\tnameKey=\"name\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{chartData.map((entry, index) => (\n\t\t\t\t\t\t\t<Cell key={`cell-${index}`} fill={entry.color} />\n\t\t\t\t\t\t))}\n\t\t\t\t\t</Pie>\n\t\t\t\t\t<Tooltip\n\t\t\t\t\t\tcontent={({ active, payload }) => {\n\t\t\t\t\t\t\tif (!active || !payload?.length) return null;\n\t\t\t\t\t\t\tconst item = payload[0]!;\n\t\t\t\t\t\t\tconst percent = (((item.value as number) / total) * 100).toFixed(\n\t\t\t\t\t\t\t\t1,\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t<div className=\"rounded-lg border bg-popover px-3 py-2 text-sm shadow-md\">\n\t\t\t\t\t\t\t\t\t<p className=\"font-medium\">{item.name}</p>\n\t\t\t\t\t\t\t\t\t<p className=\"text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{(item.value as number).toLocaleString()} ({percent}%)\n\t\t\t\t\t\t\t\t\t</p>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t);\n\t\t\t\t\t\t}}\n\t\t\t\t\t/>\n\t\t\t\t</PieChart>\n\t\t\t</ResponsiveContainer>\n\t\t\t<div className=\"flex flex-wrap justify-center gap-4 mt-2\">\n\t\t\t\t{chartData.map((item) => (\n\t\t\t\t\t<div key={item.name} className=\"flex items-center gap-2 text-xs\">\n\t\t\t\t\t\t<div\n\t\t\t\t\t\t\tclassName=\"w-3 h-3 rounded-full\"\n\t\t\t\t\t\t\tstyle={{ backgroundColor: item.color }}\n\t\t\t\t\t\t/>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">{item.name}</span>\n\t\t\t\t\t</div>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n","'use client';\n\nimport { subDays, subHours } from 'date-fns';\nimport { cn } from '../../../lib/utils';\n\nexport type TimeRangePreset = '1h' | '6h' | '24h' | '7d' | 'custom';\n\nexport interface TimeRange {\n\tpreset: TimeRangePreset;\n\tstart: Date;\n\tend: Date;\n}\n\nexport interface TimeRangeSelectorProps {\n\tvalue: TimeRange;\n\tonChange: (range: TimeRange) => void;\n\t/** Available presets (default: all) */\n\tpresets?: Array<{ label: string; value: TimeRangePreset }>;\n\t/** Show date picker icon */\n\tshowIcon?: boolean;\n\t/** Class name */\n\tclassName?: string;\n}\n\nconst defaultPresets: Array<{ label: string; value: TimeRangePreset }> = [\n\t{ label: '1h', value: '1h' },\n\t{ label: '6h', value: '6h' },\n\t{ label: '24h', value: '24h' },\n\t{ label: '7d', value: '7d' },\n];\n\nfunction getPresetRange(preset: TimeRangePreset): { start: Date; end: Date } {\n\tconst end = new Date();\n\n\tswitch (preset) {\n\t\tcase '1h':\n\t\t\treturn { start: subHours(end, 1), end };\n\t\tcase '6h':\n\t\t\treturn { start: subHours(end, 6), end };\n\t\tcase '24h':\n\t\t\treturn { start: subHours(end, 24), end };\n\t\tcase '7d':\n\t\t\treturn { start: subDays(end, 7), end };\n\t\tdefault:\n\t\t\treturn { start: subHours(end, 1), end };\n\t}\n}\n\nexport function TimeRangeSelector({\n\tvalue,\n\tonChange,\n\tpresets = defaultPresets,\n\tclassName,\n}: TimeRangeSelectorProps) {\n\tconst handlePresetClick = (preset: TimeRangePreset) => {\n\t\tconst range = getPresetRange(preset);\n\t\tonChange({ preset, ...range });\n\t};\n\n\treturn (\n\t\t<div className={cn('flex items-center gap-2', className)}>\n\t\t\t{/* Preset buttons */}\n\t\t\t<div className=\"flex rounded-md border border-border overflow-hidden\">\n\t\t\t\t{presets.map(({ label, value: preset }, index) => (\n\t\t\t\t\t<button\n\t\t\t\t\t\tkey={preset}\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={() => handlePresetClick(preset)}\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'px-3 py-1.5 text-sm font-medium transition-colors',\n\t\t\t\t\t\t\tvalue.preset === preset\n\t\t\t\t\t\t\t\t? 'bg-primary text-primary-foreground'\n\t\t\t\t\t\t\t\t: 'bg-card hover:bg-muted text-foreground',\n\t\t\t\t\t\t\tindex > 0 && 'border-l border-border',\n\t\t\t\t\t\t)}\n\t\t\t\t\t>\n\t\t\t\t\t\t{label}\n\t\t\t\t\t</button>\n\t\t\t\t))}\n\t\t\t</div>\n\t\t</div>\n\t);\n}\n\n/**\n * Create a time range from a preset\n */\nexport function createTimeRange(preset: TimeRangePreset = '1h'): TimeRange {\n\tconst range = getPresetRange(preset);\n\treturn { preset, ...range };\n}\n","'use client';\n\nimport {\n\tArrowDown,\n\tArrowUp,\n\tArrowUpDown,\n\tChevronLeft,\n\tChevronRight,\n\tChevronsLeft,\n\tChevronsRight,\n} from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\nimport { Button } from '../ui/button';\nimport {\n\tSelect,\n\tSelectContent,\n\tSelectItem,\n\tSelectTrigger,\n\tSelectValue,\n} from '../ui/select';\nimport {\n\tTable,\n\tTableBody,\n\tTableCell,\n\tTableHead,\n\tTableHeader,\n\tTableRow,\n} from '../ui/table';\n\nexport interface DataTableColumn<T> {\n\t/** Unique key for the column */\n\tkey: string;\n\t/** Header label */\n\theader: string | React.ReactNode;\n\t/** Accessor function to get cell value */\n\taccessor?: (row: T) => React.ReactNode;\n\t/** Whether this column is sortable */\n\tsortable?: boolean;\n\t/** Custom cell renderer */\n\tcell?: (row: T, index: number) => React.ReactNode;\n\t/** Column width */\n\twidth?: string | number;\n\t/** Alignment */\n\talign?: 'left' | 'center' | 'right';\n\t/** Custom header class */\n\theaderClassName?: string;\n\t/** Custom cell class */\n\tcellClassName?: string;\n}\n\nexport interface DataTableProps<T>\n\textends React.HTMLAttributes<HTMLDivElement> {\n\t/** Array of column definitions */\n\tcolumns: DataTableColumn<T>[];\n\t/** Array of data items */\n\tdata: T[];\n\t/** Key extractor for rows */\n\tgetRowKey?: (row: T, index: number) => string | number;\n\t/** Currently sorted column */\n\tsortColumn?: string;\n\t/** Sort direction */\n\tsortDirection?: 'asc' | 'desc';\n\t/** Callback when sort changes */\n\tonSortChange?: (column: string, direction: 'asc' | 'desc') => void;\n\t/** Whether to show pagination */\n\tpagination?: boolean;\n\t/** Current page (1-indexed) */\n\tpage?: number;\n\t/** Items per page */\n\tpageSize?: number;\n\t/** Total number of items (for server-side pagination) */\n\ttotalItems?: number;\n\t/** Callback when page changes */\n\tonPageChange?: (page: number) => void;\n\t/** Callback when page size changes */\n\tonPageSizeChange?: (pageSize: number) => void;\n\t/** Page size options */\n\tpageSizeOptions?: number[];\n\t/** Whether the table is loading */\n\tloading?: boolean;\n\t/** Empty state content */\n\temptyState?: React.ReactNode;\n\t/** Row click handler */\n\tonRowClick?: (row: T, index: number) => void;\n\t/** Selected row keys */\n\tselectedKeys?: Set<string | number>;\n\t/** Striped rows */\n\tstriped?: boolean;\n\t/** Hoverable rows */\n\thoverable?: boolean;\n\t/** Compact mode */\n\tcompact?: boolean;\n}\n\nfunction DataTableInner<T>(\n\t{\n\t\tclassName,\n\t\tcolumns,\n\t\tdata,\n\t\tgetRowKey = (_, index) => index,\n\t\tsortColumn,\n\t\tsortDirection,\n\t\tonSortChange,\n\t\tpagination = false,\n\t\tpage = 1,\n\t\tpageSize = 10,\n\t\ttotalItems,\n\t\tonPageChange,\n\t\tonPageSizeChange,\n\t\tpageSizeOptions = [10, 20, 50, 100],\n\t\tloading = false,\n\t\temptyState,\n\t\tonRowClick,\n\t\tselectedKeys,\n\t\tstriped = false,\n\t\thoverable = true,\n\t\tcompact = false,\n\t\t...props\n\t}: DataTableProps<T>,\n\tref: React.ForwardedRef<HTMLDivElement>,\n) {\n\tconst total = totalItems ?? data.length;\n\tconst totalPages = Math.ceil(total / pageSize);\n\n\tconst handleSort = (columnKey: string) => {\n\t\tif (!onSortChange) return;\n\n\t\tif (sortColumn === columnKey) {\n\t\t\tonSortChange(columnKey, sortDirection === 'asc' ? 'desc' : 'asc');\n\t\t} else {\n\t\t\tonSortChange(columnKey, 'asc');\n\t\t}\n\t};\n\n\tconst getSortIcon = (columnKey: string) => {\n\t\tif (sortColumn !== columnKey) {\n\t\t\treturn <ArrowUpDown className=\"ml-1 h-3.5 w-3.5 text-muted-foreground\" />;\n\t\t}\n\t\treturn sortDirection === 'asc' ? (\n\t\t\t<ArrowUp className=\"ml-1 h-3.5 w-3.5\" />\n\t\t) : (\n\t\t\t<ArrowDown className=\"ml-1 h-3.5 w-3.5\" />\n\t\t);\n\t};\n\n\tconst getAlignClass = (align?: 'left' | 'center' | 'right') => {\n\t\tswitch (align) {\n\t\t\tcase 'center':\n\t\t\t\treturn 'text-center';\n\t\t\tcase 'right':\n\t\t\t\treturn 'text-right';\n\t\t\tdefault:\n\t\t\t\treturn 'text-left';\n\t\t}\n\t};\n\n\treturn (\n\t\t<div ref={ref} className={cn('w-full', className)} {...props}>\n\t\t\t<div className=\"rounded-md border border-border overflow-hidden\">\n\t\t\t\t<Table>\n\t\t\t\t\t<TableHeader>\n\t\t\t\t\t\t<TableRow className=\"hover:bg-transparent\">\n\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t<TableHead\n\t\t\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\tgetAlignClass(column.align),\n\t\t\t\t\t\t\t\t\t\tcolumn.sortable && 'cursor-pointer select-none',\n\t\t\t\t\t\t\t\t\t\tcompact ? 'py-2' : 'py-3',\n\t\t\t\t\t\t\t\t\t\tcolumn.headerClassName,\n\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\tstyle={{ width: column.width }}\n\t\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\t\tcolumn.sortable ? () => handleSort(column.key) : undefined\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t<div\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t'flex items-center',\n\t\t\t\t\t\t\t\t\t\t\tcolumn.align === 'center' && 'justify-center',\n\t\t\t\t\t\t\t\t\t\t\tcolumn.align === 'right' && 'justify-end',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{column.header}\n\t\t\t\t\t\t\t\t\t\t{column.sortable && getSortIcon(column.key)}\n\t\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t\t</TableHead>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t</TableHeader>\n\t\t\t\t\t<TableBody>\n\t\t\t\t\t\t{loading ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\tcolSpan={columns.length}\n\t\t\t\t\t\t\t\t\tclassName=\"h-24 text-center text-muted-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\tLoading...\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : data.length === 0 ? (\n\t\t\t\t\t\t\t<TableRow>\n\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\tcolSpan={columns.length}\n\t\t\t\t\t\t\t\t\tclassName=\"h-24 text-center text-muted-foreground\"\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t{emptyState ?? 'No data available'}\n\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\tdata.map((row, rowIndex) => {\n\t\t\t\t\t\t\t\tconst rowKey = getRowKey(row, rowIndex);\n\t\t\t\t\t\t\t\tconst isSelected = selectedKeys?.has(rowKey);\n\n\t\t\t\t\t\t\t\treturn (\n\t\t\t\t\t\t\t\t\t<TableRow\n\t\t\t\t\t\t\t\t\t\tkey={rowKey}\n\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\tstriped && rowIndex % 2 === 1 && 'bg-surface/50',\n\t\t\t\t\t\t\t\t\t\t\thoverable && 'hover:bg-surface-hover cursor-pointer',\n\t\t\t\t\t\t\t\t\t\t\tisSelected && 'bg-accent/10',\n\t\t\t\t\t\t\t\t\t\t\tonRowClick && 'cursor-pointer',\n\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\tonClick={\n\t\t\t\t\t\t\t\t\t\t\tonRowClick ? () => onRowClick(row, rowIndex) : undefined\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t{columns.map((column) => (\n\t\t\t\t\t\t\t\t\t\t\t<TableCell\n\t\t\t\t\t\t\t\t\t\t\t\tkey={column.key}\n\t\t\t\t\t\t\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t\t\t\t\t\t\tgetAlignClass(column.align),\n\t\t\t\t\t\t\t\t\t\t\t\t\tcompact ? 'py-2' : 'py-3',\n\t\t\t\t\t\t\t\t\t\t\t\t\tcolumn.cellClassName,\n\t\t\t\t\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t\t\t\t{column.cell\n\t\t\t\t\t\t\t\t\t\t\t\t\t? column.cell(row, rowIndex)\n\t\t\t\t\t\t\t\t\t\t\t\t\t: column.accessor\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t? column.accessor(row)\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t: ((row as Record<string, unknown>)[\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\tcolumn.key\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t] as React.ReactNode)}\n\t\t\t\t\t\t\t\t\t\t\t</TableCell>\n\t\t\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t\t\t</TableRow>\n\t\t\t\t\t\t\t\t);\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t)}\n\t\t\t\t\t</TableBody>\n\t\t\t\t</Table>\n\t\t\t</div>\n\n\t\t\t{pagination && totalPages > 0 && (\n\t\t\t\t<div className=\"flex items-center justify-between px-2 py-4\">\n\t\t\t\t\t<div className=\"flex items-center gap-2 text-sm text-muted-foreground\">\n\t\t\t\t\t\t<span>Rows per page:</span>\n\t\t\t\t\t\t<Select\n\t\t\t\t\t\t\tvalue={String(pageSize)}\n\t\t\t\t\t\t\tonValueChange={(value) => onPageSizeChange?.(Number(value))}\n\t\t\t\t\t\t>\n\t\t\t\t\t\t\t<SelectTrigger className=\"h-8 w-[70px]\">\n\t\t\t\t\t\t\t\t<SelectValue />\n\t\t\t\t\t\t\t</SelectTrigger>\n\t\t\t\t\t\t\t<SelectContent>\n\t\t\t\t\t\t\t\t{pageSizeOptions.map((size) => (\n\t\t\t\t\t\t\t\t\t<SelectItem key={size} value={String(size)}>\n\t\t\t\t\t\t\t\t\t\t{size}\n\t\t\t\t\t\t\t\t\t</SelectItem>\n\t\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t\t</SelectContent>\n\t\t\t\t\t\t</Select>\n\t\t\t\t\t</div>\n\n\t\t\t\t\t<div className=\"flex items-center gap-2\">\n\t\t\t\t\t\t<span className=\"text-sm text-muted-foreground\">\n\t\t\t\t\t\t\tPage {page} of {totalPages}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<div className=\"flex items-center gap-1\">\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t\t\tonClick={() => onPageChange?.(1)}\n\t\t\t\t\t\t\t\tdisabled={page <= 1}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronsLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t\t\tonClick={() => onPageChange?.(page - 1)}\n\t\t\t\t\t\t\t\tdisabled={page <= 1}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronLeft className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t\t\tonClick={() => onPageChange?.(page + 1)}\n\t\t\t\t\t\t\t\tdisabled={page >= totalPages}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronRight className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t\t<Button\n\t\t\t\t\t\t\t\tvariant=\"outline\"\n\t\t\t\t\t\t\t\tsize=\"icon\"\n\t\t\t\t\t\t\t\tclassName=\"h-8 w-8\"\n\t\t\t\t\t\t\t\tonClick={() => onPageChange?.(totalPages)}\n\t\t\t\t\t\t\t\tdisabled={page >= totalPages}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t<ChevronsRight className=\"h-4 w-4\" />\n\t\t\t\t\t\t\t</Button>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t)}\n\t\t</div>\n\t);\n}\n\nexport const DataTable = React.forwardRef(DataTableInner) as <T>(\n\tprops: DataTableProps<T> & { ref?: React.ForwardedRef<HTMLDivElement> },\n) => React.ReactElement;\n","'use client';\n\nimport { Check, ChevronDown, ChevronRight, Copy } from 'lucide-react';\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface JsonViewerProps extends React.HTMLAttributes<HTMLDivElement> {\n\t/** The JSON data to display */\n\tdata: unknown;\n\t/** Whether to start expanded */\n\tdefaultExpanded?: boolean;\n\t/** Maximum depth to expand by default */\n\texpandDepth?: number;\n\t/** Whether to show copy button */\n\tcopyable?: boolean;\n\t/** Custom class for keys */\n\tkeyClassName?: string;\n\t/** Custom class for values */\n\tvalueClassName?: string;\n}\n\nconst JsonViewer = React.forwardRef<HTMLDivElement, JsonViewerProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tdata,\n\t\t\tdefaultExpanded = true,\n\t\t\texpandDepth = 2,\n\t\t\tcopyable = true,\n\t\t\tkeyClassName,\n\t\t\tvalueClassName,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst [copied, setCopied] = React.useState(false);\n\n\t\tconst handleCopy = async () => {\n\t\t\tawait navigator.clipboard.writeText(JSON.stringify(data, null, 2));\n\t\t\tsetCopied(true);\n\t\t\tsetTimeout(() => setCopied(false), 2000);\n\t\t};\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'relative rounded-md bg-surface border border-border font-mono text-sm',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{copyable && (\n\t\t\t\t\t<button\n\t\t\t\t\t\ttype=\"button\"\n\t\t\t\t\t\tonClick={handleCopy}\n\t\t\t\t\t\tclassName=\"absolute right-2 top-2 p-1.5 rounded-md hover:bg-surface-hover text-muted-foreground hover:text-foreground transition-colors\"\n\t\t\t\t\t\taria-label=\"Copy JSON\"\n\t\t\t\t\t>\n\t\t\t\t\t\t{copied ? (\n\t\t\t\t\t\t\t<Check className=\"h-4 w-4 text-green-500\" />\n\t\t\t\t\t\t) : (\n\t\t\t\t\t\t\t<Copy className=\"h-4 w-4\" />\n\t\t\t\t\t\t)}\n\t\t\t\t\t</button>\n\t\t\t\t)}\n\t\t\t\t<div className=\"p-3 overflow-auto\">\n\t\t\t\t\t<JsonNode\n\t\t\t\t\t\tdata={data}\n\t\t\t\t\t\tdepth={0}\n\t\t\t\t\t\tdefaultExpanded={defaultExpanded}\n\t\t\t\t\t\texpandDepth={expandDepth}\n\t\t\t\t\t\tkeyClassName={keyClassName}\n\t\t\t\t\t\tvalueClassName={valueClassName}\n\t\t\t\t\t/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\nJsonViewer.displayName = 'JsonViewer';\n\ninterface JsonNodeProps {\n\tdata: unknown;\n\tdepth: number;\n\tdefaultExpanded: boolean;\n\texpandDepth: number;\n\tkeyClassName?: string;\n\tvalueClassName?: string;\n\tpropertyKey?: string;\n\tisLast?: boolean;\n}\n\nfunction JsonNode({\n\tdata,\n\tdepth,\n\tdefaultExpanded,\n\texpandDepth,\n\tkeyClassName,\n\tvalueClassName,\n\tpropertyKey,\n\tisLast = true,\n}: JsonNodeProps) {\n\tconst [expanded, setExpanded] = React.useState(\n\t\tdefaultExpanded && depth < expandDepth,\n\t);\n\n\tconst indent = depth * 16;\n\n\t// Null\n\tif (data === null) {\n\t\treturn (\n\t\t\t<span className=\"inline\">\n\t\t\t\t{propertyKey && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<span className={cn('text-orange-400', valueClassName)}>null</span>\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// Undefined\n\tif (data === undefined) {\n\t\treturn (\n\t\t\t<span className=\"inline\">\n\t\t\t\t{propertyKey && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<span className={cn('text-gray-500', valueClassName)}>undefined</span>\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// Boolean\n\tif (typeof data === 'boolean') {\n\t\treturn (\n\t\t\t<span className=\"inline\">\n\t\t\t\t{propertyKey && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<span className={cn('text-blue-400', valueClassName)}>\n\t\t\t\t\t{String(data)}\n\t\t\t\t</span>\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// Number\n\tif (typeof data === 'number') {\n\t\treturn (\n\t\t\t<span className=\"inline\">\n\t\t\t\t{propertyKey && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<span className={cn('text-amber-400', valueClassName)}>{data}</span>\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// String\n\tif (typeof data === 'string') {\n\t\treturn (\n\t\t\t<span className=\"inline\">\n\t\t\t\t{propertyKey && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t</span>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t<span className={cn('text-green-400', valueClassName)}>\"{data}\"</span>\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</span>\n\t\t);\n\t}\n\n\t// Array\n\tif (Array.isArray(data)) {\n\t\tif (data.length === 0) {\n\t\t\treturn (\n\t\t\t\t<span className=\"inline\">\n\t\t\t\t\t{propertyKey && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"text-muted-foreground\">[]</span>\n\t\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div className=\"inline-block\">\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"inline-flex items-center cursor-pointer hover:text-foreground text-muted-foreground\"\n\t\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\t>\n\t\t\t\t\t{expanded ? (\n\t\t\t\t\t\t<ChevronDown className=\"h-3.5 w-3.5 mr-0.5\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronRight className=\"h-3.5 w-3.5 mr-0.5\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{propertyKey && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"text-muted-foreground\">[</span>\n\t\t\t\t\t{!expanded && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground mx-1\">\n\t\t\t\t\t\t\t\t{data.length} items\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">]</span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t{expanded && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div style={{ paddingLeft: indent + 16 }}>\n\t\t\t\t\t\t\t{data.map((item, index) => (\n\t\t\t\t\t\t\t\t<div key={index}>\n\t\t\t\t\t\t\t\t\t<JsonNode\n\t\t\t\t\t\t\t\t\t\tdata={item}\n\t\t\t\t\t\t\t\t\t\tdepth={depth + 1}\n\t\t\t\t\t\t\t\t\t\tdefaultExpanded={defaultExpanded}\n\t\t\t\t\t\t\t\t\t\texpandDepth={expandDepth}\n\t\t\t\t\t\t\t\t\t\tkeyClassName={keyClassName}\n\t\t\t\t\t\t\t\t\t\tvalueClassName={valueClassName}\n\t\t\t\t\t\t\t\t\t\tisLast={index === data.length - 1}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">]</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Object\n\tif (typeof data === 'object') {\n\t\tconst entries = Object.entries(data as Record<string, unknown>);\n\n\t\tif (entries.length === 0) {\n\t\t\treturn (\n\t\t\t\t<span className=\"inline\">\n\t\t\t\t\t{propertyKey && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"text-muted-foreground\">{'{}'}</span>\n\t\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t\t</span>\n\t\t\t);\n\t\t}\n\n\t\treturn (\n\t\t\t<div className=\"inline-block\">\n\t\t\t\t<span\n\t\t\t\t\tclassName=\"inline-flex items-center cursor-pointer hover:text-foreground text-muted-foreground\"\n\t\t\t\t\tonClick={() => setExpanded(!expanded)}\n\t\t\t\t>\n\t\t\t\t\t{expanded ? (\n\t\t\t\t\t\t<ChevronDown className=\"h-3.5 w-3.5 mr-0.5\" />\n\t\t\t\t\t) : (\n\t\t\t\t\t\t<ChevronRight className=\"h-3.5 w-3.5 mr-0.5\" />\n\t\t\t\t\t)}\n\t\t\t\t\t{propertyKey && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className={cn('text-purple-400', keyClassName)}>\n\t\t\t\t\t\t\t\t\"{propertyKey}\"\n\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">: </span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t\t<span className=\"text-muted-foreground\">{'{'}</span>\n\t\t\t\t\t{!expanded && (\n\t\t\t\t\t\t<>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground mx-1\">...</span>\n\t\t\t\t\t\t\t<span className=\"text-muted-foreground\">{'}'}</span>\n\t\t\t\t\t\t</>\n\t\t\t\t\t)}\n\t\t\t\t</span>\n\t\t\t\t{expanded && (\n\t\t\t\t\t<>\n\t\t\t\t\t\t<div style={{ paddingLeft: indent + 16 }}>\n\t\t\t\t\t\t\t{entries.map(([key, value], index) => (\n\t\t\t\t\t\t\t\t<div key={key}>\n\t\t\t\t\t\t\t\t\t<JsonNode\n\t\t\t\t\t\t\t\t\t\tdata={value}\n\t\t\t\t\t\t\t\t\t\tdepth={depth + 1}\n\t\t\t\t\t\t\t\t\t\tdefaultExpanded={defaultExpanded}\n\t\t\t\t\t\t\t\t\t\texpandDepth={expandDepth}\n\t\t\t\t\t\t\t\t\t\tkeyClassName={keyClassName}\n\t\t\t\t\t\t\t\t\t\tvalueClassName={valueClassName}\n\t\t\t\t\t\t\t\t\t\tpropertyKey={key}\n\t\t\t\t\t\t\t\t\t\tisLast={index === entries.length - 1}\n\t\t\t\t\t\t\t\t\t/>\n\t\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t\t))}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t\t<span className=\"text-muted-foreground\">{'}'}</span>\n\t\t\t\t\t</>\n\t\t\t\t)}\n\t\t\t\t{!isLast && <span className=\"text-muted-foreground\">,</span>}\n\t\t\t</div>\n\t\t);\n\t}\n\n\t// Fallback\n\treturn (\n\t\t<span className={cn('text-muted-foreground', valueClassName)}>\n\t\t\t{String(data)}\n\t\t</span>\n\t);\n}\n\nexport { JsonViewer };\n","'use client';\n\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\n\nexport interface SparklineProps extends React.SVGAttributes<SVGSVGElement> {\n\t/** Array of data points */\n\tdata: number[];\n\t/** Width of the sparkline */\n\twidth?: number;\n\t/** Height of the sparkline */\n\theight?: number;\n\t/** Stroke color */\n\tcolor?: string;\n\t/** Stroke width */\n\tstrokeWidth?: number;\n\t/** Whether to show filled area under the line */\n\tfilled?: boolean;\n\t/** Fill opacity (0-1) */\n\tfillOpacity?: number;\n\t/** Whether to show dots at data points */\n\tshowDots?: boolean;\n\t/** Whether to curve the line */\n\tcurved?: boolean;\n\t/** Minimum value (defaults to min of data) */\n\tmin?: number;\n\t/** Maximum value (defaults to max of data) */\n\tmax?: number;\n}\n\nconst Sparkline = React.forwardRef<SVGSVGElement, SparklineProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tdata,\n\t\t\twidth = 100,\n\t\t\theight = 32,\n\t\t\tcolor = 'currentColor',\n\t\t\tstrokeWidth = 2,\n\t\t\tfilled = false,\n\t\t\tfillOpacity = 0.2,\n\t\t\tshowDots = false,\n\t\t\tcurved = true,\n\t\t\tmin: minProp,\n\t\t\tmax: maxProp,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tif (data.length === 0) {\n\t\t\treturn (\n\t\t\t\t<svg\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn('text-accent', className)}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={height}\n\t\t\t\t\tviewBox={`0 0 ${width} ${height}`}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tconst min = minProp ?? Math.min(...data);\n\t\tconst max = maxProp ?? Math.max(...data);\n\t\tconst range = max - min || 1;\n\n\t\tconst padding = strokeWidth;\n\t\tconst chartWidth = width - padding * 2;\n\t\tconst chartHeight = height - padding * 2;\n\n\t\t// Calculate points\n\t\tconst points = data.map((value, index) => {\n\t\t\tconst x = padding + (index / (data.length - 1 || 1)) * chartWidth;\n\t\t\tconst y = padding + chartHeight - ((value - min) / range) * chartHeight;\n\t\t\treturn { x, y };\n\t\t});\n\n\t\t// Create path\n\t\tlet pathD: string;\n\t\tif (curved && points.length > 2) {\n\t\t\t// Curved line using quadratic bezier curves\n\t\t\tpathD = points.reduce((acc, point, index) => {\n\t\t\t\tif (index === 0) {\n\t\t\t\t\treturn `M ${point.x},${point.y}`;\n\t\t\t\t}\n\t\t\t\tconst prev = points[index - 1]!;\n\t\t\t\tconst cpX = (prev.x + point.x) / 2;\n\t\t\t\treturn `${acc} Q ${prev.x},${prev.y} ${cpX},${(prev.y + point.y) / 2} T ${point.x},${point.y}`;\n\t\t\t}, '');\n\t\t} else {\n\t\t\t// Straight lines\n\t\t\tpathD = points\n\t\t\t\t.map((point, index) =>\n\t\t\t\t\tindex === 0 ? `M ${point.x},${point.y}` : `L ${point.x},${point.y}`,\n\t\t\t\t)\n\t\t\t\t.join(' ');\n\t\t}\n\n\t\t// Create fill path\n\t\tconst fillPathD = filled\n\t\t\t? `${pathD} L ${points[points.length - 1]?.x},${height - padding} L ${points[0]?.x},${height - padding} Z`\n\t\t\t: '';\n\n\t\treturn (\n\t\t\t<svg\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn('text-accent', className)}\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\tviewBox={`0 0 ${width} ${height}`}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{filled && (\n\t\t\t\t\t<path\n\t\t\t\t\t\td={fillPathD}\n\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\topacity={fillOpacity}\n\t\t\t\t\t\tstrokeWidth={0}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<path\n\t\t\t\t\td={pathD}\n\t\t\t\t\tfill=\"none\"\n\t\t\t\t\tstroke={color}\n\t\t\t\t\tstrokeWidth={strokeWidth}\n\t\t\t\t\tstrokeLinecap=\"round\"\n\t\t\t\t\tstrokeLinejoin=\"round\"\n\t\t\t\t/>\n\t\t\t\t{showDots &&\n\t\t\t\t\tpoints.map((point, index) => (\n\t\t\t\t\t\t<circle\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tcx={point.x}\n\t\t\t\t\t\t\tcy={point.y}\n\t\t\t\t\t\t\tr={strokeWidth + 1}\n\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t/>\n\t\t\t\t\t))}\n\t\t\t</svg>\n\t\t);\n\t},\n);\nSparkline.displayName = 'Sparkline';\n\nexport interface SparkBarProps extends React.SVGAttributes<SVGSVGElement> {\n\t/** Array of data points */\n\tdata: number[];\n\t/** Width of the chart */\n\twidth?: number;\n\t/** Height of the chart */\n\theight?: number;\n\t/** Bar color */\n\tcolor?: string;\n\t/** Gap between bars (as a ratio 0-1) */\n\tgap?: number;\n\t/** Minimum value (defaults to 0) */\n\tmin?: number;\n\t/** Maximum value (defaults to max of data) */\n\tmax?: number;\n\t/** Border radius of bars */\n\tradius?: number;\n}\n\nconst SparkBar = React.forwardRef<SVGSVGElement, SparkBarProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tdata,\n\t\t\twidth = 100,\n\t\t\theight = 32,\n\t\t\tcolor = 'currentColor',\n\t\t\tgap = 0.2,\n\t\t\tmin: minProp = 0,\n\t\t\tmax: maxProp,\n\t\t\tradius = 2,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tif (data.length === 0) {\n\t\t\treturn (\n\t\t\t\t<svg\n\t\t\t\t\tref={ref}\n\t\t\t\t\tclassName={cn('text-accent', className)}\n\t\t\t\t\twidth={width}\n\t\t\t\t\theight={height}\n\t\t\t\t\tviewBox={`0 0 ${width} ${height}`}\n\t\t\t\t\t{...props}\n\t\t\t\t/>\n\t\t\t);\n\t\t}\n\n\t\tconst min = minProp;\n\t\tconst max = maxProp ?? Math.max(...data);\n\t\tconst range = max - min || 1;\n\n\t\tconst barWidth = width / data.length;\n\t\tconst gapWidth = barWidth * gap;\n\t\tconst actualBarWidth = barWidth - gapWidth;\n\n\t\treturn (\n\t\t\t<svg\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn('text-accent', className)}\n\t\t\t\twidth={width}\n\t\t\t\theight={height}\n\t\t\t\tviewBox={`0 0 ${width} ${height}`}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{data.map((value, index) => {\n\t\t\t\t\tconst barHeight = ((value - min) / range) * height;\n\t\t\t\t\tconst x = index * barWidth + gapWidth / 2;\n\t\t\t\t\tconst y = height - barHeight;\n\n\t\t\t\t\treturn (\n\t\t\t\t\t\t<rect\n\t\t\t\t\t\t\tkey={index}\n\t\t\t\t\t\t\tx={x}\n\t\t\t\t\t\t\ty={y}\n\t\t\t\t\t\t\twidth={actualBarWidth}\n\t\t\t\t\t\t\theight={barHeight}\n\t\t\t\t\t\t\tfill={color}\n\t\t\t\t\t\t\trx={radius}\n\t\t\t\t\t\t\try={radius}\n\t\t\t\t\t\t/>\n\t\t\t\t\t);\n\t\t\t\t})}\n\t\t\t</svg>\n\t\t);\n\t},\n);\nSparkBar.displayName = 'SparkBar';\n\nexport interface MetricCardProps extends React.HTMLAttributes<HTMLDivElement> {\n\t/** Card title */\n\ttitle: string;\n\t/** Main value to display */\n\tvalue: string | number;\n\t/** Optional description or subtext */\n\tdescription?: string;\n\t/** Sparkline data */\n\tsparklineData?: number[];\n\t/** Trend direction */\n\ttrend?: 'up' | 'down' | 'neutral';\n\t/** Trend value (e.g., \"+12%\") */\n\ttrendValue?: string;\n\t/** Icon to display */\n\ticon?: React.ReactNode;\n}\n\nconst MetricCard = React.forwardRef<HTMLDivElement, MetricCardProps>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\ttitle,\n\t\t\tvalue,\n\t\t\tdescription,\n\t\t\tsparklineData,\n\t\t\ttrend,\n\t\t\ttrendValue,\n\t\t\ticon,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst trendColor =\n\t\t\ttrend === 'up'\n\t\t\t\t? 'text-green-500'\n\t\t\t\t: trend === 'down'\n\t\t\t\t\t? 'text-red-500'\n\t\t\t\t\t: 'text-muted-foreground';\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'rounded-lg border border-border bg-surface p-4',\n\t\t\t\t\tclassName,\n\t\t\t\t)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t<div className=\"flex items-center justify-between\">\n\t\t\t\t\t<span className=\"text-sm font-medium text-muted-foreground\">\n\t\t\t\t\t\t{title}\n\t\t\t\t\t</span>\n\t\t\t\t\t{icon && <span className=\"text-muted-foreground\">{icon}</span>}\n\t\t\t\t</div>\n\t\t\t\t<div className=\"mt-2 flex items-end justify-between\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<div className=\"text-2xl font-bold text-foreground\">{value}</div>\n\t\t\t\t\t\t{(description || trendValue) && (\n\t\t\t\t\t\t\t<div className=\"mt-1 flex items-center gap-1\">\n\t\t\t\t\t\t\t\t{trendValue && (\n\t\t\t\t\t\t\t\t\t<span className={cn('text-xs font-medium', trendColor)}>\n\t\t\t\t\t\t\t\t\t\t{trendValue}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t\t{description && (\n\t\t\t\t\t\t\t\t\t<span className=\"text-xs text-muted-foreground\">\n\t\t\t\t\t\t\t\t\t\t{description}\n\t\t\t\t\t\t\t\t\t</span>\n\t\t\t\t\t\t\t\t)}\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t)}\n\t\t\t\t\t</div>\n\t\t\t\t\t{sparklineData && sparklineData.length > 0 && (\n\t\t\t\t\t\t<Sparkline\n\t\t\t\t\t\t\tdata={sparklineData}\n\t\t\t\t\t\t\twidth={80}\n\t\t\t\t\t\t\theight={32}\n\t\t\t\t\t\t\tfilled\n\t\t\t\t\t\t\tclassName={\n\t\t\t\t\t\t\t\ttrend === 'up'\n\t\t\t\t\t\t\t\t\t? 'text-green-500'\n\t\t\t\t\t\t\t\t\t: trend === 'down'\n\t\t\t\t\t\t\t\t\t\t? 'text-red-500'\n\t\t\t\t\t\t\t\t\t\t: 'text-accent'\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t/>\n\t\t\t\t\t)}\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t);\n\t},\n);\nMetricCard.displayName = 'MetricCard';\n\nexport { Sparkline, SparkBar, MetricCard };\n","'use client';\n\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport * as React from 'react';\nimport { cn } from '../../lib/utils';\n\nconst timelineVariants = cva('relative', {\n\tvariants: {\n\t\torientation: {\n\t\t\tvertical: 'flex flex-col',\n\t\t\thorizontal: 'flex flex-row',\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\torientation: 'vertical',\n\t},\n});\n\nexport interface TimelineProps\n\textends React.HTMLAttributes<HTMLDivElement>,\n\t\tVariantProps<typeof timelineVariants> {}\n\nconst Timeline = React.forwardRef<HTMLDivElement, TimelineProps>(\n\t({ className, orientation = 'vertical', children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(timelineVariants({ orientation, className }))}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\nTimeline.displayName = 'Timeline';\n\nconst timelineItemVariants = cva('relative flex', {\n\tvariants: {\n\t\torientation: {\n\t\t\tvertical: 'flex-row gap-4 pb-8 last:pb-0',\n\t\t\thorizontal: 'flex-col gap-2 pr-8 last:pr-0',\n\t\t},\n\t},\n\tdefaultVariants: {\n\t\torientation: 'vertical',\n\t},\n});\n\nexport interface TimelineItemProps\n\textends React.HTMLAttributes<HTMLDivElement>,\n\t\tVariantProps<typeof timelineItemVariants> {\n\t/** Whether this is the active/current item */\n\tactive?: boolean;\n}\n\nconst TimelineItem = React.forwardRef<HTMLDivElement, TimelineItemProps>(\n\t(\n\t\t{ className, orientation = 'vertical', active, children, ...props },\n\t\tref,\n\t) => {\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(timelineItemVariants({ orientation, className }))}\n\t\t\t\tdata-active={active}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\nTimelineItem.displayName = 'TimelineItem';\n\nconst timelineIndicatorVariants = cva(\n\t'flex items-center justify-center rounded-full border-2 shrink-0',\n\t{\n\t\tvariants: {\n\t\t\tsize: {\n\t\t\t\tsm: 'h-3 w-3',\n\t\t\t\tmd: 'h-4 w-4',\n\t\t\t\tlg: 'h-6 w-6',\n\t\t\t},\n\t\t\tvariant: {\n\t\t\t\tdefault: 'border-border bg-surface',\n\t\t\t\tprimary: 'border-accent bg-accent',\n\t\t\t\tsuccess: 'border-green-500 bg-green-500',\n\t\t\t\twarning: 'border-amber-500 bg-amber-500',\n\t\t\t\terror: 'border-red-500 bg-red-500',\n\t\t\t\tinfo: 'border-blue-500 bg-blue-500',\n\t\t\t\tmuted: 'border-muted-foreground bg-muted',\n\t\t\t},\n\t\t},\n\t\tdefaultVariants: {\n\t\t\tsize: 'md',\n\t\t\tvariant: 'default',\n\t\t},\n\t},\n);\n\nexport interface TimelineIndicatorProps\n\textends React.HTMLAttributes<HTMLDivElement>,\n\t\tVariantProps<typeof timelineIndicatorVariants> {\n\t/** Whether to show a connecting line */\n\tshowLine?: boolean;\n\t/** Line position */\n\tlinePosition?: 'before' | 'after' | 'both';\n\t/** Orientation (inherited from Timeline) */\n\torientation?: 'vertical' | 'horizontal';\n}\n\nconst TimelineIndicator = React.forwardRef<\n\tHTMLDivElement,\n\tTimelineIndicatorProps\n>(\n\t(\n\t\t{\n\t\t\tclassName,\n\t\t\tsize,\n\t\t\tvariant,\n\t\t\tshowLine = true,\n\t\t\tlinePosition = 'after',\n\t\t\torientation = 'vertical',\n\t\t\tchildren,\n\t\t\t...props\n\t\t},\n\t\tref,\n\t) => {\n\t\tconst isVertical = orientation === 'vertical';\n\n\t\treturn (\n\t\t\t<div\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn(\n\t\t\t\t\t'relative flex items-center',\n\t\t\t\t\tisVertical ? 'flex-col' : 'flex-row',\n\t\t\t\t)}\n\t\t\t>\n\t\t\t\t{showLine && (linePosition === 'before' || linePosition === 'both') && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'bg-border',\n\t\t\t\t\t\t\tisVertical ? 'w-0.5 flex-1' : 'h-0.5 flex-1',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t\t<div\n\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\ttimelineIndicatorVariants({ size, variant, className }),\n\t\t\t\t\t)}\n\t\t\t\t\t{...props}\n\t\t\t\t>\n\t\t\t\t\t{children}\n\t\t\t\t</div>\n\t\t\t\t{showLine && (linePosition === 'after' || linePosition === 'both') && (\n\t\t\t\t\t<div\n\t\t\t\t\t\tclassName={cn(\n\t\t\t\t\t\t\t'bg-border',\n\t\t\t\t\t\t\tisVertical ? 'w-0.5 flex-1' : 'h-0.5 flex-1',\n\t\t\t\t\t\t)}\n\t\t\t\t\t/>\n\t\t\t\t)}\n\t\t\t</div>\n\t\t);\n\t},\n);\nTimelineIndicator.displayName = 'TimelineIndicator';\n\nexport interface TimelineConnectorProps\n\textends React.HTMLAttributes<HTMLDivElement> {\n\t/** Orientation (inherited from Timeline) */\n\torientation?: 'vertical' | 'horizontal';\n}\n\nconst TimelineConnector = React.forwardRef<\n\tHTMLDivElement,\n\tTimelineConnectorProps\n>(({ className, orientation = 'vertical', ...props }, ref) => {\n\tconst isVertical = orientation === 'vertical';\n\n\treturn (\n\t\t<div\n\t\t\tref={ref}\n\t\t\tclassName={cn(\n\t\t\t\t'bg-border',\n\t\t\t\tisVertical\n\t\t\t\t\t? 'absolute left-[7px] top-4 bottom-0 w-0.5'\n\t\t\t\t\t: 'absolute top-[7px] left-4 right-0 h-0.5',\n\t\t\t\tclassName,\n\t\t\t)}\n\t\t\t{...props}\n\t\t/>\n\t);\n});\nTimelineConnector.displayName = 'TimelineConnector';\n\nexport interface TimelineContentProps\n\textends React.HTMLAttributes<HTMLDivElement> {}\n\nconst TimelineContent = React.forwardRef<HTMLDivElement, TimelineContentProps>(\n\t({ className, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<div ref={ref} className={cn('flex-1 pt-0.5', className)} {...props}>\n\t\t\t\t{children}\n\t\t\t</div>\n\t\t);\n\t},\n);\nTimelineContent.displayName = 'TimelineContent';\n\nexport interface TimelineTitleProps\n\textends React.HTMLAttributes<HTMLHeadingElement> {}\n\nconst TimelineTitle = React.forwardRef<HTMLHeadingElement, TimelineTitleProps>(\n\t({ className, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<h4\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn('text-sm font-medium text-foreground', className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</h4>\n\t\t);\n\t},\n);\nTimelineTitle.displayName = 'TimelineTitle';\n\nexport interface TimelineDescriptionProps\n\textends React.HTMLAttributes<HTMLParagraphElement> {}\n\nconst TimelineDescription = React.forwardRef<\n\tHTMLParagraphElement,\n\tTimelineDescriptionProps\n>(({ className, children, ...props }, ref) => {\n\treturn (\n\t\t<p\n\t\t\tref={ref}\n\t\t\tclassName={cn('text-sm text-muted-foreground', className)}\n\t\t\t{...props}\n\t\t>\n\t\t\t{children}\n\t\t</p>\n\t);\n});\nTimelineDescription.displayName = 'TimelineDescription';\n\nexport interface TimelineTimeProps\n\textends React.HTMLAttributes<HTMLSpanElement> {}\n\nconst TimelineTime = React.forwardRef<HTMLSpanElement, TimelineTimeProps>(\n\t({ className, children, ...props }, ref) => {\n\t\treturn (\n\t\t\t<span\n\t\t\t\tref={ref}\n\t\t\t\tclassName={cn('text-xs text-muted-foreground', className)}\n\t\t\t\t{...props}\n\t\t\t>\n\t\t\t\t{children}\n\t\t\t</span>\n\t\t);\n\t},\n);\nTimelineTime.displayName = 'TimelineTime';\n\nexport {\n\tTimeline,\n\tTimelineItem,\n\tTimelineIndicator,\n\tTimelineConnector,\n\tTimelineContent,\n\tTimelineTitle,\n\tTimelineDescription,\n\tTimelineTime,\n\ttimelineVariants,\n\ttimelineItemVariants,\n\ttimelineIndicatorVariants,\n};\n"],"mappings":";;;;;;;;;;;AAuCA,MAAMA,YAAoC;CACzC,MAAM;CACN,KAAK;CACL,OAAO;CACP,OAAO;CACP,QAAQ;AACR;AAED,SAAgB,oBAAoB,EACnC,MACA,eAAe,SACf,gBACA,eAAe,QACf,iBAAiB,OACjB,aAAa,SACb,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAC1C,WACA,YAC0B,EAAE;AAC5B,KAAI,KAAK,WAAW,EACnB,wBACC,IAAC;EAAI,WAAU;YAAsE;GAE/E;CAIR,MAAM,eACL,kBAAkB,KAAK,KAAK,CAAC,MAAM,EAAE,0BAA6B;CAEnE,MAAM,YAAY,KAAK,IAAI,CAAC,WAAW;EACtC,MAAM,OAAO,IAAI,KAAK,MAAM,YAAY,WAAW;EACnD,WAAW,MAAM;GAChB,eAAe,MAAM;EACtB,GAAI,gBAAgB,iBACjB,GAAG,iBAAiB,MAAM,kBAAkB,EAAG,IAC/C,CAAE;CACL,GAAE;CAEH,MAAM,oBAAoB,UAAU,iBAAiB;CACrD,MAAM,sBAAsB,UAAU,mBAAmB;CAEzD,MAAM,mBAAmB,cAAc;AAEvC,wBACC,KAAC;EAAI,WAAW,GAAG,QAAQ,UAAU;6BACpC,IAAC;GAAoB,OAAM;GAAO,QAAO;6BACxC,KAAC;IAAU,MAAM;;qBAChB,KAAC,qCACA,KAAC;MAAe,IAAG;MAAkB,IAAG;MAAI,IAAG;MAAI,IAAG;MAAI,IAAG;iCAC5D,IAAC;OACA,QAAO;OACP,WAAW;OACX,aAAa;QACZ,kBACF,IAAC;OACA,QAAO;OACP,WAAW;OACX,aAAa;QACZ;OACc,EAChB,gCACA,KAAC;MACA,IAAG;MACH,IAAG;MACH,IAAG;MACH,IAAG;MACH,IAAG;iCAEH,IAAC;OACA,QAAO;OACP,WAAW;OACX,aAAa;QACZ,kBACF,IAAC;OACA,QAAO;OACP,WAAW;OACX,aAAa;QACZ;OACc,IAEZ;qBACP,IAAC;MACA,SAAQ;MACR,MAAM;OAAE,MAAM;OAAgC,UAAU;MAAI;MAC5D,UAAU;MACV,UAAU;OACT;qBACF,IAAC;MACA,MAAM;OAAE,MAAM;OAAgC,UAAU;MAAI;MAC5D,UAAU;MACV,UAAU;MACV,eAAe;MACf,OAAO;OACN;qBACF,IAAC,WACA,SAAS,CAAC,EAAE,QAAQ,SAAS,OAAO,KAAK;AACxC,WAAK,WAAW,SAAS,OAAQ,QAAO;AACxC,6BACC,KAAC;OAAI,WAAU;kCACd,IAAC;QAAE,WAAU;kBAAoB;SAAU,EAC1C,QAAQ,IAAI,CAAC,OAAO,0BACpB,KAAC;QAEA,WAAU;;yBAEV,IAAC;UACA,WAAU;UACV,OAAO,EAAE,iBAAiB,MAAM,MAAO;WACtC;SACD,MAAM;SAAK;SAAG,eAAe,MAAM,MAAgB;;UAP/C,MAQF,CACH;QACG;KAEP,IACA;qBACF,IAAC;MACA,MAAK;MACL,SAAS;MACT,QAAQ;MACR,MAAK;MACL,aAAa;OACZ;KACD,gBAAgB,kCAChB,IAAC;MACA,MAAK;MACL,SAAS;MACT,QAAQ;MACR,MAAK;MACL,aAAa;OACZ;;KAEQ;IACS,EACrB,oCACA,KAAC;GAAI,WAAU;8BACd,KAAC;IAAI,WAAU;+BACd,IAAC;KACA,WAAU;KACV,OAAO,EAAE,iBAAiB,kBAAmB;MAC5C,kBACF,IAAC;KAAK,WAAU;eAAyB;MAAoB;KACxD,EACL,gBAAgB,kCAChB,KAAC;IAAI,WAAU;+BACd,IAAC;KACA,WAAU;KACV,OAAO,EAAE,iBAAiB,oBAAqB;MAC9C,kBACF,IAAC;KAAK,WAAU;eAAyB;MAAsB;KAC1D;IAEF;GAEF;AAEP;;;;AC7KD,SAAgB,aAAoC,EACnD,MACA,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAC1C,aACA,WACA,eAAe,qBACf,QAAQ,sBACc,EAAE;AACxB,KAAI,KAAK,WAAW,EACnB,wBACC,IAAC;EAAI,WAAU;YACb;GACI;CAIR,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK,IAAI,CAAC,MAAM,EAAE,MAAM,CAAC;AAEtD,wBACC,IAAC;EAAI,WAAW,GAAG,aAAa,UAAU;YACxC,KAAK,IAAI,CAAC,MAAM,UAAU;GAC1B,MAAM,aAAa,WAAW,IAAK,KAAK,QAAQ,WAAY,MAAM;GAClE,MAAM,gBAAgB;AAEtB,0BACC,KAAC;IAEA,WAAW,GAAG,SAAS,eAAe,iBAAiB;IACvD,SAAS,MAAM,cAAc,KAAK;+BAElC,KAAC;KAAI,WAAU;gCACd,IAAC;MACA,WAAW,GACV,gCACA,eAAe,8BACf;gBAEA,KAAK;OACA,kBACP,IAAC;MAAK,WAAU;gBACd,eAAe,KAAK,MAAM;OACrB;MACF,kBACN,IAAC;KAAI,WAAU;+BACd,IAAC;MACA,WAAW,GACV,mDACA,eAAe,yBACf;MACD,OAAO;OACN,QAAQ,EAAE,WAAW;OACrB,iBAAiB;MACjB;OACA;MACG;MA5BD,MA6BA;EAEP,EAAC;GACG;AAEP;;;;AC7DD,SAAS,sBAAsBC,IAAoB;AAClD,KAAI,KAAK,EAAG,QAAO;AACnB,KAAI,KAAK,IAAM,SAAQ,EAAE,KAAK,MAAM,GAAG,CAAC;AACxC,SAAQ,EAAE,CAAC,KAAK,KAAM,QAAQ,EAAE,CAAC;AACjC;AAED,MAAM,oBAAoB;CACzB,KAAK;CACL,KAAK;CACL,KAAK;AACL;AAED,SAAgB,wBAAwB,EACvC,KACA,KACA,KACA,WACA,iBAAiB,uBACa,EAAE;CAChC,MAAM,YAAY;EACjB;GACC,MAAM;GACN,OAAO;GACP,OAAO;GACP,OAAO,kBAAkB;EACzB;EACD;GAAE,MAAM;GAAO,OAAO;GAAO,OAAO;GAAK,OAAO,kBAAkB;EAAK;EACvE;GAAE,MAAM;GAAO,OAAO;GAAO,OAAO;GAAK,OAAO,kBAAkB;EAAK;CACvE;AAED,KAAI,QAAQ,EACX,wBACC,IAAC;EAAI,WAAU;YAAsE;GAE/E;AAIR,wBACC,IAAC;EAAI,WAAW,GAAG,QAAQ,UAAU;4BACpC,IAAC;GAAoB,OAAM;GAAO,QAAO;6BACxC,KAAC;IAAS,MAAM;IAAW,QAAO;IAAW,SAAS;;qBACrD,IAAC;MACA,MAAK;MACL,eAAe;MACf,MAAM;OAAE,MAAM;OAAgC,UAAU;MAAI;MAC5D,UAAU;MACV,UAAU;OACT;qBACF,IAAC;MACA,MAAK;MACL,SAAQ;MACR,OAAO;MACP,MAAM;OAAE,MAAM;OAAgC,UAAU;MAAI;MAC5D,UAAU;MACV,UAAU;OACT;qBACF,IAAC,WACA,SAAS,CAAC,EAAE,QAAQ,SAAS,KAAK;AACjC,WAAK,WAAW,SAAS,OAAQ,QAAO;MACxC,MAAM,OAAO,QAAQ,IAAI;AACzB,6BACC,KAAC;OAAI,WAAU;kCACd,IAAC;QAAE,WAAU;kBAAe,KAAK;SAAU,kBAC3C,IAAC;QAAE,WAAU;kBACX,eAAe,KAAK,MAAM;SACxB;QACC;KAEP,IACA;qBACF,IAAC;MAAI,SAAQ;MAAQ,QAAQ;OAAC;OAAG;OAAG;OAAG;MAAE;gBACvC,UAAU,IAAI,CAAC,OAAO,0BACtB,IAAC,QAA2B,MAAM,MAAM,UAA5B,OAAO,MAAM,EAAwB,CAChD;OACG;;KACI;IACU;GACjB;AAEP;;;;ACrFD,MAAM,gBAAgB;CACrB,OAAO;EAAE,OAAO;EAAe,OAAO;CAAsB;CAC5D,OAAO;EAAE,OAAO;EAAgB,OAAO;CAAsB;CAC7D,OAAO;EAAE,OAAO;EAAoB,OAAO;CAAqB;CAChE,OAAO;EAAE,OAAO;EAAoB,OAAO;CAAoB;AAC/D;AAED,SAAgB,wBAAwB,EACvC,MACA,WAC8B,EAAE;CAChC,MAAM,YAAY,AACjB,OAAO,QAAQ,KAAK,CAEnB,OAAO,CAAC,GAAG,MAAM,KAAK,QAAQ,EAAE,CAChC,IAAI,CAAC,CAAC,KAAK,MAAM,MAAM;EACvB,MAAM,cAAc,KAAK;EACzB;EACA,OAAO,cAAc,KAAK;CAC1B,GAAE;CAEJ,MAAM,QAAQ,UAAU,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,OAAO,EAAE;AAE5D,KAAI,UAAU,EACb,wBACC,IAAC;EAAI,WAAU;YAAsE;GAE/E;AAIR,wBACC,KAAC;EAAI,WAAW,GAAG,QAAQ,UAAU;6BACpC,IAAC;GAAoB,OAAM;GAAO,QAAO;6BACxC,KAAC,uCACA,IAAC;IACA,MAAM;IACN,IAAG;IACH,IAAG;IACH,aAAa;IACb,aAAa;IACb,cAAc;IACd,SAAQ;IACR,SAAQ;cAEP,UAAU,IAAI,CAAC,OAAO,0BACtB,IAAC,QAA2B,MAAM,MAAM,UAA5B,OAAO,MAAM,EAAwB,CAChD;KACG,kBACN,IAAC,WACA,SAAS,CAAC,EAAE,QAAQ,SAAS,KAAK;AACjC,SAAK,WAAW,SAAS,OAAQ,QAAO;IACxC,MAAM,OAAO,QAAQ;IACrB,MAAM,UAAU,CAAG,KAAK,QAAmB,QAAS,KAAK,QACxD,EACA;AACD,2BACC,KAAC;KAAI,WAAU;gCACd,IAAC;MAAE,WAAU;gBAAe,KAAK;OAAS,kBAC1C,KAAC;MAAE,WAAU;;OACX,AAAC,KAAK,MAAiB,gBAAgB;OAAC;OAAG;OAAQ;;OACjD;MACC;GAEP,IACA,IACQ;IACU,kBACtB,IAAC;GAAI,WAAU;aACb,UAAU,IAAI,CAAC,yBACf,KAAC;IAAoB,WAAU;+BAC9B,IAAC;KACA,WAAU;KACV,OAAO,EAAE,iBAAiB,KAAK,MAAO;MACrC,kBACF,IAAC;KAAK,WAAU;eAAyB,KAAK;MAAY;MALjD,KAAK,KAMT,CACL;IACG;GACD;AAEP;;;;AC1ED,MAAMC,iBAAmE;CACxE;EAAE,OAAO;EAAM,OAAO;CAAM;CAC5B;EAAE,OAAO;EAAM,OAAO;CAAM;CAC5B;EAAE,OAAO;EAAO,OAAO;CAAO;CAC9B;EAAE,OAAO;EAAM,OAAO;CAAM;AAC5B;AAED,SAAS,eAAeC,QAAqD;CAC5E,MAAM,sBAAM,IAAI;AAEhB,SAAQ,QAAR;EACC,KAAK,KACJ,QAAO;GAAE,OAAO,SAAS,KAAK,EAAE;GAAE;EAAK;EACxC,KAAK,KACJ,QAAO;GAAE,OAAO,SAAS,KAAK,EAAE;GAAE;EAAK;EACxC,KAAK,MACJ,QAAO;GAAE,OAAO,SAAS,KAAK,GAAG;GAAE;EAAK;EACzC,KAAK,KACJ,QAAO;GAAE,OAAO,QAAQ,KAAK,EAAE;GAAE;EAAK;EACvC,QACC,QAAO;GAAE,OAAO,SAAS,KAAK,EAAE;GAAE;EAAK;CACxC;AACD;AAED,SAAgB,kBAAkB,EACjC,OACA,UACA,UAAU,gBACV,WACwB,EAAE;CAC1B,MAAM,oBAAoB,CAACA,WAA4B;EACtD,MAAM,QAAQ,eAAe,OAAO;AACpC,WAAS;GAAE;GAAQ,GAAG;EAAO,EAAC;CAC9B;AAED,wBACC,IAAC;EAAI,WAAW,GAAG,2BAA2B,UAAU;4BAEvD,IAAC;GAAI,WAAU;aACb,QAAQ,IAAI,CAAC,EAAE,OAAO,OAAO,QAAQ,EAAE,0BACvC,IAAC;IAEA,MAAK;IACL,SAAS,MAAM,kBAAkB,OAAO;IACxC,WAAW,GACV,qDACA,MAAM,WAAW,SACd,uCACA,0CACH,QAAQ,KAAK,yBACb;cAEA;MAXI,OAYG,CACR;IACG;GACD;AAEP;;;;AAKD,SAAgB,gBAAgBA,SAA0B,MAAiB;CAC1E,MAAM,QAAQ,eAAe,OAAO;AACpC,QAAO;EAAE;EAAQ,GAAG;CAAO;AAC3B;;;;ACKD,SAAS,eACR,EACC,WACA,SACA,MACA,YAAY,CAAC,GAAG,UAAU,OAC1B,YACA,eACA,cACA,aAAa,OACb,OAAO,GACP,WAAW,IACX,YACA,cACA,kBACA,kBAAkB;CAAC;CAAI;CAAI;CAAI;AAAI,GACnC,UAAU,OACV,YACA,YACA,cACA,UAAU,OACV,YAAY,MACZ,UAAU,MACV,GAAG,OACgB,EACpBC,KACC;CACD,MAAM,QAAQ,cAAc,KAAK;CACjC,MAAM,aAAa,KAAK,KAAK,QAAQ,SAAS;CAE9C,MAAM,aAAa,CAACC,cAAsB;AACzC,OAAK,aAAc;AAEnB,MAAI,eAAe,UAClB,cAAa,WAAW,kBAAkB,QAAQ,SAAS,MAAM;MAEjE,cAAa,WAAW,MAAM;CAE/B;CAED,MAAM,cAAc,CAACA,cAAsB;AAC1C,MAAI,eAAe,UAClB,wBAAO,IAAC,eAAY,WAAU,2CAA2C;AAE1E,SAAO,kBAAkB,wBACxB,IAAC,WAAQ,WAAU,qBAAqB,mBAExC,IAAC,aAAU,WAAU,qBAAqB;CAE3C;CAED,MAAM,gBAAgB,CAACC,UAAwC;AAC9D,UAAQ,OAAR;GACC,KAAK,SACJ,QAAO;GACR,KAAK,QACJ,QAAO;GACR,QACC,QAAO;EACR;CACD;AAED,wBACC,KAAC;EAAS;EAAK,WAAW,GAAG,UAAU,UAAU;EAAE,GAAI;6BACtD,IAAC;GAAI,WAAU;6BACd,KAAC,oCACA,IAAC,yCACA,IAAC;IAAS,WAAU;cAClB,QAAQ,IAAI,CAAC,2BACb,IAAC;KAEA,WAAW,GACV,cAAc,OAAO,MAAM,EAC3B,OAAO,YAAY,8BACnB,UAAU,SAAS,QACnB,OAAO,gBACP;KACD,OAAO,EAAE,OAAO,OAAO,MAAO;KAC9B,SACC,OAAO,WAAW,MAAM,WAAW,OAAO,IAAI;+BAG/C,KAAC;MACA,WAAW,GACV,qBACA,OAAO,UAAU,YAAY,kBAC7B,OAAO,UAAU,WAAW,cAC5B;iBAEA,OAAO,QACP,OAAO,YAAY,YAAY,OAAO,IAAI;OACtC;OArBD,OAAO,IAsBD,CACX;KACQ,GACE,kBACd,IAAC,uBACC,0BACA,IAAC,sCACA,IAAC;IACA,SAAS,QAAQ;IACjB,WAAU;cACV;KAEW,GACF,GACR,KAAK,WAAW,oBACnB,IAAC,sCACA,IAAC;IACA,SAAS,QAAQ;IACjB,WAAU;cAET,cAAc;KACJ,GACF,GAEX,KAAK,IAAI,CAAC,KAAK,aAAa;IAC3B,MAAM,SAAS,UAAU,KAAK,SAAS;IACvC,MAAM,aAAa,cAAc,IAAI,OAAO;AAE5C,2BACC,IAAC;KAEA,WAAW,GACV,WAAW,WAAW,MAAM,KAAK,iBACjC,aAAa,yCACb,cAAc,gBACd,cAAc,iBACd;KACD,SACC,aAAa,MAAM,WAAW,KAAK,SAAS;eAG5C,QAAQ,IAAI,CAAC,2BACb,IAAC;MAEA,WAAW,GACV,cAAc,OAAO,MAAM,EAC3B,UAAU,SAAS,QACnB,OAAO,cACP;gBAEA,OAAO,OACL,OAAO,KAAK,KAAK,SAAS,GAC1B,OAAO,WACN,OAAO,SAAS,IAAI,GAClB,IACF,OAAO;QAZN,OAAO,IAcD,CACX;OA5BG,OA6BK;GAEZ,EAAC,GAEQ,IACL;IACH,EAEL,cAAc,aAAa,qBAC3B,KAAC;GAAI,WAAU;8BACd,KAAC;IAAI,WAAU;+BACd,IAAC,oBAAK,mBAAqB,kBAC3B,KAAC;KACA,OAAO,OAAO,SAAS;KACvB,eAAe,CAAC,UAAU,mBAAmB,OAAO,MAAM,CAAC;gCAE3D,IAAC;MAAc,WAAU;gCACxB,IAAC,gBAAc;OACA,kBAChB,IAAC,2BACC,gBAAgB,IAAI,CAAC,yBACrB,IAAC;MAAsB,OAAO,OAAO,KAAK;gBACxC;QADe,KAEJ,CACZ,GACa;MACR;KACJ,kBAEN,KAAC;IAAI,WAAU;+BACd,KAAC;KAAK,WAAU;;MAAgC;MACzC;MAAK;MAAK;;MACV,kBACP,KAAC;KAAI,WAAU;;sBACd,IAAC;OACA,SAAQ;OACR,MAAK;OACL,WAAU;OACV,SAAS,MAAM,eAAe,EAAE;OAChC,UAAU,QAAQ;iCAElB,IAAC,gBAAa,WAAU,YAAY;QAC5B;sBACT,IAAC;OACA,SAAQ;OACR,MAAK;OACL,WAAU;OACV,SAAS,MAAM,eAAe,OAAO,EAAE;OACvC,UAAU,QAAQ;iCAElB,IAAC,eAAY,WAAU,YAAY;QAC3B;sBACT,IAAC;OACA,SAAQ;OACR,MAAK;OACL,WAAU;OACV,SAAS,MAAM,eAAe,OAAO,EAAE;OACvC,UAAU,QAAQ;iCAElB,IAAC,gBAAa,WAAU,YAAY;QAC5B;sBACT,IAAC;OACA,SAAQ;OACR,MAAK;OACL,WAAU;OACV,SAAS,MAAM,eAAe,WAAW;OACzC,UAAU,QAAQ;iCAElB,IAAC,iBAAc,WAAU,YAAY;QAC7B;;MACJ;KACD;IACD;GAEF;AAEP;AAED,MAAa,YAAY,MAAM,WAAW,eAAe;;;;AC/SzD,MAAM,aAAa,MAAM,WACxB,CACC,EACC,WACA,MACA,kBAAkB,MAClB,cAAc,GACd,WAAW,MACX,cACA,eACA,GAAG,OACH,EACD,QACI;CACJ,MAAM,CAAC,QAAQ,UAAU,GAAG,MAAM,SAAS,MAAM;CAEjD,MAAM,aAAa,YAAY;AAC9B,QAAM,UAAU,UAAU,UAAU,KAAK,UAAU,MAAM,MAAM,EAAE,CAAC;AAClE,YAAU,KAAK;AACf,aAAW,MAAM,UAAU,MAAM,EAAE,IAAK;CACxC;AAED,wBACC,KAAC;EACK;EACL,WAAW,GACV,yEACA,UACA;EACD,GAAI;aAEH,4BACA,IAAC;GACA,MAAK;GACL,SAAS;GACT,WAAU;GACV,cAAW;aAEV,yBACA,IAAC,SAAM,WAAU,2BAA2B,mBAE5C,IAAC,QAAK,WAAU,YAAY;IAErB,kBAEV,IAAC;GAAI,WAAU;6BACd,IAAC;IACM;IACN,OAAO;IACU;IACJ;IACC;IACE;KACf;IACG;GACD;AAEP,EACD;AACD,WAAW,cAAc;AAazB,SAAS,SAAS,EACjB,MACA,OACA,iBACA,aACA,cACA,gBACA,aACA,SAAS,MACM,EAAE;CACjB,MAAM,CAAC,UAAU,YAAY,GAAG,MAAM,SACrC,mBAAmB,QAAQ,YAC3B;CAED,MAAM,SAAS,QAAQ;AAGvB,KAAI,SAAS,KACZ,wBACC,KAAC;EAAK,WAAU;;GACd,+BACA,4CACC,KAAC;IAAK,WAAW,GAAG,mBAAmB,aAAa;;KAAE;KACnD;KAAY;;KACR,kBACP,IAAC;IAAK,WAAU;cAAwB;KAAS,IAC/C;mBAEJ,IAAC;IAAK,WAAW,GAAG,mBAAmB,eAAe;cAAE;KAAW;IACjE,0BAAU,IAAC;IAAK,WAAU;cAAwB;KAAQ;;GACtD;AAKT,KAAI,gBACH,wBACC,KAAC;EAAK,WAAU;;GACd,+BACA,4CACC,KAAC;IAAK,WAAW,GAAG,mBAAmB,aAAa;;KAAE;KACnD;KAAY;;KACR,kBACP,IAAC;IAAK,WAAU;cAAwB;KAAS,IAC/C;mBAEJ,IAAC;IAAK,WAAW,GAAG,iBAAiB,eAAe;cAAE;KAAgB;IACpE,0BAAU,IAAC;IAAK,WAAU;cAAwB;KAAQ;;GACtD;AAKT,YAAW,SAAS,UACnB,wBACC,KAAC;EAAK,WAAU;;GACd,+BACA,4CACC,KAAC;IAAK,WAAW,GAAG,mBAAmB,aAAa;;KAAE;KACnD;KAAY;;KACR,kBACP,IAAC;IAAK,WAAU;cAAwB;KAAS,IAC/C;mBAEJ,IAAC;IAAK,WAAW,GAAG,iBAAiB,eAAe;cAClD,OAAO,KAAK;KACP;IACL,0BAAU,IAAC;IAAK,WAAU;cAAwB;KAAQ;;GACtD;AAKT,YAAW,SAAS,SACnB,wBACC,KAAC;EAAK,WAAU;;GACd,+BACA,4CACC,KAAC;IAAK,WAAW,GAAG,mBAAmB,aAAa;;KAAE;KACnD;KAAY;;KACR,kBACP,IAAC;IAAK,WAAU;cAAwB;KAAS,IAC/C;mBAEJ,IAAC;IAAK,WAAW,GAAG,kBAAkB,eAAe;cAAG;KAAY;IAClE,0BAAU,IAAC;IAAK,WAAU;cAAwB;KAAQ;;GACtD;AAKT,YAAW,SAAS,SACnB,wBACC,KAAC;EAAK,WAAU;;GACd,+BACA,4CACC,KAAC;IAAK,WAAW,GAAG,mBAAmB,aAAa;;KAAE;KACnD;KAAY;;KACR,kBACP,IAAC;IAAK,WAAU;cAAwB;KAAS,IAC/C;mBAEJ,KAAC;IAAK,WAAW,GAAG,kBAAkB,eAAe;;KAAE;KAAE;KAAK;;KAAQ;IACpE,0BAAU,IAAC;IAAK,WAAU;cAAwB;KAAQ;;GACtD;AAKT,KAAI,MAAM,QAAQ,KAAK,EAAE;AACxB,MAAI,KAAK,WAAW,EACnB,wBACC,KAAC;GAAK,WAAU;;IACd,+BACA,4CACC,KAAC;KAAK,WAAW,GAAG,mBAAmB,aAAa;;MAAE;MACnD;MAAY;;MACR,kBACP,IAAC;KAAK,WAAU;eAAwB;MAAS,IAC/C;oBAEJ,IAAC;KAAK,WAAU;eAAwB;MAAS;KAC/C,0BAAU,IAAC;KAAK,WAAU;eAAwB;MAAQ;;IACtD;AAIT,yBACC,KAAC;GAAI,WAAU;;oBACd,KAAC;KACA,WAAU;KACV,SAAS,MAAM,aAAa,SAAS;;MAEpC,2BACA,IAAC,eAAY,WAAU,uBAAuB,mBAE9C,IAAC,gBAAa,WAAU,uBAAuB;MAE/C,+BACA,4CACC,KAAC;OAAK,WAAW,GAAG,mBAAmB,aAAa;;QAAE;QACnD;QAAY;;QACR,kBACP,IAAC;OAAK,WAAU;iBAAwB;QAAS,IAC/C;sBAEJ,IAAC;OAAK,WAAU;iBAAwB;QAAQ;OAC9C,4BACD,4CACC,KAAC;OAAK,WAAU;kBACd,KAAK,QAAO;QACP,kBACP,IAAC;OAAK,WAAU;iBAAwB;QAAQ,IAC9C;;MAEE;IACN,4BACA,4CACC,IAAC;KAAI,OAAO,EAAE,aAAa,SAAS,GAAI;eACtC,KAAK,IAAI,CAAC,MAAM,0BAChB,IAAC,mCACA,IAAC;MACA,MAAM;MACN,OAAO,QAAQ;MACE;MACJ;MACC;MACE;MAChB,QAAQ,UAAU,KAAK,SAAS;OAC/B,IATO,MAUJ,CACL;MACG,kBACN,IAAC;KAAK,WAAU;eAAwB;MAAQ,IAC9C;KAEF,0BAAU,IAAC;KAAK,WAAU;eAAwB;MAAQ;;IACvD;CAEP;AAGD,YAAW,SAAS,UAAU;EAC7B,MAAM,UAAU,OAAO,QAAQ,KAAgC;AAE/D,MAAI,QAAQ,WAAW,EACtB,wBACC,KAAC;GAAK,WAAU;;IACd,+BACA,4CACC,KAAC;KAAK,WAAW,GAAG,mBAAmB,aAAa;;MAAE;MACnD;MAAY;;MACR,kBACP,IAAC;KAAK,WAAU;eAAwB;MAAS,IAC/C;oBAEJ,IAAC;KAAK,WAAU;eAAyB;MAAY;KACnD,0BAAU,IAAC;KAAK,WAAU;eAAwB;MAAQ;;IACtD;AAIT,yBACC,KAAC;GAAI,WAAU;;oBACd,KAAC;KACA,WAAU;KACV,SAAS,MAAM,aAAa,SAAS;;MAEpC,2BACA,IAAC,eAAY,WAAU,uBAAuB,mBAE9C,IAAC,gBAAa,WAAU,uBAAuB;MAE/C,+BACA,4CACC,KAAC;OAAK,WAAW,GAAG,mBAAmB,aAAa;;QAAE;QACnD;QAAY;;QACR,kBACP,IAAC;OAAK,WAAU;iBAAwB;QAAS,IAC/C;sBAEJ,IAAC;OAAK,WAAU;iBAAyB;QAAW;OAClD,4BACD,4CACC,IAAC;OAAK,WAAU;iBAA6B;QAAU,kBACvD,IAAC;OAAK,WAAU;iBAAyB;QAAW,IAClD;;MAEE;IACN,4BACA,4CACC,IAAC;KAAI,OAAO,EAAE,aAAa,SAAS,GAAI;eACtC,QAAQ,IAAI,CAAC,CAAC,KAAK,MAAM,EAAE,0BAC3B,IAAC,mCACA,IAAC;MACA,MAAM;MACN,OAAO,QAAQ;MACE;MACJ;MACC;MACE;MAChB,aAAa;MACb,QAAQ,UAAU,QAAQ,SAAS;OAClC,IAVO,IAWJ,CACL;MACG,kBACN,IAAC;KAAK,WAAU;eAAyB;MAAW,IAClD;KAEF,0BAAU,IAAC;KAAK,WAAU;eAAwB;MAAQ;;IACvD;CAEP;AAGD,wBACC,IAAC;EAAK,WAAW,GAAG,yBAAyB,eAAe;YAC1D,OAAO,KAAK;GACP;AAER;;;;ACpUD,MAAM,YAAY,MAAM,WACvB,CACC,EACC,WACA,MACA,QAAQ,KACR,SAAS,IACT,QAAQ,gBACR,cAAc,GACd,SAAS,OACT,cAAc,IACd,WAAW,OACX,SAAS,MACT,KAAK,SACL,KAAK,QACL,GAAG,OACH,EACD,QACI;AACJ,KAAI,KAAK,WAAW,EACnB,wBACC,IAAC;EACK;EACL,WAAW,GAAG,eAAe,UAAU;EAChC;EACC;EACR,UAAU,MAAM,MAAM,GAAG,OAAO;EAChC,GAAI;GACH;CAIJ,MAAM,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CACxC,MAAM,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CACxC,MAAM,QAAQ,MAAM,OAAO;CAE3B,MAAM,UAAU;CAChB,MAAM,aAAa,QAAQ,UAAU;CACrC,MAAM,cAAc,SAAS,UAAU;CAGvC,MAAM,SAAS,KAAK,IAAI,CAAC,OAAO,UAAU;EACzC,MAAM,IAAI,UAAW,SAAS,KAAK,SAAS,KAAK,KAAM;EACvD,MAAM,IAAI,UAAU,eAAgB,QAAQ,OAAO,QAAS;AAC5D,SAAO;GAAE;GAAG;EAAG;CACf,EAAC;CAGF,IAAIC;AACJ,KAAI,UAAU,OAAO,SAAS,EAE7B,SAAQ,OAAO,OAAO,CAAC,KAAK,OAAO,UAAU;AAC5C,MAAI,UAAU,EACb,SAAQ,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE;EAEhC,MAAM,OAAO,OAAO,QAAQ;EAC5B,MAAM,OAAO,KAAK,IAAI,MAAM,KAAK;AACjC,UAAQ,EAAE,IAAI,KAAK,KAAK,EAAE,GAAG,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,IAAI,MAAM,KAAK,EAAE,KAAK,MAAM,EAAE,GAAG,MAAM,EAAE;CAC7F,GAAE,GAAG;KAGN,SAAQ,OACN,IAAI,CAAC,OAAO,UACZ,UAAU,KAAK,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,KAAK,IAAI,MAAM,EAAE,GAAG,MAAM,EAAE,EAClE,CACA,KAAK,IAAI;CAIZ,MAAM,YAAY,UACd,EAAE,MAAM,KAAK,OAAO,OAAO,SAAS,IAAI,EAAE,GAAG,SAAS,QAAQ,KAAK,OAAO,IAAI,EAAE,GAAG,SAAS,QAAQ,MACrG;AAEH,wBACC,KAAC;EACK;EACL,WAAW,GAAG,eAAe,UAAU;EAChC;EACC;EACR,UAAU,MAAM,MAAM,GAAG,OAAO;EAChC,GAAI;;GAEH,0BACA,IAAC;IACA,GAAG;IACH,MAAM;IACN,SAAS;IACT,aAAa;KACZ;mBAEH,IAAC;IACA,GAAG;IACH,MAAK;IACL,QAAQ;IACK;IACb,eAAc;IACd,gBAAe;KACd;GACD,YACA,OAAO,IAAI,CAAC,OAAO,0BAClB,IAAC;IAEA,IAAI,MAAM;IACV,IAAI,MAAM;IACV,GAAG,cAAc;IACjB,MAAM;MAJD,MAKJ,CACD;;GACE;AAEP,EACD;AACD,UAAU,cAAc;AAqBxB,MAAM,WAAW,MAAM,WACtB,CACC,EACC,WACA,MACA,QAAQ,KACR,SAAS,IACT,QAAQ,gBACR,MAAM,IACN,KAAK,UAAU,GACf,KAAK,SACL,SAAS,EACT,GAAG,OACH,EACD,QACI;AACJ,KAAI,KAAK,WAAW,EACnB,wBACC,IAAC;EACK;EACL,WAAW,GAAG,eAAe,UAAU;EAChC;EACC;EACR,UAAU,MAAM,MAAM,GAAG,OAAO;EAChC,GAAI;GACH;CAIJ,MAAM,MAAM;CACZ,MAAM,MAAM,WAAW,KAAK,IAAI,GAAG,KAAK;CACxC,MAAM,QAAQ,MAAM,OAAO;CAE3B,MAAM,WAAW,QAAQ,KAAK;CAC9B,MAAM,WAAW,WAAW;CAC5B,MAAM,iBAAiB,WAAW;AAElC,wBACC,IAAC;EACK;EACL,WAAW,GAAG,eAAe,UAAU;EAChC;EACC;EACR,UAAU,MAAM,MAAM,GAAG,OAAO;EAChC,GAAI;YAEH,KAAK,IAAI,CAAC,OAAO,UAAU;GAC3B,MAAM,aAAc,QAAQ,OAAO,QAAS;GAC5C,MAAM,IAAI,QAAQ,WAAW,WAAW;GACxC,MAAM,IAAI,SAAS;AAEnB,0BACC,IAAC;IAEG;IACA;IACH,OAAO;IACP,QAAQ;IACR,MAAM;IACN,IAAI;IACJ,IAAI;MAPC,MAQJ;EAEH,EAAC;GACG;AAEP,EACD;AACD,SAAS,cAAc;AAmBvB,MAAM,aAAa,MAAM,WACxB,CACC,EACC,WACA,OACA,OACA,aACA,eACA,OACA,YACA,KACA,GAAG,OACH,EACD,QACI;CACJ,MAAM,aACL,UAAU,OACP,mBACA,UAAU,SACT,iBACA;AAEL,wBACC,KAAC;EACK;EACL,WAAW,GACV,kDACA,UACA;EACD,GAAI;6BAEJ,KAAC;GAAI,WAAU;8BACd,IAAC;IAAK,WAAU;cACd;KACK,EACN,wBAAQ,IAAC;IAAK,WAAU;cAAyB;KAAY;IACzD,kBACN,KAAC;GAAI,WAAU;8BACd,KAAC,oCACA,IAAC;IAAI,WAAU;cAAsC;KAAY,GAC/D,eAAe,+BAChB,KAAC;IAAI,WAAU;eACb,8BACA,IAAC;KAAK,WAAW,GAAG,uBAAuB,WAAW;eACpD;MACK,EAEP,+BACA,IAAC;KAAK,WAAU;eACd;MACK;KAEH,IAEF,EACL,iBAAiB,cAAc,SAAS,qBACxC,IAAC;IACA,MAAM;IACN,OAAO;IACP,QAAQ;IACR;IACA,WACC,UAAU,OACP,mBACA,UAAU,SACT,iBACA;KAEJ;IAEE;GACD;AAEP,EACD;AACD,WAAW,cAAc;;;;AC/TzB,MAAM,mBAAmB,IAAI,YAAY;CACxC,UAAU,EACT,aAAa;EACZ,UAAU;EACV,YAAY;CACZ,EACD;CACD,iBAAiB,EAChB,aAAa,WACb;AACD,EAAC;AAMF,MAAM,WAAW,MAAM,WACtB,CAAC,EAAE,WAAW,cAAc,YAAY,SAAU,GAAG,OAAO,EAAE,QAAQ;AACrE,wBACC,IAAC;EACK;EACL,WAAW,GAAG,iBAAiB;GAAE;GAAa;EAAW,EAAC,CAAC;EAC3D,GAAI;EAEH;GACI;AAEP,EACD;AACD,SAAS,cAAc;AAEvB,MAAM,uBAAuB,IAAI,iBAAiB;CACjD,UAAU,EACT,aAAa;EACZ,UAAU;EACV,YAAY;CACZ,EACD;CACD,iBAAiB,EAChB,aAAa,WACb;AACD,EAAC;AASF,MAAM,eAAe,MAAM,WAC1B,CACC,EAAE,WAAW,cAAc,YAAY,QAAQ,SAAU,GAAG,OAAO,EACnE,QACI;AACJ,wBACC,IAAC;EACK;EACL,WAAW,GAAG,qBAAqB;GAAE;GAAa;EAAW,EAAC,CAAC;EAC/D,eAAa;EACb,GAAI;EAEH;GACI;AAEP,EACD;AACD,aAAa,cAAc;AAE3B,MAAM,4BAA4B,IACjC,mEACA;CACC,UAAU;EACT,MAAM;GACL,IAAI;GACJ,IAAI;GACJ,IAAI;EACJ;EACD,SAAS;GACR,SAAS;GACT,SAAS;GACT,SAAS;GACT,SAAS;GACT,OAAO;GACP,MAAM;GACN,OAAO;EACP;CACD;CACD,iBAAiB;EAChB,MAAM;EACN,SAAS;CACT;AACD,EACD;AAaD,MAAM,oBAAoB,MAAM,WAI/B,CACC,EACC,WACA,MACA,SACA,WAAW,MACX,eAAe,SACf,cAAc,YACd,SACA,GAAG,OACH,EACD,QACI;CACJ,MAAM,aAAa,gBAAgB;AAEnC,wBACC,KAAC;EACK;EACL,WAAW,GACV,8BACA,aAAa,aAAa,WAC1B;;GAEA,aAAa,iBAAiB,YAAY,iBAAiB,2BAC3D,IAAC,SACA,WAAW,GACV,aACA,aAAa,iBAAiB,eAC9B,GACA;mBAEH,IAAC;IACA,WAAW,GACV,0BAA0B;KAAE;KAAM;KAAS;IAAW,EAAC,CACvD;IACD,GAAI;IAEH;KACI;GACL,aAAa,iBAAiB,WAAW,iBAAiB,2BAC1D,IAAC,SACA,WAAW,GACV,aACA,aAAa,iBAAiB,eAC9B,GACA;;GAEE;AAEP,EACD;AACD,kBAAkB,cAAc;AAQhC,MAAM,oBAAoB,MAAM,WAG9B,CAAC,EAAE,WAAW,cAAc,WAAY,GAAG,OAAO,EAAE,QAAQ;CAC7D,MAAM,aAAa,gBAAgB;AAEnC,wBACC,IAAC;EACK;EACL,WAAW,GACV,aACA,aACG,6CACA,2CACH,UACA;EACD,GAAI;GACH;AAEH,EAAC;AACF,kBAAkB,cAAc;AAKhC,MAAM,kBAAkB,MAAM,WAC7B,CAAC,EAAE,WAAW,SAAU,GAAG,OAAO,EAAE,QAAQ;AAC3C,wBACC,IAAC;EAAS;EAAK,WAAW,GAAG,iBAAiB,UAAU;EAAE,GAAI;EAC5D;GACI;AAEP,EACD;AACD,gBAAgB,cAAc;AAK9B,MAAM,gBAAgB,MAAM,WAC3B,CAAC,EAAE,WAAW,SAAU,GAAG,OAAO,EAAE,QAAQ;AAC3C,wBACC,IAAC;EACK;EACL,WAAW,GAAG,uCAAuC,UAAU;EAC/D,GAAI;EAEH;GACG;AAEN,EACD;AACD,cAAc,cAAc;AAK5B,MAAM,sBAAsB,MAAM,WAGhC,CAAC,EAAE,WAAW,SAAU,GAAG,OAAO,EAAE,QAAQ;AAC7C,wBACC,IAAC;EACK;EACL,WAAW,GAAG,iCAAiC,UAAU;EACzD,GAAI;EAEH;GACE;AAEL,EAAC;AACF,oBAAoB,cAAc;AAKlC,MAAM,eAAe,MAAM,WAC1B,CAAC,EAAE,WAAW,SAAU,GAAG,OAAO,EAAE,QAAQ;AAC3C,wBACC,IAAC;EACK;EACL,WAAW,GAAG,iCAAiC,UAAU;EACzD,GAAI;EAEH;GACK;AAER,EACD;AACD,aAAa,cAAc"}