@servicetitan/navigation 10.6.1 → 11.0.0-canary.237.0ce6038.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 (164) hide show
  1. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts.map +1 -1
  2. package/dist/components/header-navigation/header-navigation-extra.stories.js +5 -5
  3. package/dist/components/header-navigation/header-navigation-extra.stories.js.map +1 -1
  4. package/dist/components/header-navigation/header-navigation-links.d.ts.map +1 -1
  5. package/dist/components/header-navigation/header-navigation-links.js +2 -2
  6. package/dist/components/header-navigation/header-navigation-links.js.map +1 -1
  7. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts.map +1 -1
  8. package/dist/components/header-navigation/header-navigation-stacked.stories.js +1 -1
  9. package/dist/components/header-navigation/header-navigation-stacked.stories.js.map +1 -1
  10. package/dist/components/header-navigation/header-navigation.stories.d.ts.map +1 -1
  11. package/dist/components/header-navigation/header-navigation.stories.js +2 -2
  12. package/dist/components/header-navigation/header-navigation.stories.js.map +1 -1
  13. package/dist/components/header-navigation/with-tooltip.d.ts +1 -1
  14. package/dist/components/header-navigation/with-tooltip.d.ts.map +1 -1
  15. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts.map +1 -1
  16. package/dist/components/left-navigation/header-navigation-tiny.stories.js +2 -2
  17. package/dist/components/left-navigation/header-navigation-tiny.stories.js.map +1 -1
  18. package/dist/components/left-navigation/interface.d.ts +1 -1
  19. package/dist/components/left-navigation/interface.d.ts.map +1 -1
  20. package/dist/components/left-navigation/side-navigation-links-internal.d.ts +3 -1
  21. package/dist/components/left-navigation/side-navigation-links-internal.d.ts.map +1 -1
  22. package/dist/components/left-navigation/side-navigation-links-internal.js +3 -3
  23. package/dist/components/left-navigation/side-navigation-links-internal.js.map +1 -1
  24. package/dist/components/left-navigation/side-navigation.d.ts.map +1 -1
  25. package/dist/components/left-navigation/side-navigation.js +8 -7
  26. package/dist/components/left-navigation/side-navigation.js.map +1 -1
  27. package/dist/components/left-navigation/side-navigation.module.less +21 -19
  28. package/dist/components/links.d.ts.map +1 -1
  29. package/dist/components/links.js +7 -7
  30. package/dist/components/links.js.map +1 -1
  31. package/dist/components/logo/logo-company-title.d.ts +1 -0
  32. package/dist/components/logo/logo-company-title.d.ts.map +1 -1
  33. package/dist/components/logo/logo-company-title.js +2 -2
  34. package/dist/components/logo/logo-company-title.js.map +1 -1
  35. package/dist/components/profile-dropdown/profile-dropdown.d.ts +6 -3
  36. package/dist/components/profile-dropdown/profile-dropdown.d.ts.map +1 -1
  37. package/dist/components/profile-dropdown/profile-dropdown.js +7 -8
  38. package/dist/components/profile-dropdown/profile-dropdown.js.map +1 -1
  39. package/dist/components/profile-dropdown/profile-dropdown.module.less +4 -0
  40. package/dist/components/profile-dropdown/profile-dropdown.stories.js +2 -2
  41. package/dist/components/profile-dropdown/profile-dropdown.stories.js.map +1 -1
  42. package/dist/components/titan-layout/index.d.ts +6 -0
  43. package/dist/components/titan-layout/index.d.ts.map +1 -0
  44. package/dist/components/titan-layout/index.js +6 -0
  45. package/dist/components/titan-layout/index.js.map +1 -0
  46. package/dist/components/titan-layout/interface-internal.d.ts +6 -0
  47. package/dist/components/titan-layout/interface-internal.d.ts.map +1 -0
  48. package/dist/components/titan-layout/interface-internal.js +2 -0
  49. package/dist/components/titan-layout/interface-internal.js.map +1 -0
  50. package/dist/components/titan-layout/interface.d.ts +21 -0
  51. package/dist/components/titan-layout/interface.d.ts.map +1 -0
  52. package/dist/components/titan-layout/interface.js +2 -0
  53. package/dist/components/titan-layout/interface.js.map +1 -0
  54. package/dist/components/titan-layout/layout-context.d.ts +20 -0
  55. package/dist/components/titan-layout/layout-context.d.ts.map +1 -0
  56. package/dist/components/titan-layout/layout-context.js +12 -0
  57. package/dist/components/titan-layout/layout-context.js.map +1 -0
  58. package/dist/components/titan-layout/layout-header-links.d.ts +7 -0
  59. package/dist/components/titan-layout/layout-header-links.d.ts.map +1 -0
  60. package/dist/components/titan-layout/layout-header-links.js +32 -0
  61. package/dist/components/titan-layout/layout-header-links.js.map +1 -0
  62. package/dist/components/titan-layout/layout-header.d.ts +20 -0
  63. package/dist/components/titan-layout/layout-header.d.ts.map +1 -0
  64. package/dist/components/titan-layout/layout-header.js +11 -0
  65. package/dist/components/titan-layout/layout-header.js.map +1 -0
  66. package/dist/components/titan-layout/layout-header.module.less +154 -0
  67. package/dist/components/titan-layout/layout-logo.d.ts +12 -0
  68. package/dist/components/titan-layout/layout-logo.d.ts.map +1 -0
  69. package/dist/components/titan-layout/layout-logo.js +15 -0
  70. package/dist/components/titan-layout/layout-logo.js.map +1 -0
  71. package/dist/components/titan-layout/layout-logo.stories.d.ts +13 -0
  72. package/dist/components/titan-layout/layout-logo.stories.d.ts.map +1 -0
  73. package/dist/components/titan-layout/layout-logo.stories.js +17 -0
  74. package/dist/components/titan-layout/layout-logo.stories.js.map +1 -0
  75. package/dist/components/titan-layout/layout-profile.d.ts +9 -0
  76. package/dist/components/titan-layout/layout-profile.d.ts.map +1 -0
  77. package/dist/components/titan-layout/layout-profile.js +44 -0
  78. package/dist/components/titan-layout/layout-profile.js.map +1 -0
  79. package/dist/components/titan-layout/layout-profile.stories.d.ts +13 -0
  80. package/dist/components/titan-layout/layout-profile.stories.d.ts.map +1 -0
  81. package/dist/components/titan-layout/layout-profile.stories.js +13 -0
  82. package/dist/components/titan-layout/layout-profile.stories.js.map +1 -0
  83. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts +46 -0
  84. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts.map +1 -0
  85. package/dist/components/titan-layout/layout-sidebar-links-internal.js +61 -0
  86. package/dist/components/titan-layout/layout-sidebar-links-internal.js.map +1 -0
  87. package/dist/components/titan-layout/layout-sidebar-links.d.ts +6 -0
  88. package/dist/components/titan-layout/layout-sidebar-links.d.ts.map +1 -0
  89. package/dist/components/titan-layout/layout-sidebar-links.js +21 -0
  90. package/dist/components/titan-layout/layout-sidebar-links.js.map +1 -0
  91. package/dist/components/titan-layout/layout-sidebar.d.ts +17 -0
  92. package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -0
  93. package/dist/components/titan-layout/layout-sidebar.js +65 -0
  94. package/dist/components/titan-layout/layout-sidebar.js.map +1 -0
  95. package/dist/components/titan-layout/layout-sidebar.module.less +513 -0
  96. package/dist/components/titan-layout/titan-layout.d.ts +36 -0
  97. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -0
  98. package/dist/components/titan-layout/titan-layout.js +109 -0
  99. package/dist/components/titan-layout/titan-layout.js.map +1 -0
  100. package/dist/components/titan-layout/titan-layout.module.less +76 -0
  101. package/dist/components/titan-layout/titan-layout.stories.d.ts +18 -0
  102. package/dist/components/titan-layout/titan-layout.stories.d.ts.map +1 -0
  103. package/dist/components/titan-layout/titan-layout.stories.js +62 -0
  104. package/dist/components/titan-layout/titan-layout.stories.js.map +1 -0
  105. package/dist/components/titan-layout/with-tooltip.d.ts +4 -0
  106. package/dist/components/titan-layout/with-tooltip.d.ts.map +1 -0
  107. package/dist/components/titan-layout/with-tooltip.js +4 -0
  108. package/dist/components/titan-layout/with-tooltip.js.map +1 -0
  109. package/dist/index.d.ts +2 -1
  110. package/dist/index.d.ts.map +1 -1
  111. package/dist/index.js +2 -1
  112. package/dist/index.js.map +1 -1
  113. package/dist/test/data.d.ts.map +1 -1
  114. package/dist/test/data.js +3 -3
  115. package/dist/test/data.js.map +1 -1
  116. package/dist/utils/navigation-legacy.d.ts +3 -1
  117. package/dist/utils/navigation-legacy.d.ts.map +1 -1
  118. package/dist/utils/use-breakpoint.d.ts +7 -0
  119. package/dist/utils/use-breakpoint.d.ts.map +1 -0
  120. package/dist/utils/use-breakpoint.js +13 -0
  121. package/dist/utils/use-breakpoint.js.map +1 -0
  122. package/package.json +5 -6
  123. package/src/components/header-navigation/header-navigation-extra.stories.tsx +7 -0
  124. package/src/components/header-navigation/header-navigation-links.tsx +2 -0
  125. package/src/components/header-navigation/header-navigation-stacked.stories.tsx +4 -0
  126. package/src/components/header-navigation/header-navigation.stories.tsx +5 -0
  127. package/src/components/left-navigation/header-navigation-tiny.stories.tsx +6 -0
  128. package/src/components/left-navigation/interface.ts +2 -2
  129. package/src/components/left-navigation/side-navigation-links-internal.tsx +21 -6
  130. package/src/components/left-navigation/side-navigation-links.tsx +1 -1
  131. package/src/components/left-navigation/side-navigation.module.less +21 -19
  132. package/src/components/left-navigation/side-navigation.module.less.d.ts +2 -1
  133. package/src/components/left-navigation/side-navigation.tsx +15 -8
  134. package/src/components/links.tsx +33 -13
  135. package/src/components/logo/logo-company-title.tsx +8 -6
  136. package/src/components/profile-dropdown/profile-dropdown.module.less +4 -0
  137. package/src/components/profile-dropdown/profile-dropdown.stories.tsx +4 -4
  138. package/src/components/profile-dropdown/profile-dropdown.tsx +43 -46
  139. package/src/components/titan-layout/index.ts +5 -0
  140. package/src/components/titan-layout/interface-internal.ts +6 -0
  141. package/src/components/titan-layout/interface.ts +26 -0
  142. package/src/components/titan-layout/layout-context.tsx +30 -0
  143. package/src/components/titan-layout/layout-header-links.tsx +144 -0
  144. package/src/components/titan-layout/layout-header.module.less +154 -0
  145. package/src/components/titan-layout/layout-header.module.less.d.ts +16 -0
  146. package/src/components/titan-layout/layout-header.tsx +86 -0
  147. package/src/components/titan-layout/layout-logo.stories.tsx +31 -0
  148. package/src/components/titan-layout/layout-logo.tsx +57 -0
  149. package/src/components/titan-layout/layout-profile.stories.tsx +37 -0
  150. package/src/components/titan-layout/layout-profile.tsx +116 -0
  151. package/src/components/titan-layout/layout-sidebar-links-internal.tsx +265 -0
  152. package/src/components/titan-layout/layout-sidebar-links.tsx +56 -0
  153. package/src/components/titan-layout/layout-sidebar.module.less +513 -0
  154. package/src/components/titan-layout/layout-sidebar.module.less.d.ts +48 -0
  155. package/src/components/titan-layout/layout-sidebar.tsx +295 -0
  156. package/src/components/titan-layout/titan-layout.module.less +76 -0
  157. package/src/components/titan-layout/titan-layout.module.less.d.ts +13 -0
  158. package/src/components/titan-layout/titan-layout.stories.tsx +194 -0
  159. package/src/components/titan-layout/titan-layout.tsx +272 -0
  160. package/src/components/titan-layout/with-tooltip.tsx +16 -0
  161. package/src/index.ts +2 -1
  162. package/src/test/data.tsx +3 -2
  163. package/src/utils/navigation-legacy.ts +3 -1
  164. package/src/utils/use-breakpoint.ts +19 -0
