@gram-ai/elements 1.27.4 → 1.27.6

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 (278) 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.css +1 -1
  23. package/dist/elements.js +2 -2
  24. package/dist/hooks/useDensity.d.ts +73 -73
  25. package/dist/hooks/useMCPTools.d.ts +1 -1
  26. package/dist/hooks/useRadius.d.ts +1 -1
  27. package/dist/{index-KSX4Qjip.cjs → index-A17b62wR.cjs} +10 -10
  28. package/dist/index-A17b62wR.cjs.map +1 -0
  29. package/dist/{index-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
  30. package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
  31. package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
  32. package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
  33. package/dist/{index-D0bAYNQy.js → index-Dm2wLFTN.js} +304 -282
  34. package/dist/index-Dm2wLFTN.js.map +1 -0
  35. package/dist/lib/cassette.d.ts +4 -4
  36. package/dist/lib/errorTracking.d.ts +1 -1
  37. package/dist/lib/messageConverter.d.ts +1 -1
  38. package/dist/lib/models.d.ts +1 -1
  39. package/dist/plugins/chart/ui/bar-chart.d.ts +1 -1
  40. package/dist/plugins/generative-ui/ui/accordion-wrapper.d.ts +2 -2
  41. package/dist/plugins/generative-ui/ui/accordion.d.ts +1 -1
  42. package/dist/plugins/generative-ui/ui/action-button.d.ts +2 -2
  43. package/dist/plugins/generative-ui/ui/alert-wrapper.d.ts +1 -1
  44. package/dist/plugins/generative-ui/ui/alert.d.ts +4 -4
  45. package/dist/plugins/generative-ui/ui/avatar.d.ts +5 -5
  46. package/dist/plugins/generative-ui/ui/badge.d.ts +2 -2
  47. package/dist/plugins/generative-ui/ui/button-wrapper.d.ts +2 -2
  48. package/dist/plugins/generative-ui/ui/button.d.ts +2 -2
  49. package/dist/plugins/generative-ui/ui/card-wrapper.d.ts +2 -2
  50. package/dist/plugins/generative-ui/ui/card.d.ts +8 -8
  51. package/dist/plugins/generative-ui/ui/checkbox.d.ts +1 -1
  52. package/dist/plugins/generative-ui/ui/data-table.d.ts +2 -2
  53. package/dist/plugins/generative-ui/ui/dialog.d.ts +3 -3
  54. package/dist/plugins/generative-ui/ui/dropdown-menu.d.ts +3 -3
  55. package/dist/plugins/generative-ui/ui/grid.d.ts +3 -3
  56. package/dist/plugins/generative-ui/ui/input-wrapper.d.ts +1 -1
  57. package/dist/plugins/generative-ui/ui/input.d.ts +2 -2
  58. package/dist/plugins/generative-ui/ui/label.d.ts +1 -1
  59. package/dist/plugins/generative-ui/ui/metric.d.ts +3 -3
  60. package/dist/plugins/generative-ui/ui/pagination.d.ts +6 -6
  61. package/dist/plugins/generative-ui/ui/popover.d.ts +4 -4
  62. package/dist/plugins/generative-ui/ui/progress.d.ts +2 -2
  63. package/dist/plugins/generative-ui/ui/radio-group.d.ts +1 -1
  64. package/dist/plugins/generative-ui/ui/select.d.ts +2 -2
  65. package/dist/plugins/generative-ui/ui/separator.d.ts +1 -1
  66. package/dist/plugins/generative-ui/ui/skeleton.d.ts +1 -1
  67. package/dist/plugins/generative-ui/ui/stack.d.ts +6 -6
  68. package/dist/plugins/generative-ui/ui/switch.d.ts +2 -2
  69. package/dist/plugins/generative-ui/ui/table.d.ts +9 -9
  70. package/dist/plugins/generative-ui/ui/tabs-wrapper.d.ts +1 -1
  71. package/dist/plugins/generative-ui/ui/tabs.d.ts +1 -1
  72. package/dist/plugins/generative-ui/ui/text.d.ts +3 -3
  73. package/dist/plugins/generative-ui/ui/textarea.d.ts +2 -2
  74. package/dist/plugins/generative-ui/ui/tooltip.d.ts +1 -1
  75. package/dist/plugins.cjs +1 -1
  76. package/dist/plugins.js +1 -1
  77. package/dist/{profiler-CyzxBxVz.cjs → profiler-Cbbf4eEX.cjs} +2 -2
  78. package/dist/{profiler-CyzxBxVz.cjs.map → profiler-Cbbf4eEX.cjs.map} +1 -1
  79. package/dist/{profiler-BFkhZRxj.js → profiler-mca4IXaY.js} +2 -2
  80. package/dist/{profiler-BFkhZRxj.js.map → profiler-mca4IXaY.js.map} +1 -1
  81. package/dist/react-shim.js +1 -1
  82. package/dist/server/express.cjs.map +1 -1
  83. package/dist/server/express.js.map +1 -1
  84. package/dist/{startRecording-C-PPAs_Z.js → startRecording-BCafdS7B.js} +2 -2
  85. package/dist/{startRecording-C-PPAs_Z.js.map → startRecording-BCafdS7B.js.map} +1 -1
  86. package/dist/{startRecording-Dq92sEHf.cjs → startRecording-Eb5f7wqP.cjs} +2 -2
  87. package/dist/{startRecording-Dq92sEHf.cjs.map → startRecording-Eb5f7wqP.cjs.map} +1 -1
  88. package/dist/types/index.d.ts +4 -4
  89. package/package.json +1 -5
  90. package/src/compat-plugin.ts +14 -14
  91. package/src/compat-shims.ts +33 -31
  92. package/src/compat.test.ts +48 -48
  93. package/src/compat.ts +6 -6
  94. package/src/components/Chat/index.tsx +17 -17
  95. package/src/components/Chat/stories/Charts.stories.tsx +98 -98
  96. package/src/components/Chat/stories/Composer.stories.tsx +15 -15
  97. package/src/components/Chat/stories/ConnectionConfiguration.stories.tsx +44 -44
  98. package/src/components/Chat/stories/CustomComponents.stories.tsx +17 -17
  99. package/src/components/Chat/stories/Density.stories.tsx +20 -20
  100. package/src/components/Chat/stories/ErrorBoundary.stories.tsx +47 -47
  101. package/src/components/Chat/stories/FrontendTools.stories.tsx +39 -39
  102. package/src/components/Chat/stories/GenerativeUI.stories.tsx +48 -48
  103. package/src/components/Chat/stories/MessageFeedback.stories.tsx +52 -52
  104. package/src/components/Chat/stories/Modal.stories.tsx +28 -28
  105. package/src/components/Chat/stories/Model.stories.tsx +11 -11
  106. package/src/components/Chat/stories/Radius.stories.tsx +20 -20
  107. package/src/components/Chat/stories/Sidecar.stories.tsx +13 -13
  108. package/src/components/Chat/stories/StyleIsolation.stories.tsx +11 -11
  109. package/src/components/Chat/stories/Theme.stories.tsx +25 -25
  110. package/src/components/Chat/stories/Thread.stories.tsx +25 -25
  111. package/src/components/Chat/stories/ToolApproval.stories.tsx +55 -55
  112. package/src/components/Chat/stories/ToolMentions.stories.tsx +17 -17
  113. package/src/components/Chat/stories/Tools.stories.tsx +88 -88
  114. package/src/components/Chat/stories/Variants.stories.tsx +32 -32
  115. package/src/components/Chat/stories/Welcome.stories.tsx +14 -14
  116. package/src/components/ChatHistory.tsx +7 -7
  117. package/src/components/FrontendTools/index.tsx +5 -5
  118. package/src/components/Replay.stories.tsx +157 -157
  119. package/src/components/Replay.tsx +76 -73
  120. package/src/components/ShadowRoot.tsx +40 -40
  121. package/src/components/ShareButton/index.tsx +32 -32
  122. package/src/components/assistant-ui/assistant-modal.tsx +92 -87
  123. package/src/components/assistant-ui/assistant-sidecar.tsx +35 -35
  124. package/src/components/assistant-ui/attachment.tsx +80 -80
  125. package/src/components/assistant-ui/connection-status-indicator.tsx +33 -33
  126. package/src/components/assistant-ui/error-boundary.tsx +34 -34
  127. package/src/components/assistant-ui/follow-on-suggestions.tsx +26 -26
  128. package/src/components/assistant-ui/markdown-text.tsx +69 -69
  129. package/src/components/assistant-ui/mentioned-tools-badges.tsx +38 -38
  130. package/src/components/assistant-ui/message-feedback.tsx +57 -50
  131. package/src/components/assistant-ui/reasoning.tsx +83 -83
  132. package/src/components/assistant-ui/thread-list.tsx +45 -45
  133. package/src/components/assistant-ui/thread.tsx +278 -278
  134. package/src/components/assistant-ui/tool-fallback.tsx +37 -37
  135. package/src/components/assistant-ui/tool-group.tsx +26 -26
  136. package/src/components/assistant-ui/tool-mention-autocomplete.tsx +122 -122
  137. package/src/components/assistant-ui/tooltip-icon-button.tsx +18 -18
  138. package/src/components/ui/avatar.tsx +12 -12
  139. package/src/components/ui/button.tsx +12 -12
  140. package/src/components/ui/buttonVariants.ts +17 -17
  141. package/src/components/ui/calendar.tsx +106 -106
  142. package/src/components/ui/charts.stories.tsx +56 -56
  143. package/src/components/ui/collapsible.tsx +5 -5
  144. package/src/components/ui/dialog.tsx +30 -30
  145. package/src/components/ui/generative-ui.stories.tsx +200 -200
  146. package/src/components/ui/generative-ui.tsx +26 -26
  147. package/src/components/ui/popover.tsx +14 -14
  148. package/src/components/ui/skeleton.tsx +5 -5
  149. package/src/components/ui/time-range-picker.stories.tsx +80 -80
  150. package/src/components/ui/time-range-picker.tsx +248 -246
  151. package/src/components/ui/tool-ui.stories.tsx +37 -37
  152. package/src/components/ui/tool-ui.tsx +221 -215
  153. package/src/components/ui/tooltip.tsx +15 -15
  154. package/src/constants/tailwind.ts +1 -1
  155. package/src/contexts/ChatIdContext.tsx +7 -7
  156. package/src/contexts/ConnectionStatusContext.tsx +64 -64
  157. package/src/contexts/ElementsProvider.tsx +214 -213
  158. package/src/contexts/ReplayContext.ts +3 -3
  159. package/src/contexts/ToolApprovalContext.tsx +54 -54
  160. package/src/contexts/ToolExecutionContext.tsx +34 -34
  161. package/src/contexts/contexts.ts +7 -7
  162. package/src/contexts/portal-container-context.ts +2 -2
  163. package/src/contexts/portal-container.tsx +7 -7
  164. package/src/embedded.ts +1 -1
  165. package/src/global.css +25 -25
  166. package/src/hooks/useAuth.ts +72 -72
  167. package/src/hooks/useDensity.ts +79 -79
  168. package/src/hooks/useElements.ts +6 -6
  169. package/src/hooks/useExpanded.ts +12 -12
  170. package/src/hooks/useFollowOnSuggestions.ts +83 -83
  171. package/src/hooks/useGramThreadListAdapter.tsx +99 -99
  172. package/src/hooks/useMCPTools.ts +47 -47
  173. package/src/hooks/useModel.ts +14 -14
  174. package/src/hooks/usePluginComponents.ts +11 -11
  175. package/src/hooks/usePortalContainer.ts +5 -5
  176. package/src/hooks/useRadius.ts +23 -23
  177. package/src/hooks/useRecordCassette.ts +34 -34
  178. package/src/hooks/useSession.ts +11 -11
  179. package/src/hooks/useThemeProps.ts +13 -13
  180. package/src/hooks/useThreadId.ts +4 -4
  181. package/src/hooks/useToolApproval.ts +7 -7
  182. package/src/hooks/useToolMentions.ts +40 -40
  183. package/src/index.ts +26 -26
  184. package/src/lib/api.test.ts +61 -61
  185. package/src/lib/api.ts +4 -3
  186. package/src/lib/auth.ts +13 -13
  187. package/src/lib/cassette.ts +84 -84
  188. package/src/lib/easing.ts +1 -1
  189. package/src/lib/errorTracking.config.ts +5 -5
  190. package/src/lib/errorTracking.ts +29 -29
  191. package/src/lib/generative-ui.ts +7 -7
  192. package/src/lib/humanize.ts +3 -3
  193. package/src/lib/messageConverter.test.ts +130 -127
  194. package/src/lib/messageConverter.ts +196 -196
  195. package/src/lib/models.ts +28 -20
  196. package/src/lib/token.test.ts +56 -56
  197. package/src/lib/token.ts +14 -14
  198. package/src/lib/tool-mentions.ts +45 -45
  199. package/src/lib/tools.ts +66 -62
  200. package/src/lib/utils.ts +5 -5
  201. package/src/lib.d.ts +1 -1
  202. package/src/plugins/README.md +5 -5
  203. package/src/plugins/chart/catalog.ts +18 -18
  204. package/src/plugins/chart/chart.test.ts +31 -31
  205. package/src/plugins/chart/component.tsx +34 -34
  206. package/src/plugins/chart/index.ts +4 -4
  207. package/src/plugins/chart/ui/area-chart.tsx +42 -42
  208. package/src/plugins/chart/ui/bar-chart.tsx +46 -46
  209. package/src/plugins/chart/ui/donut-chart.tsx +48 -48
  210. package/src/plugins/chart/ui/index.ts +7 -7
  211. package/src/plugins/chart/ui/line-chart.tsx +43 -43
  212. package/src/plugins/chart/ui/pie-chart.tsx +44 -44
  213. package/src/plugins/chart/ui/radar-chart.tsx +33 -33
  214. package/src/plugins/chart/ui/scatter-chart.tsx +43 -43
  215. package/src/plugins/components/MacOSWindowFrame.tsx +15 -15
  216. package/src/plugins/components/PluginLoadingState.tsx +10 -10
  217. package/src/plugins/components/index.ts +1 -1
  218. package/src/plugins/generative-ui/catalog.ts +54 -54
  219. package/src/plugins/generative-ui/component.tsx +85 -85
  220. package/src/plugins/generative-ui/index.ts +4 -4
  221. package/src/plugins/generative-ui/ui/accordion-wrapper.tsx +16 -16
  222. package/src/plugins/generative-ui/ui/accordion.tsx +16 -16
  223. package/src/plugins/generative-ui/ui/action-button.tsx +28 -28
  224. package/src/plugins/generative-ui/ui/alert-wrapper.tsx +8 -8
  225. package/src/plugins/generative-ui/ui/alert.tsx +20 -20
  226. package/src/plugins/generative-ui/ui/avatar-wrapper.tsx +7 -7
  227. package/src/plugins/generative-ui/ui/avatar.tsx +30 -30
  228. package/src/plugins/generative-ui/ui/badge.tsx +22 -22
  229. package/src/plugins/generative-ui/ui/button-wrapper.tsx +12 -12
  230. package/src/plugins/generative-ui/ui/button.tsx +28 -28
  231. package/src/plugins/generative-ui/ui/card-wrapper.tsx +8 -8
  232. package/src/plugins/generative-ui/ui/card.tsx +27 -27
  233. package/src/plugins/generative-ui/ui/checkbox-wrapper.tsx +9 -9
  234. package/src/plugins/generative-ui/ui/checkbox.tsx +9 -9
  235. package/src/plugins/generative-ui/ui/data-table.tsx +8 -8
  236. package/src/plugins/generative-ui/ui/dialog.tsx +31 -31
  237. package/src/plugins/generative-ui/ui/dropdown-menu.tsx +44 -44
  238. package/src/plugins/generative-ui/ui/grid.tsx +12 -12
  239. package/src/plugins/generative-ui/ui/index.ts +40 -40
  240. package/src/plugins/generative-ui/ui/input-wrapper.tsx +11 -11
  241. package/src/plugins/generative-ui/ui/input.tsx +9 -9
  242. package/src/plugins/generative-ui/ui/label.tsx +8 -8
  243. package/src/plugins/generative-ui/ui/list.tsx +11 -11
  244. package/src/plugins/generative-ui/ui/metric.tsx +23 -23
  245. package/src/plugins/generative-ui/ui/pagination.tsx +28 -28
  246. package/src/plugins/generative-ui/ui/popover.tsx +21 -21
  247. package/src/plugins/generative-ui/ui/progress.tsx +13 -13
  248. package/src/plugins/generative-ui/ui/radio-group.tsx +12 -12
  249. package/src/plugins/generative-ui/ui/select-wrapper.tsx +7 -7
  250. package/src/plugins/generative-ui/ui/select.tsx +37 -37
  251. package/src/plugins/generative-ui/ui/separator.tsx +9 -9
  252. package/src/plugins/generative-ui/ui/skeleton-wrapper.tsx +10 -10
  253. package/src/plugins/generative-ui/ui/skeleton.tsx +5 -5
  254. package/src/plugins/generative-ui/ui/stack.tsx +28 -28
  255. package/src/plugins/generative-ui/ui/switch.tsx +11 -11
  256. package/src/plugins/generative-ui/ui/table.tsx +32 -32
  257. package/src/plugins/generative-ui/ui/tabs-wrapper.tsx +11 -11
  258. package/src/plugins/generative-ui/ui/tabs.tsx +26 -26
  259. package/src/plugins/generative-ui/ui/text.tsx +12 -12
  260. package/src/plugins/generative-ui/ui/textarea.tsx +7 -7
  261. package/src/plugins/generative-ui/ui/tooltip.tsx +12 -12
  262. package/src/plugins/index.ts +7 -7
  263. package/src/react-shim.ts +6 -6
  264. package/src/server/bun.ts +12 -12
  265. package/src/server/core.ts +25 -25
  266. package/src/server/express.ts +17 -15
  267. package/src/server/fastify.ts +14 -14
  268. package/src/server/hono.ts +9 -9
  269. package/src/server/nextjs.ts +12 -12
  270. package/src/server/tanstack-start.ts +12 -12
  271. package/src/server.ts +27 -27
  272. package/src/storybook.d.ts +4 -4
  273. package/src/types/index.ts +124 -124
  274. package/src/types/plugins.ts +7 -7
  275. package/src/vite-env.d.ts +12 -12
  276. package/dist/compat-shims-BPJ7Q68c.js.map +0 -1
  277. package/dist/index-D0bAYNQy.js.map +0 -1
  278. package/dist/index-KSX4Qjip.cjs.map +0 -1
@@ -1,12 +1,12 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { cn } from '@/lib/utils'
4
- import { FC } from 'react'
5
- import { MacOSWindowFrame } from './MacOSWindowFrame'
3
+ import { cn } from "@/lib/utils";
4
+ import { FC } from "react";
5
+ import { MacOSWindowFrame } from "./MacOSWindowFrame";
6
6
 
7
7
  interface PluginLoadingStateProps {
8
- text: string
9
- className?: string
8
+ text: string;
9
+ className?: string;
10
10
  }
11
11
 
12
12
  /**
@@ -21,11 +21,11 @@ export const PluginLoadingState: FC<PluginLoadingStateProps> = ({
21
21
  <MacOSWindowFrame className={className}>
22
22
  <div
23
23
  className={cn(
24
- 'bg-background relative flex min-h-[400px] items-center justify-center'
24
+ "relative flex min-h-[400px] items-center justify-center bg-background",
25
25
  )}
26
26
  >
27
- <span className="shimmer text-muted-foreground text-sm">{text}</span>
27
+ <span className="shimmer text-sm text-muted-foreground">{text}</span>
28
28
  </div>
29
29
  </MacOSWindowFrame>
30
- )
31
- }
30
+ );
31
+ };
@@ -1 +1 @@
1
- export { PluginLoadingState } from './PluginLoadingState'
1
+ export { PluginLoadingState } from "./PluginLoadingState";
@@ -1,5 +1,5 @@
1
- import { createCatalog } from '@json-render/core'
2
- import { z } from 'zod'
1
+ import { createCatalog } from "@json-render/core";
2
+ import { z } from "zod";
3
3
 
4
4
  /**
5
5
  * Generative UI Catalog
@@ -8,31 +8,31 @@ import { z } from 'zod'
8
8
  * Components map to shadcn/ui primitives in the ui/ directory.
9
9
  */
10
10
  export const catalog = createCatalog({
11
- name: 'generative-ui',
11
+ name: "generative-ui",
12
12
  components: {
13
13
  // Layout
14
14
  Stack: {
15
15
  props: z.object({
16
- direction: z.enum(['horizontal', 'vertical']).optional(),
17
- gap: z.enum(['sm', 'md', 'lg']).optional(),
18
- align: z.enum(['start', 'center', 'end', 'stretch']).optional(),
16
+ direction: z.enum(["horizontal", "vertical"]).optional(),
17
+ gap: z.enum(["sm", "md", "lg"]).optional(),
18
+ align: z.enum(["start", "center", "end", "stretch"]).optional(),
19
19
  justify: z
20
- .enum(['start', 'center', 'end', 'between', 'around'])
20
+ .enum(["start", "center", "end", "between", "around"])
21
21
  .optional(),
22
22
  className: z.string().optional(),
23
23
  }),
24
24
  hasChildren: true,
25
- description: 'Flex layout container for arranging child elements',
25
+ description: "Flex layout container for arranging child elements",
26
26
  },
27
27
 
28
28
  Grid: {
29
29
  props: z.object({
30
30
  columns: z.number().optional(),
31
- gap: z.enum(['sm', 'md', 'lg']).optional(),
31
+ gap: z.enum(["sm", "md", "lg"]).optional(),
32
32
  className: z.string().optional(),
33
33
  }),
34
34
  hasChildren: true,
35
- description: 'Grid layout for arranging items in columns',
35
+ description: "Grid layout for arranging items in columns",
36
36
  },
37
37
 
38
38
  Card: {
@@ -41,17 +41,17 @@ export const catalog = createCatalog({
41
41
  className: z.string().optional(),
42
42
  }),
43
43
  hasChildren: true,
44
- description: 'Container with optional title, border and padding',
44
+ description: "Container with optional title, border and padding",
45
45
  },
46
46
 
47
47
  // Typography
48
48
  Text: {
49
49
  props: z.object({
50
50
  content: z.string(),
51
- variant: z.enum(['heading', 'body', 'caption', 'code']).optional(),
51
+ variant: z.enum(["heading", "body", "caption", "code"]).optional(),
52
52
  className: z.string().optional(),
53
53
  }),
54
- description: 'Text content with styling variants',
54
+ description: "Text content with styling variants",
55
55
  },
56
56
 
57
57
  // Data Display
@@ -59,11 +59,11 @@ export const catalog = createCatalog({
59
59
  props: z.object({
60
60
  label: z.string(),
61
61
  value: z.union([z.string(), z.number()]),
62
- format: z.enum(['number', 'currency', 'percent']).optional(),
62
+ format: z.enum(["number", "currency", "percent"]).optional(),
63
63
  className: z.string().optional(),
64
64
  }),
65
65
  description:
66
- 'Display a key metric with label and formatted value (e.g., revenue, users)',
66
+ "Display a key metric with label and formatted value (e.g., revenue, users)",
67
67
  },
68
68
 
69
69
  Badge: {
@@ -71,18 +71,18 @@ export const catalog = createCatalog({
71
71
  content: z.string().optional(),
72
72
  variant: z
73
73
  .enum([
74
- 'default',
75
- 'secondary',
76
- 'destructive',
77
- 'outline',
78
- 'success',
79
- 'warning',
74
+ "default",
75
+ "secondary",
76
+ "destructive",
77
+ "outline",
78
+ "success",
79
+ "warning",
80
80
  ])
81
81
  .optional(),
82
82
  className: z.string().optional(),
83
83
  }),
84
84
  hasChildren: true,
85
- description: 'Status badge or tag for categorization',
85
+ description: "Status badge or tag for categorization",
86
86
  },
87
87
 
88
88
  Progress: {
@@ -91,7 +91,7 @@ export const catalog = createCatalog({
91
91
  max: z.number().optional(),
92
92
  className: z.string().optional(),
93
93
  }),
94
- description: 'Progress bar showing completion percentage',
94
+ description: "Progress bar showing completion percentage",
95
95
  },
96
96
 
97
97
  Table: {
@@ -100,7 +100,7 @@ export const catalog = createCatalog({
100
100
  rows: z.array(z.array(z.union([z.string(), z.number()]))),
101
101
  className: z.string().optional(),
102
102
  }),
103
- description: 'Data table with headers and rows',
103
+ description: "Data table with headers and rows",
104
104
  },
105
105
 
106
106
  List: {
@@ -109,7 +109,7 @@ export const catalog = createCatalog({
109
109
  ordered: z.boolean().optional(),
110
110
  className: z.string().optional(),
111
111
  }),
112
- description: 'Ordered or unordered list of items',
112
+ description: "Ordered or unordered list of items",
113
113
  },
114
114
 
115
115
  // Feedback
@@ -117,36 +117,36 @@ export const catalog = createCatalog({
117
117
  props: z.object({
118
118
  title: z.string(),
119
119
  description: z.string().optional(),
120
- variant: z.enum(['default', 'destructive']).optional(),
120
+ variant: z.enum(["default", "destructive"]).optional(),
121
121
  }),
122
- description: 'Alert message for important information or errors',
122
+ description: "Alert message for important information or errors",
123
123
  },
124
124
 
125
125
  // Structure
126
126
  Separator: {
127
127
  props: z.object({
128
- orientation: z.enum(['horizontal', 'vertical']).optional(),
128
+ orientation: z.enum(["horizontal", "vertical"]).optional(),
129
129
  className: z.string().optional(),
130
130
  }),
131
- description: 'Visual divider between content sections',
131
+ description: "Visual divider between content sections",
132
132
  },
133
133
 
134
134
  Divider: {
135
135
  props: z.object({
136
- orientation: z.enum(['horizontal', 'vertical']).optional(),
136
+ orientation: z.enum(["horizontal", "vertical"]).optional(),
137
137
  className: z.string().optional(),
138
138
  }),
139
139
  description:
140
- 'Visual divider between content sections (alias for Separator)',
140
+ "Visual divider between content sections (alias for Separator)",
141
141
  },
142
142
 
143
143
  // Interactive
144
144
  Accordion: {
145
145
  props: z.object({
146
- type: z.enum(['single', 'multiple']).optional(),
146
+ type: z.enum(["single", "multiple"]).optional(),
147
147
  }),
148
148
  hasChildren: true,
149
- description: 'Collapsible accordion container',
149
+ description: "Collapsible accordion container",
150
150
  },
151
151
 
152
152
  AccordionItem: {
@@ -155,7 +155,7 @@ export const catalog = createCatalog({
155
155
  title: z.string(),
156
156
  }),
157
157
  hasChildren: true,
158
- description: 'Individual accordion item with trigger and content',
158
+ description: "Individual accordion item with trigger and content",
159
159
  },
160
160
 
161
161
  Tabs: {
@@ -165,11 +165,11 @@ export const catalog = createCatalog({
165
165
  z.object({
166
166
  value: z.string(),
167
167
  label: z.string(),
168
- })
168
+ }),
169
169
  ),
170
170
  }),
171
171
  hasChildren: true,
172
- description: 'Tabbed content container',
172
+ description: "Tabbed content container",
173
173
  },
174
174
 
175
175
  TabContent: {
@@ -177,7 +177,7 @@ export const catalog = createCatalog({
177
177
  value: z.string(),
178
178
  }),
179
179
  hasChildren: true,
180
- description: 'Content panel for a specific tab',
180
+ description: "Content panel for a specific tab",
181
181
  },
182
182
 
183
183
  // Actions
@@ -185,15 +185,15 @@ export const catalog = createCatalog({
185
185
  props: z.object({
186
186
  label: z.string(),
187
187
  variant: z
188
- .enum(['default', 'secondary', 'destructive', 'outline', 'ghost'])
188
+ .enum(["default", "secondary", "destructive", "outline", "ghost"])
189
189
  .optional(),
190
- size: z.enum(['default', 'sm', 'lg', 'icon']).optional(),
190
+ size: z.enum(["default", "sm", "lg", "icon"]).optional(),
191
191
  disabled: z.boolean().optional(),
192
192
  action: z.string().optional(),
193
193
  actionParams: z.record(z.string(), z.unknown()).optional(),
194
194
  }),
195
195
  description:
196
- 'Clickable button that can trigger actions. Use action/actionParams to call backend functions.',
196
+ "Clickable button that can trigger actions. Use action/actionParams to call backend functions.",
197
197
  },
198
198
 
199
199
  ActionButton: {
@@ -202,13 +202,13 @@ export const catalog = createCatalog({
202
202
  action: z.string(),
203
203
  args: z.record(z.string(), z.unknown()).optional(),
204
204
  variant: z
205
- .enum(['default', 'secondary', 'destructive', 'outline', 'ghost'])
205
+ .enum(["default", "secondary", "destructive", "outline", "ghost"])
206
206
  .optional(),
207
- size: z.enum(['default', 'sm', 'lg', 'icon']).optional(),
207
+ size: z.enum(["default", "sm", "lg", "icon"]).optional(),
208
208
  className: z.string().optional(),
209
209
  }),
210
210
  description:
211
- 'Button that triggers a frontend tool call directly without LLM roundtrip',
211
+ "Button that triggers a frontend tool call directly without LLM roundtrip",
212
212
  },
213
213
 
214
214
  // Form Elements
@@ -216,10 +216,10 @@ export const catalog = createCatalog({
216
216
  props: z.object({
217
217
  label: z.string().optional(),
218
218
  placeholder: z.string().optional(),
219
- type: z.enum(['text', 'email', 'password', 'number', 'tel']).optional(),
219
+ type: z.enum(["text", "email", "password", "number", "tel"]).optional(),
220
220
  valuePath: z.string(),
221
221
  }),
222
- description: 'Text input field with optional label',
222
+ description: "Text input field with optional label",
223
223
  },
224
224
 
225
225
  Checkbox: {
@@ -228,7 +228,7 @@ export const catalog = createCatalog({
228
228
  valuePath: z.string(),
229
229
  defaultChecked: z.boolean().optional(),
230
230
  }),
231
- description: 'Checkbox input with label',
231
+ description: "Checkbox input with label",
232
232
  },
233
233
 
234
234
  Select: {
@@ -239,10 +239,10 @@ export const catalog = createCatalog({
239
239
  z.object({
240
240
  value: z.string(),
241
241
  label: z.string(),
242
- })
242
+ }),
243
243
  ),
244
244
  }),
245
- description: 'Dropdown select input',
245
+ description: "Dropdown select input",
246
246
  },
247
247
 
248
248
  // Display
@@ -252,7 +252,7 @@ export const catalog = createCatalog({
252
252
  alt: z.string().optional(),
253
253
  fallback: z.string(),
254
254
  }),
255
- description: 'User avatar with image and fallback initials',
255
+ description: "User avatar with image and fallback initials",
256
256
  },
257
257
 
258
258
  Skeleton: {
@@ -261,17 +261,17 @@ export const catalog = createCatalog({
261
261
  height: z.string().optional(),
262
262
  className: z.string().optional(),
263
263
  }),
264
- description: 'Loading placeholder skeleton',
264
+ description: "Loading placeholder skeleton",
265
265
  },
266
266
  },
