@gram-ai/elements 1.27.3 → 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 (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 +4 -2
  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-BpJstUh1.cjs → index-C4bFBGfl.cjs} +4 -4
  28. package/dist/{index-BpJstUh1.cjs.map → index-C4bFBGfl.cjs.map} +1 -1
  29. package/dist/{index-CUitXazZ.js → index-D93pV0_o.js} +55 -55
  30. package/dist/{index-CUitXazZ.js.map → index-D93pV0_o.js.map} +1 -1
  31. package/dist/{index-DBrhzauj.js → index-DuCQRbcQ.js} +6386 -6337
  32. package/dist/index-DuCQRbcQ.js.map +1 -0
  33. package/dist/{index-DxfW52oA.cjs → index-y_PNN5vK.cjs} +64 -46
  34. package/dist/index-y_PNN5vK.cjs.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-D6ndqfsd.js → profiler-FpBY9eRv.js} +2 -2
  78. package/dist/{profiler-D6ndqfsd.js.map → profiler-FpBY9eRv.js.map} +1 -1
  79. package/dist/{profiler-DhnzZ34c.cjs → profiler-_mthyjvo.cjs} +2 -2
  80. package/dist/{profiler-DhnzZ34c.cjs.map → profiler-_mthyjvo.cjs.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-BwXmdmy1.cjs → startRecording-NJcpiHw-.cjs} +2 -2
  85. package/dist/{startRecording-BwXmdmy1.cjs.map → startRecording-NJcpiHw-.cjs.map} +1 -1
  86. package/dist/{startRecording-B_9CRZ_P.js → startRecording-r5MXQ2Dm.js} +2 -2
  87. package/dist/{startRecording-B_9CRZ_P.js.map → startRecording-r5MXQ2Dm.js.map} +1 -1
  88. package/dist/types/index.d.ts +2 -2
  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 +74 -61
  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 +272 -235
  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 +222 -211
  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 +87 -82
  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 +21 -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 +122 -122
  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-DBrhzauj.js.map +0 -1
  278. package/dist/index-DxfW52oA.cjs.map +0 -1
@@ -1,39 +1,39 @@
1
- import { Chat, ComponentOverrides } from '@/index'
2
- import { useAssistantState } from '@assistant-ui/react'
3
- import { Meta, StoryFn } from '@storybook/react-vite'
1
+ import { Chat, ComponentOverrides } from "@/index";
2
+ import { useAssistantState } from "@assistant-ui/react";
3
+ import { Meta, StoryFn } from "@storybook/react-vite";
4
4
 
5
5
  const meta: Meta<typeof Chat> = {
6
- title: 'Chat/Customization',
6
+ title: "Chat/Customization",
7
7
  component: Chat,
8
8
  parameters: {
9
- layout: 'fullscreen',
9
+ layout: "fullscreen",
10
10
  },
11
- } satisfies Meta<typeof Chat>
11
+ } satisfies Meta<typeof Chat>;
12
12
 
13
- export default meta
13
+ export default meta;
14
14
 
15
- type Story = StoryFn<typeof Chat>
15
+ type Story = StoryFn<typeof Chat>;
16
16
 
17
17
  const customComponents: ComponentOverrides = {
18
18
  Text: () => {
19
- const message = useAssistantState(({ message }) => message)
19
+ const message = useAssistantState(({ message }) => message);
20
20
  return (
21
21
  <div className="text-red-500">
22
22
  {message.parts
23
- .map((part) => (part.type === 'text' ? part.text : ''))
24
- .join('')}
23
+ .map((part) => (part.type === "text" ? part.text : ""))
24
+ .join("")}
25
25
  </div>
26
- )
26
+ );
27
27
  },
28
- }
28
+ };
29
29
 
30
- export const ComponentOverridesStory: Story = () => <Chat />
31
- ComponentOverridesStory.storyName = 'Component Overrides'
30
+ export const ComponentOverridesStory: Story = () => <Chat />;
31
+ ComponentOverridesStory.storyName = "Component Overrides";
32
32
  ComponentOverridesStory.parameters = {
33
33
  elements: {
34
34
  config: {
35
- variant: 'standalone',
35
+ variant: "standalone",
36
36
  components: customComponents,
37
37
  },
38
38
  },
39
- }
39
+ };
@@ -1,45 +1,45 @@
1
- import React from 'react'
2
- import { Chat } from '..'
3
- import type { Meta, StoryFn } from '@storybook/react-vite'
1
+ import React from "react";
2
+ import { Chat } from "..";
3
+ import type { Meta, StoryFn } from "@storybook/react-vite";
4
4
 
