@mitodl/smoot-design 0.0.0-0a23f44

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 (325) hide show
  1. package/LICENSE +28 -0
  2. package/README.md +35 -0
  3. package/dist/bundles/aiDrawerManager.es.js +38832 -0
  4. package/dist/bundles/aiDrawerManager.es.js.map +1 -0
  5. package/dist/bundles/aiDrawerManager.umd.js +245 -0
  6. package/dist/bundles/aiDrawerManager.umd.js.map +1 -0
  7. package/dist/bundles/remoteTutorDrawer.es.js +38832 -0
  8. package/dist/bundles/remoteTutorDrawer.es.js.map +1 -0
  9. package/dist/bundles/remoteTutorDrawer.umd.js +245 -0
  10. package/dist/bundles/remoteTutorDrawer.umd.js.map +1 -0
  11. package/dist/cjs/VERSION.d.ts +12 -0
  12. package/dist/cjs/VERSION.js +15 -0
  13. package/dist/cjs/ai.d.ts +3 -0
  14. package/dist/cjs/ai.js +9 -0
  15. package/dist/cjs/bundles/AiDrawer/AiDrawer.d.ts +55 -0
  16. package/dist/cjs/bundles/AiDrawer/AiDrawer.js +262 -0
  17. package/dist/cjs/bundles/AiDrawer/AiDrawer.stories.d.ts +17 -0
  18. package/dist/cjs/bundles/AiDrawer/AiDrawer.stories.js +264 -0
  19. package/dist/cjs/bundles/AiDrawer/AiDrawerManager.d.ts +12 -0
  20. package/dist/cjs/bundles/AiDrawer/AiDrawerManager.js +51 -0
  21. package/dist/cjs/bundles/AiDrawer/AiDrawerManager.stories.d.ts +6 -0
  22. package/dist/cjs/bundles/AiDrawer/AiDrawerManager.stories.js +267 -0
  23. package/dist/cjs/bundles/AiDrawer/AiDrawerManager.test.d.ts +1 -0
  24. package/dist/cjs/bundles/AiDrawer/AiDrawerManager.test.js +245 -0
  25. package/dist/cjs/bundles/AiDrawer/FlashcardsScreen.d.ts +9 -0
  26. package/dist/cjs/bundles/AiDrawer/FlashcardsScreen.js +87 -0
  27. package/dist/cjs/bundles/aiDrawerManager.d.ts +6 -0
  28. package/dist/cjs/bundles/aiDrawerManager.js +44 -0
  29. package/dist/cjs/components/AiChat/AiChat.d.ts +5 -0
  30. package/dist/cjs/components/AiChat/AiChat.js +267 -0
  31. package/dist/cjs/components/AiChat/AiChat.stories.d.ts +17 -0
  32. package/dist/cjs/components/AiChat/AiChat.stories.js +194 -0
  33. package/dist/cjs/components/AiChat/AiChat.test.d.ts +1 -0
  34. package/dist/cjs/components/AiChat/AiChat.test.js +211 -0
  35. package/dist/cjs/components/AiChat/AiChatContext.d.ts +26 -0
  36. package/dist/cjs/components/AiChat/AiChatContext.js +106 -0
  37. package/dist/cjs/components/AiChat/AiChatContext.stories.d.ts +14 -0
  38. package/dist/cjs/components/AiChat/AiChatContext.stories.js +75 -0
  39. package/dist/cjs/components/AiChat/AiChatMarkdown.stories.d.ts +15 -0
  40. package/dist/cjs/components/AiChat/AiChatMarkdown.stories.js +282 -0
  41. package/dist/cjs/components/AiChat/ChatTitle.d.ts +8 -0
  42. package/dist/cjs/components/AiChat/ChatTitle.js +43 -0
  43. package/dist/cjs/components/AiChat/EllipsisIcon.d.ts +6 -0
  44. package/dist/cjs/components/AiChat/EllipsisIcon.js +17 -0
  45. package/dist/cjs/components/AiChat/EntryScreen.d.ts +11 -0
  46. package/dist/cjs/components/AiChat/EntryScreen.js +123 -0
  47. package/dist/cjs/components/AiChat/Markdown.d.ts +7 -0
  48. package/dist/cjs/components/AiChat/Markdown.js +14 -0
  49. package/dist/cjs/components/AiChat/TimLogo.d.ts +5 -0
  50. package/dist/cjs/components/AiChat/TimLogo.js +15 -0
  51. package/dist/cjs/components/AiChat/test-utils/api.d.ts +2 -0
  52. package/dist/cjs/components/AiChat/test-utils/api.js +164 -0
  53. package/dist/cjs/components/AiChat/types.d.ts +96 -0
  54. package/dist/cjs/components/AiChat/types.js +3 -0
  55. package/dist/cjs/components/AiChat/utils.d.ts +9 -0
  56. package/dist/cjs/components/AiChat/utils.js +41 -0
  57. package/dist/cjs/components/Alert/Alert.d.ts +15 -0
  58. package/dist/cjs/components/Alert/Alert.js +62 -0
  59. package/dist/cjs/components/Alert/Alert.stories.d.ts +8 -0
  60. package/dist/cjs/components/Alert/Alert.stories.js +53 -0
  61. package/dist/cjs/components/Button/ActionButton.d.ts +30 -0
  62. package/dist/cjs/components/Button/ActionButton.js +73 -0
  63. package/dist/cjs/components/Button/ActionButton.stories.d.ts +15 -0
  64. package/dist/cjs/components/Button/ActionButton.stories.js +113 -0
  65. package/dist/cjs/components/Button/Button.d.ts +58 -0
  66. package/dist/cjs/components/Button/Button.js +261 -0
  67. package/dist/cjs/components/Button/Button.stories.d.ts +18 -0
  68. package/dist/cjs/components/Button/Button.stories.js +148 -0
  69. package/dist/cjs/components/Button/Button.test.d.ts +1 -0
  70. package/dist/cjs/components/Button/Button.test.js +46 -0
  71. package/dist/cjs/components/Checkbox/Checkbox.d.ts +20 -0
  72. package/dist/cjs/components/Checkbox/Checkbox.js +85 -0
  73. package/dist/cjs/components/Checkbox/Checkbox.stories.d.ts +8 -0
  74. package/dist/cjs/components/Checkbox/Checkbox.stories.js +33 -0
  75. package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.d.ts +21 -0
  76. package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.js +43 -0
  77. package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.stories.d.ts +8 -0
  78. package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.stories.js +50 -0
  79. package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.test.d.ts +1 -0
  80. package/dist/cjs/components/CheckboxChoiceField/CheckboxChoiceField.test.js +52 -0
  81. package/dist/cjs/components/ImageAdapter/ImageAdapter.d.ts +23 -0
  82. package/dist/cjs/components/ImageAdapter/ImageAdapter.js +30 -0
  83. package/dist/cjs/components/Input/Input.d.ts +116 -0
  84. package/dist/cjs/components/Input/Input.js +237 -0
  85. package/dist/cjs/components/Input/Input.stories.d.ts +19 -0
  86. package/dist/cjs/components/Input/Input.stories.js +135 -0
  87. package/dist/cjs/components/Input/Input.test.d.ts +1 -0
  88. package/dist/cjs/components/Input/Input.test.js +32 -0
  89. package/dist/cjs/components/LinkAdapter/LinkAdapter.d.ts +23 -0
  90. package/dist/cjs/components/LinkAdapter/LinkAdapter.js +34 -0
  91. package/dist/cjs/components/RadioChoiceField/BooleanRadioChoiceField.stories.d.ts +6 -0
  92. package/dist/cjs/components/RadioChoiceField/BooleanRadioChoiceField.stories.js +47 -0
  93. package/dist/cjs/components/RadioChoiceField/RadioChoiceField.d.ts +45 -0
  94. package/dist/cjs/components/RadioChoiceField/RadioChoiceField.js +69 -0
  95. package/dist/cjs/components/RadioChoiceField/RadioChoiceField.stories.d.ts +6 -0
  96. package/dist/cjs/components/RadioChoiceField/RadioChoiceField.stories.js +55 -0
  97. package/dist/cjs/components/RadioChoiceField/RadioChoiceField.test.d.ts +1 -0
  98. package/dist/cjs/components/RadioChoiceField/RadioChoiceField.test.js +53 -0
  99. package/dist/cjs/components/ScrollSnap/ScrollSnap.d.ts +19 -0
  100. package/dist/cjs/components/ScrollSnap/ScrollSnap.js +59 -0
  101. package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
  102. package/dist/cjs/components/ScrollSnap/ScrollSnap.stories.js +43 -0
  103. package/dist/cjs/components/ScrollSnap/useScrollSnap.d.ts +6 -0
  104. package/dist/cjs/components/ScrollSnap/useScrollSnap.js +36 -0
  105. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
  106. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.js +43 -0
  107. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
  108. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.stories.js +44 -0
  109. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
  110. package/dist/cjs/components/SrAnnouncer/SrAnnouncer.test.js +62 -0
  111. package/dist/cjs/components/TabButtons/TabButtonList.d.ts +25 -0
  112. package/dist/cjs/components/TabButtons/TabButtonList.js +97 -0
  113. package/dist/cjs/components/TabButtons/TabButtonList.stories.d.ts +24 -0
  114. package/dist/cjs/components/TabButtons/TabButtonList.stories.js +139 -0
  115. package/dist/cjs/components/TextField/TextField.d.ts +29 -0
  116. package/dist/cjs/components/TextField/TextField.js +33 -0
  117. package/dist/cjs/components/TextField/TextField.stories.d.ts +10 -0
  118. package/dist/cjs/components/TextField/TextField.stories.js +136 -0
  119. package/dist/cjs/components/TextField/TextField.test.d.ts +1 -0
  120. package/dist/cjs/components/TextField/TextField.test.js +77 -0
  121. package/dist/cjs/components/ThemeProvider/ThemeProvider.d.ts +21 -0
  122. package/dist/cjs/components/ThemeProvider/ThemeProvider.js +86 -0
  123. package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.d.ts +63 -0
  124. package/dist/cjs/components/ThemeProvider/ThemeProvider.stories.js +102 -0
  125. package/dist/cjs/components/ThemeProvider/Typography.stories.d.ts +39 -0
  126. package/dist/cjs/components/ThemeProvider/Typography.stories.js +65 -0
  127. package/dist/cjs/components/ThemeProvider/breakpoints.d.ts +4 -0
  128. package/dist/cjs/components/ThemeProvider/breakpoints.js +19 -0
  129. package/dist/cjs/components/ThemeProvider/buttons.d.ts +7 -0
  130. package/dist/cjs/components/ThemeProvider/buttons.js +20 -0
  131. package/dist/cjs/components/ThemeProvider/chips.d.ts +3 -0
  132. package/dist/cjs/components/ThemeProvider/chips.js +154 -0
  133. package/dist/cjs/components/ThemeProvider/colors.d.ts +32 -0
  134. package/dist/cjs/components/ThemeProvider/colors.js +35 -0
  135. package/dist/cjs/components/ThemeProvider/typography.d.ts +18 -0
  136. package/dist/cjs/components/ThemeProvider/typography.js +173 -0
  137. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
  138. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.js +33 -0
  139. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
  140. package/dist/cjs/components/VisuallyHidden/VisuallyHidden.stories.js +13 -0
  141. package/dist/cjs/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
  142. package/dist/cjs/components/internal/FormHelpers/FormHelpers.js +78 -0
  143. package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
  144. package/dist/cjs/components/internal/FormHelpers/FormHelpers.test.js +93 -0
  145. package/dist/cjs/index.d.ts +25 -0
  146. package/dist/cjs/index.js +44 -0
  147. package/dist/cjs/jest-setup.d.ts +1 -0
  148. package/dist/cjs/jest-setup.js +18 -0
  149. package/dist/cjs/jsdom-extended.d.ts +6 -0
  150. package/dist/cjs/jsdom-extended.js +14 -0
  151. package/dist/cjs/story-utils/index.d.ts +6 -0
  152. package/dist/cjs/story-utils/index.js +17 -0
  153. package/dist/cjs/utils/composeRefs.d.ts +7 -0
  154. package/dist/cjs/utils/composeRefs.js +20 -0
  155. package/dist/cjs/utils/composeRefs.test.d.ts +1 -0
  156. package/dist/cjs/utils/composeRefs.test.js +19 -0
  157. package/dist/cjs/utils/retryingFetch.d.ts +19 -0
  158. package/dist/cjs/utils/retryingFetch.js +98 -0
  159. package/dist/cjs/utils/retryingFetch.test.d.ts +1 -0
  160. package/dist/cjs/utils/retryingFetch.test.js +48 -0
  161. package/dist/cjs/utils/useDevCheckStable.d.ts +8 -0
  162. package/dist/cjs/utils/useDevCheckStable.js +29 -0
  163. package/dist/cjs/utils/useInterval.d.ts +7 -0
  164. package/dist/cjs/utils/useInterval.js +25 -0
  165. package/dist/esm/VERSION.d.ts +12 -0
  166. package/dist/esm/VERSION.js +12 -0
  167. package/dist/esm/ai.d.ts +3 -0
  168. package/dist/esm/ai.js +2 -0
  169. package/dist/esm/bundles/AiDrawer/AiDrawer.d.ts +55 -0
  170. package/dist/esm/bundles/AiDrawer/AiDrawer.js +259 -0
  171. package/dist/esm/bundles/AiDrawer/AiDrawer.stories.d.ts +17 -0
  172. package/dist/esm/bundles/AiDrawer/AiDrawer.stories.js +261 -0
  173. package/dist/esm/bundles/AiDrawer/AiDrawerManager.d.ts +12 -0
  174. package/dist/esm/bundles/AiDrawer/AiDrawerManager.js +48 -0
  175. package/dist/esm/bundles/AiDrawer/AiDrawerManager.stories.d.ts +6 -0
  176. package/dist/esm/bundles/AiDrawer/AiDrawerManager.stories.js +264 -0
  177. package/dist/esm/bundles/AiDrawer/AiDrawerManager.test.d.ts +1 -0
  178. package/dist/esm/bundles/AiDrawer/AiDrawerManager.test.js +243 -0
  179. package/dist/esm/bundles/AiDrawer/FlashcardsScreen.d.ts +9 -0
  180. package/dist/esm/bundles/AiDrawer/FlashcardsScreen.js +83 -0
  181. package/dist/esm/bundles/aiDrawerManager.d.ts +6 -0
  182. package/dist/esm/bundles/aiDrawerManager.js +41 -0
  183. package/dist/esm/components/AiChat/AiChat.d.ts +5 -0
  184. package/dist/esm/components/AiChat/AiChat.js +263 -0
  185. package/dist/esm/components/AiChat/AiChat.stories.d.ts +17 -0
  186. package/dist/esm/components/AiChat/AiChat.stories.js +191 -0
  187. package/dist/esm/components/AiChat/AiChat.test.d.ts +1 -0
  188. package/dist/esm/components/AiChat/AiChat.test.js +209 -0
  189. package/dist/esm/components/AiChat/AiChatContext.d.ts +26 -0
  190. package/dist/esm/components/AiChat/AiChatContext.js +102 -0
  191. package/dist/esm/components/AiChat/AiChatContext.stories.d.ts +14 -0
  192. package/dist/esm/components/AiChat/AiChatContext.stories.js +72 -0
  193. package/dist/esm/components/AiChat/AiChatMarkdown.stories.d.ts +15 -0
  194. package/dist/esm/components/AiChat/AiChatMarkdown.stories.js +279 -0
  195. package/dist/esm/components/AiChat/ChatTitle.d.ts +8 -0
  196. package/dist/esm/components/AiChat/ChatTitle.js +40 -0
  197. package/dist/esm/components/AiChat/EllipsisIcon.d.ts +6 -0
  198. package/dist/esm/components/AiChat/EllipsisIcon.js +15 -0
  199. package/dist/esm/components/AiChat/EntryScreen.d.ts +11 -0
  200. package/dist/esm/components/AiChat/EntryScreen.js +120 -0
  201. package/dist/esm/components/AiChat/Markdown.d.ts +7 -0
  202. package/dist/esm/components/AiChat/Markdown.js +12 -0
  203. package/dist/esm/components/AiChat/TimLogo.d.ts +5 -0
  204. package/dist/esm/components/AiChat/TimLogo.js +13 -0
  205. package/dist/esm/components/AiChat/test-utils/api.d.ts +2 -0
  206. package/dist/esm/components/AiChat/test-utils/api.js +161 -0
  207. package/dist/esm/components/AiChat/types.d.ts +96 -0
  208. package/dist/esm/components/AiChat/types.js +2 -0
  209. package/dist/esm/components/AiChat/utils.d.ts +9 -0
  210. package/dist/esm/components/AiChat/utils.js +38 -0
  211. package/dist/esm/components/Alert/Alert.d.ts +15 -0
  212. package/dist/esm/components/Alert/Alert.js +59 -0
  213. package/dist/esm/components/Alert/Alert.stories.d.ts +8 -0
  214. package/dist/esm/components/Alert/Alert.stories.js +50 -0
  215. package/dist/esm/components/Button/ActionButton.d.ts +30 -0
  216. package/dist/esm/components/Button/ActionButton.js +68 -0
  217. package/dist/esm/components/Button/ActionButton.stories.d.ts +15 -0
  218. package/dist/esm/components/Button/ActionButton.stories.js +110 -0
  219. package/dist/esm/components/Button/Button.d.ts +58 -0
  220. package/dist/esm/components/Button/Button.js +252 -0
  221. package/dist/esm/components/Button/Button.stories.d.ts +18 -0
  222. package/dist/esm/components/Button/Button.stories.js +145 -0
  223. package/dist/esm/components/Button/Button.test.d.ts +1 -0
  224. package/dist/esm/components/Button/Button.test.js +44 -0
  225. package/dist/esm/components/Checkbox/Checkbox.d.ts +20 -0
  226. package/dist/esm/components/Checkbox/Checkbox.js +81 -0
  227. package/dist/esm/components/Checkbox/Checkbox.stories.d.ts +8 -0
  228. package/dist/esm/components/Checkbox/Checkbox.stories.js +30 -0
  229. package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.d.ts +21 -0
  230. package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.js +40 -0
  231. package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.stories.d.ts +8 -0
  232. package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.stories.js +47 -0
  233. package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.test.d.ts +1 -0
  234. package/dist/esm/components/CheckboxChoiceField/CheckboxChoiceField.test.js +50 -0
  235. package/dist/esm/components/ImageAdapter/ImageAdapter.d.ts +23 -0
  236. package/dist/esm/components/ImageAdapter/ImageAdapter.js +27 -0
  237. package/dist/esm/components/Input/Input.d.ts +116 -0
  238. package/dist/esm/components/Input/Input.js +232 -0
  239. package/dist/esm/components/Input/Input.stories.d.ts +19 -0
  240. package/dist/esm/components/Input/Input.stories.js +132 -0
  241. package/dist/esm/components/Input/Input.test.d.ts +1 -0
  242. package/dist/esm/components/Input/Input.test.js +30 -0
  243. package/dist/esm/components/LinkAdapter/LinkAdapter.d.ts +23 -0
  244. package/dist/esm/components/LinkAdapter/LinkAdapter.js +31 -0
  245. package/dist/esm/components/RadioChoiceField/BooleanRadioChoiceField.stories.d.ts +6 -0
  246. package/dist/esm/components/RadioChoiceField/BooleanRadioChoiceField.stories.js +44 -0
  247. package/dist/esm/components/RadioChoiceField/RadioChoiceField.d.ts +45 -0
  248. package/dist/esm/components/RadioChoiceField/RadioChoiceField.js +65 -0
  249. package/dist/esm/components/RadioChoiceField/RadioChoiceField.stories.d.ts +6 -0
  250. package/dist/esm/components/RadioChoiceField/RadioChoiceField.stories.js +52 -0
  251. package/dist/esm/components/RadioChoiceField/RadioChoiceField.test.d.ts +1 -0
  252. package/dist/esm/components/RadioChoiceField/RadioChoiceField.test.js +51 -0
  253. package/dist/esm/components/ScrollSnap/ScrollSnap.d.ts +19 -0
  254. package/dist/esm/components/ScrollSnap/ScrollSnap.js +56 -0
  255. package/dist/esm/components/ScrollSnap/ScrollSnap.stories.d.ts +6 -0
  256. package/dist/esm/components/ScrollSnap/ScrollSnap.stories.js +40 -0
  257. package/dist/esm/components/ScrollSnap/useScrollSnap.d.ts +6 -0
  258. package/dist/esm/components/ScrollSnap/useScrollSnap.js +33 -0
  259. package/dist/esm/components/SrAnnouncer/SrAnnouncer.d.ts +25 -0
  260. package/dist/esm/components/SrAnnouncer/SrAnnouncer.js +40 -0
  261. package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.d.ts +6 -0
  262. package/dist/esm/components/SrAnnouncer/SrAnnouncer.stories.js +41 -0
  263. package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.d.ts +1 -0
  264. package/dist/esm/components/SrAnnouncer/SrAnnouncer.test.js +60 -0
  265. package/dist/esm/components/TabButtons/TabButtonList.d.ts +25 -0
  266. package/dist/esm/components/TabButtons/TabButtonList.js +92 -0
  267. package/dist/esm/components/TabButtons/TabButtonList.stories.d.ts +24 -0
  268. package/dist/esm/components/TabButtons/TabButtonList.stories.js +136 -0
  269. package/dist/esm/components/TextField/TextField.d.ts +29 -0
  270. package/dist/esm/components/TextField/TextField.js +30 -0
  271. package/dist/esm/components/TextField/TextField.stories.d.ts +10 -0
  272. package/dist/esm/components/TextField/TextField.stories.js +133 -0
  273. package/dist/esm/components/TextField/TextField.test.d.ts +1 -0
  274. package/dist/esm/components/TextField/TextField.test.js +75 -0
  275. package/dist/esm/components/ThemeProvider/ThemeProvider.d.ts +21 -0
  276. package/dist/esm/components/ThemeProvider/ThemeProvider.js +82 -0
  277. package/dist/esm/components/ThemeProvider/ThemeProvider.stories.d.ts +63 -0
  278. package/dist/esm/components/ThemeProvider/ThemeProvider.stories.js +99 -0
  279. package/dist/esm/components/ThemeProvider/Typography.stories.d.ts +39 -0
  280. package/dist/esm/components/ThemeProvider/Typography.stories.js +62 -0
  281. package/dist/esm/components/ThemeProvider/breakpoints.d.ts +4 -0
  282. package/dist/esm/components/ThemeProvider/breakpoints.js +15 -0
  283. package/dist/esm/components/ThemeProvider/buttons.d.ts +7 -0
  284. package/dist/esm/components/ThemeProvider/buttons.js +17 -0
  285. package/dist/esm/components/ThemeProvider/chips.d.ts +3 -0
  286. package/dist/esm/components/ThemeProvider/chips.js +151 -0
  287. package/dist/esm/components/ThemeProvider/colors.d.ts +32 -0
  288. package/dist/esm/components/ThemeProvider/colors.js +32 -0
  289. package/dist/esm/components/ThemeProvider/typography.d.ts +18 -0
  290. package/dist/esm/components/ThemeProvider/typography.js +167 -0
  291. package/dist/esm/components/VisuallyHidden/VisuallyHidden.d.ts +24 -0
  292. package/dist/esm/components/VisuallyHidden/VisuallyHidden.js +30 -0
  293. package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.d.ts +6 -0
  294. package/dist/esm/components/VisuallyHidden/VisuallyHidden.stories.js +10 -0
  295. package/dist/esm/components/internal/FormHelpers/FormHelpers.d.ts +39 -0
  296. package/dist/esm/components/internal/FormHelpers/FormHelpers.js +73 -0
  297. package/dist/esm/components/internal/FormHelpers/FormHelpers.test.d.ts +1 -0
  298. package/dist/esm/components/internal/FormHelpers/FormHelpers.test.js +91 -0
  299. package/dist/esm/index.d.ts +25 -0
  300. package/dist/esm/index.js +16 -0
  301. package/dist/esm/jest-setup.d.ts +1 -0
  302. package/dist/esm/jest-setup.js +16 -0
  303. package/dist/esm/jsdom-extended.d.ts +6 -0
  304. package/dist/esm/jsdom-extended.js +12 -0
  305. package/dist/esm/story-utils/index.d.ts +6 -0
  306. package/dist/esm/story-utils/index.js +13 -0
  307. package/dist/esm/utils/composeRefs.d.ts +7 -0
  308. package/dist/esm/utils/composeRefs.js +17 -0
  309. package/dist/esm/utils/composeRefs.test.d.ts +1 -0
  310. package/dist/esm/utils/composeRefs.test.js +17 -0
  311. package/dist/esm/utils/retryingFetch.d.ts +19 -0
  312. package/dist/esm/utils/retryingFetch.js +96 -0
  313. package/dist/esm/utils/retryingFetch.test.d.ts +1 -0
  314. package/dist/esm/utils/retryingFetch.test.js +46 -0
  315. package/dist/esm/utils/useDevCheckStable.d.ts +8 -0
  316. package/dist/esm/utils/useDevCheckStable.js +26 -0
  317. package/dist/esm/utils/useInterval.d.ts +7 -0
  318. package/dist/esm/utils/useInterval.js +22 -0
  319. package/dist/tsconfig.tsbuildinfo +1 -0
  320. package/dist/type-augmentation/TypescriptDocs.mdx +17 -0
  321. package/dist/type-augmentation/imports.d.ts +3 -0
  322. package/dist/type-augmentation/index.d.ts +3 -0
  323. package/dist/type-augmentation/theme.d.ts +105 -0
  324. package/dist/type-augmentation/typography.d.ts +54 -0
  325. package/package.json +159 -0
