@okta/odyssey-react-mui 1.25.0 → 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 (491) hide show
  1. package/CHANGELOG.md +11 -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 +9 -7
  11. package/dist/OdysseyProvider.js.map +1 -1
  12. package/dist/OdysseyThemeProvider.js +33 -13
  13. package/dist/OdysseyThemeProvider.js.map +1 -1
  14. package/dist/Pagination/Pagination.js +46 -14
  15. package/dist/Pagination/Pagination.js.map +1 -1
  16. package/dist/Surface.js +4 -1
  17. package/dist/Surface.js.map +1 -1
  18. package/dist/Tag.js +42 -27
  19. package/dist/Tag.js.map +1 -1
  20. package/dist/index.js +6 -7
  21. package/dist/index.js.map +1 -1
  22. package/dist/index.scss +1 -1
  23. package/dist/labs/AppTile.js +137 -39
  24. package/dist/labs/AppTile.js.map +1 -1
  25. package/dist/labs/DataView/CardLayoutContent.js +7 -8
  26. package/dist/labs/DataView/CardLayoutContent.js.map +1 -1
  27. package/dist/labs/DataView/DataCard.js +96 -43
  28. package/dist/labs/DataView/DataCard.js.map +1 -1
  29. package/dist/labs/DataView/TableLayoutContent.js +3 -2
  30. package/dist/labs/DataView/TableLayoutContent.js.map +1 -1
  31. package/dist/labs/DataView/componentTypes.js.map +1 -1
  32. package/dist/labs/DataView/index.js.map +1 -1
  33. package/dist/labs/OdysseyPickers/ComposablePicker.js +113 -0
  34. package/dist/labs/OdysseyPickers/ComposablePicker.js.map +1 -0
  35. package/dist/labs/OdysseyPickers/Picker.js +261 -0
  36. package/dist/labs/OdysseyPickers/Picker.js.map +1 -0
  37. package/dist/labs/OdysseyPickers/PickerVirtualizationListBox.js +132 -0
  38. package/dist/labs/OdysseyPickers/PickerVirtualizationListBox.js.map +1 -0
  39. package/dist/labs/OdysseyPickers/PickerWithOptionAdornment.js +291 -0
  40. package/dist/labs/OdysseyPickers/PickerWithOptionAdornment.js.map +1 -0
  41. package/dist/{src/createShadowDomElements.d.ts → labs/OdysseyPickers/index.js} +4 -7
  42. package/dist/labs/OdysseyPickers/index.js.map +1 -0
  43. package/dist/labs/PageTemplate.js +14 -10
  44. package/dist/labs/PageTemplate.js.map +1 -1
  45. package/dist/labs/SideNav/CollapseIcon.js +11 -25
  46. package/dist/labs/SideNav/CollapseIcon.js.map +1 -1
  47. package/dist/labs/SideNav/HandleIcon.js +32 -0
  48. package/dist/labs/SideNav/HandleIcon.js.map +1 -0
  49. package/dist/labs/{NavAccordion.js → SideNav/NavAccordion.js} +35 -6
  50. package/dist/labs/SideNav/NavAccordion.js.map +1 -0
  51. package/dist/labs/SideNav/OktaAura.js +32 -0
  52. package/dist/labs/SideNav/OktaAura.js.map +1 -0
  53. package/dist/labs/SideNav/OktaLogo.js +6 -9
  54. package/dist/labs/SideNav/OktaLogo.js.map +1 -1
  55. package/dist/labs/SideNav/SideNav.js +239 -169
  56. package/dist/labs/SideNav/SideNav.js.map +1 -1
  57. package/dist/labs/SideNav/SideNavFooterContent.js +32 -18
  58. package/dist/labs/SideNav/SideNavFooterContent.js.map +1 -1
  59. package/dist/labs/SideNav/SideNavHeader.js +48 -37
  60. package/dist/labs/SideNav/SideNavHeader.js.map +1 -1
  61. package/dist/labs/SideNav/SideNavItemContent.js +100 -58
  62. package/dist/labs/SideNav/SideNavItemContent.js.map +1 -1
  63. package/dist/labs/SideNav/SideNavItemContentContext.js +19 -0
  64. package/dist/labs/SideNav/SideNavItemContentContext.js.map +1 -0
  65. package/dist/labs/SideNav/SideNavItemLinkContent.js +14 -13
  66. package/dist/labs/SideNav/SideNavItemLinkContent.js.map +1 -1
  67. package/dist/labs/SideNav/SideNavLogo.js +42 -0
  68. package/dist/labs/SideNav/SideNavLogo.js.map +1 -0
  69. package/dist/labs/SideNav/SideNavToggleButton.js +170 -0
  70. package/dist/labs/SideNav/SideNavToggleButton.js.map +1 -0
  71. package/dist/labs/SideNav/types.js.map +1 -1
  72. package/dist/labs/TopNav/TopNav.js +65 -0
  73. package/dist/labs/TopNav/TopNav.js.map +1 -0
  74. package/dist/labs/TopNav/TopNavLinksList.js +38 -0
  75. package/dist/labs/TopNav/TopNavLinksList.js.map +1 -0
  76. package/dist/labs/TopNav/TopNavListItem.js +132 -0
  77. package/dist/labs/TopNav/TopNavListItem.js.map +1 -0
  78. package/dist/labs/TopNav/UserProfile.js +65 -0
  79. package/dist/labs/TopNav/UserProfile.js.map +1 -0
  80. package/dist/labs/TopNav/index.js +14 -0
  81. package/dist/labs/TopNav/index.js.map +1 -0
  82. package/dist/labs/UiShell/UiShell.js +68 -0
  83. package/dist/labs/UiShell/UiShell.js.map +1 -0
  84. package/dist/labs/UiShell/UiShellContent.js +114 -0
  85. package/dist/labs/UiShell/UiShellContent.js.map +1 -0
  86. package/dist/labs/UiShell/bufferLatest.js +37 -0
  87. package/dist/labs/UiShell/bufferLatest.js.map +1 -0
  88. package/dist/labs/UiShell/createMessageBus.js +30 -0
  89. package/dist/labs/UiShell/createMessageBus.js.map +1 -0
  90. package/dist/labs/UiShell/createStore.js +24 -0
  91. package/dist/labs/UiShell/createStore.js.map +1 -0
  92. package/dist/labs/UiShell/index.js +15 -0
  93. package/dist/labs/UiShell/index.js.map +1 -0
  94. package/dist/labs/UiShell/renderUiShell.js +78 -0
  95. package/dist/labs/UiShell/renderUiShell.js.map +1 -0
  96. package/dist/labs/UiShell/useHasUiShell.js +22 -0
  97. package/dist/labs/UiShell/useHasUiShell.js.map +1 -0
  98. package/dist/labs/UiShell/useScrollState.js +41 -0
  99. package/dist/labs/UiShell/useScrollState.js.map +1 -0
  100. package/dist/labs/index.js +5 -3
  101. package/dist/labs/index.js.map +1 -1
  102. package/dist/properties/ts/odyssey-react-mui.js +7 -1
  103. package/dist/properties/ts/odyssey-react-mui.js.map +1 -1
  104. package/dist/properties/ts/odyssey-react-mui_cs.js +3 -1
  105. package/dist/properties/ts/odyssey-react-mui_cs.js.map +1 -1
  106. package/dist/properties/ts/odyssey-react-mui_da.js +3 -1
  107. package/dist/properties/ts/odyssey-react-mui_da.js.map +1 -1
  108. package/dist/properties/ts/odyssey-react-mui_de.js +3 -1
  109. package/dist/properties/ts/odyssey-react-mui_de.js.map +1 -1
  110. package/dist/properties/ts/odyssey-react-mui_el.js +3 -1
  111. package/dist/properties/ts/odyssey-react-mui_el.js.map +1 -1
  112. package/dist/properties/ts/odyssey-react-mui_es.js +3 -1
  113. package/dist/properties/ts/odyssey-react-mui_es.js.map +1 -1
  114. package/dist/properties/ts/odyssey-react-mui_fi.js +3 -1
  115. package/dist/properties/ts/odyssey-react-mui_fi.js.map +1 -1
  116. package/dist/properties/ts/odyssey-react-mui_fr.js +5 -3
  117. package/dist/properties/ts/odyssey-react-mui_fr.js.map +1 -1
  118. package/dist/properties/ts/odyssey-react-mui_ht.js +3 -1
  119. package/dist/properties/ts/odyssey-react-mui_ht.js.map +1 -1
  120. package/dist/properties/ts/odyssey-react-mui_hu.js +3 -1
  121. package/dist/properties/ts/odyssey-react-mui_hu.js.map +1 -1
  122. package/dist/properties/ts/odyssey-react-mui_id.js +3 -1
  123. package/dist/properties/ts/odyssey-react-mui_id.js.map +1 -1
  124. package/dist/properties/ts/odyssey-react-mui_it.js +4 -2
  125. package/dist/properties/ts/odyssey-react-mui_it.js.map +1 -1
  126. package/dist/properties/ts/odyssey-react-mui_ja.js +9 -7
  127. package/dist/properties/ts/odyssey-react-mui_ja.js.map +1 -1
  128. package/dist/properties/ts/odyssey-react-mui_ko.js +3 -1
  129. package/dist/properties/ts/odyssey-react-mui_ko.js.map +1 -1
  130. package/dist/properties/ts/odyssey-react-mui_ms.js +3 -1
  131. package/dist/properties/ts/odyssey-react-mui_ms.js.map +1 -1
  132. package/dist/properties/ts/odyssey-react-mui_nb.js +3 -1
  133. package/dist/properties/ts/odyssey-react-mui_nb.js.map +1 -1
  134. package/dist/properties/ts/odyssey-react-mui_nl_NL.js +3 -1
  135. package/dist/properties/ts/odyssey-react-mui_nl_NL.js.map +1 -1
  136. package/dist/properties/ts/odyssey-react-mui_pl.js +3 -1
  137. package/dist/properties/ts/odyssey-react-mui_pl.js.map +1 -1
  138. package/dist/properties/ts/odyssey-react-mui_pt_BR.js +3 -1
  139. package/dist/properties/ts/odyssey-react-mui_pt_BR.js.map +1 -1
  140. package/dist/properties/ts/odyssey-react-mui_ro.js +3 -1
  141. package/dist/properties/ts/odyssey-react-mui_ro.js.map +1 -1
  142. package/dist/properties/ts/odyssey-react-mui_ru.js +3 -1
  143. package/dist/properties/ts/odyssey-react-mui_ru.js.map +1 -1
  144. package/dist/properties/ts/odyssey-react-mui_sv.js +3 -1
  145. package/dist/properties/ts/odyssey-react-mui_sv.js.map +1 -1
  146. package/dist/properties/ts/odyssey-react-mui_th.js +3 -1
  147. package/dist/properties/ts/odyssey-react-mui_th.js.map +1 -1
  148. package/dist/properties/ts/odyssey-react-mui_tr.js +4 -2
  149. package/dist/properties/ts/odyssey-react-mui_tr.js.map +1 -1
  150. package/dist/properties/ts/odyssey-react-mui_uk.js +3 -1
  151. package/dist/properties/ts/odyssey-react-mui_uk.js.map +1 -1
  152. package/dist/properties/ts/odyssey-react-mui_vi.js +3 -1
  153. package/dist/properties/ts/odyssey-react-mui_vi.js.map +1 -1
  154. package/dist/properties/ts/odyssey-react-mui_zh_CN.js +3 -1
  155. package/dist/properties/ts/odyssey-react-mui_zh_CN.js.map +1 -1
  156. package/dist/properties/ts/odyssey-react-mui_zh_TW.js +3 -1
  157. package/dist/properties/ts/odyssey-react-mui_zh_TW.js.map +1 -1
  158. package/dist/src/Autocomplete.d.ts +21 -22
  159. package/dist/src/Autocomplete.d.ts.map +1 -1
  160. package/dist/src/Box.d.ts +3 -1
  161. package/dist/src/Box.d.ts.map +1 -1
  162. package/dist/src/Card.d.ts.map +1 -1
  163. package/dist/src/OdysseyDesignTokensContext.d.ts +5 -4
  164. package/dist/src/OdysseyDesignTokensContext.d.ts.map +1 -1
  165. package/dist/src/OdysseyProvider.d.ts +3 -3
  166. package/dist/src/OdysseyProvider.d.ts.map +1 -1
  167. package/dist/src/OdysseyThemeProvider.d.ts +10 -12
  168. package/dist/src/OdysseyThemeProvider.d.ts.map +1 -1
  169. package/dist/src/OdysseyTranslationProvider.d.ts +1 -1
  170. package/dist/src/OdysseyTranslationProvider.d.ts.map +1 -1
  171. package/dist/src/Pagination/Pagination.d.ts +21 -7
  172. package/dist/src/Pagination/Pagination.d.ts.map +1 -1
  173. package/dist/src/Surface.d.ts.map +1 -1
  174. package/dist/src/Tag.d.ts +5 -2
  175. package/dist/src/Tag.d.ts.map +1 -1
  176. package/dist/src/index.d.ts +6 -7
  177. package/dist/src/index.d.ts.map +1 -1
  178. package/dist/src/labs/AppTile.d.ts +3 -1
  179. package/dist/src/labs/AppTile.d.ts.map +1 -1
  180. package/dist/src/labs/DataView/CardLayoutContent.d.ts.map +1 -1
  181. package/dist/src/labs/DataView/DataCard.d.ts +9 -3
  182. package/dist/src/labs/DataView/DataCard.d.ts.map +1 -1
  183. package/dist/src/labs/DataView/TableLayoutContent.d.ts.map +1 -1
  184. package/dist/src/labs/DataView/componentTypes.d.ts +1 -1
  185. package/dist/src/labs/DataView/componentTypes.d.ts.map +1 -1
  186. package/dist/src/labs/DataView/index.d.ts +1 -0
  187. package/dist/src/labs/DataView/index.d.ts.map +1 -1
  188. package/dist/src/labs/OdysseyPickers/ComposablePicker.d.ts +33 -0
  189. package/dist/src/labs/OdysseyPickers/ComposablePicker.d.ts.map +1 -0
  190. package/dist/src/labs/OdysseyPickers/Picker.d.ts +98 -0
  191. package/dist/src/labs/OdysseyPickers/Picker.d.ts.map +1 -0
  192. package/dist/src/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts +17 -0
  193. package/dist/src/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts.map +1 -0
  194. package/dist/src/labs/OdysseyPickers/PickerWithOptionAdornment.d.ts +26 -0
  195. package/dist/src/labs/OdysseyPickers/PickerWithOptionAdornment.d.ts.map +1 -0
  196. package/dist/src/labs/OdysseyPickers/index.d.ts +15 -0
  197. package/dist/src/labs/OdysseyPickers/index.d.ts.map +1 -0
  198. package/dist/src/labs/PageTemplate.d.ts +1 -1
  199. package/dist/src/labs/PageTemplate.d.ts.map +1 -1
  200. package/dist/src/labs/SideNav/CollapseIcon.d.ts +1 -4
  201. package/dist/src/labs/SideNav/CollapseIcon.d.ts.map +1 -1
  202. package/dist/src/labs/SideNav/HandleIcon.d.ts +14 -0
  203. package/dist/src/labs/SideNav/HandleIcon.d.ts.map +1 -0
  204. package/dist/src/labs/{NavAccordion.d.ts → SideNav/NavAccordion.d.ts} +6 -2
  205. package/dist/src/labs/SideNav/NavAccordion.d.ts.map +1 -0
  206. package/dist/src/labs/SideNav/OktaAura.d.ts +14 -0
  207. package/dist/src/labs/SideNav/OktaAura.d.ts.map +1 -0
  208. package/dist/src/labs/SideNav/OktaLogo.d.ts.map +1 -1
  209. package/dist/src/labs/SideNav/SideNav.d.ts +2 -1
  210. package/dist/src/labs/SideNav/SideNav.d.ts.map +1 -1
  211. package/dist/src/labs/SideNav/SideNavFooterContent.d.ts +1 -1
  212. package/dist/src/labs/SideNav/SideNavFooterContent.d.ts.map +1 -1
  213. package/dist/src/labs/SideNav/SideNavHeader.d.ts +12 -3
  214. package/dist/src/labs/SideNav/SideNavHeader.d.ts.map +1 -1
  215. package/dist/src/labs/SideNav/SideNavItemContent.d.ts +2 -3
  216. package/dist/src/labs/SideNav/SideNavItemContent.d.ts.map +1 -1
  217. package/dist/src/labs/SideNav/SideNavItemContentContext.d.ts +18 -0
  218. package/dist/src/labs/SideNav/SideNavItemContentContext.d.ts.map +1 -0
  219. package/dist/src/labs/SideNav/SideNavItemLinkContent.d.ts +1 -1
  220. package/dist/src/labs/SideNav/SideNavItemLinkContent.d.ts.map +1 -1
  221. package/dist/src/labs/SideNav/SideNavLogo.d.ts +15 -0
  222. package/dist/src/labs/SideNav/SideNavLogo.d.ts.map +1 -0
  223. package/dist/src/labs/SideNav/SideNavToggleButton.d.ts +38 -0
  224. package/dist/src/labs/SideNav/SideNavToggleButton.d.ts.map +1 -0
  225. package/dist/src/labs/SideNav/types.d.ts +67 -33
  226. package/dist/src/labs/SideNav/types.d.ts.map +1 -1
  227. package/dist/src/labs/TopNav/TopNav.d.ts +31 -0
  228. package/dist/src/labs/TopNav/TopNav.d.ts.map +1 -0
  229. package/dist/src/labs/TopNav/TopNavLinksList.d.ts +44 -0
  230. package/dist/src/labs/TopNav/TopNavLinksList.d.ts.map +1 -0
  231. package/dist/src/labs/TopNav/TopNavListItem.d.ts +42 -0
  232. package/dist/src/labs/TopNav/TopNavListItem.d.ts.map +1 -0
  233. package/dist/src/labs/TopNav/UserProfile.d.ts +29 -0
  234. package/dist/src/labs/TopNav/UserProfile.d.ts.map +1 -0
  235. package/dist/src/labs/TopNav/index.d.ts +14 -0
  236. package/dist/src/labs/TopNav/index.d.ts.map +1 -0
  237. package/dist/src/labs/UiShell/UiShell.d.ts +33 -0
  238. package/dist/src/labs/UiShell/UiShell.d.ts.map +1 -0
  239. package/dist/src/labs/UiShell/UiShellContent.d.ts +47 -0
  240. package/dist/src/labs/UiShell/UiShellContent.d.ts.map +1 -0
  241. package/dist/src/labs/UiShell/bufferLatest.d.ts +31 -0
  242. package/dist/src/labs/UiShell/bufferLatest.d.ts.map +1 -0
  243. package/dist/src/labs/UiShell/createMessageBus.d.ts +24 -0
  244. package/dist/src/labs/UiShell/createMessageBus.d.ts.map +1 -0
  245. package/dist/src/labs/UiShell/createStore.d.ts +22 -0
  246. package/dist/src/labs/UiShell/createStore.d.ts.map +1 -0
  247. package/dist/src/labs/UiShell/index.d.ts +16 -0
  248. package/dist/src/labs/UiShell/index.d.ts.map +1 -0
  249. package/dist/src/labs/UiShell/renderUiShell.d.ts +45 -0
  250. package/dist/src/labs/UiShell/renderUiShell.d.ts.map +1 -0
  251. package/dist/src/labs/UiShell/useHasUiShell.d.ts +13 -0
  252. package/dist/src/labs/UiShell/useHasUiShell.d.ts.map +1 -0
  253. package/dist/src/labs/UiShell/useScrollState.d.ts +16 -0
  254. package/dist/src/labs/UiShell/useScrollState.d.ts.map +1 -0
  255. package/dist/src/labs/index.d.ts +6 -2
  256. package/dist/src/labs/index.d.ts.map +1 -1
  257. package/dist/src/properties/ts/odyssey-react-mui.d.ts +6 -0
  258. package/dist/src/properties/ts/odyssey-react-mui.d.ts.map +1 -1
  259. package/dist/src/properties/ts/odyssey-react-mui_cs.d.ts +2 -0
  260. package/dist/src/properties/ts/odyssey-react-mui_cs.d.ts.map +1 -1
  261. package/dist/src/properties/ts/odyssey-react-mui_da.d.ts +2 -0
  262. package/dist/src/properties/ts/odyssey-react-mui_da.d.ts.map +1 -1
  263. package/dist/src/properties/ts/odyssey-react-mui_de.d.ts +2 -0
  264. package/dist/src/properties/ts/odyssey-react-mui_de.d.ts.map +1 -1
  265. package/dist/src/properties/ts/odyssey-react-mui_el.d.ts +2 -0
  266. package/dist/src/properties/ts/odyssey-react-mui_el.d.ts.map +1 -1
  267. package/dist/src/properties/ts/odyssey-react-mui_es.d.ts +2 -0
  268. package/dist/src/properties/ts/odyssey-react-mui_es.d.ts.map +1 -1
  269. package/dist/src/properties/ts/odyssey-react-mui_fi.d.ts +2 -0
  270. package/dist/src/properties/ts/odyssey-react-mui_fi.d.ts.map +1 -1
  271. package/dist/src/properties/ts/odyssey-react-mui_fr.d.ts +2 -0
  272. package/dist/src/properties/ts/odyssey-react-mui_fr.d.ts.map +1 -1
  273. package/dist/src/properties/ts/odyssey-react-mui_ht.d.ts +2 -0
  274. package/dist/src/properties/ts/odyssey-react-mui_ht.d.ts.map +1 -1
  275. package/dist/src/properties/ts/odyssey-react-mui_hu.d.ts +2 -0
  276. package/dist/src/properties/ts/odyssey-react-mui_hu.d.ts.map +1 -1
  277. package/dist/src/properties/ts/odyssey-react-mui_id.d.ts +2 -0
  278. package/dist/src/properties/ts/odyssey-react-mui_id.d.ts.map +1 -1
  279. package/dist/src/properties/ts/odyssey-react-mui_it.d.ts +2 -0
  280. package/dist/src/properties/ts/odyssey-react-mui_it.d.ts.map +1 -1
  281. package/dist/src/properties/ts/odyssey-react-mui_ja.d.ts +2 -0
  282. package/dist/src/properties/ts/odyssey-react-mui_ja.d.ts.map +1 -1
  283. package/dist/src/properties/ts/odyssey-react-mui_ko.d.ts +2 -0
  284. package/dist/src/properties/ts/odyssey-react-mui_ko.d.ts.map +1 -1
  285. package/dist/src/properties/ts/odyssey-react-mui_ms.d.ts +2 -0
  286. package/dist/src/properties/ts/odyssey-react-mui_ms.d.ts.map +1 -1
  287. package/dist/src/properties/ts/odyssey-react-mui_nb.d.ts +2 -0
  288. package/dist/src/properties/ts/odyssey-react-mui_nb.d.ts.map +1 -1
  289. package/dist/src/properties/ts/odyssey-react-mui_nl_NL.d.ts +2 -0
  290. package/dist/src/properties/ts/odyssey-react-mui_nl_NL.d.ts.map +1 -1
  291. package/dist/src/properties/ts/odyssey-react-mui_pl.d.ts +2 -0
  292. package/dist/src/properties/ts/odyssey-react-mui_pl.d.ts.map +1 -1
  293. package/dist/src/properties/ts/odyssey-react-mui_pt_BR.d.ts +2 -0
  294. package/dist/src/properties/ts/odyssey-react-mui_pt_BR.d.ts.map +1 -1
  295. package/dist/src/properties/ts/odyssey-react-mui_ro.d.ts +2 -0
  296. package/dist/src/properties/ts/odyssey-react-mui_ro.d.ts.map +1 -1
  297. package/dist/src/properties/ts/odyssey-react-mui_ru.d.ts +2 -0
  298. package/dist/src/properties/ts/odyssey-react-mui_ru.d.ts.map +1 -1
  299. package/dist/src/properties/ts/odyssey-react-mui_sv.d.ts +2 -0
  300. package/dist/src/properties/ts/odyssey-react-mui_sv.d.ts.map +1 -1
  301. package/dist/src/properties/ts/odyssey-react-mui_th.d.ts +2 -0
  302. package/dist/src/properties/ts/odyssey-react-mui_th.d.ts.map +1 -1
  303. package/dist/src/properties/ts/odyssey-react-mui_tr.d.ts +2 -0
  304. package/dist/src/properties/ts/odyssey-react-mui_tr.d.ts.map +1 -1
  305. package/dist/src/properties/ts/odyssey-react-mui_uk.d.ts +2 -0
  306. package/dist/src/properties/ts/odyssey-react-mui_uk.d.ts.map +1 -1
  307. package/dist/src/properties/ts/odyssey-react-mui_vi.d.ts +2 -0
  308. package/dist/src/properties/ts/odyssey-react-mui_vi.d.ts.map +1 -1
  309. package/dist/src/properties/ts/odyssey-react-mui_zh_CN.d.ts +2 -0
  310. package/dist/src/properties/ts/odyssey-react-mui_zh_CN.d.ts.map +1 -1
  311. package/dist/src/properties/ts/odyssey-react-mui_zh_TW.d.ts +2 -0
  312. package/dist/src/properties/ts/odyssey-react-mui_zh_TW.d.ts.map +1 -1
  313. package/dist/src/test-selectors/querySelector.d.ts +2 -2
  314. package/dist/src/theme/components.d.ts +3 -1
  315. package/dist/src/theme/components.d.ts.map +1 -1
  316. package/dist/src/theme/createOdysseyMuiTheme.d.ts +2 -1
  317. package/dist/src/theme/createOdysseyMuiTheme.d.ts.map +1 -1
  318. package/dist/src/useAutocomplete.d.ts +29 -0
  319. package/dist/src/useAutocomplete.d.ts.map +1 -0
  320. package/dist/src/useContrastMode.d.ts +46 -0
  321. package/dist/src/useContrastMode.d.ts.map +1 -0
  322. package/dist/src/web-component/index.d.ts +14 -0
  323. package/dist/src/web-component/index.d.ts.map +1 -0
  324. package/dist/src/web-component/renderReactInWebComponent.d.ts +76 -0
  325. package/dist/src/web-component/renderReactInWebComponent.d.ts.map +1 -0
  326. package/dist/src/web-component/shadow-dom.d.ts +23 -0
  327. package/dist/src/web-component/shadow-dom.d.ts.map +1 -0
  328. package/dist/test-selectors/querySelector.js.map +1 -1
  329. package/dist/theme/components.js +36 -32
  330. package/dist/theme/components.js.map +1 -1
  331. package/dist/theme/createOdysseyMuiTheme.js +3 -2
  332. package/dist/theme/createOdysseyMuiTheme.js.map +1 -1
  333. package/dist/tsconfig.production.tsbuildinfo +1 -1
  334. package/dist/tsconfig.tsbuildinfo +1 -1
  335. package/dist/useAutocomplete.js +105 -0
  336. package/dist/useAutocomplete.js.map +1 -0
  337. package/dist/useContrastMode.js +93 -0
  338. package/dist/useContrastMode.js.map +1 -0
  339. package/dist/web-component/index.js +14 -0
  340. package/dist/web-component/index.js.map +1 -0
  341. package/dist/web-component/renderReactInWebComponent.js +72 -0
  342. package/dist/web-component/renderReactInWebComponent.js.map +1 -0
  343. package/dist/{createShadowDomElements.js → web-component/shadow-dom.js} +10 -12
  344. package/dist/web-component/shadow-dom.js.map +1 -0
  345. package/jest.config.cjs +1 -1
  346. package/jest.setup.js +0 -3
  347. package/package.json +4 -3
  348. package/src/Autocomplete.tsx +40 -330
  349. package/src/Box.tsx +4 -2
  350. package/src/Card.tsx +1 -0
  351. package/src/OdysseyDesignTokensContext.tsx +6 -3
  352. package/src/OdysseyProvider.tsx +13 -8
  353. package/src/OdysseyThemeProvider.test.tsx +209 -0
  354. package/src/OdysseyThemeProvider.tsx +42 -26
  355. package/src/Pagination/Pagination.test.tsx +305 -0
  356. package/src/Pagination/Pagination.tsx +86 -38
  357. package/src/Surface.tsx +2 -1
  358. package/src/Tag.tsx +64 -39
  359. package/src/createUniqueAlphabeticalId.test.ts +1 -1
  360. package/src/createUniqueId.test.ts +1 -1
  361. package/src/index.ts +6 -7
  362. package/src/labs/AppTile.tsx +169 -40
  363. package/src/labs/DataView/CardLayoutContent.tsx +12 -14
  364. package/src/labs/DataView/DataCard.tsx +137 -69
  365. package/src/labs/DataView/DataView.test.tsx +6 -4
  366. package/src/labs/DataView/TableLayoutContent.tsx +6 -2
  367. package/src/labs/DataView/componentTypes.ts +1 -1
  368. package/src/labs/DataView/index.tsx +1 -0
  369. package/src/labs/OdysseyPickers/ComposablePicker.test.tsx +29 -0
  370. package/src/labs/OdysseyPickers/ComposablePicker.tsx +188 -0
  371. package/src/labs/OdysseyPickers/Picker.tsx +381 -0
  372. package/src/labs/OdysseyPickers/PickerVirtualizationListBox.tsx +191 -0
  373. package/src/labs/OdysseyPickers/PickerWithOptionAdornment.tsx +429 -0
  374. package/src/labs/OdysseyPickers/index.ts +15 -0
  375. package/src/labs/PageTemplate.tsx +18 -10
  376. package/src/labs/SideNav/CollapseIcon.tsx +14 -28
  377. package/src/labs/SideNav/HandleIcon.tsx +35 -0
  378. package/src/labs/{NavAccordion.tsx → SideNav/NavAccordion.tsx} +48 -8
  379. package/src/labs/SideNav/OktaAura.tsx +35 -0
  380. package/src/labs/SideNav/OktaLogo.tsx +5 -10
  381. package/src/labs/SideNav/SideNav.test.tsx +323 -0
  382. package/src/labs/SideNav/SideNav.tsx +291 -204
  383. package/src/labs/SideNav/SideNavFooterContent.tsx +36 -28
  384. package/src/labs/SideNav/SideNavHeader.tsx +62 -45
  385. package/src/labs/SideNav/SideNavItemContent.tsx +142 -62
  386. package/src/labs/SideNav/SideNavItemContentContext.tsx +27 -0
  387. package/src/labs/SideNav/SideNavItemLinkContent.tsx +17 -14
  388. package/src/labs/SideNav/SideNavLogo.tsx +41 -0
  389. package/src/labs/SideNav/SideNavToggleButton.tsx +249 -0
  390. package/src/labs/SideNav/types.ts +72 -33
  391. package/src/labs/TopNav/TopNav.tsx +95 -0
  392. package/src/labs/TopNav/TopNavLinksList.tsx +68 -0
  393. package/src/labs/TopNav/TopNavListItem.tsx +209 -0
  394. package/src/labs/TopNav/UserProfile.tsx +79 -0
  395. package/src/labs/TopNav/index.ts +14 -0
  396. package/src/labs/UiShell/UiShell.test.tsx +284 -0
  397. package/src/labs/UiShell/UiShell.tsx +109 -0
  398. package/src/labs/UiShell/UiShellContent.tsx +170 -0
  399. package/src/labs/UiShell/bufferLatest.test.ts +79 -0
  400. package/src/labs/UiShell/bufferLatest.ts +64 -0
  401. package/src/labs/UiShell/createMessageBus.test.ts +115 -0
  402. package/src/labs/UiShell/createMessageBus.ts +53 -0
  403. package/src/labs/UiShell/createStore.test.ts +103 -0
  404. package/src/labs/UiShell/createStore.ts +37 -0
  405. package/src/labs/UiShell/index.ts +17 -0
  406. package/src/labs/UiShell/renderUiShell.test.tsx +197 -0
  407. package/src/labs/UiShell/renderUiShell.tsx +132 -0
  408. package/src/labs/UiShell/useHasUiShell.ts +25 -0
  409. package/src/labs/UiShell/useScrollState.ts +56 -0
  410. package/src/labs/index.ts +10 -3
  411. package/src/properties/odyssey-react-mui.properties +7 -0
  412. package/src/properties/translations/odyssey-react-mui_cs.properties +2 -1
  413. package/src/properties/translations/odyssey-react-mui_da.properties +2 -1
  414. package/src/properties/translations/odyssey-react-mui_de.properties +2 -1
  415. package/src/properties/translations/odyssey-react-mui_el.properties +2 -1
  416. package/src/properties/translations/odyssey-react-mui_es.properties +2 -1
  417. package/src/properties/translations/odyssey-react-mui_fi.properties +2 -1
  418. package/src/properties/translations/odyssey-react-mui_fr.properties +4 -3
  419. package/src/properties/translations/odyssey-react-mui_ht.properties +2 -1
  420. package/src/properties/translations/odyssey-react-mui_hu.properties +2 -1
  421. package/src/properties/translations/odyssey-react-mui_id.properties +2 -1
  422. package/src/properties/translations/odyssey-react-mui_it.properties +3 -2
  423. package/src/properties/translations/odyssey-react-mui_ja.properties +8 -7
  424. package/src/properties/translations/odyssey-react-mui_ko.properties +2 -1
  425. package/src/properties/translations/odyssey-react-mui_ms.properties +2 -1
  426. package/src/properties/translations/odyssey-react-mui_nb.properties +2 -1
  427. package/src/properties/translations/odyssey-react-mui_nl_NL.properties +2 -1
  428. package/src/properties/translations/odyssey-react-mui_pl.properties +2 -1
  429. package/src/properties/translations/odyssey-react-mui_pt_BR.properties +2 -1
  430. package/src/properties/translations/odyssey-react-mui_ro.properties +2 -1
  431. package/src/properties/translations/odyssey-react-mui_ru.properties +2 -1
  432. package/src/properties/translations/odyssey-react-mui_sv.properties +2 -1
  433. package/src/properties/translations/odyssey-react-mui_th.properties +2 -1
  434. package/src/properties/translations/odyssey-react-mui_tr.properties +3 -2
  435. package/src/properties/translations/odyssey-react-mui_uk.properties +2 -1
  436. package/src/properties/translations/odyssey-react-mui_vi.properties +2 -1
  437. package/src/properties/translations/odyssey-react-mui_zh_CN.properties +2 -1
  438. package/src/properties/translations/odyssey-react-mui_zh_TW.properties +2 -1
  439. package/src/properties/ts/odyssey-react-mui.ts +1 -1
  440. package/src/properties/ts/odyssey-react-mui_cs.ts +1 -1
  441. package/src/properties/ts/odyssey-react-mui_da.ts +1 -1
  442. package/src/properties/ts/odyssey-react-mui_de.ts +1 -1
  443. package/src/properties/ts/odyssey-react-mui_el.ts +1 -1
  444. package/src/properties/ts/odyssey-react-mui_es.ts +1 -1
  445. package/src/properties/ts/odyssey-react-mui_fi.ts +1 -1
  446. package/src/properties/ts/odyssey-react-mui_fr.ts +1 -1
  447. package/src/properties/ts/odyssey-react-mui_ht.ts +1 -1
  448. package/src/properties/ts/odyssey-react-mui_hu.ts +1 -1
  449. package/src/properties/ts/odyssey-react-mui_id.ts +1 -1
  450. package/src/properties/ts/odyssey-react-mui_it.ts +1 -1
  451. package/src/properties/ts/odyssey-react-mui_ja.ts +1 -1
  452. package/src/properties/ts/odyssey-react-mui_ko.ts +1 -1
  453. package/src/properties/ts/odyssey-react-mui_ms.ts +1 -1
  454. package/src/properties/ts/odyssey-react-mui_nb.ts +1 -1
  455. package/src/properties/ts/odyssey-react-mui_nl_NL.ts +1 -1
  456. package/src/properties/ts/odyssey-react-mui_pl.ts +1 -1
  457. package/src/properties/ts/odyssey-react-mui_pt_BR.ts +1 -1
  458. package/src/properties/ts/odyssey-react-mui_ro.ts +1 -1
  459. package/src/properties/ts/odyssey-react-mui_ru.ts +1 -1
  460. package/src/properties/ts/odyssey-react-mui_sv.ts +1 -1
  461. package/src/properties/ts/odyssey-react-mui_th.ts +1 -1
  462. package/src/properties/ts/odyssey-react-mui_tr.ts +1 -1
  463. package/src/properties/ts/odyssey-react-mui_uk.ts +1 -1
  464. package/src/properties/ts/odyssey-react-mui_vi.ts +1 -1
  465. package/src/properties/ts/odyssey-react-mui_zh_CN.ts +1 -1
  466. package/src/properties/ts/odyssey-react-mui_zh_TW.ts +1 -1
  467. package/src/test-selectors/querySelector.ts +1 -1
  468. package/src/theme/components.tsx +50 -33
  469. package/src/theme/createOdysseyMuiTheme.ts +4 -3
  470. package/src/theme/useContrastMode.test.tsx +503 -0
  471. package/src/useAutocomplete.tsx +183 -0
  472. package/src/useContrastMode.tsx +149 -0
  473. package/src/web-component/index.ts +14 -0
  474. package/src/web-component/renderReactInWebComponent.test.tsx +156 -0
  475. package/src/web-component/renderReactInWebComponent.ts +153 -0
  476. package/src/web-component/shadow-dom.test.ts +24 -0
  477. package/src/{createShadowDomElements.ts → web-component/shadow-dom.ts} +15 -14
  478. package/dist/ContrastModeProvider.js +0 -86
  479. package/dist/ContrastModeProvider.js.map +0 -1
  480. package/dist/createShadowDomElements.js.map +0 -1
  481. package/dist/labs/NavAccordion.js.map +0 -1
  482. package/dist/labs/TopNav.js +0 -281
  483. package/dist/labs/TopNav.js.map +0 -1
  484. package/dist/src/ContrastModeProvider.d.ts +0 -34
  485. package/dist/src/ContrastModeProvider.d.ts.map +0 -1
  486. package/dist/src/createShadowDomElements.d.ts.map +0 -1
  487. package/dist/src/labs/NavAccordion.d.ts.map +0 -1
  488. package/dist/src/labs/TopNav.d.ts +0 -78
  489. package/dist/src/labs/TopNav.d.ts.map +0 -1
  490. package/src/ContrastModeProvider.tsx +0 -131
  491. package/src/labs/TopNav.tsx +0 -396
