@jobber/components 4.44.0 → 4.45.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.
Files changed (96) hide show
  1. package/Combobox.d.ts +1 -0
  2. package/Combobox.js +17 -0
  3. package/dist/Autocomplete/index.js +7 -7
  4. package/dist/Banner/index.js +3 -3
  5. package/dist/Button/index.js +2 -2
  6. package/dist/{Button-fd8413b2.js → Button-d89f2271.js} +1 -1
  7. package/dist/ButtonDismiss/index.js +3 -3
  8. package/dist/{ButtonDismiss-82680c7d.js → ButtonDismiss-250840a4.js} +1 -1
  9. package/dist/Card/index.js +5 -5
  10. package/dist/{Card-cc2ffbaa.js → Card-69304e99.js} +3 -3
  11. package/dist/Checkbox/index.js +3 -3
  12. package/dist/{Checkbox-3bccf65c.js → Checkbox-eac63b7f.js} +1 -1
  13. package/dist/{Chip-4916a642.js → Chip-4d8e6370.js} +4 -4
  14. package/dist/Chips/index.js +5 -5
  15. package/dist/Combobox/Combobox.d.ts +16 -0
  16. package/dist/Combobox/Combobox.types.d.ts +14 -0
  17. package/dist/Combobox/ComboboxProvider.d.ts +10 -0
  18. package/dist/Combobox/components/ComboboxAction/ComboboxAction.d.ts +12 -0
  19. package/dist/Combobox/components/ComboboxAction/index.d.ts +1 -0
  20. package/dist/Combobox/components/ComboboxContent/ComboboxContent.d.ts +33 -0
  21. package/dist/Combobox/components/ComboboxContent/ComboboxList.d.ts +14 -0
  22. package/dist/Combobox/components/ComboboxContent/ComboboxSearch.d.ts +7 -0
  23. package/dist/Combobox/components/ComboboxContent/index.d.ts +1 -0
  24. package/dist/Combobox/components/ComboboxTrigger/ComboboxTriggerButton/ComboboxTriggerButton.d.ts +3 -0
  25. package/dist/Combobox/components/ComboboxTrigger/ComboboxTriggerChip/ComboboxTriggerChip.d.ts +3 -0
  26. package/dist/Combobox/components/ComboboxTrigger/index.d.ts +2 -0
  27. package/dist/Combobox/hooks/useComboboxAccessibility.d.ts +13 -0
  28. package/dist/Combobox/hooks/useComboboxContent.d.ts +9 -0
  29. package/dist/Combobox/index.d.ts +3 -0
  30. package/dist/Combobox/index.js +295 -0
  31. package/dist/ConfirmationModal/index.js +9 -9
  32. package/dist/{ConfirmationModal-6b61ebf5.js → ConfirmationModal-92f07027.js} +2 -2
  33. package/dist/DataDump/index.js +6 -6
  34. package/dist/DataList/index.js +13 -13
  35. package/dist/DataTable/index.js +6 -6
  36. package/dist/DatePicker/index.js +3 -3
  37. package/dist/{DatePicker-b31baae4.js → DatePicker-39d2dc8b.js} +2 -2
  38. package/dist/DescriptionList/index.js +1 -1
  39. package/dist/Disclosure/index.js +1 -1
  40. package/dist/Drawer/index.js +4 -4
  41. package/dist/Emphasis/index.js +2 -2
  42. package/dist/{Emphasis-76a10790.js → Emphasis-cc3456ac.js} +1 -1
  43. package/dist/FeatureSwitch/index.js +7 -7
  44. package/dist/FormField/index.js +5 -5
  45. package/dist/{FormField-d6138b7f.js → FormField-bef41ec9.js} +3 -3
  46. package/dist/FormatFile/index.js +10 -10
  47. package/dist/{FormatFile-aa1898f9.js → FormatFile-a470c0f2.js} +4 -4
  48. package/dist/Gallery/index.js +11 -11
  49. package/dist/Heading/index.js +2 -2
  50. package/dist/{Heading-a1191b15.js → Heading-4562900a.js} +1 -1
  51. package/dist/InlineLabel/index.js +2 -2
  52. package/dist/{InlineLabel-afd5fc6f.js → InlineLabel-3d461632.js} +1 -1
  53. package/dist/InputAvatar/index.js +3 -3
  54. package/dist/InputDate/index.js +6 -6
  55. package/dist/InputEmail/index.js +5 -5
  56. package/dist/InputFile/index.js +3 -3
  57. package/dist/{InputFile-2a06c2c0.js → InputFile-d327dee3.js} +2 -2
  58. package/dist/InputNumber/index.js +6 -6
  59. package/dist/{InputNumber-07b03067.js → InputNumber-5640fb55.js} +1 -1
  60. package/dist/InputPassword/index.js +5 -5
  61. package/dist/InputPhoneNumber/index.js +5 -5
  62. package/dist/InputText/index.js +6 -6
  63. package/dist/{InputText-d1a52550.js → InputText-5ac5cfe0.js} +1 -1
  64. package/dist/InputTime/index.js +5 -5
  65. package/dist/InputValidation/index.js +3 -3
  66. package/dist/{InputValidation-b5a3d92c.js → InputValidation-4e809bdd.js} +1 -1
  67. package/dist/LightBox/index.js +4 -4
  68. package/dist/{LightBox-437a1c8b.js → LightBox-02ca409e.js} +2 -2
  69. package/dist/List/index.js +5 -5
  70. package/dist/Markdown/index.js +5 -5
  71. package/dist/{Markdown-f6748dcb.js → Markdown-b37cf9ec.js} +3 -3
  72. package/dist/Menu/index.js +3 -3
  73. package/dist/{Menu-51f8712f.js → Menu-cec53b50.js} +2 -2
  74. package/dist/Modal/index.js +5 -5
  75. package/dist/{Modal-a9ab9565.js → Modal-dcdc0032.js} +3 -3
  76. package/dist/MultiSelect/index.js +3 -3
  77. package/dist/{Option-b903e7ac.js → Option-9f4a65da.js} +1 -1
  78. package/dist/Page/index.js +7 -7
  79. package/dist/Popover/index.js +4 -4
  80. package/dist/{Popover-bbfc6aa1.js → Popover-d401fb54.js} +1 -1
  81. package/dist/RadioGroup/index.js +3 -3
  82. package/dist/{RadioGroup-8e76d20b.js → RadioGroup-46833fac.js} +1 -1
  83. package/dist/RecurringSelect/index.js +8 -8
  84. package/dist/Select/index.js +6 -6
  85. package/dist/StatusLabel/index.js +2 -2
  86. package/dist/Switch/index.js +2 -2
  87. package/dist/{Switch-e75145cc.js → Switch-165f01e3.js} +1 -1
  88. package/dist/Tabs/index.js +1 -1
  89. package/dist/Text/index.js +2 -2
  90. package/dist/{Text-e7ed0974.js → Text-59bde58c.js} +1 -1
  91. package/dist/Toast/index.js +2 -2
  92. package/dist/Tooltip/index.js +3 -3
  93. package/dist/{Tooltip-bf67fe6e.js → Tooltip-59dbab5b.js} +1 -1
  94. package/dist/Typography/index.js +1 -1
  95. package/dist/{Typography-fd6f932a.js → Typography-9bff9c91.js} +2 -2
  96. package/package.json +2 -2
