@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,15 +1,15 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from 'react'
4
- import { ChevronDownIcon } from 'lucide-react'
5
- import { Accordion as AccordionPrimitive } from 'radix-ui'
3
+ import * as React from "react";
4
+ import { ChevronDownIcon } from "lucide-react";
5
+ import { Accordion as AccordionPrimitive } from "radix-ui";
6
6
 
7
- import { cn } from '@/lib/utils'
7
+ import { cn } from "@/lib/utils";
8
8
 
9
9
  function Accordion({
10
10
  ...props
11
11
  }: React.ComponentProps<typeof AccordionPrimitive.Root>) {
12
- return <AccordionPrimitive.Root data-slot="accordion" {...props} />
12
+ return <AccordionPrimitive.Root data-slot="accordion" {...props} />;
13
13
  }
14
14
 
15
15
  function AccordionItem({
@@ -19,10 +19,10 @@ function AccordionItem({
19
19
  return (
20
20
  <AccordionPrimitive.Item
21
21
  data-slot="accordion-item"
22
- className={cn('border-b last:border-b-0', className)}
22
+ className={cn("border-b last:border-b-0", className)}
23
23
  {...props}
24
24
  />
25
- )
25
+ );
26
26
  }
27
27
 
28
28
  function AccordionTrigger({
@@ -35,16 +35,16 @@ function AccordionTrigger({
35
35
  <AccordionPrimitive.Trigger
36
36
  data-slot="accordion-trigger"
37
37
  className={cn(
38
- 'text-foreground focus-visible:border-ring focus-visible:ring-ring/50 flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium transition-all outline-none hover:underline focus-visible:ring-[3px] disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180',
39
- className
38
+ "flex flex-1 items-start justify-between gap-4 rounded-md py-4 text-left text-sm font-medium text-foreground transition-all outline-none hover:underline focus-visible:border-ring focus-visible:ring-[3px] focus-visible:ring-ring/50 disabled:pointer-events-none disabled:opacity-50 [&[data-state=open]>svg]:rotate-180",
39
+ className,
40
40
  )}
41
41
  {...props}
42
42
  >
43
43
  {children}
44
- <ChevronDownIcon className="text-muted-foreground pointer-events-none size-4 shrink-0 translate-y-0.5 transition-transform duration-200" />
44
+ <ChevronDownIcon className="pointer-events-none size-4 shrink-0 translate-y-0.5 text-muted-foreground transition-transform duration-200" />
45
45
  </AccordionPrimitive.Trigger>
46
46
  </AccordionPrimitive.Header>
47
- )
47
+ );
48
48
  }
49
49
 
50
50
  function AccordionContent({
@@ -55,12 +55,12 @@ function AccordionContent({
55
55
  return (
56
56
  <AccordionPrimitive.Content
57
57
  data-slot="accordion-content"
58
- className="data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down overflow-hidden text-sm"
58
+ className="overflow-hidden text-sm data-[state=closed]:animate-accordion-up data-[state=open]:animate-accordion-down"
59
59
  {...props}
60
60
  >
61
- <div className={cn('pt-0 pb-4', className)}>{children}</div>
61
+ <div className={cn("pt-0 pb-4", className)}>{children}</div>
62
62
  </AccordionPrimitive.Content>
63
- )
63
+ );
64
64
  }
65
65
 
66
- export { Accordion, AccordionItem, AccordionTrigger, AccordionContent }
66
+ export { Accordion, AccordionItem, AccordionTrigger, AccordionContent };
@@ -1,68 +1,68 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from 'react'
4
- import { Button, buttonVariants } from './button'
5
- import type { VariantProps } from 'class-variance-authority'
6
- import { cn } from '@/lib/utils'
7
- import { useToolExecution } from '@/contexts/ToolExecutionContext'
3
+ import * as React from "react";
4
+ import { Button, buttonVariants } from "./button";
5
+ import type { VariantProps } from "class-variance-authority";
6
+ import { cn } from "@/lib/utils";
7
+ import { useToolExecution } from "@/contexts/ToolExecutionContext";
8
8
 
9
9
  export interface ActionButtonProps
10
10
  extends
11
- Omit<React.ComponentProps<'button'>, 'onClick'>,
11
+ Omit<React.ComponentProps<"button">, "onClick">,
12
12
  VariantProps<typeof buttonVariants> {
13
- label: string
13
+ label: string;
14
14
  /** Tool name to invoke when clicked (matches LLM prompt) */
15
- action: string
16
- args?: Record<string, unknown>
15
+ action: string;
16
+ args?: Record<string, unknown>;
17
17
  }
18
18
 
19
19
  export function ActionButton({
20
20
  label,
21
21
  action,
22
22
  args,
23
- variant = 'default',
24
- size = 'default',
23
+ variant = "default",
24
+ size = "default",
25
25
  className,
26
26
  disabled,
27
27
  ...props
28
28
  }: ActionButtonProps) {
29
- const { executeTool, isToolAvailable } = useToolExecution()
30
- const [isLoading, setIsLoading] = React.useState(false)
29
+ const { executeTool, isToolAvailable } = useToolExecution();
30
+ const [isLoading, setIsLoading] = React.useState(false);
31
31
 
32
- const toolAvailable = isToolAvailable(action)
32
+ const toolAvailable = isToolAvailable(action);
33
33
 
34
- const [error, setError] = React.useState<string | null>(null)
34
+ const [error, setError] = React.useState<string | null>(null);
35
35
 
36
36
  const handleClick = React.useCallback(async () => {
37
- if (!toolAvailable || isLoading) return
37
+ if (!toolAvailable || isLoading) return;
38
38
 
39
- setIsLoading(true)
40
- setError(null)
39
+ setIsLoading(true);
40
+ setError(null);
41
41
  try {
42
- const result = await executeTool(action, args ?? {})
42
+ const result = await executeTool(action, args ?? {});
43
43
  if (!result.success && result.error) {
44
- setError(result.error)
44
+ setError(result.error);
45
45
  }
46
46
  } catch (err) {
47
- setError(err instanceof Error ? err.message : 'Unknown error')
47
+ setError(err instanceof Error ? err.message : "Unknown error");
48
48
  } finally {
49
- setIsLoading(false)
49
+ setIsLoading(false);
50
50
  }
51
- }, [action, args, executeTool, isLoading, toolAvailable])
51
+ }, [action, args, executeTool, isLoading, toolAvailable]);
52
52
 
53
53
  return (
54
54
  <div className="inline-flex flex-col gap-1">
55
55
  <Button
56
- variant={error ? 'destructive' : variant}
56
+ variant={error ? "destructive" : variant}
57
57
  size={size}
58
58
  className={cn(className)}
59
59
  onClick={handleClick}
60
60
  disabled={disabled || isLoading || !toolAvailable}
61
61
  {...props}
62
62
  >
63
- {isLoading ? 'Loading...' : label}
63
+ {isLoading ? "Loading..." : label}
64
64
  </Button>
65
- {error && <span className="text-destructive text-xs">{error}</span>}
65
+ {error && <span className="text-xs text-destructive">{error}</span>}
66
66
  </div>
67
- )
67
+ );
68
68
  }
@@ -1,12 +1,12 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from 'react'
4
- import { Alert, AlertTitle, AlertDescription } from './alert'
3
+ import * as React from "react";
4
+ import { Alert, AlertTitle, AlertDescription } from "./alert";
5
5
 
6
6
  export interface AlertWrapperProps {
7
- title: string
8
- description?: string
9
- variant?: 'default' | 'destructive'
7
+ title: string;
8
+ description?: string;
9
+ variant?: "default" | "destructive";
10
10
  }
11
11
 
12
12
  /**
@@ -15,12 +15,12 @@ export interface AlertWrapperProps {
15
15
  export function AlertWrapper({
16
16
  title,
17
17
  description,
18
- variant = 'default',
18
+ variant = "default",
19
19
  }: AlertWrapperProps) {
20
20
  return (
21
21
  <Alert variant={variant}>
22
22
  <AlertTitle>{title}</AlertTitle>
23
23
  {description && <AlertDescription>{description}</AlertDescription>}
24
24
  </Alert>
25
- )
25
+ );
26
26
  }
@@ -1,29 +1,29 @@
1
- import * as React from 'react'
2
- import { cva, type VariantProps } from 'class-variance-authority'
1
+ import * as React from "react";
2
+ import { cva, type VariantProps } from "class-variance-authority";
3
3
 
4
- import { cn } from '@/lib/utils'
4
+ import { cn } from "@/lib/utils";
5
5
 
6
6
  const alertVariants = cva(
7
- 'relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current',
7
+ "relative w-full rounded-lg border px-4 py-3 text-sm grid has-[>svg]:grid-cols-[calc(var(--spacing)*4)_1fr] grid-cols-[0_1fr] has-[>svg]:gap-x-3 gap-y-0.5 items-start [&>svg]:size-4 [&>svg]:translate-y-0.5 [&>svg]:text-current",
8
8
  {
9
9
  variants: {
10
10
  variant: {
11
- default: 'bg-card text-card-foreground',
11
+ default: "bg-card text-card-foreground",
12
12
  destructive:
13
- 'text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90',
13
+ "text-destructive bg-card [&>svg]:text-current *:data-[slot=alert-description]:text-destructive/90",
14
14
  },
15
15
  },
16
16
  defaultVariants: {
17
- variant: 'default',
17
+ variant: "default",
18
18
  },
19
- }
20
- )
19
+ },
20
+ );
21
21
 
22
22
  function Alert({
23
23
  className,
24
24
  variant,
25
25
  ...props
26
- }: React.ComponentProps<'div'> & VariantProps<typeof alertVariants>) {
26
+ }: React.ComponentProps<"div"> & VariantProps<typeof alertVariants>) {
27
27
  return (
28
28
  <div
29
29
  data-slot="alert"
@@ -31,36 +31,36 @@ function Alert({
31
31
  className={cn(alertVariants({ variant }), className)}
32
32
  {...props}
33
33
  />
34
- )
34
+ );
35
35
  }
36
36
 
37
- function AlertTitle({ className, ...props }: React.ComponentProps<'div'>) {
37
+ function AlertTitle({ className, ...props }: React.ComponentProps<"div">) {
38
38
  return (
39
39
  <div
40
40
  data-slot="alert-title"
41
41
  className={cn(
42
- 'col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight',
43
- className
42
+ "col-start-2 line-clamp-1 min-h-4 font-medium tracking-tight",
43
+ className,
44
44
  )}
45
45
  {...props}
46
46
  />
47
- )
47
+ );
48
48
  }
49
49
 
50
50
  function AlertDescription({
51
51
  className,
52
52
  ...props
53
- }: React.ComponentProps<'div'>) {
53
+ }: React.ComponentProps<"div">) {
54
54
  return (
55
55
  <div
56
56
  data-slot="alert-description"
57
57
  className={cn(
58
- 'text-muted-foreground col-start-2 grid justify-items-start gap-1 text-sm [&_p]:leading-relaxed',
59
- className
58
+ "col-start-2 grid justify-items-start gap-1 text-sm text-muted-foreground [&_p]:leading-relaxed",
59
+ className,
60
60
  )}
61
61
  {...props}
62
62
  />
63
- )
63
+ );
64
64
  }
65
65
 
66
- export { Alert, AlertTitle, AlertDescription }
66
+ export { Alert, AlertTitle, AlertDescription };
@@ -1,12 +1,12 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from 'react'
4
- import { Avatar, AvatarImage, AvatarFallback } from './avatar'
3
+ import * as React from "react";
4
+ import { Avatar, AvatarImage, AvatarFallback } from "./avatar";
5
5
 
6
6
  export interface AvatarWrapperProps {
7
- src?: string
8
- alt?: string
9
- fallback: string
7
+ src?: string;
8
+ alt?: string;
9
+ fallback: string;
10
10
  }
11
11
 
12
12
  /**
@@ -18,5 +18,5 @@ export function AvatarWrapper({ src, alt, fallback }: AvatarWrapperProps) {
18
18
  {src && <AvatarImage src={src} alt={alt} />}
19
19
  <AvatarFallback>{fallback}</AvatarFallback>
20
20
  </Avatar>
21
- )
21
+ );
22
22
  }
@@ -1,28 +1,28 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from 'react'
4
- import { Avatar as AvatarPrimitive } from 'radix-ui'
3
+ import * as React from "react";
4
+ import { Avatar as AvatarPrimitive } from "radix-ui";
5
5
 
6
- import { cn } from '@/lib/utils'
6
+ import { cn } from "@/lib/utils";
7
7
 
8
8
  function Avatar({
9
9
  className,
10
- size = 'default',
10
+ size = "default",
11
11
  ...props
12
12
  }: React.ComponentProps<typeof AvatarPrimitive.Root> & {
13
- size?: 'default' | 'sm' | 'lg'
13
+ size?: "default" | "sm" | "lg";
14
14
  }) {
15
15
  return (
16
16
  <AvatarPrimitive.Root
17
17
  data-slot="avatar"
18
18
  data-size={size}
19
19
  className={cn(
20
- 'group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6',
21
- className
20
+ "group/avatar relative flex size-8 shrink-0 overflow-hidden rounded-full select-none data-[size=lg]:size-10 data-[size=sm]:size-6",
21
+ className,
22
22
  )}
23
23
  {...props}
24
24
  />
25
- )
25
+ );
26
26
  }
27
27
 
28
28
  function AvatarImage({
@@ -32,10 +32,10 @@ function AvatarImage({
32
32
  return (
33
33
  <AvatarPrimitive.Image
34
34
  data-slot="avatar-image"
35
- className={cn('aspect-square size-full', className)}
35
+ className={cn("aspect-square size-full", className)}
36
36
  {...props}
37
37
  />
38
- )
38
+ );
39
39
  }
40
40
 
41
41
  function AvatarFallback({
@@ -46,57 +46,57 @@ function AvatarFallback({
46
46
  <AvatarPrimitive.Fallback
47
47
  data-slot="avatar-fallback"
48
48
  className={cn(
49
- 'bg-muted text-muted-foreground flex size-full items-center justify-center rounded-full text-sm group-data-[size=sm]/avatar:text-xs',
50
- className
49
+ "flex size-full items-center justify-center rounded-full bg-muted text-sm text-muted-foreground group-data-[size=sm]/avatar:text-xs",
50
+ className,
51
51
  )}
52
52
  {...props}
53
53
  />
54
- )
54
+ );
55
55
  }
56
56
 
57
- function AvatarBadge({ className, ...props }: React.ComponentProps<'span'>) {
57
+ function AvatarBadge({ className, ...props }: React.ComponentProps<"span">) {
58
58
  return (
59
59
  <span
60
60
  data-slot="avatar-badge"
61
61
  className={cn(
62
- 'bg-primary text-primary-foreground ring-background absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full ring-2 select-none',
63
- 'group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden',
64
- 'group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2',
65
- 'group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2',
66
- className
62
+ "absolute right-0 bottom-0 z-10 inline-flex items-center justify-center rounded-full bg-primary text-primary-foreground ring-2 ring-background select-none",
63
+ "group-data-[size=sm]/avatar:size-2 group-data-[size=sm]/avatar:[&>svg]:hidden",
64
+ "group-data-[size=default]/avatar:size-2.5 group-data-[size=default]/avatar:[&>svg]:size-2",
65
+ "group-data-[size=lg]/avatar:size-3 group-data-[size=lg]/avatar:[&>svg]:size-2",
66
+ className,
67
67
  )}
68
68
  {...props}
69
69
  />
70
- )
70
+ );
71
71
  }
72
72
 
73
- function AvatarGroup({ className, ...props }: React.ComponentProps<'div'>) {
73
+ function AvatarGroup({ className, ...props }: React.ComponentProps<"div">) {
74
74
  return (
75
75
  <div
76
76
  data-slot="avatar-group"
77
77
  className={cn(
78
- '*:data-[slot=avatar]:ring-background group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2',
79
- className
78
+ "group/avatar-group flex -space-x-2 *:data-[slot=avatar]:ring-2 *:data-[slot=avatar]:ring-background",
79
+ className,
80
80
  )}
81
81
  {...props}
82
82
  />
83
- )
83
+ );
84
84
  }
85
85
 
86
86
  function AvatarGroupCount({
87
87
  className,
88
88
  ...props
89
- }: React.ComponentProps<'div'>) {
89
+ }: React.ComponentProps<"div">) {
90
90
  return (
91
91
  <div
92
92
  data-slot="avatar-group-count"
93
93
  className={cn(
94
- 'bg-muted text-muted-foreground ring-background relative flex size-8 shrink-0 items-center justify-center rounded-full text-sm ring-2 group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3',
95
- className
94
+ "relative flex size-8 shrink-0 items-center justify-center rounded-full bg-muted text-sm text-muted-foreground ring-2 ring-background group-has-data-[size=lg]/avatar-group:size-10 group-has-data-[size=sm]/avatar-group:size-6 [&>svg]:size-4 group-has-data-[size=lg]/avatar-group:[&>svg]:size-5 group-has-data-[size=sm]/avatar-group:[&>svg]:size-3",
95
+ className,
96
96
  )}
97
97
  {...props}
98
98
  />
99
- )
99
+ );
100
100
  }
101
101
 
102
102
  export {
@@ -106,4 +106,4 @@ export {
106
106
  AvatarBadge,
107
107
  AvatarGroup,
108
108
  AvatarGroupCount,
109
- }
109
+ };
@@ -1,53 +1,53 @@
1
- import * as React from 'react'
2
- import { cva, type VariantProps } from 'class-variance-authority'
3
- import { Slot } from 'radix-ui'
1
+ import * as React from "react";
2
+ import { cva, type VariantProps } from "class-variance-authority";
3
+ import { Slot } from "radix-ui";
4
4
 
5
- import { cn } from '@/lib/utils'
5
+ import { cn } from "@/lib/utils";
6
6
 
7
7
  const badgeVariants = cva(
8
- 'inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden',
8
+ "inline-flex items-center justify-center rounded-full border border-transparent px-2 py-0.5 text-xs font-medium w-fit whitespace-nowrap shrink-0 [&>svg]:size-3 gap-1 [&>svg]:pointer-events-none focus-visible:border-ring focus-visible:ring-ring/50 focus-visible:ring-[3px] aria-invalid:ring-destructive/20 dark:aria-invalid:ring-destructive/40 aria-invalid:border-destructive transition-[color,box-shadow] overflow-hidden",
9
9
  {
10
10
  variants: {
11
11
  variant: {
12
- default: 'bg-primary text-primary-foreground [a&]:hover:bg-primary/90',
12
+ default: "bg-primary text-primary-foreground [a&]:hover:bg-primary/90",
13
13
  secondary:
14
- 'bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90',
14
+ "bg-secondary text-secondary-foreground [a&]:hover:bg-secondary/90",
15
15
  /** Matches LLM prompt variant */
16
16
  success:
17
- 'bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-100',
17
+ "bg-green-100 text-green-800 dark:bg-green-900 dark:text-green-100",
18
18
  /** Matches LLM prompt variant */
19
19
  warning:
20
- 'bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-100',
20
+ "bg-amber-100 text-amber-800 dark:bg-amber-900 dark:text-amber-100",
21
21
  /** Matches LLM prompt variant */
22
- error: 'bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-100',
22
+ error: "bg-red-100 text-red-800 dark:bg-red-900 dark:text-red-100",
23
23
  destructive:
24
- 'bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60',
24
+ "bg-destructive text-white [a&]:hover:bg-destructive/90 focus-visible:ring-destructive/20 dark:focus-visible:ring-destructive/40 dark:bg-destructive/60",
25
25
  outline:
26
- 'border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground',
26
+ "border-border text-foreground [a&]:hover:bg-accent [a&]:hover:text-accent-foreground",
27
27
  },
28
28
  },