267
- })
267
+ });
268
268
 
269
269
  export type CatalogComponentProps = typeof catalog extends {
270
- components: infer C
270
+ components: infer C;
271
271
  }
272
272
  ? {
273
273
  [K in keyof C]: C[K] extends { props: infer P }
274
274
  ? z.infer<P extends z.ZodType ? P : never>
275
- : never
275
+ : never;
276
276
  }
277
- : never
277
+ : never;
@@ -1,139 +1,139 @@
1
- 'use client'
1
+ "use client";
2
2
 
3
- import { GenerativeUI } from '@/components/ui/generative-ui'
4
- import { cn } from '@/lib/utils'
5
- import { SyntaxHighlighterProps } from '@assistant-ui/react-markdown'
6
- import { FC, useEffect, useMemo, useState } from 'react'
7
- import { MacOSWindowFrame } from '../components/MacOSWindowFrame'
3
+ import { GenerativeUI } from "@/components/ui/generative-ui";
4
+ import { cn } from "@/lib/utils";
5
+ import { SyntaxHighlighterProps } from "@assistant-ui/react-markdown";
6
+ import { FC, useEffect, useMemo, useState } from "react";
7
+ import { MacOSWindowFrame } from "../components/MacOSWindowFrame";
8
8
 
9
9
  const loadingMessages = [
10
10
  // Crafting & Creating
11
- 'Arranging pixels with care...',
12
- 'Brewing something beautiful...',
13
- 'Crafting your masterpiece...',
14
- 'Painting with data...',
15
- 'Weaving digital magic...',
16
- 'Assembling the good stuff...',
17
- 'Polishing the details...',
18
- 'Putting the finishing touches...',
11
+ "Arranging pixels with care...",
12
+ "Brewing something beautiful...",
13
+ "Crafting your masterpiece...",
14
+ "Painting with data...",
15
+ "Weaving digital magic...",
16
+ "Assembling the good stuff...",
17
+ "Polishing the details...",
18
+ "Putting the finishing touches...",
19
19
  // Cooking & Food
20
- 'Simmering the results...',
21
- 'Letting the data marinate...',
22
- 'Adding a pinch of style...',
23
- 'Fresh out of the oven soon...',
24
- 'Whisking up your view...',
20
+ "Simmering the results...",
21
+ "Letting the data marinate...",
22
+ "Adding a pinch of style...",
23
+ "Fresh out of the oven soon...",
24
+ "Whisking up your view...",
25
25
  // Nature & Growth
26
- 'Growing your garden of data...',
27
- 'Watching the seeds sprout...',
28
- 'Letting things bloom...',
29
- 'Nature is taking its course...',
26
+ "Growing your garden of data...",
27
+ "Watching the seeds sprout...",
28
+ "Letting things bloom...",
29
+ "Nature is taking its course...",
30
30
  // Space & Magic
31
- 'Consulting the stars...',
32
- 'Channeling cosmic energy...',
33
- 'Summoning the results...',
34
- 'Waving the magic wand...',
35
- 'Sprinkling some stardust...',
36
- 'Aligning the planets...',
31
+ "Consulting the stars...",
32
+ "Channeling cosmic energy...",
33
+ "Summoning the results...",
34
+ "Waving the magic wand...",
35
+ "Sprinkling some stardust...",
36
+ "Aligning the planets...",
37
37
  // Building & Engineering
38
- 'Tightening the bolts...',
39
- 'Connecting the dots...',
40
- 'Stacking the blocks...',
41
- 'Laying the foundation...',
42
- 'Raising the scaffolding...',
38
+ "Tightening the bolts...",
39
+ "Connecting the dots...",
40
+ "Stacking the blocks...",
41
+ "Laying the foundation...",
42
+ "Raising the scaffolding...",
43
43
  // Playful & Cute
44
- 'Herding the pixels...',
45
- 'Teaching data to dance...',
46
- 'Convincing bits to cooperate...',
47
- 'Giving electrons a pep talk...',
48
- 'Wrangling the numbers...',
49
- 'Coaxing the results out...',
50
- 'Almost there, pinky promise...',
51
- 'Good things take a moment...',
52
- 'Worth the wait...',
53
- 'Patience, grasshopper...',
54
- 'Hold tight...',
55
- 'Doing the thing...',
44
+ "Herding the pixels...",
45
+ "Teaching data to dance...",
46
+ "Convincing bits to cooperate...",
47
+ "Giving electrons a pep talk...",
48
+ "Wrangling the numbers...",
49
+ "Coaxing the results out...",
50
+ "Almost there, pinky promise...",
51
+ "Good things take a moment...",
52
+ "Worth the wait...",
53
+ "Patience, grasshopper...",
54
+ "Hold tight...",
55
+ "Doing the thing...",
56
56
  // Abstract & Poetic
57
- 'Folding space and time...',
58
- 'Untangling the threads...',
59
- 'Finding the signal...',
60
- 'Distilling the essence...',
61
- 'Turning chaos into order...',
62
- 'Making sense of it all...',
57
+ "Folding space and time...",
58
+ "Untangling the threads...",
59
+ "Finding the signal...",
60
+ "Distilling the essence...",
61
+ "Turning chaos into order...",
62
+ "Making sense of it all...",
63
63
  // Confident & Reassuring
64
- 'This is going to be good...',
64
+ "This is going to be good...",
65
65
  "You're gonna love this...",
66
- 'Something nice is coming...',
67
- 'Just a heartbeat away...',
68
- ]
66
+ "Something nice is coming...",
67
+ "Just a heartbeat away...",
68
+ ];
69
69
 