5
5
  const meta: Meta<typeof Chat> = {
6
- title: 'Chat/Density',
6
+ title: "Chat/Density",
7
7
  component: Chat,
8
8
  parameters: {
9
- layout: 'fullscreen',
9
+ layout: "fullscreen",
10
10
  },
11
- } satisfies Meta<typeof Chat>
11
+ } satisfies Meta<typeof Chat>;
12
12
 
13
- export default meta
13
+ export default meta;
14
14
 
15
- type Story = StoryFn<typeof Chat>
15
+ type Story = StoryFn<typeof Chat>;
16
16
 
17
- export const Compact: Story = () => <Chat />
17
+ export const Compact: Story = () => <Chat />;
18
18
  Compact.parameters = {
19
19
  elements: {
20
20
  config: {
21
- variant: 'standalone',
22
- theme: { density: 'compact' },
21
+ variant: "standalone",
22
+ theme: { density: "compact" },
23
23
  },
24
24
  },
25
- }
25
+ };
26
26
 
27
- export const Normal: Story = () => <Chat />
27
+ export const Normal: Story = () => <Chat />;
28
28
  Normal.parameters = {
29
29
  elements: {
30
30
  config: {
31
- variant: 'standalone',
32
- theme: { density: 'normal' },
31
+ variant: "standalone",
32
+ theme: { density: "normal" },
33
33
  },
34
34
  },
35
- }
35
+ };
36
36
 
37
- export const Spacious: Story = () => <Chat />
37
+ export const Spacious: Story = () => <Chat />;
38
38
  Spacious.parameters = {
39
39
  elements: {
40
40
  config: {
41
- variant: 'standalone',
42
- theme: { density: 'spacious' },
41
+ variant: "standalone",
42
+ theme: { density: "spacious" },
43
43
  },
44
44
  },
45
- }
45
+ };
@@ -1,4 +1,4 @@
1
- import type { Meta, StoryFn } from '@storybook/react-vite'
1
+ import type { Meta, StoryFn } from "@storybook/react-vite";
2
2
  import {
3
3
  createContext,
4
4
  useContext,
@@ -6,78 +6,78 @@ import {
6
6
  useState,
7
7
  type ComponentType,
8
8
  type FC,
9
- } from 'react'
10
- import { Chat } from '..'
11
- import { Button } from '../../ui/button'
9
+ } from "react";
10
+ import { Chat } from "..";
11
+ import { Button } from "../../ui/button";
12
12
 
13
13
  const meta: Meta<typeof Chat> = {
14
- title: 'Chat/ErrorBoundary',
14
+ title: "Chat/ErrorBoundary",
15
15
  component: Chat,
16
16
  parameters: {
17
- layout: 'fullscreen',
17
+ layout: "fullscreen",
18
18
  },
19
- } satisfies Meta<typeof Chat>
19
+ } satisfies Meta<typeof Chat>;
20
20
 
21
- export default meta
21
+ export default meta;
22
22
 
23
- type Story = StoryFn<typeof Chat>
23
+ type Story = StoryFn<typeof Chat>;
24
24
 
25
25
  // Context to trigger errors from outside the component tree
26
26
  const ErrorTriggerContext = createContext<{
27
- shouldThrow: boolean
28
- resetError: () => void
27
+ shouldThrow: boolean;
28
+ resetError: () => void;
29
29
  }>({
30
30
  shouldThrow: false,
31
31
  resetError: () => {},
32
- })
32
+ });
33
33
 
34
34
  // Component that throws when context says so - used to override ThreadWelcome
35
35
  const ThrowingThreadWelcome: FC = () => {
36
- const { shouldThrow, resetError } = useContext(ErrorTriggerContext)
36
+ const { shouldThrow, resetError } = useContext(ErrorTriggerContext);
37
37
 
38
38
  // Reset the error state when this component unmounts (happens when "Try again" is clicked)
39
39
  useEffect(() => {
40
40
  return () => {
41
- resetError()
42
- }
43
- }, [resetError])
41
+ resetError();
42
+ };
43
+ }, [resetError]);
44
44
 
