@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.
@@ -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,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
  }
@@ -9,6 +9,10 @@ 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;
12
16
  }
13
17
  export interface ComboboxTriggerProps {
14
18
  /**
@@ -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,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,6 @@
1
+ /// <reference types="react" />
2
+ interface ComboboxTriggerProps {
3
+ readonly heading: string;
4
+ }
5
+ export declare function ComboboxTrigger(props: ComboboxTriggerProps): JSX.Element;
6
+ 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,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 Trigger and Combobox.Content element";
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;
@@ -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
- 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";
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(!triggerElement || !contentElement, COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE);
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 || child.type === ComboboxTriggerChip));
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.55.3",
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": "5355058cff5745ab107bf2791c1f4d272c943c60"
87
+ "gitHead": "cf05d6bdcd54dac5f44bea4d3f1c4213a0975c4a"
88
88
  }