@jobber/components 4.43.0 → 4.43.2-fix-import.1

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 (109) 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/DataList.d.ts +5 -2
  35. package/dist/DataList/DataList.types.d.ts +13 -2
  36. package/dist/DataList/DataList.utils.d.ts +2 -1
  37. package/dist/DataList/components/DataListAction/DataListAction.d.ts +2 -3
  38. package/dist/DataList/components/DataListBulkActions/DataListBulkActions.const.d.ts +1 -0
  39. package/dist/DataList/components/DataListBulkActions/DataListBulkActions.d.ts +4 -0
  40. package/dist/DataList/components/DataListBulkActions/index.d.ts +1 -0
  41. package/dist/DataList/components/DataListItemActions/DataListItemActionsOverflow.d.ts +3 -3
  42. package/dist/DataList/components/DataListOverflowFade/DataListOverflowFade.d.ts +6 -0
  43. package/dist/DataList/components/DataListOverflowFade/index.d.ts +2 -0
  44. package/dist/DataList/index.js +283 -235
  45. package/dist/DataTable/index.js +6 -6
  46. package/dist/DatePicker/index.js +3 -3
  47. package/dist/{DatePicker-b31baae4.js → DatePicker-39d2dc8b.js} +2 -2
  48. package/dist/DescriptionList/index.js +1 -1
  49. package/dist/Disclosure/index.js +1 -1
  50. package/dist/Drawer/index.js +4 -4
  51. package/dist/Emphasis/index.js +2 -2
  52. package/dist/{Emphasis-76a10790.js → Emphasis-cc3456ac.js} +1 -1
  53. package/dist/FeatureSwitch/index.js +7 -7
  54. package/dist/FormField/index.js +5 -5
  55. package/dist/{FormField-d6138b7f.js → FormField-bef41ec9.js} +3 -3
  56. package/dist/FormatFile/index.js +10 -10
  57. package/dist/{FormatFile-aa1898f9.js → FormatFile-a470c0f2.js} +4 -4
  58. package/dist/Gallery/index.js +11 -11
  59. package/dist/Heading/index.js +2 -2
  60. package/dist/{Heading-a1191b15.js → Heading-4562900a.js} +1 -1
  61. package/dist/InlineLabel/index.js +2 -2
  62. package/dist/{InlineLabel-afd5fc6f.js → InlineLabel-3d461632.js} +1 -1
  63. package/dist/InputAvatar/index.js +3 -3
  64. package/dist/InputDate/index.js +6 -6
  65. package/dist/InputEmail/index.js +5 -5
  66. package/dist/InputFile/index.js +3 -3
  67. package/dist/{InputFile-2a06c2c0.js → InputFile-d327dee3.js} +2 -2
  68. package/dist/InputNumber/index.js +6 -6
  69. package/dist/{InputNumber-07b03067.js → InputNumber-5640fb55.js} +1 -1
  70. package/dist/InputPassword/index.js +5 -5
  71. package/dist/InputPhoneNumber/index.js +5 -5
  72. package/dist/InputText/index.js +6 -6
  73. package/dist/{InputText-d1a52550.js → InputText-5ac5cfe0.js} +1 -1
  74. package/dist/InputTime/index.js +5 -5
  75. package/dist/InputValidation/index.js +3 -3
  76. package/dist/{InputValidation-b5a3d92c.js → InputValidation-4e809bdd.js} +1 -1
  77. package/dist/LightBox/index.js +4 -4
  78. package/dist/{LightBox-437a1c8b.js → LightBox-02ca409e.js} +2 -2
  79. package/dist/Link/Link.d.ts +1 -2
  80. package/dist/Link/index.d.ts +1 -1
  81. package/dist/List/index.js +5 -5
  82. package/dist/Markdown/index.js +5 -5
  83. package/dist/{Markdown-f6748dcb.js → Markdown-b37cf9ec.js} +3 -3
  84. package/dist/Menu/index.js +3 -3
  85. package/dist/{Menu-51f8712f.js → Menu-cec53b50.js} +2 -2
  86. package/dist/Modal/index.js +5 -5
  87. package/dist/{Modal-a9ab9565.js → Modal-dcdc0032.js} +3 -3
  88. package/dist/MultiSelect/index.js +3 -3
  89. package/dist/{Option-b903e7ac.js → Option-9f4a65da.js} +1 -1
  90. package/dist/Page/index.js +7 -7
  91. package/dist/Popover/index.js +4 -4
  92. package/dist/{Popover-bbfc6aa1.js → Popover-d401fb54.js} +1 -1
  93. package/dist/RadioGroup/index.js +3 -3
  94. package/dist/{RadioGroup-8e76d20b.js → RadioGroup-46833fac.js} +1 -1
  95. package/dist/RecurringSelect/index.js +8 -8
  96. package/dist/Select/index.js +6 -6
  97. package/dist/StatusLabel/index.js +2 -2
  98. package/dist/Switch/index.js +2 -2
  99. package/dist/{Switch-e75145cc.js → Switch-165f01e3.js} +1 -1
  100. package/dist/Tabs/index.js +1 -1
  101. package/dist/Text/index.js +2 -2
  102. package/dist/{Text-e7ed0974.js → Text-59bde58c.js} +1 -1
  103. package/dist/Toast/index.js +2 -2
  104. package/dist/Tooltip/index.js +3 -3
  105. package/dist/{Tooltip-bf67fe6e.js → Tooltip-59dbab5b.js} +1 -1
  106. package/dist/Typography/index.js +1 -1
  107. package/dist/{Typography-fd6f932a.js → Typography-9bff9c91.js} +2 -2
  108. package/package.json +3 -3
  109. /package/dist/DataList/components/{DataListFilters/DataListFilter.const.d.ts → DataListOverflowFade/DataListOverflowFade.const.d.ts} +0 -0
