@servicetitan/navigation 13.1.4 → 13.1.6

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 (27) hide show
  1. package/dist/components/titan-layout/layout-context.js +1 -0
  2. package/dist/components/titan-layout/layout-context.js.map +1 -1
  3. package/dist/components/titan-layout/layout-sidebar.d.ts +1 -0
  4. package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -1
  5. package/dist/components/titan-layout/layout-sidebar.js +6 -5
  6. package/dist/components/titan-layout/layout-sidebar.js.map +1 -1
  7. package/dist/components/titan-layout/layout-sidebar.module.less +4 -0
  8. package/dist/components/titan-layout/layout-sidebar.module.less.d.ts +1 -0
  9. package/dist/components/titan-layout/titan-layout.d.ts +7 -1
  10. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -1
  11. package/dist/components/titan-layout/titan-layout.js +29 -19
  12. package/dist/components/titan-layout/titan-layout.js.map +1 -1
  13. package/dist/components/titan-layout/titan-layout.module.less +11 -3
  14. package/dist/components/titan-layout/titan-layout.module.less.d.ts +1 -0
  15. package/dist/utils/use-breakpoint.d.ts +2 -1
  16. package/dist/utils/use-breakpoint.d.ts.map +1 -1
  17. package/dist/utils/use-breakpoint.js +6 -3
  18. package/dist/utils/use-breakpoint.js.map +1 -1
  19. package/package.json +3 -3
  20. package/src/components/titan-layout/layout-context.tsx +1 -1
  21. package/src/components/titan-layout/layout-sidebar.module.less +4 -0
  22. package/src/components/titan-layout/layout-sidebar.module.less.d.ts +1 -0
  23. package/src/components/titan-layout/layout-sidebar.tsx +17 -3
  24. package/src/components/titan-layout/titan-layout.module.less +11 -3
  25. package/src/components/titan-layout/titan-layout.module.less.d.ts +1 -0
  26. package/src/components/titan-layout/titan-layout.tsx +38 -22
  27. package/src/utils/use-breakpoint.ts +7 -3
