@jobber/components 4.55.3 → 4.57.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/Chip/index.js +14 -85
- package/dist/Chip-c5120c38.js +89 -0
- package/dist/Combobox/Combobox.d.ts +5 -1
- package/dist/Combobox/Combobox.types.d.ts +7 -1
- package/dist/Combobox/components/ComboboxActivator/ComboboxActivator.d.ts +6 -0
- package/dist/Combobox/components/ComboboxActivator/index.d.ts +1 -0
- package/dist/Combobox/components/ComboboxOption/ComboboxOption.d.ts +2 -0
- package/dist/Combobox/components/ComboboxOption/index.d.ts +1 -0
- package/dist/Combobox/components/ComboboxTrigger/ComboboxTrigger.d.ts +7 -0
- package/dist/Combobox/components/ComboboxTrigger/index.d.ts +1 -0
- package/dist/Combobox/hooks/useComboboxValidation.d.ts +7 -4
- package/dist/Combobox/index.js +79 -9
- package/package.json +2 -2
package/dist/Chip/index.js
CHANGED
|
@@ -2,110 +2,39 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
+
var Chip = require('../Chip-c5120c38.js');
|
|
6
|
+
var tslib_es6 = require('../tslib.es6-5b8768b7.js');
|
|
5
7
|
var React = require('react');
|
|
6
|
-
var classnames = require('classnames');
|
|
7
|
-
var useInView = require('@jobber/hooks/useInView');
|
|
8
|
-
var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
|
|
9
|
-
var Avatar = require('../Avatar-1aa30ee1.js');
|
|
10
8
|
var Icon = require('../Icon-405a216c.js');
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
require('classnames');
|
|
10
|
+
require('@jobber/hooks/useInView');
|
|
11
|
+
require('../style-inject.es-9d2f5f4e.js');
|
|
12
|
+
require('../Avatar-1aa30ee1.js');
|
|
14
13
|
require('color');
|
|
15
|
-
require('
|
|
14
|
+
require('../Typography-83915c54.js');
|
|
15
|
+
require('../Tooltip-6b12f1c2.js');
|
|
16
16
|
require('react-dom');
|
|
17
17
|
require('framer-motion');
|
|
18
18
|
require('react-popper');
|
|
19
|
+
require('@jobber/design');
|
|
19
20
|
|
|
20
21
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
21
22
|
|
|
22
23
|
var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
|
|
23
|
-
var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
|
|
24
|
-
|
|
25
|
-
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 var(--ease-both) 100ms;\n transition: all var(--ease-both) var(--timing-quick);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.af7U8MvcbHE-:focus {\n box-shadow: 0px 0px calc(16px / 4) calc(16px / 8)\n rgb(231, 213, 87);\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- .ySADfZ0FckM-:hover,\n.af7U8MvcbHE- .e905AYK4SCc-:hover {\n background-color: rgb(181, 181, 181);\n background-color: var(--color-disabled);\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 {\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,\n.Mux23dmZSuw-.SmUxkzpIC84-,\n.Mux23dmZSuw-.SmUxkzpIC84-:hover,\n.Mux23dmZSuw-.SmUxkzpIC84-:focus {\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 {\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 {\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 .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";
|
|
26
|
-
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-"};
|
|
27
|
-
styleInject_es.styleInject(css_248z);
|
|
28
|
-
|
|
29
|
-
/**
|
|
30
|
-
* Returns the first React Child that receives `true` from isCorrectComponent
|
|
31
|
-
* @param children React Children
|
|
32
|
-
* @param isCorrectComponent a function that accepts a JSX Element and returns a boolean.
|
|
33
|
-
* @returns The first child component that returns true on isCorrectComponent
|
|
34
|
-
*/
|
|
35
|
-
function useChildComponent(children, isCorrectComponent) {
|
|
36
|
-
return React.useMemo(() => {
|
|
37
|
-
return React__default["default"].Children.toArray(children).find(d => React.isValidElement(d) && isCorrectComponent(d));
|
|
38
|
-
}, [children]);
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
function ChipPrefix({ children }) {
|
|
42
|
-
const singleChild = useChildComponent(children, d => d.type === Avatar.Avatar || d.type === Icon.Icon);
|
|
43
|
-
return (React__default["default"].createElement("span", { className: classnames__default["default"](styles.prefix, !singleChild && styles.empty) }, singleChild));
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
function ChipSuffix({ children, className }) {
|
|
47
|
-
var _a;
|
|
48
|
-
let singleChild = useChildComponent(children, d => d.type === Icon.Icon);
|
|
49
|
-
if (!allowedSuffixIcons.includes((_a = singleChild === null || singleChild === void 0 ? void 0 : singleChild.props) === null || _a === void 0 ? void 0 : _a.name)) {
|
|
50
|
-
singleChild = undefined;
|
|
51
|
-
}
|
|
52
|
-
return (React__default["default"].createElement("span", { className: classnames__default["default"](styles.suffix, className, !singleChild && styles.empty) }, singleChild));
|
|
53
|
-
}
|
|
54
|
-
const allowedSuffixIcons = ["cross", "add", "checkmark"];
|
|
55
|
-
|
|
56
|
-
const Chip = ({ ariaLabel, disabled, heading, invalid, label, value, onClick, onKeyDown, children, role = "button", tabIndex = 0, variation = "base", }) => {
|
|
57
|
-
const classes = classnames__default["default"](styles.chip, {
|
|
58
|
-
[styles.invalid]: invalid,
|
|
59
|
-
[styles.base]: variation === "base",
|
|
60
|
-
[styles.subtle]: variation === "subtle",
|
|
61
|
-
[styles.disabled]: disabled,
|
|
62
|
-
});
|
|
63
|
-
const prefix = useChildComponent(children, d => d.type === Chip.Prefix);
|
|
64
|
-
const suffix = useChildComponent(children, d => d.type === Chip.Suffix);
|
|
65
|
-
const [labelRef, labelFullyVisible] = useInView.useInView();
|
|
66
|
-
const [headingRef, headingFullyVisible] = useInView.useInView();
|
|
67
|
-
const tooltipMessage = getTooltipMessage(labelFullyVisible, headingFullyVisible, label, heading);
|
|
68
|
-
return (React__default["default"].createElement(Tooltip.Tooltip, { message: tooltipMessage },
|
|
69
|
-
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" },
|
|
70
|
-
prefix,
|
|
71
|
-
React__default["default"].createElement("div", { className: styles.chipContent },
|
|
72
|
-
heading && (React__default["default"].createElement(React__default["default"].Fragment, null,
|
|
73
|
-
React__default["default"].createElement(Typography.Typography, { size: "base", fontWeight: "medium" },
|
|
74
|
-
heading,
|
|
75
|
-
React__default["default"].createElement("span", { ref: headingRef })),
|
|
76
|
-
React__default["default"].createElement("span", { className: styles.chipBar }))),
|
|
77
|
-
React__default["default"].createElement(Typography.Typography, { size: "base" },
|
|
78
|
-
label,
|
|
79
|
-
React__default["default"].createElement("span", { ref: labelRef })),
|
|
80
|
-
!labelFullyVisible && (React__default["default"].createElement("div", { className: styles.truncateGradient, "data-testid": "ATL-Chip-Truncation-Gradient" }))),
|
|
81
|
-
suffix)));
|
|
82
|
-
};
|
|
83
|
-
function getTooltipMessage(labelFullyVisible, headingFullyVisible, label, heading) {
|
|
84
|
-
let message = "";
|
|
85
|
-
if (heading && !headingFullyVisible) {
|
|
86
|
-
message = `${heading} | ${label}`;
|
|
87
|
-
}
|
|
88
|
-
else if (!labelFullyVisible) {
|
|
89
|
-
message = label;
|
|
90
|
-
}
|
|
91
|
-
return message;
|
|
92
|
-
}
|
|
93
|
-
Chip.Prefix = ChipPrefix;
|
|
94
|
-
Chip.Suffix = ChipSuffix;
|
|
95
24
|
|
|
96
25
|
function ChipSelectable(_a) {
|
|
97
26
|
var { selected } = _a, rest = tslib_es6.__rest(_a, ["selected"]);
|
|
98
|
-
return (React__default["default"].createElement(Chip, Object.assign({}, rest),
|
|
99
|
-
React__default["default"].createElement(Chip.Suffix, { className: selected ? styles.selected : "" },
|
|
27
|
+
return (React__default["default"].createElement(Chip.Chip, Object.assign({}, rest),
|
|
28
|
+
React__default["default"].createElement(Chip.Chip.Suffix, { className: selected ? Chip.styles.selected : "" },
|
|
100
29
|
React__default["default"].createElement(Icon.Icon, { name: selected ? "checkmark" : "add", size: "small", color: selected ? "green" : "blue" }))));
|
|
101
30
|
}
|
|
102
31
|
|
|
103
32
|
function ChipDismissible(props) {
|
|
104
|
-
return (React__default["default"].createElement(Chip, Object.assign({}, props),
|
|
105
|
-
React__default["default"].createElement(Chip.Suffix, null,
|
|
33
|
+
return (React__default["default"].createElement(Chip.Chip, Object.assign({}, props),
|
|
34
|
+
React__default["default"].createElement(Chip.Chip.Suffix, null,
|
|
106
35
|
React__default["default"].createElement(Icon.Icon, { name: "cross", size: "small", color: "blue" }))));
|
|
107
36
|
}
|
|
108
37
|
|
|
109
|
-
exports.Chip = Chip;
|
|
38
|
+
exports.Chip = Chip.Chip;
|
|
110
39
|
exports.ChipDismissible = ChipDismissible;
|
|
111
40
|
exports.ChipSelectable = ChipSelectable;
|
|
@@ -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-1aa30ee1.js');
|
|
8
|
+
var Icon = require('./Icon-405a216c.js');
|
|
9
|
+
var Typography = require('./Typography-83915c54.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 var(--ease-both) 100ms;\n transition: all var(--ease-both) var(--timing-quick);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.af7U8MvcbHE-:focus {\n box-shadow: 0px 0px calc(16px / 4) calc(16px / 8)\n rgb(231, 213, 87);\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- .ySADfZ0FckM-:hover,\n.af7U8MvcbHE- .e905AYK4SCc-:hover {\n background-color: rgb(181, 181, 181);\n background-color: var(--color-disabled);\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 {\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,\n.Mux23dmZSuw-.SmUxkzpIC84-,\n.Mux23dmZSuw-.SmUxkzpIC84-:hover,\n.Mux23dmZSuw-.SmUxkzpIC84-:focus {\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 {\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 {\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 .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";
|
|
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-"};
|
|
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"];
|
|
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 })),
|
|
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 })),
|
|
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;
|
|
@@ -3,10 +3,14 @@ import { ComboboxProps } from "./Combobox.types";
|
|
|
3
3
|
import { ComboboxContent } from "./components/ComboboxContent";
|
|
4
4
|
import { ComboboxAction } from "./components/ComboboxAction";
|
|
5
5
|
import { ComboboxTriggerButton, ComboboxTriggerChip } from "./components/ComboboxTrigger";
|
|
6
|
-
|
|
6
|
+
import { ComboboxOption } from "./components/ComboboxOption";
|
|
7
|
+
import { ComboboxActivator } from "./components/ComboboxActivator";
|
|
8
|
+
export declare function Combobox({ multiSelect, selected, ...props }: ComboboxProps): JSX.Element;
|
|
7
9
|
export declare namespace Combobox {
|
|
8
10
|
var TriggerButton: typeof ComboboxTriggerButton;
|
|
9
11
|
var TriggerChip: typeof ComboboxTriggerChip;
|
|
12
|
+
var Activator: typeof ComboboxActivator;
|
|
10
13
|
var Content: typeof ComboboxContent;
|
|
11
14
|
var Action: typeof ComboboxAction;
|
|
15
|
+
var Option: typeof ComboboxOption;
|
|
12
16
|
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { Dispatch, ReactElement, SetStateAction } from "react";
|
|
2
2
|
import { XOR } from "ts-xor";
|
|
3
3
|
import { ButtonProps } from "../Button";
|
|
4
|
-
export interface ComboboxProps {
|
|
4
|
+
export interface ComboboxProps extends Partial<Omit<ComboboxContentBaseProps, "options">> {
|
|
5
5
|
readonly children: ReactElement | ReactElement[];
|
|
6
6
|
/**
|
|
7
7
|
* When `true`, `Combobox` will allow for multiple selections
|
|
@@ -9,6 +9,12 @@ export interface ComboboxProps {
|
|
|
9
9
|
* @default false
|
|
10
10
|
*/
|
|
11
11
|
readonly multiSelect?: boolean;
|
|
12
|
+
/**
|
|
13
|
+
* The Chip heading for the trigger
|
|
14
|
+
*/
|
|
15
|
+
readonly heading: string;
|
|
16
|
+
readonly onSelect?: (selection: ComboboxOption[]) => void;
|
|
17
|
+
readonly onClose?: (selection: ComboboxOption[]) => void;
|
|
12
18
|
}
|
|
13
19
|
export interface ComboboxTriggerProps {
|
|
14
20
|
/**
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ComboboxActivator";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ComboboxOption";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/// <reference types="react" />
|
|
2
|
+
import { ComboboxContentProps } from "../../Combobox.types";
|
|
3
|
+
interface ComboboxTriggerProps extends Pick<ComboboxContentProps, "selected"> {
|
|
4
|
+
readonly heading: string;
|
|
5
|
+
}
|
|
6
|
+
export declare function ComboboxTrigger({ selected, ...props }: ComboboxTriggerProps): JSX.Element;
|
|
7
|
+
export {};
|
|
@@ -1,7 +1,10 @@
|
|
|
1
|
-
import { ReactNode } from "react";
|
|
2
|
-
|
|
3
|
-
export declare const
|
|
1
|
+
import { ReactElement, ReactNode } from "react";
|
|
2
|
+
import { ComboboxActionProps, ComboboxOption as ComboboxOptionProps } from "../Combobox.types";
|
|
3
|
+
export declare const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger or Activator element";
|
|
4
|
+
export declare const COMBOBOX_OPTION_AND_CONTENT_EXISTS_ERROR = "Combobox prefers using Combobox.Option and Combobox.Action as the direct child of Combobox instead of Combobox.Content";
|
|
4
5
|
export declare function useComboboxValidation(children: ReactNode): {
|
|
5
6
|
triggerElement: ReactNode;
|
|
6
|
-
contentElement: ReactNode;
|
|
7
|
+
contentElement: ReactNode | undefined;
|
|
8
|
+
optionElements: ReactElement<ComboboxOptionProps>[];
|
|
9
|
+
actionElements: ReactElement<ComboboxActionProps>[];
|
|
7
10
|
};
|
package/dist/Combobox/index.js
CHANGED
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
|
|
3
3
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
4
|
|
|
5
|
+
var tslib_es6 = require('../tslib.es6-5b8768b7.js');
|
|
5
6
|
var React = require('react');
|
|
6
7
|
var classnames = require('classnames');
|
|
7
8
|
var ReactDOM = require('react-dom');
|
|
@@ -14,9 +15,15 @@ var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
|
|
|
14
15
|
var useFocusTrap = require('@jobber/hooks/useFocusTrap');
|
|
15
16
|
var reactPopper = require('react-popper');
|
|
16
17
|
var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
|
|
18
|
+
var Chip = require('../Chip-c5120c38.js');
|
|
17
19
|
var useAssert = require('@jobber/hooks/useAssert');
|
|
18
20
|
require('@jobber/design');
|
|
19
21
|
require('react-router-dom');
|
|
22
|
+
require('@jobber/hooks/useInView');
|
|
23
|
+
require('../Avatar-1aa30ee1.js');
|
|
24
|
+
require('color');
|
|
25
|
+
require('../Tooltip-6b12f1c2.js');
|
|
26
|
+
require('framer-motion');
|
|
20
27
|
|
|
21
28
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
22
29
|
|
|
@@ -309,11 +316,40 @@ function ComboboxTriggerChip(props) {
|
|
|
309
316
|
React__default["default"].createElement(Icon.Icon, { color: "surfaceReverse", name: "add", size: "small" }))));
|
|
310
317
|
}
|
|
311
318
|
|
|
312
|
-
|
|
313
|
-
|
|
319
|
+
function ComboboxTrigger(_a) {
|
|
320
|
+
var { selected } = _a, props = tslib_es6.__rest(_a, ["selected"]);
|
|
321
|
+
const { open, setOpen, multiselect } = React__default["default"].useContext(ComboboxContext);
|
|
322
|
+
const hasSelection = selected.length;
|
|
323
|
+
const selectedLabel = selected.map(option => option.label).join(", ");
|
|
324
|
+
const renderHeading = multiselect || !hasSelection;
|
|
325
|
+
return (React__default["default"].createElement(Chip.Chip, { variation: hasSelection ? "base" : "subtle", label: hasSelection ? selectedLabel : "", heading: renderHeading ? props.heading : "", onClick: () => setOpen(!open), role: "combobox" }, !hasSelection && (React__default["default"].createElement(Chip.Chip.Suffix, null,
|
|
326
|
+
React__default["default"].createElement(Icon.Icon, { name: "add", size: "small" })))));
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
function ComboboxActivator(props) {
|
|
330
|
+
const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
|
|
331
|
+
if (props.children.type === Button.Button || props.children.type === Chip.Chip) {
|
|
332
|
+
return React__default["default"].cloneElement(props.children, {
|
|
333
|
+
role: "combobox",
|
|
334
|
+
onClick: () => setOpen(!open),
|
|
335
|
+
});
|
|
336
|
+
}
|
|
337
|
+
return props.children;
|
|
338
|
+
}
|
|
339
|
+
|
|
340
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
341
|
+
function ComboboxOption(_) {
|
|
342
|
+
useAssert.useAssert(true, "Combobox.Option can only be used inside a Combobox component");
|
|
343
|
+
return null;
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger or Activator element";
|
|
347
|
+
const COMBOBOX_OPTION_AND_CONTENT_EXISTS_ERROR = "Combobox prefers using Combobox.Option and Combobox.Action as the direct child of Combobox instead of Combobox.Content";
|
|
314
348
|
function useComboboxValidation(children) {
|
|
315
349
|
const childrenArray = React__default["default"].Children.toArray(children);
|
|
316
350
|
let triggerElement, contentElement, multipleTriggersFound = false;
|
|
351
|
+
const optionElements = [];
|
|
352
|
+
const actionElements = [];
|
|
317
353
|
childrenArray.forEach(child => {
|
|
318
354
|
if (isTriggerElement(child)) {
|
|
319
355
|
if (triggerElement) {
|
|
@@ -324,32 +360,66 @@ function useComboboxValidation(children) {
|
|
|
324
360
|
if (isContentElement(child)) {
|
|
325
361
|
contentElement = child;
|
|
326
362
|
}
|
|
363
|
+
if (isOptionElement(child)) {
|
|
364
|
+
optionElements.push(child);
|
|
365
|
+
}
|
|
366
|
+
if (isActionElement(child)) {
|
|
367
|
+
actionElements.push(child);
|
|
368
|
+
}
|
|
327
369
|
});
|
|
328
370
|
useAssert.useAssert(multipleTriggersFound, COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE);
|
|
329
|
-
useAssert.useAssert(
|
|
371
|
+
useAssert.useAssert(Boolean((optionElements.length || actionElements.length) && contentElement), COMBOBOX_OPTION_AND_CONTENT_EXISTS_ERROR);
|
|
330
372
|
return {
|
|
331
373
|
contentElement,
|
|
332
374
|
triggerElement,
|
|
375
|
+
optionElements,
|
|
376
|
+
actionElements,
|
|
333
377
|
};
|
|
334
378
|
}
|
|
335
379
|
function isTriggerElement(child) {
|
|
336
380
|
return (React__default["default"].isValidElement(child) &&
|
|
337
|
-
(child.type === ComboboxTriggerButton ||
|
|
381
|
+
(child.type === ComboboxTriggerButton ||
|
|
382
|
+
child.type === ComboboxTriggerChip ||
|
|
383
|
+
child.type === ComboboxActivator));
|
|
338
384
|
}
|
|
339
385
|
function isContentElement(child) {
|
|
340
386
|
return React__default["default"].isValidElement(child) && child.type === ComboboxContent;
|
|
341
387
|
}
|
|
388
|
+
function isOptionElement(child) {
|
|
389
|
+
return React__default["default"].isValidElement(child) && child.type === ComboboxOption;
|
|
390
|
+
}
|
|
391
|
+
function isActionElement(child) {
|
|
392
|
+
return React__default["default"].isValidElement(child) && child.type === ComboboxAction;
|
|
393
|
+
}
|
|
342
394
|
|
|
343
|
-
function Combobox(
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
395
|
+
function Combobox(_a) {
|
|
396
|
+
var { multiSelect = false, selected = [] } = _a, props = tslib_es6.__rest(_a, ["multiSelect", "selected"]);
|
|
397
|
+
const { contentElement, triggerElement, optionElements, actionElements } = useComboboxValidation(props.children);
|
|
398
|
+
const buildOptions = optionElements.map(option => ({
|
|
399
|
+
id: option.props.id,
|
|
400
|
+
label: option.props.label,
|
|
401
|
+
}));
|
|
402
|
+
return (React__default["default"].createElement(ComboboxContextProvider, { multiselect: multiSelect },
|
|
403
|
+
triggerElement || (React__default["default"].createElement(ComboboxTrigger, { heading: props.heading, selected: selected })),
|
|
404
|
+
contentElement || (
|
|
405
|
+
// @ts-expect-error - Suppress the XOR error with onClose|onSelect until we finish the refactor on JOB-81416
|
|
406
|
+
React__default["default"].createElement(ComboboxContent, Object.assign({ options: buildOptions, selected: selected }, props), actionElements))));
|
|
348
407
|
}
|
|
408
|
+
/**
|
|
409
|
+
* @deprecated Use Combobox.Activator instead
|
|
410
|
+
*/
|
|
349
411
|
Combobox.TriggerButton = ComboboxTriggerButton;
|
|
412
|
+
/**
|
|
413
|
+
* @deprecated Use Combobox.Activator instead
|
|
414
|
+
*/
|
|
350
415
|
Combobox.TriggerChip = ComboboxTriggerChip;
|
|
416
|
+
Combobox.Activator = ComboboxActivator;
|
|
417
|
+
/**
|
|
418
|
+
* @deprecated Use individual Combobox.Option instead
|
|
419
|
+
*/
|
|
351
420
|
Combobox.Content = ComboboxContent;
|
|
352
421
|
Combobox.Action = ComboboxAction;
|
|
422
|
+
Combobox.Option = ComboboxOption;
|
|
353
423
|
|
|
354
424
|
exports.Combobox = Combobox;
|
|
355
425
|
exports.ComboboxContextProvider = ComboboxContextProvider;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobber/components",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.57.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -84,5 +84,5 @@
|
|
|
84
84
|
"> 1%",
|
|
85
85
|
"IE 10"
|
|
86
86
|
],
|
|
87
|
-
"gitHead": "
|
|
87
|
+
"gitHead": "1ff15aacb9d6432e4c942f97048e006cbcb9bb0b"
|
|
88
88
|
}
|