45
45
  if (shouldThrow) {
46
- throw new Error('Simulated error: Failed to load chat interface')
46
+ throw new Error("Simulated error: Failed to load chat interface");
47
47
  }
48
48
 
49
49
  // Render a simple welcome that matches the default styling
50
50
  return (
51
51
  <div className="my-auto flex w-full grow flex-col items-center justify-center gap-4 p-6">
52
- <h2 className="text-foreground text-2xl font-semibold">Hello there!</h2>
52
+ <h2 className="text-2xl font-semibold text-foreground">Hello there!</h2>
53
53
  <p className="text-muted-foreground">How can I help you today?</p>
54
- <p className="text-muted-foreground/60 mt-4 text-sm">
54
+ <p className="mt-4 text-sm text-muted-foreground/60">
55
55
  Click &quot;Trigger Error&quot; above to see the error boundary
56
56
  </p>
57
57
  </div>
58
- )
59
- }
58
+ );
59
+ };
60
60
 
61
61
  // Wrapper to provide the error trigger context
62
62
  const ErrorTriggerProvider: FC<{
63
- children: React.ReactNode
64
- shouldThrow: boolean
65
- onReset: () => void
63
+ children: React.ReactNode;
64
+ shouldThrow: boolean;
65
+ onReset: () => void;
66
66
  }> = ({ children, shouldThrow, onReset }) => {
67
67
  return (
68
68
  <ErrorTriggerContext.Provider value={{ shouldThrow, resetError: onReset }}>
69
69
  {children}
70
70
  </ErrorTriggerContext.Provider>
71
- )
72
- }
71
+ );
72
+ };
73
73
 
74
74
  // Control bar component for triggering errors
75
75
  const ErrorControls: FC<{
76
- onTriggerError: () => void
77
- hasError: boolean
76
+ onTriggerError: () => void;
77
+ hasError: boolean;
78
78
  }> = ({ onTriggerError, hasError }) => (
79
- <div className="bg-muted/50 border-border flex items-center gap-3 border-b px-4 py-2">
80
- <span className="text-muted-foreground text-sm font-medium">
79
+ <div className="flex items-center gap-3 border-b border-border bg-muted/50 px-4 py-2">
80
+ <span className="text-sm font-medium text-muted-foreground">
81
81
  Error Boundary Demo:
82
82
  </span>
83
83
  <Button
@@ -89,11 +89,11 @@ const ErrorControls: FC<{
89
89
  Trigger Error
90
90
  </Button>
91
91
  </div>
92
- )
92
+ );
93
93
 
94
94
  // Modal variant story
95
95
  export const Modal: Story = () => {
96
- const [shouldThrow, setShouldThrow] = useState(false)
96
+ const [shouldThrow, setShouldThrow] = useState(false);
97
97
 
98
98
  return (
99
99
  <ErrorTriggerProvider
@@ -115,23 +115,23 @@ export const Modal: Story = () => {
115
115
  </div>
116
116
  </div>
117
117
  </ErrorTriggerProvider>
118
- )
119
- }
118
+ );
119
+ };
120
120
  Modal.parameters = {
121
121
  elements: {
122
122
  config: {
123
- variant: 'widget',
123
+ variant: "widget",
124
124
  modal: { defaultOpen: true },
125
125
  components: {
126
126
  ThreadWelcome: ThrowingThreadWelcome as ComponentType,
127
127
  },
128
128
  },
129
129
  },
130
- }
130
+ };
131
131
 
132
132
  // Standalone variant story
133
133
  export const Standalone: Story = () => {
134
- const [shouldThrow, setShouldThrow] = useState(false)
134
+ const [shouldThrow, setShouldThrow] = useState(false);
135
135
 
136
136
  return (
137
137
  <ErrorTriggerProvider
@@ -148,22 +148,22 @@ export const Standalone: Story = () => {
148
148
  </div>
149
149
  </div>
150
150
  </ErrorTriggerProvider>
151
- )
152
- }
151
+ );
152
+ };
153
153
  Standalone.parameters = {
154
154
  elements: {
155
155
  config: {
156
- variant: 'standalone',
156
+ variant: "standalone",
157
157
  components: {
158
158
  ThreadWelcome: ThrowingThreadWelcome as ComponentType,
159
159
  },
160
160
  },
161
161
  },
162
- }
162
+ };
163
163
 
164
164
  // Sidecar variant story
