@servicetitan/navigation 12.0.4-canary.267.7c06c0a.0 → 12.0.4-canary.267.f428d7e.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +5 -3
  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 +2 -0
  10. package/dist/components/titan-layout/titan-layout.d.ts.map +1 -1
  11. package/dist/components/titan-layout/titan-layout.js +17 -6
  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 +2 -2
  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 +10 -2
  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 +22 -4
  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
  submenuExpanded: 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":"AAKA,OAAO,EAEH,EAAE,EAGF,YAAY,EAGf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,kBAAkB,EAAyB,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAavE,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,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,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,GAAG,IAAI,CAAC;CAC9D;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA4FhD,CAAC"}
1
+ {"version":3,"file":"layout-sidebar.d.ts","sourceRoot":"","sources":["../../../src/components/titan-layout/layout-sidebar.tsx"],"names":[],"mappings":"AAKA,OAAO,EAEH,EAAE,EAGF,YAAY,EAGf,MAAM,OAAO,CAAC;AACf,OAAO,EAAE,kBAAkB,EAAyB,MAAM,wBAAwB,CAAC;AACnF,OAAO,EAAE,qBAAqB,EAAE,MAAM,gCAAgC,CAAC;AAavE,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,eAAe,EAAE,MAAM,GAAG,SAAS,CAAC;IACpC,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,GAAG,IAAI,CAAC;CAC9D;AAED,eAAO,MAAM,aAAa,EAAE,EAAE,CAAC,kBAAkB,CA8FhD,CAAC"}
@@ -10,7 +10,7 @@ import { LayoutPlacementContext, useTitanLayoutContext } from './layout-context'
10
10
  import { InternalSideNavigationGroup, InternalSideNavigationGroupLink, InternalSideNavigationLink } from './layout-sidebar-links-internal';
11
11
  import * as Styles from './layout-sidebar.module.less';
12
12
  import { withTooltip } from './with-tooltip';