@@ -10,44 +10,42 @@
10
10
  * See the License for the specific language governing permissions and limitations under the License.
11
11
  */
12
12
 
13
- import styled from "@emotion/styled";
13
+ import styled, { CSSObject } from "@emotion/styled";
14
14
  import {
15
15
  memo,
16
16
  useMemo,
17
17
  useState,
18
18
  useCallback,
19
- KeyboardEvent,
20
19
  useRef,
21
20
  useEffect,
21
+ KeyboardEventHandler,
22
22
  } from "react";
23
+ import { Skeleton } from "@mui/material";
24
+ import { useTranslation } from "react-i18next";
23
25
 
24
- import { ExpandLeftIcon } from "../../icons.generated";
25
- import { NavAccordion } from "../NavAccordion";
26
+ import { NavAccordion } from "./NavAccordion";
26
27
  import {
27
28
  DesignTokens,
28
29
  useOdysseyDesignTokens,
29
30
  } from "../../OdysseyDesignTokensContext";
31
+ import { OdysseyThemeProvider } from "../../OdysseyThemeProvider";
30
32
  import type { SideNavProps } from "./types";
31
- import { OktaLogo } from "./OktaLogo";
32
33
  import { SideNavHeader } from "./SideNavHeader";
33
34
  import {
34
35
  SideNavItemContent,
35
- SideNavListItemContainer,
36
+ StyledSideNavListItem,
36
37
  } from "./SideNavItemContent";
