@gram-ai/elements 1.27.4 → 1.27.5

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 (277) hide show
  1. package/README.md +72 -60
  2. package/README.typedoc.md +6 -6
  3. package/bin/cli.js +74 -74
  4. package/dist/compat-shims-CO9JXXV4.cjs.map +1 -1
  5. package/dist/{compat-shims-BPJ7Q68c.js → compat-shims-DxtUrORi.js} +4 -2
  6. package/dist/compat-shims-DxtUrORi.js.map +1 -0
  7. package/dist/components/ShareButton/index.d.ts +2 -2
  8. package/dist/components/assistant-ui/message-feedback.d.ts +1 -1
  9. package/dist/components/assistant-ui/tooltip-icon-button.d.ts +2 -2
  10. package/dist/components/ui/avatar.d.ts +2 -2
  11. package/dist/components/ui/button.d.ts +1 -1
  12. package/dist/components/ui/calendar.d.ts +1 -1
  13. package/dist/components/ui/collapsible.d.ts +1 -1
  14. package/dist/components/ui/dialog.d.ts +4 -4
  15. package/dist/components/ui/popover.d.ts +2 -2
  16. package/dist/components/ui/skeleton.d.ts +1 -1
  17. package/dist/components/ui/time-range-picker.d.ts +1 -1
  18. package/dist/components/ui/tool-ui.d.ts +7 -7
  19. package/dist/components/ui/tooltip.d.ts +2 -2
  20. package/dist/contexts/ConnectionStatusContext.d.ts +1 -1
  21. package/dist/elements.cjs +1 -1
  22. package/dist/elements.js +2 -2
  23. package/dist/hooks/useDensity.d.ts +73 -73
  24. package/dist/hooks/useMCPTools.d.ts +1 -1
  25. package/dist/hooks/useRadius.d.ts +1 -1
  26. package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
  27. package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
  28. package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
  29. package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
  30. package/dist/{index-D0bAYNQy.js → index-DuCQRbcQ.js} +279 -265
  31. package/dist/index-DuCQRbcQ.js.map +1 -0
  32. package/dist/{index-KSX4Qjip.cjs → index-y_PNN5vK.cjs} +10 -10
  33. package/dist/index-y_PNN5vK.cjs.map +1 -0
  34. package/dist/lib/cassette.d.ts +4 -4
  35. package/dist/lib/errorTracking.d.ts +1 -1
  36. package/dist/lib/messageConverter.d.ts +1 -1
  37. package/dist/lib/models.d.ts +1 -1
  38. package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
  39. package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
  40. package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
  41. package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
  42. package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
  43. package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
  44. package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
  45. package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
  46. package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
  47. package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
  48. package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
  49. package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
  50. package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
  51. package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
  52. package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
  53. package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
  54. package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
  55. package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
  56. package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
  57. package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
  58. package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
  59. package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
  60. package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
  61. package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
  62. package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
  63. package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
  64. package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
  65. package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
  66. package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
  67. package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
  68. package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
  69. package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
  70. package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
  71. package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
  72. package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
  73. package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
  74. package/dist/plugins.cjs +1 -1
  75. package/dist/plugins.js +1 -1
  76. package/dist/{profiler-BFkhZRxj.js → profiler-FpBY9eRv.js} +2 -2
  77. package/dist/{profiler-BFkhZRxj.js.map → profiler-FpBY9eRv.js.map} +1 -1
  78. package/dist/{profiler-CyzxBxVz.cjs → profiler-_mthyjvo.cjs} +2 -2
  79. package/dist/{profiler-CyzxBxVz.cjs.map → profiler-_mthyjvo.cjs.map} +1 -1
  80. package/dist/react-shim.js +1 -1
  81. package/dist/server/express.cjs.map +1 -1
  82. package/dist/server/express.js.map +1 -1
  83. package/dist/{startRecording-Dq92sEHf.cjs → startRecording-NJcpiHw-.cjs} +2 -2
  84. package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-NJcpiHw-.cjs.map} +1 -1
  85. package/dist/{startRecording-C-PPAs_Z.js → startRecording-r5MXQ2Dm.js} +2 -2
  86. package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-r5MXQ2Dm.js.map} +1 -1
  87. package/dist/types/index.d.ts +2 -2
  88. package/package.json +1 -5
  89. package/src/compat-plugin.ts +14 -14
  90. package/src/compat-shims.ts +33 -31
  91. package/src/compat.test.ts +48 -48
  92. package/src/compat.ts +6 -6
  93. package/src/components/Chat/index.tsx +17 -17
  94. package/src/components/Chat/stories/Charts.stories.tsx +98 -98
  95. package/src/components/Chat/stories/Composer.stories.tsx +15 -15
  96. package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
  97. package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
  98. package/src/components/Chat/stories/Density.stories.tsx +20 -20
  99. package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
  100. package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
  101. package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
  102. package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
  103. package/src/components/Chat/stories/Modal.stories.tsx +28 -28
  104. package/src/components/Chat/stories/Model.stories.tsx +11 -11
  105. package/src/components/Chat/stories/Radius.stories.tsx +20 -20
  106. package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
  107. package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
  108. package/src/components/Chat/stories/Theme.stories.tsx +25 -25
  109. package/src/components/Chat/stories/Thread.stories.tsx +25 -25
  110. package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
  111. package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
  112. package/src/components/Chat/stories/Tools.stories.tsx +88 -88
  113. package/src/components/Chat/stories/Variants.stories.tsx +32 -32
  114. package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
  115. package/src/components/ChatHistory.tsx +7 -7
  116. package/src/components/FrontendTools/index.tsx +5 -5
  117. package/src/components/Replay.stories.tsx +157 -157
  118. package/src/components/Replay.tsx +76 -73
  119. package/src/components/ShadowRoot.tsx +40 -40
  120. package/src/components/ShareButton/index.tsx +32 -32
  121. package/src/components/assistant-ui/assistant-modal.tsx +92 -87
  122. package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
  123. package/src/components/assistant-ui/attachment.tsx +80 -80
  124. package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
  125. package/src/components/assistant-ui/error-boundary.tsx +34 -34
  126. package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
  127. package/src/components/assistant-ui/markdown-text.tsx +69 -69
  128. package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
  129. package/src/components/assistant-ui/message-feedback.tsx +57 -50
  130. package/src/components/assistant-ui/reasoning.tsx +83 -83
  131. package/src/components/assistant-ui/thread-list.tsx +45 -45
  132. package/src/components/assistant-ui/thread.tsx +278 -278
  133. package/src/components/assistant-ui/tool-fallback.tsx +37 -37
  134. package/src/components/assistant-ui/tool-group.tsx +26 -26
  135. package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
  136. package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
  137. package/src/components/ui/avatar.tsx +12 -12
  138. package/src/components/ui/button.tsx +12 -12
  139. package/src/components/ui/buttonVariants.ts +17 -17
  140. package/src/components/ui/calendar.tsx +106 -106
  141. package/src/components/ui/charts.stories.tsx +56 -56
  142. package/src/components/ui/collapsible.tsx +5 -5
  143. package/src/components/ui/dialog.tsx +30 -30
  144. package/src/components/ui/generative-ui.stories.tsx +200 -200
  145. package/src/components/ui/generative-ui.tsx +26 -26
  146. package/src/components/ui/popover.tsx +14 -14
  147. package/src/components/ui/skeleton.tsx +5 -5
  148. package/src/components/ui/time-range-picker.stories.tsx +80 -80
  149. package/src/components/ui/time-range-picker.tsx +245 -244
  150. package/src/components/ui/tool-ui.stories.tsx +37 -37
  151. package/src/components/ui/tool-ui.tsx +221 -215
  152. package/src/components/ui/tooltip.tsx +15 -15
  153. package/src/constants/tailwind.ts +1 -1
  154. package/src/contexts/ChatIdContext.tsx +7 -7
  155. package/src/contexts/ConnectionStatusContext.tsx +64 -64
  156. package/src/contexts/ElementsProvider.tsx +214 -213
  157. package/src/contexts/ReplayContext.ts +3 -3
  158. package/src/contexts/ToolApprovalContext.tsx +54 -54
  159. package/src/contexts/ToolExecutionContext.tsx +34 -34
  160. package/src/contexts/contexts.ts +7 -7
  161. package/src/contexts/portal-container-context.ts +2 -2
  162. package/src/contexts/portal-container.tsx +7 -7
  163. package/src/embedded.ts +1 -1
  164. package/src/global.css +25 -25
  165. package/src/hooks/useAuth.ts +72 -72
  166. package/src/hooks/useDensity.ts +79 -79
  167. package/src/hooks/useElements.ts +6 -6
  168. package/src/hooks/useExpanded.ts +12 -12
  169. package/src/hooks/useFollowOnSuggestions.ts +83 -83
  170. package/src/hooks/useGramThreadListAdapter.tsx +99 -99
  171. package/src/hooks/useMCPTools.ts +47 -47
  172. package/src/hooks/useModel.ts +14 -14
  173. package/src/hooks/usePluginComponents.ts +11 -11
  174. package/src/hooks/usePortalContainer.ts +5 -5
  175. package/src/hooks/useRadius.ts +23 -23
  176. package/src/hooks/useRecordCassette.ts +34 -34
  177. package/src/hooks/useSession.ts +11 -11
  178. package/src/hooks/useThemeProps.ts +13 -13
  179. package/src/hooks/useThreadId.ts +4 -4
  180. package/src/hooks/useToolApproval.ts +7 -7
  181. package/src/hooks/useToolMentions.ts +40 -40
  182. package/src/index.ts +26 -26
  183. package/src/lib/api.test.ts +61 -61
  184. package/src/lib/api.ts +4 -3
  185. package/src/lib/auth.ts +13 -13
  186. package/src/lib/cassette.ts +84 -84
  187. package/src/lib/easing.ts +1 -1
  188. package/src/lib/errorTracking.config.ts +5 -5
  189. package/src/lib/errorTracking.ts +29 -29
  190. package/src/lib/generative-ui.ts +7 -7
  191. package/src/lib/humanize.ts +3 -3
  192. package/src/lib/messageConverter.test.ts +130 -127
  193. package/src/lib/messageConverter.ts +196 -196
  194. package/src/lib/models.ts +21 -20
  195. package/src/lib/token.test.ts +56 -56
  196. package/src/lib/token.ts +14 -14
  197. package/src/lib/tool-mentions.ts +45 -45
  198. package/src/lib/tools.ts +66 -62
  199. package/src/lib/utils.ts +5 -5
  200. package/src/lib.d.ts +1 -1
  201. package/src/plugins/README.md +5 -5
  202. package/src/plugins/chart/catalog.ts +18 -18
  203. package/src/plugins/chart/chart.test.ts +31 -31
  204. package/src/plugins/chart/component.tsx +34 -34
  205. package/src/plugins/chart/index.ts +4 -4
  206. package/src/plugins/chart/ui/area-chart.tsx +42 -42
  207. package/src/plugins/chart/ui/bar-chart.tsx +46 -46
  208. package/src/plugins/chart/ui/donut-chart.tsx +48 -48
  209. package/src/plugins/chart/ui/index.ts +7 -7
  210. package/src/plugins/chart/ui/line-chart.tsx +43 -43
  211. package/src/plugins/chart/ui/pie-chart.tsx +44 -44
  212. package/src/plugins/chart/ui/radar-chart.tsx +33 -33
  213. package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
  214. package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
  215. package/src/plugins/components/PluginLoadingState.tsx +10 -10
  216. package/src/plugins/components/index.ts +1 -1
  217. package/src/plugins/generative-ui/catalog.ts +54 -54
  218. package/src/plugins/generative-ui/component.tsx +85 -85
  219. package/src/plugins/generative-ui/index.ts +4 -4
  220. package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
  221. package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
  222. package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
  223. package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
  224. package/src/plugins/generative-ui/ui/alert.tsx +20 -20
  225. package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
  226. package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
  227. package/src/plugins/generative-ui/ui/badge.tsx +22 -22
  228. package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
  229. package/src/plugins/generative-ui/ui/button.tsx +28 -28
  230. package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
  231. package/src/plugins/generative-ui/ui/card.tsx +27 -27
  232. package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
  233. package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
  234. package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
  235. package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
  236. package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
  237. package/src/plugins/generative-ui/ui/grid.tsx +12 -12
  238. package/src/plugins/generative-ui/ui/index.ts +40 -40
  239. package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
  240. package/src/plugins/generative-ui/ui/input.tsx +9 -9
  241. package/src/plugins/generative-ui/ui/label.tsx +8 -8
  242. package/src/plugins/generative-ui/ui/list.tsx +11 -11
  243. package/src/plugins/generative-ui/ui/metric.tsx +23 -23
  244. package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
  245. package/src/plugins/generative-ui/ui/popover.tsx +21 -21
  246. package/src/plugins/generative-ui/ui/progress.tsx +13 -13
  247. package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
  248. package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
  249. package/src/plugins/generative-ui/ui/select.tsx +37 -37
  250. package/src/plugins/generative-ui/ui/separator.tsx +9 -9
  251. package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
  252. package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
  253. package/src/plugins/generative-ui/ui/stack.tsx +28 -28
  254. package/src/plugins/generative-ui/ui/switch.tsx +11 -11
  255. package/src/plugins/generative-ui/ui/table.tsx +32 -32
  256. package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
  257. package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
  258. package/src/plugins/generative-ui/ui/text.tsx +12 -12
  259. package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
  260. package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
  261. package/src/plugins/index.ts +7 -7
  262. package/src/react-shim.ts +6 -6
  263. package/src/server/bun.ts +12 -12
  264. package/src/server/core.ts +25 -25
  265. package/src/server/express.ts +17 -15
  266. package/src/server/fastify.ts +14 -14
  267. package/src/server/hono.ts +9 -9
  268. package/src/server/nextjs.ts +12 -12
  269. package/src/server/tanstack-start.ts +12 -12
  270. package/src/server.ts +27 -27
  271. package/src/storybook.d.ts +4 -4
  272. package/src/types/index.ts +122 -122
  273. package/src/types/plugins.ts +7 -7
  274. package/src/vite-env.d.ts +12 -12
  275. package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
  276. package/dist/index-D0bAYNQy.js.map +0 -1
  277. package/dist/index-KSX4Qjip.cjs.map +0 -1
