@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.
@@ -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<HeaderNavigationItemData>;
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;AASzF,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,4CAA4C;IAC5C,mBAAmB,CAAC,EAAE,EAAE,CAAC,qBAAqB,CAAC,CAAC;CACnD;AAED,eAAO,MAAM,cAAc,EAAE,EAAE,CAAC,mBAAmB,CAqBlD,CAAC;AAEF,gCAAgC;AAChC,eAAO,MAAM,kBAAkB,EAAE,EAAE,CAAC,wBAAwB,CA6C3D,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 { Icon, Tooltip } from '@servicetitan/design-system';
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: _jsx("div", { className: classNames(Styles.sideNav, className), id: id, "data-cy": "side-navigation", children: _jsx("div", { className: Styles.sideNavContent, children: items === null || items === void 0 ? void 0 : items.map(item => (_jsx(SideNavigationItem, Object.assign({}, item), item.id))) }) }) }));
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 (_jsx(Tooltip, { el: "div", direction: "r", text: title, children: _jsxs(NavigationComponent, { "data-cy": `navigation-item-${id}`, "data-pendo": `navigation-item-${id}`, to: to, title: hint, className: classNames(Styles.navigationItem, className, {
15
- [Styles.navigationItemActive]: isActive === true,
16
- }), 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 })), !!counter && (_jsx(CounterTag, { data: counter, className: Styles.navigationItemCounter }))] }, id) }));
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,IAAI,EAAE,OAAO,EAAE,MAAM,6BAA6B,CAAC;AAC5D,OAAO,UAAU,MAAM,YAAY,CAAC;AAGpC,OAAO,EACH,uBAAuB,EACvB,cAAc,EACd,UAAU,GACb,MAAM,gCAAgC,CAAC;AACxC,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,KAAK,MAAM,MAAM,+BAA+B,CAAC;AAaxD,MAAM,CAAC,MAAM,cAAc,GAA4B,CAAC,EACpD,SAAS,EACT,EAAE,EACF,KAAK,EACL,mBAAmB,GAAG,uBAAuB,GAChD,EAAE,EAAE;IACD,OAAO,CACH,KAAC,cAAc,CAAC,QAAQ,IAAC,KAAK,EAAE,mBAAmB,YAC/C,cACI,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,OAAO,EAAE,SAAS,CAAC,EAChD,EAAE,EAAE,EAAE,aACE,iBAAiB,YAEzB,cAAK,SAAS,EAAE,MAAM,CAAC,cAAc,YAChC,KAAK,aAAL,KAAK,uBAAL,KAAK,CAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAChB,KAAC,kBAAkB,oBAAmB,IAAI,GAAjB,IAAI,CAAC,EAAE,CAAc,CACjD,CAAC,GACA,GACJ,GACgB,CAC7B,CAAC;AACN,CAAC,CAAC;AAEF,gCAAgC;AAChC,MAAM,CAAC,MAAM,kBAAkB,GAAiC,CAAC,EAC7D,EAAE,EACF,EAAE,EACF,KAAK,EACL,IAAI,EACJ,OAAO,EACP,SAAS,EACT,aAAa,EACb,aAAa,EAAE,aAAa,EAC5B,QAAQ,EACR,QAAQ,GACX,EAAE,EAAE;IACD,MAAM,mBAAmB,GAAG,UAAU,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,aAAa,CAAC,CAAC;IAEnE,OAAO,CACH,KAAC,OAAO,IAAC,EAAE,EAAC,KAAK,EAAC,SAAS,EAAC,GAAG,EAAC,IAAI,EAAE,KAAK,YACvC,MAAC,mBAAmB,eACP,mBAAmB,EAAE,EAAE,gBACpB,mBAAmB,EAAE,EAAE,EAEnC,EAAE,EAAE,EAAE,EACN,KAAK,EAAE,IAAI,EACX,SAAS,EAAE,UAAU,CAAC,MAAM,CAAC,cAAc,EAAE,SAAS,EAAE;gBACpD,CAAC,MAAM,CAAC,oBAAoB,CAAC,EAAE,QAAQ,KAAK,IAAI;aACnD,CAAC,EACF,QAAQ,EAAE,OAAO,QAAQ,KAAK,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,EAC/D,eAAe,EAAE,MAAM,CAAC,oBAAoB,aAE3C,aAAa,CAAC,CAAC,CAAC,CACb,YAAG,SAAS,EAAE,SAAS,YACnB,KAAC,aAAa,KAAG,GACjB,CACP,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CACX,KAAC,IAAI,IAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,GAAI,CACjD,CAAC,CAAC,CAAC,CACA,YAAG,SAAS,EAAE,SAAS,GAAI,CAC9B,EAEA,CAAC,CAAC,OAAO,IAAI,CACV,KAAC,UAAU,IAAC,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,CAAC,qBAAqB,GAAI,CACzE,KArBI,EAAE,CAsBW,GAChB,CACb,CAAC;AACN,CAAC,CAAC"}
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: center;
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: center;
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: center;
77
+ justify-content: flex-start;
78
+ align-items: center;
30
79
  flex-wrap: nowrap;