@@ -3,7 +3,7 @@ import SvgGroupCollapse from '@servicetitan/anvil2/assets/icons/material/round/e
3
3
  import SvgGroupExpand from '@servicetitan/anvil2/assets/icons/material/round/expand_more.svg';
4
4
 
5
5
  import classNames from 'classnames';
6
- import { FC, Fragment } from 'react';
6
+ import { FC, Fragment, MouseEvent } from 'react';
7
7
  import { NavigationItemData } from '../../utils/navigation';
8
8
  import { BadgeTag, BadgeTagProps } from '../badge-tag';
9
9
  import { SideNavigationTriggerProps } from './interface';
@@ -14,6 +14,7 @@ export interface InternalSideNavigationItemContentProps
14
14
  extends Omit<NavigationItemData, 'iconName' | 'to' | 'counter' | 'tag'> {
15
15
  submenuExpanded: boolean | undefined;
16
16
  tag: BadgeTagProps | undefined;
17
+ onExpandToggle?: (e: MouseEvent<never>) => void;
17
18
  }
18
19
 
19
20
  export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemContentProps> = ({
@@ -24,6 +25,7 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
24
25
  tag,
25
26
  title,
26
27
  submenuExpanded,
28
+ onExpandToggle,
27
29
  }) => (
28
30
  <Fragment>
29
31
  <div className={Styles.navigationItemIconWrapper}>
@@ -65,10 +67,17 @@ export const InternalSideNavigationItemContent: FC<InternalSideNavigationItemCon
65
67
  />
66
68
  )}