37
38
  import { SideNavFooterContent } from "./SideNavFooterContent";
39
+ import { SideNavItemContentContext } from "./SideNavItemContentContext";
40
+ import { SideNavToggleButton } from "./SideNavToggleButton";
38
41
 
39
42
  export const DEFAULT_SIDE_NAV_WIDTH = "300px";
40
43
 
41
- const SideNavContainer = styled("div", {
42
- shouldForwardProp: (prop) => prop !== "expandedWidth",
43
- })(({ expandedWidth }: { expandedWidth: SideNavProps["expandedWidth"] }) => ({
44
- display: "flex",
45
- height: "100%",
46
- maxWidth: expandedWidth,
47
- overflow: "hidden",
48
- }));
44
+ // The side nav collapse icon is placed absolutely from the top (Logo container + nav header height)
45
+ // to align it in the middle of the nav header text
46
+ export const SIDENAV_COLLAPSE_ICON_POSITION = "77px";
49
47
 
50
- const SideNavCollapsedContainer = styled("div", {
48
+ const StyledCollapsibleContent = styled("div", {
51
49
  shouldForwardProp: (prop) =>
52
50
  prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed",
53
51
  })(
@@ -58,43 +56,69 @@ const SideNavCollapsedContainer = styled("div", {
58
56
  odysseyDesignTokens: DesignTokens;
59
57
  isSideNavCollapsed: boolean;
60
58
  }) => ({
61
- backgroundColor: odysseyDesignTokens.HueNeutral300,
62
- paddingTop: odysseyDesignTokens.Spacing5,
63
- cursor: "pointer",
64
- width: isSideNavCollapsed ? "auto" : 0,
65
- opacity: isSideNavCollapsed ? 1 : 0,
66
- visibility: isSideNavCollapsed ? "visible" : "hidden",
67
- transitionProperty: "opacity",
68
- transitionDuration: odysseyDesignTokens.TransitionDurationMain,
59
+ position: "relative",
60
+ display: "inline-grid",
61
+ gridTemplateColumns: isSideNavCollapsed ? 0 : DEFAULT_SIDE_NAV_WIDTH,
62
+ gridTemplateRows: "max-content 1fr max-content",
63
+ minWidth: isSideNavCollapsed ? 0 : DEFAULT_SIDE_NAV_WIDTH,
64
+ height: "100%",
65
+ transition: `grid-template-columns ${odysseyDesignTokens.TransitionDurationMain}, opacity 300ms`,
69
66
  transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,
67
+ overflow: "hidden",
68
+ opacity: isSideNavCollapsed ? 0 : 1,
70
69
  }),
71
70
  );
72
71
 
73
- const SideNavExpandContainer = styled("nav", {
72
+ const StyledSideNav = styled("nav", {
74
73
  shouldForwardProp: (prop) =>
75
- prop !== "odysseyDesignTokens" &&
76
- prop !== "isSideNavCollapsed" &&
77
- prop !== "expandedWidth",
74
+ prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed",
78
75
  })(
79
76
  ({
80
77
  odysseyDesignTokens,
81
78
  isSideNavCollapsed,
82
- expandedWidth,
83
79
  }: {
84
80
  odysseyDesignTokens: DesignTokens;
85
81
  isSideNavCollapsed: boolean;
86
- expandedWidth: string;
87
82
  }) => ({
83
+ position: "relative",
84
+ display: "inline-block",
85
+ height: "100%",
88
86
  backgroundColor: odysseyDesignTokens.HueNeutralWhite,
89
- flexDirection: "column",
90
- display: "flex",
91
- opacity: isSideNavCollapsed ? 0 : 1,
92
- visibility: isSideNavCollapsed ? "hidden" : "visible",
93
- width: isSideNavCollapsed ? "0" : expandedWidth,
94
- transitionProperty: "opacity, width",
95
- transitionDuration: odysseyDesignTokens.TransitionDurationMain,
96
- transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,
97
- borderRight: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`,
87
+
88
+ "&::after": {
89
+ backgroundColor: odysseyDesignTokens.HueNeutral200,
90
+ content: "''",
91
+ height: "100%",
92
+ opacity: 0,
93
+ position: "absolute",
94
+ right: 0,
95
+ top: 0,
96
+ transform: `translateX(0)`,
97
+ transition: `opacity ${odysseyDesignTokens.TransitionDurationMain}, transform ${odysseyDesignTokens.TransitionDurationMain}`,
98
+ width: odysseyDesignTokens.Spacing2,
99
+ },
100
+
101
+ "&:has([data-sidenav-toggle='true']:hover), &:has([data-sidenav-toggle='true']:focus)":
102
+ {
103
+ ...(isSideNavCollapsed && {
104
+ "&::after": {
105
+ opacity: 1,
106
+ transform: `translateX(100%)`,
107
+ },
108
+
109
+ "[data-sidenav-toggle='true']": {
110
+ transform: `translate3d(calc(100% + ${odysseyDesignTokens.Spacing3}), 0, 0)`,
111
+ },
112
+ }),
113
+ },
114
+
115
+ "[data-sidenav-toggle='true']": {
116
+ position: "absolute",
117
+ top: SIDENAV_COLLAPSE_ICON_POSITION,
118
+ right: 0,
119
+ transition: `transform ${odysseyDesignTokens.TransitionDurationMain}`,
120
+ transform: `translate3d(100%, 0, 0)`,
121
+ },
98
122
  }),
99
123
  );
100
124
 
@@ -109,36 +133,43 @@ const SideNavHeaderContainer = styled("div", {
109
133
  hasContentScrolled: boolean;
110
134
  odysseyDesignTokens: DesignTokens;
111
135
  }) => ({
112
- position: "sticky",
113
- top: 0,
136
+ flexShrink: 0,
114
137
  // The bottom border should appear only if the scrollable region has been scrolled
115
- ...(hasContentScrolled && {
116
- borderBottom: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`,
117
- }),
138
+ ...(hasContentScrolled &&
139
+ ({
140
+ borderBottom: `${odysseyDesignTokens.BorderWidthMain} ${odysseyDesignTokens.BorderStyleMain} ${odysseyDesignTokens.HueNeutral50}`,
141
+ } satisfies CSSObject)),
118
142
  }),
119
143
  );
120
144
 
121
- const SideNavListContainer = styled.ul({
145
+ const SideNavListContainer = styled("ul")(() => ({
122
146
  padding: 0,
123
147
  listStyle: "none",
124
148
  listStyleType: "none",
125
- });
149
+ }));
126
150
 
127
- const SideNavScrollableContainer = styled.div({
128
- flex: 1,
151
+ const SideNavScrollableContainer = styled("div", {
152
+ shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
153
+ })(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
154
+ flex: "1 1 100%",
129
155
  overflowY: "auto",
130
- });
156
+ paddingInline: odysseyDesignTokens.Spacing2,
157
+ }));
158
+
159
+ const SectionHeaderContainer = styled("li", {
160
+ shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
161
+ })(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
162
+ paddingBlock: odysseyDesignTokens.Spacing3,
163
+ paddingInline: odysseyDesignTokens.Spacing4,
164
+ }));
131
165
 
