@servicetitan/navigation 11.0.0-canary.237.4cefc6a.0 → 11.0.0-canary.237.5f3f02d.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 (286) 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 +82 -0
  135. package/dist/components/profile-dropdown/profile-dropdown.d.ts.map +1 -0
  136. package/dist/components/profile-dropdown/profile-dropdown.js +88 -0
  137. package/dist/components/profile-dropdown/profile-dropdown.js.map +1 -0
  138. package/dist/components/profile-dropdown/profile-dropdown.module.less +185 -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 +193 -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 +16 -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 +72 -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 +536 -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 +40 -0
  206. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -0
  207. package/dist/components/titan-layout/titan-layout.js +192 -0
  208. package/dist/components/titan-layout/titan-layout.js.map +1 -0
  209. package/dist/components/titan-layout/titan-layout.module.less +108 -0
  210. package/dist/components/titan-layout/titan-layout.stories.d.ts +22 -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 +83 -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 +8 -0
  248. package/dist/utils/use-breakpoint.d.ts.map +1 -0
  249. package/dist/utils/use-breakpoint.js +14 -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/logo/logo-titan-text.tsx +1 -1
  263. package/src/components/profile-dropdown/profile-dropdown.module.less +20 -6
  264. package/src/components/profile-dropdown/profile-dropdown.module.less.d.ts +23 -0
  265. package/src/components/profile-dropdown/profile-dropdown.tsx +50 -15
  266. package/src/components/titan-layout/layout-context.tsx +1 -1
  267. package/src/components/titan-layout/layout-header-links.tsx +2 -1
  268. package/src/components/titan-layout/layout-header.module.less +61 -21
  269. package/src/components/titan-layout/layout-header.module.less.d.ts +18 -0
  270. package/src/components/titan-layout/layout-header.tsx +17 -6
  271. package/src/components/titan-layout/layout-logo.tsx +13 -6
  272. package/src/components/titan-layout/layout-profile.stories.tsx +10 -1
  273. package/src/components/titan-layout/layout-profile.tsx +92 -28
  274. package/src/components/titan-layout/layout-sidebar-links-internal.tsx +18 -5
  275. package/src/components/titan-layout/layout-sidebar-links.tsx +22 -6
  276. package/src/components/titan-layout/layout-sidebar.module.less +29 -21
  277. package/src/components/titan-layout/layout-sidebar.module.less.d.ts +49 -0
  278. package/src/components/titan-layout/layout-sidebar.tsx +15 -9
  279. package/src/components/titan-layout/notifications-context.tsx +44 -0
  280. package/src/components/titan-layout/titan-layout.module.less +74 -19
  281. package/src/components/titan-layout/titan-layout.module.less.d.ts +16 -0
  282. package/src/components/titan-layout/titan-layout.stories.tsx +171 -19
  283. package/src/components/titan-layout/titan-layout.tsx +244 -74
  284. package/src/test/data-stories.module.less.d.ts +3 -0
  285. package/src/test/data.tsx +2 -3
  286. package/src/utils/use-breakpoint.ts +3 -1
@@ -11,6 +11,7 @@ import {
11
11
  useCallback,
12
12
  useEffect,
13
13
  useMemo,
14
+ useRef,
14
15
  useState,
15
16
  } from 'react';
16
17
  import { NavigationItemData } from '../../utils/navigation';
@@ -28,33 +29,38 @@ import { TitanLayoutLogo, TitanLayoutLogoProps } from './layout-logo';
28
29
  import { LayoutSidebar } from './layout-sidebar';
29
30
  import { TitanLayoutSidebarLink, TitanLayoutSidebarTrigger } from './layout-sidebar-links';
30
31
  import { InternalSideNavigationTrigger } from './layout-sidebar-links-internal';
32
+ import { useNotificationsState } from './notifications-context';
31
33
  import * as Styles from './titan-layout.module.less';
32
34
 
33
35
  type TitanLayoutChild = ReactElement<TitanLayoutContentProps> | ReactElement<TitanLayoutLogoProps>;
34
36
 
