@okta/odyssey-react-mui 1.35.4 → 1.36.1

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 (77) hide show
  1. package/dist/cjs/StringWithValue.cjs.map +1 -0
  2. package/dist/cjs/theme/useMediaQuery.cjs.map +1 -1
  3. package/dist/cjs/ui-shell/InnerAppContainer.cjs +1 -0
  4. package/dist/cjs/ui-shell/InnerAppContainer.cjs.map +1 -1
  5. package/dist/cjs/ui-shell/NarrowUiShellContent.cjs +1 -2
  6. package/dist/cjs/ui-shell/NarrowUiShellContent.cjs.map +1 -1
  7. package/dist/cjs/ui-shell/SideNav/SideNav.cjs +88 -59
  8. package/dist/cjs/ui-shell/SideNav/SideNav.cjs.map +1 -1
  9. package/dist/cjs/ui-shell/SideNav/types.cjs.map +1 -1
  10. package/dist/cjs/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.cjs +26 -0
  11. package/dist/cjs/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.cjs.map +1 -0
  12. package/dist/cjs/ui-shell/index.cjs +8 -1
  13. package/dist/cjs/ui-shell/index.cjs.map +1 -1
  14. package/dist/cjs/useMountLifecycleEffect.cjs +36 -0
  15. package/dist/cjs/useMountLifecycleEffect.cjs.map +1 -0
  16. package/dist/cjs/useSessionStorageState.cjs +64 -0
  17. package/dist/cjs/useSessionStorageState.cjs.map +1 -0
  18. package/dist/{index.js → cjs/web-component/odysseyWebComponentVersion.generated.cjs} +8 -14
  19. package/dist/cjs/web-component/odysseyWebComponentVersion.generated.cjs.map +1 -0
  20. package/dist/cjs/web-component/renderReactInWebComponent.cjs +53 -19
  21. package/dist/cjs/web-component/renderReactInWebComponent.cjs.map +1 -1
  22. package/dist/esm/StringWithValue.js.map +1 -0
  23. package/dist/esm/theme/useMediaQuery.js.map +1 -1
  24. package/dist/esm/ui-shell/InnerAppContainer.js +1 -0
  25. package/dist/esm/ui-shell/InnerAppContainer.js.map +1 -1
  26. package/dist/esm/ui-shell/NarrowUiShellContent.js +1 -2
  27. package/dist/esm/ui-shell/NarrowUiShellContent.js.map +1 -1
  28. package/dist/esm/ui-shell/SideNav/SideNav.js +88 -59
  29. package/dist/esm/ui-shell/SideNav/SideNav.js.map +1 -1
  30. package/dist/esm/ui-shell/SideNav/types.js.map +1 -1
  31. package/dist/esm/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.js +19 -0
  32. package/dist/esm/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.js.map +1 -0
  33. package/dist/esm/ui-shell/index.js +1 -1
  34. package/dist/esm/ui-shell/index.js.map +1 -1
  35. package/dist/esm/useMountLifecycleEffect.js +29 -0
  36. package/dist/esm/useMountLifecycleEffect.js.map +1 -0
  37. package/dist/esm/useSessionStorageState.js +56 -0
  38. package/dist/esm/useSessionStorageState.js.map +1 -0
  39. package/dist/esm/web-component/odysseyWebComponentVersion.generated.js +12 -0
  40. package/dist/esm/web-component/odysseyWebComponentVersion.generated.js.map +1 -0
  41. package/dist/esm/web-component/renderReactInWebComponent.js +49 -17
  42. package/dist/esm/web-component/renderReactInWebComponent.js.map +1 -1
  43. package/dist/tsconfig.production.tsbuildinfo +1 -1
  44. package/dist/types/StringWithValue.d.ts.map +1 -0
  45. package/dist/types/theme/useMediaQuery.d.ts +1 -1
  46. package/dist/types/theme/useMediaQuery.d.ts.map +1 -1
  47. package/dist/types/ui-shell/InnerAppContainer.d.ts.map +1 -1
  48. package/dist/types/ui-shell/NarrowUiShellContent.d.ts.map +1 -1
  49. package/dist/types/ui-shell/SideNav/SideNav.d.ts.map +1 -1
  50. package/dist/types/ui-shell/SideNav/types.d.ts +13 -4
  51. package/dist/types/ui-shell/SideNav/types.d.ts.map +1 -1
  52. package/dist/types/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.d.ts +17 -0
  53. package/dist/types/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.d.ts.map +1 -0
  54. package/dist/types/ui-shell/index.d.ts +1 -1
  55. package/dist/types/ui-shell/index.d.ts.map +1 -1
  56. package/dist/types/ui-shell/renderUiShell.d.ts +1 -1
  57. package/dist/types/useMountLifecycleEffect.d.ts +16 -0
  58. package/dist/types/useMountLifecycleEffect.d.ts.map +1 -0
  59. package/dist/types/useSessionStorageState.d.ts +20 -0
  60. package/dist/types/useSessionStorageState.d.ts.map +1 -0
  61. package/dist/types/web-component/odysseyWebComponentVersion.generated.d.ts +19 -0
  62. package/dist/types/web-component/odysseyWebComponentVersion.generated.d.ts.map +1 -0
  63. package/dist/types/web-component/renderReactInWebComponent.d.ts +29 -7
  64. package/dist/types/web-component/renderReactInWebComponent.d.ts.map +1 -1
  65. package/package.json +6 -5
  66. package/dist/cjs/theme/StringWithValue.cjs.map +0 -1
  67. package/dist/esm/theme/StringWithValue.js.map +0 -1
  68. package/dist/index.cjs +0 -231
  69. package/dist/index.d.ts +0 -22
  70. package/dist/index.d.ts.map +0 -1
  71. package/dist/index.mjs +0 -229
  72. package/dist/index.scss +0 -549
  73. package/dist/tsconfig.tsbuildinfo +0 -1
  74. package/dist/types/theme/StringWithValue.d.ts.map +0 -1
  75. /package/dist/cjs/{theme/StringWithValue.cjs → StringWithValue.cjs} +0 -0
  76. /package/dist/esm/{theme/StringWithValue.js → StringWithValue.js} +0 -0
  77. /package/dist/types/{theme/StringWithValue.d.ts → StringWithValue.d.ts} +0 -0