@@ -1,7 +1,7 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { cn } from '@/lib/utils'
4
- import { FC } from 'react'
3
+ import { cn } from "@/lib/utils";
4
+ import { FC } from "react";
5
5
  import {
6
6
  BarChart as RechartsBarChart,
7
7
  Bar,
@@ -13,61 +13,61 @@ import {
13
13
  Cell,
14
14
  ResponsiveContainer,
15
15
  TooltipProps,
16
- } from 'recharts'
16
+ } from "recharts";
17
17
 
18
18
  const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
19
- if (!active || !payload || payload.length === 0) return null
20
- const value = payload[0]?.value
19
+ if (!active || !payload || payload.length === 0) return null;
20
+ const value = payload[0]?.value;
21
21
  return (
22
- <div className="bg-background text-foreground border-border rounded-md border px-2 py-1 text-xs shadow-sm">
23
- {typeof value === 'number' ? value.toLocaleString() : value}
22
+ <div className="rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground shadow-sm">
23
+ {typeof value === "number" ? value.toLocaleString() : value}
24
24
  </div>
25
- )
26
- }
25
+ );
26
+ };
27
27
 
28
28
  const COLORS = [
29
- 'var(--chart-1)',
30
- 'var(--chart-2)',
31
- 'var(--chart-3)',
32
- 'var(--chart-4)',
33
- 'var(--chart-5)',
34
- ]
29
+ "var(--chart-1)",
30
+ "var(--chart-2)",
31
+ "var(--chart-3)",
32
+ "var(--chart-4)",
33
+ "var(--chart-5)",
34
+ ];
35
35
 