35
37
  export type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'style'> & {
36
- empty?: boolean;
37
-
38
+ /** layout appearance */
38
39
  appearance?: 'legacy' | 'anvil1' | 'anvil2';
39
40
 
41
+ /** layout's content */
42
+ children?: TitanLayoutChild | TitanLayoutChild[];
43
+
44
+ /** show only content without side and top bars */
45
+ contentOnly?: boolean;
46
+
40
47
  /** component used for navigation */
41
48
  navigationComponent?: FC<NavLinkComponentProps>;
42
49
 
43
50
  /** data for main navigation links */
44
51
  navigationMainItems?: NavigationItemData[];
45
52
 
46
- /** layout's content */
47
- children?: TitanLayoutChild | TitanLayoutChild[];
48
-
49
53
  state?: TitanLayoutState;
50
54
  onStateChange?: (state: TitanLayoutState) => void;
51
55
 
52
56
  header?: ReactElement;
57
+ top?: ReactElement;
58
+ sideTop?: ReactElement[];
53
59
  profile?: ReactElement;
54
60
  extraLinks?: ReactElement;
55
61
  extraLinksTop?: ReactElement;
56
62
  extraText?: string;
57
- sidebarTop?: ReactElement[];
63
+ minContentWidth?: number;
58
64
  };
59
65
 
60
66
  const defaultSidebarContext: TitanLayoutSidebarContextType = {
@@ -76,7 +82,7 @@ const useVariant = (appearance: TitanLayoutProps['appearance']) =>
76
82
  isLegacy,
77
83
  isAnvil1,
78
84
  isAnvil2,
79
- isSequent: isLegacy || isAnvil1,
85
+ isSequent: isLegacy || isAnvil2,
80
86
  };
81
87
  }, [appearance]);
82
88
 
@@ -113,8 +119,10 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
113
119
  appearance = 'anvil2',
114
120
  id,
115
121
  children,
122
+ contentOnly,
116
123
  navigationComponent,
117
124
  header,
125
+ top,
118
126
  profile,
119
127
  state,
120
128
  onStateChange,
@@ -122,10 +130,10 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
122
130
  extraLinks,
123
131
  extraLinksTop,
124
132
  extraText,
