@okta/odyssey-react-mui 1.24.1 → 1.26.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 (504) hide show
  1. package/CHANGELOG.md +21 -0
  2. package/dist/Autocomplete.js +30 -191
  3. package/dist/Autocomplete.js.map +1 -1
  4. package/dist/Box.js +2 -0
  5. package/dist/Box.js.map +1 -1
  6. package/dist/Card.js +1 -0
  7. package/dist/Card.js.map +1 -1
  8. package/dist/OdysseyDesignTokensContext.js +3 -2
  9. package/dist/OdysseyDesignTokensContext.js.map +1 -1
  10. package/dist/OdysseyProvider.js +22 -40
  11. package/dist/OdysseyProvider.js.map +1 -1
  12. package/dist/OdysseyThemeProvider.js +33 -12
  13. package/dist/OdysseyThemeProvider.js.map +1 -1
  14. package/dist/OdysseyTranslationProvider.types.js +1 -1
  15. package/dist/OdysseyTranslationProvider.types.js.map +1 -1
  16. package/dist/Pagination/Pagination.js +46 -14
  17. package/dist/Pagination/Pagination.js.map +1 -1
  18. package/dist/Select.js +10 -2
  19. package/dist/Select.js.map +1 -1
  20. package/dist/Surface.js +4 -1
  21. package/dist/Surface.js.map +1 -1
  22. package/dist/Tag.js +97 -47
  23. package/dist/Tag.js.map +1 -1
  24. package/dist/i18n.js +2 -0
  25. package/dist/i18n.js.map +1 -1
  26. package/dist/index.js +6 -7
  27. package/dist/index.js.map +1 -1
  28. package/dist/index.scss +1 -1
  29. package/dist/labs/AppTile.js +137 -39
  30. package/dist/labs/AppTile.js.map +1 -1
  31. package/dist/labs/DataView/CardLayoutContent.js +7 -8
  32. package/dist/labs/DataView/CardLayoutContent.js.map +1 -1
  33. package/dist/labs/DataView/DataCard.js +96 -43
  34. package/dist/labs/DataView/DataCard.js.map +1 -1
  35. package/dist/labs/DataView/TableLayoutContent.js +3 -2
  36. package/dist/labs/DataView/TableLayoutContent.js.map +1 -1
  37. package/dist/labs/DataView/componentTypes.js.map +1 -1
  38. package/dist/labs/DataView/index.js.map +1 -1
  39. package/dist/labs/OdysseyPickers/ComposablePicker.js +113 -0
  40. package/dist/labs/OdysseyPickers/ComposablePicker.js.map +1 -0
  41. package/dist/labs/OdysseyPickers/Picker.js +261 -0
  42. package/dist/labs/OdysseyPickers/Picker.js.map +1 -0
  43. package/dist/labs/OdysseyPickers/PickerVirtualizationListBox.js +132 -0
  44. package/dist/labs/OdysseyPickers/PickerVirtualizationListBox.js.map +1 -0
  45. package/dist/labs/OdysseyPickers/PickerWithOptionAdornment.js +291 -0
  46. package/dist/labs/OdysseyPickers/PickerWithOptionAdornment.js.map +1 -0
  47. package/dist/{src/createShadowDomElements.d.ts → labs/OdysseyPickers/index.js} +4 -7
  48. package/dist/labs/OdysseyPickers/index.js.map +1 -0
  49. package/dist/labs/PageTemplate.js +14 -10
  50. package/dist/labs/PageTemplate.js.map +1 -1
  51. package/dist/labs/SideNav/CollapseIcon.js +11 -25
  52. package/dist/labs/SideNav/CollapseIcon.js.map +1 -1
  53. package/dist/labs/SideNav/HandleIcon.js +32 -0
  54. package/dist/labs/SideNav/HandleIcon.js.map +1 -0
  55. package/dist/labs/{NavAccordion.js → SideNav/NavAccordion.js} +35 -6
  56. package/dist/labs/SideNav/NavAccordion.js.map +1 -0
  57. package/dist/labs/SideNav/OktaAura.js +32 -0
  58. package/dist/labs/SideNav/OktaAura.js.map +1 -0
  59. package/dist/labs/SideNav/OktaLogo.js +6 -9
  60. package/dist/labs/SideNav/OktaLogo.js.map +1 -1
  61. package/dist/labs/SideNav/SideNav.js +239 -169
  62. package/dist/labs/SideNav/SideNav.js.map +1 -1
  63. package/dist/labs/SideNav/SideNavFooterContent.js +32 -18
  64. package/dist/labs/SideNav/SideNavFooterContent.js.map +1 -1
  65. package/dist/labs/SideNav/SideNavHeader.js +48 -37
  66. package/dist/labs/SideNav/SideNavHeader.js.map +1 -1
  67. package/dist/labs/SideNav/SideNavItemContent.js +100 -58
  68. package/dist/labs/SideNav/SideNavItemContent.js.map +1 -1
  69. package/dist/labs/SideNav/SideNavItemContentContext.js +19 -0
  70. package/dist/labs/SideNav/SideNavItemContentContext.js.map +1 -0
  71. package/dist/labs/SideNav/SideNavItemLinkContent.js +14 -13
  72. package/dist/labs/SideNav/SideNavItemLinkContent.js.map +1 -1
  73. package/dist/labs/SideNav/SideNavLogo.js +42 -0
  74. package/dist/labs/SideNav/SideNavLogo.js.map +1 -0
  75. package/dist/labs/SideNav/SideNavToggleButton.js +170 -0
  76. package/dist/labs/SideNav/SideNavToggleButton.js.map +1 -0
  77. package/dist/labs/SideNav/types.js.map +1 -1
  78. package/dist/labs/TopNav/TopNav.js +65 -0
  79. package/dist/labs/TopNav/TopNav.js.map +1 -0
  80. package/dist/labs/TopNav/TopNavLinksList.js +38 -0
  81. package/dist/labs/TopNav/TopNavLinksList.js.map +1 -0
  82. package/dist/labs/TopNav/TopNavListItem.js +132 -0
  83. package/dist/labs/TopNav/TopNavListItem.js.map +1 -0
  84. package/dist/labs/TopNav/UserProfile.js +65 -0
  85. package/dist/labs/TopNav/UserProfile.js.map +1 -0
  86. package/dist/labs/TopNav/index.js +14 -0
  87. package/dist/labs/TopNav/index.js.map +1 -0
  88. package/dist/labs/UiShell/UiShell.js +68 -0
  89. package/dist/labs/UiShell/UiShell.js.map +1 -0
  90. package/dist/labs/UiShell/UiShellContent.js +114 -0
  91. package/dist/labs/UiShell/UiShellContent.js.map +1 -0
  92. package/dist/labs/UiShell/bufferLatest.js +37 -0
  93. package/dist/labs/UiShell/bufferLatest.js.map +1 -0
  94. package/dist/labs/UiShell/createMessageBus.js +30 -0
  95. package/dist/labs/UiShell/createMessageBus.js.map +1 -0
  96. package/dist/labs/UiShell/createStore.js +24 -0
  97. package/dist/labs/UiShell/createStore.js.map +1 -0
  98. package/dist/labs/UiShell/index.js +15 -0
  99. package/dist/labs/UiShell/index.js.map +1 -0
  100. package/dist/labs/UiShell/renderUiShell.js +78 -0
  101. package/dist/labs/UiShell/renderUiShell.js.map +1 -0
  102. package/dist/labs/UiShell/useHasUiShell.js +22 -0
  103. package/dist/labs/UiShell/useHasUiShell.js.map +1 -0
  104. package/dist/labs/UiShell/useScrollState.js +41 -0
  105. package/dist/labs/UiShell/useScrollState.js.map +1 -0
  106. package/dist/labs/index.js +5 -3
  107. package/dist/labs/index.js.map +1 -1
  108. package/dist/properties/ts/odyssey-react-mui.js +7 -1
  109. package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
  110. package/dist/properties/ts/odyssey-react-mui_cs.js +3 -1
  111. package/dist/properties/ts/odyssey-react-mui_cs.js.map +1 -1
  112. package/dist/properties/ts/odyssey-react-mui_da.js +3 -1
  113. package/dist/properties/ts/odyssey-react-mui_da.js.map +1 -1
  114. package/dist/properties/ts/odyssey-react-mui_de.js +3 -1
  115. package/dist/properties/ts/odyssey-react-mui_de.js.map +1 -1
  116. package/dist/properties/ts/odyssey-react-mui_el.js +3 -1
  117. package/dist/properties/ts/odyssey-react-mui_el.js.map +1 -1
  118. package/dist/properties/ts/odyssey-react-mui_es.js +3 -1
  119. package/dist/properties/ts/odyssey-react-mui_es.js.map +1 -1
  120. package/dist/properties/ts/odyssey-react-mui_fi.js +3 -1
  121. package/dist/properties/ts/odyssey-react-mui_fi.js.map +1 -1
  122. package/dist/properties/ts/odyssey-react-mui_fr.js +5 -3
  123. package/dist/properties/ts/odyssey-react-mui_fr.js.map +1 -1
  124. package/dist/properties/ts/odyssey-react-mui_ht.js +3 -1
  125. package/dist/properties/ts/odyssey-react-mui_ht.js.map +1 -1
  126. package/dist/properties/ts/odyssey-react-mui_hu.js +3 -1
  127. package/dist/properties/ts/odyssey-react-mui_hu.js.map +1 -1
  128. package/dist/properties/ts/odyssey-react-mui_id.js +3 -1
  129. package/dist/properties/ts/odyssey-react-mui_id.js.map +1 -1
  130. package/dist/properties/ts/odyssey-react-mui_it.js +4 -2
  131. package/dist/properties/ts/odyssey-react-mui_it.js.map +1 -1
  132. package/dist/properties/ts/odyssey-react-mui_ja.js +9 -7
  133. package/dist/properties/ts/odyssey-react-mui_ja.js.map +1 -1
  134. package/dist/properties/ts/odyssey-react-mui_ko.js +3 -1
  135. package/dist/properties/ts/odyssey-react-mui_ko.js.map +1 -1
  136. package/dist/properties/ts/odyssey-react-mui_ms.js +3 -1
  137. package/dist/properties/ts/odyssey-react-mui_ms.js.map +1 -1
  138. package/dist/properties/ts/odyssey-react-mui_nb.js +3 -1
  139. package/dist/properties/ts/odyssey-react-mui_nb.js.map +1 -1
  140. package/dist/properties/ts/odyssey-react-mui_nl_NL.js +3 -1
  141. package/dist/properties/ts/odyssey-react-mui_nl_NL.js.map +1 -1
  142. package/dist/properties/ts/odyssey-react-mui_pl.js +3 -1
  143. package/dist/properties/ts/odyssey-react-mui_pl.js.map +1 -1
  144. package/dist/properties/ts/odyssey-react-mui_pt_BR.js +3 -1
  145. package/dist/properties/ts/odyssey-react-mui_pt_BR.js.map +1 -1
  146. package/dist/properties/ts/odyssey-react-mui_ro.js +3 -1
  147. package/dist/properties/ts/odyssey-react-mui_ro.js.map +1 -1
  148. package/dist/properties/ts/odyssey-react-mui_ru.js +3 -1
  149. package/dist/properties/ts/odyssey-react-mui_ru.js.map +1 -1
  150. package/dist/properties/ts/odyssey-react-mui_sv.js +3 -1
  151. package/dist/properties/ts/odyssey-react-mui_sv.js.map +1 -1
  152. package/dist/properties/ts/odyssey-react-mui_th.js +3 -1
  153. package/dist/properties/ts/odyssey-react-mui_th.js.map +1 -1
  154. package/dist/properties/ts/odyssey-react-mui_tr.js +4 -2
  155. package/dist/properties/ts/odyssey-react-mui_tr.js.map +1 -1
  156. package/dist/properties/ts/odyssey-react-mui_uk.js +3 -1
  157. package/dist/properties/ts/odyssey-react-mui_uk.js.map +1 -1
  158. package/dist/properties/ts/odyssey-react-mui_vi.js +3 -1
  159. package/dist/properties/ts/odyssey-react-mui_vi.js.map +1 -1
  160. package/dist/properties/ts/odyssey-react-mui_zh_CN.js +3 -1
  161. package/dist/properties/ts/odyssey-react-mui_zh_CN.js.map +1 -1
  162. package/dist/properties/ts/odyssey-react-mui_zh_TW.js +3 -1
  163. package/dist/properties/ts/odyssey-react-mui_zh_TW.js.map +1 -1
  164. package/dist/src/Autocomplete.d.ts +21 -22
  165. package/dist/src/Autocomplete.d.ts.map +1 -1
  166. package/dist/src/Box.d.ts +3 -1
  167. package/dist/src/Box.d.ts.map +1 -1
  168. package/dist/src/Card.d.ts.map +1 -1
  169. package/dist/src/OdysseyDesignTokensContext.d.ts +5 -4
  170. package/dist/src/OdysseyDesignTokensContext.d.ts.map +1 -1
  171. package/dist/src/OdysseyProvider.d.ts +1 -3
  172. package/dist/src/OdysseyProvider.d.ts.map +1 -1
  173. package/dist/src/OdysseyThemeProvider.d.ts +10 -4
  174. package/dist/src/OdysseyThemeProvider.d.ts.map +1 -1
  175. package/dist/src/OdysseyTranslationProvider.d.ts +1 -1
  176. package/dist/src/OdysseyTranslationProvider.d.ts.map +1 -1
  177. package/dist/src/OdysseyTranslationProvider.types.d.ts +1 -1
  178. package/dist/src/OdysseyTranslationProvider.types.d.ts.map +1 -1
  179. package/dist/src/Pagination/Pagination.d.ts +21 -7
  180. package/dist/src/Pagination/Pagination.d.ts.map +1 -1
  181. package/dist/src/Select.d.ts.map +1 -1
  182. package/dist/src/Surface.d.ts.map +1 -1
  183. package/dist/src/Tag.d.ts +5 -2
  184. package/dist/src/Tag.d.ts.map +1 -1
  185. package/dist/src/i18n.d.ts.map +1 -1
  186. package/dist/src/index.d.ts +6 -7
  187. package/dist/src/index.d.ts.map +1 -1
  188. package/dist/src/labs/AppTile.d.ts +3 -1
  189. package/dist/src/labs/AppTile.d.ts.map +1 -1
  190. package/dist/src/labs/DataView/CardLayoutContent.d.ts.map +1 -1
  191. package/dist/src/labs/DataView/DataCard.d.ts +9 -3
  192. package/dist/src/labs/DataView/DataCard.d.ts.map +1 -1
  193. package/dist/src/labs/DataView/TableLayoutContent.d.ts.map +1 -1
  194. package/dist/src/labs/DataView/componentTypes.d.ts +1 -1
  195. package/dist/src/labs/DataView/componentTypes.d.ts.map +1 -1
  196. package/dist/src/labs/DataView/index.d.ts +1 -0
  197. package/dist/src/labs/DataView/index.d.ts.map +1 -1
  198. package/dist/src/labs/OdysseyPickers/ComposablePicker.d.ts +33 -0
  199. package/dist/src/labs/OdysseyPickers/ComposablePicker.d.ts.map +1 -0
  200. package/dist/src/labs/OdysseyPickers/Picker.d.ts +98 -0
  201. package/dist/src/labs/OdysseyPickers/Picker.d.ts.map +1 -0
  202. package/dist/src/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts +17 -0
  203. package/dist/src/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts.map +1 -0
  204. package/dist/src/labs/OdysseyPickers/PickerWithOptionAdornment.d.ts +26 -0
  205. package/dist/src/labs/OdysseyPickers/PickerWithOptionAdornment.d.ts.map +1 -0
  206. package/dist/src/labs/OdysseyPickers/index.d.ts +15 -0
  207. package/dist/src/labs/OdysseyPickers/index.d.ts.map +1 -0
  208. package/dist/src/labs/PageTemplate.d.ts +1 -1
  209. package/dist/src/labs/PageTemplate.d.ts.map +1 -1
  210. package/dist/src/labs/SideNav/CollapseIcon.d.ts +1 -4
  211. package/dist/src/labs/SideNav/CollapseIcon.d.ts.map +1 -1
  212. package/dist/src/labs/SideNav/HandleIcon.d.ts +14 -0
  213. package/dist/src/labs/SideNav/HandleIcon.d.ts.map +1 -0
  214. package/dist/src/labs/{NavAccordion.d.ts → SideNav/NavAccordion.d.ts} +6 -2
  215. package/dist/src/labs/SideNav/NavAccordion.d.ts.map +1 -0
  216. package/dist/src/labs/SideNav/OktaAura.d.ts +14 -0
  217. package/dist/src/labs/SideNav/OktaAura.d.ts.map +1 -0
  218. package/dist/src/labs/SideNav/OktaLogo.d.ts.map +1 -1
  219. package/dist/src/labs/SideNav/SideNav.d.ts +2 -1
  220. package/dist/src/labs/SideNav/SideNav.d.ts.map +1 -1
  221. package/dist/src/labs/SideNav/SideNavFooterContent.d.ts +1 -1
  222. package/dist/src/labs/SideNav/SideNavFooterContent.d.ts.map +1 -1
  223. package/dist/src/labs/SideNav/SideNavHeader.d.ts +12 -3
  224. package/dist/src/labs/SideNav/SideNavHeader.d.ts.map +1 -1
  225. package/dist/src/labs/SideNav/SideNavItemContent.d.ts +2 -3
  226. package/dist/src/labs/SideNav/SideNavItemContent.d.ts.map +1 -1
  227. package/dist/src/labs/SideNav/SideNavItemContentContext.d.ts +18 -0
  228. package/dist/src/labs/SideNav/SideNavItemContentContext.d.ts.map +1 -0
  229. package/dist/src/labs/SideNav/SideNavItemLinkContent.d.ts +1 -1
  230. package/dist/src/labs/SideNav/SideNavItemLinkContent.d.ts.map +1 -1
  231. package/dist/src/labs/SideNav/SideNavLogo.d.ts +15 -0
  232. package/dist/src/labs/SideNav/SideNavLogo.d.ts.map +1 -0
  233. package/dist/src/labs/SideNav/SideNavToggleButton.d.ts +38 -0
  234. package/dist/src/labs/SideNav/SideNavToggleButton.d.ts.map +1 -0
  235. package/dist/src/labs/SideNav/types.d.ts +67 -33
  236. package/dist/src/labs/SideNav/types.d.ts.map +1 -1
  237. package/dist/src/labs/TopNav/TopNav.d.ts +31 -0
  238. package/dist/src/labs/TopNav/TopNav.d.ts.map +1 -0
  239. package/dist/src/labs/TopNav/TopNavLinksList.d.ts +44 -0
  240. package/dist/src/labs/TopNav/TopNavLinksList.d.ts.map +1 -0
  241. package/dist/src/labs/TopNav/TopNavListItem.d.ts +42 -0
  242. package/dist/src/labs/TopNav/TopNavListItem.d.ts.map +1 -0
  243. package/dist/src/labs/TopNav/UserProfile.d.ts +29 -0
  244. package/dist/src/labs/TopNav/UserProfile.d.ts.map +1 -0
  245. package/dist/src/labs/TopNav/index.d.ts +14 -0
  246. package/dist/src/labs/TopNav/index.d.ts.map +1 -0
  247. package/dist/src/labs/UiShell/UiShell.d.ts +33 -0
  248. package/dist/src/labs/UiShell/UiShell.d.ts.map +1 -0
  249. package/dist/src/labs/UiShell/UiShellContent.d.ts +47 -0
  250. package/dist/src/labs/UiShell/UiShellContent.d.ts.map +1 -0
  251. package/dist/src/labs/UiShell/bufferLatest.d.ts +31 -0
  252. package/dist/src/labs/UiShell/bufferLatest.d.ts.map +1 -0
  253. package/dist/src/labs/UiShell/createMessageBus.d.ts +24 -0
  254. package/dist/src/labs/UiShell/createMessageBus.d.ts.map +1 -0
  255. package/dist/src/labs/UiShell/createStore.d.ts +22 -0
  256. package/dist/src/labs/UiShell/createStore.d.ts.map +1 -0
  257. package/dist/src/labs/UiShell/index.d.ts +16 -0
  258. package/dist/src/labs/UiShell/index.d.ts.map +1 -0
  259. package/dist/src/labs/UiShell/renderUiShell.d.ts +45 -0
  260. package/dist/src/labs/UiShell/renderUiShell.d.ts.map +1 -0
  261. package/dist/src/labs/UiShell/useHasUiShell.d.ts +13 -0
  262. package/dist/src/labs/UiShell/useHasUiShell.d.ts.map +1 -0
  263. package/dist/src/labs/UiShell/useScrollState.d.ts +16 -0
  264. package/dist/src/labs/UiShell/useScrollState.d.ts.map +1 -0
  265. package/dist/src/labs/index.d.ts +6 -2
  266. package/dist/src/labs/index.d.ts.map +1 -1
  267. package/dist/src/properties/ts/odyssey-react-mui.d.ts +6 -0
  268. package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
  269. package/dist/src/properties/ts/odyssey-react-mui_cs.d.ts +2 -0
  270. package/dist/src/properties/ts/odyssey-react-mui_cs.d.ts.map +1 -1
  271. package/dist/src/properties/ts/odyssey-react-mui_da.d.ts +2 -0
  272. package/dist/src/properties/ts/odyssey-react-mui_da.d.ts.map +1 -1
  273. package/dist/src/properties/ts/odyssey-react-mui_de.d.ts +2 -0
  274. package/dist/src/properties/ts/odyssey-react-mui_de.d.ts.map +1 -1
  275. package/dist/src/properties/ts/odyssey-react-mui_el.d.ts +2 -0
  276. package/dist/src/properties/ts/odyssey-react-mui_el.d.ts.map +1 -1
  277. package/dist/src/properties/ts/odyssey-react-mui_es.d.ts +2 -0
  278. package/dist/src/properties/ts/odyssey-react-mui_es.d.ts.map +1 -1
  279. package/dist/src/properties/ts/odyssey-react-mui_fi.d.ts +2 -0
  280. package/dist/src/properties/ts/odyssey-react-mui_fi.d.ts.map +1 -1
  281. package/dist/src/properties/ts/odyssey-react-mui_fr.d.ts +2 -0
  282. package/dist/src/properties/ts/odyssey-react-mui_fr.d.ts.map +1 -1
  283. package/dist/src/properties/ts/odyssey-react-mui_ht.d.ts +2 -0
  284. package/dist/src/properties/ts/odyssey-react-mui_ht.d.ts.map +1 -1
  285. package/dist/src/properties/ts/odyssey-react-mui_hu.d.ts +2 -0
  286. package/dist/src/properties/ts/odyssey-react-mui_hu.d.ts.map +1 -1
  287. package/dist/src/properties/ts/odyssey-react-mui_id.d.ts +2 -0
  288. package/dist/src/properties/ts/odyssey-react-mui_id.d.ts.map +1 -1
  289. package/dist/src/properties/ts/odyssey-react-mui_it.d.ts +2 -0
  290. package/dist/src/properties/ts/odyssey-react-mui_it.d.ts.map +1 -1
  291. package/dist/src/properties/ts/odyssey-react-mui_ja.d.ts +2 -0
  292. package/dist/src/properties/ts/odyssey-react-mui_ja.d.ts.map +1 -1
  293. package/dist/src/properties/ts/odyssey-react-mui_ko.d.ts +2 -0
  294. package/dist/src/properties/ts/odyssey-react-mui_ko.d.ts.map +1 -1
  295. package/dist/src/properties/ts/odyssey-react-mui_ms.d.ts +2 -0
  296. package/dist/src/properties/ts/odyssey-react-mui_ms.d.ts.map +1 -1
  297. package/dist/src/properties/ts/odyssey-react-mui_nb.d.ts +2 -0
  298. package/dist/src/properties/ts/odyssey-react-mui_nb.d.ts.map +1 -1
  299. package/dist/src/properties/ts/odyssey-react-mui_nl_NL.d.ts +2 -0
  300. package/dist/src/properties/ts/odyssey-react-mui_nl_NL.d.ts.map +1 -1
  301. package/dist/src/properties/ts/odyssey-react-mui_pl.d.ts +2 -0
  302. package/dist/src/properties/ts/odyssey-react-mui_pl.d.ts.map +1 -1
  303. package/dist/src/properties/ts/odyssey-react-mui_pt_BR.d.ts +2 -0
  304. package/dist/src/properties/ts/odyssey-react-mui_pt_BR.d.ts.map +1 -1
  305. package/dist/src/properties/ts/odyssey-react-mui_ro.d.ts +2 -0
  306. package/dist/src/properties/ts/odyssey-react-mui_ro.d.ts.map +1 -1
  307. package/dist/src/properties/ts/odyssey-react-mui_ru.d.ts +2 -0
  308. package/dist/src/properties/ts/odyssey-react-mui_ru.d.ts.map +1 -1
  309. package/dist/src/properties/ts/odyssey-react-mui_sv.d.ts +2 -0
  310. package/dist/src/properties/ts/odyssey-react-mui_sv.d.ts.map +1 -1
  311. package/dist/src/properties/ts/odyssey-react-mui_th.d.ts +2 -0
  312. package/dist/src/properties/ts/odyssey-react-mui_th.d.ts.map +1 -1
  313. package/dist/src/properties/ts/odyssey-react-mui_tr.d.ts +2 -0
  314. package/dist/src/properties/ts/odyssey-react-mui_tr.d.ts.map +1 -1
  315. package/dist/src/properties/ts/odyssey-react-mui_uk.d.ts +2 -0
  316. package/dist/src/properties/ts/odyssey-react-mui_uk.d.ts.map +1 -1
  317. package/dist/src/properties/ts/odyssey-react-mui_vi.d.ts +2 -0
  318. package/dist/src/properties/ts/odyssey-react-mui_vi.d.ts.map +1 -1
  319. package/dist/src/properties/ts/odyssey-react-mui_zh_CN.d.ts +2 -0
  320. package/dist/src/properties/ts/odyssey-react-mui_zh_CN.d.ts.map +1 -1
  321. package/dist/src/properties/ts/odyssey-react-mui_zh_TW.d.ts +2 -0
  322. package/dist/src/properties/ts/odyssey-react-mui_zh_TW.d.ts.map +1 -1
  323. package/dist/src/test-selectors/querySelector.d.ts +2 -2
  324. package/dist/src/theme/components.d.ts +3 -1
  325. package/dist/src/theme/components.d.ts.map +1 -1
  326. package/dist/src/theme/createOdysseyMuiTheme.d.ts +3 -1
  327. package/dist/src/theme/createOdysseyMuiTheme.d.ts.map +1 -1
  328. package/dist/src/useAutocomplete.d.ts +29 -0
  329. package/dist/src/useAutocomplete.d.ts.map +1 -0
  330. package/dist/src/useContrastMode.d.ts +46 -0
  331. package/dist/src/useContrastMode.d.ts.map +1 -0
  332. package/dist/src/web-component/index.d.ts +14 -0
  333. package/dist/src/web-component/index.d.ts.map +1 -0
  334. package/dist/src/web-component/renderReactInWebComponent.d.ts +76 -0
  335. package/dist/src/web-component/renderReactInWebComponent.d.ts.map +1 -0
  336. package/dist/src/web-component/shadow-dom.d.ts +23 -0
  337. package/dist/src/web-component/shadow-dom.d.ts.map +1 -0
  338. package/dist/test-selectors/querySelector.js.map +1 -1
  339. package/dist/theme/components.js +41 -32
  340. package/dist/theme/components.js.map +1 -1
  341. package/dist/theme/createOdysseyMuiTheme.js +3 -0
  342. package/dist/theme/createOdysseyMuiTheme.js.map +1 -1
  343. package/dist/tsconfig.production.tsbuildinfo +1 -1
  344. package/dist/tsconfig.tsbuildinfo +1 -1
  345. package/dist/useAutocomplete.js +105 -0
  346. package/dist/useAutocomplete.js.map +1 -0
  347. package/dist/useContrastMode.js +93 -0
  348. package/dist/useContrastMode.js.map +1 -0
  349. package/dist/web-component/index.js +14 -0
  350. package/dist/web-component/index.js.map +1 -0
  351. package/dist/web-component/renderReactInWebComponent.js +72 -0
  352. package/dist/web-component/renderReactInWebComponent.js.map +1 -0
  353. package/dist/{createShadowDomElements.js → web-component/shadow-dom.js} +10 -12
  354. package/dist/web-component/shadow-dom.js.map +1 -0
  355. package/jest.config.cjs +21 -2
  356. package/jest.setup.js +0 -3
  357. package/package.json +4 -3
  358. package/src/Autocomplete.tsx +40 -330
  359. package/src/Box.tsx +4 -2
  360. package/src/Card.tsx +1 -0
  361. package/src/OdysseyDesignTokensContext.tsx +6 -3
  362. package/src/OdysseyProvider.tsx +29 -56
  363. package/src/OdysseyThemeProvider.test.tsx +209 -0
  364. package/src/OdysseyThemeProvider.tsx +43 -17
  365. package/src/OdysseyTranslationProvider.types.ts +1 -0
  366. package/src/Pagination/Pagination.test.tsx +305 -0
  367. package/src/Pagination/Pagination.tsx +86 -38
  368. package/src/Select.tsx +12 -3
  369. package/src/Surface.tsx +2 -1
  370. package/src/Tag.tsx +102 -41
  371. package/src/createUniqueAlphabeticalId.test.ts +1 -1
  372. package/src/createUniqueId.test.ts +1 -1
  373. package/src/i18n.ts +2 -0
  374. package/src/index.ts +6 -7
  375. package/src/labs/AppTile.tsx +169 -40
  376. package/src/labs/DataView/CardLayoutContent.tsx +12 -14
  377. package/src/labs/DataView/DataCard.tsx +137 -69
  378. package/src/labs/DataView/DataView.test.tsx +6 -4
  379. package/src/labs/DataView/TableLayoutContent.tsx +6 -2
  380. package/src/labs/DataView/componentTypes.ts +1 -1
  381. package/src/labs/DataView/index.tsx +1 -0
  382. package/src/labs/OdysseyPickers/ComposablePicker.test.tsx +29 -0
  383. package/src/labs/OdysseyPickers/ComposablePicker.tsx +188 -0
  384. package/src/labs/OdysseyPickers/Picker.tsx +381 -0
  385. package/src/labs/OdysseyPickers/PickerVirtualizationListBox.tsx +191 -0
  386. package/src/labs/OdysseyPickers/PickerWithOptionAdornment.tsx +429 -0
  387. package/src/labs/OdysseyPickers/index.ts +15 -0
  388. package/src/labs/PageTemplate.tsx +18 -10
  389. package/src/labs/SideNav/CollapseIcon.tsx +14 -28
  390. package/src/labs/SideNav/HandleIcon.tsx +35 -0
  391. package/src/labs/{NavAccordion.tsx → SideNav/NavAccordion.tsx} +48 -8
  392. package/src/labs/SideNav/OktaAura.tsx +35 -0
  393. package/src/labs/SideNav/OktaLogo.tsx +5 -10
  394. package/src/labs/SideNav/SideNav.test.tsx +323 -0
  395. package/src/labs/SideNav/SideNav.tsx +291 -204
  396. package/src/labs/SideNav/SideNavFooterContent.tsx +36 -28
  397. package/src/labs/SideNav/SideNavHeader.tsx +62 -45
  398. package/src/labs/SideNav/SideNavItemContent.tsx +142 -62
  399. package/src/labs/SideNav/SideNavItemContentContext.tsx +27 -0
  400. package/src/labs/SideNav/SideNavItemLinkContent.tsx +17 -14
  401. package/src/labs/SideNav/SideNavLogo.tsx +41 -0
  402. package/src/labs/SideNav/SideNavToggleButton.tsx +249 -0
  403. package/src/labs/SideNav/types.ts +72 -33
  404. package/src/labs/TopNav/TopNav.tsx +95 -0
  405. package/src/labs/TopNav/TopNavLinksList.tsx +68 -0
  406. package/src/labs/TopNav/TopNavListItem.tsx +209 -0
  407. package/src/labs/TopNav/UserProfile.tsx +79 -0
  408. package/src/labs/TopNav/index.ts +14 -0
  409. package/src/labs/UiShell/UiShell.test.tsx +284 -0
  410. package/src/labs/UiShell/UiShell.tsx +109 -0
  411. package/src/labs/UiShell/UiShellContent.tsx +170 -0
  412. package/src/labs/UiShell/bufferLatest.test.ts +79 -0
  413. package/src/labs/UiShell/bufferLatest.ts +64 -0
  414. package/src/labs/UiShell/createMessageBus.test.ts +115 -0
  415. package/src/labs/UiShell/createMessageBus.ts +53 -0
  416. package/src/labs/UiShell/createStore.test.ts +103 -0
  417. package/src/labs/UiShell/createStore.ts +37 -0
  418. package/src/labs/UiShell/index.ts +17 -0
  419. package/src/labs/UiShell/renderUiShell.test.tsx +197 -0
  420. package/src/labs/UiShell/renderUiShell.tsx +132 -0
  421. package/src/labs/UiShell/useHasUiShell.ts +25 -0
  422. package/src/labs/UiShell/useScrollState.ts +56 -0
  423. package/src/labs/index.ts +10 -3
  424. package/src/properties/odyssey-react-mui.properties +7 -0
  425. package/src/properties/translations/odyssey-react-mui_cs.properties +2 -1
  426. package/src/properties/translations/odyssey-react-mui_da.properties +2 -1
  427. package/src/properties/translations/odyssey-react-mui_de.properties +2 -1
  428. package/src/properties/translations/odyssey-react-mui_el.properties +2 -1
  429. package/src/properties/translations/odyssey-react-mui_es.properties +2 -1
  430. package/src/properties/translations/odyssey-react-mui_fi.properties +2 -1
  431. package/src/properties/translations/odyssey-react-mui_fr.properties +4 -3
  432. package/src/properties/translations/odyssey-react-mui_ht.properties +2 -1
  433. package/src/properties/translations/odyssey-react-mui_hu.properties +2 -1
  434. package/src/properties/translations/odyssey-react-mui_id.properties +2 -1
  435. package/src/properties/translations/odyssey-react-mui_it.properties +3 -2
  436. package/src/properties/translations/odyssey-react-mui_ja.properties +8 -7
  437. package/src/properties/translations/odyssey-react-mui_ko.properties +2 -1
  438. package/src/properties/translations/odyssey-react-mui_ms.properties +2 -1
  439. package/src/properties/translations/odyssey-react-mui_nb.properties +2 -1
  440. package/src/properties/translations/odyssey-react-mui_nl_NL.properties +2 -1
  441. package/src/properties/translations/odyssey-react-mui_pl.properties +2 -1
  442. package/src/properties/translations/odyssey-react-mui_pt_BR.properties +2 -1
  443. package/src/properties/translations/odyssey-react-mui_ro.properties +2 -1
  444. package/src/properties/translations/odyssey-react-mui_ru.properties +2 -1
  445. package/src/properties/translations/odyssey-react-mui_sv.properties +2 -1
  446. package/src/properties/translations/odyssey-react-mui_th.properties +2 -1
  447. package/src/properties/translations/odyssey-react-mui_tr.properties +3 -2
  448. package/src/properties/translations/odyssey-react-mui_uk.properties +2 -1
  449. package/src/properties/translations/odyssey-react-mui_vi.properties +2 -1
  450. package/src/properties/translations/odyssey-react-mui_zh_CN.properties +2 -1
  451. package/src/properties/translations/odyssey-react-mui_zh_TW.properties +2 -1
  452. package/src/properties/ts/odyssey-react-mui.ts +1 -1
  453. package/src/properties/ts/odyssey-react-mui_cs.ts +1 -1
  454. package/src/properties/ts/odyssey-react-mui_da.ts +1 -1
  455. package/src/properties/ts/odyssey-react-mui_de.ts +1 -1
  456. package/src/properties/ts/odyssey-react-mui_el.ts +1 -1
  457. package/src/properties/ts/odyssey-react-mui_es.ts +1 -1
  458. package/src/properties/ts/odyssey-react-mui_fi.ts +1 -1
  459. package/src/properties/ts/odyssey-react-mui_fr.ts +1 -1
  460. package/src/properties/ts/odyssey-react-mui_ht.ts +1 -1
  461. package/src/properties/ts/odyssey-react-mui_hu.ts +1 -1
  462. package/src/properties/ts/odyssey-react-mui_id.ts +1 -1
  463. package/src/properties/ts/odyssey-react-mui_it.ts +1 -1
  464. package/src/properties/ts/odyssey-react-mui_ja.ts +1 -1
  465. package/src/properties/ts/odyssey-react-mui_ko.ts +1 -1
  466. package/src/properties/ts/odyssey-react-mui_ms.ts +1 -1
  467. package/src/properties/ts/odyssey-react-mui_nb.ts +1 -1
  468. package/src/properties/ts/odyssey-react-mui_nl_NL.ts +1 -1
  469. package/src/properties/ts/odyssey-react-mui_pl.ts +1 -1
  470. package/src/properties/ts/odyssey-react-mui_pt_BR.ts +1 -1
  471. package/src/properties/ts/odyssey-react-mui_ro.ts +1 -1
  472. package/src/properties/ts/odyssey-react-mui_ru.ts +1 -1
  473. package/src/properties/ts/odyssey-react-mui_sv.ts +1 -1
  474. package/src/properties/ts/odyssey-react-mui_th.ts +1 -1
  475. package/src/properties/ts/odyssey-react-mui_tr.ts +1 -1
  476. package/src/properties/ts/odyssey-react-mui_uk.ts +1 -1
  477. package/src/properties/ts/odyssey-react-mui_vi.ts +1 -1
  478. package/src/properties/ts/odyssey-react-mui_zh_CN.ts +1 -1
  479. package/src/properties/ts/odyssey-react-mui_zh_TW.ts +1 -1
  480. package/src/test-selectors/querySelector.ts +1 -1
  481. package/src/theme/components.tsx +55 -31
  482. package/src/theme/createOdysseyMuiTheme.ts +4 -0
  483. package/src/theme/useContrastMode.test.tsx +503 -0
  484. package/src/useAutocomplete.tsx +183 -0
  485. package/src/useContrastMode.tsx +149 -0
  486. package/src/web-component/index.ts +14 -0
  487. package/src/web-component/renderReactInWebComponent.test.tsx +156 -0
  488. package/src/web-component/renderReactInWebComponent.ts +153 -0
  489. package/src/web-component/shadow-dom.test.ts +24 -0
  490. package/src/{createShadowDomElements.ts → web-component/shadow-dom.ts} +15 -14
  491. package/dist/ContrastModeProvider.js +0 -86
  492. package/dist/ContrastModeProvider.js.map +0 -1
  493. package/dist/createShadowDomElements.js.map +0 -1
  494. package/dist/labs/NavAccordion.js.map +0 -1
  495. package/dist/labs/TopNav.js +0 -281
  496. package/dist/labs/TopNav.js.map +0 -1
  497. package/dist/src/ContrastModeProvider.d.ts +0 -34
  498. package/dist/src/ContrastModeProvider.d.ts.map +0 -1
  499. package/dist/src/createShadowDomElements.d.ts.map +0 -1
  500. package/dist/src/labs/NavAccordion.d.ts.map +0 -1
  501. package/dist/src/labs/TopNav.d.ts +0 -78
  502. package/dist/src/labs/TopNav.d.ts.map +0 -1
  503. package/src/ContrastModeProvider.tsx +0 -131
  504. package/src/labs/TopNav.tsx +0 -396
