@jobber/components 4.66.2 → 4.66.4

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.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Chip = require('../Chip-0d2454d9.js');
5
+ var Chip = require('../Chip-168acf3e.js');
6
6
  var tslib_es6 = require('../tslib.es6-5b8768b7.js');
7
7
  var React = require('react');
8
8
  var Icon = require('../Icon-405a216c.js');
@@ -0,0 +1,89 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var classnames = require('classnames');
5
+ var useInView = require('@jobber/hooks/useInView');
6
+ var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
+ var Avatar = require('./Avatar-76a799fa.js');
8
+ var Icon = require('./Icon-405a216c.js');
9
+ var Typography = require('./Typography-973b122e.js');
10
+ var Tooltip = require('./Tooltip-6b12f1c2.js');
11
+
12
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
+
14
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
15
+ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
16
+
17
+ var css_248z = ":root {\n --chip--gradient-color-variation: var(--chip-base-bg);\n --chip--gradient-color-variation--hover: var(--chip-base--hover);\n}\n\n.af7U8MvcbHE- {\n --chip-height: 40px;\n --chip-radius: 20px;\n --chip-base-bg: var(--color-surface--background);\n --chip-base--hover: var(--color-surface--background--hover);\n display: -ms-flexbox;\n display: flex;\n position: relative;\n height: 40px;\n height: var(--chip-height);\n min-width: 0;\n padding: calc(16px / 2) 16px;\n padding: var(--space-small) var(--base-unit);\n border: calc(16px / 16) solid transparent;\n border: var(--border-base) solid transparent;\n border-radius: 20px;\n border-radius: var(--chip-radius);\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n text-align: left;\n cursor: pointer;\n transition: all 200ms;\n transition: all var(--timing-base);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.af7U8MvcbHE-:focus,\n.af7U8MvcbHE-:focus-visible {\n outline: none;\n}\n\n.af7U8MvcbHE-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n\n.af7U8MvcbHE- .e905AYK4SCc- {\n margin-left: calc(-1 * (16px / 2));\n margin-left: calc(-1 * calc(16px / 2));\n margin-left: calc(-1 * var(--space-small));\n margin-right: calc(16px / 2);\n margin-right: var(--space-small);\n}\n\n.af7U8MvcbHE- .ySADfZ0FckM- {\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n margin-right: calc(-1 * (16px / 2));\n margin-right: calc(-1 * calc(16px / 2));\n margin-right: calc(-1 * var(--space-small));\n}\n\n.af7U8MvcbHE- .e905AYK4SCc-,\n.af7U8MvcbHE- .ySADfZ0FckM- {\n display: -ms-flexbox;\n display: flex;\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n -ms-flex-negative: 0;\n flex-shrink: 0;\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.af7U8MvcbHE- .e905AYK4SCc-.usdkmQ9Sxbk-,\n.af7U8MvcbHE- .ySADfZ0FckM-.usdkmQ9Sxbk- {\n display: none;\n}\n\n.af7U8MvcbHE- .dg1-Izy1eQA- {\n width: calc(16px / 16);\n width: var(--space-minuscule);\n height: 16px;\n height: var(--base-unit);\n margin: 0 calc(16px / 2);\n margin: 0 var(--space-small);\n background-color: rgb(77, 105, 116);\n background-color: var(--color-text--secondary);\n}\n\n.af7U8MvcbHE- .-lz0EYLTDgg- {\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.wSI5L-5rODg- {\n border: calc(16px / 16) solid transparent;\n border: var(--border-base) solid transparent;\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n background-color: var(--chip-base-bg);\n --chip--gradient-color-variation: var(--chip-base-bg);\n}\n\n.wSI5L-5rODg-:hover,\n.wSI5L-5rODg-:focus-visible {\n background-color: var(--chip-base--hover);\n --chip--gradient-color-variation--hover: var(--chip-base--hover);\n}\n\n.SmUxkzpIC84-,\n.SmUxkzpIC84-:hover,\n.SmUxkzpIC84-:focus-visible,\n.Mux23dmZSuw-.SmUxkzpIC84-,\n.Mux23dmZSuw-.SmUxkzpIC84-:hover,\n.Mux23dmZSuw-.SmUxkzpIC84-:focus-visible {\n border: calc(16px / 16) solid rgb(201, 66, 33);\n border: var(--border-base) solid var(--color-critical);\n background-color: rgb(255, 226, 219);\n background-color: var(--color-critical--surface);\n --chip--gradient-color-variation: var(--color-critical--surface);\n --chip--gradient-color-variation--hover: var(--color-critical--surface);\n}\n\n.SmUxkzpIC84-:hover,\n.SmUxkzpIC84-:focus-visible,\n.Mux23dmZSuw-.SmUxkzpIC84-:hover,\n.Mux23dmZSuw-.SmUxkzpIC84-:focus-visible {\n background-color: rgb(193, 201, 206);\n background-color: var(--color-surface--background--hover);\n --chip--gradient-color-variation: var(--color-surface--background--hover);\n --chip--gradient-color-variation--hover: var(\n --color-surface--background--hover\n );\n}\n\n.Mux23dmZSuw- {\n border: calc(16px / 16) solid rgb(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n --chip--gradient-color-variation: var(--color-surface);\n}\n\n/* CAUTION: Order is important here since\n* there is are different styles for subtle:focus and subtle:hover\n* and we want hover to take priority\n*/\n\n.Mux23dmZSuw-:focus-visible {\n --chip--gradient-color-variation--hover: var(--color-surface);\n}\n\n.Mux23dmZSuw-:hover {\n border: calc(16px / 16) solid var(--chip-base-bg);\n border: var(--border-base) solid var(--chip-base-bg);\n background-color: var(--chip-base-bg);\n --chip--gradient-color-variation--hover: var(--chip-base-bg);\n}\n\n.SmUxkzpIC84-.MbRItb9vKhc-,\n.SmUxkzpIC84-.MbRItb9vKhc-:hover,\n.SmUxkzpIC84-.MbRItb9vKhc-:focus-visible {\n background-color: rgb(225, 225, 225);\n background-color: var(--color-disabled--secondary);\n cursor: auto;\n}\n\n.MbRItb9vKhc-,\n.MbRItb9vKhc-:hover,\n.MbRItb9vKhc-:focus-visible {\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-disabled--secondary);\n color: rgb(181, 181, 181);\n color: var(--color-disabled);\n background-color: rgb(225, 225, 225);\n background-color: var(--color-disabled--secondary);\n cursor: auto;\n --chip--gradient-color-variation: var(--color-disabled--secondary);\n --chip--gradient-color-variation--hover: var(--color-disabled--secondary);\n}\n\n.MbRItb9vKhc- .dg1-Izy1eQA- {\n background-color: rgb(181, 181, 181);\n background-color: var(--color-disabled);\n}\n\n.af7U8MvcbHE-.MbRItb9vKhc- .ySADfZ0FckM- {\n background-color: rgb(225, 225, 225);\n background-color: var(--color-disabled--secondary);\n}\n\n.af7U8MvcbHE-.MbRItb9vKhc- .ySADfZ0FckM- path {\n fill: rgb(181, 181, 181);\n fill: var(--color-disabled);\n}\n\n.tJhURjR2Vec- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n overflow: hidden;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.tJhURjR2Vec- > * {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n}\n\n.tJhURjR2Vec- > p {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.G3QXY0rNcK0- {\n position: absolute;\n top: 0;\n right: 0;\n width: calc(16px * 1);\n width: var(--space-base);\n height: 100%;\n background: linear-gradient(\n to left,\n var(--chip-base-bg) 5%,\n rgba(255, 255, 255, 0)\n );\n background: linear-gradient(\n to left,\n var(--chip--gradient-color-variation) 5%,\n rgba(255, 255, 255, 0)\n );\n}\n\n.af7U8MvcbHE-:focus-visible .G3QXY0rNcK0-,\n.af7U8MvcbHE-:hover .G3QXY0rNcK0- {\n background: linear-gradient(\n to left,\n var(--chip-base--hover) 5%,\n rgba(255, 255, 255, 0)\n );\n background: linear-gradient(\n to left,\n var(--chip--gradient-color-variation--hover) 5%,\n rgba(255, 255, 255, 0)\n );\n}\n\n.MUKEW6c2nNA- {\n display: inline-block;\n width: 1px;\n}\n";
18
+ var styles = {"chip":"af7U8MvcbHE-","prefix":"e905AYK4SCc-","suffix":"ySADfZ0FckM-","empty":"usdkmQ9Sxbk-","chipBar":"dg1-Izy1eQA-","selected":"-lz0EYLTDgg-","base":"wSI5L-5rODg-","invalid":"SmUxkzpIC84-","subtle":"Mux23dmZSuw-","disabled":"MbRItb9vKhc-","chipContent":"tJhURjR2Vec-","truncateGradient":"G3QXY0rNcK0-","chipLabelRef":"MUKEW6c2nNA-"};
19
+ styleInject_es.styleInject(css_248z);
20
+
21
+ /**
22
+ * Returns the first React Child that receives `true` from isCorrectComponent
23
+ * @param children React Children
24
+ * @param isCorrectComponent a function that accepts a JSX Element and returns a boolean.
25
+ * @returns The first child component that returns true on isCorrectComponent
26
+ */
27
+ function useChildComponent(children, isCorrectComponent) {
28
+ return React.useMemo(() => {
29
+ return React__default["default"].Children.toArray(children).find(d => React.isValidElement(d) && isCorrectComponent(d));
30
+ }, [children]);
31
+ }
32
+
33
+ function ChipPrefix({ children }) {
34
+ const singleChild = useChildComponent(children, d => d.type === Avatar.Avatar || d.type === Icon.Icon);
35
+ return (React__default["default"].createElement("span", { className: classnames__default["default"](styles.prefix, !singleChild && styles.empty) }, singleChild));
36
+ }
37
+
38
+ function ChipSuffix({ children, className }) {
39
+ var _a;
40
+ let singleChild = useChildComponent(children, d => d.type === Icon.Icon);
41
+ if (!allowedSuffixIcons.includes((_a = singleChild === null || singleChild === void 0 ? void 0 : singleChild.props) === null || _a === void 0 ? void 0 : _a.name)) {
42
+ singleChild = undefined;
43
+ }
44
+ return (React__default["default"].createElement("span", { className: classnames__default["default"](styles.suffix, className, !singleChild && styles.empty) }, singleChild));
45
+ }
46
+ const allowedSuffixIcons = ["cross", "add", "checkmark", "arrowDown"];
47
+
48
+ const Chip = ({ ariaLabel, disabled, heading, invalid, label, value, onClick, onKeyDown, children, role = "button", tabIndex = 0, variation = "base", }) => {
49
+ const classes = classnames__default["default"](styles.chip, {
50
+ [styles.invalid]: invalid,
51
+ [styles.base]: variation === "base",
52
+ [styles.subtle]: variation === "subtle",
53
+ [styles.disabled]: disabled,
54
+ });
55
+ const prefix = useChildComponent(children, d => d.type === Chip.Prefix);
56
+ const suffix = useChildComponent(children, d => d.type === Chip.Suffix);
57
+ const [labelRef, labelFullyVisible] = useInView.useInView();
58
+ const [headingRef, headingFullyVisible] = useInView.useInView();
59
+ const tooltipMessage = getTooltipMessage(labelFullyVisible, headingFullyVisible, label, heading);
60
+ return (React__default["default"].createElement(Tooltip.Tooltip, { message: tooltipMessage },
61
+ React__default["default"].createElement("button", { className: classes, onClick: (ev) => onClick && onClick(value, ev), tabIndex: tabIndex, onKeyDown: onKeyDown, "aria-label": ariaLabel || label, disabled: disabled, role: role, type: "button" },
62
+ prefix,
63
+ React__default["default"].createElement("div", { className: styles.chipContent },
64
+ heading && (React__default["default"].createElement(React__default["default"].Fragment, null,
65
+ React__default["default"].createElement(Typography.Typography, { size: "base", fontWeight: "medium" },
66
+ heading,
67
+ React__default["default"].createElement("span", { ref: headingRef, className: styles.chipLabelRef })),
68
+ label && React__default["default"].createElement("span", { className: styles.chipBar }))),
69
+ React__default["default"].createElement(Typography.Typography, { size: "base" },
70
+ label,
71
+ React__default["default"].createElement("span", { ref: labelRef, className: styles.chipLabelRef })),
72
+ !labelFullyVisible && (React__default["default"].createElement("div", { className: styles.truncateGradient, "data-testid": "ATL-Chip-Truncation-Gradient" }))),
73
+ suffix)));
74
+ };
75
+ function getTooltipMessage(labelFullyVisible, headingFullyVisible, label, heading) {
76
+ let message = "";
77
+ if (heading && !headingFullyVisible) {
78
+ message = `${heading} | ${label}`;
79
+ }
80
+ else if (!labelFullyVisible) {
81
+ message = label;
82
+ }
83
+ return message;
84
+ }
85
+ Chip.Prefix = ChipPrefix;
86
+ Chip.Suffix = ChipSuffix;
87
+
88
+ exports.Chip = Chip;
89
+ exports.styles = styles;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Combobox = require('../Combobox-6840a13e.js');
5
+ var Combobox = require('../Combobox-4343fd6c.js');
6
6
  require('react');
