@okta/odyssey-react-mui 1.40.0 → 1.42.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 (197) hide show
  1. package/dist/cjs/Autocomplete.cjs +10 -10
  2. package/dist/cjs/Autocomplete.cjs.map +1 -1
  3. package/dist/cjs/Breadcrumbs.cjs +1 -0
  4. package/dist/cjs/Breadcrumbs.cjs.map +1 -1
  5. package/dist/cjs/Link.cjs.map +1 -1
  6. package/dist/cjs/OdysseyCacheProvider.cjs.map +1 -1
  7. package/dist/cjs/Select.cjs +1 -1
  8. package/dist/cjs/Select.cjs.map +1 -1
  9. package/dist/cjs/Tag.cjs +9 -2
  10. package/dist/cjs/Tag.cjs.map +1 -1
  11. package/dist/cjs/createContrastColors.cjs +6 -2
  12. package/dist/cjs/createContrastColors.cjs.map +1 -1
  13. package/dist/cjs/getLogicalBoundaries.cjs +33 -0
  14. package/dist/cjs/getLogicalBoundaries.cjs.map +1 -0
  15. package/dist/cjs/labs/PageTemplate/PageTemplate.cjs +15 -4
  16. package/dist/cjs/labs/PageTemplate/PageTemplate.cjs.map +1 -1
  17. package/dist/cjs/properties/ts/odyssey-react-mui.cjs +2 -1
  18. package/dist/cjs/properties/ts/odyssey-react-mui.cjs.map +1 -1
  19. package/dist/cjs/properties/ts/odyssey-react-mui_eu.cjs +137 -0
  20. package/dist/cjs/properties/ts/odyssey-react-mui_eu.cjs.map +1 -0
  21. package/dist/cjs/theme/components.cjs +1 -0
  22. package/dist/cjs/theme/components.cjs.map +1 -1
  23. package/dist/cjs/ui-shell/NarrowUiShellContent.cjs +0 -1
  24. package/dist/cjs/ui-shell/NarrowUiShellContent.cjs.map +1 -1
  25. package/dist/cjs/ui-shell/SideNav/SideNav.cjs +23 -18
  26. package/dist/cjs/ui-shell/SideNav/SideNav.cjs.map +1 -1
  27. package/dist/cjs/ui-shell/SideNav/SideNavItemLinkContent.cjs +4 -3
  28. package/dist/cjs/ui-shell/SideNav/SideNavItemLinkContent.cjs.map +1 -1
  29. package/dist/cjs/ui-shell/SideNav/SideNavToggleButton.cjs +10 -10
  30. package/dist/cjs/ui-shell/SideNav/SideNavToggleButton.cjs.map +1 -1
  31. package/dist/cjs/ui-shell/UiShell.cjs +2 -0
  32. package/dist/cjs/ui-shell/UiShell.cjs.map +1 -1
  33. package/dist/cjs/ui-shell/UiShellProvider.cjs +6 -1
  34. package/dist/cjs/ui-shell/UiShellProvider.cjs.map +1 -1
  35. package/dist/cjs/ui-shell/renderUiShell.cjs +4 -2
  36. package/dist/cjs/ui-shell/renderUiShell.cjs.map +1 -1
  37. package/dist/cjs/ui-shell/useElementAtContainerEdge.cjs +74 -0
  38. package/dist/cjs/ui-shell/useElementAtContainerEdge.cjs.map +1 -0
  39. package/dist/cjs/ui-shell/useScrollState.cjs +4 -2
  40. package/dist/cjs/ui-shell/useScrollState.cjs.map +1 -1
  41. package/dist/cjs/useAutocomplete.cjs +2 -2
  42. package/dist/cjs/useAutocomplete.cjs.map +1 -1
  43. package/dist/cjs/useMountLifecycleEffect.cjs +3 -3
  44. package/dist/cjs/useMountLifecycleEffect.cjs.map +1 -1
  45. package/dist/cjs/web-component/odysseyWebComponentVersion.generated.cjs +1 -1
  46. package/dist/cjs/web-component/odysseyWebComponentVersion.generated.cjs.map +1 -1
  47. package/dist/esm/Autocomplete.js +10 -10
  48. package/dist/esm/Autocomplete.js.map +1 -1
  49. package/dist/esm/Breadcrumbs.js +1 -0
  50. package/dist/esm/Breadcrumbs.js.map +1 -1
  51. package/dist/esm/Link.js.map +1 -1
  52. package/dist/esm/OdysseyCacheProvider.js.map +1 -1
  53. package/dist/esm/Select.js +1 -1
  54. package/dist/esm/Select.js.map +1 -1
  55. package/dist/esm/Tag.js +9 -2
  56. package/dist/esm/Tag.js.map +1 -1
  57. package/dist/esm/createContrastColors.js +6 -2
  58. package/dist/esm/createContrastColors.js.map +1 -1
  59. package/dist/esm/getLogicalBoundaries.js +26 -0
  60. package/dist/esm/getLogicalBoundaries.js.map +1 -0
  61. package/dist/esm/labs/PageTemplate/PageTemplate.js +16 -5
  62. package/dist/esm/labs/PageTemplate/PageTemplate.js.map +1 -1
  63. package/dist/esm/properties/ts/odyssey-react-mui.js +2 -1
  64. package/dist/esm/properties/ts/odyssey-react-mui.js.map +1 -1
  65. package/dist/esm/properties/ts/odyssey-react-mui_eu.js +131 -0
  66. package/dist/esm/properties/ts/odyssey-react-mui_eu.js.map +1 -0
  67. package/dist/esm/theme/components.js +1 -0
  68. package/dist/esm/theme/components.js.map +1 -1
  69. package/dist/esm/ui-shell/NarrowUiShellContent.js +0 -1
  70. package/dist/esm/ui-shell/NarrowUiShellContent.js.map +1 -1
  71. package/dist/esm/ui-shell/SideNav/SideNav.js +23 -18
  72. package/dist/esm/ui-shell/SideNav/SideNav.js.map +1 -1
  73. package/dist/esm/ui-shell/SideNav/SideNavItemLinkContent.js +4 -3
  74. package/dist/esm/ui-shell/SideNav/SideNavItemLinkContent.js.map +1 -1
  75. package/dist/esm/ui-shell/SideNav/SideNavToggleButton.js +10 -10
  76. package/dist/esm/ui-shell/SideNav/SideNavToggleButton.js.map +1 -1
  77. package/dist/esm/ui-shell/UiShell.js +2 -0
  78. package/dist/esm/ui-shell/UiShell.js.map +1 -1
  79. package/dist/esm/ui-shell/UiShellProvider.js +6 -1
  80. package/dist/esm/ui-shell/UiShellProvider.js.map +1 -1
  81. package/dist/esm/ui-shell/renderUiShell.js +4 -2
  82. package/dist/esm/ui-shell/renderUiShell.js.map +1 -1
  83. package/dist/esm/ui-shell/useElementAtContainerEdge.js +68 -0
  84. package/dist/esm/ui-shell/useElementAtContainerEdge.js.map +1 -0
  85. package/dist/esm/ui-shell/useScrollState.js +4 -2
  86. package/dist/esm/ui-shell/useScrollState.js.map +1 -1
  87. package/dist/esm/useAutocomplete.js +2 -2
  88. package/dist/esm/useAutocomplete.js.map +1 -1
  89. package/dist/esm/useMountLifecycleEffect.js +3 -3
  90. package/dist/esm/useMountLifecycleEffect.js.map +1 -1
  91. package/dist/esm/web-component/odysseyWebComponentVersion.generated.js +1 -1
  92. package/dist/esm/web-component/odysseyWebComponentVersion.generated.js.map +1 -1
  93. package/dist/index.cjs +1 -1
  94. package/dist/index.d.ts +1 -1
  95. package/dist/index.d.ts.map +1 -0
  96. package/dist/index.js +25 -0
  97. package/dist/index.mjs +1 -1
  98. package/dist/index.scss +1 -1
  99. package/dist/tsconfig.production.tsbuildinfo +1 -1
  100. package/dist/tsconfig.tsbuildinfo +1 -0
  101. package/dist/types/Autocomplete.d.ts +1 -1
  102. package/dist/types/Autocomplete.d.ts.map +1 -1
  103. package/dist/types/Breadcrumbs.d.ts.map +1 -1
  104. package/dist/types/CssBaseline.d.ts.map +1 -1
  105. package/dist/types/DataTable/reorderDataRowsLocally.d.ts.map +1 -1
  106. package/dist/types/DataTable/useRowReordering.d.ts.map +1 -1
  107. package/dist/types/DataTable/useScrollIndication.d.ts.map +1 -1
  108. package/dist/types/DatePickers/useOdysseyDateFields.d.ts.map +1 -1
  109. package/dist/types/Link.d.ts +3 -3
  110. package/dist/types/Link.d.ts.map +1 -1
  111. package/dist/types/NativeSelect.d.ts.map +1 -1
  112. package/dist/types/OdysseyCacheProvider.d.ts.map +1 -1
  113. package/dist/types/OdysseyTranslationProvider.d.ts +1 -1
  114. package/dist/types/OdysseyTranslationProvider.d.ts.map +1 -1
  115. package/dist/types/Pagination/usePagination.d.ts.map +1 -1
  116. package/dist/types/Select.d.ts.map +1 -1
  117. package/dist/types/Tag.d.ts.map +1 -1
  118. package/dist/types/addSpecificity.d.ts.map +1 -1
  119. package/dist/types/createContrastColors.d.ts +5 -1
  120. package/dist/types/createContrastColors.d.ts.map +1 -1
  121. package/dist/types/getLogicalBoundaries.d.ts +24 -0
  122. package/dist/types/getLogicalBoundaries.d.ts.map +1 -0
  123. package/dist/types/hexToRgb.d.ts.map +1 -1
  124. package/dist/types/i18n.d.ts +1 -0
  125. package/dist/types/i18n.d.ts.map +1 -1
  126. package/dist/types/inputUtils.d.ts.map +1 -1
  127. package/dist/types/labs/DataView/fetchData.d.ts.map +1 -1
  128. package/dist/types/labs/DataView/tableConstants.d.ts.map +1 -1
  129. package/dist/types/labs/DataView/testSupportData.d.ts.map +1 -1
  130. package/dist/types/labs/DataView/useFilterConversion.d.ts.map +1 -1
  131. package/dist/types/labs/GroupPicker.d.ts.map +1 -1
  132. package/dist/types/labs/OdysseyPickers/ComposablePicker.d.ts.map +1 -1
  133. package/dist/types/labs/OdysseyPickers/Picker.d.ts.map +1 -1
  134. package/dist/types/labs/OdysseyPickers/PickerVirtualizationListBox.d.ts.map +1 -1
  135. package/dist/types/labs/PageTemplate/PageTemplate.d.ts.map +1 -1
  136. package/dist/types/labs/PaginatedTable.d.ts.map +1 -1
  137. package/dist/types/labs/StaticTable.d.ts.map +1 -1
  138. package/dist/types/properties/ts/odyssey-react-mui.d.ts +1 -0
  139. package/dist/types/properties/ts/odyssey-react-mui.d.ts.map +1 -1
  140. package/dist/types/properties/ts/odyssey-react-mui_eu.d.ts +131 -0
  141. package/dist/types/properties/ts/odyssey-react-mui_eu.d.ts.map +1 -0
  142. package/dist/types/remUtils.d.ts.map +1 -1
  143. package/dist/types/shadow-dom/shadow-dom.d.ts.map +1 -1
  144. package/dist/types/test-selectors/getByQuerySelector.d.ts.map +1 -1
  145. package/dist/types/test-selectors/getComputedAccessibleErrorMessageText.d.ts.map +1 -1
  146. package/dist/types/test-selectors/getComputedAccessibleText.d.ts.map +1 -1
  147. package/dist/types/test-selectors/interpolateString.d.ts.map +1 -1
  148. package/dist/types/test-selectors/linkedHtmlSelectors.d.ts.map +1 -1
  149. package/dist/types/test-selectors/queryOdysseySelector.d.ts +40 -36
  150. package/dist/types/test-selectors/queryOdysseySelector.d.ts.map +1 -1
  151. package/dist/types/test-selectors/querySelector.d.ts +6 -2
  152. package/dist/types/test-selectors/querySelector.d.ts.map +1 -1
  153. package/dist/types/test-selectors/sanityChecks.d.ts.map +1 -1
  154. package/dist/types/theme/components.d.ts.map +1 -1
  155. package/dist/types/theme/createOdysseyMuiTheme.d.ts.map +1 -1
  156. package/dist/types/theme/mixins.d.ts.map +1 -1
  157. package/dist/types/theme/palette.d.ts.map +1 -1
  158. package/dist/types/theme/pxToRem.d.ts.map +1 -1
  159. package/dist/types/theme/shape.d.ts.map +1 -1
  160. package/dist/types/theme/spacing.d.ts.map +1 -1
  161. package/dist/types/theme/typography.d.ts.map +1 -1
  162. package/dist/types/theme/useMediaQuery.d.ts.map +1 -1
  163. package/dist/types/ui-shell/AppSwitcher/AppSwitcherApp.d.ts.map +1 -1
  164. package/dist/types/ui-shell/InnerAppContainer.d.ts.map +1 -1
  165. package/dist/types/ui-shell/NarrowUiShellContent.d.ts.map +1 -1
  166. package/dist/types/ui-shell/SideNav/SideNav.d.ts.map +1 -1
  167. package/dist/types/ui-shell/SideNav/SideNavItemContent.d.ts.map +1 -1
  168. package/dist/types/ui-shell/SideNav/SideNavItemLinkContent.d.ts.map +1 -1
  169. package/dist/types/ui-shell/SideNav/SideNavToggleButton.d.ts.map +1 -1
  170. package/dist/types/ui-shell/SideNav/SortableList/SortableItem.d.ts.map +1 -1
  171. package/dist/types/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.d.ts.map +1 -1
  172. package/dist/types/ui-shell/UiShell.d.ts +1 -1
  173. package/dist/types/ui-shell/UiShell.d.ts.map +1 -1
  174. package/dist/types/ui-shell/UiShellProvider.d.ts +10 -4
  175. package/dist/types/ui-shell/UiShellProvider.d.ts.map +1 -1
  176. package/dist/types/ui-shell/bufferLatest.d.ts.map +1 -1
  177. package/dist/types/ui-shell/createMessageBus.d.ts.map +1 -1
  178. package/dist/types/ui-shell/createStore.d.ts.map +1 -1
  179. package/dist/types/ui-shell/renderUiShell.d.ts +2 -2
  180. package/dist/types/ui-shell/renderUiShell.d.ts.map +1 -1
  181. package/dist/types/ui-shell/useElementAtContainerEdge.d.ts +43 -0
  182. package/dist/types/ui-shell/useElementAtContainerEdge.d.ts.map +1 -0
  183. package/dist/types/ui-shell/useMatchAppElementToUiShellAppArea.d.ts.map +1 -1
  184. package/dist/types/ui-shell/useScrollState.d.ts +6 -2
  185. package/dist/types/ui-shell/useScrollState.d.ts.map +1 -1
  186. package/dist/types/ui-shell/useUiShellBreakpoints.d.ts.map +1 -1
  187. package/dist/types/useAutocomplete.d.ts.map +1 -1
  188. package/dist/types/useContrastMode.d.ts.map +1 -1
  189. package/dist/types/useMountLifecycleEffect.d.ts.map +1 -1
  190. package/dist/types/useNormalizedKey.d.ts.map +1 -1
  191. package/dist/types/useSessionStorageState.d.ts.map +1 -1
  192. package/dist/types/useUniqueAlphabeticalId.d.ts.map +1 -1
  193. package/dist/types/useUniqueId.d.ts.map +1 -1
  194. package/dist/types/web-component/odysseyWebComponentVersion.generated.d.ts +1 -1
  195. package/dist/types/web-component/odysseyWebComponentVersion.generated.d.ts.map +1 -1
  196. package/dist/types/web-component/renderReactInWebComponent.d.ts.map +1 -1
  197. package/package.json +13 -13