67
69
  {typeof submenuExpanded === 'boolean' && (
68
- <Icon
69
- svg={submenuExpanded ? SvgGroupCollapse : SvgGroupExpand}
70
- className={Styles.navigationItemGroupToggle}
71
- />
70
+ <div className={Styles.navigationItemGroupToggleWrapper}>
71
+ <Icon
72
+ svg={submenuExpanded ? SvgGroupCollapse : SvgGroupExpand}
73
+ className={Styles.navigationItemGroupToggle}
74
+ onClick={onExpandToggle}
75
+ />
76
+ <div
77
+ className={Styles.navigationItemGroupToggleClick}
78
+ onClick={onExpandToggle}
79
+ />
80
+ </div>
72
81
  )}
73
82
  </div>
74
83
 
@@ -89,6 +98,7 @@ export interface InternalSideNavigationLinkProps
89
98
  submenuExpanded: boolean | undefined;
90
99
  dataPrefix?: string;
91
100
  tag: BadgeTagProps | undefined;
101
+ onExpandToggle?: (e: MouseEvent<never>) => void;
92
102
  }
93
103
 
94
104
  export const internalNavigationContentContainerProps = ({
@@ -116,6 +126,7 @@ export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = (
116
126
  isActive,
117
127
  navigationComponent: NavigationComponent,
118
128
  submenuExpanded,
129
+ onExpandToggle,
119
130
  ...props
120
131
  }) => {
121
132
  return (
@@ -130,7 +141,11 @@ export const InternalSideNavigationLink: FC<InternalSideNavigationLinkProps> = (
130
141
  isActive={typeof isActive === 'function' ? isActive : undefined}
131
142
  activeClassName={Styles.navigationItemActive}
132
143
  >
133
- <InternalSideNavigationItemContent submenuExpanded={submenuExpanded} {...props} />
144
+ <InternalSideNavigationItemContent
145
+ submenuExpanded={submenuExpanded}
146
+ onExpandToggle={onExpandToggle}
147
+ {...props}
148
+ />
134
149
  </NavigationComponent>
135
150
  );
136
151
  };
@@ -11,7 +11,7 @@ import {
11
11
  } from './side-navigation-links-internal';
12
12
 
13
13
  const WrappedLink: FC<{
14
- children: ReactElement;
14
+ children: ReactElement<any>;
15
15
  wrapper: NonNullable<SideNavigationLinkProps['wrapper']>;
16
16
  }> = ({ children, wrapper: WrapperComponent }) => {
17
17
  return (
@@ -246,9 +246,24 @@
246
246
  min-height: 12px !important;
247
247
  }
248
248
 
249
- .navigation-item-group-toggle[data-anv][data-anv] {
250
- color: inherit;
251
- font-weight: @font-weight-semibold;
249
+ .navigation-item-group-toggle-wrapper {
250
+ position: relative;
251
+ display: flex;
252
+ justify-content: center;
253
+ align-items: center;
254
+
255
+ .navigation-item-group-toggle[data-anv][data-anv] {
256
+ color: inherit;
257
+ font-weight: @font-weight-semibold;
258
+ }
259
+
260
+ .navigation-item-group-toggle-click {
261
+ position: absolute;
262
+ left: -@spacing-2;
263
+ right: -@spacing-half;
264
+ top: -@spacing-1;
265
+ bottom: -@spacing-1;
266
+ }
252
267
  }
253
268
 
254
269
  .navigation-icon[data-anv][data-anv] {
@@ -266,24 +281,11 @@
266
281
  .navigation-group-wrapper {
267
282
  .navigation-group-item {
268
283
  position: relative;
269
-
270
- .navigation-group-item-collapse {
271
- display: none;
272
- position: absolute;
273
- inset: 0;
274
- cursor: pointer;
275
- }
276
284
  }
277
285
 
278
- &:has(.navigation-item-active) {
279
- .navigation-group-item-collapse {
280
- display: block;
281
- }
282
-
283
- .submenu-wrapper:not(.submenu-wrapper-collapsed) {
284
- max-height: 2000px;
285
- transition: max-height 0.7s ease-in-out;
286
- }
286
+ .submenu-wrapper:not(.submenu-wrapper-collapsed) {
287
+ max-height: 2000px;
288
+ transition: max-height 0.7s ease-in-out;
287
289
  }
288
290
  }
289
291
 
@@ -1,7 +1,6 @@
1
1
  export const __esModule: true;
2
2
  export const divider: string;
3
3
  export const navigationGroupItem: string;
4
- export const navigationGroupItemCollapse: string;
5
4
  export const navigationGroupWrapper: string;
6
5
  export const navigationIcon: string;
7
6
  export const navigationIconActive: string;
@@ -11,6 +10,8 @@ export const navigationItemActive: string;
11
10
  export const navigationItemCounter: string;
12
11
  export const navigationItemCounterLong: string;
13
12
  export const navigationItemGroupToggle: string;
13
+ export const navigationItemGroupToggleClick: string;
14
+ export const navigationItemGroupToggleWrapper: string;
14
15
  export const navigationItemIconSwitch: string;
15
16
  export const navigationItemIconWrapper: string;
16
17
  export const navigationItemTextCollapsed: string;
@@ -371,13 +371,20 @@ const SideNavigationGroupItem: FC<
371
371
  onExpandedChange: undefined | ((expanded: SideNavigationExpandedState) => void);
372
372
  }
373
373
  > = ({ onExpandedChange, isGroupActive, ...props }) => {
374
- const isSubmenuExpanded = !!props.id && isGroupActive && props.expanded?.collapsed !== props.id;
375
- const triggerClick = useCallback(() => {
376
- onExpandedChange?.({
377
- bar: !!props.expanded?.bar,
378
- collapsed: props.expanded?.collapsed === props.id ? undefined : props.id,
379
- });
380
- }, [props.id, props.expanded, onExpandedChange]);
374
+ const isSubmenuExpanded = !!props.id && props.expanded?.expandedSubmenu === props.id;
375
+ const onExpandToggle = useCallback(
376
+ (e: MouseEvent<never>) => {
377
+ e.preventDefault();
378
+ e.stopPropagation();
379
+
380
+ onExpandedChange?.({
381
+ bar: true,
382
+ expandedSubmenu: isSubmenuExpanded ? undefined : props.id,
383
+ });
384
+ },
385
+ [props.id, isSubmenuExpanded, onExpandedChange]
386
+ );
387
+
381
388
  const tag = getSubmenuGroupTag(props.submenu, getCounterTag(props.counter, props.tag));
382
389
  const context = useContext(SideNavigationContext);
383
390
 
@@ -387,9 +394,9 @@ const SideNavigationGroupItem: FC<
387
394
  <InternalSideNavigationLink
388
395
  {...props}
389
396
  submenuExpanded={isSubmenuExpanded}
397
+ onExpandToggle={onExpandToggle}
390
398
  tag={tag}
391
399
  />
392
- <div className={Styles.navigationGroupItemCollapse} onClick={triggerClick} />
393
400
  </div>
394
401
  <div
395
402
  className={classNames(Styles.submenuWrapper, {
@@ -1,5 +1,4 @@
1
- import { FC, useContext } from 'react';
2
- import { NavigationLegacyContext } from '../utils/navigation-context';
1
+ import { FC } from 'react';
3
2
  import {
4
3
  HeaderNavigationLinkProps,
5
4
  HeaderNavigationTriggerProps,
@@ -8,27 +7,48 @@ import {
8
7
  HeaderNavigationLink as HeaderNavigationLinkLegacy,
9
8
  HeaderNavigationTrigger as HeaderNavigationTriggerLegacy,
10
9
  } from './header-navigation/header-navigation-links';
10
+ import { useTitanLayoutPlacementContext } from './titan-layout';
11
11
  import {
12
- HeaderNavigationLink as HeaderNavigationLinkModern,
13
- HeaderNavigationTrigger as HeaderNavigationTriggerModern,
14
- } from './left-navigation/header-navigation-tiny-links';
12
+ LayoutHeaderNavigationLink,
13
+ LayoutHeaderNavigationTrigger,
14
+ } from './titan-layout/layout-header-links';
15
+ import {
16
+ TitanLayoutSidebarLink,
17
+ TitanLayoutSidebarTrigger,
18
+ } from './titan-layout/layout-sidebar-links';
15
19
 
16
20
  export const HeaderNavigationLink: FC<HeaderNavigationLinkProps> = props => {
17
- const isLegacy = useContext(NavigationLegacyContext);
21
+ const placement = useTitanLayoutPlacementContext();
18
22
 
19
- return isLegacy ? (
20
- <HeaderNavigationLinkLegacy {...props} />
23
+ return placement === 'top' ? (
24
+ <LayoutHeaderNavigationLink {...props} />
25
+ ) : placement === 'side' ? (
26
+ <TitanLayoutSidebarLink
27
+ id={props.id}
28
+ icon={props.icon}
29
+ iconActive={props.iconActive}
30
+ to={props.to}
31
+ title={props.title}
32
+ counter={props.counter}
33
+ />
21
34
  ) : (
22
- <HeaderNavigationLinkModern {...props} />
35
+ <HeaderNavigationLinkLegacy {...props} />
23
36
  );
24
37
  };
25
38
 
26
39
  export const HeaderNavigationTrigger: FC<HeaderNavigationTriggerProps> = props => {
27
- const isLegacy = useContext(NavigationLegacyContext);
40
+ const placement = useTitanLayoutPlacementContext();
28
41
 
29
- return isLegacy ? (
30
- <HeaderNavigationTriggerLegacy {...props} />
42
+ return placement === 'top' ? (
43
+ <LayoutHeaderNavigationTrigger {...props} />
44
+ ) : placement === 'side' ? (
45
+ <TitanLayoutSidebarTrigger
46
+ id={props.id}
47
+ title={props.title}
48
+ icon={props.icon}
49
+ iconActive={props.iconActive}
50
+ />
31
51
  ) : (
32
- <HeaderNavigationTriggerModern {...props} />
52
+ <HeaderNavigationTriggerLegacy {...props} />
33
53
  );
34
54
  };
@@ -1,15 +1,17 @@
1
1
  import { FC } from 'react';
2
2
 
3
3
  /* tslint:disable: max-line-length */
4
- export const LogoCompanyTitle: FC<{ className?: string; fill?: string; size?: string }> = ({
5
- className,
6
- fill = 'currentColor',
7
- size = '162',
8
- }) => {
4
+ export const LogoCompanyTitle: FC<{
5
+ className?: string;
6
+ fill?: string;
7
+ size?: string;
8
+ height?: string | number;
9
+ }> = ({ className, fill = 'currentColor', size = '162', height }) => {
9
10
  return (
10
11
  <svg
11
12
  className={className}
12
- width={size}
13
+ width={height ? undefined : size}
14
+ height={height}
13
15
  viewBox="0 0 322 80"
14
16
  xmlns="http://www.w3.org/2000/svg"
15
17
  >
@@ -105,6 +105,10 @@
105
105
  position: relative;
106
106
  }
107
107
 
108
+ .dropdown-content-wrapper > span {
109
+ display: block !important;
110
+ }
111
+
108
112
  .dropdown-content-bottom-left {
109
113
  .dropdown-content-wrapper::before {
110
114
  content: '';
@@ -21,9 +21,9 @@ export const ProfileDropdownDefault = () => (
21
21
  <ProfileDropdown.Link id="first" to="https://google.com">
22
22
  first link
23
23
  </ProfileDropdown.Link>
24
- <ProfileDropdown.Link id="second" onClick={() => alert('second click')}>
24
+ <ProfileDropdown.Section id="second" onClick={() => alert('second click')}>
25
25
  second link
26
- </ProfileDropdown.Link>
26
+ </ProfileDropdown.Section>
27
27
  <ProfileDropdown.Divider />
28
28
  <ProfileDropdown.Section id="content">some content</ProfileDropdown.Section>
29
29
  <ProfileDropdown.Divider />
@@ -45,9 +45,9 @@ export const ProfileDropdownWithLogo = () => (
45
45
  <ProfileDropdown.Link id="first" to="https://google.com">
46
46
  first link
47
47
  </ProfileDropdown.Link>
48
- <ProfileDropdown.Link id="second" onClick={() => alert('second click')}>
48
+ <ProfileDropdown.Section id="second" onClick={() => alert('second click')}>
49
49
  second link
50
- </ProfileDropdown.Link>
50
+ </ProfileDropdown.Section>
51
51
  </ProfileDropdown>
52
52
  );
53
53
 
@@ -25,6 +25,7 @@ import {
25
25
  } from '../../utils/navigation-context';
26
26
  import { getCounterTag } from '../../utils/side-nav';
27
27
  import { CounterTag } from '../counter-tag';
28
+ import { withTooltip } from '../titan-layout/with-tooltip';
28
29
  import * as Styles from './profile-dropdown.module.less';
29
30
  import { ProfileLogo } from './profile-icon';
30
31
 
@@ -149,11 +150,12 @@ const ProfileDropdownTrigger: FC<ProfileDropdownTriggerProps> = ({
149
150
  export interface ProfileDropdownSectionPropsStrict {
150
151
  children: ReactNode;
151
152
  id: string;
153
+ tooltip?: string;
152
154
  className?: string;
153
155
  onClick?(e: MouseEvent): void;
154
156
  }
155
157
 
156
- interface ProfileDropdownSectionProps extends ProfileDropdownSectionPropsStrict {
158
+ export interface ProfileDropdownSectionProps extends ProfileDropdownSectionPropsStrict {
157
159
  [key: string]: any;
158
160
  }
159
161
 
@@ -161,6 +163,7 @@ export const ProfileDropdownSection: FC<ProfileDropdownSectionProps> = ({
161
163
  children,
162
164
  className,
163
165
  id,
166
+ tooltip,
164
167
  onClick,
165
168
  ...rest
166
169
  }) => {
@@ -172,16 +175,20 @@ export const ProfileDropdownSection: FC<ProfileDropdownSectionProps> = ({
172
175
  }
173
176
  };
174
177
 
175
- return (
178
+ return withTooltip(
176
179
  <div
177
- className={classNames(Styles.dropdownSection, className)}
180
+ className={classNames(Styles.dropdownSection, className, {
181
+ 'cursor-pointer': !!onClick,
182
+ })}
178
183
  onClick={clickHandler}
179
184
  data-cy={`profile-dropdown-section-${id}`}
180
185
  data-pendo={`profile-dropdown-section-${id}`}
181
186
  {...rest}
182
187
  >
183
188
  {children}
184
- </div>
189
+ </div>,
190
+ tooltip,
191
+ 'left'
185
192
  );
186
193
  };
187
194
 
@@ -193,10 +200,10 @@ export interface ProfileDropdownLinkPropsStrict {
193
200
  className?: string;
194
201
  external?: boolean;
195
202
  target?: HTMLAttributeAnchorTarget;
196
- to?: string;
203
+ tooltip?: string;
204
+ to: string;
197
205
  tag?: CounterTagData;
198
206
  counter?: CounterTagValue;
199
- onClick?: () => void;
200
207
  }
201
208
 
202
209
  export interface ProfileDropdownLinkProps extends ProfileDropdownLinkPropsStrict {
@@ -212,16 +219,12 @@ export const ProfileDropdownLink: FC<ProfileDropdownLinkProps> = ({
212
219
  tag,
213
220
  target,
214
221
  to,
222
+ tooltip,
215
223
  onClick,
216
224
  ...rest
217
225
  }: ProfileDropdownLinkProps) => {
218
226
  const NavigationComponent = useContext(NavigationComponentContext);
219
227
 
220
- const clickHandler = (e: MouseEvent<any>) => {
221
- e.preventDefault();
222
- onClick?.();
223
- };
224
-
225
228
  const isExternalLink = external ?? to?.startsWith('http');
226
229
 
227
230
  const tagElement = useMemo(
@@ -229,41 +232,34 @@ export const ProfileDropdownLink: FC<ProfileDropdownLinkProps> = ({
229
232
  [counter, tag]
230
233
  );
231
234
 
232
- return isExternalLink ? (
233
- <a
234
- className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
235
- href={to}
236
- target={target}
237
- data-cy={`profile-dropdown-link-${id}`}
238
- data-pendo={`profile-dropdown-link-${id}`}
239
- {...rest}
240
- >
241
- {children}
242
- {tagElement}
243
- </a>
244
- ) : to ? (
245
- <NavigationComponent
246
- className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
247
- target={target}
248
- to={to}
249
- data-cy={`profile-dropdown-link-${id}`}
250
- data-pendo={`profile-dropdown-link-${id}`}
251
- {...rest}
252
- >
253
- {children}
254
- {tagElement}
255
- </NavigationComponent>
256
- ) : (
257
- <a
258
- className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
259
- onClick={clickHandler}
260
- data-cy={`profile-dropdown-link-${id}`}
261
- data-pendo={`profile-dropdown-link-${id}`}
262
- {...rest}
263
- >
264
- {children}
265
- {tagElement}
266
- </a>
235
+ return withTooltip(
236
+ isExternalLink ? (
237
+ <a
238
+ className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
239
+ href={to}
240
+ target={target}
241
+ data-cy={`profile-dropdown-link-${id}`}
242
+ data-pendo={`profile-dropdown-link-${id}`}
243
+ {...rest}
244
+ >
245
+ {children}
246
+ {tagElement}
247
+ </a>
248
+ ) : (
249
+ <NavigationComponent
250
+ className={classNames(Styles.dropdownSection, Styles.dropdownLink, className)}
251
+ target={target}
252
+ to={to}
253
+ data-cy={`profile-dropdown-link-${id}`}
254
+ data-pendo={`profile-dropdown-link-${id}`}
255
+ {...rest}
256
+ >
257
+ {children}
258
+ {tagElement}
259
+ </NavigationComponent>
260
+ ),
261
+ tooltip,
262
+ 'left'
267
263
  );
268
264
  };
269
265
 
@@ -291,6 +287,7 @@ export interface ProfileDropdownProps extends ProfileDropdownPropsStrict {
291
287
  export interface ProfileDropdownType extends FC<ProfileDropdownProps> {
292
288
  Divider: typeof ProfileDropdownDivider;
293
289
  Link: typeof ProfileDropdownLink;
290
+ Trigger: typeof ProfileDropdownTrigger;
294
291
  Section: typeof ProfileDropdownSection;
295
292
  }
296
293
 
@@ -0,0 +1,5 @@
1
+ export * from './titan-layout';
2
+ export * from './layout-profile';
3
+ export * from './layout-context';
4
+ export * from './layout-logo';
5
+ export * from './interface';
@@ -0,0 +1,6 @@
1
+ import { FC } from 'react';
2
+ import { NavLinkComponentProps } from '../../utils/navigation-context';
3
+
4
+ export interface NavigationComponentProps {
5
+ navigationComponent: FC<NavLinkComponentProps>;
6
+ }
@@ -0,0 +1,26 @@
1
+ import { FC, ReactElement } from 'react';
2
+ import { NavigationItemData } from '../../utils/navigation';
3
+ import { TitanLayoutSidebarContextType } from './layout-context';
4
+
5
+ export interface TitanLayoutSidebarLinkWrapperProps {
6
+ children:
7
+ | ReactElement<TitanLayoutSidebarLinkProps>
8
+ | ReactElement<TitanLayoutSidebarTriggerProps>;
9
+ context: TitanLayoutSidebarContextType;
10
+ }
11
+
12
+ export interface TitanLayoutSidebarLinkProps extends Omit<NavigationItemData, 'submenu'> {
13
+ wrapper?: FC<TitanLayoutSidebarLinkWrapperProps>;
14
+ }
15
+ export interface TitanLayoutSidebarTriggerProps
16
+ extends Omit<TitanLayoutSidebarLinkProps, 'to' | 'isActive'> {
17
+ isActive?: boolean;
18
+ wrapper?: FC<TitanLayoutSidebarLinkWrapperProps>;
19
+ onClick?: () => void;
20
+ onMobileClick?: () => void;
21
+ }
22
+
23
+ export interface TitanLayoutState {
24
+ navCollapsed: boolean;
25
+ submenuExpanded?: string;
26
+ }
@@ -0,0 +1,30 @@
1
+ import { CSSProperties, FC, createContext, useContext } from 'react';
2
+ import { DefaultNavLinkComponent, NavLinkComponentProps } from '../../utils/navigation-context';
3
+ import { TitanBreakpoint } from '../../utils/use-breakpoint';
4
+
5
+ export interface TitanLayoutSidebarContextType {
6
+ styles: {
7
+ popoverContent: CSSProperties;
8
+ };
9
+ }
10
+
11
+ export type TitanLayoutPlacement = 'top' | 'side' | 'unset';
12
+
13
+ export interface TitanLayoutContextType {
14
+ NavigationComponent: FC<NavLinkComponentProps>;
15
+ breakpoint: TitanBreakpoint;
16
+ isTitanLayout: boolean;
17
+ sidebar: TitanLayoutSidebarContextType;
18
+ }
19
+
20
+ export const LayoutContext = createContext<TitanLayoutContextType>({
21
+ NavigationComponent: DefaultNavLinkComponent,
22
+ breakpoint: { name: 'lg', isMobile: false },
23
+ isTitanLayout: false,
24
+ sidebar: { styles: { popoverContent: {} } },
25
+ });
26
+
27
+ export const useTitanLayoutContext = () => useContext(LayoutContext);
28
+
29
+ export const LayoutPlacementContext = createContext<TitanLayoutPlacement | undefined>(undefined);
30
+ export const useTitanLayoutPlacementContext = () => useContext(LayoutPlacementContext);