36
36
  interface DataPoint {
37
- label: string
38
- value: number
39
- color?: string
37
+ label: string;
38
+ value: number;
39
+ color?: string;
40
40
  }
41
41
 
42
42
  export interface BarChartProps {
43
- title?: string
44
- data: DataPoint[]
45
- layout?: 'vertical' | 'horizontal'
46
- showGrid?: boolean
47
- showLegend?: boolean
48
- className?: string
43
+ title?: string;
44
+ data: DataPoint[];
45
+ layout?: "vertical" | "horizontal";
46
+ showGrid?: boolean;
47
+ showLegend?: boolean;
48
+ className?: string;
49
49
  }
50
50
 
51
51
  export const BarChart: FC<BarChartProps> = ({
52
52
  title,
53
53
  data,
54
- layout = 'vertical',
54
+ layout = "vertical",
55
55
  showGrid = true,
56
56
  showLegend = false,
57
57
  className,
58
58
  }) => {
59
- const isHorizontal = layout === 'horizontal'
59
+ const isHorizontal = layout === "horizontal";
60
60
 
61
61
  return (
62
- <div className={cn('flex flex-col gap-2', className)}>
62
+ <div className={cn("flex flex-col gap-2", className)}>
63
63
  {title && (
64
- <h3 className="text-foreground text-sm font-medium">{title}</h3>
64
+ <h3 className="text-sm font-medium text-foreground">{title}</h3>
65
65
  )}
66
66
  <div className="h-[250px] w-full">
67
67
  <ResponsiveContainer width="100%" height="100%">
68
68
  <RechartsBarChart
69
69
  data={data}
70
- layout={isHorizontal ? 'vertical' : 'horizontal'}
70
+ layout={isHorizontal ? "vertical" : "horizontal"}
71
71
  margin={{ top: 10, right: 10, left: 10, bottom: 10 }}
72
72
  >
73
73
  {showGrid && (
@@ -80,40 +80,40 @@ export const BarChart: FC<BarChartProps> = ({
80
80
  <>
81
81
  <XAxis
82
82
  type="number"
83
- tick={{ fill: 'var(--foreground)', fontSize: 12 }}
84
- axisLine={{ stroke: 'var(--border)' }}
85
- tickLine={{ stroke: 'var(--border)' }}
83
+ tick={{ fill: "var(--foreground)", fontSize: 12 }}
84
+ axisLine={{ stroke: "var(--border)" }}
85
+ tickLine={{ stroke: "var(--border)" }}
86
86
  />
87
87
  <YAxis
88
88
  dataKey="label"
89
89
  type="category"
90
90
  width={80}
91
- tick={{ fill: 'var(--foreground)', fontSize: 12 }}
92
- axisLine={{ stroke: 'var(--border)' }}
93
- tickLine={{ stroke: 'var(--border)' }}
91
+ tick={{ fill: "var(--foreground)", fontSize: 12 }}
92
+ axisLine={{ stroke: "var(--border)" }}
93
+ tickLine={{ stroke: "var(--border)" }}
94
94
  />
95
95
  </>
96
96
  ) : (
97
97
  <>
98
98
  <XAxis
99
99
  dataKey="label"
100
- tick={{ fill: 'var(--foreground)', fontSize: 12 }}
101
- axisLine={{ stroke: 'var(--border)' }}
102
- tickLine={{ stroke: 'var(--border)' }}
100
+ tick={{ fill: "var(--foreground)", fontSize: 12 }}
101
+ axisLine={{ stroke: "var(--border)" }}
102
+ tickLine={{ stroke: "var(--border)" }}
103
103
  />
104
104
  <YAxis
105
- tick={{ fill: 'var(--foreground)', fontSize: 12 }}
106
- axisLine={{ stroke: 'var(--border)' }}
107
- tickLine={{ stroke: 'var(--border)' }}
105
+ tick={{ fill: "var(--foreground)", fontSize: 12 }}
106
+ axisLine={{ stroke: "var(--border)" }}
107
+ tickLine={{ stroke: "var(--border)" }}
108
108
  />
109
109
  </>
110
110
  )}
111
111
  <Tooltip content={<CustomTooltip />} />
112
112
  {showLegend && (
113
113
  <Legend
114
- wrapperStyle={{ color: 'var(--foreground)' }}
114
+ wrapperStyle={{ color: "var(--foreground)" }}
115
115
  formatter={(value) => (
116
- <span style={{ color: 'var(--foreground)' }}>{value}</span>
116
+ <span style={{ color: "var(--foreground)" }}>{value}</span>
117
117
  )}
118
118
  />
119
119
  )}
@@ -133,5 +133,5 @@ export const BarChart: FC<BarChartProps> = ({
133
133
  </ResponsiveContainer>
134
134
  </div>
135
135
  </div>
136
- )
137
- }
136
+ );
137
+ };
@@ -1,7 +1,7 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { cn } from '@/lib/utils'
4
- import { FC } from 'react'
3
+ import { cn } from "@/lib/utils";
4
+ import { FC } from "react";
5
5
  import {
6
6
  PieChart as RechartsPieChart,
7
7
  Pie,
@@ -10,44 +10,44 @@ import {
10
10
  Legend,
11
11
  ResponsiveContainer,
12
12
  TooltipProps,
13
- } from 'recharts'
13
+ } from "recharts";
14
14
 
15
15
  const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
16
- if (!active || !payload || payload.length === 0) return null
17
- const entry = payload[0]
16
+ if (!active || !payload || payload.length === 0) return null;
17
+ const entry = payload[0];
18
18
  return (
19
- <div className="bg-background text-foreground border-border rounded-md border px-2 py-1 text-xs shadow-sm">
19
+ <div className="rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground shadow-sm">
20
20
  <span className="font-medium">
21
- {typeof entry?.value === 'number'
21
+ {typeof entry?.value === "number"
22
22
  ? entry.value.toLocaleString()
23
23
  : entry?.value}
24
24
  </span>
25
25
  </div>
26
- )
27
- }
26
+ );
27
+ };
28
28
 