132
- const SectionHeader = styled("li", {
166
+ const SectionHeader = styled("h3", {
133
167
  shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
134
168
  })(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
135
169
  fontFamily: odysseyDesignTokens.TypographyFamilyHeading,
136
170
  fontSize: odysseyDesignTokens.TypographySizeOverline,
137
171
  fontWeight: odysseyDesignTokens.TypographyWeightHeadingBold,
138
172
  color: odysseyDesignTokens.HueNeutral600,
139
- paddingTop: odysseyDesignTokens.Spacing3,
140
- paddingBottom: odysseyDesignTokens.Spacing3,
141
- paddingLeft: odysseyDesignTokens.Spacing4,
142
173
  textTransform: "uppercase",
143
174
  }));
144
175
 
@@ -153,15 +184,14 @@ const SideNavFooter = styled("div", {
153
184
  isContentScrollable: boolean;
154
185
  odysseyDesignTokens: DesignTokens;
155
186
  }) => ({
156
- position: "sticky",
157
- bottom: 0,
158
- paddingTop: odysseyDesignTokens.Spacing2,
187
+ flexShrink: 0,
159
188
  transitionProperty: "box-shadow",
160
189
  transitionDuration: odysseyDesignTokens.TransitionDurationMain,
161
190
  transitionTiming: odysseyDesignTokens.TransitionTimingMain,
191
+ backgroundColor: odysseyDesignTokens.HueNeutralWhite,
162
192
  // The box shadow should appear above the footer only if the scrollable region has overflow
163
193
  ...(isContentScrollable && {
164
- boxShadow: odysseyDesignTokens.DepthHigh,
194
+ boxShadow: "0px -8px 8px -8px rgba(39, 39, 39, 0.08)",
165
195
  }),
166
196
  }),