@@ -5,6 +5,7 @@ export const LayoutContext = /*#__PURE__*/ createContext({
5
5
  breakpoint: {
6
6
  name: 'lg',
7
7
  isMobile: false,
8
+ isTouchDevice: false,
8
9
  width: 0
9
10
  },
10
11
  isTitanLayout: false,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/titan-layout/layout-context.tsx"],"sourcesContent":["import { CSSProperties, FC, createContext, useContext } from 'react';\nimport { DefaultNavLinkComponent, NavLinkComponentProps } from '../../utils/navigation-context';\nimport { TitanBreakpoint } from '../../utils/use-breakpoint';\n\nexport interface TitanLayoutSidebarContextType {\n styles: {\n popoverContent: CSSProperties;\n };\n}\n\nexport type TitanLayoutPlacement = 'top' | 'side' | 'unset';\n\nexport interface TitanLayoutContextType {\n NavigationComponent: FC<NavLinkComponentProps>;\n breakpoint: TitanBreakpoint;\n isTitanLayout: boolean;\n sidebar: TitanLayoutSidebarContextType;\n}\n\nexport const LayoutContext = createContext<TitanLayoutContextType>({\n NavigationComponent: DefaultNavLinkComponent,\n breakpoint: { name: 'lg', isMobile: false, width: 0 },\n isTitanLayout: false,\n sidebar: { styles: { popoverContent: {} } },\n});\n\nexport const useTitanLayoutContext = () => useContext(LayoutContext);\n\nexport const LayoutPlacementContext = createContext<TitanLayoutPlacement | undefined>(undefined);\nexport const useTitanLayoutPlacementContext = () => useContext(LayoutPlacementContext);\n"],"names":["createContext","useContext","DefaultNavLinkComponent","LayoutContext","NavigationComponent","breakpoint","name","isMobile","width","isTitanLayout","sidebar","styles","popoverContent","useTitanLayoutContext","LayoutPlacementContext","undefined","useTitanLayoutPlacementContext"],"mappings":"AAAA,SAA4BA,aAAa,EAAEC,UAAU,QAAQ,QAAQ;AACrE,SAASC,uBAAuB,QAA+B,iCAAiC;AAkBhG,OAAO,MAAMC,8BAAgBH,cAAsC;IAC/DI,qBAAqBF;IACrBG,YAAY;QAAEC,MAAM;QAAMC,UAAU;QAAOC,OAAO;IAAE;IACpDC,eAAe;IACfC,SAAS;QAAEC,QAAQ;YAAEC,gBAAgB,CAAC;QAAE;IAAE;AAC9C,GAAG;AAEH,OAAO,MAAMC,wBAAwB,IAAMZ,WAAWE,eAAe;AAErE,OAAO,MAAMW,uCAAyBd,cAAgDe,WAAW;AACjG,OAAO,MAAMC,iCAAiC,IAAMf,WAAWa,wBAAwB"}
1
+ {"version":3,"sources":["../../../src/components/titan-layout/layout-context.tsx"],"sourcesContent":["import { CSSProperties, FC, createContext, useContext } from 'react';\nimport { DefaultNavLinkComponent, NavLinkComponentProps } from '../../utils/navigation-context';\nimport { TitanBreakpoint } from '../../utils/use-breakpoint';\n\nexport interface TitanLayoutSidebarContextType {\n styles: {\n popoverContent: CSSProperties;\n };\n}\n\nexport type TitanLayoutPlacement = 'top' | 'side' | 'unset';\n\nexport interface TitanLayoutContextType {\n NavigationComponent: FC<NavLinkComponentProps>;\n breakpoint: TitanBreakpoint;\n isTitanLayout: boolean;\n sidebar: TitanLayoutSidebarContextType;\n}\n\nexport const LayoutContext = createContext<TitanLayoutContextType>({\n NavigationComponent: DefaultNavLinkComponent,\n breakpoint: { name: 'lg', isMobile: false, isTouchDevice: false, width: 0 },\n isTitanLayout: false,\n sidebar: { styles: { popoverContent: {} } },\n});\n\nexport const useTitanLayoutContext = () => useContext(LayoutContext);\n\nexport const LayoutPlacementContext = createContext<TitanLayoutPlacement | undefined>(undefined);\nexport const useTitanLayoutPlacementContext = () => useContext(LayoutPlacementContext);\n"],"names":["createContext","useContext","DefaultNavLinkComponent","LayoutContext","NavigationComponent","breakpoint","name","isMobile","isTouchDevice","width","isTitanLayout","sidebar","styles","popoverContent","useTitanLayoutContext","LayoutPlacementContext","undefined","useTitanLayoutPlacementContext"],"mappings":"AAAA,SAA4BA,aAAa,EAAEC,UAAU,QAAQ,QAAQ;AACrE,SAASC,uBAAuB,QAA+B,iCAAiC;AAkBhG,OAAO,MAAMC,8BAAgBH,cAAsC;IAC/DI,qBAAqBF;IACrBG,YAAY;QAAEC,MAAM;QAAMC,UAAU;QAAOC,eAAe;QAAOC,OAAO;IAAE;IAC1EC,eAAe;IACfC,SAAS;QAAEC,QAAQ;YAAEC,gBAAgB,CAAC;QAAE;IAAE;AAC9C,GAAG;AAEH,OAAO,MAAMC,wBAAwB,IAAMb,WAAWE,eAAe;AAErE,OAAO,MAAMY,uCAAyBf,cAAgDgB,WAAW;AACjG,OAAO,MAAMC,iCAAiC,IAAMhB,WAAWc,wBAAwB"}
@@ -10,6 +10,7 @@ export interface LayoutSidebarProps {
10
10
  submenusExpanded: string[] | undefined;
11
11
  drawerOpened: boolean;
12
12
  mobile: boolean;
13
+ touchDevice: boolean;
13
14
  navigationComponent: FC<NavLinkComponentProps>;
14
15
  onBarExpandChange(expanded: boolean): void;
15
16
  onDrawerOpenChange(expanded: boolean): void;
@@ -1 +1 @@
1
- {"version":3,"file":"layout-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,EAAE,EAAY,YAAY,EAAkB,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAyB,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAWvE,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,mBAAmB,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAC/C,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3C,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9E;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAuFhD,CAAC"}
1
+ {"version":3,"file":"layout-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"names":[],"mappings":"AAGA,OAAO,EAAY,EAAE,EAAY,YAAY,EAAkB,MAAM,OAAO,CAAC;AAC7E,OAAO,EAAE,kBAAkB,EAAyB,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAWvE,MAAM,WAAW,kBAAkB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,YAAY,EAAE,CAAC;IACrB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,SAAS,CAAC,EAAE,kBAAkB,EAAE,CAAC;IACjC,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,MAAM,EAAE,GAAG,SAAS,CAAC;IACvC,YAAY,EAAE,OAAO,CAAC;IACtB,MAAM,EAAE,OAAO,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,mBAAmB,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAC/C,iBAAiB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC3C,kBAAkB,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;IAC5C,qBAAqB,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,GAAG,IAAI,CAAC;CAC9E;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CAyFhD,CAAC"}
@@ -7,7 +7,7 @@ import { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';
7
7
  import { LayoutPlacementContext, useTitanLayoutContext } from './layout-context';
8
8
  import { InternalSideNavigationGroup, InternalSideNavigationGroupLink, InternalSideNavigationLink } from './layout-sidebar-links-internal';
9
9
  import * as Styles from './layout-sidebar.module.less';
10
- export const LayoutSidebar = ({ className, mobile, barExpanded, submenusExpanded, drawerOpened, onBarExpandChange, onSubmenuExpandChange, onDrawerOpenChange, mainItems, top, bottom, navigationComponent })=>{
10
+ export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, submenusExpanded, drawerOpened, onBarExpandChange, onSubmenuExpandChange, onDrawerOpenChange, mainItems, top, bottom, navigationComponent })=>{
11
11
  const closeDrawer = ()=>{
12
12
  if (mobile) {
13
13
  onDrawerOpenChange === null || onDrawerOpenChange === void 0 ? void 0 : onDrawerOpenChange(false);
@@ -49,7 +49,8 @@ export const LayoutSidebar = ({ className, mobile, barExpanded, submenusExpanded
49
49
  barExpanded: mobile ? drawerOpened : barExpanded,
50
50
  submenuExpanded: !!item.id && !!(submenusExpanded === null || submenusExpanded === void 0 ? void 0 : submenusExpanded.includes(item.id)),
51
51
  onSubmenuExpand: onSubmenuExpandChange,
52
- navigationComponent: navigationComponent
52
+ navigationComponent: navigationComponent,
53
+ touchDevice: touchDevice
53
54
  }, item.id) : /*#__PURE__*/ _jsx(InternalSideNavigationLink, {
54
55
  id: item.id,
55
56
  to: item.to,
@@ -72,7 +73,7 @@ export const LayoutSidebar = ({ className, mobile, barExpanded, submenusExpanded
72
73
  });
73
74
  };
74
75
  LayoutSidebar.displayName = 'LayoutSidebar';
75
- /** Side Navigation menu item */ const SideNavigationGroupItem = ({ item, onSubmenuExpand, barExpanded, submenuExpanded, navigationComponent })=>{
76
+ /** Side Navigation menu item */ const SideNavigationGroupItem = ({ item, onSubmenuExpand, barExpanded, submenuExpanded, navigationComponent, touchDevice })=>{
76
77
  var _item_submenu, _item_submenu1;
77
78
  const { sidebar: { styles: { popoverContent } } } = useTitanLayoutContext();
78
79
  const tag = getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag));
@@ -96,7 +97,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
96
97
  })
97
98
  }) : /*#__PURE__*/ _jsxs(Popover, {
98
99
  placement: "right-start",
99
- openOnHover: true,
100
+ openOnHover: !touchDevice,
100
101
  delay: 300,
101
102
  children: [
102
103
  /*#__PURE__*/ _jsx(Popover.Trigger, {
@@ -109,7 +110,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
109
110
  isActive: item.isActive,
110
111
  icon: item.icon,
111
112
  iconActive: item.iconActive,
112
- className: item.className,
113
+ className: classNames(item.className, touchDevice && Styles.pointerEventsNone),
113
114
  tag: tag,
114
115
  navigationComponent: navigationComponent
115
116
  })
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"sourcesContent":["import { Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';\nimport SvgClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';\nimport classNames from 'classnames';\nimport { Children, FC, Fragment, ReactElement, isValidElement } from 'react';\nimport { NavigationItemData, NavigationSubmenuData } from '../../utils/navigation';\nimport { NavLinkComponentProps } from '../../utils/navigation-context';\nimport { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';\nimport { NavigationComponentProps } from './interface-internal';\nimport { LayoutPlacementContext, useTitanLayoutContext } from './layout-context';\nimport {\n InternalSideNavigationGroup,\n InternalSideNavigationGroupLink,\n InternalSideNavigationLink,\n} from './layout-sidebar-links-internal';\nimport * as Styles from './layout-sidebar.module.less';\n\nexport interface LayoutSidebarProps {\n className?: string;\n top?: ReactElement[];\n bottom?: ReactElement;\n mainItems?: NavigationItemData[];\n barExpanded: boolean;\n submenusExpanded: string[] | undefined;\n drawerOpened: boolean;\n mobile: boolean;\n navigationComponent: FC<NavLinkComponentProps>;\n onBarExpandChange(expanded: boolean): void;\n onDrawerOpenChange(expanded: boolean): void;\n onSubmenuExpandChange(id: string, expanded: boolean, force: boolean): void;\n}\n\nexport const LayoutSidebar: FC<LayoutSidebarProps> = ({\n className,\n mobile,\n barExpanded,\n submenusExpanded,\n drawerOpened,\n onBarExpandChange,\n onSubmenuExpandChange,\n onDrawerOpenChange,\n mainItems,\n top,\n bottom,\n navigationComponent,\n}) => {\n const closeDrawer = () => {\n if (mobile) {\n onDrawerOpenChange?.(false);\n }\n };\n\n return (\n <LayoutPlacementContext.Provider value=\"side\">\n {mobile && drawerOpened && (\n <div className={Styles.navDrawerBackdrop} onClick={closeDrawer} />\n )}\n <div\n className={classNames(\n Styles.nav,\n mobile && Styles.navDrawer,\n mobile && drawerOpened && Styles.navDrawerOpened,\n !mobile && (barExpanded ? Styles.navWide : Styles.navSlim),\n className\n )}\n data-cy=\"side-navigation\"\n onClick={closeDrawer}\n >\n <ThemeProvider mode=\"dark\" className={Styles.navMain}>\n {mobile && (\n <div className={Styles.navCloseWrapper}>\n <div\n className={Styles.navClose}\n onClick={() => onBarExpandChange(false)}\n >\n <Icon svg={SvgClose} size=\"large\" />\n </div>\n </div>\n )}\n {!!top?.length && <SidebarTop>{top}</SidebarTop>}\n\n <div data-cy=\"navigation-items\">\n {mainItems?.map(item =>\n item.submenu ? (\n <SideNavigationGroupItem\n key={item.id}\n item={item}\n barExpanded={mobile ? drawerOpened : barExpanded}\n submenuExpanded={\n !!item.id && !!submenusExpanded?.includes(item.id)\n }\n onSubmenuExpand={onSubmenuExpandChange}\n navigationComponent={navigationComponent}\n />\n ) : (\n <InternalSideNavigationLink\n key={item.id}\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={getSubmenuGroupTag(\n item.submenu,\n getCounterTag(item.counter, item.tag)\n )}\n navigationComponent={navigationComponent}\n />\n )\n )}\n </div>\n\n {!!bottom && <SidebarBottom>{bottom}</SidebarBottom>}\n </ThemeProvider>\n </div>\n </LayoutPlacementContext.Provider>\n );\n};\nLayoutSidebar.displayName = 'LayoutSidebar';\n\n/** Side Navigation menu item */\nconst SideNavigationGroupItem: FC<{\n item: NavigationItemData;\n navigationComponent: FC<NavLinkComponentProps>;\n barExpanded: boolean;\n submenuExpanded: boolean;\n onSubmenuExpand: (id: string, expanded: boolean, force: boolean) => void;\n}> = ({ item, onSubmenuExpand, barExpanded, submenuExpanded, navigationComponent }) => {\n const {\n sidebar: {\n styles: { popoverContent },\n },\n } = useTitanLayoutContext();\n\n const tag = getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag));\n\n return barExpanded ? (\n <InternalSideNavigationGroup\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={tag}\n submenuExpanded={submenuExpanded}\n onSubmenuExpand={onSubmenuExpand}\n navigationComponent={navigationComponent}\n >\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n />\n </InternalSideNavigationGroup>\n ) : (\n <Popover placement=\"right-start\" openOnHover delay={300}>\n <Popover.Trigger>\n {(triggerProps: any) => (\n <div {...triggerProps}>\n <InternalSideNavigationLink\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={tag}\n navigationComponent={navigationComponent}\n />\n </div>\n )}\n </Popover.Trigger>\n <Popover.Content style={popoverContent} className=\"z-global-nav-i\">\n <div className={Styles.submenuPopover}>\n <Text\n variant=\"headline\"\n el=\"h4\"\n size=\"small\"\n className=\"c-white m-b-half-i m-t-1\"\n >\n {item.title}\n </Text>\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n />\n </div>\n </Popover.Content>\n </Popover>\n );\n};\nconst SideNavigationGroupContent: FC<\n NavigationSubmenuData & NavigationComponentProps & { parentId: string }\n> = ({ groups, parentId, navigationComponent }) => {\n return (\n <Fragment>\n {groups.reduce((out, group, index) => {\n if (!group.links.length) {\n return out;\n }\n\n const title = group.title?.trim() ?? '';\n /* eslint-disable react/no-array-index-key */\n out.push(\n <Text\n key={`:group:${parentId}:${index}:title`}\n variant=\"eyebrow\"\n className={classNames(Styles.submenuGroupHeader, {\n [Styles.submenuGroupHeaderEmpty]: !title,\n })}\n >\n {title}\n </Text>\n );\n out.push(\n ...group.links.map((link, index) => (\n <InternalSideNavigationGroupLink\n key={`:${parentId}:${link.id}:${index}`}\n id={link.id}\n to={link.to}\n title={link.title}\n isActive={link.isActive}\n className={undefined}\n tag={getCounterTag(link.counter, link.tag)}\n parentId={parentId}\n navigationComponent={navigationComponent}\n />\n ))\n );\n /* eslint-enable react/no-array-index-key */\n\n return out;\n }, [] as ReactElement[])}\n </Fragment>\n );\n};\n\nfunction SidebarTop({ children }: any) {\n const list = Children.map(children, child => {\n return child && isValidElement(child) ? child : null;\n });\n return list?.length ? (\n <ThemeProvider mode=\"dark\" className={Styles.navTop} data-cy=\"navigation-items-top\">\n {list}\n <div className={Styles.divider} />\n </ThemeProvider>\n ) : null;\n}\n\nfunction SidebarBottom({ children }: any) {\n return (\n <ThemeProvider mode=\"dark\" className={Styles.navBottom} data-cy=\"navigation-items-bottom\">\n <div className={Styles.divider} />\n {children}\n </ThemeProvider>\n );\n}\n"],"names":["Icon","Popover","Text","ThemeProvider","SvgClose","classNames","Children","Fragment","isValidElement","getCounterTag","getSubmenuGroupTag","LayoutPlacementContext","useTitanLayoutContext","InternalSideNavigationGroup","InternalSideNavigationGroupLink","InternalSideNavigationLink","Styles","LayoutSidebar","className","mobile","barExpanded","submenusExpanded","drawerOpened","onBarExpandChange","onSubmenuExpandChange","onDrawerOpenChange","mainItems","top","bottom","navigationComponent","closeDrawer","Provider","value","div","navDrawerBackdrop","onClick","nav","navDrawer","navDrawerOpened","navWide","navSlim","data-cy","mode","navMain","navCloseWrapper","navClose","svg","size","length","SidebarTop","map","item","submenu","SideNavigationGroupItem","submenuExpanded","id","includes","onSubmenuExpand","to","title","isActive","icon","iconActive","tag","counter","SidebarBottom","displayName","sidebar","styles","popoverContent","SideNavigationGroupContent","parentId","groups","placement","openOnHover","delay","Trigger","triggerProps","Content","style","submenuPopover","variant","el","reduce","out","group","index","links","trim","push","submenuGroupHeader","submenuGroupHeaderEmpty","link","undefined","children","list","child","navTop","divider","navBottom"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"sourcesContent":["import { Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';\nimport SvgClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';\nimport classNames from 'classnames';\nimport { Children, FC, Fragment, ReactElement, isValidElement } from 'react';\nimport { NavigationItemData, NavigationSubmenuData } from '../../utils/navigation';\nimport { NavLinkComponentProps } from '../../utils/navigation-context';\nimport { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';\nimport { NavigationComponentProps } from './interface-internal';\nimport { LayoutPlacementContext, useTitanLayoutContext } from './layout-context';\nimport {\n InternalSideNavigationGroup,\n InternalSideNavigationGroupLink,\n InternalSideNavigationLink,\n} from './layout-sidebar-links-internal';\nimport * as Styles from './layout-sidebar.module.less';\n\nexport interface LayoutSidebarProps {\n className?: string;\n top?: ReactElement[];\n bottom?: ReactElement;\n mainItems?: NavigationItemData[];\n barExpanded: boolean;\n submenusExpanded: string[] | undefined;\n drawerOpened: boolean;\n mobile: boolean;\n touchDevice: boolean;\n navigationComponent: FC<NavLinkComponentProps>;\n onBarExpandChange(expanded: boolean): void;\n onDrawerOpenChange(expanded: boolean): void;\n onSubmenuExpandChange(id: string, expanded: boolean, force: boolean): void;\n}\n\nexport const LayoutSidebar: FC<LayoutSidebarProps> = ({\n className,\n mobile,\n touchDevice,\n barExpanded,\n submenusExpanded,\n drawerOpened,\n onBarExpandChange,\n onSubmenuExpandChange,\n onDrawerOpenChange,\n mainItems,\n top,\n bottom,\n navigationComponent,\n}) => {\n const closeDrawer = () => {\n if (mobile) {\n onDrawerOpenChange?.(false);\n }\n };\n\n return (\n <LayoutPlacementContext.Provider value=\"side\">\n {mobile && drawerOpened && (\n <div className={Styles.navDrawerBackdrop} onClick={closeDrawer} />\n )}\n <div\n className={classNames(\n Styles.nav,\n mobile && Styles.navDrawer,\n mobile && drawerOpened && Styles.navDrawerOpened,\n !mobile && (barExpanded ? Styles.navWide : Styles.navSlim),\n className\n )}\n data-cy=\"side-navigation\"\n onClick={closeDrawer}\n >\n <ThemeProvider mode=\"dark\" className={Styles.navMain}>\n {mobile && (\n <div className={Styles.navCloseWrapper}>\n <div\n className={Styles.navClose}\n onClick={() => onBarExpandChange(false)}\n >\n <Icon svg={SvgClose} size=\"large\" />\n </div>\n </div>\n )}\n {!!top?.length && <SidebarTop>{top}</SidebarTop>}\n\n <div data-cy=\"navigation-items\">\n {mainItems?.map(item =>\n item.submenu ? (\n <SideNavigationGroupItem\n key={item.id}\n item={item}\n barExpanded={mobile ? drawerOpened : barExpanded}\n submenuExpanded={\n !!item.id && !!submenusExpanded?.includes(item.id)\n }\n onSubmenuExpand={onSubmenuExpandChange}\n navigationComponent={navigationComponent}\n touchDevice={touchDevice}\n />\n ) : (\n <InternalSideNavigationLink\n key={item.id}\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={getSubmenuGroupTag(\n item.submenu,\n getCounterTag(item.counter, item.tag)\n )}\n navigationComponent={navigationComponent}\n />\n )\n )}\n </div>\n\n {!!bottom && <SidebarBottom>{bottom}</SidebarBottom>}\n </ThemeProvider>\n </div>\n </LayoutPlacementContext.Provider>\n );\n};\nLayoutSidebar.displayName = 'LayoutSidebar';\n\n/** Side Navigation menu item */\nconst SideNavigationGroupItem: FC<{\n item: NavigationItemData;\n navigationComponent: FC<NavLinkComponentProps>;\n touchDevice: boolean;\n barExpanded: boolean;\n submenuExpanded: boolean;\n onSubmenuExpand: (id: string, expanded: boolean, force: boolean) => void;\n}> = ({\n item,\n onSubmenuExpand,\n barExpanded,\n submenuExpanded,\n navigationComponent,\n touchDevice,\n}) => {\n const {\n sidebar: {\n styles: { popoverContent },\n },\n } = useTitanLayoutContext();\n\n const tag = getSubmenuGroupTag(item.submenu, getCounterTag(item.counter, item.tag));\n\n return barExpanded ? (\n <InternalSideNavigationGroup\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={item.className}\n tag={tag}\n submenuExpanded={submenuExpanded}\n onSubmenuExpand={onSubmenuExpand}\n navigationComponent={navigationComponent}\n >\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n />\n </InternalSideNavigationGroup>\n ) : (\n <Popover placement=\"right-start\" openOnHover={!touchDevice} delay={300}>\n <Popover.Trigger>\n {(triggerProps: any) => (\n <div {...triggerProps}>\n <InternalSideNavigationLink\n id={item.id}\n to={item.to}\n title={item.title}\n isActive={item.isActive}\n icon={item.icon}\n iconActive={item.iconActive}\n className={classNames(\n item.className,\n touchDevice && Styles.pointerEventsNone\n )}\n tag={tag}\n navigationComponent={navigationComponent}\n />\n </div>\n )}\n </Popover.Trigger>\n <Popover.Content style={popoverContent} className=\"z-global-nav-i\">\n <div className={Styles.submenuPopover}>\n <Text\n variant=\"headline\"\n el=\"h4\"\n size=\"small\"\n className=\"c-white m-b-half-i m-t-1\"\n >\n {item.title}\n </Text>\n <SideNavigationGroupContent\n parentId={item.id}\n groups={item.submenu?.groups ?? []}\n navigationComponent={navigationComponent}\n />\n </div>\n </Popover.Content>\n </Popover>\n );\n};\nconst SideNavigationGroupContent: FC<\n NavigationSubmenuData & NavigationComponentProps & { parentId: string }\n> = ({ groups, parentId, navigationComponent }) => {\n return (\n <Fragment>\n {groups.reduce((out, group, index) => {\n if (!group.links.length) {\n return out;\n }\n\n const title = group.title?.trim() ?? '';\n /* eslint-disable react/no-array-index-key */\n out.push(\n <Text\n key={`:group:${parentId}:${index}:title`}\n variant=\"eyebrow\"\n className={classNames(Styles.submenuGroupHeader, {\n [Styles.submenuGroupHeaderEmpty]: !title,\n })}\n >\n {title}\n </Text>\n );\n out.push(\n ...group.links.map((link, index) => (\n <InternalSideNavigationGroupLink\n key={`:${parentId}:${link.id}:${index}`}\n id={link.id}\n to={link.to}\n title={link.title}\n isActive={link.isActive}\n className={undefined}\n tag={getCounterTag(link.counter, link.tag)}\n parentId={parentId}\n navigationComponent={navigationComponent}\n />\n ))\n );\n /* eslint-enable react/no-array-index-key */\n\n return out;\n }, [] as ReactElement[])}\n </Fragment>\n );\n};\n\nfunction SidebarTop({ children }: any) {\n const list = Children.map(children, child => {\n return child && isValidElement(child) ? child : null;\n });\n return list?.length ? (\n <ThemeProvider mode=\"dark\" className={Styles.navTop} data-cy=\"navigation-items-top\">\n {list}\n <div className={Styles.divider} />\n </ThemeProvider>\n ) : null;\n}\n\nfunction SidebarBottom({ children }: any) {\n return (\n <ThemeProvider mode=\"dark\" className={Styles.navBottom} data-cy=\"navigation-items-bottom\">\n <div className={Styles.divider} />\n {children}\n </ThemeProvider>\n );\n}\n"],"names":["Icon","Popover","Text","ThemeProvider","SvgClose","classNames","Children","Fragment","isValidElement","getCounterTag","getSubmenuGroupTag","LayoutPlacementContext","useTitanLayoutContext","InternalSideNavigationGroup","InternalSideNavigationGroupLink","InternalSideNavigationLink","Styles","LayoutSidebar","className","mobile","touchDevice","barExpanded","submenusExpanded","drawerOpened","onBarExpandChange","onSubmenuExpandChange","onDrawerOpenChange","mainItems","top","bottom","navigationComponent","closeDrawer","Provider","value","div","navDrawerBackdrop","onClick","nav","navDrawer","navDrawerOpened","navWide","navSlim","data-cy","mode","navMain","navCloseWrapper","navClose","svg","size","length","SidebarTop","map","item","submenu","SideNavigationGroupItem","submenuExpanded","id","includes","onSubmenuExpand","to","title","isActive","icon","iconActive","tag","counter","SidebarBottom","displayName","sidebar","styles","popoverContent","SideNavigationGroupContent","parentId","groups","placement","openOnHover","delay","Trigger","triggerProps","pointerEventsNone","Content","style","submenuPopover","variant","el","reduce","out","group","index","links","trim","push","submenuGroupHeader","submenuGroupHeaderEmpty","link","undefined","children","list","child","navTop","divider","navBottom"],"mappings":"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"}
@@ -590,3 +590,7 @@
590
590
  background-color: @bg-color-hover;
591
591
  }
592
592
  }
593
+
594
+ .pointer-events-none {
595
+ pointer-events: none;
596
+ }
@@ -30,6 +30,7 @@ export const navMain: string;
30
30
  export const navSlim: string;
31
31
  export const navTop: string;
32
32
  export const navWide: string;
33
+ export const pointerEventsNone: string;
33
34
  export const submenu: string;
34
35
  export const submenuGroupHeader: string;
35
36
  export const submenuGroupHeaderEmpty: string;
@@ -55,8 +55,14 @@ export type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children'
55
55
  * used for pages that aren't adopted to mobile
56
56
  */
57
57
  minContentWidth?: number;
58
+ /**
59
+ * disable responsive behavior
60
+ * can be used for pages that aren't adopted to mobile
61
+ */
62
+ noResponsive?: boolean;
58
63
  };
59
- declare function TitanLayoutComponent({ appearance, navVariant, id, children, contentOnly, navigationComponent, header, top, profile, state, logo, onStateChange, navigationMainItems, navigationOverflowItems, extraLinks, extraLinksTop, extraText, minContentWidth, sideTop, }: TitanLayoutProps): import("react/jsx-runtime").JSX.Element;
64
+ export declare const useViewportConfigs: (noResponsive?: boolean) => void;
65
+ declare function TitanLayoutComponent({ appearance, navVariant, id, children, contentOnly, navigationComponent, header, top, profile, state, logo, onStateChange, navigationMainItems, navigationOverflowItems, extraLinks, extraLinksTop, extraText, minContentWidth, noResponsive, sideTop, }: TitanLayoutProps): import("react/jsx-runtime").JSX.Element;
60
66
  export declare const TitanLayout: typeof TitanLayoutComponent & {
61
67
  Link: FC<import("./interface").TitanLayoutLinkProps>;
62
68
  Trigger: FC<import("./interface").TitanLayoutTriggerProps>;
@@ -1 +1 @@
1
- {"version":3,"file":"titan-layout.d.ts","sourceRoot":"","sources":["../../../src/components/titan-layout/titan-layout.tsx"],"names":[],"mappings":"AACA,OAAO,EAEH,wBAAwB,EACxB,EAAE,EAGF,YAAY,EACZ,SAAS,EAMZ,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAA2B,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAS/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAOrD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACzF,wBAAwB;IACxB,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE5C,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE5B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAEhD,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAE3C,sEAAsE;IACtE,uBAAuB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAE/C,iBAAiB;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAE5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAElD,6BAA6B;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,qCAAqC;IACrC,GAAG,CAAC,EAAE,YAAY,CAAC;IAEnB,oCAAoC;IACpC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,YAAY,CAAC;IAE7B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AAyBF,iBAAS,oBAAoB,CAAC,EAC1B,UAAqB,EACrB,UAAmB,EACnB,EAAE,EACF,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,GAAG,EACH,OAAO,EACP,KAAK,EACL,IAAI,EACJ,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,OAAO,GACV,EAAE,gBAAgB,2CAgRlB;AAyFD,eAAO,MAAM,WAAW;;;CAGtB,CAAC"}
1
+ {"version":3,"file":"titan-layout.d.ts","sourceRoot":"","sources":["../../../src/components/titan-layout/titan-layout.tsx"],"names":[],"mappings":"AACA,OAAO,EAEH,wBAAwB,EACxB,EAAE,EAGF,YAAY,EACZ,SAAS,EAMZ,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,kBAAkB,EAAE,MAAM,wBAAwB,CAAC;AAC5D,OAAO,EAA2B,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAEhG,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAS/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,eAAe,CAAC;AAOrD,MAAM,MAAM,gBAAgB,GAAG,IAAI,CAAC,wBAAwB,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,OAAO,CAAC,GAAG;IACzF,wBAAwB;IACxB,UAAU,CAAC,EAAE,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAC;IAE5C,kDAAkD;IAClD,UAAU,CAAC,EAAE,MAAM,GAAG,KAAK,CAAC;IAE5B,uBAAuB;IACvB,QAAQ,CAAC,EAAE,SAAS,CAAC;IAErB,kDAAkD;IAClD,WAAW,CAAC,EAAE,OAAO,CAAC;IAEtB,oCAAoC;IACpC,mBAAmB,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAEhD,qCAAqC;IACrC,mBAAmB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAE3C,sEAAsE;IACtE,uBAAuB,CAAC,EAAE,kBAAkB,EAAE,CAAC;IAE/C,iBAAiB;IACjB,IAAI,CAAC,EAAE,oBAAoB,CAAC;IAE5B,mBAAmB;IACnB,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,kCAAkC;IAClC,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAElD,6BAA6B;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB,qCAAqC;IACrC,GAAG,CAAC,EAAE,YAAY,CAAC;IAEnB,oCAAoC;IACpC,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IAEzB;;;OAGG;IACH,OAAO,CAAC,EAAE,YAAY,CAAC;IAEvB;;;OAGG;IACH,UAAU,CAAC,EAAE,YAAY,CAAC;IAE1B;;;OAGG;IACH,aAAa,CAAC,EAAE,YAAY,CAAC;IAE7B;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;;OAGG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;IAEzB;;;OAGG;IACH,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAyBF,eAAO,MAAM,kBAAkB,GAAI,eAAe,OAAO,SAUxD,CAAC;AAEF,iBAAS,oBAAoB,CAAC,EAC1B,UAAqB,EACrB,UAAmB,EACnB,EAAE,EACF,QAAQ,EACR,WAAW,EACX,mBAAmB,EACnB,MAAM,EACN,GAAG,EACH,OAAO,EACP,KAAK,EACL,IAAI,EACJ,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,UAAU,EACV,aAAa,EACb,SAAS,EACT,eAAe,EACf,YAAY,EACZ,OAAO,GACV,EAAE,gBAAgB,2CAiRlB;AAqFD,eAAO,MAAM,WAAW;;;CAGtB,CAAC"}
@@ -32,8 +32,18 @@ const useAppearance = (appearance)=>useMemo(()=>{
32
32
  }, [
33
33
  appearance
34
34
  ]);
35
- function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id, children, contentOnly, navigationComponent, header, top, profile, state, logo, onStateChange, navigationMainItems, navigationOverflowItems, extraLinks, extraLinksTop, extraText, minContentWidth, sideTop }) {
36
- const breakpoint = useTitanBreakpoint();
35
+ export const useViewportConfigs = (noResponsive)=>{
36
+ useEffect(()=>{
37
+ const meta = document.head.querySelector('meta[name="viewport"]');
38
+ if (meta) {
39
+ meta.content = noResponsive ? '' : 'width=device-width, initial-scale=1, maximum-scale=1';
40
+ }
41
+ }, [
42
+ noResponsive
43
+ ]);
44
+ };
45
+ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id, children, contentOnly, navigationComponent, header, top, profile, state, logo, onStateChange, navigationMainItems, navigationOverflowItems, extraLinks, extraLinksTop, extraText, minContentWidth, noResponsive, sideTop }) {
46
+ const breakpoint = useTitanBreakpoint(noResponsive);
37
47
  const context = useMemo(()=>({
38
48
  NavigationComponent: navigationComponent !== null && navigationComponent !== void 0 ? navigationComponent : DefaultNavLinkComponent,
39
49
  breakpoint,
@@ -46,12 +56,7 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
46
56
  const view = useAppearance(appearance);
47
57
  const [mobileDrawerOpened, setMobileDrawerOpened] = useState(false);
48
58
  const { hasNotifications, NotificationsContextProvider } = useNotificationsState();
49
- const [offsetTopStyles, setOffsetTopStyles] = useState({});
50
- const updateIndicatorsHeight = useCallback((offset)=>{
51
- setOffsetTopStyles({
52
- '--content-offset-top': `calc(var(--nav-offset-top) + ${offset}px)`
53
- });
54
- }, []);
59
+ const [headerHeight, setHeaderHeight] = useState(0);
55
60
  const isMobile = breakpoint.isMobile;
56
61
  const hasSideBar = !contentOnly && (navVariant === 'left' || navVariant === 'top' && isMobile) && (!!(navigationMainItems === null || navigationMainItems === void 0 ? void 0 : navigationMainItems.length) || !!(sideTop === null || sideTop === void 0 ? void 0 : sideTop.length));
57
62
  const hasTopBar = !contentOnly;
@@ -156,12 +161,14 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
156
161
  breakpoint.width
157
162
  ]);
158
163
  const contentStyles = useMemo(()=>{
159
- if (view.isAnvil2 || view.isLegacy) {
160
- return offsetTopStyles;
164
+ if (view.isAnvil2) {
165
+ return {
166
+ '--content-offset-top': `calc(var(--nav-offset-top) + ${headerHeight}px)`
167
+ };
161
168
  }
162
169
  }, [
163
170
  view,
164
- offsetTopStyles
171
+ headerHeight
165
172
  ]);
166
173
  const layoutClass = view.isLegacy ? Styles.layoutLegacy : view.isAnvil1 ? Styles.layoutAnvil1 : Styles.layoutAnvil2;
167
174
  const burgerProps = useMemo(()=>{
@@ -200,13 +207,13 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
200
207
  value: "unset",
201
208
  children: /*#__PURE__*/ _jsxs("div", {
202
209
  id: id,
203
- className: classNames(Styles.layout, isMobile ? Styles.layoutMobile : Styles.layoutDesktop, hasTopBar && (navVariant === 'left' || !top ? Styles.layoutTopLight : Styles.layoutTopNav), {
210
+ className: classNames(Styles.layout, isMobile ? Styles.layoutMobile : Styles.layoutDesktop, noResponsive && Styles.layoutNoResponsive, hasTopBar && (navVariant === 'left' || !top ? Styles.layoutTopLight : Styles.layoutTopNav), {
204
211
  [Styles.layoutNavSlim]: !isMobile && hasSideBar && (state === null || state === void 0 ? void 0 : state.navCollapsed),
205
212
  [Styles.layoutNavWide]: !isMobile && hasSideBar && !(state === null || state === void 0 ? void 0 : state.navCollapsed)
206
213
  }, layoutClass),
207
214
  style: contentStyles,
208
215
  children: [
209
- view.isSequent && /*#__PURE__*/ _jsx("div", {
216
+ /*#__PURE__*/ _jsx("div", {
210
217
  className: Styles.topPlaceholder
211
218
  }),
212
219
  hasTopBar && (navVariant === 'left' ? /*#__PURE__*/ _jsx(LayoutHeader, {
@@ -245,6 +252,7 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
245
252
  children: /*#__PURE__*/ _jsx(LayoutSidebar, {
246
253
  className: Styles.side,
247
254
  mobile: breakpoint.isMobile,
255
+ touchDevice: breakpoint.isTouchDevice,
248
256
  barExpanded: !(state === null || state === void 0 ? void 0 : state.navCollapsed),
249
257
  onBarExpandChange: onBarExpandChange,
250
258
  submenusExpanded: state === null || state === void 0 ? void 0 : state.submenusExpanded,
@@ -271,10 +279,14 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
271
279
  }) : undefined
272
280
  })
273
281
  }),
274
- view.isSequent && /*#__PURE__*/ _jsx(TitanLayoutHeaderObserved, {
275
- heightChange: updateIndicatorsHeight,
282
+ view.isAnvil2 ? /*#__PURE__*/ _jsx(TitanLayoutHeader, {
283
+ children: /*#__PURE__*/ _jsx(ObservedHeight, {
284
+ heightChange: setHeaderHeight,
285
+ children: header
286
+ })
287
+ }) : view.isLegacy ? /*#__PURE__*/ _jsx(TitanLayoutHeader, {
276
288
  children: header
277
- }),
289
+ }) : null,
278
290
  view.isAnvil1 ? /*#__PURE__*/ _jsx(LayoutContentAnvil1, {
279
291
  header: header,
280
292
  minWidth: limitContentWidth,
@@ -288,7 +300,7 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
288
300
  })
289
301
  });
290
302
  }
291
- const TitanLayoutHeaderObserved = ({ children, heightChange })=>{
303
+ const ObservedHeight = ({ children, heightChange })=>{
292
304
  const ref = useRef(null);
293
305
  useEffect(()=>{
294
306
  if (ref.current) {
@@ -315,8 +327,6 @@ const TitanLayoutHeaderObserved = ({ children, heightChange })=>{
315
327
  ]);
316
328
  return /*#__PURE__*/ _jsx("div", {
317
329
  ref: ref,
318
- className: Styles.contentHeader,
319
- "data-cy": "layout-content-header",
320
330
  children: children
321
331
  });
322
332
  };
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/components/titan-layout/titan-layout.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport {\n CSSProperties,\n ComponentPropsWithoutRef,\n FC,\n Fragment,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { NavigationItemData } from '../../utils/navigation';\nimport { DefaultNavLinkComponent, NavLinkComponentProps } from '../../utils/navigation-context';\nimport { useTitanBreakpoint } from '../../utils/use-breakpoint';\nimport { TitanLayoutState } from './interface';\nimport {\n LayoutContext,\n LayoutPlacementContext,\n TitanLayoutContextType,\n TitanLayoutSidebarContextType,\n} from './layout-context';\nimport { LayoutHeader, LayoutHeaderProps } from './layout-header';\nimport { LayoutHeaderDark } from './layout-header-dark';\nimport { TitanLayoutLogoProps } from './layout-logo';\nimport { LayoutSidebar } from './layout-sidebar';\nimport { InternalSideNavigationTrigger } from './layout-sidebar-links-internal';\nimport { useNotificationsState } from './notifications-context';\nimport { TitanLayoutLink, TitanLayoutTrigger } from './titan-layout-links';\nimport * as Styles from './titan-layout.module.less';\n\nexport type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'style'> & {\n /** layout appearance */\n appearance?: 'legacy' | 'anvil1' | 'anvil2';\n\n /** layout navigation variant (left by default) */\n navVariant?: 'left' | 'top';\n\n /** layout's content */\n children?: ReactNode;\n\n /** show only content without side and top bars */\n contentOnly?: boolean;\n\n /** component used for navigation */\n navigationComponent?: FC<NavLinkComponentProps>;\n\n /** data for main navigation links */\n navigationMainItems?: NavigationItemData[];\n\n /** data for overflow navigation links (used only with top variant) */\n navigationOverflowItems?: NavigationItemData[];\n\n /** logo props */\n logo?: TitanLayoutLogoProps;\n\n /** layout state */\n state?: TitanLayoutState;\n /** layout state change handler */\n onStateChange?: (state: TitanLayoutState) => void;\n\n /** content header content */\n header?: ReactElement;\n\n /** layout header content (center) */\n top?: ReactElement;\n\n /** top links for side navigation */\n sideTop?: ReactElement[];\n\n /**\n * profile element for layout\n * @see ProfileDropdown\n */\n profile?: ReactElement;\n\n /**\n * extra links for layout header\n * shown in side nav footer on mobile\n */\n extraLinks?: ReactElement;\n\n /**\n * fixed extra links for layout header\n * shown in header on mobile as well\n */\n extraLinksTop?: ReactElement;\n\n /**\n * text shown in layout's header\n * shown in side nav footer on mobile\n */\n extraText?: string;\n\n /**\n * minimal width set for content area\n * used for pages that aren't adopted to mobile\n */\n minContentWidth?: number;\n};\n\nconst defaultSidebarContext: TitanLayoutSidebarContextType = {\n styles: {\n popoverContent: {\n '--background-color-strong': '#24323C',\n 'color': 'var(--color-white)',\n } as CSSProperties,\n },\n};\n\nconst useAppearance = (appearance: TitanLayoutProps['appearance']) =>\n useMemo(() => {\n const isLegacy = appearance === 'legacy';\n const isAnvil1 = appearance === 'anvil1';\n const isAnvil2 = appearance === 'anvil2';\n\n return {\n isLegacy,\n isAnvil1,\n isAnvil2,\n isSequent: isLegacy || isAnvil2,\n };\n }, [appearance]);\n\nfunction TitanLayoutComponent({\n appearance = 'anvil2',\n navVariant = 'left',\n id,\n children,\n contentOnly,\n navigationComponent,\n header,\n top,\n profile,\n state,\n logo,\n onStateChange,\n navigationMainItems,\n navigationOverflowItems,\n extraLinks,\n extraLinksTop,\n extraText,\n minContentWidth,\n sideTop,\n}: TitanLayoutProps) {\n const breakpoint = useTitanBreakpoint();\n const context: TitanLayoutContextType = useMemo(\n () => ({\n NavigationComponent: navigationComponent ?? DefaultNavLinkComponent,\n breakpoint,\n isTitanLayout: true,\n sidebar: defaultSidebarContext,\n }),\n [navigationComponent, breakpoint]\n );\n const view = useAppearance(appearance);\n const [mobileDrawerOpened, setMobileDrawerOpened] = useState(false);\n const { hasNotifications, NotificationsContextProvider } = useNotificationsState();\n const [offsetTopStyles, setOffsetTopStyles] = useState<object>({});\n const updateIndicatorsHeight = useCallback((offset: number) => {\n setOffsetTopStyles({\n '--content-offset-top': `calc(var(--nav-offset-top) + ${offset}px)`,\n });\n }, []);\n\n const isMobile = breakpoint.isMobile;\n const hasSideBar =\n !contentOnly &&\n (navVariant === 'left' || (navVariant === 'top' && isMobile)) &&\n (!!navigationMainItems?.length || !!sideTop?.length);\n const hasTopBar = !contentOnly;\n\n useEffect(() => {\n if (view.isAnvil1) {\n const bodyClassName = 'of-hidden-i';\n document.body.classList.add(bodyClassName);\n return () => document.body.classList.remove(bodyClassName);\n }\n }, [view.isAnvil1]);\n\n const onBurgerClick = useCallback(\n (e: MouseEvent<never>) => {\n if (isMobile) {\n setMobileDrawerOpened(true);\n } else {\n onStateChange?.({ navCollapsed: !state?.navCollapsed });\n }\n\n e.stopPropagation();\n },\n [isMobile, state?.navCollapsed, onStateChange]\n );\n\n const onBarExpandChange = useCallback(\n (expanded: boolean) => {\n if (isMobile) {\n setMobileDrawerOpened(false);\n } else {\n onStateChange?.({ navCollapsed: !expanded });\n }\n },\n [onStateChange, isMobile]\n );\n const onSubmenuExpandChange = useCallback(\n (id: string, expanded: boolean, force: boolean) => {\n onStateChange?.({\n navCollapsed: state?.navCollapsed ?? false,\n submenusExpanded: [\n ...(force ? [] : (state?.submenusExpanded ?? []).filter(i => i !== id)),\n ...(expanded ? [id] : []),\n ],\n });\n },\n [state, onStateChange]\n );\n const sidebarNavItems = useMemo(() => {\n if (!hasSideBar) {\n return undefined;\n }\n\n if (navVariant === 'left') {\n return navigationMainItems;\n }\n\n return [...(navigationMainItems ?? []), ...(navigationOverflowItems ?? [])];\n }, [hasSideBar, navigationMainItems, navigationOverflowItems, navVariant]);\n\n const hasMenuNotifications = useMemo(() => {\n try {\n return (\n sidebarNavItems?.some(item => {\n if (item.counter || item.tag?.value) {\n return true;\n } else if (item.submenu) {\n return item.submenu.groups.some(group =>\n group.links.some(link => !!link.counter || !!link.tag?.value)\n );\n }\n return false;\n }) ?? false\n );\n } catch {\n return false;\n }\n }, [sidebarNavItems]);\n\n const limitContentWidth = useMemo(() => {\n if (view.isAnvil2 || !minContentWidth) {\n return undefined;\n }\n\n if (breakpoint.width < minContentWidth) {\n return minContentWidth;\n }\n }, [view, minContentWidth, breakpoint.width]);\n\n const contentStyles = useMemo(() => {\n if (view.isAnvil2 || view.isLegacy) {\n return offsetTopStyles;\n }\n }, [view, offsetTopStyles]);\n\n const layoutClass = view.isLegacy\n ? Styles.layoutLegacy\n : view.isAnvil1\n ? Styles.layoutAnvil1\n : Styles.layoutAnvil2;\n\n const burgerProps: LayoutHeaderProps['burger'] = useMemo(() => {\n if (!hasTopBar) {\n return undefined;\n }\n\n if (isMobile) {\n return {\n onClick: onBurgerClick,\n tag: { value: hasNotifications || hasMenuNotifications },\n };\n }\n\n if (navVariant === 'left') {\n return {\n 'onClick': onBurgerClick,\n 'tooltip': state?.navCollapsed ? 'Expand' : 'Collapse',\n 'data-pendo': 'navigation-left-options',\n 'data-cy': 'navigation-left-options',\n };\n }\n\n return undefined;\n }, [\n isMobile,\n hasTopBar,\n navVariant,\n state?.navCollapsed,\n onBurgerClick,\n hasNotifications,\n hasMenuNotifications,\n ]);\n\n return (\n <LayoutContext.Provider value={context}>\n <LayoutPlacementContext.Provider value=\"unset\">\n <div\n id={id}\n className={classNames(\n Styles.layout,\n isMobile ? Styles.layoutMobile : Styles.layoutDesktop,\n hasTopBar &&\n (navVariant === 'left' || !top\n ? Styles.layoutTopLight\n : Styles.layoutTopNav),\n {\n [Styles.layoutNavSlim]: !isMobile && hasSideBar && state?.navCollapsed,\n [Styles.layoutNavWide]: !isMobile && hasSideBar && !state?.navCollapsed,\n },\n layoutClass\n )}\n style={contentStyles}\n >\n {view.isSequent && <div className={Styles.topPlaceholder} />}\n {hasTopBar &&\n (navVariant === 'left' ? (\n <LayoutHeader\n className={Styles.top}\n variant=\"light\"\n logo={logo}\n profile={isMobile ? undefined : profile}\n center={top}\n rightText={isMobile ? undefined : extraText}\n right={\n <Fragment>\n {extraLinksTop}\n {!isMobile && extraLinks}\n </Fragment>\n }\n isMobile={isMobile}\n burger={burgerProps}\n />\n ) : (\n <LayoutHeaderDark\n className={Styles.top}\n logo={logo}\n profile={isMobile ? undefined : profile}\n center={top}\n rightText={isMobile ? undefined : extraText}\n right={\n <Fragment>\n {extraLinksTop}\n {!isMobile && extraLinks}\n </Fragment>\n }\n isMobile={isMobile}\n burger={burgerProps}\n navigationMainItems={navigationMainItems}\n navigationOverflowItems={navigationOverflowItems}\n />\n ))}\n\n {hasSideBar && (\n <NotificationsContextProvider>\n <LayoutSidebar\n className={Styles.side}\n mobile={breakpoint.isMobile}\n barExpanded={!state?.navCollapsed}\n onBarExpandChange={onBarExpandChange}\n submenusExpanded={state?.submenusExpanded}\n onSubmenuExpandChange={onSubmenuExpandChange}\n drawerOpened={mobileDrawerOpened}\n onDrawerOpenChange={setMobileDrawerOpened}\n top={sideTop}\n mainItems={sidebarNavItems}\n navigationComponent={context.NavigationComponent}\n bottom={\n isMobile ? (\n <Fragment>\n {profile}\n {extraLinks}\n {!!extraText && (\n <InternalSideNavigationTrigger\n id=\"--extra-text\"\n title={extraText}\n isActive={undefined}\n icon={undefined}\n iconActive={undefined}\n tag={undefined}\n className={undefined}\n />\n )}\n </Fragment>\n ) : undefined\n }\n />\n </NotificationsContextProvider>\n )}\n\n {view.isSequent && (\n <TitanLayoutHeaderObserved heightChange={updateIndicatorsHeight}>\n {header}\n </TitanLayoutHeaderObserved>\n )}\n {view.isAnvil1 ? (\n <LayoutContentAnvil1 header={header} minWidth={limitContentWidth}>\n {children}\n </LayoutContentAnvil1>\n ) : view.isLegacy ? (\n <LayoutContentLegacy minWidth={limitContentWidth}>\n {children}\n </LayoutContentLegacy>\n ) : (\n children\n )}\n </div>\n </LayoutPlacementContext.Provider>\n </LayoutContext.Provider>\n );\n}\n\nconst TitanLayoutHeaderObserved: FC<{\n children: ReactNode;\n heightChange?(value: number): void;\n}> = ({ children, heightChange }) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n const updatePosition = () => {\n if (ref.current && heightChange) {\n const pos = ref.current.getBoundingClientRect();\n heightChange(pos.height);\n }\n };\n\n const observer = new ResizeObserver(updatePosition);\n observer.observe(ref.current);\n\n updatePosition();\n return () => observer.disconnect();\n }\n }, [heightChange]);\n\n useEffect(() => {\n return () => {\n heightChange?.(0);\n };\n }, [heightChange]);\n return (\n <div ref={ref} className={Styles.contentHeader} data-cy=\"layout-content-header\">\n {children}\n </div>\n );\n};\nconst TitanLayoutHeader: FC<{ children: ReactNode }> = ({ children }) => {\n return (\n <div className={Styles.contentHeader} data-cy=\"layout-content-header\">\n {children}\n </div>\n );\n};\n\nconst LayoutContentAnvil1: FC<{\n children: ReactNode;\n header?: ReactNode;\n minWidth?: number;\n}> = ({ children, header, minWidth }) => {\n const innerContentStyles: CSSProperties = useMemo(\n () => ({\n ...(minWidth ? { minWidth: `${minWidth}px`, overflowX: 'auto' } : {}),\n }),\n [minWidth]\n );\n\n return (\n <Fragment>\n <TitanLayoutHeader>{header}</TitanLayoutHeader>\n <div\n className={classNames(Styles.content, { 'of-x-auto-i': !!minWidth })}\n data-cy=\"layout-content\"\n >\n <div\n className=\"position-relative d-f flex-grow-1 flex-basis-0 of-hidden\"\n style={innerContentStyles}\n >\n {children}\n </div>\n </div>\n </Fragment>\n );\n};\n\nconst LayoutContentLegacy: FC<{\n children: ReactNode;\n minWidth: number | undefined;\n}> = ({ children, minWidth }) => {\n const innerContentStyles: CSSProperties = useMemo(\n () => ({\n position: 'relative',\n minWidth: `${minWidth}px`,\n }),\n [minWidth]\n );\n\n return <div style={minWidth ? innerContentStyles : undefined}>{children}</div>;\n};\n\nexport const TitanLayout = Object.assign(TitanLayoutComponent, {\n Link: TitanLayoutLink,\n Trigger: TitanLayoutTrigger,\n});\n"],"names":["classNames","Fragment","useCallback","useEffect","useMemo","useRef","useState","DefaultNavLinkComponent","useTitanBreakpoint","LayoutContext","LayoutPlacementContext","LayoutHeader","LayoutHeaderDark","LayoutSidebar","InternalSideNavigationTrigger","useNotificationsState","TitanLayoutLink","TitanLayoutTrigger","Styles","defaultSidebarContext","styles","popoverContent","useAppearance","appearance","isLegacy","isAnvil1","isAnvil2","isSequent","TitanLayoutComponent","navVariant","id","children","contentOnly","navigationComponent","header","top","profile","state","logo","onStateChange","navigationMainItems","navigationOverflowItems","extraLinks","extraLinksTop","extraText","minContentWidth","sideTop","breakpoint","context","NavigationComponent","isTitanLayout","sidebar","view","mobileDrawerOpened","setMobileDrawerOpened","hasNotifications","NotificationsContextProvider","offsetTopStyles","setOffsetTopStyles","updateIndicatorsHeight","offset","isMobile","hasSideBar","length","hasTopBar","bodyClassName","document","body","classList","add","remove","onBurgerClick","e","navCollapsed","stopPropagation","onBarExpandChange","expanded","onSubmenuExpandChange","force","submenusExpanded","filter","i","sidebarNavItems","undefined","hasMenuNotifications","some","item","counter","tag","value","submenu","groups","group","links","link","limitContentWidth","width","contentStyles","layoutClass","layoutLegacy","layoutAnvil1","layoutAnvil2","burgerProps","onClick","Provider","div","className","layout","layoutMobile","layoutDesktop","layoutTopLight","layoutTopNav","layoutNavSlim","layoutNavWide","style","topPlaceholder","variant","center","rightText","right","burger","side","mobile","barExpanded","drawerOpened","onDrawerOpenChange","mainItems","bottom","title","isActive","icon","iconActive","TitanLayoutHeaderObserved","heightChange","LayoutContentAnvil1","minWidth","LayoutContentLegacy","ref","current","updatePosition","pos","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","contentHeader","data-cy","TitanLayoutHeader","innerContentStyles","overflowX","content","position","TitanLayout","Object","assign","Link","Trigger"],"mappings":";AAAA,OAAOA,gBAAgB,aAAa;AACpC,SAIIC,QAAQ,EAIRC,WAAW,EACXC,SAAS,EACTC,OAAO,EACPC,MAAM,EACNC,QAAQ,QACL,QAAQ;AAEf,SAASC,uBAAuB,QAA+B,iCAAiC;AAChG,SAASC,kBAAkB,QAAQ,6BAA6B;AAEhE,SACIC,aAAa,EACbC,sBAAsB,QAGnB,mBAAmB;AAC1B,SAASC,YAAY,QAA2B,kBAAkB;AAClE,SAASC,gBAAgB,QAAQ,uBAAuB;AAExD,SAASC,aAAa,QAAQ,mBAAmB;AACjD,SAASC,6BAA6B,QAAQ,kCAAkC;AAChF,SAASC,qBAAqB,QAAQ,0BAA0B;AAChE,SAASC,eAAe,EAAEC,kBAAkB,QAAQ,uBAAuB;AAC3E,YAAYC,YAAY,6BAA6B;AAwErD,MAAMC,wBAAuD;IACzDC,QAAQ;QACJC,gBAAgB;YACZ,6BAA6B;YAC7B,SAAS;QACb;IACJ;AACJ;AAEA,MAAMC,gBAAgB,CAACC,aACnBnB,QAAQ;QACJ,MAAMoB,WAAWD,eAAe;QAChC,MAAME,WAAWF,eAAe;QAChC,MAAMG,WAAWH,eAAe;QAEhC,OAAO;YACHC;YACAC;YACAC;YACAC,WAAWH,YAAYE;QAC3B;IACJ,GAAG;QAACH;KAAW;AAEnB,SAASK,qBAAqB,EAC1BL,aAAa,QAAQ,EACrBM,aAAa,MAAM,EACnBC,EAAE,EACFC,QAAQ,EACRC,WAAW,EACXC,mBAAmB,EACnBC,MAAM,EACNC,GAAG,EACHC,OAAO,EACPC,KAAK,EACLC,IAAI,EACJC,aAAa,EACbC,mBAAmB,EACnBC,uBAAuB,EACvBC,UAAU,EACVC,aAAa,EACbC,SAAS,EACTC,eAAe,EACfC,OAAO,EACQ;IACf,MAAMC,aAAavC;IACnB,MAAMwC,UAAkC5C,QACpC,IAAO,CAAA;YACH6C,qBAAqBhB,gCAAAA,iCAAAA,sBAAuB1B;YAC5CwC;YACAG,eAAe;YACfC,SAAShC;QACb,CAAA,GACA;QAACc;QAAqBc;KAAW;IAErC,MAAMK,OAAO9B,cAAcC;IAC3B,MAAM,CAAC8B,oBAAoBC,sBAAsB,GAAGhD,SAAS;IAC7D,MAAM,EAAEiD,gBAAgB,EAAEC,4BAA4B,EAAE,GAAGzC;IAC3D,MAAM,CAAC0C,iBAAiBC,mBAAmB,GAAGpD,SAAiB,CAAC;IAChE,MAAMqD,yBAAyBzD,YAAY,CAAC0D;QACxCF,mBAAmB;YACf,wBAAwB,CAAC,6BAA6B,EAAEE,OAAO,GAAG,CAAC;QACvE;IACJ,GAAG,EAAE;IAEL,MAAMC,WAAWd,WAAWc,QAAQ;IACpC,MAAMC,aACF,CAAC9B,eACAH,CAAAA,eAAe,UAAWA,eAAe,SAASgC,QAAQ,KAC1D,CAAA,CAAC,EAACrB,gCAAAA,0CAAAA,oBAAqBuB,MAAM,KAAI,CAAC,EAACjB,oBAAAA,8BAAAA,QAASiB,MAAM,CAAD;IACtD,MAAMC,YAAY,CAAChC;IAEnB7B,UAAU;QACN,IAAIiD,KAAK3B,QAAQ,EAAE;YACf,MAAMwC,gBAAgB;YACtBC,SAASC,IAAI,CAACC,SAAS,CAACC,GAAG,CAACJ;YAC5B,OAAO,IAAMC,SAASC,IAAI,CAACC,SAAS,CAACE,MAAM,CAACL;QAChD;IACJ,GAAG;QAACb,KAAK3B,QAAQ;KAAC;IAElB,MAAM8C,gBAAgBrE,YAClB,CAACsE;QACG,IAAIX,UAAU;YACVP,sBAAsB;QAC1B,OAAO;YACHf,0BAAAA,oCAAAA,cAAgB;gBAAEkC,cAAc,EAACpC,kBAAAA,4BAAAA,MAAOoC,YAAY;YAAC;QACzD;QAEAD,EAAEE,eAAe;IACrB,GACA;QAACb;QAAUxB,kBAAAA,4BAAAA,MAAOoC,YAAY;QAAElC;KAAc;IAGlD,MAAMoC,oBAAoBzE,YACtB,CAAC0E;QACG,IAAIf,UAAU;YACVP,sBAAsB;QAC1B,OAAO;YACHf,0BAAAA,oCAAAA,cAAgB;gBAAEkC,cAAc,CAACG;YAAS;QAC9C;IACJ,GACA;QAACrC;QAAesB;KAAS;IAE7B,MAAMgB,wBAAwB3E,YAC1B,CAAC4B,IAAY8C,UAAmBE;YAEVzC,qBAEQA;QAH1BE,0BAAAA,oCAAAA,cAAgB;YACZkC,cAAcpC,CAAAA,sBAAAA,kBAAAA,4BAAAA,MAAOoC,YAAY,cAAnBpC,iCAAAA,sBAAuB;YACrC0C,kBAAkB;mBACVD,QAAQ,EAAE,GAAG,AAACzC,CAAAA,CAAAA,0BAAAA,kBAAAA,4BAAAA,MAAO0C,gBAAgB,cAAvB1C,qCAAAA,0BAA2B,EAAE,AAAD,EAAG2C,MAAM,CAACC,CAAAA,IAAKA,MAAMnD;mBAC/D8C,WAAW;oBAAC9C;iBAAG,GAAG,EAAE;aAC3B;QACL;IACJ,GACA;QAACO;QAAOE;KAAc;IAE1B,MAAM2C,kBAAkB9E,QAAQ;QAC5B,IAAI,CAAC0D,YAAY;YACb,OAAOqB;QACX;QAEA,IAAItD,eAAe,QAAQ;YACvB,OAAOW;QACX;QAEA,OAAO;eAAKA,gCAAAA,iCAAAA,sBAAuB,EAAE;eAAOC,oCAAAA,qCAAAA,0BAA2B,EAAE;SAAE;IAC/E,GAAG;QAACqB;QAAYtB;QAAqBC;QAAyBZ;KAAW;IAEzE,MAAMuD,uBAAuBhF,QAAQ;QACjC,IAAI;gBAEI8E;YADJ,OACIA,CAAAA,wBAAAA,4BAAAA,sCAAAA,gBAAiBG,IAAI,CAACC,CAAAA;oBACEA;gBAApB,IAAIA,KAAKC,OAAO,MAAID,YAAAA,KAAKE,GAAG,cAARF,gCAAAA,UAAUG,KAAK,GAAE;oBACjC,OAAO;gBACX,OAAO,IAAIH,KAAKI,OAAO,EAAE;oBACrB,OAAOJ,KAAKI,OAAO,CAACC,MAAM,CAACN,IAAI,CAACO,CAAAA,QAC5BA,MAAMC,KAAK,CAACR,IAAI,CAACS,CAAAA;gCAA4BA;mCAApB,CAAC,CAACA,KAAKP,OAAO,IAAI,CAAC,GAACO,YAAAA,KAAKN,GAAG,cAARM,gCAAAA,UAAUL,KAAK;;gBAEpE;gBACA,OAAO;YACX,gBATAP,mCAAAA,wBASM;QAEd,EAAE,UAAM;YACJ,OAAO;QACX;IACJ,GAAG;QAACA;KAAgB;IAEpB,MAAMa,oBAAoB3F,QAAQ;QAC9B,IAAIgD,KAAK1B,QAAQ,IAAI,CAACmB,iBAAiB;YACnC,OAAOsC;QACX;QAEA,IAAIpC,WAAWiD,KAAK,GAAGnD,iBAAiB;YACpC,OAAOA;QACX;IACJ,GAAG;QAACO;QAAMP;QAAiBE,WAAWiD,KAAK;KAAC;IAE5C,MAAMC,gBAAgB7F,QAAQ;QAC1B,IAAIgD,KAAK1B,QAAQ,IAAI0B,KAAK5B,QAAQ,EAAE;YAChC,OAAOiC;QACX;IACJ,GAAG;QAACL;QAAMK;KAAgB;IAE1B,MAAMyC,cAAc9C,KAAK5B,QAAQ,GAC3BN,OAAOiF,YAAY,GACnB/C,KAAK3B,QAAQ,GACXP,OAAOkF,YAAY,GACnBlF,OAAOmF,YAAY;IAE3B,MAAMC,cAA2ClG,QAAQ;QACrD,IAAI,CAAC4D,WAAW;YACZ,OAAOmB;QACX;QAEA,IAAItB,UAAU;YACV,OAAO;gBACH0C,SAAShC;gBACTiB,KAAK;oBAAEC,OAAOlC,oBAAoB6B;gBAAqB;YAC3D;QACJ;QAEA,IAAIvD,eAAe,QAAQ;YACvB,OAAO;gBACH,WAAW0C;gBACX,WAAWlC,CAAAA,kBAAAA,4BAAAA,MAAOoC,YAAY,IAAG,WAAW;gBAC5C,cAAc;gBACd,WAAW;YACf;QACJ;QAEA,OAAOU;IACX,GAAG;QACCtB;QACAG;QACAnC;QACAQ,kBAAAA,4BAAAA,MAAOoC,YAAY;QACnBF;QACAhB;QACA6B;KACH;IAED,qBACI,KAAC3E,cAAc+F,QAAQ;QAACf,OAAOzC;kBAC3B,cAAA,KAACtC,uBAAuB8F,QAAQ;YAACf,OAAM;sBACnC,cAAA,MAACgB;gBACG3E,IAAIA;gBACJ4E,WAAW1G,WACPkB,OAAOyF,MAAM,EACb9C,WAAW3C,OAAO0F,YAAY,GAAG1F,OAAO2F,aAAa,EACrD7C,aACKnC,CAAAA,eAAe,UAAU,CAACM,MACrBjB,OAAO4F,cAAc,GACrB5F,OAAO6F,YAAY,AAAD,GAC5B;oBACI,CAAC7F,OAAO8F,aAAa,CAAC,EAAE,CAACnD,YAAYC,eAAczB,kBAAAA,4BAAAA,MAAOoC,YAAY;oBACtE,CAACvD,OAAO+F,aAAa,CAAC,EAAE,CAACpD,YAAYC,cAAc,EAACzB,kBAAAA,4BAAAA,MAAOoC,YAAY;gBAC3E,GACAyB;gBAEJgB,OAAOjB;;oBAEN7C,KAAKzB,SAAS,kBAAI,KAAC8E;wBAAIC,WAAWxF,OAAOiG,cAAc;;oBACvDnD,aACInC,CAAAA,eAAe,uBACZ,KAAClB;wBACG+F,WAAWxF,OAAOiB,GAAG;wBACrBiF,SAAQ;wBACR9E,MAAMA;wBACNF,SAASyB,WAAWsB,YAAY/C;wBAChCiF,QAAQlF;wBACRmF,WAAWzD,WAAWsB,YAAYvC;wBAClC2E,qBACI,MAACtH;;gCACI0C;gCACA,CAACkB,YAAYnB;;;wBAGtBmB,UAAUA;wBACV2D,QAAQlB;uCAGZ,KAAC1F;wBACG8F,WAAWxF,OAAOiB,GAAG;wBACrBG,MAAMA;wBACNF,SAASyB,WAAWsB,YAAY/C;wBAChCiF,QAAQlF;wBACRmF,WAAWzD,WAAWsB,YAAYvC;wBAClC2E,qBACI,MAACtH;;gCACI0C;gCACA,CAACkB,YAAYnB;;;wBAGtBmB,UAAUA;wBACV2D,QAAQlB;wBACR9D,qBAAqBA;wBACrBC,yBAAyBA;sBAEjC;oBAEHqB,4BACG,KAACN;kCACG,cAAA,KAAC3C;4BACG6F,WAAWxF,OAAOuG,IAAI;4BACtBC,QAAQ3E,WAAWc,QAAQ;4BAC3B8D,aAAa,EAACtF,kBAAAA,4BAAAA,MAAOoC,YAAY;4BACjCE,mBAAmBA;4BACnBI,gBAAgB,EAAE1C,kBAAAA,4BAAAA,MAAO0C,gBAAgB;4BACzCF,uBAAuBA;4BACvB+C,cAAcvE;4BACdwE,oBAAoBvE;4BACpBnB,KAAKW;4BACLgF,WAAW5C;4BACXjD,qBAAqBe,QAAQC,mBAAmB;4BAChD8E,QACIlE,yBACI,MAAC5D;;oCACImC;oCACAM;oCACA,CAAC,CAACE,2BACC,KAAC9B;wCACGgB,IAAG;wCACHkG,OAAOpF;wCACPqF,UAAU9C;wCACV+C,MAAM/C;wCACNgD,YAAYhD;wCACZK,KAAKL;wCACLuB,WAAWvB;;;iCAIvBA;;;oBAMnB/B,KAAKzB,SAAS,kBACX,KAACyG;wBAA0BC,cAAc1E;kCACpCzB;;oBAGRkB,KAAK3B,QAAQ,iBACV,KAAC6G;wBAAoBpG,QAAQA;wBAAQqG,UAAUxC;kCAC1ChE;yBAELqB,KAAK5B,QAAQ,iBACb,KAACgH;wBAAoBD,UAAUxC;kCAC1BhE;yBAGLA;;;;;AAMxB;AAEA,MAAMqG,4BAGD,CAAC,EAAErG,QAAQ,EAAEsG,YAAY,EAAE;IAC5B,MAAMI,MAAMpI,OAAuB;IAEnCF,UAAU;QACN,IAAIsI,IAAIC,OAAO,EAAE;YACb,MAAMC,iBAAiB;gBACnB,IAAIF,IAAIC,OAAO,IAAIL,cAAc;oBAC7B,MAAMO,MAAMH,IAAIC,OAAO,CAACG,qBAAqB;oBAC7CR,aAAaO,IAAIE,MAAM;gBAC3B;YACJ;YAEA,MAAMC,WAAW,IAAIC,eAAeL;YACpCI,SAASE,OAAO,CAACR,IAAIC,OAAO;YAE5BC;YACA,OAAO,IAAMI,SAASG,UAAU;QACpC;IACJ,GAAG;QAACb;KAAa;IAEjBlI,UAAU;QACN,OAAO;YACHkI,yBAAAA,mCAAAA,aAAe;QACnB;IACJ,GAAG;QAACA;KAAa;IACjB,qBACI,KAAC5B;QAAIgC,KAAKA;QAAK/B,WAAWxF,OAAOiI,aAAa;QAAEC,WAAQ;kBACnDrH;;AAGb;AACA,MAAMsH,oBAAiD,CAAC,EAAEtH,QAAQ,EAAE;IAChE,qBACI,KAAC0E;QAAIC,WAAWxF,OAAOiI,aAAa;QAAEC,WAAQ;kBACzCrH;;AAGb;AAEA,MAAMuG,sBAID,CAAC,EAAEvG,QAAQ,EAAEG,MAAM,EAAEqG,QAAQ,EAAE;IAChC,MAAMe,qBAAoClJ,QACtC,IAAO,CAAA;YACH,GAAImI,WAAW;gBAAEA,UAAU,GAAGA,SAAS,EAAE,CAAC;gBAAEgB,WAAW;YAAO,IAAI,CAAC,CAAC;QACxE,CAAA,GACA;QAAChB;KAAS;IAGd,qBACI,MAACtI;;0BACG,KAACoJ;0BAAmBnH;;0BACpB,KAACuE;gBACGC,WAAW1G,WAAWkB,OAAOsI,OAAO,EAAE;oBAAE,eAAe,CAAC,CAACjB;gBAAS;gBAClEa,WAAQ;0BAER,cAAA,KAAC3C;oBACGC,WAAU;oBACVQ,OAAOoC;8BAENvH;;;;;AAKrB;AAEA,MAAMyG,sBAGD,CAAC,EAAEzG,QAAQ,EAAEwG,QAAQ,EAAE;IACxB,MAAMe,qBAAoClJ,QACtC,IAAO,CAAA;YACHqJ,UAAU;YACVlB,UAAU,GAAGA,SAAS,EAAE,CAAC;QAC7B,CAAA,GACA;QAACA;KAAS;IAGd,qBAAO,KAAC9B;QAAIS,OAAOqB,WAAWe,qBAAqBnE;kBAAYpD;;AACnE;AAEA,OAAO,MAAM2H,cAAcC,OAAOC,MAAM,CAAChI,sBAAsB;IAC3DiI,MAAM7I;IACN8I,SAAS7I;AACb,GAAG"}
1
+ {"version":3,"sources":["../../../src/components/titan-layout/titan-layout.tsx"],"sourcesContent":["import classNames from 'classnames';\nimport {\n CSSProperties,\n ComponentPropsWithoutRef,\n FC,\n Fragment,\n MouseEvent,\n ReactElement,\n ReactNode,\n useCallback,\n useEffect,\n useMemo,\n useRef,\n useState,\n} from 'react';\nimport { NavigationItemData } from '../../utils/navigation';\nimport { DefaultNavLinkComponent, NavLinkComponentProps } from '../../utils/navigation-context';\nimport { useTitanBreakpoint } from '../../utils/use-breakpoint';\nimport { TitanLayoutState } from './interface';\nimport {\n LayoutContext,\n LayoutPlacementContext,\n TitanLayoutContextType,\n TitanLayoutSidebarContextType,\n} from './layout-context';\nimport { LayoutHeader, LayoutHeaderProps } from './layout-header';\nimport { LayoutHeaderDark } from './layout-header-dark';\nimport { TitanLayoutLogoProps } from './layout-logo';\nimport { LayoutSidebar } from './layout-sidebar';\nimport { InternalSideNavigationTrigger } from './layout-sidebar-links-internal';\nimport { useNotificationsState } from './notifications-context';\nimport { TitanLayoutLink, TitanLayoutTrigger } from './titan-layout-links';\nimport * as Styles from './titan-layout.module.less';\n\nexport type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children' | 'style'> & {\n /** layout appearance */\n appearance?: 'legacy' | 'anvil1' | 'anvil2';\n\n /** layout navigation variant (left by default) */\n navVariant?: 'left' | 'top';\n\n /** layout's content */\n children?: ReactNode;\n\n /** show only content without side and top bars */\n contentOnly?: boolean;\n\n /** component used for navigation */\n navigationComponent?: FC<NavLinkComponentProps>;\n\n /** data for main navigation links */\n navigationMainItems?: NavigationItemData[];\n\n /** data for overflow navigation links (used only with top variant) */\n navigationOverflowItems?: NavigationItemData[];\n\n /** logo props */\n logo?: TitanLayoutLogoProps;\n\n /** layout state */\n state?: TitanLayoutState;\n /** layout state change handler */\n onStateChange?: (state: TitanLayoutState) => void;\n\n /** content header content */\n header?: ReactElement;\n\n /** layout header content (center) */\n top?: ReactElement;\n\n /** top links for side navigation */\n sideTop?: ReactElement[];\n\n /**\n * profile element for layout\n * @see ProfileDropdown\n */\n profile?: ReactElement;\n\n /**\n * extra links for layout header\n * shown in side nav footer on mobile\n */\n extraLinks?: ReactElement;\n\n /**\n * fixed extra links for layout header\n * shown in header on mobile as well\n */\n extraLinksTop?: ReactElement;\n\n /**\n * text shown in layout's header\n * shown in side nav footer on mobile\n */\n extraText?: string;\n\n /**\n * minimal width set for content area\n * used for pages that aren't adopted to mobile\n */\n minContentWidth?: number;\n\n /**\n * disable responsive behavior\n * can be used for pages that aren't adopted to mobile\n */\n noResponsive?: boolean;\n};\n\nconst defaultSidebarContext: TitanLayoutSidebarContextType = {\n styles: {\n popoverContent: {\n '--background-color-strong': '#24323C',\n 'color': 'var(--color-white)',\n } as CSSProperties,\n },\n};\n\nconst useAppearance = (appearance: TitanLayoutProps['appearance']) =>\n useMemo(() => {\n const isLegacy = appearance === 'legacy';\n const isAnvil1 = appearance === 'anvil1';\n const isAnvil2 = appearance === 'anvil2';\n\n return {\n isLegacy,\n isAnvil1,\n isAnvil2,\n isSequent: isLegacy || isAnvil2,\n };\n }, [appearance]);\n\nexport const useViewportConfigs = (noResponsive?: boolean) => {\n useEffect(() => {\n const meta: HTMLMetaElement | null = document.head.querySelector('meta[name=\"viewport\"]');\n\n if (meta) {\n meta.content = noResponsive\n ? ''\n : 'width=device-width, initial-scale=1, maximum-scale=1';\n }\n }, [noResponsive]);\n};\n\nfunction TitanLayoutComponent({\n appearance = 'anvil2',\n navVariant = 'left',\n id,\n children,\n contentOnly,\n navigationComponent,\n header,\n top,\n profile,\n state,\n logo,\n onStateChange,\n navigationMainItems,\n navigationOverflowItems,\n extraLinks,\n extraLinksTop,\n extraText,\n minContentWidth,\n noResponsive,\n sideTop,\n}: TitanLayoutProps) {\n const breakpoint = useTitanBreakpoint(noResponsive);\n const context: TitanLayoutContextType = useMemo(\n () => ({\n NavigationComponent: navigationComponent ?? DefaultNavLinkComponent,\n breakpoint,\n isTitanLayout: true,\n sidebar: defaultSidebarContext,\n }),\n [navigationComponent, breakpoint]\n );\n const view = useAppearance(appearance);\n const [mobileDrawerOpened, setMobileDrawerOpened] = useState(false);\n const { hasNotifications, NotificationsContextProvider } = useNotificationsState();\n const [headerHeight, setHeaderHeight] = useState(0);\n\n const isMobile = breakpoint.isMobile;\n const hasSideBar =\n !contentOnly &&\n (navVariant === 'left' || (navVariant === 'top' && isMobile)) &&\n (!!navigationMainItems?.length || !!sideTop?.length);\n const hasTopBar = !contentOnly;\n\n useEffect(() => {\n if (view.isAnvil1) {\n const bodyClassName = 'of-hidden-i';\n document.body.classList.add(bodyClassName);\n return () => document.body.classList.remove(bodyClassName);\n }\n }, [view.isAnvil1]);\n\n const onBurgerClick = useCallback(\n (e: MouseEvent<never>) => {\n if (isMobile) {\n setMobileDrawerOpened(true);\n } else {\n onStateChange?.({ navCollapsed: !state?.navCollapsed });\n }\n\n e.stopPropagation();\n },\n [isMobile, state?.navCollapsed, onStateChange]\n );\n\n const onBarExpandChange = useCallback(\n (expanded: boolean) => {\n if (isMobile) {\n setMobileDrawerOpened(false);\n } else {\n onStateChange?.({ navCollapsed: !expanded });\n }\n },\n [onStateChange, isMobile]\n );\n const onSubmenuExpandChange = useCallback(\n (id: string, expanded: boolean, force: boolean) => {\n onStateChange?.({\n navCollapsed: state?.navCollapsed ?? false,\n submenusExpanded: [\n ...(force ? [] : (state?.submenusExpanded ?? []).filter(i => i !== id)),\n ...(expanded ? [id] : []),\n ],\n });\n },\n [state, onStateChange]\n );\n const sidebarNavItems = useMemo(() => {\n if (!hasSideBar) {\n return undefined;\n }\n\n if (navVariant === 'left') {\n return navigationMainItems;\n }\n\n return [...(navigationMainItems ?? []), ...(navigationOverflowItems ?? [])];\n }, [hasSideBar, navigationMainItems, navigationOverflowItems, navVariant]);\n\n const hasMenuNotifications = useMemo(() => {\n try {\n return (\n sidebarNavItems?.some(item => {\n if (item.counter || item.tag?.value) {\n return true;\n } else if (item.submenu) {\n return item.submenu.groups.some(group =>\n group.links.some(link => !!link.counter || !!link.tag?.value)\n );\n }\n return false;\n }) ?? false\n );\n } catch {\n return false;\n }\n }, [sidebarNavItems]);\n\n const limitContentWidth = useMemo(() => {\n if (view.isAnvil2 || !minContentWidth) {\n return undefined;\n }\n\n if (breakpoint.width < minContentWidth) {\n return minContentWidth;\n }\n }, [view, minContentWidth, breakpoint.width]);\n\n const contentStyles = useMemo(() => {\n if (view.isAnvil2) {\n return {\n '--content-offset-top': `calc(var(--nav-offset-top) + ${headerHeight}px)`,\n } as CSSProperties;\n }\n }, [view, headerHeight]);\n\n const layoutClass = view.isLegacy\n ? Styles.layoutLegacy\n : view.isAnvil1\n ? Styles.layoutAnvil1\n : Styles.layoutAnvil2;\n\n const burgerProps: LayoutHeaderProps['burger'] = useMemo(() => {\n if (!hasTopBar) {\n return undefined;\n }\n\n if (isMobile) {\n return {\n onClick: onBurgerClick,\n tag: { value: hasNotifications || hasMenuNotifications },\n };\n }\n\n if (navVariant === 'left') {\n return {\n 'onClick': onBurgerClick,\n 'tooltip': state?.navCollapsed ? 'Expand' : 'Collapse',\n 'data-pendo': 'navigation-left-options',\n 'data-cy': 'navigation-left-options',\n };\n }\n\n return undefined;\n }, [\n isMobile,\n hasTopBar,\n navVariant,\n state?.navCollapsed,\n onBurgerClick,\n hasNotifications,\n hasMenuNotifications,\n ]);\n\n return (\n <LayoutContext.Provider value={context}>\n <LayoutPlacementContext.Provider value=\"unset\">\n <div\n id={id}\n className={classNames(\n Styles.layout,\n isMobile ? Styles.layoutMobile : Styles.layoutDesktop,\n noResponsive && Styles.layoutNoResponsive,\n hasTopBar &&\n (navVariant === 'left' || !top\n ? Styles.layoutTopLight\n : Styles.layoutTopNav),\n {\n [Styles.layoutNavSlim]: !isMobile && hasSideBar && state?.navCollapsed,\n [Styles.layoutNavWide]: !isMobile && hasSideBar && !state?.navCollapsed,\n },\n layoutClass\n )}\n style={contentStyles}\n >\n <div className={Styles.topPlaceholder} />\n {hasTopBar &&\n (navVariant === 'left' ? (\n <LayoutHeader\n className={Styles.top}\n variant=\"light\"\n logo={logo}\n profile={isMobile ? undefined : profile}\n center={top}\n rightText={isMobile ? undefined : extraText}\n right={\n <Fragment>\n {extraLinksTop}\n {!isMobile && extraLinks}\n </Fragment>\n }\n isMobile={isMobile}\n burger={burgerProps}\n />\n ) : (\n <LayoutHeaderDark\n className={Styles.top}\n logo={logo}\n profile={isMobile ? undefined : profile}\n center={top}\n rightText={isMobile ? undefined : extraText}\n right={\n <Fragment>\n {extraLinksTop}\n {!isMobile && extraLinks}\n </Fragment>\n }\n isMobile={isMobile}\n burger={burgerProps}\n navigationMainItems={navigationMainItems}\n navigationOverflowItems={navigationOverflowItems}\n />\n ))}\n\n {hasSideBar && (\n <NotificationsContextProvider>\n <LayoutSidebar\n className={Styles.side}\n mobile={breakpoint.isMobile}\n touchDevice={breakpoint.isTouchDevice}\n barExpanded={!state?.navCollapsed}\n onBarExpandChange={onBarExpandChange}\n submenusExpanded={state?.submenusExpanded}\n onSubmenuExpandChange={onSubmenuExpandChange}\n drawerOpened={mobileDrawerOpened}\n onDrawerOpenChange={setMobileDrawerOpened}\n top={sideTop}\n mainItems={sidebarNavItems}\n navigationComponent={context.NavigationComponent}\n bottom={\n isMobile ? (\n <Fragment>\n {profile}\n {extraLinks}\n {!!extraText && (\n <InternalSideNavigationTrigger\n id=\"--extra-text\"\n title={extraText}\n isActive={undefined}\n icon={undefined}\n iconActive={undefined}\n tag={undefined}\n className={undefined}\n />\n )}\n </Fragment>\n ) : undefined\n }\n />\n </NotificationsContextProvider>\n )}\n\n {view.isAnvil2 ? (\n <TitanLayoutHeader>\n <ObservedHeight heightChange={setHeaderHeight}>{header}</ObservedHeight>\n </TitanLayoutHeader>\n ) : view.isLegacy ? (\n <TitanLayoutHeader>{header}</TitanLayoutHeader>\n ) : null}\n {view.isAnvil1 ? (\n <LayoutContentAnvil1 header={header} minWidth={limitContentWidth}>\n {children}\n </LayoutContentAnvil1>\n ) : view.isLegacy ? (\n <LayoutContentLegacy minWidth={limitContentWidth}>\n {children}\n </LayoutContentLegacy>\n ) : (\n children\n )}\n </div>\n </LayoutPlacementContext.Provider>\n </LayoutContext.Provider>\n );\n}\n\nconst ObservedHeight: FC<{\n children: ReactNode;\n heightChange?(value: number): void;\n}> = ({ children, heightChange }) => {\n const ref = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (ref.current) {\n const updatePosition = () => {\n if (ref.current && heightChange) {\n const pos = ref.current.getBoundingClientRect();\n heightChange(pos.height);\n }\n };\n\n const observer = new ResizeObserver(updatePosition);\n observer.observe(ref.current);\n\n updatePosition();\n return () => observer.disconnect();\n }\n }, [heightChange]);\n\n useEffect(() => {\n return () => {\n heightChange?.(0);\n };\n }, [heightChange]);\n return <div ref={ref}>{children}</div>;\n};\nconst TitanLayoutHeader: FC<{ children: ReactNode }> = ({ children }) => {\n return (\n <div className={Styles.contentHeader} data-cy=\"layout-content-header\">\n {children}\n </div>\n );\n};\n\nconst LayoutContentAnvil1: FC<{\n children: ReactNode;\n header?: ReactNode;\n minWidth?: number;\n}> = ({ children, header, minWidth }) => {\n const innerContentStyles: CSSProperties = useMemo(\n () => ({\n ...(minWidth ? { minWidth: `${minWidth}px`, overflowX: 'auto' } : {}),\n }),\n [minWidth]\n );\n\n return (\n <Fragment>\n <TitanLayoutHeader>{header}</TitanLayoutHeader>\n <div\n className={classNames(Styles.content, { 'of-x-auto-i': !!minWidth })}\n data-cy=\"layout-content\"\n >\n <div\n className=\"position-relative d-f flex-grow-1 flex-basis-0 of-hidden\"\n style={innerContentStyles}\n >\n {children}\n </div>\n </div>\n </Fragment>\n );\n};\n\nconst LayoutContentLegacy: FC<{\n children: ReactNode;\n minWidth: number | undefined;\n}> = ({ children, minWidth }) => {\n const innerContentStyles: CSSProperties = useMemo(\n () => ({\n position: 'relative',\n minWidth: `${minWidth}px`,\n }),\n [minWidth]\n );\n\n return <div style={minWidth ? innerContentStyles : undefined}>{children}</div>;\n};\n\nexport const TitanLayout = Object.assign(TitanLayoutComponent, {\n Link: TitanLayoutLink,\n Trigger: TitanLayoutTrigger,\n});\n"],"names":["classNames","Fragment","useCallback","useEffect","useMemo","useRef","useState","DefaultNavLinkComponent","useTitanBreakpoint","LayoutContext","LayoutPlacementContext","LayoutHeader","LayoutHeaderDark","LayoutSidebar","InternalSideNavigationTrigger","useNotificationsState","TitanLayoutLink","TitanLayoutTrigger","Styles","defaultSidebarContext","styles","popoverContent","useAppearance","appearance","isLegacy","isAnvil1","isAnvil2","isSequent","useViewportConfigs","noResponsive","meta","document","head","querySelector","content","TitanLayoutComponent","navVariant","id","children","contentOnly","navigationComponent","header","top","profile","state","logo","onStateChange","navigationMainItems","navigationOverflowItems","extraLinks","extraLinksTop","extraText","minContentWidth","sideTop","breakpoint","context","NavigationComponent","isTitanLayout","sidebar","view","mobileDrawerOpened","setMobileDrawerOpened","hasNotifications","NotificationsContextProvider","headerHeight","setHeaderHeight","isMobile","hasSideBar","length","hasTopBar","bodyClassName","body","classList","add","remove","onBurgerClick","e","navCollapsed","stopPropagation","onBarExpandChange","expanded","onSubmenuExpandChange","force","submenusExpanded","filter","i","sidebarNavItems","undefined","hasMenuNotifications","some","item","counter","tag","value","submenu","groups","group","links","link","limitContentWidth","width","contentStyles","layoutClass","layoutLegacy","layoutAnvil1","layoutAnvil2","burgerProps","onClick","Provider","div","className","layout","layoutMobile","layoutDesktop","layoutNoResponsive","layoutTopLight","layoutTopNav","layoutNavSlim","layoutNavWide","style","topPlaceholder","variant","center","rightText","right","burger","side","mobile","touchDevice","isTouchDevice","barExpanded","drawerOpened","onDrawerOpenChange","mainItems","bottom","title","isActive","icon","iconActive","TitanLayoutHeader","ObservedHeight","heightChange","LayoutContentAnvil1","minWidth","LayoutContentLegacy","ref","current","updatePosition","pos","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","contentHeader","data-cy","innerContentStyles","overflowX","position","TitanLayout","Object","assign","Link","Trigger"],"mappings":"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"}
@@ -9,8 +9,7 @@
9
9
  @bg-color-active: rgba(120, 187, 250, 0.2);
10
10
 
11
11
  .layout-anvil1 {
12
- height: calc(100vh - var(--nav-offset-top));
13
- margin-top: var(--nav-offset-top);
12
+ height: 100vh;
14
13
 
15
14
  display: flex;
16
15
  flex-direction: column;
@@ -52,7 +51,8 @@
52
51
  }
53
52
 
54
53
  .layout-legacy,
55
- .layout-anvil2 {
54
+ .layout-anvil2,
55
+ .layout-anvil1 {
56
56
  .top-placeholder {
57
57
  height: var(--nav-offset-top);
58
58
  }
@@ -100,6 +100,14 @@
100
100
  }
101
101
  }
102
102
 
103
+ .layout-no-responsive {
104
+ min-width: 800px;
105
+
106
+ .top {
107
+ width: 100%;
108
+ }
109
+ }
110
+
103
111
  @media print {
104
112
  .layout {
105
113
  --nav-offset-left: 0px !important;
@@ -9,6 +9,7 @@ export const layoutLegacy: string;
9
9
  export const layoutMobile: string;
10
10
  export const layoutNavSlim: string;
11
11
  export const layoutNavWide: string;
12
+ export const layoutNoResponsive: string;
12
13
  export const layoutTopLight: string;
13
14
  export const layoutTopNav: string;
14
15
  export const side: string;
@@ -2,7 +2,8 @@ import { BreakpointReturnProps } from '@servicetitan/anvil2';
2
2
  export interface TitanBreakpoint {
3
3
  name: BreakpointReturnProps['name'];
4
4
  isMobile: boolean;
5
+ isTouchDevice: boolean;
5
6
  width: number;
6
7
  }
7
- export declare const useTitanBreakpoint: () => TitanBreakpoint;
8
+ export declare const useTitanBreakpoint: (noResponsive?: boolean) => TitanBreakpoint;
8
9
  //# sourceMappingURL=use-breakpoint.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"use-breakpoint.d.ts","sourceRoot":"","sources":["../../src/utils/use-breakpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAiB,MAAM,sBAAsB,CAAC;AAG5E,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,KAAK,EAAE,MAAM,CAAC;CACjB;AAED,eAAO,MAAM,kBAAkB,QAAO,eAWrC,CAAC"}
1
+ {"version":3,"file":"use-breakpoint.d.ts","sourceRoot":"","sources":["../../src/utils/use-breakpoint.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAiB,MAAM,sBAAsB,CAAC;AAG5E,MAAM,WAAW,eAAe;IAC5B,IAAI,EAAE,qBAAqB,CAAC,MAAM,CAAC,CAAC;IACpC,QAAQ,EAAE,OAAO,CAAC;IAClB,aAAa,EAAE,OAAO,CAAC;IACvB,KAAK,EAAE,MAAM,CAAC;CACjB;AAID,eAAO,MAAM,kBAAkB,GAAI,eAAe,OAAO,KAAG,eAY3D,CAAC"}
@@ -1,16 +1,19 @@
1
1
  import { useBreakpoint } from '@servicetitan/anvil2';
2
2
  import { useMemo } from 'react';
3
- export const useTitanBreakpoint = ()=>{
3
+ const isTouchDevice = ()=>window.matchMedia('(any-pointer: coarse)').matches;
4
+ export const useTitanBreakpoint = (noResponsive)=>{
4
5
  const breakpoint = useBreakpoint();
5
6
  return useMemo(()=>{
6
7
  var _breakpoint_name, _breakpoint_innerWidth;
7
8
  return {
8
9
  name: (_breakpoint_name = breakpoint === null || breakpoint === void 0 ? void 0 : breakpoint.name) !== null && _breakpoint_name !== void 0 ? _breakpoint_name : 'xl',
9
- isMobile: breakpoint ? breakpoint.innerWidth < 768 : false,
10
+ isMobile: breakpoint && !noResponsive ? breakpoint.innerWidth < 768 : false,
11
+ isTouchDevice: isTouchDevice(),
10
12
  width: (_breakpoint_innerWidth = breakpoint === null || breakpoint === void 0 ? void 0 : breakpoint.innerWidth) !== null && _breakpoint_innerWidth !== void 0 ? _breakpoint_innerWidth : 0
11
13
  };
12
14
  }, [
13
- breakpoint
15
+ breakpoint,
16
+ noResponsive
14
17
  ]);
15
18
  };
16
19
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/utils/use-breakpoint.ts"],"sourcesContent":["import { BreakpointReturnProps, useBreakpoint } from '@servicetitan/anvil2';\nimport { useMemo } from 'react';\n\nexport interface TitanBreakpoint {\n name: BreakpointReturnProps['name'];\n isMobile: boolean;\n width: number;\n}\n\nexport const useTitanBreakpoint = (): TitanBreakpoint => {\n const breakpoint = useBreakpoint();\n\n return useMemo(\n () => ({\n name: breakpoint?.name ?? 'xl',\n isMobile: breakpoint ? breakpoint.innerWidth < 768 : false,\n width: breakpoint?.innerWidth ?? 0,\n }),\n [breakpoint]\n );\n};\n"],"names":["useBreakpoint","useMemo","useTitanBreakpoint","breakpoint","name","isMobile","innerWidth","width"],"mappings":"AAAA,SAAgCA,aAAa,QAAQ,uBAAuB;AAC5E,SAASC,OAAO,QAAQ,QAAQ;AAQhC,OAAO,MAAMC,qBAAqB;IAC9B,MAAMC,aAAaH;IAEnB,OAAOC,QACH;YACUE,kBAECA;eAHJ;YACHC,MAAMD,CAAAA,mBAAAA,uBAAAA,iCAAAA,WAAYC,IAAI,cAAhBD,8BAAAA,mBAAoB;YAC1BE,UAAUF,aAAaA,WAAWG,UAAU,GAAG,MAAM;YACrDC,OAAOJ,CAAAA,yBAAAA,uBAAAA,iCAAAA,WAAYG,UAAU,cAAtBH,oCAAAA,yBAA0B;QACrC;OACA;QAACA;KAAW;AAEpB,EAAE"}
1
+ {"version":3,"sources":["../../src/utils/use-breakpoint.ts"],"sourcesContent":["import { BreakpointReturnProps, useBreakpoint } from '@servicetitan/anvil2';\nimport { useMemo } from 'react';\n\nexport interface TitanBreakpoint {\n name: BreakpointReturnProps['name'];\n isMobile: boolean;\n isTouchDevice: boolean;\n width: number;\n}\n\nconst isTouchDevice = () => window.matchMedia('(any-pointer: coarse)').matches;\n\nexport const useTitanBreakpoint = (noResponsive?: boolean): TitanBreakpoint => {\n const breakpoint = useBreakpoint();\n\n return useMemo(\n () => ({\n name: breakpoint?.name ?? 'xl',\n isMobile: breakpoint && !noResponsive ? breakpoint.innerWidth < 768 : false,\n isTouchDevice: isTouchDevice(),\n width: breakpoint?.innerWidth ?? 0,\n }),\n [breakpoint, noResponsive]\n );\n};\n"],"names":["useBreakpoint","useMemo","isTouchDevice","window","matchMedia","matches","useTitanBreakpoint","noResponsive","breakpoint","name","isMobile","innerWidth","width"],"mappings":"AAAA,SAAgCA,aAAa,QAAQ,uBAAuB;AAC5E,SAASC,OAAO,QAAQ,QAAQ;AAShC,MAAMC,gBAAgB,IAAMC,OAAOC,UAAU,CAAC,yBAAyBC,OAAO;AAE9E,OAAO,MAAMC,qBAAqB,CAACC;IAC/B,MAAMC,aAAaR;IAEnB,OAAOC,QACH;YACUO,kBAGCA;eAJJ;YACHC,MAAMD,CAAAA,mBAAAA,uBAAAA,iCAAAA,WAAYC,IAAI,cAAhBD,8BAAAA,mBAAoB;YAC1BE,UAAUF,cAAc,CAACD,eAAeC,WAAWG,UAAU,GAAG,MAAM;YACtET,eAAeA;YACfU,OAAOJ,CAAAA,yBAAAA,uBAAAA,iCAAAA,WAAYG,UAAU,cAAtBH,oCAAAA,yBAA0B;QACrC;OACA;QAACA;QAAYD;KAAa;AAElC,EAAE"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@servicetitan/navigation",
3
- "version": "13.1.4",
3
+ "version": "13.1.6",
4
4
  "description": "Navigation components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -26,7 +26,7 @@
26
26
  "react": ">=18.0.0"
27
27
  },
28
28
  "devDependencies": {
29
- "@servicetitan/anvil2": "~1.49.7",
29
+ "@servicetitan/anvil2": "~1.51.0",
30
30
  "@servicetitan/design-system": "~14.5.1",
31
31
  "@servicetitan/react-ioc": "^33.1.0",
32
32
  "@servicetitan/tokens": ">=12.1.11",
@@ -42,5 +42,5 @@
42
42
  "less": true,
43
43
  "webpack": false
44
44
  },
45
- "gitHead": "34dcba243deb5c93ca126328ccd5d63fc9248403"
45
+ "gitHead": "db84d34abd9c2c755a7501d519d1ac8c8a439ed3"
46
46
  }
@@ -19,7 +19,7 @@ export interface TitanLayoutContextType {
19
19
 
20
20
  export const LayoutContext = createContext<TitanLayoutContextType>({
21
21
  NavigationComponent: DefaultNavLinkComponent,
22
- breakpoint: { name: 'lg', isMobile: false, width: 0 },
22
+ breakpoint: { name: 'lg', isMobile: false, isTouchDevice: false, width: 0 },
23
23
  isTitanLayout: false,
24
24
  sidebar: { styles: { popoverContent: {} } },
25
25
  });
@@ -590,3 +590,7 @@
590
590
  background-color: @bg-color-hover;
591
591
  }
592
592
  }
593
+
594
+ .pointer-events-none {
595
+ pointer-events: none;
596
+ }
@@ -30,6 +30,7 @@ export const navMain: string;
30
30
  export const navSlim: string;
31
31
  export const navTop: string;
32
32
  export const navWide: string;
33
+ export const pointerEventsNone: string;
33
34
  export const submenu: string;
34
35
  export const submenuGroupHeader: string;
35
36
  export const submenuGroupHeaderEmpty: string;
@@ -23,6 +23,7 @@ export interface LayoutSidebarProps {
23
23
  submenusExpanded: string[] | undefined;
24
24
  drawerOpened: boolean;
25
25
  mobile: boolean;
26
+ touchDevice: boolean;
26
27
  navigationComponent: FC<NavLinkComponentProps>;
27
28
  onBarExpandChange(expanded: boolean): void;
28
29
  onDrawerOpenChange(expanded: boolean): void;
@@ -32,6 +33,7 @@ export interface LayoutSidebarProps {
32
33
  export const LayoutSidebar: FC<LayoutSidebarProps> = ({
33
34
  className,
34
35
  mobile,
36
+ touchDevice,
35
37
  barExpanded,
36
38
  submenusExpanded,
37
39
  drawerOpened,
@@ -90,6 +92,7 @@ export const LayoutSidebar: FC<LayoutSidebarProps> = ({
90
92
  }
91
93
  onSubmenuExpand={onSubmenuExpandChange}
92
94
  navigationComponent={navigationComponent}
95
+ touchDevice={touchDevice}
93
96
  />
94
97
  ) : (
95
98
  <InternalSideNavigationLink
@@ -123,10 +126,18 @@ LayoutSidebar.displayName = 'LayoutSidebar';
123
126
  const SideNavigationGroupItem: FC<{
124
127
  item: NavigationItemData;
125
128
  navigationComponent: FC<NavLinkComponentProps>;
129
+ touchDevice: boolean;
126
130
  barExpanded: boolean;
127
131
  submenuExpanded: boolean;
128
132
  onSubmenuExpand: (id: string, expanded: boolean, force: boolean) => void;
129
- }> = ({ item, onSubmenuExpand, barExpanded, submenuExpanded, navigationComponent }) => {
133
+ }> = ({
134
+ item,
135
+ onSubmenuExpand,
136
+ barExpanded,
137
+ submenuExpanded,
138
+ navigationComponent,
139
+ touchDevice,
140
+ }) => {
130
141
  const {
131
142
  sidebar: {
132
143
  styles: { popoverContent },
@@ -156,7 +167,7 @@ const SideNavigationGroupItem: FC<{
156
167
  />
157
168
  </InternalSideNavigationGroup>
158
169
  ) : (
159
- <Popover placement="right-start" openOnHover delay={300}>
170
+ <Popover placement="right-start" openOnHover={!touchDevice} delay={300}>
160
171
  <Popover.Trigger>
161
172
  {(triggerProps: any) => (
162
173
  <div {...triggerProps}>
@@ -167,7 +178,10 @@ const SideNavigationGroupItem: FC<{
167
178
  isActive={item.isActive}
168
179
  icon={item.icon}
169
180
  iconActive={item.iconActive}
170
- className={item.className}
181
+ className={classNames(
182
+ item.className,
183
+ touchDevice && Styles.pointerEventsNone
184
+ )}
171
185
  tag={tag}
172
186
  navigationComponent={navigationComponent}
173
187
  />
@@ -9,8 +9,7 @@
9
9
  @bg-color-active: rgba(120, 187, 250, 0.2);
10
10
 
11
11
  .layout-anvil1 {
12
- height: calc(100vh - var(--nav-offset-top));
13
- margin-top: var(--nav-offset-top);
12
+ height: 100vh;
14
13
 
15
14
  display: flex;
16
15
  flex-direction: column;
@@ -52,7 +51,8 @@
52
51
  }
53
52
 
54
53
  .layout-legacy,
55
- .layout-anvil2 {
54
+ .layout-anvil2,
55
+ .layout-anvil1 {
56
56
  .top-placeholder {
57
57
  height: var(--nav-offset-top);
58
58
  }
@@ -100,6 +100,14 @@
100
100
  }
101
101
  }
102
102
 
103
+ .layout-no-responsive {
104
+ min-width: 800px;
105
+
106
+ .top {
107
+ width: 100%;
108
+ }
109
+ }
110
+
103
111
  @media print {
104
112
  .layout {
105
113
  --nav-offset-left: 0px !important;
@@ -9,6 +9,7 @@ export const layoutLegacy: string;
9
9
  export const layoutMobile: string;
10
10
  export const layoutNavSlim: string;
11
11
  export const layoutNavWide: string;
12
+ export const layoutNoResponsive: string;
12
13
  export const layoutTopLight: string;
13
14
  export const layoutTopNav: string;
14
15
  export const side: string;
@@ -100,6 +100,12 @@ export type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children'
100
100
  * used for pages that aren't adopted to mobile
101
101
  */
102
102
  minContentWidth?: number;
103
+
104
+ /**
105
+ * disable responsive behavior
106
+ * can be used for pages that aren't adopted to mobile
107
+ */
108
+ noResponsive?: boolean;
103
109
  };
104
110
 
105
111
  const defaultSidebarContext: TitanLayoutSidebarContextType = {
@@ -125,6 +131,18 @@ const useAppearance = (appearance: TitanLayoutProps['appearance']) =>
125
131
  };
126
132
  }, [appearance]);
127
133
 
134
+ export const useViewportConfigs = (noResponsive?: boolean) => {
135
+ useEffect(() => {
136
+ const meta: HTMLMetaElement | null = document.head.querySelector('meta[name="viewport"]');
137
+
138
+ if (meta) {
139
+ meta.content = noResponsive
140
+ ? ''
141
+ : 'width=device-width, initial-scale=1, maximum-scale=1';
142
+ }
143
+ }, [noResponsive]);
144
+ };
145
+
128
146
  function TitanLayoutComponent({
129
147
  appearance = 'anvil2',
130
148
  navVariant = 'left',
@@ -144,9 +162,10 @@ function TitanLayoutComponent({
144
162
  extraLinksTop,
145
163
  extraText,
146
164
  minContentWidth,
165
+ noResponsive,
147
166
  sideTop,
148
167
  }: TitanLayoutProps) {
149
- const breakpoint = useTitanBreakpoint();
168
+ const breakpoint = useTitanBreakpoint(noResponsive);
150
169
  const context: TitanLayoutContextType = useMemo(
151
170
  () => ({
152
171
  NavigationComponent: navigationComponent ?? DefaultNavLinkComponent,
@@ -159,12 +178,7 @@ function TitanLayoutComponent({
159
178
  const view = useAppearance(appearance);
160
179
  const [mobileDrawerOpened, setMobileDrawerOpened] = useState(false);
161
180
  const { hasNotifications, NotificationsContextProvider } = useNotificationsState();
162
- const [offsetTopStyles, setOffsetTopStyles] = useState<object>({});
163
- const updateIndicatorsHeight = useCallback((offset: number) => {
164
- setOffsetTopStyles({
165
- '--content-offset-top': `calc(var(--nav-offset-top) + ${offset}px)`,
166
- });
167
- }, []);
181
+ const [headerHeight, setHeaderHeight] = useState(0);
168
182
 
169
183
  const isMobile = breakpoint.isMobile;
170
184
  const hasSideBar =
@@ -258,10 +272,12 @@ function TitanLayoutComponent({
258
272
  }, [view, minContentWidth, breakpoint.width]);
259
273
 
260
274
  const contentStyles = useMemo(() => {
261
- if (view.isAnvil2 || view.isLegacy) {
262
- return offsetTopStyles;
275
+ if (view.isAnvil2) {
276
+ return {
277
+ '--content-offset-top': `calc(var(--nav-offset-top) + ${headerHeight}px)`,
278
+ } as CSSProperties;
263
279
  }
264
- }, [view, offsetTopStyles]);
280
+ }, [view, headerHeight]);
265
281
 
266
282
  const layoutClass = view.isLegacy
267
283
  ? Styles.layoutLegacy
@@ -309,6 +325,7 @@ function TitanLayoutComponent({
309
325
  className={classNames(
310
326
  Styles.layout,
311
327
  isMobile ? Styles.layoutMobile : Styles.layoutDesktop,
328
+ noResponsive && Styles.layoutNoResponsive,
312
329
  hasTopBar &&
313
330
  (navVariant === 'left' || !top
314
331
  ? Styles.layoutTopLight
@@ -321,7 +338,7 @@ function TitanLayoutComponent({
321
338
  )}
322
339
  style={contentStyles}
323
340
  >
324
- {view.isSequent && <div className={Styles.topPlaceholder} />}
341
+ <div className={Styles.topPlaceholder} />
325
342
  {hasTopBar &&
326
343
  (navVariant === 'left' ? (
327
344
  <LayoutHeader
@@ -365,6 +382,7 @@ function TitanLayoutComponent({
365
382
  <LayoutSidebar
366
383
  className={Styles.side}
367
384
  mobile={breakpoint.isMobile}
385
+ touchDevice={breakpoint.isTouchDevice}
368
386
  barExpanded={!state?.navCollapsed}
369
387
  onBarExpandChange={onBarExpandChange}
370
388
  submenusExpanded={state?.submenusExpanded}
@@ -397,11 +415,13 @@ function TitanLayoutComponent({
397
415
  </NotificationsContextProvider>
398
416
  )}
399
417
 
400
- {view.isSequent && (
401
- <TitanLayoutHeaderObserved heightChange={updateIndicatorsHeight}>
402
- {header}
403
- </TitanLayoutHeaderObserved>
404
- )}
418
+ {view.isAnvil2 ? (
419
+ <TitanLayoutHeader>
420
+ <ObservedHeight heightChange={setHeaderHeight}>{header}</ObservedHeight>
421
+ </TitanLayoutHeader>
422
+ ) : view.isLegacy ? (
423
+ <TitanLayoutHeader>{header}</TitanLayoutHeader>
424
+ ) : null}
405
425
  {view.isAnvil1 ? (
406
426
  <LayoutContentAnvil1 header={header} minWidth={limitContentWidth}>
407
427
  {children}
@@ -419,7 +439,7 @@ function TitanLayoutComponent({
419
439
  );
420
440
  }
421
441
 
422
- const TitanLayoutHeaderObserved: FC<{
442
+ const ObservedHeight: FC<{
423
443
  children: ReactNode;
424
444
  heightChange?(value: number): void;
425
445
  }> = ({ children, heightChange }) => {
@@ -447,11 +467,7 @@ const TitanLayoutHeaderObserved: FC<{
447
467
  heightChange?.(0);
448
468
  };
449
469
  }, [heightChange]);
450
- return (
451
- <div ref={ref} className={Styles.contentHeader} data-cy="layout-content-header">
452
- {children}
453
- </div>
454
- );
470
+ return <div ref={ref}>{children}</div>;
455
471
  };
456
472
  const TitanLayoutHeader: FC<{ children: ReactNode }> = ({ children }) => {
457
473
  return (
@@ -4,18 +4,22 @@ import { useMemo } from 'react';
4
4
  export interface TitanBreakpoint {
5
5
  name: BreakpointReturnProps['name'];
6
6
  isMobile: boolean;
7
+ isTouchDevice: boolean;
7
8
  width: number;
8
9
  }
9
10
 
10
- export const useTitanBreakpoint = (): TitanBreakpoint => {
11
+ const isTouchDevice = () => window.matchMedia('(any-pointer: coarse)').matches;
12
+
13
+ export const useTitanBreakpoint = (noResponsive?: boolean): TitanBreakpoint => {
11
14
  const breakpoint = useBreakpoint();
12
15
 
13
16
  return useMemo(
14
17
  () => ({
15
18
  name: breakpoint?.name ?? 'xl',
16
- isMobile: breakpoint ? breakpoint.innerWidth < 768 : false,
19
+ isMobile: breakpoint && !noResponsive ? breakpoint.innerWidth < 768 : false,
20
+ isTouchDevice: isTouchDevice(),
17
21
  width: breakpoint?.innerWidth ?? 0,
18
22
  }),
19
- [breakpoint]
23
+ [breakpoint, noResponsive]
20
24
  );
21
25
  };