29
29
  const COLORS = [
30
- 'var(--chart-1)',
31
- 'var(--chart-2)',
32
- 'var(--chart-3)',
33
- 'var(--chart-4)',
34
- 'var(--chart-5)',
35
- ]
30
+ "var(--chart-1)",
31
+ "var(--chart-2)",
32
+ "var(--chart-3)",
33
+ "var(--chart-4)",
34
+ "var(--chart-5)",
35
+ ];
36
36
 
37
37
  interface DataPoint {
38
- label: string
39
- value: number
40
- color?: string
38
+ label: string;
39
+ value: number;
40
+ color?: string;
41
41
  }
42
42
 
43
43
  export interface DonutChartProps {
44
- title?: string
45
- data: DataPoint[]
46
- showLabels?: boolean
47
- showLegend?: boolean
48
- innerLabel?: string
49
- innerValue?: string | number
50
- className?: string
44
+ title?: string;
45
+ data: DataPoint[];
46
+ showLabels?: boolean;
47
+ showLegend?: boolean;
48
+ innerLabel?: string;
49
+ innerValue?: string | number;
50
+ className?: string;
51
51
  }
52
52
 
53
53
  export const DonutChart: FC<DonutChartProps> = ({
@@ -64,12 +64,12 @@ export const DonutChart: FC<DonutChartProps> = ({
64
64
  name: d.label,
65
65
  value: d.value,
66
66
  color: d.color,
67
- }))
67
+ }));
68
68
 
