@okta/odyssey-react-mui 1.28.1 → 1.29.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 (326) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/dist/Breadcrumbs.js +1 -0
  3. package/dist/Breadcrumbs.js.map +1 -1
  4. package/dist/Buttons/MenuItem.js +1 -0
  5. package/dist/Buttons/MenuItem.js.map +1 -1
  6. package/dist/Checkbox.js +62 -35
  7. package/dist/Checkbox.js.map +1 -1
  8. package/dist/DataTable/reorderDataRowsLocally.js.map +1 -1
  9. package/dist/DataTable/useRowReordering.js.map +1 -1
  10. package/dist/HtmlProps.js.map +1 -1
  11. package/dist/Pagination/Pagination.js +2 -1
  12. package/dist/Pagination/Pagination.js.map +1 -1
  13. package/dist/Radio.js +65 -38
  14. package/dist/Radio.js.map +1 -1
  15. package/dist/Typography.js +20 -0
  16. package/dist/Typography.js.map +1 -1
  17. package/dist/index.scss +1 -1
  18. package/dist/labs/DataFilters.js +9 -5
  19. package/dist/labs/DataFilters.js.map +1 -1
  20. package/dist/labs/DataTable.js +7 -7
  21. package/dist/labs/DataTable.js.map +1 -1
  22. package/dist/labs/DataView/BulkActionsMenu.js.map +1 -1
  23. package/dist/labs/DataView/CardLayoutContent.js +6 -5
  24. package/dist/labs/DataView/CardLayoutContent.js.map +1 -1
  25. package/dist/labs/DataView/DataCard.js +1 -0
  26. package/dist/labs/DataView/DataCard.js.map +1 -1
  27. package/dist/labs/DataView/DataTable.js.map +1 -1
  28. package/dist/labs/DataView/DataView.js +2 -2
  29. package/dist/labs/DataView/DataView.js.map +1 -1
  30. package/dist/labs/DataView/DetailPanel.js.map +1 -1
  31. package/dist/labs/DataView/RowActions.js.map +1 -1
  32. package/dist/labs/DataView/TableLayoutContent.js +1 -1
  33. package/dist/labs/DataView/TableLayoutContent.js.map +1 -1
  34. package/dist/labs/DataView/TableSettings.js.map +1 -1
  35. package/dist/labs/DataView/componentTypes.js.map +1 -1
  36. package/dist/labs/DataView/dataTypes.js.map +1 -1
  37. package/dist/labs/DataView/fetchData.js.map +1 -1
  38. package/dist/labs/DataView/testSupportData.js +201 -0
  39. package/dist/labs/DataView/testSupportData.js.map +1 -0
  40. package/dist/labs/DataView/useFilterConversion.js.map +1 -1
  41. package/dist/labs/{DateField.js → DatePickers/DateField.js} +1 -1
  42. package/dist/labs/DatePickers/DateField.js.map +1 -0
  43. package/dist/labs/DatePickers/DateFieldActionBar.js +56 -0
  44. package/dist/labs/DatePickers/DateFieldActionBar.js.map +1 -0
  45. package/dist/labs/DatePickers/DateFieldLocalizationProvider.js +32 -0
  46. package/dist/labs/DatePickers/DateFieldLocalizationProvider.js.map +1 -0
  47. package/dist/labs/{DatePicker.js → DatePickers/DatePicker.js} +30 -73
  48. package/dist/labs/DatePickers/DatePicker.js.map +1 -0
  49. package/dist/labs/DatePickers/DatePicker.types.d.js.map +1 -0
  50. package/dist/labs/DatePickers/DateTimeField.js +166 -0
  51. package/dist/labs/DatePickers/DateTimeField.js.map +1 -0
  52. package/dist/labs/DatePickers/DateTimePicker.js +233 -0
  53. package/dist/labs/DatePickers/DateTimePicker.js.map +1 -0
  54. package/dist/labs/{datePickerTheme.js → DatePickers/datePickerTheme.js} +2 -2
  55. package/dist/labs/DatePickers/datePickerTheme.js.map +1 -0
  56. package/dist/labs/DatePickers/dateTimePickerTheme.js +230 -0
  57. package/dist/labs/DatePickers/dateTimePickerTheme.js.map +1 -0
  58. package/dist/labs/DatePickers/index.js +15 -0
  59. package/dist/labs/DatePickers/index.js.map +1 -0
  60. package/dist/labs/DatePickers/useDateFieldsTranslations.js.map +1 -0
  61. package/dist/labs/{useOdysseyDateFields.js → DatePickers/useOdysseyDateFields.js} +36 -3
  62. package/dist/labs/DatePickers/useOdysseyDateFields.js.map +1 -0
  63. package/dist/labs/PageTemplate.js +1 -1
  64. package/dist/labs/PageTemplate.js.map +1 -1
  65. package/dist/labs/SideNav/SideNav.js +40 -34
  66. package/dist/labs/SideNav/SideNav.js.map +1 -1
  67. package/dist/labs/SideNav/SideNavHeader.js +6 -4
  68. package/dist/labs/SideNav/SideNavHeader.js.map +1 -1
  69. package/dist/labs/SideNav/SideNavItemContent.js +11 -11
  70. package/dist/labs/SideNav/SideNavItemContent.js.map +1 -1
  71. package/dist/labs/SideNav/SideNavToggleButton.js +1 -1
  72. package/dist/labs/SideNav/SideNavToggleButton.js.map +1 -1
  73. package/dist/labs/SideNav/types.js.map +1 -1
  74. package/dist/labs/TimeZonePicker.js.map +1 -1
  75. package/dist/labs/index.js +1 -3
  76. package/dist/labs/index.js.map +1 -1
  77. package/dist/properties/ts/odyssey-react-mui.js +2 -0
  78. package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
  79. package/dist/src/Breadcrumbs.d.ts.map +1 -1
  80. package/dist/src/Buttons/MenuItem.d.ts.map +1 -1
  81. package/dist/src/Checkbox.d.ts.map +1 -1
  82. package/dist/src/DataTable/reorderDataRowsLocally.d.ts +3 -3
  83. package/dist/src/DataTable/reorderDataRowsLocally.d.ts.map +1 -1
  84. package/dist/src/DataTable/useRowReordering.d.ts +10 -10
  85. package/dist/src/DataTable/useRowReordering.d.ts.map +1 -1
  86. package/dist/src/HtmlProps.d.ts +27 -0
  87. package/dist/src/HtmlProps.d.ts.map +1 -1
  88. package/dist/src/OdysseyTranslationProvider.d.ts +1 -1
  89. package/dist/src/OdysseyTranslationProvider.d.ts.map +1 -1
  90. package/dist/src/Radio.d.ts +1 -1
  91. package/dist/src/Radio.d.ts.map +1 -1
  92. package/dist/src/Typography.d.ts +11 -11
  93. package/dist/src/Typography.d.ts.map +1 -1
  94. package/dist/src/labs/DataFilters.d.ts.map +1 -1
  95. package/dist/src/labs/DataTable.d.ts +11 -11
  96. package/dist/src/labs/DataTable.d.ts.map +1 -1
  97. package/dist/src/labs/DataView/BulkActionsMenu.d.ts +3 -3
  98. package/dist/src/labs/DataView/BulkActionsMenu.d.ts.map +1 -1
  99. package/dist/src/labs/DataView/CardLayoutContent.d.ts +18 -15
  100. package/dist/src/labs/DataView/CardLayoutContent.d.ts.map +1 -1
  101. package/dist/src/labs/DataView/DataCard.d.ts +7 -4
  102. package/dist/src/labs/DataView/DataCard.d.ts.map +1 -1
  103. package/dist/src/labs/DataView/DataTable.d.ts +6 -2
  104. package/dist/src/labs/DataView/DataTable.d.ts.map +1 -1
  105. package/dist/src/labs/DataView/DataView.d.ts +6 -2
  106. package/dist/src/labs/DataView/DataView.d.ts.map +1 -1
  107. package/dist/src/labs/DataView/DetailPanel.d.ts +5 -5
  108. package/dist/src/labs/DataView/DetailPanel.d.ts.map +1 -1
  109. package/dist/src/labs/DataView/RowActions.d.ts +3 -3
  110. package/dist/src/labs/DataView/RowActions.d.ts.map +1 -1
  111. package/dist/src/labs/DataView/TableLayoutContent.d.ts +18 -15
  112. package/dist/src/labs/DataView/TableLayoutContent.d.ts.map +1 -1
  113. package/dist/src/labs/DataView/TableSettings.d.ts +7 -3
  114. package/dist/src/labs/DataView/TableSettings.d.ts.map +1 -1
  115. package/dist/src/labs/DataView/componentTypes.d.ts +17 -17
  116. package/dist/src/labs/DataView/componentTypes.d.ts.map +1 -1
  117. package/dist/src/labs/DataView/dataTypes.d.ts +6 -6
  118. package/dist/src/labs/DataView/dataTypes.d.ts.map +1 -1
  119. package/dist/src/labs/DataView/fetchData.d.ts +6 -6
  120. package/dist/src/labs/DataView/fetchData.d.ts.map +1 -1
  121. package/dist/src/labs/DataView/testSupportData.d.ts +33 -0
  122. package/dist/src/labs/DataView/testSupportData.d.ts.map +1 -0
  123. package/dist/src/labs/DataView/useFilterConversion.d.ts +5 -4
  124. package/dist/src/labs/DataView/useFilterConversion.d.ts.map +1 -1
  125. package/dist/src/labs/{DateField.d.ts → DatePickers/DateField.d.ts} +1 -1
  126. package/dist/src/labs/DatePickers/DateField.d.ts.map +1 -0
  127. package/dist/src/labs/DatePickers/DateFieldActionBar.d.ts +15 -0
  128. package/dist/src/labs/DatePickers/DateFieldActionBar.d.ts.map +1 -0
  129. package/dist/src/labs/DatePickers/DateFieldLocalizationProvider.d.ts +20 -0
  130. package/dist/src/labs/DatePickers/DateFieldLocalizationProvider.d.ts.map +1 -0
  131. package/dist/src/labs/DatePickers/DatePicker.d.ts +17 -0
  132. package/dist/src/labs/DatePickers/DatePicker.d.ts.map +1 -0
  133. package/dist/src/labs/DatePickers/DateTimeField.d.ts +20 -0
  134. package/dist/src/labs/DatePickers/DateTimeField.d.ts.map +1 -0
  135. package/dist/src/labs/DatePickers/DateTimePicker.d.ts +17 -0
  136. package/dist/src/labs/DatePickers/DateTimePicker.d.ts.map +1 -0
  137. package/dist/src/labs/DatePickers/datePickerTheme.d.ts +22 -0
  138. package/dist/src/labs/DatePickers/datePickerTheme.d.ts.map +1 -0
  139. package/dist/src/labs/{datePickerTheme.d.ts → DatePickers/dateTimePickerTheme.d.ts} +2 -2
  140. package/dist/src/labs/DatePickers/dateTimePickerTheme.d.ts.map +1 -0
  141. package/dist/src/labs/DatePickers/index.d.ts +15 -0
  142. package/dist/src/labs/DatePickers/index.d.ts.map +1 -0
  143. package/dist/src/labs/DatePickers/useDateFieldsTranslations.d.ts.map +1 -0
  144. package/dist/src/labs/{useOdysseyDateFields.d.ts → DatePickers/useOdysseyDateFields.d.ts} +49 -6
  145. package/dist/src/labs/DatePickers/useOdysseyDateFields.d.ts.map +1 -0
  146. package/dist/src/labs/SideNav/SideNav.d.ts.map +1 -1
  147. package/dist/src/labs/SideNav/SideNavHeader.d.ts.map +1 -1
  148. package/dist/src/labs/SideNav/SideNavItemContent.d.ts +1 -1
  149. package/dist/src/labs/SideNav/SideNavItemContent.d.ts.map +1 -1
  150. package/dist/src/labs/SideNav/types.d.ts +2 -2
  151. package/dist/src/labs/SideNav/types.d.ts.map +1 -1
  152. package/dist/src/labs/TimeZonePicker.d.ts +4 -1
  153. package/dist/src/labs/TimeZonePicker.d.ts.map +1 -1
  154. package/dist/src/labs/index.d.ts +1 -3
  155. package/dist/src/labs/index.d.ts.map +1 -1
  156. package/dist/src/properties/ts/odyssey-react-mui.d.ts +2 -0
  157. package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
  158. package/dist/src/theme/components.d.ts.map +1 -1
  159. package/dist/src/theme/mixins.d.ts.map +1 -1
  160. package/dist/src/theme/mixins.types.d.ts +2 -0
  161. package/dist/src/theme/mixins.types.d.ts.map +1 -1
  162. package/dist/src/{labs → ui-shell}/UiShell/UiShell.d.ts +2 -2
  163. package/dist/src/ui-shell/UiShell/UiShell.d.ts.map +1 -0
  164. package/dist/src/{labs → ui-shell}/UiShell/UiShellContent.d.ts +12 -8
  165. package/dist/src/ui-shell/UiShell/UiShellContent.d.ts.map +1 -0
  166. package/dist/src/ui-shell/UiShell/bufferLatest.d.ts.map +1 -0
  167. package/dist/src/ui-shell/UiShell/createMessageBus.d.ts.map +1 -0
  168. package/dist/src/ui-shell/UiShell/createStore.d.ts.map +1 -0
  169. package/dist/src/ui-shell/UiShell/index.d.ts.map +1 -0
  170. package/dist/src/{labs → ui-shell}/UiShell/renderUiShell.d.ts +3 -4
  171. package/dist/src/ui-shell/UiShell/renderUiShell.d.ts.map +1 -0
  172. package/dist/src/{labs → ui-shell}/UiShell/useHasUiShell.d.ts +1 -0
  173. package/dist/src/ui-shell/UiShell/useHasUiShell.d.ts.map +1 -0
  174. package/dist/src/ui-shell/UiShell/useScrollState.d.ts.map +1 -0
  175. package/dist/src/ui-shell/index.d.ts +14 -0
  176. package/dist/src/ui-shell/index.d.ts.map +1 -0
  177. package/dist/src/{web-component → ui-shell}/renderReactInWebComponent.d.ts +3 -23
  178. package/dist/src/ui-shell/renderReactInWebComponent.d.ts.map +1 -0
  179. package/dist/src/web-component/index.d.ts +0 -1
  180. package/dist/src/web-component/index.d.ts.map +1 -1
  181. package/dist/src/web-component/shadow-dom.d.ts +23 -2
  182. package/dist/src/web-component/shadow-dom.d.ts.map +1 -1
  183. package/dist/theme/components.js +38 -4
  184. package/dist/theme/components.js.map +1 -1
  185. package/dist/theme/mixins.js +2 -1
  186. package/dist/theme/mixins.js.map +1 -1
  187. package/dist/theme/mixins.types.js.map +1 -1
  188. package/dist/tsconfig.production.tsbuildinfo +1 -1
  189. package/dist/{labs → ui-shell}/UiShell/UiShell.js +2 -0
  190. package/dist/ui-shell/UiShell/UiShell.js.map +1 -0
  191. package/dist/{labs → ui-shell}/UiShell/UiShellContent.js +19 -11
  192. package/dist/ui-shell/UiShell/UiShellContent.js.map +1 -0
  193. package/dist/ui-shell/UiShell/bufferLatest.js.map +1 -0
  194. package/dist/ui-shell/UiShell/createMessageBus.js.map +1 -0
  195. package/dist/ui-shell/UiShell/createStore.js.map +1 -0
  196. package/dist/ui-shell/UiShell/index.js.map +1 -0
  197. package/dist/{labs → ui-shell}/UiShell/renderUiShell.js +4 -2
  198. package/dist/ui-shell/UiShell/renderUiShell.js.map +1 -0
  199. package/dist/{labs → ui-shell}/UiShell/useHasUiShell.js +1 -1
  200. package/dist/ui-shell/UiShell/useHasUiShell.js.map +1 -0
  201. package/dist/ui-shell/UiShell/useScrollState.js.map +1 -0
  202. package/dist/ui-shell/index.js +14 -0
  203. package/dist/ui-shell/index.js.map +1 -0
  204. package/dist/{web-component → ui-shell}/renderReactInWebComponent.js +7 -17
  205. package/dist/ui-shell/renderReactInWebComponent.js.map +1 -0
  206. package/dist/web-component/index.js +0 -1
  207. package/dist/web-component/index.js.map +1 -1
  208. package/dist/web-component/shadow-dom.js +12 -2
  209. package/dist/web-component/shadow-dom.js.map +1 -1
  210. package/package.json +10 -3
  211. package/src/Breadcrumbs.tsx +5 -1
  212. package/src/Buttons/MenuItem.tsx +1 -0
  213. package/src/Checkbox.tsx +86 -44
  214. package/src/DataTable/reorderDataRowsLocally.tsx +3 -3
  215. package/src/DataTable/useRowReordering.tsx +16 -23
  216. package/src/HtmlProps.ts +27 -0
  217. package/src/Pagination/Pagination.tsx +2 -2
  218. package/src/Radio.tsx +78 -39
  219. package/src/Typography.tsx +26 -1
  220. package/src/labs/DataFilters.tsx +7 -3
  221. package/src/labs/DataTable.tsx +41 -33
  222. package/src/labs/DataView/BulkActionsMenu.tsx +4 -4
  223. package/src/labs/DataView/CardLayoutContent.tsx +34 -28
  224. package/src/labs/DataView/DataCard.tsx +13 -6
  225. package/src/labs/DataView/DataTable.tsx +11 -4
  226. package/src/labs/DataView/DataView.test.tsx +1012 -87
  227. package/src/labs/DataView/DataView.tsx +18 -11
  228. package/src/labs/DataView/DetailPanel.tsx +4 -4
  229. package/src/labs/DataView/RowActions.tsx +4 -4
  230. package/src/labs/DataView/TableLayoutContent.tsx +30 -24
  231. package/src/labs/DataView/TableSettings.tsx +12 -6
  232. package/src/labs/DataView/componentTypes.ts +17 -17
  233. package/src/labs/DataView/dataTypes.ts +14 -8
  234. package/src/labs/DataView/fetchData.ts +9 -7
  235. package/src/labs/DataView/testSupportData.tsx +301 -0
  236. package/src/labs/DataView/useFilterConversion.ts +8 -8
  237. package/src/labs/{DateField.tsx → DatePickers/DateField.tsx} +2 -2
  238. package/src/labs/DatePickers/DateFieldActionBar.tsx +65 -0
  239. package/src/labs/DatePickers/DateFieldLocalizationProvider.tsx +46 -0
  240. package/src/labs/{DatePicker.tsx → DatePickers/DatePicker.tsx} +31 -136
  241. package/src/labs/DatePickers/DateTimeField.tsx +271 -0
  242. package/src/labs/DatePickers/DateTimePicker.test.tsx +66 -0
  243. package/src/labs/DatePickers/DateTimePicker.tsx +303 -0
  244. package/src/labs/{datePickerTheme.tsx → DatePickers/datePickerTheme.tsx} +2 -2
  245. package/src/labs/DatePickers/dateTimePickerTheme.ts +213 -0
  246. package/src/labs/DatePickers/index.ts +15 -0
  247. package/src/labs/{useOdysseyDateFields.ts → DatePickers/useOdysseyDateFields.ts} +112 -10
  248. package/src/labs/PageTemplate.tsx +1 -1
  249. package/src/labs/SideNav/SideNav.tsx +38 -39
  250. package/src/labs/SideNav/SideNavHeader.tsx +6 -4
  251. package/src/labs/SideNav/SideNavItemContent.tsx +21 -18
  252. package/src/labs/SideNav/SideNavToggleButton.tsx +1 -1
  253. package/src/labs/SideNav/types.ts +2 -2
  254. package/src/labs/TimeZonePicker.tsx +5 -1
  255. package/src/labs/index.ts +2 -3
  256. package/src/properties/odyssey-react-mui.properties +2 -0
  257. package/src/properties/ts/odyssey-react-mui.ts +1 -1
  258. package/src/theme/components.tsx +45 -4
  259. package/src/theme/mixins.ts +1 -0
  260. package/src/theme/mixins.types.ts +2 -0
  261. package/src/{labs → ui-shell}/UiShell/UiShell.tsx +3 -0
  262. package/src/{labs → ui-shell}/UiShell/UiShellContent.tsx +60 -31
  263. package/src/{labs → ui-shell}/UiShell/renderUiShell.test.tsx +16 -22
  264. package/src/{labs → ui-shell}/UiShell/renderUiShell.tsx +7 -4
  265. package/src/{labs → ui-shell}/UiShell/useHasUiShell.ts +1 -1
  266. package/src/ui-shell/index.ts +14 -0
  267. package/src/{web-component → ui-shell}/renderReactInWebComponent.test.tsx +1 -1
  268. package/src/{web-component → ui-shell}/renderReactInWebComponent.ts +9 -45
  269. package/src/web-component/index.ts +0 -1
  270. package/src/web-component/shadow-dom.ts +36 -3
  271. package/dist/labs/DateField.js.map +0 -1
  272. package/dist/labs/DatePicker.js.map +0 -1
  273. package/dist/labs/DatePicker.types.d.js.map +0 -1
  274. package/dist/labs/UiShell/UiShell.js.map +0 -1
  275. package/dist/labs/UiShell/UiShellContent.js.map +0 -1
  276. package/dist/labs/UiShell/bufferLatest.js.map +0 -1
  277. package/dist/labs/UiShell/createMessageBus.js.map +0 -1
  278. package/dist/labs/UiShell/createStore.js.map +0 -1
  279. package/dist/labs/UiShell/index.js.map +0 -1
  280. package/dist/labs/UiShell/renderUiShell.js.map +0 -1
  281. package/dist/labs/UiShell/useHasUiShell.js.map +0 -1
  282. package/dist/labs/UiShell/useScrollState.js.map +0 -1
  283. package/dist/labs/datePickerTheme.js.map +0 -1
  284. package/dist/labs/useDateFieldsTranslations.js.map +0 -1
  285. package/dist/labs/useOdysseyDateFields.js.map +0 -1
  286. package/dist/src/labs/DateField.d.ts.map +0 -1
  287. package/dist/src/labs/DatePicker.d.ts +0 -47
  288. package/dist/src/labs/DatePicker.d.ts.map +0 -1
  289. package/dist/src/labs/UiShell/UiShell.d.ts.map +0 -1
  290. package/dist/src/labs/UiShell/UiShellContent.d.ts.map +0 -1
  291. package/dist/src/labs/UiShell/bufferLatest.d.ts.map +0 -1
  292. package/dist/src/labs/UiShell/createMessageBus.d.ts.map +0 -1
  293. package/dist/src/labs/UiShell/createStore.d.ts.map +0 -1
  294. package/dist/src/labs/UiShell/index.d.ts.map +0 -1
  295. package/dist/src/labs/UiShell/renderUiShell.d.ts.map +0 -1
  296. package/dist/src/labs/UiShell/useHasUiShell.d.ts.map +0 -1
  297. package/dist/src/labs/UiShell/useScrollState.d.ts.map +0 -1
  298. package/dist/src/labs/datePickerTheme.d.ts.map +0 -1
  299. package/dist/src/labs/useDateFieldsTranslations.d.ts.map +0 -1
  300. package/dist/src/labs/useOdysseyDateFields.d.ts.map +0 -1
  301. package/dist/src/web-component/renderReactInWebComponent.d.ts.map +0 -1
  302. package/dist/web-component/renderReactInWebComponent.js.map +0 -1
  303. /package/dist/labs/{DatePicker.types.d.js → DatePickers/DatePicker.types.d.js} +0 -0
  304. /package/dist/labs/{useDateFieldsTranslations.js → DatePickers/useDateFieldsTranslations.js} +0 -0
  305. /package/dist/src/labs/{useDateFieldsTranslations.d.ts → DatePickers/useDateFieldsTranslations.d.ts} +0 -0
  306. /package/dist/src/{labs → ui-shell}/UiShell/bufferLatest.d.ts +0 -0
  307. /package/dist/src/{labs → ui-shell}/UiShell/createMessageBus.d.ts +0 -0
  308. /package/dist/src/{labs → ui-shell}/UiShell/createStore.d.ts +0 -0
  309. /package/dist/src/{labs → ui-shell}/UiShell/index.d.ts +0 -0
  310. /package/dist/src/{labs → ui-shell}/UiShell/useScrollState.d.ts +0 -0
  311. /package/dist/{labs → ui-shell}/UiShell/bufferLatest.js +0 -0
  312. /package/dist/{labs → ui-shell}/UiShell/createMessageBus.js +0 -0
  313. /package/dist/{labs → ui-shell}/UiShell/createStore.js +0 -0
  314. /package/dist/{labs → ui-shell}/UiShell/index.js +0 -0
  315. /package/dist/{labs → ui-shell}/UiShell/useScrollState.js +0 -0
  316. /package/src/labs/{DatePicker.types.d.ts → DatePickers/DatePicker.types.d.ts} +0 -0
  317. /package/src/labs/{useDateFieldsTranslations.ts → DatePickers/useDateFieldsTranslations.ts} +0 -0
  318. /package/src/{labs → ui-shell}/UiShell/UiShell.test.tsx +0 -0
  319. /package/src/{labs → ui-shell}/UiShell/bufferLatest.test.ts +0 -0
  320. /package/src/{labs → ui-shell}/UiShell/bufferLatest.ts +0 -0
  321. /package/src/{labs → ui-shell}/UiShell/createMessageBus.test.ts +0 -0
  322. /package/src/{labs → ui-shell}/UiShell/createMessageBus.ts +0 -0
  323. /package/src/{labs → ui-shell}/UiShell/createStore.test.ts +0 -0
  324. /package/src/{labs → ui-shell}/UiShell/createStore.ts +0 -0
  325. /package/src/{labs → ui-shell}/UiShell/index.ts +0 -0
  326. /package/src/{labs → ui-shell}/UiShell/useScrollState.ts +0 -0