70
70
  function getRandomStartIndex() {
71
- return Math.floor(Math.random() * loadingMessages.length)
71
+ return Math.floor(Math.random() * loadingMessages.length);
72
72
  }
73
73
 
74
74
  const CyclingLoadingMessage: FC = () => {
75
- const [index, setIndex] = useState(getRandomStartIndex)
76
- const [isVisible, setIsVisible] = useState(true)
75
+ const [index, setIndex] = useState(getRandomStartIndex);
76
+ const [isVisible, setIsVisible] = useState(true);
77
77
 
78
78
  useEffect(() => {
79
- let timeoutId: ReturnType<typeof setTimeout> | undefined
79
+ let timeoutId: ReturnType<typeof setTimeout> | undefined;
80
80
  const interval = setInterval(() => {
81
81
  // Fade out
82
- setIsVisible(false)
82
+ setIsVisible(false);
83
83
 
84
84
  // After fade out, change message and fade in
85
85
  timeoutId = setTimeout(() => {
86
- setIndex((prev) => (prev + 1) % loadingMessages.length)
87
- setIsVisible(true)
88
- }, 200)
89
- }, 2000)
86
+ setIndex((prev) => (prev + 1) % loadingMessages.length);
87
+ setIsVisible(true);
88
+ }, 200);
89
+ }, 2000);
90
90
 
