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