@okta/odyssey-react-mui 0.21.4 → 0.23.0

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 (321) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/Autocomplete.js +62 -0
  3. package/dist/Autocomplete.js.map +1 -0
  4. package/dist/Banner.js +3 -3
  5. package/dist/Banner.js.map +1 -1
  6. package/dist/Button.js +46 -0
  7. package/dist/Button.js.map +1 -0
  8. package/dist/CheckboxGroup.js +23 -35
  9. package/dist/CheckboxGroup.js.map +1 -1
  10. package/dist/Dialog.js +68 -0
  11. package/dist/Dialog.js.map +1 -0
  12. package/dist/Field.js +72 -0
  13. package/dist/Field.js.map +1 -0
  14. package/dist/FieldError.js +34 -0
  15. package/dist/FieldError.js.map +1 -0
  16. package/dist/FieldHint.js +29 -0
  17. package/dist/FieldHint.js.map +1 -0
  18. package/dist/FieldLabel.js +32 -0
  19. package/dist/FieldLabel.js.map +1 -0
  20. package/dist/Icon.js +7 -6
  21. package/dist/Icon.js.map +1 -1
  22. package/dist/Infobox.js +1 -1
  23. package/dist/Infobox.js.map +1 -1
  24. package/dist/Link.js +5 -2
  25. package/dist/Link.js.map +1 -1
  26. package/dist/MenuButton.js +5 -4
  27. package/dist/MenuButton.js.map +1 -1
  28. package/dist/MenuItem.js +0 -1
  29. package/dist/MenuItem.js.map +1 -1
  30. package/dist/MuiPropsChild.js +30 -0
  31. package/dist/MuiPropsChild.js.map +1 -0
  32. package/dist/MuiPropsContext.js +14 -0
  33. package/dist/MuiPropsContext.js.map +1 -0
  34. package/dist/PasswordField.js +73 -0
  35. package/dist/PasswordField.js.map +1 -0
  36. package/dist/RadioGroup.js +25 -26
  37. package/dist/RadioGroup.js.map +1 -1
  38. package/dist/SearchField.js +56 -0
  39. package/dist/SearchField.js.map +1 -0
  40. package/dist/Status.js.map +1 -1
  41. package/dist/Tag.js +28 -0
  42. package/dist/Tag.js.map +1 -0
  43. package/dist/TagList.js +26 -0
  44. package/dist/TagList.js.map +1 -0
  45. package/dist/TagListContext.js +16 -0
  46. package/dist/TagListContext.js.map +1 -0
  47. package/dist/TextField.js +36 -62
  48. package/dist/TextField.js.map +1 -1
  49. package/dist/Toast.js +72 -0
  50. package/dist/Toast.js.map +1 -0
  51. package/dist/ToastStack.js +33 -0
  52. package/dist/ToastStack.js.map +1 -0
  53. package/dist/Tooltip.js +20 -0
  54. package/dist/Tooltip.js.map +1 -0
  55. package/dist/iconDictionary/Add.js +4 -4
  56. package/dist/iconDictionary/Add.js.map +1 -1
  57. package/dist/iconDictionary/AddCircle.js +4 -4
  58. package/dist/iconDictionary/AddCircle.js.map +1 -1
  59. package/dist/iconDictionary/AlertCircle.js +4 -4
  60. package/dist/iconDictionary/AlertCircle.js.map +1 -1
  61. package/dist/iconDictionary/AlertCircleFilled.js +4 -4
  62. package/dist/iconDictionary/AlertCircleFilled.js.map +1 -1
  63. package/dist/iconDictionary/AlertTriangleFilled.js +4 -4
  64. package/dist/iconDictionary/AlertTriangleFilled.js.map +1 -1
  65. package/dist/iconDictionary/Anchor.js +5 -5
  66. package/dist/iconDictionary/Anchor.js.map +1 -1
  67. package/dist/iconDictionary/ArrowDown.js +4 -4
  68. package/dist/iconDictionary/ArrowDown.js.map +1 -1
  69. package/dist/iconDictionary/ArrowLeft.js +4 -4
  70. package/dist/iconDictionary/ArrowLeft.js.map +1 -1
  71. package/dist/iconDictionary/ArrowRight.js +4 -4
  72. package/dist/iconDictionary/ArrowRight.js.map +1 -1
  73. package/dist/iconDictionary/ArrowUp.js +4 -4
  74. package/dist/iconDictionary/ArrowUp.js.map +1 -1
  75. package/dist/iconDictionary/ArrowUpDown.js +4 -4
  76. package/dist/iconDictionary/ArrowUpDown.js.map +1 -1
  77. package/dist/iconDictionary/Calendar.js +4 -4
  78. package/dist/iconDictionary/Calendar.js.map +1 -1
  79. package/dist/iconDictionary/Check.js +4 -4
  80. package/dist/iconDictionary/Check.js.map +1 -1
  81. package/dist/iconDictionary/CheckCircleFilled.js +4 -4
  82. package/dist/iconDictionary/CheckCircleFilled.js.map +1 -1
  83. package/dist/iconDictionary/ChevronDown.js +4 -4
  84. package/dist/iconDictionary/ChevronDown.js.map +1 -1
  85. package/dist/iconDictionary/ChevronUp.js +4 -4
  86. package/dist/iconDictionary/ChevronUp.js.map +1 -1
  87. package/dist/iconDictionary/Close.js +4 -4
  88. package/dist/iconDictionary/Close.js.map +1 -1
  89. package/dist/iconDictionary/CloseCircleFilled.js +4 -4
  90. package/dist/iconDictionary/CloseCircleFilled.js.map +1 -1
  91. package/dist/iconDictionary/Copy.js +4 -4
  92. package/dist/iconDictionary/Copy.js.map +1 -1
  93. package/dist/iconDictionary/Delete.js +4 -4
  94. package/dist/iconDictionary/Delete.js.map +1 -1
  95. package/dist/iconDictionary/Download.js +4 -4
  96. package/dist/iconDictionary/Download.js.map +1 -1
  97. package/dist/iconDictionary/DragHandle.js +4 -4
  98. package/dist/iconDictionary/DragHandle.js.map +1 -1
  99. package/dist/iconDictionary/Edit.js +4 -4
  100. package/dist/iconDictionary/Edit.js.map +1 -1
  101. package/dist/iconDictionary/ExternalLink.js +4 -4
  102. package/dist/iconDictionary/ExternalLink.js.map +1 -1
  103. package/dist/iconDictionary/Eye.js +4 -4
  104. package/dist/iconDictionary/Eye.js.map +1 -1
  105. package/dist/iconDictionary/EyeOff.js +4 -4
  106. package/dist/iconDictionary/EyeOff.js.map +1 -1
  107. package/dist/iconDictionary/Filter.js +4 -4
  108. package/dist/iconDictionary/Filter.js.map +1 -1
  109. package/dist/iconDictionary/Globe.js +4 -4
  110. package/dist/iconDictionary/Globe.js.map +1 -1
  111. package/dist/iconDictionary/Home.js +4 -4
  112. package/dist/iconDictionary/Home.js.map +1 -1
  113. package/dist/iconDictionary/InformationCircle.js +4 -4
  114. package/dist/iconDictionary/InformationCircle.js.map +1 -1
  115. package/dist/iconDictionary/InformationCircleFilled.js +4 -4
  116. package/dist/iconDictionary/InformationCircleFilled.js.map +1 -1
  117. package/dist/iconDictionary/Notification.js +4 -4
  118. package/dist/iconDictionary/Notification.js.map +1 -1
  119. package/dist/iconDictionary/OverflowVertical.js +4 -4
  120. package/dist/iconDictionary/OverflowVertical.js.map +1 -1
  121. package/dist/iconDictionary/QuestionCircle.js +4 -4
  122. package/dist/iconDictionary/QuestionCircle.js.map +1 -1
  123. package/dist/iconDictionary/QuestionCircleFilled.js +4 -4
  124. package/dist/iconDictionary/QuestionCircleFilled.js.map +1 -1
  125. package/dist/iconDictionary/Search.js +4 -4
  126. package/dist/iconDictionary/Search.js.map +1 -1
  127. package/dist/iconDictionary/Settings.js +3 -3
  128. package/dist/iconDictionary/Settings.js.map +1 -1
  129. package/dist/iconDictionary/Subtract.js +4 -4
  130. package/dist/iconDictionary/Subtract.js.map +1 -1
  131. package/dist/iconDictionary/User.js +4 -4
  132. package/dist/iconDictionary/User.js.map +1 -1
  133. package/dist/iconDictionary/UserGroup.js +4 -4
  134. package/dist/iconDictionary/UserGroup.js.map +1 -1
  135. package/dist/iconDictionary/index.js.map +1 -1
  136. package/dist/index.js +11 -2
  137. package/dist/index.js.map +1 -1
  138. package/dist/src/Autocomplete.d.ts +28 -0
  139. package/dist/src/Autocomplete.d.ts.map +1 -0
  140. package/dist/src/Banner.d.ts +19 -19
  141. package/dist/src/Banner.d.ts.map +1 -1
  142. package/dist/src/Button.d.ts +32 -0
  143. package/dist/src/Button.d.ts.map +1 -0
  144. package/dist/src/CheckboxGroup.d.ts +7 -4
  145. package/dist/src/CheckboxGroup.d.ts.map +1 -1
  146. package/dist/src/Dialog.d.ts +25 -0
  147. package/dist/src/Dialog.d.ts.map +1 -0
  148. package/dist/src/Field.d.ts +65 -0
  149. package/dist/src/Field.d.ts.map +1 -0
  150. package/dist/src/FieldError.d.ts +19 -0
  151. package/dist/src/FieldError.d.ts.map +1 -0
  152. package/dist/src/FieldHint.d.ts +19 -0
  153. package/dist/src/FieldHint.d.ts.map +1 -0
  154. package/dist/src/FieldLabel.d.ts +23 -0
  155. package/dist/src/FieldLabel.d.ts.map +1 -0
  156. package/dist/src/Icon.d.ts +6 -7
  157. package/dist/src/Icon.d.ts.map +1 -1
  158. package/dist/src/Infobox.d.ts +7 -7
  159. package/dist/src/Infobox.d.ts.map +1 -1
  160. package/dist/src/Link.d.ts +9 -4
  161. package/dist/src/Link.d.ts.map +1 -1
  162. package/dist/src/MenuButton.d.ts +7 -3
  163. package/dist/src/MenuButton.d.ts.map +1 -1
  164. package/dist/src/MenuItem.d.ts +1 -1
  165. package/dist/src/MenuItem.d.ts.map +1 -1
  166. package/dist/src/MuiPropsChild.d.ts +18 -0
  167. package/dist/src/MuiPropsChild.d.ts.map +1 -0
  168. package/dist/src/MuiPropsContext.d.ts +15 -0
  169. package/dist/src/MuiPropsContext.d.ts.map +1 -0
  170. package/dist/src/PasswordField.d.ts +75 -0
  171. package/dist/src/PasswordField.d.ts.map +1 -0
  172. package/dist/src/RadioGroup.d.ts +8 -8
  173. package/dist/src/RadioGroup.d.ts.map +1 -1
  174. package/dist/src/SearchField.d.ts +59 -0
  175. package/dist/src/SearchField.d.ts.map +1 -0
  176. package/dist/src/Status.d.ts +2 -2
  177. package/dist/src/Status.d.ts.map +1 -1
  178. package/dist/src/Tag.d.ts +22 -0
  179. package/dist/src/Tag.d.ts.map +1 -0
  180. package/dist/src/TagList.d.ts +19 -0
  181. package/dist/src/TagList.d.ts.map +1 -0
  182. package/dist/src/TagListContext.d.ts +18 -0
  183. package/dist/src/TagListContext.d.ts.map +1 -0
  184. package/dist/src/TextField.d.ts +16 -20
  185. package/dist/src/TextField.d.ts.map +1 -1
  186. package/dist/src/Toast.d.ts +60 -0
  187. package/dist/src/Toast.d.ts.map +1 -0
  188. package/dist/src/ToastStack.d.ts +19 -0
  189. package/dist/src/ToastStack.d.ts.map +1 -0
  190. package/dist/src/Tooltip.d.ts +21 -0
  191. package/dist/src/Tooltip.d.ts.map +1 -0
  192. package/dist/src/iconDictionary/Add.d.ts +2 -2
  193. package/dist/src/iconDictionary/AddCircle.d.ts +2 -2
  194. package/dist/src/iconDictionary/AlertCircle.d.ts +2 -2
  195. package/dist/src/iconDictionary/AlertCircleFilled.d.ts +2 -2
  196. package/dist/src/iconDictionary/AlertTriangleFilled.d.ts +2 -2
  197. package/dist/src/iconDictionary/Anchor.d.ts +2 -2
  198. package/dist/src/iconDictionary/ArrowDown.d.ts +2 -2
  199. package/dist/src/iconDictionary/ArrowLeft.d.ts +2 -2
  200. package/dist/src/iconDictionary/ArrowRight.d.ts +2 -2
  201. package/dist/src/iconDictionary/ArrowUp.d.ts +2 -2
  202. package/dist/src/iconDictionary/ArrowUpDown.d.ts +2 -2
  203. package/dist/src/iconDictionary/Calendar.d.ts +2 -2
  204. package/dist/src/iconDictionary/Check.d.ts +2 -2
  205. package/dist/src/iconDictionary/CheckCircleFilled.d.ts +2 -2
  206. package/dist/src/iconDictionary/ChevronDown.d.ts +2 -2
  207. package/dist/src/iconDictionary/ChevronUp.d.ts +2 -2
  208. package/dist/src/iconDictionary/Close.d.ts +2 -2
  209. package/dist/src/iconDictionary/CloseCircleFilled.d.ts +2 -2
  210. package/dist/src/iconDictionary/Copy.d.ts +2 -2
  211. package/dist/src/iconDictionary/Delete.d.ts +2 -2
  212. package/dist/src/iconDictionary/Download.d.ts +2 -2
  213. package/dist/src/iconDictionary/DragHandle.d.ts +2 -2
  214. package/dist/src/iconDictionary/Edit.d.ts +2 -2
  215. package/dist/src/iconDictionary/ExternalLink.d.ts +2 -2
  216. package/dist/src/iconDictionary/Eye.d.ts +2 -2
  217. package/dist/src/iconDictionary/EyeOff.d.ts +2 -2
  218. package/dist/src/iconDictionary/Filter.d.ts +2 -2
  219. package/dist/src/iconDictionary/Globe.d.ts +2 -2
  220. package/dist/src/iconDictionary/Home.d.ts +2 -2
  221. package/dist/src/iconDictionary/InformationCircle.d.ts +2 -2
  222. package/dist/src/iconDictionary/InformationCircleFilled.d.ts +2 -2
  223. package/dist/src/iconDictionary/Notification.d.ts +2 -2
  224. package/dist/src/iconDictionary/OverflowVertical.d.ts +2 -2
  225. package/dist/src/iconDictionary/QuestionCircle.d.ts +2 -2
  226. package/dist/src/iconDictionary/QuestionCircleFilled.d.ts +2 -2
  227. package/dist/src/iconDictionary/Search.d.ts +2 -2
  228. package/dist/src/iconDictionary/Settings.d.ts +2 -2
  229. package/dist/src/iconDictionary/Subtract.d.ts +2 -2
  230. package/dist/src/iconDictionary/User.d.ts +2 -2
  231. package/dist/src/iconDictionary/UserGroup.d.ts +2 -2
  232. package/dist/src/iconDictionary/index.d.ts +40 -40
  233. package/dist/src/index.d.ts +14 -5
  234. package/dist/src/index.d.ts.map +1 -1
  235. package/dist/src/theme/components.d.ts.map +1 -1
  236. package/dist/src/theme/components.types.d.ts +0 -8
  237. package/dist/src/theme/components.types.d.ts.map +1 -1
  238. package/dist/theme/components.js +249 -136
  239. package/dist/theme/components.js.map +1 -1
  240. package/dist/theme/components.types.js.map +1 -1
  241. package/dist/tsconfig.production.tsbuildinfo +1 -1
  242. package/package.json +3 -3
  243. package/src/Autocomplete.tsx +141 -0
  244. package/src/Banner.tsx +21 -21
  245. package/src/Button.tsx +95 -0
  246. package/src/CheckboxGroup.tsx +27 -34
  247. package/src/Dialog.tsx +110 -0
  248. package/src/Field.tsx +135 -0
  249. package/src/FieldError.tsx +34 -0
  250. package/src/FieldHint.tsx +28 -0
  251. package/src/FieldLabel.tsx +57 -0
  252. package/src/Icon.test.tsx +1 -1
  253. package/src/Icon.tsx +24 -7
  254. package/src/Infobox.tsx +7 -7
  255. package/src/Link.tsx +14 -6
  256. package/src/MenuButton.tsx +10 -6
  257. package/src/MenuItem.tsx +0 -1
  258. package/src/MuiPropsChild.tsx +41 -0
  259. package/src/MuiPropsContext.ts +17 -0
  260. package/src/OdysseyCacheProvider.test.tsx +1 -1
  261. package/src/PasswordField.tsx +180 -0
  262. package/src/RadioGroup.tsx +31 -46
  263. package/src/SearchField.tsx +138 -0
  264. package/src/Status.tsx +2 -2
  265. package/src/Tag.tsx +41 -0
  266. package/src/TagList.tsx +43 -0
  267. package/src/TagListContext.tsx +23 -0
  268. package/src/TextField.tsx +64 -111
  269. package/src/Toast.tsx +138 -0
  270. package/src/ToastStack.tsx +33 -0
  271. package/src/Tooltip.tsx +39 -0
  272. package/src/iconDictionary/Add.tsx +3 -3
  273. package/src/iconDictionary/AddCircle.tsx +3 -3
  274. package/src/iconDictionary/AlertCircle.tsx +3 -3
  275. package/src/iconDictionary/AlertCircleFilled.tsx +3 -3
  276. package/src/iconDictionary/AlertTriangleFilled.tsx +3 -3
  277. package/src/iconDictionary/Anchor.tsx +3 -3
  278. package/src/iconDictionary/ArrowDown.tsx +3 -3
  279. package/src/iconDictionary/ArrowLeft.tsx +3 -3
  280. package/src/iconDictionary/ArrowRight.tsx +3 -3
  281. package/src/iconDictionary/ArrowUp.tsx +3 -3
  282. package/src/iconDictionary/ArrowUpDown.tsx +3 -3
  283. package/src/iconDictionary/Calendar.tsx +3 -3
  284. package/src/iconDictionary/Check.tsx +3 -3
  285. package/src/iconDictionary/CheckCircleFilled.tsx +3 -3
  286. package/src/iconDictionary/ChevronDown.tsx +3 -3
  287. package/src/iconDictionary/ChevronUp.tsx +3 -3
  288. package/src/iconDictionary/Close.tsx +3 -3
  289. package/src/iconDictionary/CloseCircleFilled.tsx +3 -3
  290. package/src/iconDictionary/Copy.tsx +3 -3
  291. package/src/iconDictionary/Delete.tsx +3 -3
  292. package/src/iconDictionary/Download.tsx +3 -3
  293. package/src/iconDictionary/DragHandle.tsx +3 -3
  294. package/src/iconDictionary/Edit.tsx +3 -3
  295. package/src/iconDictionary/ExternalLink.tsx +3 -3
  296. package/src/iconDictionary/Eye.tsx +3 -3
  297. package/src/iconDictionary/EyeOff.tsx +3 -3
  298. package/src/iconDictionary/Filter.tsx +3 -3
  299. package/src/iconDictionary/Globe.tsx +3 -3
  300. package/src/iconDictionary/Home.tsx +3 -3
  301. package/src/iconDictionary/InformationCircle.tsx +3 -3
  302. package/src/iconDictionary/InformationCircleFilled.tsx +3 -3
  303. package/src/iconDictionary/Notification.tsx +3 -3
  304. package/src/iconDictionary/OverflowVertical.tsx +3 -3
  305. package/src/iconDictionary/QuestionCircle.tsx +3 -3
  306. package/src/iconDictionary/QuestionCircleFilled.tsx +3 -3
  307. package/src/iconDictionary/Search.tsx +3 -3
  308. package/src/iconDictionary/Settings.tsx +2 -2
  309. package/src/iconDictionary/Subtract.tsx +3 -3
  310. package/src/iconDictionary/User.tsx +3 -3
  311. package/src/iconDictionary/UserGroup.tsx +3 -3
  312. package/src/iconDictionary/index.ts +1 -1
  313. package/src/index.ts +10 -14
  314. package/src/theme/components.tsx +119 -27
  315. package/src/theme/components.types.ts +0 -8
  316. package/dist/PasswordInput.js +0 -87
  317. package/dist/PasswordInput.js.map +0 -1
  318. package/dist/src/PasswordInput.d.ts +0 -21
  319. package/dist/src/PasswordInput.d.ts.map +0 -1
  320. package/src/PasswordInput.test.tsx +0 -51
  321. package/src/PasswordInput.tsx +0 -111
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@okta/odyssey-react-mui",
3
- "version": "0.21.4",
3
+ "version": "0.23.0",
4
4
  "description": "React MUI components for Odyssey, Okta's design system",
