@jobber/components 4.58.5 → 4.59.1-st-spike-w.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 (133) hide show
  1. package/dist/AnimatedSwitcher/index.js +5 -13
  2. package/dist/{AnimatedSwitcher-d1e1ddcf.js → AnimatedSwitcher-6ffd5003.js} +9 -15
  3. package/dist/Autocomplete/index.js +57 -68
  4. package/dist/Avatar/index.js +7 -15
  5. package/dist/{Avatar-1aa30ee1.js → Avatar-b2e862de.js} +13 -21
  6. package/dist/Banner/index.js +29 -38
  7. package/dist/Button/index.js +8 -16
  8. package/dist/{Button-db6114a6.js → Button-319d8fa0.js} +15 -22
  9. package/dist/ButtonDismiss/index.js +9 -17
  10. package/dist/ButtonDismiss-85986110.js +8 -0
  11. package/dist/Card/index.js +15 -23
  12. package/dist/{Card-116af709.js → Card-c1970a7c.js} +27 -34
  13. package/dist/Checkbox/index.js +11 -19
  14. package/dist/{Checkbox-bc4bc968.js → Checkbox-e4733fb4.js} +30 -37
  15. package/dist/Chip/index.js +24 -33
  16. package/dist/{Chip-4f12eec8.js → Chip-12a64c38.js} +94 -106
  17. package/dist/{Chip-f8b8fd89.js → Chip-40f5214c.js} +29 -37
  18. package/dist/Chips/index.js +25 -34
  19. package/dist/Combobox/Combobox.d.ts +3 -8
  20. package/dist/Combobox/Combobox.types.d.ts +71 -44
  21. package/dist/Combobox/ComboboxProvider.d.ts +12 -4
  22. package/dist/Combobox/components/ComboboxActivator/ComboboxActivator.d.ts +1 -4
  23. package/dist/Combobox/components/ComboboxOption/ComboboxOption.d.ts +6 -2
  24. package/dist/Combobox/components/ComboboxTrigger/ComboboxTrigger.d.ts +2 -6
  25. package/dist/Combobox/components/ComboboxTrigger/index.d.ts +0 -2
  26. package/dist/Combobox/hooks/useCombobox.d.ts +15 -0
  27. package/dist/Combobox/hooks/useComboboxAccessibility.d.ts +1 -1
  28. package/dist/Combobox/hooks/useComboboxContent.d.ts +1 -6
  29. package/dist/Combobox/hooks/useComboboxValidation.d.ts +11 -9
  30. package/dist/Combobox/hooks/useMakeComboboxHandlers.d.ts +7 -0
  31. package/dist/Combobox/index.js +219 -247
  32. package/dist/ConfirmationModal/index.js +22 -30
  33. package/dist/{ConfirmationModal-285c3cbe.js → ConfirmationModal-86b42ca0.js} +14 -20
  34. package/dist/Content/index.js +4 -12
  35. package/dist/{Content-2ca1ffe1.js → Content-3354c281.js} +8 -14
  36. package/dist/Countdown/index.js +8 -17
  37. package/dist/DataDump/index.js +24 -32
  38. package/dist/DataList/index.js +256 -268
  39. package/dist/DataTable/index.js +92 -123
  40. package/dist/DatePicker/index.js +12 -20
  41. package/dist/{DatePicker-49213434.js → DatePicker-9f1e19a5.js} +30 -39
  42. package/dist/DescriptionList/index.js +9 -17
  43. package/dist/Disclosure/index.js +21 -29
  44. package/dist/Divider/index.js +7 -16
  45. package/dist/Drawer/index.js +24 -34
  46. package/dist/Emphasis/index.js +5 -13
  47. package/dist/Emphasis-edd2af9b.js +13 -0
  48. package/dist/FeatureSwitch/index.js +39 -48
  49. package/dist/Flex/index.js +6 -15
  50. package/dist/Form/index.js +11 -19
  51. package/dist/FormField/index.js +16 -24
  52. package/dist/{FormField-fa9254dc.js → FormField-99918ed4.js} +58 -65
  53. package/dist/FormatDate/index.js +2 -11
  54. package/dist/{FormatDate-70ea5b43.js → FormatDate-720b39cf.js} +3 -10
  55. package/dist/FormatEmail/index.js +7 -16
  56. package/dist/FormatFile/index.js +27 -35
  57. package/dist/{FormatFile-6423c3b5.js → FormatFile-e1498cb9.js} +44 -52
  58. package/dist/FormatRelativeDateTime/index.js +7 -15
  59. package/dist/FormatTime/index.js +3 -11
  60. package/dist/Gallery/index.js +40 -49
  61. package/dist/Glimmer/index.js +6 -15
  62. package/dist/{Glimmer-cfa92a88.js → Glimmer-d3be9219.js} +25 -33
  63. package/dist/Grid/index.js +14 -24
  64. package/dist/Heading/index.js +5 -13
  65. package/dist/{Heading-4cde9989.js → Heading-04994667.js} +4 -10
  66. package/dist/Icon/index.js +3 -11
  67. package/dist/Icon-22723fe6.js +34 -0
  68. package/dist/InlineLabel/index.js +5 -13
  69. package/dist/{InlineLabel-a24706c4.js → InlineLabel-4df86867.js} +9 -16
  70. package/dist/InputAvatar/index.js +32 -40
  71. package/dist/InputDate/index.js +26 -35
  72. package/dist/InputEmail/index.js +18 -27
  73. package/dist/InputFile/index.js +14 -23
  74. package/dist/{InputFile-25c3369b.js → InputFile-3bbaa09e.js} +24 -33
  75. package/dist/InputGroup/index.js +4 -12
  76. package/dist/{InputGroup-3fdde16b.js → InputGroup-1b4abd36.js} +9 -16
  77. package/dist/InputNumber/index.js +17 -25
  78. package/dist/{InputNumber-ea9fcee1.js → InputNumber-fa8132f3.js} +7 -13
  79. package/dist/InputPassword/index.js +19 -27
  80. package/dist/InputPhoneNumber/index.js +28 -36
  81. package/dist/InputText/index.js +17 -25
  82. package/dist/{InputText-ab237501.js → InputText-6d262128.js} +9 -15
  83. package/dist/InputTime/index.js +29 -38
  84. package/dist/InputValidation/index.js +9 -17
  85. package/dist/InputValidation-b6adff05.js +23 -0
  86. package/dist/LightBox/index.js +16 -24
  87. package/dist/LightBox-8c8f30b1.js +109 -0
  88. package/dist/Link/index.js +3 -11
  89. package/dist/List/index.js +47 -59
  90. package/dist/Markdown/index.js +10 -18
  91. package/dist/Markdown-2ec28e51.js +55 -0
  92. package/dist/Menu/index.js +13 -21
  93. package/dist/{Menu-2e64307a.js → Menu-10681184.js} +40 -47
  94. package/dist/Modal/index.js +16 -24
  95. package/dist/{Modal-c17cc105.js → Modal-06dc9551.js} +33 -41
  96. package/dist/MultiSelect/index.js +38 -47
  97. package/dist/Option-7967170c.js +12 -0
  98. package/dist/Page/index.js +48 -57
  99. package/dist/Popover/index.js +12 -20
  100. package/dist/{Popover-7c966790.js → Popover-a93db92d.js} +15 -21
  101. package/dist/ProgressBar/index.js +4 -12
  102. package/dist/{ProgressBar-5dfc1885.js → ProgressBar-04ee007d.js} +8 -15
  103. package/dist/RadioGroup/index.js +7 -16
  104. package/dist/{RadioGroup-9bdd8a59.js → RadioGroup-2ccd0678.js} +16 -23
  105. package/dist/RecurringSelect/index.js +90 -98
  106. package/dist/Select/index.js +17 -26
  107. package/dist/Spinner/index.js +4 -12
  108. package/dist/{Spinner-9d8fc7ff.js → Spinner-5d8359b8.js} +7 -14
  109. package/dist/StatusLabel/index.js +12 -21
  110. package/dist/Switch/index.js +5 -13
  111. package/dist/{Switch-cc9b645c.js → Switch-8bee06df.js} +17 -24
  112. package/dist/Table/index.js +19 -35
  113. package/dist/Tabs/index.js +23 -33
  114. package/dist/Text/index.js +5 -13
  115. package/dist/{Text-54334431.js → Text-703e2c21.js} +4 -10
  116. package/dist/Toast/index.js +32 -40
  117. package/dist/Tooltip/index.js +7 -15
  118. package/dist/{Tooltip-6b12f1c2.js → Tooltip-c80b9fb7.js} +22 -30
  119. package/dist/Typography/index.js +4 -12
  120. package/dist/{Typography-83915c54.js → Typography-09952a2f.js} +15 -22
  121. package/dist/{style-inject.es-9d2f5f4e.js → style-inject.es-a0e1a0ba.js} +1 -3
  122. package/dist/{tslib.es6-5b8768b7.js → tslib.es6-5849cd88.js} +1 -4
  123. package/package.json +3 -3
  124. package/rollup.config.js +1 -1
  125. package/dist/ButtonDismiss-1ccb84ec.js +0 -14
  126. package/dist/Combobox/components/ComboboxTrigger/ComboboxTriggerButton/ComboboxTriggerButton.d.ts +0 -3
  127. package/dist/Combobox/components/ComboboxTrigger/ComboboxTriggerChip/ComboboxTriggerChip.d.ts +0 -3
  128. package/dist/Emphasis-e10dde65.js +0 -19
  129. package/dist/Icon-405a216c.js +0 -40
  130. package/dist/InputValidation-377d6c62.js +0 -29
  131. package/dist/LightBox-93ef99b9.js +0 -117
  132. package/dist/Markdown-d53b01bf.js +0 -62
  133. package/dist/Option-07a24acd.js +0 -19
