@mitodl/smoot-design 0.0.0-1967631

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 (261) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +35 -0
  3. package/dist/bundles/remoteTutorDrawer.es.js +38609 -0
  4. package/dist/bundles/remoteTutorDrawer.es.js.map +1 -0
  5. package/dist/bundles/remoteTutorDrawer.umd.js +241 -0
  6. package/dist/bundles/remoteTutorDrawer.umd.js.map +1 -0
  7. package/dist/cjs/VERSION.d.ts +6 -0
  8. package/dist/cjs/VERSION.js +9 -0
  9. package/dist/cjs/ai.d.ts +3 -0
  10. package/dist/cjs/ai.js +9 -0
  11. package/dist/cjs/bundles/RemoteTutorDrawer/FlashcardsScreen.d.ts +9 -0
  12. package/dist/cjs/bundles/RemoteTutorDrawer/FlashcardsScreen.js +87 -0
  13. package/dist/cjs/bundles/RemoteTutorDrawer/RemoteTutorDrawer.d.ts +56 -0
  14. package/dist/cjs/bundles/RemoteTutorDrawer/RemoteTutorDrawer.js +283 -0
  15. package/dist/cjs/bundles/RemoteTutorDrawer/RemoteTutorDrawer.stories.d.ts +17 -0
  16. package/dist/cjs/bundles/RemoteTutorDrawer/RemoteTutorDrawer.stories.js +302 -0
  17. package/dist/cjs/bundles/RemoteTutorDrawer/RemoteTutorDrawer.test.d.ts +1 -0
  18. package/dist/cjs/bundles/RemoteTutorDrawer/RemoteTutorDrawer.test.js +247 -0
  19. package/dist/cjs/bundles/remoteTutorDrawer.d.ts +7 -0
  20. package/dist/cjs/bundles/remoteTutorDrawer.js +43 -0
  21. package/dist/cjs/components/AiChat/AiChat.d.ts +5 -0
  22. package/dist/cjs/components/AiChat/AiChat.js +233 -0
  23. package/dist/cjs/components/AiChat/AiChat.stories.d.ts +21 -0
  24. package/dist/cjs/components/AiChat/AiChat.stories.js +257 -0
  25. package/dist/cjs/components/AiChat/AiChat.test.d.ts +1 -0
  26. package/dist/cjs/components/AiChat/AiChat.test.js +211 -0
  27. package/dist/cjs/components/AiChat/AiChatContext.d.ts +26 -0
  28. package/dist/cjs/components/AiChat/AiChatContext.js +105 -0
  29. package/dist/cjs/components/AiChat/AiChatContext.stories.d.ts +14 -0
  30. package/dist/cjs/components/AiChat/AiChatContext.stories.js +75 -0
  31. package/dist/cjs/components/AiChat/ChatTitle.d.ts +8 -0
  32. package/dist/cjs/components/AiChat/ChatTitle.js +43 -0
  33. package/dist/cjs/components/AiChat/EntryScreen.d.ts +11 -0
  34. package/dist/cjs/components/AiChat/EntryScreen.js +123 -0
  35. package/dist/cjs/components/AiChat/Markdown.d.ts +7 -0
  36. package/dist/cjs/components/AiChat/Markdown.js +14 -0
  37. package/dist/cjs/components/AiChat/TimLogo.d.ts +5 -0
  38. package/dist/cjs/components/AiChat/TimLogo.js +15 -0
  39. package/dist/cjs/components/AiChat/test-utils/api.d.ts +2 -0
  40. package/dist/cjs/components/AiChat/test-utils/api.js +164 -0
  41. package/dist/cjs/components/AiChat/types.d.ts +91 -0
  42. package/dist/cjs/components/AiChat/types.js +3 -0
  43. package/dist/cjs/components/AiChat/utils.d.ts +9 -0
  44. package/dist/cjs/components/AiChat/utils.js +41 -0
  45. package/dist/cjs/components/Alert/Alert.d.ts +15 -0
  46. package/dist/cjs/components/Alert/Alert.js +62 -0
  47. package/dist/cjs/components/Alert/Alert.stories.d.ts +8 -0
  48. package/dist/cjs/components/Alert/Alert.stories.js +53 -0
  49. package/dist/cjs/components/Button/ActionButton.d.ts +30 -0
  50. package/dist/cjs/components/Button/ActionButton.js +73 -0
  51. package/dist/cjs/components/Button/ActionButton.stories.d.ts +15 -0
  52. package/dist/cjs/components/Button/ActionButton.stories.js +113 -0
  53. package/dist/cjs/components/Button/Button.d.ts +54 -0
  54. package/dist/cjs/components/Button/Button.js +240 -0
  55. package/dist/cjs/components/Button/Button.stories.d.ts +17 -0
  56. package/dist/cjs/components/Button/Button.stories.js +135 -0
  57. package/dist/cjs/components/Button/Button.test.d.ts +1 -0
  58. package/dist/cjs/components/Button/Button.test.js +46 -0
  59. package/dist/cjs/components/ImageAdapter/ImageAdapter.d.ts +23 -0
  60. package/dist/cjs/components/ImageAdapter/ImageAdapter.js +30 -0
  61. package/dist/cjs/components/Input/Input.d.ts +116 -0
  62. package/dist/cjs/components/Input/Input.js +237 -0
  63. package/dist/cjs/components/Input/Input.stories.d.ts +19 -0
  64. package/dist/cjs/components/Input/Input.stories.js +135 -0
  65. package/dist/cjs/components/Input/Input.test.d.ts +1 -0
  66. package/dist/cjs/components/Input/Input.test.js +32 -0
  67. package/dist/cjs/components/LinkAdapter/LinkAdapter.d.ts +23 -0
  68. package/dist/cjs/components/LinkAdapter/LinkAdapter.js +34 -0
  69. package/dist/cjs/components/ScrollSnap/ScrollSnap.d.ts +19 -0
  70. package/dist/cjs/components/ScrollSnap/ScrollSnap.js +59 -0
  71. package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
  72. package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.js +43 -0
  73. package/dist/cjs/components/ScrollSnap/useScrollSnap.d.ts +6 -0
  74. package/dist/cjs/components/ScrollSnap/useScrollSnap.js +36 -0
  75. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
  76. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.js +43 -0
  77. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
  78. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.js +44 -0
  79. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
  80. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.js +62 -0
  81. package/dist/cjs/components/TabButtons/TabButtonList.d.ts +25 -0
  82. package/dist/cjs/components/TabButtons/TabButtonList.js +97 -0
  83. package/dist/cjs/components/TabButtons/TabButtonList.stories.d.ts +24 -0
  84. package/dist/cjs/components/TabButtons/TabButtonList.stories.js +139 -0
  85. package/dist/cjs/components/TextField/TextField.d.ts +29 -0
  86. package/dist/cjs/components/TextField/TextField.js +33 -0
  87. package/dist/cjs/components/TextField/TextField.stories.d.ts +10 -0
  88. package/dist/cjs/components/TextField/TextField.stories.js +136 -0
  89. package/dist/cjs/components/TextField/TextField.test.d.ts +1 -0
  90. package/dist/cjs/components/TextField/TextField.test.js +77 -0
  91. package/dist/cjs/components/ThemeProvider/ThemeProvider.d.ts +21 -0
  92. package/dist/cjs/components/ThemeProvider/ThemeProvider.js +86 -0
  93. package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.d.ts +63 -0
  94. package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.js +102 -0
  95. package/dist/cjs/components/ThemeProvider/Typography.stories.d.ts +39 -0
  96. package/dist/cjs/components/ThemeProvider/Typography.stories.js +65 -0
  97. package/dist/cjs/components/ThemeProvider/breakpoints.d.ts +4 -0
  98. package/dist/cjs/components/ThemeProvider/breakpoints.js +19 -0
  99. package/dist/cjs/components/ThemeProvider/buttons.d.ts +7 -0
  100. package/dist/cjs/components/ThemeProvider/buttons.js +20 -0
  101. package/dist/cjs/components/ThemeProvider/chips.d.ts +3 -0
  102. package/dist/cjs/components/ThemeProvider/chips.js +154 -0
  103. package/dist/cjs/components/ThemeProvider/colors.d.ts +32 -0
  104. package/dist/cjs/components/ThemeProvider/colors.js +35 -0
  105. package/dist/cjs/components/ThemeProvider/typography.d.ts +18 -0
  106. package/dist/cjs/components/ThemeProvider/typography.js +173 -0
  107. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
  108. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.js +33 -0
  109. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
  110. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.js +13 -0
  111. package/dist/cjs/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
  112. package/dist/cjs/components/internal/FormHelpers/FormHelpers.js +78 -0
  113. package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
  114. package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.js +93 -0
  115. package/dist/cjs/index.d.ts +16 -0
  116. package/dist/cjs/index.js +30 -0
  117. package/dist/cjs/jest-setup.d.ts +1 -0
  118. package/dist/cjs/jest-setup.js +18 -0
  119. package/dist/cjs/jsdom-extended.d.ts +6 -0
  120. package/dist/cjs/jsdom-extended.js +14 -0
  121. package/dist/cjs/story-utils/index.d.ts +6 -0
  122. package/dist/cjs/story-utils/index.js +17 -0
  123. package/dist/cjs/utils/composeRefs.d.ts +7 -0
  124. package/dist/cjs/utils/composeRefs.js +20 -0
  125. package/dist/cjs/utils/composeRefs.test.d.ts +1 -0
  126. package/dist/cjs/utils/composeRefs.test.js +19 -0
  127. package/dist/cjs/utils/useDevCheckStable.d.ts +8 -0
  128. package/dist/cjs/utils/useDevCheckStable.js +29 -0
  129. package/dist/cjs/utils/useInterval.d.ts +7 -0
  130. package/dist/cjs/utils/useInterval.js +25 -0
  131. package/dist/esm/VERSION.d.ts +6 -0
  132. package/dist/esm/VERSION.js +6 -0
  133. package/dist/esm/ai.d.ts +3 -0
  134. package/dist/esm/ai.js +2 -0
  135. package/dist/esm/bundles/RemoteTutorDrawer/FlashcardsScreen.d.ts +9 -0
  136. package/dist/esm/bundles/RemoteTutorDrawer/FlashcardsScreen.js +83 -0
  137. package/dist/esm/bundles/RemoteTutorDrawer/RemoteTutorDrawer.d.ts +56 -0
  138. package/dist/esm/bundles/RemoteTutorDrawer/RemoteTutorDrawer.js +280 -0
  139. package/dist/esm/bundles/RemoteTutorDrawer/RemoteTutorDrawer.stories.d.ts +17 -0
  140. package/dist/esm/bundles/RemoteTutorDrawer/RemoteTutorDrawer.stories.js +299 -0
  141. package/dist/esm/bundles/RemoteTutorDrawer/RemoteTutorDrawer.test.d.ts +1 -0
  142. package/dist/esm/bundles/RemoteTutorDrawer/RemoteTutorDrawer.test.js +245 -0
  143. package/dist/esm/bundles/remoteTutorDrawer.d.ts +7 -0
  144. package/dist/esm/bundles/remoteTutorDrawer.js +40 -0
  145. package/dist/esm/components/AiChat/AiChat.d.ts +5 -0
  146. package/dist/esm/components/AiChat/AiChat.js +229 -0
  147. package/dist/esm/components/AiChat/AiChat.stories.d.ts +21 -0
  148. package/dist/esm/components/AiChat/AiChat.stories.js +254 -0
  149. package/dist/esm/components/AiChat/AiChat.test.d.ts +1 -0
  150. package/dist/esm/components/AiChat/AiChat.test.js +209 -0
  151. package/dist/esm/components/AiChat/AiChatContext.d.ts +26 -0
  152. package/dist/esm/components/AiChat/AiChatContext.js +101 -0
  153. package/dist/esm/components/AiChat/AiChatContext.stories.d.ts +14 -0
  154. package/dist/esm/components/AiChat/AiChatContext.stories.js +72 -0
  155. package/dist/esm/components/AiChat/ChatTitle.d.ts +8 -0
  156. package/dist/esm/components/AiChat/ChatTitle.js +40 -0
  157. package/dist/esm/components/AiChat/EntryScreen.d.ts +11 -0
  158. package/dist/esm/components/AiChat/EntryScreen.js +120 -0
  159. package/dist/esm/components/AiChat/Markdown.d.ts +7 -0
  160. package/dist/esm/components/AiChat/Markdown.js +12 -0
  161. package/dist/esm/components/AiChat/TimLogo.d.ts +5 -0
  162. package/dist/esm/components/AiChat/TimLogo.js +13 -0
  163. package/dist/esm/components/AiChat/test-utils/api.d.ts +2 -0
  164. package/dist/esm/components/AiChat/test-utils/api.js +161 -0
  165. package/dist/esm/components/AiChat/types.d.ts +91 -0
  166. package/dist/esm/components/AiChat/types.js +2 -0
  167. package/dist/esm/components/AiChat/utils.d.ts +9 -0
  168. package/dist/esm/components/AiChat/utils.js +38 -0
  169. package/dist/esm/components/Alert/Alert.d.ts +15 -0
  170. package/dist/esm/components/Alert/Alert.js +59 -0
  171. package/dist/esm/components/Alert/Alert.stories.d.ts +8 -0
  172. package/dist/esm/components/Alert/Alert.stories.js +50 -0
  173. package/dist/esm/components/Button/ActionButton.d.ts +30 -0
  174. package/dist/esm/components/Button/ActionButton.js +68 -0
  175. package/dist/esm/components/Button/ActionButton.stories.d.ts +15 -0
  176. package/dist/esm/components/Button/ActionButton.stories.js +110 -0
  177. package/dist/esm/components/Button/Button.d.ts +54 -0
  178. package/dist/esm/components/Button/Button.js +232 -0
  179. package/dist/esm/components/Button/Button.stories.d.ts +17 -0
  180. package/dist/esm/components/Button/Button.stories.js +132 -0
  181. package/dist/esm/components/Button/Button.test.d.ts +1 -0
  182. package/dist/esm/components/Button/Button.test.js +44 -0
  183. package/dist/esm/components/ImageAdapter/ImageAdapter.d.ts +23 -0
  184. package/dist/esm/components/ImageAdapter/ImageAdapter.js +27 -0
  185. package/dist/esm/components/Input/Input.d.ts +116 -0
  186. package/dist/esm/components/Input/Input.js +232 -0
  187. package/dist/esm/components/Input/Input.stories.d.ts +19 -0
  188. package/dist/esm/components/Input/Input.stories.js +132 -0
  189. package/dist/esm/components/Input/Input.test.d.ts +1 -0
  190. package/dist/esm/components/Input/Input.test.js +30 -0
  191. package/dist/esm/components/LinkAdapter/LinkAdapter.d.ts +23 -0
  192. package/dist/esm/components/LinkAdapter/LinkAdapter.js +31 -0
  193. package/dist/esm/components/ScrollSnap/ScrollSnap.d.ts +19 -0
  194. package/dist/esm/components/ScrollSnap/ScrollSnap.js +56 -0
  195. package/dist/esm/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
  196. package/dist/esm/components/ScrollSnap/ScrollSnap.stories.js +40 -0
  197. package/dist/esm/components/ScrollSnap/useScrollSnap.d.ts +6 -0
  198. package/dist/esm/components/ScrollSnap/useScrollSnap.js +33 -0
  199. package/dist/esm/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
  200. package/dist/esm/components/SrAnnouncer/SrAnnouncer.js +40 -0
  201. package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
  202. package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.js +41 -0
  203. package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
  204. package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.js +60 -0
  205. package/dist/esm/components/TabButtons/TabButtonList.d.ts +25 -0
  206. package/dist/esm/components/TabButtons/TabButtonList.js +92 -0
  207. package/dist/esm/components/TabButtons/TabButtonList.stories.d.ts +24 -0
  208. package/dist/esm/components/TabButtons/TabButtonList.stories.js +136 -0
  209. package/dist/esm/components/TextField/TextField.d.ts +29 -0
  210. package/dist/esm/components/TextField/TextField.js +30 -0
  211. package/dist/esm/components/TextField/TextField.stories.d.ts +10 -0
  212. package/dist/esm/components/TextField/TextField.stories.js +133 -0
  213. package/dist/esm/components/TextField/TextField.test.d.ts +1 -0
  214. package/dist/esm/components/TextField/TextField.test.js +75 -0
  215. package/dist/esm/components/ThemeProvider/ThemeProvider.d.ts +21 -0
  216. package/dist/esm/components/ThemeProvider/ThemeProvider.js +82 -0
  217. package/dist/esm/components/ThemeProvider/ThemeProvider.stories.d.ts +63 -0
  218. package/dist/esm/components/ThemeProvider/ThemeProvider.stories.js +99 -0
  219. package/dist/esm/components/ThemeProvider/Typography.stories.d.ts +39 -0
  220. package/dist/esm/components/ThemeProvider/Typography.stories.js +62 -0
  221. package/dist/esm/components/ThemeProvider/breakpoints.d.ts +4 -0
  222. package/dist/esm/components/ThemeProvider/breakpoints.js +15 -0
  223. package/dist/esm/components/ThemeProvider/buttons.d.ts +7 -0
  224. package/dist/esm/components/ThemeProvider/buttons.js +17 -0
  225. package/dist/esm/components/ThemeProvider/chips.d.ts +3 -0
  226. package/dist/esm/components/ThemeProvider/chips.js +151 -0
  227. package/dist/esm/components/ThemeProvider/colors.d.ts +32 -0
  228. package/dist/esm/components/ThemeProvider/colors.js +32 -0
  229. package/dist/esm/components/ThemeProvider/typography.d.ts +18 -0
  230. package/dist/esm/components/ThemeProvider/typography.js +167 -0
  231. package/dist/esm/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
  232. package/dist/esm/components/VisuallyHidden/VisuallyHidden.js +30 -0
  233. package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
  234. package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.js +10 -0
  235. package/dist/esm/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
  236. package/dist/esm/components/internal/FormHelpers/FormHelpers.js +73 -0
  237. package/dist/esm/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
  238. package/dist/esm/components/internal/FormHelpers/FormHelpers.test.js +91 -0
  239. package/dist/esm/index.d.ts +16 -0
  240. package/dist/esm/index.js +11 -0
  241. package/dist/esm/jest-setup.d.ts +1 -0
  242. package/dist/esm/jest-setup.js +16 -0
  243. package/dist/esm/jsdom-extended.d.ts +6 -0
  244. package/dist/esm/jsdom-extended.js +12 -0
  245. package/dist/esm/story-utils/index.d.ts +6 -0
  246. package/dist/esm/story-utils/index.js +13 -0
  247. package/dist/esm/utils/composeRefs.d.ts +7 -0
  248. package/dist/esm/utils/composeRefs.js +17 -0
  249. package/dist/esm/utils/composeRefs.test.d.ts +1 -0
  250. package/dist/esm/utils/composeRefs.test.js +17 -0
  251. package/dist/esm/utils/useDevCheckStable.d.ts +8 -0
  252. package/dist/esm/utils/useDevCheckStable.js +26 -0
  253. package/dist/esm/utils/useInterval.d.ts +7 -0
  254. package/dist/esm/utils/useInterval.js +22 -0
  255. package/dist/tsconfig.tsbuildinfo +1 -0
  256. package/dist/type-augmentation/TypescriptDocs.mdx +17 -0
  257. package/dist/type-augmentation/imports.d.ts +3 -0
  258. package/dist/type-augmentation/index.d.ts +3 -0
  259. package/dist/type-augmentation/theme.d.ts +105 -0
  260. package/dist/type-augmentation/typography.d.ts +54 -0
  261. package/package.json +158 -0