5
5
  "author": "Okta, Inc.",
6
6
  "license": "Apache-2.0",
@@ -25,7 +25,7 @@
25
25
  "@mui/lab": "^5.0.0-alpha.117",
26
26
  "@mui/material": "^5.11.6",
27
27
  "@mui/utils": "^5.11.2",
28
- "@okta/odyssey-design-tokens": "0.21.4"
28
+ "@okta/odyssey-design-tokens": "0.23.0"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "@emotion/react": "^11",
@@ -33,5 +33,5 @@
33
33
  "react": ">=17 <19",
34
34
  "react-dom": ">=17 <19"
35
35
  },
36
- "gitHead": "facb0d98d72297e662093673a0e0ee8d7e226be2"
36
+ "gitHead": "46e7484fa0317496e65b9ba8b3f930956b0470e9"
37
37
  }
@@ -0,0 +1,141 @@
1
+ /*!
2
+ * Copyright (c) 2023-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
+ * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
+ *
5
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
+ * Unless required by applicable law or agreed to in writing, software
7
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ *
10
+ * See the License for the specific language governing permissions and limitations under the License.
11
+ */
12
+
13
+ import {
14
+ Autocomplete as MuiAutocomplete,
15
+ AutocompleteProps as MuiAutocompleteProps,
16
+ InputBase,
17
+ } from "@mui/material";
18
+ import { memo, useCallback } from "react";
19
+
20
+ import { Field } from "./Field";
21
+
22
+ export type AutocompleteProps<
23
+ OptionType,
24
+ HasMultipleChoices extends boolean | undefined,
25
+ IsCustomValueAllowed extends boolean | undefined
26
+ > = {
27
+ hasMultipleChoices?: MuiAutocompleteProps<
28
+ OptionType,
29
+ HasMultipleChoices,
30
+ undefined,
31
+ IsCustomValueAllowed
32
+ >["multiple"];
33
+ hint?: string;
34
+ isCustomValueAllowed?: MuiAutocompleteProps<
35
+ OptionType,
36
+ HasMultipleChoices,
37
+ undefined,
38
+ IsCustomValueAllowed
39
+ >["freeSolo"];
40
+ isDisabled?: MuiAutocompleteProps<
41
+ OptionType,
42
+ HasMultipleChoices,
43
+ undefined,
44
+ IsCustomValueAllowed
45
+ >["disabled"];
46
+ isLoading?: MuiAutocompleteProps<
47
+ OptionType,
48
+ HasMultipleChoices,
49
+ undefined,
50
+ IsCustomValueAllowed
51
+ >["loading"];
52
+ isReadOnly?: MuiAutocompleteProps<
53
+ OptionType,
54
+ HasMultipleChoices,
55
+ undefined,
56
+ IsCustomValueAllowed
57
+ >["readOnly"];
58
+ label: string;
59
+ onChange?: MuiAutocompleteProps<
60
+ OptionType,
61
+ HasMultipleChoices,
62
+ undefined,
63
+ IsCustomValueAllowed
64
+ >["onChange"];
65
+ onInputChange?: MuiAutocompleteProps<
66
+ OptionType,
67
+ HasMultipleChoices,
68
+ undefined,
69
+ IsCustomValueAllowed
70
+ >["onInputChange"];
71
+ options: MuiAutocompleteProps<
72
+ OptionType,
73
+ HasMultipleChoices,
74
+ undefined,
75
+ IsCustomValueAllowed
76
+ >["options"];
77
+ value?: MuiAutocompleteProps<
78
+ OptionType,
79
+ HasMultipleChoices,
80
+ undefined,
81
+ IsCustomValueAllowed
82
+ >["value"];
83
+ };
84
+
85
+ const Autocomplete = <
86
+ OptionType,
87
+ HasMultipleChoices extends boolean | undefined,
88
+ IsCustomValueAllowed extends boolean | undefined
89
+ >({
90
+ isCustomValueAllowed,
91
+ hasMultipleChoices,
92
+ isDisabled,
93
+ isLoading,
94
+ isReadOnly,
95
+ hint,
96
+ label,
97
+ onChange,
98
+ onInputChange,
99
+ options,
100
+ value,
101
+ }: AutocompleteProps<OptionType, HasMultipleChoices, IsCustomValueAllowed>) => {
102
+ const renderInput = useCallback(
103
+ ({ InputLabelProps, InputProps, ...params }) => (
104
+ <Field
105
+ fieldType="single"
106
+ hasVisibleLabel
107
+ id={InputLabelProps.htmlFor}
108
+ hint={hint}
109
+ label={label}
110
+ renderFieldComponent={({ ariaDescribedBy, id }) => (
111
+ <InputBase
112
+ {...params}
113
+ {...InputProps}
114
+ aria-describedby={ariaDescribedBy}
115
+ id={id}
116
+ />
117
+ )}
118
+ />
119
+ ),
120
+ [hint, label]
121
+ );
122
+
123
+ return (
124
+ <MuiAutocomplete
125
+ disabled={isDisabled}
126
+ freeSolo={isCustomValueAllowed}
127
+ loading={isLoading}
128
+ multiple={hasMultipleChoices}
129
+ onChange={onChange}
130
+ onInputChange={onInputChange}
131
+ options={options}
132
+ readOnly={isReadOnly}
133
+ renderInput={renderInput}
134
+ value={value}
135
+ />
136
+ );
137
+ };
138
+
139
+ const MemoizedAutocomplete = memo(Autocomplete) as typeof Autocomplete;
140
+
141
+ export { MemoizedAutocomplete as Autocomplete };
package/src/Banner.tsx CHANGED
@@ -14,44 +14,44 @@ import { AlertColor, AlertProps } from "@mui/material";
14
14
  import { memo } from "react";
