@servicetitan/navigation 12.0.3 → 13.0.0-canary.256.5761ed1.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 (248) 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 +66 -13
  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 +21 -11
  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 +31 -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 -25
  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 +56 -52
  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 +33 -18
  50. package/dist/components/titan-layout/layout-sidebar-links.js.map +1 -1
  51. package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -1
  52. package/dist/components/titan-layout/layout-sidebar.js +49 -24
  53. package/dist/components/titan-layout/layout-sidebar.js.map +1 -1
  54. package/dist/components/titan-layout/titan-layout-default.stories.d.ts +16 -0
  55. package/dist/components/titan-layout/titan-layout-default.stories.d.ts.map +1 -0
  56. package/dist/components/titan-layout/titan-layout-legacy.stories.d.ts +10 -0
  57. package/dist/components/titan-layout/titan-layout-legacy.stories.d.ts.map +1 -0
  58. package/dist/components/titan-layout/titan-layout-links.d.ts +5 -0
  59. package/dist/components/titan-layout/titan-layout-links.d.ts.map +1 -0
  60. package/dist/components/titan-layout/titan-layout-links.js +34 -0
  61. package/dist/components/titan-layout/titan-layout-links.js.map +1 -0
  62. package/dist/components/titan-layout/titan-layout-stacked.stories.d.ts +10 -0
  63. package/dist/components/titan-layout/titan-layout-stacked.stories.d.ts.map +1 -0
  64. package/dist/components/titan-layout/titan-layout.d.ts +5 -4
  65. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -1
  66. package/dist/components/titan-layout/titan-layout.js +10 -8
  67. package/dist/components/titan-layout/titan-layout.js.map +1 -1
  68. package/dist/index.d.ts +1 -6
  69. package/dist/index.d.ts.map +1 -1
  70. package/dist/index.js +0 -4
  71. package/dist/index.js.map +1 -1
  72. package/dist/test/data.d.ts +26 -23
  73. package/dist/test/data.d.ts.map +1 -1
  74. package/dist/test/data.js +26 -69
  75. package/dist/test/data.js.map +1 -1
  76. package/dist/test/titan-layout.d.ts +16 -0
  77. package/dist/test/titan-layout.d.ts.map +1 -0
  78. package/dist/test/titan-layout.js +21 -0
  79. package/dist/test/titan-layout.js.map +1 -0
  80. package/dist/utils/navigation-context.d.ts +3 -22
  81. package/dist/utils/navigation-context.d.ts.map +1 -1
  82. package/dist/utils/navigation-context.js +2 -10
  83. package/dist/utils/navigation-context.js.map +1 -1
  84. package/dist/utils/navigation.d.ts +2 -7
  85. package/dist/utils/navigation.d.ts.map +1 -1
  86. package/dist/utils/navigation.js.map +1 -1
  87. package/package.json +2 -2
  88. package/src/components/counter-tag.tsx +1 -1
  89. package/src/components/profile-dropdown/interface.ts +47 -0
  90. package/src/components/profile-dropdown/profile-dropdown-legacy.stories.tsx +25 -0
  91. package/src/components/profile-dropdown/profile-dropdown-stacked.stories.tsx +15 -7
  92. package/src/components/profile-dropdown/profile-dropdown.stories.tsx +50 -43
  93. package/src/components/profile-dropdown/profile-dropdown.tsx +39 -115
  94. package/src/components/titan-layout/interface-internal.ts +13 -0
  95. package/src/components/titan-layout/interface.ts +72 -16
  96. package/src/components/titan-layout/layout-header-dark.tsx +17 -4
  97. package/src/components/titan-layout/layout-header-links-internal.tsx +41 -54
  98. package/src/components/titan-layout/layout-header-links.tsx +65 -12
  99. package/src/components/titan-layout/layout-header.module.less +31 -0
  100. package/src/components/titan-layout/layout-header.module.less.d.ts +2 -0
  101. package/src/components/titan-layout/layout-header.tsx +2 -2
  102. package/src/components/titan-layout/layout-profile.tsx +53 -34
  103. package/src/components/titan-layout/layout-sidebar-links-internal.tsx +169 -116
  104. package/src/components/titan-layout/layout-sidebar-links.tsx +73 -24
  105. package/src/components/titan-layout/layout-sidebar.tsx +52 -28
  106. package/src/components/titan-layout/{titan-layout.stories.tsx → titan-layout-default.stories.tsx} +125 -113
  107. package/src/components/titan-layout/titan-layout-legacy.stories.tsx +24 -0
  108. package/src/components/titan-layout/titan-layout-links.tsx +34 -0
  109. package/src/components/titan-layout/titan-layout-stacked.stories.tsx +30 -0
  110. package/src/components/titan-layout/titan-layout.tsx +12 -9
  111. package/src/index.ts +1 -12
  112. package/src/test/data.tsx +31 -83
  113. package/src/test/titan-layout.tsx +34 -0
  114. package/src/utils/navigation-context.tsx +9 -35
  115. package/src/utils/navigation.ts +3 -10
  116. package/dist/components/header-navigation/header-navigation-content.d.ts +0 -30
  117. package/dist/components/header-navigation/header-navigation-content.d.ts.map +0 -1
  118. package/dist/components/header-navigation/header-navigation-content.js +0 -58
  119. package/dist/components/header-navigation/header-navigation-content.js.map +0 -1
  120. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.d.ts +0 -9
  121. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.d.ts.map +0 -1
  122. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts +0 -12
  123. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts.map +0 -1
  124. package/dist/components/header-navigation/header-navigation-links.d.ts +0 -11
  125. package/dist/components/header-navigation/header-navigation-links.d.ts.map +0 -1
  126. package/dist/components/header-navigation/header-navigation-links.js +0 -62
  127. package/dist/components/header-navigation/header-navigation-links.js.map +0 -1
  128. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts +0 -12
  129. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts.map +0 -1
  130. package/dist/components/header-navigation/header-navigation-stories.module.less +0 -6
  131. package/dist/components/header-navigation/header-navigation-stories.module.less.d.ts +0 -3
  132. package/dist/components/header-navigation/header-navigation.d.ts +0 -59
  133. package/dist/components/header-navigation/header-navigation.d.ts.map +0 -1
  134. package/dist/components/header-navigation/header-navigation.js +0 -228
  135. package/dist/components/header-navigation/header-navigation.js.map +0 -1
  136. package/dist/components/header-navigation/header-navigation.module.less +0 -260
  137. package/dist/components/header-navigation/header-navigation.module.less.d.ts +0 -22
  138. package/dist/components/header-navigation/header-navigation.stories.d.ts +0 -12
  139. package/dist/components/header-navigation/header-navigation.stories.d.ts.map +0 -1
  140. package/dist/components/header-navigation/index.d.ts +0 -2
  141. package/dist/components/header-navigation/index.d.ts.map +0 -1
  142. package/dist/components/header-navigation/index.js +0 -3
  143. package/dist/components/header-navigation/index.js.map +0 -1
  144. package/dist/components/header-navigation/with-tooltip.d.ts +0 -4
  145. package/dist/components/header-navigation/with-tooltip.d.ts.map +0 -1
  146. package/dist/components/header-navigation/with-tooltip.js +0 -10
  147. package/dist/components/header-navigation/with-tooltip.js.map +0 -1
  148. package/dist/components/layout.stories.d.ts +0 -13
  149. package/dist/components/layout.stories.d.ts.map +0 -1
  150. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.d.ts +0 -9
  151. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.d.ts.map +0 -1
  152. package/dist/components/left-navigation/header-navigation-tiny-links.d.ts +0 -18
  153. package/dist/components/left-navigation/header-navigation-tiny-links.d.ts.map +0 -1
  154. package/dist/components/left-navigation/header-navigation-tiny-links.js +0 -79
  155. package/dist/components/left-navigation/header-navigation-tiny-links.js.map +0 -1
  156. package/dist/components/left-navigation/header-navigation-tiny.d.ts +0 -23
  157. package/dist/components/left-navigation/header-navigation-tiny.d.ts.map +0 -1
  158. package/dist/components/left-navigation/header-navigation-tiny.js +0 -32
  159. package/dist/components/left-navigation/header-navigation-tiny.js.map +0 -1
  160. package/dist/components/left-navigation/header-navigation-tiny.module.less +0 -117
  161. package/dist/components/left-navigation/header-navigation-tiny.module.less.d.ts +0 -15
  162. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts +0 -12
  163. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts.map +0 -1
  164. package/dist/components/left-navigation/index.d.ts +0 -5
  165. package/dist/components/left-navigation/index.d.ts.map +0 -1
  166. package/dist/components/left-navigation/index.js +0 -5
  167. package/dist/components/left-navigation/index.js.map +0 -1
  168. package/dist/components/left-navigation/interface-internal.d.ts +0 -10
  169. package/dist/components/left-navigation/interface-internal.d.ts.map +0 -1
  170. package/dist/components/left-navigation/interface-internal.js +0 -3
  171. package/dist/components/left-navigation/interface-internal.js.map +0 -1
  172. package/dist/components/left-navigation/interface.d.ts +0 -20
  173. package/dist/components/left-navigation/interface.d.ts.map +0 -1
  174. package/dist/components/left-navigation/interface.js.map +0 -1
  175. package/dist/components/left-navigation/side-navigation-context.d.ts +0 -8
  176. package/dist/components/left-navigation/side-navigation-context.d.ts.map +0 -1
  177. package/dist/components/left-navigation/side-navigation-context.js +0 -8
  178. package/dist/components/left-navigation/side-navigation-context.js.map +0 -1
  179. package/dist/components/left-navigation/side-navigation-links-internal.d.ts +0 -28
  180. package/dist/components/left-navigation/side-navigation-links-internal.d.ts.map +0 -1
  181. package/dist/components/left-navigation/side-navigation-links-internal.js +0 -89
  182. package/dist/components/left-navigation/side-navigation-links-internal.js.map +0 -1
  183. package/dist/components/left-navigation/side-navigation-links.d.ts +0 -6
  184. package/dist/components/left-navigation/side-navigation-links.d.ts.map +0 -1
  185. package/dist/components/left-navigation/side-navigation-links.js +0 -48
  186. package/dist/components/left-navigation/side-navigation-links.js.map +0 -1
  187. package/dist/components/left-navigation/side-navigation.d.ts +0 -29
  188. package/dist/components/left-navigation/side-navigation.d.ts.map +0 -1
  189. package/dist/components/left-navigation/side-navigation.js +0 -411
  190. package/dist/components/left-navigation/side-navigation.js.map +0 -1
  191. package/dist/components/left-navigation/side-navigation.module.less +0 -530
  192. package/dist/components/left-navigation/side-navigation.module.less.d.ts +0 -48
  193. package/dist/components/left-navigation/side-navigation.stories.d.ts +0 -17
  194. package/dist/components/left-navigation/side-navigation.stories.d.ts.map +0 -1
  195. package/dist/components/left-navigation/with-tooltip.d.ts +0 -4
  196. package/dist/components/left-navigation/with-tooltip.d.ts.map +0 -1
  197. package/dist/components/left-navigation/with-tooltip.js +0 -15
  198. package/dist/components/left-navigation/with-tooltip.js.map +0 -1
  199. package/dist/components/links.d.ts +0 -5
  200. package/dist/components/links.d.ts.map +0 -1
  201. package/dist/components/links.js +0 -35
  202. package/dist/components/links.js.map +0 -1
  203. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.d.ts +0 -9
  204. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.d.ts.map +0 -1
  205. package/dist/components/titan-layout/layout-profile.stories.d.ts +0 -13
  206. package/dist/components/titan-layout/layout-profile.stories.d.ts.map +0 -1
  207. package/dist/components/titan-layout/titan-layout.stories.d.ts +0 -29
  208. package/dist/components/titan-layout/titan-layout.stories.d.ts.map +0 -1
  209. package/dist/utils/navigation-legacy.d.ts +0 -88
  210. package/dist/utils/navigation-legacy.d.ts.map +0 -1
  211. package/dist/utils/navigation-legacy.js +0 -3
  212. package/dist/utils/navigation-legacy.js.map +0 -1
  213. package/src/components/header-navigation/header-navigation-content.tsx +0 -120
  214. package/src/components/header-navigation/header-navigation-extra-stacked.stories.tsx +0 -19
  215. package/src/components/header-navigation/header-navigation-extra.stories.tsx +0 -142
  216. package/src/components/header-navigation/header-navigation-links.tsx +0 -141
  217. package/src/components/header-navigation/header-navigation-stacked.stories.tsx +0 -146
  218. package/src/components/header-navigation/header-navigation-stories.module.less +0 -6
  219. package/src/components/header-navigation/header-navigation-stories.module.less.d.ts +0 -3
  220. package/src/components/header-navigation/header-navigation.module.less +0 -260
  221. package/src/components/header-navigation/header-navigation.module.less.d.ts +0 -22
  222. package/src/components/header-navigation/header-navigation.stories.tsx +0 -165
  223. package/src/components/header-navigation/header-navigation.tsx +0 -327
  224. package/src/components/header-navigation/index.ts +0 -1
  225. package/src/components/header-navigation/with-tooltip.tsx +0 -15
  226. package/src/components/layout.stories.tsx +0 -103
  227. package/src/components/left-navigation/header-navigation-extra-tiny.stories.tsx +0 -21
  228. package/src/components/left-navigation/header-navigation-tiny-links.tsx +0 -145
  229. package/src/components/left-navigation/header-navigation-tiny.module.less +0 -117
  230. package/src/components/left-navigation/header-navigation-tiny.module.less.d.ts +0 -15
  231. package/src/components/left-navigation/header-navigation-tiny.stories.tsx +0 -178
  232. package/src/components/left-navigation/header-navigation-tiny.tsx +0 -65
  233. package/src/components/left-navigation/index.ts +0 -4
  234. package/src/components/left-navigation/interface-internal.ts +0 -11
  235. package/src/components/left-navigation/interface.ts +0 -26
  236. package/src/components/left-navigation/side-navigation-context.tsx +0 -13
  237. package/src/components/left-navigation/side-navigation-links-internal.tsx +0 -151
  238. package/src/components/left-navigation/side-navigation-links.tsx +0 -57
  239. package/src/components/left-navigation/side-navigation.module.less +0 -530
  240. package/src/components/left-navigation/side-navigation.module.less.d.ts +0 -48
  241. package/src/components/left-navigation/side-navigation.stories.tsx +0 -226
  242. package/src/components/left-navigation/side-navigation.tsx +0 -543
  243. package/src/components/left-navigation/with-tooltip.tsx +0 -16
  244. package/src/components/links.tsx +0 -54
  245. package/src/components/profile-dropdown/profile-dropdown-tiny.stories.tsx +0 -25
  246. package/src/components/titan-layout/layout-profile.stories.tsx +0 -46
  247. package/src/utils/navigation-legacy.ts +0 -106
  248. /package/dist/components/{left-navigation → profile-dropdown}/interface.js +0 -0