69
69
  return (
70
- <div className={cn('flex flex-col gap-2', className)}>
70
+ <div className={cn("flex flex-col gap-2", className)}>
71
71
  {title && (
72
- <h3 className="text-foreground text-sm font-medium">{title}</h3>
72
+ <h3 className="text-sm font-medium text-foreground">{title}</h3>
73
73
  )}
74
74
  <div className="relative h-[320px] w-full">
75
75
  <ResponsiveContainer width="100%" height="100%">
@@ -94,33 +94,33 @@ export const DonutChart: FC<DonutChartProps> = ({
94
94
  midAngle,
95
95
  outerRadius,
96
96
  }: {
97
- name?: string
98
- percent?: number
99
- cx?: number
100
- cy?: number
101
- midAngle?: number
102
- outerRadius?: number
97
+ name?: string;
98
+ percent?: number;
99
+ cx?: number;
100
+ cy?: number;
101
+ midAngle?: number;
102
+ outerRadius?: number;
103
103
  }) => {
104
- const RADIAN = Math.PI / 180
105
- const radius = (outerRadius ?? 80) + 25
104
+ const RADIAN = Math.PI / 180;
105
+ const radius = (outerRadius ?? 80) + 25;
106
106
  const x =
107
107
  (cx ?? 0) +
108
- radius * Math.cos(-((midAngle ?? 0) * RADIAN))
108
+ radius * Math.cos(-((midAngle ?? 0) * RADIAN));
109
109
  const y =
110
110
  (cy ?? 0) +
111
- radius * Math.sin(-((midAngle ?? 0) * RADIAN))
111
+ radius * Math.sin(-((midAngle ?? 0) * RADIAN));
112
112
  return (
113
113
  <text
114
114
  x={x}
115
115
  y={y}
116
116
  fill="var(--foreground)"
117
- textAnchor={x > (cx ?? 0) ? 'start' : 'end'}
117
+ textAnchor={x > (cx ?? 0) ? "start" : "end"}
118
118
  dominantBaseline="central"
119
119
  fontSize={12}
120
120
  >
121
- {`${name ?? ''} (${((percent ?? 0) * 100).toFixed(0)}%)`}
121
+ {`${name ?? ""} (${((percent ?? 0) * 100).toFixed(0)}%)`}
122
122
  </text>
123
- )
123
+ );
124
124
  }
