@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.
@@ -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
- var Typography = require('../Typography-83915c54.js');
12
- var Tooltip = require('../Tooltip-6b12f1c2.js');
13
- var tslib_es6 = require('../tslib.es6-5b8768b7.js');
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('@jobber/design');
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
- export declare function Combobox(props: ComboboxProps): JSX.Element;
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,6 @@
1
+ import React from "react";
2
+ interface ComboboxActivatorProps {
3
+ readonly children: React.ReactElement;
4
+ }
5
+ export declare function ComboboxActivator(props: ComboboxActivatorProps): React.ReactElement<any, string | React.JSXElementConstructor<any>>;
6
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./ComboboxActivator";
@@ -0,0 +1,2 @@
1
+ import { ComboboxOption as ComboboxOptionType } from "../../Combobox.types";
2
+ export declare function ComboboxOption(_: ComboboxOptionType): null;
@@ -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,2 +1,3 @@
1
1
  export { ComboboxTriggerButton } from "./ComboboxTriggerButton/ComboboxTriggerButton";
2
2
  export { ComboboxTriggerChip } from "./ComboboxTriggerChip/ComboboxTriggerChip";
3
+ export { ComboboxTrigger } from "./ComboboxTrigger";
@@ -1,7 +1,10 @@
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 Trigger and Combobox.Content element";
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
  };
@@ -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
- const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger element";
313
- const COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE = "Combobox must have a Trigger and Combobox.Content element";
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(!triggerElement || !contentElement, COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE);
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 || child.type === ComboboxTriggerChip));
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(props) {
344
- const { contentElement, triggerElement } = useComboboxValidation(props.children);
345
- return (React__default["default"].createElement(ComboboxContextProvider, { multiselect: props.multiSelect },
346
- triggerElement,
347
- contentElement));
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.55.3",
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": "5355058cff5745ab107bf2791c1f4d272c943c60"
87
+ "gitHead": "1ff15aacb9d6432e4c942f97048e006cbcb9bb0b"
88
88
  }