@servicetitan/navigation 11.0.0-canary.237.c90556e.0 → 11.0.0-canary.237.f92c882.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 (280) hide show
  1. package/dist/components/badge-tag.d.ts +12 -0
  2. package/dist/components/badge-tag.d.ts.map +1 -0
  3. package/dist/components/badge-tag.js +8 -0
  4. package/dist/components/badge-tag.js.map +1 -0
  5. package/dist/components/counter-tag.d.ts +12 -0
  6. package/dist/components/counter-tag.d.ts.map +1 -0
  7. package/dist/components/counter-tag.js +8 -0
  8. package/dist/components/counter-tag.js.map +1 -0
  9. package/dist/components/header-navigation/header-navigation-content.d.ts +30 -0
  10. package/dist/components/header-navigation/header-navigation-content.d.ts.map +1 -0
  11. package/dist/components/header-navigation/header-navigation-content.js +22 -0
  12. package/dist/components/header-navigation/header-navigation-content.js.map +1 -0
  13. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.d.ts +9 -0
  14. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.d.ts.map +1 -0
  15. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.js +13 -0
  16. package/dist/components/header-navigation/header-navigation-extra-stacked.stories.js.map +1 -0
  17. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts +12 -0
  18. package/dist/components/header-navigation/header-navigation-extra.stories.d.ts.map +1 -0
  19. package/dist/components/header-navigation/header-navigation-extra.stories.js +29 -0
  20. package/dist/components/header-navigation/header-navigation-extra.stories.js.map +1 -0
  21. package/dist/components/header-navigation/header-navigation-links.d.ts +11 -0
  22. package/dist/components/header-navigation/header-navigation-links.d.ts.map +1 -0
  23. package/dist/components/header-navigation/header-navigation-links.js +26 -0
  24. package/dist/components/header-navigation/header-navigation-links.js.map +1 -0
  25. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts +12 -0
  26. package/dist/components/header-navigation/header-navigation-stacked.stories.d.ts.map +1 -0
  27. package/dist/components/header-navigation/header-navigation-stacked.stories.js +50 -0
  28. package/dist/components/header-navigation/header-navigation-stacked.stories.js.map +1 -0
  29. package/dist/components/header-navigation/header-navigation-stories.module.less +6 -0
  30. package/dist/components/header-navigation/header-navigation.d.ts +59 -0
  31. package/dist/components/header-navigation/header-navigation.d.ts.map +1 -0
  32. package/dist/components/header-navigation/header-navigation.js +96 -0
  33. package/dist/components/header-navigation/header-navigation.js.map +1 -0
  34. package/dist/components/header-navigation/header-navigation.module.less +260 -0
  35. package/dist/components/header-navigation/header-navigation.stories.d.ts +12 -0
  36. package/dist/components/header-navigation/header-navigation.stories.d.ts.map +1 -0
  37. package/dist/components/header-navigation/header-navigation.stories.js +54 -0
  38. package/dist/components/header-navigation/header-navigation.stories.js.map +1 -0
  39. package/dist/components/header-navigation/index.d.ts +2 -0
  40. package/dist/components/header-navigation/index.d.ts.map +1 -0
  41. package/dist/components/header-navigation/index.js +2 -0
  42. package/dist/components/header-navigation/index.js.map +1 -0
  43. package/dist/components/header-navigation/with-tooltip.d.ts +4 -0
  44. package/dist/components/header-navigation/with-tooltip.d.ts.map +1 -0
  45. package/dist/components/header-navigation/with-tooltip.js +4 -0
  46. package/dist/components/header-navigation/with-tooltip.js.map +1 -0
  47. package/dist/components/layout.stories.d.ts +13 -0
  48. package/dist/components/layout.stories.d.ts.map +1 -0
  49. package/dist/components/layout.stories.js +29 -0
  50. package/dist/components/layout.stories.js.map +1 -0
  51. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.d.ts +9 -0
  52. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.d.ts.map +1 -0
  53. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.js +13 -0
  54. package/dist/components/left-navigation/header-navigation-extra-tiny.stories.js.map +1 -0
  55. package/dist/components/left-navigation/header-navigation-tiny-links.d.ts +18 -0
  56. package/dist/components/left-navigation/header-navigation-tiny-links.d.ts.map +1 -0
  57. package/dist/components/left-navigation/header-navigation-tiny-links.js +32 -0
  58. package/dist/components/left-navigation/header-navigation-tiny-links.js.map +1 -0
  59. package/dist/components/left-navigation/header-navigation-tiny.d.ts +23 -0
  60. package/dist/components/left-navigation/header-navigation-tiny.d.ts.map +1 -0
  61. package/dist/components/left-navigation/header-navigation-tiny.js +7 -0
  62. package/dist/components/left-navigation/header-navigation-tiny.js.map +1 -0
  63. package/dist/components/left-navigation/header-navigation-tiny.module.less +117 -0
  64. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts +12 -0
  65. package/dist/components/left-navigation/header-navigation-tiny.stories.d.ts.map +1 -0
  66. package/dist/components/left-navigation/header-navigation-tiny.stories.js +30 -0
  67. package/dist/components/left-navigation/header-navigation-tiny.stories.js.map +1 -0
  68. package/dist/components/left-navigation/index.d.ts +5 -0
  69. package/dist/components/left-navigation/index.d.ts.map +1 -0
  70. package/dist/components/left-navigation/index.js +5 -0
  71. package/dist/components/left-navigation/index.js.map +1 -0
  72. package/dist/components/left-navigation/interface-internal.d.ts +10 -0
  73. package/dist/components/left-navigation/interface-internal.d.ts.map +1 -0
  74. package/dist/components/left-navigation/interface-internal.js +2 -0
  75. package/dist/components/left-navigation/interface-internal.js.map +1 -0
  76. package/dist/components/left-navigation/interface.d.ts +20 -0
  77. package/dist/components/left-navigation/interface.d.ts.map +1 -0
  78. package/dist/components/left-navigation/interface.js +2 -0
  79. package/dist/components/left-navigation/interface.js.map +1 -0
  80. package/dist/components/left-navigation/side-navigation-context.d.ts +8 -0
  81. package/dist/components/left-navigation/side-navigation-context.d.ts.map +1 -0
  82. package/dist/components/left-navigation/side-navigation-context.js +7 -0
  83. package/dist/components/left-navigation/side-navigation-context.js.map +1 -0
  84. package/dist/components/left-navigation/side-navigation-links-internal.d.ts +28 -0
  85. package/dist/components/left-navigation/side-navigation-links-internal.d.ts.map +1 -0
  86. package/dist/components/left-navigation/side-navigation-links-internal.js +29 -0
  87. package/dist/components/left-navigation/side-navigation-links-internal.js.map +1 -0
  88. package/dist/components/left-navigation/side-navigation-links.d.ts +6 -0
  89. package/dist/components/left-navigation/side-navigation-links.d.ts.map +1 -0
  90. package/dist/components/left-navigation/side-navigation-links.js +27 -0
  91. package/dist/components/left-navigation/side-navigation-links.js.map +1 -0
  92. package/dist/components/left-navigation/side-navigation.d.ts +29 -0
  93. package/dist/components/left-navigation/side-navigation.d.ts.map +1 -0
  94. package/dist/components/left-navigation/side-navigation.js +182 -0
  95. package/dist/components/left-navigation/side-navigation.js.map +1 -0
  96. package/dist/components/left-navigation/side-navigation.module.less +530 -0
  97. package/dist/components/left-navigation/side-navigation.stories.d.ts +17 -0
  98. package/dist/components/left-navigation/side-navigation.stories.d.ts.map +1 -0
  99. package/dist/components/left-navigation/side-navigation.stories.js +115 -0
  100. package/dist/components/left-navigation/side-navigation.stories.js.map +1 -0
  101. package/dist/components/left-navigation/with-tooltip.d.ts +4 -0
  102. package/dist/components/left-navigation/with-tooltip.d.ts.map +1 -0
  103. package/dist/components/left-navigation/with-tooltip.js +4 -0
  104. package/dist/components/left-navigation/with-tooltip.js.map +1 -0
  105. package/dist/components/links.d.ts +5 -0
  106. package/dist/components/links.d.ts.map +1 -0
  107. package/dist/components/links.js +14 -0
  108. package/dist/components/links.js.map +1 -0
  109. package/dist/components/logo/logo-company-title.d.ts +8 -0
  110. package/dist/components/logo/logo-company-title.d.ts.map +1 -0
  111. package/dist/components/logo/logo-company-title.js +6 -0
  112. package/dist/components/logo/logo-company-title.js.map +1 -0
  113. package/dist/components/logo/logo-titan-text.d.ts +29 -0
  114. package/dist/components/logo/logo-titan-text.d.ts.map +1 -0
  115. package/dist/components/logo/logo-titan-text.js +13 -0
  116. package/dist/components/logo/logo-titan-text.js.map +1 -0
  117. package/dist/components/logo/logo-titan-text.module.less +31 -0
  118. package/dist/components/logo/logo-titan.d.ts +9 -0
  119. package/dist/components/logo/logo-titan.d.ts.map +1 -0
  120. package/dist/components/logo/logo-titan.js +13 -0
  121. package/dist/components/logo/logo-titan.js.map +1 -0
  122. package/dist/components/logo/logo.stories.d.ts +14 -0
  123. package/dist/components/logo/logo.stories.d.ts.map +1 -0
  124. package/dist/components/logo/logo.stories.js +20 -0
  125. package/dist/components/logo/logo.stories.js.map +1 -0
  126. package/dist/components/profile-dropdown/profile-dropdown-stacked.stories.d.ts +9 -0
  127. package/dist/components/profile-dropdown/profile-dropdown-stacked.stories.d.ts.map +1 -0
  128. package/dist/components/profile-dropdown/profile-dropdown-stacked.stories.js +13 -0
  129. package/dist/components/profile-dropdown/profile-dropdown-stacked.stories.js.map +1 -0
  130. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.d.ts +9 -0
  131. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.d.ts.map +1 -0
  132. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.js +13 -0
  133. package/dist/components/profile-dropdown/profile-dropdown-tiny.stories.js.map +1 -0
  134. package/dist/components/profile-dropdown/profile-dropdown.d.ts +80 -0
  135. package/dist/components/profile-dropdown/profile-dropdown.d.ts.map +1 -0
  136. package/dist/components/profile-dropdown/profile-dropdown.js +85 -0
  137. package/dist/components/profile-dropdown/profile-dropdown.js.map +1 -0
  138. package/dist/components/profile-dropdown/profile-dropdown.module.less +171 -0
  139. package/dist/components/profile-dropdown/profile-dropdown.stories.d.ts +16 -0
  140. package/dist/components/profile-dropdown/profile-dropdown.stories.d.ts.map +1 -0
  141. package/dist/components/profile-dropdown/profile-dropdown.stories.js +51 -0
  142. package/dist/components/profile-dropdown/profile-dropdown.stories.js.map +1 -0
  143. package/dist/components/profile-dropdown/profile-icon.d.ts +3 -0
  144. package/dist/components/profile-dropdown/profile-icon.d.ts.map +1 -0
  145. package/dist/components/profile-dropdown/profile-icon.js +5 -0
  146. package/dist/components/profile-dropdown/profile-icon.js.map +1 -0
  147. package/dist/components/titan-layout/index.d.ts +6 -0
  148. package/dist/components/titan-layout/index.d.ts.map +1 -0
  149. package/dist/components/titan-layout/index.js +6 -0
  150. package/dist/components/titan-layout/index.js.map +1 -0
  151. package/dist/components/titan-layout/interface-internal.d.ts +6 -0
  152. package/dist/components/titan-layout/interface-internal.d.ts.map +1 -0
  153. package/dist/components/titan-layout/interface-internal.js +2 -0
  154. package/dist/components/titan-layout/interface-internal.js.map +1 -0
  155. package/dist/components/titan-layout/interface.d.ts +21 -0
  156. package/dist/components/titan-layout/interface.d.ts.map +1 -0
  157. package/dist/components/titan-layout/interface.js +2 -0
  158. package/dist/components/titan-layout/interface.js.map +1 -0
  159. package/dist/components/titan-layout/layout-context.d.ts +20 -0
  160. package/dist/components/titan-layout/layout-context.d.ts.map +1 -0
  161. package/dist/components/titan-layout/layout-context.js +12 -0
  162. package/dist/components/titan-layout/layout-context.js.map +1 -0
  163. package/dist/components/titan-layout/layout-header-links.d.ts +7 -0
  164. package/dist/components/titan-layout/layout-header-links.d.ts.map +1 -0
  165. package/dist/components/titan-layout/layout-header-links.js +32 -0
  166. package/dist/components/titan-layout/layout-header-links.js.map +1 -0
  167. package/dist/components/titan-layout/layout-header.d.ts +22 -0
  168. package/dist/components/titan-layout/layout-header.d.ts.map +1 -0
  169. package/dist/components/titan-layout/layout-header.js +10 -0
  170. package/dist/components/titan-layout/layout-header.js.map +1 -0
  171. package/dist/components/titan-layout/layout-header.module.less +196 -0
  172. package/dist/components/titan-layout/layout-logo.d.ts +12 -0
  173. package/dist/components/titan-layout/layout-logo.d.ts.map +1 -0
  174. package/dist/components/titan-layout/layout-logo.js +15 -0
  175. package/dist/components/titan-layout/layout-logo.js.map +1 -0
  176. package/dist/components/titan-layout/layout-logo.stories.d.ts +13 -0
  177. package/dist/components/titan-layout/layout-logo.stories.d.ts.map +1 -0
  178. package/dist/components/titan-layout/layout-logo.stories.js +17 -0
  179. package/dist/components/titan-layout/layout-logo.stories.js.map +1 -0
  180. package/dist/components/titan-layout/layout-profile.d.ts +9 -0
  181. package/dist/components/titan-layout/layout-profile.d.ts.map +1 -0
  182. package/dist/components/titan-layout/layout-profile.js +68 -0
  183. package/dist/components/titan-layout/layout-profile.js.map +1 -0
  184. package/dist/components/titan-layout/layout-profile.stories.d.ts +13 -0
  185. package/dist/components/titan-layout/layout-profile.stories.d.ts.map +1 -0
  186. package/dist/components/titan-layout/layout-profile.stories.js +13 -0
  187. package/dist/components/titan-layout/layout-profile.stories.js.map +1 -0
  188. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts +46 -0
  189. package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts.map +1 -0
  190. package/dist/components/titan-layout/layout-sidebar-links-internal.js +61 -0
  191. package/dist/components/titan-layout/layout-sidebar-links-internal.js.map +1 -0
  192. package/dist/components/titan-layout/layout-sidebar-links.d.ts +6 -0
  193. package/dist/components/titan-layout/layout-sidebar-links.d.ts.map +1 -0
  194. package/dist/components/titan-layout/layout-sidebar-links.js +28 -0
  195. package/dist/components/titan-layout/layout-sidebar-links.js.map +1 -0
  196. package/dist/components/titan-layout/layout-sidebar.d.ts +19 -0
  197. package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -0
  198. package/dist/components/titan-layout/layout-sidebar.js +67 -0
  199. package/dist/components/titan-layout/layout-sidebar.js.map +1 -0
  200. package/dist/components/titan-layout/layout-sidebar.module.less +529 -0
  201. package/dist/components/titan-layout/notifications-context.d.ts +13 -0
  202. package/dist/components/titan-layout/notifications-context.d.ts.map +1 -0
  203. package/dist/components/titan-layout/notifications-context.js +23 -0
  204. package/dist/components/titan-layout/notifications-context.js.map +1 -0
  205. package/dist/components/titan-layout/titan-layout.d.ts +38 -0
  206. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -0
  207. package/dist/components/titan-layout/titan-layout.js +139 -0
  208. package/dist/components/titan-layout/titan-layout.js.map +1 -0
  209. package/dist/components/titan-layout/titan-layout.module.less +103 -0
  210. package/dist/components/titan-layout/titan-layout.stories.d.ts +21 -0
  211. package/dist/components/titan-layout/titan-layout.stories.d.ts.map +1 -0
  212. package/dist/components/titan-layout/titan-layout.stories.js +82 -0
  213. package/dist/components/titan-layout/titan-layout.stories.js.map +1 -0
  214. package/dist/components/titan-layout/with-tooltip.d.ts +4 -0
  215. package/dist/components/titan-layout/with-tooltip.d.ts.map +1 -0
  216. package/dist/components/titan-layout/with-tooltip.js +4 -0
  217. package/dist/components/titan-layout/with-tooltip.js.map +1 -0
  218. package/dist/index.d.ts +13 -0
  219. package/dist/index.d.ts.map +1 -0
  220. package/dist/index.js +13 -0
  221. package/dist/index.js.map +1 -0
  222. package/dist/test/data-stories.module.less +8 -0
  223. package/dist/test/data.d.ts +35 -0
  224. package/dist/test/data.d.ts.map +1 -0
  225. package/dist/test/data.js +243 -0
  226. package/dist/test/data.js.map +1 -0
  227. package/dist/utils/counter-tag.d.ts +5 -0
  228. package/dist/utils/counter-tag.d.ts.map +1 -0
  229. package/dist/utils/counter-tag.js +2 -0
  230. package/dist/utils/counter-tag.js.map +1 -0
  231. package/dist/utils/navigation-context.d.ts +27 -0
  232. package/dist/utils/navigation-context.d.ts.map +1 -0
  233. package/dist/utils/navigation-context.js +10 -0
  234. package/dist/utils/navigation-context.js.map +1 -0
  235. package/dist/utils/navigation-legacy.d.ts +88 -0
  236. package/dist/utils/navigation-legacy.d.ts.map +1 -0
  237. package/dist/utils/navigation-legacy.js +2 -0
  238. package/dist/utils/navigation-legacy.js.map +1 -0
  239. package/dist/utils/navigation.d.ts +48 -0
  240. package/dist/utils/navigation.d.ts.map +1 -0
  241. package/dist/utils/navigation.js +2 -0
  242. package/dist/utils/navigation.js.map +1 -0
  243. package/dist/utils/side-nav.d.ts +6 -0
  244. package/dist/utils/side-nav.d.ts.map +1 -0
  245. package/dist/utils/side-nav.js +28 -0
  246. package/dist/utils/side-nav.js.map +1 -0
  247. package/dist/utils/use-breakpoint.d.ts +7 -0
  248. package/dist/utils/use-breakpoint.d.ts.map +1 -0
  249. package/dist/utils/use-breakpoint.js +13 -0
  250. package/dist/utils/use-breakpoint.js.map +1 -0
  251. package/package.json +3 -4
  252. package/src/components/badge-tag.tsx +1 -1
  253. package/src/components/header-navigation/header-navigation-stacked.stories.tsx +1 -1
  254. package/src/components/header-navigation/header-navigation-stories.module.less.d.ts +3 -0
  255. package/src/components/header-navigation/header-navigation.module.less.d.ts +22 -0
  256. package/src/components/header-navigation/header-navigation.stories.tsx +1 -1
  257. package/src/components/left-navigation/header-navigation-tiny.module.less.d.ts +15 -0
  258. package/src/components/left-navigation/header-navigation-tiny.stories.tsx +2 -2
  259. package/src/components/left-navigation/side-navigation-links.tsx +1 -1
  260. package/src/components/left-navigation/side-navigation.module.less.d.ts +48 -0
  261. package/src/components/logo/logo-titan-text.module.less.d.ts +6 -0
  262. package/src/components/profile-dropdown/profile-dropdown.module.less.d.ts +21 -0
  263. package/src/components/profile-dropdown/profile-dropdown.tsx +13 -6
  264. package/src/components/titan-layout/layout-header.module.less +58 -15
  265. package/src/components/titan-layout/layout-header.module.less.d.ts +16 -0
  266. package/src/components/titan-layout/layout-header.tsx +12 -5
  267. package/src/components/titan-layout/layout-profile.stories.tsx +10 -1
  268. package/src/components/titan-layout/layout-profile.tsx +60 -25
  269. package/src/components/titan-layout/layout-sidebar-links-internal.tsx +18 -5
  270. package/src/components/titan-layout/layout-sidebar-links.tsx +17 -5
  271. package/src/components/titan-layout/layout-sidebar.module.less +20 -19
  272. package/src/components/titan-layout/layout-sidebar.module.less.d.ts +49 -0
  273. package/src/components/titan-layout/layout-sidebar.tsx +15 -9
  274. package/src/components/titan-layout/notifications-context.tsx +44 -0
  275. package/src/components/titan-layout/titan-layout.module.less +66 -16
  276. package/src/components/titan-layout/titan-layout.module.less.d.ts +15 -0
  277. package/src/components/titan-layout/titan-layout.stories.tsx +161 -18
  278. package/src/components/titan-layout/titan-layout.tsx +146 -58
  279. package/src/test/data-stories.module.less.d.ts +3 -0
  280. package/src/test/data.tsx +2 -3