125
125
  : undefined
126
126
  }
@@ -138,9 +138,9 @@ export const DonutChart: FC<DonutChartProps> = ({
138
138
  {showLegend && (
139
139
  <Legend
140
140
  verticalAlign="bottom"
141
- wrapperStyle={{ color: 'var(--foreground)', paddingTop: 20 }}
141
+ wrapperStyle={{ color: "var(--foreground)", paddingTop: 20 }}
142
142
  formatter={(value) => (
143
- <span style={{ color: 'var(--foreground)' }}>{value}</span>
143
+ <span style={{ color: "var(--foreground)" }}>{value}</span>
144
144
  )}
145
145
  />
146
146
  )}
@@ -150,12 +150,12 @@ export const DonutChart: FC<DonutChartProps> = ({
150
150
  {(innerLabel !== undefined || innerValue !== undefined) && (
151
151
  <div className="pointer-events-none absolute inset-x-0 top-[45%] flex -translate-y-1/2 flex-col items-center">
152
152
  {innerValue !== undefined && (
153
- <span className="text-foreground text-2xl font-bold">
153
+ <span className="text-2xl font-bold text-foreground">
154
154
  {innerValue}
155
155
  </span>
156
156
  )}
157
157
  {innerLabel && (
158
- <span className="text-muted-foreground text-xs">
158
+ <span className="text-xs text-muted-foreground">
159
159
  {innerLabel}
160
160
  </span>
161
161
  )}
@@ -163,5 +163,5 @@ export const DonutChart: FC<DonutChartProps> = ({
163
163
  )}
164
164
  </div>
165
165
  </div>
166
- )
167
- }
166
+ );
167
+ };
@@ -1,7 +1,7 @@
1
- export { BarChart, type BarChartProps } from './bar-chart'
2
- export { LineChart, type LineChartProps } from './line-chart'
3
- export { AreaChart, type AreaChartProps } from './area-chart'
4
- export { PieChart, type PieChartProps } from './pie-chart'
5
- export { DonutChart, type DonutChartProps } from './donut-chart'
6
- export { ScatterChart, type ScatterChartProps } from './scatter-chart'
7
- export { RadarChart, type RadarChartProps } from './radar-chart'
1
+ export { BarChart, type BarChartProps } from "./bar-chart";
2
+ export { LineChart, type LineChartProps } from "./line-chart";
3
+ export { AreaChart, type AreaChartProps } from "./area-chart";
4
+ export { PieChart, type PieChartProps } from "./pie-chart";
5
+ export { DonutChart, type DonutChartProps } from "./donut-chart";
6
+ export { ScatterChart, type ScatterChartProps } from "./scatter-chart";
7
+ export { RadarChart, type RadarChartProps } from "./radar-chart";
@@ -1,7 +1,7 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { cn } from '@/lib/utils'
4
- import { FC, useMemo } from 'react'
3
+ import { cn } from "@/lib/utils";
4
+ import { FC, useMemo } from "react";
5
5
  import {
6
6
  LineChart as RechartsLineChart,
7
7
  Line,
@@ -12,12 +12,12 @@ import {
12
12
  Legend,
13
13
  ResponsiveContainer,
14
14
  TooltipProps,
15
- } from 'recharts'
15
+ } from "recharts";
16
16
 
17
17
  const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
18
- if (!active || !payload || payload.length === 0) return null
18
+ if (!active || !payload || payload.length === 0) return null;
19
19
  return (
20
- <div className="bg-background text-foreground border-border rounded-md border px-2 py-1.5 text-xs shadow-sm">
20
+ <div className="rounded-md border border-border bg-background px-2 py-1.5 text-xs text-foreground shadow-sm">
21
21
  {payload.map((entry, index) => (
22
22
  <div key={index} className="flex items-center gap-2">
23
23
  <span
@@ -26,38 +26,38 @@ const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
26
26
  />
27
27
  <span>{entry.name}:</span>
28
28
  <span className="font-medium">
29
- {typeof entry.value === 'number'
29
+ {typeof entry.value === "number"
30
30
  ? entry.value.toLocaleString()
31
31
  : entry.value}
32
32
  </span>
33
33
  </div>
34
34
  ))}
35
35
  </div>
36
- )
37
- }
36
+ );
37
+ };
38
38
 
39
39
  const COLORS = [
40
- 'var(--chart-1)',
41
- 'var(--chart-2)',
42
- 'var(--chart-3)',
43
- 'var(--chart-4)',
44
- 'var(--chart-5)',
45
- ]
40
+ "var(--chart-1)",
41
+ "var(--chart-2)",
42
+ "var(--chart-3)",
43
+ "var(--chart-4)",
44
+ "var(--chart-5)",
45
+ ];
46
46
 