@@ -1,47 +1,36 @@
1
- 'use strict';
2
-
3
- Object.defineProperty(exports, '__esModule', { value: true });
4
-
5
- var tslib_es6 = require('../tslib.es6-5b8768b7.js');
6
- var React = require('react');
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-54334431.js');
12
- var Typography = require('../Typography-83915c54.js');
13
- var Button = require('../Button-db6114a6.js');
14
- var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
15
- var useFocusTrap = require('@jobber/hooks/useFocusTrap');
16
- var reactPopper = require('react-popper');
17
- var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
18
- var Chip = require('../Chip-f8b8fd89.js');
19
- var useAssert = require('@jobber/hooks/useAssert');
20
- require('@jobber/design');
21
- require('react-router-dom');
22
- require('@jobber/hooks/useInView');
23
- require('../Avatar-1aa30ee1.js');
24
- require('color');
25
- require('../Tooltip-6b12f1c2.js');
26
- require('framer-motion');
27
-
28
- function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
29
-
30
- var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
31
- var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
32
- var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
1
+ import React, { useRef, useEffect, useContext, useCallback, useState, Children, isValidElement, useMemo } from 'react';
2
+ import classnames from 'classnames';
3
+ import ReactDOM from 'react-dom';
4
+ import { s as styleInject } from '../style-inject.es-a0e1a0ba.js';
5
+ import { I as Icon } from '../Icon-22723fe6.js';
6
+ import { T as Text } from '../Text-703e2c21.js';
7
+ import { T as Typography } from '../Typography-09952a2f.js';
8
+ import { B as Button } from '../Button-319d8fa0.js';
9
+ import { useRefocusOnActivator } from '@jobber/hooks/useRefocusOnActivator';
10
+ import { useFocusTrap } from '@jobber/hooks/useFocusTrap';
11
+ import { usePopper } from 'react-popper';
12
+ import { useOnKeyDown } from '@jobber/hooks/useOnKeyDown';
13
+ import { C as Chip } from '../Chip-40f5214c.js';
14
+ import '@jobber/design';
15
+ import { useAssert } from '@jobber/hooks/useAssert';
16
+ import 'react-router-dom';
17
+ import '@jobber/hooks/useInView';
18
+ import '../Avatar-b2e862de.js';
19
+ import 'color';
20
+ import '../Tooltip-c80b9fb7.js';
21
+ import 'framer-motion';
33
22
 