@@ -1 +1 @@
1
- {"version":3,"file":"SideNav.cjs","names":["_styled","_interopRequireDefault","require","_react","_reactI18next","_sortable","_reactErrorBoundary","_NavAccordion","_OdysseyDesignTokensContext","_OdysseyThemeProvider","_SideNavHeader","_SideNavItemContent","_SideNavFooterContent","_SideNavItemContentContext","_SideNavToggleButton","_SortableList","_Typography","_UiShellProvider","_uiShellSharedConstants","_useIsSideNavCollapsedSessionStorage","_useMountLifecycleEffect","_jsxRuntime","e","__esModule","default","SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED","exports","SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED","StyledCollapsibleContent","styled","shouldForwardProp","prop","odysseyDesignTokens","isSideNavCollapsed","position","display","gridTemplateColumns","SIDE_NAV_WIDTH","height","transition","TransitionDurationMain","transitionTimingFunction","TransitionTimingMain","overflow","opacity","StyledOpacityTransitionContainer","gridTemplateRows","StyledSideNavContainer","backgroundColor","hasNeighboringContent","isAppContentWhiteBackground","isSideNavToggleHighlighted","HueNeutralWhite","width","content","pointerEvents","right","BorderWidthMain","top","userSelect","zIndex","UI_SHELL_OVERLAY_Z_INDEX","BorderColorPrimaryControl","HueNeutral100","HueNeutral200","transform","SIDE_NAV_TOGGLE_ICON_HALF_SIZE","borderRightColor","borderRightStyle","BorderStyleMain","borderRightWidth","StyledSideNavToggleButtonContainer","SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION","StyledSideNavHeaderContainer","borderColor","hasContentScrolled","flexShrink","borderBottomWidth","borderBottomStyle","borderBottomColor","concat","StyledSideNavListContainer","padding","listStyle","listStyleType","margin","StyledSideNavScrollableContainer","overflowY","paddingInline","Spacing2","StyledSectionHeaderContainer","contrastFontColor","color","HueNeutral600","marginBlock","Spacing3","paddingBlock","Spacing1","Spacing4","StyledSideNavFooter","sideNavBackgroundColor","StyledPersistentSideNavFooter","isContentScrollable","transitionProperty","transitionDuration","transitionTiming","UI_SHELL_BASE_Z_INDEX","boxShadow","StyledSideNavFooterItemsContainer","sideNavContrastColors","flexWrap","alignItems","fontSize","TypographySizeOverline","fontColor","textDecoration","HueNeutral900","StyledLoadingItemContainer","gap","getHasScrollableContent","scrollableContainer","scrollHeight","clientHeight","LoadingItem","useOdysseyDesignTokens","jsxs","children","jsx","_Skeleton2","variant","SideNav","appName","footerComponent","footerItems","hasCustomFooter","hasSessionStorageState","isCollapsible","isCollapsed","isCompact","isLoading","isObtrusive","logoProps","onCollapse","onExpand","onSort","sideNavItems","setHasContentScrolled","useState","setHasNeighboringContent","setIsContentScrollable","setIsSideNavToggleHighlighted","sideNavItemsList","updateSideNavItemsList","isSideNavCollapsedLocalState","setIsSideNavCollapsedLocalState","sessionState","isSideNavCollapsedSessionState","setSessionState","setIsSideNavCollapsedSessionState","useIsSideNavCollapsedSessionStorage","setIsSideNavCollapsed","uiShellContext","useUiShellContext","t","useTranslation","scrollableContentRef","useRef","resizeObserverRef","intersectionObserverRef","sideNavRef","blankElement","useMemo","useEffect","current","getBoundingClientRect","x","onMount","useCallback","onUpdate","useMountLifecycleEffect","updateIsContentScrollable","parentElement","resizeObserverDebounceTimer","ResizeObserver","cancelAnimationFrame","requestAnimationFrame","observe","IntersectionObserver","entries","isIntersecting","slice","sort","a","b","time","at","root","threshold","ulElement","liElement","Array","from","disconnect","scrollIntoViewRef","firstSideNavItemIdWithIsSelected","flattenedItems","flatMap","sideNavItem","nestedNavItems","firstItemWithIsSelected","find","isSelected","id","scrollIntoView","getRefIfThisIsFirstNodeWithIsSelected","itemId","undefined","sideNavItemContentProviderValue","depth","setSelectedItem","selectedItemId","updatedSideNavItems","map","item","childItem","closeSideNavMenu","processedSideNavItems","childNavItems","childProps","isDisabled","isSortable","navItem","SideNavItemContentContext","Provider","value","SideNavItemContent","onItemSelected","scrollRef","translate","sideNavExpandClickHandler","sideNavExpandKeyHandler","event","key","code","preventDefault","unsubscribe","subscribeToCloseSideNavMenu","setSortedItems","parentId","activeId","activeIndex","overIndex","sortedSideNavItems","arrayMove","onSideNavToggleButtonHighlight","isHighlighted","appBackgroundColor","ref","SideNavToggleButton","clickAreaPadding","SIDE_NAV_TOGGLE_ICON_SIZE","ariaControls","onClick","onHighlight","onKeyDown","OdysseyThemeProvider","SideNavHeader","role","fill","_","index","href","isDefaultExpanded","isExpanded","isSectionHeader","label","startIcon","ErrorBoundary","fallback","Overline","component","nestedChildren","SortableList","items","onChange","renderItem","sortableItem","Item","StyledSideNavListItem","disabled","NavAccordion","SideNavFooterContent","MemoizedSideNav","memo","displayName"],"sources":["../../../../src/ui-shell/SideNav/SideNav.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport {\n memo,\n useMemo,\n useState,\n useCallback,\n useRef,\n useEffect,\n KeyboardEventHandler,\n CSSProperties,\n} from \"react\";\nimport { Skeleton } from \"@mui/material\";\nimport { useTranslation } from \"react-i18next\";\nimport { arrayMove } from \"@dnd-kit/sortable\";\nimport { UniqueIdentifier } from \"@dnd-kit/core\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { Property } from \"csstype\";\n\nimport { ContrastColors } from \"../../createContrastColors.js\";\nimport { NavAccordion } from \"./NavAccordion.js\";\nimport {\n DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext.js\";\nimport { OdysseyThemeProvider } from \"../../OdysseyThemeProvider.js\";\nimport type { SideNavProps } from \"./types.js\";\nimport { SideNavHeader } from \"./SideNavHeader.js\";\nimport {\n SideNavItemContent,\n StyledSideNavListItem,\n} from \"./SideNavItemContent.js\";\nimport { SideNavFooterContent } from \"./SideNavFooterContent.js\";\nimport { SideNavItemContentContext } from \"./SideNavItemContentContext.js\";\nimport {\n SIDE_NAV_TOGGLE_ICON_HALF_SIZE,\n SIDE_NAV_TOGGLE_ICON_SIZE,\n SideNavToggleButton,\n SideNavToggleButtonProps,\n} from \"./SideNavToggleButton.js\";\nimport { SortableList } from \"./SortableList/SortableList.js\";\nimport { Overline } from \"../../Typography.js\";\nimport {\n UiShellColors,\n useUiShellContext,\n} from \"../../ui-shell/UiShellProvider.js\";\nimport {\n SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION,\n SIDE_NAV_WIDTH,\n UI_SHELL_BASE_Z_INDEX,\n UI_SHELL_OVERLAY_Z_INDEX,\n} from \"../uiShellSharedConstants.js\";\nimport { useIsSideNavCollapsedSessionStorage } from \"./useIsSideNavCollapsedSessionStorage.js\";\nimport { useMountLifecycleEffect } from \"../../useMountLifecycleEffect.js\";\n\nexport const SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED = 12;\nexport const SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED = 2;\n\nconst StyledCollapsibleContent = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})<{\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n}>(({ odysseyDesignTokens, isSideNavCollapsed }) => ({\n position: \"relative\",\n display: \"grid\",\n gridTemplateColumns: SIDE_NAV_WIDTH,\n height: \"100%\",\n transition: `grid-template-columns ${odysseyDesignTokens.TransitionDurationMain}, opacity 300ms`,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n overflow: \"hidden\",\n\n ...(isSideNavCollapsed &&\n ({\n gridTemplateColumns: 0,\n opacity: 0,\n } satisfies CSSProperties)),\n}));\n\nconst StyledOpacityTransitionContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})(\n ({\n odysseyDesignTokens,\n isSideNavCollapsed,\n }: {\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n }) => ({\n display: \"grid\",\n gridTemplateRows: \"max-content 1fr max-content\",\n height: \"100%\",\n transition: `opacity 50ms`,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n overflow: \"hidden\",\n\n ...(isSideNavCollapsed &&\n ({\n opacity: 0,\n } satisfies CSSProperties)),\n }),\n);\n\nconst StyledSideNavContainer = styled(\"nav\", {\n shouldForwardProp: (prop) =>\n prop !== \"backgroundColor\" &&\n prop !== \"hasNeighboringContent\" &&\n prop !== \"isAppContentWhiteBackground\" &&\n prop !== \"isSideNavCollapsed\" &&\n prop !== \"isSideNavToggleHighlighted\" &&\n prop !== \"odysseyDesignTokens\",\n})<{\n backgroundColor?: UiShellColors[\"sideNavBackgroundColor\"];\n hasNeighboringContent: boolean;\n isAppContentWhiteBackground: boolean;\n isSideNavCollapsed: boolean;\n isSideNavToggleHighlighted: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(\n ({\n backgroundColor,\n hasNeighboringContent,\n isAppContentWhiteBackground,\n isSideNavCollapsed,\n isSideNavToggleHighlighted,\n odysseyDesignTokens,\n }) => ({\n // Side nav container styles\n backgroundColor: backgroundColor || odysseyDesignTokens.HueNeutralWhite,\n height: \"100%\",\n position: \"relative\",\n width: \"fit-content\",\n\n // Right-side vertical line shared\n \"&::before, &::after\": {\n content: \"''\",\n height: \"100%\",\n pointerEvents: \"none\",\n position: \"absolute\",\n right: `-${odysseyDesignTokens.BorderWidthMain}`,\n top: 0,\n transition: `opacity ${odysseyDesignTokens.TransitionDurationMain}, transform ${odysseyDesignTokens.TransitionDurationMain}, width ${odysseyDesignTokens.TransitionDurationMain}`,\n userSelect: \"none\",\n zIndex: UI_SHELL_OVERLAY_Z_INDEX,\n },\n\n // Right-side vertical line when open\n \"&::before\": {\n backgroundColor: isSideNavToggleHighlighted\n ? odysseyDesignTokens.BorderColorPrimaryControl\n : odysseyDesignTokens.HueNeutral100,\n opacity:\n isAppContentWhiteBackground ||\n (!isSideNavCollapsed && isSideNavToggleHighlighted)\n ? 1\n : 0,\n width: `calc(${odysseyDesignTokens.BorderWidthMain} * 2)`,\n },\n\n // Side nav vertical fill line when no neighboring content\n \"&::after\": {\n backgroundColor: odysseyDesignTokens.HueNeutral200,\n opacity: isSideNavCollapsed ? 1 : 0,\n transform:\n isSideNavCollapsed && !hasNeighboringContent\n ? isSideNavToggleHighlighted\n ? `translateX(calc(100% - (${odysseyDesignTokens.BorderWidthMain} * 2)))`\n : `translateX(calc(100% - ${SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED}px))`\n : \"translateX(0)\",\n width: hasNeighboringContent\n ? 0\n : `calc(${SIDE_NAV_TOGGLE_ICON_HALF_SIZE + SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED}px + ${odysseyDesignTokens.BorderWidthMain} * 2)`,\n\n // Right-side vertical line when collapsed\n ...((isSideNavCollapsed && isSideNavToggleHighlighted\n ? {\n borderRightColor: odysseyDesignTokens.BorderColorPrimaryControl,\n borderRightStyle:\n odysseyDesignTokens.BorderStyleMain as Property.BorderRightStyle,\n borderRightWidth: `calc(${odysseyDesignTokens.BorderWidthMain} * 2)`,\n }\n : {}) satisfies CSSProperties),\n },\n }),\n);\n\nconst StyledSideNavToggleButtonContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"hasNeighboringContent\" &&\n prop !== \"isSideNavCollapsed\" &&\n prop !== \"isSideNavToggleHighlighted\" &&\n prop !== \"odysseyDesignTokens\",\n})<{\n hasNeighboringContent: boolean;\n isSideNavCollapsed: boolean;\n isSideNavToggleHighlighted: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(\n ({\n hasNeighboringContent,\n isSideNavCollapsed,\n isSideNavToggleHighlighted,\n odysseyDesignTokens,\n }) => ({\n position: \"absolute\",\n right: `${SIDE_NAV_TOGGLE_ICON_HALF_SIZE}px`,\n top: SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION,\n transform:\n isSideNavCollapsed && !hasNeighboringContent\n ? isSideNavToggleHighlighted\n ? `translate3d(calc(100% + ${SIDE_NAV_TOGGLE_ICON_HALF_SIZE + SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED}px), 0, 0)`\n : `translate3d(calc(100% + ${SIDE_NAV_TOGGLE_ICON_HALF_SIZE + SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED}px), 0, 0)`\n : \"translate3d(100%, 0, 0)\",\n transition: `transform ${odysseyDesignTokens.TransitionDurationMain}`,\n zIndex: UI_SHELL_OVERLAY_Z_INDEX + 1,\n }),\n);\n\nconst StyledSideNavHeaderContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"borderColor\" &&\n prop !== \"hasContentScrolled\" &&\n prop !== \"odysseyDesignTokens\",\n})<{\n borderColor: ContrastColors[\"fontColor\"];\n hasContentScrolled: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(({ borderColor, hasContentScrolled, odysseyDesignTokens }) => ({\n flexShrink: 0,\n // The bottom border should appear only if the scrollable region has been scrolled\n ...(hasContentScrolled &&\n ({\n borderBottomWidth: odysseyDesignTokens.BorderWidthMain,\n borderBottomStyle: odysseyDesignTokens.BorderStyleMain,\n borderBottomColor: odysseyDesignTokens.HueNeutral100,\n\n ...(borderColor &&\n ({\n borderBottomColor: borderColor.concat(\"15\"),\n } satisfies CSSProperties)),\n } as CSSProperties)),\n}));\n\nconst StyledSideNavListContainer = styled(\"ul\")(() => ({\n padding: 0,\n listStyle: \"none\",\n listStyleType: \"none\",\n margin: 0,\n width: \"100%\",\n}));\n\nconst StyledSideNavScrollableContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})<{ odysseyDesignTokens: DesignTokens }>(({ odysseyDesignTokens }) => ({\n display: \"inline-grid\",\n gridTemplateRows: \"1fr max-content\",\n overflowY: \"auto\",\n paddingInline: odysseyDesignTokens.Spacing2,\n}));\n\nconst StyledSectionHeaderContainer = styled(\"li\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"contrastFontColor\",\n})(\n ({\n contrastFontColor,\n odysseyDesignTokens,\n }: {\n contrastFontColor: ContrastColors[\"fontColor\"];\n odysseyDesignTokens: DesignTokens;\n }) => ({\n color: contrastFontColor || odysseyDesignTokens.HueNeutral600,\n marginBlock: `${odysseyDesignTokens.Spacing3}`,\n paddingBlock: odysseyDesignTokens.Spacing1,\n paddingInline: odysseyDesignTokens.Spacing4,\n }),\n);\n\nconst StyledSideNavFooter = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"sideNavBackgroundColor\",\n})(\n ({\n odysseyDesignTokens,\n sideNavBackgroundColor,\n }: {\n odysseyDesignTokens: DesignTokens;\n sideNavBackgroundColor?: UiShellColors[\"sideNavBackgroundColor\"];\n }) => ({\n backgroundColor: odysseyDesignTokens.HueNeutralWhite,\n flexShrink: 0,\n padding: odysseyDesignTokens.Spacing4,\n\n ...(sideNavBackgroundColor &&\n ({\n backgroundColor: sideNavBackgroundColor,\n } satisfies CSSProperties)),\n }),\n);\n\nconst StyledPersistentSideNavFooter = styled(StyledSideNavFooter, {\n shouldForwardProp: (prop) =>\n prop !== \"isContentScrollable\" &&\n prop !== \"odysseyDesignTokens\" &&\n prop !== \"sideNavBackgroundColor\",\n})(\n ({\n isContentScrollable,\n odysseyDesignTokens,\n sideNavBackgroundColor,\n }: {\n isContentScrollable: boolean;\n odysseyDesignTokens: DesignTokens;\n sideNavBackgroundColor?: UiShellColors[\"sideNavBackgroundColor\"];\n }) => ({\n transitionProperty: \"box-shadow\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTiming: odysseyDesignTokens.TransitionTimingMain,\n zIndex: UI_SHELL_BASE_Z_INDEX,\n\n // The box shadow should appear above the footer only if the scrollable region has overflow\n ...(isContentScrollable &&\n ({\n boxShadow: \"0px -8px 8px -8px rgba(39, 39, 39, 0.08)\",\n } satisfies CSSProperties)),\n\n ...(sideNavBackgroundColor &&\n ({\n backgroundColor: sideNavBackgroundColor,\n } satisfies CSSProperties)),\n }),\n);\n\nconst StyledSideNavFooterItemsContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"sideNavContrastColors\",\n})<{\n odysseyDesignTokens: DesignTokens;\n sideNavContrastColors: UiShellColors[\"sideNavContrastColors\"];\n}>(({ odysseyDesignTokens, sideNavContrastColors }) => ({\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n fontSize: odysseyDesignTokens.TypographySizeOverline,\n\n \"a, span\": {\n color: odysseyDesignTokens.HueNeutral600,\n transition: `color ${odysseyDesignTokens.TransitionDurationMain}`,\n\n \"&:visited\": {\n color: odysseyDesignTokens.HueNeutral600,\n\n ...(sideNavContrastColors?.fontColor &&\n ({\n color: sideNavContrastColors?.fontColor,\n } satisfies CSSProperties)),\n },\n\n \"&:hover\": {\n textDecoration: \"none\",\n color: odysseyDesignTokens.HueNeutral900,\n\n ...(sideNavContrastColors?.fontColor &&\n ({\n color: sideNavContrastColors?.fontColor,\n } satisfies CSSProperties)),\n },\n\n ...(sideNavContrastColors?.fontColor &&\n ({\n color: sideNavContrastColors?.fontColor,\n } satisfies CSSProperties)),\n },\n}));\n\nconst StyledLoadingItemContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})<{ odysseyDesignTokens: DesignTokens }>(({ odysseyDesignTokens }) => ({\n alignItems: \"center\",\n display: \"flex\",\n gap: odysseyDesignTokens.Spacing2,\n paddingBlock: odysseyDesignTokens.Spacing2,\n paddingInline: odysseyDesignTokens.Spacing4,\n}));\n\nconst getHasScrollableContent = (scrollableContainer: HTMLElement) =>\n scrollableContainer.scrollHeight > scrollableContainer.clientHeight;\n\nconst LoadingItem = () => {\n const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();\n return (\n <StyledLoadingItemContainer odysseyDesignTokens={odysseyDesignTokens}>\n <Skeleton\n variant=\"circular\"\n width={odysseyDesignTokens.Spacing4}\n height={odysseyDesignTokens.Spacing4}\n />\n <Skeleton variant=\"rounded\" width=\"100%\" />\n </StyledLoadingItemContainer>\n );\n};\n\nconst SideNav = ({\n appName,\n footerComponent,\n footerItems,\n hasCustomFooter,\n hasSessionStorageState,\n isCollapsible,\n isCollapsed = false,\n isCompact,\n isLoading,\n isObtrusive,\n logoProps,\n onCollapse,\n onExpand,\n onSort,\n sideNavItems,\n}: SideNavProps) => {\n const [hasContentScrolled, setHasContentScrolled] = useState(false);\n const [hasNeighboringContent, setHasNeighboringContent] = useState(false);\n const [isContentScrollable, setIsContentScrollable] = useState(false);\n const [isSideNavToggleHighlighted, setIsSideNavToggleHighlighted] =\n useState(false);\n const [sideNavItemsList, updateSideNavItemsList] = useState(\n sideNavItems || [],\n );\n\n const [isSideNavCollapsedLocalState, setIsSideNavCollapsedLocalState] =\n useState(isCollapsed);\n\n const {\n sessionState: isSideNavCollapsedSessionState,\n setSessionState: setIsSideNavCollapsedSessionState,\n } = useIsSideNavCollapsedSessionStorage(isCollapsed);\n\n const isSideNavCollapsed = hasSessionStorageState\n ? isSideNavCollapsedSessionState\n : isSideNavCollapsedLocalState;\n const setIsSideNavCollapsed = hasSessionStorageState\n ? setIsSideNavCollapsedSessionState\n : setIsSideNavCollapsedLocalState;\n\n const uiShellContext = useUiShellContext();\n const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();\n const { t } = useTranslation();\n\n const scrollableContentRef = useRef<HTMLUListElement>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const intersectionObserverRef = useRef<IntersectionObserver | null>(null);\n const sideNavRef = useRef<HTMLDivElement>(null);\n\n const blankElement = useMemo(() => <div />, []);\n\n // The default value (sideNavItems) passed to useState is ONLY used by the useState hook for\n // the very first value. Subsequent updates to the prop (sideNavItems) need to cause the state\n // to update!\n useEffect(() => updateSideNavItemsList(sideNavItems || []), [sideNavItems]);\n\n // update sidenav collapse status\n useEffect(() => {\n if (sideNavRef.current) {\n setHasNeighboringContent(\n sideNavRef.current.getBoundingClientRect().x > 0,\n );\n }\n // We want this listening to `isCollapsed` because that changes what's next to the side nav.\n }, [isCollapsed]);\n\n // In the case that you can't control the side nav, then it should use whatever state was passed (app control) rather than what's stored in session storage (user control).\n const onMount = useCallback(() => {\n if (!isCollapsible) {\n setIsSideNavCollapsed(isCollapsed);\n }\n }, [isCollapsed, isCollapsible, setIsSideNavCollapsed]);\n\n const onUpdate = useCallback(() => {\n setIsSideNavCollapsed(isCollapsed);\n }, [isCollapsed, setIsSideNavCollapsed]);\n\n useMountLifecycleEffect({\n onMount,\n onUpdate,\n });\n\n useEffect(() => {\n // This is called directly in this effect AND perhaps as a result of the ResizeObserver\n const updateIsContentScrollable = () => {\n if (\n scrollableContentRef.current &&\n scrollableContentRef.current.parentElement\n ) {\n setIsContentScrollable(\n getHasScrollableContent(scrollableContentRef.current.parentElement),\n );\n }\n };\n\n // If the window is resized, we may need to re-determine if the scrollable container has overflow\n // Setup a ResizeObserver to know if the size of the scrollableContent changes\n let resizeObserverDebounceTimer: ReturnType<typeof requestAnimationFrame>;\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n cancelAnimationFrame(resizeObserverDebounceTimer);\n resizeObserverDebounceTimer = requestAnimationFrame(\n updateIsContentScrollable,\n );\n });\n }\n\n if (resizeObserverRef.current && scrollableContentRef.current) {\n // Observe the <ul> itself (in case it changes size due to the content expanding)\n resizeObserverRef.current.observe(scrollableContentRef.current);\n if (scrollableContentRef.current.parentElement) {\n // ALSO observe the parent (<SideNavScrollableContainer>) in case the window resizes\n resizeObserverRef.current.observe(\n scrollableContentRef.current.parentElement,\n );\n }\n }\n\n // Determine if the scrollable container has overflow or not on load\n updateIsContentScrollable();\n\n // Finally, we only want to have the border on the bottom of the header iff the user has scrolled\n // the scrollable container\n if (!intersectionObserverRef.current && scrollableContentRef.current) {\n intersectionObserverRef.current = new IntersectionObserver(\n (entries) => {\n // If isIntersecting is true, then we're at the top of the scroll container\n // If isIntersecting is false, some scrolling has occurred.\n // The entries must be sorted by time and we only really need to look at the latest one\n const isIntersecting = entries\n .slice()\n .sort((a, b) => a.time - b.time)\n .at(0)?.isIntersecting;\n setHasContentScrolled(!isIntersecting);\n },\n {\n root: scrollableContentRef.current.parentElement,\n threshold: 1.0,\n },\n );\n }\n\n if (intersectionObserverRef.current && scrollableContentRef.current) {\n const ulElement = scrollableContentRef.current;\n const [liElement] = Array.from(ulElement?.children || []);\n\n if (liElement) {\n intersectionObserverRef.current.observe(liElement);\n }\n }\n\n // Cleanup when unmounted:\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n if (intersectionObserverRef.current) {\n intersectionObserverRef.current.disconnect();\n intersectionObserverRef.current = null;\n }\n cancelAnimationFrame(resizeObserverDebounceTimer); // Ensure timer is cleared on component unmount\n };\n }, [sideNavItemsList]);\n\n const scrollIntoViewRef = useRef<HTMLLIElement>(null);\n /**\n * Look through the sideNavItems and determine which is the first node\n * with isSelected. This should be the node we set a ref on in order to\n * call scrollIntoView in the effect\n */\n const firstSideNavItemIdWithIsSelected = useMemo(() => {\n const flattenedItems = sideNavItemsList.flatMap((sideNavItem) =>\n sideNavItem.nestedNavItems\n ? [sideNavItem, ...sideNavItem.nestedNavItems]\n : sideNavItem,\n );\n const firstItemWithIsSelected = flattenedItems.find(\n (sideNavItem) => sideNavItem.isSelected,\n );\n return firstItemWithIsSelected?.id;\n }, [sideNavItemsList]);\n /**\n * Once we've rendered and if we have an item to scroll to, do the scroll action.\n * This must rely on checking firstSideNavItemIdWithIsSelected or it will not run\n * once the actual ref is populated.\n */\n useEffect(() => {\n if (firstSideNavItemIdWithIsSelected && scrollIntoViewRef.current) {\n scrollIntoViewRef.current.scrollIntoView();\n }\n }, [firstSideNavItemIdWithIsSelected]);\n\n /**\n * We only want to put a ref on a node iff it is the first selected node.\n * This function returns the ref only if the ID provided matches the first\n * selected node, otherwise returns undefined (so that the node has no ref)\n */\n const getRefIfThisIsFirstNodeWithIsSelected = useCallback(\n (itemId: string) =>\n itemId === firstSideNavItemIdWithIsSelected\n ? scrollIntoViewRef\n : undefined,\n [firstSideNavItemIdWithIsSelected],\n );\n\n const sideNavItemContentProviderValue = useMemo(\n () => ({ isCompact, depth: 1 }),\n [isCompact],\n );\n\n const setSelectedItem = useCallback(\n (selectedItemId: string) => {\n const updatedSideNavItems = sideNavItemsList.map((item) => {\n if (item.id === selectedItemId) {\n item.isSelected = true;\n } else if (item.isSelected) {\n delete item.isSelected;\n }\n\n return item.nestedNavItems\n ? {\n ...item,\n nestedNavItems: item.nestedNavItems.map((childItem) => {\n if (childItem.id === selectedItemId) {\n childItem.isSelected = true;\n } else if (childItem.isSelected) {\n delete childItem.isSelected;\n }\n return childItem;\n }),\n }\n : item;\n });\n updateSideNavItemsList(updatedSideNavItems);\n\n if (isCollapsed || isObtrusive) {\n if (isCollapsible) {\n uiShellContext?.closeSideNavMenu();\n } else {\n onCollapse?.();\n }\n }\n },\n [\n isCollapsed,\n isCollapsible,\n isObtrusive,\n onCollapse,\n sideNavItemsList,\n uiShellContext,\n ],\n );\n\n const processedSideNavItems = useMemo(() => {\n return sideNavItemsList?.map((item) => ({\n ...item,\n childNavItems: item.nestedNavItems?.map((childProps) => ({\n id: childProps.id,\n isSelected: childProps.isSelected,\n isDisabled: childProps.isDisabled,\n isSortable: childProps.isSortable,\n navItem: (\n <SideNavItemContentContext.Provider\n key={childProps.id}\n value={{\n ...sideNavItemContentProviderValue,\n depth: 2,\n isSortable: item.isSortable,\n }}\n >\n <SideNavItemContent\n {...childProps}\n onItemSelected={setSelectedItem}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}\n translate={childProps.translate}\n />\n </SideNavItemContentContext.Provider>\n ),\n })),\n }));\n }, [\n getRefIfThisIsFirstNodeWithIsSelected,\n setSelectedItem,\n sideNavItemContentProviderValue,\n sideNavItemsList,\n ]);\n\n const sideNavExpandClickHandler = useCallback(() => {\n setIsSideNavCollapsed((isSideNavCollapsed) => {\n if (isSideNavCollapsed) {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n\n return !isSideNavCollapsed;\n });\n }, [onCollapse, onExpand, setIsSideNavCollapsed]);\n\n const sideNavExpandKeyHandler = useCallback<\n KeyboardEventHandler<HTMLButtonElement>\n >(\n (event) => {\n if (event?.key === \"Enter\" || event?.code === \"Space\") {\n event.preventDefault();\n sideNavExpandClickHandler();\n }\n },\n [sideNavExpandClickHandler],\n );\n\n useEffect(() => {\n const unsubscribe = uiShellContext?.subscribeToCloseSideNavMenu(() => {\n onCollapse?.();\n setIsSideNavCollapsed(true);\n });\n\n return () => {\n unsubscribe?.();\n };\n }, [onCollapse, setIsSideNavCollapsed, uiShellContext]);\n\n const setSortedItems = useCallback(\n (\n parentId: string,\n activeId: UniqueIdentifier,\n activeIndex: number,\n overIndex: number,\n ) => {\n const sortedSideNavItems = sideNavItemsList.map((item) =>\n item.id === parentId && item.nestedNavItems\n ? {\n ...item,\n nestedNavItems: arrayMove(\n item.nestedNavItems,\n activeIndex,\n overIndex,\n ),\n }\n : item,\n );\n updateSideNavItemsList(sortedSideNavItems);\n onSort?.(sortedSideNavItems, parentId, activeId, activeIndex, overIndex);\n },\n [onSort, sideNavItemsList],\n );\n\n const onSideNavToggleButtonHighlight = useCallback<\n NonNullable<SideNavToggleButtonProps[\"onHighlight\"]>\n >((isHighlighted) => {\n setIsSideNavToggleHighlighted(isHighlighted);\n }, []);\n\n return (\n <StyledSideNavContainer\n aria-label={t(\"navigation.label\")}\n backgroundColor={uiShellContext?.sideNavBackgroundColor}\n hasNeighboringContent={hasNeighboringContent}\n id=\"side-nav-expandable\"\n isAppContentWhiteBackground={\n uiShellContext?.appBackgroundColor ===\n odysseyDesignTokens.HueNeutralWhite\n }\n isSideNavCollapsed={isSideNavCollapsed}\n isSideNavToggleHighlighted={isSideNavToggleHighlighted}\n odysseyDesignTokens={odysseyDesignTokens}\n ref={sideNavRef}\n >\n {isCollapsible && (\n <StyledSideNavToggleButtonContainer\n hasNeighboringContent={hasNeighboringContent}\n isSideNavCollapsed={isSideNavCollapsed}\n isSideNavToggleHighlighted={isSideNavToggleHighlighted}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <SideNavToggleButton\n clickAreaPadding={\n isSideNavCollapsed && !hasNeighboringContent\n ? SIDE_NAV_TOGGLE_ICON_SIZE / 2\n : 0\n }\n ariaControls=\"side-nav-expandable\"\n isSideNavCollapsed={isSideNavCollapsed}\n onClick={sideNavExpandClickHandler}\n onHighlight={onSideNavToggleButtonHighlight}\n onKeyDown={sideNavExpandKeyHandler}\n />\n </StyledSideNavToggleButtonContainer>\n )}\n\n <OdysseyThemeProvider>\n <StyledCollapsibleContent\n data-se=\"collapsible-region\"\n isSideNavCollapsed={isSideNavCollapsed}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <StyledOpacityTransitionContainer\n isSideNavCollapsed={isSideNavCollapsed}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n {appName || isLoading || logoProps ? (\n <StyledSideNavHeaderContainer\n hasContentScrolled={hasContentScrolled}\n odysseyDesignTokens={odysseyDesignTokens}\n borderColor={uiShellContext?.sideNavContrastColors?.fontColor}\n >\n {isLoading && !appName && !logoProps ? (\n <SideNavHeader isLoading={isLoading} />\n ) : (\n <SideNavHeader\n appName={appName}\n isLoading={isLoading}\n logoProps={logoProps}\n />\n )}\n </StyledSideNavHeaderContainer>\n ) : (\n <div />\n )}\n\n <StyledSideNavScrollableContainer\n odysseyDesignTokens={odysseyDesignTokens}\n data-se=\"scrollable-region\"\n >\n <StyledSideNavListContainer\n role=\"none\"\n ref={scrollableContentRef}\n >\n {isLoading\n ? Array(6)\n .fill(null)\n .map((_, index) => <LoadingItem key={index} />)\n : processedSideNavItems?.map((item) => {\n const {\n childNavItems,\n href,\n id,\n isDefaultExpanded,\n isDisabled,\n isExpanded,\n isSectionHeader,\n isSortable,\n label,\n startIcon,\n } = item;\n\n if (isSectionHeader) {\n return (\n <ErrorBoundary fallback={blankElement} key={id}>\n <StyledSectionHeaderContainer\n contrastFontColor={\n uiShellContext?.sideNavContrastColors?.fontColor\n }\n id={id}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <Overline component=\"h3\">{label}</Overline>\n </StyledSectionHeaderContainer>\n </ErrorBoundary>\n );\n } else if (childNavItems) {\n const nestedChildren = (\n <StyledSideNavListContainer role=\"presentation\">\n {isSortable ? (\n <SortableList\n parentId={item.id}\n items={childNavItems}\n onChange={setSortedItems}\n renderItem={(sortableItem) => (\n <SortableList.Item\n id={sortableItem.id}\n isDisabled={sortableItem.isDisabled}\n isSelected={sortableItem.isSelected}\n isSortable={sortableItem.isSortable}\n >\n {sortableItem.navItem}\n </SortableList.Item>\n )}\n />\n ) : (\n childNavItems.map((item) => item.navItem)\n )}\n </StyledSideNavListContainer>\n );\n\n return href ? (\n <ErrorBoundary fallback={blankElement} key={id}>\n <SideNavItemContent\n {...item}\n href={href}\n onItemSelected={setSelectedItem}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(\n item.id,\n )}\n startIcon={item.startIcon}\n />\n\n <StyledSideNavListItem\n id={`${id}-items`}\n odysseyDesignTokens={odysseyDesignTokens}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n >\n {nestedChildren}\n </StyledSideNavListItem>\n </ErrorBoundary>\n ) : (\n <ErrorBoundary fallback={blankElement} key={id}>\n <StyledSideNavListItem\n id={id}\n odysseyDesignTokens={odysseyDesignTokens}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n >\n <NavAccordion\n label={label}\n isCompact={isCompact}\n isDefaultExpanded={isDefaultExpanded}\n isExpanded={isExpanded}\n startIcon={startIcon}\n isDisabled={isDisabled}\n >\n {nestedChildren}\n </NavAccordion>\n </StyledSideNavListItem>\n </ErrorBoundary>\n );\n } else {\n return (\n <ErrorBoundary fallback={blankElement} key={item.id}>\n <SideNavItemContentContext.Provider\n value={sideNavItemContentProviderValue}\n >\n <SideNavItemContent\n {...item}\n onItemSelected={setSelectedItem}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(\n item.id,\n )}\n startIcon={item.startIcon}\n />\n </SideNavItemContentContext.Provider>\n </ErrorBoundary>\n );\n }\n })}\n </StyledSideNavListContainer>\n {!isLoading && footerItems && !hasCustomFooter && (\n <StyledSideNavFooter\n odysseyDesignTokens={odysseyDesignTokens}\n sideNavBackgroundColor={\n uiShellContext?.sideNavBackgroundColor\n }\n >\n <StyledSideNavFooterItemsContainer\n odysseyDesignTokens={odysseyDesignTokens}\n sideNavContrastColors={\n uiShellContext?.sideNavContrastColors\n }\n >\n <SideNavFooterContent footerItems={footerItems} />\n </StyledSideNavFooterItemsContainer>\n </StyledSideNavFooter>\n )}\n </StyledSideNavScrollableContainer>\n {!isLoading && !footerItems && hasCustomFooter && (\n <StyledPersistentSideNavFooter\n isContentScrollable={isContentScrollable}\n odysseyDesignTokens={odysseyDesignTokens}\n sideNavBackgroundColor={uiShellContext?.sideNavBackgroundColor}\n >\n {footerComponent}\n </StyledPersistentSideNavFooter>\n )}\n </StyledOpacityTransitionContainer>\n </StyledCollapsibleContent>\n </OdysseyThemeProvider>\n </StyledSideNavContainer>\n );\n};\n\nconst MemoizedSideNav = memo(SideNav);\nMemoizedSideNav.displayName = \"SideNav\";\n\nexport { MemoizedSideNav as SideNav };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SideNav.cjs","names":["_styled","_interopRequireDefault","require","_react","_reactI18next","_sortable","_reactErrorBoundary","_NavAccordion","_OdysseyDesignTokensContext","_useElementAtContainerEdge","_OdysseyThemeProvider","_SideNavHeader","_SideNavItemContent","_SideNavFooterContent","_SideNavItemContentContext","_SideNavToggleButton","_SortableList","_Typography","_UiShellProvider","_uiShellSharedConstants","_useIsSideNavCollapsedSessionStorage","_useMountLifecycleEffect","_jsxRuntime","e","__esModule","default","SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED","exports","SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED","StyledCollapsibleContent","styled","shouldForwardProp","prop","odysseyDesignTokens","isSideNavCollapsed","position","display","gridTemplateColumns","SIDE_NAV_WIDTH","height","transition","TransitionDurationMain","transitionTimingFunction","TransitionTimingMain","overflow","opacity","StyledOpacityTransitionContainer","gridTemplateRows","StyledSideNavContainer","backgroundColor","hasNeighbouringContentAtInlineStart","isAppContentWhiteBackground","isSideNavToggleHighlighted","HueNeutralWhite","width","content","pointerEvents","right","BorderWidthMain","top","userSelect","zIndex","UI_SHELL_OVERLAY_Z_INDEX","BorderColorPrimaryControl","HueNeutral100","HueNeutral200","transform","SIDE_NAV_TOGGLE_ICON_HALF_SIZE","borderRightColor","borderRightStyle","BorderStyleMain","borderRightWidth","StyledSideNavToggleButtonContainer","SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION","StyledSideNavHeaderContainer","borderColor","hasContentScrolled","flexShrink","borderBottomWidth","borderBottomStyle","borderBottomColor","concat","StyledSideNavListContainer","padding","listStyle","listStyleType","margin","StyledSideNavScrollableContainer","hasBlockStartPadding","overflowY","paddingBlockStart","Spacing2","paddingInline","StyledSectionHeaderContainer","contrastFontColor","color","HueNeutral600","marginBlock","Spacing3","paddingBlock","Spacing1","Spacing4","StyledSideNavFooter","sideNavBackgroundColor","StyledPersistentSideNavFooter","isContentScrollable","transitionProperty","transitionDuration","transitionTiming","UI_SHELL_BASE_Z_INDEX","boxShadow","StyledSideNavFooterItemsContainer","sideNavContrastColors","flexWrap","alignItems","fontSize","TypographySizeOverline","fontColor","textDecoration","HueNeutral900","StyledLoadingItemContainer","gap","getHasScrollableContent","scrollableContainer","scrollHeight","clientHeight","LoadingItem","useOdysseyDesignTokens","jsxs","children","jsx","_Skeleton2","variant","SideNav","appName","footerComponent","footerItems","hasCustomFooter","hasSessionStorageState","isCollapsible","isCollapsed","isCompact","isLoading","isObtrusive","logoProps","onCollapse","onExpand","onSort","sideNavItems","setHasContentScrolled","useState","setIsContentScrollable","setIsSideNavToggleHighlighted","sideNavItemsList","updateSideNavItemsList","isSideNavCollapsedLocalState","setIsSideNavCollapsedLocalState","sessionState","isSideNavCollapsedSessionState","setSessionState","setIsSideNavCollapsedSessionState","useIsSideNavCollapsedSessionStorage","setIsSideNavCollapsed","uiShellContext","useUiShellContext","t","useTranslation","scrollableContentRef","useRef","resizeObserverRef","intersectionObserverRef","sideNavRef","isAtContainerInlineStart","useElementAtContainerEdge","element","current","monitoringElement","parentElement","blankElement","useMemo","useEffect","onMount","useCallback","onUpdate","useMountLifecycleEffect","updateIsContentScrollable","resizeObserverDebounceTimer","ResizeObserver","cancelAnimationFrame","requestAnimationFrame","observe","IntersectionObserver","entries","isIntersecting","slice","sort","a","b","time","at","root","threshold","ulElement","liElement","Array","from","disconnect","scrollIntoViewRef","firstSideNavItemIdWithIsSelected","flattenedItems","flatMap","sideNavItem","nestedNavItems","firstItemWithIsSelected","find","isSelected","id","scrollIntoView","getRefIfThisIsFirstNodeWithIsSelected","itemId","undefined","sideNavItemContentProviderValue","depth","setSelectedItem","selectedItemId","updatedSideNavItems","map","item","childItem","closeSideNavMenu","processedSideNavItems","childNavItems","childProps","isDisabled","isSortable","navItem","SideNavItemContentContext","Provider","value","SideNavItemContent","onItemSelected","scrollRef","translate","sideNavExpandClickHandler","sideNavExpandKeyHandler","event","key","code","preventDefault","unsubscribe","subscribeToCloseSideNavMenu","setSortedItems","parentId","activeId","activeIndex","overIndex","sortedSideNavItems","arrayMove","onSideNavToggleButtonHighlight","isHighlighted","appBackgroundColor","ref","SideNavToggleButton","clickAreaPadding","SIDE_NAV_TOGGLE_ICON_SIZE","ariaControls","onClick","onHighlight","onKeyDown","OdysseyThemeProvider","SideNavHeader","role","fill","_","index","href","isDefaultExpanded","isExpanded","isSectionHeader","label","startIcon","ErrorBoundary","fallback","Overline","component","nestedChildren","SortableList","items","onChange","renderItem","sortableItem","Item","StyledSideNavListItem","disabled","NavAccordion","SideNavFooterContent","MemoizedSideNav","memo","displayName"],"sources":["../../../../src/ui-shell/SideNav/SideNav.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport {\n memo,\n useMemo,\n useState,\n useCallback,\n useRef,\n useEffect,\n KeyboardEventHandler,\n CSSProperties,\n} from \"react\";\nimport { Skeleton } from \"@mui/material\";\nimport { useTranslation } from \"react-i18next\";\nimport { arrayMove } from \"@dnd-kit/sortable\";\nimport { UniqueIdentifier } from \"@dnd-kit/core\";\nimport { ErrorBoundary } from \"react-error-boundary\";\nimport { Property } from \"csstype\";\n\nimport { ContrastColors } from \"../../createContrastColors.js\";\nimport { NavAccordion } from \"./NavAccordion.js\";\nimport {\n DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext.js\";\nimport { useElementAtContainerEdge } from \"../useElementAtContainerEdge.js\";\nimport { OdysseyThemeProvider } from \"../../OdysseyThemeProvider.js\";\nimport type { SideNavProps } from \"./types.js\";\nimport { SideNavHeader } from \"./SideNavHeader.js\";\nimport {\n SideNavItemContent,\n StyledSideNavListItem,\n} from \"./SideNavItemContent.js\";\nimport { SideNavFooterContent } from \"./SideNavFooterContent.js\";\nimport { SideNavItemContentContext } from \"./SideNavItemContentContext.js\";\nimport {\n SIDE_NAV_TOGGLE_ICON_HALF_SIZE,\n SIDE_NAV_TOGGLE_ICON_SIZE,\n SideNavToggleButton,\n SideNavToggleButtonProps,\n} from \"./SideNavToggleButton.js\";\nimport { SortableList } from \"./SortableList/SortableList.js\";\nimport { Overline } from \"../../Typography.js\";\nimport {\n UiShellColors,\n useUiShellContext,\n} from \"../../ui-shell/UiShellProvider.js\";\nimport {\n SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION,\n SIDE_NAV_WIDTH,\n UI_SHELL_BASE_Z_INDEX,\n UI_SHELL_OVERLAY_Z_INDEX,\n} from \"../uiShellSharedConstants.js\";\nimport { useIsSideNavCollapsedSessionStorage } from \"./useIsSideNavCollapsedSessionStorage.js\";\nimport { useMountLifecycleEffect } from \"../../useMountLifecycleEffect.js\";\n\nexport const SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED = 12;\nexport const SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED = 2;\n\nconst StyledCollapsibleContent = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})<{\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n}>(({ odysseyDesignTokens, isSideNavCollapsed }) => ({\n position: \"relative\",\n display: \"grid\",\n gridTemplateColumns: SIDE_NAV_WIDTH,\n height: \"100%\",\n transition: `grid-template-columns ${odysseyDesignTokens.TransitionDurationMain}, opacity 300ms`,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n overflow: \"hidden\",\n\n ...(isSideNavCollapsed &&\n ({\n gridTemplateColumns: 0,\n opacity: 0,\n } satisfies CSSProperties)),\n}));\n\nconst StyledOpacityTransitionContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})(\n ({\n odysseyDesignTokens,\n isSideNavCollapsed,\n }: {\n odysseyDesignTokens: DesignTokens;\n isSideNavCollapsed: boolean;\n }) => ({\n display: \"grid\",\n gridTemplateRows: \"max-content 1fr max-content\",\n height: \"100%\",\n transition: `opacity 50ms`,\n transitionTimingFunction: odysseyDesignTokens.TransitionTimingMain,\n overflow: \"hidden\",\n\n ...(isSideNavCollapsed &&\n ({\n opacity: 0,\n } satisfies CSSProperties)),\n }),\n);\n\nconst StyledSideNavContainer = styled(\"nav\", {\n shouldForwardProp: (prop) =>\n prop !== \"backgroundColor\" &&\n prop !== \"hasNeighbouringContentAtInlineStart\" &&\n prop !== \"isAppContentWhiteBackground\" &&\n prop !== \"isSideNavCollapsed\" &&\n prop !== \"isSideNavToggleHighlighted\" &&\n prop !== \"odysseyDesignTokens\",\n})<{\n backgroundColor?: UiShellColors[\"sideNavBackgroundColor\"];\n hasNeighbouringContentAtInlineStart: boolean;\n isAppContentWhiteBackground: boolean;\n isSideNavCollapsed: boolean;\n isSideNavToggleHighlighted: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(\n ({\n backgroundColor,\n hasNeighbouringContentAtInlineStart,\n isAppContentWhiteBackground,\n isSideNavCollapsed,\n isSideNavToggleHighlighted,\n odysseyDesignTokens,\n }) => ({\n // Side nav container styles\n backgroundColor: backgroundColor || odysseyDesignTokens.HueNeutralWhite,\n height: \"100%\",\n position: \"relative\",\n width: \"fit-content\",\n\n // Right-side vertical line shared\n \"&::before, &::after\": {\n content: \"''\",\n height: \"100%\",\n pointerEvents: \"none\",\n position: \"absolute\",\n right: `-${odysseyDesignTokens.BorderWidthMain}`,\n top: 0,\n transition: `opacity ${odysseyDesignTokens.TransitionDurationMain}, transform ${odysseyDesignTokens.TransitionDurationMain}, width ${odysseyDesignTokens.TransitionDurationMain}`,\n userSelect: \"none\",\n zIndex: UI_SHELL_OVERLAY_Z_INDEX,\n },\n\n // Right-side vertical line when open\n \"&::before\": {\n backgroundColor: isSideNavToggleHighlighted\n ? odysseyDesignTokens.BorderColorPrimaryControl\n : odysseyDesignTokens.HueNeutral100,\n opacity:\n isAppContentWhiteBackground ||\n (!isSideNavCollapsed && isSideNavToggleHighlighted)\n ? 1\n : 0,\n width: `calc(${odysseyDesignTokens.BorderWidthMain} * 2)`,\n },\n\n // Side nav vertical fill line when no neighboring content\n \"&::after\": {\n backgroundColor: odysseyDesignTokens.HueNeutral200,\n opacity: isSideNavCollapsed ? 1 : 0,\n transform:\n isSideNavCollapsed && !hasNeighbouringContentAtInlineStart\n ? isSideNavToggleHighlighted\n ? `translateX(calc(100% - (${odysseyDesignTokens.BorderWidthMain} * 2)))`\n : `translateX(calc(100% - ${SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED}px))`\n : \"translateX(0)\",\n width: hasNeighbouringContentAtInlineStart\n ? 0\n : `calc(${SIDE_NAV_TOGGLE_ICON_HALF_SIZE + SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED}px + ${odysseyDesignTokens.BorderWidthMain} * 2)`,\n\n // Right-side vertical line when collapsed\n ...((isSideNavCollapsed && isSideNavToggleHighlighted\n ? {\n borderRightColor: odysseyDesignTokens.BorderColorPrimaryControl,\n borderRightStyle:\n odysseyDesignTokens.BorderStyleMain as Property.BorderRightStyle,\n borderRightWidth: `calc(${odysseyDesignTokens.BorderWidthMain} * 2)`,\n }\n : {}) satisfies CSSProperties),\n },\n }),\n);\n\nconst StyledSideNavToggleButtonContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"hasNeighbouringContentAtInlineStart\" &&\n prop !== \"isSideNavCollapsed\" &&\n prop !== \"isSideNavToggleHighlighted\" &&\n prop !== \"odysseyDesignTokens\",\n})<{\n hasNeighbouringContentAtInlineStart: boolean;\n isSideNavCollapsed: boolean;\n isSideNavToggleHighlighted: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(\n ({\n hasNeighbouringContentAtInlineStart,\n isSideNavCollapsed,\n isSideNavToggleHighlighted,\n odysseyDesignTokens,\n }) => ({\n position: \"absolute\",\n right: `${SIDE_NAV_TOGGLE_ICON_HALF_SIZE}px`,\n top: SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION,\n transform:\n isSideNavCollapsed && !hasNeighbouringContentAtInlineStart\n ? isSideNavToggleHighlighted\n ? `translate3d(calc(100% + ${SIDE_NAV_TOGGLE_ICON_HALF_SIZE + SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED}px), 0, 0)`\n : `translate3d(calc(100% + ${SIDE_NAV_TOGGLE_ICON_HALF_SIZE + SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED}px), 0, 0)`\n : \"translate3d(100%, 0, 0)\",\n transition: `transform ${odysseyDesignTokens.TransitionDurationMain}`,\n zIndex: UI_SHELL_OVERLAY_Z_INDEX + 1,\n }),\n);\n\nconst StyledSideNavHeaderContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"borderColor\" &&\n prop !== \"hasContentScrolled\" &&\n prop !== \"odysseyDesignTokens\",\n})<{\n borderColor: ContrastColors[\"fontColor\"];\n hasContentScrolled: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(({ borderColor, hasContentScrolled, odysseyDesignTokens }) => ({\n flexShrink: 0,\n // The bottom border should appear only if the scrollable region has been scrolled\n ...(hasContentScrolled &&\n ({\n borderBottomWidth: odysseyDesignTokens.BorderWidthMain,\n borderBottomStyle: odysseyDesignTokens.BorderStyleMain,\n borderBottomColor: odysseyDesignTokens.HueNeutral100,\n\n ...(borderColor &&\n ({\n borderBottomColor: borderColor.concat(\"15\"),\n } satisfies CSSProperties)),\n } as CSSProperties)),\n}));\n\nconst StyledSideNavListContainer = styled(\"ul\")(() => ({\n padding: 0,\n listStyle: \"none\",\n listStyleType: \"none\",\n margin: 0,\n width: \"100%\",\n}));\n\nconst StyledSideNavScrollableContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"hasBlockStartPadding\",\n})<{ odysseyDesignTokens: DesignTokens; hasBlockStartPadding?: boolean }>(\n ({ odysseyDesignTokens, hasBlockStartPadding }) => ({\n display: \"inline-grid\",\n gridTemplateRows: \"1fr max-content\",\n overflowY: \"auto\",\n paddingBlockStart: hasBlockStartPadding ? odysseyDesignTokens.Spacing2 : 0,\n paddingInline: odysseyDesignTokens.Spacing2,\n }),\n);\n\nconst StyledSectionHeaderContainer = styled(\"li\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"contrastFontColor\",\n})(\n ({\n contrastFontColor,\n odysseyDesignTokens,\n }: {\n contrastFontColor: ContrastColors[\"fontColor\"];\n odysseyDesignTokens: DesignTokens;\n }) => ({\n color: contrastFontColor || odysseyDesignTokens.HueNeutral600,\n marginBlock: `${odysseyDesignTokens.Spacing3}`,\n paddingBlock: odysseyDesignTokens.Spacing1,\n paddingInline: odysseyDesignTokens.Spacing4,\n }),\n);\n\nconst StyledSideNavFooter = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"sideNavBackgroundColor\",\n})(\n ({\n odysseyDesignTokens,\n sideNavBackgroundColor,\n }: {\n odysseyDesignTokens: DesignTokens;\n sideNavBackgroundColor?: UiShellColors[\"sideNavBackgroundColor\"];\n }) => ({\n backgroundColor: odysseyDesignTokens.HueNeutralWhite,\n flexShrink: 0,\n padding: odysseyDesignTokens.Spacing4,\n\n ...(sideNavBackgroundColor &&\n ({\n backgroundColor: sideNavBackgroundColor,\n } satisfies CSSProperties)),\n }),\n);\n\nconst StyledPersistentSideNavFooter = styled(StyledSideNavFooter, {\n shouldForwardProp: (prop) =>\n prop !== \"isContentScrollable\" &&\n prop !== \"odysseyDesignTokens\" &&\n prop !== \"sideNavBackgroundColor\",\n})(\n ({\n isContentScrollable,\n odysseyDesignTokens,\n sideNavBackgroundColor,\n }: {\n isContentScrollable: boolean;\n odysseyDesignTokens: DesignTokens;\n sideNavBackgroundColor?: UiShellColors[\"sideNavBackgroundColor\"];\n }) => ({\n transitionProperty: \"box-shadow\",\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionTiming: odysseyDesignTokens.TransitionTimingMain,\n zIndex: UI_SHELL_BASE_Z_INDEX,\n\n // The box shadow should appear above the footer only if the scrollable region has overflow\n ...(isContentScrollable &&\n ({\n boxShadow: \"0px -8px 8px -8px rgba(39, 39, 39, 0.08)\",\n } satisfies CSSProperties)),\n\n ...(sideNavBackgroundColor &&\n ({\n backgroundColor: sideNavBackgroundColor,\n } satisfies CSSProperties)),\n }),\n);\n\nconst StyledSideNavFooterItemsContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"sideNavContrastColors\",\n})<{\n odysseyDesignTokens: DesignTokens;\n sideNavContrastColors: UiShellColors[\"sideNavContrastColors\"];\n}>(({ odysseyDesignTokens, sideNavContrastColors }) => ({\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n fontSize: odysseyDesignTokens.TypographySizeOverline,\n\n \"a, span\": {\n color: odysseyDesignTokens.HueNeutral600,\n transition: `color ${odysseyDesignTokens.TransitionDurationMain}`,\n\n \"&:visited\": {\n color: odysseyDesignTokens.HueNeutral600,\n\n ...(sideNavContrastColors?.fontColor &&\n ({\n color: sideNavContrastColors?.fontColor,\n } satisfies CSSProperties)),\n },\n\n \"&:hover\": {\n textDecoration: \"none\",\n color: odysseyDesignTokens.HueNeutral900,\n\n ...(sideNavContrastColors?.fontColor &&\n ({\n color: sideNavContrastColors?.fontColor,\n } satisfies CSSProperties)),\n },\n\n ...(sideNavContrastColors?.fontColor &&\n ({\n color: sideNavContrastColors?.fontColor,\n } satisfies CSSProperties)),\n },\n}));\n\nconst StyledLoadingItemContainer = styled(\"div\", {\n shouldForwardProp: (prop) => prop !== \"odysseyDesignTokens\",\n})<{ odysseyDesignTokens: DesignTokens }>(({ odysseyDesignTokens }) => ({\n alignItems: \"center\",\n display: \"flex\",\n gap: odysseyDesignTokens.Spacing2,\n paddingBlock: odysseyDesignTokens.Spacing2,\n paddingInline: odysseyDesignTokens.Spacing4,\n}));\n\nconst getHasScrollableContent = (scrollableContainer: HTMLElement) =>\n scrollableContainer.scrollHeight > scrollableContainer.clientHeight;\n\nconst LoadingItem = () => {\n const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();\n return (\n <StyledLoadingItemContainer odysseyDesignTokens={odysseyDesignTokens}>\n <Skeleton\n variant=\"circular\"\n width={odysseyDesignTokens.Spacing4}\n height={odysseyDesignTokens.Spacing4}\n />\n <Skeleton variant=\"rounded\" width=\"100%\" />\n </StyledLoadingItemContainer>\n );\n};\n\nconst SideNav = ({\n appName,\n footerComponent,\n footerItems,\n hasCustomFooter,\n hasSessionStorageState,\n isCollapsible,\n isCollapsed = false,\n isCompact,\n isLoading,\n isObtrusive,\n logoProps,\n onCollapse,\n onExpand,\n onSort,\n sideNavItems,\n}: SideNavProps) => {\n const [hasContentScrolled, setHasContentScrolled] = useState(false);\n const [isContentScrollable, setIsContentScrollable] = useState(false);\n const [isSideNavToggleHighlighted, setIsSideNavToggleHighlighted] =\n useState(false);\n const [sideNavItemsList, updateSideNavItemsList] = useState(\n sideNavItems || [],\n );\n\n const [isSideNavCollapsedLocalState, setIsSideNavCollapsedLocalState] =\n useState(isCollapsed);\n\n const {\n sessionState: isSideNavCollapsedSessionState,\n setSessionState: setIsSideNavCollapsedSessionState,\n } = useIsSideNavCollapsedSessionStorage(isCollapsed);\n\n const isSideNavCollapsed = hasSessionStorageState\n ? isSideNavCollapsedSessionState\n : isSideNavCollapsedLocalState;\n const setIsSideNavCollapsed = hasSessionStorageState\n ? setIsSideNavCollapsedSessionState\n : setIsSideNavCollapsedLocalState;\n\n const uiShellContext = useUiShellContext();\n const odysseyDesignTokens: DesignTokens = useOdysseyDesignTokens();\n const { t } = useTranslation();\n\n const scrollableContentRef = useRef<HTMLUListElement>(null);\n const resizeObserverRef = useRef<ResizeObserver | null>(null);\n const intersectionObserverRef = useRef<IntersectionObserver | null>(null);\n const sideNavRef = useRef<HTMLDivElement>(null);\n\n const { isAtContainerInlineStart } = useElementAtContainerEdge({\n element: sideNavRef.current,\n monitoringElement: sideNavRef.current?.parentElement?.parentElement,\n });\n\n const hasNeighbouringContentAtInlineStart = !isAtContainerInlineStart;\n\n const blankElement = useMemo(() => <div />, []);\n\n // The default value (sideNavItems) passed to useState is ONLY used by the useState hook for\n // the very first value. Subsequent updates to the prop (sideNavItems) need to cause the state\n // to update!\n useEffect(() => updateSideNavItemsList(sideNavItems || []), [sideNavItems]);\n\n // In the case that you can't control the side nav, then it should use whatever state was passed (app control) rather than what's stored in session storage (user control).\n const onMount = useCallback(() => {\n if (!isCollapsible) {\n setIsSideNavCollapsed(isCollapsed);\n }\n }, [isCollapsed, isCollapsible, setIsSideNavCollapsed]);\n\n const onUpdate = useCallback(() => {\n setIsSideNavCollapsed(isCollapsed);\n }, [isCollapsed, setIsSideNavCollapsed]);\n\n useMountLifecycleEffect({\n onMount,\n onUpdate,\n });\n\n useEffect(() => {\n // This is called directly in this effect AND perhaps as a result of the ResizeObserver\n const updateIsContentScrollable = () => {\n if (\n scrollableContentRef.current &&\n scrollableContentRef.current.parentElement\n ) {\n setIsContentScrollable(\n getHasScrollableContent(scrollableContentRef.current.parentElement),\n );\n }\n };\n\n // If the window is resized, we may need to re-determine if the scrollable container has overflow\n // Setup a ResizeObserver to know if the size of the scrollableContent changes\n let resizeObserverDebounceTimer: ReturnType<typeof requestAnimationFrame>;\n if (!resizeObserverRef.current) {\n resizeObserverRef.current = new ResizeObserver(() => {\n cancelAnimationFrame(resizeObserverDebounceTimer);\n resizeObserverDebounceTimer = requestAnimationFrame(\n updateIsContentScrollable,\n );\n });\n }\n\n if (resizeObserverRef.current && scrollableContentRef.current) {\n // Observe the <ul> itself (in case it changes size due to the content expanding)\n resizeObserverRef.current.observe(scrollableContentRef.current);\n if (scrollableContentRef.current.parentElement) {\n // ALSO observe the parent (<SideNavScrollableContainer>) in case the window resizes\n resizeObserverRef.current.observe(\n scrollableContentRef.current.parentElement,\n );\n }\n }\n\n // Determine if the scrollable container has overflow or not on load\n updateIsContentScrollable();\n\n // Finally, we only want to have the border on the bottom of the header iff the user has scrolled\n // the scrollable container\n if (!intersectionObserverRef.current && scrollableContentRef.current) {\n intersectionObserverRef.current = new IntersectionObserver(\n (entries) => {\n // If isIntersecting is true, then we're at the top of the scroll container\n // If isIntersecting is false, some scrolling has occurred.\n // The entries must be sorted by time and we only really need to look at the latest one\n const isIntersecting = entries\n .slice()\n .sort((a, b) => a.time - b.time)\n .at(0)?.isIntersecting;\n setHasContentScrolled(!isIntersecting);\n },\n {\n root: scrollableContentRef.current.parentElement,\n threshold: 1.0,\n },\n );\n }\n\n if (intersectionObserverRef.current && scrollableContentRef.current) {\n const ulElement = scrollableContentRef.current;\n const [liElement] = Array.from(ulElement?.children || []);\n\n if (liElement) {\n intersectionObserverRef.current.observe(liElement);\n }\n }\n\n // Cleanup when unmounted:\n return () => {\n if (resizeObserverRef.current) {\n resizeObserverRef.current.disconnect();\n resizeObserverRef.current = null;\n }\n if (intersectionObserverRef.current) {\n intersectionObserverRef.current.disconnect();\n intersectionObserverRef.current = null;\n }\n cancelAnimationFrame(resizeObserverDebounceTimer); // Ensure timer is cleared on component unmount\n };\n }, [sideNavItemsList]);\n\n const scrollIntoViewRef = useRef<HTMLLIElement>(null);\n /**\n * Look through the sideNavItems and determine which is the first node\n * with isSelected. This should be the node we set a ref on in order to\n * call scrollIntoView in the effect\n */\n const firstSideNavItemIdWithIsSelected = useMemo(() => {\n const flattenedItems = sideNavItemsList.flatMap((sideNavItem) =>\n sideNavItem.nestedNavItems\n ? [sideNavItem, ...sideNavItem.nestedNavItems]\n : sideNavItem,\n );\n const firstItemWithIsSelected = flattenedItems.find(\n (sideNavItem) => sideNavItem.isSelected,\n );\n return firstItemWithIsSelected?.id;\n }, [sideNavItemsList]);\n /**\n * Once we've rendered and if we have an item to scroll to, do the scroll action.\n * This must rely on checking firstSideNavItemIdWithIsSelected or it will not run\n * once the actual ref is populated.\n */\n useEffect(() => {\n if (firstSideNavItemIdWithIsSelected && scrollIntoViewRef.current) {\n scrollIntoViewRef.current.scrollIntoView();\n }\n }, [firstSideNavItemIdWithIsSelected]);\n\n /**\n * We only want to put a ref on a node iff it is the first selected node.\n * This function returns the ref only if the ID provided matches the first\n * selected node, otherwise returns undefined (so that the node has no ref)\n */\n const getRefIfThisIsFirstNodeWithIsSelected = useCallback(\n (itemId: string) =>\n itemId === firstSideNavItemIdWithIsSelected\n ? scrollIntoViewRef\n : undefined,\n [firstSideNavItemIdWithIsSelected],\n );\n\n const sideNavItemContentProviderValue = useMemo(\n () => ({ isCompact, depth: 1 }),\n [isCompact],\n );\n\n const setSelectedItem = useCallback(\n (selectedItemId: string) => {\n const updatedSideNavItems = sideNavItemsList.map((item) => {\n if (item.id === selectedItemId) {\n item.isSelected = true;\n } else if (item.isSelected) {\n delete item.isSelected;\n }\n\n return item.nestedNavItems\n ? {\n ...item,\n nestedNavItems: item.nestedNavItems.map((childItem) => {\n if (childItem.id === selectedItemId) {\n childItem.isSelected = true;\n } else if (childItem.isSelected) {\n delete childItem.isSelected;\n }\n return childItem;\n }),\n }\n : item;\n });\n updateSideNavItemsList(updatedSideNavItems);\n\n if (isCollapsed || isObtrusive) {\n if (isCollapsible) {\n uiShellContext?.closeSideNavMenu();\n } else {\n onCollapse?.();\n }\n }\n },\n [\n isCollapsed,\n isCollapsible,\n isObtrusive,\n onCollapse,\n sideNavItemsList,\n uiShellContext,\n ],\n );\n\n const processedSideNavItems = useMemo(() => {\n return sideNavItemsList?.map((item) => ({\n ...item,\n childNavItems: item.nestedNavItems?.map((childProps) => ({\n id: childProps.id,\n isSelected: childProps.isSelected,\n isDisabled: childProps.isDisabled,\n isSortable: childProps.isSortable,\n navItem: (\n <SideNavItemContentContext.Provider\n key={childProps.id}\n value={{\n ...sideNavItemContentProviderValue,\n depth: 2,\n isSortable: item.isSortable,\n }}\n >\n <SideNavItemContent\n {...childProps}\n onItemSelected={setSelectedItem}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}\n translate={childProps.translate}\n />\n </SideNavItemContentContext.Provider>\n ),\n })),\n }));\n }, [\n getRefIfThisIsFirstNodeWithIsSelected,\n setSelectedItem,\n sideNavItemContentProviderValue,\n sideNavItemsList,\n ]);\n\n const sideNavExpandClickHandler = useCallback(() => {\n setIsSideNavCollapsed((isSideNavCollapsed) => {\n if (isSideNavCollapsed) {\n onExpand?.();\n } else {\n onCollapse?.();\n }\n\n return !isSideNavCollapsed;\n });\n }, [onCollapse, onExpand, setIsSideNavCollapsed]);\n\n const sideNavExpandKeyHandler = useCallback<\n KeyboardEventHandler<HTMLButtonElement>\n >(\n (event) => {\n if (event?.key === \"Enter\" || event?.code === \"Space\") {\n event.preventDefault();\n sideNavExpandClickHandler();\n }\n },\n [sideNavExpandClickHandler],\n );\n\n useEffect(() => {\n const unsubscribe = uiShellContext?.subscribeToCloseSideNavMenu(() => {\n onCollapse?.();\n setIsSideNavCollapsed(true);\n });\n\n return () => {\n unsubscribe?.();\n };\n }, [onCollapse, setIsSideNavCollapsed, uiShellContext]);\n\n const setSortedItems = useCallback(\n (\n parentId: string,\n activeId: UniqueIdentifier,\n activeIndex: number,\n overIndex: number,\n ) => {\n const sortedSideNavItems = sideNavItemsList.map((item) =>\n item.id === parentId && item.nestedNavItems\n ? {\n ...item,\n nestedNavItems: arrayMove(\n item.nestedNavItems,\n activeIndex,\n overIndex,\n ),\n }\n : item,\n );\n updateSideNavItemsList(sortedSideNavItems);\n onSort?.(sortedSideNavItems, parentId, activeId, activeIndex, overIndex);\n },\n [onSort, sideNavItemsList],\n );\n\n const onSideNavToggleButtonHighlight = useCallback<\n NonNullable<SideNavToggleButtonProps[\"onHighlight\"]>\n >((isHighlighted) => {\n setIsSideNavToggleHighlighted(isHighlighted);\n }, []);\n\n return (\n <StyledSideNavContainer\n aria-label={t(\"navigation.label\")}\n backgroundColor={uiShellContext?.sideNavBackgroundColor}\n hasNeighbouringContentAtInlineStart={hasNeighbouringContentAtInlineStart}\n id=\"side-nav-expandable\"\n isAppContentWhiteBackground={\n uiShellContext?.appBackgroundColor ===\n odysseyDesignTokens.HueNeutralWhite\n }\n isSideNavCollapsed={isSideNavCollapsed}\n isSideNavToggleHighlighted={isSideNavToggleHighlighted}\n odysseyDesignTokens={odysseyDesignTokens}\n ref={sideNavRef}\n >\n {isCollapsible && (\n <StyledSideNavToggleButtonContainer\n hasNeighbouringContentAtInlineStart={\n hasNeighbouringContentAtInlineStart\n }\n isSideNavCollapsed={isSideNavCollapsed}\n isSideNavToggleHighlighted={isSideNavToggleHighlighted}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <SideNavToggleButton\n clickAreaPadding={\n isSideNavCollapsed && !hasNeighbouringContentAtInlineStart\n ? SIDE_NAV_TOGGLE_ICON_SIZE / 2\n : 0\n }\n ariaControls=\"side-nav-expandable\"\n isSideNavCollapsed={isSideNavCollapsed}\n onClick={sideNavExpandClickHandler}\n onHighlight={onSideNavToggleButtonHighlight}\n onKeyDown={sideNavExpandKeyHandler}\n />\n </StyledSideNavToggleButtonContainer>\n )}\n\n <OdysseyThemeProvider>\n <StyledCollapsibleContent\n data-se=\"collapsible-region\"\n isSideNavCollapsed={isSideNavCollapsed}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <StyledOpacityTransitionContainer\n isSideNavCollapsed={isSideNavCollapsed}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n {appName || isLoading || logoProps ? (\n <StyledSideNavHeaderContainer\n hasContentScrolled={hasContentScrolled}\n odysseyDesignTokens={odysseyDesignTokens}\n borderColor={uiShellContext?.sideNavContrastColors?.fontColor}\n >\n {isLoading && !appName && !logoProps ? (\n <SideNavHeader isLoading={isLoading} />\n ) : (\n <SideNavHeader\n appName={appName}\n isLoading={isLoading}\n logoProps={logoProps}\n />\n )}\n </StyledSideNavHeaderContainer>\n ) : (\n <div />\n )}\n\n <StyledSideNavScrollableContainer\n odysseyDesignTokens={odysseyDesignTokens}\n data-se=\"scrollable-region\"\n hasBlockStartPadding={!appName}\n >\n <StyledSideNavListContainer\n role=\"none\"\n ref={scrollableContentRef}\n >\n {isLoading\n ? Array(6)\n .fill(null)\n .map((_, index) => <LoadingItem key={index} />)\n : processedSideNavItems?.map((item) => {\n const {\n childNavItems,\n href,\n id,\n isDefaultExpanded,\n isDisabled,\n isExpanded,\n isSectionHeader,\n isSortable,\n label,\n startIcon,\n } = item;\n\n if (isSectionHeader) {\n return (\n <ErrorBoundary fallback={blankElement} key={id}>\n <StyledSectionHeaderContainer\n contrastFontColor={\n uiShellContext?.sideNavContrastColors?.fontColor\n }\n id={id}\n odysseyDesignTokens={odysseyDesignTokens}\n >\n <Overline component=\"h3\">{label}</Overline>\n </StyledSectionHeaderContainer>\n </ErrorBoundary>\n );\n } else if (childNavItems) {\n const nestedChildren = (\n <StyledSideNavListContainer role=\"presentation\">\n {isSortable ? (\n <SortableList\n parentId={item.id}\n items={childNavItems}\n onChange={setSortedItems}\n renderItem={(sortableItem) => (\n <SortableList.Item\n id={sortableItem.id}\n isDisabled={sortableItem.isDisabled}\n isSelected={sortableItem.isSelected}\n isSortable={sortableItem.isSortable}\n >\n {sortableItem.navItem}\n </SortableList.Item>\n )}\n />\n ) : (\n childNavItems.map((item) => item.navItem)\n )}\n </StyledSideNavListContainer>\n );\n\n return href ? (\n <ErrorBoundary fallback={blankElement} key={id}>\n <SideNavItemContent\n {...item}\n href={href}\n onItemSelected={setSelectedItem}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(\n item.id,\n )}\n startIcon={item.startIcon}\n />\n\n <StyledSideNavListItem\n id={`${id}-items`}\n odysseyDesignTokens={odysseyDesignTokens}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n >\n {nestedChildren}\n </StyledSideNavListItem>\n </ErrorBoundary>\n ) : (\n <ErrorBoundary fallback={blankElement} key={id}>\n <StyledSideNavListItem\n id={id}\n odysseyDesignTokens={odysseyDesignTokens}\n disabled={isDisabled}\n aria-disabled={isDisabled}\n >\n <NavAccordion\n label={label}\n isCompact={isCompact}\n isDefaultExpanded={isDefaultExpanded}\n isExpanded={isExpanded}\n startIcon={startIcon}\n isDisabled={isDisabled}\n >\n {nestedChildren}\n </NavAccordion>\n </StyledSideNavListItem>\n </ErrorBoundary>\n );\n } else {\n return (\n <ErrorBoundary fallback={blankElement} key={item.id}>\n <SideNavItemContentContext.Provider\n value={sideNavItemContentProviderValue}\n >\n <SideNavItemContent\n {...item}\n onItemSelected={setSelectedItem}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(\n item.id,\n )}\n startIcon={item.startIcon}\n />\n </SideNavItemContentContext.Provider>\n </ErrorBoundary>\n );\n }\n })}\n </StyledSideNavListContainer>\n {!isLoading && footerItems && !hasCustomFooter && (\n <StyledSideNavFooter\n odysseyDesignTokens={odysseyDesignTokens}\n sideNavBackgroundColor={\n uiShellContext?.sideNavBackgroundColor\n }\n >\n <StyledSideNavFooterItemsContainer\n odysseyDesignTokens={odysseyDesignTokens}\n sideNavContrastColors={\n uiShellContext?.sideNavContrastColors\n }\n >\n <SideNavFooterContent footerItems={footerItems} />\n </StyledSideNavFooterItemsContainer>\n </StyledSideNavFooter>\n )}\n </StyledSideNavScrollableContainer>\n {!isLoading && !footerItems && hasCustomFooter && (\n <StyledPersistentSideNavFooter\n isContentScrollable={isContentScrollable}\n odysseyDesignTokens={odysseyDesignTokens}\n sideNavBackgroundColor={uiShellContext?.sideNavBackgroundColor}\n >\n {footerComponent}\n </StyledPersistentSideNavFooter>\n )}\n </StyledOpacityTransitionContainer>\n </StyledCollapsibleContent>\n </OdysseyThemeProvider>\n </StyledSideNavContainer>\n );\n};\n\nconst MemoizedSideNav = memo(SideNav);\nMemoizedSideNav.displayName = \"SideNav\";\n\nexport { MemoizedSideNav as SideNav };\n"],"mappings":"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","ignoreList":[]}
@@ -30,12 +30,13 @@ const SideNavItemLabelContainer = (0, _styled.default)("div", {
30
30
  odysseyDesignTokens,
31
31
  isIconVisible
32
32
  }) => ({
33
- width: "100%",
33
+ alignItems: "center",
34
34
  display: "flex",
35
35
  flexWrap: "wrap",
36
- alignItems: "center",
37
36
  fontSize: odysseyDesignTokens.TypographySizeBody,
38
- marginInlineStart: isIconVisible ? odysseyDesignTokens.Spacing3 : 0
37
+ marginInlineStart: isIconVisible ? odysseyDesignTokens.Spacing3 : 0,
38
+ overflowWrap: "anywhere",
39
+ width: "100%"
39
40
  }));