@@ -0,0 +1,197 @@
1
+ /*!
2
+ * Copyright (c) 2024-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 { act } from "@testing-library/react";
14
+
15
+ import { renderUiShell } from "./renderUiShell";
16
+ import {
17
+ ReactInWebComponentElement,
18
+ reactWebComponentElementName,
19
+ } from "../../web-component/renderReactInWebComponent";
20
+
21
+ describe("renderUiShell", () => {
22
+ afterEach(() => {
23
+ // This needs to be wrapped in `act` because the web component unmounts the React app, and React events have to be wrapped in `act`.
24
+ act(() => {
25
+ // Remove any appended elements because of this hacky process of rendering to the global DOM.
26
+ document.body.innerHTML = "";
27
+ });
28
+ });
29
+
30
+ test("returns app root element", async () => {
31
+ const rootElement = document.createElement("div");
32
+
33
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
34
+ document.body.append(rootElement);
35
+
36
+ act(() => {
37
+ const { appRootElement } = renderUiShell({
38
+ uiShellRootElement: rootElement,
39
+ });
40
+
41
+ expect(appRootElement).toBeInstanceOf(HTMLDivElement);
42
+ });
43
+ });
44
+
45
+ test("returns slotted elements", async () => {
46
+ const rootElement = document.createElement("div");
47
+
48
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
49
+ document.body.append(rootElement);
50
+
51
+ act(() => {
52
+ const { slottedElements } = renderUiShell({
53
+ uiShellRootElement: rootElement,
54
+ });
55
+
56
+ expect(slottedElements.banners).toBeInstanceOf(HTMLDivElement);
57
+ expect(slottedElements.sideNavFooter).toBeInstanceOf(HTMLDivElement);
58
+ expect(slottedElements.topNavLeftSide).toBeInstanceOf(HTMLDivElement);
59
+ expect(slottedElements.topNavRightSide).toBeInstanceOf(HTMLDivElement);
60
+ });
61
+ });
62
+
63
+ test("returns ui shell root element", async () => {
64
+ const rootElement = document.createElement("div");
65
+
66
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
67
+ document.body.append(rootElement);
68
+
69
+ act(() => {
70
+ const { uiShellElement } = renderUiShell({
71
+ uiShellRootElement: rootElement,
72
+ });
73
+
74
+ expect(uiShellElement).toBeInstanceOf(ReactInWebComponentElement);
75
+ });
76
+ });
77
+
78
+ test("renders `UiShell` component in a web component", async () => {
79
+ const rootElement = document.createElement("div");
80
+
81
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
82
+ document.body.append(rootElement);
83
+
84
+ // This needs to be wrapped in `act` because the web component mounts the React app, and React events have to be wrapped in `act`.
85
+ act(() => {
86
+ renderUiShell({
87
+ uiShellRootElement: rootElement,
88
+ });
89
+ });
90
+
91
+ expect(
92
+ Array.from(
93
+ rootElement.querySelector(reactWebComponentElementName)!.shadowRoot!
94
+ .children,
95
+ ).length,
96
+ ).toBeGreaterThan(0);
97
+ });
98
+
99
+ test("renders `UiShell` with updated props", async () => {
100
+ const rootElement = document.createElement("div");
101
+ const appName = "Hello World!";
102
+
103
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
104
+ document.body.append(rootElement);
105
+
106
+ let setComponentProps: ReturnType<
107
+ typeof renderUiShell
108
+ >["setComponentProps"];
109
+
110
+ // This needs to be wrapped in `act` because the web component mounts the React app, and React events have to be wrapped in `act`.
111
+ act(() => {
112
+ const renderUiShellReturnValue = renderUiShell({
113
+ uiShellRootElement: rootElement,
114
+ });
115
+
116
+ setComponentProps = renderUiShellReturnValue.setComponentProps;
117
+ });
118
+
119
+ act(() => {
120
+ setComponentProps({
121
+ sideNavProps: {
122
+ appName,
123
+ sideNavItems: [],
124
+ },
125
+ topNavProps: {},
126
+ });
127
+ });
128
+
129
+ expect(
130
+ rootElement.querySelector(reactWebComponentElementName)!.shadowRoot,
131
+ ).toHaveTextContent(appName);
132
+ });
133
+
134
+ test("renders `UiShell` with immediately updated props", async () => {
135
+ const rootElement = document.createElement("div");
136
+ const appName = "Hello World!";
137
+
138
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
139
+ document.body.append(rootElement);
140
+
141
+ // This needs to be wrapped in `act` because the web component mounts the React app, and React events have to be wrapped in `act`.
142
+ act(() => {
143
+ const { setComponentProps } = renderUiShell({
144
+ uiShellRootElement: rootElement,
145
+ });
146
+
147
+ setComponentProps({
148
+ sideNavProps: {
149
+ appName,
150
+ sideNavItems: [],
151
+ },
152
+ topNavProps: {},
153
+ });
154
+ });
155
+
156
+ expect(
157
+ rootElement.querySelector(reactWebComponentElementName)!.shadowRoot,
158
+ ).toHaveTextContent(appName);
159
+ });
160
+
161
+ test("renders `<slot>` in the event of an error", async () => {
162
+ const rootElement = document.createElement("div");
163
+ const consoleError = jest.fn();
164
+ const onError = jest.fn();
165
+
166
+ // If this isn't appended to the DOM, the React app won't exist because of how Web Components run.
167
+ document.body.append(rootElement);
168
+
169
+ const consoleErrorSpy = jest
170
+ .spyOn(console, "error")
171
+ .mockImplementation(consoleError);
172
+
173
+ await act(() => {
174
+ const { setComponentProps } = renderUiShell({
175
+ onError,
176
+ uiShellRootElement: rootElement,
177
+ });
178
+
179
+ setComponentProps(
180
+ // We're purposefully testing an error state, so we need to send something that will cause an error.
181
+ () => {
182
+ throw new Error("TEST BREAK!");
183
+ },
184
+ );
185
+ });
186
+
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);
196
+ });
197
+ });
@@ -0,0 +1,132 @@
1
+ /*!
2
+ * Copyright (c) 2024-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 { type SetStateAction } from "react";
14
+ import { ErrorBoundary } from "react-error-boundary";
15
+
16
+ import { bufferLatest } from "./bufferLatest";
17
+ import { createMessageBus } from "./createMessageBus";
18
+ import { UiShell, UiShellProps } from "./UiShell";
19
+ import { renderReactInWebComponent } from "../../web-component/renderReactInWebComponent";
20
+ import { type UiShellNavComponentProps } from "./UiShellContent";
21
+
22
+ export const uiShellDataAttribute = "data-unified-ui-shell";
23
+
24
+ export const optionalComponentSlotNames: Record<
25
+ keyof Required<UiShellProps>["optionalComponents"],
26
+ string
27
+ > = {
28
+ banners: "banners",
29
+ sideNavFooter: "side-nav-footer",
30
+ topNavLeftSide: "top-nav-left-side",
31
+ topNavRightSide: "top-nav-right-side",
32
+ };
33
+
34
+ /**
35
+ * This function renders UI Shell in a web component.
36
+ * This function is agnostic to the UI framework for your app is using. Your application can be another web component, a React app, or even vanilla HTML.
37
+ *
38
+ * **All styles are self-contained.** Even though your application visually renders as children of the web component, its within the global `document` scope, not the web component's `ShadowRoot`. That means any global styles will not affect UI Shell but will affect your application.
39
+ *
40
+ * It places your app's root element in a web component <slot> and ensures it remains rendered in the event of a UI Shell error.
41
+ * It also provides you with other elements fitted to slots in the web component. **In React, you can portal to these components.**
42
+ */
43
+ export const renderUiShell = ({
44
+ appRootElement: explicitAppRootElement,
45
+ onError = console.error,
46
+ uiShellRootElement,
47
+ }: {
48
+ /**
49
+ * HTML element used as the root for a React app.
50
+ */
51
+ appRootElement?: HTMLDivElement;
52
+ /**
53
+ * Notifies when a React rendering error occurs. This could be useful for logging, reporting priority 0 issues, and recovering UI Shell when errors occur.
54
+ */
55
+ onError?: () => void;
56
+ /**
57
+ * HTML element used as the root for UI Shell.
58
+ */
59
+ uiShellRootElement: HTMLElement;
60
+ }) => {
61
+ const appRootElement =
62
+ explicitAppRootElement || document.createElement("div");
63
+
64
+ // Add this attribute so `PageTemplate` and potentially other components will know if they're in UI Shell with special padding already available.
65
+ uiShellRootElement.setAttribute(uiShellDataAttribute, "");
66
+
67
+ const { publish: publishPropChanges, subscribe: subscribeToPropChanges } =
68
+ createMessageBus<SetStateAction<UiShellNavComponentProps>>();
69
+
70
+ const {
71
+ publish: publishSubscriptionCreated,
72
+ subscribe: subscribeToReactAppSubscribed,
73
+ } = createMessageBus();
74
+
75
+ const publishAfterReactAppReadyForProps = bufferLatest({
76
+ publish: publishPropChanges,
77
+ subscribe: subscribeToReactAppSubscribed,
78
+ });
79
+
80
+ const slottedElements = Object.fromEntries(
81
+ Object.entries(optionalComponentSlotNames).map(
82
+ ([optionalComponentKey, slotName]) => {
83
+ const element = document.createElement("div");
84
+
85
+ element.setAttribute("slot", slotName);
86
+
87
+ return [optionalComponentKey, element];
88
+ },
89
+ ),
90
+ ) as Record<
91
+ keyof Required<UiShellProps>["optionalComponents"],
92
+ HTMLDivElement
93
+ >;
94
+
95
+ const webComponentChildren =
96
+ Object.values(slottedElements).concat(appRootElement);
97
+
98
+ const appComponent = <slot />;
99
+
100
+ const uiShellElement = renderReactInWebComponent({
101
+ getReactComponent: (reactRootElements) => (
102
+ <ErrorBoundary fallback={appComponent} onError={onError}>
103
+ <UiShell
104
+ appComponent={appComponent}
105
+ appRootElement={reactRootElements.appRootElement}
106
+ onError={onError}
107
+ onSubscriptionCreated={publishSubscriptionCreated}
108
+ // `optionalComponents` doesn't need to be memoized because gets passed in once.
109
+ optionalComponents={Object.fromEntries(
110
+ Object.entries(optionalComponentSlotNames).map(
111
+ ([optionalComponentKey, slotName]) => [
112
+ optionalComponentKey,
113
+ <slot name={slotName} />,
114
+ ],
115
+ ),
116
+ )}
117
+ stylesRootElement={reactRootElements.stylesRootElement}
118
+ subscribeToPropChanges={subscribeToPropChanges}
119
+ />
120
+ </ErrorBoundary>
121
+ ),
122
+ webComponentRootElement: uiShellRootElement,
123
+ webComponentChildren,
124
+ });
125
+
126
+ return {
127
+ appRootElement,
128
+ setComponentProps: publishAfterReactAppReadyForProps,
129
+ slottedElements,
130
+ uiShellElement,
131
+ };
132
+ };
@@ -0,0 +1,25 @@
1
+ /*!
2
+ * Copyright (c) 2024-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 { useEffect, useState } from "react";
14
+
15
+ import { uiShellDataAttribute } from "./renderUiShell";
16
+
17
+ export const useHasUiShell = () => {
18
+ const [hasUiShell, setHasUiShell] = useState(false);
19
+
20
+ useEffect(() => {
21
+ setHasUiShell(Boolean(document.querySelector(`[${uiShellDataAttribute}]`)));
22
+ }, []);
23
+
24
+ return hasUiShell;
25
+ };
@@ -0,0 +1,56 @@
1
+ /*!
2
+ * Copyright (c) 2024-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 { useEffect, useRef, useState } from "react";
14
+
15
+ export const useScrollState = <
16
+ ScrollableContentElement extends HTMLElement = HTMLDivElement,
17
+ >() => {
18
+ const [isContentScrolled, setIsContentScrolled] = useState(false);
19
+
20
+ const scrollableContentRef = useRef<ScrollableContentElement>(null);
21
+
22
+ useEffect(() => {
23
+ if (scrollableContentRef.current) {
24
+ let requestedAnimationFrameId: number;
25
+ const scrollableContentElement = scrollableContentRef.current;
26
+
27
+ const updateScrollState = () => {
28
+ cancelAnimationFrame(requestedAnimationFrameId);
29
+
30
+ requestedAnimationFrameId = requestAnimationFrame(() => {
31
+ setIsContentScrolled(scrollableContentElement.scrollTop > 0);
32
+ });
33
+ };
34
+
35
+ scrollableContentElement.addEventListener("scroll", updateScrollState);
36
+
37
+ updateScrollState();
38
+
39
+ return () => {
40
+ scrollableContentElement.removeEventListener(
41
+ "scroll",
42
+ updateScrollState,
43
+ );
44
+
45
+ cancelAnimationFrame(requestedAnimationFrameId);
46
+ };
47
+ }
48
+
49
+ return () => {};
50
+ }, []);
51
+
52
+ return {
53
+ isContentScrolled,
54
+ scrollableContentRef,
55
+ };
56
+ };
package/src/labs/index.ts CHANGED
@@ -14,8 +14,8 @@ export { AdapterDateFns } from "@mui/x-date-pickers/AdapterDateFns";
14
14
  export { LocalizationProvider } from "@mui/x-date-pickers";
15
15
  export type { LocalizationProviderProps } from "@mui/x-date-pickers";
16
16
 
17
+ // export * from "./AdaptablePicker";
17
18
  export * from "./AppTile";
18
-
19
19
  export * from "./DatePicker";
20
20
  export * from "./datePickerTheme";
21
21
 
@@ -28,12 +28,19 @@ export * from "./Layout";
28
28
  export * from "./materialReactTableTypes";
29
29
  /** @deprecated Will be removed in a future Odyssey version in lieu of DataTable */