125
- sidebarTop,
133
+ minContentWidth,
134
+ sideTop,
126
135
  }) => {
127
136
  const breakpoint = useTitanBreakpoint();
128
- const isMobile = breakpoint.isMobile;
129
137
  const context: TitanLayoutContextType = useMemo(
130
138
  () => ({
131
139
  NavigationComponent: navigationComponent ?? DefaultNavLinkComponent,
@@ -138,21 +146,25 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
138
146
  const variant = useVariant(appearance);
139
147
  const [mobileDrawerOpened, setMobileDrawerOpened] = useState(false);
140
148
  const { content, logo } = useLayoutChildren(children);
149
+ const { hasNotifications, NotificationsContextProvider } = useNotificationsState();
150
+ const [offsetTopStyles, setOffsetTopStyles] = useState<object>({});
151
+ const updateIndicatorsHeight = useCallback((offset: number) => {
152
+ setOffsetTopStyles({
153
+ '--content-offset-top': `calc(var(--nav-offset-top) + ${offset}px)`,
154
+ });
155
+ }, []);
156
+
157
+ const isMobile = breakpoint.isMobile;
158
+ const hasSideBar = !contentOnly && (!!navigationMainItems?.length || !!sideTop?.length);
159
+ const hasTopBar = !contentOnly;
141
160
 
142
161
  useEffect(() => {
143
- if (!isMobile) {
144
- setMobileDrawerOpened(false);
145
- return;
162
+ if (variant.isAnvil1) {
163
+ const bodyClassName = 'of-hidden-i';
164
+ document.body.classList.add(bodyClassName);
165
+ return () => document.body.classList.remove(bodyClassName);
146
166
  }
147
-
148
- const listener = () => {
149
- setMobileDrawerOpened(false);
150
- };
151
-
152
- document.addEventListener('click', listener);
153
-
154
- return () => document.removeEventListener('click', listener);
155
- }, [isMobile]);
167
+ }, [variant.isAnvil1]);
156
168
 
157
169
  const onBurgerClick = useCallback((e: MouseEvent) => {
158
170
  setMobileDrawerOpened(true);
@@ -178,8 +190,49 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
178
190
  },
179
191
  [state, onStateChange]
180
192
  );
193
+ const hasMenuNotifications = useMemo(() => {
194
+ try {
195
+ return (
196
+ navigationMainItems?.some(item => {
197
+ if (item.counter || item.tag?.value) {
198
+ return true;
199
+ } else if (item.submenu) {
200
+ return item.submenu.groups.some(group =>
201
+ group.links.some(link => !!link.counter || !!link.tag?.value)
202
+ );
203
+ }
204
+ return false;
205
+ }) ?? false
206
+ );
207
+ } catch {
208
+ return false;
209
+ }
210
+ }, [navigationMainItems]);
181
211
 
182
- const [layoutStyles] = useState<object>({});
212
+ const limitContentWidth = useMemo(() => {
213
+ if (variant.isAnvil2 || !minContentWidth) {
214
+ return undefined;
215
+ }
216
+
217
+ if (breakpoint.width < minContentWidth) {
218
+ return minContentWidth;
219
+ }
220
+ }, [variant, minContentWidth, breakpoint.width]);
221
+
222
+ const contentStyles = useMemo(() => {
223
+ if (variant.isAnvil2) {
224
+ return offsetTopStyles;
225
+ }
226
+
227
+ if (variant.isLegacy) {
228
+ return {
229
+ ...(limitContentWidth
230
+ ? { display: 'flex', flexDirection: 'column', minHeight: '100vh' }
231
+ : {}),
232
+ ...offsetTopStyles,
233
+ };
234
+ }
235
+ }, [variant, offsetTopStyles, limitContentWidth]);
183
236
 
184
237
  const layoutClass = variant.isLegacy
185
238
  ? Styles.layoutLegacy
@@ -194,77 +247,194 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
194
247
  id={id}
195
248
  className={classNames(
196
249
  Styles.layout,
197
- isMobile
198
- ? Styles.layoutMobile
199
- : state?.navCollapsed
200
- ? Styles.layoutNavSlim
201
- : Styles.layoutNavWide,
250
+ isMobile ? Styles.layoutMobile : Styles.layoutDesktop,
251
+ {
252
+ [Styles.layoutTop]: hasTopBar,
253
+ [Styles.layoutNavSlim]: !isMobile && hasSideBar && state?.navCollapsed,
254
+ [Styles.layoutNavWide]: !isMobile && hasSideBar && !state?.navCollapsed,
255
+ },
202
256
  layoutClass
203
257
  )}
204
- style={layoutStyles}
258
+ style={contentStyles}
205
259
  >
206
260
  {variant.isSequent && <div className={Styles.topPlaceholder} />}
207
- <LayoutHeader
208
- className={Styles.top}
209
- logo={logo}
210
- profile={isMobile ? undefined : profile}
211
- center={header}
212
- rightText={isMobile ? undefined : extraText}
213
- right={
214
- <Fragment>
215
- {extraLinksTop}
216
- {!isMobile && extraLinks}
217
- </Fragment>
218
- }
219
- onBurgerClick={onBurgerClick}
220
- />
221
-
222
- <LayoutSidebar
223
- flex={!variant.isSequent}
224
- mobile={breakpoint.isMobile}
225
- barExpanded={isMobile ? mobileDrawerOpened : !state?.navCollapsed}
226
- submenuExpanded={state?.submenuExpanded}
227
- onBarExpandChange={onBarExpandChange}
228
- onSubmenuExpandChange={onSubmenuExpandChange}
229
- top={sidebarTop}
230
- mainItems={navigationMainItems}
231
- navigationComponent={context.NavigationComponent}
232
- bottom={
233
- isMobile ? (
261
+ {hasTopBar && (
262
+ <LayoutHeader
263
+ className={Styles.top}
264
+ logo={logo}
265
+ profile={isMobile ? undefined : profile}
266
+ center={top}
267
+ rightText={isMobile ? undefined : extraText}
268
+ right={
234
269
  <Fragment>
235
- {profile}
236
- {extraLinks}
237
- {!!extraText && (
238
- <InternalSideNavigationTrigger
239
- id="__extra_text"
240
- title={extraText}
241
- submenuExpanded={undefined}
242
- dataPrefix="navigation-extra-text"
243
- tag={undefined}
244
- icon={undefined}
245
- iconActive={undefined}
246
- />
247
- )}
270
+ {extraLinksTop}
271
+ {!isMobile && extraLinks}
248
272
  </Fragment>
249
- ) : undefined
250
- }
251
- />
273
+ }
274
+ isMobile={isMobile}
275
+ hasNotifications={hasNotifications || hasMenuNotifications}
276
+ onBurgerClick={onBurgerClick}
277
+ />
278
+ )}
279
+
280
+ {hasSideBar && (
281
+ <NotificationsContextProvider>
282
+ <LayoutSidebar
283
+ className={Styles.side}
284
+ mobile={breakpoint.isMobile}
285
+ barExpanded={!state?.navCollapsed}
286
+ onBarExpandChange={onBarExpandChange}
287
+ submenuExpanded={state?.submenuExpanded}
288
+ onSubmenuExpandChange={onSubmenuExpandChange}
289
+ drawerOpened={mobileDrawerOpened}
290
+ onDrawerOpenChange={setMobileDrawerOpened}
291
+ top={sideTop}
292
+ mainItems={navigationMainItems}
293
+ navigationComponent={context.NavigationComponent}
294
+ bottom={
295
+ isMobile ? (
296
+ <Fragment>
297
+ {profile}
298
+ {extraLinks}
299
+ {!!extraText && (
300
+ <InternalSideNavigationTrigger
301
+ id="__extra_text"
302
+ title={extraText}
303
+ submenuExpanded={undefined}
304
+ dataPrefix="navigation-extra-text"
305
+ tag={undefined}
306
+ icon={undefined}
307
+ iconActive={undefined}
308
+ />
309
+ )}
310
+ </Fragment>
311
+ ) : undefined
312
+ }
313
+ />
314
+ </NotificationsContextProvider>
315
+ )}
252
316
 
253
- {content}
317
+ {variant.isSequent && (
318
+ <TitanLayoutHeaderObserved heightChange={updateIndicatorsHeight}>
319
+ {header}
320
+ </TitanLayoutHeaderObserved>
321
+ )}
322
+ {variant.isAnvil1 ? (
323
+ <LayoutContentAnvil1 header={header} minWidth={limitContentWidth}>
324
+ {content}
325
+ </LayoutContentAnvil1>
326
+ ) : variant.isLegacy ? (
327
+ <LayoutContentLegacy minWidth={limitContentWidth}>
328
+ {content}
329
+ </LayoutContentLegacy>
330
+ ) : (
331
+ children
332
+ )}
254
333
  </div>
255
334
  </LayoutPlacementContext.Provider>
256
335
  </LayoutContext.Provider>
257
336
  );
258
337
  };
259
338
 
339
+ const TitanLayoutHeaderObserved: FC<{
340
+ children: ReactNode;
341
+ heightChange?(value: number): void;
342
+ }> = ({ children, heightChange }) => {
343
+ const ref = useRef<HTMLDivElement>(null);
344
+
345
+ useEffect(() => {
346
+ if (ref.current) {
347
+ const updatePosition = () => {
348
+ if (ref.current && heightChange) {
349
+ const pos = ref.current.getBoundingClientRect();
350
+ heightChange(pos.height);
351
+ }
352
+ };
353
+
354
+ const observer = new ResizeObserver(updatePosition);
355
+ observer.observe(ref.current);
356
+
357
+ updatePosition();
358
+ return () => observer.disconnect();
359
+ }
360
+ }, [heightChange]);
361
+
362
+ useEffect(() => {
363
+ return () => {
364
+ heightChange?.(0);
365
+ };
366
+ }, [heightChange]);
367
+ return (
368
+ <div ref={ref} className={Styles.contentHeader} data-cy="layout-content-header">
369
+ {children}
370
+ </div>
371
+ );
372
+ };
373
+ const TitanLayoutHeader: FC<{ children: ReactNode }> = ({ children }) => {
374
+ return (
375
+ <div className={Styles.contentHeader} data-cy="layout-content-header">
376
+ {children}
377
+ </div>
378
+ );
379
+ };
380
+
260
381
  export interface TitanLayoutContentProps {
261
382
  children: ReactNode;
262
383
  }
263
384
  const TitanLayoutContent: FC<TitanLayoutContentProps> = ({ children }) => children;
264
385
 
386
+ const LayoutContentAnvil1: FC<{
387
+ children: ReactNode;
388
+ header?: ReactNode;
389
+ minWidth?: number;
390
+ }> = ({ children, header, minWidth }) => {
391
+ const innerContentStyles: CSSProperties = useMemo(
392
+ () => ({
393
+ ...(minWidth ? { minWidth: `${minWidth}px` } : {}),
394
+ }),
395
+ [minWidth]
396
+ );
397
+
398
+ return (
399
+ <Fragment>
400
+ <TitanLayoutHeader>{header}</TitanLayoutHeader>
401
+ <div
402
+ className={classNames(Styles.content, { 'of-x-auto': !!minWidth })}
403
+ data-cy="layout-content"
404
+ >
405
+ <div
406
+ className="position-relative d-f flex-grow-1 flex-basis-0 of-hidden"
407
+ style={innerContentStyles}
408
+ >
409
+ {children}
410
+ </div>
411
+ </div>
412
+ </Fragment>
413
+ );
414
+ };
415
+
416
+ const LayoutContentLegacy: FC<{
417
+ children: ReactNode;
418
+ minWidth: number | undefined;
419
+ }> = ({ children, minWidth }) => {
420
+ const innerContentStyles: CSSProperties = useMemo(
421
+ () => ({
422
+ position: 'relative',
423
+ minWidth: `${minWidth}px`,
424
+ }),
425
+ [minWidth]
426
+ );
427
+
428
+ return (
429
+ <div className={minWidth ? 'of-x-auto flex-basis-0 flex-grow-1' : undefined}>
430
+ <div style={minWidth ? innerContentStyles : undefined}>{children}</div>
431
+ </div>
432
+ );
433
+ };
434
+
265
435
  export const TitanLayout = Object.assign(TitanLayoutComponent, {
266
436
  Content: TitanLayoutContent,
267
437
  Logo: TitanLayoutLogo,
268
- SidebarLink: TitanLayoutSidebarLink,
269
- SidebarTrigger: TitanLayoutSidebarTrigger,
438
+ Link: TitanLayoutSidebarLink,
439
+ Trigger: TitanLayoutSidebarTrigger,
270
440
  });
@@ -0,0 +1,3 @@
1
+ export const __esModule: true;
2
+ export const fixIcons: string;
3
+
package/src/test/data.tsx CHANGED
@@ -66,7 +66,6 @@ export const NavLinkMock = forwardRef<any, NavLinkComponentProps>(
66
66
  {...rest}
67
67
  onClick={e => {
68
68
  e.preventDefault();
69
- e.stopPropagation();
70
69
 
71
70
  if (!to.startsWith('http')) {
72
71
  history.replace(to);
@@ -82,10 +81,10 @@ export const NavLinkMock = forwardRef<any, NavLinkComponentProps>(
82
81
  }
83
82
  );
84
83
 
85
- export const LocationInfo = () => {
84
+ export const LocationInfo: FC<{ className?: string }> = ({ className }) => {
86
85
  const location = useLocation();
87
86
 
88
- return <BodyText>current location - {location.pathname}</BodyText>;
87
+ return <BodyText className={className}>current location - {location.pathname}</BodyText>;
89
88
  };
90
89
 
91
90
  const LocationProvider: FC<{ children: any }> = ({ children }) => {
@@ -4,6 +4,7 @@ import { useMemo } from 'react';
4
4
  export interface TitanBreakpoint {
5
5
  name: BreakpointReturnProps['name'];
6
6
  isMobile: boolean;
7
+ width: number;
7
8
  }
8
9
 
9
10
  export const useTitanBreakpoint = (): TitanBreakpoint => {
@@ -12,7 +13,8 @@ export const useTitanBreakpoint = (): TitanBreakpoint => {
12
13
  return useMemo(
13
14
  () => ({
14
15
  name: breakpoint?.name ?? 'xl',
15
- isMobile: breakpoint ? breakpoint.innerWidth <= 768 : false,
16
+ isMobile: breakpoint ? breakpoint.innerWidth < 768 : false,
17
+ width: breakpoint?.innerWidth ?? 0,
16
18
  }),
17
19
  [breakpoint]
18
20
  );