31
80
  text-wrap: nowrap;
32
81
 
33
- padding-top: @spacing-1;
34
- padding-bottom: @spacing-1;
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-purple-600 !important;
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
- position: absolute;
48
- right: 2px;
49
- top: -2px;
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 defaultSideNavigation: () => import("react/jsx-runtime").JSX.Element;
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,EAAE,MAAM,OAAO,CAAC;;;;;;;AAY1C,wBAKE;AAkDF,eAAO,MAAM,qBAAqB,+CAoBjC,CAAC"}
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 defaultSideNavigation = () => (_jsx(SideNavigation, { navigationComponent: NavLinkMock, items: [
34
- items.dashboard,
35
- items.calendar,
36
- items.calls,
37
- items.accounting,
38
- items.dispatch,
39
- items.fleet,
40
- items.followUps,
41
- items.inventory,
42
- items.marketing,
43
- items.priceBook,
44
- items.pointOfSale,
45
- items.reports,
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":"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"}
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
@@ -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?: string) => string | number | boolean | import("react/jsx-runtime").JSX.Element | Iterable<ReactNode> | null | undefined;
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":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,OAAO,CAAC;AAElC,eAAO,MAAM,WAAW,YAAa,SAAS,YAAY,MAAM,iHAO3D,CAAC"}
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: "b", text: tooltip, children: element })) : (element);
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,EAAE,MAAM,6BAA6B,CAAC;AAGtD,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,OAAkB,EAAE,OAAgB,EAAE,EAAE,CAChE,OAAO,CAAC,CAAC,CAAC,CACN,KAAC,OAAO,IAAC,EAAE,EAAC,KAAK,EAAC,SAAS,EAAC,GAAG,EAAC,IAAI,EAAE,OAAO,YACxC,OAAO,GACF,CACb,CAAC,CAAC,CAAC,CACA,OAAO,CACV,CAAC"}
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.0",
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": "bc2868724b59e5aa753e2f2313a6316d44407b8e"
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: center;
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: center;
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: center;
77
+ justify-content: flex-start;
78
+ align-items: center;
30
79
  flex-wrap: nowrap;
31
80
  text-wrap: nowrap;
32
81
 
33
- padding-top: @spacing-1;
34
- padding-bottom: @spacing-1;
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-purple-600 !important;
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
- position: absolute;
48
- right: 2px;
49
- top: -2px;
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 defaultSideNavigation = () => (
69
- <SideNavigation
70
- navigationComponent={NavLinkMock}
71
- items={[
72
- items.dashboard,
73
- items.calendar,
74
- items.calls,
75
- items.accounting,
76
- items.dispatch,
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
- items.fleet,
79
- items.followUps,
80
- items.inventory,
82
+ items.fleet,
83
+ items.followUps,
84
+ items.inventory,
81
85
 
82
- items.marketing,
83
- items.priceBook,
84
- items.pointOfSale,
85
- items.reports,
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 { Icon, Tooltip } from '@servicetitan/design-system';
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(Styles.sideNav, className)}
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<HeaderNavigationItemData> = ({
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
- <Tooltip el="div" direction="r" text={title}>
65
- <NavigationComponent
66
- data-cy={`navigation-item-${id}`}
67
- data-pendo={`navigation-item-${id}`}
68
- key={id}
69
- to={to}
70
- title={hint}
71
- className={classNames(Styles.navigationItem, className, {
72
- [Styles.navigationItemActive]: isActive === true,
73
- })}
74
- isActive={typeof isActive === 'function' ? isActive : undefined}
75
- activeClassName={Styles.navigationItemActive}
76
- >
77
- {IconComponent ? (
78
- <i className={iconClass}>
79
- <IconComponent />
80
- </i>
81
- ) : iconName ? (
82
- <Icon name={iconName} className={iconClass} />
83
- ) : (
84
- <i className={iconClass} />
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
- {!!counter && (
88
- <CounterTag data={counter} className={Styles.navigationItemCounter} />
89
- )}
90
- </NavigationComponent>
91
- </Tooltip>
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 = (element: ReactNode, tooltip?: string) =>
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="b" text={tooltip}>
10
+ <Tooltip el="div" direction={direction} text={tooltip}>
7
11
  {element}
8
12
  </Tooltip>
9
13
  ) : (