@@ -2,6 +2,18 @@
2
2
  /* stylelint-disable no-duplicate-selectors */
3
3
  @import (reference) '@servicetitan/tokens/core/tokens.less';
4
4
 
5
+ @keyframes ExtraPulseAnimation {
6
+ 0% {
7
+ opacity: 0.7;
8
+ }
9
+ 50% {
10
+ opacity: 0.5;
11
+ }
12
+ 100% {
13
+ opacity: 0;
14
+ }
15
+ }
16
+
5
17
  @size-links-tiny: 24px;
6
18
  @bg-light: @color-white;
7
19
  @bg-dark: @color-neutral-300;
@@ -352,6 +364,25 @@
352
364
  }
353
365
  }
354
366
 
367
+ .he-top-right .navigation-item-flashing {
368
+ &::before {
369
+ content: '';
370
+ position: absolute;
371
+ animation-name: ExtraPulseAnimation;
372
+ will-change: opacity;
373
+ background-color: var(--color-neutral-60, @color-neutral-60);
374
+ animation-iteration-count: infinite;
375
+ animation-duration: 500ms;
376
+ animation-direction: alternate;
377
+ border-radius: 12px;
378
+ inset: 0;
379
+ }
380
+
381
+ &.navigation-item-active::before {
382
+ background-color: var(--color-blue-200, @color-blue-200);
383
+ }
384
+ }
385
+
355
386
  // styles specific to main nav links