@@ -6,9 +6,10 @@ import {
6
6
  InternalSideNavigationLink,
7
7
  InternalSideNavigationTrigger,
8
8
  } from './layout-sidebar-links-internal';
9
+ import { useNotificationsContext } from './notifications-context';
9
10
 
10
11
  const WrappedLink: FC<{
11
- children: ReactElement;
12
+ children: ReactElement<any>;
12
13
  wrapper: NonNullable<TitanLayoutSidebarLinkProps['wrapper']>;
13
14
  }> = ({ children, wrapper: WrapperComponent }) => {
14
15
  const { sidebar } = useTitanLayoutContext();
@@ -17,7 +18,14 @@ const WrappedLink: FC<{
17
18
 
18
19
  /** Side Navigation menu link */
19
20
  export function TitanLayoutSidebarLink({ wrapper, ...props }: TitanLayoutSidebarLinkProps) {
20
- const { NavigationComponent } = useTitanLayoutContext();
21
+ const {
22
+ NavigationComponent,
23
+ breakpoint: { isMobile },
24
+ } = useTitanLayoutContext();
25
+ const { onNotificationsUpdate } = useNotificationsContext();
26
+ const tag = getCounterTag(props.counter, props.tag);
27
+
28
+ onNotificationsUpdate(props.id, !!tag);
21
29
 
22
30
  const element = (
23
31
  <InternalSideNavigationLink
@@ -25,11 +33,11 @@ export function TitanLayoutSidebarLink({ wrapper, ...props }: TitanLayoutSidebar
25
33
  navigationComponent={NavigationComponent}
26
34
  submenuExpanded={undefined}
27
35
  dataPrefix="navigation-link"
28
- tag={getCounterTag(props.counter, props.tag)}
36
+ tag={tag}
29
37
  />
30
38
  );
31
39
 
32
- return wrapper ? <WrappedLink wrapper={wrapper}>{element}</WrappedLink> : element;
40
+ return wrapper && !isMobile ? <WrappedLink wrapper={wrapper}>{element}</WrappedLink> : element;
33
41
  }
34
42
 
35
43
  /** Side Navigation menu trigger */
@@ -42,13 +50,17 @@ export function TitanLayoutSidebarTrigger({
42
50
  const {
43
51
  breakpoint: { isMobile },
44
52
  } = useTitanLayoutContext();
53
+ const { onNotificationsUpdate } = useNotificationsContext();
54
+ const tag = getCounterTag(props.counter, props.tag);
55
+
56
+ onNotificationsUpdate(props.id, !!tag);
45
57
 
46
58
  const element = (
47
59
  <InternalSideNavigationTrigger
48
60
  {...props}
49
61
  submenuExpanded={undefined}
50
62
  dataPrefix="navigation-trigger"
51
- tag={getCounterTag(props.counter, props.tag)}
63
+ tag={tag}
52
64
  onClick={isMobile && !!onMobileClick ? onMobileClick : onClick}
53
65
  />
54
66
  );
@@ -15,29 +15,14 @@
15
15
  align-items: stretch;
16
16
  }
17
17
 
18
- // desktop version positioned with flex
19
- .nav-flex {
20
- flex-basis: var(--nav-offset-left);
21
- flex-grow: 0;
22
- flex-shrink: 0;
23
- }
24
-
25
- // desktop version positioned with fixed
26
- .nav-fixed {
27
- position: fixed;
28
- top: var(--nav-offset-top);
29
- bottom: 0;
30
- left: 0;
31
- }
32
-
33
18
  // mobile version
34
19
  .nav-drawer {
35
20
  display: none;
36
21
  position: fixed;
37
22
  max-width: 400px;
38
23
  width: 0;
24
+ height: 100vh;
39
25
  top: 0;
40
- bottom: 0;
41
26
  left: 0;
42
27
  z-index: 991;
43
28
 
@@ -76,6 +61,16 @@
76
61
  }
77
62
  }
78
63
 
64
+ .nav-drawer-backdrop {
65
+ position: fixed;
66
+ height: 100vh;
67
+ width: 100vw;
68
+ top: 0;
69
+ left: 0;
70
+ z-index: 991;
71
+ background-color: rgba(0, 0, 0, 0.5);
72
+ }
73
+
79
74
  // mobile version opened
80
75
  .nav-drawer-opened {
81
76
  display: flex;
@@ -156,7 +151,11 @@
156
151
  // desktop version expanded
157
152
  .nav-wide {
158
153
  width: var(--nav-offset-left);
159
- padding-top: @spacing-2;
154
+
155
+ .nav-item {
156
+ margin-left: @spacing-1;
157
+ margin-right: @spacing-1;
158
+ }
160
159
 
161
160
  .toggle {
162
161
  .toggle-content {
@@ -177,14 +176,16 @@
177
176
  margin-top: @spacing-1;
178
177
  margin-bottom: @spacing-1;
179
178
  }
179
+
180
+ .nav-main {
181
+ padding-top: @spacing-1;
182
+ }
180
183
  }
181
184
 
182
185
  .nav-drawer,
183
186
  .nav-wide {
184
187
  .nav-item {
185
188
  flex-direction: row;
186
- margin-left: @spacing-1;
187
- margin-right: @spacing-1;
188
189
 
189
190
  .nav-item-icon-wrapper {
190
191
  flex: 1;
@@ -0,0 +1,49 @@
1
+ export const __esModule: true;
2
+ export const divider: string;
3
+ export const nav: string;
4
+ export const navBottom: string;
5
+ export const navClose: string;
6
+ export const navCloseWrapper: string;
7
+ export const navDrawer: string;
8
+ export const navDrawerBackdrop: string;
9
+ export const navDrawerOpened: string;
10
+ export const navFooter: string;
11
+ export const navGroupItem: string;
12
+ export const navGroupWrapper: string;
13
+ export const navIcon: string;
14
+ export const navIconActive: string;
15
+ export const navIconInactive: string;
16
+ export const navItem: string;
17
+ export const navItemActive: string;
18
+ export const navItemCounter: string;
19
+ export const navItemCounterLong: string;
20
+ export const navItemGroupToggle: string;
21
+ export const navItemGroupToggleClick: string;
22
+ export const navItemGroupToggleWrapper: string;
23
+ export const navItemIconSwitch: string;
24
+ export const navItemIconWrapper: string;
25
+ export const navItemTextCollapsed: string;
26
+ export const navItemTextExpanded: string;
27
+ export const navItemTextSmall: string;
28
+ export const navLink: string;
29
+ export const navMain: string;
30
+ export const navSlim: string;
31
+ export const navTop: string;
32
+ export const navWide: string;
33
+ export const submenu: string;
34
+ export const submenuGroupHeader: string;
35
+ export const submenuGroupHeaderEmpty: string;
36
+ export const submenuItem: string;
37
+ export const submenuLink: string;
38
+ export const submenuLinkActive: string;
39
+ export const submenuLinkCounter: string;
40
+ export const submenuPopover: string;
41
+ export const submenuWrapper: string;
42
+ export const submenuWrapperCollapsed: string;
43
+ export const toggle: string;
44
+ export const toggleContent: string;
45
+ export const toggleIcon: string;
46
+ export const toggleIconWrapper: string;
47
+ export const toggleText: string;
48
+ export const toggleWrapper: string;
49
+
@@ -31,45 +31,51 @@ export interface LayoutSidebarProps {
31
31
  top?: ReactElement[];
32
32
  bottom?: ReactElement;
33
33
  mainItems?: NavigationItemData[];
34
- flex: boolean;
35
34
  barExpanded: boolean;
36
35
  submenuExpanded: string | undefined;
36
+ drawerOpened: boolean;
37
37
  mobile: boolean;
38
38
  navigationComponent: FC<NavLinkComponentProps>;
39
39
  onBarExpandChange(expanded: boolean): void;
40
+ onDrawerOpenChange(expanded: boolean): void;
40
41
  onSubmenuExpandChange(id: string, expanded: boolean): void;
41
42
  }
42
43
 
43
44
  export const LayoutSidebar: FC<LayoutSidebarProps> = ({
44
45
  className,
45
- flex,
46
46
  mobile,
47
47
  barExpanded,
48
48
  submenuExpanded,
49
+ drawerOpened,
49
50
  onBarExpandChange,
50
51
  onSubmenuExpandChange,
52
+ onDrawerOpenChange,
51
53
  mainItems,
52
54
  top,
53
55
  bottom,
54
56
  navigationComponent,
55
57
  }) => {
56
- const handleClick = (e: MouseEvent<never>) => {
57
- e.stopPropagation();
58
+ const closeDrawer = () => {
59
+ if (mobile) {
60
+ onDrawerOpenChange?.(false);
61
+ }
58
62
  };
59
63
 
60
64
  return (
61
65
  <LayoutPlacementContext.Provider value="side">
66
+ {mobile && drawerOpened && (
67
+ <div className={Styles.navDrawerBackdrop} onClick={closeDrawer} />
68
+ )}
62
69
  <div
63
70
  className={classNames(
64
71
  Styles.nav,
65
72
  mobile && Styles.navDrawer,
66
- mobile && barExpanded && Styles.navDrawerOpened,
73
+ mobile && drawerOpened && Styles.navDrawerOpened,
67
74
  !mobile && (barExpanded ? Styles.navWide : Styles.navSlim),
68
- !mobile && (flex ? Styles.navFlex : Styles.navFixed),
69
75
  className
70
76
  )}
71
77
  data-cy="side-navigation"
72
- onClick={handleClick}
78
+ onClick={closeDrawer}
73
79
  >
74
80
  <ThemeProvider mode="dark" className={Styles.navMain}>
75
81
  {mobile && (
@@ -82,14 +88,14 @@ export const LayoutSidebar: FC<LayoutSidebarProps> = ({
82
88
  </div>
83
89
  </div>
84
90
  )}
85
- {top?.length && <SidebarTop>{top}</SidebarTop>}
91
+ {!!top?.length && <SidebarTop>{top}</SidebarTop>}
86
92
 
87
93
  <div data-cy="navigation-items">
88
94
  {mainItems?.map(item =>
89
95
  item.submenu ? (
90
96
  <SideNavigationGroupItem
91
97
  key={item.id}
92
- barExpanded={barExpanded}
98
+ barExpanded={mobile ? barExpanded : drawerOpened}
93
99
  submenuExpanded={!!item.id && submenuExpanded === item.id}
94
100
  onSubmenuExpand={onSubmenuExpandChange}
95
101
  navigationComponent={navigationComponent}
@@ -0,0 +1,44 @@
1
+ import {
2
+ FC,
3
+ PropsWithChildren,
4
+ createContext,
5
+ useCallback,
6
+ useContext,
7
+ useRef,
8
+ useState,
9
+ } from 'react';
10
+
11
+ interface NotificationsContextType {
12
+ onNotificationsUpdate: (id: string, hasNotifications: boolean) => void;
13
+ }
14
+
15
+ const NotificationsContext = createContext<NotificationsContextType>({
16
+ onNotificationsUpdate: () => {},
17
+ });
18
+
19
+ export const useNotificationsContext = () => useContext(NotificationsContext);
20
+
21
+ export const useNotificationsState = () => {
22
+ const [hasNotifications, setHasNotifications] = useState(false);
23
+ const items = useRef(new Set<string>());
24
+ const onNotificationsUpdate = useCallback((id: string, hasNotifications: boolean) => {
25
+ if (hasNotifications && !items.current.has(id)) {
26
+ items.current.add(id);
27
+ setHasNotifications(!!items.current.size);
28
+ } else if (!hasNotifications && items.current.has(id)) {
29
+ items.current.delete(id);
30
+ setHasNotifications(!!items.current.size);
31
+ }
32
+ }, []);
33
+
34
+ const NotificationsContextProvider: FC<PropsWithChildren> = useCallback(
35
+ ({ children }) => (
36
+ <NotificationsContext.Provider value={{ onNotificationsUpdate }}>
37
+ {children}
38
+ </NotificationsContext.Provider>
39
+ ),
40
+ [onNotificationsUpdate]
41
+ );
42
+
43
+ return { NotificationsContextProvider, hasNotifications };
44
+ };
@@ -8,30 +8,54 @@
8
8
  @bg-color-hover: rgba(255, 255, 255, 0.08);
9
9
  @bg-color-active: rgba(120, 187, 250, 0.2);
10
10
 
11
- .layout-legacy {
12
- padding-left: var(--nav-offset-left);
13
- }
14
-
15
11
  .layout-anvil1 {
16
- display: block;
17
- }
12
+ height: calc(100vh - var(--nav-offset-top));
13
+ margin-top: var(--nav-offset-top);
18
14
 
19
- .layout-anvil2 {
20
- display: block;
15
+ display: flex;
16
+ flex-direction: column;
17
+
18
+ .side {
19
+ flex-basis: var(--nav-offset-left);
20
+ flex-grow: 0;
21
+ flex-shrink: 0;
22
+ }
23
+
24
+ .content {
25
+ flex-grow: 1;
26
+
27
+ display: flex;
28
+ flex-direction: column;
29
+ overflow: hidden;
30
+ }
21
31
  }
22
32
 
23
- .layout-legacy,
24
33
  .layout-anvil2 {
25
- .top-placeholder {
26
- height: var(--nav-offset-top);
34
+ .content-header {
35
+ position: sticky;
36
+ top: var(--nav-offset-top);
37
+ z-index: 989;
27
38
  }
39
+ }
28
40
 
29
- .top {
41
+ .layout-desktop {
42
+ padding-left: var(--nav-offset-left);
43
+
44
+ .side {
30
45
  position: fixed;
31
- top: 0;
46
+ top: var(--nav-offset-top);
47
+ bottom: 0;
32
48
  left: 0;
33
49
  right: 0;
34
- z-index: 991;
50
+ z-index: @z-index-global-nav;
51
+ }
52
+ }
53
+
54
+ .layout-legacy,
55
+ .layout-anvil2 {
56
+ overflow-x: auto;
57
+ .top-placeholder {
58
+ height: var(--nav-offset-top);
35
59
  }
36
60
  }
37
61
 
@@ -43,11 +67,37 @@
43
67
  --nav-offset-left: 0;
44
68
  }
45
69
 
46
- &.layout-nav-slim {
70
+ &.layout-desktop.layout-nav-slim {
47
71
  --nav-offset-left: 64px;
48
72
  }
49
73
 
50
- &.layout-nav-wide {
74
+ &.layout-desktop.layout-nav-wide {
51
75
  --nav-offset-left: 212px;
52
76
  }
77
+
78
+ .top {
79
+ position: fixed;
80
+ width: 100vw;
81
+ top: 0;
82
+ left: 0;
83
+ z-index: 991;
84
+ }
85
+
86
+ .content-header {
87
+ position: sticky;
88
+ left: 0;
89
+ right: 0;
90
+ }
91
+ }
92
+
93
+ @media print {
94
+ .layout {
95
+ --nav-offset-left: 0px !important;
96
+ --nav-offset-right: 0px !important;
97
+
98
+ .side,
99
+ .top {
100
+ display: none !important;
101
+ }
102
+ }
53
103
  }
@@ -0,0 +1,15 @@
1
+ export const __esModule: true;
2
+ export const content: string;
3
+ export const contentHeader: string;
4
+ export const layout: string;
5
+ export const layoutAnvil1: string;
6
+ export const layoutAnvil2: string;
7
+ export const layoutDesktop: string;
8
+ export const layoutLegacy: string;
9
+ export const layoutMobile: string;
10
+ export const layoutNavSlim: string;
11
+ export const layoutNavWide: string;
12
+ export const side: string;
13
+ export const top: string;
14
+ export const topPlaceholder: string;
15
+
@@ -1,4 +1,4 @@
1
- import { Page as Anvil2Page, Popover } from '@servicetitan/anvil2';
1
+ import { Announcement, Page as Anvil2Page, Button, Popover, TextField } from '@servicetitan/anvil2';
2
2
  import SvgSearch from '@servicetitan/anvil2/assets/icons/material/round/search.svg';
3
3
  import SvgAtlas from '@servicetitan/anvil2/assets/icons/st/atlas_logo.svg';
4
4
  import SvgSettingsActive from '@servicetitan/anvil2/assets/icons/st/gnav_settings_active.svg';
@@ -20,11 +20,30 @@ import { SideNavigationLinkWrapperProps } from '../left-navigation';
20
20
  import { HeaderNavigationLink, HeaderNavigationTrigger } from '../links';
21
21
  import { ProfileDropdown, TitanLayout, TitanLayoutProps, TitanLayoutState } from './';
22
22
 
23
+ interface LayoutContentArgs {
24
+ header: boolean;
25
+ sideTop: boolean;
26
+ extraText: boolean;
27
+ search: boolean;
28
+ longContent: boolean;
29
+ wideContent: boolean;
30
+ minWidth: boolean;
31
+ }
32
+
23
33
  export default {
24
34
  title: 'Navigation/TitanLayout',
25
- component: TitanLayout,
26
35
  decorators: [withDefaultRedirects, withMemoryRouter, withAnvil],
27
36
  parameters: {},
37
+ argTypes: {},
38
+ args: {
39
+ header: true,
40
+ sideTop: true,
41
+ extraText: true,
42
+ search: true,
43
+ longContent: true,
44
+ wideContent: false,
45
+ minWidth: false,
46
+ } as LayoutContentArgs,
28
47
  };
29
48
 
30
49
  const mainNavItems = [
@@ -51,6 +70,7 @@ const profile = (
51
70
  to="https://google.com"
52
71
  tooltip="Google it"
53
72
  target="_blank"
73
+ tag={{ value: true }}
54
74
  >
55
75
  first link
56
76
  </ProfileDropdown.Link>
@@ -131,9 +151,9 @@ const SideLinkPopoverWrapper: FC<SideNavigationLinkWrapperProps> = ({ children,
131
151
  };
132
152
 
133
153
  const sidebarTop = () => [
134
- <TitanLayout.SidebarLink key="tasks" {...items.tasks} />,
135
- <TitanLayout.SidebarLink key="calls" {...items.calls} />,
136
- <TitanLayout.SidebarTrigger
154
+ <TitanLayout.Link key="tasks" {...items.tasks} />,
155
+ <TitanLayout.Link key="calls" {...items.calls} />,
156
+ <TitanLayout.Trigger
137
157
  key="marketing"
138
158
  {...items.marketing}
139
159
  isActive={false}
@@ -142,51 +162,174 @@ const sidebarTop = () => [
142
162
  counter={50}
143
163
  />,
144
164
  ];
145
- const useLayoutProps = (): TitanLayoutProps => {
165
+ const ContentHeader = () => {
166
+ const [longInfo, setLongInfo] = useState(false);
167
+
168
+ return (
169
+ <Fragment>
170
+ <Announcement title="Some info" status="info" />
171
+ <Announcement title="Some warning" status="warning" />
172
+ <div
173
+ className="d-f justify-content-center align-items-center bg-purple-100-i"
174
+ style={{ height: longInfo ? '120px' : '48px' }}
175
+ >
176
+ <div className="d-f align-items-center gap-1">
177
+ custom content{' '}
178
+ <Button onClick={() => setLongInfo(!longInfo)} size="small" aria-label="test">
179
+ {longInfo ? '↑' : '↓'}
180
+ </Button>
181
+ </div>
182
+ </div>
183
+ </Fragment>
184
+ );
185
+ };
186
+ const SearchBar = () => <TextField size="small" placeholder="Search" className="w-100-i" />;
187
+
188
+ const useLayoutProps = (args: LayoutContentArgs): TitanLayoutProps => {
146
189
  const [state, setState] = useState<TitanLayoutState | undefined>(undefined);
147
190
 
148
191
  return {
149
192
  state,
150
193
  onStateChange: setState,
151
194
 
195
+ navigationComponent: NavLinkMock,
152
196
  navigationMainItems: mainNavItems,
197
+
153
198
  profile,
199
+ top: args.search ? <SearchBar /> : undefined,
200
+ header: args.header ? <ContentHeader /> : undefined,
201
+
154
202
  extraLinks,
155
203
  extraLinksTop,
204
+ extraText: args.extraText ? 'EST (-8 hrs)' : undefined,
156
205
 
157
- sidebarTop: sidebarTop(),
158
- navigationComponent: NavLinkMock,
159
- extraText: 'EST (-8 hrs)',
206
+ sideTop: args.sideTop ? sidebarTop() : undefined,
207
+
208
+ minContentWidth: args.minWidth ? 900 : undefined,
160
209
  };
161
210
  };
162
211
 
163
- export const TitanLayoutLegacy = () => (
164
- <TitanLayout {...useLayoutProps()} appearance="legacy">
212
+ const Content = (args: LayoutContentArgs) => {
213
+ return (
214
+ <Fragment>
215
+ <LocationInfo className="m-b-3" />
216
+ {args.wideContent && (
217
+ <div style={{ width: '1200px' }}>
218
+ Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
219
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
220
+ nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.
221
+ Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
222
+ fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
223
+ culpa qui officia deserunt mollit anim id est laborum.
224
+ </div>
225
+ )}
226
+
227
+ {args.longContent && (
228
+ <div>
229
+ <p>Lorem</p>
230
+ <p>ipsum</p>
231
+ <p>dolor</p>
232
+ <p>sit</p>
233
+ <p>amet,</p>
234
+ <p>consectetur</p>
235
+ <p>adipiscing</p>
236
+ <p>elit,</p>
237
+ <p>sed</p>
238
+ <p>do</p>
239
+ <p>eiusmod</p>
240
+ <p>tempor</p>
241
+ <p>incididunt</p>
242
+ <p>ut</p>
243
+ <p>labore</p>
244
+ <p>et</p>
245
+ <p>dolore</p>
246
+ <p>magna</p>
247
+ <p>aliqua.</p>
248
+ <p>Ut</p>
249
+ <p>enim</p>
250
+ <p>ad</p>
251
+ <p>minim</p>
252
+ <p>veniam,</p>
253
+ <p>quis</p>
254
+ <p>nostrud</p>
255
+ <p>exercitation</p>
256
+ <p>ullamco</p>
257
+ <p>laboris</p>
258
+ <p>nisi</p>
259
+ <p>ut</p>
260
+ <p>aliquip</p>
261
+ <p>ex</p>
262
+ <p>ea</p>
263
+ <p>commodo</p>
264
+ <p>consequat.</p>
265
+ <p>Duis</p>
266
+ <p>aute</p>
267
+ <p>irure</p>
268
+ <p>dolor</p>
269
+ <p>in</p>
270
+ <p>reprehenderit</p>
271
+ <p>in</p>
272
+ <p>voluptate</p>
273
+ <p>velit</p>
274
+ <p>esse</p>
275
+ <p>cillum</p>
276
+ <p>dolore</p>
277
+ <p>eu</p>
278
+ <p>fugiat</p>
279
+ <p>nulla</p>
280
+ <p>pariatur.</p>
281
+ <p>Excepteur</p>
282
+ <p>sint</p>
283
+ <p>occaecat</p>
284
+ <p>cupidatat</p>
285
+ <p>non</p>
286
+ <p>proident,</p>
287
+ <p>sunt</p>
288
+ <p>in</p>
289
+ <p>culpa</p>
290
+ <p>qui</p>
291
+ <p>officia</p>
292
+ <p>deserunt</p>
293
+ <p>mollit</p>
294
+ <p>anim</p>
295
+ <p>id</p>
296
+ <p>est</p>
297
+ <p>laborum.</p>
298
+ </div>
299
+ )}
300
+ </Fragment>
301
+ );
302
+ };
303
+
304
+ export const TitanLayoutLegacy = (args: LayoutContentArgs) => (
305
+ <TitanLayout {...useLayoutProps(args)} appearance="legacy">
165
306
  <TitanLayout.Logo title />
166
307
  <TitanLayout.Content>
167
- <LocationInfo />
308
+ <div className="p-3">
309
+ <Content {...args} />
310
+ </div>
168
311
  </TitanLayout.Content>
169
312
  </TitanLayout>
170
313
  );
171
314
 
172
- export const TitanLayoutAnvil1 = () => (
173
- <TitanLayout {...useLayoutProps()} appearance="anvil1">
315
+ export const TitanLayoutAnvil1 = (args: LayoutContentArgs) => (
316
+ <TitanLayout {...useLayoutProps(args)} appearance="anvil1">
174
317
  <TitanLayout.Logo title />
175
318
  <TitanLayout.Content>
176
319
  <Anvil1Page>
177
- <LocationInfo />
320
+ <Content {...args} />
178
321
  </Anvil1Page>
179
322
  </TitanLayout.Content>
180
323
  </TitanLayout>
181
324
  );
182
325
 
183
- export const TitanLayoutAnvil2 = () => (
184
- <TitanLayout {...useLayoutProps()} appearance="anvil2">
326
+ export const TitanLayoutAnvil2 = (args: LayoutContentArgs) => (
327
+ <TitanLayout {...useLayoutProps(args)} appearance="anvil2">
185
328
  <TitanLayout.Logo title />
186
329
  <TitanLayout.Content>
187
330
  <Anvil2Page>
188
331
  <Anvil2Page.Content>
189
- <LocationInfo />
332
+ <Content {...args} />
190
333
  </Anvil2Page.Content>
191
334
  </Anvil2Page>
192
335
  </TitanLayout.Content>