30
30
  export * from "./StaticTable";
31
+ export * from "./OdysseyPickers";
31
32
  export * from "./PageTemplate";
32
33
  /** @deprecated Will be removed in a future Odyssey version in lieu of DataTable */
33
34
  export * from "./PaginatedTable";
34
35
 
35
- export * from "./GroupPicker";
36
+ export {
37
+ /** @deprecated Will be removed in a future Odyssey version. Use `PickerWithOptionAdornment` */
38
+ GroupPicker,
39
+ type GroupPickerOptionType,
40
+ type GroupPickerProps,
41
+ } from "./GroupPicker";
36
42
 
37
- export * from "./NavAccordion";
43
+ export * from "./SideNav/NavAccordion";
38
44
  export * from "./SideNav";
39
45
  export * from "./TopNav";
46
+ export * from "./UiShell";
@@ -1,3 +1,6 @@
1
+ navigation.label = Main navigation
2
+ navigation.footer = Navigation secondary links
3
+
1
4
  breadcrumbs.home.text = Home
2
5
  breadcrumbs.label.text = Breadcrumbs
3
6
  close.text = Close
@@ -82,6 +85,8 @@ severity.error = error
82
85
  severity.info = info
83
86
  severity.success = success
84
87
  severity.warning = warning
88
+ sidenav.toggle.expand = Open navigation
89
+ sidenav.toggle.collapse = Close navigation
85
90
  switch.active = Active