91
91
  return () => {
92
- clearInterval(interval)
93
- if (timeoutId) clearTimeout(timeoutId)
94
- }
95
- }, [])
92
+ clearInterval(interval);
93
+ if (timeoutId) clearTimeout(timeoutId);
94
+ };
95
+ }, []);
96
96
 
97
97
  return (
98
98
  <span
99
99
  className={cn(
100
- 'shimmer text-muted-foreground text-sm transition-opacity duration-200',
101
- isVisible ? 'opacity-100' : 'opacity-0'
100
+ "shimmer text-sm text-muted-foreground transition-opacity duration-200",
101
+ isVisible ? "opacity-100" : "opacity-0",
102
102
  )}
103
103
  >
104
104
  {loadingMessages[index]}
105
105
  </span>
106
- )
107
- }
106
+ );
107
+ };
108
108
 
109
109
  export const GenerativeUIRenderer: FC<SyntaxHighlighterProps> = ({ code }) => {
110
110
  // Parse JSON - returns null if invalid (still streaming)
111
111
  const content = useMemo(() => {
112
- const trimmedCode = code.trim()
113
- if (!trimmedCode) return null
112
+ const trimmedCode = code.trim();
113
+ if (!trimmedCode) return null;
114
114
 
115
115
  try {
116
- const parsed = JSON.parse(trimmedCode)
116
+ const parsed = JSON.parse(trimmedCode);
117
117
  // Validate it has a type field (basic json-render structure)
118
- if (!parsed || typeof parsed !== 'object' || !('type' in parsed)) {
119
- return null
118
+ if (!parsed || typeof parsed !== "object" || !("type" in parsed)) {
119
+ return null;
120
120
  }
121
- return parsed
121
+ return parsed;
122
122
  } catch {
123
123
  // JSON is incomplete (still streaming) - return null to show loading state
124
- return null
124
+ return null;
125
125
  }
126
- }, [code])
126
+ }, [code]);
127
127
 