@@ -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');
@@ -6,7 +6,8 @@ import { DataListEmptyState } from "./components/DataListEmptyState";
6
6
  import { DataListItemActions } from "./components/DataListItemActions";
7
7
  import { DataListAction } from "./components/DataListAction";
8
8
  import { DataListLayoutActions } from "./components/DataListLayoutActions";
9
- import { DataListObject, DataListProps } from "./DataList.types";
9
+ import { DataListBulkActionProps, DataListObject, DataListProps } from "./DataList.types";
10
+ import { DataListBulkActions } from "./components/DataListBulkActions";
10
11
  export declare function DataList<T extends DataListObject>({ sorting, ...props }: DataListProps<T>): JSX.Element;
11
12
  export declare namespace DataList {
12
13
  var Layout: typeof DataListLayout;
@@ -15,5 +16,7 @@ export declare namespace DataList {
15
16
  var Filters: typeof DataListFilters;
16
17
  var Search: typeof DataListSearch;
17
18
  var ItemActions: typeof DataListItemActions;
18
- var Action: typeof DataListAction;
19
+ var BulkActions: typeof DataListBulkActions;
20
+ var ItemAction: typeof DataListAction;
21
+ var BatchAction: (props: DataListBulkActionProps) => JSX.Element;
19
22
  }
@@ -148,6 +148,7 @@ export interface DataListContextProps<T extends DataListObject> extends DataList
148
148
  readonly emptyStateComponents?: ReactElement<DataListEmptyStateProps>[];
149
149
  readonly layoutComponents?: ReactElement<DataListLayoutProps<T>>[];
150
150
  readonly itemActionComponent?: ReactElement<DataListItemActionsProps<T>>;
151
+ readonly bulkActionsComponent?: ReactElement<DataListItemActionsProps<T>>;
151
152
  }