7
7
  require('classnames');
8
8
  require('react-dom');
@@ -17,7 +17,7 @@ require('@jobber/hooks/useRefocusOnActivator');
17
17
  require('@jobber/hooks/useFocusTrap');
18
18
  require('react-popper');
19
19
  require('@jobber/hooks/useOnKeyDown');
20
- require('../Chip-0d2454d9.js');
20
+ require('../Chip-168acf3e.js');
21
21
  require('@jobber/hooks/useInView');
22
22
  require('../Avatar-76a799fa.js');
23
23
  require('color');
@@ -12,7 +12,7 @@ var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
12
12
  var useFocusTrap = require('@jobber/hooks/useFocusTrap');
13
13
  var reactPopper = require('react-popper');
14
14
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
15
- var Chip = require('./Chip-0d2454d9.js');
15
+ var Chip = require('./Chip-168acf3e.js');
16
16
  require('@jobber/design');
17
17
  var useAssert = require('@jobber/hooks/useAssert');
18
18
 
@@ -238,7 +238,7 @@ export interface DataListActionProps<T extends DataListObject> {
238
238
  /**
239
239
  * The label of the action
240
240
  */
241
- readonly label: string;
241
+ readonly label: string | ((item: T) => string);
242
242
  /**
243
243
  * The icon beside the label
244
244
  */
@@ -25,8 +25,8 @@ var ReactDOM = require('react-dom');
25
25
  var Checkbox = require('../Checkbox-ad7ec2e7.js');
26
26
  var reactRouterDom = require('react-router-dom');
27
27
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
28
- var Combobox = require('../Combobox-6840a13e.js');
29
- var Chip = require('../Chip-0d2454d9.js');
28
+ var Combobox = require('../Combobox-4343fd6c.js');
29
+ var Chip = require('../Chip-168acf3e.js');
30
30
  var Icon = require('../Icon-405a216c.js');
31
31
  var debounce = require('lodash/debounce');
32
32
  var InputText = require('../InputText-f7c45ee5.js');
@@ -279,7 +279,7 @@ var css_248z$9 = ".fLmJZJJqMcE- {\n display: -ms-flexbox;\n display: flex;\n
279
279
  var styles$9 = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
280
280
  styleInject_es.styleInject(css_248z$9);
281
281
 
282
- var css_248z$8 = ".AN5egORYy-0- {\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n margin-right: calc(16px / 2);\n margin-right: var(--space-small);\n}\n\n.AN5egORYy-0- path {\n fill: rgba(101, 120, 132, 1);\n fill: var(--color-greyBlue);\n transition: all 200ms ease;\n transition: all var(--timing-base) ease;\n}\n\n.AN5egORYy-0- path.F1uTDCK0Sb0- {\n fill: rgb(1, 41, 57);\n fill: var(--color-blue);\n}\n\n.AN5egORYy-0- path._6KYeQXWXLQ8- {\n fill: rgb(193, 201, 206);\n fill: var(--color-greyBlue--lighter);\n}\n";
282
+ var css_248z$8 = ".AN5egORYy-0- {\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n margin-right: calc(16px / 2);\n margin-right: var(--space-small);\n}\n\n.AN5egORYy-0- path {\n fill: rgba(101, 120, 132, 1);\n fill: var(--color-interactive--subtle);\n transition: all 200ms ease;\n transition: all var(--timing-base) ease;\n}\n\n.AN5egORYy-0- path.F1uTDCK0Sb0- {\n fill: rgb(1, 41, 57);\n fill: var(--color-heading);\n}\n\n.AN5egORYy-0- path._6KYeQXWXLQ8- {\n fill: rgb(217, 223, 225);\n fill: var(--color-inactive--surface);\n}\n";
283
283
  var styles$8 = {"sortIcon":"AN5egORYy-0-","active":"F1uTDCK0Sb0-","inactive":"_6KYeQXWXLQ8-"};
284
284
  styleInject_es.styleInject(css_248z$8);
285
285
 
@@ -477,8 +477,17 @@ function DataListActions({ children, itemsToExpose = 2, }) {
477
477
  return null;
478
478
  if (!props.icon)
479
479
  return null;
480
- return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
481
- React__default["default"].createElement(Button.Button, { icon: props.icon, ariaLabel: props.label, onClick: () => {
480
+ function getActionLabel() {
481
+ if (typeof props.label === "string") {
482
+ return props.label;
483
+ }
484
+ if (activeItem) {
485
+ return props.label(activeItem);
486
+ }
487
+ }
488
+ const actionLabel = getActionLabel();
489
+ return (React__default["default"].createElement(Tooltip.Tooltip, { key: actionLabel, message: actionLabel },
490
+ React__default["default"].createElement(Button.Button, { icon: props.icon, ariaLabel: actionLabel, onClick: () => {
482
491
  var _a, _b;
483
492
  if (activeItem) {
484
493
  (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, activeItem);
@@ -1047,9 +1056,17 @@ function DataListAction({ label, icon, destructive, visible = () => true, onClic
1047
1056
  return null;
1048
1057
  }
1049
1058
  const color = destructive ? "critical" : "heading";
1059
+ function getActionLabel() {
1060
+ if (typeof label === "string") {
1061
+ return label;
1062
+ }
1063
+ if (activeItem) {
1064
+ return label(activeItem);
1065
+ }
1066
+ }
1050
1067
  return (React__default["default"].createElement("button", { type: "button", className: styles$1.action, onClick: handleClick },
1051
1068
  React__default["default"].createElement(Typography.Typography, { textColor: color },
1052
- React__default["default"].createElement("span", { className: styles$1.label }, label)),
1069
+ React__default["default"].createElement("span", { className: styles$1.label }, getActionLabel())),
1053
1070
  icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color })));
1054
1071
  function handleClick() {
1055
1072
  if (activeItem) {
@@ -9,7 +9,7 @@ interface DropDownMenuProps {
9
9
  /**
10
10
  * Change handler.
11
11
  */
12
- setOptions: Dispatch<React.SetStateAction<Options>>;
12
+ readonly setOptions: Dispatch<React.SetStateAction<Options>>;
13
13
  }
14
14
  export declare function DropDownMenu({ options, setOptions }: DropDownMenuProps): JSX.Element;
15
15
  export {};
@@ -16,7 +16,7 @@ interface MultiSelectProps {
16
16
  /**
17
17
  * Change handler
18
18
  */
19
- onOptionsChange: Dispatch<React.SetStateAction<Options>>;
19
+ readonly onOptionsChange: Dispatch<React.SetStateAction<Options>>;
20
20
  /**
21
21
  * Adjusts the interface to either have small or large spacing.
22
22
  */
@@ -4,7 +4,6 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
6
  var classnames = require('classnames');
7
- var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
8
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
9
8
  var Checkbox = require('../Checkbox-ad7ec2e7.js');
10
9
  var Text = require('../Text-4a2bc89f.js');
@@ -28,19 +27,6 @@ var css_248z = "._0SStdD4KRHs- {\n display: -ms-flexbox;\n display: flex;\n p
28
27
  var styles = {"dropDownMenuContainer":"_0SStdD4KRHs-","option":"mFSgwOQZJm0-","active":"SepF4gvOxq8-"};
29
28
  styleInject_es.styleInject(css_248z);
30
29
 
31
- function handleKeyboardShortcut(setupKeyListeners) {
32
- function callback(event) {
33
- const { metaKey, ctrlKey, key, target } = event;
34
- const shouldTriggerShortcut = target instanceof HTMLButtonElement ? metaKey || ctrlKey : true;
35
- if (!shouldTriggerShortcut)
36
- return;
37
- event.preventDefault();
38
- event.stopPropagation();
39
- setupKeyListeners(key);
40
- }
41
- return { callback };
42
- }
43
-
44
30
  function DropDownMenu({ options, setOptions }) {
45
31
  const [highlightedIndex, setHighlightedIndex] = React.useState(0);
46
32
  const menuDiv = React.useRef();
@@ -78,40 +64,32 @@ function DropDownMenu({ options, setOptions }) {
78
64
  menuDivElement.scrollTop += itemHeight;
79
65
  }
80
66
  }
81
- function setupKeyListeners(key) {
67
+ function handleKeyDown(event) {
68
+ const { key, metaKey, ctrlKey } = event;
69
+ if (metaKey || ctrlKey)
70
+ return;
82
71
  switch (key) {
83
- case "Enter":
84
- case " ": {
72
+ case "Enter": {
85
73
  if (highlightedIndex >= 0) {
86
74
  handleOptionClick(options[highlightedIndex]);
87
75
  }
88
76
  break;
89
77
  }
90
78
  case "ArrowDown": {
91
- const newIndex = Math.min(options.length - 1, highlightedIndex + 1);
92
- handleOptionFocus(newIndex);
93
- scrollMenuIfItemNotInView(menuDiv.current, "down");
79
+ handlePressDown(event);
94
80
  break;
95
81
  }
96
82
  case "ArrowUp": {
97
- const newIndex = Math.max(0, highlightedIndex - 1);
98
- handleOptionFocus(newIndex);
99
- scrollMenuIfItemNotInView(menuDiv.current, "up");
83
+ handlePressUp(event);
100
84
  break;
101
85
  }
102
86
  }
103
87
  }
104
- useOnKeyDown.useOnKeyDown(handleKeyboardShortcut(setupKeyListeners).callback, [
105
- "Enter",
106
- " ",
107
- "ArrowDown",
108
- "ArrowUp",
109
- ]);
110
88
  React.useEffect(() => {
111
89
  // focus first option
112
90
  handleOptionFocus(0);
113
91
  }, [menuDiv]);
114
- return (React__default["default"].createElement("ul", { "data-testid": "dropdown-menu", className: styles.dropDownMenuContainer, ref: menuDiv }, options.map((option, index) => {
92
+ return (React__default["default"].createElement("ul", { "data-testid": "dropdown-menu", className: styles.dropDownMenuContainer, ref: menuDiv, onKeyDown: handleKeyDown }, options.map((option, index) => {
115
93
  const optionClass = classnames__default["default"](styles.option, {
116
94
  [styles.active]: index === highlightedIndex,
117
95
  });
@@ -122,6 +100,18 @@ function DropDownMenu({ options, setOptions }) {
122
100
  }, onMouseOver: e => handleOptionHover(e, index) },
123
101
  React__default["default"].createElement(Checkbox.Checkbox, { label: option.label, checked: option.checked, onFocus: () => setHighlightedIndex(index) })));
124
102
  })));
103
+ function handlePressUp(event) {
104
+ event.preventDefault();
105
+ const newIndex = Math.max(0, highlightedIndex - 1);
106
+ handleOptionFocus(newIndex);
107
+ scrollMenuIfItemNotInView(menuDiv.current, "up");
108
+ }
109
+ function handlePressDown(event) {
110
+ event.preventDefault();
111
+ const newIndex = Math.min(options.length - 1, highlightedIndex + 1);
112
+ handleOptionFocus(newIndex);
113
+ scrollMenuIfItemNotInView(menuDiv.current, "down");
114
+ }
125
115
  }
126
116
 
127
117
  // eslint-disable-next-line max-statements
@@ -146,7 +136,10 @@ function MultiSelect({ defaultLabel, allSelectedLabel, options, onOptionsChange,
146
136
  setMenuVisible(false);
147
137
  }
148
138
  };
149
- function setupKeyListeners(key) {
139
+ function handleKeydown(event) {
140
+ const { key, metaKey, ctrlKey } = event;
141
+ if (metaKey || ctrlKey)
142
+ return;
150
143
  switch (key) {
151
144
  case "Enter":
152
145
  case " ": {
@@ -162,11 +155,6 @@ function MultiSelect({ defaultLabel, allSelectedLabel, options, onOptionsChange,
162
155
  }
163
156
  }
164
157
  }
165
- useOnKeyDown.useOnKeyDown(handleKeyboardShortcut(setupKeyListeners).callback, [
166
- "Enter",
167
- " ",
168
- "Escape",
169
- ]);
170
158
  React.useEffect(() => {
171
159
  document.addEventListener("mousedown", handleClickOutside);
172
160
  return () => document.removeEventListener("mousedown", handleClickOutside);
@@ -185,7 +173,7 @@ function MultiSelect({ defaultLabel, allSelectedLabel, options, onOptionsChange,
185
173
  setLabel(selectedLabels.join(", "));
186
174
  }
187
175
  }, [options]);
188
- return (React__default["default"].createElement("div", { ref: multiSelectContainer, className: styles$1.multiSelectContainer },
176
+ return (React__default["default"].createElement("div", { ref: multiSelectContainer, className: styles$1.multiSelectContainer, onKeyDown: handleKeydown },
189
177
  React__default["default"].createElement("div", { "data-testid": "multi-select", className: multiSelectClass, onClick: handleMenuVisibility, onFocus: () => setFocused(true), onBlur: () => setFocused(false), tabIndex: 0, ref: multiSelectRef, role: "button", "aria-label": `${defaultLabel}: ${label}`, "aria-multiselectable": true, "aria-haspopup": true },
190
178
  React__default["default"].createElement(Text.Text, null, label),
191
179
  React__default["default"].createElement(Icon.Icon, { name: "arrowDown" })),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.66.2",
3
+ "version": "4.66.4",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -83,5 +83,5 @@
83
83
  "> 1%",
84
84
  "IE 10"
85
85
  ],
86
- "gitHead": "cfc28758c3edab042a182fb3a44d454c86d67449"
86
+ "gitHead": "c13f245bfd8b537a649a3873d25ceec660e433ff"
87
87
  }
@@ -1,89 +0,0 @@
1
- 'use strict';
2
-
3
- var React = require('react');
4
- var classnames = require('classnames');
5
- var useInView = require('@jobber/hooks/useInView');
6
- var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
- var Avatar = require('./Avatar-76a799fa.js');
8
- var Icon = require('./Icon-405a216c.js');
9
- var Typography = require('./Typography-973b122e.js');
10
- var Tooltip = require('./Tooltip-6b12f1c2.js');
11
-
12
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
-
14
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
15
- var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
16
-
17
- var css_248z = ":root {\n --chip--gradient-color-variation: var(--chip-base-bg);\n --chip--gradient-color-variation--hover: var(--chip-base--hover);\n}\n\n.af7U8MvcbHE- {\n --chip-height: 40px;\n --chip-radius: 20px;\n --chip-disabled--bg: var(--color-grey--lighter);\n --chip-bar-color: var(--color-greyBlue--light);\n --chip-base-bg: var(--color-greyBlue--lightest);\n --chip-base--hover: var(--color-greyBlue--lighter);\n display: -ms-flexbox;\n display: flex;\n position: relative;\n height: 40px;\n height: var(--chip-height);\n min-width: 0;\n padding: calc(16px / 2) 16px;\n padding: var(--space-small) var(--base-unit);\n border: calc(16px / 16) solid transparent;\n border: var(--border-base) solid transparent;\n border-radius: 20px;\n border-radius: var(--chip-radius);\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n text-align: left;\n cursor: pointer;\n transition: all 200ms;\n transition: all var(--timing-base);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.af7U8MvcbHE-:focus,\n.af7U8MvcbHE-:focus-visible {\n outline: none;\n}\n\n.af7U8MvcbHE-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n\n.af7U8MvcbHE- .e905AYK4SCc- {\n margin-left: calc(-1 * (16px / 2));\n margin-left: calc(-1 * calc(16px / 2));\n margin-left: calc(-1 * var(--space-small));\n margin-right: calc(16px / 2);\n margin-right: var(--space-small);\n}\n\n.af7U8MvcbHE- .ySADfZ0FckM- {\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n margin-right: calc(-1 * (16px / 2));\n margin-right: calc(-1 * calc(16px / 2));\n margin-right: calc(-1 * var(--space-small));\n}\n\n.af7U8MvcbHE- .e905AYK4SCc-,\n.af7U8MvcbHE- .ySADfZ0FckM- {\n display: -ms-flexbox;\n display: flex;\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n -ms-flex-negative: 0;\n flex-shrink: 0;\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n -ms-flex-align: center;\n align-items: center;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.af7U8MvcbHE- .e905AYK4SCc-.usdkmQ9Sxbk-,\n.af7U8MvcbHE- .ySADfZ0FckM-.usdkmQ9Sxbk- {\n display: none;\n}\n\n.af7U8MvcbHE- .dg1-Izy1eQA- {\n width: calc(16px / 16);\n width: var(--space-minuscule);\n height: 16px;\n height: var(--base-unit);\n margin: 0 calc(16px / 2);\n margin: 0 var(--space-small);\n background-color: var(--chip-bar-color);\n}\n\n.af7U8MvcbHE- .-lz0EYLTDgg- {\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.wSI5L-5rODg- {\n border: calc(16px / 16) solid transparent;\n border: var(--border-base) solid transparent;\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n background-color: var(--chip-base-bg);\n --chip--gradient-color-variation: var(--chip-base-bg);\n}\n\n.wSI5L-5rODg-:hover,\n.wSI5L-5rODg-:focus-visible {\n background-color: var(--chip-base--hover);\n --chip--gradient-color-variation--hover: var(--chip-base--hover);\n}\n\n.SmUxkzpIC84-,\n.SmUxkzpIC84-:hover,\n.SmUxkzpIC84-:focus-visible,\n.Mux23dmZSuw-.SmUxkzpIC84-,\n.Mux23dmZSuw-.SmUxkzpIC84-:hover,\n.Mux23dmZSuw-.SmUxkzpIC84-:focus-visible {\n border: calc(16px / 16) solid rgb(201, 66, 33);\n border: var(--border-base) solid var(--color-critical);\n background-color: rgb(255, 226, 219);\n background-color: var(--color-critical--surface);\n --chip--gradient-color-variation: var(--color-critical--surface);\n --chip--gradient-color-variation--hover: var(--color-critical--surface);\n}\n\n.Mux23dmZSuw- {\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-disabled--secondary);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n --chip--gradient-color-variation: var(--color-surface);\n}\n\n/* CAUTION: Order is important here since\n* there is are different styles for subtle:focus and subtle:hover\n* and we want hover to take priority\n*/\n\n.Mux23dmZSuw-:focus-visible {\n --chip--gradient-color-variation--hover: var(--color-surface);\n}\n\n.Mux23dmZSuw-:hover {\n border: calc(16px / 16) solid var(--chip-base-bg);\n border: var(--border-base) solid var(--chip-base-bg);\n background-color: var(--chip-base-bg);\n --chip--gradient-color-variation--hover: var(--chip-base-bg);\n}\n\n.MbRItb9vKhc-,\n.MbRItb9vKhc-:hover,\n.MbRItb9vKhc-:focus-visible {\n border: calc(16px / 16) solid var(--chip-disabled--bg);\n border: var(--border-base) solid var(--chip-disabled--bg);\n color: rgb(181, 181, 181);\n color: var(--color-disabled);\n background-color: var(--chip-disabled--bg);\n cursor: auto;\n --chip--gradient-color-variation: var(--chip-disabled--bg);\n --chip--gradient-color-variation--hover: var(--chip-disabled--bg);\n}\n\n.MbRItb9vKhc- .dg1-Izy1eQA- {\n background-color: rgb(181, 181, 181);\n background-color: var(--color-disabled);\n}\n\n.af7U8MvcbHE-.MbRItb9vKhc- .ySADfZ0FckM- {\n background-color: rgb(181, 181, 181);\n background-color: var(--color-disabled);\n}\n\n.tJhURjR2Vec- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n overflow: hidden;\n -ms-flex-wrap: nowrap;\n flex-wrap: nowrap;\n}\n\n.tJhURjR2Vec- > * {\n -ms-flex: 0 0 auto;\n flex: 0 0 auto;\n}\n\n.tJhURjR2Vec- > p {\n overflow: hidden;\n white-space: nowrap;\n}\n\n.G3QXY0rNcK0- {\n position: absolute;\n top: 0;\n right: 0;\n width: calc(16px * 1);\n width: var(--space-base);\n height: 100%;\n background: linear-gradient(\n to left,\n var(--chip-base-bg) 5%,\n rgba(255, 255, 255, 0)\n );\n background: linear-gradient(\n to left,\n var(--chip--gradient-color-variation) 5%,\n rgba(255, 255, 255, 0)\n );\n}\n\n.af7U8MvcbHE-:focus-visible .G3QXY0rNcK0-,\n.af7U8MvcbHE-:hover .G3QXY0rNcK0- {\n background: linear-gradient(\n to left,\n var(--chip-base--hover) 5%,\n rgba(255, 255, 255, 0)\n );\n background: linear-gradient(\n to left,\n var(--chip--gradient-color-variation--hover) 5%,\n rgba(255, 255, 255, 0)\n );\n}\n\n.MUKEW6c2nNA- {\n display: inline-block;\n width: 1px;\n}\n";
18
- var styles = {"chip":"af7U8MvcbHE-","prefix":"e905AYK4SCc-","suffix":"ySADfZ0FckM-","empty":"usdkmQ9Sxbk-","chipBar":"dg1-Izy1eQA-","selected":"-lz0EYLTDgg-","base":"wSI5L-5rODg-","invalid":"SmUxkzpIC84-","subtle":"Mux23dmZSuw-","disabled":"MbRItb9vKhc-","chipContent":"tJhURjR2Vec-","truncateGradient":"G3QXY0rNcK0-","chipLabelRef":"MUKEW6c2nNA-"};
19
- styleInject_es.styleInject(css_248z);
20
-
21
- /**
22
- * Returns the first React Child that receives `true` from isCorrectComponent
23
- * @param children React Children
24
- * @param isCorrectComponent a function that accepts a JSX Element and returns a boolean.
25
- * @returns The first child component that returns true on isCorrectComponent
26
- */
27
- function useChildComponent(children, isCorrectComponent) {
28
- return React.useMemo(() => {
29
- return React__default["default"].Children.toArray(children).find(d => React.isValidElement(d) && isCorrectComponent(d));
30
- }, [children]);
31
- }
32
-
33
- function ChipPrefix({ children }) {
34
- const singleChild = useChildComponent(children, d => d.type === Avatar.Avatar || d.type === Icon.Icon);
35
- return (React__default["default"].createElement("span", { className: classnames__default["default"](styles.prefix, !singleChild && styles.empty) }, singleChild));
36
- }
37
-
38
- function ChipSuffix({ children, className }) {
39
- var _a;
40
- let singleChild = useChildComponent(children, d => d.type === Icon.Icon);
41
- if (!allowedSuffixIcons.includes((_a = singleChild === null || singleChild === void 0 ? void 0 : singleChild.props) === null || _a === void 0 ? void 0 : _a.name)) {
42
- singleChild = undefined;
43
- }
44
- return (React__default["default"].createElement("span", { className: classnames__default["default"](styles.suffix, className, !singleChild && styles.empty) }, singleChild));
45
- }
46
- const allowedSuffixIcons = ["cross", "add", "checkmark", "arrowDown"];
47
-
48
- const Chip = ({ ariaLabel, disabled, heading, invalid, label, value, onClick, onKeyDown, children, role = "button", tabIndex = 0, variation = "base", }) => {
49
- const classes = classnames__default["default"](styles.chip, {
50
- [styles.invalid]: invalid,
51
- [styles.base]: variation === "base",
52
- [styles.subtle]: variation === "subtle",
53
- [styles.disabled]: disabled,
54
- });
55
- const prefix = useChildComponent(children, d => d.type === Chip.Prefix);
56
- const suffix = useChildComponent(children, d => d.type === Chip.Suffix);
57
- const [labelRef, labelFullyVisible] = useInView.useInView();
58
- const [headingRef, headingFullyVisible] = useInView.useInView();
59
- const tooltipMessage = getTooltipMessage(labelFullyVisible, headingFullyVisible, label, heading);
60
- return (React__default["default"].createElement(Tooltip.Tooltip, { message: tooltipMessage },
61
- React__default["default"].createElement("button", { className: classes, onClick: (ev) => onClick && onClick(value, ev), tabIndex: tabIndex, onKeyDown: onKeyDown, "aria-label": ariaLabel || label, disabled: disabled, role: role, type: "button" },
62
- prefix,
63
- React__default["default"].createElement("div", { className: styles.chipContent },
64
- heading && (React__default["default"].createElement(React__default["default"].Fragment, null,
65
- React__default["default"].createElement(Typography.Typography, { size: "base", fontWeight: "medium" },
66
- heading,
67
- React__default["default"].createElement("span", { ref: headingRef, className: styles.chipLabelRef })),
68
- label && React__default["default"].createElement("span", { className: styles.chipBar }))),
69
- React__default["default"].createElement(Typography.Typography, { size: "base" },
70
- label,
71
- React__default["default"].createElement("span", { ref: labelRef, className: styles.chipLabelRef })),
72
- !labelFullyVisible && (React__default["default"].createElement("div", { className: styles.truncateGradient, "data-testid": "ATL-Chip-Truncation-Gradient" }))),
73
- suffix)));
74
- };
75
- function getTooltipMessage(labelFullyVisible, headingFullyVisible, label, heading) {
76
- let message = "";
77
- if (heading && !headingFullyVisible) {
78
- message = `${heading} | ${label}`;
79
- }
80
- else if (!labelFullyVisible) {
81
- message = label;
82
- }
83
- return message;
84
- }
85
- Chip.Prefix = ChipPrefix;
86
- Chip.Suffix = ChipSuffix;
87
-
88
- exports.Chip = Chip;
89
- exports.styles = styles;
@@ -1,3 +0,0 @@
1
- export declare function handleKeyboardShortcut(setupKeyListeners: (key: string) => void): {
2
- callback: (event: KeyboardEvent) => void;
3
- };