15
15
  import { Alert, Link, ScreenReaderText } from "./";
16
16
 
17
- export interface BannerProps {
17
+ export type BannerProps = {
18
18
  /**
19
- * Determine the color and icon of the alert
20
- */
21
- severity: AlertColor;
22
- /**
23
- * Sets the ARIA role of the alert
24
- * ("status" for something that dynamically updates, "alert" for errors, null for something
25
- * unchanging)
19
+ * If linkUrl is not undefined, this is the text of the link.
20
+ * If left blank, it defaults to "Learn more".
21
+ * Note that linkText does nothing if linkUrl is not defined
26
22
  */
27
- role?: "status" | "alert";
23
+ linkText?: string;
28
24
  /**
29
- * The text content of the alert
25
+ * If defined, the alert will include a link to the URL
30
26
  */
31
- text: string;
27
+ linkUrl?: string;
32
28
  /**
33
29
  * The function that's fired when the user clicks the close button. If undefined,
34
30
  * the close button will not be shown.
35
31
  */
36
32
  onClose?: AlertProps["onClose"];
37
33
  /**
38
- * If defined, the alert will include a link to the URL
34
+ * Sets the ARIA role of the alert
35
+ * ("status" for something that dynamically updates, "alert" for errors, null for something
36
+ * unchanging)
39
37
  */
40
- linkUrl?: string;
38
+ role?: "status" | "alert";
41
39
  /**
42
- * If linkUrl is not undefined, this is the text of the link.
43
- * If left blank, it defaults to "Learn more".
44
- * Note that linkText does nothing if linkUrl is not defined
40
+ * Determine the color and icon of the alert
45
41
  */
46
- linkText?: string;
47
- }
42
+ severity: AlertColor;
43
+ /**
44
+ * The text content of the alert
45
+ */
46
+ text: string;
47
+ };
48
48
 