86
91
  switch.inactive = Inactive
87
92
  table.columnvisibility.arialabel = Show/hide columns
@@ -122,3 +127,5 @@ table.rowexpansion.collapseall = Collapse all
122
127
  dataview.layout.table = Table
123
128
  dataview.layout.grid = Grid
124
129
  dataview.layout.list = List
130
+ topnav.helpicon = help page
131
+ topnav.settingsicon = settings page
@@ -31,7 +31,7 @@ picker.labels.action.today = Dnes
31
31
  picker.labels.clock.empty = Nen\u00ED vybran\u00FD \u010Das
32
32
  picker.labels.clock.hours = hod
33
33
  picker.labels.clock.minutes = min
34
- picker.labels.clock.minutes = s
34
+ picker.labels.clock.seconds = s
35
35
  picker.labels.clock.selected = Vybran\u00FD \u010Das je
36
36
  picker.labels.date.choose = Zvolit datum
37
37
  picker.labels.date.selected = Vybran\u00E9 datum je
@@ -47,6 +47,7 @@ picker.labels.select = Vybrat
47
47
  picker.labels.table.date = vybrat datum
48
48
  picker.labels.table.time = vybrat \u010Das
49
49
  picker.labels.time.choose = Zvolit \u010Das
50
+ picker.labels.time.selected = vybran\u00FD \u010Das je
50
51
  picker.time.toolbar.title = Vybrat \u010Das