167
197
  );
@@ -169,45 +199,74 @@ const SideNavFooter = styled("div", {
169
199
  const SideNavFooterItemsContainer = styled("div", {
170
200
  shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
171
201
  })(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
172
- paddingTop: odysseyDesignTokens.Spacing2,
173
- paddingBottom: odysseyDesignTokens.Spacing2,
202
+ paddingBlock: odysseyDesignTokens.Spacing4,
203
+ // paddingBlockEnd: odysseyDesignTokens.Spacing4,
204
+ paddingInline: odysseyDesignTokens.Spacing5,
174
205
  display: "flex",
175
- justifyContent: "center",
176
206
  flexWrap: "wrap",
177
207
  alignItems: "center",
178
208
  fontSize: odysseyDesignTokens.TypographySizeOverline,
179
- "& a": {
209
+
210
+ a: {
180
211
  color: `${odysseyDesignTokens.TypographyColorHeading} !important`,
181
- },
182
- "& a:hover": {
183
- textDecoration: "none",
184
- },
185
- "& a:visited": {
186
- color: odysseyDesignTokens.TypographyColorHeading,
212
+
213
+ "&:hover": {
214
+ textDecoration: "none",
215
+ },
216
+ "&:visited": {
217
+ color: odysseyDesignTokens.TypographyColorHeading,
218
+ },
187
219
  },
188
220
  }));
189
221
 
222
+ const LoadingItemContainer = styled("div", {
223
+ shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
224
+ })(({ odysseyDesignTokens }: { odysseyDesignTokens: DesignTokens }) => ({
225
+ alignItems: "center",
226
+ display: "flex",
227
+ gap: odysseyDesignTokens.Spacing2,
228
+ paddingBlock: odysseyDesignTokens.Spacing2,
229
+ paddingInline: odysseyDesignTokens.Spacing4,
230
+ }));
231
+
190
232
  const getHasScrollableContent = (scrollableContainer: HTMLElement) =>
191
233
  scrollableContainer.scrollHeight > scrollableContainer.clientHeight;
192
234
 
235
+ const LoadingItem = () => {
236
+ const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();
237
+ return (
238
+ <LoadingItemContainer odysseyDesignTokens={odysseyDesignTokens}>
239
+ <Skeleton
240
+ variant="circular"
241
+ width={odysseyDesignTokens.Spacing4}
242
+ height={odysseyDesignTokens.Spacing4}
243
+ />
244
+ <Skeleton variant="rounded" width="100%" />
245
+ </LoadingItemContainer>
246
+ );
247
+ };
248
+
193
249
  const SideNav = ({
194
- navHeaderText,
250
+ appName,
251
+ footerComponent,
252
+ footerItems,
253
+ hasCustomFooter,
195
254
  isCollapsible,
255
+ isCompact,
256
+ isLoading,
257
+ logoProps,
196
258
  onCollapse,
197
259
  onExpand,
198
260
  sideNavItems,
199
- expandedWidth = DEFAULT_SIDE_NAV_WIDTH,
200
- footerItems,
201
- footerComponent,
202
- logo,
203
261
  }: SideNavProps) => {
204
262
  const [isSideNavCollapsed, setSideNavCollapsed] = useState(false);
205
- const odysseyDesignTokens = useOdysseyDesignTokens();
206
263
  const [isContentScrollable, setIsContentScrollable] = useState(false);
207
264
  const [hasContentScrolled, setHasContentScrolled] = useState(false);
208
265
  const scrollableContentRef = useRef<HTMLUListElement>(null);
209
266
  const resizeObserverRef = useRef<ResizeObserver | null>(null);
210
267
  const intersectionObserverRef = useRef<IntersectionObserver | null>(null);
268
+ const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();
269
+ const { t } = useTranslation();
211
270
 
212
271
  useEffect(() => {
213
272
  const updateIsContentScrollable = () => {
@@ -267,10 +326,14 @@ const SideNav = ({
267
326
  },
268
327
  );
269
328
  }
329
+
270
330
  if (intersectionObserverRef.current && scrollableContentRef.current) {
271
- const ul = scrollableContentRef.current;
272
- const li = ul?.firstChild;
273
- intersectionObserverRef.current.observe(li as HTMLElement);
331
+ const ulElement = scrollableContentRef.current;
332
+ const [liElement] = Array.from(ulElement?.children || []);
333
+
334
+ if (liElement) {
335
+ intersectionObserverRef.current.observe(liElement);
336
+ }
274
337
  }
275
338
 
276
339
  // Cleanup when unmounted:
@@ -285,7 +348,7 @@ const SideNav = ({
285
348
  }
286
349
  cancelAnimationFrame(resizeObserverDebounceTimer); // Ensure timer is cleared on component unmount
287
350
  };
288
- }, []);
351
+ }, [sideNavItems]);
289
352
 