49
49
  const Banner = ({
50
- onClose,
51
- severity,
52
- role,
53
50
  linkUrl,
54
51
  linkText,
52
+ onClose,
53
+ role,
54
+ severity,
55
55
  text,
56
56
  }: BannerProps) => (
57
57
  <Alert onClose={onClose} role={role} severity={severity} variant="banner">
package/src/Button.tsx ADDED
@@ -0,0 +1,95 @@
1
+ /*!
2
+ * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
+ * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
+ *
5
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
+ * Unless required by applicable law or agreed to in writing, software
7
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ *
10
+ * See the License for the specific language governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { Button as MuiButton } from "@mui/material";
14
+ import type { ButtonProps as MuiButtonProps } from "@mui/material";
15
+ import { memo, ReactElement, useContext, useMemo } from "react";
16
+
17
+ import { Icon } from "./Icon";
18
+ import { MuiPropsContext } from "./MuiPropsContext";
19
+ import { Tooltip } from "./Tooltip";
20
+
21
+ export type ButtonProps = {
22
+ endIcon?: ReactElement<typeof Icon>;
23
+ id?: string;
24
+ isDisabled?: boolean;
25
+ isFullWidth?: boolean;
26
+ onClick?: MuiButtonProps["onClick"];
27
+ size?: MuiButtonProps["size"];
28
+ startIcon?: ReactElement<typeof Icon>;
29
+ text?: string;
30
+ /**
31
+ * `tooltipText` determines the text of the tooltip that wraps the button if it's icon-only.
32
+ */
33
+ tooltipText?: string;
34
+ variant?: "primary" | "secondary" | "danger" | "floating";
35
+ };
36
+
37
+ const Button = ({
38
+ endIcon,
39
+ id,
40
+ isDisabled,
41
+ isFullWidth,
42
+ onClick,
43
+ size = "medium",
44
+ startIcon,
45
+ text,
46
+ tooltipText,
47
+ variant,
48
+ }: ButtonProps) => {
49
+ const muiProps = useContext(MuiPropsContext);
50
+
51
+ const button = useMemo(
52
+ () => (
53
+ <MuiButton
54
+ {...muiProps}
55
+ disabled={isDisabled}
56
+ endIcon={endIcon}
57
+ fullWidth={isFullWidth}
58
+ id={id}
59
+ onClick={onClick}
60
+ size={size}
61
+ startIcon={startIcon}
62
+ variant={variant}
63
+ >
64
+ {text}
65
+ </MuiButton>
66
+ ),
67
+ [
68
+ endIcon,
69
+ id,
70
+ isDisabled,
71
+ isFullWidth,
72
+ muiProps,
73
+ onClick,
74
+ size,
75
+ startIcon,
76
+ text,
77
+ variant,
78
+ ]
79
+ );
80
+
81
+ return (
82
+ <>
83
+ {tooltipText && (
84
+ <Tooltip ariaType="description" placement="top" text={tooltipText}>
85
+ {button}
86
+ </Tooltip>
87
+ )}
88
+ {!tooltipText && button}
89
+ </>
90
+ );
91
+ };
92
+
93
+ const MemoizedButton = memo(Button);
94
+
95
+ export { MemoizedButton as Button };
@@ -10,16 +10,11 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { memo, ReactElement, useMemo } from "react";
13
+ import { FormGroup as MuiFormGroup } from "@mui/material";
14
+ import { memo, ReactElement, useCallback } from "react";
14
15
 