51
52
  picker.view.name.day = Den
52
53
  picker.view.name.hours = Hodiny
@@ -31,7 +31,7 @@ picker.labels.action.today = I dag
31
31
  picker.labels.clock.empty = Intet tidspunkt valgt
32
32
  picker.labels.clock.hours = timer
33
33
  picker.labels.clock.minutes = minutter
34
- picker.labels.clock.minutes = sekunder
34
+ picker.labels.clock.seconds = sekunder
35
35
  picker.labels.clock.selected = Det valgte tidspunkt er
36
36
  picker.labels.date.choose = V\u00E6lg dato
37
37
  picker.labels.date.selected = Den valgte dato er
@@ -47,6 +47,7 @@ picker.labels.select = V\u00E6lg
47
47
  picker.labels.table.date = v\u00E6lg dato
48
48
  picker.labels.table.time = v\u00E6lg tidspunkt
49
49
  picker.labels.time.choose = V\u00E6lg tidspunkt
50
+ picker.labels.time.selected = valgte tidspunkt er
50
51
  picker.time.toolbar.title = V\u00E6lg tidspunkt
51
52
  picker.view.name.day = Dag
52
53
  picker.view.name.hours = Timer
@@ -31,7 +31,7 @@ picker.labels.action.today = Heute
31
31
  picker.labels.clock.empty = Keine Uhrzeit ausgew\u00E4hlt
