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