@@ -0,0 +1,295 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var React = require('react');
6
+ var useAssert = require('@jobber/hooks/useAssert');
7
+ var classnames = require('classnames');
8
+ var ReactDOM = require('react-dom');
9
+ var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
10
+ var Icon = require('../Icon-405a216c.js');
11
+ var Text = require('../Text-59bde58c.js');
12
+ var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
13
+ var useFocusTrap = require('@jobber/hooks/useFocusTrap');
14
+ var reactPopper = require('react-popper');
15
+ var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
16
+ var Typography = require('../Typography-9bff9c91.js');
17
+ var Button = require('../Button-d89f2271.js');
18
+ require('@jobber/design');
19
+ require('react-router-dom');
20
+
21
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
22
+
23
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
24
+ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
25
+ var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
26
+
27
+ var css_248z$5 = ".m1w5vdUZ6rQ- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n max-width: var(--popover--width);\n min-width: calc((16px * 4) * 3.75);\n min-width: calc(calc(16px * 4) * 3.75);\n min-width: calc(var(--space-extravagant) * 3.75);\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n margin-top: calc(16px / 2);\n margin-top: var(--space-small);\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n overflow: scroll;\n overflow-y: auto;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n/* CAUTION: Tests for content visibility assume this class' presence hides the content\n* so please be careful if you change this class name, or the css rules within.\n*/\n\n.m1w5vdUZ6rQ-.Zlkv2HA096A- {\n display: none;\n visibility: hidden;\n}\n\n.YQry-Rd6zfQ-::before {\n content: \"\";\n display: block;\n position: absolute;\n top: calc((16px * 1.5) * -1);\n top: calc(calc(16px * 1.5) * -1);\n top: calc(var(--space-large) * -1);\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0) 0%,\n rgb(255, 255, 255) 100%\n );\n}\n\n.YQry-Rd6zfQ- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: sticky;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n bottom: 0;\n width: 100%;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.TcpqL34s4lI- {\n padding-bottom: calc(16px / 2);\n padding-bottom: var(--space-small);\n}\n";
28
+ var styles$5 = {"content":"m1w5vdUZ6rQ-","hidden":"Zlkv2HA096A-","actions":"YQry-Rd6zfQ-","actionPadding":"TcpqL34s4lI-"};
29
+ styleInject_es.styleInject(css_248z$5);
30
+
31
+ var css_248z$4 = ".ifwwZOYTf8U- {\n position: relative;\n}\n\n.gIbHknFkZLI- {\n width: 100%;\n padding: calc(16px * 1);\n padding: var(--space-base);\n padding-right: calc((16px * 1.5) * 2.25);\n padding-right: calc(calc(16px * 1.5) * 2.25);\n padding-right: calc(var(--space-large) * 2.25);\n border: none;\n border-bottom: calc(16px / 16) solid rgb(225, 225, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n font-family: \"Inter\", Helvetica, Arial, sans-serif;\n font-family: var(--typography--fontFamily-normal);\n font-size: calc((16px * 1) * 0.875);\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n}\n\n.dZmEG-amk2U- {\n position: absolute;\n top: 50%;\n right: calc(16px * 1);\n right: var(--space-base);\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n padding: 0;\n border: none;\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgb(244, 244, 244);\n background-color: var(--color-surface--background);\n cursor: pointer;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n}\n\n.dZmEG-amk2U-: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.ifwwZOYTf8U-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n bottom: calc((16px * 1.5) * -1);\n bottom: calc(calc(16px * 1.5) * -1);\n bottom: calc(var(--space-large) * -1);\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n background-image: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n";
32
+ var styles$4 = {"search":"ifwwZOYTf8U-","searchInput":"gIbHknFkZLI-","clearSearch":"dZmEG-amk2U-"};
33
+ styleInject_es.styleInject(css_248z$4);
34
+
35
+ function ComboboxSearch(props) {
36
+ const searchRef = React.useRef(null);
37
+ React.useEffect(() => {
38
+ if (props.open) {
39
+ setTimeout(() => {
40
+ var _a;
41
+ (_a = searchRef.current) === null || _a === void 0 ? void 0 : _a.focus();
42
+ }, 0);
43
+ }
44
+ }, [props.open]);
45
+ return (React__default["default"].createElement("div", { className: styles$4.search },
46
+ React__default["default"].createElement("input", { type: "search", ref: searchRef, className: styles$4.searchInput, placeholder: props.placeholder ? `Search ${props.placeholder}` : "Search", onChange: (event) => handleSearch(event), value: props.searchValue }),
47
+ props.searchValue && (React__default["default"].createElement("button", { className: styles$4.clearSearch, onClick: clearSearch, "data-testid": "ATL-Combobox-Content-Search-Clear", "aria-label": "Clear search" },
48
+ React__default["default"].createElement(Icon.Icon, { name: "remove", size: "small" })))));
49
+ function clearSearch() {
50
+ var _a;
51
+ props.setSearchValue("");
52
+ (_a = searchRef.current) === null || _a === void 0 ? void 0 : _a.focus();
53
+ }
54
+ function handleSearch(event) {
55
+ props.setSearchValue(event.target.value);
56
+ }
57
+ }
58
+
59
+ var css_248z$3 = "._5n7VvEn39-Y- {\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n\n.KhX5VfZjAog- {\n display: -ms-flexbox;\n display: flex;\n max-height: calc((16px / 2) * 33.33);\n max-height: calc(calc(16px / 2) * 33.33);\n max-height: calc(var(--space-small) * 33.33);\n margin: 0;\n padding: 0;\n overflow: scroll;\n list-style: none;\n -ms-flex-direction: column;\n flex-direction: column;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n\n.NNCJVHYx6lc- {\n display: -ms-flexbox;\n display: flex;\n min-height: calc((calc(16px * 3) - calc(16px / 4)));\n min-height: calc((var(--space-largest) - var(--space-smaller)));\n box-sizing: border-box;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-radius: calc(16px / 4);\n border-radius: var(--radius-large);\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n font-weight: 500;\n cursor: pointer;\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.IvTItlT0MOQ-,\n.NNCJVHYx6lc-:hover,\n.NNCJVHYx6lc-:focus {\n background-color: rgb(244, 244, 244);\n background-color: var(--color-surface--background);\n}\n\n.NNCJVHYx6lc-: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._2IRm1sf-TUU-,\n.DTuoA8WPNzc- {\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n";
60
+ var styles$3 = {"container":"_5n7VvEn39-Y-","optionsList":"KhX5VfZjAog-","option":"NNCJVHYx6lc-","selectedOption":"IvTItlT0MOQ-","filterMessage":"_2IRm1sf-TUU-","emptyStateMessage":"DTuoA8WPNzc-"};
61
+ styleInject_es.styleInject(css_248z$3);
62
+
63
+ function ComboboxList(props) {
64
+ return (React__default["default"].createElement("div", { className: styles$3.container },
65
+ !props.showEmptyState && props.options.length > 0 && (React__default["default"].createElement("ul", { className: styles$3.optionsList, role: "listbox", ref: props.optionsListRef }, !props.showEmptyState &&
66
+ props.options.map(option => {
67
+ var _a;
68
+ const isSelected = option.id.toString() === ((_a = props.selected) === null || _a === void 0 ? void 0 : _a.id.toString());
69
+ return (React__default["default"].createElement("li", { ref: listItem => {
70
+ if (isSelected)
71
+ props.setSelectedElement(listItem);
72
+ }, key: option.id, tabIndex: -1, role: "option", "aria-selected": isSelected, onClick: () => props.selectionHandler(option), className: classnames__default["default"](styles$3.option, {
73
+ [styles$3.selectedOption]: isSelected,
74
+ }) },
75
+ option.label,
76
+ isSelected && React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" })));
77
+ }))),
78
+ !props.showEmptyState && props.options.length === 0 && (React__default["default"].createElement("div", { className: styles$3.filterMessage },
79
+ React__default["default"].createElement(Text.Text, { variation: "subdued" },
80
+ "No results for ",
81
+ `“${props.searchValue}”`))),
82
+ props.showEmptyState && (React__default["default"].createElement("div", { className: styles$3.emptyStateMessage },
83
+ React__default["default"].createElement(Text.Text, { variation: "subdued" }, getZeroIndexStateText(props.subjectNoun))))));
84
+ }
85
+ function getZeroIndexStateText(subjectNoun) {
86
+ if (subjectNoun) {
87
+ return `You don't have any ${subjectNoun} yet`;
88
+ }
89
+ return "No options yet";
90
+ }
91
+
92
+ var css_248z$2 = ".W8qMZnORYxI- {\n position: fixed;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n z-index: 6;\n z-index: var(--elevation-menu);\n background-color: transparent;\n}\n";
93
+ var styles$2 = {"overlay":"W8qMZnORYxI-"};
94
+ styleInject_es.styleInject(css_248z$2);
95
+
96
+ const ComboboxContext = React__default["default"].createContext({});
97
+ function ComboboxContextProvider(props) {
98
+ const [open, setOpen] = React.useState(false);
99
+ const wrapperRef = React.useRef(null);
100
+ return (React__default["default"].createElement(ComboboxContext.Provider, { value: { open, setOpen, wrapperRef } },
101
+ React__default["default"].createElement("div", { ref: wrapperRef },
102
+ open && (React__default["default"].createElement("div", { className: styles$2.overlay, onClick: () => setOpen(false), "data-testid": "ATL-Combobox-Overlay" })),
103
+ props.children)));
104
+ }
105
+
106
+ function useComboboxContent(options, open) {
107
+ const [searchValue, setSearchValue] = React.useState("");
108
+ const [selectedElement, setSelectedElement] = React.useState(null);
109
+ const optionsListRef = React.useRef(null);
110
+ const filteredOptions = options.filter(option => option.label.toLowerCase().includes(searchValue.toLowerCase()));
111
+ React.useEffect(() => {
112
+ if (open && selectedElement) {
113
+ selectedElement === null || selectedElement === void 0 ? void 0 : selectedElement.scrollIntoView({
114
+ block: "nearest",
115
+ });
116
+ }
117
+ }, [open, selectedElement]);
118
+ return {
119
+ searchValue,
120
+ setSearchValue,
121
+ setSelectedElement,
122
+ filteredOptions,
123
+ optionsListRef,
124
+ };
125
+ }
126
+
127
+ function useComboboxAccessibility(selectionCallback, filteredOptions, optionsListRef, open, setOpen, wrapperRef) {
128
+ const hasOptionsVisible = open && filteredOptions.length > 0;
129
+ const focusedIndex = React.useRef(null);
130
+ useRefocusOnActivator.useRefocusOnActivator(open);
131
+ const popperRef = useFocusTrap.useFocusTrap(open);
132
+ const { styles: popperStyles, attributes } = reactPopper.usePopper(wrapperRef.current, popperRef.current, {
133
+ modifiers: [
134
+ {
135
+ name: "flip",
136
+ options: {
137
+ fallbackPlacements: ["top-start"],
138
+ },
139
+ },
140
+ ],
141
+ placement: "bottom-start",
142
+ });
143
+ React.useEffect(() => {
144
+ focusedIndex.current = null;
145
+ }, [open, filteredOptions.length]);
146
+ React.useEffect(() => {
147
+ var _a;
148
+ if (open) {
149
+ (_a = popperRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("keydown", handleContentKeydown);
150
+ }
151
+ return () => {
152
+ var _a;
153
+ (_a = popperRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("keydown", handleContentKeydown);
154
+ };
155
+ }, [open, optionsListRef, filteredOptions]);
156
+ useOnKeyDown.useOnKeyDown(() => {
157
+ if (open) {
158
+ setOpen(false);
159
+ }
160
+ }, "Escape");
161
+ function handleContentKeydown(event) {
162
+ var _a;
163
+ if (!hasOptionsVisible)
164
+ return;
165
+ if (event.key === "Enter" || event.key === " ") {
166
+ const activeElementInList = (_a = optionsListRef.current) === null || _a === void 0 ? void 0 : _a.contains(document.activeElement);
167
+ if (!activeElementInList)
168
+ return;
169
+ handleKeyboardSelection(event);
170
+ }
171
+ if (event.key === "ArrowDown") {
172
+ handleKeyboardNavigation(event, 1);
173
+ }
174
+ if (event.key === "ArrowUp") {
175
+ handleKeyboardNavigation(event, -1);
176
+ }
177
+ }
178
+ function handleKeyboardNavigation(event, indexChange) {
179
+ var _a;
180
+ const newIndex = focusedIndex.current === null ? 0 : focusedIndex.current + indexChange;
181
+ if (newIndex < 0 || newIndex >= filteredOptions.length)
182
+ return;
183
+ const optionElement = (_a = optionsListRef.current) === null || _a === void 0 ? void 0 : _a.children[newIndex];
184
+ optionElement === null || optionElement === void 0 ? void 0 : optionElement.focus();
185
+ focusedIndex.current = newIndex;
186
+ event.preventDefault();
187
+ event.stopPropagation();
188
+ }
189
+ function handleKeyboardSelection(event) {
190
+ event.preventDefault();
191
+ event.stopPropagation();
192
+ if (focusedIndex.current !== null) {
193
+ selectionCallback(filteredOptions[focusedIndex.current]);
194
+ }
195
+ }
196
+ return {
197
+ popperRef,
198
+ popperStyles,
199
+ attributes,
200
+ };
201
+ }
202
+
203
+ function ComboboxContent(props) {
204
+ const { open, setOpen, wrapperRef } = React__default["default"].useContext(ComboboxContext);
205
+ const optionsExist = props.options.length > 0;
206
+ const { searchValue, setSearchValue, setSelectedElement, filteredOptions, optionsListRef, } = useComboboxContent(props.options, open);
207
+ const { popperRef, popperStyles, attributes } = useComboboxAccessibility(handleSelection, filteredOptions, optionsListRef, open, setOpen, wrapperRef);
208
+ const template = (React__default["default"].createElement("div", Object.assign({ ref: popperRef, id: "ATL-Combobox-Content", "data-testid": "ATL-Combobox-Content", tabIndex: 0, className: classnames__default["default"](styles$5.content, { [styles$5.hidden]: !open }), style: popperStyles.popper }, attributes.popper),
209
+ React__default["default"].createElement(ComboboxSearch, { open: open, placeholder: props.subjectNoun, searchValue: searchValue, setSearchValue: setSearchValue }),
210
+ React__default["default"].createElement(ComboboxList, { showEmptyState: !optionsExist, options: filteredOptions, selected: props.selected, optionsListRef: optionsListRef, setSelectedElement: setSelectedElement, selectionHandler: handleSelection, searchValue: searchValue, subjectNoun: props.subjectNoun }),
211
+ props.children && (React__default["default"].createElement("div", { className: styles$5.actions, role: "group" }, React__default["default"].Children.toArray(props.children).map((child, index, childrenArray) => (React__default["default"].createElement("div", { key: index, className: classnames__default["default"]({
212
+ [styles$5.actionPadding]: index === childrenArray.length - 1,
213
+ }) }, child)))))));
214
+ return ReactDOM__default["default"].createPortal(template, document.body);
215
+ function handleSelection(selection) {
216
+ props.onSelect(selection);
217
+ setSearchValue("");
218
+ setOpen(false);
219
+ }
220
+ }
221
+
222
+ var css_248z$1 = ".Ow9wSNnGP-g- {\n width: 100%;\n box-sizing: border-box;\n padding: 0 calc(16px / 2);\n padding: 0 var(--space-small);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.ncp0nKHQ7d8- {\n position: relative;\n width: 100%;\n min-height: calc((calc(16px * 3) - calc(16px / 2)));\n min-height: calc((var(--space-largest) - var(--space-small)));\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n border-radius: calc(16px / 4);\n border-radius: var(--radius-large);\n text-align: left;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n cursor: pointer;\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.ncp0nKHQ7d8-:focus {\n box-shadow: 0px 0px calc(16px / 4) calc(16px / 8)\n rgb(231, 213, 87);\n box-shadow: var(--shadow-focus);\n background-color: rgb(244, 244, 244);\n background-color: var(--color-surface--background);\n}\n\n.ncp0nKHQ7d8-:hover {\n background-color: rgb(244, 244, 244);\n background-color: var(--color-surface--background);\n}\n\n.ncp0nKHQ7d8- span {\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
223
+ var styles$1 = {"actionContainer":"Ow9wSNnGP-g-","actionButton":"ncp0nKHQ7d8-"};
224
+ styleInject_es.styleInject(css_248z$1);
225
+
226
+ function ComboboxAction(props) {
227
+ return (React__default["default"].createElement("div", { className: styles$1.actionContainer },
228
+ React__default["default"].createElement("button", { className: styles$1.actionButton, onClick: props.onClick, "aria-label": props.label },
229
+ React__default["default"].createElement(Typography.Typography, { element: "span", size: "base", textColor: "green", fontWeight: "semiBold" }, props.label))));
230
+ }
231
+
232
+ function ComboboxTriggerButton(props) {
233
+ const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
234
+ return (React__default["default"].createElement(Button.Button, { role: "combobox", "aria-expanded": open, "aria-haspopup": "listbox", "aria-controls": "ATL-Combobox-Content", "aria-autocomplete": "list", label: props.label, variation: props.variation, type: props.type, onClick: () => setOpen(!open), icon: props.icon, iconOnRight: props.iconOnRight }));
235
+ }
236
+
237
+ var css_248z = ".NtYpU6bZMtM- {\n display: -ms-inline-flexbox;\n display: inline-flex;\n padding: calc(16px / 2) calc(16px * 1);\n padding: var(--space-small) var(--space-base);\n border: calc(16px / 16) solid rgb(225, 225, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc((16px / 4) * 5);\n border-radius: calc(calc(16px / 4) * 5);\n border-radius: calc(var(--radius-large) * 5);\n font-size: calc((16px * 1) * 0.875);\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.NtYpU6bZMtM-: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.ftceU-6iBO0- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-align: center;\n align-items: center;\n}\n";
238
+ var styles = {"trigger":"NtYpU6bZMtM-","triggerIcon":"ftceU-6iBO0-"};
239
+ styleInject_es.styleInject(css_248z);
240
+
241
+ function ComboboxTriggerChip(props) {
242
+ const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
243
+ return (React__default["default"].createElement("button", { className: styles.trigger, role: "combobox", "aria-expanded": open, "aria-haspopup": "listbox", "aria-controls": "ATL-Combobox-Content", "aria-autocomplete": "list", onClick: () => {
244
+ setOpen(!open);
245
+ } },
246
+ React__default["default"].createElement(Typography.Typography, { fontWeight: "semiBold", textColor: "heading" }, props.label),
247
+ React__default["default"].createElement("div", { className: styles.triggerIcon },
248
+ React__default["default"].createElement(Icon.Icon, { color: "surfaceReverse", name: "add", size: "small" }))));
249
+ }
250
+
251
+ const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger element";
252
+ const COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE = "Combobox must have a Trigger and Combobox.Content element";
253
+ const Combobox = (props) => {
254
+ const { contentElement, triggerElement } = useComboboxValidation(props.children);
255
+ return (React__default["default"].createElement(ComboboxContextProvider, null,
256
+ triggerElement,
257
+ contentElement));
258
+ };
259
+ function useComboboxValidation(children) {
260
+ const childrenArray = React__default["default"].Children.toArray(children);
261
+ let triggerElement, contentElement, multipleTriggersFound = false;
262
+ childrenArray.forEach(child => {
263
+ if (isTriggerElement(child)) {
264
+ if (triggerElement) {
265
+ multipleTriggersFound = true;
266
+ }
267
+ triggerElement = child;
268
+ }
269
+ if (isContentElement(child)) {
270
+ contentElement = child;
271
+ }
272
+ });
273
+ useAssert.useAssert(multipleTriggersFound, COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE);
274
+ useAssert.useAssert(!triggerElement || !contentElement, COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE);
275
+ return {
276
+ contentElement,
277
+ triggerElement,
278
+ };
279
+ }
280
+ function isTriggerElement(child) {
281
+ return (React__default["default"].isValidElement(child) &&
282
+ (child.type === ComboboxTriggerButton || child.type === ComboboxTriggerChip));
283
+ }
284
+ function isContentElement(child) {
285
+ return React__default["default"].isValidElement(child) && child.type === ComboboxContent;
286
+ }
287
+ Combobox.TriggerButton = ComboboxTriggerButton;
288
+ Combobox.TriggerChip = ComboboxTriggerChip;
289
+ Combobox.Content = ComboboxContent;
290
+ Combobox.Action = ComboboxAction;
291
+
292
+ exports.COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE = COMBOBOX_REQUIRED_CHILDREN_ERROR_MESSAGE;
293
+ exports.COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE;
294
+ exports.Combobox = Combobox;
295
+ exports.ComboboxContextProvider = ComboboxContextProvider;
@@ -2,28 +2,28 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var ConfirmationModal = require('../ConfirmationModal-6b61ebf5.js');
5
+ var ConfirmationModal = require('../ConfirmationModal-92f07027.js');
6
6
  require('react');
7
7
  require('@jobber/hooks/useOnKeyDown');
8
- require('../Modal-a9ab9565.js');
8
+ require('../Modal-dcdc0032.js');
9
9
  require('react-dom');
10
10
  require('classnames');
11
11
  require('framer-motion');
12
12
  require('@jobber/hooks/useRefocusOnActivator');
13
13
  require('@jobber/hooks/useFocusTrap');
14
14
  require('../style-inject.es-9d2f5f4e.js');
15
- require('../Heading-a1191b15.js');
16
- require('../Typography-fd6f932a.js');
17
- require('../Button-fd8413b2.js');
15
+ require('../Heading-4562900a.js');
16
+ require('../Typography-9bff9c91.js');
17
+ require('../Button-d89f2271.js');
18
18
  require('react-router-dom');
19
19
  require('../Icon-405a216c.js');
20
20
  require('@jobber/design');
21
- require('../ButtonDismiss-82680c7d.js');
21
+ require('../ButtonDismiss-250840a4.js');
22
22
  require('../Content-2ca1ffe1.js');
23
- require('../Markdown-f6748dcb.js');
23
+ require('../Markdown-b37cf9ec.js');
24
24
  require('react-markdown');
25
- require('../Text-e7ed0974.js');
26
- require('../Emphasis-76a10790.js');
25
+ require('../Text-59bde58c.js');
26
+ require('../Emphasis-cc3456ac.js');
27
27
 
28
28
 
29
29
 
@@ -2,9 +2,9 @@
2
2
 
3
3
  var React = require('react');
4
4
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
5
- var Modal = require('./Modal-a9ab9565.js');
5
+ var Modal = require('./Modal-dcdc0032.js');
6
6
  var Content = require('./Content-2ca1ffe1.js');
7
- var Markdown = require('./Markdown-f6748dcb.js');
7
+ var Markdown = require('./Markdown-b37cf9ec.js');
8
8
 
9
9
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
10
10
 
@@ -3,18 +3,18 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var Card = require('../Card-cc2ffbaa.js');
6
+ var Card = require('../Card-69304e99.js');
7
7
  var Content = require('../Content-2ca1ffe1.js');
8
- var Emphasis = require('../Emphasis-76a10790.js');
8
+ var Emphasis = require('../Emphasis-cc3456ac.js');
9
9
  require('classnames');
10
10
  require('../style-inject.es-9d2f5f4e.js');
11
- require('../Heading-a1191b15.js');
12
- require('../Typography-fd6f932a.js');
13
- require('../Button-fd8413b2.js');
11
+ require('../Heading-4562900a.js');
12
+ require('../Typography-9bff9c91.js');
13
+ require('../Button-d89f2271.js');
14
14
  require('react-router-dom');
15
15
  require('../Icon-405a216c.js');
16
16
  require('@jobber/design');
17
- require('../Menu-51f8712f.js');
17
+ require('../Menu-cec53b50.js');
18
18
  require('uuid');
19
19
  require('framer-motion');
20
20
  require('@jobber/hooks/useOnKeyDown');
@@ -5,47 +5,47 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib_es6 = require('../tslib.es6-5b8768b7.js');
6
6
  var React = require('react');
7
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
- var Text = require('../Text-e7ed0974.js');
8
+ var Text = require('../Text-59bde58c.js');
9
9
  var Glimmer = require('../Glimmer-cfa92a88.js');
10
10
  var framerMotion = require('framer-motion');
11
11
  var classnames = require('classnames');
12
12
  var noop = require('lodash/noop');
13
13
  var reactRouterDom = require('react-router-dom');
14
- var Button = require('../Button-fd8413b2.js');
14
+ var Button = require('../Button-d89f2271.js');
15
15
  var design = require('@jobber/design');
16
- var Typography = require('../Typography-fd6f932a.js');
16
+ var Typography = require('../Typography-9bff9c91.js');
17
17
  var ReactDOM = require('react-dom');
18
- var Tooltip = require('../Tooltip-bf67fe6e.js');
18
+ var Tooltip = require('../Tooltip-59dbab5b.js');
19
19
  require('react-popper');
20
20
  var useFocusTrap = require('@jobber/hooks/useFocusTrap');
21
21
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
22
22
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
23
23
  var foundation = require('@jobber/design/foundation');
24
24
  var isEmpty = require('lodash/isEmpty');
25
- var InlineLabel = require('../InlineLabel-afd5fc6f.js');
25
+ var InlineLabel = require('../InlineLabel-3d461632.js');
26
26
  var styles$f = require('@jobber/components/DataList/DataList.css');
27
27
  require('uuid');
28
28
  require('react-hook-form');
29
- var Checkbox = require('../Checkbox-3bccf65c.js');
29
+ var Checkbox = require('../Checkbox-eac63b7f.js');
30
30
  var FormatDate = require('../FormatDate-70ea5b43.js');
31
- var Heading = require('../Heading-a1191b15.js');
31
+ var Heading = require('../Heading-4562900a.js');
32
32
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
33
33
  var useInView = require('@jobber/hooks/useInView');
34
34
  var Icon = require('../Icon-405a216c.js');
35
- var Popover = require('../Popover-bbfc6aa1.js');
35
+ var Popover = require('../Popover-d401fb54.js');
36
36
  var Content = require('../Content-2ca1ffe1.js');
37
- var Chip = require('../Chip-4916a642.js');
37
+ var Chip = require('../Chip-4d8e6370.js');
38
38
  require('@jobber/hooks/useAssert');
39
39
  require('../Avatar-1aa30ee1.js');
40
40
  require('color');
41
41
  var debounce = require('lodash/debounce');
42
- var InputText = require('../InputText-d1a52550.js');
42
+ var InputText = require('../InputText-5ac5cfe0.js');
43
43
  var Spinner = require('../Spinner-9d8fc7ff.js');
44
- require('../ButtonDismiss-82680c7d.js');
44
+ require('../ButtonDismiss-250840a4.js');
45
45
  require('lodash/sortBy');
46
46
  require('@jobber/hooks/useLiveAnnounce');
47
- require('../FormField-d6138b7f.js');
48
- require('../InputValidation-b5a3d92c.js');
47
+ require('../FormField-bef41ec9.js');
48
+ require('../InputValidation-4e809bdd.js');
49
49
 
50
50
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
51
51
 
@@ -9,20 +9,20 @@ var jobberHooks = require('@jobber/hooks/useResizeObserver');
9
9
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
10
10
  var Glimmer = require('../Glimmer-cfa92a88.js');
11
11
  var tslib_es6 = require('../tslib.es6-5b8768b7.js');
12
- var Option = require('../Option-b903e7ac.js');
13
- var Button = require('../Button-fd8413b2.js');
14
- var Text = require('../Text-e7ed0974.js');
12
+ var Option = require('../Option-9f4a65da.js');
13
+ var Button = require('../Button-d89f2271.js');
14
+ var Text = require('../Text-59bde58c.js');
15
15
  require('../Content-2ca1ffe1.js');
16
- require('../FormField-d6138b7f.js');
16
+ require('../FormField-bef41ec9.js');
17
17
  require('uuid');
18
18
  require('react-hook-form');
19
19
  require('../Icon-405a216c.js');
20
20
  require('@jobber/design');
21
- require('../InputValidation-b5a3d92c.js');
21
+ require('../InputValidation-4e809bdd.js');
22
22
  require('framer-motion');
23
23
  require('../Spinner-9d8fc7ff.js');
24
24
  require('react-router-dom');
25
- require('../Typography-fd6f932a.js');
25
+ require('../Typography-9bff9c91.js');
26
26
 
27
27
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
28
28
 
@@ -2,14 +2,14 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var DatePicker = require('../DatePicker-b31baae4.js');
5
+ var DatePicker = require('../DatePicker-39d2dc8b.js');
6
6
  require('react');
7
7
  require('classnames');
8
8
  require('react-datepicker');
9
9
  require('@jobber/hooks/useRefocusOnActivator');
10
10
  require('../style-inject.es-9d2f5f4e.js');
11
- require('../Typography-fd6f932a.js');
12
- require('../Button-fd8413b2.js');
11
+ require('../Typography-9bff9c91.js');
12
+ require('../Button-d89f2271.js');
13
13
  require('react-router-dom');
14
14
  require('../Icon-405a216c.js');
15
15
  require('@jobber/design');
@@ -5,8 +5,8 @@ var classnames = require('classnames');
5
5
  var ReactDatePicker = require('react-datepicker');
6
6
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
7
7
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
8
- var Typography = require('./Typography-fd6f932a.js');
9
- var Button = require('./Button-fd8413b2.js');
8
+ var Typography = require('./Typography-9bff9c91.js');
9
+ var Button = require('./Button-d89f2271.js');
10
10
  var omit = require('lodash/omit');
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -4,7 +4,7 @@ Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
6
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
7
- var Typography = require('../Typography-fd6f932a.js');
7
+ var Typography = require('../Typography-9bff9c91.js');
8
8
  require('classnames');
9
9
 
10
10
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -6,7 +6,7 @@ var React = require('react');
6
6
  var jobberHooks = require('@jobber/hooks/useResizeObserver');
7
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
8
  var Icon = require('../Icon-405a216c.js');
9
- var Typography = require('../Typography-fd6f932a.js');
9
+ var Typography = require('../Typography-9bff9c91.js');
10
10
  require('@jobber/design');
11
11
  require('classnames');
12
12
 
@@ -5,10 +5,10 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var React = require('react');
6
6
  var classnames = require('classnames');
7
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
- var Heading = require('../Heading-a1191b15.js');
9
- var ButtonDismiss = require('../ButtonDismiss-82680c7d.js');
10
- require('../Typography-fd6f932a.js');
11
- require('../Button-fd8413b2.js');
8
+ var Heading = require('../Heading-4562900a.js');
9
+ var ButtonDismiss = require('../ButtonDismiss-250840a4.js');
10
+ require('../Typography-9bff9c91.js');
11
+ require('../Button-d89f2271.js');
12
12
  require('react-router-dom');
13
13
  require('../Icon-405a216c.js');
14
14
  require('@jobber/design');
@@ -2,9 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Emphasis = require('../Emphasis-76a10790.js');
5
+ var Emphasis = require('../Emphasis-cc3456ac.js');
6
6
  require('react');
7
- require('../Typography-fd6f932a.js');
7
+ require('../Typography-9bff9c91.js');
8
8
  require('classnames');
9
9
  require('../style-inject.es-9d2f5f4e.js');
10
10
 
@@ -1,7 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
- var Typography = require('./Typography-fd6f932a.js');
4
+ var Typography = require('./Typography-9bff9c91.js');
5
5
 
6
6
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
7
7
 
@@ -6,14 +6,14 @@ var React = require('react');
6
6
  var framerMotion = require('framer-motion');
7
7
  var classnames = require('classnames');
8
8
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
9
- var Heading = require('../Heading-a1191b15.js');
10
- var Text = require('../Text-e7ed0974.js');
9
+ var Heading = require('../Heading-4562900a.js');
10
+ var Text = require('../Text-59bde58c.js');
11
11
  var Content = require('../Content-2ca1ffe1.js');
12
- var Switch = require('../Switch-e75145cc.js');
13
- var Button = require('../Button-fd8413b2.js');
14
- var Emphasis = require('../Emphasis-76a10790.js');
15
- var Markdown = require('../Markdown-f6748dcb.js');
16
- require('../Typography-fd6f932a.js');
12
+ var Switch = require('../Switch-165f01e3.js');
13
+ var Button = require('../Button-d89f2271.js');
14
+ var Emphasis = require('../Emphasis-cc3456ac.js');
15
+ var Markdown = require('../Markdown-b37cf9ec.js');
16
+ require('../Typography-9bff9c91.js');
17
17
  require('react-router-dom');
18
18
  require('../Icon-405a216c.js');
19
19
  require('@jobber/design');
@@ -2,20 +2,20 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var FormField = require('../FormField-d6138b7f.js');
5
+ var FormField = require('../FormField-bef41ec9.js');
6
6
  require('../tslib.es6-5b8768b7.js');
7
7
  require('react');
8
8
  require('uuid');
9
9
  require('react-hook-form');
10
10
  require('../style-inject.es-9d2f5f4e.js');
11
11
  require('classnames');
12
- require('../Button-fd8413b2.js');
12
+ require('../Button-d89f2271.js');
13
13
  require('react-router-dom');
14
14
  require('../Icon-405a216c.js');
15
15
  require('@jobber/design');
16
- require('../Typography-fd6f932a.js');
17
- require('../Text-e7ed0974.js');
18
- require('../InputValidation-b5a3d92c.js');
16
+ require('../Typography-9bff9c91.js');
17
+ require('../Text-59bde58c.js');
18
+ require('../InputValidation-4e809bdd.js');
19
19
  require('framer-motion');
20
20
  require('../Spinner-9d8fc7ff.js');
21
21
 
@@ -6,10 +6,10 @@ var uuid = require('uuid');
6
6
  var reactHookForm = require('react-hook-form');
7
7
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
8
8
  var classnames = require('classnames');
9
- var Button = require('./Button-fd8413b2.js');
9
+ var Button = require('./Button-d89f2271.js');
10
10
  var Icon = require('./Icon-405a216c.js');
11
- var Text = require('./Text-e7ed0974.js');
12
- var InputValidation = require('./InputValidation-b5a3d92c.js');
11
+ var Text = require('./Text-59bde58c.js');
12
+ var InputValidation = require('./InputValidation-4e809bdd.js');
13
13
  var Spinner = require('./Spinner-9d8fc7ff.js');
14
14
 
15
15
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }