@servicetitan/navigation 2.3.0 → 2.4.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.
- package/dist/components/side-navigation/side-navigation.d.ts +9 -1
- package/dist/components/side-navigation/side-navigation.d.ts.map +1 -1
- package/dist/components/side-navigation/side-navigation.js +8 -7
- package/dist/components/side-navigation/side-navigation.js.map +1 -1
- package/dist/components/side-navigation/side-navigation.module.less +67 -11
- package/dist/components/side-navigation/side-navigation.stories.d.ts +1 -1
- package/dist/components/side-navigation/side-navigation.stories.d.ts.map +1 -1
- package/dist/components/side-navigation/side-navigation.stories.js +18 -14
- package/dist/components/side-navigation/side-navigation.stories.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/utils/with-tooltip.d.ts +2 -1
- package/dist/utils/with-tooltip.d.ts.map +1 -1
- package/dist/utils/with-tooltip.js +1 -1
- package/dist/utils/with-tooltip.js.map +1 -1
- package/package.json +2 -2
- package/src/components/side-navigation/side-navigation.module.less +67 -11
- package/src/components/side-navigation/side-navigation.module.less.d.ts +4 -0
- package/src/components/side-navigation/side-navigation.stories.tsx +25 -20
- package/src/components/side-navigation/side-navigation.tsx +57 -32
- package/src/index.ts +1 -0
- package/src/utils/with-tooltip.tsx +7 -3
|
@@ -7,10 +7,18 @@ export interface SideNavigationProps {
|
|
|
7
7
|
id?: string;
|
|
8
8
|
/** main navigation items */
|
|
9
9
|
items?: HeaderNavigationItemData[];
|
|
10
|
+
/** is menu expanded */
|
|
11
|
+
expanded?: boolean;
|
|
10
12
|
/** navigation component used for routing */
|
|
11
13
|
navigationComponent?: FC<NavLinkComponentProps>;
|
|
14
|
+
/** expand change handler */
|
|
15
|
+
onExpandChange?(expanded: boolean): void;
|
|
12
16
|
}
|
|
13
17
|
export declare const SideNavigation: FC<SideNavigationProps>;
|
|
18
|
+
interface SideNavigationItemProps extends HeaderNavigationItemData {
|
|
19
|
+
expanded?: boolean;
|
|
20
|
+
}
|
|
14
21
|
/** Side Navigation menu item */
|
|
15
|
-
export declare const SideNavigationItem: FC<
|
|
22
|
+
export declare const SideNavigationItem: FC<SideNavigationItemProps>;
|
|
23
|
+
export {};
|
|
16
24
|
//# sourceMappingURL=side-navigation.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side-navigation.d.ts","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"side-navigation.d.ts","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.tsx"],"names":[],"mappings":"AAEA,OAAO,EAAE,EAAE,EAAE,MAAM,OAAO,CAAC;AAC3B,OAAO,EAAE,wBAAwB,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAUzF,MAAM,WAAW,mBAAmB;IAChC,2BAA2B;IAC3B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,mBAAmB;IACnB,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,4BAA4B;IAC5B,KAAK,CAAC,EAAE,wBAAwB,EAAE,CAAC;IACnC,uBAAuB;IACvB,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;IAChD,4BAA4B;IAC5B,cAAc,CAAC,CAAC,QAAQ,EAAE,OAAO,GAAG,IAAI,CAAC;CAC5C;AAED,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAqClD,CAAC;AAEF,UAAU,uBAAwB,SAAQ,wBAAwB;IAC9D,QAAQ,CAAC,EAAE,OAAO,CAAC;CACtB;AAED,gCAAgC;AAChC,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,uBAAuB,CA6C1D,CAAC"}
|
|
@@ -1,18 +1,19 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
-
import {
|
|
2
|
+
import { Button, Icon } from '@servicetitan/design-system';
|
|
3
3
|
import classNames from 'classnames';
|
|
4
4
|
import { DefaultNavLinkComponent, NavLinkContext, useNavLink, } from '../../utils/navigation-context';
|
|
5
|
+
import { withTooltip } from '../../utils/with-tooltip';
|
|
5
6
|
import { CounterTag } from '../counter-tag';
|
|
6
7
|
import * as Styles from './side-navigation.module.less';
|
|
7
|
-
export const SideNavigation = ({ className, id, items, navigationComponent = DefaultNavLinkComponent, }) => {
|
|
8
|
-
return (_jsx(NavLinkContext.Provider, { value: navigationComponent, children:
|
|
8
|
+
export const SideNavigation = ({ className, expanded, id, items, navigationComponent = DefaultNavLinkComponent, onExpandChange, }) => {
|
|
9
|
+
return (_jsx(NavLinkContext.Provider, { value: navigationComponent, children: _jsxs("div", { className: classNames(Styles.sideNav, expanded ? Styles.sideNavExpanded : Styles.sideNavCollapsed, className), id: id, "data-cy": "side-navigation", children: [_jsx("div", { className: Styles.sideNavTop, children: _jsx(Button, { iconName: "keyboard_tab", fill: "subtle", onClick: () => onExpandChange === null || onExpandChange === void 0 ? void 0 : onExpandChange(!expanded), "aria-label": expanded ? 'Collapse menu' : 'Expand menu', children: expanded ? 'Collapse menu' : undefined }) }), _jsx("div", { className: Styles.sideNavContent, children: items === null || items === void 0 ? void 0 : items.map(item => (_jsx(SideNavigationItem, Object.assign({ expanded: expanded }, item), item.id))) })] }) }));
|
|
9
10
|
};
|
|
10
11
|
/** Side Navigation menu item */
|
|
11
|
-
export const SideNavigationItem = ({ id, to, title, hint, counter, className, iconClassName, iconComponent: IconComponent, iconName, isActive, }) => {
|
|
12
|
+
export const SideNavigationItem = ({ id, to, title, hint, counter, className, iconClassName, iconComponent: IconComponent, iconName, isActive, expanded, }) => {
|
|
12
13
|
const NavigationComponent = useNavLink();
|
|
13
14
|
const iconClass = classNames(Styles.navigationIcon, iconClassName);
|
|
14
|
-
return (
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
return withTooltip(_jsxs(NavigationComponent, { "data-cy": `navigation-item-${id}`, "data-pendo": `navigation-item-${id}`, to: to, title: hint, className: classNames(Styles.navigationItem, className, {
|
|
16
|
+
[Styles.navigationItemActive]: isActive === true,
|
|
17
|
+
}), isActive: typeof isActive === 'function' ? isActive : undefined, activeClassName: Styles.navigationItemActive, children: [IconComponent ? (_jsx("i", { className: iconClass, children: _jsx(IconComponent, {}) })) : iconName ? (_jsx(Icon, { name: iconName, className: iconClass })) : (_jsx("i", { className: iconClass })), !!expanded && _jsx("span", { className: Styles.navigationItemText, children: title }), !!counter && _jsx(CounterTag, { data: counter, className: Styles.navigationItemCounter })] }, id), expanded ? undefined : title, 'r');
|
|
17
18
|
};
|
|
18
19
|
//# sourceMappingURL=side-navigation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side-navigation.js","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"side-navigation.js","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.tsx"],"names":[],"mappings":"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"}
|
|
@@ -2,18 +2,67 @@
|
|
|
2
2
|
@import (reference) '@servicetitan/tokens/core/tokens.less';
|
|
3
3
|
|
|
4
4
|
.side-nav {
|
|
5
|
-
width: 56px;
|
|
6
5
|
display: flex;
|
|
7
6
|
flex-direction: column;
|
|
8
|
-
align-items:
|
|
7
|
+
align-items: stretch;
|
|
8
|
+
|
|
9
|
+
-webkit-transition: width 100ms ease-in-out;
|
|
10
|
+
-moz-transition: width 100ms ease-in-out;
|
|
11
|
+
-o-transition: width 100ms ease-in-out;
|
|
12
|
+
transition: width 100ms ease-in-out;
|
|
9
13
|
|
|
10
14
|
background-color: #ebebeb;
|
|
11
15
|
border-right: 1px solid #c5c5cb;
|
|
12
16
|
|
|
17
|
+
.side-nav-top {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: row;
|
|
20
|
+
align-items: center;
|
|
21
|
+
height: 56px;
|
|
22
|
+
border-bottom: 1px solid #c5c5cb;
|
|
23
|
+
padding-left: @spacing-1;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&.side-nav-collapsed {
|
|
27
|
+
width: 56px;
|
|
28
|
+
|
|
29
|
+
.navigation-item-counter {
|
|
30
|
+
position: absolute;
|
|
31
|
+
right: -7px;
|
|
32
|
+
top: -2px;
|
|
33
|
+
z-index: auto;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&.side-nav-expanded {
|
|
38
|
+
width: 240px;
|
|
39
|
+
|
|
40
|
+
.side-nav-top :global(.Button) {
|
|
41
|
+
padding: @spacing-1 !important;
|
|
42
|
+
border-radius: 12px;
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
|
|
45
|
+
:global(.Button__content) {
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
white-space: nowrap;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:global(.Button__icon) {
|
|
51
|
+
font-size: 24px;
|
|
52
|
+
padding-left: @spacing-0;
|
|
53
|
+
padding-right: @spacing-1;
|
|
54
|
+
|
|
55
|
+
svg {
|
|
56
|
+
transform: rotateY(180deg);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
13
62
|
.side-nav-content {
|
|
14
63
|
display: flex;
|
|
15
64
|
flex-direction: column;
|
|
16
|
-
align-items:
|
|
65
|
+
align-items: stretch;
|
|
17
66
|
overflow-y: auto;
|
|
18
67
|
margin-top: @spacing-1;
|
|
19
68
|
margin-bottom: @spacing-1;
|
|
@@ -21,20 +70,23 @@
|
|
|
21
70
|
}
|
|
22
71
|
|
|
23
72
|
.navigation-item {
|
|
24
|
-
width: 56px;
|
|
25
73
|
font-family: @base-font-family;
|
|
26
74
|
color: #383838;
|
|
27
75
|
position: relative;
|
|
28
76
|
display: flex;
|
|
29
|
-
justify-content:
|
|
77
|
+
justify-content: flex-start;
|
|
78
|
+
align-items: center;
|
|
30
79
|
flex-wrap: nowrap;
|
|
31
80
|
text-wrap: nowrap;
|
|
32
81
|
|
|
33
|
-
padding
|
|
34
|
-
|
|
82
|
+
padding: @spacing-1;
|
|
83
|
+
margin-left: @spacing-1;
|
|
84
|
+
margin-right: @spacing-1;
|
|
85
|
+
border-radius: 12px;
|
|
35
86
|
|
|
36
87
|
&.navigation-item-active {
|
|
37
|
-
color: @color-
|
|
88
|
+
color: @color-white !important;
|
|
89
|
+
background-color: @color-neutral-500;
|
|
38
90
|
}
|
|
39
91
|
|
|
40
92
|
&:hover:not(.navigation-item-active) {
|
|
@@ -44,9 +96,13 @@
|
|
|
44
96
|
.navigation-item-counter {
|
|
45
97
|
color: @color-white;
|
|
46
98
|
font-weight: @font-weight-semibold;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.navigation-item-text {
|
|
102
|
+
font-family: @base-font-family;
|
|
103
|
+
font-size: @typescale-3;
|
|
104
|
+
padding-left: @spacing-2;
|
|
105
|
+
flex: 1;
|
|
50
106
|
}
|
|
51
107
|
}
|
|
52
108
|
|
|
@@ -6,5 +6,5 @@ declare const _default: {
|
|
|
6
6
|
parameters: {};
|
|
7
7
|
};
|
|
8
8
|
export default _default;
|
|
9
|
-
export declare const
|
|
9
|
+
export declare const DefaultSideNavigation: () => import("react/jsx-runtime").JSX.Element;
|
|
10
10
|
//# sourceMappingURL=side-navigation.stories.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side-navigation.stories.d.ts","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,EAAE,
|
|
1
|
+
{"version":3,"file":"side-navigation.stories.d.ts","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.stories.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,EAAE,EAAY,MAAM,OAAO,CAAC;;;;;;;AAYpD,wBAKE;AAkDF,eAAO,MAAM,qBAAqB,+CAyBjC,CAAC"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
2
3
|
import { SideNavigation } from './';
|
|
3
4
|
const layout = (Story) => {
|
|
4
5
|
return (_jsxs("div", { className: "d-f border", style: { height: '800px' }, children: [_jsx(Story, {}), _jsx("div", { className: "flex-grow-1 flex-basis-0" })] }));
|
|
@@ -30,18 +31,21 @@ const items = {
|
|
|
30
31
|
const NavLinkMock = props => (_jsx("a", { href: props.to, target: props.target, onClick: e => {
|
|
31
32
|
e.preventDefault();
|
|
32
33
|
}, className: props.className, children: props.children }));
|
|
33
|
-
export const
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
34
|
+
export const DefaultSideNavigation = () => {
|
|
35
|
+
const [expanded, setExpanded] = useState(false);
|
|
36
|
+
return (_jsx(SideNavigation, { navigationComponent: NavLinkMock, expanded: expanded, onExpandChange: setExpanded, items: [
|
|
37
|
+
items.dashboard,
|
|
38
|
+
items.calendar,
|
|
39
|
+
items.calls,
|
|
40
|
+
items.accounting,
|
|
41
|
+
items.dispatch,
|
|
42
|
+
items.fleet,
|
|
43
|
+
items.followUps,
|
|
44
|
+
items.inventory,
|
|
45
|
+
items.marketing,
|
|
46
|
+
items.priceBook,
|
|
47
|
+
items.pointOfSale,
|
|
48
|
+
items.reports,
|
|
49
|
+
] }));
|
|
50
|
+
};
|
|
47
51
|
//# sourceMappingURL=side-navigation.stories.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"side-navigation.stories.js","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.stories.tsx"],"names":[],"mappings":";
|
|
1
|
+
{"version":3,"file":"side-navigation.stories.js","sourceRoot":"","sources":["../../../src/components/side-navigation/side-navigation.stories.tsx"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -4,6 +4,7 @@ export * from './components/logo/logo-company-title';
|
|
|
4
4
|
export * from './components/logo/logo-titan';
|
|
5
5
|
export * from './components/logo/logo-titan-text';
|
|
6
6
|
export * from './components/counter-tag';
|
|
7
|
+
export * from './components/side-navigation';
|
|
7
8
|
export * from './utils/navigation';
|
|
8
9
|
export * from './utils/with-tooltip';
|
|
9
10
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -4,6 +4,7 @@ export * from './components/logo/logo-company-title';
|
|
|
4
4
|
export * from './components/logo/logo-titan';
|
|
5
5
|
export * from './components/logo/logo-titan-text';
|
|
6
6
|
export * from './components/counter-tag';
|
|
7
|
+
export * from './components/side-navigation';
|
|
7
8
|
export * from './utils/navigation';
|
|
8
9
|
export * from './utils/with-tooltip';
|
|
9
10
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,gCAAgC,CAAC;AAC/C,cAAc,gDAAgD,CAAC;AAC/D,cAAc,sCAAsC,CAAC;AACrD,cAAc,8BAA8B,CAAC;AAC7C,cAAc,mCAAmC,CAAC;AAClD,cAAc,0BAA0B,CAAC;AACzC,cAAc,8BAA8B,CAAC;AAC7C,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { TooltipPropsStrict } from '@servicetitan/design-system';
|
|
1
2
|
import { ReactNode } from 'react';
|
|
2
|
-
export declare const withTooltip: (element: ReactNode, tooltip?:
|
|
3
|
+
export declare const withTooltip: (element: ReactNode, tooltip: string | undefined, direction?: TooltipPropsStrict['direction']) => string | number | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | null | undefined;
|
|
3
4
|
//# sourceMappingURL=with-tooltip.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-tooltip.d.ts","sourceRoot":"","sources":["../../src/utils/with-tooltip.tsx"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"with-tooltip.d.ts","sourceRoot":"","sources":["../../src/utils/with-tooltip.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAW,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,eAAO,MAAM,WAAW,YACX,SAAS,WACT,MAAM,GAAG,SAAS,cAChB,kBAAkB,CAAC,WAAW,CAAC,iHAQzC,CAAC"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
2
2
|
import { Tooltip } from '@servicetitan/design-system';
|
|
3
|
-
export const withTooltip = (element, tooltip) => tooltip ? (_jsx(Tooltip, { el: "div", direction:
|
|
3
|
+
export const withTooltip = (element, tooltip, direction = 'b') => tooltip ? (_jsx(Tooltip, { el: "div", direction: direction, text: tooltip, children: element })) : (element);
|
|
4
4
|
//# sourceMappingURL=with-tooltip.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"with-tooltip.js","sourceRoot":"","sources":["../../src/utils/with-tooltip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"with-tooltip.js","sourceRoot":"","sources":["../../src/utils/with-tooltip.tsx"],"names":[],"mappings":";AAAA,OAAO,EAAE,OAAO,EAAsB,MAAM,6BAA6B,CAAC;AAG1E,MAAM,CAAC,MAAM,WAAW,GAAG,CACvB,OAAkB,EAClB,OAA2B,EAC3B,YAA6C,GAAG,EAClD,EAAE,CACA,OAAO,CAAC,CAAC,CAAC,CACN,KAAC,OAAO,IAAC,EAAE,EAAC,KAAK,EAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,OAAO,YAChD,OAAO,GACF,CACb,CAAC,CAAC,CAAC,CACA,OAAO,CACV,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@servicetitan/navigation",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.4.0",
|
|
4
4
|
"description": "Navigation components",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"less": true,
|
|
44
44
|
"webpack": false
|
|
45
45
|
},
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "8d8d1f7a55d4d68408a728079821bd0745ce5c68"
|
|
47
47
|
}
|
|
@@ -2,18 +2,67 @@
|
|
|
2
2
|
@import (reference) '@servicetitan/tokens/core/tokens.less';
|
|
3
3
|
|
|
4
4
|
.side-nav {
|
|
5
|
-
width: 56px;
|
|
6
5
|
display: flex;
|
|
7
6
|
flex-direction: column;
|
|
8
|
-
align-items:
|
|
7
|
+
align-items: stretch;
|
|
8
|
+
|
|
9
|
+
-webkit-transition: width 100ms ease-in-out;
|
|
10
|
+
-moz-transition: width 100ms ease-in-out;
|
|
11
|
+
-o-transition: width 100ms ease-in-out;
|
|
12
|
+
transition: width 100ms ease-in-out;
|
|
9
13
|
|
|
10
14
|
background-color: #ebebeb;
|
|
11
15
|
border-right: 1px solid #c5c5cb;
|
|
12
16
|
|
|
17
|
+
.side-nav-top {
|
|
18
|
+
display: flex;
|
|
19
|
+
flex-direction: row;
|
|
20
|
+
align-items: center;
|
|
21
|
+
height: 56px;
|
|
22
|
+
border-bottom: 1px solid #c5c5cb;
|
|
23
|
+
padding-left: @spacing-1;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&.side-nav-collapsed {
|
|
27
|
+
width: 56px;
|
|
28
|
+
|
|
29
|
+
.navigation-item-counter {
|
|
30
|
+
position: absolute;
|
|
31
|
+
right: -7px;
|
|
32
|
+
top: -2px;
|
|
33
|
+
z-index: auto;
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&.side-nav-expanded {
|
|
38
|
+
width: 240px;
|
|
39
|
+
|
|
40
|
+
.side-nav-top :global(.Button) {
|
|
41
|
+
padding: @spacing-1 !important;
|
|
42
|
+
border-radius: 12px;
|
|
43
|
+
cursor: pointer;
|
|
44
|
+
|
|
45
|
+
:global(.Button__content) {
|
|
46
|
+
overflow: hidden;
|
|
47
|
+
white-space: nowrap;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
:global(.Button__icon) {
|
|
51
|
+
font-size: 24px;
|
|
52
|
+
padding-left: @spacing-0;
|
|
53
|
+
padding-right: @spacing-1;
|
|
54
|
+
|
|
55
|
+
svg {
|
|
56
|
+
transform: rotateY(180deg);
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
13
62
|
.side-nav-content {
|
|
14
63
|
display: flex;
|
|
15
64
|
flex-direction: column;
|
|
16
|
-
align-items:
|
|
65
|
+
align-items: stretch;
|
|
17
66
|
overflow-y: auto;
|
|
18
67
|
margin-top: @spacing-1;
|
|
19
68
|
margin-bottom: @spacing-1;
|
|
@@ -21,20 +70,23 @@
|
|
|
21
70
|
}
|
|
22
71
|
|
|
23
72
|
.navigation-item {
|
|
24
|
-
width: 56px;
|
|
25
73
|
font-family: @base-font-family;
|
|
26
74
|
color: #383838;
|
|
27
75
|
position: relative;
|
|
28
76
|
display: flex;
|
|
29
|
-
justify-content:
|
|
77
|
+
justify-content: flex-start;
|
|
78
|
+
align-items: center;
|
|
30
79
|
flex-wrap: nowrap;
|
|
31
80
|
text-wrap: nowrap;
|
|
32
81
|
|
|
33
|
-
padding
|
|
34
|
-
|
|
82
|
+
padding: @spacing-1;
|
|
83
|
+
margin-left: @spacing-1;
|
|
84
|
+
margin-right: @spacing-1;
|
|
85
|
+
border-radius: 12px;
|
|
35
86
|
|
|
36
87
|
&.navigation-item-active {
|
|
37
|
-
color: @color-
|
|
88
|
+
color: @color-white !important;
|
|
89
|
+
background-color: @color-neutral-500;
|
|
38
90
|
}
|
|
39
91
|
|
|
40
92
|
&:hover:not(.navigation-item-active) {
|
|
@@ -44,9 +96,13 @@
|
|
|
44
96
|
.navigation-item-counter {
|
|
45
97
|
color: @color-white;
|
|
46
98
|
font-weight: @font-weight-semibold;
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
.navigation-item-text {
|
|
102
|
+
font-family: @base-font-family;
|
|
103
|
+
font-size: @typescale-3;
|
|
104
|
+
padding-left: @spacing-2;
|
|
105
|
+
flex: 1;
|
|
50
106
|
}
|
|
51
107
|
}
|
|
52
108
|
|
|
@@ -3,6 +3,10 @@ export const navigationIcon: string;
|
|
|
3
3
|
export const navigationItem: string;
|
|
4
4
|
export const navigationItemActive: string;
|
|
5
5
|
export const navigationItemCounter: string;
|
|
6
|
+
export const navigationItemText: string;
|
|
6
7
|
export const sideNav: string;
|
|
8
|
+
export const sideNavCollapsed: string;
|
|
7
9
|
export const sideNavContent: string;
|
|
10
|
+
export const sideNavExpanded: string;
|
|
11
|
+
export const sideNavTop: string;
|
|
8
12
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { ComponentType, FC } from 'react';
|
|
1
|
+
import { ComponentType, FC, useState } from 'react';
|
|
2
2
|
import { HeaderNavigationItemData, NavLinkComponentProps } from '../../utils/navigation';
|
|
3
3
|
import { SideNavigation } from './';
|
|
4
4
|
|
|
@@ -65,24 +65,29 @@ const NavLinkMock: FC<NavLinkComponentProps> = props => (
|
|
|
65
65
|
</a>
|
|
66
66
|
);
|
|
67
67
|
|
|
68
|
-
export const
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
items
|
|
76
|
-
|
|
68
|
+
export const DefaultSideNavigation = () => {
|
|
69
|
+
const [expanded, setExpanded] = useState(false);
|
|
70
|
+
return (
|
|
71
|
+
<SideNavigation
|
|
72
|
+
navigationComponent={NavLinkMock}
|
|
73
|
+
expanded={expanded}
|
|
74
|
+
onExpandChange={setExpanded}
|
|
75
|
+
items={[
|
|
76
|
+
items.dashboard,
|
|
77
|
+
items.calendar,
|
|
78
|
+
items.calls,
|
|
79
|
+
items.accounting,
|
|
80
|
+
items.dispatch,
|
|
77
81
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
82
|
+
items.fleet,
|
|
83
|
+
items.followUps,
|
|
84
|
+
items.inventory,
|
|
81
85
|
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
);
|
|
86
|
+
items.marketing,
|
|
87
|
+
items.priceBook,
|
|
88
|
+
items.pointOfSale,
|
|
89
|
+
items.reports,
|
|
90
|
+
]}
|
|
91
|
+
/>
|
|
92
|
+
);
|
|
93
|
+
};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { Button, Icon } from '@servicetitan/design-system';
|
|
2
2
|
import classNames from 'classnames';
|
|
3
3
|
import { FC } from 'react';
|
|
4
4
|
import { HeaderNavigationItemData, NavLinkComponentProps } from '../../utils/navigation';
|
|
@@ -7,6 +7,7 @@ import {
|
|
|
7
7
|
NavLinkContext,
|
|
8
8
|
useNavLink,
|
|
9
9
|
} from '../../utils/navigation-context';
|
|
10
|
+
import { withTooltip } from '../../utils/with-tooltip';
|
|
10
11
|
import { CounterTag } from '../counter-tag';
|
|
11
12
|
import * as Styles from './side-navigation.module.less';
|
|
12
13
|
|
|
@@ -17,26 +18,46 @@ export interface SideNavigationProps {
|
|
|
17
18
|
id?: string;
|
|
18
19
|
/** main navigation items */
|
|
19
20
|
items?: HeaderNavigationItemData[];
|
|
21
|
+
/** is menu expanded */
|
|
22
|
+
expanded?: boolean;
|
|
20
23
|
/** navigation component used for routing */
|
|
21
24
|
navigationComponent?: FC<NavLinkComponentProps>;
|
|
25
|
+
/** expand change handler */
|
|
26
|
+
onExpandChange?(expanded: boolean): void;
|
|
22
27
|
}
|
|
23
28
|
|
|
24
29
|
export const SideNavigation: FC<SideNavigationProps> = ({
|
|
25
30
|
className,
|
|
31
|
+
expanded,
|
|
26
32
|
id,
|
|
27
33
|
items,
|
|
28
34
|
navigationComponent = DefaultNavLinkComponent,
|
|
35
|
+
onExpandChange,
|
|
29
36
|
}) => {
|
|
30
37
|
return (
|
|
31
38
|
<NavLinkContext.Provider value={navigationComponent}>
|
|
32
39
|
<div
|
|
33
|
-
className={classNames(
|
|
40
|
+
className={classNames(
|
|
41
|
+
Styles.sideNav,
|
|
42
|
+
expanded ? Styles.sideNavExpanded : Styles.sideNavCollapsed,
|
|
43
|
+
className
|
|
44
|
+
)}
|
|
34
45
|
id={id}
|
|
35
46
|
data-cy="side-navigation"
|
|
36
47
|
>
|
|
48
|
+
<div className={Styles.sideNavTop}>
|
|
49
|
+
<Button
|
|
50
|
+
iconName="keyboard_tab"
|
|
51
|
+
fill="subtle"
|
|
52
|
+
onClick={() => onExpandChange?.(!expanded)}
|
|
53
|
+
aria-label={expanded ? 'Collapse menu' : 'Expand menu'}
|
|
54
|
+
>
|
|
55
|
+
{expanded ? 'Collapse menu' : undefined}
|
|
56
|
+
</Button>
|
|
57
|
+
</div>
|
|
37
58
|
<div className={Styles.sideNavContent}>
|
|
38
59
|
{items?.map(item => (
|
|
39
|
-
<SideNavigationItem key={item.id} {...item} />
|
|
60
|
+
<SideNavigationItem key={item.id} expanded={expanded} {...item} />
|
|
40
61
|
))}
|
|
41
62
|
</div>
|
|
42
63
|
</div>
|
|
@@ -44,8 +65,12 @@ export const SideNavigation: FC<SideNavigationProps> = ({
|
|
|
44
65
|
);
|
|
45
66
|
};
|
|
46
67
|
|
|
68
|
+
interface SideNavigationItemProps extends HeaderNavigationItemData {
|
|
69
|
+
expanded?: boolean;
|
|
70
|
+
}
|
|
71
|
+
|
|
47
72
|
/** Side Navigation menu item */
|
|
48
|
-
export const SideNavigationItem: FC<
|
|
73
|
+
export const SideNavigationItem: FC<SideNavigationItemProps> = ({
|
|
49
74
|
id,
|
|
50
75
|
to,
|
|
51
76
|
title,
|
|
@@ -56,38 +81,38 @@ export const SideNavigationItem: FC<HeaderNavigationItemData> = ({
|
|
|
56
81
|
iconComponent: IconComponent,
|
|
57
82
|
iconName,
|
|
58
83
|
isActive,
|
|
84
|
+
expanded,
|
|
59
85
|
}) => {
|
|
60
86
|
const NavigationComponent = useNavLink();
|
|
61
87
|
const iconClass = classNames(Styles.navigationIcon, iconClassName);
|
|
62
88
|
|
|
63
|
-
return (
|
|
64
|
-
<
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
{
|
|
78
|
-
<
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
)}
|
|
89
|
+
return withTooltip(
|
|
90
|
+
<NavigationComponent
|
|
91
|
+
data-cy={`navigation-item-${id}`}
|
|
92
|
+
data-pendo={`navigation-item-${id}`}
|
|
93
|
+
key={id}
|
|
94
|
+
to={to}
|
|
95
|
+
title={hint}
|
|
96
|
+
className={classNames(Styles.navigationItem, className, {
|
|
97
|
+
[Styles.navigationItemActive]: isActive === true,
|
|
98
|
+
})}
|
|
99
|
+
isActive={typeof isActive === 'function' ? isActive : undefined}
|
|
100
|
+
activeClassName={Styles.navigationItemActive}
|
|
101
|
+
>
|
|
102
|
+
{IconComponent ? (
|
|
103
|
+
<i className={iconClass}>
|
|
104
|
+
<IconComponent />
|
|
105
|
+
</i>
|
|
106
|
+
) : iconName ? (
|
|
107
|
+
<Icon name={iconName} className={iconClass} />
|
|
108
|
+
) : (
|
|
109
|
+
<i className={iconClass} />
|
|
110
|
+
)}
|
|
86
111
|
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
112
|
+
{!!expanded && <span className={Styles.navigationItemText}>{title}</span>}
|
|
113
|
+
{!!counter && <CounterTag data={counter} className={Styles.navigationItemCounter} />}
|
|
114
|
+
</NavigationComponent>,
|
|
115
|
+
expanded ? undefined : title,
|
|
116
|
+
'r'
|
|
92
117
|
);
|
|
93
118
|
};
|
package/src/index.ts
CHANGED
|
@@ -4,5 +4,6 @@ export * from './components/logo/logo-company-title';
|
|
|
4
4
|
export * from './components/logo/logo-titan';
|
|
5
5
|
export * from './components/logo/logo-titan-text';
|
|
6
6
|
export * from './components/counter-tag';
|
|
7
|
+
export * from './components/side-navigation';
|
|
7
8
|
export * from './utils/navigation';
|
|
8
9
|
export * from './utils/with-tooltip';
|
|
@@ -1,9 +1,13 @@
|
|
|
1
|
-
import { Tooltip } from '@servicetitan/design-system';
|
|
1
|
+
import { Tooltip, TooltipPropsStrict } from '@servicetitan/design-system';
|
|
2
2
|
import { ReactNode } from 'react';
|
|
3
3
|
|
|
4
|
-
export const withTooltip = (
|
|
4
|
+
export const withTooltip = (
|
|
5
|
+
element: ReactNode,
|
|
6
|
+
tooltip: string | undefined,
|
|
7
|
+
direction: TooltipPropsStrict['direction'] = 'b'
|
|
8
|
+
) =>
|
|
5
9
|
tooltip ? (
|
|
6
|
-
<Tooltip el="div" direction=
|
|
10
|
+
<Tooltip el="div" direction={direction} text={tooltip}>
|
|
7
11
|
{element}
|
|
8
12
|
</Tooltip>
|
|
9
13
|
) : (
|