@@ -425,7 +425,7 @@ export const components = ({
425
425
  display: "none",
426
426
  }),
427
427
  }),
428
- listbox: {
428
+ listbox: ({ theme }) => ({
429
429
  borderWidth: odysseyTokens.BorderWidthMain,
430
430
  borderStyle: odysseyTokens.BorderStyleMain,
431
431
  borderColor: odysseyTokens.HueNeutral200,
@@ -447,6 +447,15 @@ export const components = ({
447
447
  backgroundColor: odysseyTokens.HueNeutral100,
448
448
  },
449
449
 
450
+ [`&.${autocompleteClasses.focusVisible}`]: {
451
+ backgroundColor: "transparent",
452
+ boxShadow: theme.mixins.insetFocusRing,
453
+
454
+ [`&:hover`]: {
455
+ backgroundColor: odysseyTokens.HueNeutral100,
456
+ },
457
+ },
458
+
450
459
  [`&[aria-selected="true"]`]: {
451
460
  backgroundColor: "transparent",
452
461
  color: odysseyTokens.TypographyColorAction,
@@ -466,7 +475,7 @@ export const components = ({
466
475
  marginBlockStart: 0,
467
476
  marginBlockEnd: 0,
468
477
  },
469
- },
478
+ }),
470
479
  loading: {
471
480
  paddingBlock: odysseyTokens.Spacing3,
472
481
  paddingInline: odysseyTokens.Spacing4,
@@ -2184,7 +2193,7 @@ export const components = ({
2184
2193
  styleOverrides: {
2185
2194
  list: {
2186
2195
  paddingBlock: odysseyTokens.Spacing2,
2187
- paddingInline: odysseyTokens.Spacing2,
2196
+ paddingInline: `${odysseyTokens.Spacing2} !important`,
2188
2197
  borderRadius: odysseyTokens.BorderRadiusMain,
2189
2198
  },
2190
2199
  root: {
@@ -2198,7 +2207,7 @@ export const components = ({
2198
2207
  },
2199
2208
  MuiMenuItem: {
2200
2209
  styleOverrides: {
2201
- root: ({ ownerState }) => ({
2210
+ root: ({ ownerState, theme }) => ({
2202
2211
  gap: odysseyTokens.Spacing2,
2203
2212
  minHeight: "unset",
2204
2213
  maxWidth: `calc(55ch - ${odysseyTokens.Spacing4})`,
@@ -2244,6 +2253,7 @@ export const components = ({
2244
2253
  [`&.${menuItemClasses.selected}`]: {
2245
2254
  backgroundColor: "transparent",
2246
2255
  color: odysseyTokens.TypographyColorAction,
2256
+ fontWeight: odysseyTokens.TypographyWeightBodyBold,
2247
2257
 
2248
2258
  "&:hover": {
2249
2259
  backgroundColor: odysseyTokens.PalettePrimaryLighter,
@@ -2252,6 +2262,33 @@ export const components = ({
2252
2262
  backgroundColor: odysseyTokens.PalettePrimaryLighter,
2253
2263
  },
2254
2264
  },
2265
+
2266
+ [`&.${menuItemClasses.focusVisible}`]: {
2267
+ backgroundColor: odysseyTokens.PalettePrimaryLighter,
2268
+ color: odysseyTokens.TypographyColorAction,
2269
+
2270
+ "&:hover": {
2271
+ backgroundColor: odysseyTokens.PalettePrimaryLighter,
2272
+
2273
+ "@media (hover: none)": {
2274
+ backgroundColor: odysseyTokens.PalettePrimaryLighter,
2275
+ },
2276
+ },
2277
+ },
2278
+ },
2279
+
2280
+ [`&.${menuItemClasses.focusVisible}`]: {
2281
+ backgroundColor: "transparent",
2282
+ boxShadow: theme.mixins.insetFocusRing,
2283
+
2284
+ "&:hover": {
2285
+ backgroundColor: odysseyTokens.HueNeutral100,
2286
+
2287
+ // Reset on touch devices, it doesn't add specificity
2288
+ "@media (hover: none)": {
2289
+ backgroundColor: "transparent",
2290
+ },
2291
+ },
2255
2292
  },
2256
2293
 
2257
2294
  "&[data-empty='true']": {
@@ -2269,6 +2306,10 @@ export const components = ({
2269
2306
  borderBlockEnd: `1px solid ${odysseyTokens.BorderColorDisplay}`,
2270
2307
  }),
2271
2308
 
2309
+ ...(!ownerState.isFullWidth && {
2310
+ maxWidth: "100%",
2311
+ }),
2312
+
2272
2313
  [`&.${menuItemClasses.disabled}`]: {
2273
2314
  opacity: 1,
2274
2315
  color: odysseyTokens.TypographyColorDisabled,
@@ -24,5 +24,6 @@ export const mixins = ({
24
24
  borderRadius: odysseyTokens.BorderRadiusMain,
25
25
  borderStyle: odysseyTokens.BorderStyleMain,
26
26
  borderWidth: odysseyTokens.BorderWidthMain,
27
+ insetFocusRing: `inset 0 0 0 2px ${odysseyTokens.PalettePrimaryMain}`,
27
28
  };
28
29
  };
@@ -16,6 +16,7 @@ declare module "@mui/material/styles" {
16
16
  borderStyle?: string;
17
17
  borderWidth?: string;
18
18
  maxWidth?: string;
19
+ insetFocusRing?: string;
19
20
  }
20
21
 
21
22
  interface MixinsOptions {
@@ -23,6 +24,7 @@ declare module "@mui/material/styles" {
23
24
  borderStyle?: string;
24
25
  borderWidth?: string;
25
26
  maxWidth?: string;
27
+ insetFocusRing?: string;
26
28
  }
27
29
  }
28
30
 
@@ -50,6 +50,7 @@ export type UiShellProps = {
50
50
  UiShellContentProps,
51
51
  | "appBackgroundContrastMode"
52
52
  | "appComponent"
53
+ | "hasStandardAppContentPadding"
53
54
  | "initialVisibleSections"
54
55
  | "onError"
55
56
  | "optionalComponents"
@@ -66,6 +67,7 @@ const UiShell = ({
66
67
  appBackgroundContrastMode,
67
68
  appComponent,
68
69
  appRootElement,
70
+ hasStandardAppContentPadding,
69
71
  initialVisibleSections,
70
72
  onError = console.error,
71
73
  onSubscriptionCreated,
@@ -101,6 +103,7 @@ const UiShell = ({
101
103
  {...componentProps}
102
104
  appBackgroundContrastMode={appBackgroundContrastMode}
103
105
  appComponent={appComponent}
106
+ hasStandardAppContentPadding={hasStandardAppContentPadding}
104
107
  initialVisibleSections={initialVisibleSections}
105
108
  onError={onError}
106
109
  optionalComponents={optionalComponents}
@@ -14,9 +14,9 @@ import styled from "@emotion/styled";
14
14
  import { memo, type ReactElement, type ReactNode } from "react";
15
15
  import { ErrorBoundary, ErrorBoundaryProps } from "react-error-boundary";
16
16
 
17
- import { AppSwitcher, type AppSwitcherProps } from "../AppSwitcher";
18
- import { SideNav, type SideNavProps } from "../SideNav";
19
- import { TopNav, type TopNavProps } from "../TopNav";
17
+ import { AppSwitcher, type AppSwitcherProps } from "../../labs/AppSwitcher";
18
+ import { SideNav, type SideNavProps } from "../../labs/SideNav";
19
+ import { TopNav, type TopNavProps } from "../../labs/TopNav";
20
20
  import {
21
21
  useOdysseyDesignTokens,
22
22
  type DesignTokens,
@@ -28,21 +28,33 @@ const emptySideNavItems = [] satisfies SideNavProps["sideNavItems"];
28
28
 
29
29
  const StyledAppContainer = styled("div", {
30
30
  shouldForwardProp: (prop) =>
31
- prop !== "odysseyDesignTokens" && prop !== "appBackgroundContrastMode",
31
+ prop !== "odysseyDesignTokens" &&
32
+ prop !== "appBackgroundContrastMode" &&
33
+ prop !== "hasStandardAppContentPadding",
32
34
  })<{
33
35
  appBackgroundContrastMode: ContrastMode;
36
+ hasStandardAppContentPadding: UiShellContentProps["hasStandardAppContentPadding"];
34
37
  odysseyDesignTokens: DesignTokens;
35
- }>(({ appBackgroundContrastMode, odysseyDesignTokens }) => ({
36
- gridArea: "app-content",
37
- overflowX: "hidden",
38
- overflowY: "auto",
39
- paddingBlock: odysseyDesignTokens.Spacing5,
40
- paddingInline: odysseyDesignTokens.Spacing8,
41
- backgroundColor:
42
- appBackgroundContrastMode === "highContrast"
43
- ? odysseyDesignTokens.HueNeutralWhite
44
- : odysseyDesignTokens.HueNeutral50,
45
- }));
38
+ }>(
39
+ ({
40
+ appBackgroundContrastMode,
41
+ hasStandardAppContentPadding,
42
+ odysseyDesignTokens,
43
+ }) => ({
44
+ gridArea: "app-content",
45
+ overflowX: "hidden",
46
+ overflowY: "auto",
47
+ backgroundColor:
48
+ appBackgroundContrastMode === "highContrast"
49
+ ? odysseyDesignTokens.HueNeutralWhite
50
+ : odysseyDesignTokens.HueNeutral50,
51
+
52
+ ...(hasStandardAppContentPadding && {
53
+ paddingBlock: odysseyDesignTokens.Spacing5,
54
+ paddingInline: odysseyDesignTokens.Spacing8,
55
+ }),
56
+ }),
57
+ );
46
58
 
47
59
  const StyledBannersContainer = styled("div")(() => ({
48
60
  gridArea: "banners",
@@ -88,13 +100,16 @@ export type UiShellNavComponentProps = {
88
100
  */
89
101
  appSwitcherProps?: AppSwitcherProps;
90
102
  /**
91
- * Object that gets pass directly to the side nav component.
103
+ * Object that gets pass directly to the side nav component. If `undefined` and in `initialVisibleSections`, SideNav will be initially rendered. Pass `null` to hide a previously-visible SideNav.
92
104
  */
93
- sideNavProps?: Omit<SideNavProps, "footerComponent">;
105
+ sideNavProps?: Omit<SideNavProps, "footerComponent"> | null;
94
106
  /**
95
- * Object that gets pass directly to the top nav component.
107
+ * Object that gets pass directly to the top nav component. If `undefined` and in `initialVisibleSections`, TopNav will be initially rendered. Pass `null` to hide a previously-visible TopNav.
96
108
  */
97
- topNavProps?: Omit<TopNavProps, "leftSideComponent" | "rightSideComponent">;
109
+ topNavProps?: Omit<
110
+ TopNavProps,
111
+ "leftSideComponent" | "rightSideComponent"
112
+ > | null;
98
113
  };
99
114
 
100
115
  export type UiShellContentProps = {
@@ -106,6 +121,10 @@ export type UiShellContentProps = {
106
121
  * React app component that renders as children in the correct location of the shell.
107
122
  */
108
123
  appComponent: ReactNode;
124
+ /**
125
+ * defaults to `true`. If `false`, the content area will have no padding provided
126
+ */
127
+ hasStandardAppContentPadding?: boolean;
109
128
  /**
110
129
  * Which parts of the UI Shell should be visible initially? For example,
111
130
  * if sideNavProps is undefined, should the space for the sidenav be initially visible?
@@ -136,6 +155,7 @@ export type UiShellContentProps = {
136
155
  const UiShellContent = ({
137
156
  appBackgroundContrastMode = "lowContrast",
138
157
  appComponent,
158
+ hasStandardAppContentPadding = true,
139
159
  initialVisibleSections = ["TopNav", "SideNav", "AppSwitcher"],
140
160
  onError = console.error,
141
161
  optionalComponents,
@@ -172,11 +192,16 @@ const UiShellContent = ({
172
192
  <StyledSideNavContainer>
173
193
  {
174
194
  /* If SideNav should be initially visible and we have not yet received props, render SideNav with minimal inputs */
175
- initialVisibleSections?.includes("SideNav") && !sideNavProps && (
176
- <ErrorBoundary fallback={null} onError={onError}>
177
- <SideNav isLoading appName="" sideNavItems={emptySideNavItems} />
178
- </ErrorBoundary>
179
- )
195
+ initialVisibleSections?.includes("SideNav") &&
196
+ sideNavProps === undefined && (
197
+ <ErrorBoundary fallback={null} onError={onError}>
198
+ <SideNav
199
+ isLoading
200
+ appName=""
201
+ sideNavItems={emptySideNavItems}
202
+ />
203
+ </ErrorBoundary>
204
+ )
180
205
  }
181
206
  {sideNavProps && (
182
207
  <ErrorBoundary fallback={null} onError={onError}>
@@ -199,15 +224,18 @@ const UiShellContent = ({
199
224
  </ErrorBoundary>
200
225
  )}
201
226
  </StyledSideNavContainer>
202
-
203
227
  <StyledTopNavContainer>
204
228
  {
205
229
  /* If TopNav should be initially visible and we have not yet received props, render Topnav with minimal inputs */
206
- initialVisibleSections?.includes("TopNav") && !topNavProps && (
207
- <ErrorBoundary fallback={null} onError={onError}>
208
- <TopNav />
209
- </ErrorBoundary>
210
- )
230
+ initialVisibleSections?.includes("TopNav") &&
231
+ topNavProps === undefined && (
232
+ <ErrorBoundary fallback={null} onError={onError}>
233
+ <TopNav
234
+ leftSideComponent={optionalComponents?.topNavLeftSide}
235
+ rightSideComponent={optionalComponents?.topNavRightSide}
236
+ />
237
+ </ErrorBoundary>
238
+ )
211
239
  }
212
240
  {topNavProps && (
213
241
  <ErrorBoundary fallback={null} onError={onError}>
@@ -222,8 +250,9 @@ const UiShellContent = ({
222
250
  </StyledTopNavContainer>
223
251
 
224
252
  <StyledAppContainer
225
- odysseyDesignTokens={odysseyDesignTokens}
226
253
  appBackgroundContrastMode={appBackgroundContrastMode}
254
+ hasStandardAppContentPadding={hasStandardAppContentPadding}
255
+ odysseyDesignTokens={odysseyDesignTokens}
227
256
  ref={scrollableContentRef}
228
257
  tabIndex={0}
229
258
  >
@@ -10,13 +10,13 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { act, waitFor } from "@testing-library/react";
13
+ import { act } from "@testing-library/react";
14
14
 
15
15
  import { renderUiShell } from "./renderUiShell";
16
16
  import {
17
17
  ReactInWebComponentElement,
18
18
  reactWebComponentElementName,
19
- } from "../../web-component/renderReactInWebComponent";
19
+ } from "../renderReactInWebComponent";
20
20
 
21
21
  describe("renderUiShell", () => {
22
22
  afterEach(() => {
@@ -126,11 +126,9 @@ describe("renderUiShell", () => {
126
126
  });
127
127
  });
128
128
 
129
- await waitFor(() => {
130
- expect(
131
- rootElement.querySelector(reactWebComponentElementName)!.shadowRoot,
132
- ).toHaveTextContent(appName);
133
- });
129
+ expect(
130
+ rootElement.querySelector(reactWebComponentElementName)!.shadowRoot,
131
+ ).toHaveTextContent(appName);
134
132
  });
135
133
 
136
134
  test("renders `UiShell` with immediately updated props", async () => {
@@ -155,11 +153,9 @@ describe("renderUiShell", () => {
155
153
  });
156
154
  });
157
155
 
158
- await waitFor(() => {
159
- expect(
160
- rootElement.querySelector(reactWebComponentElementName)!.shadowRoot,
161
- ).toHaveTextContent(appName);
162
- });
156
+ expect(
157
+ rootElement.querySelector(reactWebComponentElementName)!.shadowRoot,
158
+ ).toHaveTextContent(appName);
163
159
  });
164
160
 
165
161
  test("renders `<slot>` in the event of an error", async () => {
@@ -188,16 +184,14 @@ describe("renderUiShell", () => {
188
184
  );
189
185
  });
190
186
 
191
- await waitFor(() => {
192
- expect(onError).toHaveBeenCalledTimes(1);
193
- expect(consoleError).toHaveBeenCalledTimes(1);
194
- expect(
195
- rootElement
196
- .querySelector(reactWebComponentElementName)!
197
- .shadowRoot?.querySelector("slot"),
198
- ).toBeInstanceOf(HTMLSlotElement);
199
- });
200
-
201
187
  consoleErrorSpy.mockRestore();
188
+
189
+ expect(onError).toHaveBeenCalledTimes(1);
190
+ expect(consoleError).toHaveBeenCalledTimes(1);
191
+ expect(
192
+ rootElement
193
+ .querySelector(reactWebComponentElementName)!
194
+ .shadowRoot?.querySelector("slot"),
195
+ ).toBeInstanceOf(HTMLSlotElement);
202
196
  });
203
197
  });
@@ -16,10 +16,9 @@ import { ErrorBoundary } from "react-error-boundary";
16
16
  import { bufferLatest } from "./bufferLatest";
17
17
  import { createMessageBus } from "./createMessageBus";
18
18
  import { UiShell, UiShellProps } from "./UiShell";
19
- import { renderReactInWebComponent } from "../../web-component/renderReactInWebComponent";
19
+ import { renderReactInWebComponent } from "../renderReactInWebComponent";
20
20
  import { type UiShellNavComponentProps } from "./UiShellContent";
21
-
22
- export const uiShellDataAttribute = "data-unified-ui-shell";
21
+ import { uiShellDataAttribute } from "./useHasUiShell";
23
22
 
24
23
  export const optionalComponentSlotNames: Record<
25
24
  keyof Required<UiShellProps>["optionalComponents"],
@@ -43,6 +42,7 @@ export const optionalComponentSlotNames: Record<
43
42
  export const renderUiShell = ({
44
43
  appBackgroundContrastMode,
45
44
  appRootElement: explicitAppRootElement,
45
+ hasStandardAppContentPadding,
46
46
  initialVisibleSections,
47
47
  onError = console.error,
48
48
  uiShellRootElement,
@@ -61,7 +61,9 @@ export const renderUiShell = ({
61
61
  uiShellRootElement: HTMLElement;
62
62
  } & Pick<
63
63
  UiShellProps,
64
- "appBackgroundContrastMode" | "initialVisibleSections"
64
+ | "appBackgroundContrastMode"
65
+ | "hasStandardAppContentPadding"
66
+ | "initialVisibleSections"
65
67
  >) => {
66
68
  const appRootElement =
67
69
  explicitAppRootElement || document.createElement("div");
@@ -109,6 +111,7 @@ export const renderUiShell = ({
109
111
  appBackgroundContrastMode={appBackgroundContrastMode}
110
112
  appComponent={appComponent}
111
113
  appRootElement={reactRootElements.appRootElement}
114
+ hasStandardAppContentPadding={hasStandardAppContentPadding}
112
115
  initialVisibleSections={initialVisibleSections}
113
116
  onError={onError}
114
117
  onSubscriptionCreated={publishSubscriptionCreated}
@@ -12,7 +12,7 @@
12
12
 
13
13
  import { useEffect, useState } from "react";
14
14
 
15
- import { uiShellDataAttribute } from "./renderUiShell";
15
+ export const uiShellDataAttribute = "data-unified-ui-shell";
16
16
 
17
17
  export const useHasUiShell = () => {
18
18
  const [hasUiShell, setHasUiShell] = useState(false);
@@ -0,0 +1,14 @@
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
+ export * from "./UiShell";
14
+ export * from "./renderReactInWebComponent";
@@ -12,8 +12,8 @@
12
12
 
13
13
  import { waitFor } from "@testing-library/dom";
14
14
 
15
+ import { createReactRootElements } from "../web-component";
15
16
  import {
16
- createReactRootElements,
17
17
  ReactInWebComponentElement,
18
18
  reactWebComponentElementName,
19
19
  renderReactInWebComponent,
@@ -11,42 +11,11 @@
11
11
  */
12
12
 
13
13
  import { type ReactNode } from "react";
14
- import type { Root } from "react-dom/client";
15
-
16
- /**
17
- * Creates elements for a Shadow DOM that Odyssey will render into.
18
- * The Emotion root is for `<style>` tags and the app root is for an app to render into.
19
- * These are bare elements that
20
- */
21
- export const createReactRootElements = () => {
22
- const appRootElement = document.createElement("div");
23
- const stylesRootElement = document.createElement("div");
24
-
25
- // This `div` may cause layout issues unless it inherits the parent's height.
26
- appRootElement.style.setProperty("height", "inherit");
27
-
28
- appRootElement.setAttribute("id", "app-root");
29
- stylesRootElement.setAttribute("id", "style-root");
30
- stylesRootElement.setAttribute("nonce", window.cspNonce);
31
-
32
- return {
33
- /**
34
- * The element your React root component renders into.
35
- * React has to render or portal somewhere, and this element can be used for that root element.
36
- *
37
- * In the case of a web component, there is no defined root element, so you have to define it yourself.
38
- */
39
- appRootElement,
40
- /**
41
- * In React apps, your styles typically go in `document.head`, but you may want to render them somewhere else.
42
- *
43
- * Specifically when rendering in a web component, there is no `<head>`, so you have to create a spot for styles to render.
44
- */
45
- stylesRootElement,
46
- };
47
- };
48
-
49
- export type ReactRootElements = ReturnType<typeof createReactRootElements>;
14
+ import { createRoot, type Root } from "react-dom/client";
15
+ import {
16
+ createReactRootElements,
17
+ type ReactRootElements,
18
+ } from "../web-component";
50
19
 
51
20
  export const reactWebComponentElementName = "odyssey-react-web-component";
52
21
 
@@ -56,8 +25,8 @@ export type GetReactComponentInWebComponent = (
56
25
 
57
26
  export class ReactInWebComponentElement extends HTMLElement {
58
27
  getReactComponent: GetReactComponentInWebComponent;
28
+ reactRoot: Root;
59
29
  reactRootElements: ReactRootElements;
60
- reactRootPromise: Promise<Root>;
61
30
 
62
31
  constructor(getReactComponent: GetReactComponentInWebComponent) {
63
32
  super();
@@ -81,20 +50,15 @@ export class ReactInWebComponentElement extends HTMLElement {
81
50
  shadowRoot.appendChild(this.reactRootElements.stylesRootElement);
82
51
  shadowRoot.appendChild(this.reactRootElements.appRootElement);
83
52
 
84
- // If we want to support React v17 in the future, we can use a try-catch on the import to grab the old `ReactDOM.render` function if `react-dom/client` errors. --Kevin Ghadyani
85
- this.reactRootPromise = import("react-dom/client").then(({ createRoot }) =>
86
- createRoot(this.reactRootElements.appRootElement),
87
- );
53
+ this.reactRoot = createRoot(this.reactRootElements.appRootElement);
88
54
  }
89
55
 
90
56
  connectedCallback() {
91
- this.reactRootPromise.then((reactRoot) =>
92
- reactRoot.render(this.getReactComponent(this.reactRootElements)),
93
- );
57
+ this.reactRoot.render(this.getReactComponent(this.reactRootElements));
94
58
  }
95
59
 
96
60
  disconnectedCallback() {
97
- this.reactRootPromise.then((reactRoot) => reactRoot.unmount());
61
+ this.reactRoot.unmount();
98
62
  }
99
63
  }
100
64
 
@@ -10,5 +10,4 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- export * from "./renderReactInWebComponent";
14
13
  export * from "./shadow-dom";
@@ -10,10 +10,43 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import { createReactRootElements } from "./renderReactInWebComponent";
13
+ /**
14
+ * Creates elements for a Shadow DOM that Odyssey will render into.
15
+ * The Emotion root is for `<style>` tags and the app root is for an app to render into.
16
+ * These are bare elements that
17
+ */
18
+ export const createReactRootElements = () => {
19
+ const appRootElement = document.createElement("div");
20
+ const stylesRootElement = document.createElement("div");
21
+
22
+ // This `div` may cause layout issues unless it inherits the parent's height.
23
+ appRootElement.style.setProperty("height", "inherit");
24
+
25
+ appRootElement.setAttribute("id", "app-root");
26
+ stylesRootElement.setAttribute("id", "style-root");
27
+ stylesRootElement.setAttribute("nonce", window.cspNonce);
28
+
29
+ return {
30
+ /**
31
+ * The element your React root component renders into.
32
+ * React has to render or portal somewhere, and this element can be used for that root element.
33
+ *
34
+ * In the case of a web component, there is no defined root element, so you have to define it yourself.
35
+ */
36
+ appRootElement,
37
+ /**
38
+ * In React apps, your styles typically go in `document.head`, but you may want to render them somewhere else.
39
+ *
40
+ * Specifically when rendering in a web component, there is no `<head>`, so you have to create a spot for styles to render.
41
+ */
42
+ stylesRootElement,
43
+ };
44
+ };
45
+
46
+ export type ReactRootElements = ReturnType<typeof createReactRootElements>;
14
47
 
15
48
  /**
16
- * @deprecated Use `renderReactInWebComponent` instead. This function was necessary when using bare Shadow DOM, but with UI Shell rendering in a Web Component, you won't be able to render your Shadow DOM in its Shadow DOM without using a Web Component.
49
+ * @deprecated Use `renderReactInWebComponent` from `@okta/odyssey-react-mui/ui-shell` instead. This function was necessary when using bare Shadow DOM, but with UI Shell rendering in a Web Component, you won't be able to render your Shadow DOM in its Shadow DOM without using a Web Component.
17
50
  */
18
51
  export const createShadowDomElements = (containerElement: HTMLElement) => {
19
52
  const shadowRoot = containerElement.attachShadow({ mode: "open" });
@@ -32,7 +65,7 @@ export const createShadowDomElements = (containerElement: HTMLElement) => {
32
65
 
33
66
  /**
34
67
  * @deprecated Use `createShadowDomElements` instead which returns an object instead of an array. It's otherwise the same.
35
- * @deprecated Ideally, use `renderReactInWebComponent` instead. This function was necessary when using bare Shadow DOM, but with UI Shell rendering in a Web Component, you won't be able to render your Shadow DOM in its Shadow DOM without using a Web Component. */
68
+ * @deprecated Ideally, use `renderReactInWebComponent` from `@okta/odyssey-react-mui/ui-shell` instead. This function was necessary when using bare Shadow DOM, but with UI Shell rendering in a Web Component, you won't be able to render your Shadow DOM in its Shadow DOM without using a Web Component. */
36
69
  export const createShadowRootElement = (
37
70
  containerElement: HTMLElement,
38
71
  ): [HTMLStyleElement, HTMLDivElement] => {
@@ -1 +0,0 @@
1
- {"version":3,"file":"DateField.js","names":["memo","useCallback","useEffect","useImperativeHandle","useRef","useState","DateField","MuiDateField","useTranslation","Field","jsx","_jsx","Fragment","_Fragment","useOdysseyDateError","t","Map","formatDateTimeToUtcIsoDateString","value","toUTC","toISO","defaultValue","endAdornment","errorMessage","hasInitialFocus","hint","HintLinkComponent","id","idOverride","inputRef","isDisabled","isOptional","isReadOnly","label","minDate","maxDate","onBlur","onChange","onFocus","timezone","errorMap","displayedErrorMessage","setDisplayedErrorMessage","internalValidationError","localInputRef","focus","current","checkMinMaxValidity","hasMinError","hasMaxError","get","clearErrorMessages","undefined","validateAndCallOnChange","validationContext","validationError","hasEnteredFullYear","year","toString","length","odysseyValidationError","isValid","dateStringFromDateTime","checkFieldValidityAndSetError","event","hasVisibleAdornment","renderFieldComponent","ariaDescribedBy","errorMessageElementId","labelElementId","autoFocus","disabled","inputProps","InputProps","error","Boolean","children","_InputAdornment","position","name","readOnly","variant","fieldType","hasVisibleLabel","MemoizedDateField","displayName"],"sources":["../../src/labs/DateField.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport {\n FocusEventHandler,\n memo,\n useCallback,\n useEffect,\n useImperativeHandle,\n useRef,\n useState,\n} from \"react\";\nimport { InputAdornment } from \"@mui/material\";\nimport {\n DateField as MuiDateField,\n DateFieldProps as MuiDateFieldProps,\n DateValidationError,\n} from \"@mui/x-date-pickers\";\nimport { DateTime } from \"luxon\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { Field, RenderFieldComponentProps } from \"../Field\";\nimport { TextFieldProps } from \"../TextField\";\n\nexport type DateFieldProps = {\n onChange?: (value: string) => void;\n} & Pick<\n MuiDateFieldProps<DateTime>,\n \"defaultValue\" | \"inputRef\" | \"minDate\" | \"maxDate\" | \"timezone\" | \"value\"\n> &\n Pick<\n TextFieldProps,\n | \"endAdornment\"\n | \"errorMessage\"\n | \"hasInitialFocus\"\n | \"hint\"\n | \"HintLinkComponent\"\n | \"id\"\n | \"isDisabled\"\n | \"isOptional\"\n | \"isReadOnly\"\n | \"label\"\n | \"onBlur\"\n | \"onFocus\"\n >;\n\nconst useOdysseyDateError = () => {\n const { t } = useTranslation();\n\n return new Map<DateValidationError, string>([\n [\"invalidDate\", t(\"picker.error.invalid\")],\n [\"maxDate\", t(\"picker.error.maxdate\")],\n [\"minDate\", t(\"picker.error.mindate\")],\n ]);\n};\n\nconst formatDateTimeToUtcIsoDateString = (value: DateTime) =>\n value.toUTC().toISO();\n\nconst DateField = ({\n defaultValue,\n endAdornment,\n errorMessage,\n hasInitialFocus,\n hint,\n HintLinkComponent,\n id: idOverride,\n inputRef,\n isDisabled = false,\n isOptional = false,\n isReadOnly,\n label,\n minDate,\n maxDate,\n onBlur,\n onChange,\n onFocus,\n timezone,\n value,\n}: DateFieldProps) => {\n const errorMap = useOdysseyDateError();\n const [displayedErrorMessage, setDisplayedErrorMessage] =\n useState(errorMessage);\n\n const internalValidationError = useRef<string | undefined>();\n const localInputRef = useRef<HTMLInputElement>(null);\n\n useImperativeHandle(\n inputRef,\n () => {\n return {\n focus: () => {\n localInputRef.current?.focus();\n },\n };\n },\n [],\n );\n\n const checkMinMaxValidity = useCallback(\n (value: DateTime) => {\n const hasMinError = minDate && value.toUTC() < minDate.toUTC();\n const hasMaxError = maxDate && value.toUTC() > maxDate.toUTC();\n\n if (hasMinError || hasMaxError) {\n if (hasMinError) {\n setDisplayedErrorMessage(errorMap.get(\"minDate\"));\n }\n\n if (hasMaxError) {\n setDisplayedErrorMessage(errorMap.get(\"maxDate\"));\n }\n\n return false;\n }\n\n return true;\n },\n [errorMap, minDate, maxDate],\n );\n\n useEffect(() => {\n if (value) {\n checkMinMaxValidity(value);\n }\n\n if (defaultValue) {\n checkMinMaxValidity(defaultValue);\n }\n }, [checkMinMaxValidity, defaultValue, minDate, maxDate, value]);\n\n const clearErrorMessages = useCallback(() => {\n setDisplayedErrorMessage(undefined);\n internalValidationError.current = undefined;\n }, [internalValidationError, setDisplayedErrorMessage]);\n\n const validateAndCallOnChange = useCallback<\n NonNullable<MuiDateFieldProps<DateTime>[\"onChange\"]>\n >(\n (value, validationContext) => {\n clearErrorMessages();\n const { validationError } = validationContext;\n const hasEnteredFullYear = value?.year.toString().length === 4;\n\n if (validationError) {\n const odysseyValidationError = errorMap.get(validationError);\n\n if (odysseyValidationError) {\n internalValidationError.current = odysseyValidationError;\n\n if (value?.isValid && hasEnteredFullYear) {\n setDisplayedErrorMessage(odysseyValidationError);\n }\n }\n }\n\n if (value?.isValid && !validationError) {\n const dateStringFromDateTime = formatDateTimeToUtcIsoDateString(value);\n\n if (dateStringFromDateTime && checkMinMaxValidity(value)) {\n onChange?.(dateStringFromDateTime);\n }\n }\n },\n [checkMinMaxValidity, clearErrorMessages, errorMap, onChange],\n );\n\n const checkFieldValidityAndSetError = useCallback<\n FocusEventHandler<HTMLInputElement>\n >(\n (event) => {\n if (internalValidationError?.current && !displayedErrorMessage) {\n setDisplayedErrorMessage(internalValidationError.current);\n }\n onBlur?.(event);\n },\n [displayedErrorMessage, internalValidationError, onBlur],\n );\n\n const hasVisibleAdornment = !isReadOnly && !isDisabled;\n\n const renderFieldComponent = useCallback(\n ({\n ariaDescribedBy,\n errorMessageElementId,\n id,\n labelElementId,\n }: RenderFieldComponentProps) => (\n <MuiDateField\n /* eslint-disable-next-line jsx-a11y/no-autofocus */\n autoFocus={hasInitialFocus}\n defaultValue={defaultValue}\n disabled={isDisabled}\n id={id}\n inputProps={{\n \"aria-describedby\": ariaDescribedBy,\n \"aria-errormessage\": errorMessageElementId,\n \"aria-labelledby\": labelElementId,\n }}\n InputProps={{\n error: Boolean(displayedErrorMessage || errorMessage),\n endAdornment: (\n <>\n {hasVisibleAdornment && (\n <InputAdornment position=\"end\">{endAdornment}</InputAdornment>\n )}\n </>\n ),\n }}\n inputRef={localInputRef}\n minDate={minDate}\n maxDate={maxDate}\n name={id}\n onBlur={checkFieldValidityAndSetError}\n onChange={validateAndCallOnChange}\n onFocus={onFocus}\n readOnly={isReadOnly}\n timezone={timezone}\n value={value}\n variant=\"standard\"\n />\n ),\n [\n checkFieldValidityAndSetError,\n defaultValue,\n displayedErrorMessage,\n endAdornment,\n errorMessage,\n hasInitialFocus,\n hasVisibleAdornment,\n isDisabled,\n localInputRef,\n minDate,\n maxDate,\n onFocus,\n isReadOnly,\n timezone,\n validateAndCallOnChange,\n value,\n ],\n );\n\n return (\n <Field\n errorMessage={displayedErrorMessage || errorMessage}\n fieldType=\"single\"\n hasVisibleLabel\n hint={hint}\n HintLinkComponent={HintLinkComponent}\n id={idOverride}\n isDisabled={isDisabled}\n isOptional={isOptional}\n label={label}\n renderFieldComponent={renderFieldComponent}\n />\n );\n};\n\nconst MemoizedDateField = memo(DateField);\nMemoizedDateField.displayName = \"DateField\";\n\nexport { MemoizedDateField as DateField };\n"],"mappings":"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"}