165
165
  export const Sidecar: Story = () => {
166
- const [shouldThrow, setShouldThrow] = useState(false)
166
+ const [shouldThrow, setShouldThrow] = useState(false);
167
167
 
168
168
  return (
169
169
  <ErrorTriggerProvider
@@ -185,18 +185,18 @@ export const Sidecar: Story = () => {
185
185
  </div>
186
186
  </div>
187
187
  </ErrorTriggerProvider>
188
- )
189
- }
188
+ );
189
+ };
190
190
  Sidecar.parameters = {
191
191
  elements: {
192
192
  config: {
193
- variant: 'sidecar',
193
+ variant: "sidecar",
194
194
  sidecar: {
195
- title: 'Error Boundary Demo',
195
+ title: "Error Boundary Demo",
196
196
  },
197
197
  components: {
198
198
  ThreadWelcome: ThrowingThreadWelcome as ComponentType,
199
199
  },
200
200
  },
201
201
  },
202
- }
202
+ };
@@ -1,54 +1,54 @@
1
- import { ToolCallMessagePartProps } from '@assistant-ui/react'
2
- import type { Meta, StoryFn } from '@storybook/react-vite'
3
- import React from 'react'
4
- import z from 'zod'
5
- import { Chat } from '..'
6
- import { defineFrontendTool } from '../../../lib/tools'
1
+ import { ToolCallMessagePartProps } from "@assistant-ui/react";
2
+ import type { Meta, StoryFn } from "@storybook/react-vite";
3
+ import React from "react";
4
+ import z from "zod";
5
+ import { Chat } from "..";
6
+ import { defineFrontendTool } from "../../../lib/tools";
7
7
 
8
8
  const meta: Meta<typeof Chat> = {
9
- title: 'Chat/Frontend Tools',
9
+ title: "Chat/Frontend Tools",
10
10
  component: Chat,
11
11
  parameters: {
12
- layout: 'fullscreen',
12
+ layout: "fullscreen",
13
13
  },
14
- } satisfies Meta<typeof Chat>
14
+ } satisfies Meta<typeof Chat>;
15
15
 
16
- export default meta
16
+ export default meta;
17
17
 
18
- type Story = StoryFn<typeof Chat>
18
+ type Story = StoryFn<typeof Chat>;
19
19
 
20
20
  const FetchTool = defineFrontendTool<{ url: string }, string>(
21
21
  {
22
- description: 'Fetch a URL (supports CORS-enabled URLs like httpbin.org)',
22
+ description: "Fetch a URL (supports CORS-enabled URLs like httpbin.org)",
23
23
  parameters: z.object({
24
- url: z.string().describe('URL to fetch (must support CORS)'),
24
+ url: z.string().describe("URL to fetch (must support CORS)"),
25
25
  }),
26
26
  execute: async ({ url }) => {
27
27
  try {
28
- const response = await fetch(url as string)
29
- const text = await response.text()
30
- return text
28
+ const response = await fetch(url as string);
29
+ const text = await response.text();
30
+ return text;
31
31
  } catch (error) {
32
- return `Error fetching ${url}: ${error instanceof Error ? error.message : 'Unknown error'}. Note: URL must support CORS for browser requests.`
32
+ return `Error fetching ${url}: ${error instanceof Error ? error.message : "Unknown error"}. Note: URL must support CORS for browser requests.`;
33
33
  }
34
34
  },
35
35
  },
36
- 'fetchUrl'
37
- )
36
+ "fetchUrl",
37
+ );
38
38
 
39
39
  const frontendTools = {
40
40
  fetchUrl: FetchTool,
41
- }
41
+ };
42
42
 
43
43
  // Render OS X style browser window with the fetched URL html rendered
44
44
  const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
45
- const url = (args as { url?: string })?.url || 'about:blank'
46
- const [isLoading, setIsLoading] = React.useState(true)
45
+ const url = (args as { url?: string })?.url || "about:blank";
46
+ const [isLoading, setIsLoading] = React.useState(true);
47
47
 
