@servicetitan/navigation 12.0.3 → 13.0.0-canary.256.44cf055.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 (252) hide show
  1. package/dist/components/counter-tag.d.ts +1 -1
  2. package/dist/components/counter-tag.d.ts.map +1 -1
  3. package/dist/components/counter-tag.js.map +1 -1
  4. package/dist/components/profile-dropdown/interface.d.ts +55 -0
  5. package/dist/components/profile-dropdown/interface.d.ts.map +1 -0
  6. package/dist/components/profile-dropdown/interface.js.map +1 -0
  7. package/dist/components/profile-dropdown/profile-dropdown-legacy.stories.d.ts +13 -0
  8. package/dist/components/profile-dropdown/profile-dropdown-legacy.stories.d.ts.map +1 -0
  9. package/dist/components/profile-dropdown/profile-dropdown-stacked.stories.d.ts +5 -1
  10. package/dist/components/profile-dropdown/profile-dropdown-stacked.stories.d.ts.map +1 -1
  11. package/dist/components/profile-dropdown/profile-dropdown.d.ts +9 -79
  12. package/dist/components/profile-dropdown/profile-dropdown.d.ts.map +1 -1
  13. package/dist/components/profile-dropdown/profile-dropdown.js +22 -22
  14. package/dist/components/profile-dropdown/profile-dropdown.js.map +1 -1
  15. package/dist/components/profile-dropdown/profile-dropdown.stories.d.ts +5 -1
  16. package/dist/components/profile-dropdown/profile-dropdown.stories.d.ts.map +1 -1
  17. package/dist/components/titan-layout/interface-internal.d.ts +12 -0
  18. package/dist/components/titan-layout/interface-internal.d.ts.map +1 -1
  19. package/dist/components/titan-layout/interface-internal.js.map +1 -1
  20. package/dist/components/titan-layout/interface.d.ts +67 -14
  21. package/dist/components/titan-layout/interface.d.ts.map +1 -1
  22. package/dist/components/titan-layout/interface.js.map +1 -1
  23. package/dist/components/titan-layout/layout-header-dark.d.ts.map +1 -1
  24. package/dist/components/titan-layout/layout-header-dark.js +24 -12
  25. package/dist/components/titan-layout/layout-header-dark.js.map +1 -1
  26. package/dist/components/titan-layout/layout-header-links-internal.d.ts +22 -3
  27. package/dist/components/titan-layout/layout-header-links-internal.d.ts.map +1 -1
  28. package/dist/components/titan-layout/layout-header-links-internal.js +15 -18
  29. package/dist/components/titan-layout/layout-header-links-internal.js.map +1 -1
  30. package/dist/components/titan-layout/layout-header-links.d.ts +3 -4
  31. package/dist/components/titan-layout/layout-header-links.d.ts.map +1 -1
  32. package/dist/components/titan-layout/layout-header-links.js +25 -5
  33. package/dist/components/titan-layout/layout-header-links.js.map +1 -1
  34. package/dist/components/titan-layout/layout-header.d.ts +4 -2
  35. package/dist/components/titan-layout/layout-header.d.ts.map +1 -1
  36. package/dist/components/titan-layout/layout-header.js +25 -16
  37. package/dist/components/titan-layout/layout-header.js.map +1 -1
  38. package/dist/components/titan-layout/layout-header.module.less +37 -1
  39. package/dist/components/titan-layout/layout-header.module.less.d.ts +3 -0
  40. package/dist/components/titan-layout/layout-profile.d.ts +8 -5
  41. package/dist/components/titan-layout/layout-profile.d.ts.map +1 -1
  42. package/dist/components/titan-layout/layout-profile.js +30 -28
  43. package/dist/components/titan-layout/layout-profile.js.map +1 -1
  44. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts +48 -31
  45. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts.map +1 -1
  46. package/dist/components/titan-layout/layout-sidebar-links-internal.js +87 -83
  47. package/dist/components/titan-layout/layout-sidebar-links-internal.js.map +1 -1
  48. package/dist/components/titan-layout/layout-sidebar-links.d.ts +3 -3
  49. package/dist/components/titan-layout/layout-sidebar-links.d.ts.map +1 -1
  50. package/dist/components/titan-layout/layout-sidebar-links.js +32 -19
  51. package/dist/components/titan-layout/layout-sidebar-links.js.map +1 -1
  52. package/dist/components/titan-layout/layout-sidebar.d.ts +1 -1
  53. package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -1
  54. package/dist/components/titan-layout/layout-sidebar.js +81 -102
  55. package/dist/components/titan-layout/layout-sidebar.js.map +1 -1
  56. package/dist/components/titan-layout/layout-sidebar.module.less +74 -22
  57. package/dist/components/titan-layout/titan-layout-default.stories.d.ts +16 -0
  58. package/dist/components/titan-layout/titan-layout-default.stories.d.ts.map +1 -0
  59. package/dist/components/titan-layout/titan-layout-legacy.stories.d.ts +10 -0
  60. package/dist/components/titan-layout/titan-layout-legacy.stories.d.ts.map +1 -0
  61. package/dist/components/titan-layout/titan-layout-links.d.ts +5 -0
  62. package/dist/components/titan-layout/titan-layout-links.d.ts.map +1 -0
  63. package/dist/components/titan-layout/titan-layout-links.js +34 -0
  64. package/dist/components/titan-layout/titan-layout-links.js.map +1 -0
  65. package/dist/components/titan-layout/titan-layout-stacked.stories.d.ts +10 -0
  66. package/dist/components/titan-layout/titan-layout-stacked.stories.d.ts.map +1 -0
  67. package/dist/components/titan-layout/titan-layout.d.ts +5 -4
  68. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -1
  69. package/dist/components/titan-layout/titan-layout.js +33 -14
  70. package/dist/components/titan-layout/titan-layout.js.map +1 -1
  71. package/dist/index.d.ts +1 -6
  72. package/dist/index.d.ts.map +1 -1
  73. package/dist/index.js +0 -4
  74. package/dist/index.js.map +1 -1
  75. package/dist/test/data.d.ts +26 -23
  76. package/dist/test/data.d.ts.map +1 -1
  77. package/dist/test/data.js +26 -69
  78. package/dist/test/data.js.map +1 -1
  79. package/dist/test/titan-layout.d.ts +16 -0
  80. package/dist/test/titan-layout.d.ts.map +1 -0
  81. package/dist/test/titan-layout.js +21 -0
  82. package/dist/test/titan-layout.js.map +1 -0
  83. package/dist/utils/navigation-context.d.ts +3 -22
  84. package/dist/utils/navigation-context.d.ts.map +1 -1
  85. package/dist/utils/navigation-context.js +2 -10
  86. package/dist/utils/navigation-context.js.map +1 -1
  87. package/dist/utils/navigation.d.ts +2 -7
  88. package/dist/utils/navigation.d.ts.map +1 -1
  89. package/dist/utils/navigation.js.map +1 -1
  90. package/package.json +4 -4
  91. package/src/components/counter-tag.tsx +1 -1
  92. package/src/components/profile-dropdown/interface.ts +47 -0
  93. package/src/components/profile-dropdown/profile-dropdown-legacy.stories.tsx +25 -0
  94. package/src/components/profile-dropdown/profile-dropdown-stacked.stories.tsx +15 -7
  95. package/src/components/profile-dropdown/profile-dropdown.stories.tsx +50 -43
  96. package/src/components/profile-dropdown/profile-dropdown.tsx +39 -115
  97. package/src/components/titan-layout/interface-internal.ts +13 -0
  98. package/src/components/titan-layout/interface.ts +73 -17
  99. package/src/components/titan-layout/layout-header-dark.tsx +21 -5
  100. package/src/components/titan-layout/layout-header-links-internal.tsx +41 -54
  101. package/src/components/titan-layout/layout-header-links.tsx +65 -12
  102. package/src/components/titan-layout/layout-header.module.less +37 -1
  103. package/src/components/titan-layout/layout-header.module.less.d.ts +3 -0
  104. package/src/components/titan-layout/layout-header.tsx +28 -15
  105. package/src/components/titan-layout/layout-profile.tsx +53 -34
  106. package/src/components/titan-layout/layout-sidebar-links-internal.tsx +188 -147
  107. package/src/components/titan-layout/layout-sidebar-links.tsx +73 -26
  108. package/src/components/titan-layout/layout-sidebar.module.less +74 -22
  109. package/src/components/titan-layout/layout-sidebar.tsx +55 -80
  110. package/src/components/titan-layout/{titan-layout.stories.tsx → titan-layout-default.stories.tsx} +131 -114
  111. package/src/components/titan-layout/titan-layout-legacy.stories.tsx +24 -0
  112. package/src/components/titan-layout/titan-layout-links.tsx +34 -0
  113. package/src/components/titan-layout/titan-layout-stacked.stories.tsx +30 -0
  114. package/src/components/titan-layout/titan-layout.tsx +39 -15
  115. package/src/index.ts +1 -12
  116. package/src/test/data.tsx +31 -83
  117. package/src/test/titan-layout.tsx +34 -0
  118. package/src/utils/navigation-context.tsx +9 -35
  119. package/src/utils/navigation.ts +3 -10
  120. package/dist/components/header-navigation/header-navigation-content.d.ts +0 -30
  121. package/dist/components/header-navigation/header-navigation-content.d.ts.map +0 -1
  122. package/dist/components/header-navigation/header-navigation-content.js +0 -58
  123. package/dist/components/header-navigation/header-navigation-content.js.map +0 -1
  124. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.d.ts +0 -9
  125. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.d.ts.map +0 -1
  126. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts +0 -12
  127. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts.map +0 -1
  128. package/dist/components/header-navigation/header-navigation-links.d.ts +0 -11
  129. package/dist/components/header-navigation/header-navigation-links.d.ts.map +0 -1
  130. package/dist/components/header-navigation/header-navigation-links.js +0 -62
  131. package/dist/components/header-navigation/header-navigation-links.js.map +0 -1
  132. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts +0 -12
  133. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts.map +0 -1
  134. package/dist/components/header-navigation/header-navigation-stories.module.less +0 -6
  135. package/dist/components/header-navigation/header-navigation-stories.module.less.d.ts +0 -3
  136. package/dist/components/header-navigation/header-navigation.d.ts +0 -59
  137. package/dist/components/header-navigation/header-navigation.d.ts.map +0 -1
  138. package/dist/components/header-navigation/header-navigation.js +0 -228
  139. package/dist/components/header-navigation/header-navigation.js.map +0 -1
  140. package/dist/components/header-navigation/header-navigation.module.less +0 -260
  141. package/dist/components/header-navigation/header-navigation.module.less.d.ts +0 -22
  142. package/dist/components/header-navigation/header-navigation.stories.d.ts +0 -12
  143. package/dist/components/header-navigation/header-navigation.stories.d.ts.map +0 -1
  144. package/dist/components/header-navigation/index.d.ts +0 -2
  145. package/dist/components/header-navigation/index.d.ts.map +0 -1
  146. package/dist/components/header-navigation/index.js +0 -3
  147. package/dist/components/header-navigation/index.js.map +0 -1
  148. package/dist/components/header-navigation/with-tooltip.d.ts +0 -4
  149. package/dist/components/header-navigation/with-tooltip.d.ts.map +0 -1
  150. package/dist/components/header-navigation/with-tooltip.js +0 -10
  151. package/dist/components/header-navigation/with-tooltip.js.map +0 -1
  152. package/dist/components/layout.stories.d.ts +0 -13
  153. package/dist/components/layout.stories.d.ts.map +0 -1
  154. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.d.ts +0 -9
  155. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.d.ts.map +0 -1
  156. package/dist/components/left-navigation/header-navigation-tiny-links.d.ts +0 -18
  157. package/dist/components/left-navigation/header-navigation-tiny-links.d.ts.map +0 -1
  158. package/dist/components/left-navigation/header-navigation-tiny-links.js +0 -79
  159. package/dist/components/left-navigation/header-navigation-tiny-links.js.map +0 -1
  160. package/dist/components/left-navigation/header-navigation-tiny.d.ts +0 -23
  161. package/dist/components/left-navigation/header-navigation-tiny.d.ts.map +0 -1
  162. package/dist/components/left-navigation/header-navigation-tiny.js +0 -32
  163. package/dist/components/left-navigation/header-navigation-tiny.js.map +0 -1
  164. package/dist/components/left-navigation/header-navigation-tiny.module.less +0 -117
  165. package/dist/components/left-navigation/header-navigation-tiny.module.less.d.ts +0 -15
  166. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts +0 -12
  167. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts.map +0 -1
  168. package/dist/components/left-navigation/index.d.ts +0 -5
  169. package/dist/components/left-navigation/index.d.ts.map +0 -1
  170. package/dist/components/left-navigation/index.js +0 -5
  171. package/dist/components/left-navigation/index.js.map +0 -1
  172. package/dist/components/left-navigation/interface-internal.d.ts +0 -10
  173. package/dist/components/left-navigation/interface-internal.d.ts.map +0 -1
  174. package/dist/components/left-navigation/interface-internal.js +0 -3
  175. package/dist/components/left-navigation/interface-internal.js.map +0 -1
  176. package/dist/components/left-navigation/interface.d.ts +0 -20
  177. package/dist/components/left-navigation/interface.d.ts.map +0 -1
  178. package/dist/components/left-navigation/interface.js.map +0 -1
  179. package/dist/components/left-navigation/side-navigation-context.d.ts +0 -8
  180. package/dist/components/left-navigation/side-navigation-context.d.ts.map +0 -1
  181. package/dist/components/left-navigation/side-navigation-context.js +0 -8
  182. package/dist/components/left-navigation/side-navigation-context.js.map +0 -1
  183. package/dist/components/left-navigation/side-navigation-links-internal.d.ts +0 -28
  184. package/dist/components/left-navigation/side-navigation-links-internal.d.ts.map +0 -1
  185. package/dist/components/left-navigation/side-navigation-links-internal.js +0 -89
  186. package/dist/components/left-navigation/side-navigation-links-internal.js.map +0 -1
  187. package/dist/components/left-navigation/side-navigation-links.d.ts +0 -6
  188. package/dist/components/left-navigation/side-navigation-links.d.ts.map +0 -1
  189. package/dist/components/left-navigation/side-navigation-links.js +0 -48
  190. package/dist/components/left-navigation/side-navigation-links.js.map +0 -1
  191. package/dist/components/left-navigation/side-navigation.d.ts +0 -29
  192. package/dist/components/left-navigation/side-navigation.d.ts.map +0 -1
  193. package/dist/components/left-navigation/side-navigation.js +0 -411
  194. package/dist/components/left-navigation/side-navigation.js.map +0 -1
  195. package/dist/components/left-navigation/side-navigation.module.less +0 -530
  196. package/dist/components/left-navigation/side-navigation.module.less.d.ts +0 -48
  197. package/dist/components/left-navigation/side-navigation.stories.d.ts +0 -17
  198. package/dist/components/left-navigation/side-navigation.stories.d.ts.map +0 -1
  199. package/dist/components/left-navigation/with-tooltip.d.ts +0 -4
  200. package/dist/components/left-navigation/with-tooltip.d.ts.map +0 -1
  201. package/dist/components/left-navigation/with-tooltip.js +0 -15
  202. package/dist/components/left-navigation/with-tooltip.js.map +0 -1
  203. package/dist/components/links.d.ts +0 -5
  204. package/dist/components/links.d.ts.map +0 -1
  205. package/dist/components/links.js +0 -35
  206. package/dist/components/links.js.map +0 -1
  207. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.d.ts +0 -9
  208. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.d.ts.map +0 -1
  209. package/dist/components/titan-layout/layout-profile.stories.d.ts +0 -13
  210. package/dist/components/titan-layout/layout-profile.stories.d.ts.map +0 -1
  211. package/dist/components/titan-layout/titan-layout.stories.d.ts +0 -29
  212. package/dist/components/titan-layout/titan-layout.stories.d.ts.map +0 -1
  213. package/dist/utils/navigation-legacy.d.ts +0 -88
  214. package/dist/utils/navigation-legacy.d.ts.map +0 -1
  215. package/dist/utils/navigation-legacy.js +0 -3
  216. package/dist/utils/navigation-legacy.js.map +0 -1
  217. package/src/components/header-navigation/header-navigation-content.tsx +0 -120
  218. package/src/components/header-navigation/header-navigation-extra-stacked.stories.tsx +0 -19
  219. package/src/components/header-navigation/header-navigation-extra.stories.tsx +0 -142
  220. package/src/components/header-navigation/header-navigation-links.tsx +0 -141
  221. package/src/components/header-navigation/header-navigation-stacked.stories.tsx +0 -146
  222. package/src/components/header-navigation/header-navigation-stories.module.less +0 -6
  223. package/src/components/header-navigation/header-navigation-stories.module.less.d.ts +0 -3
  224. package/src/components/header-navigation/header-navigation.module.less +0 -260
  225. package/src/components/header-navigation/header-navigation.module.less.d.ts +0 -22
  226. package/src/components/header-navigation/header-navigation.stories.tsx +0 -165
  227. package/src/components/header-navigation/header-navigation.tsx +0 -327
  228. package/src/components/header-navigation/index.ts +0 -1
  229. package/src/components/header-navigation/with-tooltip.tsx +0 -15
  230. package/src/components/layout.stories.tsx +0 -103
  231. package/src/components/left-navigation/header-navigation-extra-tiny.stories.tsx +0 -21
  232. package/src/components/left-navigation/header-navigation-tiny-links.tsx +0 -145
  233. package/src/components/left-navigation/header-navigation-tiny.module.less +0 -117
  234. package/src/components/left-navigation/header-navigation-tiny.module.less.d.ts +0 -15
  235. package/src/components/left-navigation/header-navigation-tiny.stories.tsx +0 -178
  236. package/src/components/left-navigation/header-navigation-tiny.tsx +0 -65
  237. package/src/components/left-navigation/index.ts +0 -4
  238. package/src/components/left-navigation/interface-internal.ts +0 -11
  239. package/src/components/left-navigation/interface.ts +0 -26
  240. package/src/components/left-navigation/side-navigation-context.tsx +0 -13
  241. package/src/components/left-navigation/side-navigation-links-internal.tsx +0 -151
  242. package/src/components/left-navigation/side-navigation-links.tsx +0 -57
  243. package/src/components/left-navigation/side-navigation.module.less +0 -530
  244. package/src/components/left-navigation/side-navigation.module.less.d.ts +0 -48
  245. package/src/components/left-navigation/side-navigation.stories.tsx +0 -226
  246. package/src/components/left-navigation/side-navigation.tsx +0 -543
  247. package/src/components/left-navigation/with-tooltip.tsx +0 -16
  248. package/src/components/links.tsx +0 -54
  249. package/src/components/profile-dropdown/profile-dropdown-tiny.stories.tsx +0 -25
  250. package/src/components/titan-layout/layout-profile.stories.tsx +0 -46
  251. package/src/utils/navigation-legacy.ts +0 -106
  252. /package/dist/components/{left-navigation → profile-dropdown}/interface.js +0 -0