32
32
  picker.labels.clock.hours = Stunden
33
33
  picker.labels.clock.minutes = Minuten
34
- picker.labels.clock.minutes = Sekunden
34
+ picker.labels.clock.seconds = Sekunden
35
35
  picker.labels.clock.selected = Ausgew\u00E4hlte Uhrzeit
36
36
  picker.labels.date.choose = Datum w\u00E4hlen
37
37
  picker.labels.date.selected = Gew\u00E4hltes Datum
@@ -47,6 +47,7 @@ picker.labels.select = Ausw\u00E4hlen
47
47
  picker.labels.table.date = Datum w\u00E4hlen
48
48
  picker.labels.table.time = Uhrzeit w\u00E4hlen
49
49
  picker.labels.time.choose = Uhrzeit w\u00E4hlen
50
+ picker.labels.time.selected = ausgew\u00E4hlte Uhrzeit ist
50
51
  picker.time.toolbar.title = Uhrzeit ausw\u00E4hlen
51
52
  picker.view.name.day = Tag
52
53
  picker.view.name.hours = Stunden
@@ -31,7 +31,7 @@ picker.labels.action.today = \u03A3\u03AE\u03BC\u03B5\u03C1\u03B1
31
31
  picker.labels.clock.empty = \u0394\u03B5\u03BD \u03AD\u03C7\u03B5\u03B9 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03B5\u03AF \u03CE\u03C1\u03B1