@@ -28,6 +28,8 @@ import { SortableList } from "./SortableList/SortableList.js";
28
28
  import { Overline } from "../../Typography.js";
29
29
  import { useUiShellContext } from "../../ui-shell/UiShellProvider.js";
30
30
  import { SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION, SIDE_NAV_WIDTH, UI_SHELL_BASE_Z_INDEX, UI_SHELL_OVERLAY_Z_INDEX } from "../uiShellSharedConstants.js";
31
+ import { useIsSideNavCollapsedSessionStorage } from "./useIsSideNavCollapsedSessionStorage.js";
32
+ import { useMountLifecycleEffect } from "../../useMountLifecycleEffect.js";
31
33
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
32
34
  export const SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED = 12;
33
35
  export const SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED = 2;
@@ -143,7 +145,8 @@ const StyledSideNavListContainer = styled("ul")(() => ({
143
145
  padding: 0,
144
146
  listStyle: "none",
145
147
  listStyleType: "none",
146
- margin: 0
148
+ margin: 0,
149
+ width: "100%"
147
150
  }));
148
151
  const StyledSideNavScrollableContainer = styled("div", {
149
152
  shouldForwardProp: prop => prop !== "odysseyDesignTokens"
@@ -273,9 +276,12 @@ const SideNav = ({
273
276
  const [hasContentScrolled, setHasContentScrolled] = useState(false);
274
277
  const [hasNeighboringContent, setHasNeighboringContent] = useState(false);
275
278
  const [isContentScrollable, setIsContentScrollable] = useState(false);
276
- const [isSideNavCollapsed, setIsSideNavCollapsed] = useState(isCollapsed);
277
279
  const [isSideNavToggleHighlighted, setIsSideNavToggleHighlighted] = useState(false);
278
280
  const [sideNavItemsList, updateSideNavItemsList] = useState(sideNavItems);
281
+ const {
282
+ sessionState: isSideNavCollapsed,
283
+ setSessionState: setIsSideNavCollapsed
284
+ } = useIsSideNavCollapsedSessionStorage(isCollapsed);
279
285
  const uiShellContext = useUiShellContext();
280
286
  const odysseyDesignTokens = useOdysseyDesignTokens();
281
287
  const {
@@ -288,11 +294,22 @@ const SideNav = ({
288
294
  const blankElement = useMemo(() => _jsx("div", {}), []);
289
295
  useEffect(() => updateSideNavItemsList(sideNavItems), [sideNavItems]);
290
296
  useEffect(() => {
291
- setIsSideNavCollapsed(isCollapsed);
292
297
  if (sideNavRef.current) {
293
298
  setHasNeighboringContent(sideNavRef.current.getBoundingClientRect().x > 0);
294
299
  }
295
300
  }, [isCollapsed]);
301
+ const onMount = useCallback(() => {
302
+ if (!isCollapsible) {
303
+ setIsSideNavCollapsed(isCollapsed);
304
+ }
305
+ }, [isCollapsed, isCollapsible, setIsSideNavCollapsed]);
306
+ const onUpdate = useCallback(() => {
307
+ setIsSideNavCollapsed(isCollapsed);
308
+ }, [isCollapsed, setIsSideNavCollapsed]);
309
+ useMountLifecycleEffect({
310
+ onMount,
311
+ onUpdate
312
+ });
296
313
  useEffect(() => {
297
314
  const updateIsContentScrollable = () => {
298
315
  if (scrollableContentRef.current && scrollableContentRef.current.parentElement) {
@@ -384,29 +401,27 @@ const SideNav = ({
384
401
  const processedSideNavItems = useMemo(() => {
385
402
  return sideNavItemsList?.map(item => ({
386
403
  ...item,
387
- childNavItems: item.nestedNavItems?.map(childProps => {
388
- return {
389
- id: childProps.id,
390
- isSelected: childProps.isSelected,
391
- isDisabled: childProps.isDisabled,
392
- isSortable: childProps.isSortable,
393
- navItem: _jsx(SideNavItemContentContext.Provider, {
394
- value: {
395
- ...sideNavItemContentProviderValue,
396
- depth: 2,
397
- isSortable: item.isSortable
398
- },
399
- children: _jsx(SideNavItemContent, {
400
- ...childProps,
401
- scrollRef: getRefIfThisIsFirstNodeWithIsSelected(childProps.id),
402
- onItemSelected: setSelectedItem,
403
- translate: childProps.translate
404
- })
405
- }, childProps.id)
406
- };
407
- })
404
+ childNavItems: item.nestedNavItems?.map(childProps => ({
405
+ id: childProps.id,
406
+ isSelected: childProps.isSelected,
407
+ isDisabled: childProps.isDisabled,
408
+ isSortable: childProps.isSortable,
409
+ navItem: _jsx(SideNavItemContentContext.Provider, {
410
+ value: {
411
+ ...sideNavItemContentProviderValue,
412
+ depth: 2,
413
+ isSortable: item.isSortable
414
+ },
415
+ children: _jsx(SideNavItemContent, {
416
+ ...childProps,
417
+ onItemSelected: setSelectedItem,
418
+ scrollRef: getRefIfThisIsFirstNodeWithIsSelected(childProps.id),
419
+ translate: childProps.translate
420
+ })
421
+ }, childProps.id)
422
+ }))
408
423
  }));
409
- }, [getRefIfThisIsFirstNodeWithIsSelected, sideNavItemsList, sideNavItemContentProviderValue, setSelectedItem]);
424
+ }, [getRefIfThisIsFirstNodeWithIsSelected, setSelectedItem, sideNavItemContentProviderValue, sideNavItemsList]);
410
425
  const sideNavExpandClickHandler = useCallback(() => {
411
426
  setIsSideNavCollapsed(isSideNavCollapsed => {
412
427
  if (isSideNavCollapsed) {
@@ -416,7 +431,7 @@ const SideNav = ({
416
431
  }
417
432
  return !isSideNavCollapsed;
418
433
  });
419
- }, [onExpand, onCollapse]);
434
+ }, [onCollapse, onExpand, setIsSideNavCollapsed]);
420
435
  const sideNavExpandKeyHandler = useCallback(event => {
421
436
  if (event?.key === "Enter" || event?.code === "Space") {
422
437
  event.preventDefault();
@@ -424,17 +439,14 @@ const SideNav = ({
424
439
  }
425
440
  }, [sideNavExpandClickHandler]);
426
441
  useEffect(() => {
427
- if (isCollapsed) {
428
- const unsubscribe = uiShellContext?.subscribeToCloseSideNavMenu(() => {
429
- onCollapse?.();
430
- setIsSideNavCollapsed(true);
431
- });
432
- return () => {
433
- unsubscribe?.();
434
- };
435
- }
436
- return () => {};
437
- }, [isCollapsed, onCollapse, uiShellContext]);
442
+ const unsubscribe = uiShellContext?.subscribeToCloseSideNavMenu(() => {
443
+ onCollapse?.();
444
+ setIsSideNavCollapsed(true);
445
+ });
446
+ return () => {
447
+ unsubscribe?.();
448
+ };
449
+ }, [onCollapse, setIsSideNavCollapsed, uiShellContext]);
438
450
  const setSortedItems = useCallback((parentId, activeId, activeIndex, overIndex) => {
439
451
  const sortedSideNavItems = sideNavItemsList.map(item => item.id === parentId && item.nestedNavItems ? {
440
452
  ...item,
@@ -496,15 +508,16 @@ const SideNav = ({
496
508
  ref: scrollableContentRef,
497
509
  children: isLoading ? Array(6).fill(null).map((_, index) => _jsx(LoadingItem, {}, index)) : processedSideNavItems?.map(item => {
498
510
  const {
499
- id,
500
- label,
501
- isSectionHeader,
502
- startIcon,
503
511
  childNavItems,
504
- isSortable,
512
+ href,
513
+ id,
505
514
  isDefaultExpanded,
506
515
  isDisabled,
507
- isExpanded
516
+ isExpanded,
517
+ isSectionHeader,
518
+ isSortable,
519
+ label,
520
+ startIcon
508
521
  } = item;
509
522
  if (isSectionHeader) {
510
523
  return _jsx(ErrorBoundary, {
@@ -520,7 +533,37 @@ const SideNav = ({
520
533
  })
521
534
  }, id);
522
535
  } else if (childNavItems) {
523
- return _jsx(ErrorBoundary, {
536
+ const nestedChildren = _jsx(StyledSideNavListContainer, {
537
+ role: "presentation",
538
+ children: isSortable ? _jsx(SortableList, {
539
+ parentId: item.id,
540
+ items: childNavItems,
541
+ onChange: setSortedItems,
542
+ renderItem: sortableItem => _jsx(SortableList.Item, {
543
+ id: sortableItem.id,
544
+ isDisabled: sortableItem.isDisabled,
545
+ isSelected: sortableItem.isSelected,
546
+ isSortable: sortableItem.isSortable,
547
+ children: sortableItem.navItem
548
+ })
549
+ }) : childNavItems.map(item => item.navItem)
550
+ });
551
+ return href ? _jsxs(ErrorBoundary, {
552
+ fallback: blankElement,
553
+ children: [_jsx(SideNavItemContent, {
554
+ ...item,
555
+ href: href,
556
+ onItemSelected: setSelectedItem,
557
+ scrollRef: getRefIfThisIsFirstNodeWithIsSelected(item.id),
558
+ startIcon: item.startIcon
559
+ }), _jsx(StyledSideNavListItem, {
560
+ id: `${id}-items`,
561
+ odysseyDesignTokens: odysseyDesignTokens,
562
+ disabled: isDisabled,
563
+ "aria-disabled": isDisabled,
564
+ children: nestedChildren
565
+ })]
566
+ }, id) : _jsx(ErrorBoundary, {
524
567
  fallback: blankElement,
525
568
  children: _jsx(StyledSideNavListItem, {
526
569
  id: id,
@@ -534,21 +577,7 @@ const SideNav = ({
534
577
  isExpanded: isExpanded,
535
578
  startIcon: startIcon,
536
579
  isDisabled: isDisabled,
537
- children: _jsx(StyledSideNavListContainer, {
538
- role: "none",
539
- children: isSortable ? _jsx(SortableList, {
540
- parentId: item.id,
541
- items: childNavItems,
542
- onChange: setSortedItems,
543
- renderItem: sortableItem => _jsx(SortableList.Item, {
544
- id: sortableItem.id,
545
- isDisabled: sortableItem.isDisabled,
546
- isSelected: sortableItem.isSelected,
547
- isSortable: sortableItem.isSortable,
548
- children: sortableItem.navItem
549
- })
550
- }) : childNavItems.map(item => item.navItem)
551
- })
580
+ children: nestedChildren
552
581
  })
553
582
  })
554
583
  }, id);
@@ -1 +1 @@
1
- {"version":3,"file":"SideNav.js","names":["styled","memo","useMemo","useState","useCallback","useRef","useEffect","useTranslation","arrayMove","ErrorBoundary","NavAccordion","useOdysseyDesignTokens","OdysseyThemeProvider","SideNavHeader","SideNavItemContent","StyledSideNavListItem","SideNavFooterContent","SideNavItemContentContext","SIDE_NAV_TOGGLE_ICON_HALF_SIZE","SIDE_NAV_TOGGLE_ICON_SIZE","SideNavToggleButton","SortableList","Overline","useUiShellContext","SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION","SIDE_NAV_WIDTH","UI_SHELL_BASE_Z_INDEX","UI_SHELL_OVERLAY_Z_INDEX","jsx","_jsx","jsxs","_jsxs","SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED","SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED","StyledCollapsibleContent","shouldForwardProp","prop","odysseyDesignTokens","isSideNavCollapsed","position","display","gridTemplateColumns","height","transition","TransitionDurationMain","transitionTimingFunction","TransitionTimingMain","overflow","opacity","StyledOpacityTransitionContainer","gridTemplateRows","StyledSideNavContainer","backgroundColor","hasNeighboringContent","isAppContentWhiteBackground","isSideNavToggleHighlighted","HueNeutralWhite","width","content","pointerEvents","right","BorderWidthMain","top","userSelect","zIndex","BorderColorPrimaryControl","HueNeutral100","HueNeutral200","transform","borderRightColor","borderRightStyle","BorderStyleMain","borderRightWidth","StyledSideNavToggleButtonContainer","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","boxShadow","StyledSideNavFooterItemsContainer","sideNavContrastColors","flexWrap","alignItems","fontSize","TypographySizeOverline","fontColor","textDecoration","HueNeutral900","StyledLoadingItemContainer","gap","getHasScrollableContent","scrollableContainer","scrollHeight","clientHeight","LoadingItem","children","_Skeleton","variant","SideNav","appName","footerComponent","footerItems","hasCustomFooter","isCollapsible","isCollapsed","isCompact","isLoading","isObtrusive","logoProps","onCollapse","onExpand","onSort","sideNavItems","setHasContentScrolled","setHasNeighboringContent","setIsContentScrollable","setIsSideNavCollapsed","setIsSideNavToggleHighlighted","sideNavItemsList","updateSideNavItemsList","uiShellContext","t","scrollableContentRef","resizeObserverRef","intersectionObserverRef","sideNavRef","blankElement","current","getBoundingClientRect","x","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","Provider","value","scrollRef","onItemSelected","translate","sideNavExpandClickHandler","sideNavExpandKeyHandler","event","key","code","preventDefault","unsubscribe","subscribeToCloseSideNavMenu","setSortedItems","parentId","activeId","activeIndex","overIndex","sortedSideNavItems","onSideNavToggleButtonHighlight","isHighlighted","appBackgroundColor","ref","clickAreaPadding","ariaControls","onClick","onHighlight","onKeyDown","role","fill","_","index","label","isSectionHeader","startIcon","isDefaultExpanded","isExpanded","fallback","component","disabled","items","onChange","renderItem","sortableItem","Item","MemoizedSideNav","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\";\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}));\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 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 [isSideNavCollapsed, setIsSideNavCollapsed] = useState(isCollapsed);\n const [isSideNavToggleHighlighted, setIsSideNavToggleHighlighted] =\n useState(false);\n const [sideNavItemsList, updateSideNavItemsList] = useState(sideNavItems);\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 setIsSideNavCollapsed(isCollapsed);\n\n if (sideNavRef.current) {\n setHasNeighboringContent(\n sideNavRef.current.getBoundingClientRect().x > 0,\n );\n }\n }, [isCollapsed]);\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 uiShellContext?.closeSideNavMenu();\n }\n },\n [isCollapsed, isObtrusive, sideNavItemsList, uiShellContext],\n );\n\n const processedSideNavItems = useMemo(() => {\n return sideNavItemsList?.map((item) => ({\n ...item,\n childNavItems: item.nestedNavItems?.map((childProps) => {\n return {\n id: childProps.id,\n isSelected: childProps.isSelected,\n isDisabled: childProps.isDisabled,\n isSortable: childProps.isSortable,\n navItem: (\n <SideNavItemContentContext.Provider\n value={{\n ...sideNavItemContentProviderValue,\n depth: 2,\n isSortable: item.isSortable,\n }}\n key={childProps.id}\n >\n <SideNavItemContent\n {...childProps}\n scrollRef={getRefIfThisIsFirstNodeWithIsSelected(childProps.id)}\n onItemSelected={setSelectedItem}\n translate={childProps.translate}\n />\n </SideNavItemContentContext.Provider>\n ),\n };\n }),\n }));\n }, [\n getRefIfThisIsFirstNodeWithIsSelected,\n sideNavItemsList,\n sideNavItemContentProviderValue,\n setSelectedItem,\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 }, [onExpand, onCollapse]);\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 if (isCollapsed) {\n const unsubscribe = uiShellContext?.subscribeToCloseSideNavMenu(() => {\n onCollapse?.();\n setIsSideNavCollapsed(true);\n });\n\n return () => {\n unsubscribe?.();\n };\n }\n\n return () => {};\n }, [isCollapsed, onCollapse, 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 id,\n label,\n isSectionHeader,\n startIcon,\n childNavItems,\n isSortable,\n isDefaultExpanded,\n isDisabled,\n isExpanded,\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 return (\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 <StyledSideNavListContainer role=\"none\">\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 </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.js","names":["styled","memo","useMemo","useState","useCallback","useRef","useEffect","useTranslation","arrayMove","ErrorBoundary","NavAccordion","useOdysseyDesignTokens","OdysseyThemeProvider","SideNavHeader","SideNavItemContent","StyledSideNavListItem","SideNavFooterContent","SideNavItemContentContext","SIDE_NAV_TOGGLE_ICON_HALF_SIZE","SIDE_NAV_TOGGLE_ICON_SIZE","SideNavToggleButton","SortableList","Overline","useUiShellContext","SIDE_NAV_VISIBILITY_TOGGLE_ICON_POSITION","SIDE_NAV_WIDTH","UI_SHELL_BASE_Z_INDEX","UI_SHELL_OVERLAY_Z_INDEX","useIsSideNavCollapsedSessionStorage","useMountLifecycleEffect","jsx","_jsx","jsxs","_jsxs","SIDE_NAV_COLLAPSED_PADDING_HIGHLIGHTED","SIDE_NAV_COLLAPSED_PADDING_UNHIGHLIGHTED","StyledCollapsibleContent","shouldForwardProp","prop","odysseyDesignTokens","isSideNavCollapsed","position","display","gridTemplateColumns","height","transition","TransitionDurationMain","transitionTimingFunction","TransitionTimingMain","overflow","opacity","StyledOpacityTransitionContainer","gridTemplateRows","StyledSideNavContainer","backgroundColor","hasNeighboringContent","isAppContentWhiteBackground","isSideNavToggleHighlighted","HueNeutralWhite","width","content","pointerEvents","right","BorderWidthMain","top","userSelect","zIndex","BorderColorPrimaryControl","HueNeutral100","HueNeutral200","transform","borderRightColor","borderRightStyle","BorderStyleMain","borderRightWidth","StyledSideNavToggleButtonContainer","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","boxShadow","StyledSideNavFooterItemsContainer","sideNavContrastColors","flexWrap","alignItems","fontSize","TypographySizeOverline","fontColor","textDecoration","HueNeutral900","StyledLoadingItemContainer","gap","getHasScrollableContent","scrollableContainer","scrollHeight","clientHeight","LoadingItem","children","_Skeleton","variant","SideNav","appName","footerComponent","footerItems","hasCustomFooter","isCollapsible","isCollapsed","isCompact","isLoading","isObtrusive","logoProps","onCollapse","onExpand","onSort","sideNavItems","setHasContentScrolled","setHasNeighboringContent","setIsContentScrollable","setIsSideNavToggleHighlighted","sideNavItemsList","updateSideNavItemsList","sessionState","setSessionState","setIsSideNavCollapsed","uiShellContext","t","scrollableContentRef","resizeObserverRef","intersectionObserverRef","sideNavRef","blankElement","current","getBoundingClientRect","x","onMount","onUpdate","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","Provider","value","onItemSelected","scrollRef","translate","sideNavExpandClickHandler","sideNavExpandKeyHandler","event","key","code","preventDefault","unsubscribe","subscribeToCloseSideNavMenu","setSortedItems","parentId","activeId","activeIndex","overIndex","sortedSideNavItems","onSideNavToggleButtonHighlight","isHighlighted","appBackgroundColor","ref","clickAreaPadding","ariaControls","onClick","onHighlight","onKeyDown","role","fill","_","index","href","isDefaultExpanded","isExpanded","isSectionHeader","label","startIcon","fallback","component","nestedChildren","items","onChange","renderItem","sortableItem","Item","disabled","MemoizedSideNav","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 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(sideNavItems);\n\n const {\n sessionState: isSideNavCollapsed,\n setSessionState: setIsSideNavCollapsed,\n } = useIsSideNavCollapsedSessionStorage(isCollapsed);\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`.\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 uiShellContext?.closeSideNavMenu();\n }\n },\n [isCollapsed, isObtrusive, sideNavItemsList, uiShellContext],\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 +1 @@
1
- {"version":3,"file":"types.js","names":[],"sources":["../../../../src/ui-shell/SideNav/types.ts"],"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 type { ReactElement, SyntheticEvent } from \"react\";\n\nimport type { HtmlProps } from \"../../HtmlProps.js\";\nimport type { statusSeverityValues } from \"../../Status.js\";\nimport { UniqueIdentifier } from \"@dnd-kit/core\";\n\ntype LogoWithLink = {\n href: string;\n ariaLabel: string;\n};\ntype LogoWithNoLink = {\n href?: never;\n ariaLabel?: never;\n};\n\nexport type SideNavLogoProps = {\n isSameBackgroundAsMain?: boolean;\n /**\n * Event fired when the logo is clicked\n */\n onClick?: (event: SyntheticEvent) => void;\n} & (LogoWithLink | LogoWithNoLink) &\n (\n | {\n /**\n * a component to render as the logo\n */\n logoComponent: ReactElement;\n imageAltText?: never;\n imageUrl?: never;\n }\n | {\n /**\n * The src url to render in an `img` tag\n */\n imageUrl: string;\n /**\n * alt text for the img logo\n */\n imageAltText: string;\n logoComponent?: never;\n }\n | {\n /**\n * The src url to render in an `img` tag\n */\n imageUrl?: never;\n /**\n * alt text for the img logo\n */\n imageAltText?: never;\n logoComponent?: never;\n }\n );\n\nexport type SideNavProps = {\n /**\n * Side Nav header text that is usually reserved to show the App name\n */\n appName?: string;\n /**\n * Determines whether the side nav is collapsible\n */\n isCollapsible?: boolean;\n /**\n * Determines whether the side nav is collapsed by default. When `true`, side nav also closes once and item is clicked.\n */\n isCollapsed?: boolean;\n /**\n * Determines whether the side nav items use compact layout\n */\n isCompact?: boolean;\n /**\n * Before the side nav has items, it will be in a loading state.\n */\n isLoading?: boolean;\n /**\n * If the side nav is up too much screen real estate. For instance, if you're in a narrower view, and it displays next to the content.\n *\n * When `true`, side nav will close itself after nav items are clicked.\n */\n isObtrusive?: boolean;\n /**\n * An optional logo component or src string for an img to display in the header. If not provided, will default to the Okta logo\n */\n logoProps?: SideNavLogoProps;\n /**\n * Triggers when the side nav is collapsed\n */\n onCollapse?: () => void;\n /**\n * Triggers when the side nav is expanded\n */\n onExpand?: () => void;\n /**\n * Triggers when the item is reordered\n */\n onSort?: (\n reorderedItems: SideNavItem[],\n parentId: string,\n activeId: UniqueIdentifier,\n activeIndex: number,\n overIndex: number,\n ) => void;\n /**\n * Nav items in the side nav\n */\n sideNavItems: SideNavItem[];\n} & (\n | {\n /**\n * The component to display as the footer; if present the `footerItems` are ignored and not rendered.\n */\n footerComponent?: ReactElement;\n footerItems?: never;\n hasCustomFooter: true;\n }\n | {\n footerComponent?: never;\n /**\n * Footer items in the side nav\n */\n footerItems?: SideNavFooterItem[];\n hasCustomFooter?: false;\n }\n) &\n Pick<HtmlProps, \"testId\">;\n\nexport type SideNavItem = {\n /**\n * The number to display as a count alongside the nav item\n */\n count?: number;\n /**\n * The icon element to display after the nav item text. Only use this with images that don't have React context. Even the official Odyssey Icons use MUI which references the MUI theme in context and will error when rendered in Unified UI Shell.\n */\n endIcon?: ReactElement;\n id: string;\n /**\n * Whether the item is disabled. When set to true the nav item is set to Disabled color,\n * the link/item is not clickable, and item with nestedNavItems is not expandable.\n */\n isDisabled?: boolean;\n /**\n * Whether the item is active/selected\n */\n isSelected?: boolean;\n /**\n * Whether the item is sortable within a sortable list\n */\n isSortable?: boolean;\n label: string;\n /**\n * Event fired when the nav item is clicked\n */\n onClick?: (event: SyntheticEvent) => void;\n /**\n * The status element to display after the label\n */\n severity?: (typeof statusSeverityValues)[number];\n /**\n * The icon element to display before the nav item text. Only use this with images that don't have React context. Even the official Odyssey Icons use MUI which references the MUI theme in context and will error when rendered in Unified UI Shell.\n */\n startIcon?: ReactElement;\n /**\n * The label to display inside the status\n */\n statusLabel?: string;\n /**\n * The link target prop. e.g., \"_blank\"\n */\n target?: string;\n} & (\n | {\n nestedNavItems?: never;\n href?: never;\n isDefaultExpanded?: never;\n isExpanded?: never;\n /**\n * Determines if the side nav item is a section header\n */\n isSectionHeader: true;\n }\n | {\n nestedNavItems?: never;\n /**\n * link added to the nav item. if it is undefined, static text will be displayed.\n * fires onClick event when it is passed\n */\n href?: string;\n isDefaultExpanded?: never;\n isExpanded?: never;\n isSectionHeader?: never;\n }\n | {\n /**\n * An array of side nav items to be displayed as nestedNavItems within Accordion\n */\n nestedNavItems: Array<Omit<SideNavItem, \"nestedNavItems\" | \"startIcon\">>;\n href?: never;\n /**\n * Whether the accordion (nav item with nestedNavItems) is expanded by default\n */\n isDefaultExpanded?: boolean;\n /**\n * If true, expands the accordion, otherwise collapse it.\n * Setting this prop enables control over the accordion.\n */\n isExpanded?: boolean;\n /**\n * If true, enables sorting for the accordion items\n */\n isSectionHeader?: never;\n }\n) &\n Pick<HtmlProps, \"translate\">;\n\nexport type SideNavFooterItem = {\n href?: string;\n id: string;\n label: string;\n};\n"],"mappings":"","ignoreList":[]}
1
+ {"version":3,"file":"types.js","names":[],"sources":["../../../../src/ui-shell/SideNav/types.ts"],"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 type { ReactElement, SyntheticEvent } from \"react\";\n\nimport type { HtmlProps } from \"../../HtmlProps.js\";\nimport type { statusSeverityValues } from \"../../Status.js\";\nimport { UniqueIdentifier } from \"@dnd-kit/core\";\n\ntype LogoWithLink = {\n href: string;\n ariaLabel: string;\n};\ntype LogoWithNoLink = {\n href?: never;\n ariaLabel?: never;\n};\n\nexport type SideNavLogoProps = {\n isSameBackgroundAsMain?: boolean;\n /**\n * Event fired when the logo is clicked\n */\n onClick?: (event: SyntheticEvent) => void;\n} & (LogoWithLink | LogoWithNoLink) &\n (\n | {\n /**\n * a component to render as the logo\n */\n logoComponent: ReactElement;\n imageAltText?: never;\n imageUrl?: never;\n }\n | {\n /**\n * The src url to render in an `img` tag\n */\n imageUrl: string;\n /**\n * alt text for the img logo\n */\n imageAltText: string;\n logoComponent?: never;\n }\n | {\n /**\n * The src url to render in an `img` tag\n */\n imageUrl?: never;\n /**\n * alt text for the img logo\n */\n imageAltText?: never;\n logoComponent?: never;\n }\n );\n\nexport type SideNavProps = {\n /**\n * Side Nav header text that is usually reserved to show the App name\n */\n appName?: string;\n /**\n * Determines whether the side nav is collapsible\n */\n isCollapsible?: boolean;\n /**\n * Determines whether the side nav is collapsed by default. When `true`, side nav also closes once and item is clicked.\n */\n isCollapsed?: boolean;\n /**\n * Determines whether the side nav items use compact layout\n */\n isCompact?: boolean;\n /**\n * Before the side nav has items, it will be in a loading state.\n */\n isLoading?: boolean;\n /**\n * If the side nav is up too much screen real estate. For instance, if you're in a narrower view, and it displays next to the content.\n *\n * When `true`, side nav will close itself after nav items are clicked.\n */\n isObtrusive?: boolean;\n /**\n * An optional logo component or src string for an img to display in the header. If not provided, will default to the Okta logo\n */\n logoProps?: SideNavLogoProps;\n /**\n * Triggers when the side nav is collapsed\n */\n onCollapse?: () => void;\n /**\n * Triggers when the side nav is expanded\n */\n onExpand?: () => void;\n /**\n * Triggers when the item is reordered\n */\n onSort?: (\n reorderedItems: SideNavItem[],\n parentId: string,\n activeId: UniqueIdentifier,\n activeIndex: number,\n overIndex: number,\n ) => void;\n /**\n * Nav items in the side nav\n */\n sideNavItems: SideNavItem[];\n} & (\n | {\n /**\n * The component to display as the footer; if present the `footerItems` are ignored and not rendered.\n */\n footerComponent?: ReactElement;\n footerItems?: never;\n hasCustomFooter: true;\n }\n | {\n footerComponent?: never;\n /**\n * Footer items in the side nav\n */\n footerItems?: SideNavFooterItem[];\n hasCustomFooter?: false;\n }\n) &\n Pick<HtmlProps, \"testId\">;\n\nexport type SideNavItem = {\n /**\n * The number to display as a count alongside the nav item\n */\n count?: number;\n /**\n * The icon element to display after the nav item text. Only use this with images that don't have React context. Even the official Odyssey Icons use MUI which references the MUI theme in context and will error when rendered in Unified UI Shell.\n */\n endIcon?: ReactElement;\n id: string;\n /**\n * Whether the item is disabled. When set to true the nav item is set to Disabled color,\n * the link/item is not clickable, and item with nestedNavItems is not expandable.\n */\n isDisabled?: boolean;\n /**\n * Whether the item is active/selected\n */\n isSelected?: boolean;\n /**\n * Whether the item is sortable within a sortable list\n */\n isSortable?: boolean;\n label: string;\n /**\n * Event fired when the nav item is clicked\n */\n onClick?: (event: SyntheticEvent) => void;\n /**\n * The status element to display after the label\n */\n severity?: (typeof statusSeverityValues)[number];\n /**\n * The icon element to display before the nav item text. Only use this with images that don't have React context. Even the official Odyssey Icons use MUI which references the MUI theme in context and will error when rendered in Unified UI Shell.\n */\n startIcon?: ReactElement;\n /**\n * The label to display inside the status\n */\n statusLabel?: string;\n /**\n * The link target prop. e.g., \"_blank\"\n */\n target?: string;\n} & (\n | {\n nestedNavItems?: never;\n href?: never;\n isDefaultExpanded?: never;\n isExpanded?: never;\n /**\n * Determines if the side nav item is a section header\n */\n isSectionHeader: true;\n }\n | {\n nestedNavItems?: never;\n /**\n * link added to the nav item. if it is undefined, static text will be displayed.\n * fires onClick event when it is passed\n */\n href?: string;\n isDefaultExpanded?: never;\n isExpanded?: never;\n isSectionHeader?: never;\n }\n | {\n href?: never;\n /**\n * Whether the accordion (nav item with nestedNavItems) is expanded by default\n */\n isDefaultExpanded?: boolean;\n /**\n * If true, expands the accordion, otherwise collapse it.\n * Setting this prop enables control over the accordion.\n */\n isExpanded?: boolean;\n /**\n * If true, enables sorting for the accordion items\n */\n isSectionHeader?: never;\n /**\n * An array of side nav items to be displayed as nestedNavItems within Accordion\n */\n nestedNavItems: Array<Omit<SideNavItem, \"nestedNavItems\" | \"startIcon\">>;\n }\n | {\n href: string;\n isDefaultExpanded?: never;\n isExpanded?: never;\n isSectionHeader?: never;\n /**\n * An array of side nav items to be displayed as nestedNavItems within Accordion\n */\n nestedNavItems: Array<Omit<SideNavItem, \"nestedNavItems\" | \"startIcon\">>;\n }\n) &\n Pick<HtmlProps, \"translate\">;\n\nexport type SideNavFooterItem = {\n href?: string;\n id: string;\n label: string;\n};\n"],"mappings":"","ignoreList":[]}
@@ -0,0 +1,19 @@
1
+ /*!
2
+ * Copyright (c) 2025-present, Okta, Inc. and/or its affiliates. All rights reserved.
3
+ * The Okta software accompanied by this notice is provided pursuant to the Apache License, Version 2.0 (the "License.")
4
+ *
5
+ * You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0.
6
+ * Unless required by applicable law or agreed to in writing, software
7
+ * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
8
+ * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
9
+ *
10
+ * See the License for the specific language governing permissions and limitations under the License.
11
+ */
12
+
13
+ import { useSessionStorageState } from "../../useSessionStorageState.js";
14
+ export const sessionStorageKey = "__uiShell-sideNav-isCollapsed";
15
+ export const useIsSideNavCollapsedSessionStorage = isSideNavInitiallyCollapsed => useSessionStorageState({
16
+ initialState: isSideNavInitiallyCollapsed,
17
+ key: sessionStorageKey
18
+ });
19
+ //# sourceMappingURL=useIsSideNavCollapsedSessionStorage.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useIsSideNavCollapsedSessionStorage.js","names":["useSessionStorageState","sessionStorageKey","useIsSideNavCollapsedSessionStorage","isSideNavInitiallyCollapsed","initialState","key"],"sources":["../../../../src/ui-shell/SideNav/useIsSideNavCollapsedSessionStorage.ts"],"sourcesContent":["/*!\n * Copyright (c) 2025-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 { useSessionStorageState } from \"../../useSessionStorageState.js\";\n\nexport const sessionStorageKey = \"__uiShell-sideNav-isCollapsed\";\n\nexport const useIsSideNavCollapsedSessionStorage = (\n isSideNavInitiallyCollapsed: boolean,\n) =>\n useSessionStorageState({\n initialState: isSideNavInitiallyCollapsed,\n key: sessionStorageKey,\n });\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,SAASA,sBAAsB,QAAQ,iCAAiC;AAExE,OAAO,MAAMC,iBAAiB,GAAG,+BAA+B;AAEhE,OAAO,MAAMC,mCAAmC,GAC9CC,2BAAoC,IAEpCH,sBAAsB,CAAC;EACrBI,YAAY,EAAED,2BAA2B;EACzCE,GAAG,EAAEJ;AACP,CAAC,CAAC","ignoreList":[]}
@@ -21,5 +21,5 @@ export * from "./useHasUiShell.js";
21
21
  export * from "./WideUiShellContent.js";
22
22
  export * from "../web-component/renderReactInWebComponent.js";
23
23
  export { UiShell } from "./UiShell.js";
24
- export { adminAppUiShellBreakpoints } from "./useUiShellBreakpoints.js";
24
+ export { adminAppUiShellBreakpoints, useUiShellBreakpoints } from "./useUiShellBreakpoints.js";
25
25
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["UiShell","adminAppUiShellBreakpoints"],"sources":["../../../src/ui-shell/index.ts"],"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\nexport * from \"./AppSwitcher/index.js\";\nexport * from \"./InnerAppContainer.js\";\nexport * from \"./NarrowUiShellContent.js\";\nexport * from \"./renderUiShell.js\";\nexport * from \"./SideNav/index.js\";\nexport * from \"./TopNav/index.js\";\nexport * from \"./uiShellContentTypes.js\";\nexport * from \"./useHasUiShell.js\";\nexport * from \"./WideUiShellContent.js\";\n\nexport * from \"../web-component/renderReactInWebComponent.js\"; // This is located here because some teams use React v17, and this uses React v18's `ReactDOM/client` import which isn't in older versions.\n\nexport { UiShell, type UiShellProps } from \"./UiShell.js\";\nexport { adminAppUiShellBreakpoints } from \"./useUiShellBreakpoints.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,wBAAwB;AACtC,cAAc,wBAAwB;AACtC,cAAc,2BAA2B;AACzC,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,mBAAmB;AACjC,cAAc,0BAA0B;AACxC,cAAc,oBAAoB;AAClC,cAAc,yBAAyB;AAEvC,cAAc,+CAA+C;AAE7D,SAASA,OAAO,QAA2B,cAAc;AACzD,SAASC,0BAA0B,QAAQ,4BAA4B","ignoreList":[]}
1
+ {"version":3,"file":"index.js","names":["UiShell","adminAppUiShellBreakpoints","useUiShellBreakpoints"],"sources":["../../../src/ui-shell/index.ts"],"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\nexport * from \"./AppSwitcher/index.js\";\nexport * from \"./InnerAppContainer.js\";\nexport * from \"./NarrowUiShellContent.js\";\nexport * from \"./renderUiShell.js\";\nexport * from \"./SideNav/index.js\";\nexport * from \"./TopNav/index.js\";\nexport * from \"./uiShellContentTypes.js\";\nexport * from \"./useHasUiShell.js\";\nexport * from \"./WideUiShellContent.js\";\n\nexport * from \"../web-component/renderReactInWebComponent.js\"; // This is located here because some teams use React v17, and this uses React v18's `ReactDOM/client` import which isn't in older versions.\n\nexport { UiShell, type UiShellProps } from \"./UiShell.js\";\nexport {\n adminAppUiShellBreakpoints,\n useUiShellBreakpoints,\n} from \"./useUiShellBreakpoints.js\";\n"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AAEA,cAAc,wBAAwB;AACtC,cAAc,wBAAwB;AACtC,cAAc,2BAA2B;AACzC,cAAc,oBAAoB;AAClC,cAAc,oBAAoB;AAClC,cAAc,mBAAmB;AACjC,cAAc,0BAA0B;AACxC,cAAc,oBAAoB;AAClC,cAAc,yBAAyB;AAEvC,cAAc,+CAA+C;AAE7D,SAASA,OAAO,QAA2B,cAAc;AACzD,SACEC,0BAA0B,EAC1BC,qBAAqB,QAChB,4BAA4B","ignoreList":[]}