34
23
  var css_248z$6 = ".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- {\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";
35
24
  var styles$6 = {"content":"m1w5vdUZ6rQ-","hidden":"Zlkv2HA096A-","actions":"YQry-Rd6zfQ-","actionPadding":"TcpqL34s4lI-"};
36
- styleInject_es.styleInject(css_248z$6);
25
+ styleInject(css_248z$6);
37
26
 
38
27
  var css_248z$5 = ".MIyb-oFZg9w- {\n position: relative;\n}\n\n.WZPK91I4aJs- {\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.WZPK91I4aJs-::-webkit-search-decoration,\n.WZPK91I4aJs-::-webkit-search-cancel-button,\n.WZPK91I4aJs-::-webkit-search-results-button,\n.WZPK91I4aJs-::-webkit-search-results-decoration {\n -webkit-appearance: none;\n}\n\n.WZPK91I4aJs-:focus {\n outline: none;\n}\n\n._7loHrVUe-Rk- {\n display: -ms-flexbox;\n display: flex;\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 -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n._7loHrVUe-Rk-: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";
39
28
  var styles$5 = {"search":"MIyb-oFZg9w-","searchInput":"WZPK91I4aJs-","clearSearch":"_7loHrVUe-Rk-"};
40
- styleInject_es.styleInject(css_248z$5);
29
+ styleInject(css_248z$5);
41
30
 
