@servicetitan/navigation 13.0.0-canary.256.b93dc10.0 → 13.0.1
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.
- package/dist/components/titan-layout/interface.d.ts +5 -0
- package/dist/components/titan-layout/interface.d.ts.map +1 -1
- package/dist/components/titan-layout/interface.js.map +1 -1
- package/dist/components/titan-layout/layout-header.module.less +18 -0
- package/dist/components/titan-layout/layout-profile.d.ts.map +1 -1
- package/dist/components/titan-layout/layout-profile.js +2 -3
- package/dist/components/titan-layout/layout-profile.js.map +1 -1
- package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts +1 -1
- package/dist/components/titan-layout/layout-sidebar-links-internal.d.ts.map +1 -1
- package/dist/components/titan-layout/layout-sidebar-links-internal.js +36 -27
- package/dist/components/titan-layout/layout-sidebar-links-internal.js.map +1 -1
- package/dist/components/titan-layout/layout-sidebar.d.ts +1 -1
- package/dist/components/titan-layout/layout-sidebar.d.ts.map +1 -1
- package/dist/components/titan-layout/layout-sidebar.js +3 -14
- package/dist/components/titan-layout/layout-sidebar.js.map +1 -1
- package/dist/components/titan-layout/layout-sidebar.module.less +18 -29
- package/dist/components/titan-layout/titan-layout-default.stories.d.ts +1 -0
- package/dist/components/titan-layout/titan-layout-default.stories.d.ts.map +1 -1
- package/dist/components/titan-layout/titan-layout.d.ts +25 -0
- package/dist/components/titan-layout/titan-layout.d.ts.map +1 -1
- package/dist/components/titan-layout/titan-layout.js +2 -2
- package/dist/components/titan-layout/titan-layout.js.map +1 -1
- package/dist/utils/navigation.d.ts +1 -2
- package/dist/utils/navigation.d.ts.map +1 -1
- package/dist/utils/navigation.js.map +1 -1
- package/package.json +2 -2
- package/src/components/titan-layout/interface.ts +5 -0
- package/src/components/titan-layout/layout-header.module.less +18 -0
- package/src/components/titan-layout/layout-profile.tsx +3 -4
- package/src/components/titan-layout/layout-sidebar-links-internal.tsx +43 -33
- package/src/components/titan-layout/layout-sidebar.module.less +18 -29
- package/src/components/titan-layout/layout-sidebar.tsx +5 -24
- package/src/components/titan-layout/titan-layout-default.stories.tsx +17 -1
- package/src/components/titan-layout/titan-layout.tsx +34 -2
- package/src/utils/navigation.ts +1 -3
|
@@ -20,15 +20,40 @@ export type TitanLayoutProps = Omit<ComponentPropsWithoutRef<'div'>, 'children'
|
|
|
20
20
|
navigationOverflowItems?: NavigationItemData[];
|
|
21
21
|
/** logo props */
|
|
22
22
|
logo?: TitanLayoutLogoProps;
|
|
23
|
+
/** layout state */
|
|
23
24
|
state?: TitanLayoutState;
|
|
25
|
+
/** layout state change handler */
|
|
24
26
|
onStateChange?: (state: TitanLayoutState) => void;
|
|
27
|
+
/** content header content */
|
|
25
28
|
header?: ReactElement;
|
|
29
|
+
/** layout header content (center) */
|
|
26
30
|
top?: ReactElement;
|
|
31
|
+
/** top links for side navigation */
|
|
27
32
|
sideTop?: ReactElement[];
|
|
33
|
+
/**
|
|
34
|
+
* profile element for layout
|
|
35
|
+
* @see ProfileDropdown
|
|
36
|
+
*/
|
|
28
37
|
profile?: ReactElement;
|
|
38
|
+
/**
|
|
39
|
+
* extra links for layout header
|
|
40
|
+
* shown in side nav footer on mobile
|
|
41
|
+
*/
|
|
29
42
|
extraLinks?: ReactElement;
|
|
43
|
+
/**
|
|
44
|
+
* fixed extra links for layout header
|
|
45
|
+
* shown in header on mobile as well
|
|
46
|
+
*/
|
|
30
47
|
extraLinksTop?: ReactElement;
|
|
48
|
+
/**
|
|
49
|
+
* text shown in layout's header
|
|
50
|
+
* shown in side nav footer on mobile
|
|
51
|
+
*/
|
|
31
52
|
extraText?: string;
|
|
53
|
+
/**
|
|
54
|
+
* minimal width set for content area
|
|
55
|
+
* used for pages that aren't adopted to mobile
|
|
56
|
+
*/
|
|
32
57
|
minContentWidth?: number;
|
|
33
58
|
};
|
|
34
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;
|
|
@@ -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,KAAK,CAAC,EAAE,gBAAgB,CAAC;IACzB,aAAa,CAAC,EAAE,CAAC,KAAK,EAAE,gBAAgB,KAAK,IAAI,CAAC;IAElD,MAAM,CAAC,EAAE,YAAY,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;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,2CAsQlB;AA6FD,eAAO,MAAM,WAAW;;;CAGtB,CAAC"}
|
|
@@ -90,12 +90,12 @@ function TitanLayoutComponent({ appearance = 'anvil2', navVariant = 'left', id,
|
|
|
90
90
|
onStateChange,
|
|
91
91
|
isMobile
|
|
92
92
|
]);
|
|
93
|
-
const onSubmenuExpandChange = useCallback((id, expanded)=>{
|
|
93
|
+
const onSubmenuExpandChange = useCallback((id, expanded, force)=>{
|
|
94
94
|
var _state_navCollapsed, _state_submenusExpanded;
|
|
95
95
|
onStateChange === null || onStateChange === void 0 ? void 0 : onStateChange({
|
|
96
96
|
navCollapsed: (_state_navCollapsed = state === null || state === void 0 ? void 0 : state.navCollapsed) !== null && _state_navCollapsed !== void 0 ? _state_navCollapsed : false,
|
|
97
97
|
submenusExpanded: [
|
|
98
|
-
...((_state_submenusExpanded = state === null || state === void 0 ? void 0 : state.submenusExpanded) !== null && _state_submenusExpanded !== void 0 ? _state_submenusExpanded : []).filter((i)=>i !== id),
|
|
98
|
+
...force ? [] : ((_state_submenusExpanded = state === null || state === void 0 ? void 0 : state.submenusExpanded) !== null && _state_submenusExpanded !== void 0 ? _state_submenusExpanded : []).filter((i)=>i !== id),
|
|
99
99
|
...expanded ? [
|
|
100
100
|
id
|
|
101
101
|
] : []
|
|
@@ -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 } 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 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\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) => {\n onStateChange?.({\n navCollapsed: state?.navCollapsed ?? false,\n submenusExpanded: [\n ...(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 offsetTopStyles;\n }\n\n if (view.isLegacy) {\n return {\n ...(limitContentWidth\n ? { display: 'flex', flexDirection: 'column', minHeight: '100vh' }\n : {}),\n ...offsetTopStyles,\n };\n }\n }, [view, offsetTopStyles, limitContentWidth]);\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={\n isMobile && (hasNotifications || hasMenuNotifications)\n }\n hasBurger={hasSideBar}\n burgerTooltip={\n isMobile\n ? undefined\n : state?.navCollapsed\n ? 'Expand'\n : 'Collapse'\n }\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 hasBurger={isMobile}\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 (\n <div className={minWidth ? 'of-x-auto flex-basis-0 flex-grow-1' : undefined}>\n <div style={minWidth ? innerContentStyles : undefined}>{children}</div>\n </div>\n );\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","submenusExpanded","filter","i","sidebarNavItems","undefined","hasMenuNotifications","some","item","counter","tag","value","submenu","groups","group","links","link","limitContentWidth","width","contentStyles","display","flexDirection","minHeight","layoutClass","layoutLegacy","layoutAnvil1","layoutAnvil2","Provider","div","className","layout","layoutMobile","layoutDesktop","layoutTopLight","layoutTopNav","layoutNavSlim","layoutNavWide","style","topPlaceholder","variant","center","rightText","right","hasBurger","burgerTooltip","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":"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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 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 } 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) {\n return offsetTopStyles;\n }\n\n if (view.isLegacy) {\n return {\n ...(limitContentWidth\n ? { display: 'flex', flexDirection: 'column', minHeight: '100vh' }\n : {}),\n ...offsetTopStyles,\n };\n }\n }, [view, offsetTopStyles, limitContentWidth]);\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={\n isMobile && (hasNotifications || hasMenuNotifications)\n }\n hasBurger={hasSideBar}\n burgerTooltip={\n isMobile\n ? undefined\n : state?.navCollapsed\n ? 'Expand'\n : 'Collapse'\n }\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 hasBurger={isMobile}\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 (\n <div className={minWidth ? 'of-x-auto flex-basis-0 flex-grow-1' : undefined}>\n <div style={minWidth ? innerContentStyles : undefined}>{children}</div>\n </div>\n );\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","display","flexDirection","minHeight","layoutClass","layoutLegacy","layoutAnvil1","layoutAnvil2","Provider","div","className","layout","layoutMobile","layoutDesktop","layoutTopLight","layoutTopNav","layoutNavSlim","layoutNavWide","style","topPlaceholder","variant","center","rightText","right","hasBurger","burgerTooltip","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":"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"}
|
|
@@ -12,8 +12,6 @@ export interface NavigationItemData extends NavigationLinkData {
|
|
|
12
12
|
className?: string;
|
|
13
13
|
/** optional submenu of link item */
|
|
14
14
|
submenu?: NavigationSubmenuData;
|
|
15
|
-
iconClassName?: never;
|
|
16
|
-
iconComponent?: never;
|
|
17
15
|
}
|
|
18
16
|
export interface NavigationLinkData {
|
|
19
17
|
/** link id */
|
|
@@ -32,6 +30,7 @@ export interface NavigationSubmenuData {
|
|
|
32
30
|
export interface NavigationSubmenuItemData extends NavigationLinkData {
|
|
33
31
|
/** item tag (optional) value. shown if it is set and true or greater than 0 */
|
|
34
32
|
counter?: CounterTagValue;
|
|
33
|
+
/** item tag (optional) value. shown if value is true or greater than 0 */
|
|
35
34
|
tag?: CounterTagData;
|
|
36
35
|
}
|
|
37
36
|
export interface NavigationSubmenuGroupData {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/utils/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC1D,yCAAyC;IACzC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAEnC,uCAAuC;IACvC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAEzC,yEAAyE;IACzE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,cAAc,CAAC;IAErB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,oCAAoC;IACpC,OAAO,CAAC,EAAE,qBAAqB,CAAC;
|
|
1
|
+
{"version":3,"file":"navigation.d.ts","sourceRoot":"","sources":["../../src/utils/navigation.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,sBAAsB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAEhE,MAAM,WAAW,kBAAmB,SAAQ,kBAAkB;IAC1D,yCAAyC;IACzC,IAAI,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAEnC,uCAAuC;IACvC,UAAU,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG,SAAS,CAAC;IAEzC,yEAAyE;IACzE,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,GAAG,CAAC,EAAE,cAAc,CAAC;IAErB,8BAA8B;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB,oCAAoC;IACpC,OAAO,CAAC,EAAE,qBAAqB,CAAC;CACnC;AAED,MAAM,WAAW,kBAAkB;IAC/B,cAAc;IACd,EAAE,EAAE,MAAM,CAAC;IAEX,gBAAgB;IAChB,EAAE,EAAE,MAAM,CAAC;IAEX,iBAAiB;IACjB,KAAK,EAAE,MAAM,CAAC;IAEd,+FAA+F;IAC/F,QAAQ,CAAC,EAAE,OAAO,GAAG,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC;CACxD;AAED,MAAM,WAAW,qBAAqB;IAClC,qBAAqB;IACrB,MAAM,EAAE,0BAA0B,EAAE,CAAC;CACxC;AAED,MAAM,WAAW,yBAA0B,SAAQ,kBAAkB;IACjE,+EAA+E;IAC/E,OAAO,CAAC,EAAE,eAAe,CAAC;IAC1B,0EAA0E;IAC1E,GAAG,CAAC,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,WAAW,0BAA0B;IACvC,0BAA0B;IAC1B,KAAK,EAAE,MAAM,CAAC;IAEd,0BAA0B;IAC1B,KAAK,EAAE,yBAAyB,EAAE,CAAC;CACtC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/utils/navigation.ts"],"sourcesContent":["import { IconProps } from '@servicetitan/anvil2';\nimport { CounterTagData, CounterTagValue } from './counter-tag';\n\nexport interface NavigationItemData extends NavigationLinkData {\n /** svg icon (anvil2) of inactive item */\n icon: IconProps['svg'] | undefined;\n\n /** svg icon (anvil2) of active item */\n iconActive: IconProps['svg'] | undefined;\n\n /** item tag (optional). shown if it is set and true or greater than 0 */\n counter?: CounterTagValue;\n tag?: CounterTagData;\n\n /** class name of link item */\n className?: string;\n\n /** optional submenu of link item */\n submenu?: NavigationSubmenuData;\n
|
|
1
|
+
{"version":3,"sources":["../../src/utils/navigation.ts"],"sourcesContent":["import { IconProps } from '@servicetitan/anvil2';\nimport { CounterTagData, CounterTagValue } from './counter-tag';\n\nexport interface NavigationItemData extends NavigationLinkData {\n /** svg icon (anvil2) of inactive item */\n icon: IconProps['svg'] | undefined;\n\n /** svg icon (anvil2) of active item */\n iconActive: IconProps['svg'] | undefined;\n\n /** item tag (optional). shown if it is set and true or greater than 0 */\n counter?: CounterTagValue;\n tag?: CounterTagData;\n\n /** class name of link item */\n className?: string;\n\n /** optional submenu of link item */\n submenu?: NavigationSubmenuData;\n}\n\nexport interface NavigationLinkData {\n /** link id */\n id: string;\n\n /** link href */\n to: string;\n\n /** link title */\n title: string;\n\n /** callback to return active state. By default, it compares link href with current pathname */\n isActive?: boolean | ((pathname: string) => boolean);\n}\n\nexport interface NavigationSubmenuData {\n /** submenu groups */\n groups: NavigationSubmenuGroupData[];\n}\n\nexport interface NavigationSubmenuItemData extends NavigationLinkData {\n /** item tag (optional) value. shown if it is set and true or greater than 0 */\n counter?: CounterTagValue;\n /** item tag (optional) value. shown if value is true or greater than 0 */\n tag?: CounterTagData;\n}\n\nexport interface NavigationSubmenuGroupData {\n /** submenu group title */\n title: string;\n\n /** submenu group links */\n links: NavigationSubmenuItemData[];\n}\n"],"names":[],"mappings":"AA+CA,WAMC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/navigation",
|
|
3
|
-
"version": "13.0.
|
|
3
|
+
"version": "13.0.1",
|
|
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": "
|
|
45
|
+
"gitHead": "3b872c501643de94f998d2260cc2d384132b2b89"
|
|
46
46
|
}
|
|
@@ -12,16 +12,21 @@ export interface TitanLayoutLinkWrapperProps {
|
|
|
12
12
|
export type TitanLayoutLinkWrapper = FC<TitanLayoutLinkWrapperProps>;
|
|
13
13
|
|
|
14
14
|
export interface TitanLayoutState {
|
|
15
|
+
/** flags if side nav is collapsed */
|
|
15
16
|
navCollapsed: boolean;
|
|
17
|
+
/** ;ost expanded submenu ids */
|
|
16
18
|
submenusExpanded?: string[];
|
|
17
19
|
}
|
|
18
20
|
|
|
19
21
|
export interface TitanLayoutLinkExtraProps {
|
|
22
|
+
/** link's title should be shown (for extra links we show icon only by default) */
|
|
20
23
|
showTitle?: boolean;
|
|
24
|
+
/** link is flashing */
|
|
21
25
|
flashing?: boolean;
|
|
22
26
|
}
|
|
23
27
|
|
|
24
28
|
export interface TitanLayoutLinkSideProps {
|
|
29
|
+
/** counter value used only for side links */
|
|
25
30
|
counter: CounterTagValue;
|
|
26
31
|
}
|
|
27
32
|
|
|
@@ -113,6 +113,24 @@
|
|
|
113
113
|
margin-right: @spacing-2;
|
|
114
114
|
max-width: 400px;
|
|
115
115
|
}
|
|
116
|
+
|
|
117
|
+
.burger {
|
|
118
|
+
width: 64px;
|
|
119
|
+
display: flex;
|
|
120
|
+
flex-direction: row;
|
|
121
|
+
justify-content: center;
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
.header-light.header-desktop {
|
|
126
|
+
.he-top-left {
|
|
127
|
+
.logo-company-wrapper {
|
|
128
|
+
padding-left: @spacing-0 !important;
|
|
129
|
+
}
|
|
130
|
+
.logo-short-wrapper {
|
|
131
|
+
padding-left: @spacing-half !important;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
116
134
|
}
|
|
117
135
|
|
|
118
136
|
// desktop stacked header
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import SvgAccountActive from '@servicetitan/anvil2/assets/icons/st/gnav_account_active.svg';
|
|
2
2
|
import SvgAccountInactive from '@servicetitan/anvil2/assets/icons/st/gnav_account_inactive.svg';
|
|
3
3
|
|
|
4
|
-
import { FC,
|
|
4
|
+
import { FC, useEffect, useState } from 'react';
|
|
5
5
|
import { NavLinkComponentProps } from '../../utils/navigation-context';
|
|
6
6
|
import { getCounterTag } from '../../utils/side-nav';
|
|
7
7
|
import {
|
|
@@ -63,8 +63,7 @@ const MobileProfileDropdown: FC<ProfileDropdownProps & NavigationComponentProps>
|
|
|
63
63
|
const [expanded, setExpanded] = useState(false);
|
|
64
64
|
const { hasNotifications, NotificationsContextProvider } = useNotificationsState();
|
|
65
65
|
const { onNotificationsUpdate } = useNotificationsContext();
|
|
66
|
-
const onExpandToggle = (
|
|
67
|
-
e.stopPropagation();
|
|
66
|
+
const onExpandToggle = () => {
|
|
68
67
|
setExpanded(!expanded);
|
|
69
68
|
};
|
|
70
69
|
|
|
@@ -84,7 +83,7 @@ const MobileProfileDropdown: FC<ProfileDropdownProps & NavigationComponentProps>
|
|
|
84
83
|
className={className}
|
|
85
84
|
{...rest}
|
|
86
85
|
submenuExpanded={expanded}
|
|
87
|
-
|
|
86
|
+
onSubmenuExpand={onExpandToggle}
|
|
88
87
|
onClick={onExpandToggle}
|
|
89
88
|
tag={{ value: hasNotifications }}
|
|
90
89
|
>
|
|
@@ -244,7 +244,7 @@ export const InternalSideNavigationGroup: FC<
|
|
|
244
244
|
children: ReactNode;
|
|
245
245
|
submenuExpanded: boolean;
|
|
246
246
|
onClick?: (e: MouseEvent<never>) => void;
|
|
247
|
-
|
|
247
|
+
onSubmenuExpand(id: string, expanded: boolean, force: boolean): void;
|
|
248
248
|
}
|
|
249
249
|
> = ({
|
|
250
250
|
id,
|
|
@@ -258,46 +258,56 @@ export const InternalSideNavigationGroup: FC<
|
|
|
258
258
|
|
|
259
259
|
children,
|
|
260
260
|
submenuExpanded,
|
|
261
|
-
|
|
261
|
+
onSubmenuExpand,
|
|
262
262
|
onClick,
|
|
263
263
|
navigationComponent,
|
|
264
264
|
...rest
|
|
265
265
|
}) => {
|
|
266
|
-
const
|
|
267
|
-
if (
|
|
268
|
-
|
|
266
|
+
const onRootClick = (e: MouseEvent<never>) => {
|
|
267
|
+
if (submenuExpanded) {
|
|
268
|
+
onSubmenuExpand(id, true, true);
|
|
269
|
+
} else {
|
|
270
|
+
onSubmenuExpand(id, true, false);
|
|
269
271
|
e.preventDefault();
|
|
270
272
|
e.stopPropagation();
|
|
271
273
|
}
|
|
272
274
|
};
|
|
275
|
+
const onToggleClick = (e: MouseEvent<never>) => {
|
|
276
|
+
onSubmenuExpand(id, !submenuExpanded, false);
|
|
277
|
+
e.preventDefault();
|
|
278
|
+
e.stopPropagation();
|
|
279
|
+
};
|
|
280
|
+
|
|
273
281
|
return (
|
|
274
282
|
<div className={classNames(Styles.navGroupWrapper)}>
|
|
275
|
-
<div className={Styles.navGroupItem}
|
|
276
|
-
{
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
283
|
+
<div className={Styles.navGroupItem}>
|
|
284
|
+
<div onClick={onRootClick}>
|
|
285
|
+
{to ? (
|
|
286
|
+
<InternalSideNavigationLink
|
|
287
|
+
id={id}
|
|
288
|
+
to={to}
|
|
289
|
+
title={title}
|
|
290
|
+
isActive={isActive}
|
|
291
|
+
icon={icon}
|
|
292
|
+
iconActive={iconActive}
|
|
293
|
+
tag={tag}
|
|
294
|
+
className={className}
|
|
295
|
+
{...rest}
|
|
296
|
+
navigationComponent={navigationComponent}
|
|
297
|
+
/>
|
|
298
|
+
) : (
|
|
299
|
+
<InternalSideNavigationTrigger
|
|
300
|
+
id={id}
|
|
301
|
+
title={title}
|
|
302
|
+
isActive={isActive === true || undefined}
|
|
303
|
+
icon={icon}
|
|
304
|
+
iconActive={iconActive}
|
|
305
|
+
tag={tag}
|
|
306
|
+
className={className}
|
|
307
|
+
{...rest}
|
|
308
|
+
/>
|
|
309
|
+
)}
|
|
310
|
+
</div>
|
|
301
311
|
|
|
302
312
|
<div className={Styles.navItemGroupToggleWrapper}>
|
|
303
313
|
{withTooltip(
|
|
@@ -306,11 +316,11 @@ export const InternalSideNavigationGroup: FC<
|
|
|
306
316
|
size="small"
|
|
307
317
|
icon={submenuExpanded ? SvgGroupCollapse : SvgGroupExpand}
|
|
308
318
|
className={Styles.navItemGroupToggle}
|
|
309
|
-
onClick={
|
|
319
|
+
onClick={onToggleClick}
|
|
310
320
|
aria-label="Toggle submenu"
|
|
311
321
|
data-cy="nav-item-group-expand"
|
|
312
322
|
/>,
|
|
313
|
-
'View Submenu',
|
|
323
|
+
submenuExpanded ? 'Hide Submenu' : 'View Submenu',
|
|
314
324
|
{ placement: 'top-end' }
|
|
315
325
|
)}
|
|
316
326
|
</div>
|
|
@@ -47,11 +47,11 @@
|
|
|
47
47
|
}
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
-
.nav-item {
|
|
51
|
-
margin-bottom: @spacing-half;
|
|
52
|
-
}
|
|
53
50
|
.nav-top {
|
|
54
|
-
|
|
51
|
+
.divider {
|
|
52
|
+
margin-top: 10px;
|
|
53
|
+
margin-bottom: @spacing-half;
|
|
54
|
+
}
|
|
55
55
|
}
|
|
56
56
|
.nav-bottom {
|
|
57
57
|
.divider {
|
|
@@ -134,10 +134,7 @@
|
|
|
134
134
|
width: 64px;
|
|
135
135
|
overflow-x: hidden;
|
|
136
136
|
padding-top: @spacing-1;
|
|
137
|
-
|
|
138
|
-
&:not(:first-child) {
|
|
139
|
-
margin-top: @spacing-half;
|
|
140
|
-
}
|
|
137
|
+
margin-top: @spacing-half;
|
|
141
138
|
|
|
142
139
|
.nav-item-counter[data-anv][data-anv] {
|
|
143
140
|
position: absolute;
|
|
@@ -171,8 +168,13 @@
|
|
|
171
168
|
}
|
|
172
169
|
}
|
|
173
170
|
|
|
174
|
-
.nav-
|
|
175
|
-
|
|
171
|
+
.nav-main {
|
|
172
|
+
padding-top: @spacing-half;
|
|
173
|
+
}
|
|
174
|
+
.nav-top {
|
|
175
|
+
.divider {
|
|
176
|
+
margin-top: 12px;
|
|
177
|
+
}
|
|
176
178
|
}
|
|
177
179
|
}
|
|
178
180
|
|
|
@@ -185,28 +187,15 @@
|
|
|
185
187
|
margin-right: @spacing-1;
|
|
186
188
|
}
|
|
187
189
|
|
|
188
|
-
.
|
|
189
|
-
.
|
|
190
|
-
margin:
|
|
191
|
-
|
|
192
|
-
.toggle-icon-wrapper {
|
|
193
|
-
padding-left: @spacing-half;
|
|
194
|
-
padding-right: @spacing-half;
|
|
195
|
-
}
|
|
196
|
-
|
|
197
|
-
.toggle-text {
|
|
198
|
-
padding-left: @spacing-0 !important;
|
|
199
|
-
}
|
|
190
|
+
.nav-top {
|
|
191
|
+
.divider {
|
|
192
|
+
margin-top: 10px;
|
|
193
|
+
margin-bottom: 6px;
|
|
200
194
|
}
|
|
201
195
|
}
|
|
202
196
|
|
|
203
|
-
.nav-top .divider {
|
|
204
|
-
margin-top: @spacing-half;
|
|
205
|
-
margin-bottom: @spacing-1;
|
|
206
|
-
}
|
|
207
|
-
|
|
208
197
|
.nav-main {
|
|
209
|
-
padding-top:
|
|
198
|
+
padding-top: 12px;
|
|
210
199
|
}
|
|
211
200
|
|
|
212
201
|
.nav-group-item {
|
|
@@ -232,7 +221,7 @@
|
|
|
232
221
|
.nav-wide {
|
|
233
222
|
.nav-item {
|
|
234
223
|
flex-direction: row;
|
|
235
|
-
margin-
|
|
224
|
+
margin-top: @spacing-half;
|
|
236
225
|
|
|
237
226
|
.nav-item-icon-wrapper {
|
|
238
227
|
flex: 1;
|
|
@@ -1,15 +1,7 @@
|
|
|
1
1
|
import { Icon, Popover, Text, ThemeProvider } from '@servicetitan/anvil2';
|
|
2
2
|
import SvgClose from '@servicetitan/anvil2/assets/icons/material/round/close.svg';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
|
-
import {
|
|
5
|
-
Children,
|
|
6
|
-
FC,
|
|
7
|
-
Fragment,
|
|
8
|
-
MouseEvent,
|
|
9
|
-
ReactElement,
|
|
10
|
-
isValidElement,
|
|
11
|
-
useCallback,
|
|
12
|
-
} from 'react';
|
|
4
|
+
import { Children, FC, Fragment, ReactElement, isValidElement } from 'react';
|
|
13
5
|
import { NavigationItemData, NavigationSubmenuData } from '../../utils/navigation';
|
|
14
6
|
import { NavLinkComponentProps } from '../../utils/navigation-context';
|
|
15
7
|
import { getCounterTag, getSubmenuGroupTag } from '../../utils/side-nav';
|
|
@@ -34,7 +26,7 @@ export interface LayoutSidebarProps {
|
|
|
34
26
|
navigationComponent: FC<NavLinkComponentProps>;
|
|
35
27
|
onBarExpandChange(expanded: boolean): void;
|
|
36
28
|
onDrawerOpenChange(expanded: boolean): void;
|
|
37
|
-
onSubmenuExpandChange(id: string, expanded: boolean): void;
|
|
29
|
+
onSubmenuExpandChange(id: string, expanded: boolean, force: boolean): void;
|
|
38
30
|
}
|
|
39
31
|
|
|
40
32
|
export const LayoutSidebar: FC<LayoutSidebarProps> = ({
|
|
@@ -133,19 +125,8 @@ const SideNavigationGroupItem: FC<{
|
|
|
133
125
|
navigationComponent: FC<NavLinkComponentProps>;
|
|
134
126
|
barExpanded: boolean;
|
|
135
127
|
submenuExpanded: boolean;
|
|
136
|
-
onSubmenuExpand:
|
|
128
|
+
onSubmenuExpand: (id: string, expanded: boolean, force: boolean) => void;
|
|
137
129
|
}> = ({ item, onSubmenuExpand, barExpanded, submenuExpanded, navigationComponent }) => {
|
|
138
|
-
const onExpandToggle = useCallback(
|
|
139
|
-
(e: MouseEvent<never>) => {
|
|
140
|
-
e.preventDefault();
|
|
141
|
-
e.stopPropagation();
|
|
142
|
-
|
|
143
|
-
if (item.id) {
|
|
144
|
-
onSubmenuExpand?.(item.id, !submenuExpanded);
|
|
145
|
-
}
|
|
146
|
-
},
|
|
147
|
-
[item.id, submenuExpanded, onSubmenuExpand]
|
|
148
|
-
);
|
|
149
130
|
const {
|
|
150
131
|
sidebar: {
|
|
151
132
|
styles: { popoverContent },
|
|
@@ -165,7 +146,7 @@ const SideNavigationGroupItem: FC<{
|
|
|
165
146
|
className={item.className}
|
|
166
147
|
tag={tag}
|
|
167
148
|
submenuExpanded={submenuExpanded}
|
|
168
|
-
|
|
149
|
+
onSubmenuExpand={onSubmenuExpand}
|
|
169
150
|
navigationComponent={navigationComponent}
|
|
170
151
|
>
|
|
171
152
|
<SideNavigationGroupContent
|
|
@@ -175,7 +156,7 @@ const SideNavigationGroupItem: FC<{
|
|
|
175
156
|
/>
|
|
176
157
|
</InternalSideNavigationGroup>
|
|
177
158
|
) : (
|
|
178
|
-
<Popover placement="right-start" openOnHover delay={
|
|
159
|
+
<Popover placement="right-start" openOnHover delay={300}>
|
|
179
160
|
<Popover.Trigger>
|
|
180
161
|
{(triggerProps: any) => (
|
|
181
162
|
<div {...triggerProps}>
|
|
@@ -162,7 +162,6 @@ const SideLinkPopoverWrapper: TitanLayoutLinkWrapper = ({ children, context }) =
|
|
|
162
162
|
|
|
163
163
|
const sidebarTop = () => [
|
|
164
164
|
<TitanLayout.Link key="tasks" {...navItems.tasks} />,
|
|
165
|
-
<TitanLayout.Link key="calls" {...navItems.calls} />,
|
|
166
165
|
<TitanLayout.Trigger
|
|
167
166
|
key="marketing"
|
|
168
167
|
{...navItems.marketing}
|
|
@@ -170,6 +169,7 @@ const sidebarTop = () => [
|
|
|
170
169
|
wrapper={SideLinkPopoverWrapper}
|
|
171
170
|
counter={50}
|
|
172
171
|
/>,
|
|
172
|
+
<TitanLayout.Link key="calls" {...navItems.calls} />,
|
|
173
173
|
];
|
|
174
174
|
const ContentHeader = () => {
|
|
175
175
|
const [longInfo, setLongInfo] = useState(false);
|
|
@@ -350,6 +350,22 @@ export const ContentAnvil2 = (args: LayoutContentArgs) => (
|
|
|
350
350
|
</TitanLayout>
|
|
351
351
|
);
|
|
352
352
|
|
|
353
|
+
export const CustomNavigation = (args: LayoutContentArgs) => (
|
|
354
|
+
<TitanLayout
|
|
355
|
+
{...useLayoutProps(args)}
|
|
356
|
+
appearance="anvil1"
|
|
357
|
+
{...useDefaultLayoutProps()}
|
|
358
|
+
logo={{
|
|
359
|
+
title: 'Commercial',
|
|
360
|
+
mantleFill: '#2270EE',
|
|
361
|
+
}}
|
|
362
|
+
>
|
|
363
|
+
<Anvil1Page>
|
|
364
|
+
<Content {...args} />
|
|
365
|
+
</Anvil1Page>
|
|
366
|
+
</TitanLayout>
|
|
367
|
+
);
|
|
368
|
+
|
|
353
369
|
export const ExtraWithTitle = (args: LayoutContentArgs) => (
|
|
354
370
|
<TitanLayout
|
|
355
371
|
{...useLayoutProps(args)}
|