@servicetitan/navigation 14.2.0 → 14.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (97) hide show
  1. package/dist/components/titan-layout/__tests__/layout-sidebar-links-internal.test.d.ts +2 -0
  2. package/dist/components/titan-layout/__tests__/layout-sidebar-links-internal.test.d.ts.map +1 -0
  3. package/dist/components/titan-layout/__tests__/navigation-catalog-reset.test.d.ts +2 -0
  4. package/dist/components/titan-layout/__tests__/navigation-catalog-reset.test.d.ts.map +1 -0
  5. package/dist/components/titan-layout/interface.d.ts +66 -0
  6. package/dist/components/titan-layout/interface.d.ts.map +1 -1
  7. package/dist/components/titan-layout/interface.js.map +1 -1
  8. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts +3 -0
  9. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts.map +1 -1
  10. package/dist/components/titan-layout/layout-sidebar-links-internal.js +58 -13
  11. package/dist/components/titan-layout/layout-sidebar-links-internal.js.map +1 -1
  12. package/dist/components/titan-layout/layout-sidebar.d.ts +14 -0
  13. package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -1
  14. package/dist/components/titan-layout/layout-sidebar.js +169 -97
  15. package/dist/components/titan-layout/layout-sidebar.js.map +1 -1
  16. package/dist/components/titan-layout/layout-sidebar.module.less +230 -144
  17. package/dist/components/titan-layout/layout-sidebar.module.less.d.ts +16 -5
  18. package/dist/components/titan-layout/navigation-catalog/index.d.ts +3 -0
  19. package/dist/components/titan-layout/navigation-catalog/index.d.ts.map +1 -0
  20. package/dist/components/titan-layout/navigation-catalog/index.js +4 -0
  21. package/dist/components/titan-layout/navigation-catalog/index.js.map +1 -0
  22. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-footer.d.ts +8 -0
  23. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-footer.d.ts.map +1 -0
  24. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-footer.js +88 -0
  25. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-footer.js.map +1 -0
  26. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-trigger.d.ts +21 -0
  27. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-trigger.d.ts.map +1 -0
  28. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-trigger.js +138 -0
  29. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-trigger.js.map +1 -0
  30. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-trigger.module.less +89 -0
  31. package/dist/components/titan-layout/navigation-catalog/navigation-catalog-trigger.module.less.d.ts +9 -0
  32. package/dist/components/titan-layout/navigation-catalog/navigation-catalog.d.ts +14 -0
  33. package/dist/components/titan-layout/navigation-catalog/navigation-catalog.d.ts.map +1 -0
  34. package/dist/components/titan-layout/navigation-catalog/navigation-catalog.js +343 -0
  35. package/dist/components/titan-layout/navigation-catalog/navigation-catalog.js.map +1 -0
  36. package/dist/components/titan-layout/navigation-catalog/navigation-catalog.module.less +379 -0
  37. package/dist/components/titan-layout/navigation-catalog/navigation-catalog.module.less.d.ts +26 -0
  38. package/dist/components/titan-layout/navigation-scroll-indicators.d.ts +12 -0
  39. package/dist/components/titan-layout/navigation-scroll-indicators.d.ts.map +1 -0
  40. package/dist/components/titan-layout/navigation-scroll-indicators.js +48 -0
  41. package/dist/components/titan-layout/navigation-scroll-indicators.js.map +1 -0
  42. package/dist/components/titan-layout/titan-layout.d.ts +29 -1
  43. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -1
  44. package/dist/components/titan-layout/titan-layout.js +46 -6
  45. package/dist/components/titan-layout/titan-layout.js.map +1 -1
  46. package/dist/components/titan-layout/titan-layout.module.less +2 -1
  47. package/dist/components/titan-layout/use-navigation-scroll.d.ts +20 -0
  48. package/dist/components/titan-layout/use-navigation-scroll.d.ts.map +1 -0
  49. package/dist/components/titan-layout/use-navigation-scroll.js +140 -0
  50. package/dist/components/titan-layout/use-navigation-scroll.js.map +1 -0
  51. package/dist/utils/__tests__/catalog-groups.test.d.ts +2 -0
  52. package/dist/utils/__tests__/catalog-groups.test.d.ts.map +1 -0
  53. package/dist/utils/__tests__/navigation-notifications.test.d.ts +2 -0
  54. package/dist/utils/__tests__/navigation-notifications.test.d.ts.map +1 -0
  55. package/dist/utils/__tests__/submenu-state.test.d.ts +2 -0
  56. package/dist/utils/__tests__/submenu-state.test.d.ts.map +1 -0
  57. package/dist/utils/catalog-groups.d.ts +11 -0
  58. package/dist/utils/catalog-groups.d.ts.map +1 -0
  59. package/dist/utils/catalog-groups.js +66 -0
  60. package/dist/utils/catalog-groups.js.map +1 -0
  61. package/dist/utils/navigation-notifications.d.ts +21 -0
  62. package/dist/utils/navigation-notifications.d.ts.map +1 -0
  63. package/dist/utils/navigation-notifications.js +39 -0
  64. package/dist/utils/navigation-notifications.js.map +1 -0
  65. package/dist/utils/side-nav.js +3 -1
  66. package/dist/utils/side-nav.js.map +1 -1
  67. package/dist/utils/submenu-state.d.ts +3 -0
  68. package/dist/utils/submenu-state.d.ts.map +1 -0
  69. package/dist/utils/submenu-state.js +15 -0
  70. package/dist/utils/submenu-state.js.map +1 -0
  71. package/package.json +2 -2
  72. package/src/components/titan-layout/__tests__/layout-sidebar-links-internal.test.tsx +225 -0
  73. package/src/components/titan-layout/__tests__/navigation-catalog-reset.test.tsx +190 -0
  74. package/src/components/titan-layout/interface.ts +73 -0
  75. package/src/components/titan-layout/layout-sidebar-links-internal.tsx +86 -14
  76. package/src/components/titan-layout/layout-sidebar.module.less +230 -144
  77. package/src/components/titan-layout/layout-sidebar.module.less.d.ts +16 -5
  78. package/src/components/titan-layout/layout-sidebar.tsx +193 -117
  79. package/src/components/titan-layout/navigation-catalog/index.ts +2 -0
  80. package/src/components/titan-layout/navigation-catalog/navigation-catalog-footer.tsx +88 -0
  81. package/src/components/titan-layout/navigation-catalog/navigation-catalog-trigger.module.less +89 -0
  82. package/src/components/titan-layout/navigation-catalog/navigation-catalog-trigger.module.less.d.ts +9 -0
  83. package/src/components/titan-layout/navigation-catalog/navigation-catalog-trigger.tsx +170 -0
  84. package/src/components/titan-layout/navigation-catalog/navigation-catalog.module.less +379 -0
  85. package/src/components/titan-layout/navigation-catalog/navigation-catalog.module.less.d.ts +26 -0
  86. package/src/components/titan-layout/navigation-catalog/navigation-catalog.tsx +430 -0
  87. package/src/components/titan-layout/navigation-scroll-indicators.tsx +80 -0
  88. package/src/components/titan-layout/titan-layout.module.less +2 -1
  89. package/src/components/titan-layout/titan-layout.tsx +81 -5
  90. package/src/components/titan-layout/use-navigation-scroll.ts +145 -0
  91. package/src/utils/__tests__/catalog-groups.test.ts +97 -0
  92. package/src/utils/__tests__/navigation-notifications.test.ts +70 -0
  93. package/src/utils/__tests__/submenu-state.test.ts +39 -0
  94. package/src/utils/catalog-groups.ts +57 -0
  95. package/src/utils/navigation-notifications.ts +59 -0
  96. package/src/utils/side-nav.ts +1 -1
  97. package/src/utils/submenu-state.ts +16 -0
@@ -1,22 +1,108 @@
1
1
  import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