42
31
  function ComboboxContentSearch(props) {
43
- const searchRef = React.useRef(null);
44
- React.useEffect(() => {
32
+ const searchRef = useRef(null);
33
+ useEffect(() => {
45
34
  if (props.open) {
46
35
  setTimeout(() => {
47
36
  var _a;
@@ -49,10 +38,10 @@ function ComboboxContentSearch(props) {
49
38
  }, 0);
50
39
  }
51
40
  }, [props.open]);
52
- return (React__default["default"].createElement("div", { className: styles$5.search },
53
- React__default["default"].createElement("input", { type: "search", ref: searchRef, className: styles$5.searchInput, placeholder: props.placeholder ? `Search ${props.placeholder}` : "Search", onChange: (event) => handleSearch(event), value: props.searchValue }),
54
- props.searchValue && (React__default["default"].createElement("button", { className: styles$5.clearSearch, onClick: clearSearch, type: "button", "data-testid": "ATL-Combobox-Content-Search-Clear", "aria-label": "Clear search" },
55
- React__default["default"].createElement(Icon.Icon, { name: "remove", size: "small" })))));
41
+ return (React.createElement("div", { className: styles$5.search },
42
+ React.createElement("input", { type: "search", ref: searchRef, className: styles$5.searchInput, placeholder: props.placeholder ? `Search ${props.placeholder}` : "Search", onChange: (event) => handleSearch(event), value: props.searchValue }),
43
+ props.searchValue && (React.createElement("button", { className: styles$5.clearSearch, onClick: clearSearch, type: "button", "data-testid": "ATL-Combobox-Content-Search-Clear", "aria-label": "Clear search" },
44
+ React.createElement(Icon, { name: "remove", size: "small" })))));
56
45
  function clearSearch() {
57
46
  var _a;
58
47
  props.setSearchValue("");
@@ -63,31 +52,47 @@ function ComboboxContentSearch(props) {
63
52
  }
64
53
  }
65
54
 
66
- var css_248z$4 = ".SgMzjOcdE-E- {\n position: relative;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n}\n\n.TwoTCjgcssc- {\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._2LVD-wjMRfQ- {\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 margin: 0 calc(16px / 2);\n margin: 0 var(--space-small);\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 transition: all 200ms;\n transition: all var(--timing-base);\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n}\n\n._2LVD-wjMRfQ-:hover,\n._2LVD-wjMRfQ-:focus {\n background-color: rgb(244, 244, 244);\n background-color: var(--color-surface--background);\n}\n\n._2LVD-wjMRfQ-: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._8T5M7MGwCRE-,\n._4y5NXkNeIQM- {\n padding: calc(16px / 2) calc(16px * 1);\n padding: var(--space-small) var(--space-base);\n}\n\n.SgMzjOcdE-E-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n bottom: calc(16px / 2);\n bottom: var(--space-small);\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.SgMzjOcdE-E-::before {\n content: \"\";\n display: block;\n position: absolute;\n top: calc(16px / 2);\n top: var(--space-small);\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n";
67
- var styles$4 = {"container":"SgMzjOcdE-E-","optionsList":"TwoTCjgcssc-","option":"_2LVD-wjMRfQ-","filterMessage":"_8T5M7MGwCRE-","emptyStateMessage":"_4y5NXkNeIQM-"};
68
- styleInject_es.styleInject(css_248z$4);
55
+ var css_248z$4 = ".SgMzjOcdE-E- {\n position: relative;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n}\n\n.TwoTCjgcssc- {\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._8T5M7MGwCRE-,\n._4y5NXkNeIQM- {\n padding: calc(16px / 2) calc(16px * 1);\n padding: var(--space-small) var(--space-base);\n}\n\n.SgMzjOcdE-E-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n bottom: calc(16px / 2);\n bottom: var(--space-small);\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.SgMzjOcdE-E-::before {\n content: \"\";\n display: block;\n position: absolute;\n top: calc(16px / 2);\n top: var(--space-small);\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n";
56
+ var styles$4 = {"container":"SgMzjOcdE-E-","optionsList":"TwoTCjgcssc-","filterMessage":"_8T5M7MGwCRE-","emptyStateMessage":"_4y5NXkNeIQM-"};
57
+ styleInject(css_248z$4);
58
+
59
+ var css_248z$3 = "._5QdRGmaNHvc- {\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 margin: 0 calc(16px / 2);\n margin: 0 var(--space-small);\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 transition: all 200ms;\n transition: all var(--timing-base);\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n}\n\n._5QdRGmaNHvc-:hover,\n._5QdRGmaNHvc-:focus {\n background-color: rgb(244, 244, 244);\n background-color: var(--color-surface--background);\n}\n\n._5QdRGmaNHvc-: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";
60
+ var styles$3 = {"option":"_5QdRGmaNHvc-"};
61
+ styleInject(css_248z$3);
62
+
63
+ const ComboboxContext = React.createContext({});
64
+ function ComboboxContextProvider(props) {
65
+ return (React.createElement(ComboboxContext.Provider, { value: {
66
+ open: props.open,
67
+ setOpen: props.setOpen,
68
+ selected: props.selected,
69
+ selectionHandler: props.selectionHandler,
70
+ handleClose: props.handleClose,
71
+ shouldScroll: props.shouldScroll,
72
+ } }, props.children));
73
+ }
74
+
75
+ function ComboboxOption(props) {
76
+ const { selected, selectionHandler } = useContext(ComboboxContext);
77
+ const isSelected = selected.some(selection => selection.id.toString() === props.id.toString());
78
+ return (React.createElement("li", { key: props.id, tabIndex: -1, "data-selected": isSelected, role: "option", "aria-selected": isSelected, onClick: () => selectionHandler &&
79
+ selectionHandler({ id: props.id, label: props.label }), className: classnames(styles$3.option) },
80
+ props.label,
81
+ isSelected && React.createElement(Icon, { name: "checkmark", color: "blue" })));
82
+ }
69
83
 
70
84
  function ComboboxContentList(props) {
71
- let hasSeenFirstSelected = false;
72
- return (React__default["default"].createElement("div", { className: styles$4.container },
73
- !props.showEmptyState && props.options.length > 0 && (React__default["default"].createElement("ul", { className: styles$4.optionsList, role: "listbox", "aria-multiselectable": props.multiselect, ref: props.optionsListRef }, !props.showEmptyState &&
85
+ return (React.createElement("div", { className: styles$4.container },
86
+ !props.showEmptyState && props.options.length > 0 && (React.createElement("ul", { className: styles$4.optionsList, role: "listbox", "aria-multiselectable": props.multiselect, ref: props.optionsListRef }, !props.showEmptyState &&
74
87
  props.options.map(option => {
75
- const isSelected = props.selected.some(selection => selection.id.toString() === option.id.toString());
76
- return (React__default["default"].createElement("li", { ref: listItem => {
77
- if (isSelected && !hasSeenFirstSelected) {
78
- props.setFirstSelectedElement(listItem);
79
- hasSeenFirstSelected = true;
80
- }
81
- }, key: option.id, tabIndex: -1, role: "option", "aria-selected": isSelected, onClick: () => props.selectionHandler(option), className: classnames__default["default"](styles$4.option) },
82
- option.label,
83
- isSelected && React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" })));
88
+ return (React.createElement(ComboboxOption, { key: option.id, id: option.id, label: option.label }));
84
89
  }))),
85
- !props.showEmptyState && props.options.length === 0 && (React__default["default"].createElement("div", { className: styles$4.filterMessage },
86
- React__default["default"].createElement(Text.Text, { variation: "subdued" },
90
+ !props.showEmptyState && props.options.length === 0 && (React.createElement("div", { className: styles$4.filterMessage },
91
+ React.createElement(Text, { variation: "subdued" },
87
92
  "No results for ",
88
93
  `“${props.searchValue}”`))),
89
- props.showEmptyState && (React__default["default"].createElement("div", { className: styles$4.emptyStateMessage },
90
- React__default["default"].createElement(Text.Text, { variation: "subdued" }, getZeroIndexStateText(props.subjectNoun))))));
94
+ props.showEmptyState && (React.createElement("div", { className: styles$4.emptyStateMessage },
95
+ React.createElement(Text, { variation: "subdued" }, getZeroIndexStateText(props.subjectNoun))))));
91
96
  }
92
97
  function getZeroIndexStateText(subjectNoun) {
93
98
  if (subjectNoun) {
@@ -96,9 +101,9 @@ function getZeroIndexStateText(subjectNoun) {
96
101
  return "No options yet";
97
102
  }
98
103
 
99
- var css_248z$3 = ".Q-mwo-g5Fi8- {\n display: -ms-flexbox;\n display: flex;\n padding: calc(16px * 1) calc(16px / 2) 0 calc(16px * 1);\n padding: var(--space-base) var(--space-small) 0 var(--space-base);\n -ms-flex-pack: justify;\n justify-content: space-between;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n";
100
- var styles$3 = {"header":"Q-mwo-g5Fi8-"};
101
- styleInject_es.styleInject(css_248z$3);
104
+ var css_248z$2 = ".Q-mwo-g5Fi8- {\n display: -ms-flexbox;\n display: flex;\n padding: calc(16px * 1) calc(16px / 2) 0 calc(16px * 1);\n padding: var(--space-base) var(--space-small) 0 var(--space-base);\n -ms-flex-pack: justify;\n justify-content: space-between;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n";
105
+ var styles$2 = {"header":"Q-mwo-g5Fi8-"};
106
+ styleInject(css_248z$2);
102
107
 
103
108
  function ComboboxContentHeader(props) {
104
109
  const hasSelected = props.selectedCount > 0;
@@ -106,9 +111,9 @@ function ComboboxContentHeader(props) {
106
111
  const label = getLabel(hasSelected, props.selectedCount, props.subjectNoun);
107
112
  const handleSelectAll = hasSelected ? props.onClearAll : props.onSelectAll;
108
113
  const showAction = hasSelected || props.hasOptionsVisible;
109
- return (React__default["default"].createElement("div", { className: styles$3.header, "data-testid": "ATL-Combobox-Header" },
110
- React__default["default"].createElement(Typography.Typography, { textColor: "heading", fontWeight: "semiBold" }, label),
111
- showAction && (React__default["default"].createElement(Button.Button, { size: "small", label: actionLabel, type: "tertiary", onClick: handleSelectAll }))));
114
+ return (React.createElement("div", { className: styles$2.header, "data-testid": "ATL-Combobox-Header" },
115
+ React.createElement(Typography, { textColor: "heading", fontWeight: "semiBold" }, label),
116
+ showAction && (React.createElement(Button, { size: "small", label: actionLabel, type: "tertiary", onClick: handleSelectAll }))));
112
117
  }
113
118
  function getLabel(hasSelected, count, subjectNoun) {
114
119
  if (hasSelected) {
@@ -120,63 +125,43 @@ function getLabel(hasSelected, count, subjectNoun) {
120
125
  return "Select";
121
126
  }
122
127
 
123
- 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";
124
- var styles$2 = {"overlay":"W8qMZnORYxI-"};
125
- styleInject_es.styleInject(css_248z$2);
126
-
127
- const ComboboxContext = React__default["default"].createContext({});
128
- function ComboboxContextProvider(props) {
129
- const multiselect = props.multiselect || false;
130
- const [open, setOpen] = React.useState(false);
131
- const wrapperRef = React.useRef(null);
132
- return (React__default["default"].createElement(ComboboxContext.Provider, { value: { multiselect, open, setOpen, wrapperRef } },
133
- React__default["default"].createElement("div", { ref: wrapperRef },
134
- open && (React__default["default"].createElement("div", { className: styles$2.overlay, onClick: () => setOpen(false), "data-testid": "ATL-Combobox-Overlay" })),
135
- props.children)));
136
- }
137
-
138
- function useComboboxContent(options, open, selected, onClose, onSelect) {
139
- const [searchValue, setSearchValue] = React.useState("");
140
- const [firstSelectedElement, setFirstSelectedElement] = React.useState(null);
141
- const optionsListRef = React.useRef(null);
128
+ function useComboboxContent(options, open, selected, searchValue) {
129
+ const { shouldScroll } = useContext(ComboboxContext);
130
+ const optionsListRef = useRef(null);
142
131
  const filteredOptions = options.filter(option => option.label.toLowerCase().includes(searchValue.toLowerCase()));
143
- const [internalSelected, setInternalSelected] = React.useState(selected);
144
- const selectedOptions = onClose ? internalSelected : selected;
145
- const optionsSelectionHandler = onSelect ? onSelect : setInternalSelected;
146
- React.useEffect(() => {
147
- if (!open && onClose) {
148
- onClose(selectedOptions);
149
- }
150
- }, [open, onClose, selectedOptions]);
151
- React.useEffect(() => {
152
- if (open && firstSelectedElement) {
153
- firstSelectedElement === null || firstSelectedElement === void 0 ? void 0 : firstSelectedElement.scrollIntoView({
154
- block: "nearest",
132
+ useEffect(() => {
133
+ var _a;
134
+ if (open && shouldScroll.current && optionsListRef.current) {
135
+ const firstSelected = Array.from((_a = optionsListRef === null || optionsListRef === void 0 ? void 0 : optionsListRef.current) === null || _a === void 0 ? void 0 : _a.children).find(child => {
136
+ if (child instanceof HTMLElement) {
137
+ return child.dataset.selected === "true";
138
+ }
155
139
  });
140
+ scrollToFirstSelected(firstSelected, shouldScroll);
156
141
  }
157
- }, [open, firstSelectedElement]);
158
- React.useEffect(() => {
159
- if (selectedOptions.length === 0) {
160
- setFirstSelectedElement(null);
161
- }
162
- }, [selectedOptions]);
142
+ }, [open, selected]);
163
143
  return {
164
- searchValue,
165
- setSearchValue,
166
- setFirstSelectedElement,
167
144
  filteredOptions,
168
145
  optionsListRef,
169
- selectedOptions,
170
- optionsSelectionHandler,
171
146
  };
172
147
  }
148
+ function scrollToFirstSelected(firstSelected, shouldScroll) {
149
+ if (firstSelected) {
150
+ firstSelected.scrollIntoView({
151
+ block: "nearest",
152
+ });
153
+ shouldScroll.current = false;
154
+ }
155
+ }
173
156
 
174
- function useComboboxAccessibility(selectionCallback, filteredOptions, optionsListRef, open, setOpen, wrapperRef) {
157
+ // eslint-disable-next-line max-statements
158
+ function useComboboxAccessibility(selectionCallback, filteredOptions, optionsListRef, open, wrapperRef) {
159
+ const { handleClose } = useContext(ComboboxContext);
175
160
  const hasOptionsVisible = open && filteredOptions.length > 0;
176
- const focusedIndex = React.useRef(null);
177
- useRefocusOnActivator.useRefocusOnActivator(open);
178
- const popperRef = useFocusTrap.useFocusTrap(open);
179
- const { styles: popperStyles, attributes } = reactPopper.usePopper(wrapperRef.current, popperRef.current, {
161
+ const focusedIndex = useRef(null);
162
+ useRefocusOnActivator(open);
163
+ const popperRef = useFocusTrap(open);
164
+ const { styles: popperStyles, attributes } = usePopper(wrapperRef.current, popperRef.current, {
180
165
  modifiers: [
181
166
  {
182
167
  name: "flip",
@@ -187,10 +172,10 @@ function useComboboxAccessibility(selectionCallback, filteredOptions, optionsLis
187
172
  ],
188
173
  placement: "bottom-start",
189
174
  });
190
- React.useEffect(() => {
175
+ useEffect(() => {
191
176
  focusedIndex.current = null;
192
177
  }, [open, filteredOptions.length]);
193
- React.useEffect(() => {
178
+ useEffect(() => {
194
179
  var _a;
195
180
  if (open) {
196
181
  (_a = popperRef.current) === null || _a === void 0 ? void 0 : _a.addEventListener("keydown", handleContentKeydown);
@@ -200,9 +185,9 @@ function useComboboxAccessibility(selectionCallback, filteredOptions, optionsLis
200
185
  (_a = popperRef.current) === null || _a === void 0 ? void 0 : _a.removeEventListener("keydown", handleContentKeydown);
201
186
  };
202
187
  }, [open, optionsListRef, filteredOptions]);
203
- useOnKeyDown.useOnKeyDown(() => {
188
+ useOnKeyDown(() => {
204
189
  if (open) {
205
- setOpen(false);
190
+ handleClose();
206
191
  }
207
192
  }, "Escape");
208
193
  function handleContentKeydown(event) {
@@ -248,35 +233,77 @@ function useComboboxAccessibility(selectionCallback, filteredOptions, optionsLis
248
233
  }
249
234
 
250
235
  function ComboboxContent(props) {
251
- const { open, setOpen, wrapperRef, multiselect } = React__default["default"].useContext(ComboboxContext);
252
236
  const optionsExist = props.options.length > 0;
253
- const { searchValue, setSearchValue, setFirstSelectedElement, filteredOptions, optionsListRef, selectedOptions, optionsSelectionHandler, } = useComboboxContent(props.options, open, props.selected, props.onClose, props.onSelect);
254
- const { popperRef, popperStyles, attributes } = useComboboxAccessibility(handleSelection, filteredOptions, optionsListRef, open, setOpen, wrapperRef);
255
- 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$6.content, { [styles$6.hidden]: !open }), style: popperStyles.popper }, attributes.popper),
256
- React__default["default"].createElement(ComboboxContentSearch, { open: open, placeholder: props.subjectNoun, searchValue: searchValue, setSearchValue: setSearchValue }),
257
- multiselect && optionsExist && (React__default["default"].createElement(ComboboxContentHeader, { hasOptionsVisible: filteredOptions.length > 0, subjectNoun: props.subjectNoun, selectedCount: selectedOptions.length, onClearAll: () => {
258
- optionsSelectionHandler([]);
237
+ const { filteredOptions, optionsListRef } = useComboboxContent(props.options, props.open, props.selected, props.searchValue);
238
+ const { popperRef, popperStyles, attributes } = useComboboxAccessibility(props.handleSelection, filteredOptions, optionsListRef, props.open, props.wrapperRef);
239
+ const template = (React.createElement("div", Object.assign({ ref: popperRef, id: "ATL-Combobox-Content", "data-testid": "ATL-Combobox-Content", tabIndex: 0, className: classnames(styles$6.content, { [styles$6.hidden]: !props.open }), style: popperStyles.popper }, attributes.popper),
240
+ React.createElement(ComboboxContentSearch, { open: props.open, placeholder: props.subjectNoun, searchValue: props.searchValue, setSearchValue: props.setSearchValue }),
241
+ props.multiselect && optionsExist && (React.createElement(ComboboxContentHeader, { hasOptionsVisible: filteredOptions.length > 0, subjectNoun: props.subjectNoun, selectedCount: props.selected.length, onClearAll: () => {
242
+ props.selectedStateSetter([]);
259
243
  }, onSelectAll: () => {
260
- optionsSelectionHandler(filteredOptions);
244
+ props.selectedStateSetter(filteredOptions);
261
245
  } })),
262
- React__default["default"].createElement(ComboboxContentList, { multiselect: multiselect, showEmptyState: !optionsExist, options: filteredOptions, selected: selectedOptions, optionsListRef: optionsListRef, setFirstSelectedElement: setFirstSelectedElement, selectionHandler: handleSelection, searchValue: searchValue, subjectNoun: props.subjectNoun }),
263
- props.children && (React__default["default"].createElement("div", { className: styles$6.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"]({
246
+ React.createElement(ComboboxContentList, { multiselect: props.multiselect, showEmptyState: !optionsExist, options: filteredOptions, selected: props.selected, optionsListRef: optionsListRef, searchValue: props.searchValue, subjectNoun: props.subjectNoun }),
247
+ props.actionElements && (React.createElement("div", { className: styles$6.actions, role: "group" }, props.actionElements.map((child, index, childrenArray) => (React.createElement("div", { key: index, className: classnames({
264
248
  [styles$6.actionPadding]: index === childrenArray.length - 1,
265
249
  }) }, child)))))));
266
- return ReactDOM__default["default"].createPortal(template, document.body);
267
- function handleSelection(selection) {
268
- if (multiselect) {
269
- handleMultiSelect(optionsSelectionHandler, selectedOptions, selection);
250
+ return ReactDOM.createPortal(template, document.body);
251
+ }
252
+
253
+ 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";
254
+ var styles$1 = {"actionContainer":"Ow9wSNnGP-g-","actionButton":"ncp0nKHQ7d8-"};
255
+ styleInject(css_248z$1);
256
+
257
+ function ComboboxAction(props) {
258
+ return (React.createElement("div", { className: styles$1.actionContainer },
259
+ React.createElement("button", { className: styles$1.actionButton, onClick: props.onClick, type: "button", "aria-label": props.label },
260
+ React.createElement(Typography, { element: "span", size: "base", textColor: "green", fontWeight: "semiBold" }, props.label))));
261
+ }
262
+
263
+ function ComboboxTrigger({ label = "Select", selected, }) {
264
+ const { handleClose, open, setOpen } = React.useContext(ComboboxContext);
265
+ const hasSelection = selected.length;
266
+ const selectedLabel = selected.map(option => option.label).join(", ");
267
+ return (React.createElement(Chip, { variation: hasSelection ? "base" : "subtle", label: hasSelection ? selectedLabel : "", heading: label, onClick: () => {
268
+ if (open) {
269
+ handleClose();
270
+ }
271
+ else {
272
+ setOpen(true);
273
+ }
274
+ }, role: "combobox" }, !hasSelection && (React.createElement(Chip.Suffix, null,
275
+ React.createElement(Icon, { name: "add", size: "small" })))));
276
+ }
277
+
278
+ var css_248z = ".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\n._-0dkolvLF-Y- {\n display: inline-block;\n}\n";
279
+ var styles = {"overlay":"W8qMZnORYxI-","wrapper":"_-0dkolvLF-Y-"};
280
+ styleInject(css_248z);
281
+
282
+ function useMakeComboboxHandlers(setOpen, setSearchValue, selectedOptions, shouldScroll, selectedStateSetter, multiSelect, onClose) {
283
+ const handleClose = useCallback(() => {
284
+ setOpen(false);
285
+ setSearchValue("");
286
+ onClose && onClose();
287
+ if (selectedOptions.length > 0) {
288
+ shouldScroll.current = true;
289
+ }
290
+ }, [setOpen, setSearchValue, onClose, selectedOptions.length]);
291
+ const handleSelection = useCallback((selection) => {
292
+ if (multiSelect) {
293
+ handleMultiSelect(selectedStateSetter, selectedOptions, selection);
270
294
  }
271
295
  else {
272
- handleSingleSelect(optionsSelectionHandler, selection);
296
+ handleSingleSelect(selectedStateSetter, selection);
273
297
  }
274
- }
275
- function handleSingleSelect(selectCallback, selection) {
298
+ }, [multiSelect, selectedStateSetter, selectedOptions]);
299
+ const handleSingleSelect = useCallback((selectCallback, selection) => {
276
300
  selectCallback([selection]);
277
- setSearchValue("");
278
- setOpen(false);
279
- }
301
+ handleClose();
302
+ }, []);
303
+ return {
304
+ handleClose,
305
+ handleSelection,
306
+ };
280
307
  }
281
308
  function handleMultiSelect(selectCallback, selected, selection) {
282
309
  if (selected.some(s => s.id === selection.id)) {
@@ -287,139 +314,84 @@ function handleMultiSelect(selectCallback, selected, selection) {
287
314
  }
288
315
  }
289
316
 
290
- 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";
291
- var styles$1 = {"actionContainer":"Ow9wSNnGP-g-","actionButton":"ncp0nKHQ7d8-"};
292
- styleInject_es.styleInject(css_248z$1);
293
-
294
- function ComboboxAction(props) {
295
- return (React__default["default"].createElement("div", { className: styles$1.actionContainer },
296
- React__default["default"].createElement("button", { className: styles$1.actionButton, onClick: props.onClick, type: "button", "aria-label": props.label },
297
- React__default["default"].createElement(Typography.Typography, { element: "span", size: "base", textColor: "green", fontWeight: "semiBold" }, props.label))));
298
- }
299
-
300
- function ComboboxTriggerButton(props) {
301
- const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
302
- 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 }));
303
- }
304
-
305
- 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";
306
- var styles = {"trigger":"NtYpU6bZMtM-","triggerIcon":"ftceU-6iBO0-"};
307
- styleInject_es.styleInject(css_248z);
308
-
309
- function ComboboxTriggerChip(props) {
310
- const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
311
- return (React__default["default"].createElement("button", { className: styles.trigger, role: "combobox", type: "button", "aria-expanded": open, "aria-haspopup": "listbox", "aria-controls": "ATL-Combobox-Content", "aria-autocomplete": "list", onClick: () => {
312
- setOpen(!open);
313
- } },
314
- React__default["default"].createElement(Typography.Typography, { fontWeight: "semiBold", textColor: "heading" }, props.label),
315
- React__default["default"].createElement("div", { className: styles.triggerIcon },
316
- React__default["default"].createElement(Icon.Icon, { color: "surfaceReverse", name: "add", size: "small" }))));
317
- }
318
-
319
- function ComboboxTrigger(_a) {
320
- var { selected } = _a, props = tslib_es6.__rest(_a, ["selected"]);
321
- const { open, setOpen, multiselect } = React__default["default"].useContext(ComboboxContext);
322
- const hasSelection = selected.length;
323
- const selectedLabel = selected.map(option => option.label).join(", ");
324
- const renderHeading = multiselect || !hasSelection;
325
- return (React__default["default"].createElement(Chip.Chip, { variation: hasSelection ? "base" : "subtle", label: hasSelection ? selectedLabel : "", heading: renderHeading ? props.label : "", onClick: () => setOpen(!open), role: "combobox" }, !hasSelection && (React__default["default"].createElement(Chip.Chip.Suffix, null,
326
- React__default["default"].createElement(Icon.Icon, { name: "add", size: "small" })))));
317
+ function useCombobox(selected, onSelect, onClose, multiSelect) {
318
+ const wrapperRef = useRef(null);
319
+ const shouldScroll = useRef(false);
320
+ const [open, setOpen] = useState(false);
321
+ const [searchValue, setSearchValue] = useState("");
322
+ const { handleClose, handleSelection } = useMakeComboboxHandlers(setOpen, setSearchValue, selected, shouldScroll, onSelect, multiSelect, onClose);
323
+ return {
324
+ wrapperRef,
325
+ searchValue,
326
+ setSearchValue,
327
+ open,
328
+ setOpen,
329
+ selectedOptions: selected,
330
+ selectedStateSetter: onSelect,
331
+ shouldScroll,
332
+ handleClose,
333
+ handleSelection,
334
+ };
327
335
  }
328
336
 
329
337
  function ComboboxActivator(props) {
330
- const { open, setOpen } = React__default["default"].useContext(ComboboxContext);
331
- if (props.children.type === Button.Button || props.children.type === Chip.Chip) {
332
- return React__default["default"].cloneElement(props.children, {
338
+ const { handleClose, open, setOpen } = React.useContext(ComboboxContext);
339
+ if (props.children.type === Button || props.children.type === Chip) {
340
+ return React.cloneElement(props.children, {
333
341
  role: "combobox",
334
- onClick: () => setOpen(!open),
342
+ onClick: () => {
343
+ if (open) {
344
+ handleClose();
345
+ }
346
+ else {
347
+ setOpen(true);
348
+ }
349
+ },
335
350
  });
336
351
  }
337
352
  return props.children;
338
353
  }
339
354
 
340
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
341
- function ComboboxOption(_) {
342
- useAssert.useAssert(true, "Combobox.Option can only be used inside a Combobox component");
343
- return null;
344
- }
345
-
346
- const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox can only have one Trigger or Activator element";
347
- const COMBOBOX_OPTION_AND_CONTENT_EXISTS_ERROR = "Combobox prefers using Combobox.Option and Combobox.Action as the direct child of Combobox instead of Combobox.Content";
355
+ const COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE = "Combobox must have exactly one Trigger element";
348
356
  function useComboboxValidation(children) {
349
- const childrenArray = React__default["default"].Children.toArray(children);
350
- let triggerElement, contentElement, multipleTriggersFound = false;
351
- const optionElements = [];
352
- const actionElements = [];
353
- childrenArray.forEach(child => {
354
- if (isTriggerElement(child)) {
355
- if (triggerElement) {
356
- multipleTriggersFound = true;
357
- }
358
- triggerElement = child;
359
- }
360
- if (isContentElement(child)) {
361
- contentElement = child;
362
- }
363
- if (isOptionElement(child)) {
364
- optionElements.push(child);
365
- }
366
- if (isActionElement(child)) {
367
- actionElements.push(child);
368
- }
369
- });
370
- useAssert.useAssert(multipleTriggersFound, COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE);
371
- useAssert.useAssert(Boolean((optionElements.length || actionElements.length) && contentElement), COMBOBOX_OPTION_AND_CONTENT_EXISTS_ERROR);
357
+ const optionElements = getCompoundComponents(ComboboxOption, children);
358
+ const actionElements = getCompoundComponents(ComboboxAction, children);
359
+ const activatorElements = getCompoundComponents(ComboboxActivator, children);
360
+ const shouldThrowTriggerError = isInvalid(activatorElements);
361
+ useAssert(shouldThrowTriggerError, COMBOBOX_TRIGGER_COUNT_ERROR_MESSAGE);
372
362
  return {
373
- contentElement,
374
- triggerElement,
375
363
  optionElements,
364
+ triggerElement: activatorElements[0],
376
365
  actionElements,
377
366
  };
378
367
  }
379
- function isTriggerElement(child) {
380
- return (React__default["default"].isValidElement(child) &&
381
- (child.type === ComboboxTriggerButton ||
382
- child.type === ComboboxTriggerChip ||
383
- child.type === ComboboxActivator));
368
+ function isInvalid(activators) {
369
+ return activators.length > 1 ? true : false;
384
370
  }
385
- function isContentElement(child) {
386
- return React__default["default"].isValidElement(child) && child.type === ComboboxContent;
387
- }
388
- function isOptionElement(child) {
389
- return React__default["default"].isValidElement(child) && child.type === ComboboxOption;
390
- }
391
- function isActionElement(child) {
392
- return React__default["default"].isValidElement(child) && child.type === ComboboxAction;
371
+ /**
372
+ * Return all instances child component that matches the `type` provided
373
+ */
374
+ function getCompoundComponents(type, children) {
375
+ const childrenArray = Children.toArray(children);
376
+ const elements = childrenArray.filter((child) => isValidElement(child) && child.type === type);
377
+ return elements;
393
378
  }
394
379
 
395
- function Combobox(_a) {
396
- var { multiSelect = false, label = "Select", selected = [] } = _a, props = tslib_es6.__rest(_a, ["multiSelect", "label", "selected"]);
397
- const { contentElement, triggerElement, optionElements, actionElements } = useComboboxValidation(props.children);
398
- const buildOptions = optionElements.map(option => ({
380
+ function Combobox(props) {
381
+ const { optionElements, triggerElement, actionElements } = useComboboxValidation(props.children);
382
+ const options = useMemo(() => (optionElements === null || optionElements === void 0 ? void 0 : optionElements.map(option => ({
399
383
  id: option.props.id,
400
384
  label: option.props.label,
401
- }));
402
- return (React__default["default"].createElement(ComboboxContextProvider, { multiselect: multiSelect },
403
- triggerElement || React__default["default"].createElement(ComboboxTrigger, { label: label, selected: selected }),
404
- contentElement || (
405
- // @ts-expect-error - Suppress the XOR error with onClose|onSelect until we finish the refactor on JOB-81416
406
- React__default["default"].createElement(ComboboxContent, Object.assign({ options: buildOptions, selected: selected }, props), actionElements))));
385
+ }))) || [], [optionElements]);
386
+ const { selectedOptions, selectedStateSetter, shouldScroll, wrapperRef, searchValue, setSearchValue, open, setOpen, handleClose, handleSelection, } = useCombobox(props.selected, props.onSelect, props.onClose, props.multiSelect);
387
+ return (React.createElement(ComboboxContextProvider, { selected: selectedOptions, selectionHandler: handleSelection, open: open, setOpen: setOpen, handleClose: handleClose, shouldScroll: shouldScroll },
388
+ React.createElement("div", { ref: wrapperRef, className: styles.wrapper },
389
+ open && (React.createElement("div", { className: styles.overlay, onClick: () => handleClose(), "data-testid": "ATL-Combobox-Overlay" })),
390
+ triggerElement || (React.createElement(ComboboxTrigger, { label: props.label, selected: props.selected })),
391
+ React.createElement(ComboboxContent, { multiselect: props.multiSelect, searchPlaceholder: props.searchPlaceholder, subjectNoun: props.subjectNoun, selected: selectedOptions, actionElements: actionElements, selectedStateSetter: selectedStateSetter, handleSelection: handleSelection, searchValue: searchValue, setSearchValue: setSearchValue, wrapperRef: wrapperRef, open: open, setOpen: setOpen, options: options }))));
407
392
  }
408
- /**
409
- * @deprecated Use Combobox.Activator instead
410
- */
411
- Combobox.TriggerButton = ComboboxTriggerButton;
412
- /**
413
- * @deprecated Use Combobox.Activator instead
414
- */
415
- Combobox.TriggerChip = ComboboxTriggerChip;
416
393
  Combobox.Activator = ComboboxActivator;
417
- /**
418
- * @deprecated Use individual Combobox.Option instead
419
- */
420
- Combobox.Content = ComboboxContent;
421
394
  Combobox.Action = ComboboxAction;
422
395
  Combobox.Option = ComboboxOption;
423
396
 
424
- exports.Combobox = Combobox;
425
- exports.ComboboxContextProvider = ComboboxContextProvider;
397
+ export { Combobox, ComboboxContextProvider };