15
- import {
16
- Checkbox,
17
- FormControl,
18
- FormGroup,
19
- FormHelperText,
20
- FormLabel,
21
- ScreenReaderText,
22
- } from ".";
16
+ import { Checkbox } from "./Checkbox";
17
+ import { Field } from "./Field";
23
18
 
24
19
  export type CheckboxGroupProps = {
25
20
  children:
@@ -27,9 +22,12 @@ export type CheckboxGroupProps = {
27
22
  | Array<ReactElement<typeof Checkbox>>;
28
23
  errorMessage?: string;
29
24
  hint?: string;
25
+ /**
26
+ * The id of the `input` element. This will also be the input's `name` field.
27
+ */
28
+ id?: string;
30
29
  isDisabled?: boolean;
31
- label?: string;
32
- name?: string;
30
+ label: string;
33
31
  };
34
32
 
35
33
  const CheckboxGroup = ({
@@ -37,34 +35,29 @@ const CheckboxGroup = ({
37
35
  isDisabled,
38
36
  errorMessage,
39
37
  hint,
38
+ id: idOverride,
40
39
  label,
41
- name,
42
40
  }: CheckboxGroupProps) => {
43
- const ariaDescribedBy = useMemo(
44
- () =>
45
- errorMessage || hint
46
- ? [hint && `${name}-hint`, errorMessage && `${name}-error`]
47
- .filter(Boolean)
48
- .join(" ")
49
- : undefined,
50
- [errorMessage, hint, name]
41
+ const renderFieldComponent = useCallback(
42
+ ({ ariaDescribedBy, id }) => (
43
+ <MuiFormGroup aria-describedby={ariaDescribedBy} id={id}>
44
+ {children}
45
+ </MuiFormGroup>
46
+ ),
47
+ [children]
51
48
  );
52
49
 
53
50
  return (
54
- <FormControl
55
- component="fieldset"
56
- disabled={isDisabled}
57
- error={Boolean(errorMessage)}
58
- >
59
- {label && <FormLabel component="legend">{label}</FormLabel>}
60
- {hint && <FormHelperText id={`${name}-hint`}>{hint}</FormHelperText>}
61
- <FormGroup aria-describedby={ariaDescribedBy}>{children}</FormGroup>
62
- {errorMessage && (
63
- <FormHelperText id={`${name}-error`} error>
64
- <ScreenReaderText>Error:</ScreenReaderText> {errorMessage}
65
- </FormHelperText>
66
- )}
67
- </FormControl>
51
+ <Field
52
+ errorMessage={errorMessage}
53
+ fieldType="group"
54
+ hasVisibleLabel={false}
55
+ hint={hint}
56
+ id={idOverride}
57
+ isDisabled={isDisabled}
58
+ label={label}
59
+ renderFieldComponent={renderFieldComponent}
60
+ />
68
61
  );
69
62
  };
70
63
 
package/src/Dialog.tsx ADDED
@@ -0,0 +1,110 @@
1
+ /*!
2
+ * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
+ * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
+ *
5
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
+ * Unless required by applicable law or agreed to in writing, software
7
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ *
10
+ * See the License for the specific language governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { Dialog as MuiDialog } from "@mui/material";
14
+ import {
15
+ DialogTitle,
16
+ DialogContent,
17
+ DialogContentText,
18
+ DialogActions,
19
+ } from "@mui/material";
20
+ import { Button, CloseIcon } from "./";
21
+ import {
22
+ memo,
23
+ ReactNode,
24
+ useState,
25
+ useEffect,
26
+ useRef,
27
+ ReactElement,
28
+ } from "react";
29
+
30
+ export type DialogProps = {
31
+ callToActionPrimaryComponent?: ReactElement<typeof Button>;
32
+ callToActionSecondaryComponent?: ReactElement<typeof Button>;
33
+ callToActionTertiaryComponent?: ReactElement<typeof Button>;
34
+ children: ReactNode | Array<ReactNode>;
35
+ onClose: () => void;
36
+ isOpen: boolean;
37
+ title: string;
38
+ };
39
+
40
+ const Dialog = ({
41
+ callToActionPrimaryComponent,
42
+ callToActionSecondaryComponent,
43
+ callToActionTertiaryComponent,
44
+ children,
45
+ isOpen,
46
+ onClose,
47
+ title,
48
+ }: DialogProps) => {
49
+ const [isContentScrollable, setIsContentScrollable] = useState(false);
50
+ const dialogContentRef = useRef<HTMLDivElement>(null);
51
+
52
+ useEffect(() => {
53
+ let frameId: number;
54
+
55
+ const handleContentScroll = () => {
56
+ const dialogContentElement = dialogContentRef.current;
57
+ if (dialogContentElement) {
58
+ setIsContentScrollable(
59
+ dialogContentElement.scrollHeight > dialogContentElement.clientHeight
60
+ );
61
+ }
62
+ frameId = requestAnimationFrame(handleContentScroll);
63
+ };
64
+
65
+ if (isOpen) {
66
+ frameId = requestAnimationFrame(handleContentScroll);
67
+ }
68
+
69
+ return () => {
70
+ cancelAnimationFrame(frameId);
71
+ };
72
+ }, [isOpen]);
73
+
74
+ const content =
75
+ typeof children === "string" ? (
76
+ <DialogContentText>{children}</DialogContentText>
77
+ ) : (
78
+ children
79
+ );
80
+
81
+ return (
82
+ <MuiDialog open={isOpen} onClose={onClose}>
83
+ <DialogTitle>
84
+ {title}
85
+ <Button
86
+ variant="floating"
87
+ onClick={onClose}
88
+ startIcon={<CloseIcon />}
89
+ />
90
+ </DialogTitle>
91
+ <DialogContent dividers={isContentScrollable} ref={dialogContentRef}>
92
+ {content}
93
+ </DialogContent>
94
+
95
+ {(callToActionPrimaryComponent ||
96
+ callToActionSecondaryComponent ||
97
+ callToActionTertiaryComponent) && (
98
+ <DialogActions>
99
+ {callToActionTertiaryComponent}
100
+ {callToActionSecondaryComponent}
101
+ {callToActionPrimaryComponent}
102
+ </DialogActions>
103
+ )}
104
+ </MuiDialog>
105
+ );
106
+ };
107
+
108
+ const MemoizedDialog = memo(Dialog);
109
+
110
+ export { MemoizedDialog as Dialog };
package/src/Field.tsx ADDED
@@ -0,0 +1,135 @@
1
+ /*!
2
+ * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
+ * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
+ *
5
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
+ * Unless required by applicable law or agreed to in writing, software
7
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ *
10
+ * See the License for the specific language governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { memo, ReactElement, useMemo } from "react";
14
+
15
+ import {
16
+ FormControl as MuiFormControl,
17
+ FormLabel as MuiFormLabel,
18
+ } from "@mui/material";
19
+ import { FieldError } from "./FieldError";
20
+ import { FieldHint } from "./FieldHint";
21
+ import { FieldLabel } from "./FieldLabel";
22
+ import { useUniqueId } from "./useUniqueId";
23
+
24
+ export type FieldProps = {
25
+ /**
26
+ * If `error` is not undefined, the `input` will indicate an error.
27
+ */
28
+ errorMessage?: string;
29
+ /**
30
+ * The field type determines how ARIA components are setup. It's important to use this to denote if you expect only one component (like a text field) or multiple (like a radio group).
31
+ */
32
+ fieldType: "single" | "group";
33
+ hasVisibleLabel: boolean;
34
+ /**
35
+ * The helper text content.
36
+ */
37
+ hint?: string;
38
+ /**
39
+ * The id of the `input` element.
40
+ */
41
+ id?: string;
42
+ /**
43
+ * Important for narrowing down the `fieldset` role to "radiogroup".
44
+ */
45
+ isRadioGroup?: boolean;
46
+ /**
47
+ * If `true`, the component is disabled.
48
+ */
49
+ isDisabled?: boolean;
50
+ /**
51
+ * If `true`, the `input` element is not required.
52
+ */
53
+ isOptional?: boolean;
54
+ /**
55
+ * The label for the `input` element.
56
+ */
57
+ label: string;
58
+ /**
59
+ * The label for the `input` element if the it's not optional
60
+ */
61
+ optionalLabel?: string;
62
+ /**
63
+ * The short hint displayed in the `input` before the user enters a value.
64
+ */
65
+ placeholder?: string;
66
+ /**
67
+ * Render-props function that sends back ARIA props to your field component.
68
+ */
69
+ renderFieldComponent: ({
70
+ ariaDescribedBy,
71
+ id,
72
+ }: {
73
+ ariaDescribedBy?: string;
74
+ id: string;
75
+ }) => ReactElement;
76
+ };
77
+
78
+ const Field = ({
79
+ errorMessage,
80
+ fieldType,
81
+ hasVisibleLabel,
82
+ hint,
83
+ id: idOverride,
84
+ isDisabled = false,
85
+ isRadioGroup = false,
86
+ isOptional = false,
87
+ label,
88
+ optionalLabel,
89
+ renderFieldComponent,
90
+ }: FieldProps) => {
91
+ const id = useUniqueId(idOverride);
92
+ const hintId = hint ? `${id}-hint` : undefined;
93
+ const errorId = errorMessage ? `${id}-error` : undefined;
94
+ const labelId = `${id}-label`;
95
+
96
+ const ariaDescribedBy = useMemo(
97
+ () => [hintId, errorId].join(" ").trim() || undefined,
98
+ [errorId, hintId]
99
+ );
100
+
101
+ return (
102
+ <MuiFormControl
103
+ component={fieldType === "group" ? "fieldset" : "div"}
104
+ disabled={isDisabled}
105
+ error={Boolean(errorMessage)}
106
+ role={isRadioGroup ? "radiogroup" : undefined}
107
+ >
108
+ {fieldType === "group" ? (
109
+ <MuiFormLabel component="legend">{label}</MuiFormLabel>
110
+ ) : (
111
+ <FieldLabel
112
+ hasVisibleLabel={hasVisibleLabel}
113
+ id={labelId}
114
+ inputId={id}
115
+ isOptional={isOptional}
116
+ optionalText={optionalLabel}
117
+ text={label}
118
+ />
119
+ )}
120
+
121
+ {hint && <FieldHint id={hintId} text={hint} />}
122
+
123
+ {renderFieldComponent({
124
+ ariaDescribedBy,
125
+ id,
126
+ })}
127
+
128
+ {errorMessage && <FieldError id={errorId} text={errorMessage} />}
129
+ </MuiFormControl>
130
+ );
131
+ };
132
+
133
+ const MemoizedField = memo(Field);
134
+
135
+ export { MemoizedField as Field };
@@ -0,0 +1,34 @@
1
+ /*!
2
+ * Copyright (c) 2023-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
+ * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
+ *
5
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
+ * Unless required by applicable law or agreed to in writing, software
7
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ *
10
+ * See the License for the specific language governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { memo } from "react";
14
+
15
+ import { FormHelperText } from ".";
16
+ import { ScreenReaderText } from "./ScreenReaderText";
17
+
18
+ export type FieldErrorProps = {
19
+ id?: string;
20
+ text: string;
21
+ };
22
+
23
+ const FieldError = ({ id, text }: FieldErrorProps) => {
24
+ return (
25
+ <FormHelperText error id={id}>
26
+ <ScreenReaderText>Error:</ScreenReaderText>
27
+ {text}
28
+ </FormHelperText>
29
+ );
30
+ };
31
+
32
+ const MemoizedFieldError = memo(FieldError);
33
+
34
+ export { MemoizedFieldError as FieldError };