@jobber/components 4.55.3 → 4.56.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 +2 -0
- package/dist/Combobox/Combobox.types.d.ts +4 -0
- package/dist/Combobox/ComboboxProvider.d.ts +3 -0
- package/dist/Combobox/components/ComboboxActivator/ComboboxActivator.d.ts +6 -0
- package/dist/Combobox/components/ComboboxActivator/index.d.ts +1 -0
- package/dist/Combobox/components/ComboboxTrigger/ComboboxTrigger.d.ts +6 -0
- package/dist/Combobox/components/ComboboxTrigger/index.d.ts +1 -0
- package/dist/Combobox/hooks/useComboboxValidation.d.ts +2 -2
- package/dist/Combobox/index.js +46 -7
- 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,12 @@ 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
|
+
import { ComboboxActivator } from "./components/ComboboxActivator";
|
|
6
7
|
export declare function Combobox(props: ComboboxProps): JSX.Element;
|
|
7
8
|
export declare namespace Combobox {
|
|
8
9
|
var TriggerButton: typeof ComboboxTriggerButton;
|
|
9
10
|
var TriggerChip: typeof ComboboxTriggerChip;
|
|
11
|
+
var Activator: typeof ComboboxActivator;
|
|
10
12
|
var Content: typeof ComboboxContent;
|
|
11
13
|
var Action: typeof ComboboxAction;
|
|
12
14
|
}
|
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import React, { RefObject } from "react";
|
|
2
|
+
import { ComboboxOption } from "./Combobox.types";
|
|
2
3
|
export declare const ComboboxContext: React.Context<{
|
|
3
4
|
multiselect: boolean;
|
|
4
5
|
open: boolean;
|
|
5
6
|
setOpen: (open: boolean) => void;
|
|
7
|
+
selected: ComboboxOption[];
|
|
8
|
+
setSelected: (open: ComboboxOption[]) => void;
|
|
6
9
|
wrapperRef: RefObject<HTMLDivElement>;
|
|
7
10
|
}>;
|
|
8
11
|
export interface ComboboxProviderProps {
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./ComboboxActivator";
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { ReactNode } from "react";
|
|
2
|
-
export declare const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger element";
|
|
3
|
-
export declare const COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE = "Combobox must have a
|
|
2
|
+
export declare const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger or Activator element";
|
|
3
|
+
export declare const COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE = "Combobox must have a Combobox.Content element";
|
|
4
4
|
export declare function useComboboxValidation(children: ReactNode): {
|
|
5
5
|
triggerElement: ReactNode;
|
|
6
6
|
contentElement: ReactNode;
|
package/dist/Combobox/index.js
CHANGED
|
@@ -14,9 +14,15 @@ var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
|
|
|
14
14
|
var useFocusTrap = require('@jobber/hooks/useFocusTrap');
|
|
15
15
|
var reactPopper = require('react-popper');
|
|
16
16
|
var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
|
|
17
|
+
var Chip = require('../Chip-c5120c38.js');
|
|
17
18
|
var useAssert = require('@jobber/hooks/useAssert');
|
|
18
19
|
require('@jobber/design');
|
|
19
20
|
require('react-router-dom');
|
|
21
|
+
require('@jobber/hooks/useInView');
|
|
22
|
+
require('../Avatar-1aa30ee1.js');
|
|
23
|
+
require('color');
|
|
24
|
+
require('../Tooltip-6b12f1c2.js');
|
|
25
|
+
require('framer-motion');
|
|
20
26
|
|
|
21
27
|
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
|
|
22
28
|
|
|
@@ -121,8 +127,9 @@ const ComboboxContext = React__default["default"].createContext({});
|
|
|
121
127
|
function ComboboxContextProvider(props) {
|
|
122
128
|
const multiselect = props.multiselect || false;
|
|
123
129
|
const [open, setOpen] = React.useState(false);
|
|
130
|
+
const [selected, setSelected] = React.useState([]);
|
|
124
131
|
const wrapperRef = React.useRef(null);
|
|
125
|
-
return (React__default["default"].createElement(ComboboxContext.Provider, { value: { multiselect, open, setOpen, wrapperRef } },
|
|
132
|
+
return (React__default["default"].createElement(ComboboxContext.Provider, { value: { multiselect, open, setOpen, wrapperRef, selected, setSelected } },
|
|
126
133
|
React__default["default"].createElement("div", { ref: wrapperRef },
|
|
127
134
|
open && (React__default["default"].createElement("div", { className: styles$2.overlay, onClick: () => setOpen(false), "data-testid": "ATL-Combobox-Overlay" })),
|
|
128
135
|
props.children)));
|
|
@@ -241,7 +248,10 @@ function useComboboxAccessibility(selectionCallback, filteredOptions, optionsLis
|
|
|
241
248
|
}
|
|
242
249
|
|
|
243
250
|
function ComboboxContent(props) {
|
|
244
|
-
const { open, setOpen, wrapperRef, multiselect } = React__default["default"].useContext(ComboboxContext);
|
|
251
|
+
const { open, setOpen, setSelected, wrapperRef, multiselect } = React__default["default"].useContext(ComboboxContext);
|
|
252
|
+
React.useEffect(() => {
|
|
253
|
+
setSelected(props.selected);
|
|
254
|
+
}, [props.selected]);
|
|
245
255
|
const optionsExist = props.options.length > 0;
|
|
246
256
|
const { searchValue, setSearchValue, setFirstSelectedElement, filteredOptions, optionsListRef, selectedOptions, optionsSelectionHandler, } = useComboboxContent(props.options, open, props.selected, props.onClose, props.onSelect);
|
|
247
257
|
const { popperRef, popperStyles, attributes } = useComboboxAccessibility(handleSelection, filteredOptions, optionsListRef, open, setOpen, wrapperRef);
|
|
@@ -309,8 +319,28 @@ function ComboboxTriggerChip(props) {
|
|
|
309
319
|
React__default["default"].createElement(Icon.Icon, { color: "surfaceReverse", name: "add", size: "small" }))));
|
|
310
320
|
}
|
|
311
321
|
|
|
312
|
-
|
|
313
|
-
const
|
|
322
|
+
function ComboboxTrigger(props) {
|
|
323
|
+
const { open, setOpen, selected, multiselect } = React__default["default"].useContext(ComboboxContext);
|
|
324
|
+
const hasSelection = selected.length;
|
|
325
|
+
const selectedLabel = selected.map(option => option.label).join(", ");
|
|
326
|
+
const renderHeading = multiselect || !hasSelection;
|
|
327
|
+
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,
|
|
328
|
+
React__default["default"].createElement(Icon.Icon, { name: "add", size: "small" })))));
|
|
329
|
+
}
|
|
330
|
+
|
|
331
|
+
function ComboboxActivator(props) {
|
|
332
|
+
const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
|
|
333
|
+
if (props.children.type === Button.Button || props.children.type === Chip.Chip) {
|
|
334
|
+
return React__default["default"].cloneElement(props.children, {
|
|
335
|
+
role: "combobox",
|
|
336
|
+
onClick: () => setOpen(!open),
|
|
337
|
+
});
|
|
338
|
+
}
|
|
339
|
+
return props.children;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger or Activator element";
|
|
343
|
+
const COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE = "Combobox must have a Combobox.Content element";
|
|
314
344
|
function useComboboxValidation(children) {
|
|
315
345
|
const childrenArray = React__default["default"].Children.toArray(children);
|
|
316
346
|
let triggerElement, contentElement, multipleTriggersFound = false;
|
|
@@ -326,7 +356,7 @@ function useComboboxValidation(children) {
|
|
|
326
356
|
}
|
|
327
357
|
});
|
|
328
358
|
useAssert.useAssert(multipleTriggersFound, COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE);
|
|
329
|
-
useAssert.useAssert(!
|
|
359
|
+
useAssert.useAssert(!contentElement, COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE);
|
|
330
360
|
return {
|
|
331
361
|
contentElement,
|
|
332
362
|
triggerElement,
|
|
@@ -334,7 +364,9 @@ function useComboboxValidation(children) {
|
|
|
334
364
|
}
|
|
335
365
|
function isTriggerElement(child) {
|
|
336
366
|
return (React__default["default"].isValidElement(child) &&
|
|
337
|
-
(child.type === ComboboxTriggerButton ||
|
|
367
|
+
(child.type === ComboboxTriggerButton ||
|
|
368
|
+
child.type === ComboboxTriggerChip ||
|
|
369
|
+
child.type === ComboboxActivator));
|
|
338
370
|
}
|
|
339
371
|
function isContentElement(child) {
|
|
340
372
|
return React__default["default"].isValidElement(child) && child.type === ComboboxContent;
|
|
@@ -343,11 +375,18 @@ function isContentElement(child) {
|
|
|
343
375
|
function Combobox(props) {
|
|
344
376
|
const { contentElement, triggerElement } = useComboboxValidation(props.children);
|
|
345
377
|
return (React__default["default"].createElement(ComboboxContextProvider, { multiselect: props.multiSelect },
|
|
346
|
-
triggerElement,
|
|
378
|
+
triggerElement || React__default["default"].createElement(ComboboxTrigger, { heading: props.heading }),
|
|
347
379
|
contentElement));
|
|
348
380
|
}
|
|
381
|
+
/**
|
|
382
|
+
* @deprecated Use Combobox.Activator instead
|
|
383
|
+
*/
|
|
349
384
|
Combobox.TriggerButton = ComboboxTriggerButton;
|
|
385
|
+
/**
|
|
386
|
+
* @deprecated Use Combobox.Activator instead
|
|
387
|
+
*/
|
|
350
388
|
Combobox.TriggerChip = ComboboxTriggerChip;
|
|
389
|
+
Combobox.Activator = ComboboxActivator;
|
|
351
390
|
Combobox.Content = ComboboxContent;
|
|
352
391
|
Combobox.Action = ComboboxAction;
|
|
353
392
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@jobber/components",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.56.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": "cf05d6bdcd54dac5f44bea4d3f1c4213a0975c4a"
|
|
88
88
|
}
|