40
41
  const SideNavItemLinkContent = ({
41
42
  count,
@@ -1 +1 @@
1
- {"version":3,"file":"SideNavItemLinkContent.cjs","names":["_styled","_interopRequireDefault","require","_react","_OdysseyDesignTokensContext","_Box","_Status","_Badge","_jsxRuntime","e","__esModule","default","SideNavItemLabelContainer","styled","shouldForwardProp","prop","odysseyDesignTokens","isIconVisible","width","display","flexWrap","alignItems","fontSize","TypographySizeBody","marginInlineStart","Spacing3","SideNavItemLinkContent","count","label","startIcon","endIcon","severity","statusLabel","translate","useOdysseyDesignTokens","sideNavItemContentStyles","useMemo","gap","Spacing1","Spacing2","jsxs","Fragment","children","Boolean","jsx","Box","sx","Status","Badge","badgeContent","MemoizedSideNavItemLinkContent","exports","memo","displayName"],"sources":["../../../../src/ui-shell/SideNav/SideNavItemLinkContent.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport { memo, ReactNode, useMemo } from \"react\";\nimport {\n type DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext.js\";\nimport { Box } from \"../../Box.js\";\nimport { Status } from \"../../Status.js\";\nimport type { SideNavItem } from \"./types.js\";\nimport { Badge } from \"../../Badge.js\";\n\nconst SideNavItemLabelContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isIconVisible\",\n})<{\n odysseyDesignTokens: DesignTokens;\n isIconVisible: boolean;\n}>(({ odysseyDesignTokens, isIconVisible }) => ({\n width: \"100%\",\n display: \"flex\",\n flexWrap: \"wrap\",\n alignItems: \"center\",\n fontSize: odysseyDesignTokens.TypographySizeBody,\n marginInlineStart: isIconVisible ? odysseyDesignTokens.Spacing3 : 0,\n}));\n\nconst SideNavItemLinkContent = ({\n count,\n label,\n startIcon,\n endIcon,\n severity,\n statusLabel,\n translate,\n}: Pick<\n SideNavItem,\n | \"count\"\n | \"label\"\n | \"startIcon\"\n | \"endIcon\"\n | \"severity\"\n | \"statusLabel\"\n | \"translate\"\n>): ReactNode => {\n const odysseyDesignTokens = useOdysseyDesignTokens();\n\n const sideNavItemContentStyles = useMemo(\n () => ({\n alignItems: \"center\",\n display: \"flex\",\n gap: odysseyDesignTokens.Spacing1,\n marginInlineStart: odysseyDesignTokens.Spacing2,\n }),\n [odysseyDesignTokens],\n );\n\n return (\n <>\n {startIcon && startIcon}\n <SideNavItemLabelContainer\n odysseyDesignTokens={odysseyDesignTokens}\n isIconVisible={Boolean(startIcon)}\n translate={translate}\n >\n {label}\n {!count && severity && (\n <Box sx={sideNavItemContentStyles}>\n {severity && (\n <Status severity={severity} label={statusLabel || \"\"} />\n )}\n </Box>\n )}\n {!severity && count && (\n <Box sx={sideNavItemContentStyles}>\n {count && <Badge badgeContent={count} />}\n </Box>\n )}\n </SideNavItemLabelContainer>\n {endIcon && endIcon}\n </>\n );\n};\nconst MemoizedSideNavItemLinkContent = memo(SideNavItemLinkContent);\nMemoizedSideNavItemLinkContent.displayName = \"SideNavItemLinkContent\";\n\nexport { MemoizedSideNavItemLinkContent as SideNavItemLinkContent };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SideNavItemLinkContent.cjs","names":["_styled","_interopRequireDefault","require","_react","_OdysseyDesignTokensContext","_Box","_Status","_Badge","_jsxRuntime","e","__esModule","default","SideNavItemLabelContainer","styled","shouldForwardProp","prop","odysseyDesignTokens","isIconVisible","alignItems","display","flexWrap","fontSize","TypographySizeBody","marginInlineStart","Spacing3","overflowWrap","width","SideNavItemLinkContent","count","label","startIcon","endIcon","severity","statusLabel","translate","useOdysseyDesignTokens","sideNavItemContentStyles","useMemo","gap","Spacing1","Spacing2","jsxs","Fragment","children","Boolean","jsx","Box","sx","Status","Badge","badgeContent","MemoizedSideNavItemLinkContent","exports","memo","displayName"],"sources":["../../../../src/ui-shell/SideNav/SideNavItemLinkContent.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport styled from \"@emotion/styled\";\nimport { memo, ReactNode, useMemo } from \"react\";\nimport {\n type DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext.js\";\nimport { Box } from \"../../Box.js\";\nimport { Status } from \"../../Status.js\";\nimport type { SideNavItem } from \"./types.js\";\nimport { Badge } from \"../../Badge.js\";\n\nconst SideNavItemLabelContainer = styled(\"div\", {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isIconVisible\",\n})<{\n odysseyDesignTokens: DesignTokens;\n isIconVisible: boolean;\n}>(({ odysseyDesignTokens, isIconVisible }) => ({\n alignItems: \"center\",\n display: \"flex\",\n flexWrap: \"wrap\",\n fontSize: odysseyDesignTokens.TypographySizeBody,\n marginInlineStart: isIconVisible ? odysseyDesignTokens.Spacing3 : 0,\n overflowWrap: \"anywhere\", // New way to do `wordBreak: \"break-word\"`. Source: https://developer.mozilla.org/en-US/docs/Web/CSS/word-break#break-word\n width: \"100%\",\n}));\n\nconst SideNavItemLinkContent = ({\n count,\n label,\n startIcon,\n endIcon,\n severity,\n statusLabel,\n translate,\n}: Pick<\n SideNavItem,\n | \"count\"\n | \"label\"\n | \"startIcon\"\n | \"endIcon\"\n | \"severity\"\n | \"statusLabel\"\n | \"translate\"\n>): ReactNode => {\n const odysseyDesignTokens = useOdysseyDesignTokens();\n\n const sideNavItemContentStyles = useMemo(\n () => ({\n alignItems: \"center\",\n display: \"flex\",\n gap: odysseyDesignTokens.Spacing1,\n marginInlineStart: odysseyDesignTokens.Spacing2,\n }),\n [odysseyDesignTokens],\n );\n\n return (\n <>\n {startIcon && startIcon}\n <SideNavItemLabelContainer\n odysseyDesignTokens={odysseyDesignTokens}\n isIconVisible={Boolean(startIcon)}\n translate={translate}\n >\n {label}\n {!count && severity && (\n <Box sx={sideNavItemContentStyles}>\n {severity && (\n <Status severity={severity} label={statusLabel || \"\"} />\n )}\n </Box>\n )}\n {!severity && count && (\n <Box sx={sideNavItemContentStyles}>\n {count && <Badge badgeContent={count} />}\n </Box>\n )}\n </SideNavItemLabelContainer>\n {endIcon && endIcon}\n </>\n );\n};\nconst MemoizedSideNavItemLinkContent = memo(SideNavItemLinkContent);\nMemoizedSideNavItemLinkContent.displayName = \"SideNavItemLinkContent\";\n\nexport { MemoizedSideNavItemLinkContent as SideNavItemLinkContent };\n"],"mappings":"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","ignoreList":[]}
@@ -87,7 +87,7 @@ const StyledChevronRightIcon = (0, _styled.default)(_ChevronRight.ChevronRightIc
87
87
  transitionProperty: "transform",
88
88
  transitionTimingFunction: "ease-in-out"
89
89
  }));
90
- const defaultLocalButton = document.createElement("button");
90
+ const defaultLocalButton = typeof window === "undefined" ? null : document.createElement("button");
91
91
  const SideNavToggleButton = ({
92
92
  ariaControls,
93
93
  clickAreaPadding = 0,
@@ -110,18 +110,18 @@ const SideNavToggleButton = ({
110
110
  onHighlight?.(false);
111
111
  };
112
112
  const setFocusHighlighted = () => {
113
- onHighlight?.(buttonRef.current.matches(":focus-visible"));
113
+ onHighlight?.(Boolean(buttonRef.current?.matches(":focus-visible")));
114
114
  };
115
- buttonRef.current.addEventListener("mouseenter", setHighlighted);
116
- buttonRef.current.addEventListener("mouseleave", setUnhighlighted);
117
- buttonRef.current.addEventListener("focus", setFocusHighlighted, true);
118
- buttonRef.current.addEventListener("blur", setFocusHighlighted, true);
115
+ buttonRef.current?.addEventListener("mouseenter", setHighlighted);
116
+ buttonRef.current?.addEventListener("mouseleave", setUnhighlighted);
117
+ buttonRef.current?.addEventListener("focus", setFocusHighlighted, true);
118
+ buttonRef.current?.addEventListener("blur", setFocusHighlighted, true);
119
119
  setUnhighlighted();
120
120
  return () => {
121
- buttonRef.current.removeEventListener("mouseenter", setHighlighted);
122
- buttonRef.current.removeEventListener("mouseleave", setUnhighlighted);
123
- buttonRef.current.removeEventListener("focus", setFocusHighlighted, true);
124
- buttonRef.current.removeEventListener("blur", setFocusHighlighted, true);
121
+ buttonRef.current?.removeEventListener("mouseenter", setHighlighted);
122
+ buttonRef.current?.removeEventListener("mouseleave", setUnhighlighted);
123
+ buttonRef.current?.removeEventListener("focus", setFocusHighlighted, true);
124
+ buttonRef.current?.removeEventListener("blur", setFocusHighlighted, true);
125
125
  };
126
126
  }, [onHighlight]);
127
127
  const toggleLabel = (0, _react.useMemo)(() => isSideNavCollapsed ? t("sidenav.toggle.expand") : t("sidenav.toggle.collapse"), [isSideNavCollapsed, t]);
@@ -1 +1 @@
1
- {"version":3,"file":"SideNavToggleButton.cjs","names":["_react","require","_styled","_interopRequireDefault","_reactI18next","_MuiPropsContext","_OdysseyDesignTokensContext","_Tooltip","_uiShellSharedConstants","_ChevronRight","_jsxRuntime","e","__esModule","default","SIDE_NAV_TOGGLE_ICON_SIZE","exports","SIDE_NAV_TOGGLE_ICON_HALF_SIZE","StyledToggleButton","styled","_Button2","shouldForwardProp","prop","clickAreaPadding","odysseyDesignTokens","border","height","left","padding","position","width","zIndex","UI_SHELL_OVERLAY_Z_INDEX","backgroundColor","borderColor","boxShadow","color","PalettePrimaryText","outline","HueNeutralWhite","borderRadius","ShadowScale1","content","top","StyledChevronRightIcon","ChevronRightIcon","isSideNavCollapsed","fontSize","undefined","right","transform","transitionDuration","TransitionDurationMain","transitionProperty","transitionTimingFunction","defaultLocalButton","document","createElement","SideNavToggleButton","ariaControls","id","onClick","onHighlight","tabIndex","useOdysseyDesignTokens","t","useTranslation","buttonRef","useRef","useEffect","setHighlighted","setUnhighlighted","setFocusHighlighted","current","matches","addEventListener","removeEventListener","toggleLabel","useMemo","renderButton","useCallback","muiProps","jsx","ref","element","variant","children","Tooltip","ariaType","placement","text","MuiPropsContext","Consumer","MemoizedSideNavToggleButton","memo","displayName"],"sources":["../../../../src/ui-shell/SideNav/SideNavToggleButton.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { Button as MuiButton } from \"@mui/material\";\nimport type { ButtonProps as MuiButtonProps } from \"@mui/material\";\nimport {\n HTMLAttributes,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport styled from \"@emotion/styled\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { MuiPropsContext, MuiPropsContextType } from \"../../MuiPropsContext.js\";\nimport {\n DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext.js\";\nimport { Tooltip } from \"../../Tooltip.js\";\nimport { UI_SHELL_OVERLAY_Z_INDEX } from \"../uiShellSharedConstants.js\";\nimport { ChevronRightIcon } from \"../../icons.generated/ChevronRight.js\";\n\nexport const SIDE_NAV_TOGGLE_ICON_SIZE = 24;\nexport const SIDE_NAV_TOGGLE_ICON_HALF_SIZE = SIDE_NAV_TOGGLE_ICON_SIZE / 2;\n\nconst StyledToggleButton = styled(MuiButton, {\n shouldForwardProp: (prop) =>\n prop !== \"clickAreaPadding\" && prop !== \"odysseyDesignTokens\",\n})<{\n clickAreaPadding: number;\n odysseyDesignTokens: DesignTokens;\n}>(({ clickAreaPadding, odysseyDesignTokens }) => ({\n border: 0,\n height: `${SIDE_NAV_TOGGLE_ICON_SIZE}px`,\n left: `-${clickAreaPadding * 2}px`,\n padding: 0,\n position: \"relative\",\n width: `calc(${SIDE_NAV_TOGGLE_ICON_SIZE}px + (${clickAreaPadding}px * 2))`,\n zIndex: UI_SHELL_OVERLAY_Z_INDEX,\n\n // `&&` is a CSS specificity override. Used here to counteract MUI Button styles.\n \"&&\": {\n backgroundColor: \"transparent\",\n borderColor: \"transparent\",\n boxShadow: \"none\",\n color: odysseyDesignTokens.PalettePrimaryText,\n },\n\n \"&:focus-visible\": {\n outline: \"none\",\n },\n\n \"&:hover, &:focus-visible\": {\n color: odysseyDesignTokens.HueNeutralWhite,\n },\n\n \"&::before\": {\n backgroundColor: odysseyDesignTokens.HueNeutralWhite,\n borderColor: \"transparent\",\n borderRadius: \"50%\",\n boxShadow: odysseyDesignTokens.ShadowScale1,\n color: odysseyDesignTokens.PalettePrimaryText,\n content: \"''\",\n height: `${SIDE_NAV_TOGGLE_ICON_SIZE}px`,\n left: `${clickAreaPadding * 2}px`,\n position: \"absolute\",\n top: 0,\n width: `${SIDE_NAV_TOGGLE_ICON_SIZE}px`,\n },\n\n \"&:hover::before, &:focus-visible::before\": {\n backgroundColor: odysseyDesignTokens.PalettePrimaryText,\n },\n}));\n\nconst StyledChevronRightIcon = styled(ChevronRightIcon, {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})<{\n isSideNavCollapsed: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(({ isSideNavCollapsed, odysseyDesignTokens }) => ({\n fontSize: \"125%\",\n left: isSideNavCollapsed ? undefined : \"4px\",\n position: \"absolute\",\n right: isSideNavCollapsed ? \"4px\" : undefined,\n top: \"3px\",\n transform: isSideNavCollapsed ? \"rotate(0deg)\" : \"rotate(-180deg)\", // Leave this as `-180deg` so it rotates over the top, not the bottom.\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionProperty: \"transform\",\n transitionTimingFunction: \"ease-in-out\",\n}));\n\nexport type SideNavToggleButtonProps = {\n /**\n * The `id` of the item this button controls\n */\n ariaControls: string;\n /**\n * Left padding in pixels for the click area of the button.\n *\n * Useful when moving the button around when trying to click it. This ensures the click area doesn't move to the right along with the button.\n */\n clickAreaPadding?: number;\n /**\n * HTML `id` attribute for the `<button>` element.\n */\n id?: string;\n isSideNavCollapsed: boolean;\n tabIndex?: HTMLAttributes<HTMLElement>[\"tabIndex\"];\n /**\n * Click event handler for the `<button>` element.\n */\n onClick?: MuiButtonProps[\"onClick\"];\n /**\n * Provides the hovered or focused state of the `<button>` element.\n */\n onHighlight?: (isHighlighted: boolean) => void;\n onKeyDown?: MuiButtonProps[\"onKeyDown\"];\n};\n\n// This allows us to mutate the value with TypeScript. A singleton is fine because it gets overridden on render.\nconst defaultLocalButton = document.createElement(\"button\");\n\nconst SideNavToggleButton = ({\n ariaControls,\n clickAreaPadding = 0,\n id,\n isSideNavCollapsed,\n onClick,\n onHighlight,\n tabIndex,\n}: SideNavToggleButtonProps) => {\n const odysseyDesignTokens = useOdysseyDesignTokens();\n const { t } = useTranslation();\n\n const buttonRef = useRef(defaultLocalButton);\n\n useEffect(() => {\n const setHighlighted = () => {\n onHighlight?.(true);\n };\n\n const setUnhighlighted = () => {\n onHighlight?.(false);\n };\n\n const setFocusHighlighted = () => {\n onHighlight?.(buttonRef.current.matches(\":focus-visible\"));\n };\n\n buttonRef.current.addEventListener(\"mouseenter\", setHighlighted);\n\n buttonRef.current.addEventListener(\"mouseleave\", setUnhighlighted);\n\n buttonRef.current.addEventListener(\"focus\", setFocusHighlighted, true);\n\n buttonRef.current.addEventListener(\"blur\", setFocusHighlighted, true);\n\n setUnhighlighted();\n\n return () => {\n buttonRef.current.removeEventListener(\"mouseenter\", setHighlighted);\n\n buttonRef.current.removeEventListener(\"mouseleave\", setUnhighlighted);\n\n buttonRef.current.removeEventListener(\"focus\", setFocusHighlighted, true);\n\n buttonRef.current.removeEventListener(\"blur\", setFocusHighlighted, true);\n };\n }, [onHighlight]);\n\n const toggleLabel = useMemo(\n () =>\n isSideNavCollapsed\n ? t(\"sidenav.toggle.expand\")\n : t(\"sidenav.toggle.collapse\"),\n [isSideNavCollapsed, t],\n );\n\n const renderButton = useCallback(\n (muiProps: MuiPropsContextType) => {\n return (\n <StyledToggleButton\n {...muiProps}\n aria-controls={ariaControls}\n aria-expanded={!isSideNavCollapsed}\n aria-label={toggleLabel}\n clickAreaPadding={clickAreaPadding}\n data-se=\"sidenav-toggle-button\"\n data-sidenav-toggle\n id={id}\n odysseyDesignTokens={odysseyDesignTokens}\n onClick={onClick}\n ref={(element: HTMLButtonElement) => {\n if (element) {\n buttonRef.current = element;\n //@ts-expect-error `ref` is an optional prop, but TypeScript doesn't know this.\n muiProps.ref?.(element);\n }\n }}\n tabIndex={tabIndex}\n variant=\"floating\"\n >\n <StyledChevronRightIcon\n isSideNavCollapsed={isSideNavCollapsed}\n odysseyDesignTokens={odysseyDesignTokens}\n />\n </StyledToggleButton>\n );\n },\n [\n ariaControls,\n clickAreaPadding,\n id,\n isSideNavCollapsed,\n odysseyDesignTokens,\n onClick,\n tabIndex,\n toggleLabel,\n ],\n );\n\n return (\n <Tooltip ariaType=\"description\" placement=\"right\" text={toggleLabel}>\n <MuiPropsContext.Consumer>{renderButton}</MuiPropsContext.Consumer>\n </Tooltip>\n );\n};\n\nconst MemoizedSideNavToggleButton = memo(SideNavToggleButton);\nMemoizedSideNavToggleButton.displayName = \"SideNavToggleButton\";\n\nexport { MemoizedSideNavToggleButton as SideNavToggleButton };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"SideNavToggleButton.cjs","names":["_react","require","_styled","_interopRequireDefault","_reactI18next","_MuiPropsContext","_OdysseyDesignTokensContext","_Tooltip","_uiShellSharedConstants","_ChevronRight","_jsxRuntime","e","__esModule","default","SIDE_NAV_TOGGLE_ICON_SIZE","exports","SIDE_NAV_TOGGLE_ICON_HALF_SIZE","StyledToggleButton","styled","_Button2","shouldForwardProp","prop","clickAreaPadding","odysseyDesignTokens","border","height","left","padding","position","width","zIndex","UI_SHELL_OVERLAY_Z_INDEX","backgroundColor","borderColor","boxShadow","color","PalettePrimaryText","outline","HueNeutralWhite","borderRadius","ShadowScale1","content","top","StyledChevronRightIcon","ChevronRightIcon","isSideNavCollapsed","fontSize","undefined","right","transform","transitionDuration","TransitionDurationMain","transitionProperty","transitionTimingFunction","defaultLocalButton","window","document","createElement","SideNavToggleButton","ariaControls","id","onClick","onHighlight","tabIndex","useOdysseyDesignTokens","t","useTranslation","buttonRef","useRef","useEffect","setHighlighted","setUnhighlighted","setFocusHighlighted","Boolean","current","matches","addEventListener","removeEventListener","toggleLabel","useMemo","renderButton","useCallback","muiProps","jsx","ref","element","variant","children","Tooltip","ariaType","placement","text","MuiPropsContext","Consumer","MemoizedSideNavToggleButton","memo","displayName"],"sources":["../../../../src/ui-shell/SideNav/SideNavToggleButton.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2022-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { Button as MuiButton } from \"@mui/material\";\nimport type { ButtonProps as MuiButtonProps } from \"@mui/material\";\nimport {\n HTMLAttributes,\n memo,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n} from \"react\";\nimport styled from \"@emotion/styled\";\nimport { useTranslation } from \"react-i18next\";\n\nimport { MuiPropsContext, MuiPropsContextType } from \"../../MuiPropsContext.js\";\nimport {\n DesignTokens,\n useOdysseyDesignTokens,\n} from \"../../OdysseyDesignTokensContext.js\";\nimport { Tooltip } from \"../../Tooltip.js\";\nimport { UI_SHELL_OVERLAY_Z_INDEX } from \"../uiShellSharedConstants.js\";\nimport { ChevronRightIcon } from \"../../icons.generated/ChevronRight.js\";\n\nexport const SIDE_NAV_TOGGLE_ICON_SIZE = 24;\nexport const SIDE_NAV_TOGGLE_ICON_HALF_SIZE = SIDE_NAV_TOGGLE_ICON_SIZE / 2;\n\nconst StyledToggleButton = styled(MuiButton, {\n shouldForwardProp: (prop) =>\n prop !== \"clickAreaPadding\" && prop !== \"odysseyDesignTokens\",\n})<{\n clickAreaPadding: number;\n odysseyDesignTokens: DesignTokens;\n}>(({ clickAreaPadding, odysseyDesignTokens }) => ({\n border: 0,\n height: `${SIDE_NAV_TOGGLE_ICON_SIZE}px`,\n left: `-${clickAreaPadding * 2}px`,\n padding: 0,\n position: \"relative\",\n width: `calc(${SIDE_NAV_TOGGLE_ICON_SIZE}px + (${clickAreaPadding}px * 2))`,\n zIndex: UI_SHELL_OVERLAY_Z_INDEX,\n\n // `&&` is a CSS specificity override. Used here to counteract MUI Button styles.\n \"&&\": {\n backgroundColor: \"transparent\",\n borderColor: \"transparent\",\n boxShadow: \"none\",\n color: odysseyDesignTokens.PalettePrimaryText,\n },\n\n \"&:focus-visible\": {\n outline: \"none\",\n },\n\n \"&:hover, &:focus-visible\": {\n color: odysseyDesignTokens.HueNeutralWhite,\n },\n\n \"&::before\": {\n backgroundColor: odysseyDesignTokens.HueNeutralWhite,\n borderColor: \"transparent\",\n borderRadius: \"50%\",\n boxShadow: odysseyDesignTokens.ShadowScale1,\n color: odysseyDesignTokens.PalettePrimaryText,\n content: \"''\",\n height: `${SIDE_NAV_TOGGLE_ICON_SIZE}px`,\n left: `${clickAreaPadding * 2}px`,\n position: \"absolute\",\n top: 0,\n width: `${SIDE_NAV_TOGGLE_ICON_SIZE}px`,\n },\n\n \"&:hover::before, &:focus-visible::before\": {\n backgroundColor: odysseyDesignTokens.PalettePrimaryText,\n },\n}));\n\nconst StyledChevronRightIcon = styled(ChevronRightIcon, {\n shouldForwardProp: (prop) =>\n prop !== \"odysseyDesignTokens\" && prop !== \"isSideNavCollapsed\",\n})<{\n isSideNavCollapsed: boolean;\n odysseyDesignTokens: DesignTokens;\n}>(({ isSideNavCollapsed, odysseyDesignTokens }) => ({\n fontSize: \"125%\",\n left: isSideNavCollapsed ? undefined : \"4px\",\n position: \"absolute\",\n right: isSideNavCollapsed ? \"4px\" : undefined,\n top: \"3px\",\n transform: isSideNavCollapsed ? \"rotate(0deg)\" : \"rotate(-180deg)\", // Leave this as `-180deg` so it rotates over the top, not the bottom.\n transitionDuration: odysseyDesignTokens.TransitionDurationMain,\n transitionProperty: \"transform\",\n transitionTimingFunction: \"ease-in-out\",\n}));\n\nexport type SideNavToggleButtonProps = {\n /**\n * The `id` of the item this button controls\n */\n ariaControls: string;\n /**\n * Left padding in pixels for the click area of the button.\n *\n * Useful when moving the button around when trying to click it. This ensures the click area doesn't move to the right along with the button.\n */\n clickAreaPadding?: number;\n /**\n * HTML `id` attribute for the `<button>` element.\n */\n id?: string;\n isSideNavCollapsed: boolean;\n tabIndex?: HTMLAttributes<HTMLElement>[\"tabIndex\"];\n /**\n * Click event handler for the `<button>` element.\n */\n onClick?: MuiButtonProps[\"onClick\"];\n /**\n * Provides the hovered or focused state of the `<button>` element.\n */\n onHighlight?: (isHighlighted: boolean) => void;\n onKeyDown?: MuiButtonProps[\"onKeyDown\"];\n};\n\n// This allows us to mutate the value with TypeScript. A singleton is fine because it gets overridden on render.\nconst defaultLocalButton =\n typeof window === \"undefined\" ? null : document.createElement(\"button\");\n\nconst SideNavToggleButton = ({\n ariaControls,\n clickAreaPadding = 0,\n id,\n isSideNavCollapsed,\n onClick,\n onHighlight,\n tabIndex,\n}: SideNavToggleButtonProps) => {\n const odysseyDesignTokens = useOdysseyDesignTokens();\n const { t } = useTranslation();\n\n const buttonRef = useRef(defaultLocalButton);\n\n useEffect(() => {\n const setHighlighted = () => {\n onHighlight?.(true);\n };\n\n const setUnhighlighted = () => {\n onHighlight?.(false);\n };\n\n const setFocusHighlighted = () => {\n onHighlight?.(Boolean(buttonRef.current?.matches(\":focus-visible\")));\n };\n\n buttonRef.current?.addEventListener(\"mouseenter\", setHighlighted);\n\n buttonRef.current?.addEventListener(\"mouseleave\", setUnhighlighted);\n\n buttonRef.current?.addEventListener(\"focus\", setFocusHighlighted, true);\n\n buttonRef.current?.addEventListener(\"blur\", setFocusHighlighted, true);\n\n setUnhighlighted();\n\n return () => {\n buttonRef.current?.removeEventListener(\"mouseenter\", setHighlighted);\n\n buttonRef.current?.removeEventListener(\"mouseleave\", setUnhighlighted);\n\n buttonRef.current?.removeEventListener(\n \"focus\",\n setFocusHighlighted,\n true,\n );\n\n buttonRef.current?.removeEventListener(\"blur\", setFocusHighlighted, true);\n };\n }, [onHighlight]);\n\n const toggleLabel = useMemo(\n () =>\n isSideNavCollapsed\n ? t(\"sidenav.toggle.expand\")\n : t(\"sidenav.toggle.collapse\"),\n [isSideNavCollapsed, t],\n );\n\n const renderButton = useCallback(\n (muiProps: MuiPropsContextType) => {\n return (\n <StyledToggleButton\n {...muiProps}\n aria-controls={ariaControls}\n aria-expanded={!isSideNavCollapsed}\n aria-label={toggleLabel}\n clickAreaPadding={clickAreaPadding}\n data-se=\"sidenav-toggle-button\"\n data-sidenav-toggle\n id={id}\n odysseyDesignTokens={odysseyDesignTokens}\n onClick={onClick}\n ref={(element: HTMLButtonElement) => {\n if (element) {\n buttonRef.current = element;\n //@ts-expect-error `ref` is an optional prop, but TypeScript doesn't know this.\n muiProps.ref?.(element);\n }\n }}\n tabIndex={tabIndex}\n variant=\"floating\"\n >\n <StyledChevronRightIcon\n isSideNavCollapsed={isSideNavCollapsed}\n odysseyDesignTokens={odysseyDesignTokens}\n />\n </StyledToggleButton>\n );\n },\n [\n ariaControls,\n clickAreaPadding,\n id,\n isSideNavCollapsed,\n odysseyDesignTokens,\n onClick,\n tabIndex,\n toggleLabel,\n ],\n );\n\n return (\n <Tooltip ariaType=\"description\" placement=\"right\" text={toggleLabel}>\n <MuiPropsContext.Consumer>{renderButton}</MuiPropsContext.Consumer>\n </Tooltip>\n );\n};\n\nconst MemoizedSideNavToggleButton = memo(SideNavToggleButton);\nMemoizedSideNavToggleButton.displayName = \"SideNavToggleButton\";\n\nexport { MemoizedSideNavToggleButton as SideNavToggleButton };\n"],"mappings":"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","ignoreList":[]}
@@ -45,6 +45,7 @@ const UiShell = ({
45
45
  onSubscriptionCreated,
46
46
  optionalComponents,
47
47
  sideNavBackgroundColor,
48
+ sideNavBackgroundContrastColor,
48
49
  subscribeToCloseRightSideMenu,
49
50
  subscribeToCloseSideNavMenu,
50
51
  subscribeToPropChanges,
@@ -77,6 +78,7 @@ const UiShell = ({
77
78
  appBackgroundContrastMode: appBackgroundContrastMode,
78
79
  closeSideNavMenu: closeSideNavMenu,
79
80
  sideNavBackgroundColor: sideNavBackgroundColor,
81
+ sideNavBackgroundContrastColor: sideNavBackgroundContrastColor,
80
82
  subscribeToCloseRightSideMenu: subscribeToCloseRightSideMenu,
81
83
  subscribeToCloseSideNavMenu: subscribeToCloseSideNavMenu,
82
84
  topNavBackgroundColor: topNavBackgroundColor,
@@ -1 +1 @@
1
- {"version":3,"file":"UiShell.cjs","names":["_react","require","_reactErrorBoundary","_CssBaseline","_NarrowUiShellContent","_OdysseyProvider","_UiShellProvider","_useUiShellBreakpoints","_WideUiShellContent","_jsxRuntime","defaultComponentProps","exports","sideNavProps","undefined","topNavProps","errorComponent","jsx","UiShell","appBackgroundColor","appBackgroundContrastMode","appElement","appElementScrollingMode","breakpointConfig","closeSideNavMenu","hasStandardAppContentPadding","initialVisibleSections","onError","console","error","onSubscriptionCreated","optionalComponents","sideNavBackgroundColor","subscribeToCloseRightSideMenu","subscribeToCloseSideNavMenu","subscribeToPropChanges","topNavBackgroundColor","uiShellAppElement","uiShellStylesElement","componentProps","setComponentProps","useState","activeBreakpoint","useUiShellBreakpoints","useEffect","unsubscribe","ErrorBoundary","fallback","children","OdysseyProvider","emotionRootElement","shadowRootElement","jsxs","CssBaseline","UiShellProvider","NarrowUiShellContent","hasSideNavProps","Boolean","WideUiShellContent","hasSessionStorageState","isCollapsed","isCollapsible","MemoizedUiShell","memo","displayName"],"sources":["../../../src/ui-shell/UiShell.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { memo, useEffect, useState, type SetStateAction } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nimport { type ReactRootElements } from \"../web-component/createReactRootElements.js\";\nimport { CssBaseline } from \"../CssBaseline.js\";\nimport { NarrowUiShellContent } from \"./NarrowUiShellContent.js\";\nimport { OdysseyProvider } from \"../OdysseyProvider.js\";\nimport { UiShellProvider, UiShellProviderProps } from \"./UiShellProvider.js\";\nimport {\n UiShellNavComponentProps,\n UiShellContentProps,\n} from \"./uiShellContentTypes.js\";\nimport {\n UiShellBreakpointConfig,\n useUiShellBreakpoints,\n} from \"./useUiShellBreakpoints.js\";\nimport { WideUiShellContent } from \"./WideUiShellContent.js\";\nimport { MessageBus } from \"./createMessageBus.js\";\n\nexport const defaultComponentProps: UiShellNavComponentProps = {\n sideNavProps: undefined,\n topNavProps: undefined,\n} as const;\n\nconst errorComponent = <div data-error />;\n\nexport type UiShellProps = {\n /**\n * Customized breakpoints for UI Shell.\n *\n * The defaults are set for you. Pass these only if your app doesn't work properly with the defaults (like Admin).\n */\n breakpointConfig?: UiShellBreakpointConfig;\n /**\n * Notifies when subscribed to prop changes.\n *\n * UI Shell listens to prop updates, and it won't subscribe synchronously. Because of that, this callback notifies when that subscription is ready.\n */\n onSubscriptionCreated: () => void;\n /**\n * This is a callback that provides a subscriber callback to listen for changes to state.\n * It allows UI Shell to listen for state changes.\n *\n * The props coming in this callback go directly to a React state; therefore, it shares the same signature and provides a previous state.\n */\n subscribeToPropChanges: MessageBus<\n SetStateAction<UiShellNavComponentProps>\n >[\"subscribe\"];\n /**\n * Element inside UI Shell's React root component renders into. If using a web component, this is going to exist inside it.\n */\n uiShellAppElement: ReactRootElements[\"appRootElement\"];\n /**\n * Typically, this is your `<head>` element. If using a web component, you need to create one yourself as Shadow DOM's don't have a `<head>`.\n */\n uiShellStylesElement: ReactRootElements[\"stylesRootElement\"];\n} & UiShellProviderProps &\n Pick<\n UiShellContentProps,\n | \"appElement\"\n | \"appElementScrollingMode\"\n | \"hasStandardAppContentPadding\"\n | \"initialVisibleSections\"\n | \"onError\"\n | \"optionalComponents\"\n >;\n\n/**\n * Our new Unified Platform UI Shell.\n *\n * This includes the top and side navigation as well as the footer and provides a spot for your app to render into.\n *\n * If an error occurs, this will revert to only showing the app.\n */\nconst UiShell = ({\n appBackgroundColor,\n appBackgroundContrastMode,\n appElement,\n appElementScrollingMode,\n breakpointConfig,\n closeSideNavMenu,\n hasStandardAppContentPadding,\n initialVisibleSections,\n onError = console.error,\n onSubscriptionCreated,\n optionalComponents,\n sideNavBackgroundColor,\n subscribeToCloseRightSideMenu,\n subscribeToCloseSideNavMenu,\n subscribeToPropChanges,\n topNavBackgroundColor,\n uiShellAppElement,\n uiShellStylesElement,\n}: UiShellProps) => {\n const [componentProps, setComponentProps] = useState(defaultComponentProps);\n\n const activeBreakpoint = useUiShellBreakpoints(breakpointConfig);\n\n useEffect(() => {\n const unsubscribe = subscribeToPropChanges((componentProps) => {\n // If for some reason nothing is passed as `componentProps`, we fallback on `defaultComponentProps` as a safety mechanism to ensure nothing breaks.\n setComponentProps(componentProps || defaultComponentProps);\n });\n\n onSubscriptionCreated();\n\n return () => {\n unsubscribe();\n };\n }, [onSubscriptionCreated, subscribeToPropChanges]);\n\n return activeBreakpoint === \"none\" ? null : (\n <ErrorBoundary fallback={errorComponent} onError={onError}>\n <OdysseyProvider\n emotionRootElement={uiShellStylesElement}\n shadowRootElement={uiShellAppElement}\n >\n <ErrorBoundary fallback={errorComponent} onError={onError}>\n <CssBaseline />\n\n <UiShellProvider\n appBackgroundColor={appBackgroundColor}\n appBackgroundContrastMode={appBackgroundContrastMode}\n closeSideNavMenu={closeSideNavMenu}\n sideNavBackgroundColor={sideNavBackgroundColor}\n subscribeToCloseRightSideMenu={subscribeToCloseRightSideMenu}\n subscribeToCloseSideNavMenu={subscribeToCloseSideNavMenu}\n topNavBackgroundColor={topNavBackgroundColor}\n >\n {activeBreakpoint === \"narrow\" && (\n <NarrowUiShellContent\n {...componentProps}\n appElement={appElement}\n appElementScrollingMode={appElementScrollingMode}\n hasSideNavProps={Boolean(componentProps.sideNavProps)}\n hasStandardAppContentPadding={hasStandardAppContentPadding}\n initialVisibleSections={initialVisibleSections}\n onError={onError}\n optionalComponents={optionalComponents}\n />\n )}\n\n {(activeBreakpoint === \"medium\" || activeBreakpoint === \"wide\") && (\n <WideUiShellContent\n {...{\n ...componentProps,\n ...{\n sideNavProps: {\n ...componentProps.sideNavProps,\n hasSessionStorageState: activeBreakpoint === \"wide\",\n isCollapsed:\n activeBreakpoint === \"medium\" ||\n componentProps.sideNavProps?.isCollapsed,\n isCollapsible:\n activeBreakpoint === \"medium\" ||\n componentProps.sideNavProps?.isCollapsible,\n // We have to use `as` because sideNavProps expects you to have `sideNavItems` defined even though it had to be passed in `...componentProps.sideNavProps`.\n } as typeof componentProps.sideNavProps,\n },\n }}\n appElement={appElement}\n appElementScrollingMode={appElementScrollingMode}\n hasStandardAppContentPadding={hasStandardAppContentPadding}\n hasSideNavProps={Boolean(componentProps.sideNavProps)}\n initialVisibleSections={initialVisibleSections}\n onError={onError}\n optionalComponents={optionalComponents}\n />\n )}\n </UiShellProvider>\n </ErrorBoundary>\n </OdysseyProvider>\n </ErrorBoundary>\n );\n};\n\nconst MemoizedUiShell = memo(UiShell);\nMemoizedUiShell.displayName = \"UiShell\";\n\nexport { MemoizedUiShell as UiShell };\n"],"mappings":"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","ignoreList":[]}
1
+ {"version":3,"file":"UiShell.cjs","names":["_react","require","_reactErrorBoundary","_CssBaseline","_NarrowUiShellContent","_OdysseyProvider","_UiShellProvider","_useUiShellBreakpoints","_WideUiShellContent","_jsxRuntime","defaultComponentProps","exports","sideNavProps","undefined","topNavProps","errorComponent","jsx","UiShell","appBackgroundColor","appBackgroundContrastMode","appElement","appElementScrollingMode","breakpointConfig","closeSideNavMenu","hasStandardAppContentPadding","initialVisibleSections","onError","console","error","onSubscriptionCreated","optionalComponents","sideNavBackgroundColor","sideNavBackgroundContrastColor","subscribeToCloseRightSideMenu","subscribeToCloseSideNavMenu","subscribeToPropChanges","topNavBackgroundColor","uiShellAppElement","uiShellStylesElement","componentProps","setComponentProps","useState","activeBreakpoint","useUiShellBreakpoints","useEffect","unsubscribe","ErrorBoundary","fallback","children","OdysseyProvider","emotionRootElement","shadowRootElement","jsxs","CssBaseline","UiShellProvider","NarrowUiShellContent","hasSideNavProps","Boolean","WideUiShellContent","hasSessionStorageState","isCollapsed","isCollapsible","MemoizedUiShell","memo","displayName"],"sources":["../../../src/ui-shell/UiShell.tsx"],"sourcesContent":["/*!\n * Copyright (c) 2024-present, Okta, Inc. and/or its affiliates. All rights reserved.\n * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the \"License.\")\n *\n * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n *\n * See the License for the specific language governing permissions and limitations under the License.\n */\n\nimport { memo, useEffect, useState, type SetStateAction } from \"react\";\nimport { ErrorBoundary } from \"react-error-boundary\";\n\nimport { type ReactRootElements } from \"../web-component/createReactRootElements.js\";\nimport { CssBaseline } from \"../CssBaseline.js\";\nimport { NarrowUiShellContent } from \"./NarrowUiShellContent.js\";\nimport { OdysseyProvider } from \"../OdysseyProvider.js\";\nimport { UiShellProvider, UiShellProviderProps } from \"./UiShellProvider.js\";\nimport {\n UiShellNavComponentProps,\n UiShellContentProps,\n} from \"./uiShellContentTypes.js\";\nimport {\n UiShellBreakpointConfig,\n useUiShellBreakpoints,\n} from \"./useUiShellBreakpoints.js\";\nimport { WideUiShellContent } from \"./WideUiShellContent.js\";\nimport { MessageBus } from \"./createMessageBus.js\";\n\nexport const defaultComponentProps: UiShellNavComponentProps = {\n sideNavProps: undefined,\n topNavProps: undefined,\n} as const;\n\nconst errorComponent = <div data-error />;\n\nexport type UiShellProps = {\n /**\n * Customized breakpoints for UI Shell.\n *\n * The defaults are set for you. Pass these only if your app doesn't work properly with the defaults (like Admin).\n */\n breakpointConfig?: UiShellBreakpointConfig;\n /**\n * Notifies when subscribed to prop changes.\n *\n * UI Shell listens to prop updates, and it won't subscribe synchronously. Because of that, this callback notifies when that subscription is ready.\n */\n onSubscriptionCreated: () => void;\n /**\n * This is a callback that provides a subscriber callback to listen for changes to state.\n * It allows UI Shell to listen for state changes.\n *\n * The props coming in this callback go directly to a React state; therefore, it shares the same signature and provides a previous state.\n */\n subscribeToPropChanges: MessageBus<\n SetStateAction<UiShellNavComponentProps>\n >[\"subscribe\"];\n /**\n * Element inside UI Shell's React root component renders into. If using a web component, this is going to exist inside it.\n */\n uiShellAppElement: ReactRootElements[\"appRootElement\"];\n /**\n * Typically, this is your `<head>` element. If using a web component, you need to create one yourself as Shadow DOM's don't have a `<head>`.\n */\n uiShellStylesElement: ReactRootElements[\"stylesRootElement\"];\n} & UiShellProviderProps &\n Pick<\n UiShellContentProps,\n | \"appElement\"\n | \"appElementScrollingMode\"\n | \"hasStandardAppContentPadding\"\n | \"initialVisibleSections\"\n | \"onError\"\n | \"optionalComponents\"\n >;\n\n/**\n * Our new Unified Platform UI Shell.\n *\n * This includes the top and side navigation as well as the footer and provides a spot for your app to render into.\n *\n * If an error occurs, this will revert to only showing the app.\n */\nconst UiShell = ({\n appBackgroundColor,\n appBackgroundContrastMode,\n appElement,\n appElementScrollingMode,\n breakpointConfig,\n closeSideNavMenu,\n hasStandardAppContentPadding,\n initialVisibleSections,\n onError = console.error,\n onSubscriptionCreated,\n optionalComponents,\n sideNavBackgroundColor,\n sideNavBackgroundContrastColor,\n subscribeToCloseRightSideMenu,\n subscribeToCloseSideNavMenu,\n subscribeToPropChanges,\n topNavBackgroundColor,\n uiShellAppElement,\n uiShellStylesElement,\n}: UiShellProps) => {\n const [componentProps, setComponentProps] = useState(defaultComponentProps);\n\n const activeBreakpoint = useUiShellBreakpoints(breakpointConfig);\n\n useEffect(() => {\n const unsubscribe = subscribeToPropChanges((componentProps) => {\n // If for some reason nothing is passed as `componentProps`, we fallback on `defaultComponentProps` as a safety mechanism to ensure nothing breaks.\n setComponentProps(componentProps || defaultComponentProps);\n });\n\n onSubscriptionCreated();\n\n return () => {\n unsubscribe();\n };\n }, [onSubscriptionCreated, subscribeToPropChanges]);\n\n return activeBreakpoint === \"none\" ? null : (\n <ErrorBoundary fallback={errorComponent} onError={onError}>\n <OdysseyProvider\n emotionRootElement={uiShellStylesElement}\n shadowRootElement={uiShellAppElement}\n >\n <ErrorBoundary fallback={errorComponent} onError={onError}>\n <CssBaseline />\n\n <UiShellProvider\n appBackgroundColor={appBackgroundColor}\n appBackgroundContrastMode={appBackgroundContrastMode}\n closeSideNavMenu={closeSideNavMenu}\n sideNavBackgroundColor={sideNavBackgroundColor}\n sideNavBackgroundContrastColor={sideNavBackgroundContrastColor}\n subscribeToCloseRightSideMenu={subscribeToCloseRightSideMenu}\n subscribeToCloseSideNavMenu={subscribeToCloseSideNavMenu}\n topNavBackgroundColor={topNavBackgroundColor}\n >\n {activeBreakpoint === \"narrow\" && (\n <NarrowUiShellContent\n {...componentProps}\n appElement={appElement}\n appElementScrollingMode={appElementScrollingMode}\n hasSideNavProps={Boolean(componentProps.sideNavProps)}\n hasStandardAppContentPadding={hasStandardAppContentPadding}\n initialVisibleSections={initialVisibleSections}\n onError={onError}\n optionalComponents={optionalComponents}\n />\n )}\n\n {(activeBreakpoint === \"medium\" || activeBreakpoint === \"wide\") && (\n <WideUiShellContent\n {...{\n ...componentProps,\n ...{\n sideNavProps: {\n ...componentProps.sideNavProps,\n hasSessionStorageState: activeBreakpoint === \"wide\",\n isCollapsed:\n activeBreakpoint === \"medium\" ||\n componentProps.sideNavProps?.isCollapsed,\n isCollapsible:\n activeBreakpoint === \"medium\" ||\n componentProps.sideNavProps?.isCollapsible,\n // We have to use `as` because sideNavProps expects you to have `sideNavItems` defined even though it had to be passed in `...componentProps.sideNavProps`.\n } as typeof componentProps.sideNavProps,\n },\n }}\n appElement={appElement}\n appElementScrollingMode={appElementScrollingMode}\n hasStandardAppContentPadding={hasStandardAppContentPadding}\n hasSideNavProps={Boolean(componentProps.sideNavProps)}\n initialVisibleSections={initialVisibleSections}\n onError={onError}\n optionalComponents={optionalComponents}\n />\n )}\n </UiShellProvider>\n </ErrorBoundary>\n </OdysseyProvider>\n </ErrorBoundary>\n );\n};\n\nconst MemoizedUiShell = memo(UiShell);\nMemoizedUiShell.displayName = \"UiShell\";\n\nexport { MemoizedUiShell as UiShell };\n"],"mappings":"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","ignoreList":[]}
@@ -35,13 +35,18 @@ const UiShellProvider = ({
35
35
  children,
36
36
  closeSideNavMenu,
37
37
  sideNavBackgroundColor,
38
+ sideNavBackgroundContrastColor,
38
39
  subscribeToCloseRightSideMenu,
39
40
  subscribeToCloseSideNavMenu,
40
41
  topNavBackgroundColor
41
42
  }) => {
42
43
  const odysseyDesignTokens = (0, _OdysseyDesignTokensContext.useOdysseyDesignTokens)();
43
44
  const defaultedSideNavBackgroundColor = sideNavBackgroundColor || odysseyDesignTokens.HueNeutralWhite;
44
- const sideNavContrastColors = defaultedSideNavBackgroundColor !== odysseyDesignTokens.HueNeutralWhite ? (0, _createContrastColors.generateContrastColors)(defaultedSideNavBackgroundColor, odysseyDesignTokens) : undefined;
45
+ const sideNavContrastColors = defaultedSideNavBackgroundColor !== odysseyDesignTokens.HueNeutralWhite ? (0, _createContrastColors.generateContrastColors)({
46
+ backgroundColor: sideNavBackgroundColor || defaultedSideNavBackgroundColor,
47
+ backgroundContrastColor: sideNavBackgroundContrastColor,
48
+ odysseyDesignTokens
49
+ }) : undefined;
45
50
  const isAppBackgroundHightContrast = appBackgroundContrastMode === "highContrast";
46
51
  const defaultTopAndAppBackgroundColor = isAppBackgroundHightContrast ? odysseyDesignTokens.HueNeutralWhite : odysseyDesignTokens.HueNeutral50;
47
52
  const topNavColor = topNavBackgroundColor || defaultTopAndAppBackgroundColor;