@okta/odyssey-react-mui 1.32.0 → 1.32.4

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 (458) hide show
  1. package/dist/cjs/theme/components.cjs +6 -0
  2. package/dist/cjs/theme/components.cjs.map +1 -1
  3. package/dist/cjs/ui-shell/SideNav/SideNav.cjs +2 -1
  4. package/dist/cjs/ui-shell/SideNav/SideNav.cjs.map +1 -1
  5. package/dist/cjs/ui-shell/SideNav/SideNavItemContent.cjs +36 -11
  6. package/dist/cjs/ui-shell/SideNav/SideNavItemContent.cjs.map +1 -1
  7. package/dist/cjs/ui-shell/SideNav/SideNavItemLinkContent.cjs +3 -1
  8. package/dist/cjs/ui-shell/SideNav/SideNavItemLinkContent.cjs.map +1 -1
  9. package/dist/cjs/ui-shell/SideNav/SideNavLogo.cjs +14 -2
  10. package/dist/cjs/ui-shell/SideNav/SideNavLogo.cjs.map +1 -1
  11. package/dist/cjs/ui-shell/SideNav/SideNavToggleButton.cjs +1 -1
  12. package/dist/cjs/ui-shell/SideNav/SideNavToggleButton.cjs.map +1 -1
  13. package/dist/cjs/ui-shell/SideNav/types.cjs.map +1 -1
  14. package/dist/cjs/ui-shell/UiShellContent.cjs +48 -32
  15. package/dist/cjs/ui-shell/UiShellContent.cjs.map +1 -1
  16. package/dist/cjs/ui-shell/index.cjs +9 -1
  17. package/dist/cjs/ui-shell/index.cjs.map +1 -1
  18. package/dist/cjs/useContrastMode.cjs +1 -1
  19. package/dist/cjs/useContrastMode.cjs.map +1 -1
  20. package/dist/esm/theme/components.js +6 -0
  21. package/dist/esm/theme/components.js.map +1 -1
  22. package/dist/esm/ui-shell/SideNav/SideNav.js +2 -1
  23. package/dist/esm/ui-shell/SideNav/SideNav.js.map +1 -1
  24. package/dist/esm/ui-shell/SideNav/SideNavItemContent.js +37 -12
  25. package/dist/esm/ui-shell/SideNav/SideNavItemContent.js.map +1 -1
  26. package/dist/esm/ui-shell/SideNav/SideNavItemLinkContent.js +3 -1
  27. package/dist/esm/ui-shell/SideNav/SideNavItemLinkContent.js.map +1 -1
  28. package/dist/esm/ui-shell/SideNav/SideNavLogo.js +14 -2
  29. package/dist/esm/ui-shell/SideNav/SideNavLogo.js.map +1 -1
  30. package/dist/esm/ui-shell/SideNav/SideNavToggleButton.js +1 -1
  31. package/dist/esm/ui-shell/SideNav/SideNavToggleButton.js.map +1 -1
  32. package/dist/esm/ui-shell/SideNav/types.js.map +1 -1
  33. package/dist/esm/ui-shell/UiShellContent.js +45 -31
  34. package/dist/esm/ui-shell/UiShellContent.js.map +1 -1
  35. package/dist/esm/ui-shell/index.js +1 -0
  36. package/dist/esm/ui-shell/index.js.map +1 -1
  37. package/dist/esm/useContrastMode.js +2 -2
  38. package/dist/esm/useContrastMode.js.map +1 -1
  39. package/dist/index.cjs +1 -1
  40. package/dist/index.mjs +1 -1
  41. package/dist/index.scss +1 -1
  42. package/dist/tsconfig.production.tsbuildinfo +1 -1
  43. package/dist/types/theme/components.d.ts.map +1 -1
  44. package/dist/types/ui-shell/SideNav/SideNav.d.ts.map +1 -1
  45. package/dist/types/ui-shell/SideNav/SideNavItemContent.d.ts +9 -7
  46. package/dist/types/ui-shell/SideNav/SideNavItemContent.d.ts.map +1 -1
  47. package/dist/types/ui-shell/SideNav/SideNavItemLinkContent.d.ts +1 -1
  48. package/dist/types/ui-shell/SideNav/SideNavItemLinkContent.d.ts.map +1 -1
  49. package/dist/types/ui-shell/SideNav/SideNavLogo.d.ts.map +1 -1
  50. package/dist/types/ui-shell/SideNav/types.d.ts +5 -1
  51. package/dist/types/ui-shell/SideNav/types.d.ts.map +1 -1
  52. package/dist/types/ui-shell/UiShellContent.d.ts +8 -2
  53. package/dist/types/ui-shell/UiShellContent.d.ts.map +1 -1
  54. package/dist/types/ui-shell/index.d.ts +1 -1
  55. package/dist/types/ui-shell/index.d.ts.map +1 -1
  56. package/package.json +4 -4
  57. package/.browserslistrc +0 -1
  58. package/.svgrrc.cjs +0 -13
  59. package/CHANGELOG.md +0 -1490
  60. package/babel.config.cjs +0 -112
  61. package/i18n.config.json +0 -10
  62. package/scripts/generateIconsIndex.ts +0 -49
  63. package/scripts/generateTestSelectorsJson.ts +0 -33
  64. package/scripts/properties-to-ts.ts +0 -111
  65. package/src/@types/i18next.d.ts +0 -24
  66. package/src/@types/properties.d.ts +0 -292
  67. package/src/@types/react-augment.d.ts +0 -22
  68. package/src/Accordion.tsx +0 -117
  69. package/src/Autocomplete.tsx +0 -321
  70. package/src/Badge.tsx +0 -112
  71. package/src/Banner.tsx +0 -112
  72. package/src/Box.tsx +0 -44
  73. package/src/Breadcrumbs.tsx +0 -221
  74. package/src/Buttons/BaseButton.tsx +0 -250
  75. package/src/Buttons/BaseMenuButton.tsx +0 -342
  76. package/src/Buttons/Button.tsx +0 -30
  77. package/src/Buttons/ButtonContext.tsx +0 -23
  78. package/src/Buttons/MenuButton.tsx +0 -33
  79. package/src/Buttons/MenuContext.ts +0 -25
  80. package/src/Buttons/MenuItem.tsx +0 -103
  81. package/src/Buttons/index.ts +0 -25
  82. package/src/Callout.tsx +0 -176
  83. package/src/Card.tsx +0 -186
  84. package/src/Checkbox.tsx +0 -261
  85. package/src/CheckboxGroup.tsx +0 -127
  86. package/src/CircularProgress.tsx +0 -42
  87. package/src/CssBaseline.tsx +0 -20
  88. package/src/DataTable/DataTable.tsx +0 -968
  89. package/src/DataTable/DataTableRowActions.tsx +0 -132
  90. package/src/DataTable/DataTableSettings.tsx +0 -136
  91. package/src/DataTable/constants.ts +0 -13
  92. package/src/DataTable/index.tsx +0 -28
  93. package/src/DataTable/reorderDataRowsLocally.tsx +0 -48
  94. package/src/DataTable/useRowReordering.tsx +0 -232
  95. package/src/DataTable/useScrollIndication.tsx +0 -125
  96. package/src/DatePickers/DateField.tsx +0 -267
  97. package/src/DatePickers/DateFieldActionBar.tsx +0 -65
  98. package/src/DatePickers/DateFieldLocalizationProvider.tsx +0 -46
  99. package/src/DatePickers/DatePicker.test.tsx +0 -66
  100. package/src/DatePickers/DatePicker.tsx +0 -299
  101. package/src/DatePickers/DatePicker.types.d.ts +0 -14
  102. package/src/DatePickers/TimeZonePicker.tsx +0 -59
  103. package/src/DatePickers/datePickerTheme.tsx +0 -377
  104. package/src/DatePickers/index.ts +0 -15
  105. package/src/DatePickers/useDateFieldsTranslations.ts +0 -94
  106. package/src/DatePickers/useOdysseyDateFields.ts +0 -303
  107. package/src/Dialog.tsx +0 -178
  108. package/src/Drawer.tsx +0 -255
  109. package/src/EmptyState.tsx +0 -79
  110. package/src/ErrorMessageList.tsx +0 -56
  111. package/src/Field.tsx +0 -189
  112. package/src/FieldComponentProps.ts +0 -66
  113. package/src/FieldError.tsx +0 -59
  114. package/src/FieldHint.tsx +0 -72
  115. package/src/FieldLabel.tsx +0 -67
  116. package/src/Fieldset.tsx +0 -116
  117. package/src/FieldsetContext.tsx +0 -23
  118. package/src/FileUploader/FileUploadIllustration.tsx +0 -66
  119. package/src/FileUploader/FileUploadPreview.tsx +0 -151
  120. package/src/FileUploader/FileUploader.tsx +0 -311
  121. package/src/FileUploader/index.ts +0 -13
  122. package/src/Form.tsx +0 -185
  123. package/src/FormCheckedProps.ts +0 -59
  124. package/src/HintLink.tsx +0 -28
  125. package/src/HtmlProps.ts +0 -112
  126. package/src/IconWithTooltip.tsx +0 -90
  127. package/src/Link.tsx +0 -115
  128. package/src/MuiPropsChild.tsx +0 -42
  129. package/src/MuiPropsContext.ts +0 -18
  130. package/src/NativeSelect.tsx +0 -249
  131. package/src/NullElement.tsx +0 -13
  132. package/src/OdysseyCacheProvider.test.tsx +0 -39
  133. package/src/OdysseyCacheProvider.tsx +0 -86
  134. package/src/OdysseyDesignTokensContext.tsx +0 -23
  135. package/src/OdysseyProvider.tsx +0 -92
  136. package/src/OdysseyThemeProvider.test.tsx +0 -211
  137. package/src/OdysseyThemeProvider.tsx +0 -109
  138. package/src/OdysseyTranslationProvider.test.tsx +0 -95
  139. package/src/OdysseyTranslationProvider.tsx +0 -77
  140. package/src/OdysseyTranslationProvider.types.ts +0 -47
  141. package/src/Pagination/Pagination.test.tsx +0 -327
  142. package/src/Pagination/Pagination.tsx +0 -417
  143. package/src/Pagination/constants.ts +0 -13
  144. package/src/Pagination/index.ts +0 -15
  145. package/src/Pagination/usePagination.ts +0 -45
  146. package/src/PasswordField.tsx +0 -253
  147. package/src/Radio.tsx +0 -199
  148. package/src/RadioGroup.tsx +0 -164
  149. package/src/ScreenReaderText.tsx +0 -53
  150. package/src/SearchField.tsx +0 -240
  151. package/src/Select.tsx +0 -576
  152. package/src/Stack.tsx +0 -56
  153. package/src/Status.tsx +0 -67
  154. package/src/Surface.tsx +0 -61
  155. package/src/SvgIcon.ts +0 -22
  156. package/src/Switch.tsx +0 -425
  157. package/src/Tabs.tsx +0 -259
  158. package/src/Tag.tsx +0 -317
  159. package/src/TagList.tsx +0 -55
  160. package/src/TagListContext.tsx +0 -23
  161. package/src/TextField.tsx +0 -298
  162. package/src/Toast.tsx +0 -151
  163. package/src/ToastStack.tsx +0 -43
  164. package/src/Tooltip.tsx +0 -61
  165. package/src/Typography.test.tsx +0 -26
  166. package/src/Typography.tsx +0 -474
  167. package/src/createContrastColors.ts +0 -112
  168. package/src/createUniqueAlphabeticalId.test.ts +0 -22
  169. package/src/createUniqueAlphabeticalId.ts +0 -17
  170. package/src/createUniqueId.test.ts +0 -22
  171. package/src/createUniqueId.ts +0 -17
  172. package/src/getTypedObjectKeys.ts +0 -15
  173. package/src/hexToRgb.ts +0 -40
  174. package/src/i18n.ts +0 -110
  175. package/src/icons.generated/Add.tsx +0 -44
  176. package/src/icons.generated/AddCircle.tsx +0 -46
  177. package/src/icons.generated/Apps.tsx +0 -44
  178. package/src/icons.generated/ArrowBottom.tsx +0 -46
  179. package/src/icons.generated/ArrowDown.tsx +0 -46
  180. package/src/icons.generated/ArrowLeft.tsx +0 -46
  181. package/src/icons.generated/ArrowLowerLeft.tsx +0 -46
  182. package/src/icons.generated/ArrowLowerRight.tsx +0 -46
  183. package/src/icons.generated/ArrowRight.tsx +0 -46
  184. package/src/icons.generated/ArrowTop.tsx +0 -46
  185. package/src/icons.generated/ArrowUnsorted.tsx +0 -46
  186. package/src/icons.generated/ArrowUp.tsx +0 -46
  187. package/src/icons.generated/ArrowUpperLeft.tsx +0 -46
  188. package/src/icons.generated/ArrowUpperRight.tsx +0 -46
  189. package/src/icons.generated/Bug.tsx +0 -44
  190. package/src/icons.generated/Calendar.tsx +0 -46
  191. package/src/icons.generated/Call.tsx +0 -44
  192. package/src/icons.generated/Chat.tsx +0 -44
  193. package/src/icons.generated/Check.tsx +0 -44
  194. package/src/icons.generated/CheckCircleFilled.tsx +0 -47
  195. package/src/icons.generated/ChevronDown.tsx +0 -46
  196. package/src/icons.generated/ChevronLeft.tsx +0 -46
  197. package/src/icons.generated/ChevronRight.tsx +0 -46
  198. package/src/icons.generated/ChevronUp.tsx +0 -46
  199. package/src/icons.generated/Clock.tsx +0 -44
  200. package/src/icons.generated/Close.tsx +0 -44
  201. package/src/icons.generated/CloseCircleFilled.tsx +0 -47
  202. package/src/icons.generated/CollapseLeft.tsx +0 -46
  203. package/src/icons.generated/CollapseRight.tsx +0 -46
  204. package/src/icons.generated/Copy.tsx +0 -44
  205. package/src/icons.generated/Custom.tsx +0 -50
  206. package/src/icons.generated/DangerDiamond.tsx +0 -46
  207. package/src/icons.generated/DangerDiamondFilled.tsx +0 -47
  208. package/src/icons.generated/Delete.tsx +0 -44
  209. package/src/icons.generated/Deny.tsx +0 -44
  210. package/src/icons.generated/Devices.tsx +0 -46
  211. package/src/icons.generated/Directory.tsx +0 -46
  212. package/src/icons.generated/Documentation.tsx +0 -46
  213. package/src/icons.generated/Download.tsx +0 -46
  214. package/src/icons.generated/DragIndicator.tsx +0 -46
  215. package/src/icons.generated/Duo.tsx +0 -62
  216. package/src/icons.generated/Edit.tsx +0 -44
  217. package/src/icons.generated/Email.tsx +0 -49
  218. package/src/icons.generated/ExpandLeft.tsx +0 -46
  219. package/src/icons.generated/ExpandRight.tsx +0 -46
  220. package/src/icons.generated/ExternalLink.tsx +0 -44
  221. package/src/icons.generated/Fido2.tsx +0 -72
  222. package/src/icons.generated/Filter.tsx +0 -44
  223. package/src/icons.generated/Folder.tsx +0 -44
  224. package/src/icons.generated/Globe.tsx +0 -44
  225. package/src/icons.generated/GoogleAuth.tsx +0 -70
  226. package/src/icons.generated/Grid.tsx +0 -47
  227. package/src/icons.generated/Group.tsx +0 -44
  228. package/src/icons.generated/Hide.tsx +0 -44
  229. package/src/icons.generated/Home.tsx +0 -44
  230. package/src/icons.generated/Idp.tsx +0 -54
  231. package/src/icons.generated/InformationCircle.tsx +0 -47
  232. package/src/icons.generated/InformationCircleFilled.tsx +0 -47
  233. package/src/icons.generated/Link.tsx +0 -44
  234. package/src/icons.generated/List.tsx +0 -44
  235. package/src/icons.generated/Lock.tsx +0 -44
  236. package/src/icons.generated/More.tsx +0 -44
  237. package/src/icons.generated/Notification.tsx +0 -46
  238. package/src/icons.generated/OktaVerify.tsx +0 -46
  239. package/src/icons.generated/OnPremMfa.tsx +0 -52
  240. package/src/icons.generated/OneTimePassword.tsx +0 -65
  241. package/src/icons.generated/Password.tsx +0 -80
  242. package/src/icons.generated/Pause.tsx +0 -44
  243. package/src/icons.generated/QuestionCircle.tsx +0 -46
  244. package/src/icons.generated/QuestionCircleFilled.tsx +0 -47
  245. package/src/icons.generated/Refresh.tsx +0 -46
  246. package/src/icons.generated/Reset.tsx +0 -44
  247. package/src/icons.generated/Resume.tsx +0 -44
  248. package/src/icons.generated/Search.tsx +0 -44
  249. package/src/icons.generated/SecurityQuestion.tsx +0 -51
  250. package/src/icons.generated/Server.tsx +0 -44
  251. package/src/icons.generated/Settings.tsx +0 -46
  252. package/src/icons.generated/Show.tsx +0 -44
  253. package/src/icons.generated/SmartCard.tsx +0 -65
  254. package/src/icons.generated/Sms.tsx +0 -55
  255. package/src/icons.generated/Subtract.tsx +0 -46
  256. package/src/icons.generated/SymantecVip.tsx +0 -52
  257. package/src/icons.generated/Sync.tsx +0 -44
  258. package/src/icons.generated/ThumbsDown.tsx +0 -46
  259. package/src/icons.generated/ThumbsUp.tsx +0 -46
  260. package/src/icons.generated/Unlock.tsx +0 -44
  261. package/src/icons.generated/Upload.tsx +0 -44
  262. package/src/icons.generated/User.tsx +0 -44
  263. package/src/icons.generated/Video.tsx +0 -44
  264. package/src/icons.generated/VoiceCall.tsx +0 -62
  265. package/src/icons.generated/Warning.tsx +0 -46
  266. package/src/icons.generated/WarningFilled.tsx +0 -46
  267. package/src/icons.generated/Yubikey.tsx +0 -44
  268. package/src/icons.generated/index.ts +0 -107
  269. package/src/index.ts +0 -118
  270. package/src/inputUtils.ts +0 -80
  271. package/src/labs/AppTile.tsx +0 -421
  272. package/src/labs/DataFilters.tsx +0 -871
  273. package/src/labs/DataTable.tsx +0 -877
  274. package/src/labs/DataTablePagination.tsx +0 -88
  275. package/src/labs/DataView/BulkActionsMenu.tsx +0 -98
  276. package/src/labs/DataView/CardLayoutContent.tsx +0 -272
  277. package/src/labs/DataView/DataCard.tsx +0 -357
  278. package/src/labs/DataView/DataTable.tsx +0 -128
  279. package/src/labs/DataView/DataView.test.tsx +0 -1168
  280. package/src/labs/DataView/DataView.tsx +0 -504
  281. package/src/labs/DataView/DetailPanel.tsx +0 -31
  282. package/src/labs/DataView/LayoutSwitcher.tsx +0 -72
  283. package/src/labs/DataView/RowActions.tsx +0 -125
  284. package/src/labs/DataView/TableLayoutContent.tsx +0 -500
  285. package/src/labs/DataView/TableSettings.tsx +0 -144
  286. package/src/labs/DataView/componentTypes.ts +0 -129
  287. package/src/labs/DataView/constants.tsx +0 -28
  288. package/src/labs/DataView/dataTypes.ts +0 -83
  289. package/src/labs/DataView/fetchData.ts +0 -49
  290. package/src/labs/DataView/index.ts +0 -19
  291. package/src/labs/DataView/tableConstants.tsx +0 -137
  292. package/src/labs/DataView/testSupportData.tsx +0 -301
  293. package/src/labs/DataView/useFilterConversion.ts +0 -88
  294. package/src/labs/DatePickers/DateTimeField.tsx +0 -267
  295. package/src/labs/DatePickers/DateTimePicker.test.tsx +0 -70
  296. package/src/labs/DatePickers/DateTimePicker.tsx +0 -303
  297. package/src/labs/DatePickers/dateTimePickerTheme.ts +0 -216
  298. package/src/labs/DatePickers/index.ts +0 -13
  299. package/src/labs/GroupPicker.tsx +0 -261
  300. package/src/labs/OdysseyPickers/ComposablePicker.test.tsx +0 -32
  301. package/src/labs/OdysseyPickers/ComposablePicker.tsx +0 -188
  302. package/src/labs/OdysseyPickers/Picker.tsx +0 -381
  303. package/src/labs/OdysseyPickers/PickerVirtualizationListBox.tsx +0 -192
  304. package/src/labs/OdysseyPickers/PickerWithOptionAdornment.tsx +0 -429
  305. package/src/labs/OdysseyPickers/index.ts +0 -15
  306. package/src/labs/PageTemplate/Layout.tsx +0 -85
  307. package/src/labs/PageTemplate/PageTemplate.tsx +0 -234
  308. package/src/labs/PageTemplate/index.ts +0 -14
  309. package/src/labs/PaginatedTable.tsx +0 -290
  310. package/src/labs/README.md +0 -46
  311. package/src/labs/StaticTable.tsx +0 -131
  312. package/src/labs/UserProfile.tsx +0 -104
  313. package/src/labs/UserProfileMenuButton.tsx +0 -86
  314. package/src/labs/index.ts +0 -47
  315. package/src/labs/materialReactTableTypes.tsx +0 -19
  316. package/src/properties/odyssey-react-mui.properties +0 -140
  317. package/src/properties/translations/odyssey-react-mui_cs.properties +0 -140
  318. package/src/properties/translations/odyssey-react-mui_da.properties +0 -140
  319. package/src/properties/translations/odyssey-react-mui_de.properties +0 -140
  320. package/src/properties/translations/odyssey-react-mui_el.properties +0 -140
  321. package/src/properties/translations/odyssey-react-mui_es.properties +0 -140
  322. package/src/properties/translations/odyssey-react-mui_fi.properties +0 -140
  323. package/src/properties/translations/odyssey-react-mui_fr.properties +0 -140
  324. package/src/properties/translations/odyssey-react-mui_ht.properties +0 -140
  325. package/src/properties/translations/odyssey-react-mui_hu.properties +0 -140
  326. package/src/properties/translations/odyssey-react-mui_id.properties +0 -140
  327. package/src/properties/translations/odyssey-react-mui_it.properties +0 -140
  328. package/src/properties/translations/odyssey-react-mui_ja.properties +0 -140
  329. package/src/properties/translations/odyssey-react-mui_ko.properties +0 -140
  330. package/src/properties/translations/odyssey-react-mui_ms.properties +0 -140
  331. package/src/properties/translations/odyssey-react-mui_nb.properties +0 -140
  332. package/src/properties/translations/odyssey-react-mui_nl_NL.properties +0 -140
  333. package/src/properties/translations/odyssey-react-mui_ok_PL.properties +0 -126
  334. package/src/properties/translations/odyssey-react-mui_ok_SK.properties +0 -126
  335. package/src/properties/translations/odyssey-react-mui_pl.properties +0 -140
  336. package/src/properties/translations/odyssey-react-mui_pt_BR.properties +0 -140
  337. package/src/properties/translations/odyssey-react-mui_ro.properties +0 -140
  338. package/src/properties/translations/odyssey-react-mui_ru.properties +0 -140
  339. package/src/properties/translations/odyssey-react-mui_sv.properties +0 -140
  340. package/src/properties/translations/odyssey-react-mui_th.properties +0 -140
  341. package/src/properties/translations/odyssey-react-mui_tr.properties +0 -140
  342. package/src/properties/translations/odyssey-react-mui_uk.properties +0 -140
  343. package/src/properties/translations/odyssey-react-mui_vi.properties +0 -140
  344. package/src/properties/translations/odyssey-react-mui_zh_CN.properties +0 -140
  345. package/src/properties/translations/odyssey-react-mui_zh_TW.properties +0 -140
  346. package/src/properties/ts/odyssey-react-mui.ts +0 -1
  347. package/src/properties/ts/odyssey-react-mui_cs.ts +0 -1
  348. package/src/properties/ts/odyssey-react-mui_da.ts +0 -1
  349. package/src/properties/ts/odyssey-react-mui_de.ts +0 -1
  350. package/src/properties/ts/odyssey-react-mui_el.ts +0 -1
  351. package/src/properties/ts/odyssey-react-mui_es.ts +0 -1
  352. package/src/properties/ts/odyssey-react-mui_fi.ts +0 -1
  353. package/src/properties/ts/odyssey-react-mui_fr.ts +0 -1
  354. package/src/properties/ts/odyssey-react-mui_ht.ts +0 -1
  355. package/src/properties/ts/odyssey-react-mui_hu.ts +0 -1
  356. package/src/properties/ts/odyssey-react-mui_id.ts +0 -1
  357. package/src/properties/ts/odyssey-react-mui_it.ts +0 -1
  358. package/src/properties/ts/odyssey-react-mui_ja.ts +0 -1
  359. package/src/properties/ts/odyssey-react-mui_ko.ts +0 -1
  360. package/src/properties/ts/odyssey-react-mui_ms.ts +0 -1
  361. package/src/properties/ts/odyssey-react-mui_nb.ts +0 -1
  362. package/src/properties/ts/odyssey-react-mui_nl_NL.ts +0 -1
  363. package/src/properties/ts/odyssey-react-mui_ok_PL.ts +0 -1
  364. package/src/properties/ts/odyssey-react-mui_ok_SK.ts +0 -1
  365. package/src/properties/ts/odyssey-react-mui_pl.ts +0 -1
  366. package/src/properties/ts/odyssey-react-mui_pt_BR.ts +0 -1
  367. package/src/properties/ts/odyssey-react-mui_ro.ts +0 -1
  368. package/src/properties/ts/odyssey-react-mui_ru.ts +0 -1
  369. package/src/properties/ts/odyssey-react-mui_sv.ts +0 -1
  370. package/src/properties/ts/odyssey-react-mui_th.ts +0 -1
  371. package/src/properties/ts/odyssey-react-mui_tr.ts +0 -1
  372. package/src/properties/ts/odyssey-react-mui_uk.ts +0 -1
  373. package/src/properties/ts/odyssey-react-mui_vi.ts +0 -1
  374. package/src/properties/ts/odyssey-react-mui_zh_CN.ts +0 -1
  375. package/src/properties/ts/odyssey-react-mui_zh_TW.ts +0 -1
  376. package/src/remUtils.ts +0 -27
  377. package/src/shadow-dom/index.ts +0 -13
  378. package/src/shadow-dom/shadow-dom.test.ts +0 -24
  379. package/src/shadow-dom/shadow-dom.ts +0 -54
  380. package/src/test-selectors/getByQuerySelector.ts +0 -176
  381. package/src/test-selectors/getComputedAccessibleErrorMessageText.ts +0 -52
  382. package/src/test-selectors/getComputedAccessibleText.ts +0 -36
  383. package/src/test-selectors/index.ts +0 -15
  384. package/src/test-selectors/interpolateString.ts +0 -41
  385. package/src/test-selectors/linkedHtmlSelectors.ts +0 -73
  386. package/src/test-selectors/queryOdysseySelector.ts +0 -36
  387. package/src/test-selectors/querySelector.ts +0 -249
  388. package/src/test-selectors/sanityChecks.ts +0 -53
  389. package/src/test-selectors/testSelector.ts +0 -143
  390. package/src/theme/components.tsx +0 -3275
  391. package/src/theme/components.types.ts +0 -111
  392. package/src/theme/createOdysseyMuiTheme.ts +0 -54
  393. package/src/theme/index.ts +0 -13
  394. package/src/theme/mixins.ts +0 -29
  395. package/src/theme/mixins.types.ts +0 -31
  396. package/src/theme/palette.ts +0 -112
  397. package/src/theme/palette.types.ts +0 -24
  398. package/src/theme/shape.ts +0 -31
  399. package/src/theme/spacing.ts +0 -34
  400. package/src/theme/theme.ts +0 -13
  401. package/src/theme/typography.ts +0 -137
  402. package/src/theme/typography.types.ts +0 -41
  403. package/src/theme/useContrastMode.test.tsx +0 -504
  404. package/src/ui-shell/AppSwitcher/AppSwitcher.tsx +0 -94
  405. package/src/ui-shell/AppSwitcher/AppSwitcherApp.tsx +0 -146
  406. package/src/ui-shell/AppSwitcher/OktaAura.tsx +0 -50
  407. package/src/ui-shell/AppSwitcher/index.ts +0 -13
  408. package/src/ui-shell/SideNav/CollapseIcon.tsx +0 -34
  409. package/src/ui-shell/SideNav/HandleIcon.tsx +0 -35
  410. package/src/ui-shell/SideNav/NavAccordion.tsx +0 -243
  411. package/src/ui-shell/SideNav/OktaLogo.tsx +0 -34
  412. package/src/ui-shell/SideNav/SideNav.test.tsx +0 -326
  413. package/src/ui-shell/SideNav/SideNav.tsx +0 -810
  414. package/src/ui-shell/SideNav/SideNavFooterContent.tsx +0 -85
  415. package/src/ui-shell/SideNav/SideNavHeader.tsx +0 -134
  416. package/src/ui-shell/SideNav/SideNavItemContent.tsx +0 -402
  417. package/src/ui-shell/SideNav/SideNavItemContentContext.tsx +0 -29
  418. package/src/ui-shell/SideNav/SideNavItemLinkContent.tsx +0 -90
  419. package/src/ui-shell/SideNav/SideNavLogo.tsx +0 -65
  420. package/src/ui-shell/SideNav/SideNavToggleButton.tsx +0 -272
  421. package/src/ui-shell/SideNav/SortableList/SortableItem.tsx +0 -237
  422. package/src/ui-shell/SideNav/SortableList/SortableList.tsx +0 -132
  423. package/src/ui-shell/SideNav/SortableList/SortableOverlay.tsx +0 -34
  424. package/src/ui-shell/SideNav/index.ts +0 -16
  425. package/src/ui-shell/SideNav/types.ts +0 -224
  426. package/src/ui-shell/TopNav/TopNav.tsx +0 -109
  427. package/src/ui-shell/TopNav/TopNavLinksList.tsx +0 -68
  428. package/src/ui-shell/TopNav/TopNavListItem.tsx +0 -209
  429. package/src/ui-shell/TopNav/index.ts +0 -13
  430. package/src/ui-shell/UiShell.test.tsx +0 -366
  431. package/src/ui-shell/UiShell.tsx +0 -153
  432. package/src/ui-shell/UiShellContent.tsx +0 -350
  433. package/src/ui-shell/UiShellProvider.tsx +0 -103
  434. package/src/ui-shell/bufferLatest.test.ts +0 -79
  435. package/src/ui-shell/bufferLatest.ts +0 -64
  436. package/src/ui-shell/createMessageBus.test.ts +0 -115
  437. package/src/ui-shell/createMessageBus.ts +0 -53
  438. package/src/ui-shell/createStore.test.ts +0 -103
  439. package/src/ui-shell/createStore.ts +0 -37
  440. package/src/ui-shell/index.ts +0 -21
  441. package/src/ui-shell/renderUiShell.test.tsx +0 -203
  442. package/src/ui-shell/renderUiShell.tsx +0 -158
  443. package/src/ui-shell/useHasUiShell.ts +0 -25
  444. package/src/ui-shell/useScrollState.ts +0 -59
  445. package/src/useAutocomplete.tsx +0 -184
  446. package/src/useContrastMode.tsx +0 -143
  447. package/src/useNormalizedKey.ts +0 -17
  448. package/src/useUniqueAlphabeticalId.ts +0 -21
  449. package/src/useUniqueId.ts +0 -21
  450. package/src/web-component/createReactRootElements.test.ts +0 -40
  451. package/src/web-component/createReactRootElements.ts +0 -39
  452. package/src/web-component/index.ts +0 -13
  453. package/src/web-component/renderReactInWebComponent.test.tsx +0 -128
  454. package/src/web-component/renderReactInWebComponent.ts +0 -135
  455. package/tsconfig.json +0 -16
  456. package/tsconfig.production.json +0 -13
  457. package/vitest.config.ts +0 -36
  458. package/vitest.setup.ts +0 -32