29
29
  defaultVariants: {
30
- variant: 'default',
30
+ variant: "default",
31
31
  },
32
- }
33
- )
32
+ },
33
+ );
34
34
 
35
35
  interface BadgeProps
36
- extends React.ComponentProps<'span'>, VariantProps<typeof badgeVariants> {
37
- asChild?: boolean
36
+ extends React.ComponentProps<"span">, VariantProps<typeof badgeVariants> {
37
+ asChild?: boolean;
38
38
  /** Content text (matches LLM prompt) - rendered as children */
39
- content?: string
39
+ content?: string;
40
40
  }
41
41
 
42
42
  function Badge({
43
43
  className,
44
- variant = 'default',
44
+ variant = "default",
45
45
  asChild = false,
46
46
  content,
47
47
  children,
48
48
  ...props
49
49
  }: BadgeProps) {
50
- const Comp = asChild ? Slot.Root : 'span'
50
+ const Comp = asChild ? Slot.Root : "span";
51
51
 
52
52
  return (
53
53
  <Comp
@@ -58,8 +58,8 @@ function Badge({
58
58
  >
59
59
  {content ?? children}
60
60
  </Comp>
61
- )
61
+ );
62
62
  }
63
63
 
64
64
  // eslint-disable-next-line react-refresh/only-export-components
65
- export { Badge, badgeVariants }
65
+ export { Badge, badgeVariants };
@@ -1,17 +1,17 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import * as React from 'react'
4
- import { Button } from './button'
3
+ import * as React from "react";
4
+ import { Button } from "./button";
5
5
 
6
6
  export interface ButtonWrapperProps {
7
- label: string
8
- variant?: 'default' | 'secondary' | 'destructive' | 'outline' | 'ghost'
9
- size?: 'default' | 'sm' | 'lg' | 'icon'
10
- disabled?: boolean
7
+ label: string;
8
+ variant?: "default" | "secondary" | "destructive" | "outline" | "ghost";
9
+ size?: "default" | "sm" | "lg" | "icon";
10
+ disabled?: boolean;
11
11
  /** Backend action to trigger (future use) */
12
- action?: string
12
+ action?: string;
13
13
  /** Parameters for the action (future use) */
14
- actionParams?: Record<string, unknown>
14
+ actionParams?: Record<string, unknown>;
15
15
  }
16
16
 
17
17
  /**
@@ -20,13 +20,13 @@ export interface ButtonWrapperProps {
20
20
  */
21
21
  export function ButtonWrapper({
22
22
  label,
23
- variant = 'default',
24
- size = 'default',
23
+ variant = "default",
24
+ size = "default",
25
25
  disabled = false,
26
26
  }: ButtonWrapperProps) {
27
27
  return (
28
28
  <Button variant={variant} size={size} disabled={disabled}>
29
29
  {label}
30
30
  </Button>
31
- )
31
+ );
32
32
  }