290
353
  const scrollIntoViewRef = useRef<HTMLLIElement>(null);
291
354
  /**
@@ -328,155 +391,179 @@ const SideNav = ({
328
391
  [firstSideNavItemIdWithIsSelected],
329
392
  );
330
393
 
394
+ const sideNavItemContentProviderValue = useMemo(
395
+ () => ({ isCompact, depth: 1 }),
396
+ [isCompact],
397
+ );
398
+
331
399
  const processedSideNavItems = useMemo(
332
400
  () =>
333
401
  sideNavItems.map((item) => ({
334
402
  ...item,
335
- children: item.children?.map((childProps) => (
336
- <SideNavItemContent
337
- key={childProps.id}
338
- scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}
339
- {...childProps}
340
- />
341
- )),
403
+ children: item.children?.map((childProps) => {
404
+ return (
405
+ <SideNavItemContentContext.Provider
406
+ value={{ ...sideNavItemContentProviderValue, depth: 2 }}
407
+ key={childProps.id}
408
+ >
409
+ <SideNavItemContent
410
+ {...childProps}
411
+ key={childProps.id}
412
+ scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}
413
+ />
414
+ </SideNavItemContentContext.Provider>
415
+ );
416
+ }),
342
417
  })),
343
- [getRefIfThisIsFirstNodeWithIsSelected, sideNavItems],
418
+ [
419
+ getRefIfThisIsFirstNodeWithIsSelected,
420
+ sideNavItems,
421
+ sideNavItemContentProviderValue,
422
+ ],
344
423
  );
345
424
 
346
- const sideNavCollapseHandler = useCallback(() => {
347
- setSideNavCollapsed(!isSideNavCollapsed);
348
- onCollapse?.();
349
- }, [isSideNavCollapsed, setSideNavCollapsed, onCollapse]);
350
-
351
425
  const sideNavExpandClickHandler = useCallback(() => {
426
+ isSideNavCollapsed ? onExpand?.() : onCollapse?.();
352
427
  setSideNavCollapsed(!isSideNavCollapsed);
353
- onExpand?.();
354
- }, [isSideNavCollapsed, setSideNavCollapsed, onExpand]);
428
+ }, [isSideNavCollapsed, setSideNavCollapsed, onExpand, onCollapse]);
355
429
 
356
- const sideNavExpandKeyHandler = useCallback(
357
- (event: KeyboardEvent<HTMLDivElement>) => {
430
+ const sideNavExpandKeyHandler = useCallback<
431
+ KeyboardEventHandler<HTMLButtonElement>
432
+ >(
433
+ (event) => {
358
434
  if (event?.key === "Enter" || event?.code === "Space") {
359
435
  event.preventDefault();
360
- setSideNavCollapsed(!isSideNavCollapsed);
361
- onExpand?.();
436
+ sideNavExpandClickHandler();
362
437
  }
363
438
  },
364
- [isSideNavCollapsed, setSideNavCollapsed, onExpand],
365
- );
366
-
367
- const expandLeftIconStyles = useMemo(
368
- () => ({
369
- fontSize: "1em",
370
- margin: `0 ${odysseyDesignTokens.Spacing1}`,
371
- }),
372
- [odysseyDesignTokens],
439
+ [sideNavExpandClickHandler],
373
440
  );
374
441
 
375
442
  return (
376
- <SideNavContainer expandedWidth={expandedWidth}>
377
- <SideNavCollapsedContainer
378
- tabIndex={0}
379
- role="button"
380
- odysseyDesignTokens={odysseyDesignTokens}
381
- isSideNavCollapsed={isSideNavCollapsed}
382
- onClick={sideNavExpandClickHandler}
383
- onKeyDown={sideNavExpandKeyHandler}
384
- data-se="collapsed-region"
385
- data-aria-label="expand side navigation"
386
- >
387
- <ExpandLeftIcon sx={expandLeftIconStyles} />
388
- </SideNavCollapsedContainer>
389
- <SideNavExpandContainer
390
- odysseyDesignTokens={odysseyDesignTokens}
391
- isSideNavCollapsed={isSideNavCollapsed}
392
- data-se="expanded-region"
393
- expandedWidth={expandedWidth}
394
- aria-label={navHeaderText}
395
- >
396
- <SideNavHeaderContainer
443
+ <StyledSideNav
444
+ aria-label={t("navigation.label")}
445
+ id="side-nav-expandable"
446
+ isSideNavCollapsed={isSideNavCollapsed}
447
+ odysseyDesignTokens={odysseyDesignTokens}
448
+ >
449
+ {isCollapsible && (
450
+ <SideNavToggleButton
451
+ ariaControls="side-nav-expandable"
452
+ isSideNavCollapsed={isSideNavCollapsed}
453
+ onClick={sideNavExpandClickHandler}
454
+ onKeyDown={sideNavExpandKeyHandler}
455
+ />
456
+ )}
457
+ <OdysseyThemeProvider>
458
+ <StyledCollapsibleContent
459
+ data-se="collapsible-region"
460
+ isSideNavCollapsed={isSideNavCollapsed}
397
461
  odysseyDesignTokens={odysseyDesignTokens}
398
- hasContentScrolled={hasContentScrolled}
399
462
  >
400
- <SideNavHeader
401
- logo={logo || <OktaLogo />}
402
- navHeaderText={navHeaderText}
403
- isCollapsible={isCollapsible}
404
- onCollapse={sideNavCollapseHandler}
405
- />
406
- </SideNavHeaderContainer>
407
- <SideNavScrollableContainer data-se="scrollable-region">
408
- <SideNavListContainer ref={scrollableContentRef}>
409
- {processedSideNavItems?.map((item) => {
410
- const {
411
- id,
412
- label,
413
- isSectionHeader,
414
- startIcon,
415
- children,
416
- isDefaultExpanded,
417
- isDisabled,
418
- isExpanded,
419
- } = item;
420
-
421
- if (isSectionHeader) {
422
- return (
423
- <SectionHeader
424
- id={id}
425
- key={id}
426
- odysseyDesignTokens={odysseyDesignTokens}
427
- >
428
- {label}
429
- </SectionHeader>
430
- );
431
- } else if (children) {
432
- return (
433
- <SideNavListItemContainer
434
- id={id}
435
- key={id}
436
- odysseyDesignTokens={odysseyDesignTokens}
437
- >
438
- <NavAccordion
439
- label={label}
440
- isDefaultExpanded={isDefaultExpanded}
441
- isExpanded={isExpanded}
442
- startIcon={startIcon}
443
- isDisabled={isDisabled}
444
- >
445
- <SideNavListContainer id={`${id}-list`}>
446
- {children}
447
- </SideNavListContainer>
448
- </NavAccordion>
449
- </SideNavListItemContainer>
450
- );
451
- } else {
452
- return (
453
- <SideNavItemContent
454
- key={item.id}
455
- scrollRef={getRefIfThisIsFirstNodeWithIsSelected(item.id)}
456
- {...item}
457
- />
458
- );
459
- }
460
- })}
461
- </SideNavListContainer>
462
- </SideNavScrollableContainer>
463
- {(footerItems || footerComponent) && (
464
- <SideNavFooter
463
+ <SideNavHeaderContainer
465
464
  odysseyDesignTokens={odysseyDesignTokens}
466
- isContentScrollable={isContentScrollable}
465
+ hasContentScrolled={hasContentScrolled}
467
466
  >
468
- {footerComponent}
469
- {footerItems && !footerComponent && (
470
- <SideNavFooterItemsContainer
471
- odysseyDesignTokens={odysseyDesignTokens}
472
- >
473
- <SideNavFooterContent footerItems={footerItems} />
474
- </SideNavFooterItemsContainer>
475
- )}
476
- </SideNavFooter>
477
- )}
478
- </SideNavExpandContainer>
479
- </SideNavContainer>
467
+ <SideNavHeader
468
+ appName={appName}
469
+ isLoading={isLoading}
470
+ logoProps={logoProps}
471
+ />
472
+ </SideNavHeaderContainer>
473
+ <SideNavScrollableContainer
474
+ odysseyDesignTokens={odysseyDesignTokens}
475
+ data-se="scrollable-region"
476
+ >
477
+ <SideNavListContainer role="list" ref={scrollableContentRef}>
478
+ {isLoading
479
+ ? [...Array(6)].map((_, index) => <LoadingItem key={index} />)
480
+ : processedSideNavItems?.map((item) => {
481
+ const {
482
+ id,
483
+ label,
484
+ isSectionHeader,
485
+ startIcon,
486
+ children,
487
+ isDefaultExpanded,
488
+ isDisabled,
489
+ isExpanded,
490
+ } = item;
491
+
492
+ if (isSectionHeader) {
493
+ return (
494
+ <SectionHeaderContainer
495
+ id={id}
496
+ key={id}
497
+ odysseyDesignTokens={odysseyDesignTokens}
498
+ >
499
+ <SectionHeader
500
+ odysseyDesignTokens={odysseyDesignTokens}
501
+ >
502
+ {label}
503
+ </SectionHeader>
504
+ </SectionHeaderContainer>
505
+ );
506
+ } else if (children) {
507
+ return (
508
+ <StyledSideNavListItem
509
+ id={id}
510
+ key={id}
511
+ odysseyDesignTokens={odysseyDesignTokens}
512
+ disabled={isDisabled}
513
+ aria-disabled={isDisabled}
514
+ >
515
+ <NavAccordion
516
+ label={label}
517
+ isCompact={isCompact}
518
+ isDefaultExpanded={isDefaultExpanded}
519
+ isExpanded={isExpanded}
520
+ startIcon={startIcon}
521
+ isDisabled={isDisabled}
522
+ >
523
+ <SideNavListContainer id={`${id}-list`} role="list">
524
+ {children}
525
+ </SideNavListContainer>
526
+ </NavAccordion>
527
+ </StyledSideNavListItem>
528
+ );
529
+ } else {
530
+ return (
531
+ <SideNavItemContentContext.Provider
532
+ key={item.id}
533
+ value={sideNavItemContentProviderValue}
534
+ >
535
+ <SideNavItemContent
536
+ {...item}
537
+ key={item.id}
538
+ scrollRef={getRefIfThisIsFirstNodeWithIsSelected(
539
+ item.id,
540
+ )}
541
+ />
542
+ </SideNavItemContentContext.Provider>
543
+ );
544
+ }
545
+ })}
546
+ </SideNavListContainer>
547
+ </SideNavScrollableContainer>
548
+ {!isLoading && (footerItems || hasCustomFooter) && (
549
+ <SideNavFooter
550
+ odysseyDesignTokens={odysseyDesignTokens}
551
+ isContentScrollable={isContentScrollable}
552
+ >
553
+ {hasCustomFooter
554
+ ? footerComponent
555
+ : footerItems && (
556
+ <SideNavFooterItemsContainer
557
+ odysseyDesignTokens={odysseyDesignTokens}
558
+ >
559
+ <SideNavFooterContent footerItems={footerItems} />
560
+ </SideNavFooterItemsContainer>
561
+ )}
562
+ </SideNavFooter>
563
+ )}
564
+ </StyledCollapsibleContent>
565
+ </OdysseyThemeProvider>
566
+ </StyledSideNav>
480
567
  );
481
568
  };
482
569