@@ -0,0 +1,87 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FlashcardsScreen = void 0;
4
+ const ActionButton_1 = require("../../components/Button/ActionButton");
5
+ const Typography_1 = require("@mui/material/Typography");
6
+ const React = require("react");
7
+ const react_1 = require("react");
8
+ const styled_1 = require("@emotion/styled");
9
+ const react_2 = require("@remixicon/react");
10
+ const Container = styled_1.default.div ``;
11
+ const FlashcardContainer = styled_1.default.div(({ theme }) => ({
12
+ display: "flex",
13
+ height: 300,
14
+ padding: 40,
15
+ flexDirection: "column",
16
+ justifyContent: "center",
17
+ alignItems: "center",
18
+ alignSelf: "stretch",
19
+ borderRadius: 8,
20
+ border: `1px solid ${theme.custom.colors.lightGray2}`,
21
+ marginTop: "8px",
22
+ cursor: "pointer",
23
+ textAlign: "center",
24
+ }));
25
+ const Navigation = styled_1.default.div({
26
+ display: "flex",
27
+ justifyContent: "space-between",
28
+ alignItems: "center",
29
+ width: "100%",
30
+ marginTop: "24px",
31
+ });
32
+ const Page = styled_1.default.div(({ theme }) => (Object.assign({ color: theme.custom.colors.silverGrayDark }, theme.typography.body2)));
33
+ const Flashcard = React.forwardRef(({ content, "aria-label": ariaLabel }, ref) => {
34
+ const [screen, setScreen] = (0, react_1.useState)(0);
35
+ (0, react_1.useEffect)(() => setScreen(0), [content]);
36
+ const handleKeyDown = (e) => {
37
+ if (e.key === "Enter" || e.key === " ") {
38
+ setScreen(screen === 0 ? 1 : 0);
39
+ }
40
+ };
41
+ return (React.createElement(FlashcardContainer, { ref: ref, onClick: () => setScreen(screen === 0 ? 1 : 0), onKeyDown: handleKeyDown, tabIndex: 0, "aria-label": ariaLabel, role: "button" },
42
+ React.createElement(Typography_1.default, { variant: "h5" }, screen === 0 ? `Q: ${content.question}` : `Answer: ${content.answer}`)));
43
+ });
44
+ Flashcard.displayName = "Flashcard";
45
+ const FlashcardsScreen = ({ flashcards, wasKeyboardFocus, }) => {
46
+ const [cardIndex, setCardIndex] = (0, react_1.useState)(0);
47
+ const containerRef = (0, react_1.useRef)(null);
48
+ const flashcardRef = (0, react_1.useRef)(null);
49
+ const handleKeyDown = (0, react_1.useCallback)((e) => {
50
+ var _a;
51
+ if (!flashcards)
52
+ return;
53
+ if (!((_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement)) &&
54
+ wasKeyboardFocus) {
55
+ return;
56
+ }
57
+ if (e.key === "ArrowRight") {
58
+ setCardIndex((prevIndex) => (prevIndex + 1) % flashcards.length);
59
+ }
60
+ else if (e.key === "ArrowLeft") {
61
+ setCardIndex((prevIndex) => (prevIndex - 1 + flashcards.length) % flashcards.length);
62
+ }
63
+ }, [flashcards, wasKeyboardFocus]);
64
+ (0, react_1.useEffect)(() => {
65
+ var _a;
66
+ (_a = flashcardRef.current) === null || _a === void 0 ? void 0 : _a.focus();
67
+ }, [cardIndex]);
68
+ (0, react_1.useEffect)(() => {
69
+ window.addEventListener("keydown", handleKeyDown);
70
+ return () => window.removeEventListener("keydown", handleKeyDown);
71
+ }, [handleKeyDown]);
72
+ if (!(flashcards === null || flashcards === void 0 ? void 0 : flashcards.length)) {
73
+ return null;
74
+ }
75
+ return (React.createElement(Container, { ref: containerRef },
76
+ React.createElement(Flashcard, { ref: flashcardRef, content: flashcards[cardIndex], "aria-label": `Flashcard ${cardIndex + 1} of ${flashcards.length}` }),
77
+ React.createElement(Navigation, null,
78
+ React.createElement(ActionButton_1.ActionButton, { onClick: () => setCardIndex(cardIndex - 1), disabled: cardIndex === 0, variant: "secondary", color: "secondary", size: "small", "aria-label": "Previous card" },
79
+ React.createElement(react_2.RiArrowLeftLine, { "aria-hidden": true })),
80
+ React.createElement(Page, null,
81
+ cardIndex + 1,
82
+ " / ",
83
+ flashcards.length),
84
+ React.createElement(ActionButton_1.ActionButton, { onClick: () => setCardIndex(cardIndex + 1), disabled: cardIndex === flashcards.length - 1, variant: "secondary", color: "secondary", size: "small", "aria-label": "Next card" },
85
+ React.createElement(react_2.RiArrowRightLine, { "aria-hidden": true })))));
86
+ };
87
+ exports.FlashcardsScreen = FlashcardsScreen;
@@ -0,0 +1,6 @@
1
+ import type { AiDrawerManagerProps } from "./AiDrawer/AiDrawerManager";
2
+ /**
3
+ * Renders the AiDrawerManager to the page.
4
+ */
5
+ declare const init: (opts: AiDrawerManagerProps) => void;
6
+ export { init };
@@ -0,0 +1,44 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.init = void 0;
4
+ const React = require("react");
5
+ const client_1 = require("react-dom/client");
6
+ const AiDrawerManager_1 = require("./AiDrawer/AiDrawerManager");
7
+ const ThemeProvider_1 = require("../components/ThemeProvider/ThemeProvider");
8
+ const react_1 = require("@emotion/react");
9
+ const cache_1 = require("@emotion/cache");
10
+ const better_react_mathjax_1 = require("better-react-mathjax");
11
+ /**
12
+ * Renders the AiDrawerManager to the page.
13
+ */
14
+ const init = (opts) => {
15
+ const container = document.createElement("div");
16
+ document.body.appendChild(container);
17
+ container.id = "smoot-chat-drawer-root";
18
+ const cache = (0, cache_1.default)({
19
+ key: "css",
20
+ prepend: true,
21
+ container: container,
22
+ });
23
+ const theme = (0, ThemeProvider_1.createTheme)({
24
+ components: {
25
+ MuiPopover: { defaultProps: { container: container } },
26
+ MuiPopper: { defaultProps: { container: container } },
27
+ MuiModal: { defaultProps: { container: container } },
28
+ },
29
+ });
30
+ (0, client_1.createRoot)(container).render(React.createElement(react_1.CacheProvider, { value: cache },
31
+ React.createElement(ThemeProvider_1.ThemeProvider, { theme: theme },
32
+ React.createElement(better_react_mathjax_1.MathJaxContext, null,
33
+ React.createElement(AiDrawerManager_1.AiDrawerManager, Object.assign({}, opts))))));
34
+ // Ensure mathjax context menu is rendered above the drawer
35
+ // Mathjax context menu is appended to end of body.
36
+ const style = document.createElement("style");
37
+ style.textContent = `
38
+ .CtxtMenu_MenuFrame {
39
+ z-index: ${theme.zIndex.drawer + 100} !important;
40
+ }
41
+ `;
42
+ document.head.appendChild(style);
43
+ };
44
+ exports.init = init;
@@ -0,0 +1,5 @@
1
+ import type { FC } from "react";
2
+ import type { AiChatDisplayProps, AiChatProps } from "./types";
3
+ declare const AiChatDisplay: FC<AiChatDisplayProps>;
4
+ declare const AiChat: FC<AiChatProps>;
5
+ export { AiChatDisplay, AiChat };
@@ -0,0 +1,267 @@
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 EllipsisIcon_1 = require("./EllipsisIcon");
32
+ const classes = {
33
+ root: "MitAiChat--root",
34
+ title: "MitAiChat--title",
35
+ entryScreenContainer: "MitAiChat--entryScreenContainer",
36
+ conversationStarter: "MitAiChat--conversationStarter",
37
+ chatScreenContainer: "MitAiChat--chatScreenContainer",
38
+ messagesContainer: "MitAiChat--messagesContainer",
39
+ messageRow: "MitAiChat--messageRow",
40
+ messageRowUser: "MitAiChat--messageRowUser",
41
+ messageRowAssistant: "MitAiChat--messageRowAssistant",
42
+ message: "MitAiChat--message",
43
+ input: "MitAiChat--input",
44
+ bottomSection: "MitAiChat--bottomSection",
45
+ };
46
+ const Container = styled_1.default.div();
47
+ const ChatScreen = styled_1.default.div(({ externalScroll, theme }) => (Object.assign({ padding: "16px 32px 0", [theme.breakpoints.down("md")]: {
48
+ padding: "16px 16px 0",
49
+ }, boxSizing: "border-box", background: "white", position: "absolute", bottom: 0, top: 0, left: 0, right: 0, zIndex: 1 }, (externalScroll && {
50
+ padding: "0 32px",
51
+ [theme.breakpoints.down("md")]: {
52
+ padding: "0 16px",
53
+ },
54
+ }))));
55
+ const ChatContainer = styled_1.default.div(({ externalScroll }) => ({
56
+ width: "100%",
57
+ height: externalScroll ? "auto" : "100%",
58
+ minHeight: externalScroll ? "100%" : "auto",
59
+ display: "flex",
60
+ flexDirection: "column",
61
+ }));
62
+ const MessagesContainer = (0, styled_1.default)(ScrollSnap_1.ScrollSnap)(({ externalScroll }) => ({
63
+ display: "flex",
64
+ flexDirection: "column",
65
+ flex: 1,
66
+ padding: "14px 0",
67
+ overflow: externalScroll ? "visible" : "auto",
68
+ gap: "16px",
69
+ [`> .${classes.messageRowAssistant}:first-child`]: {
70
+ marginTop: "16px",
71
+ },
72
+ }));
73
+ const MessageRow = styled_1.default.div({
74
+ display: "flex",
75
+ width: "100%",
76
+ gap: "10px",
77
+ [`&.${classes.messageRowUser}`]: {
78
+ flexDirection: "row-reverse",
79
+ },
80
+ "> *": {
81
+ minWidth: 0,
82
+ },
83
+ position: "relative",
84
+ });
85
+ 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": {
86
+ marginTop: 0,
87
+ }, "p:last-of-type": {
88
+ marginBottom: 0,
89
+ }, "ol,ul": {
90
+ paddingInlineStart: "16px",
91
+ margin: "12px 0 12px 4px",
92
+ }, "ol > li, ul > li": {
93
+ margin: "12px 0",
94
+ "ol,ul": {
95
+ margin: "12px 0 12px 4px",
96
+ },
97
+ li: {
98
+ margin: "6px 0",
99
+ },
100
+ }, ul: {
101
+ paddingInlineStart: 0,
102
+ "> li": {
103
+ listStyleType: "none",
104
+ position: "relative",
105
+ "&::before": {
106
+ content: '"–"',
107
+ position: "absolute",
108
+ left: 0,
109
+ color: "#888",
110
+ marginRight: "8px",
111
+ },
112
+ paddingLeft: "16px",
113
+ },
114
+ }, "ol + ul": {
115
+ marginLeft: "24px",
116
+ li: {
117
+ margin: "6px 0",
118
+ },
119
+ }, a: {
120
+ color: theme.custom.colors.red,
121
+ fontWeight: "normal",
122
+ }, borderRadius: "12px", [`.${classes.messageRowUser} &`]: {
123
+ padding: "12px 16px",
124
+ borderRadius: "8px 0px 8px 8px",
125
+ backgroundColor: theme.custom.colors.lightGray1,
126
+ } })));
127
+ const StarterContainer = styled_1.default.div({
128
+ alignSelf: "flex-end",
129
+ alignItems: "end",
130
+ display: "flex",
131
+ flexDirection: "column",
132
+ gap: "12px",
133
+ });
134
+ 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": {
135
+ color: theme.custom.colors.white,
136
+ backgroundColor: theme.custom.colors.silverGrayDark,
137
+ borderColor: "transparent",
138
+ }, borderRadius: "8px" })));
139
+ const StyledSendButton = (0, styled_1.default)(react_2.RiSendPlaneFill)(({ theme }) => ({
140
+ fill: theme.custom.colors.red,
141
+ }));
142
+ const StyledStopButton = (0, styled_1.default)(react_2.RiStopFill)(({ theme }) => ({
143
+ fill: theme.custom.colors.red,
144
+ }));
145
+ const BottomSection = styled_1.default.div(({ externalScroll, theme }) => (Object.assign(Object.assign({ padding: "12px 0 16px" }, (externalScroll && {
146
+ position: "sticky",
147
+ bottom: 0,
148
+ background: theme.custom.colors.white,
149
+ })), { "button:focus-visible": {
150
+ outlineOffset: "-1px",
151
+ borderRadius: "7px",
152
+ } })));
153
+ const Disclaimer = (0, styled_1.default)(Typography_1.default)(({ theme }) => ({
154
+ color: theme.custom.colors.silverGrayDark,
155
+ marginTop: "16px",
156
+ textAlign: "center",
157
+ }));
158
+ const StyledEllipsisIcon = (0, styled_1.default)(EllipsisIcon_1.default)(({ theme }) => ({
159
+ ellipse: {
160
+ fill: theme.custom.colors.darkGray2,
161
+ },
162
+ width: "24px",
163
+ height: "24px",
164
+ }));
165
+ const AiChatDisplay = (_a) => {
166
+ var _b, _c;
167
+ 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
168
+ ;
169
+ const containerRef = (0, react_1.useRef)(null);
170
+ const messagesContainerRef = (0, react_1.useRef)(null);
171
+ const chatScreenRef = (0, react_1.useRef)(null);
172
+ const promptInputRef = (0, react_1.useRef)(null);
173
+ const { messages, input, handleInputChange, handleSubmit, append, isLoading, stop, error, initialMessages, status, } = (0, AiChatContext_1.useAiChat)();
174
+ (0, useScrollSnap_1.useScrollSnap)({
175
+ scrollElement: scrollElement || messagesContainerRef.current,
176
+ contentElement: scrollElement ? messagesContainerRef.current : null,
177
+ threshold: 200,
178
+ });
179
+ const [showEntryScreen, setShowEntryScreen] = (0, react_1.useState)(entryScreenEnabled);
180
+ (0, react_1.useEffect)(() => {
181
+ var _a, _b;
182
+ if (!showEntryScreen) {
183
+ (_b = (_a = promptInputRef.current) === null || _a === void 0 ? void 0 : _a.querySelector("input")) === null || _b === void 0 ? void 0 : _b.focus();
184
+ }
185
+ }, [showEntryScreen]);
186
+ (0, react_1.useEffect)(() => {
187
+ if (messages.some((m) => m.role === "user" || ["submitted", "streaming"].includes(status))) {
188
+ setShowEntryScreen(false);
189
+ }
190
+ }, [messages, status]);
191
+ const showStarters = messages.length === ((initialMessages === null || initialMessages === void 0 ? void 0 : initialMessages.length) || 0);
192
+ const waiting = !showStarters && !error && ((_b = messages[messages.length - 1]) === null || _b === void 0 ? void 0 : _b.role) === "user";
193
+ const stoppable = isLoading && ((_c = messages[messages.length - 1]) === null || _c === void 0 ? void 0 : _c.role) !== "user";
194
+ const scrollToBottom = () => {
195
+ const element = scrollElement || messagesContainerRef.current;
196
+ element === null || element === void 0 ? void 0 : element.scrollBy({
197
+ behavior: "instant",
198
+ top: element === null || element === void 0 ? void 0 : element.scrollHeight,
199
+ });
200
+ };
201
+ const lastMsg = messages[messages.length - 1];
202
+ const externalScroll = !!scrollElement;
203
+ return (React.createElement(Container, { className: className, ref: containerRef }, showEntryScreen ? (React.createElement(EntryScreen_1.EntryScreen, { className: classes.entryScreenContainer, title: entryScreenTitle, conversationStarters: conversationStarters, onPromptSubmit: (prompt) => {
204
+ if (prompt.trim() === "") {
205
+ return;
206
+ }
207
+ setShowEntryScreen(false);
208
+ append({ role: "user", content: prompt });
209
+ } })) : (React.createElement(ChatScreen, { className: classes.chatScreenContainer, "data-testid": "ai-chat-screen", externalScroll: externalScroll, ref: chatScreenRef },
210
+ React.createElement(ChatContainer, Object.assign({ className: (0, classnames_1.default)(className, classes.root), externalScroll: externalScroll }, others),
211
+ React.createElement(ChatTitle_1.ChatTitle, { askTimTitle: askTimTitle, externalScroll: externalScroll, className: (0, classnames_1.default)(className, classes.title) }),
212
+ React.createElement(MessagesContainer, { className: classes.messagesContainer, externalScroll: externalScroll, ref: messagesContainerRef },
213
+ messages.map((m, i) => {
214
+ // Our Markdown+Mathjax has issues when rendering streaming display math
215
+ // Force a re-render of the last (streaming) message when it's done loading.
216
+ const key = i === messages.length - 1 && isLoading
217
+ ? `isLoading-${m.id}`
218
+ : m.id;
219
+ return (React.createElement(MessageRow, { key: key, "data-chat-role": m.role, className: (0, classnames_1.default)(classes.messageRow, {
220
+ [classes.messageRowUser]: m.role === "user",
221
+ [classes.messageRowAssistant]: m.role === "assistant",
222
+ }) },
223
+ React.createElement(Message, { className: classes.message },
224
+ React.createElement(VisuallyHidden_1.VisuallyHidden, { as: m.role === "user" ? "h5" : "h6" }, m.role === "user" ? "You said: " : "Assistant said: "),
225
+ React.createElement(Markdown_1.default, { enableMathjax: useMathJax }, m.content))));
226
+ }),
227
+ 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: () => {
228
+ scrollToBottom();
229
+ append({ role: "user", content: m.content });
230
+ } }, m.content))))) : null,
231
+ waiting ? (React.createElement(MessageRow, { className: (0, classnames_1.default)(classes.messageRow, classes.messageRowAssistant), key: "loading" },
232
+ React.createElement(Message, null,
233
+ React.createElement(StyledEllipsisIcon, null)))) : null,
234
+ error ? (React.createElement(Alert_1.Alert, { severity: "error", closable: true }, "An unexpected error has occurred.")) : null),
235
+ React.createElement(BottomSection, { externalScroll: externalScroll, className: classes.bottomSection },
236
+ React.createElement("form", { onSubmit: (e) => {
237
+ e.preventDefault();
238
+ if (isLoading && stoppable) {
239
+ stop();
240
+ }
241
+ else {
242
+ scrollToBottom();
243
+ handleSubmit(e);
244
+ }
245
+ } },
246
+ 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: {
247
+ "aria-label": "Ask a question",
248
+ }, endAdornment: isLoading ? (React.createElement(Input_1.AdornmentButton, { "aria-label": "Stop", onClick: stop, disabled: !stoppable },
249
+ React.createElement(StyledStopButton, null))) : (React.createElement(Input_1.AdornmentButton, { "aria-label": "Send", type: "submit", onClick: (e) => {
250
+ if (input.trim() === "") {
251
+ e.preventDefault();
252
+ return;
253
+ }
254
+ scrollToBottom();
255
+ handleSubmit(e);
256
+ } },
257
+ React.createElement(StyledSendButton, null))) })),
258
+ React.createElement(Disclaimer, { variant: "body3" }, "AI-generated content may be incorrect.")),
259
+ 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 : "" }))))));
260
+ };
261
+ exports.AiChatDisplay = AiChatDisplay;
262
+ const AiChat = (_a) => {
263
+ var { requestOpts, initialMessages, chatId, parseContent } = _a, displayProps = __rest(_a, ["requestOpts", "initialMessages", "chatId", "parseContent"]);
264
+ return (React.createElement(AiChatContext_1.AiChatProvider, { requestOpts: requestOpts, chatId: chatId, initialMessages: initialMessages, parseContent: parseContent },
265
+ React.createElement(AiChatDisplay, Object.assign({}, displayProps))));
266
+ };
267
+ exports.AiChat = AiChat;
@@ -0,0 +1,17 @@
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
+ * Where a scrollable container exists in the including component, it can be passed in
14
+ * for the AiChat component to use in place of its own height constrained message container
15
+ * overflow scroll. This is useful for cases such as use inside a modal or drawer.
16
+ */
17
+ export declare const ScrollContainer: Story;
@@ -0,0 +1,194 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.ScrollContainer = 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 ScrollComponent = (args) => {
83
+ const ref = (0, react_1.useRef)(null);
84
+ const [scrollElement, setScrollElement] = (0, react_1.useState)(null);
85
+ (0, react_1.useEffect)(() => {
86
+ setScrollElement(ref.current);
87
+ }, []);
88
+ return (React.createElement("div", { style: {
89
+ height: "800px",
90
+ overflowY: "scroll",
91
+ border: "2px solid #e0e6ea",
92
+ position: "relative",
93
+ }, ref: ref },
94
+ React.createElement(AiChat_1.AiChat, Object.assign({}, args, { scrollElement: scrollElement }))));
95
+ };
96
+ /**
97
+ * Where a scrollable container exists in the including component, it can be passed in
98
+ * for the AiChat component to use in place of its own height constrained message container
99
+ * overflow scroll. This is useful for cases such as use inside a modal or drawer.
100
+ */
101
+ exports.ScrollContainer = {
102
+ args: {
103
+ requestOpts: { apiUrl: TEST_API_STREAMING },
104
+ entryScreenEnabled: false,
105
+ conversationStarters: [],
106
+ initialMessages: [
107
+ {
108
+ content: "Hi! What are you interested in learning about?",
109
+ role: "assistant",
110
+ },
111
+ {
112
+ content: "I'm looking for a course in computer science, but I'm not sure where to start.",
113
+ role: "user",
114
+ },
115
+ {
116
+ 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?",
117
+ role: "assistant",
118
+ },
119
+ {
120
+ 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.",
121
+ role: "user",
122
+ },
123
+ {
124
+ 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?",
125
+ role: "assistant",
126
+ },
127
+ {
128
+ content: "Yes, could you tell me more about the machine learning course? What are the prerequisites?",
129
+ role: "user",
130
+ },
131
+ {
132
+ 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?",
133
+ role: "assistant",
134
+ },
135
+ {
136
+ content: "Yes, what math courses would you recommend I take first?",
137
+ role: "user",
138
+ },
139
+ {
140
+ 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.",
141
+ role: "assistant",
142
+ },
143
+ {
144
+ content: "How long would it take to complete all the prerequisites before starting the ML course?",
145
+ role: "user",
146
+ },
147
+ {
148
+ 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?",
149
+ role: "assistant",
150
+ },
151
+ {
152
+ content: "Yes, a study schedule would be helpful. Also, are there any costs involved?",
153
+ role: "user",
154
+ },
155
+ {
156
+ 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?",
157
+ role: "assistant",
158
+ },
159
+ {
160
+ content: "Can I start with just the Calculus course first to see how it goes?",
161
+ role: "user",
162
+ },
163
+ {
164
+ 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?",
165
+ role: "assistant",
166
+ },
167
+ {
168
+ content: "Yes, please share the enrollment link. Also, will I have access to any tutoring support?",
169
+ role: "user",
170
+ },
171
+ {
172
+ 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?",
173
+ role: "assistant",
174
+ },
175
+ {
176
+ content: "Not right now, but I might later. What happens if I find the course too difficult?",
177
+ role: "user",
178
+ },
179
+ {
180
+ 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?",
181
+ role: "assistant",
182
+ },
183
+ {
184
+ content: "Yes, that would be helpful. Can you send me some practice problems?",
185
+ role: "user",
186
+ },
187
+ {
188
+ 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?",
189
+ role: "assistant",
190
+ },
191
+ ],
192
+ },
193
+ render: (args) => React.createElement(ScrollComponent, Object.assign({}, args)),
194
+ };
@@ -0,0 +1 @@
1
+ export {};