356
387
  .header-navigation .navigation-link {
357
388
  font-family: @base-font-family;
@@ -1,6 +1,7 @@
1
1
  export const __esModule: true;
2
2
  export const burger: string;
3
3
  export const calculating: string;
4
+ export const extraPulseAnimation: string;
4
5
  export const heTopCenter: string;
5
6
  export const heTopRight: string;
6
7
  export const heTopRightText: string;
@@ -29,6 +30,7 @@ export const navigationIconActive: string;
29
30
  export const navigationItemActive: string;
30
31
  export const navigationItemCounter: string;
31
32
  export const navigationItemCounterLong: string;
33
+ export const navigationItemFlashing: string;
32
34
  export const navigationItemIconState: string;
33
35
  export const navigationItemLabel: string;
34
36
  export const navigationLink: string;
@@ -1,6 +1,6 @@
1
1
  import SvgBurgerMenu from '@servicetitan/anvil2/assets/icons/material/round/menu.svg';
2
2
  import classNames from 'classnames';
3
- import { ComponentPropsWithoutRef, FC, ReactElement, ReactNode } from 'react';
3
+ import { ComponentPropsWithoutRef, FC, MouseEvent, ReactElement, ReactNode } from 'react';
4
4
  import { LayoutPlacementContext } from './layout-context';
5
5
  import { LayoutHeaderNavigationTrigger } from './layout-header-links';
6
6
  import * as Styles from './layout-header.module.less';
@@ -22,7 +22,7 @@ export type LayoutHeaderProps = Omit<ComponentPropsWithoutRef<'div'>, 'children'
22
22
  isMobile: boolean;
23
23
  variant: 'light' | 'dark';
24
24
  hasNotifications: boolean;
25
- onBurgerClick?: (e: MouseEvent) => void;
25
+ onBurgerClick?: (e: MouseEvent<never>) => void;
26
26
  };
