@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,232 @@
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 styled from "@emotion/styled";
14
+ import { css } from "@emotion/react";
15
+ import InputBase from "@mui/material/InputBase";
16
+ import classnames from "classnames";
17
+ const defaultProps = {
18
+ size: "medium",
19
+ multiline: false,
20
+ };
21
+ const responsiveSize = {
22
+ small: "small",
23
+ medium: "small",
24
+ large: "medium",
25
+ chat: "chat",
26
+ hero: "large",
27
+ };
28
+ const sizeStyles = ({ size, theme, multiline }) => css([
29
+ (size === "small" || size === "medium") && Object.assign({}, theme.typography.body2),
30
+ (size === "large" || size === "chat" || size === "hero") && Object.assign({ ".remixicon": {
31
+ width: "24px",
32
+ height: "24px",
33
+ } }, theme.typography.body1),
34
+ size === "medium" && {
35
+ paddingLeft: "12px",
36
+ paddingRight: "12px",
37
+ },
38
+ size === "small" &&
39
+ !multiline && {
40
+ height: "32px",
41
+ },
42
+ size === "medium" &&
43
+ !multiline && {
44
+ height: "40px",
45
+ },
46
+ size === "large" &&
47
+ !multiline && {
48
+ height: "48px",
49
+ },
50
+ size === "chat" &&
51
+ !multiline && {
52
+ height: "56px",
53
+ },
54
+ size === "hero" &&
55
+ !multiline && {
56
+ height: "72px",
57
+ },
58
+ size === "small" && {
59
+ padding: "0 8px",
60
+ ".Mit-AdornmentButton": {
61
+ width: "32px",
62
+ ".remixicon": {
63
+ width: "16px",
64
+ height: "16px",
65
+ },
66
+ },
67
+ },
68
+ size === "medium" && {
69
+ padding: "0 12px",
70
+ ".Mit-AdornmentButton": {
71
+ width: "40px",
72
+ ".remixicon": {
73
+ width: "20px",
74
+ height: "20px",
75
+ },
76
+ },
77
+ },
78
+ size === "large" && {
79
+ padding: "0 16px",
80
+ ".Mit-AdornmentButton": {
81
+ width: "48px",
82
+ },
83
+ },
84
+ size === "chat" && {
85
+ padding: "0 16px",
86
+ borderRadius: "8px",
87
+ borderColor: theme.custom.colors.silverGrayLight,
88
+ backgroundColor: theme.custom.colors.white,
89
+ ".Mit-AdornmentButton": {
90
+ padding: "0 16px",
91
+ },
92
+ },
93
+ size === "hero" && {
94
+ padding: "0 24px",
95
+ ".Mit-AdornmentButton": {
96
+ width: "72px",
97
+ },
98
+ },
99
+ ]);
100
+ /**
101
+ * Base styles for Input and Select components. Includes border, color, hover effects.
102
+ */
103
+ const baseInputStyles = (theme) => ({
104
+ backgroundColor: "white",
105
+ color: theme.custom.colors.darkGray2,
106
+ borderColor: theme.custom.colors.silverGrayLight,
107
+ borderWidth: "1px",
108
+ borderStyle: "solid",
109
+ borderRadius: "4px",
110
+ overflow: "hidden",
111
+ "&.Mui-disabled": {
112
+ backgroundColor: theme.custom.colors.lightGray1,
113
+ },
114
+ "&:hover:not(.Mui-disabled):not(.Mui-focused)": {
115
+ borderColor: theme.custom.colors.darkGray2,
116
+ },
117
+ "&.Mui-focused": {
118
+ /**
119
+ * When change border width, it affects either the elements outside of it or
120
+ * inside based on the border-box setting.
121
+ *
122
+ * Instead of changing the border width, we hide the border and change width
123
+ * using outline.
124
+ */
125
+ borderColor: "transparent",
126
+ outline: "2px solid currentcolor",
127
+ outlineOffset: "-2px",
128
+ },
129
+ "&.Mui-error": {
130
+ borderColor: theme.custom.colors.red,
131
+ outlineColor: theme.custom.colors.red,
132
+ },
133
+ "& input::placeholder, textarea::placeholder": {
134
+ color: theme.custom.colors.silverGrayDark,
135
+ opacity: 1, // some browsers apply opacity to placeholder text
136
+ },
137
+ "& input:placeholder-shown, textarea:placeholder-shown": {
138
+ textOverflow: "ellipsis",
139
+ },
140
+ "& textarea": {
141
+ paddingTop: "8px",
142
+ paddingBottom: "8px",
143
+ },
144
+ "&.MuiInputBase-adornedStart": {
145
+ paddingLeft: "0",
146
+ input: {
147
+ paddingLeft: "8px",
148
+ },
149
+ },
150
+ "&.MuiInputBase-adornedEnd": {
151
+ paddingRight: "0",
152
+ input: {
153
+ paddingRight: "8px",
154
+ },
155
+ },
156
+ });
157
+ const noForward = Object.keys({
158
+ responsive: true,
159
+ });
160
+ /**
161
+ * Use `Input` for a visually unlabelled input field. If used, it should still
162
+ * have an accessible label, e.g., provided via `aria-label`.
163
+ * For a labeled input field, use `TextField`. instead.
164
+ *
165
+ * **Note:** This component is a styled version of MUI's `InputBase`. See
166
+ * MUI's documentation for full info.
167
+ *
168
+ * - [Smoot Design Input Documentation](https://mitodl.github.io/smoot-design/?path=/docs/smoot-design-input--docs)
169
+ * - [InputBase Documentation](https://mui.com/api/input-base/)
170
+ */
171
+ const Input = styled(InputBase, {
172
+ shouldForwardProp: (prop) => !noForward.includes(prop),
173
+ })(({ theme, size = defaultProps.size, multiline, responsive }) => [
174
+ baseInputStyles(theme),
175
+ sizeStyles({ size, theme, multiline }),
176
+ responsive && {
177
+ [theme.breakpoints.down("sm")]: sizeStyles({
178
+ size: responsiveSize[size],
179
+ theme,
180
+ multiline,
181
+ }),
182
+ },
183
+ ]);
184
+ const AdornmentButtonStyled = styled.button(({ theme, disabled }) => (Object.assign(Object.assign({}, theme.typography.button), {
185
+ // display
186
+ display: "flex", flexShrink: 0, justifyContent: "center", alignItems: "center",
187
+ // background and border
188
+ border: "none", background: "transparent", transition: `background ${theme.transitions.duration.short}ms`,
189
+ // cursor
190
+ cursor: disabled ? "default" : "pointer", ":disabled": {
191
+ cursor: "default",
192
+ svg: {
193
+ fill: theme.custom.colors.silverGray,
194
+ },
195
+ }, ":hover": {
196
+ background: disabled ? "inherit" : "rgba(0, 0, 0, 0.06)",
197
+ }, color: theme.custom.colors.silverGray, ".MuiInputBase-root:hover &": {
198
+ color: "inherit",
199
+ }, ".MuiInputBase-root.Mui-focused &": {
200
+ color: "inherit",
201
+ }, ".MuiInputBase-root.Mui-disabled &": {
202
+ color: "inherit",
203
+ }, height: "100%" })));
204
+ const noFocus = (e) => e.preventDefault();
205
+ /**
206
+ * Button to be used with `startAdornment` and `endAdornment` props on Input and
207
+ * TextField components. AdornmentButton takes care of positioning and other
208
+ * styling concerns.
209
+ *
210
+ * NOTES:
211
+ * - It is generally expected that the content of the AdornmentButton is a
212
+ * Remix Icon component. https://remixicon.com/
213
+ * - By default, the AdornmentButton calls `preventDefault` on `mouseDown`
214
+ * events. This prevents the button from stealing focus from the input on
215
+ * click. The button is still focusable via keyboard events. You can override
216
+ * this behavior by passing your own `onMouseDown` handler.
217
+ */
218
+ const AdornmentButton = (_a) => {
219
+ var { className } = _a, others = __rest(_a, ["className"]);
220
+ return (React.createElement(AdornmentButtonStyled
221
+ /**
222
+ * If the input is focused and user clicks the AdornmentButton, we don't
223
+ * want to steal focus from the input.
224
+ */
225
+ , Object.assign({
226
+ /**
227
+ * If the input is focused and user clicks the AdornmentButton, we don't
228
+ * want to steal focus from the input.
229
+ */
230
+ onMouseDown: noFocus, className: classnames("Mit-AdornmentButton", className) }, others)));
231
+ };
232
+ export { AdornmentButton, Input, baseInputStyles };
@@ -0,0 +1,19 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { Input } from "./Input";
3
+ declare const meta: Meta<typeof Input>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof Input>;
6
+ export declare const Sizes: Story;
7
+ /**
8
+ * **Note:** Adornments should be wrapped in an `AdornmentButton` component.
9
+ *
10
+ * ```tsx
11
+ * <Input startAdornment={
12
+ * <AdornmentButton>
13
+ * <RiSearchLine />
14
+ * </AdornmentButton>
15
+ * } {...otherProps} />
16
+ * ```
17
+ */
18
+ export declare const Adornments: Story;
19
+ export declare const States: Story;
@@ -0,0 +1,132 @@
1
+ import * as React from "react";
2
+ import { Input, AdornmentButton } from "./Input";
3
+ import Stack from "@mui/material/Stack";
4
+ import Grid from "@mui/material/Grid2";
5
+ import { RiCalendarLine, RiCloseLine, RiSearchLine } from "@remixicon/react";
6
+ import { fn } from "@storybook/test";
7
+ import { enumValues } from "../../story-utils";
8
+ import Typography from "@mui/material/Typography";
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/Input",
32
+ component: Input,
33
+ argTypes: {
34
+ startAdornment: {
35
+ options: Object.keys(ADORNMENTS),
36
+ mapping: ADORNMENTS,
37
+ control: { type: "select" },
38
+ },
39
+ endAdornment: {
40
+ options: Object.keys(ADORNMENTS),
41
+ mapping: ADORNMENTS,
42
+ control: { type: "select" },
43
+ },
44
+ },
45
+ args: {
46
+ onChange: fn(),
47
+ value: "some value",
48
+ placeholder: "placeholder",
49
+ },
50
+ };
51
+ export default meta;
52
+ export const Sizes = {
53
+ render: (args) => {
54
+ return (React.createElement(Stack, { direction: "row", gap: 1 },
55
+ React.createElement(Input, Object.assign({ size: "small" }, args)),
56
+ React.createElement(Input, Object.assign({ size: "medium" }, args)),
57
+ React.createElement(Input, Object.assign({ size: "large" }, args)),
58
+ React.createElement(Input, Object.assign({ size: "hero" }, args))));
59
+ },
60
+ };
61
+ /**
62
+ * **Note:** Adornments should be wrapped in an `AdornmentButton` component.
63
+ *
64
+ * ```tsx
65
+ * <Input startAdornment={
66
+ * <AdornmentButton>
67
+ * <RiSearchLine />
68
+ * </AdornmentButton>
69
+ * } {...otherProps} />
70
+ * ```
71
+ */
72
+ export const Adornments = {
73
+ render: (args) => {
74
+ const adornments = [
75
+ { startAdornment: ADORNMENTS.SearchIcon },
76
+ { endAdornment: ADORNMENTS.CloseIcon },
77
+ {
78
+ startAdornment: ADORNMENTS.SearchIcon,
79
+ endAdornment: ADORNMENTS["Close and Calendar"],
80
+ },
81
+ ];
82
+ return (React.createElement(Grid, { container: true, maxWidth: "1400px", spacing: 2 }, Object.values(adornments).flatMap((props, i) => SIZES.map((size) => {
83
+ return (React.createElement(Grid, { size: { xs: 3 }, key: `${i}-${size}` },
84
+ React.createElement(Input, Object.assign({}, args, { size: size }, props))));
85
+ }))));
86
+ },
87
+ argTypes: {
88
+ startAdornment: { table: { disable: true } },
89
+ endAdornment: { table: { disable: true } },
90
+ },
91
+ };
92
+ export const States = {
93
+ render: (args) => {
94
+ return (React.createElement(Grid, { container: true, spacing: 2, alignItems: "center", maxWidth: "400px" },
95
+ React.createElement(Grid, { size: { xs: 4 } },
96
+ React.createElement(Typography, null, "Placeholder")),
97
+ React.createElement(Grid, { size: { xs: 8 } },
98
+ React.createElement(Input, Object.assign({}, args, { value: "" }))),
99
+ React.createElement(Grid, { size: { xs: 4 } },
100
+ React.createElement(Typography, null, "Default")),
101
+ React.createElement(Grid, { size: { xs: 8 } },
102
+ React.createElement(Input, Object.assign({}, args))),
103
+ React.createElement(Grid, { size: { xs: 4 } },
104
+ React.createElement(Typography, null, "Initially Focused")),
105
+ React.createElement(Grid, { size: { xs: 8 } },
106
+ React.createElement(Input
107
+ // This is a story just demonstrating the autofocus prop
108
+ // eslint-disable-next-line jsx-a11y/no-autofocus
109
+ , Object.assign({
110
+ // This is a story just demonstrating the autofocus prop
111
+ // eslint-disable-next-line jsx-a11y/no-autofocus
112
+ autoFocus: true }, args))),
113
+ React.createElement(Grid, { size: { xs: 4 } },
114
+ React.createElement(Typography, null, "Error")),
115
+ React.createElement(Grid, { size: { xs: 8 } },
116
+ React.createElement(Input, Object.assign({}, args, { error: true }))),
117
+ React.createElement(Grid, { size: { xs: 4 } },
118
+ React.createElement(Typography, null, "Disabled")),
119
+ React.createElement(Grid, { size: { xs: 8 } },
120
+ React.createElement(Input, Object.assign({}, args, { disabled: true })))));
121
+ },
122
+ args: {
123
+ placeholder: "This is placeholder text.",
124
+ value: "Some value",
125
+ },
126
+ argTypes: {
127
+ placeholder: { table: { disable: true } },
128
+ value: { table: { disable: true } },
129
+ error: { table: { disable: true } },
130
+ disabled: { table: { disable: true } },
131
+ },
132
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,30 @@
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 { Input, AdornmentButton } from "./Input";
14
+ import { ThemeProvider } from "../ThemeProvider/ThemeProvider";
15
+ describe("AdornmentButton", () => {
16
+ it("Does not steal focus from input when clicked", () => __awaiter(void 0, void 0, void 0, function* () {
17
+ const onClick = jest.fn();
18
+ render(React.createElement(Input, { endAdornment: React.createElement(AdornmentButton, { onClick: onClick }, "Test") }), { wrapper: ThemeProvider });
19
+ const input = screen.getByRole("textbox");
20
+ const button = screen.getByRole("button", { name: "Test" });
21
+ yield user.click(input);
22
+ expect(input).toHaveFocus();
23
+ yield user.click(button);
24
+ expect(input).toHaveFocus();
25
+ expect(onClick).toHaveBeenCalledTimes(1);
26
+ // But it should still be focusable via keyboard
27
+ yield user.tab();
28
+ expect(button).toHaveFocus();
29
+ }));
30
+ });
@@ -0,0 +1,23 @@
1
+ import * as React from "react";
2
+ /**
3
+ * LinkAdapterPropsOverrides can be used with module augmentation to provide
4
+ * extra props to ButtonLink.
5
+ *
6
+ * For example, in a NextJS App, you might set `next/link` as your default
7
+ * Link implementation, and use LinkAdapterPropsOverrides to provide
8
+ * `next/link`-specific props.
9
+ */
10
+ interface LinkAdapterPropsOverrides {
11
+ }
12
+ type LinkAdapterProps = React.ComponentProps<"a"> & {
13
+ Component?: React.ElementType;
14
+ } & LinkAdapterPropsOverrides;
15
+ /**
16
+ * Overrideable link component.
17
+ * - If `Component` is provided, renders as `Component`
18
+ * - else, if `theme.custom.LinkAdapter` is provided, renders as `theme.custom.LinkAdapter`
19
+ * - else, renders as `a` tag
20
+ */
21
+ declare const LinkAdapter: React.ForwardRefExoticComponent<Omit<LinkAdapterProps, "ref"> & React.RefAttributes<HTMLAnchorElement>>;
22
+ export { LinkAdapter };
23
+ export type { LinkAdapterPropsOverrides, LinkAdapterProps };
@@ -0,0 +1,31 @@
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 { useTheme } from "@emotion/react";
14
+ import styled from "@emotion/styled";
15
+ const PlainLink = styled.a({
16
+ color: "inherit",
17
+ textDecoration: "none",
18
+ });
19
+ /**
20
+ * Overrideable link component.
21
+ * - If `Component` is provided, renders as `Component`
22
+ * - else, if `theme.custom.LinkAdapter` is provided, renders as `theme.custom.LinkAdapter`
23
+ * - else, renders as `a` tag
24
+ */
25
+ const LinkAdapter = React.forwardRef(function LinkAdapter(_a, ref) {
26
+ var { Component } = _a, props = __rest(_a, ["Component"]);
27
+ const theme = useTheme();
28
+ const LinkComponent = Component !== null && Component !== void 0 ? Component : theme.custom.LinkAdapter;
29
+ return (React.createElement(PlainLink, Object.assign({ as: LinkComponent, ref: ref }, props), props.children));
30
+ });
31
+ export { LinkAdapter };
@@ -0,0 +1,6 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { BooleanRadioChoiceField } from "./RadioChoiceField";
3
+ declare const meta: Meta<typeof BooleanRadioChoiceField>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof BooleanRadioChoiceField>;
6
+ export declare const Simple: Story;
@@ -0,0 +1,44 @@
1
+ import * as React from "react";
2
+ import { BooleanRadioChoiceField, } from "./RadioChoiceField";
3
+ function StateWrapper(props) {
4
+ const [value, setValue] = React.useState(props.value);
5
+ const onChange = (event) => {
6
+ var _a;
7
+ const { value } = event;
8
+ (_a = props.onChange) === null || _a === void 0 ? void 0 : _a.call(props, { name: "Test", value });
9
+ setValue(value);
10
+ };
11
+ return (React.createElement(BooleanRadioChoiceField, Object.assign({}, props, { value: value, onChange: onChange })));
12
+ }
13
+ const meta = {
14
+ title: "smoot-design/BooleanRadioChoiceField",
15
+ component: BooleanRadioChoiceField,
16
+ render: (args) => React.createElement(StateWrapper, Object.assign({}, args)),
17
+ argTypes: {
18
+ onChange: {
19
+ action: "changed",
20
+ },
21
+ value: {
22
+ disabled: true,
23
+ },
24
+ },
25
+ };
26
+ export default meta;
27
+ export const Simple = {
28
+ args: {
29
+ label: "Boolean radio choice field label",
30
+ value: true,
31
+ defaultValue: "option-1",
32
+ name: "Radio choice field name",
33
+ choices: [
34
+ {
35
+ value: true,
36
+ label: "True",
37
+ },
38
+ {
39
+ value: false,
40
+ label: "False",
41
+ },
42
+ ],
43
+ },
44
+ };
@@ -0,0 +1,45 @@
1
+ import * as React from "react";
2
+ import type { RadioGroupProps } from "@mui/material/RadioGroup";
3
+ interface RadioChoiceProps {
4
+ value: string;
5
+ label: React.ReactNode;
6
+ className?: string;
7
+ }
8
+ interface RadioChoiceFieldProps {
9
+ label: React.ReactNode;
10
+ value?: string;
11
+ defaultValue?: string;
12
+ name: string;
13
+ choices: RadioChoiceProps[];
14
+ onChange?: RadioGroupProps["onChange"];
15
+ className?: string;
16
+ }
17
+ /**
18
+ * Wrapper around MUI components to make a form field with:
19
+ * - radio group input
20
+ * - label
21
+ * - help text and error message, if any
22
+ *
23
+ * Avoid using MUI's Radio and RadioGroup directly. Prefer this component.
24
+ */
25
+ declare const RadioChoiceField: React.FC<RadioChoiceFieldProps>;
26
+ interface BooleanRadioChoiceProps {
27
+ value: boolean;
28
+ label: React.ReactNode;
29
+ className?: string;
30
+ }
31
+ interface BooleanRadioChoiceFieldProps {
32
+ label: string;
33
+ value?: boolean;
34
+ defaultValue?: string;
35
+ name: string;
36
+ choices: BooleanRadioChoiceProps[];
37
+ onChange?: (event: {
38
+ name: string;
39
+ value: boolean;
40
+ }) => void;
41
+ className?: string;
42
+ }
43
+ declare const BooleanRadioChoiceField: React.FC<BooleanRadioChoiceFieldProps>;
44
+ export { RadioChoiceField, BooleanRadioChoiceField };
45
+ export type { RadioChoiceFieldProps, RadioChoiceProps, BooleanRadioChoiceFieldProps, BooleanRadioChoiceProps, };
@@ -0,0 +1,65 @@
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 { useCallback, useMemo, useId } from "react";
14
+ import FormControl from "@mui/material/FormControl";
15
+ import FormControlLabel from "@mui/material/FormControlLabel";
16
+ import Radio from "@mui/material/Radio";
17
+ import RadioGroup from "@mui/material/RadioGroup";
18
+ import styled from "@emotion/styled";
19
+ const RadioGroupStyled = styled(RadioGroup)(({ theme }) => ({
20
+ display: "flex",
21
+ flexDirection: "row",
22
+ gap: "16px",
23
+ [theme.breakpoints.down("md")]: {
24
+ flexDirection: "column",
25
+ },
26
+ ".MuiRadio-root:not(.Mui-checked) + .MuiFormControlLabel-label": {
27
+ color: theme.custom.colors.silverGrayDark,
28
+ },
29
+ }));
30
+ const Label = styled.div(({ theme }) => (Object.assign({ marginTop: "0", marginBottom: "16px", width: "100%", cursor: "default", color: theme.custom.colors.darkGray2 }, theme.typography.subtitle2)));
31
+ /**
32
+ * Wrapper around MUI components to make a form field with:
33
+ * - radio group input
34
+ * - label
35
+ * - help text and error message, if any
36
+ *
37
+ * Avoid using MUI's Radio and RadioGroup directly. Prefer this component.
38
+ */
39
+ const RadioChoiceField = ({ label, value, defaultValue, name, choices, onChange, className, }) => {
40
+ const labelId = useId();
41
+ return (React.createElement(FormControl, { className: className },
42
+ React.createElement(Label, { id: labelId }, label),
43
+ React.createElement(RadioGroupStyled, { "aria-labelledby": labelId, name: name, defaultValue: defaultValue, value: value, onChange: onChange }, choices.map((choice) => {
44
+ const { value, label, className } = choice;
45
+ return (React.createElement(FormControlLabel, { key: value, value: value, control: React.createElement(Radio, { sx: {
46
+ "&.Mui-focusVisible .MuiSvgIcon-root": {
47
+ borderRadius: "100vh",
48
+ outline: [
49
+ "5px auto rgb(0, 103, 244)",
50
+ "5px auto -webkit-focus-ring-color",
51
+ ],
52
+ },
53
+ } }), label: label, slotProps: { typography: { variant: "body2" } }, className: className }));
54
+ }))));
55
+ };
56
+ const BooleanRadioChoiceField = (_a) => {
57
+ var { choices, onChange, name, value } = _a, others = __rest(_a, ["choices", "onChange", "name", "value"]);
58
+ const stringifiedChoices = useMemo(() => choices.map((choice) => (Object.assign(Object.assign({}, choice), { value: choice.value ? "true" : "false" }))), [choices]);
59
+ const handleChange = useCallback((event) => {
60
+ const value = event.target.value === "true";
61
+ onChange === null || onChange === void 0 ? void 0 : onChange({ name: name, value });
62
+ }, [name, onChange]);
63
+ return (React.createElement(RadioChoiceField, Object.assign({ value: value === undefined ? undefined : String(value), name: name, onChange: handleChange, choices: stringifiedChoices }, others)));
64
+ };
65
+ export { RadioChoiceField, BooleanRadioChoiceField };
@@ -0,0 +1,6 @@
1
+ import type { Meta, StoryObj } from "@storybook/react";
2
+ import { RadioChoiceField } from "./RadioChoiceField";
3
+ declare const meta: Meta<typeof RadioChoiceField>;
4
+ export default meta;
5
+ type Story = StoryObj<typeof RadioChoiceField>;
6
+ export declare const Simple: Story;