@@ -1,62 +1,37 @@
1
- import { Icon } from '@servicetitan/anvil2';
1
+ import { Button, Icon, IconProps } from '@servicetitan/anvil2';
2
2
  import SvgGroupCollapse from '@servicetitan/anvil2/assets/icons/material/round/expand_less.svg';
3
3
  import SvgGroupExpand from '@servicetitan/anvil2/assets/icons/material/round/expand_more.svg';
4
-
5
4
  import classNames from 'classnames';
6
- import { FC, Fragment, MouseEvent, ReactNode } from 'react';
7
- import { NavigationItemData, NavigationSubmenuItemData } from '../../utils/navigation';
8
- import { getCounterTag } from '../../utils/side-nav';
5
+ import { ComponentPropsWithoutRef, FC, Fragment, MouseEvent, ReactNode } from 'react';
6
+
9
7
  import { BadgeTag, BadgeTagProps } from '../badge-tag';
10
- import { TitanLayoutSidebarTriggerProps } from './interface';
11
8
  import { NavigationComponentProps } from './interface-internal';
12
9
  import * as Styles from './layout-sidebar.module.less';
10
+ import { withTooltip } from './with-tooltip';
13
11
 
14
- export interface InternalSideNavigationItemContentProps
15
- extends Omit<NavigationItemData, 'iconName' | 'to' | 'counter' | 'tag'> {
16
- submenuExpanded: boolean | undefined;
12
+ export interface InternalSideNavigationItemContentProps {
13
+ icon: IconProps['svg'] | undefined;
14
+ iconActive: IconProps['svg'] | undefined;
15
+ title: string;
17
16
  tag: BadgeTagProps | undefined;
18
- onExpandToggle?: (e: MouseEvent<never>) => void;
19
17
  }
20
18
 
21
- export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemContentProps> = ({
19
+ const InternalSideNavigationItemContent: FC<InternalSideNavigationItemContentProps> = ({
22
20
  icon,
23
21
  iconActive,
24
- iconClassName,
25
- iconComponent: IconComponent,
26
22
  tag,
27
23
  title,
28
- submenuExpanded,
29
- onExpandToggle,
30
24
  }) => (
31
25
  <Fragment>
32
26
  <div className={Styles.navItemIconWrapper}>
33
- {IconComponent ? (
34
- <i className={classNames(Styles.navIcon, iconClassName)}>
35
- <IconComponent />
36
- </i>
37
- ) : (
38
- <Fragment>
39
- {icon && (
40
- <Icon
41
- svg={icon}
42
- className={classNames(
43
- Styles.navIcon,
44
- Styles.navIconInactive,
45
- iconClassName
46
- )}
47
- />
48
- )}
49
- {iconActive && (
50
- <Icon
51
- svg={iconActive}
52
- className={classNames(
53
- Styles.navIcon,
54
- Styles.navIconActive,
55
- iconClassName
56
- )}
57
- />
58
- )}
59
- </Fragment>
27
+ {icon && (
28
+ <Icon svg={icon} className={classNames(Styles.navIcon, Styles.navIconInactive)} />
29
+ )}
30
+ {iconActive && (
31
+ <Icon
32
+ svg={iconActive}
33
+ className={classNames(Styles.navIcon, Styles.navIconActive)}
34
+ />
60
35
  )}
61
36
 
62
37
  <div className={Styles.navItemTextExpanded} data-cy="nav-item-label">
@@ -69,20 +44,6 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
69
44
  longClassName={Styles.navItemCounterLong}
70
45
  />
71
46
  )}
72
- {typeof submenuExpanded === 'boolean' && (
73
- <div className={Styles.navItemGroupToggleWrapper}>
74
- <Icon
75
- svg={submenuExpanded ? SvgGroupCollapse : SvgGroupExpand}
76
- className={Styles.navItemGroupToggle}
77
- onClick={onExpandToggle}
78
- />
79
- <div
80
- className={Styles.navItemGroupToggleClick}
81
- data-cy="nav-item-group-expand"
82
- onClick={onExpandToggle}
83
- />
84
- </div>
85
- )}
86
47
  </div>
87
48
 
88
49
  <div
@@ -96,66 +57,49 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
96
57
  </Fragment>
97
58
  );
98
59
 
99
- export interface InternalSideNavigationLinkProps
100
- extends Omit<NavigationItemData, 'iconName' | 'counter' | 'tag'>,
101
- NavigationComponentProps {
102
- submenuExpanded: boolean | undefined;
103
- dataPrefix?: string;
104
- tag: BadgeTagProps | undefined;
105
- onExpandToggle?: (e: MouseEvent<never>) => void;
106
- }
107
-
108
- export const internalNavigationContentContainerProps = ({
109
- className,
110
- icon,
111
- iconActive,
112
- iconComponent,
113
- id,
114
- isActive,
115
- prefix,
116
- isLink,
117
- }: Omit<TitanLayoutSidebarTriggerProps, 'isActive' | 'tag'> & {
118
- prefix: string;
119
- isActive?: any;
120
- isLink: boolean;
121
- }) => ({
122
- 'data-cy': `${prefix}-${id}`,
123
- 'data-pendo': `${prefix}-${id}`,
124
- 'className': classNames(Styles.navItem, className, {
125
- [Styles.navLink]: isLink,
126
- [Styles.navItemActive]: isActive === true,
127
- [Styles.navItemIconSwitch]: !!icon && !!iconActive && !iconComponent,
128
- }),
129
- });
130
-
131
60
  /** Side Navigation menu item (for internal usage) */
132
- export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = ({
61
+ export const InternalSideNavigationLink: FC<
62
+ NavigationComponentProps & {
63
+ id: string;
64
+ to: string;
65
+ title: string;
66
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
67
+ icon: IconProps['svg'] | undefined;
68
+ iconActive: IconProps['svg'] | undefined;
69
+ className: string | undefined;
70
+ tag: BadgeTagProps | undefined;
71
+ } & Omit<ComponentPropsWithoutRef<'a'>, 'children' | 'title'>
72
+ > = ({
73
+ id,
133
74
  to,
134
- className,
135
- dataPrefix,
75
+ title,
136
76
  isActive,
77
+ icon,
78
+ iconActive,
79
+ className,
80
+ tag,
81
+
137
82
  navigationComponent: NavigationComponent,
138
- submenuExpanded,
139
- onExpandToggle,
140
- ...props
83
+ ...rest
141
84
  }) => {
142
85
  return (
143
86
  <NavigationComponent
144
- {...internalNavigationContentContainerProps({
145
- ...props,
146
- prefix: dataPrefix ?? 'navigation-item',
147
- className,
148
- isActive,
149
- isLink: true,
87
+ data-cy={`navigation-item-${id}`}
88
+ data-pendo={`navigation-item-${id}`}
89
+ {...rest}
90
+ className={classNames(Styles.navItem, Styles.navLink, className, {
91
+ [Styles.navItemActive]: isActive === true,
92
+ [Styles.navItemIconSwitch]: !!icon && !!iconActive,
150
93
  })}
151
94
  to={to}
152
95
  isActive={typeof isActive === 'function' ? isActive : undefined}
153
96
  activeClassName={Styles.navItemActive}
154
97
  >
155
98
  <InternalSideNavigationItemContent
156
- submenuExpanded={submenuExpanded}
157
- onExpandToggle={onExpandToggle}
158
- {...props}
99
+ icon={icon}
100
+ iconActive={iconActive}
101
+ title={title}
102
+ tag={tag}
159
103
  />
160
104
  </NavigationComponent>
161
105
  );
@@ -163,40 +107,69 @@ export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = (
163
107
 
164
108
  /** Side Navigation menu trigger (for internal usage) */
165
109
  export const InternalSideNavigationTrigger: FC<
166
- Omit<InternalSideNavigationLinkProps, 'to' | 'navigationComponent'> & {
110
+ {
111
+ id: string;
112
+ title: string;
113
+ isActive: boolean | undefined;
114
+ icon: IconProps['svg'] | undefined;
115
+ iconActive: IconProps['svg'] | undefined;
116
+ className: string | undefined;
117
+
118
+ tag: BadgeTagProps | undefined;
167
119
  onClick?: (e: MouseEvent<never>) => void;
168
- }
169
- > = ({ className, dataPrefix, isActive, submenuExpanded, onExpandToggle, onClick, ...props }) => {
120
+ } & Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'title'>
121
+ > = ({
122
+ id,
123
+ title,
124
+ isActive,
125
+ icon,
126
+ iconActive,
127
+ className,
128
+
129
+ tag,
130
+ ...rest
131
+ }) => {
170
132
  return (
171
133
  <div
172
- {...internalNavigationContentContainerProps({
173
- ...props,
174
- prefix: dataPrefix ?? 'navigation-item',
175
- className,
176
- isActive,
177
- isLink: !!onClick,
134
+ data-cy={`navigation-item-${id}`}
135
+ data-pendo={`navigation-item-${id}`}
136
+ {...rest}
137
+ className={classNames(Styles.navItem, className, {
138
+ [Styles.navLink]: !!rest.onClick,
139
+ [Styles.navItemActive]: isActive === true,
140
+ [Styles.navItemIconSwitch]: !!icon && !!iconActive,
178
141
  })}
179
- onClick={onClick}
180
142
  >
181
143
  <InternalSideNavigationItemContent
182
- submenuExpanded={submenuExpanded}
183
- onExpandToggle={onExpandToggle}
184
- {...props}
144
+ icon={icon}
145
+ iconActive={iconActive}
146
+ title={title}
147
+ tag={tag}
185
148
  />
186
149
  </div>
187
150
  );
188
151
  };
189
152
 
190
153
  export const InternalSideNavigationGroupLink: FC<
191
- NavigationSubmenuItemData & NavigationComponentProps & { parentId: string }
154
+ NavigationComponentProps & {
155
+ id: string;
156
+ to: string;
157
+ title: string;
158
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
159
+ className: string | undefined;
160
+ tag: BadgeTagProps | undefined;
161
+
162
+ parentId: string;
163
+ }
192
164
  > = ({
193
165
  id,
194
- counter,
195
- parentId,
196
- tag,
197
- title,
198
166
  to,
167
+ title,
199
168
  isActive,
169
+ className,
170
+ tag,
171
+
172
+ parentId,
200
173
  navigationComponent: NavigationComponent,
201
174
  ...rest
202
175
  }) => {
@@ -207,21 +180,35 @@ export const InternalSideNavigationGroupLink: FC<
207
180
  data-pendo={`navigation-item-${parentId}--${id}`}
208
181
  {...rest}
209
182
  to={to}
210
- className={classNames(Styles.submenuItem, Styles.submenuLink, {
183
+ className={classNames(Styles.submenuItem, Styles.submenuLink, className, {
211
184
  [Styles.submenuLinkActive]: isActive === true,
212
185
  })}
213
186
  isActive={typeof isActive === 'function' ? isActive : undefined}
214
187
  activeClassName={Styles.submenuLinkActive}
215
188
  >
216
189
  <span>{title}</span>
217
- <BadgeTag data={getCounterTag(counter, tag)} className={Styles.submenuLinkCounter} />
190
+ <BadgeTag data={tag} className={Styles.submenuLinkCounter} />
218
191
  </NavigationComponent>
219
192
  );
220
193
  };
221
194
 
222
- export const InternalSideNavigationGroupTrigger: FC<
223
- Omit<NavigationSubmenuItemData, 'to'> & { onClick?: (e: MouseEvent<any>) => void }
224
- > = ({ id, counter, onClick, tag, title, isActive, ...rest }) => {
195
+ export const InternalSideNavigationGroupTrigger: FC<{
196
+ id: string;
197
+ title: string;
198
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
199
+ className: string | undefined;
200
+ tag: BadgeTagProps | undefined;
201
+
202
+ onClick?: (e: MouseEvent<any>) => void;
203
+ }> = ({
204
+ id,
205
+ title,
206
+ isActive,
207
+ className,
208
+ tag,
209
+
210
+ ...rest
211
+ }) => {
225
212
  return (
226
213
  <div
227
214
  data-cy={`navigation-item-${id}`}
@@ -229,13 +216,12 @@ export const InternalSideNavigationGroupTrigger: FC<
229
216
  key={id}
230
217
  {...rest}
231
218
  className={classNames(Styles.submenuItem, {
232
- [Styles.submenuLink]: !!onClick,
219
+ [Styles.submenuLink]: !!rest.onClick,
233
220
  [Styles.submenuLinkActive]: isActive === true,
234
221
  })}
235
- onClick={onClick}
236
222
  >
237
223
  <span>{title}</span>
238
- <BadgeTag data={getCounterTag(counter, tag)} className={Styles.submenuLinkCounter} />
224
+ <BadgeTag data={tag} className={Styles.submenuLinkCounter} />
239
225
  </div>
240
226
  );
241
227
  };
@@ -245,40 +231,95 @@ export const InternalSideNavigationGroupDivider = () => {
245
231
  };
246
232
 
247
233
  export const InternalSideNavigationGroup: FC<
248
- Omit<NavigationItemData, 'tag' | 'counter' | 'to'> &
249
- NavigationComponentProps & {
250
- children: ReactNode;
251
- submenuExpanded: boolean;
252
- onExpandToggle?: (e: MouseEvent<never>) => void;
253
- tag: BadgeTagProps | undefined;
254
- to: NavigationItemData['to'] | undefined;
255
- onClick?: (e: MouseEvent<never>) => void;
234
+ NavigationComponentProps & {
235
+ id: string;
236
+ to: string | undefined;
237
+ title: string;
238
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
239
+ icon: IconProps['svg'] | undefined;
240
+ iconActive: IconProps['svg'] | undefined;
241
+ className: string | undefined;
242
+ tag: BadgeTagProps | undefined;
243
+
244
+ children: ReactNode;
245
+ submenuExpanded: boolean;
246
+ onClick?: (e: MouseEvent<never>) => void;
247
+ onExpandToggle(e: MouseEvent<never>): void;
248
+ }
249
+ > = ({
250
+ id,
251
+ to,
252
+ title,
253
+ isActive,
254
+ icon,
255
+ iconActive,
256
+ className,
257
+ tag,
258
+
259
+ children,
260
+ submenuExpanded,
261
+ onExpandToggle,
262
+ onClick,
263
+ navigationComponent,
264
+ ...rest
265
+ }) => {
266
+ const onRootClickCapture = (e: MouseEvent<never>) => {
267
+ if (!submenuExpanded) {
268
+ onExpandToggle?.(e);
269
+ e.preventDefault();
270
+ e.stopPropagation();
256
271
  }
257
- > = ({ children, submenuExpanded, to, onExpandToggle, onClick, ...props }) => {
272
+ };
258
273
  return (
259
274
  <div className={classNames(Styles.navGroupWrapper)}>
260
- <div className={Styles.navGroupItem}>
275
+ <div className={Styles.navGroupItem} onClickCapture={onRootClickCapture}>
261
276
  {to ? (
262
277
  <InternalSideNavigationLink
263
- {...props}
278
+ id={id}
264
279
  to={to}
265
- submenuExpanded={submenuExpanded}
266
- onExpandToggle={onExpandToggle}
280
+ title={title}
281
+ isActive={isActive}
282
+ icon={icon}
283
+ iconActive={iconActive}
284
+ tag={tag}
285
+ className={className}
286
+ {...rest}
287
+ navigationComponent={navigationComponent}
267
288
  />
268
289
  ) : (
269
290
  <InternalSideNavigationTrigger
270
- {...props}
271
- submenuExpanded={submenuExpanded}
272
- onExpandToggle={onExpandToggle}
273
- onClick={onClick}
291
+ id={id}
292
+ title={title}
293
+ isActive={isActive === true || undefined}
294
+ icon={icon}
295
+ iconActive={iconActive}
296
+ tag={tag}
297
+ className={className}
298
+ {...rest}
274
299
  />
275
300
  )}
301
+
302
+ <div className={Styles.navItemGroupToggleWrapper}>
303
+ {withTooltip(
304
+ <Button
305
+ appearance="secondary"
306
+ size="small"
307
+ icon={submenuExpanded ? SvgGroupCollapse : SvgGroupExpand}
308
+ className={Styles.navItemGroupToggle}
309
+ onClick={onExpandToggle}
310
+ aria-label="Toggle submenu"
311
+ data-cy="nav-item-group-expand"
312
+ />,
313
+ submenuExpanded ? 'Hide Submenu' : 'View Submenu',
314
+ { placement: 'top-end' }
315
+ )}
316
+ </div>
276
317
  </div>
277
318
  <div
278
319
  className={classNames(Styles.submenuWrapper, {
279
320
  [Styles.submenuWrapperCollapsed]: !submenuExpanded,
280
321
  })}
281
- data-cy={`navigation-submenu-${props.id}`}
322
+ data-cy={`navigation-submenu-${id}`}
282
323
  >
283
324
  <div className={Styles.submenu}>{children}</div>
284
325
  </div>
@@ -1,6 +1,6 @@
1
1
  import { FC, ReactElement } from 'react';
2
2
  import { getCounterTag } from '../../utils/side-nav';
3
- import { TitanLayoutSidebarLinkProps, TitanLayoutSidebarTriggerProps } from './interface';
3
+ import { TitanLayoutLinkProps, TitanLayoutTriggerProps } from './interface';
4
4
  import { useTitanLayoutContext } from './layout-context';
5
5
  import {
6
6
  InternalSideNavigationLink,
@@ -10,62 +10,109 @@ import { useNotificationsContext } from './notifications-context';
10
10
 
11
11
  const WrappedLink: FC<{
12
12
  children: ReactElement<any>;
13
- wrapper: NonNullable<TitanLayoutSidebarLinkProps['wrapper']>;
14
- }> = ({ children, wrapper: WrapperComponent }) => {
13
+ wrapper: NonNullable<TitanLayoutLinkProps['wrapper']>;
14
+ isMobile: boolean;
15
+ }> = ({ children, isMobile, wrapper: WrapperComponent }) => {
15
16
  const { sidebar } = useTitanLayoutContext();
16
- return <WrapperComponent context={sidebar}>{children}</WrapperComponent>;
17
+ return (
18
+ <WrapperComponent isMobile={isMobile} context={sidebar}>
19
+ {children}
20
+ </WrapperComponent>
21
+ );
17
22
  };
18
23
 
19
24
  /** Side Navigation menu link */
20
- export function TitanLayoutSidebarLink({ wrapper, ...props }: TitanLayoutSidebarLinkProps) {
25
+ export function LayoutSidebarLink({
26
+ id,
27
+ to,
28
+ title,
29
+ isActive,
30
+ icon,
31
+ iconActive,
32
+ counter,
33
+ tag,
34
+ className,
35
+
36
+ tooltip,
37
+ wrapper,
38
+ extra,
39
+ side,
40
+ ...rest
41
+ }: TitanLayoutLinkProps) {
21
42
  const {
22
43
  NavigationComponent,
23
44
  breakpoint: { isMobile },
24
45
  } = useTitanLayoutContext();
25
46
  const { onNotificationsUpdate } = useNotificationsContext();
26
- const tag = getCounterTag(props.counter, props.tag);
47
+ const tagData = getCounterTag(side?.counter ?? counter, tag);
27
48
 
28
- onNotificationsUpdate(props.id, !!tag);
49
+ onNotificationsUpdate(id, !!tagData);
29
50
 
30
51
  const element = (
31
52
  <InternalSideNavigationLink
32
- {...props}
53
+ id={id}
54
+ to={to}
55
+ title={title}
56
+ isActive={isActive}
57
+ icon={icon}
58
+ iconActive={iconActive}
59
+ tag={tagData}
60
+ className={className}
61
+ {...rest}
33
62
  navigationComponent={NavigationComponent}
34
- submenuExpanded={undefined}
35
- dataPrefix="navigation-item"
36
- tag={tag}
37
63
  />
38
64
  );
39
65
 
40
- return wrapper && !isMobile ? <WrappedLink wrapper={wrapper}>{element}</WrappedLink> : element;
66
+ return wrapper ? (
67
+ <WrappedLink isMobile={isMobile} wrapper={wrapper}>
68
+ {element}
69
+ </WrappedLink>
70
+ ) : (
71
+ element
72
+ );
41
73
  }
42
74
 
43
75
  /** Side Navigation menu trigger */
44
- export function TitanLayoutSidebarTrigger({
76
+ export function LayoutSidebarTrigger({
77
+ id,
78
+ title,
79
+ isActive,
80
+ icon,
81
+ iconActive,
82
+ counter,
83
+ tag,
84
+ className,
85
+
86
+ tooltip,
45
87
  wrapper,
46
- onMobileClick,
47
- onClick,
48
- ...props
49
- }: TitanLayoutSidebarTriggerProps) {
88
+ extra,
89
+ side,
90
+ ...rest
91
+ }: TitanLayoutTriggerProps) {
50
92
  const {
51
93
  breakpoint: { isMobile },
52
94
  } = useTitanLayoutContext();
53
95
  const { onNotificationsUpdate } = useNotificationsContext();
54
- const tag = getCounterTag(props.counter, props.tag);
96
+ const tagData = getCounterTag(side?.counter ?? counter, tag);
55
97
 
56
- onNotificationsUpdate(props.id, !!tag);
98
+ onNotificationsUpdate(id, !!tagData);
57
99
 
58
100
  const element = (
59
101
  <InternalSideNavigationTrigger
60
- {...props}
61
- submenuExpanded={undefined}
62
- dataPrefix="navigation-trigger"
63
- tag={tag}
64
- onClick={isMobile && !!onMobileClick ? onMobileClick : onClick}
102
+ id={id}
103
+ title={title}
104
+ isActive={isActive}
105
+ icon={icon}
106
+ iconActive={iconActive}
107
+ tag={tagData}
108
+ className={className}
109
+ {...rest}
65
110
  />
66
111
  );
67
- return wrapper && (!isMobile || !onMobileClick) ? (
68
- <WrappedLink wrapper={wrapper}>{element}</WrappedLink>
112
+ return wrapper ? (
113
+ <WrappedLink isMobile={isMobile} wrapper={wrapper}>
114
+ {element}
115
+ </WrappedLink>
69
116
  ) : (
70
117
  element
71
118
  );