@@ -0,0 +1,233 @@
1
+ "use strict";
2
+ var __rest = (this && this.__rest) || function (s, e) {
3
+ var t = {};
4
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
5
+ t[p] = s[p];
6
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
7
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
8
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
9
+ t[p[i]] = s[p[i]];
10
+ }
11
+ return t;
12
+ };
13
+ Object.defineProperty(exports, "__esModule", { value: true });
14
+ exports.AiChat = exports.AiChatDisplay = void 0;
15
+ const React = require("react");
16
+ const react_1 = require("react");
17
+ const styled_1 = require("@emotion/styled");
18
+ const Typography_1 = require("@mui/material/Typography");
19
+ const classnames_1 = require("classnames");
20
+ const react_2 = require("@remixicon/react");
21
+ const Input_1 = require("../Input/Input");
22
+ const EntryScreen_1 = require("./EntryScreen");
23
+ const ScrollSnap_1 = require("../ScrollSnap/ScrollSnap");
24
+ const SrAnnouncer_1 = require("../SrAnnouncer/SrAnnouncer");
25
+ const VisuallyHidden_1 = require("../VisuallyHidden/VisuallyHidden");
26
+ const Alert_1 = require("../Alert/Alert");
27
+ const ChatTitle_1 = require("./ChatTitle");
28
+ const AiChatContext_1 = require("./AiChatContext");
29
+ const useScrollSnap_1 = require("../ScrollSnap/useScrollSnap");
30
+ const Markdown_1 = require("./Markdown");
31
+ const classes = {
32
+ root: "MitAiChat--root",
33
+ title: "MitAiChat--title",
34
+ entryScreenContainer: "MitAiChat--entryScreenContainer",
35
+ conversationStarter: "MitAiChat--conversationStarter",
36
+ chatScreenContainer: "MitAiChat--chatScreenContainer",
37
+ messagesContainer: "MitAiChat--messagesContainer",
38
+ messageRow: "MitAiChat--messageRow",
39
+ messageRowUser: "MitAiChat--messageRowUser",
40
+ messageRowAssistant: "MitAiChat--messageRowAssistant",
41
+ message: "MitAiChat--message",
42
+ input: "MitAiChat--input",
43
+ bottomSection: "MitAiChat--bottomSection",
44
+ };
45
+ const Container = styled_1.default.div();
46
+ const ChatScreen = styled_1.default.div(({ externalScroll, theme }) => (Object.assign({ padding: "16px 32px 0", [theme.breakpoints.down("md")]: {
47
+ padding: "16px 16px 0",
48
+ }, boxSizing: "border-box", background: "white", position: "absolute", bottom: 0, top: 0, left: 0, right: 0, zIndex: 1 }, (externalScroll && {
49
+ padding: "0 32px",
50
+ [theme.breakpoints.down("md")]: {
51
+ padding: "0 16px",
52
+ },
53
+ }))));
54
+ const ChatContainer = styled_1.default.div(({ externalScroll }) => ({
55
+ width: "100%",
56
+ height: externalScroll ? "auto" : "100%",
57
+ minHeight: externalScroll ? "100%" : "auto",
58
+ display: "flex",
59
+ flexDirection: "column",
60
+ }));
61
+ const MessagesContainer = (0, styled_1.default)(ScrollSnap_1.ScrollSnap)(({ externalScroll }) => ({
62
+ display: "flex",
63
+ flexDirection: "column",
64
+ flex: 1,
65
+ padding: "14px 0",
66
+ overflow: externalScroll ? "visible" : "auto",
67
+ gap: "16px",
68
+ [`> .${classes.messageRowAssistant}:first-child`]: {
69
+ marginTop: "16px",
70
+ },
71
+ }));
72
+ const MessageRow = styled_1.default.div({
73
+ display: "flex",
74
+ width: "100%",
75
+ gap: "10px",
76
+ [`&.${classes.messageRowUser}`]: {
77
+ flexDirection: "row-reverse",
78
+ },
79
+ "> *": {
80
+ minWidth: 0,
81
+ },
82
+ position: "relative",
83
+ });
84
+ const Message = styled_1.default.div(({ theme }) => (Object.assign(Object.assign({ color: theme.custom.colors.darkGray2, backgroundColor: theme.custom.colors.white }, theme.typography.body2), { "p:first-of-type": {
85
+ marginTop: 0,
86
+ }, "p:last-of-type": {
87
+ marginBottom: 0,
88
+ }, "ol, ul": {
89
+ paddingInlineStart: "16px",
90
+ marginLeft: "6px",
91
+ "ol, ul": {
92
+ marginLeft: 0,
93
+ },
94
+ li: {
95
+ margin: "16px 0",
96
+ },
97
+ }, a: {
98
+ color: theme.custom.colors.red,
99
+ fontWeight: "normal",
100
+ }, borderRadius: "12px", [`.${classes.messageRowUser} &`]: {
101
+ padding: "12px 16px",
102
+ borderRadius: "8px 0px 8px 8px",
103
+ backgroundColor: theme.custom.colors.lightGray1,
104
+ } })));
105
+ const StarterContainer = styled_1.default.div({
106
+ alignSelf: "flex-end",
107
+ alignItems: "end",
108
+ display: "flex",
109
+ flexDirection: "column",
110
+ gap: "12px",
111
+ });
112
+ const Starter = styled_1.default.button(({ theme }) => (Object.assign(Object.assign({ border: `1px solid ${theme.custom.colors.lightGray2}`, backgroundColor: theme.custom.colors.white, padding: "8px 16px" }, theme.typography.body3), { cursor: "pointer", boxSizing: "border-box", "&:hover": {
113
+ color: theme.custom.colors.white,
114
+ backgroundColor: theme.custom.colors.silverGrayDark,
115
+ borderColor: "transparent",
116
+ }, borderRadius: "8px" })));
117
+ const StyledSendButton = (0, styled_1.default)(react_2.RiSendPlaneFill)(({ theme }) => ({
118
+ fill: theme.custom.colors.red,
119
+ }));
120
+ const StyledStopButton = (0, styled_1.default)(react_2.RiStopFill)(({ theme }) => ({
121
+ fill: theme.custom.colors.red,
122
+ }));
123
+ const BottomSection = styled_1.default.div(({ externalScroll, theme }) => (Object.assign(Object.assign({ padding: "12px 0 16px" }, (externalScroll && {
124
+ position: "sticky",
125
+ bottom: 0,
126
+ background: theme.custom.colors.white,
127
+ })), { "button:focus-visible": {
128
+ outlineOffset: "-1px",
129
+ borderRadius: "7px",
130
+ } })));
131
+ const Disclaimer = (0, styled_1.default)(Typography_1.default)(({ theme }) => ({
132
+ color: theme.custom.colors.silverGrayDark,
133
+ marginTop: "16px",
134
+ textAlign: "center",
135
+ }));
136
+ const AiChatDisplay = (_a) => {
137
+ var _b, _c;
138
+ var { conversationStarters, askTimTitle, entryScreenEnabled = true, entryScreenTitle, srLoadingMessages, placeholder = "", className, scrollElement, ref, useMathJax = false } = _a, others = __rest(_a, ["conversationStarters", "askTimTitle", "entryScreenEnabled", "entryScreenTitle", "srLoadingMessages", "placeholder", "className", "scrollElement", "ref", "useMathJax"]) // Could contain data attributes
139
+ ;
140
+ const containerRef = (0, react_1.useRef)(null);
141
+ const messagesContainerRef = (0, react_1.useRef)(null);
142
+ const chatScreenRef = (0, react_1.useRef)(null);
143
+ const promptInputRef = (0, react_1.useRef)(null);
144
+ const { messages, input, handleInputChange, handleSubmit, append, isLoading, stop, error, initialMessages, } = (0, AiChatContext_1.useAiChat)();
145
+ (0, useScrollSnap_1.useScrollSnap)({
146
+ scrollElement: scrollElement || messagesContainerRef.current,
147
+ contentElement: scrollElement ? messagesContainerRef.current : null,
148
+ threshold: 200,
149
+ });
150
+ const [showEntryScreen, setShowEntryScreen] = (0, react_1.useState)(entryScreenEnabled);
151
+ (0, react_1.useEffect)(() => {
152
+ var _a, _b;
153
+ if (!showEntryScreen) {
154
+ (_b = (_a = promptInputRef.current) === null || _a === void 0 ? void 0 : _a.querySelector("input")) === null || _b === void 0 ? void 0 : _b.focus();
155
+ }
156
+ }, [showEntryScreen]);
157
+ const showStarters = messages.length === ((initialMessages === null || initialMessages === void 0 ? void 0 : initialMessages.length) || 0);
158
+ const waiting = !showStarters && !error && ((_b = messages[messages.length - 1]) === null || _b === void 0 ? void 0 : _b.role) === "user";
159
+ const stoppable = isLoading && ((_c = messages[messages.length - 1]) === null || _c === void 0 ? void 0 : _c.role) !== "user";
160
+ const scrollToBottom = () => {
161
+ const element = scrollElement || messagesContainerRef.current;
162
+ element === null || element === void 0 ? void 0 : element.scrollBy({
163
+ behavior: "instant",
164
+ top: element === null || element === void 0 ? void 0 : element.scrollHeight,
165
+ });
166
+ };
167
+ const lastMsg = messages[messages.length - 1];
168
+ const externalScroll = !!scrollElement;
169
+ return (React.createElement(Container, { className: className, ref: containerRef }, showEntryScreen ? (React.createElement(EntryScreen_1.EntryScreen, { className: classes.entryScreenContainer, title: entryScreenTitle, conversationStarters: conversationStarters, onPromptSubmit: (prompt) => {
170
+ if (prompt.trim() === "") {
171
+ return;
172
+ }
173
+ setShowEntryScreen(false);
174
+ append({ role: "user", content: prompt });
175
+ } })) : (React.createElement(ChatScreen, { className: classes.chatScreenContainer, "data-testid": "ai-chat-screen", externalScroll: externalScroll, ref: chatScreenRef },
176
+ React.createElement(ChatContainer, Object.assign({ className: (0, classnames_1.default)(className, classes.root), externalScroll: externalScroll }, others),
177
+ React.createElement(ChatTitle_1.ChatTitle, { askTimTitle: askTimTitle, externalScroll: externalScroll, className: (0, classnames_1.default)(className, classes.title) }),
178
+ React.createElement(MessagesContainer, { className: classes.messagesContainer, externalScroll: externalScroll, ref: messagesContainerRef },
179
+ messages.map((m, i) => {
180
+ // Our Markdown+Mathjax has issues when rendering streaming display math
181
+ // Force a re-render of the last (streaming) message when it's done loading.
182
+ const key = i === messages.length - 1 && isLoading
183
+ ? `isLoading-${m.id}`
184
+ : m.id;
185
+ return (React.createElement(MessageRow, { key: key, "data-chat-role": m.role, className: (0, classnames_1.default)(classes.messageRow, {
186
+ [classes.messageRowUser]: m.role === "user",
187
+ [classes.messageRowAssistant]: m.role === "assistant",
188
+ }) },
189
+ React.createElement(Message, { className: classes.message },
190
+ React.createElement(VisuallyHidden_1.VisuallyHidden, { as: m.role === "user" ? "h5" : "h6" }, m.role === "user" ? "You said: " : "Assistant said: "),
191
+ React.createElement(Markdown_1.default, { enableMathjax: useMathJax }, m.content))));
192
+ }),
193
+ showStarters ? (React.createElement(StarterContainer, null, conversationStarters === null || conversationStarters === void 0 ? void 0 : conversationStarters.map((m) => (React.createElement(Starter, { className: classes.conversationStarter, key: m.content, onClick: () => {
194
+ scrollToBottom();
195
+ append({ role: "user", content: m.content });
196
+ } }, m.content))))) : null,
197
+ waiting ? (React.createElement(MessageRow, { className: (0, classnames_1.default)(classes.messageRow, classes.messageRowAssistant), key: "loading" },
198
+ React.createElement(Message, null,
199
+ React.createElement(react_2.RiMoreFill, null)))) : null,
200
+ error ? (React.createElement(Alert_1.Alert, { severity: "error", closable: true }, "An unexpected error has occurred.")) : null),
201
+ React.createElement(BottomSection, { externalScroll: externalScroll, className: classes.bottomSection },
202
+ React.createElement("form", { onSubmit: (e) => {
203
+ e.preventDefault();
204
+ if (isLoading && stoppable) {
205
+ stop();
206
+ }
207
+ else {
208
+ scrollToBottom();
209
+ handleSubmit(e);
210
+ }
211
+ } },
212
+ React.createElement(Input_1.Input, { ref: promptInputRef, fullWidth: true, size: "chat", className: classes.input, placeholder: placeholder, name: "message", sx: { flex: 1 }, value: input, onChange: handleInputChange, inputProps: {
213
+ "aria-label": "Ask a question",
214
+ }, endAdornment: isLoading ? (React.createElement(Input_1.AdornmentButton, { "aria-label": "Stop", onClick: stop, disabled: !stoppable },
215
+ React.createElement(StyledStopButton, null))) : (React.createElement(Input_1.AdornmentButton, { "aria-label": "Send", type: "submit", onClick: (e) => {
216
+ if (input.trim() === "") {
217
+ e.preventDefault();
218
+ return;
219
+ }
220
+ scrollToBottom();
221
+ handleSubmit(e);
222
+ } },
223
+ React.createElement(StyledSendButton, null))) })),
224
+ React.createElement(Disclaimer, { variant: "body3" }, "AI-generated content may be incorrect.")),
225
+ React.createElement(SrAnnouncer_1.SrAnnouncer, { isLoading: isLoading, loadingMessages: srLoadingMessages, message: (lastMsg === null || lastMsg === void 0 ? void 0 : lastMsg.role) === "assistant" ? lastMsg === null || lastMsg === void 0 ? void 0 : lastMsg.content : "" }))))));
226
+ };
227
+ exports.AiChatDisplay = AiChatDisplay;
228
+ const AiChat = (_a) => {
229
+ var { requestOpts, initialMessages, chatId, parseContent } = _a, displayProps = __rest(_a, ["requestOpts", "initialMessages", "chatId", "parseContent"]);
230
+ return (React.createElement(AiChatContext_1.AiChatProvider, { requestOpts: requestOpts, chatId: chatId, initialMessages: initialMessages, parseContent: parseContent },
231
+ React.createElement(AiChatDisplay, Object.assign({}, displayProps))));
232
+ };
233
+ exports.AiChat = AiChat;
@@ -0,0 +1,21 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { AiChat } from "./AiChat";
3
+ declare const meta: Meta<typeof AiChat>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof AiChat>;
6
+ export declare const StreamingResponses: Story;
7
+ /**
8
+ * Here `AiChat` is used with a non-streaming JSON API. The JSON is converted
9
+ * to text via `parseContent`.
10
+ */
11
+ export declare const JsonResponses: Story;
12
+ /**
13
+ * This story shows the component's builtin markdown styling.
14
+ */
15
+ export declare const MarkdownStyling: Story;
16
+ /**
17
+ * Where a scrollable container exists in the including component, it can be passed in
18
+ * for the AiChat component to use in place of its own height constrained message container
19
+ * overflow scroll. This is useful for cases such as use inside a modal or drawer.
20
+ */
21
+ export declare const ScrollContainer: Story;
@@ -0,0 +1,257 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScrollContainer = exports.MarkdownStyling = exports.JsonResponses = exports.StreamingResponses = void 0;
4
+ const React = require("react");
5
+ const AiChat_1 = require("./AiChat");
6
+ const styled_1 = require("@emotion/styled");
7
+ const api_1 = require("./test-utils/api");
8
+ const react_1 = require("react");
9
+ const better_react_mathjax_1 = require("better-react-mathjax");
10
+ const TEST_API_STREAMING = "http://localhost:4567/streaming";
11
+ const TEST_API_JSON = "http://localhost:4567/json";
12
+ const INITIAL_MESSAGES = [
13
+ {
14
+ content: "Hi! What are you interested in learning about?",
15
+ role: "assistant",
16
+ },
17
+ {
18
+ content: "I need to brush up on my Calculus",
19
+ role: "user",
20
+ },
21
+ {
22
+ content: "Great! Do you want to start with the basics, like limits and derivatives, or jump into more advanced topics like integrals and series? Let me know how I can help!",
23
+ role: "assistant",
24
+ },
25
+ ];
26
+ const STARTERS = [
27
+ { content: "I'm interested in quantum computing" },
28
+ { content: "I want to understand global warming. " },
29
+ { content: "I am curious about AI applications for business" },
30
+ ];
31
+ const Container = styled_1.default.div({
32
+ width: "100%",
33
+ height: "800px",
34
+ });
35
+ const meta = {
36
+ title: "smoot-design/AI/AiChat",
37
+ component: AiChat_1.AiChat,
38
+ parameters: {
39
+ msw: { handlers: api_1.handlers },
40
+ },
41
+ render: (args) => React.createElement(AiChat_1.AiChat, Object.assign({}, args)),
42
+ decorators: (Story, context) => {
43
+ return (React.createElement(better_react_mathjax_1.MathJaxContext, null,
44
+ React.createElement(Container, null,
45
+ React.createElement(Story, { key: String(context.args.entryScreenEnabled) }))));
46
+ },
47
+ args: {
48
+ entryScreenTitle: "What do you want to learn from MIT?",
49
+ requestOpts: { apiUrl: TEST_API_STREAMING },
50
+ conversationStarters: STARTERS,
51
+ askTimTitle: "to recommend a course",
52
+ },
53
+ argTypes: {
54
+ conversationStarters: {
55
+ control: { type: "object", disable: true },
56
+ },
57
+ initialMessages: {
58
+ control: { type: "object", disable: true },
59
+ },
60
+ requestOpts: {
61
+ control: { type: "object", disable: true },
62
+ table: { readonly: true }, // See above
63
+ },
64
+ },
65
+ };
66
+ exports.default = meta;
67
+ exports.StreamingResponses = {};
68
+ /**
69
+ * Here `AiChat` is used with a non-streaming JSON API. The JSON is converted
70
+ * to text via `parseContent`.
71
+ */
72
+ exports.JsonResponses = {
73
+ args: {
74
+ requestOpts: { apiUrl: TEST_API_JSON },
75
+ initialMessages: INITIAL_MESSAGES,
76
+ entryScreenEnabled: false,
77
+ parseContent: (content) => {
78
+ return JSON.parse(content).message;
79
+ },
80
+ },
81
+ };
82
+ const DEMO_MARKDOWN = `This shows default markdown styling. Here's are some lists:
83
+ - Item 1
84
+ - Item 2 - an unordered list (bullets)
85
+ - Point A
86
+ - Point B
87
+ - Item 3 - an ordered list (numbers)
88
+ 1. Item 3.1
89
+ 2. Item 3.2
90
+ 3. Item 3.3
91
+
92
+ Sometimes, unordered lists are nested within ordered lists:
93
+ 1. Item 1
94
+ - Item 1.1
95
+ - Item 1.2
96
+ 2. Item 2
97
+ - Item 2.1
98
+ - Item 2.2
99
+
100
+ Sometimes, ordered lists are nested within unordered lists:
101
+ - Item 1
102
+ 1. Item 1.1
103
+ 2. Item 1.2
104
+ - Item 2
105
+ 1. Item 2.1
106
+ 2. Item 2.2
107
+
108
+ Here is a longer paragraph and **bold text** and *italic text*. Lorem ipsum dolor sit amet, consectetur adipiscing elit
109
+ sed do eiusmod tempor [incididunt](https://mit.edu) ut labore et dolore magna aliqua. Ut enim ad minim veniam.
110
+
111
+ And some inline code, \`\`<inline></inline>\`\` and code block:
112
+ \`\`\`
113
+ def f(x):
114
+ print(x)
115
+ \`\`\`
116
+
117
+ And some inline math: $x = \\frac{-b\\pm\\sqrt{b^2-4ac}}{2a}$
118
+
119
+ And some block math:
120
+ \n
121
+
122
+ $$
123
+ x = \\frac{-b\\pm\\sqrt{b^2-4ac}}{2a}
124
+ $$
125
+
126
+ Math is rendered using MathJax only if the useMathJax prop is set to true.
127
+ `;
128
+ /**
129
+ * This story shows the component's builtin markdown styling.
130
+ */
131
+ exports.MarkdownStyling = {
132
+ args: {
133
+ requestOpts: { apiUrl: TEST_API_STREAMING },
134
+ entryScreenEnabled: false,
135
+ conversationStarters: [],
136
+ initialMessages: [
137
+ {
138
+ role: "assistant",
139
+ content: DEMO_MARKDOWN,
140
+ },
141
+ ],
142
+ useMathJax: true,
143
+ },
144
+ };
145
+ const ScrollComponent = (args) => {
146
+ const ref = (0, react_1.useRef)(null);
147
+ const [scrollElement, setScrollElement] = (0, react_1.useState)(null);
148
+ (0, react_1.useEffect)(() => {
149
+ setScrollElement(ref.current);
150
+ }, []);
151
+ return (React.createElement("div", { style: {
152
+ height: "800px",
153
+ overflowY: "scroll",
154
+ border: "2px solid #e0e6ea",
155
+ position: "relative",
156
+ }, ref: ref },
157
+ React.createElement(AiChat_1.AiChat, Object.assign({}, args, { scrollElement: scrollElement }))));
158
+ };
159
+ /**
160
+ * Where a scrollable container exists in the including component, it can be passed in
161
+ * for the AiChat component to use in place of its own height constrained message container
162
+ * overflow scroll. This is useful for cases such as use inside a modal or drawer.
163
+ */
164
+ exports.ScrollContainer = {
165
+ args: {
166
+ requestOpts: { apiUrl: TEST_API_STREAMING },
167
+ entryScreenEnabled: false,
168
+ conversationStarters: [],
169
+ initialMessages: [
170
+ {
171
+ content: "Hi! What are you interested in learning about?",
172
+ role: "assistant",
173
+ },
174
+ {
175
+ content: "I'm looking for a course in computer science, but I'm not sure where to start.",
176
+ role: "user",
177
+ },
178
+ {
179
+ content: "I can help you find the right course! Could you tell me about your background? Have you done any programming before, and what are your goals?",
180
+ role: "assistant",
181
+ },
182
+ {
183
+ content: "I've done some basic Python programming, and I'm interested in AI and machine learning. I work full-time though, so I need something flexible.",
184
+ role: "user",
185
+ },
186
+ {
187
+ content: "Given your background and interests, I have a few recommendations:\n\n1. 6.0001 - Introduction to Computer Science and Programming in Python\n2. 6.0002 - Introduction to Computational Thinking and Data Science\n3. 6.036 - Introduction to Machine Learning\n\nAll these courses offer flexible online options. Would you like more details about any of these?",
188
+ role: "assistant",
189
+ },
190
+ {
191
+ content: "Yes, could you tell me more about the machine learning course? What are the prerequisites?",
192
+ role: "user",
193
+ },
194
+ {
195
+ content: "6.036 (Introduction to Machine Learning) requires:\n\n- Basic Python programming\n- Linear algebra fundamentals\n- Basic probability and statistics\n- Calculus I\n\nThe course covers:\n- Supervised learning\n- Neural networks\n- Deep learning basics\n- 12 weeks of content\n- 10-12 hours per week commitment\n\nGiven your Python background, you might need to brush up on math concepts first. Would you like me to suggest some preparatory courses?",
196
+ role: "assistant",
197
+ },
198
+ {
199
+ content: "Yes, what math courses would you recommend I take first?",
200
+ role: "user",
201
+ },
202
+ {
203
+ content: "Here are the recommended math prerequisites:\n\n1. 18.01 - Single Variable Calculus\n2. 18.06 - Linear Algebra\n3. 6.041 - Probability\n\nYou can take these online through our OpenCourseWare platform. Each course takes about 8-12 weeks. Would you like to start with any of these? I can provide more details about the course format and materials.",
204
+ role: "assistant",
205
+ },
206
+ {
207
+ content: "How long would it take to complete all the prerequisites before starting the ML course?",
208
+ role: "user",
209
+ },
210
+ {
211
+ content: "If you study part-time (10-15 hours per week):\n\n- Calculus: 12 weeks\n- Linear Algebra: 10 weeks\n- Probability: 8 weeks\n\nYou could complete them in:\n1. Sequential order: 7-8 months total\n2. Parallel study (2 courses at a time): 4-5 months\n\nMany students take Calculus and Linear Algebra together. Would you like to see a suggested study schedule?",
212
+ role: "assistant",
213
+ },
214
+ {
215
+ content: "Yes, a study schedule would be helpful. Also, are there any costs involved?",
216
+ role: "user",
217
+ },
218
+ {
219
+ content: "Here's the breakdown:\n\nCosts:\n- OpenCourseWare materials: Free\n- Optional verified certificate: $49-99 per course\n- Full ML course with certificate: $149\n\nSuggested Schedule (15 hrs/week):\nMonths 1-3:\n- Calculus (8 hrs/week)\n- Linear Algebra (7 hrs/week)\n\nMonths 4-5:\n- Probability (10 hrs/week)\n\nMonths 6-8:\n- ML course (12 hrs/week)\n\nWould you like me to help you enroll in any of these courses?",
220
+ role: "assistant",
221
+ },
222
+ {
223
+ content: "Can I start with just the Calculus course first to see how it goes?",
224
+ role: "user",
225
+ },
226
+ {
227
+ content: "Absolutely! That's a smart approach. 18.01 (Single Variable Calculus) has:\n\n- Flexible start dates\n- Self-paced learning\n- Video lectures\n- Practice problems\n- Online discussion forums\n- 24/7 access to materials\n\nYou can enroll right now and start today. Would you like the enrollment link and first week's syllabus?",
228
+ role: "assistant",
229
+ },
230
+ {
231
+ content: "Yes, please share the enrollment link. Also, will I have access to any tutoring support?",
232
+ role: "user",
233
+ },
234
+ {
235
+ content: "Yes! You'll have several support options:\n\n1. Teaching Assistants (TAs) available via:\n - Discussion forums\n - Weekly online office hours\n - Email support\n\n2. Study Groups:\n - Optional virtual study groups\n - Peer-to-peer learning\n - Weekly problem-solving sessions\n\nHere's your enrollment link: [Course Registration Link]\n\nWould you like me to connect you with a TA to discuss your study plan?",
236
+ role: "assistant",
237
+ },
238
+ {
239
+ content: "Not right now, but I might later. What happens if I find the course too difficult?",
240
+ role: "user",
241
+ },
242
+ {
243
+ content: "Don't worry! We have several options if you find the course challenging:\n\n1. You can:\n - Pause your progress anytime\n - Retake modules as needed\n - Switch to a more basic math course\n - Get extra tutoring support\n\n2. We also offer a 2-week trial period with a full refund if you decide it's not the right fit.\n\nWould you like to start with some preliminary practice problems to assess your readiness?",
244
+ role: "assistant",
245
+ },
246
+ {
247
+ content: "Yes, that would be helpful. Can you send me some practice problems?",
248
+ role: "user",
249
+ },
250
+ {
251
+ content: "I'll send you our Calculus readiness assessment. It covers:\n\n- Basic algebra\n- Functions and graphs\n- Trigonometry basics\n- Pre-calculus concepts\n\nYou can access it here: [Assessment Link]\n\nTake your time with it - there's no time limit. Once you complete it, I can provide personalized recommendations for where to start. Would you like to try it now?",
252
+ role: "assistant",
253
+ },
254
+ ],
255
+ },
256
+ render: (args) => React.createElement(ScrollComponent, Object.assign({}, args)),
257
+ };
@@ -0,0 +1 @@
1
+ export {};