48
48
  return (
49
49
  <div className="my-5 flex w-full flex-col overflow-hidden rounded-lg border shadow-lg">
50
50
  {/* macOS Window Controls Bar */}
51
- <div className="bg-muted flex flex-col border-b">
51
+ <div className="flex flex-col border-b bg-muted">
52
52
  <div className="flex items-center gap-2 px-3 py-2">
53
53
  {/* Traffic lights */}
54
54
  <div className="flex gap-2">
@@ -58,9 +58,9 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
58
58
  </div>
59
59
 
60
60
  {/* Address bar */}
61
- <div className="bg-background mx-4 flex flex-1 items-center rounded-md px-3 py-1">
61
+ <div className="mx-4 flex flex-1 items-center rounded-md bg-background px-3 py-1">
62
62
  <svg
63
- className="text-muted-foreground mr-2 h-4 w-4"
63
+ className="mr-2 h-4 w-4 text-muted-foreground"
64
64
  fill="none"
65
65
  viewBox="0 0 24 24"
66
66
  stroke="currentColor"
@@ -72,7 +72,7 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
72
72
  d="M12 15v2m-6 4h12a2 2 0 002-2v-6a2 2 0 00-2-2H6a2 2 0 00-2 2v6a2 2 0 002 2zm10-10V7a4 4 0 00-8 0v4h8z"
73
73
  />
74
74
  </svg>
75
- <span className="text-muted-foreground truncate text-sm">
75
+ <span className="truncate text-sm text-muted-foreground">
76
76
  {url}
77
77
  </span>
78
78
  </div>
@@ -84,7 +84,7 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
84
84
  <div
85
85
  className="h-full w-1/3 animate-pulse bg-blue-500"
86
86
  style={{
87
- animation: 'slide 1.5s ease-in-out infinite',
87
+ animation: "slide 1.5s ease-in-out infinite",
88
88
  }}
89
89
  />
90
90
  </div>
@@ -92,7 +92,7 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
92
92
  </div>
93
93
 
94
94
  {/* Content */}
95
- <div className="bg-background h-96">
95
+ <div className="h-96 bg-background">
96
96
  <iframe
97
97
  srcDoc={result as string}
98
98
  className="h-full w-full"
@@ -107,23 +107,23 @@ const FetchToolComponent = ({ result, args }: ToolCallMessagePartProps) => {
107
107
  }
108
108
  `}</style>
109
109
  </div>
110
- )
111
- }
110
+ );
111
+ };
112
112
 
113
- export const FetchUrl: Story = () => <Chat />
114
- FetchUrl.storyName = 'Fetch URL Tool'
113
+ export const FetchUrl: Story = () => <Chat />;
114
+ FetchUrl.storyName = "Fetch URL Tool";
115
115
  FetchUrl.parameters = {
116
116
  elements: {
117
117
  config: {
118
- variant: 'standalone',
118
+ variant: "standalone",
119
119
  welcome: {
120
- title: '',
121
- subtitle: '',
120
+ title: "",
121
+ subtitle: "",
122
122
  suggestions: [
123
123
  {
124
- title: 'Fetch a URL',
125
- label: 'Fetch a URL',
126
- prompt: 'Fetch https://httpbin.org/html',
124
+ title: "Fetch a URL",
125
+ label: "Fetch a URL",
126
+ prompt: "Fetch https://httpbin.org/html",
127
127
  },
128
128
  ],
129
129
  },
@@ -135,4 +135,4 @@ FetchUrl.parameters = {
135
135
  },
136
136
  },
137
137
  },
138
- }
138
+ };
@@ -1,113 +1,113 @@
1
- import type { Meta, StoryFn } from '@storybook/react-vite'
2
- import { Chat } from '..'
1
+ import type { Meta, StoryFn } from "@storybook/react-vite";
2
+ import { Chat } from "..";
3
3
 
4
4
  const meta: Meta<typeof Chat> = {
5
- title: 'Chat/Plugins/Generative UI',
5
+ title: "Chat/Plugins/Generative UI",
6
6
  component: Chat,
7
7
  parameters: {
8
- layout: 'fullscreen',
8
+ layout: "fullscreen",
9
9
  },
10
- } satisfies Meta<typeof Chat>
10
+ } satisfies Meta<typeof Chat>;
11
11
 
12
- export default meta
12
+ export default meta;
13
13
 
14
- type Story = StoryFn<typeof Chat>
14
+ type Story = StoryFn<typeof Chat>;
15
15
 
16
16
  /**
17
17
  * E-commerce store assistant with natural task-focused prompts.
18
18
  */
19
- export const StoreAssistant: Story = () => <Chat />
19
+ export const StoreAssistant: Story = () => <Chat />;
20
20
  StoreAssistant.parameters = {
21
21
  elements: {
22
22
  config: {
23
- variant: 'standalone',
23
+ variant: "standalone",
24
24
  welcome: {
25
- title: 'Store Assistant',
26
- subtitle: 'How can I help you today?',
25
+ title: "Store Assistant",
26
+ subtitle: "How can I help you today?",
27
27
  suggestions: [
28
28
  {
29
- title: 'My Orders',
30
- label: 'View recent orders',
31
- prompt: 'Show me my current orders',
29
+ title: "My Orders",
30
+ label: "View recent orders",
31
+ prompt: "Show me my current orders",
32
32
  },
33
33
  {
34
- title: 'Browse Products',
34
+ title: "Browse Products",
35
35
  label: "See what's available",
36
- prompt: 'What products do you have?',
36
+ prompt: "What products do you have?",
37
37
  },
38
38
  {
39
- title: 'Find Deals',
40
- label: 'Best prices',
41
- prompt: 'What are the best deals right now?',
39
+ title: "Find Deals",
40
+ label: "Best prices",
41
+ prompt: "What are the best deals right now?",
42
42
  },
43
43
  ],
44
44
  },
45
45
  },
46
46
  },
47
- }
47
+ };
48
48
 
49
49
  /**
50
50
  * Shopping assistant for product discovery.
51
51
  */
52
- export const ShoppingAssistant: Story = () => <Chat />
52
+ export const ShoppingAssistant: Story = () => <Chat />;
53
53
  ShoppingAssistant.parameters = {
54
54
  elements: {
55
55
  config: {
56
- variant: 'standalone',
56
+ variant: "standalone",
57
57
  welcome: {
58
- title: 'Shopping Assistant',
59
- subtitle: 'Find the perfect product',
58
+ title: "Shopping Assistant",
59
+ subtitle: "Find the perfect product",
60
60
  suggestions: [
61
61
  {
62
- title: 'New Arrivals',
63
- label: 'Latest products',
64
- prompt: 'Show me the newest products',
62
+ title: "New Arrivals",
63
+ label: "Latest products",
64
+ prompt: "Show me the newest products",
65
65
  },
66
66
  {
67
- title: 'Gift Ideas',
68
- label: 'Under $50',
69
- prompt: 'I need a gift under $50, what do you recommend?',
67
+ title: "Gift Ideas",
68
+ label: "Under $50",
69
+ prompt: "I need a gift under $50, what do you recommend?",
70
70
  },
71
71
  {
72
- title: 'Compare Options',
73
- label: 'Help me decide',
74
- prompt: 'Can you compare your top 3 products for me?',
72
+ title: "Compare Options",
73
+ label: "Help me decide",
74
+ prompt: "Can you compare your top 3 products for me?",
75
75
  },
76
76
  ],
77
77
  },
78
78
  },
79
79
  },
80
- }
80
+ };
81
81
 
82
82
  /**
83
83
  * Store management assistant.
84
84
  */
85
- export const StoreManager: Story = () => <Chat />
85
+ export const StoreManager: Story = () => <Chat />;
86
86
  StoreManager.parameters = {
87
87
  elements: {
88
88
  config: {
89
- variant: 'standalone',
89
+ variant: "standalone",
90
90
  welcome: {
91
- title: 'Store Manager',
92
- subtitle: 'Manage your store',
91
+ title: "Store Manager",
92
+ subtitle: "Manage your store",
93
93
  suggestions: [
94
94
  {
95
- title: 'Stock Check',
96
- label: 'Inventory status',
97
- prompt: 'Which products are running low on stock?',
95
+ title: "Stock Check",
96
+ label: "Inventory status",
97
+ prompt: "Which products are running low on stock?",
98
98
  },
99
99
  {
100
- title: 'Sales Summary',
101
- label: 'How are we doing?',
102
- prompt: 'How are sales looking this month?',
100
+ title: "Sales Summary",
101
+ label: "How are we doing?",
102
+ prompt: "How are sales looking this month?",
103
103
  },
104
104
  {
105
- title: 'Top Sellers',
106
- label: 'Best performers',
107
- prompt: 'What are our best selling products?',
105
+ title: "Top Sellers",
106
+ label: "Best performers",
107
+ prompt: "What are our best selling products?",
108
108
  },
109
109
  ],
110
110
  },
111
111
  },
112
112
  },
113
- }
113
+ };