128
128
  // Show loading state while JSON is incomplete/streaming
129
129
  if (!content) {
130
130
  return (
131
131
  <MacOSWindowFrame>
132
- <div className="bg-background flex min-h-[400px] items-center justify-center">
132
+ <div className="flex min-h-[400px] items-center justify-center bg-background">
133
133
  <CyclingLoadingMessage />
134
134
  </div>
135
135
  </MacOSWindowFrame>
136
- )
136
+ );
137
137
  }
138
138
 
139
139
  // Render with macOS-style window frame
@@ -143,5 +143,5 @@ export const GenerativeUIRenderer: FC<SyntaxHighlighterProps> = ({ code }) => {
143
143
  <GenerativeUI content={content} />
144
144
  </div>
145
145
  </MacOSWindowFrame>
146
- )
147
- }
146
+ );
147
+ };
@@ -1,12 +1,12 @@
1
- import { Plugin } from '@/types/plugins'
2
- import { GenerativeUIRenderer } from './component'
1
+ import { Plugin } from "@/types/plugins";
2
+ import { GenerativeUIRenderer } from "./component";
3
3
 
4
4
  /**
5
5
  * This plugin renders json-render UI trees as dynamic widgets.
6
6
  * Use the language identifier 'ui' or 'json-render' in code blocks.
7
7
  */
8
8
  export const generativeUI: Plugin = {
9
- language: 'ui',
9
+ language: "ui",
10
10
  prompt: `Render structured data as visual UI using \`\`\`ui code blocks with valid JSON.
11
11
 
12
12
  Components:
@@ -29,4 +29,4 @@ Example: {"type":"Card","props":{"title":"Stats"},"children":[{"type":"Metric","
29
29
  Use for dashboards, tables, metrics from tool results. Skip for simple text or errors.`,
30
30
  Component: GenerativeUIRenderer,
31
31
  Header: undefined,
32
- }
32
+ };