47
47
  interface SeriesDataPoint {
48
- label: string
49
- [key: string]: string | number
48
+ label: string;
49
+ [key: string]: string | number;
50
50
  }
51
51
 
52
52
  export interface LineChartProps {
53
- title?: string
54
- data: SeriesDataPoint[]
55
- series?: string[]
56
- showGrid?: boolean
57
- showLegend?: boolean
58
- showDots?: boolean
59
- curved?: boolean
60
- className?: string
53
+ title?: string;
54
+ data: SeriesDataPoint[];
55
+ series?: string[];
56
+ showGrid?: boolean;
57
+ showLegend?: boolean;
58
+ showDots?: boolean;
59
+ curved?: boolean;
60
+ className?: string;
61
61
  }
62
62
 
63
63
  export const LineChart: FC<LineChartProps> = ({
@@ -72,16 +72,16 @@ export const LineChart: FC<LineChartProps> = ({
72
72
  }) => {
73
73
  // Auto-detect series from data keys if not provided
74
74
  const seriesKeys = useMemo(() => {
75
- if (series && series.length > 0) return series
76
- if (data.length === 0) return []
77
- const keys = Object.keys(data[0]).filter((k) => k !== 'label')
78
- return keys
79
- }, [data, series])
75
+ if (series && series.length > 0) return series;
76
+ if (data.length === 0) return [];
77
+ const keys = Object.keys(data[0]).filter((k) => k !== "label");
78
+ return keys;
79
+ }, [data, series]);
80
80
 
81
81
  return (
82
- <div className={cn('flex flex-col gap-2', className)}>
82
+ <div className={cn("flex flex-col gap-2", className)}>
83
83
  {title && (
84
- <h3 className="text-foreground text-sm font-medium">{title}</h3>
84
+ <h3 className="text-sm font-medium text-foreground">{title}</h3>
85
85
  )}
86
86
  <div className="h-[250px] w-full">
87
87
  <ResponsiveContainer width="100%" height="100%">
@@ -97,28 +97,28 @@ export const LineChart: FC<LineChartProps> = ({
97
97
  )}
98
98
  <XAxis
99
99
  dataKey="label"
100
- tick={{ fill: 'var(--foreground)', fontSize: 12 }}
101
- axisLine={{ stroke: 'var(--border)' }}
102
- tickLine={{ stroke: 'var(--border)' }}
100
+ tick={{ fill: "var(--foreground)", fontSize: 12 }}
101
+ axisLine={{ stroke: "var(--border)" }}
102
+ tickLine={{ stroke: "var(--border)" }}
103
103
  />
104
104
  <YAxis
105
- tick={{ fill: 'var(--foreground)', fontSize: 12 }}
106
- axisLine={{ stroke: 'var(--border)' }}
107
- tickLine={{ stroke: 'var(--border)' }}
105
+ tick={{ fill: "var(--foreground)", fontSize: 12 }}
106
+ axisLine={{ stroke: "var(--border)" }}
107
+ tickLine={{ stroke: "var(--border)" }}
108
108
  />
109
109
  <Tooltip content={<CustomTooltip />} />
110
110
  {showLegend && seriesKeys.length > 1 && (
111
111
  <Legend
112
- wrapperStyle={{ color: 'var(--foreground)' }}
112
+ wrapperStyle={{ color: "var(--foreground)" }}
113
113
  formatter={(value) => (
114
- <span style={{ color: 'var(--foreground)' }}>{value}</span>
114
+ <span style={{ color: "var(--foreground)" }}>{value}</span>
115
115
  )}
116
116
  />
117
117
  )}
118
118
  {seriesKeys.map((key, index) => (
119
119
  <Line
120
120
  key={key}
121
- type={curved ? 'monotone' : 'linear'}
121
+ type={curved ? "monotone" : "linear"}
122
122
  dataKey={key}
123
123
  stroke={COLORS[index % COLORS.length]}
124
124
  strokeWidth={2}
@@ -131,5 +131,5 @@ export const LineChart: FC<LineChartProps> = ({
131
131
  </ResponsiveContainer>
132
132
  </div>
133
133
  </div>
134
- )
135
- }
134
+ );
135
+ };
@@ -1,7 +1,7 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { cn } from '@/lib/utils'
4
- import { FC } from 'react'
3
+ import { cn } from "@/lib/utils";
4
+ import { FC } from "react";
5
5
  import {
6
6
  PieChart as RechartsPieChart,
7
7
  Pie,
@@ -10,42 +10,42 @@ import {
10
10
  Legend,
11
11
  ResponsiveContainer,
12
12
  TooltipProps,
13
- } from 'recharts'
13
+ } from "recharts";
14
14
 
15
15
  const CustomTooltip = ({ active, payload }: TooltipProps<number, string>) => {
16
- if (!active || !payload || payload.length === 0) return null
17
- const entry = payload[0]
16
+ if (!active || !payload || payload.length === 0) return null;
17
+ const entry = payload[0];
18
18
  return (
19
- <div className="bg-background text-foreground border-border rounded-md border px-2 py-1 text-xs shadow-sm">
19
+ <div className="rounded-md border border-border bg-background px-2 py-1 text-xs text-foreground shadow-sm">
20
20
  <span className="font-medium">
21
- {typeof entry?.value === 'number'
21
+ {typeof entry?.value === "number"
22
22
  ? entry.value.toLocaleString()
23
23
  : entry?.value}
24
24
  </span>
25
25
  </div>
26
- )
27
- }
26
+ );
27
+ };
28
28
 
29
29
  const COLORS = [
30
- 'var(--chart-1)',
31
- 'var(--chart-2)',
32
- 'var(--chart-3)',
33
- 'var(--chart-4)',
34
- 'var(--chart-5)',
35
- ]
30
+ "var(--chart-1)",
31
+ "var(--chart-2)",
32
+ "var(--chart-3)",
33
+ "var(--chart-4)",
34
+ "var(--chart-5)",
35
+ ];
36
36
 
37
37
  interface DataPoint {
38
- label: string
39
- value: number
40
- color?: string
38
+ label: string;
39
+ value: number;
40
+ color?: string;
41
41
  }
42
42
 
43
43
  export interface PieChartProps {
44
- title?: string
45
- data: DataPoint[]
46
- showLabels?: boolean
47
- showLegend?: boolean
48
- className?: string
44
+ title?: string;
45
+ data: DataPoint[];
46
+ showLabels?: boolean;
47
+ showLegend?: boolean;
48
+ className?: string;
49
49
  }
50
50
 
51
51
  export const PieChart: FC<PieChartProps> = ({
@@ -60,12 +60,12 @@ export const PieChart: FC<PieChartProps> = ({
60
60
  name: d.label,
61
61
  value: d.value,
62
62
  color: d.color,
63
- }))
63
+ }));
64
64
 