13
- export const LayoutSidebar = ({ className, mobile, barExpanded, submenuExpanded, drawerOpened, onBarExpandChange, onSubmenuExpandChange, onDrawerOpenChange, mainItems, top, bottom, navigationComponent })=>{
13
+ export const LayoutSidebar = ({ className, mobile, touchDevice, barExpanded, submenuExpanded, drawerOpened, onBarExpandChange, onSubmenuExpandChange, onDrawerOpenChange, mainItems, top, bottom, navigationComponent })=>{
14
14
  const closeDrawer = ()=>{
15
15
  if (mobile) {
16
16
  onDrawerOpenChange === null || onDrawerOpenChange === void 0 ? void 0 : onDrawerOpenChange(false);
@@ -53,6 +53,7 @@ export const LayoutSidebar = ({ className, mobile, barExpanded, submenuExpanded,
53
53
  submenuExpanded: !!item.id && submenuExpanded === item.id,
54
54
  onSubmenuExpand: onSubmenuExpandChange,
55
55
  navigationComponent: navigationComponent,
56
+ touchDevice: touchDevice,
56
57
  ...item
57
58
  }, item.id) : /*#__PURE__*/ _jsx(InternalSideNavigationLink, {
58
59
  submenuExpanded: undefined,
@@ -111,7 +112,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
111
112
  }), appearance === 'expand' ? 'Expand Menu' : appearance === 'collapse' ? 'Collapse Menu' : undefined, {
112
113
  placement: 'right'
113
114
  });
114
- /** Side Navigation menu item */ const SideNavigationGroupItem = ({ onSubmenuExpand, barExpanded, submenuExpanded, ...props })=>{
115
+ /** Side Navigation menu item */ const SideNavigationGroupItem = ({ onSubmenuExpand, barExpanded, submenuExpanded, touchDevice, ...props })=>{
115
116
  var _props_submenu, _props_submenu1;
116
117
  const onExpandToggle = useCallback((e)=>{
117
118
  e.preventDefault();
@@ -139,7 +140,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
139
140
  })
140
141
  }) : /*#__PURE__*/ _jsxs(Popover, {
141
142
  placement: "right-start",
142
- openOnHover: true,
143
+ openOnHover: !touchDevice,
143
144
  delay: 500,
144
145
  children: [
145
146
  /*#__PURE__*/ _jsx(Popover.Trigger, {
@@ -147,6 +148,7 @@ LayoutSidebar.displayName = 'LayoutSidebar';
147
148
  ...triggerProps,
148
149
  children: /*#__PURE__*/ _jsx(InternalSideNavigationLink, {
149
150
  ...props,
151
+ className: classNames(props.className, touchDevice && Styles.pointerEventsNone),
150
152
  submenuExpanded: undefined,
151
153
  tag: tag
152
154
  })
@@ -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 SvgCollapse from '@servicetitan/anvil2/assets/icons/st/gnav_menu_collapse.svg';\nimport SvgExpand from '@servicetitan/anvil2/assets/icons/st/gnav_menu_expand.svg';\nimport classNames from 'classnames';\nimport {\n Children,\n FC,\n Fragment,\n MouseEvent,\n ReactElement,\n isValidElement,\n useCallback,\n} 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\nimport { withTooltip } from './with-tooltip';\n\nexport interface LayoutSidebarProps {\n className?: string;\n top?: ReactElement[];\n bottom?: ReactElement;\n mainItems?: NavigationItemData[];\n barExpanded: boolean;\n submenuExpanded: 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): void;\n}\n\nexport const LayoutSidebar: FC<LayoutSidebarProps> = ({\n className,\n mobile,\n barExpanded,\n submenuExpanded,\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 barExpanded={mobile ? drawerOpened : barExpanded}\n submenuExpanded={!!item.id && submenuExpanded === item.id}\n onSubmenuExpand={onSubmenuExpandChange}\n navigationComponent={navigationComponent}\n {...item}\n />\n ) : (\n <InternalSideNavigationLink\n key={item.id}\n submenuExpanded={undefined}\n navigationComponent={navigationComponent}\n {...item}\n tag={getSubmenuGroupTag(\n item.submenu,\n getCounterTag(item.counter, item.tag)\n )}\n />\n )\n )}\n </div>\n\n {!!bottom && <SidebarBottom>{bottom}</SidebarBottom>}\n </ThemeProvider>\n\n {!mobile && (\n <div className={Styles.navFooter}>\n <div className={Styles.divider} />\n <div className={Styles.toggleWrapper}>\n <SideNavigationOptionsToggle\n appearance={barExpanded ? 'collapse-button' : 'expand'}\n onExpandedChange={() => onBarExpandChange(!barExpanded)}\n />\n </div>\n </div>\n )}\n </div>\n </LayoutPlacementContext.Provider>\n );\n};\nLayoutSidebar.displayName = 'LayoutSidebar';\n\n/** Side Navigation options toggle */\nconst SideNavigationOptionsToggle: FC<{\n appearance: 'expand' | 'collapse' | 'collapse-button';\n onExpandedChange?(expanded: boolean): void;\n}> = ({ appearance, onExpandedChange }) =>\n withTooltip(\n <div\n data-cy=\"navigation-left-options\"\n data-pendo=\"navigation-left-options\"\n className={classNames(Styles.toggle)}\n onClick={() => onExpandedChange?.(appearance === 'expand')}\n >\n <div className={Styles.toggleContent}>\n <div className={Styles.toggleIconWrapper}>\n <Icon\n className={Styles.toggleIcon}\n svg={appearance === 'expand' ? SvgExpand : SvgCollapse}\n />\n </div>\n\n {appearance === 'collapse-button' && (\n <span className={Styles.toggleText}>Collapse Menu</span>\n )}\n </div>\n </div>,\n appearance === 'expand'\n ? 'Expand Menu'\n : appearance === 'collapse'\n ? 'Collapse Menu'\n : undefined,\n { placement: 'right' }\n );\n\n/** Side Navigation menu item */\nconst SideNavigationGroupItem: FC<\n NavigationItemData & {\n navigationComponent: FC<NavLinkComponentProps>;\n barExpanded: boolean;\n submenuExpanded: boolean;\n onSubmenuExpand: undefined | ((id: string, expanded: boolean) => void);\n }\n> = ({ onSubmenuExpand, barExpanded, submenuExpanded, ...props }) => {\n const onExpandToggle = useCallback(\n (e: MouseEvent<never>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (props.id) {\n onSubmenuExpand?.(props.id, !submenuExpanded);\n }\n },\n [props.id, submenuExpanded, onSubmenuExpand]\n );\n const {\n sidebar: {\n styles: { popoverContent },\n },\n } = useTitanLayoutContext();\n\n const tag = getSubmenuGroupTag(props.submenu, getCounterTag(props.counter, props.tag));\n\n return barExpanded ? (\n <InternalSideNavigationGroup\n {...props}\n submenuExpanded={submenuExpanded}\n onExpandToggle={onExpandToggle}\n tag={tag}\n >\n <SideNavigationGroupContent\n parentId={props.id}\n groups={props.submenu?.groups ?? []}\n navigationComponent={props.navigationComponent}\n />\n </InternalSideNavigationGroup>\n ) : (\n <Popover placement=\"right-start\" openOnHover delay={500}>\n <Popover.Trigger>\n {(triggerProps: any) => (\n <div {...triggerProps}>\n <InternalSideNavigationLink\n {...props}\n submenuExpanded={undefined}\n tag={tag}\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 {props.title}\n </Text>\n <SideNavigationGroupContent\n parentId={props.id}\n groups={props.submenu?.groups ?? []}\n navigationComponent={props.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 {...link}\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","SvgCollapse","SvgExpand","classNames","Children","Fragment","isValidElement","useCallback","getCounterTag","getSubmenuGroupTag","LayoutPlacementContext","useTitanLayoutContext","InternalSideNavigationGroup","InternalSideNavigationGroupLink","InternalSideNavigationLink","Styles","withTooltip","LayoutSidebar","className","mobile","barExpanded","submenuExpanded","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","id","onSubmenuExpand","undefined","tag","counter","SidebarBottom","navFooter","divider","toggleWrapper","SideNavigationOptionsToggle","appearance","onExpandedChange","displayName","data-pendo","toggle","toggleContent","toggleIconWrapper","toggleIcon","span","toggleText","placement","props","onExpandToggle","e","preventDefault","stopPropagation","sidebar","styles","popoverContent","SideNavigationGroupContent","parentId","groups","openOnHover","delay","Trigger","triggerProps","Content","style","submenuPopover","variant","el","title","reduce","out","group","index","links","trim","push","submenuGroupHeader","submenuGroupHeaderEmpty","link","children","list","child","navTop","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 SvgCollapse from '@servicetitan/anvil2/assets/icons/st/gnav_menu_collapse.svg';\nimport SvgExpand from '@servicetitan/anvil2/assets/icons/st/gnav_menu_expand.svg';\nimport classNames from 'classnames';\nimport {\n Children,\n FC,\n Fragment,\n MouseEvent,\n ReactElement,\n isValidElement,\n useCallback,\n} 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\nimport { withTooltip } from './with-tooltip';\n\nexport interface LayoutSidebarProps {\n className?: string;\n top?: ReactElement[];\n bottom?: ReactElement;\n mainItems?: NavigationItemData[];\n barExpanded: boolean;\n submenuExpanded: 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): void;\n}\n\nexport const LayoutSidebar: FC<LayoutSidebarProps> = ({\n className,\n mobile,\n touchDevice,\n barExpanded,\n submenuExpanded,\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 barExpanded={mobile ? drawerOpened : barExpanded}\n submenuExpanded={!!item.id && submenuExpanded === item.id}\n onSubmenuExpand={onSubmenuExpandChange}\n navigationComponent={navigationComponent}\n touchDevice={touchDevice}\n {...item}\n />\n ) : (\n <InternalSideNavigationLink\n key={item.id}\n submenuExpanded={undefined}\n navigationComponent={navigationComponent}\n {...item}\n tag={getSubmenuGroupTag(\n item.submenu,\n getCounterTag(item.counter, item.tag)\n )}\n />\n )\n )}\n </div>\n\n {!!bottom && <SidebarBottom>{bottom}</SidebarBottom>}\n </ThemeProvider>\n\n {!mobile && (\n <div className={Styles.navFooter}>\n <div className={Styles.divider} />\n <div className={Styles.toggleWrapper}>\n <SideNavigationOptionsToggle\n appearance={barExpanded ? 'collapse-button' : 'expand'}\n onExpandedChange={() => onBarExpandChange(!barExpanded)}\n />\n </div>\n </div>\n )}\n </div>\n </LayoutPlacementContext.Provider>\n );\n};\nLayoutSidebar.displayName = 'LayoutSidebar';\n\n/** Side Navigation options toggle */\nconst SideNavigationOptionsToggle: FC<{\n appearance: 'expand' | 'collapse' | 'collapse-button';\n onExpandedChange?(expanded: boolean): void;\n}> = ({ appearance, onExpandedChange }) =>\n withTooltip(\n <div\n data-cy=\"navigation-left-options\"\n data-pendo=\"navigation-left-options\"\n className={classNames(Styles.toggle)}\n onClick={() => onExpandedChange?.(appearance === 'expand')}\n >\n <div className={Styles.toggleContent}>\n <div className={Styles.toggleIconWrapper}>\n <Icon\n className={Styles.toggleIcon}\n svg={appearance === 'expand' ? SvgExpand : SvgCollapse}\n />\n </div>\n\n {appearance === 'collapse-button' && (\n <span className={Styles.toggleText}>Collapse Menu</span>\n )}\n </div>\n </div>,\n appearance === 'expand'\n ? 'Expand Menu'\n : appearance === 'collapse'\n ? 'Collapse Menu'\n : undefined,\n { placement: 'right' }\n );\n\n/** Side Navigation menu item */\nconst SideNavigationGroupItem: FC<\n NavigationItemData & {\n navigationComponent: FC<NavLinkComponentProps>;\n touchDevice: boolean;\n barExpanded: boolean;\n submenuExpanded: boolean;\n onSubmenuExpand: undefined | ((id: string, expanded: boolean) => void);\n }\n> = ({ onSubmenuExpand, barExpanded, submenuExpanded, touchDevice, ...props }) => {\n const onExpandToggle = useCallback(\n (e: MouseEvent<never>) => {\n e.preventDefault();\n e.stopPropagation();\n\n if (props.id) {\n onSubmenuExpand?.(props.id, !submenuExpanded);\n }\n },\n [props.id, submenuExpanded, onSubmenuExpand]\n );\n const {\n sidebar: {\n styles: { popoverContent },\n },\n } = useTitanLayoutContext();\n\n const tag = getSubmenuGroupTag(props.submenu, getCounterTag(props.counter, props.tag));\n\n return barExpanded ? (\n <InternalSideNavigationGroup\n {...props}\n submenuExpanded={submenuExpanded}\n onExpandToggle={onExpandToggle}\n tag={tag}\n >\n <SideNavigationGroupContent\n parentId={props.id}\n groups={props.submenu?.groups ?? []}\n navigationComponent={props.navigationComponent}\n />\n </InternalSideNavigationGroup>\n ) : (\n <Popover placement=\"right-start\" openOnHover={!touchDevice} delay={500}>\n <Popover.Trigger>\n {(triggerProps: any) => (\n <div {...triggerProps}>\n <InternalSideNavigationLink\n {...props}\n className={classNames(\n props.className,\n touchDevice && Styles.pointerEventsNone\n )}\n submenuExpanded={undefined}\n tag={tag}\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 {props.title}\n </Text>\n <SideNavigationGroupContent\n parentId={props.id}\n groups={props.submenu?.groups ?? []}\n navigationComponent={props.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 {...link}\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","SvgCollapse","SvgExpand","classNames","Children","Fragment","isValidElement","useCallback","getCounterTag","getSubmenuGroupTag","LayoutPlacementContext","useTitanLayoutContext","InternalSideNavigationGroup","InternalSideNavigationGroupLink","InternalSideNavigationLink","Styles","withTooltip","LayoutSidebar","className","mobile","touchDevice","barExpanded","submenuExpanded","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","id","onSubmenuExpand","undefined","tag","counter","SidebarBottom","navFooter","divider","toggleWrapper","SideNavigationOptionsToggle","appearance","onExpandedChange","displayName","data-pendo","toggle","toggleContent","toggleIconWrapper","toggleIcon","span","toggleText","placement","props","onExpandToggle","e","preventDefault","stopPropagation","sidebar","styles","popoverContent","SideNavigationGroupContent","parentId","groups","openOnHover","delay","Trigger","triggerProps","pointerEventsNone","Content","style","submenuPopover","variant","el","title","reduce","out","group","index","links","trim","push","submenuGroupHeader","submenuGroupHeaderEmpty","link","children","list","child","navTop","navBottom"],"mappings":"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"}
@@ -537,3 +537,7 @@
537
537
  background-color: @bg-color-hover;
538
538
  }
539
539
  }
540
+
541
+ .pointer-events-none {
542
+ pointer-events: none;
543
+ }
@@ -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;
@@ -31,7 +31,9 @@ export type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children'
31
31
  extraLinksTop?: ReactElement;
32
32
  extraText?: string;
33
33
  minContentWidth?: number;
34
+ noResponsive?: boolean;
34
35
  };