@@ -1,810 +0,0 @@
1
- /*!
2
- * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
- * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
- *
5
- * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
- * Unless required by applicable law or agreed to in writing, software
7
- * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
- * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
- *
10
- * See the License for the specific language governing permissions and limitations under the License.
11
- */
12
-
13
- import styled from "@emotion/styled";
14
- import {
15
- memo,
16
- useMemo,
17
- useState,
18
- useCallback,
19
- useRef,
20
- useEffect,
21
- KeyboardEventHandler,
22
- } from "react";
23
- import { Skeleton } from "@mui/material";
24
- import { useTranslation } from "react-i18next";
25
- import { arrayMove } from "@dnd-kit/sortable";
26
- import { UniqueIdentifier } from "@dnd-kit/core";
27
- import { ErrorBoundary } from "react-error-boundary";
28
- import { Property } from "csstype";
29
-
30
- import { ContrastColors } from "../../createContrastColors.js";
31
- import { NavAccordion } from "./NavAccordion.js";
32
- import {
33
- DesignTokens,
34
- useOdysseyDesignTokens,
35
- } from "../../OdysseyDesignTokensContext.js";
36
- import { OdysseyThemeProvider } from "../../OdysseyThemeProvider.js";
37
- import type { SideNavProps } from "./types.js";
38
- import { SideNavHeader } from "./SideNavHeader.js";
39
- import {
40
- SideNavItemContent,
41
- StyledSideNavListItem,
42
- } from "./SideNavItemContent.js";
43
- import { SideNavFooterContent } from "./SideNavFooterContent.js";
44
- import { SideNavItemContentContext } from "./SideNavItemContentContext.js";
45
- import { SideNavToggleButton } from "./SideNavToggleButton.js";
46
- import { SortableList } from "./SortableList/SortableList.js";
47
- import { Overline } from "../../Typography.js";
48
- import {
49
- UiShellColors,
50
- useUiShellContext,
51
- } from "../../ui-shell/UiShellProvider.js";
52
-
53
- export const DEFAULT_SIDE_NAV_WIDTH = "300px";
54
-
55
- // The side nav collapse icon is placed absolutely from the top (Logo container + nav header height)
56
- // to align it in the middle of the nav header text
57
- export const SIDENAV_COLLAPSE_ICON_POSITION = "77px";
58
-
59
- const StyledCollapsibleContent = styled("div", {
60
- shouldForwardProp: (prop) =>
61
- prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed",
62
- })<{
63
- odysseyDesignTokens: DesignTokens;
64
- isSideNavCollapsed: boolean;
65
- }>(({ odysseyDesignTokens, isSideNavCollapsed }) => ({
66
- position: "relative",
67
- display: "inline-grid",
68
- gridTemplateColumns: DEFAULT_SIDE_NAV_WIDTH,
69
- height: "100%",
70
- transition: `grid-template-columns ${odysseyDesignTokens.TransitionDurationMain}, opacity 300ms`,
71
- transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,
72
- overflow: "hidden",
73
-
74
- ...(isSideNavCollapsed && {
75
- gridTemplateColumns: 0,
76
- opacity: 0,
77
- }),
78
- }));
79
-
80
- const StyledOpacityTransitionContainer = styled("div", {
81
- shouldForwardProp: (prop) =>
82
- prop !== "odysseyDesignTokens" && prop !== "isSideNavCollapsed",
83
- })(
84
- ({
85
- odysseyDesignTokens,
86
- isSideNavCollapsed,
87
- }: {
88
- odysseyDesignTokens: DesignTokens;
89
- isSideNavCollapsed: boolean;
90
- }) => ({
91
- display: "inline-grid",
92
- gridTemplateRows: "max-content 1fr max-content",
93
- height: "100%",
94
- transition: `opacity 50ms`,
95
- transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,
96
- overflow: "hidden",
97
-
98
- ...(isSideNavCollapsed && {
99
- opacity: 0,
100
- }),
101
- }),
102
- );
103
-
104
- const StyledSideNav = styled("nav", {
105
- shouldForwardProp: (prop) =>
106
- prop !== "backgroundColor" &&
107
- prop !== "odysseyDesignTokens" &&
108
- prop !== "isAppContentWhiteBackground" &&
109
- prop !== "isSideNavCollapsed",
110
- })<{
111
- isAppContentWhiteBackground: boolean;
112
- backgroundColor?: UiShellColors["sideNavBackgroundColor"];
113
- isSideNavCollapsed: boolean;
114
- odysseyDesignTokens: DesignTokens;
115
- }>(
116
- ({
117
- backgroundColor,
118
- isAppContentWhiteBackground,
119
- isSideNavCollapsed,
120
- odysseyDesignTokens,
121
- }) => ({
122
- position: "relative",
123
- display: "inline-block",
124
- height: "100%",
125
- backgroundColor: backgroundColor || odysseyDesignTokens.HueNeutralWhite,
126
-
127
- ...(isAppContentWhiteBackground && {
128
- borderRightWidth: odysseyDesignTokens.BorderWidthMain,
129
- borderRightStyle:
130
- odysseyDesignTokens.BorderStyleMain as Property.BorderRightStyle,
131
- borderRightColor: odysseyDesignTokens.HueNeutral100,
132
- }),
133
-
134
- "&::after": {
135
- backgroundColor: odysseyDesignTokens.HueNeutral200,
136
- content: "''",
137
- height: "100%",
138
- opacity: 0,
139
- position: "absolute",
140
- right: 0,
141
- top: 0,
142
- transform: `translateX(0)`,
143
- transition: `opacity ${odysseyDesignTokens.TransitionDurationMain}, transform ${odysseyDesignTokens.TransitionDurationMain}`,
144
- width: odysseyDesignTokens.Spacing2,
145
- zIndex: 2,
146
- },
147
-
148
- "&:has([data-sidenav-toggle='true']:hover), &:has([data-sidenav-toggle='true']:focus-visible)":
149
- {
150
- ...(isSideNavCollapsed && {
151
- "&::after": {
152
- opacity: 1,
153
- transform: `translateX(100%)`,
154
- },
155
-
156
- "[data-sidenav-toggle='true']": {
157
- transform: `translate3d(calc(100% + ${odysseyDesignTokens.Spacing3}), 0, 0)`,
158
- },
159
- }),
160
- },
161
-
162
- "[data-sidenav-toggle='true']": {
163
- position: "absolute",
164
- top: SIDENAV_COLLAPSE_ICON_POSITION,
165
- right: 0,
166
- transition: `transform ${odysseyDesignTokens.TransitionDurationMain}`,
167
- transform: `translate3d(100%, 0, 0)`,
168
- },
169
- }),
170
- );
171
-
172
- const SideNavHeaderContainer = styled("div", {
173
- shouldForwardProp: (prop) =>
174
- prop !== "borderColor" &&
175
- prop !== "hasContentScrolled" &&
176
- prop !== "odysseyDesignTokens",
177
- })(
178
- ({
179
- borderColor,
180
- hasContentScrolled,
181
- odysseyDesignTokens,
182
- }: {
183
- borderColor: ContrastColors["fontColor"];
184
- hasContentScrolled: boolean;
185
- odysseyDesignTokens: DesignTokens;
186
- }) => ({
187
- flexShrink: 0,
188
- // The bottom border should appear only if the scrollable region has been scrolled
189
- ...(hasContentScrolled && {
190
- borderBottomWidth: odysseyDesignTokens.BorderWidthMain,
191
- borderBottomStyle:
192
- odysseyDesignTokens.BorderStyleMain as Property.BorderBottomStyle,
193
- borderBottomColor: odysseyDesignTokens.HueNeutral100,
194
-
195
- ...(borderColor && {
196
- borderBottomColor: borderColor.concat("15"),
197
- }),
198
- }),
199
- }),
200
- );
201
-
202
- const SideNavListContainer = styled("ul")(() => ({
203
- padding: 0,
204
- listStyle: "none",
205
- listStyleType: "none",
206
- margin: 0,
207
- }));
208
-
209
- const SideNavScrollableContainer = styled("div", {
210
- shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
211
- })<{ odysseyDesignTokens: DesignTokens }>(({ odysseyDesignTokens }) => ({
212
- display: "grid",
213
- gridTemplateRows: "1fr max-content",
214
- flex: "1 1 100%",
215
- overflowY: "auto",
216
- paddingInline: odysseyDesignTokens.Spacing2,
217
- }));
218
-
219
- const SectionHeaderContainer = styled("li", {
220
- shouldForwardProp: (prop) =>
221
- prop !== "odysseyDesignTokens" && prop !== "contrastFontColor",
222
- })(
223
- ({
224
- contrastFontColor,
225
- odysseyDesignTokens,
226
- }: {
227
- contrastFontColor: ContrastColors["fontColor"];
228
- odysseyDesignTokens: DesignTokens;
229
- }) => ({
230
- paddingBlock: odysseyDesignTokens.Spacing1,
231
- paddingInline: odysseyDesignTokens.Spacing4,
232
- marginBlock: `${odysseyDesignTokens.Spacing3}`,
233
- color: contrastFontColor || odysseyDesignTokens.HueNeutral600,
234
- }),
235
- );
236
-
237
- const SideNavFooter = styled("div", {
238
- shouldForwardProp: (prop) =>
239
- prop !== "odysseyDesignTokens" && prop !== "sideNavBackgroundColor",
240
- })(
241
- ({
242
- odysseyDesignTokens,
243
- sideNavBackgroundColor,
244
- }: {
245
- odysseyDesignTokens: DesignTokens;
246
- sideNavBackgroundColor?: UiShellColors["sideNavBackgroundColor"];
247
- }) => ({
248
- flexShrink: 0,
249
- padding: odysseyDesignTokens.Spacing4,
250
- backgroundColor: odysseyDesignTokens.HueNeutralWhite,
251
-
252
- ...(sideNavBackgroundColor && {
253
- backgroundColor: sideNavBackgroundColor,
254
- }),
255
- }),
256
- );
257
-
258
- const PersistentSideNavFooter = styled(SideNavFooter, {
259
- shouldForwardProp: (prop) =>
260
- prop !== "isContentScrollable" &&
261
- prop !== "odysseyDesignTokens" &&
262
- prop !== "sideNavBackgroundColor",
263
- })(
264
- ({
265
- isContentScrollable,
266
- odysseyDesignTokens,
267
- sideNavBackgroundColor,
268
- }: {
269
- isContentScrollable: boolean;
270
- odysseyDesignTokens: DesignTokens;
271
- sideNavBackgroundColor?: UiShellColors["sideNavBackgroundColor"];
272
- }) => ({
273
- transitionProperty: "box-shadow",
274
- transitionDuration: odysseyDesignTokens.TransitionDurationMain,
275
- transitionTiming: odysseyDesignTokens.TransitionTimingMain,
276
- zIndex: 2,
277
- // The box shadow should appear above the footer only if the scrollable region has overflow
278
- ...(isContentScrollable && {
279
- boxShadow: "0px -8px 8px -8px rgba(39, 39, 39, 0.08)",
280
- }),
281
- ...(sideNavBackgroundColor && {
282
- backgroundColor: sideNavBackgroundColor,
283
- }),
284
- }),
285
- );
286
-
287
- const SideNavFooterItemsContainer = styled("div", {
288
- shouldForwardProp: (prop) =>
289
- prop !== "odysseyDesignTokens" && prop !== "sideNavContrastColors",
290
- })<{
291
- odysseyDesignTokens: DesignTokens;
292
- sideNavContrastColors: UiShellColors["sideNavContrastColors"];
293
- }>(({ odysseyDesignTokens, sideNavContrastColors }) => ({
294
- display: "flex",
295
- flexWrap: "wrap",
296
- alignItems: "center",
297
- fontSize: odysseyDesignTokens.TypographySizeOverline,
298
-
299
- "a, span": {
300
- color: odysseyDesignTokens.HueNeutral600,
301
- transition: `color ${odysseyDesignTokens.TransitionDurationMain}`,
302
-
303
- "&:visited": {
304
- color: odysseyDesignTokens.HueNeutral600,
305
-
306
- ...(sideNavContrastColors?.fontColor && {
307
- color: sideNavContrastColors?.fontColor,
308
- }),
309
- },
310
-
311
- "&:hover": {
312
- textDecoration: "none",
313
- color: odysseyDesignTokens.HueNeutral900,
314
-
315
- ...(sideNavContrastColors?.fontColor && {
316
- color: sideNavContrastColors?.fontColor,
317
- }),
318
- },
319
-
320
- ...(sideNavContrastColors?.fontColor && {
321
- color: sideNavContrastColors?.fontColor,
322
- }),
323
- },
324
- }));
325
-
326
- const LoadingItemContainer = styled("div", {
327
- shouldForwardProp: (prop) => prop !== "odysseyDesignTokens",
328
- })<{ odysseyDesignTokens: DesignTokens }>(({ odysseyDesignTokens }) => ({
329
- alignItems: "center",
330
- display: "flex",
331
- gap: odysseyDesignTokens.Spacing2,
332
- paddingBlock: odysseyDesignTokens.Spacing2,
333
- paddingInline: odysseyDesignTokens.Spacing4,
334
- }));
335
-
336
- const getHasScrollableContent = (scrollableContainer: HTMLElement) =>
337
- scrollableContainer.scrollHeight > scrollableContainer.clientHeight;
338
-
339
- const LoadingItem = () => {
340
- const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();
341
- return (
342
- <LoadingItemContainer odysseyDesignTokens={odysseyDesignTokens}>
343
- <Skeleton
344
- variant="circular"
345
- width={odysseyDesignTokens.Spacing4}
346
- height={odysseyDesignTokens.Spacing4}
347
- />
348
- <Skeleton variant="rounded" width="100%" />
349
- </LoadingItemContainer>
350
- );
351
- };
352
-
353
- const SideNav = ({
354
- appName,
355
- footerComponent,
356
- footerItems,
357
- hasCustomFooter,
358
- isCollapsible,
359
- isCollapsed = false,
360
- isCompact,
361
- isLoading,
362
- logoProps,
363
- onCollapse,
364
- onExpand,
365
- onSort,
366
- sideNavItems,
367
- }: SideNavProps) => {
368
- const [isSideNavCollapsed, setSideNavCollapsed] = useState(isCollapsed);
369
- const [hasContentScrolled, setHasContentScrolled] = useState(false);
370
- const [isContentScrollable, setIsContentScrollable] = useState(false);
371
- const [sideNavItemsList, updateSideNavItemsList] = useState(sideNavItems);
372
-
373
- const uiShellContext = useUiShellContext();
374
- const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();
375
- const { t } = useTranslation();
376
-
377
- const scrollableContentRef = useRef<HTMLUListElement>(null);
378
- const resizeObserverRef = useRef<ResizeObserver | null>(null);
379
- const intersectionObserverRef = useRef<IntersectionObserver | null>(null);
380
-
381
- const blankElement = useMemo(() => <div />, []);
382
-
383
- // The default value (sideNavItems) passed to useState is ONLY used by the useState hook for
384
- // the very first value. Subsequent updates to the prop (sideNavItems) need to cause the state
385
- // to update!
386
- useEffect(() => updateSideNavItemsList(sideNavItems), [sideNavItems]);
387
-
388
- // update sidenav collapse status
389
- useEffect(() => setSideNavCollapsed(isCollapsed), [isCollapsed]);
390
-
391
- useEffect(() => {
392
- // This is called directly in this effect AND perhaps as a result of the ResizeObserver
393
- const updateIsContentScrollable = () => {
394
- if (
395
- scrollableContentRef.current &&
396
- scrollableContentRef.current.parentElement
397
- ) {
398
- setIsContentScrollable(
399
- getHasScrollableContent(scrollableContentRef.current.parentElement),
400
- );
401
- }
402
- };
403
-
404
- // If the window is resized, we may need to re-determine if the scrollable container has overflow
405
- // Setup a ResizeObserver to know if the size of the scrollableContent changes
406
- let resizeObserverDebounceTimer: ReturnType<typeof requestAnimationFrame>;
407
- if (!resizeObserverRef.current) {
408
- resizeObserverRef.current = new ResizeObserver(() => {
409
- cancelAnimationFrame(resizeObserverDebounceTimer);
410
- resizeObserverDebounceTimer = requestAnimationFrame(
411
- updateIsContentScrollable,
412
- );
413
- });
414
- }
415
-
416
- if (resizeObserverRef.current && scrollableContentRef.current) {
417
- // Observe the <ul> itself (in case it changes size due to the content expanding)
418
- resizeObserverRef.current.observe(scrollableContentRef.current);
419
- if (scrollableContentRef.current.parentElement) {
420
- // ALSO observe the parent (<SideNavScrollableContainer>) in case the window resizes
421
- resizeObserverRef.current.observe(
422
- scrollableContentRef.current.parentElement,
423
- );
424
- }
425
- }
426
-
427
- // Determine if the scrollable container has overflow or not on load
428
- updateIsContentScrollable();
429
-
430
- // Finally, we only want to have the border on the bottom of the header iff the user has scrolled
431
- // the scrollable container
432
- if (!intersectionObserverRef.current && scrollableContentRef.current) {
433
- intersectionObserverRef.current = new IntersectionObserver(
434
- (entries) => {
435
- // If isIntersecting is true, then we're at the top of the scroll container
436
- // If isIntersecting is false, some scrolling has occurred.
437
- // The entries must be sorted by time and we only really need to look at the latest one
438
- const isIntersecting = entries
439
- .slice()
440
- .sort((a, b) => a.time - b.time)
441
- .at(0)?.isIntersecting;
442
- setHasContentScrolled(!isIntersecting);
443
- },
444
- {
445
- root: scrollableContentRef.current.parentElement,
446
- threshold: 1.0,
447
- },
448
- );
449
- }
450
-
451
- if (intersectionObserverRef.current && scrollableContentRef.current) {
452
- const ulElement = scrollableContentRef.current;
453
- const [liElement] = Array.from(ulElement?.children || []);
454
-
455
- if (liElement) {
456
- intersectionObserverRef.current.observe(liElement);
457
- }
458
- }
459
-
460
- // Cleanup when unmounted:
461
- return () => {
462
- if (resizeObserverRef.current) {
463
- resizeObserverRef.current.disconnect();
464
- resizeObserverRef.current = null;
465
- }
466
- if (intersectionObserverRef.current) {
467
- intersectionObserverRef.current.disconnect();
468
- intersectionObserverRef.current = null;
469
- }
470
- cancelAnimationFrame(resizeObserverDebounceTimer); // Ensure timer is cleared on component unmount
471
- };
472
- }, [sideNavItemsList]);
473
-
474
- const scrollIntoViewRef = useRef<HTMLLIElement>(null);
475
- /**
476
- * Look through the sideNavItems and determine which is the first node
477
- * with isSelected. This should be the node we set a ref on in order to
478
- * call scrollIntoView in the effect
479
- */
480
- const firstSideNavItemIdWithIsSelected = useMemo(() => {
481
- const flattenedItems = sideNavItemsList.flatMap((sideNavItem) =>
482
- sideNavItem.nestedNavItems
483
- ? [sideNavItem, ...sideNavItem.nestedNavItems]
484
- : sideNavItem,
485
- );
486
- const firstItemWithIsSelected = flattenedItems.find(
487
- (sideNavItem) => sideNavItem.isSelected,
488
- );
489
- return firstItemWithIsSelected?.id;
490
- }, [sideNavItemsList]);
491
- /**
492
- * Once we've rendered and if we have an item to scroll to, do the scroll action.
493
- * This must rely on checking firstSideNavItemIdWithIsSelected or it will not run
494
- * once the actual ref is populated.
495
- */
496
- useEffect(() => {
497
- if (firstSideNavItemIdWithIsSelected && scrollIntoViewRef.current) {
498
- scrollIntoViewRef.current.scrollIntoView();
499
- }
500
- }, [firstSideNavItemIdWithIsSelected]);
501
-
502
- /**
503
- * We only want to put a ref on a node iff it is the first selected node.
504
- * This function returns the ref only if the ID provided matches the first
505
- * selected node, otherwise returns undefined (so that the node has no ref)
506
- */
507
- const getRefIfThisIsFirstNodeWithIsSelected = useCallback(
508
- (itemId: string) =>
509
- itemId === firstSideNavItemIdWithIsSelected
510
- ? scrollIntoViewRef
511
- : undefined,
512
- [firstSideNavItemIdWithIsSelected],
513
- );
514
-
515
- const sideNavItemContentProviderValue = useMemo(
516
- () => ({ isCompact, depth: 1 }),
517
- [isCompact],
518
- );
519
-
520
- const setSelectedItem = useCallback(
521
- (selectedItemId: string) => {
522
- const updatedSideNavItems = sideNavItemsList.map((item) => {
523
- if (item.id === selectedItemId) {
524
- item.isSelected = true;
525
- } else if (item.isSelected) {
526
- delete item.isSelected;
527
- }
528
-
529
- return item.nestedNavItems
530
- ? {
531
- ...item,
532
- nestedNavItems: item.nestedNavItems.map((childItem) => {
533
- if (childItem.id === selectedItemId) {
534
- childItem.isSelected = true;
535
- } else if (childItem.isSelected) {
536
- delete childItem.isSelected;
537
- }
538
- return childItem;
539
- }),
540
- }
541
- : item;
542
- });
543
- updateSideNavItemsList(updatedSideNavItems);
544
- },
545
- [sideNavItemsList],
546
- );
547
-
548
- const processedSideNavItems = useMemo(() => {
549
- return sideNavItemsList?.map((item) => ({
550
- ...item,
551
- childNavItems: item.nestedNavItems?.map((childProps) => {
552
- return {
553
- id: childProps.id,
554
- isSelected: childProps.isSelected,
555
- isDisabled: childProps.isDisabled,
556
- isSortable: childProps.isSortable,
557
- navItem: (
558
- <SideNavItemContentContext.Provider
559
- value={{
560
- ...sideNavItemContentProviderValue,
561
- depth: 2,
562
- isSortable: item.isSortable,
563
- }}
564
- key={childProps.id}
565
- >
566
- <SideNavItemContent
567
- {...childProps}
568
- scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}
569
- onItemSelected={setSelectedItem}
570
- />
571
- </SideNavItemContentContext.Provider>
572
- ),
573
- };
574
- }),
575
- }));
576
- }, [
577
- getRefIfThisIsFirstNodeWithIsSelected,
578
- sideNavItemsList,
579
- sideNavItemContentProviderValue,
580
- setSelectedItem,
581
- ]);
582
-
583
- const sideNavExpandClickHandler = useCallback(() => {
584
- if (isSideNavCollapsed) {
585
- onExpand?.();
586
- } else {
587
- onCollapse?.();
588
- }
589
-
590
- setSideNavCollapsed(!isSideNavCollapsed);
591
- }, [isSideNavCollapsed, setSideNavCollapsed, onExpand, onCollapse]);
592
-
593
- const sideNavExpandKeyHandler = useCallback<
594
- KeyboardEventHandler<HTMLButtonElement>
595
- >(
596
- (event) => {
597
- if (event?.key === "Enter" || event?.code === "Space") {
598
- event.preventDefault();
599
- sideNavExpandClickHandler();
600
- }
601
- },
602
- [sideNavExpandClickHandler],
603
- );
604
-
605
- const setSortedItems = useCallback(
606
- (
607
- parentId: string,
608
- activeId: UniqueIdentifier,
609
- activeIndex: number,
610
- overIndex: number,
611
- ) => {
612
- const sortedSideNavItems = sideNavItemsList.map((item) =>
613
- item.id === parentId && item.nestedNavItems
614
- ? {
615
- ...item,
616
- nestedNavItems: arrayMove(
617
- item.nestedNavItems,
618
- activeIndex,
619
- overIndex,
620
- ),
621
- }
622
- : item,
623
- );
624
- updateSideNavItemsList(sortedSideNavItems);
625
- onSort?.(sortedSideNavItems, parentId, activeId, activeIndex, overIndex);
626
- },
627
- [onSort, sideNavItemsList],
628
- );
629
-
630
- return (
631
- <StyledSideNav
632
- aria-label={t("navigation.label")}
633
- backgroundColor={uiShellContext?.sideNavBackgroundColor}
634
- id="side-nav-expandable"
635
- isAppContentWhiteBackground={
636
- uiShellContext?.appBackgroundColor ===
637
- odysseyDesignTokens.HueNeutralWhite
638
- }
639
- isSideNavCollapsed={isSideNavCollapsed}
640
- odysseyDesignTokens={odysseyDesignTokens}
641
- >
642
- {isCollapsible && (
643
- <SideNavToggleButton
644
- ariaControls="side-nav-expandable"
645
- isSideNavCollapsed={isSideNavCollapsed}
646
- onClick={sideNavExpandClickHandler}
647
- onKeyDown={sideNavExpandKeyHandler}
648
- />
649
- )}
650
- <OdysseyThemeProvider>
651
- <StyledCollapsibleContent
652
- data-se="collapsible-region"
653
- isSideNavCollapsed={isSideNavCollapsed}
654
- odysseyDesignTokens={odysseyDesignTokens}
655
- >
656
- <StyledOpacityTransitionContainer
657
- isSideNavCollapsed={isSideNavCollapsed}
658
- odysseyDesignTokens={odysseyDesignTokens}
659
- >
660
- <SideNavHeaderContainer
661
- hasContentScrolled={hasContentScrolled}
662
- odysseyDesignTokens={odysseyDesignTokens}
663
- borderColor={uiShellContext?.sideNavContrastColors?.fontColor}
664
- >
665
- <SideNavHeader
666
- appName={appName}
667
- isLoading={isLoading}
668
- logoProps={logoProps}
669
- />
670
- </SideNavHeaderContainer>
671
- <SideNavScrollableContainer
672
- odysseyDesignTokens={odysseyDesignTokens}
673
- data-se="scrollable-region"
674
- >
675
- <SideNavListContainer role="none" ref={scrollableContentRef}>
676
- {isLoading
677
- ? Array(6)
678
- .fill(null)
679
- .map((_, index) => <LoadingItem key={index} />)
680
- : processedSideNavItems?.map((item) => {
681
- const {
682
- id,
683
- label,
684
- isSectionHeader,
685
- startIcon,
686
- childNavItems,
687
- isSortable,
688
- isDefaultExpanded,
689
- isDisabled,
690
- isExpanded,
691
- } = item;
692
-
693
- if (isSectionHeader) {
694
- return (
695
- <ErrorBoundary fallback={blankElement}>
696
- <SectionHeaderContainer
697
- contrastFontColor={
698
- uiShellContext?.sideNavContrastColors?.fontColor
699
- }
700
- id={id}
701
- key={id}
702
- odysseyDesignTokens={odysseyDesignTokens}
703
- >
704
- <Overline component="h3">{label}</Overline>
705
- </SectionHeaderContainer>
706
- </ErrorBoundary>
707
- );
708
- } else if (childNavItems) {
709
- return (
710
- <ErrorBoundary fallback={blankElement}>
711
- <StyledSideNavListItem
712
- id={id}
713
- key={id}
714
- odysseyDesignTokens={odysseyDesignTokens}
715
- disabled={isDisabled}
716
- aria-disabled={isDisabled}
717
- >
718
- <NavAccordion
719
- label={label}
720
- isCompact={isCompact}
721
- isDefaultExpanded={isDefaultExpanded}
722
- isExpanded={isExpanded}
723
- startIcon={startIcon}
724
- isDisabled={isDisabled}
725
- >
726
- <SideNavListContainer role="none">
727
- {isSortable ? (
728
- <SortableList
729
- parentId={item.id}
730
- items={childNavItems}
731
- onChange={setSortedItems}
732
- renderItem={(sortableItem) => (
733
- <SortableList.Item
734
- id={sortableItem.id}
735
- isDisabled={sortableItem.isDisabled}
736
- isSelected={sortableItem.isSelected}
737
- isSortable={sortableItem.isSortable}
738
- >
739
- {sortableItem.navItem}
740
- </SortableList.Item>
741
- )}
742
- />
743
- ) : (
744
- childNavItems.map((item) => item.navItem)
745
- )}
746
- </SideNavListContainer>
747
- </NavAccordion>
748
- </StyledSideNavListItem>
749
- </ErrorBoundary>
750
- );
751
- } else {
752
- return (
753
- <ErrorBoundary fallback={blankElement}>
754
- <SideNavItemContentContext.Provider
755
- key={item.id}
756
- value={sideNavItemContentProviderValue}
757
- >
758
- <SideNavItemContent
759
- {...item}
760
- key={item.id}
761
- onItemSelected={setSelectedItem}
762
- scrollRef={getRefIfThisIsFirstNodeWithIsSelected(
763
- item.id,
764
- )}
765
- startIcon={item.startIcon}
766
- />
767
- </SideNavItemContentContext.Provider>
768
- </ErrorBoundary>
769
- );
770
- }
771
- })}
772
- </SideNavListContainer>
773
- {!isLoading && footerItems && !hasCustomFooter && (
774
- <SideNavFooter
775
- odysseyDesignTokens={odysseyDesignTokens}
776
- sideNavBackgroundColor={
777
- uiShellContext?.sideNavBackgroundColor
778
- }
779
- >
780
- <SideNavFooterItemsContainer
781
- odysseyDesignTokens={odysseyDesignTokens}
782
- sideNavContrastColors={
783
- uiShellContext?.sideNavContrastColors
784
- }
785
- >
786
- <SideNavFooterContent footerItems={footerItems} />
787
- </SideNavFooterItemsContainer>
788
- </SideNavFooter>
789
- )}
790
- </SideNavScrollableContainer>
791
- {!isLoading && !footerItems && hasCustomFooter && (
792
- <PersistentSideNavFooter
793
- isContentScrollable={isContentScrollable}
794
- odysseyDesignTokens={odysseyDesignTokens}
795
- sideNavBackgroundColor={uiShellContext?.sideNavBackgroundColor}
796
- >
797
- {footerComponent}
798
- </PersistentSideNavFooter>
799
- )}
800
- </StyledOpacityTransitionContainer>
801
- </StyledCollapsibleContent>
802
- </OdysseyThemeProvider>
803
- </StyledSideNav>
804
- );
805
- };
806
-
807
- const MemoizedSideNav = memo(SideNav);
808
- MemoizedSideNav.displayName = "SideNav";
809
-
810
- export { MemoizedSideNav as SideNav };