65
65
  return (
66
- <div className={cn('flex flex-col gap-2', className)}>
66
+ <div className={cn("flex flex-col gap-2", className)}>
67
67
  {title && (
68
- <h3 className="text-foreground text-sm font-medium">{title}</h3>
68
+ <h3 className="text-sm font-medium text-foreground">{title}</h3>
69
69
  )}
70
70
  <div className="h-[320px] w-full">
71
71
  <ResponsiveContainer width="100%" height="100%">
@@ -90,33 +90,33 @@ export const PieChart: FC<PieChartProps> = ({
90
90
  midAngle,
91
91
  outerRadius,
92
92
  }: {
93
- name?: string
94
- percent?: number
95
- cx?: number
96
- cy?: number
97
- midAngle?: number
98
- outerRadius?: number
93
+ name?: string;
94
+ percent?: number;
95
+ cx?: number;
96
+ cy?: number;
97
+ midAngle?: number;
98
+ outerRadius?: number;
99
99
  }) => {
100
- const RADIAN = Math.PI / 180
101
- const radius = (outerRadius ?? 80) + 25
100
+ const RADIAN = Math.PI / 180;
101
+ const radius = (outerRadius ?? 80) + 25;
102
102
  const x =
103
103
  (cx ?? 0) +
104
- radius * Math.cos(-((midAngle ?? 0) * RADIAN))
104
+ radius * Math.cos(-((midAngle ?? 0) * RADIAN));
105
105
  const y =
106
106
  (cy ?? 0) +
107
- radius * Math.sin(-((midAngle ?? 0) * RADIAN))
107
+ radius * Math.sin(-((midAngle ?? 0) * RADIAN));
108
108
  return (
109
109
  <text
110
110
  x={x}
111
111
  y={y}
112
112
  fill="var(--foreground)"
113
- textAnchor={x > (cx ?? 0) ? 'start' : 'end'}
113
+ textAnchor={x > (cx ?? 0) ? "start" : "end"}
114
114
  dominantBaseline="central"
115
115
  fontSize={12}
116
116
  >
117
- {`${name ?? ''} (${((percent ?? 0) * 100).toFixed(0)}%)`}
117
+ {`${name ?? ""} (${((percent ?? 0) * 100).toFixed(0)}%)`}
118
118
  </text>
119
- )
119
+ );
120
120
  }
121
121
  : undefined
122
122
  }
@@ -134,9 +134,9 @@ export const PieChart: FC<PieChartProps> = ({
134
134
  {showLegend && (
135
135
  <Legend
136
136
  verticalAlign="bottom"
137
- wrapperStyle={{ color: 'var(--foreground)', paddingTop: 20 }}
137
+ wrapperStyle={{ color: "var(--foreground)", paddingTop: 20 }}
138
138
  formatter={(value) => (
139
- <span style={{ color: 'var(--foreground)' }}>{value}</span>
139
+ <span style={{ color: "var(--foreground)" }}>{value}</span>
140
140
  )}
141
141
  />
142
142
  )}
@@ -144,5 +144,5 @@ export const PieChart: FC<PieChartProps> = ({
144
144
  </ResponsiveContainer>
145
145
  </div>
146
146
  </div>
147
- )
148
- }
147
+ );
148
+ };