32
32
  picker.labels.clock.hours = \u03CE\u03C1\u03B5\u03C2
33
33
  picker.labels.clock.minutes = \u03BB\u03B5\u03C0\u03C4\u03AC
34
- picker.labels.clock.minutes = \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1
34
+ picker.labels.clock.seconds = \u03B4\u03B5\u03C5\u03C4\u03B5\u03C1\u03CC\u03BB\u03B5\u03C0\u03C4\u03B1
35
35
  picker.labels.clock.selected = \u0397 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03CE\u03C1\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9
36
36
  picker.labels.date.choose = \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1
37
37
  picker.labels.date.selected = \u0397 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9
@@ -47,6 +47,7 @@ picker.labels.select = \u0395\u03C0\u03B9\u03BB\u03BF\u03B3\u03AE
47
47
  picker.labels.table.date = \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03B7\u03BC\u03B5\u03C1\u03BF\u03BC\u03B7\u03BD\u03AF\u03B1
48
48
  picker.labels.table.time = \u03B5\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03CE\u03C1\u03B1
49
49
  picker.labels.time.choose = \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03CE\u03C1\u03B1
50
+ picker.labels.time.selected = \u03B7 \u03B5\u03C0\u03B9\u03BB\u03B5\u03B3\u03BC\u03AD\u03BD\u03B7 \u03CE\u03C1\u03B1 \u03B5\u03AF\u03BD\u03B1\u03B9
50
51
  picker.time.toolbar.title = \u0395\u03C0\u03B9\u03BB\u03AD\u03BE\u03C4\u03B5 \u03CE\u03C1\u03B1