36
+ export declare const useViewportConfigs: (noResponsive?: boolean) => void;
35
37
  export declare const TitanLayout: FC<TitanLayoutProps> & {
36
38
  Link: typeof TitanLayoutSidebarLink;
37
39
  Trigger: typeof TitanLayoutSidebarTrigger;
@@ -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,EAEF,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;AAErD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAK3F,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,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAElD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;CAC5B,CAAC;AA4WF,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,EAEF,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;AAErD,OAAO,EAAE,sBAAsB,EAAE,yBAAyB,EAAE,MAAM,wBAAwB,CAAC;AAK3F,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,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAElD,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,GAAG,CAAC,EAAE,YAAY,CAAC;IACnB,OAAO,CAAC,EAAE,YAAY,EAAE,CAAC;IACzB,OAAO,CAAC,EAAE,YAAY,CAAC;IACvB,UAAU,CAAC,EAAE,YAAY,CAAC;IAC1B,aAAa,CAAC,EAAE,YAAY,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,OAAO,CAAC;CAC1B,CAAC;AAyBF,eAAO,MAAM,kBAAkB,GAAI,eAAe,OAAO,SAUxD,CAAC;AA0VF,eAAO,MAAM,WAAW;;;CAGtB,CAAC"}
@@ -32,8 +32,18 @@ const useAppearance = (appearance)=>useMemo(()=>{
32
32
  }, [
33
33
  appearance
34
34
  ]);
35
- const 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
+ const 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,
@@ -155,13 +165,13 @@ const TitanLayoutComponent = ({ appearance = 'anvil2', navVariant = 'left', id,
155
165
  value: "unset",
156
166
  children: /*#__PURE__*/ _jsxs("div", {
157
167
  id: id,
158
- className: classNames(Styles.layout, isMobile ? Styles.layoutMobile : Styles.layoutDesktop, hasTopBar && (navVariant === 'left' || !top ? Styles.layoutTopLight : Styles.layoutTopNav), {
168
+ className: classNames(Styles.layout, isMobile ? Styles.layoutMobile : Styles.layoutDesktop, noResponsive && Styles.layoutNoResponsive, hasTopBar && (navVariant === 'left' || !top ? Styles.layoutTopLight : Styles.layoutTopNav), {
159
169
  [Styles.layoutNavSlim]: !isMobile && hasSideBar && (state === null || state === void 0 ? void 0 : state.navCollapsed),
160
170
  [Styles.layoutNavWide]: !isMobile && hasSideBar && !(state === null || state === void 0 ? void 0 : state.navCollapsed)
161
171
  }, layoutClass),
162
172
  style: contentStyles,
163
173
  children: [
164
- view.isSequent && /*#__PURE__*/ _jsx("div", {
174
+ /*#__PURE__*/ _jsx("div", {
165
175
  className: Styles.topPlaceholder
166
176
  }),
167
177
  hasTopBar && (navVariant === 'left' ? /*#__PURE__*/ _jsx(LayoutHeader, {
@@ -202,6 +212,7 @@ const TitanLayoutComponent = ({ appearance = 'anvil2', navVariant = 'left', id,
202
212
  children: /*#__PURE__*/ _jsx(LayoutSidebar, {
203
213
  className: Styles.side,
204
214
  mobile: breakpoint.isMobile,
215
+ touchDevice: breakpoint.isTouchDevice,
205
216
  barExpanded: !(state === null || state === void 0 ? void 0 : state.navCollapsed),
206
217
  onBarExpandChange: onBarExpandChange,
207
218
  submenuExpanded: state === null || state === void 0 ? void 0 : state.submenuExpanded,
@@ -227,10 +238,10 @@ const TitanLayoutComponent = ({ appearance = 'anvil2', navVariant = 'left', id,
227
238
  }) : undefined
228
239
  })
229
240
  }),
230
- view.isSequent && /*#__PURE__*/ _jsx(TitanLayoutHeaderObserved, {
241
+ view.isAnvil2 ? /*#__PURE__*/ _jsx(TitanLayoutHeaderObserved, {
231
242
  heightChange: updateIndicatorsHeight,
232
243
  children: header
233
- }),
244
+ }) : view.isLegacy ? header : null,
234
245
  view.isAnvil1 ? /*#__PURE__*/ _jsx(LayoutContentAnvil1, {
235
246
  header: header,
236
247
  minWidth: limitContentWidth,
@@ -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 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 } from './layout-header';\nimport { LayoutHeaderDark } from './layout-header-dark';\nimport { TitanLayoutLogoProps } from './layout-logo';\nimport { LayoutSidebar } from './layout-sidebar';\nimport { TitanLayoutSidebarLink, TitanLayoutSidebarTrigger } from './layout-sidebar-links';\nimport { InternalSideNavigationTrigger } from './layout-sidebar-links-internal';\nimport { useNotificationsState } from './notifications-context';\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 state?: TitanLayoutState;\n onStateChange?: (state: TitanLayoutState) => void;\n\n header?: ReactElement;\n top?: ReactElement;\n sideTop?: ReactElement[];\n profile?: ReactElement;\n extraLinks?: ReactElement;\n extraLinksTop?: ReactElement;\n extraText?: string;\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\nconst TitanLayoutComponent: FC<TitanLayoutProps> = ({\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}) => {\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((e: MouseEvent) => {\n setMobileDrawerOpened(true);\n e.stopPropagation();\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) => {\n onStateChange?.({\n navCollapsed: state?.navCollapsed ?? false,\n submenuExpanded: expanded ? id : undefined,\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 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 hasNotifications={hasNotifications || hasMenuNotifications}\n onBurgerClick={onBurgerClick}\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 hasNotifications={hasNotifications || hasMenuNotifications}\n onBurgerClick={onBurgerClick}\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 submenuExpanded={state?.submenuExpanded}\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 submenuExpanded={undefined}\n tag={undefined}\n icon={undefined}\n iconActive={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: TitanLayoutSidebarLink,\n Trigger: TitanLayoutSidebarTrigger,\n});\n"],"names":["classNames","Fragment","useCallback","useEffect","useMemo","useRef","useState","DefaultNavLinkComponent","useTitanBreakpoint","LayoutContext","LayoutPlacementContext","LayoutHeader","LayoutHeaderDark","LayoutSidebar","TitanLayoutSidebarLink","TitanLayoutSidebarTrigger","InternalSideNavigationTrigger","useNotificationsState","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","stopPropagation","onBarExpandChange","expanded","navCollapsed","onSubmenuExpandChange","submenuExpanded","undefined","sidebarNavItems","hasMenuNotifications","some","item","counter","tag","value","submenu","groups","group","links","link","limitContentWidth","width","contentStyles","layoutClass","layoutLegacy","layoutAnvil1","layoutAnvil2","Provider","div","className","layout","layoutMobile","layoutDesktop","layoutTopLight","layoutTopNav","layoutNavSlim","layoutNavWide","style","topPlaceholder","variant","center","rightText","right","side","mobile","barExpanded","drawerOpened","onDrawerOpenChange","mainItems","bottom","title","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":"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"}
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 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 } from './layout-header';\nimport { LayoutHeaderDark } from './layout-header-dark';\nimport { TitanLayoutLogoProps } from './layout-logo';\nimport { LayoutSidebar } from './layout-sidebar';\nimport { TitanLayoutSidebarLink, TitanLayoutSidebarTrigger } from './layout-sidebar-links';\nimport { InternalSideNavigationTrigger } from './layout-sidebar-links-internal';\nimport { useNotificationsState } from './notifications-context';\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 state?: TitanLayoutState;\n onStateChange?: (state: TitanLayoutState) => void;\n\n header?: ReactElement;\n top?: ReactElement;\n sideTop?: ReactElement[];\n profile?: ReactElement;\n extraLinks?: ReactElement;\n extraLinksTop?: ReactElement;\n extraText?: string;\n minContentWidth?: number;\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\nconst TitanLayoutComponent: FC<TitanLayoutProps> = ({\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}) => {\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 [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((e: MouseEvent) => {\n setMobileDrawerOpened(true);\n e.stopPropagation();\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) => {\n onStateChange?.({\n navCollapsed: state?.navCollapsed ?? false,\n submenuExpanded: expanded ? id : undefined,\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 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 hasNotifications={hasNotifications || hasMenuNotifications}\n onBurgerClick={onBurgerClick}\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 hasNotifications={hasNotifications || hasMenuNotifications}\n onBurgerClick={onBurgerClick}\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 submenuExpanded={state?.submenuExpanded}\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 submenuExpanded={undefined}\n tag={undefined}\n icon={undefined}\n iconActive={undefined}\n />\n )}\n </Fragment>\n ) : undefined\n }\n />\n </NotificationsContextProvider>\n )}\n\n {view.isAnvil2 ? (\n <TitanLayoutHeaderObserved heightChange={updateIndicatorsHeight}>\n {header}\n </TitanLayoutHeaderObserved>\n ) : view.isLegacy ? (\n header\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 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: TitanLayoutSidebarLink,\n Trigger: TitanLayoutSidebarTrigger,\n});\n"],"names":["classNames","Fragment","useCallback","useEffect","useMemo","useRef","useState","DefaultNavLinkComponent","useTitanBreakpoint","LayoutContext","LayoutPlacementContext","LayoutHeader","LayoutHeaderDark","LayoutSidebar","TitanLayoutSidebarLink","TitanLayoutSidebarTrigger","InternalSideNavigationTrigger","useNotificationsState","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","offsetTopStyles","setOffsetTopStyles","updateIndicatorsHeight","offset","isMobile","hasSideBar","length","hasTopBar","bodyClassName","body","classList","add","remove","onBurgerClick","e","stopPropagation","onBarExpandChange","expanded","navCollapsed","onSubmenuExpandChange","submenuExpanded","undefined","sidebarNavItems","hasMenuNotifications","some","item","counter","tag","value","submenu","groups","group","links","link","limitContentWidth","width","contentStyles","layoutClass","layoutLegacy","layoutAnvil1","layoutAnvil2","Provider","div","className","layout","layoutMobile","layoutDesktop","layoutNoResponsive","layoutTopLight","layoutTopNav","layoutNavSlim","layoutNavWide","style","topPlaceholder","variant","center","rightText","right","side","mobile","touchDevice","isTouchDevice","barExpanded","drawerOpened","onDrawerOpenChange","mainItems","bottom","title","icon","iconActive","TitanLayoutHeaderObserved","heightChange","LayoutContentAnvil1","minWidth","LayoutContentLegacy","ref","current","updatePosition","pos","getBoundingClientRect","height","observer","ResizeObserver","observe","disconnect","contentHeader","data-cy","TitanLayoutHeader","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": "12.0.4-canary.267.7c06c0a.0",
3
+ "version": "12.0.4-canary.267.f428d7e.0",
4
4
  "description": "Navigation components",
5
5
  "repository": {
6
6
  "type": "git",
@@ -42,5 +42,5 @@
42
42
  "less": true,
43
43
  "webpack": false
44
44
  },
45
- "gitHead": "7c06c0adba0f7075bd19bd8c41cfc03443bd2d8d"
45
+ "gitHead": "f428d7e5a0d6bc0bada217a0fc595aefc155fa8e"
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
  });
@@ -537,3 +537,7 @@
537
537
  background-color: @bg-color-hover;
538
538
  }
539
539
  }
540
+
541
+ .pointer-events-none {
542
+ pointer-events: none;
543
+ }
@@ -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;
@@ -35,6 +35,7 @@ export interface LayoutSidebarProps {
35
35
  submenuExpanded: string | undefined;
36
36
  drawerOpened: boolean;
37
37
  mobile: boolean;
38
+ touchDevice: boolean;
38
39
  navigationComponent: FC<NavLinkComponentProps>;
39
40
  onBarExpandChange(expanded: boolean): void;
40
41
  onDrawerOpenChange(expanded: boolean): void;
@@ -44,6 +45,7 @@ export interface LayoutSidebarProps {
44
45
  export const LayoutSidebar: FC<LayoutSidebarProps> = ({
45
46
  className,
46
47
  mobile,
48
+ touchDevice,
47
49
  barExpanded,
48
50
  submenuExpanded,
49
51
  drawerOpened,
@@ -99,6 +101,7 @@ export const LayoutSidebar: FC<LayoutSidebarProps> = ({
99
101
  submenuExpanded={!!item.id && submenuExpanded === item.id}
100
102
  onSubmenuExpand={onSubmenuExpandChange}
101
103
  navigationComponent={navigationComponent}
104
+ touchDevice={touchDevice}
102
105
  {...item}
103
106
  />
104
107
  ) : (
@@ -173,11 +176,12 @@ const SideNavigationOptionsToggle: FC<{
173
176
  const SideNavigationGroupItem: FC<
174
177
  NavigationItemData & {
175
178
  navigationComponent: FC<NavLinkComponentProps>;
179
+ touchDevice: boolean;
176
180
  barExpanded: boolean;
177
181
  submenuExpanded: boolean;
178
182
  onSubmenuExpand: undefined | ((id: string, expanded: boolean) => void);
179
183
  }
180
- > = ({ onSubmenuExpand, barExpanded, submenuExpanded, ...props }) => {
184
+ > = ({ onSubmenuExpand, barExpanded, submenuExpanded, touchDevice, ...props }) => {
181
185
  const onExpandToggle = useCallback(
182
186
  (e: MouseEvent<never>) => {
183
187
  e.preventDefault();
@@ -211,12 +215,16 @@ const SideNavigationGroupItem: FC<
211
215
  />
212
216
  </InternalSideNavigationGroup>
213
217
  ) : (
214
- <Popover placement="right-start" openOnHover delay={500}>
218
+ <Popover placement="right-start" openOnHover={!touchDevice} delay={500}>
215
219
  <Popover.Trigger>
216
220
  {(triggerProps: any) => (
217
221
  <div {...triggerProps}>
218
222
  <InternalSideNavigationLink
219
223
  {...props}
224
+ className={classNames(
225
+ props.className,
226
+ touchDevice && Styles.pointerEventsNone
227
+ )}
220
228
  submenuExpanded={undefined}
221
229
  tag={tag}
222
230
  />
@@ -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;
@@ -67,6 +67,7 @@ export type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children'
67
67
  extraLinksTop?: ReactElement;
68
68
  extraText?: string;
69
69
  minContentWidth?: number;
70
+ noResponsive?: boolean;
70
71
  };
71
72
 
72
73
  const defaultSidebarContext: TitanLayoutSidebarContextType = {
@@ -92,6 +93,18 @@ const useAppearance = (appearance: TitanLayoutProps['appearance']) =>
92
93
  };
93
94
  }, [appearance]);
94
95
 
96
+ export const useViewportConfigs = (noResponsive?: boolean) => {
97
+ useEffect(() => {
98
+ const meta: HTMLMetaElement | null = document.head.querySelector('meta[name="viewport"]');
99
+
100
+ if (meta) {
101
+ meta.content = noResponsive
102
+ ? ''
103
+ : 'width=device-width, initial-scale=1, maximum-scale=1';
104
+ }
105
+ }, [noResponsive]);
106
+ };
107
+
95
108
  const TitanLayoutComponent: FC<TitanLayoutProps> = ({
96
109
  appearance = 'anvil2',
97
110
  navVariant = 'left',
@@ -111,9 +124,10 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
111
124
  extraLinksTop,
112
125
  extraText,
113
126
  minContentWidth,
127
+ noResponsive,
114
128
  sideTop,
115
129
  }) => {
116
- const breakpoint = useTitanBreakpoint();
130
+ const breakpoint = useTitanBreakpoint(noResponsive);
117
131
  const context: TitanLayoutContextType = useMemo(
118
132
  () => ({
119
133
  NavigationComponent: navigationComponent ?? DefaultNavLinkComponent,
@@ -233,6 +247,7 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
233
247
  className={classNames(
234
248
  Styles.layout,
235
249
  isMobile ? Styles.layoutMobile : Styles.layoutDesktop,
250
+ noResponsive && Styles.layoutNoResponsive,
236
251
  hasTopBar &&
237
252
  (navVariant === 'left' || !top
238
253
  ? Styles.layoutTopLight
@@ -245,7 +260,7 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
245
260
  )}
246
261
  style={contentStyles}
247
262
  >
248
- {view.isSequent && <div className={Styles.topPlaceholder} />}
263
+ <div className={Styles.topPlaceholder} />
249
264
  {hasTopBar &&
250
265
  (navVariant === 'left' ? (
251
266
  <LayoutHeader
@@ -291,6 +306,7 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
291
306
  <LayoutSidebar
292
307
  className={Styles.side}
293
308
  mobile={breakpoint.isMobile}
309
+ touchDevice={breakpoint.isTouchDevice}
294
310
  barExpanded={!state?.navCollapsed}
295
311
  onBarExpandChange={onBarExpandChange}
296
312
  submenuExpanded={state?.submenuExpanded}
@@ -322,11 +338,13 @@ const TitanLayoutComponent: FC<TitanLayoutProps> = ({
322
338
  </NotificationsContextProvider>
323
339
  )}
324
340
 
325
- {view.isSequent && (
341
+ {view.isAnvil2 ? (
326
342
  <TitanLayoutHeaderObserved heightChange={updateIndicatorsHeight}>
327
343
  {header}
328
344
  </TitanLayoutHeaderObserved>
329
- )}
345
+ ) : view.isLegacy ? (
346
+ header
347
+ ) : null}
330
348
  {view.isAnvil1 ? (
331
349
  <LayoutContentAnvil1 header={header} minWidth={limitContentWidth}>
332
350
  {children}
@@ -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
  };