@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,136 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ /* eslint-disable react-hooks/rules-of-hooks */
13
+ import * as React from "react";
14
+ import { useState } from "react";
15
+ import { TabButtonList, TabButton, TabButtonLink } from "./TabButtonList";
16
+ import TabContext from "@mui/lab/TabContext";
17
+ import { Button } from "../Button/Button";
18
+ import Stack from "@mui/material/Stack";
19
+ import TabPanel from "@mui/lab/TabPanel";
20
+ import Typography from "@mui/material/Typography";
21
+ import { faker } from "@faker-js/faker/locale/en";
22
+ import Container from "@mui/material/Container";
23
+ const meta = {
24
+ title: "smoot-design/TabButtons",
25
+ argTypes: {
26
+ variant: {
27
+ options: ["scrollable", "fullWidth", "standard"],
28
+ control: { type: "radio" },
29
+ },
30
+ styleVariant: {
31
+ options: ["default", "chat"],
32
+ control: { type: "radio" },
33
+ defaultValue: "default",
34
+ },
35
+ scrollButtons: {
36
+ options: ["auto", true, false],
37
+ control: { type: "radio" },
38
+ },
39
+ },
40
+ args: {
41
+ count: 4,
42
+ variant: "scrollable",
43
+ allowScrollButtonsMobile: true,
44
+ scrollButtons: "auto",
45
+ },
46
+ render: (_a) => {
47
+ var { count } = _a, others = __rest(_a, ["count"]);
48
+ const [value, setValue] = React.useState("tab1");
49
+ return (React.createElement(Container, { maxWidth: "sm" },
50
+ React.createElement(TabContext, { value: value },
51
+ React.createElement(Stack, { direction: "row" },
52
+ React.createElement(TabButtonList, Object.assign({}, others, { onChange: (_event, val) => setValue(val) }), Array(count)
53
+ .fill(null)
54
+ .map((_, i) => (React.createElement(TabButton, { key: `tab-${i}`, value: `tab${i + 1}`, label: `Tab ${i + 1}` })))),
55
+ React.createElement(Stack, { direction: "row", justifyContent: "end", sx: { paddingLeft: "16px" } },
56
+ React.createElement(Button, null, "Other UI"))),
57
+ Array(count)
58
+ .fill(null)
59
+ .map((_, i) => (React.createElement(TabPanel, { key: `tab-${i}`, value: `tab${i + 1}` },
60
+ React.createElement(Typography, { variant: "h4", component: "h4" },
61
+ "Header ",
62
+ i + 1),
63
+ faker.lorem.paragraphs(2)))))));
64
+ },
65
+ };
66
+ export default meta;
67
+ /**
68
+ * Use `TabButtonList` and `TabButton` to render a list of tabs styled as our tertiary buttons:
69
+ */
70
+ export const ButtonTabs = {};
71
+ /**
72
+ * `TabButtonList` chat style variant:
73
+ */
74
+ export const ButtonTabsChatVariant = {
75
+ args: {
76
+ styleVariant: "chat",
77
+ variant: "fullWidth",
78
+ visibleScrollbar: false,
79
+ },
80
+ render: (_a) => {
81
+ var { count } = _a, others = __rest(_a, ["count"]);
82
+ const [value, setValue] = React.useState("tab1");
83
+ return (React.createElement(Container, { maxWidth: "sm" },
84
+ React.createElement(TabContext, { value: value },
85
+ React.createElement(Stack, { direction: "row" },
86
+ React.createElement(TabButtonList, Object.assign({}, others, { onChange: (_event, val) => setValue(val) }), Array(count)
87
+ .fill(null)
88
+ .map((_, i) => (React.createElement(TabButton, { key: `tab-${i}`, value: `tab${i + 1}`, label: `Tab ${i + 1}` }))))),
89
+ Array(count)
90
+ .fill(null)
91
+ .map((_, i) => (React.createElement(TabPanel, { key: `tab-${i}`, value: `tab${i + 1}` },
92
+ React.createElement(Typography, { variant: "h4", component: "h4" },
93
+ "Header ",
94
+ i + 1),
95
+ faker.lorem.paragraphs(2)))))));
96
+ },
97
+ };
98
+ /**
99
+ * By default, the tabs will be scrollable if there are too many to fit in the container:
100
+ */
101
+ export const ManyButtonTabs = {
102
+ args: {
103
+ count: 12,
104
+ },
105
+ };
106
+ /**
107
+ * Use `TabButtonLink` for tabs that should affect the URL:
108
+ */
109
+ export const LinkTabs = {
110
+ parameters: {
111
+ nextjs: {
112
+ appDirectory: true,
113
+ navigation: {
114
+ pathname: "/#link2",
115
+ },
116
+ },
117
+ },
118
+ render: () => {
119
+ const [hash, setHash] = useState(() => window.location.hash);
120
+ React.useEffect(() => {
121
+ const handler = () => setHash(window.location.hash);
122
+ window.addEventListener("hashchange", handler);
123
+ return () => {
124
+ window.removeEventListener("hashchange", handler);
125
+ };
126
+ }, []);
127
+ return (React.createElement("div", null,
128
+ "Current Location:",
129
+ React.createElement("pre", null, hash),
130
+ React.createElement(TabContext, { value: hash },
131
+ React.createElement(TabButtonList, null,
132
+ React.createElement(TabButtonLink, { value: "#link1", href: "#link1", label: "Tab 1" }),
133
+ React.createElement(TabButtonLink, { value: "#link2", href: "#link2", label: "Tab 2" }),
134
+ React.createElement(TabButtonLink, { value: "#link3", href: "#link3", label: "Tab 3" })))));
135
+ },
136
+ };
@@ -0,0 +1,29 @@
1
+ import * as React from "react";
2
+ import type { InputProps } from "../Input/Input";
3
+ import type { FormFieldWrapperProps } from "../internal/FormHelpers/FormHelpers";
4
+ type TextFieldProps = Omit<FormFieldWrapperProps, "children"> & {
5
+ name: string;
6
+ disabled?: boolean;
7
+ value?: string | null;
8
+ size?: InputProps["size"];
9
+ placeholder?: string;
10
+ onChange?: React.ChangeEventHandler<HTMLInputElement>;
11
+ onBlur?: React.FocusEventHandler<HTMLInputElement>;
12
+ fullWidth?: boolean;
13
+ /**
14
+ * Props forwarded to root of `<Input />`
15
+ */
16
+ InputProps?: InputProps;
17
+ } & Pick<InputProps, "type" | "startAdornment" | "endAdornment" | "multiline" | "required" | "minRows" | "inputProps">;
18
+ /**
19
+ * A form field for text input. Supports labels, help text, error text, and
20
+ * start/end adornments. Add `multiline` for a text area.
21
+ *
22
+ * - [TextField Documentation](https://mitodl.github.io/smoot-design/https://mitodl.github.io/smoot-design/)
23
+ *
24
+ * **Note:** This component shares a name a purpose with MUI's TextField, but
25
+ * does not share its entire API.
26
+ */
27
+ declare const TextField: React.FC<TextFieldProps>;
28
+ export { TextField };
29
+ export type { TextFieldProps };
@@ -0,0 +1,30 @@
1
+ var __rest = (this && this.__rest) || function (s, e) {
2
+ var t = {};
3
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
4
+ t[p] = s[p];
5
+ if (s != null && typeof Object.getOwnPropertySymbols === "function")
6
+ for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
7
+ if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
8
+ t[p[i]] = s[p[i]];
9
+ }
10
+ return t;
11
+ };
12
+ import * as React from "react";
13
+ import { Input } from "../Input/Input";
14
+ import { FormFieldWrapper } from "../internal/FormHelpers/FormHelpers";
15
+ /**
16
+ * A form field for text input. Supports labels, help text, error text, and
17
+ * start/end adornments. Add `multiline` for a text area.
18
+ *
19
+ * - [TextField Documentation](https://mitodl.github.io/smoot-design/https://mitodl.github.io/smoot-design/)
20
+ *
21
+ * **Note:** This component shares a name a purpose with MUI's TextField, but
22
+ * does not share its entire API.
23
+ */
24
+ const TextField = ({ label, size, value, name, placeholder, helpText, errorText, error, required, disabled, onChange, onBlur, multiline, type, startAdornment, endAdornment, minRows, className, id, InputProps, inputProps, fullWidth, }) => {
25
+ return (React.createElement(FormFieldWrapper, { id: id, label: label, required: required, helpText: helpText, error: error, errorText: errorText, className: className, fullWidth: fullWidth }, (_a) => {
26
+ var { labelId } = _a, childProps = __rest(_a, ["labelId"]);
27
+ return (React.createElement(Input, Object.assign({ size: size, value: value, name: name, placeholder: placeholder, onChange: onChange, onBlur: onBlur, multiline: multiline, type: type, startAdornment: startAdornment, endAdornment: endAdornment, minRows: minRows, disabled: disabled, inputProps: inputProps }, InputProps, childProps)));
28
+ }));
29
+ };
30
+ export { TextField };
@@ -0,0 +1,10 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { TextField } from "./TextField";
3
+ declare const meta: Meta<typeof TextField>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof TextField>;
6
+ export declare const Simple: Story;
7
+ export declare const Sizes: Story;
8
+ export declare const Widths: Story;
9
+ export declare const Adornments: Story;
10
+ export declare const States: Story;
@@ -0,0 +1,133 @@
1
+ import * as React from "react";
2
+ import { TextField } from "./TextField";
3
+ import { AdornmentButton } from "../Input/Input";
4
+ import Stack from "@mui/material/Stack";
5
+ import Grid from "@mui/material/Grid";
6
+ import { RiSearchLine, RiCalendarLine, RiCloseLine } from "@remixicon/react";
7
+ import { fn } from "@storybook/test";
8
+ import { enumValues } from "../../story-utils";
9
+ const SIZES = enumValues({
10
+ small: true,
11
+ medium: true,
12
+ large: true,
13
+ chat: true,
14
+ hero: true,
15
+ });
16
+ const ADORNMENTS = {
17
+ None: undefined,
18
+ SearchIcon: (React.createElement(AdornmentButton, null,
19
+ React.createElement(RiSearchLine, null))),
20
+ CalendarTodayIcon: (React.createElement(AdornmentButton, null,
21
+ React.createElement(RiCalendarLine, null))),
22
+ CloseIcon: (React.createElement(AdornmentButton, null,
23
+ React.createElement(RiCloseLine, null))),
24
+ "Close and Calendar": (React.createElement(React.Fragment, null,
25
+ React.createElement(AdornmentButton, null,
26
+ React.createElement(RiCloseLine, null)),
27
+ React.createElement(AdornmentButton, null,
28
+ React.createElement(RiCalendarLine, null)))),
29
+ };
30
+ const meta = {
31
+ title: "smoot-design/TextField",
32
+ component: TextField,
33
+ argTypes: {
34
+ size: {
35
+ options: SIZES,
36
+ control: { type: "select" },
37
+ },
38
+ startAdornment: {
39
+ options: Object.keys(ADORNMENTS),
40
+ mapping: ADORNMENTS,
41
+ control: { type: "select" },
42
+ },
43
+ endAdornment: {
44
+ options: Object.keys(ADORNMENTS),
45
+ mapping: ADORNMENTS,
46
+ control: { type: "select" },
47
+ },
48
+ },
49
+ args: {
50
+ onChange: fn(),
51
+ multiline: false,
52
+ disabled: false,
53
+ value: "some value",
54
+ placeholder: "placeholder",
55
+ label: "Label",
56
+ helpText: "Help text the quick brown fox jumps over the lazy dog",
57
+ errorText: "Error text the quick brown fox jumps over the lazy dog",
58
+ },
59
+ };
60
+ export default meta;
61
+ export const Simple = {
62
+ render: (args) => {
63
+ return React.createElement(TextField, Object.assign({}, args));
64
+ },
65
+ };
66
+ export const Sizes = {
67
+ render: (args) => {
68
+ return (React.createElement(Stack, { direction: "row", gap: 1 },
69
+ React.createElement(TextField, Object.assign({}, args, { size: "small" })),
70
+ React.createElement(TextField, Object.assign({}, args, { size: "medium" })),
71
+ React.createElement(TextField, Object.assign({}, args, { size: "large" })),
72
+ React.createElement(TextField, Object.assign({}, args, { size: "hero" }))));
73
+ },
74
+ argTypes: { size: { table: { disable: true } } },
75
+ };
76
+ export const Widths = {
77
+ render: (args) => {
78
+ return (React.createElement(Stack, { direction: "column", gap: 1 },
79
+ React.createElement(TextField, Object.assign({}, args, { label: "default" })),
80
+ React.createElement(TextField, Object.assign({}, args, { label: "fullWidth", fullWidth: true }))));
81
+ },
82
+ argTypes: { fullWidth: { table: { disable: true } } },
83
+ };
84
+ export const Adornments = {
85
+ render: (args) => {
86
+ const adornments = [
87
+ { startAdornment: ADORNMENTS.SearchIcon },
88
+ { endAdornment: ADORNMENTS.CloseIcon },
89
+ {
90
+ startAdornment: ADORNMENTS.SearchIcon,
91
+ endAdornment: ADORNMENTS["Close and Calendar"],
92
+ },
93
+ ];
94
+ return (React.createElement(Grid, { container: true, maxWidth: "600px", spacing: 2 }, Object.values(adornments).flatMap((props, i) => SIZES.map((size) => {
95
+ return (React.createElement(Grid, { item: true, xs: 6, key: `${i}-${size}` },
96
+ React.createElement(TextField, Object.assign({}, args, { size: size }, props))));
97
+ }))));
98
+ },
99
+ argTypes: {
100
+ startAdornment: { table: { disable: true } },
101
+ endAdornment: { table: { disable: true } },
102
+ },
103
+ };
104
+ export const States = {
105
+ render: (args) => {
106
+ return (React.createElement(Grid, { container: true, spacing: 2, alignItems: "top", maxWidth: "400px" },
107
+ React.createElement(Grid, { item: true, xs: 4 }, "Placeholder"),
108
+ React.createElement(Grid, { item: true, xs: 8 },
109
+ React.createElement(TextField, Object.assign({}, args, { value: "" }))),
110
+ React.createElement(Grid, { item: true, xs: 4 }, "Default"),
111
+ React.createElement(Grid, { item: true, xs: 8 },
112
+ React.createElement(TextField, Object.assign({}, args))),
113
+ React.createElement(Grid, { item: true, xs: 4 }, "Required"),
114
+ React.createElement(Grid, { item: true, xs: 8 },
115
+ React.createElement(TextField, Object.assign({ required: true }, args))),
116
+ React.createElement(Grid, { item: true, xs: 4 }, "Error"),
117
+ React.createElement(Grid, { item: true, xs: 8 },
118
+ React.createElement(TextField, Object.assign({}, args, { error: true }))),
119
+ React.createElement(Grid, { item: true, xs: 4 }, "Disabled"),
120
+ React.createElement(Grid, { item: true, xs: 8 },
121
+ React.createElement(TextField, Object.assign({}, args, { disabled: true })))));
122
+ },
123
+ args: {
124
+ placeholder: "This is placeholder text.",
125
+ value: "Some value",
126
+ },
127
+ argTypes: {
128
+ placeholder: { table: { disable: true } },
129
+ value: { table: { disable: true } },
130
+ error: { table: { disable: true } },
131
+ disabled: { table: { disable: true } },
132
+ },
133
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,75 @@
1
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
2
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
3
+ return new (P || (P = Promise))(function (resolve, reject) {
4
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
5
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
6
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
7
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
8
+ });
9
+ };
10
+ import * as React from "react";
11
+ import { render, screen } from "@testing-library/react";
12
+ import user from "@testing-library/user-event";
13
+ import { TextField } from "./TextField";
14
+ import { ThemeProvider } from "../ThemeProvider/ThemeProvider";
15
+ import { faker } from "@faker-js/faker/locale/en";
16
+ describe("TextField", () => {
17
+ const setup = (props) => {
18
+ const defaults = {
19
+ name: "test-name",
20
+ value: "test-value",
21
+ label: "test-label",
22
+ };
23
+ const { rerender: _rerender } = render(React.createElement(TextField, Object.assign({}, defaults, props)), {
24
+ wrapper: ThemeProvider,
25
+ });
26
+ const rerender = (newProps) => {
27
+ _rerender(React.createElement(TextField, Object.assign({}, defaults, newProps)));
28
+ };
29
+ return { rerender };
30
+ };
31
+ it("Has a label", () => {
32
+ const label = faker.lorem.words();
33
+ setup({ label });
34
+ const input = screen.getByRole("textbox", { name: label });
35
+ expect(input).toBeInstanceOf(HTMLInputElement);
36
+ });
37
+ it("Marks the input as required if required", () => {
38
+ const label = faker.lorem.words();
39
+ setup({ label, required: true });
40
+ const input = screen.getByRole("textbox", { name: label });
41
+ expect(input).toBeRequired();
42
+ });
43
+ it("Emits the correct value on change", () => __awaiter(void 0, void 0, void 0, function* () {
44
+ const name = faker.lorem.word();
45
+ const value = faker.lorem.words();
46
+ const onChange = jest.fn();
47
+ setup({ name, onChange, value });
48
+ const input = screen.getByRole("textbox");
49
+ yield user.type(input, "x");
50
+ expect(onChange).toHaveBeenCalledTimes(1);
51
+ expect(onChange).toHaveBeenCalledWith(expect.objectContaining({
52
+ target: expect.objectContaining({ name }),
53
+ }));
54
+ }));
55
+ it("Forwards inputProps and InputProps", () => {
56
+ /**
57
+ * NOTE: This behavior is important for integrating easily with MUI's
58
+ * Autocomplete component
59
+ */
60
+ const inputRef = jest.fn();
61
+ const InputRef = jest.fn();
62
+ setup({
63
+ inputProps: {
64
+ ref: inputRef,
65
+ },
66
+ InputProps: {
67
+ ref: InputRef,
68
+ },
69
+ });
70
+ expect(inputRef).toHaveBeenCalledTimes(1);
71
+ expect(inputRef).toHaveBeenCalledWith(expect.any(HTMLInputElement));
72
+ expect(InputRef).toHaveBeenCalledTimes(1);
73
+ expect(InputRef).toHaveBeenCalledWith(expect.any(HTMLDivElement));
74
+ });
75
+ });
@@ -0,0 +1,21 @@
1
+ import * as React from "react";
2
+ import type { ThemeOptions, Theme } from "@mui/material/styles";
3
+ /**
4
+ * Create a customized Smoot Design theme for use with `ThemeProvider`.
5
+ *
6
+ * See [ThemeProvider Docs](https://mitodl.github.io/smoot-design/?path=/docs/smoot-design-themeprovider--docs#further-customized-theme-with-createtheme)
7
+ * for more.
8
+ */
9
+ declare const createTheme: (options?: ThemeOptions) => Theme;
10
+ type ThemeProviderProps = {
11
+ children?: React.ReactNode;
12
+ theme?: Theme;
13
+ };
14
+ /**
15
+ *
16
+ * @param param0
17
+ * @returns
18
+ */
19
+ declare const ThemeProvider: React.FC<ThemeProviderProps>;
20
+ export { ThemeProvider, createTheme };
21
+ export type { ThemeProviderProps, Theme };
@@ -0,0 +1,82 @@
1
+ import * as React from "react";
2
+ import { createTheme as muiCreateTheme, ThemeProvider as MuiThemeProvider, } from "@mui/material/styles";
3
+ import * as typography from "./typography";
4
+ import * as buttons from "./buttons";
5
+ import * as chips from "./chips";
6
+ import { colors } from "./colors";
7
+ import deepmerge from "@mui/utils/deepmerge";
8
+ const custom = {
9
+ colors,
10
+ dimensions: {
11
+ headerHeight: "72px",
12
+ headerHeightSm: "60px",
13
+ },
14
+ };
15
+ const BREAKPOINTS = {
16
+ values: {
17
+ xs: 0,
18
+ sm: 600,
19
+ md: 900,
20
+ lg: 1272 + 48,
21
+ xl: 1536,
22
+ },
23
+ };
24
+ const defaultThemeOptions = {
25
+ custom: custom,
26
+ palette: {
27
+ primary: {
28
+ main: colors.mitRed,
29
+ light: colors.lightRed,
30
+ active: colors.red,
31
+ contrastText: colors.white,
32
+ },
33
+ secondary: {
34
+ light: colors.darkGray2,
35
+ active: colors.silverGrayDark,
36
+ main: colors.black,
37
+ contrastText: colors.white,
38
+ },
39
+ },
40
+ shape: {
41
+ borderRadius: 8,
42
+ },
43
+ spacing: 8,
44
+ typography: typography.globalSettings,
45
+ breakpoints: BREAKPOINTS,
46
+ components: {
47
+ MuiButtonBase: buttons.buttonBaseComponent,
48
+ MuiTypography: typography.component,
49
+ MuiMenu: {
50
+ styleOverrides: { paper: { borderRadius: "4px" } },
51
+ },
52
+ MuiAutocomplete: {
53
+ styleOverrides: {
54
+ paper: { borderRadius: "4px" },
55
+ // Mui puts paddingRight: 2px, marginRight: -2px on the popupIndicator,
56
+ // which causes the browser to show a horizontal scrollbar on overflow
57
+ // containers when a scrollbar isn't really necessary.
58
+ popupIndicator: { paddingRight: 0, marginRight: 0 },
59
+ },
60
+ },
61
+ MuiChip: chips.chipComponent,
62
+ },
63
+ };
64
+ /**
65
+ * Create a customized Smoot Design theme for use with `ThemeProvider`.
66
+ *
67
+ * See [ThemeProvider Docs](https://mitodl.github.io/smoot-design/?path=/docs/smoot-design-themeprovider--docs#further-customized-theme-with-createtheme)
68
+ * for more.
69
+ */
70
+ const createTheme = (options) => {
71
+ return muiCreateTheme(deepmerge(defaultThemeOptions, options));
72
+ };
73
+ const defaultTheme = createTheme();
74
+ /**
75
+ *
76
+ * @param param0
77
+ * @returns
78
+ */
79
+ const ThemeProvider = ({ children, theme = defaultTheme, }) => {
80
+ return React.createElement(MuiThemeProvider, { theme: theme }, children);
81
+ };
82
+ export { ThemeProvider, createTheme };
@@ -0,0 +1,63 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { ThemeProvider } from "./ThemeProvider";
3
+ declare const meta: Meta<typeof ThemeProvider>;
4
+ type Story = StoryObj<typeof ThemeProvider>;
5
+ /**
6
+ * `ThemeProvider` must wrap all components from `smoot`-design, and allows
7
+ * styling any component via [`styled`](https://emotion.sh/docs/styled).
8
+ *
9
+ * In general, most useful theme properties are exposed on `theme.custom`. (Root
10
+ * `theme` properties are used internally by MUI.) See typescript definitions
11
+ * for more information about `theme.custom`.
12
+ *
13
+ * ## Further Customized Theme with `createTheme`
14
+ * Consuming applications can customize `smoot-design`'s default theme by creating
15
+ * a theme instance with `createTheme` and passing it to `ThemeProvider`:
16
+ *
17
+ * ```tsx
18
+ * const customTheme = createTheme({...})
19
+ *
20
+ * <ThemeProvider theme={customTheme}>
21
+ * {children}
22
+ * </ThemeProvider>
23
+ * ```
24
+ *
25
+ * ### Custom Link Adapter
26
+ * One particularly notable property is `theme.custom.LinkAdapter`. Some `smoot-design`
27
+ * components render links. These links are native anchor tags by default. In
28
+ * order to use these components with custom routing libraries (e.g. `react-router`
29
+ * or `next/link`), you can provide a custom link adapter.
30
+ *
31
+ * Components such as `ButtonLink` will:
32
+ * - use `Component` on `ButtonLink` if specified (`<ButtonLink Component={Link} />`)
33
+ * - else, use `theme.custom.LinkAdapter` if specified,
34
+ * - else, use `a` tag.
35
+ *
36
+ * For example, to use `next/link` as the default link implementation:
37
+ *
38
+ * ```tsx
39
+ * import Link from "next/link"
40
+ * const theme = createTheme({ LinkAdapter: Link })
41
+ * ```
42
+ *
43
+ * You can use [module augmentation](https://www.typescriptlang.org/docs/handbook/declaration-merging.html#module-augmentation)
44
+ * to add the custom props to relevant components. For example, to expose
45
+ * `next/link`'s `scroll` prop on `ButtonLink`:
46
+ *
47
+ * ```ts
48
+ * // Add scroll prop to all components using LinkAdapter
49
+ * declare module "@mitodl/smoot-design" {
50
+ * interface LinkAdapterPropsOverrides {
51
+ * scroll?: boolean
52
+ * }
53
+ * }
54
+ * ```
55
+ *
56
+ * ### ImageAdapter
57
+ * Similarly, `theme.custom.ImageAdapter` can be used to customize the image
58
+ * component used by `smoot-design`. By default, `ImageAdapter` uses a simple `img`
59
+ * tag. Interface `ImageAdapterPropsOverrides` is similarly available for
60
+ * augmentation.
61
+ */
62
+ export declare const LinkAdapterOverride: Story;
63
+ export default meta;