152
153
  export interface DataListLayoutContextProps {
153
154
  readonly isInLayoutProvider: boolean;
@@ -174,6 +175,13 @@ interface BaseDataListItemActionsProps<T extends DataListObject> {
174
175
  */
175
176
  readonly onClick?: (item: T) => void;
176
177
  }
178
+ export interface DataListBulkActionsProps {
179
+ /**
180
+ * The actions to render on the top of the DataList to make actions to multiple items.
181
+ * This only accepts the DataList.BatchAction component.
182
+ */
183
+ readonly children?: Fragment<ReactElement<DataListBulkActionProps>>;
184
+ }
177
185
  interface DataListItemActionsPropsWithURL<T extends DataListObject> extends BaseDataListItemActionsProps<T> {
178
186
  /**
179
187
  * If a normal page navigation is needed, use this prop to change the element
@@ -207,6 +215,9 @@ export interface DataListActionProps<T extends DataListObject> {
207
215
  */
208
216
  readonly onClick?: (data: T) => void;
209
217
  }
210
- export interface InternalDataListActionProps<T extends DataListObject> extends DataListActionProps<T> {
211
- readonly item: T;
218
+ export interface DataListBulkActionProps extends DataListActionProps<DataListObject> {
219
+ /**
220
+ * The callback function when the action is clicked.
221
+ */
222
+ readonly onClick?: () => void;
212
223
  }
@@ -1,4 +1,4 @@
1
- import { ReactElement } from "react";
1
+ import React, { ReactElement } from "react";
2
2
  import { DataListHeader, DataListItemType, DataListItemTypeFromHeader, DataListObject } from "./DataList.types";
3
3
  import { Breakpoints } from "./DataList.const";
4
4
  /**
@@ -18,3 +18,4 @@ export declare function generateListItemElement<T extends DataListObject>(item:
18
18
  */
19
19
  export declare function generateHeaderElements<T extends DataListObject>(headers: DataListHeader<T>): DataListItemTypeFromHeader<T, DataListHeader<T>> | undefined;
20
20
  export declare function sortSizeProp(sizeProp: Breakpoints[]): ("xs" | "sm" | "md" | "lg" | "xl")[];
21
+ export declare function getExposedActions(childrenArray: ReactElement[], childCount?: number): React.ReactElement<any, string | React.JSXElementConstructor<any>>[];
@@ -1,4 +1,3 @@
1
1
  /// <reference types="react" />
2
- import { DataListActionProps, DataListObject, InternalDataListActionProps } from "../../DataList.types";
3
- export declare function DataListAction<T extends DataListObject>(_: DataListActionProps<T>): null;
4
- export declare function InternalDataListAction<T extends DataListObject>({ label, icon, destructive, onClick, item, }: InternalDataListActionProps<T>): JSX.Element;
2
+ import { DataListActionProps, DataListObject } from "@jobber/components/DataList/DataList.types";
3
+ export declare function DataListAction<T extends DataListObject>({ label, icon, destructive, onClick, }: DataListActionProps<T>): JSX.Element;
@@ -0,0 +1 @@
1
+ export declare const BULK_ACTIONS_CONTAINER_TEST_ID = "ATL-DataListBulkActions-Container";
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { DataListBulkActionsProps } from "../../DataList.types";
3
+ export declare function DataListBulkActions(_: DataListBulkActionsProps): null;
4
+ export declare function InternalDataListBulkActions(): JSX.Element | null;
@@ -0,0 +1 @@
1
+ export * from "./DataListBulkActions";
@@ -1,7 +1,7 @@
1
1
  import { ReactElement } from "react";
2
- import { DataListActionProps, DataListObject, InternalDataListActionProps } from "../../DataList.types";
3
- interface DataListItemActionsOverflowProps<T extends DataListObject> extends Partial<Pick<InternalDataListActionProps<T>, "item">> {
2
+ import { DataListActionProps, DataListObject } from "../../DataList.types";
3
+ interface DataListItemActionsOverflowProps<T extends DataListObject> {
4
4
  readonly actions: ReactElement<DataListActionProps<T>>[];
5
5
  }
6
- export declare function DataListItemActionsOverflow<T extends DataListObject>({ item, actions, }: DataListItemActionsOverflowProps<T>): JSX.Element;
6
+ export declare function DataListItemActionsOverflow<T extends DataListObject>({ actions, }: DataListItemActionsOverflowProps<T>): JSX.Element;
7
7
  export {};
@@ -0,0 +1,6 @@
1
+ import React from "react";
2
+ interface DataListOverflowFadeProps {
3
+ readonly children: React.ReactNode;
4
+ }
5
+ export declare function DataListOverflowFade({ children }: DataListOverflowFadeProps): JSX.Element;
6
+ export {};
@@ -0,0 +1,2 @@
1
+ export * from "./DataListOverflowFade";
2
+ export * from "./DataListOverflowFade.const";