27
27
 
28
28
  export const LayoutHeader: FC<LayoutHeaderProps> = ({
@@ -2,13 +2,14 @@ import SvgAccountActive from '@servicetitan/anvil2/assets/icons/st/gnav_account_
2
2
  import SvgAccountInactive from '@servicetitan/anvil2/assets/icons/st/gnav_account_inactive.svg';
3
3
 
4
4
  import { FC, MouseEvent, useEffect, useState } from 'react';
5
- import { NavLinkComponentProps, NavigationComponentContext } from '../../utils/navigation-context';
5
+ import { NavLinkComponentProps } from '../../utils/navigation-context';
6
+ import { getCounterTag } from '../../utils/side-nav';
6
7
  import {
7
- ProfileDropdown as DesktopProfileDropdown,
8
8
  ProfileDropdownLinkProps,
9
9
  ProfileDropdownProps,
10
10
  ProfileDropdownSectionProps,
11
- } from '../profile-dropdown/profile-dropdown';
11
+ } from '../profile-dropdown/interface';
12
+ import { DesktopProfileDropdown } from '../profile-dropdown/profile-dropdown';
12
13
  import { NavigationComponentProps } from './interface-internal';
13
14
  import { useTitanLayoutContext } from './layout-context';
14
15
  import {
@@ -23,7 +24,7 @@ export type {
23
24
  ProfileDropdownProps,
24
25
  ProfileDropdownSectionProps,
25
26
  ProfileDropdownLinkProps,
26
- } from '../profile-dropdown/profile-dropdown';
27
+ } from '../profile-dropdown/interface';
27
28
 
28
29
  const ExternalNavComponent: FC<NavLinkComponentProps> = ({
29
30
  children,
@@ -37,24 +38,27 @@ const ExternalNavComponent: FC<NavLinkComponentProps> = ({
37
38
  </a>
38
39
  );
39
40
 
40
- const ProfileDropdownContent: FC<ProfileDropdownProps> = props => {
41
- const { isTitanLayout, breakpoint, NavigationComponent } = useTitanLayoutContext();
41
+ function ProfileDropdownComponent(props: ProfileDropdownProps) {
42
+ const { breakpoint, NavigationComponent } = useTitanLayoutContext();
42
43
  return breakpoint.isMobile ? (
43
44
  <MobileProfileDropdown {...props} navigationComponent={NavigationComponent} />
44
- ) : isTitanLayout ? (
45
- <NavigationComponentContext.Provider value={NavigationComponent}>
46
- <DesktopProfileDropdown {...props} />
47
- </NavigationComponentContext.Provider>
48
45
  ) : (
49
46
  <DesktopProfileDropdown {...props} />
50
47
  );
51
- };
52
- ProfileDropdownContent.displayName = 'ProfileDropdown';
48
+ }
53
49
  const profileId = '--profile';
54
50
 
55
51
  const MobileProfileDropdown: FC<ProfileDropdownProps & NavigationComponentProps> = ({
52
+ direction,
53
+ trigger,
54
+ hintPopup,
55
+ portal,
56
+ width,
57
+ onClose,
58
+ onOpen,
59
+ className,
56
60
  children,
57
- ...props
61
+ ...rest
58
62
  }) => {
59
63
  const [expanded, setExpanded] = useState(false);
60
64
  const { hasNotifications, NotificationsContextProvider } = useNotificationsState();
@@ -77,7 +81,8 @@ const MobileProfileDropdown: FC<ProfileDropdownProps & NavigationComponentProps>
77
81
  icon={SvgAccountInactive}
78
82
  iconActive={SvgAccountActive}
79
83
  isActive={expanded}
80
- {...props}
84
+ className={className}
85
+ {...rest}
81
86
  submenuExpanded={expanded}
82
87
  onExpandToggle={onExpandToggle}
83
88
  onClick={onExpandToggle}
@@ -110,71 +115,85 @@ const getText = (children: any, text: any): string | undefined => {
110
115
  return undefined;
111
116
  };
112
117
 
113
- const getTag = (
114
- tag: ProfileDropdownLinkProps['tag'],
115
- counter: ProfileDropdownLinkProps['counter']
116
- ): boolean => {
117
- return !!tag?.value || !!counter;
118
- };
119
-
120
- const ProfileDropdownSection: FC<ProfileDropdownSectionProps> = props => {
118
+ function ProfileDropdownSection(props: ProfileDropdownSectionProps) {
121
119
  const { breakpoint } = useTitanLayoutContext();
122
120
  return breakpoint.isMobile ? (
123
121
  <MobileProfileDropdownSection {...props} />
124
122
  ) : (
125
123
  <DesktopProfileDropdown.Section {...props} />
126
124
  );
127
- };
125
+ }
128
126
  const MobileProfileDropdownSection: FC<ProfileDropdownSectionProps> = ({
127
+ id,
128
+ tooltip,
129
+ tag,
130
+ counter,
131
+
132
+ className,
129
133
  children,
130
134
  text,
131
- tooltip,
132
- title,
133
- ...props
135
+ ...rest
134
136
  }) => {
135
137
  const sectionText = getText(children, text);
136
138
  const { onNotificationsUpdate } = useNotificationsContext();
137
- onNotificationsUpdate(props.id, getTag(props.tag, props.counter));
139
+ const tagData = getCounterTag(counter, tag);
140
+ onNotificationsUpdate(id, !!tagData);
138
141
 
139
142
  return sectionText ? (
140
- <InternalSideNavigationGroupTrigger {...props} title={sectionText} />
143
+ <InternalSideNavigationGroupTrigger
144
+ {...rest}
145
+ id={id}
146
+ title={sectionText}
147
+ isActive={undefined}
148
+ tag={tagData}
149
+ className={className}
150
+ />
141
151
  ) : null;
142
152
  };
143
153
 
144
- const ProfileDropdownLink: FC<ProfileDropdownLinkProps> = props => {
154
+ function ProfileDropdownLink(props: ProfileDropdownLinkProps) {
145
155
  const { breakpoint, NavigationComponent } = useTitanLayoutContext();
146
156
  return breakpoint.isMobile ? (
147
157
  <MobileProfileDropdownLink {...props} navigationComponent={NavigationComponent} />
148
158
  ) : (
149
159
  <DesktopProfileDropdown.Link {...props} />
150
160
  );
151
- };
161
+ }
152
162
  const MobileProfileDropdownLink: FC<ProfileDropdownLinkProps & NavigationComponentProps> = ({
163
+ id,
153
164
  external,
154
165
  to,
155
166
  tooltip,
156
167
  text,
157
168
  children,
169
+ className,
158
170
  navigationComponent,
159
- ...props
171
+ tag,
172
+ counter,
173
+ ...rest
160
174
  }) => {
161
175
  const { onNotificationsUpdate } = useNotificationsContext();
162
176
  const linkText = getText(children, text);
163
177
  const isExternalLink = external ?? to?.startsWith('http');
164
- onNotificationsUpdate(props.id, getTag(props.tag, props.counter));
178
+ const tagData = getCounterTag(counter, tag);
179
+ onNotificationsUpdate(id, !!tagData);
165
180
 
166
181
  return linkText ? (
167
182
  <InternalSideNavigationGroupLink
168
- {...props}
183
+ {...rest}
184
+ id={id}
169
185
  to={to}
170
186
  title={linkText}
187
+ isActive={undefined}
188
+ className={className}
189
+ tag={tagData}
171
190
  parentId={profileId}
172
191
  navigationComponent={isExternalLink ? ExternalNavComponent : navigationComponent}
173
192
  />
174
193
  ) : null;
175
194
  };
176
195
 
177
- export const ProfileDropdown = Object.assign(ProfileDropdownContent, {
196
+ export const ProfileDropdown = Object.assign(ProfileDropdownComponent, {
178
197
  Divider: ProfileDropdownDivider,
179
198
  Link: ProfileDropdownLink,
180
199
  Section: ProfileDropdownSection,
@@ -1,28 +1,25 @@
1
- import { Icon } from '@servicetitan/anvil2';
1
+ import { 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
5
  import { FC, Fragment, MouseEvent, ReactNode } from 'react';
7
- import { NavigationItemData, NavigationSubmenuItemData } from '../../utils/navigation';
8
- import { getCounterTag } from '../../utils/side-nav';
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'> {
11
+ export interface InternalSideNavigationItemContentProps {
12
+ icon: IconProps['svg'] | undefined;
13
+ iconActive: IconProps['svg'] | undefined;
14
+ title: string;
16
15
  submenuExpanded: boolean | undefined;
17
16
  tag: BadgeTagProps | undefined;
18
17
  onExpandToggle?: (e: MouseEvent<never>) => void;
19
18
  }
20
19
 
21
- export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemContentProps> = ({
20
+ const InternalSideNavigationItemContent: FC<InternalSideNavigationItemContentProps> = ({
22
21
  icon,
23
22
  iconActive,
24
- iconClassName,
25
- iconComponent: IconComponent,
26
23
  tag,
27
24
  title,
28
25
  submenuExpanded,
@@ -30,33 +27,14 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
30
27
  }) => (
31
28
  <Fragment>
32
29
  <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>
30
+ {icon && (
31
+ <Icon svg={icon} className={classNames(Styles.navIcon, Styles.navIconInactive)} />
32
+ )}
33
+ {iconActive && (
34
+ <Icon
35
+ svg={iconActive}
36
+ className={classNames(Styles.navIcon, Styles.navIconActive)}
37
+ />
60
38
  )}
61
39
 
62
40
  <div className={Styles.navItemTextExpanded} data-cy="nav-item-label">
@@ -96,107 +74,130 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
96
74
  </Fragment>
97
75
  );
98
76
 
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
- }
77
+ /** Side Navigation menu item (for internal usage) */
78
+ export const InternalSideNavigationLink: FC<
79
+ NavigationComponentProps & {
80
+ id: string;
81
+ to: string;
82
+ title: string;
83
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
84
+ icon: IconProps['svg'] | undefined;
85
+ iconActive: IconProps['svg'] | undefined;
86
+ className: string | undefined;
87
+ tag: BadgeTagProps | undefined;
107
88
 
108
- export const internalNavigationContentContainerProps = ({
109
- className,
110
- icon,
111
- iconActive,
112
- iconComponent,
89
+ submenuExpanded: boolean | undefined;
90
+ onExpandToggle?: (e: MouseEvent<never>) => void;
91
+ }
92
+ > = ({
113
93
  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
- /** Side Navigation menu item (for internal usage) */
132
- export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = ({
133
94
  to,
134
- className,
135
- dataPrefix,
95
+ title,
136
96
  isActive,
97
+ icon,
98
+ iconActive,
99
+ className,
100
+ tag,
101
+
137
102
  navigationComponent: NavigationComponent,
138
103
  submenuExpanded,
139
104
  onExpandToggle,
140
- ...props
105
+ ...rest
141
106
  }) => {
142
107
  return (
143
108
  <NavigationComponent
144
- {...internalNavigationContentContainerProps({
145
- ...props,
146
- prefix: dataPrefix ?? 'navigation-item',
147
- className,
148
- isActive,
149
- isLink: true,
109
+ data-cy={`navigation-item-${id}`}
110
+ data-pendo={`navigation-item-${id}`}
111
+ {...rest}
112
+ className={classNames(Styles.navItem, Styles.navLink, className, {
113
+ [Styles.navItemActive]: isActive === true,
114
+ [Styles.navItemIconSwitch]: !!icon && !!iconActive,
150
115
  })}
151
116
  to={to}
152
117
  isActive={typeof isActive === 'function' ? isActive : undefined}
153
118
  activeClassName={Styles.navItemActive}
154
119
  >
155
120
  <InternalSideNavigationItemContent
121
+ icon={icon}
122
+ iconActive={iconActive}
156
123
  submenuExpanded={submenuExpanded}
157
124
  onExpandToggle={onExpandToggle}
158
- {...props}
125
+ title={title}
126
+ tag={tag}
159
127
  />
160
128
  </NavigationComponent>
161
129
  );
162
130
  };
163
131
 
164
132
  /** Side Navigation menu trigger (for internal usage) */
165
- export const InternalSideNavigationTrigger: FC<
166
- Omit<InternalSideNavigationLinkProps, 'to' | 'navigationComponent'> & {
167
- onClick?: (e: MouseEvent<never>) => void;
168
- }
169
- > = ({ className, dataPrefix, isActive, submenuExpanded, onExpandToggle, onClick, ...props }) => {
133
+ export const InternalSideNavigationTrigger: FC<{
134
+ id: string;
135
+ title: string;
136
+ isActive: boolean | undefined;
137
+ icon: IconProps['svg'] | undefined;
138
+ iconActive: IconProps['svg'] | undefined;
139
+ className: string | undefined;
140
+
141
+ submenuExpanded: boolean | undefined;
142
+ tag: BadgeTagProps | undefined;
143
+ onClick?: (e: MouseEvent<never>) => void;
144
+ onExpandToggle?: (e: MouseEvent<never>) => void;
145
+ }> = ({
146
+ id,
147
+ title,
148
+ isActive,
149
+ icon,
150
+ iconActive,
151
+ className,
152
+
153
+ submenuExpanded,
154
+ tag,
155
+ onExpandToggle,
156
+ ...rest
157
+ }) => {
170
158
  return (
171
159
  <div
172
- {...internalNavigationContentContainerProps({
173
- ...props,
174
- prefix: dataPrefix ?? 'navigation-item',
175
- className,
176
- isActive,
177
- isLink: !!onClick,
160
+ data-cy={`navigation-item-${id}`}
161
+ data-pendo={`navigation-item-${id}`}
162
+ {...rest}
163
+ className={classNames(Styles.navItem, className, {
164
+ [Styles.navLink]: !!rest.onClick,
165
+ [Styles.navItemActive]: isActive === true,
166
+ [Styles.navItemIconSwitch]: !!icon && !!iconActive,
178
167
  })}
179
- onClick={onClick}
180
168
  >
181
169
  <InternalSideNavigationItemContent
182
170
  submenuExpanded={submenuExpanded}
183
171
  onExpandToggle={onExpandToggle}
184
- {...props}
172
+ icon={icon}
173
+ iconActive={iconActive}
174
+ title={title}
175
+ tag={tag}
185
176
  />
186
177
  </div>
187
178
  );
188
179
  };
189
180
 
190
181
  export const InternalSideNavigationGroupLink: FC<
191
- NavigationSubmenuItemData & NavigationComponentProps & { parentId: string }
182
+ NavigationComponentProps & {
183
+ id: string;
184
+ to: string;
185
+ title: string;
186
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
187
+ className: string | undefined;
188
+ tag: BadgeTagProps | undefined;
189
+
190
+ parentId: string;
191
+ }
192
192
  > = ({
193
193
  id,
194
- counter,
195
- parentId,
196
- tag,
197
- title,
198
194
  to,
195
+ title,
199
196
  isActive,
197
+ className,
198
+ tag,
199
+
200
+ parentId,
200
201
  navigationComponent: NavigationComponent,
201
202
  ...rest
202
203
  }) => {
@@ -207,21 +208,36 @@ export const InternalSideNavigationGroupLink: FC<
207
208
  data-pendo={`navigation-item-${parentId}--${id}`}
208
209
  {...rest}
209
210
  to={to}
210
- className={classNames(Styles.submenuItem, Styles.submenuLink, {
211
+ className={classNames(Styles.submenuItem, Styles.submenuLink, className, {
211
212
  [Styles.submenuLinkActive]: isActive === true,
212
213
  })}
213
214
  isActive={typeof isActive === 'function' ? isActive : undefined}
214
215
  activeClassName={Styles.submenuLinkActive}
215
216
  >
216
217
  <span>{title}</span>
217
- <BadgeTag data={getCounterTag(counter, tag)} className={Styles.submenuLinkCounter} />
218
+ <BadgeTag data={tag} className={Styles.submenuLinkCounter} />
218
219
  </NavigationComponent>
219
220
  );
220
221
  };
221
222
 
222
- export const InternalSideNavigationGroupTrigger: FC<
223
- Omit<NavigationSubmenuItemData, 'to'> & { onClick?: (e: MouseEvent<any>) => void }
224
- > = ({ id, counter, onClick, tag, title, isActive, ...rest }) => {
223
+ export const InternalSideNavigationGroupTrigger: FC<{
224
+ id: string;
225
+ title: string;
226
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
227
+ className: string | undefined;
228
+ tag: BadgeTagProps | undefined;
229
+
230
+ onClick?: (e: MouseEvent<any>) => void;
231
+ }> = ({
232
+ id,
233
+ title,
234
+ isActive,
235
+ className,
236
+ tag,
237
+
238
+ onClick,
239
+ ...rest
240
+ }) => {
225
241
  return (
226
242
  <div
227
243
  data-cy={`navigation-item-${id}`}
@@ -235,7 +251,7 @@ export const InternalSideNavigationGroupTrigger: FC<
235
251
  onClick={onClick}
236
252
  >
237
253
  <span>{title}</span>
238
- <BadgeTag data={getCounterTag(counter, tag)} className={Styles.submenuLinkCounter} />
254
+ <BadgeTag data={tag} className={Styles.submenuLinkCounter} />
239
255
  </div>
240
256
  );
241
257
  };
@@ -245,29 +261,66 @@ export const InternalSideNavigationGroupDivider = () => {
245
261
  };
246
262
 
247
263
  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;
256
- }
257
- > = ({ children, submenuExpanded, to, onExpandToggle, onClick, ...props }) => {
264
+ NavigationComponentProps & {
265
+ id: string;
266
+ to: string | undefined;
267
+ title: string;
268
+ isActive: boolean | ((pathname: string) => boolean) | undefined;
269
+ icon: IconProps['svg'] | undefined;
270
+ iconActive: IconProps['svg'] | undefined;
271
+ className: string | undefined;
272
+ tag: BadgeTagProps | undefined;
273
+
274
+ children: ReactNode;
275
+ submenuExpanded: boolean;
276
+ onExpandToggle?: (e: MouseEvent<never>) => void;
277
+ onClick?: (e: MouseEvent<never>) => void;
278
+ }
279
+ > = ({
280
+ id,
281
+ to,
282
+ title,
283
+ isActive,
284
+ icon,
285
+ iconActive,
286
+ className,
287
+ tag,
288
+
289
+ children,
290
+ submenuExpanded,
291
+ onExpandToggle,
292
+ onClick,
293
+ navigationComponent,
294
+ ...rest
295
+ }) => {
258
296
  return (
259
297
  <div className={classNames(Styles.navGroupWrapper)}>
260
298
  <div className={Styles.navGroupItem}>
261
299
  {to ? (
262
300
  <InternalSideNavigationLink
263
- {...props}
301
+ id={id}
264
302
  to={to}
303
+ title={title}
304
+ isActive={isActive}
305
+ icon={icon}
306
+ iconActive={iconActive}
307
+ tag={tag}
308
+ className={className}
309
+ {...rest}
265
310
  submenuExpanded={submenuExpanded}
266
311
  onExpandToggle={onExpandToggle}
312
+ navigationComponent={navigationComponent}
267
313
  />
268
314
  ) : (
269
315
  <InternalSideNavigationTrigger
270
- {...props}
316
+ id={id}
317
+ title={title}
318
+ isActive={isActive === true || undefined}
319
+ icon={icon}
320
+ iconActive={iconActive}
321
+ tag={tag}
322
+ className={className}
323
+ {...rest}
271
324
  submenuExpanded={submenuExpanded}
272
325
  onExpandToggle={onExpandToggle}
273
326
  onClick={onClick}
@@ -278,7 +331,7 @@ export const InternalSideNavigationGroup: FC<
278
331
  className={classNames(Styles.submenuWrapper, {
279
332
  [Styles.submenuWrapperCollapsed]: !submenuExpanded,
280
333
  })}
281
- data-cy={`navigation-submenu-${props.id}`}
334
+ data-cy={`navigation-submenu-${id}`}
282
335
  >
283
336
  <div className={Styles.submenu}>{children}</div>
284
337
  </div>