- import { Divider, Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';
2
+ import { Button, Divider, Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';
3
3
  import SvgClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';
4
+ import SvgCollapseAll from '@servicetitan/anvil2/assets/icons/material/round/unfold_less.svg';
5
+ import SvgExpandAll from '@servicetitan/anvil2/assets/icons/material/round/unfold_more.svg';
4
6
  import SvgCollapse from '@servicetitan/anvil2/assets/icons/st/gnav_menu_collapse.svg';
5
7
  import SvgExpand from '@servicetitan/anvil2/assets/icons/st/gnav_menu_expand.svg';
6
8
  import classNames from 'classnames';
7
9
  import { Children, Fragment, isValidElement } from 'react';
10
+ import { getModuleNotificationCount } from '../../utils/navigation-notifications';
8
11
  import { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';
9
12
  import { LayoutPlacementContext, useTitanLayoutContext } from './layout-context';
10
13
  import { InternalSideNavigationGroup, InternalSideNavigationGroupLink, InternalSideNavigationLink } from './layout-sidebar-links-internal';
11
14
  import * as Styles from './layout-sidebar.module.less';
15
+ import { NavigationCatalogTrigger } from './navigation-catalog';
16
+ import { NavigationScrollIndicators } from './navigation-scroll-indicators';
17
+ import { useNavigationScroll } from './use-navigation-scroll';
12
18
  import { withTooltip } from './with-tooltip';
13
- export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, submenusOpened, drawerOpened, onBarExpandChange, onSubmenuOpenChange, onDrawerOpenChange, onNavigationLinkClick, mainItems, top, bottom, navigationComponent })=>{
19
+ export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, submenusOpened, drawerOpened, onBarExpandChange, onSubmenuOpenChange, onSubmenusOpenChange, onDrawerOpenChange, onNavigationLinkClick, mainItems, pinnedNavigation, top, topItems, scrollIndicators, bottom, navigationComponent })=>{
20
+ const { regionRef, scrollRef, revealNotification, ...scrollOverflow } = useNavigationScroll(scrollIndicators);
14
21
  const closeDrawer = ()=>{
15
22
  if (mobile) {
16
23
  onDrawerOpenChange === null || onDrawerOpenChange === void 0 ? void 0 : onDrawerOpenChange(false);
17
24
  }
18
25
  };
19
26
  const effectiveExpanded = mobile ? drawerOpened : barExpanded;
27
+ /*
28
+ * Both regions, because a destination above the divider expands exactly like one below it.
29
+ * Counting only `mainItems` would let Expand All skip those groups — and hide the control
30
+ * entirely on a rail whose only expandable modules sit up there.
31
+ */ const expandableIds = [
32
+ ...topItems !== null && topItems !== void 0 ? topItems : [],
33
+ ...mainItems !== null && mainItems !== void 0 ? mainItems : []
34
+ ].filter((item)=>{
35
+ var _item_submenu;
36
+ return (_item_submenu = item.submenu) === null || _item_submenu === void 0 ? void 0 : _item_submenu.groups.some((group)=>group.links.length > 0);
37
+ }).map((item)=>item.id);
38
+ const hasOpenSubmenus = expandableIds.some((id)=>submenusOpened === null || submenusOpened === void 0 ? void 0 : submenusOpened.includes(id));
39
+ const toggleAllLabel = hasOpenSubmenus ? 'Collapse All' : 'Expand All';
40
+ const toggleAll = effectiveExpanded && expandableIds.length > 0 && onSubmenusOpenChange ? withTooltip(/*#__PURE__*/ _jsx(Button, {
41
+ appearance: "secondary",
42
+ size: "small",
43
+ icon: hasOpenSubmenus ? SvgCollapseAll : SvgExpandAll,
44
+ "aria-label": toggleAllLabel,
45
+ "aria-expanded": hasOpenSubmenus,
46
+ "data-cy": "navigation-toggle-all",
47
+ "data-pendo": "navigation-toggle-all",
48
+ onClick: (event)=>{
49
+ event.stopPropagation();
50
+ onSubmenusOpenChange(expandableIds, !hasOpenSubmenus);
51
+ }
52
+ }), toggleAllLabel, {
53
+ placement: 'top'
54
+ }) : undefined;
55
+ const scrollHeader = !mobile && !barExpanded;
56
+ const navigationHeader = /*#__PURE__*/ _jsxs("div", {
57
+ className: Styles.navHeader,
58
+ children: [
59
+ mobile && /*#__PURE__*/ _jsx("div", {
60
+ className: Styles.navCloseWrapper,
61
+ children: /*#__PURE__*/ _jsx("div", {
62
+ className: Styles.navClose,
63
+ onClick: ()=>onBarExpandChange(false),
64
+ children: /*#__PURE__*/ _jsx(Icon, {
65
+ svg: SvgClose,
66
+ size: "large"
67
+ })
68
+ })
69
+ }),
70
+ pinnedNavigation && /*#__PURE__*/ _jsx(NavigationCatalogTrigger, {
71
+ expanded: effectiveExpanded,
72
+ ...pinnedNavigation,
73
+ trailingAction: toggleAll
74
+ }),
75
+ !pinnedNavigation && toggleAll && /*#__PURE__*/ _jsx("div", {
76
+ className: Styles.navTools,
77
+ children: toggleAll
78
+ })
79
+ ]
80
+ });
81
+ /*
82
+ * Shared by the region above the divider and the list below it, so a destination renders the
83
+ * same way wherever the host puts it. Two copies of this branch would drift.
84
+ */ const renderItems = (items)=>items === null || items === void 0 ? void 0 : items.map((item)=>{
85
+ var _item_collapsedTitle;
86
+ return item.submenu ? /*#__PURE__*/ _jsx(SideNavigationGroupItem, {
87
+ item: item,
88
+ barExpanded: effectiveExpanded,
89
+ submenuOpened: !!item.id && !!(submenusOpened === null || submenusOpened === void 0 ? void 0 : submenusOpened.includes(item.id)),
90
+ onSubmenuOpen: onSubmenuOpenChange,
91
+ navigationComponent: navigationComponent,
92
+ onNavigationLinkClick: onNavigationLinkClick,
93
+ touchDevice: touchDevice
94
+ }, item.id) : /*#__PURE__*/ _jsx(InternalSideNavigationLink, {
95
+ id: item.id,
96
+ to: item.to,
97
+ title: effectiveExpanded ? item.title : (_item_collapsedTitle = item.collapsedTitle) !== null && _item_collapsedTitle !== void 0 ? _item_collapsedTitle : item.title,
98
+ isActive: item.isActive,
99
+ icon: item.icon,
100
+ iconActive: item.iconActive,
101
+ className: item.className,
102
+ tag: getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag)),
103
+ navigationComponent: navigationComponent
104
+ }, item.id);
105
+ });
20
106
  return /*#__PURE__*/ _jsxs(LayoutPlacementContext.Provider, {
21
107
  value: "side",
22
108
  children: [
@@ -31,53 +117,48 @@ export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, sub
31
117
  children: [
32
118
  /*#__PURE__*/ _jsxs(ThemeProvider, {
33
119
  mode: "dark",
34
- className: Styles.navMain,
120
+ className: Styles.navContent,
35
121
  children: [
36
- mobile && /*#__PURE__*/ _jsx("div", {
37
- className: Styles.navCloseWrapper,
38
- children: /*#__PURE__*/ _jsx("div", {
39
- className: Styles.navClose,
40
- onClick: ()=>onBarExpandChange(false),
41
- children: /*#__PURE__*/ _jsx(Icon, {
42
- svg: SvgClose,
43
- size: "large"
122
+ !scrollHeader && navigationHeader,
123
+ /*#__PURE__*/ _jsxs("div", {
124
+ ref: regionRef,
125
+ className: Styles.navScrollRegion,
126
+ children: [
127
+ /*#__PURE__*/ _jsx("div", {
128
+ ref: scrollRef,
129
+ className: Styles.navMain,
130
+ "data-cy": "navigation-scroll",
131
+ children: /*#__PURE__*/ _jsxs("div", {
132
+ children: [
133
+ scrollHeader && navigationHeader,
134
+ (!!(top === null || top === void 0 ? void 0 : top.length) || !!(topItems === null || topItems === void 0 ? void 0 : topItems.length)) && /*#__PURE__*/ _jsxs(SidebarTop, {
135
+ children: [
136
+ renderItems(topItems),
137
+ top
138
+ ]
139
+ }),
140
+ /*#__PURE__*/ _jsx("div", {
141
+ className: Styles.navItems,
142
+ "data-cy": "navigation-items",
143
+ children: renderItems(mainItems)
144
+ }),
145
+ !!bottom && /*#__PURE__*/ _jsx(SidebarBottom, {
146
+ children: bottom
147
+ })
148
+ ]
149
+ })
150
+ }),
151
+ scrollIndicators && /*#__PURE__*/ _jsx(NavigationScrollIndicators, {
152
+ ...scrollOverflow,
153
+ expanded: effectiveExpanded,
154
+ onReveal: revealNotification
44
155
  })
45
- })
46
- }),
47
- !!(top === null || top === void 0 ? void 0 : top.length) && /*#__PURE__*/ _jsx(SidebarTop, {
48
- children: top
49
- }),
50
- /*#__PURE__*/ _jsx("div", {
51
- "data-cy": "navigation-items",
52
- children: mainItems === null || mainItems === void 0 ? void 0 : mainItems.map((item)=>{
53
- var _item_collapsedTitle;
54
- return item.submenu ? /*#__PURE__*/ _jsx(SideNavigationGroupItem, {
55
- item: item,
56
- barExpanded: effectiveExpanded,
57
- submenuOpened: !!item.id && !!(submenusOpened === null || submenusOpened === void 0 ? void 0 : submenusOpened.includes(item.id)),
58
- onSubmenuOpen: onSubmenuOpenChange,
59
- navigationComponent: navigationComponent,
60
- onNavigationLinkClick: onNavigationLinkClick,
61
- touchDevice: touchDevice
62
- }, item.id) : /*#__PURE__*/ _jsx(InternalSideNavigationLink, {
63
- id: item.id,
64
- to: item.to,
65
- title: effectiveExpanded ? item.title : (_item_collapsedTitle = item.collapsedTitle) !== null && _item_collapsedTitle !== void 0 ? _item_collapsedTitle : item.title,
66
- isActive: item.isActive,
67
- icon: item.icon,
68
- iconActive: item.iconActive,
69
- className: item.className,
70
- tag: getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag)),
71
- navigationComponent: navigationComponent
72
- }, item.id);
73
- })
74
- }),
75
- !!bottom && /*#__PURE__*/ _jsx(SidebarBottom, {
76
- children: bottom
156
+ ]
77
157
  })
78
158
  ]
79
159
  }),
80
- !mobile && /*#__PURE__*/ _jsxs("div", {
160
+ !mobile && /*#__PURE__*/ _jsxs(ThemeProvider, {
161
+ mode: "dark",
81
162
  className: Styles.navFooter,
82
163
  children: [
83
164
  /*#__PURE__*/ _jsx("div", {
@@ -86,7 +167,7 @@ export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, sub
86
167
  /*#__PURE__*/ _jsx("div", {
87
168
  className: Styles.toggleWrapper,
88
169
  children: /*#__PURE__*/ _jsx(SideNavigationOptionsToggle, {
89
- appearance: barExpanded ? 'collapse-button' : 'expand',
170
+ expanded: barExpanded,
90
171
  onExpandedChange: ()=>onBarExpandChange(!barExpanded)
91
172
  })
92
173
  })
@@ -98,37 +179,17 @@ export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, sub
98
179
  });
99
180
  };
100
181
  LayoutSidebar.displayName = 'LayoutSidebar';
101
- /** Side Navigation options toggle */ const SideNavigationOptionsToggle = ({ appearance, onExpandedChange })=>withTooltip(/*#__PURE__*/ _jsx("div", {
102
- role: "button",
103
- tabIndex: 0,
182
+ /** Side Navigation options toggle */ const SideNavigationOptionsToggle = ({ expanded, onExpandedChange })=>withTooltip(/*#__PURE__*/ _jsx(Button, {
183
+ appearance: "ghost",
184
+ size: "small",
185
+ icon: expanded ? SvgCollapse : SvgExpand,
104
186
  "data-cy": "navigation-left-options",
105
187
  "data-pendo": "navigation-left-options",
106
- "aria-label": appearance === 'expand' ? 'Expand Menu' : 'Collapse Menu',
107
- className: classNames(Styles.toggle),
108
- onClick: ()=>onExpandedChange === null || onExpandedChange === void 0 ? void 0 : onExpandedChange(appearance === 'expand'),
109
- onKeyDown: (e)=>{
110
- if (e.key === 'Enter' || e.key === ' ') {
111
- e.preventDefault();
112
- onExpandedChange === null || onExpandedChange === void 0 ? void 0 : onExpandedChange(appearance === 'expand');
113
- }
114
- },
115
- children: /*#__PURE__*/ _jsxs("div", {
116
- className: Styles.toggleContent,
117
- children: [
118
- /*#__PURE__*/ _jsx("div", {
119
- className: Styles.toggleIconWrapper,
120
- children: /*#__PURE__*/ _jsx(Icon, {
121
- className: Styles.toggleIcon,
122
- svg: appearance === 'expand' ? SvgExpand : SvgCollapse
123
- })
124
- }),
125
- appearance === 'collapse-button' && /*#__PURE__*/ _jsx("span", {
126
- className: Styles.toggleText,
127
- children: "Collapse Menu"
128
- })
129
- ]
130
- })
131
- }), appearance === 'expand' ? 'Expand Menu' : appearance === 'collapse' ? 'Collapse Menu' : undefined, {
188
+ "aria-label": expanded ? 'Collapse Menu' : 'Expand Menu',
189
+ "aria-expanded": expanded,
190
+ className: Styles.toggle,
191
+ onClick: ()=>onExpandedChange === null || onExpandedChange === void 0 ? void 0 : onExpandedChange(!expanded)
192
+ }), expanded ? 'Collapse Menu' : 'Expand Menu', {
132
193
  placement: 'right'
133
194
  });
134
195
  /** Side Navigation menu item */ const SideNavigationGroupItem = ({ item, onSubmenuOpen, onNavigationLinkClick, barExpanded, submenuOpened, navigationComponent, touchDevice })=>{
@@ -145,6 +206,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
145
206
  iconActive: item.iconActive,
146
207
  className: item.className,
147
208
  tag: tag,
209
+ notificationCount: getModuleNotificationCount(item, submenuOpened),
148
210
  submenuOpened: submenuOpened,
149
211
  onSubmenuOpen: onSubmenuOpen,
150
212
  navigationComponent: navigationComponent,
@@ -159,6 +221,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
159
221
  openOnHover: !touchDevice,
160
222
  delay: 200,
161
223
  noPadding: true,
224
+ disableCaret: true,
162
225
  children: [
163
226
  /*#__PURE__*/ _jsx(Popover.Trigger, {
164
227
  children: (triggerProps)=>{
@@ -174,6 +237,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
174
237
  iconActive: item.iconActive,
175
238
  className: classNames(item.className, touchDevice && Styles.pointerEventsNone),
176
239
  tag: tag,
240
+ notificationCount: getModuleNotificationCount(item, false),
177
241
  navigationComponent: navigationComponent
178
242
  })
179
243
  });
@@ -212,32 +276,36 @@ LayoutSidebar.displayName = 'LayoutSidebar';
212
276
  };
213
277
  const SideNavigationGroupContent = ({ groups, parentId, navigationComponent, onNavigationLinkClick })=>{
214
278
  return /*#__PURE__*/ _jsx(Fragment, {
215
- children: groups.reduce((out, group, index)=>{
279
+ children: groups.map((group, index)=>{
216
280
  var _ref;
217
281
  var _group_title;
218
282
  if (!group.links.length) {
219
- return out;
283
+ return null;
220
284
  }
221
285
  const title = (_ref = (_group_title = group.title) === null || _group_title === void 0 ? void 0 : _group_title.trim()) !== null && _ref !== void 0 ? _ref : '';
222
- /* eslint-disable react/no-array-index-key */ if (title) {
223
- out.push(/*#__PURE__*/ _jsx("div", {
224
- className: Styles.submenuGroupHeader,
225
- children: title
226
- }, `:group:${parentId}:${index}:title`));
227
- }
228
- out.push(...group.links.map((link, index)=>/*#__PURE__*/ _jsx(InternalSideNavigationGroupLink, {
229
- id: link.id,
230
- to: link.to,
231
- title: link.title,
232
- isActive: link.isActive,
233
- className: undefined,
234
- tag: getCounterTag(link.counter, link.tag),
235
- parentId: parentId,
236
- navigationComponent: navigationComponent,
237
- onLinkClick: onNavigationLinkClick
238
- }, `:${parentId}:${link.id}:${index}`)));
239
- /* eslint-enable react/no-array-index-key */ return out;
240
- }, [])
286
+ /* eslint-disable react/no-array-index-key */ return /*#__PURE__*/ _jsxs("div", {
287
+ className: Styles.submenuGroup,
288
+ children: [
289
+ title && /*#__PURE__*/ _jsx(Text, {
290
+ variant: "eyebrow",
291
+ size: "small",
292
+ className: Styles.submenuGroupHeader,
293
+ children: title
294
+ }),
295
+ group.links.map((link, index)=>/*#__PURE__*/ _jsx(InternalSideNavigationGroupLink, {
296
+ id: link.id,
297
+ to: link.to,
298
+ title: link.title,
299
+ isActive: link.isActive,
300
+ className: undefined,
301
+ tag: getCounterTag(link.counter, link.tag),
302
+ parentId: parentId,
303
+ navigationComponent: navigationComponent,
304
+ onLinkClick: onNavigationLinkClick
305
+ }, `:${parentId}:${link.id}:${index}`))
306
+ ]
307
+ }, `:group:${parentId}:${index}`);
308
+ /* eslint-enable react/no-array-index-key */ })
241
309
  });
242
310
  };
243
311
  function SidebarTop({ children }) {
@@ -249,9 +317,13 @@ function SidebarTop({ children }) {
249
317
  className: Styles.navTop,
250
318
  "data-cy": "navigation-items-top",
251
319
  children: [
252
- list,
253
320
  /*#__PURE__*/ _jsx("div", {
254
- className: Styles.divider
321
+ className: Styles.navTopItems,
322
+ children: list
323
+ }),
324
+ /*#__PURE__*/ _jsx(Divider, {
325
+ spacing: 3,
326
+ className: Styles.topDivider
255
327
  })
256
328
  ]
257
329
  }) : null;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"sourcesContent":["import { Divider, Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';\nimport SvgClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';\nimport SvgCollapse from '@servicetitan/anvil2/assets/icons/st/gnav_menu_collapse.svg';\nimport SvgExpand from '@servicetitan/anvil2/assets/icons/st/gnav_menu_expand.svg';\nimport classNames from 'classnames';\nimport { Children, FC, Fragment, ReactElement, isValidElement } from 'react';\nimport { NavigationItemData, NavigationSubmenuData } from '../../utils/navigation';\nimport { NavLinkComponentProps } from '../../utils/navigation-context';\nimport { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';\nimport { NavigationComponentProps } from './interface-internal';\nimport { LayoutPlacementContext, useTitanLayoutContext } from './layout-context';\nimport {\n InternalSideNavigationGroup,\n InternalSideNavigationGroupLink,\n InternalSideNavigationLink,\n} from './layout-sidebar-links-internal';\nimport * as Styles from './layout-sidebar.module.less';\nimport { withTooltip } from './with-tooltip';\n\nexport interface LayoutSidebarProps {\n className?: string;\n top?: ReactElement[];\n bottom?: ReactElement;\n mainItems?: NavigationItemData[];\n barExpanded: boolean;\n submenusOpened: string[] | undefined;\n drawerOpened: boolean;\n mobile: boolean;\n touchDevice: boolean;\n navigationComponent: FC<NavLinkComponentProps>;\n onBarExpandChange(expanded: boolean): void;\n onDrawerOpenChange(expanded: boolean): void;\n onSubmenuOpenChange(id: string, opened: boolean): void;\n onNavigationLinkClick?(itemId: string, submenuItemId?: string): void;\n}\n\nexport const LayoutSidebar: FC<LayoutSidebarProps> = ({\n className,\n mobile,\n touchDevice,\n barExpanded,\n submenusOpened,\n drawerOpened,\n onBarExpandChange,\n onSubmenuOpenChange,\n onDrawerOpenChange,\n onNavigationLinkClick,\n mainItems,\n top,\n bottom,\n navigationComponent,\n}) => {\n const closeDrawer = () => {\n if (mobile) {\n onDrawerOpenChange?.(false);\n }\n };\n\n const effectiveExpanded = mobile ? drawerOpened : barExpanded;\n\n return (\n <LayoutPlacementContext.Provider value=\"side\">\n {mobile && drawerOpened && (\n <div className={Styles.navDrawerBackdrop} onClick={closeDrawer} />\n )}\n <div\n className={classNames(\n Styles.nav,\n mobile && Styles.navDrawer,\n mobile && drawerOpened && Styles.navDrawerOpened,\n !mobile && (barExpanded ? Styles.navWide : Styles.navSlim),\n className\n )}\n data-cy=\"side-navigation\"\n onClick={closeDrawer}\n >\n <ThemeProvider mode=\"dark\" className={Styles.navMain}>\n {mobile && (\n <div className={Styles.navCloseWrapper}>\n <div\n className={Styles.navClose}\n onClick={() => onBarExpandChange(false)}\n >\n <Icon svg={SvgClose} size=\"large\" />\n </div>\n </div>\n )}\n {!!top?.length && <SidebarTop>{top}</SidebarTop>}\n\n <div data-cy=\"navigation-items\">\n {mainItems?.map(item =>\n item.submenu ? (\n <SideNavigationGroupItem\n key={item.id}\n item={item}\n barExpanded={effectiveExpanded}\n submenuOpened={!!item.id && !!submenusOpened?.includes(item.id)}\n onSubmenuOpen={onSubmenuOpenChange}\n navigationComponent={navigationComponent}\n onNavigationLinkClick={onNavigationLinkClick}\n touchDevice={touchDevice}\n />\n ) : (\n <InternalSideNavigationLink\n key={item.id}\n id={item.id}\n to={item.to}\n title={\n effectiveExpanded\n ? item.title\n : (item.collapsedTitle ?? item.title)\n }\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={getSubmenuGroupTag(\n item.submenu,\n getCounterTag(item.counter, item.tag)\n )}\n navigationComponent={navigationComponent}\n />\n )\n )}\n </div>\n\n {!!bottom && <SidebarBottom>{bottom}</SidebarBottom>}\n </ThemeProvider>\n\n {!mobile && (\n <div className={Styles.navFooter}>\n <div className={Styles.divider} />\n <div className={Styles.toggleWrapper}>\n <SideNavigationOptionsToggle\n appearance={barExpanded ? 'collapse-button' : 'expand'}\n onExpandedChange={() => onBarExpandChange(!barExpanded)}\n />\n </div>\n </div>\n )}\n </div>\n </LayoutPlacementContext.Provider>\n );\n};\nLayoutSidebar.displayName = 'LayoutSidebar';\n\n/** Side Navigation options toggle */\nconst SideNavigationOptionsToggle: FC<{\n appearance: 'expand' | 'collapse' | 'collapse-button';\n onExpandedChange?(expanded: boolean): void;\n}> = ({ appearance, onExpandedChange }) =>\n withTooltip(\n <div\n role=\"button\"\n tabIndex={0}\n data-cy=\"navigation-left-options\"\n data-pendo=\"navigation-left-options\"\n aria-label={appearance === 'expand' ? 'Expand Menu' : 'Collapse Menu'}\n className={classNames(Styles.toggle)}\n onClick={() => onExpandedChange?.(appearance === 'expand')}\n onKeyDown={e => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault();\n onExpandedChange?.(appearance === 'expand');\n }\n }}\n >\n <div className={Styles.toggleContent}>\n <div className={Styles.toggleIconWrapper}>\n <Icon\n className={Styles.toggleIcon}\n svg={appearance === 'expand' ? SvgExpand : SvgCollapse}\n />\n </div>\n\n {appearance === 'collapse-button' && (\n <span className={Styles.toggleText}>Collapse Menu</span>\n )}\n </div>\n </div>,\n appearance === 'expand'\n ? 'Expand Menu'\n : appearance === 'collapse'\n ? 'Collapse Menu'\n : undefined,\n { placement: 'right' }\n );\n\n/** Side Navigation menu item */\nconst SideNavigationGroupItem: FC<{\n item: NavigationItemData;\n navigationComponent: FC<NavLinkComponentProps>;\n touchDevice: boolean;\n barExpanded: boolean;\n submenuOpened: boolean;\n onSubmenuOpen: (id: string, opened: boolean) => void;\n onNavigationLinkClick?: (itemId: string, submenuItemId?: string) => void;\n}> = ({\n item,\n onSubmenuOpen,\n onNavigationLinkClick,\n barExpanded,\n submenuOpened,\n navigationComponent,\n touchDevice,\n}) => {\n const {\n sidebar: {\n styles: { popoverContent },\n },\n } = useTitanLayoutContext();\n\n const tag = getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag));\n\n return barExpanded ? (\n <InternalSideNavigationGroup\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={tag}\n submenuOpened={submenuOpened}\n onSubmenuOpen={onSubmenuOpen}\n navigationComponent={navigationComponent}\n >\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n onNavigationLinkClick={onNavigationLinkClick}\n />\n </InternalSideNavigationGroup>\n ) : (\n <Popover placement=\"right-start\" openOnHover={!touchDevice} delay={200} noPadding>\n <Popover.Trigger>\n {(triggerProps: any) => (\n <div {...triggerProps}>\n <InternalSideNavigationLink\n id={item.id}\n to={item.to}\n title={item.collapsedTitle ?? item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={classNames(\n item.className,\n touchDevice && Styles.pointerEventsNone\n )}\n tag={tag}\n navigationComponent={navigationComponent}\n />\n </div>\n )}\n </Popover.Trigger>\n <Popover.Content\n style={popoverContent}\n className={classNames('z-global-nav-i', Styles.submenuPopoverContent)}\n data-cy=\"navigation-item-popover-content\"\n >\n <div className={Styles.submenuPopover}>\n <Text\n variant=\"headline\"\n el=\"h4\"\n size=\"small\"\n className={Styles.submenuPopoverTitle}\n >\n {item.title}\n </Text>\n <Divider className={Styles.submenuPopoverDivider} />\n <div className={Styles.submenuPopoverBody}>\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover>\n );\n};\nconst SideNavigationGroupContent: FC<\n NavigationSubmenuData &\n NavigationComponentProps & {\n parentId: string;\n onNavigationLinkClick?: (itemId: string, submenuItemId?: string) => void;\n }\n> = ({ groups, parentId, navigationComponent, onNavigationLinkClick }) => {\n return (\n <Fragment>\n {groups.reduce((out, group, index) => {\n if (!group.links.length) {\n return out;\n }\n\n const title = group.title?.trim() ?? '';\n /* eslint-disable react/no-array-index-key */\n if (title) {\n out.push(\n <div\n key={`:group:${parentId}:${index}:title`}\n className={Styles.submenuGroupHeader}\n >\n {title}\n </div>\n );\n }\n out.push(\n ...group.links.map((link, index) => (\n <InternalSideNavigationGroupLink\n key={`:${parentId}:${link.id}:${index}`}\n id={link.id}\n to={link.to}\n title={link.title}\n isActive={link.isActive}\n className={undefined}\n tag={getCounterTag(link.counter, link.tag)}\n parentId={parentId}\n navigationComponent={navigationComponent}\n onLinkClick={onNavigationLinkClick}\n />\n ))\n );\n /* eslint-enable react/no-array-index-key */\n\n return out;\n }, [] as ReactElement[])}\n </Fragment>\n );\n};\n\nfunction SidebarTop({ children }: any) {\n const list = Children.map(children, child => {\n return child && isValidElement(child) ? child : null;\n });\n return list?.length ? (\n <ThemeProvider mode=\"dark\" className={Styles.navTop} data-cy=\"navigation-items-top\">\n {list}\n <div className={Styles.divider} />\n </ThemeProvider>\n ) : null;\n}\n\nfunction SidebarBottom({ children }: any) {\n return (\n <ThemeProvider mode=\"dark\" className={Styles.navBottom} data-cy=\"navigation-items-bottom\">\n <div className={Styles.divider} />\n {children}\n </ThemeProvider>\n );\n}\n"],"names":["Divider","Icon","Popover","Text","ThemeProvider","SvgClose","SvgCollapse","SvgExpand","classNames","Children","Fragment","isValidElement","getCounterTag","getSubmenuGroupTag","LayoutPlacementContext","useTitanLayoutContext","InternalSideNavigationGroup","InternalSideNavigationGroupLink","InternalSideNavigationLink","Styles","withTooltip","LayoutSidebar","className","mobile","touchDevice","barExpanded","submenusOpened","drawerOpened","onBarExpandChange","onSubmenuOpenChange","onDrawerOpenChange","onNavigationLinkClick","mainItems","top","bottom","navigationComponent","closeDrawer","effectiveExpanded","Provider","value","div","navDrawerBackdrop","onClick","nav","navDrawer","navDrawerOpened","navWide","navSlim","data-cy","mode","navMain","navCloseWrapper","navClose","svg","size","length","SidebarTop","map","item","submenu","SideNavigationGroupItem","submenuOpened","id","includes","onSubmenuOpen","to","title","collapsedTitle","isActive","icon","iconActive","tag","counter","SidebarBottom","navFooter","divider","toggleWrapper","SideNavigationOptionsToggle","appearance","onExpandedChange","displayName","role","tabIndex","data-pendo","aria-label","toggle","onKeyDown","e","key","preventDefault","toggleContent","toggleIconWrapper","toggleIcon","span","toggleText","undefined","placement","sidebar","styles","popoverContent","SideNavigationGroupContent","parentId","groups","openOnHover","delay","noPadding","Trigger","triggerProps","pointerEventsNone","Content","style","submenuPopoverContent","submenuPopover","variant","el","submenuPopoverTitle","submenuPopoverDivider","submenuPopoverBody","reduce","out","group","index","links","trim","push","submenuGroupHeader","link","onLinkClick","children","list","child","navTop","navBottom"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"sourcesContent":["import { Button, Divider, Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';\nimport SvgClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';\nimport SvgCollapseAll from '@servicetitan/anvil2/assets/icons/material/round/unfold_less.svg';\nimport SvgExpandAll from '@servicetitan/anvil2/assets/icons/material/round/unfold_more.svg';\nimport SvgCollapse from '@servicetitan/anvil2/assets/icons/st/gnav_menu_collapse.svg';\nimport SvgExpand from '@servicetitan/anvil2/assets/icons/st/gnav_menu_expand.svg';\nimport classNames from 'classnames';\nimport { Children, FC, Fragment, ReactElement, isValidElement } from 'react';\nimport { NavigationItemData, NavigationSubmenuData } from '../../utils/navigation';\nimport { NavLinkComponentProps } from '../../utils/navigation-context';\nimport { getModuleNotificationCount } from '../../utils/navigation-notifications';\nimport { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';\nimport { PinnedNavigationConfig } from './interface';\nimport { NavigationComponentProps } from './interface-internal';\nimport { LayoutPlacementContext, useTitanLayoutContext } from './layout-context';\nimport {\n InternalSideNavigationGroup,\n InternalSideNavigationGroupLink,\n InternalSideNavigationLink,\n} from './layout-sidebar-links-internal';\nimport * as Styles from './layout-sidebar.module.less';\nimport { NavigationCatalogTrigger } from './navigation-catalog';\nimport { NavigationScrollIndicators } from './navigation-scroll-indicators';\nimport { useNavigationScroll } from './use-navigation-scroll';\nimport { withTooltip } from './with-tooltip';\n\nexport interface LayoutSidebarProps {\n className?: string;\n top?: ReactElement[];\n\n /**\n * Destinations rendered above the divider, ahead of `top`.\n *\n * Separate from `top` rather than widening it: that one takes elements a host builds itself\n * and renders them as-is, which is what a bespoke control needs. This takes navigation items\n * and puts them through the same renderer as `mainItems`, so one with pages beneath it is an\n * expandable group instead of being flattened to a bare link.\n */\n topItems?: NavigationItemData[];\n\n /** Whether the rail shows the scroll and overflow-notification indicators. */\n scrollIndicators?: boolean;\n bottom?: ReactElement;\n mainItems?: NavigationItemData[];\n pinnedNavigation?: PinnedNavigationConfig;\n barExpanded: boolean;\n submenusOpened: string[] | undefined;\n drawerOpened: boolean;\n mobile: boolean;\n touchDevice: boolean;\n navigationComponent: FC<NavLinkComponentProps>;\n onBarExpandChange(expanded: boolean): void;\n onDrawerOpenChange(expanded: boolean): void;\n onSubmenuOpenChange(id: string, opened: boolean): void;\n onSubmenusOpenChange?(ids: string[], opened: boolean): void;\n onNavigationLinkClick?(itemId: string, submenuItemId?: string): void;\n}\n\nexport const LayoutSidebar: FC<LayoutSidebarProps> = ({\n className,\n mobile,\n touchDevice,\n barExpanded,\n submenusOpened,\n drawerOpened,\n onBarExpandChange,\n onSubmenuOpenChange,\n onSubmenusOpenChange,\n onDrawerOpenChange,\n onNavigationLinkClick,\n mainItems,\n pinnedNavigation,\n top,\n topItems,\n scrollIndicators,\n bottom,\n navigationComponent,\n}) => {\n const { regionRef, scrollRef, revealNotification, ...scrollOverflow } =\n useNavigationScroll(scrollIndicators);\n const closeDrawer = () => {\n if (mobile) {\n onDrawerOpenChange?.(false);\n }\n };\n\n const effectiveExpanded = mobile ? drawerOpened : barExpanded;\n /*\n * Both regions, because a destination above the divider expands exactly like one below it.\n * Counting only `mainItems` would let Expand All skip those groups — and hide the control\n * entirely on a rail whose only expandable modules sit up there.\n */\n const expandableIds = [...(topItems ?? []), ...(mainItems ?? [])]\n .filter(item => item.submenu?.groups.some(group => group.links.length > 0))\n .map(item => item.id);\n const hasOpenSubmenus = expandableIds.some(id => submenusOpened?.includes(id));\n const toggleAllLabel = hasOpenSubmenus ? 'Collapse All' : 'Expand All';\n const toggleAll =\n effectiveExpanded && expandableIds.length > 0 && onSubmenusOpenChange\n ? withTooltip(\n <Button\n appearance=\"secondary\"\n size=\"small\"\n icon={hasOpenSubmenus ? SvgCollapseAll : SvgExpandAll}\n aria-label={toggleAllLabel}\n aria-expanded={hasOpenSubmenus}\n data-cy=\"navigation-toggle-all\"\n data-pendo=\"navigation-toggle-all\"\n onClick={event => {\n event.stopPropagation();\n onSubmenusOpenChange(expandableIds, !hasOpenSubmenus);\n }}\n />,\n toggleAllLabel,\n { placement: 'top' }\n )\n : undefined;\n\n const scrollHeader = !mobile && !barExpanded;\n const navigationHeader = (\n <div className={Styles.navHeader}>\n {mobile && (\n <div className={Styles.navCloseWrapper}>\n <div className={Styles.navClose} onClick={() => onBarExpandChange(false)}>\n <Icon svg={SvgClose} size=\"large\" />\n </div>\n </div>\n )}\n {pinnedNavigation && (\n <NavigationCatalogTrigger\n expanded={effectiveExpanded}\n {...pinnedNavigation}\n trailingAction={toggleAll}\n />\n )}\n {!pinnedNavigation && toggleAll && <div className={Styles.navTools}>{toggleAll}</div>}\n </div>\n );\n\n /*\n * Shared by the region above the divider and the list below it, so a destination renders the\n * same way wherever the host puts it. Two copies of this branch would drift.\n */\n const renderItems = (items: NavigationItemData[] | undefined) =>\n items?.map(item =>\n item.submenu ? (\n <SideNavigationGroupItem\n key={item.id}\n item={item}\n barExpanded={effectiveExpanded}\n submenuOpened={!!item.id && !!submenusOpened?.includes(item.id)}\n onSubmenuOpen={onSubmenuOpenChange}\n navigationComponent={navigationComponent}\n onNavigationLinkClick={onNavigationLinkClick}\n touchDevice={touchDevice}\n />\n ) : (\n <InternalSideNavigationLink\n key={item.id}\n id={item.id}\n to={item.to}\n title={effectiveExpanded ? item.title : (item.collapsedTitle ?? item.title)}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag))}\n navigationComponent={navigationComponent}\n />\n )\n );\n\n return (\n <LayoutPlacementContext.Provider value=\"side\">\n {mobile && drawerOpened && (\n <div className={Styles.navDrawerBackdrop} onClick={closeDrawer} />\n )}\n <div\n className={classNames(\n Styles.nav,\n mobile && Styles.navDrawer,\n mobile && drawerOpened && Styles.navDrawerOpened,\n !mobile && (barExpanded ? Styles.navWide : Styles.navSlim),\n className\n )}\n data-cy=\"side-navigation\"\n onClick={closeDrawer}\n >\n <ThemeProvider mode=\"dark\" className={Styles.navContent}>\n {!scrollHeader && navigationHeader}\n <div ref={regionRef} className={Styles.navScrollRegion}>\n <div ref={scrollRef} className={Styles.navMain} data-cy=\"navigation-scroll\">\n <div>\n {scrollHeader && navigationHeader}\n {(!!top?.length || !!topItems?.length) && (\n <SidebarTop>\n {renderItems(topItems)}\n {top}\n </SidebarTop>\n )}\n\n <div className={Styles.navItems} data-cy=\"navigation-items\">\n {renderItems(mainItems)}\n </div>\n\n {!!bottom && <SidebarBottom>{bottom}</SidebarBottom>}\n </div>\n </div>\n {scrollIndicators && (\n <NavigationScrollIndicators\n {...scrollOverflow}\n expanded={effectiveExpanded}\n onReveal={revealNotification}\n />\n )}\n </div>\n </ThemeProvider>\n\n {!mobile && (\n <ThemeProvider mode=\"dark\" className={Styles.navFooter}>\n <div className={Styles.divider} />\n <div className={Styles.toggleWrapper}>\n <SideNavigationOptionsToggle\n expanded={barExpanded}\n onExpandedChange={() => onBarExpandChange(!barExpanded)}\n />\n </div>\n </ThemeProvider>\n )}\n </div>\n </LayoutPlacementContext.Provider>\n );\n};\nLayoutSidebar.displayName = 'LayoutSidebar';\n\n/** Side Navigation options toggle */\nconst SideNavigationOptionsToggle: FC<{\n expanded: boolean;\n onExpandedChange?(expanded: boolean): void;\n}> = ({ expanded, onExpandedChange }) =>\n withTooltip(\n <Button\n appearance=\"ghost\"\n size=\"small\"\n icon={expanded ? SvgCollapse : SvgExpand}\n data-cy=\"navigation-left-options\"\n data-pendo=\"navigation-left-options\"\n aria-label={expanded ? 'Collapse Menu' : 'Expand Menu'}\n aria-expanded={expanded}\n className={Styles.toggle}\n onClick={() => onExpandedChange?.(!expanded)}\n />,\n expanded ? 'Collapse Menu' : 'Expand Menu',\n { placement: 'right' }\n );\n\n/** Side Navigation menu item */\nconst SideNavigationGroupItem: FC<{\n item: NavigationItemData;\n navigationComponent: FC<NavLinkComponentProps>;\n touchDevice: boolean;\n barExpanded: boolean;\n submenuOpened: boolean;\n onSubmenuOpen: (id: string, opened: boolean) => void;\n onNavigationLinkClick?: (itemId: string, submenuItemId?: string) => void;\n}> = ({\n item,\n onSubmenuOpen,\n onNavigationLinkClick,\n barExpanded,\n submenuOpened,\n navigationComponent,\n touchDevice,\n}) => {\n const {\n sidebar: {\n styles: { popoverContent },\n },\n } = useTitanLayoutContext();\n\n const tag = getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag));\n\n return barExpanded ? (\n <InternalSideNavigationGroup\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={tag}\n notificationCount={getModuleNotificationCount(item, submenuOpened)}\n submenuOpened={submenuOpened}\n onSubmenuOpen={onSubmenuOpen}\n navigationComponent={navigationComponent}\n >\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n onNavigationLinkClick={onNavigationLinkClick}\n />\n </InternalSideNavigationGroup>\n ) : (\n <Popover\n placement=\"right-start\"\n openOnHover={!touchDevice}\n delay={200}\n noPadding\n disableCaret\n >\n <Popover.Trigger>\n {(triggerProps: any) => (\n <div {...triggerProps}>\n <InternalSideNavigationLink\n id={item.id}\n to={item.to}\n title={item.collapsedTitle ?? item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={classNames(\n item.className,\n touchDevice && Styles.pointerEventsNone\n )}\n tag={tag}\n notificationCount={getModuleNotificationCount(item, false)}\n navigationComponent={navigationComponent}\n />\n </div>\n )}\n </Popover.Trigger>\n <Popover.Content\n style={popoverContent}\n className={classNames('z-global-nav-i', Styles.submenuPopoverContent)}\n data-cy=\"navigation-item-popover-content\"\n >\n <div className={Styles.submenuPopover}>\n <Text\n variant=\"headline\"\n el=\"h4\"\n size=\"small\"\n className={Styles.submenuPopoverTitle}\n >\n {item.title}\n </Text>\n <Divider className={Styles.submenuPopoverDivider} />\n <div className={Styles.submenuPopoverBody}>\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n />\n </div>\n </div>\n </Popover.Content>\n </Popover>\n );\n};\nconst SideNavigationGroupContent: FC<\n NavigationSubmenuData &\n NavigationComponentProps & {\n parentId: string;\n onNavigationLinkClick?: (itemId: string, submenuItemId?: string) => void;\n }\n> = ({ groups, parentId, navigationComponent, onNavigationLinkClick }) => {\n return (\n <Fragment>\n {groups.map((group, index) => {\n if (!group.links.length) {\n return null;\n }\n\n const title = group.title?.trim() ?? '';\n /* eslint-disable react/no-array-index-key */\n return (\n <div key={`:group:${parentId}:${index}`} className={Styles.submenuGroup}>\n {title && (\n <Text\n variant=\"eyebrow\"\n size=\"small\"\n className={Styles.submenuGroupHeader}\n >\n {title}\n </Text>\n )}\n {group.links.map((link, index) => (\n <InternalSideNavigationGroupLink\n key={`:${parentId}:${link.id}:${index}`}\n id={link.id}\n to={link.to}\n title={link.title}\n isActive={link.isActive}\n className={undefined}\n tag={getCounterTag(link.counter, link.tag)}\n parentId={parentId}\n navigationComponent={navigationComponent}\n onLinkClick={onNavigationLinkClick}\n />\n ))}\n </div>\n );\n /* eslint-enable react/no-array-index-key */\n })}\n </Fragment>\n );\n};\n\nfunction SidebarTop({ children }: any) {\n const list = Children.map(children, child => {\n return child && isValidElement(child) ? child : null;\n });\n return list?.length ? (\n <ThemeProvider mode=\"dark\" className={Styles.navTop} data-cy=\"navigation-items-top\">\n <div className={Styles.navTopItems}>{list}</div>\n {/* Anvil 2 spacing 3 resolves to the design's 12px above and below. */}\n <Divider spacing={3} className={Styles.topDivider} />\n </ThemeProvider>\n ) : null;\n}\n\nfunction SidebarBottom({ children }: any) {\n return (\n <ThemeProvider mode=\"dark\" className={Styles.navBottom} data-cy=\"navigation-items-bottom\">\n <div className={Styles.divider} />\n {children}\n </ThemeProvider>\n );\n}\n"],"names":["Button","Divider","Icon","Popover","Text","ThemeProvider","SvgClose","SvgCollapseAll","SvgExpandAll","SvgCollapse","SvgExpand","classNames","Children","Fragment","isValidElement","getModuleNotificationCount","getCounterTag","getSubmenuGroupTag","LayoutPlacementContext","useTitanLayoutContext","InternalSideNavigationGroup","InternalSideNavigationGroupLink","InternalSideNavigationLink","Styles","NavigationCatalogTrigger","NavigationScrollIndicators","useNavigationScroll","withTooltip","LayoutSidebar","className","mobile","touchDevice","barExpanded","submenusOpened","drawerOpened","onBarExpandChange","onSubmenuOpenChange","onSubmenusOpenChange","onDrawerOpenChange","onNavigationLinkClick","mainItems","pinnedNavigation","top","topItems","scrollIndicators","bottom","navigationComponent","regionRef","scrollRef","revealNotification","scrollOverflow","closeDrawer","effectiveExpanded","expandableIds","filter","item","submenu","groups","some","group","links","length","map","id","hasOpenSubmenus","includes","toggleAllLabel","toggleAll","appearance","size","icon","aria-label","aria-expanded","data-cy","data-pendo","onClick","event","stopPropagation","placement","undefined","scrollHeader","navigationHeader","div","navHeader","navCloseWrapper","navClose","svg","expanded","trailingAction","navTools","renderItems","items","SideNavigationGroupItem","submenuOpened","onSubmenuOpen","to","title","collapsedTitle","isActive","iconActive","tag","counter","Provider","value","navDrawerBackdrop","nav","navDrawer","navDrawerOpened","navWide","navSlim","mode","navContent","ref","navScrollRegion","navMain","SidebarTop","navItems","SidebarBottom","onReveal","navFooter","divider","toggleWrapper","SideNavigationOptionsToggle","onExpandedChange","displayName","toggle","sidebar","styles","popoverContent","notificationCount","SideNavigationGroupContent","parentId","openOnHover","delay","noPadding","disableCaret","Trigger","triggerProps","pointerEventsNone","Content","style","submenuPopoverContent","submenuPopover","variant","el","submenuPopoverTitle","submenuPopoverDivider","submenuPopoverBody","index","trim","submenuGroup","submenuGroupHeader","link","onLinkClick","children","list","child","navTop","navTopItems","spacing","topDivider","navBottom"],"mappings":";AAAA,SAASA,MAAM,EAAEC,OAAO,EAAEC,IAAI,EAAEC,OAAO,EAAEC,IAAI,EAAEC,aAAa,QAAQ,uBAAuB;AAC3F,OAAOC,cAAc,6DAA6D;AAClF,OAAOC,oBAAoB,mEAAmE;AAC9F,OAAOC,kBAAkB,mEAAmE;AAC5F,OAAOC,iBAAiB,8DAA8D;AACtF,OAAOC,eAAe,4DAA4D;AAClF,OAAOC,gBAAgB,aAAa;AACpC,SAASC,QAAQ,EAAMC,QAAQ,EAAgBC,cAAc,QAAQ,QAAQ;AAG7E,SAASC,0BAA0B,QAAQ,uCAAuC;AAClF,SAASC,aAAa,EAAEC,kBAAkB,QAAQ,uBAAuB;AAGzE,SAASC,sBAAsB,EAAEC,qBAAqB,QAAQ,mBAAmB;AACjF,SACIC,2BAA2B,EAC3BC,+BAA+B,EAC/BC,0BAA0B,QACvB,kCAAkC;AACzC,YAAYC,YAAY,+BAA+B;AACvD,SAASC,wBAAwB,QAAQ,uBAAuB;AAChE,SAASC,0BAA0B,QAAQ,iCAAiC;AAC5E,SAASC,mBAAmB,QAAQ,0BAA0B;AAC9D,SAASC,WAAW,QAAQ,iBAAiB;AAkC7C,OAAO,MAAMC,gBAAwC,CAAC,EAClDC,SAAS,EACTC,MAAM,EACNC,WAAW,EACXC,WAAW,EACXC,cAAc,EACdC,YAAY,EACZC,iBAAiB,EACjBC,mBAAmB,EACnBC,oBAAoB,EACpBC,kBAAkB,EAClBC,qBAAqB,EACrBC,SAAS,EACTC,gBAAgB,EAChBC,GAAG,EACHC,QAAQ,EACRC,gBAAgB,EAChBC,MAAM,EACNC,mBAAmB,EACtB;IACG,MAAM,EAAEC,SAAS,EAAEC,SAAS,EAAEC,kBAAkB,EAAE,GAAGC,gBAAgB,GACjExB,oBAAoBkB;IACxB,MAAMO,cAAc;QAChB,IAAIrB,QAAQ;YACRQ,+BAAAA,yCAAAA,mBAAqB;QACzB;IACJ;IAEA,MAAMc,oBAAoBtB,SAASI,eAAeF;IAClD;;;;KAIC,GACD,MAAMqB,gBAAgB;WAAKV,qBAAAA,sBAAAA,WAAY,EAAE;WAAOH,sBAAAA,uBAAAA,YAAa,EAAE;KAAE,CAC5Dc,MAAM,CAACC,CAAAA;YAAQA;gBAAAA,gBAAAA,KAAKC,OAAO,cAAZD,oCAAAA,cAAcE,MAAM,CAACC,IAAI,CAACC,CAAAA,QAASA,MAAMC,KAAK,CAACC,MAAM,GAAG;OACvEC,GAAG,CAACP,CAAAA,OAAQA,KAAKQ,EAAE;IACxB,MAAMC,kBAAkBX,cAAcK,IAAI,CAACK,CAAAA,KAAM9B,2BAAAA,qCAAAA,eAAgBgC,QAAQ,CAACF;IAC1E,MAAMG,iBAAiBF,kBAAkB,iBAAiB;IAC1D,MAAMG,YACFf,qBAAqBC,cAAcQ,MAAM,GAAG,KAAKxB,uBAC3CV,0BACI,KAAC3B;QACGoE,YAAW;QACXC,MAAK;QACLC,MAAMN,kBAAkBzD,iBAAiBC;QACzC+D,cAAYL;QACZM,iBAAeR;QACfS,WAAQ;QACRC,cAAW;QACXC,SAASC,CAAAA;YACLA,MAAMC,eAAe;YACrBxC,qBAAqBgB,eAAe,CAACW;QACzC;QAEJE,gBACA;QAAEY,WAAW;IAAM,KAEvBC;IAEV,MAAMC,eAAe,CAAClD,UAAU,CAACE;IACjC,MAAMiD,iCACF,MAACC;QAAIrD,WAAWN,OAAO4D,SAAS;;YAC3BrD,wBACG,KAACoD;gBAAIrD,WAAWN,OAAO6D,eAAe;0BAClC,cAAA,KAACF;oBAAIrD,WAAWN,OAAO8D,QAAQ;oBAAEV,SAAS,IAAMxC,kBAAkB;8BAC9D,cAAA,KAACjC;wBAAKoF,KAAKhF;wBAAU+D,MAAK;;;;YAIrC5B,kCACG,KAACjB;gBACG+D,UAAUnC;gBACT,GAAGX,gBAAgB;gBACpB+C,gBAAgBrB;;YAGvB,CAAC1B,oBAAoB0B,2BAAa,KAACe;gBAAIrD,WAAWN,OAAOkE,QAAQ;0BAAGtB;;;;IAI7E;;;KAGC,GACD,MAAMuB,cAAc,CAACC,QACjBA,kBAAAA,4BAAAA,MAAO7B,GAAG,CAACP,CAAAA;gBAiB0CA;mBAhBjDA,KAAKC,OAAO,iBACR,KAACoC;gBAEGrC,MAAMA;gBACNvB,aAAaoB;gBACbyC,eAAe,CAAC,CAACtC,KAAKQ,EAAE,IAAI,CAAC,EAAC9B,2BAAAA,qCAAAA,eAAgBgC,QAAQ,CAACV,KAAKQ,EAAE;gBAC9D+B,eAAe1D;gBACfU,qBAAqBA;gBACrBP,uBAAuBA;gBACvBR,aAAaA;eAPRwB,KAAKQ,EAAE,kBAUhB,KAACzC;gBAEGyC,IAAIR,KAAKQ,EAAE;gBACXgC,IAAIxC,KAAKwC,EAAE;gBACXC,OAAO5C,oBAAoBG,KAAKyC,KAAK,IAAIzC,uBAAAA,KAAK0C,cAAc,cAAnB1C,kCAAAA,uBAAuBA,KAAKyC,KAAK;gBAC1EE,UAAU3C,KAAK2C,QAAQ;gBACvB5B,MAAMf,KAAKe,IAAI;gBACf6B,YAAY5C,KAAK4C,UAAU;gBAC3BtE,WAAW0B,KAAK1B,SAAS;gBACzBuE,KAAKnF,mBAAmBsC,KAAKC,OAAO,EAAExC,cAAcuC,KAAK8C,OAAO,EAAE9C,KAAK6C,GAAG;gBAC1EtD,qBAAqBA;eAThBS,KAAKQ,EAAE;;IAc5B,qBACI,MAAC7C,uBAAuBoF,QAAQ;QAACC,OAAM;;YAClCzE,UAAUI,8BACP,KAACgD;gBAAIrD,WAAWN,OAAOiF,iBAAiB;gBAAE7B,SAASxB;;0BAEvD,MAAC+B;gBACGrD,WAAWlB,WACPY,OAAOkF,GAAG,EACV3E,UAAUP,OAAOmF,SAAS,EAC1B5E,UAAUI,gBAAgBX,OAAOoF,eAAe,EAChD,CAAC7E,UAAWE,CAAAA,cAAcT,OAAOqF,OAAO,GAAGrF,OAAOsF,OAAO,AAAD,GACxDhF;gBAEJ4C,WAAQ;gBACRE,SAASxB;;kCAET,MAAC9C;wBAAcyG,MAAK;wBAAOjF,WAAWN,OAAOwF,UAAU;;4BAClD,CAAC/B,gBAAgBC;0CAClB,MAACC;gCAAI8B,KAAKjE;gCAAWlB,WAAWN,OAAO0F,eAAe;;kDAClD,KAAC/B;wCAAI8B,KAAKhE;wCAAWnB,WAAWN,OAAO2F,OAAO;wCAAEzC,WAAQ;kDACpD,cAAA,MAACS;;gDACIF,gBAAgBC;gDACf,CAAA,CAAC,EAACvC,gBAAAA,0BAAAA,IAAKmB,MAAM,KAAI,CAAC,EAAClB,qBAAAA,+BAAAA,SAAUkB,MAAM,CAAD,mBAChC,MAACsD;;wDACIzB,YAAY/C;wDACZD;;;8DAIT,KAACwC;oDAAIrD,WAAWN,OAAO6F,QAAQ;oDAAE3C,WAAQ;8DACpCiB,YAAYlD;;gDAGhB,CAAC,CAACK,wBAAU,KAACwE;8DAAexE;;;;;oCAGpCD,kCACG,KAACnB;wCACI,GAAGyB,cAAc;wCAClBqC,UAAUnC;wCACVkE,UAAUrE;;;;;;oBAMzB,CAACnB,wBACE,MAACzB;wBAAcyG,MAAK;wBAAOjF,WAAWN,OAAOgG,SAAS;;0CAClD,KAACrC;gCAAIrD,WAAWN,OAAOiG,OAAO;;0CAC9B,KAACtC;gCAAIrD,WAAWN,OAAOkG,aAAa;0CAChC,cAAA,KAACC;oCACGnC,UAAUvD;oCACV2F,kBAAkB,IAAMxF,kBAAkB,CAACH;;;;;;;;;AAQ3E,EAAE;AACFJ,cAAcgG,WAAW,GAAG;AAE5B,mCAAmC,GACnC,MAAMF,8BAGD,CAAC,EAAEnC,QAAQ,EAAEoC,gBAAgB,EAAE,GAChChG,0BACI,KAAC3B;QACGoE,YAAW;QACXC,MAAK;QACLC,MAAMiB,WAAW9E,cAAcC;QAC/B+D,WAAQ;QACRC,cAAW;QACXH,cAAYgB,WAAW,kBAAkB;QACzCf,iBAAee;QACf1D,WAAWN,OAAOsG,MAAM;QACxBlD,SAAS,IAAMgD,6BAAAA,uCAAAA,iBAAmB,CAACpC;QAEvCA,WAAW,kBAAkB,eAC7B;QAAET,WAAW;IAAQ;AAG7B,8BAA8B,GAC9B,MAAMc,0BAQD,CAAC,EACFrC,IAAI,EACJuC,aAAa,EACbvD,qBAAqB,EACrBP,WAAW,EACX6D,aAAa,EACb/C,mBAAmB,EACnBf,WAAW,EACd;;QA0BuBwB,eAoDYA;IA7EhC,MAAM,EACFuE,SAAS,EACLC,QAAQ,EAAEC,cAAc,EAAE,EAC7B,EACJ,GAAG7G;IAEJ,MAAMiF,MAAMnF,mBAAmBsC,KAAKC,OAAO,EAAExC,cAAcuC,KAAK8C,OAAO,EAAE9C,KAAK6C,GAAG;IAEjF,OAAOpE,4BACH,KAACZ;QACG2C,IAAIR,KAAKQ,EAAE;QACXgC,IAAIxC,KAAKwC,EAAE;QACXC,OAAOzC,KAAKyC,KAAK;QACjBE,UAAU3C,KAAK2C,QAAQ;QACvB5B,MAAMf,KAAKe,IAAI;QACf6B,YAAY5C,KAAK4C,UAAU;QAC3BtE,WAAW0B,KAAK1B,SAAS;QACzBuE,KAAKA;QACL6B,mBAAmBlH,2BAA2BwC,MAAMsC;QACpDA,eAAeA;QACfC,eAAeA;QACfhD,qBAAqBA;kBAErB,cAAA,KAACoF;YACGC,UAAU5E,KAAKQ,EAAE;YACjBN,MAAM,WAAEF,gBAAAA,KAAKC,OAAO,cAAZD,oCAAAA,cAAcE,MAAM,uCAAI,EAAE;YAClCX,qBAAqBA;YACrBP,uBAAuBA;;uBAI/B,MAACpC;QACG2E,WAAU;QACVsD,aAAa,CAACrG;QACdsG,OAAO;QACPC,SAAS;QACTC,YAAY;;0BAEZ,KAACpI,QAAQqI,OAAO;0BACX,CAACC;wBAKiBlF;yCAJf,KAAC2B;wBAAK,GAAGuD,YAAY;kCACjB,cAAA,KAACnH;4BACGyC,IAAIR,KAAKQ,EAAE;4BACXgC,IAAIxC,KAAKwC,EAAE;4BACXC,KAAK,GAAEzC,uBAAAA,KAAK0C,cAAc,cAAnB1C,kCAAAA,uBAAuBA,KAAKyC,KAAK;4BACxCE,UAAU3C,KAAK2C,QAAQ;4BACvB5B,MAAMf,KAAKe,IAAI;4BACf6B,YAAY5C,KAAK4C,UAAU;4BAC3BtE,WAAWlB,WACP4C,KAAK1B,SAAS,EACdE,eAAeR,OAAOmH,iBAAiB;4BAE3CtC,KAAKA;4BACL6B,mBAAmBlH,2BAA2BwC,MAAM;4BACpDT,qBAAqBA;;;;;0BAKrC,KAAC3C,QAAQwI,OAAO;gBACZC,OAAOZ;gBACPnG,WAAWlB,WAAW,kBAAkBY,OAAOsH,qBAAqB;gBACpEpE,WAAQ;0BAER,cAAA,MAACS;oBAAIrD,WAAWN,OAAOuH,cAAc;;sCACjC,KAAC1I;4BACG2I,SAAQ;4BACRC,IAAG;4BACH3E,MAAK;4BACLxC,WAAWN,OAAO0H,mBAAmB;sCAEpC1F,KAAKyC,KAAK;;sCAEf,KAAC/F;4BAAQ4B,WAAWN,OAAO2H,qBAAqB;;sCAChD,KAAChE;4BAAIrD,WAAWN,OAAO4H,kBAAkB;sCACrC,cAAA,KAACjB;gCACGC,UAAU5E,KAAKQ,EAAE;gCACjBN,MAAM,YAAEF,iBAAAA,KAAKC,OAAO,cAAZD,qCAAAA,eAAcE,MAAM,yCAAI,EAAE;gCAClCX,qBAAqBA;;;;;;;;AAOjD;AACA,MAAMoF,6BAMF,CAAC,EAAEzE,MAAM,EAAE0E,QAAQ,EAAErF,mBAAmB,EAAEP,qBAAqB,EAAE;IACjE,qBACI,KAAC1B;kBACI4C,OAAOK,GAAG,CAAC,CAACH,OAAOyF;;gBAKFzF;YAJd,IAAI,CAACA,MAAMC,KAAK,CAACC,MAAM,EAAE;gBACrB,OAAO;YACX;YAEA,MAAMmC,iBAAQrC,eAAAA,MAAMqC,KAAK,cAAXrC,mCAAAA,aAAa0F,IAAI,yCAAM;YACrC,2CAA2C,GAC3C,qBACI,MAACnE;gBAAwCrD,WAAWN,OAAO+H,YAAY;;oBAClEtD,uBACG,KAAC5F;wBACG2I,SAAQ;wBACR1E,MAAK;wBACLxC,WAAWN,OAAOgI,kBAAkB;kCAEnCvD;;oBAGRrC,MAAMC,KAAK,CAACE,GAAG,CAAC,CAAC0F,MAAMJ,sBACpB,KAAC/H;4BAEG0C,IAAIyF,KAAKzF,EAAE;4BACXgC,IAAIyD,KAAKzD,EAAE;4BACXC,OAAOwD,KAAKxD,KAAK;4BACjBE,UAAUsD,KAAKtD,QAAQ;4BACvBrE,WAAWkD;4BACXqB,KAAKpF,cAAcwI,KAAKnD,OAAO,EAAEmD,KAAKpD,GAAG;4BACzC+B,UAAUA;4BACVrF,qBAAqBA;4BACrB2G,aAAalH;2BATR,CAAC,CAAC,EAAE4F,SAAS,CAAC,EAAEqB,KAAKzF,EAAE,CAAC,CAAC,EAAEqF,OAAO;;eAZzC,CAAC,OAAO,EAAEjB,SAAS,CAAC,EAAEiB,OAAO;QA0B3C,0CAA0C,GAC9C;;AAGZ;AAEA,SAASjC,WAAW,EAAEuC,QAAQ,EAAO;IACjC,MAAMC,OAAO/I,SAASkD,GAAG,CAAC4F,UAAUE,CAAAA;QAChC,OAAOA,uBAAS9I,eAAe8I,SAASA,QAAQ;IACpD;IACA,OAAOD,CAAAA,iBAAAA,2BAAAA,KAAM9F,MAAM,kBACf,MAACxD;QAAcyG,MAAK;QAAOjF,WAAWN,OAAOsI,MAAM;QAAEpF,WAAQ;;0BACzD,KAACS;gBAAIrD,WAAWN,OAAOuI,WAAW;0BAAGH;;0BAErC,KAAC1J;gBAAQ8J,SAAS;gBAAGlI,WAAWN,OAAOyI,UAAU;;;SAErD;AACR;AAEA,SAAS3C,cAAc,EAAEqC,QAAQ,EAAO;IACpC,qBACI,MAACrJ;QAAcyG,MAAK;QAAOjF,WAAWN,OAAO0I,SAAS;QAAExF,WAAQ;;0BAC5D,KAACS;gBAAIrD,WAAWN,OAAOiG,OAAO;;YAC7BkC;;;AAGb"}