51
52
  picker.view.name.day = \u0397\u03BC\u03AD\u03C1\u03B1
52
53
  picker.view.name.hours = \u038F\u03C1\u03B5\u03C2
@@ -31,7 +31,7 @@ picker.labels.action.today = Hoy
31
31
  picker.labels.clock.empty = No se ha seleccionado ninguna hora
32
32
  picker.labels.clock.hours = horas
33
33
  picker.labels.clock.minutes = minutos
34
- picker.labels.clock.minutes = segundos
34
+ picker.labels.clock.seconds = segundos
35
35
  picker.labels.clock.selected = La hora seleccionada es
36
36
  picker.labels.date.choose = Elegir fecha
37
37
  picker.labels.date.selected = La fecha seleccionada es
@@ -47,6 +47,7 @@ picker.labels.select = Seleccionar
47
47
  picker.labels.table.date = elegir fecha
48
48
  picker.labels.table.time = elegir hora
49
49
  picker.labels.time.choose = Elegir hora
50
+ picker.labels.time.selected = la hora seleccionada es
50
51
  picker.time.toolbar.title = Seleccionar hora
51
52
  picker.view.name.day = D\u00EDa
52
53
  picker.view.name.hours = Horas
@@ -31,7 +31,7 @@ picker.labels.action.today = T\u00E4n\u00E4\u00E4n
31
31
  picker.labels.clock.empty = Aikaa ei ole valittu
32
32
  picker.labels.clock.hours = tuntia
33
33
  picker.labels.clock.minutes = minuuttia
34
- picker.labels.clock.minutes = sekuntia
34
+ picker.labels.clock.seconds = sekuntia
35
35
  picker.labels.clock.selected = Valittu aika on
36
36
  picker.labels.date.choose = Valitse p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4
37
37
  picker.labels.date.selected = Valittu p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4 on
@@ -47,6 +47,7 @@ picker.labels.select = Valitse
47
47
  picker.labels.table.date = valitse p\u00E4iv\u00E4m\u00E4\u00E4r\u00E4
48
48
  picker.labels.table.time = valitse aika
49
49
  picker.labels.time.choose = Valitse aika
50
+ picker.labels.time.selected = valittu aika on
50
51
  picker.time.toolbar.title = Valitse aika
51
52
  picker.view.name.day = P\u00E4iv\u00E4
52
53
  picker.view.name.hours = Tuntia
@@ -8,8 +8,8 @@ picker.calendar.navigation.previousmonth = Mois pr\u00E9c\u00E8dent
8
8
  picker.date.toolbar.title = Date s\u00E9lectionn\u00E9e
9
9
  picker.daterange.toolbar.title = S\u00E9lectionner une plage de dates
10
10
  picker.datetime.toolbar.title = S\u00E9lectionner une date et une heure
11
- picker.error.invalid = Corrigez le format de la date ou s\u00E9lectionnez la date dans le calendrier.
12
- picker.error.mindate = La date saisie est ant\u00E9rieure aux dates autoris\u00E9es. S\u00E9lectionnez une date dans la plage du calendrier.
11
+ picker.error.invalid = Corrigez le format de la date ou s\u00E9lectionnez la date dans le calendrier.
12
+ picker.error.mindate = La date saisie est ant\u00E9rieure aux dates autoris\u00E9es. S\u00E9lectionnez une date dans la plage du calendrier.
13
13
  picker.error.maxdate = La date saisie est post\u00E9rieure aux dates autoris\u00E9es. S\u00E9lectionnez une date dans la plage du calendrier.
14
14
  # placeholder text in date field
15
15
  picker.field.placeholder.day = DD
@@ -31,7 +31,7 @@ picker.labels.action.today = Aujourd'hui
31
31
  picker.labels.clock.empty = Aucune heure s\u00E9lectionn\u00E9e
32
32
  picker.labels.clock.hours = heures
33
33
  picker.labels.clock.minutes = minutes
34
- picker.labels.clock.minutes = secondes
34
+ picker.labels.clock.seconds = secondes
35
35
  picker.labels.clock.selected = L'heure s\u00E9lectionn\u00E9e est
36
36
  picker.labels.date.choose = Choisir la date
37
37
  picker.labels.date.selected = La date s\u00E9lectionn\u00E9e est
@@ -47,6 +47,7 @@ picker.labels.select = S\u00E9lectionner
47
47
  picker.labels.table.date = choisir une date
48
48
  picker.labels.table.time = choisir une heure
49
49
  picker.labels.time.choose = Choisir une heure
50
+ picker.labels.time.selected = l'heure s\u00E9lectionn\u00E9e est
50
51
  picker.time.toolbar.title = Choisir une date
51
52
  picker.view.name.day = Jour
52
53
  picker.view.name.hours = Heures
@@ -31,7 +31,7 @@ picker.labels.action.today = Jodia
31
31
  picker.labels.clock.empty = Pa gen l\u00E8 ki seleksyone
32
32
  picker.labels.clock.hours = \u00E8dtan
33
33
  picker.labels.clock.minutes = minit
34
- picker.labels.clock.minutes = segonn
34
+ picker.labels.clock.seconds = segonn
35
35
  picker.labels.clock.selected = L\u00E8 ki seleksyone a se
36
36
  picker.labels.date.choose = Chwazi dat
37
37
  picker.labels.date.selected = Dat ki seleksyone a se
@@ -47,6 +47,7 @@ picker.labels.select = Seleksyone
47
47
  picker.labels.table.date = pran dat
48
48
  picker.labels.table.time = pran l\u00E8
49
49
  picker.labels.time.choose = Chwazi l\u00E8
50
+ picker.labels.time.selected = l\u00E8 ki seleksyone a se
50
51
  picker.time.toolbar.title = Seleksyone l\u00E8
51
52
  picker.view.name.day = Jou
52
53
  picker.view.name.hours = \u00C8dtan
@@ -31,7 +31,7 @@ picker.labels.action.today = Ma
31
31
  picker.labels.clock.empty = Nincs kiv\u00E1lasztva id\u0151pont
32
32
  picker.labels.clock.hours = \u00F3ra
33
33
  picker.labels.clock.minutes = perc
34
- picker.labels.clock.minutes = m\u00E1sodperc
34
+ picker.labels.clock.seconds = m\u00E1sodperc
35
35
  picker.labels.clock.selected = A kiv\u00E1lasztott id\u0151pont
36
36
  picker.labels.date.choose = V\u00E1lasszon d\u00E1tumot
37
37
  picker.labels.date.selected = A kiv\u00E1lasztott d\u00E1tum
@@ -47,6 +47,7 @@ picker.labels.select = Kiv\u00E1laszt\u00E1s
47
47
  picker.labels.table.date = v\u00E1lasszon d\u00E1tumot
48
48
  picker.labels.table.time = v\u00E1lasszon id\u0151pontot
49
49
  picker.labels.time.choose = Id\u0151pont kiv\u00E1laszt\u00E1sa
50
+ picker.labels.time.selected = a kiv\u00E1lasztott id\u0151pont:
50
51
  picker.time.toolbar.title = Id\u0151pont kiv\u00E1laszt\u00E1sa
51
52
  picker.view.name.day = Nap
52
53
  picker.view.name.hours = \u00D3ra
@@ -31,7 +31,7 @@ picker.labels.action.today = Hari ini
31
31
  picker.labels.clock.empty = Tidak ada waktu yang dipilih
32
32
  picker.labels.clock.hours = jam
33
33
  picker.labels.clock.minutes = menit
34
- picker.labels.clock.minutes = detik
34
+ picker.labels.clock.seconds = detik
35
35
  picker.labels.clock.selected = Waktu yang dipilih
36
36
  picker.labels.date.choose = Pilih tanggal
37
37
  picker.labels.date.selected = Tanggal yang dipilih
@@ -47,6 +47,7 @@ picker.labels.select = Pilih
47
47
  picker.labels.table.date = pilih tanggal
48
48
  picker.labels.table.time = pilih waktu
49
49
  picker.labels.time.choose = Pilih waktu
50
+ picker.labels.time.selected = waktu yang dipilih adalah
50
51
  picker.time.toolbar.title = Pilih waktu
51
52
  picker.view.name.day = Hari
52
53
  picker.view.name.hours = Jam