@jobber/components 4.78.4 → 4.78.5-JOB-84042.4

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 (59) hide show
  1. package/dist/AnimatedPresence/index.js +5 -99
  2. package/dist/AnimatedPresence-20a02aaa.js +104 -0
  3. package/dist/Autocomplete/index.js +4 -4
  4. package/dist/Card/index.js +3 -3
  5. package/dist/{Card-426a68a8.js → Card-e3144022.js} +2 -2
  6. package/dist/Checkbox/index.js +1 -2
  7. package/dist/{Checkbox-99f6297f.js → Checkbox-787e2e47.js} +1 -2
  8. package/dist/Chip/index.js +3 -2
  9. package/dist/{Chip-c91fd6c8.js → Chip-3d1bfddc.js} +1 -1
  10. package/dist/Chips/index.js +5 -5
  11. package/dist/Combobox/Combobox.types.d.ts +12 -0
  12. package/dist/Combobox/components/ComboboxContent/ComboboxLoadMore/ComboboxLoadMore.d.ts +6 -0
  13. package/dist/Combobox/components/ComboboxContent/ComboboxLoadMore/index.d.ts +1 -0
  14. package/dist/Combobox/hooks/useMakeComboboxHandlers.d.ts +1 -1
  15. package/dist/Combobox/index.js +9 -6
  16. package/dist/{Combobox-1c91da1f.js → Combobox-df332d89.js} +57 -40
  17. package/dist/DataDump/index.js +3 -3
  18. package/dist/DataList/DataList.const.d.ts +1 -0
  19. package/dist/DataList/DataList.types.d.ts +0 -1
  20. package/dist/DataList/hooks/useMediaQuery.d.ts +7 -1
  21. package/dist/DataList/index.js +39 -39
  22. package/dist/DataTable/index.js +3 -4
  23. package/dist/FormField/index.js +1 -2
  24. package/dist/{FormField-b4e6c549.js → FormField-6ff183f8.js} +2 -3
  25. package/dist/FormatFile/index.js +2 -2
  26. package/dist/{FormatFile-652edda8.js → FormatFile-f10799f5.js} +1 -1
  27. package/dist/Gallery/index.js +2 -2
  28. package/dist/Glimmer/index.js +1 -1
  29. package/dist/{Glimmer-7c317864.js → Glimmer-84dee1ed.js} +1 -1
  30. package/dist/InputAvatar/index.js +1 -2
  31. package/dist/InputDate/index.js +1 -2
  32. package/dist/InputEmail/index.js +1 -2
  33. package/dist/InputFile/InputFile.d.ts +1 -1
  34. package/dist/InputFile/index.js +1 -2
  35. package/dist/{InputFile-c9eeb04b.js → InputFile-bb945071.js} +4 -2
  36. package/dist/InputNumber/index.js +2 -3
  37. package/dist/{InputNumber-ceae3872.js → InputNumber-d451b52e.js} +1 -1
  38. package/dist/InputPassword/index.js +1 -2
  39. package/dist/InputPhoneNumber/index.js +1 -2
  40. package/dist/InputText/index.js +3 -3
  41. package/dist/{InputText-6e356985.js → InputText-55b6cb65.js} +3 -2
  42. package/dist/InputTime/index.js +1 -2
  43. package/dist/Menu/Menu.d.ts +4 -4
  44. package/dist/Menu/index.js +2 -2
  45. package/dist/{Menu-81b12936.js → Menu-083fc4c4.js} +4 -4
  46. package/dist/MultiSelect/index.js +1 -2
  47. package/dist/{Option-8565da71.js → Option-3c4d377e.js} +1 -1
  48. package/dist/Page/index.js +2 -2
  49. package/dist/RadioGroup/RadioGroup.d.ts +1 -1
  50. package/dist/RadioGroup/index.js +1 -2
  51. package/dist/{RadioGroup-ca7a5978.js → RadioGroup-17b67ade.js} +2 -3
  52. package/dist/RecurringSelect/components/DayOfMonthSelect.d.ts +2 -2
  53. package/dist/RecurringSelect/components/WeeklySelect.d.ts +2 -2
  54. package/dist/RecurringSelect/index.js +6 -7
  55. package/dist/Select/index.js +2 -3
  56. package/dist/Tooltip/index.js +2 -1
  57. package/dist/{Tooltip-27771182.js → Tooltip-ef3d6ef4.js} +2 -1
  58. package/package.json +8 -12
  59. package/rollup.config.js +0 -1
@@ -6,15 +6,18 @@ var ReactDOM = require('react-dom');
6
6
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
7
  var Icon = require('./Icon-405a216c.js');
8
8
  var Text = require('./Text-259af966.js');
9
- var Glimmer = require('./Glimmer-7c317864.js');
9
+ var Glimmer = require('./Glimmer-84dee1ed.js');
10
+ var Spinner = require('./Spinner-9d8fc7ff.js');
11
+ var AnimatedPresence = require('./AnimatedPresence-20a02aaa.js');
10
12
  var tslib_es6 = require('./tslib.es6-754e2961.js');
13
+ var useInView = require('@jobber/hooks/useInView');
11
14
  var Typography = require('./Typography-c45bf216.js');
12
15
  var Button = require('./Button-b73a5e01.js');
13
16
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
14
17
  var useFocusTrap = require('@jobber/hooks/useFocusTrap');
15
18
  var reactPopper = require('react-popper');
16
19
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
17
- var Chip = require('./Chip-c91fd6c8.js');
20
+ var Chip = require('./Chip-3d1bfddc.js');
18
21
  var debounce = require('lodash/debounce');
19
22
  var noop = require('lodash/noop');
20
23
  require('@jobber/design');
@@ -28,13 +31,13 @@ var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
28
31
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
29
32
  var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
30
33
 
31
- var css_248z$6 = ".m1w5vdUZ6rQ- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc((16px * 4) * 3.75);\n width: calc(calc(16px * 4) * 3.75);\n 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(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n overflow: auto;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n.jobber-retheme .m1w5vdUZ6rQ- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\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.m1w5vdUZ6rQ-:focus,\n.m1w5vdUZ6rQ-:focus-visible {\n outline: none;\n}\n\n.m1w5vdUZ6rQ-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\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";
32
- var styles$6 = {"content":"m1w5vdUZ6rQ-","hidden":"Zlkv2HA096A-","actions":"YQry-Rd6zfQ-","actionPadding":"TcpqL34s4lI-"};
33
- styleInject_es.styleInject(css_248z$6);
34
+ var css_248z$7 = ".m1w5vdUZ6rQ- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc((16px * 4) * 3.75);\n width: calc(calc(16px * 4) * 3.75);\n 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(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n overflow: auto;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n.jobber-retheme .m1w5vdUZ6rQ- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\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.m1w5vdUZ6rQ-:focus,\n.m1w5vdUZ6rQ-:focus-visible {\n outline: none;\n}\n\n.m1w5vdUZ6rQ-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\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
+ var styles$7 = {"content":"m1w5vdUZ6rQ-","hidden":"Zlkv2HA096A-","actions":"YQry-Rd6zfQ-","actionPadding":"TcpqL34s4lI-"};
36
+ styleInject_es.styleInject(css_248z$7);
34
37
 
35
- 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(217, 223, 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(238, 240, 242);\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 outline: transparent;\n}\n\n._7loHrVUe-Rk-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
36
- var styles$5 = {"search":"MIyb-oFZg9w-","searchInput":"WZPK91I4aJs-","clearSearch":"_7loHrVUe-Rk-"};
37
- styleInject_es.styleInject(css_248z$5);
38
+ var css_248z$6 = ".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(217, 223, 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(238, 240, 242);\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 outline: transparent;\n}\n\n._7loHrVUe-Rk-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
39
+ var styles$6 = {"search":"MIyb-oFZg9w-","searchInput":"WZPK91I4aJs-","clearSearch":"_7loHrVUe-Rk-"};
40
+ styleInject_es.styleInject(css_248z$6);
38
41
 
39
42
  function ComboboxContentSearch(props) {
40
43
  const searchRef = React.useRef(null);
@@ -46,9 +49,9 @@ function ComboboxContentSearch(props) {
46
49
  }, 0);
47
50
  }
48
51
  }, [props.open]);
49
- return (React__default["default"].createElement("div", { className: styles$5.search },
50
- 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 }),
51
- 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" },
52
+ return (React__default["default"].createElement("div", { className: styles$6.search },
53
+ React__default["default"].createElement("input", { type: "search", ref: searchRef, className: styles$6.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$6.clearSearch, onClick: clearSearch, type: "button", "data-testid": "ATL-Combobox-Content-Search-Clear", "aria-label": "Clear search" },
52
55
  React__default["default"].createElement(Icon.Icon, { name: "remove", size: "small" })))));
53
56
  function clearSearch() {
54
57
  var _a;
@@ -62,13 +65,13 @@ function ComboboxContentSearch(props) {
62
65
  }
63
66
  }
64
67
 
65
- 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: auto;\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-::before,\n.SgMzjOcdE-E-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n pointer-events: none;\n transition: opacity 0.3s ease-in-out;\n}\n\n.SgMzjOcdE-E-::after {\n bottom: calc(16px / 2);\n bottom: var(--space-small);\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 top: calc(16px / 2);\n top: var(--space-small);\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n\n.T6E3VwBGoQM-::before,\n._6HQzxMQkXnE-::before {\n opacity: 0;\n}\n\n._5YsJZyMDkbA-::after,\n._6HQzxMQkXnE-::after {\n opacity: 0;\n}\n\n.A6z4OI58xoE- {\n padding: calc(16px * 1) calc(16px * 1);\n padding: var(--space-base) var(--space-base);\n}\n";
66
- var styles$4 = {"container":"SgMzjOcdE-E-","optionsList":"TwoTCjgcssc-","filterMessage":"_8T5M7MGwCRE-","emptyStateMessage":"_4y5NXkNeIQM-","scrollTop":"T6E3VwBGoQM-","scrollNone":"_6HQzxMQkXnE-","scrollBottom":"_5YsJZyMDkbA-","loadingContainer":"A6z4OI58xoE-"};
67
- styleInject_es.styleInject(css_248z$4);
68
+ var css_248z$5 = ".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\n max-height: calc((16px / 2) * 33.33);\n\n max-height: calc(calc(16px / 2) * 33.33);\n\n max-height: calc(var(--space-small) * 33.33);\n margin: 0;\n padding: 0;\n overflow: auto;\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-::before,\n.SgMzjOcdE-E-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n pointer-events: none;\n transition: opacity 0.3s ease-in-out;\n}\n\n.SgMzjOcdE-E-::after {\n bottom: calc(16px / 2);\n bottom: var(--space-small);\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 top: calc(16px / 2);\n top: var(--space-small);\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n\n.T6E3VwBGoQM-::before,\n._6HQzxMQkXnE-::before {\n opacity: 0;\n}\n\n._5YsJZyMDkbA-::after,\n._6HQzxMQkXnE-::after {\n opacity: 0;\n}\n\n.A6z4OI58xoE- {\n padding: calc(16px * 1) calc(16px * 1);\n padding: var(--space-base) var(--space-base);\n}\n\n.A6z4OI58xoE-.QqHBSf52fPk- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n position: sticky;\n bottom: 0;\n padding: calc(16px * 1) 0;\n padding: var(--space-base) 0;\n}\n\n.A6z4OI58xoE-.QqHBSf52fPk-:empty {\n display: none;\n}\n";
69
+ var styles$5 = {"container":"SgMzjOcdE-E-","optionsList":"TwoTCjgcssc-","filterMessage":"_8T5M7MGwCRE-","emptyStateMessage":"_4y5NXkNeIQM-","scrollTop":"T6E3VwBGoQM-","scrollNone":"_6HQzxMQkXnE-","scrollBottom":"_5YsJZyMDkbA-","loadingContainer":"A6z4OI58xoE-","hasOptions":"QqHBSf52fPk-"};
70
+ styleInject_es.styleInject(css_248z$5);
68
71
 
69
- var css_248z$3 = "._5QdRGmaNHvc- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-negative: 0;\n flex-shrink: 0;\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.jobber-retheme ._5QdRGmaNHvc- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n}\n\n._5QdRGmaNHvc-:hover,\n._5QdRGmaNHvc-:focus-visible {\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n._5QdRGmaNHvc-:focus,\n._5QdRGmaNHvc-:focus-visible {\n outline: none;\n}\n\n._5QdRGmaNHvc-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
70
- var styles$3 = {"option":"_5QdRGmaNHvc-"};
71
- styleInject_es.styleInject(css_248z$3);
72
+ var css_248z$4 = "._5QdRGmaNHvc- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-negative: 0;\n flex-shrink: 0;\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.jobber-retheme ._5QdRGmaNHvc- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n}\n\n._5QdRGmaNHvc-:hover,\n._5QdRGmaNHvc-:focus-visible {\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n._5QdRGmaNHvc-:focus,\n._5QdRGmaNHvc-:focus-visible {\n outline: none;\n}\n\n._5QdRGmaNHvc-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
73
+ var styles$4 = {"option":"_5QdRGmaNHvc-"};
74
+ styleInject_es.styleInject(css_248z$4);
72
75
 
73
76
  const ComboboxContext = React__default["default"].createContext({});
74
77
  function ComboboxContextProvider(_a) {
@@ -80,29 +83,42 @@ function ComboboxOption(props) {
80
83
  const { selected, selectionHandler } = React.useContext(ComboboxContext);
81
84
  const isSelected = selected.some(selection => selection.id.toString() === props.id.toString());
82
85
  return (React__default["default"].createElement("li", { key: props.id, tabIndex: -1, "data-selected": isSelected, role: "option", "aria-selected": isSelected, onClick: () => selectionHandler &&
83
- selectionHandler({ id: props.id, label: props.label }), className: classnames__default["default"](styles$3.option) },
86
+ selectionHandler({ id: props.id, label: props.label }), className: classnames__default["default"](styles$4.option) },
84
87
  props.label,
85
88
  React__default["default"].createElement("div", null, isSelected && React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" }))));
86
89
  }
87
90
 
91
+ var css_248z$3 = "._3s8-RC5Ky3s- {\n -webkit-transform: translateY(calc((16px * 3) * -1));\n -webkit-transform: translateY(calc(calc(16px * 3) * -1));\n -webkit-transform: translateY(calc(var(--space-largest) * -1));\n transform: translateY(calc((16px * 3) * -1));\n transform: translateY(calc(calc(16px * 3) * -1));\n transform: translateY(calc(var(--space-largest) * -1));\n}\n";
92
+ var styles$3 = {"trigger":"_3s8-RC5Ky3s-"};
93
+ styleInject_es.styleInject(css_248z$3);
94
+
95
+ function ComboboxLoadMore({ onLoadMore }) {
96
+ const [inViewRef, isInView] = useInView.useInView();
97
+ React.useEffect(() => {
98
+ isInView && onLoadMore();
99
+ }, [isInView]);
100
+ return (React__default["default"].createElement("div", { "data-testid": "ATL-Combobox-Loadmore-Trigger", ref: inViewRef, className: styles$3.trigger }));
101
+ }
102
+
88
103
  function ComboboxContentList(props) {
89
104
  const optionsExist = props.options.length > 0;
90
- const showOptions = optionsExist && !props.loading;
91
105
  const hasSearchTerm = props.searchValue.length > 0;
92
106
  const { listScrollState } = useScrollState(props.optionsListRef, props.options);
93
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$4.container, styles$4[listScrollState]) },
94
- optionsExist && (React__default["default"].createElement("ul", { className: styles$4.optionsList, role: "listbox", "aria-multiselectable": props.multiselect, ref: props.optionsListRef },
95
- showOptions &&
96
- props.options.map(option => {
97
- return (React__default["default"].createElement(ComboboxOption, { key: option.id, id: option.id, label: option.label }));
98
- }),
99
- props.loading && (React__default["default"].createElement(React__default["default"].Fragment, null, Array.from({ length: 5 }).map((_, index) => (React__default["default"].createElement("div", { className: styles$4.loadingContainer, key: index },
100
- React__default["default"].createElement(Glimmer.Glimmer, { shape: "rectangle", size: "small" })))))))),
101
- hasSearchTerm && !optionsExist && (React__default["default"].createElement("div", { className: styles$4.filterMessage },
107
+ return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$5.container, styles$5[listScrollState]) },
108
+ optionsExist && (React__default["default"].createElement("ul", { className: styles$5.optionsList, role: "listbox", "aria-multiselectable": props.multiselect, ref: props.optionsListRef },
109
+ props.options.map(option => {
110
+ return (React__default["default"].createElement(ComboboxOption, { key: option.id, id: option.id, label: option.label }));
111
+ }),
112
+ React__default["default"].createElement("div", { className: classnames__default["default"]([styles$5.loadingContainer, styles$5.hasOptions]) },
113
+ React__default["default"].createElement(AnimatedPresence.AnimatedPresence, { transition: "fromBottom" }, Boolean(props.loading && optionsExist) && (React__default["default"].createElement(Spinner.Spinner, { size: "small" })))),
114
+ props.onLoadMore && (React__default["default"].createElement(ComboboxLoadMore, { onLoadMore: props.onLoadMore })))),
115
+ props.loading && !optionsExist && (React__default["default"].createElement(React__default["default"].Fragment, null, Array.from({ length: 5 }).map((_, index) => (React__default["default"].createElement("div", { className: styles$5.loadingContainer, key: index },
116
+ React__default["default"].createElement(Glimmer.Glimmer, { shape: "rectangle", size: "small" })))))),
117
+ hasSearchTerm && !props.loading && !optionsExist && (React__default["default"].createElement("div", { className: styles$5.filterMessage },
102
118
  React__default["default"].createElement(Text.Text, { variation: "subdued" },
103
119
  "No results for ",
104
120
  `“${props.searchValue}”`))),
105
- !hasSearchTerm && !optionsExist && (React__default["default"].createElement("div", { className: styles$4.emptyStateMessage },
121
+ !hasSearchTerm && !props.loading && !optionsExist && (React__default["default"].createElement("div", { className: styles$5.emptyStateMessage },
106
122
  React__default["default"].createElement(Text.Text, { variation: "subdued" }, getZeroIndexStateText(props.subjectNoun))))));
107
123
  }
108
124
  function getZeroIndexStateText(subjectNoun) {
@@ -147,7 +163,7 @@ function useScrollState(optionsListRef, options) {
147
163
  return { listScrollState };
148
164
  }
149
165
 
150
- 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";
166
+ 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 -ms-flex-align: baseline;\n align-items: baseline;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n";
151
167
  var styles$2 = {"header":"Q-mwo-g5Fi8-"};
152
168
  styleInject_es.styleInject(css_248z$2);
153
169
 
@@ -283,16 +299,16 @@ function ComboboxContent(props) {
283
299
  const optionsExist = props.options.length > 0;
284
300
  const { optionsListRef } = useComboboxContent(props.open, props.selected);
285
301
  const { popperRef, popperStyles, attributes } = useComboboxAccessibility(props.handleSelection, props.options, optionsListRef, props.open, props.wrapperRef);
286
- 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]: !props.open }), style: popperStyles.popper }, attributes.popper),
302
+ 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$7.content, { [styles$7.hidden]: !props.open }), style: popperStyles.popper }, attributes.popper),
287
303
  React__default["default"].createElement(ComboboxContentSearch, { open: props.open, placeholder: props.subjectNoun, searchValue: props.searchValue, setSearchValue: props.setSearchValue, handleSearchChange: props.handleSearchChange }),
288
- props.multiselect && optionsExist && (React__default["default"].createElement(ComboboxContentHeader, { hasOptionsVisible: optionsExist, subjectNoun: props.subjectNoun, selectedCount: props.selected.length, onClearAll: () => {
304
+ props.multiselect && (optionsExist || props.selected.length > 0) && (React__default["default"].createElement(ComboboxContentHeader, { hasOptionsVisible: optionsExist, subjectNoun: props.subjectNoun, selectedCount: props.selected.length, onClearAll: () => {
289
305
  props.selectedStateSetter([]);
290
306
  }, onSelectAll: () => {
291
307
  props.selectedStateSetter(props.options);
292
308
  } })),
293
- React__default["default"].createElement(ComboboxContentList, { multiselect: props.multiselect, options: props.options, selected: props.selected, optionsListRef: optionsListRef, searchValue: props.searchValue, subjectNoun: props.subjectNoun, loading: props.loading }),
294
- props.actionElements && (React__default["default"].createElement("div", { className: styles$6.actions, role: "group" }, props.actionElements.map((child, index, childrenArray) => (React__default["default"].createElement("div", { key: index, className: classnames__default["default"]({
295
- [styles$6.actionPadding]: index === childrenArray.length - 1,
309
+ React__default["default"].createElement(ComboboxContentList, { multiselect: props.multiselect, options: props.options, selected: props.selected, optionsListRef: optionsListRef, searchValue: props.searchValue, subjectNoun: props.subjectNoun, loading: props.loading, onLoadMore: props.onLoadMore }),
310
+ props.actionElements && (React__default["default"].createElement("div", { className: styles$7.actions, role: "group" }, props.actionElements.map((child, index, childrenArray) => (React__default["default"].createElement("div", { key: index, className: classnames__default["default"]({
311
+ [styles$7.actionPadding]: index === childrenArray.length - 1,
296
312
  }) }, child)))))));
297
313
  return ReactDOM__default["default"].createPortal(template, document.body);
298
314
  }
@@ -320,7 +336,7 @@ function ComboboxTrigger({ label = "Select", selected, }) {
320
336
  const { handleClose, open, setOpen } = React__default["default"].useContext(ComboboxContext);
321
337
  const hasSelection = selected.length;
322
338
  const selectedLabel = selected.map(option => option.label).join(", ");
323
- return (React__default["default"].createElement(Chip.Chip, { variation: hasSelection ? "base" : "subtle", label: hasSelection ? selectedLabel : "", heading: label, onClick: () => {
339
+ return (React__default["default"].createElement(Chip.Chip, { variation: hasSelection ? "base" : "subtle", label: hasSelection ? selectedLabel : "", ariaLabel: label, heading: label, onClick: () => {
324
340
  if (open) {
325
341
  handleClose();
326
342
  }
@@ -335,15 +351,16 @@ var css_248z = ".W8qMZnORYxI- {\n position: fixed;\n top: 0;\n right: 0;\n b
335
351
  var styles = {"overlay":"W8qMZnORYxI-","wrapper":"_-0dkolvLF-Y-"};
336
352
  styleInject_es.styleInject(css_248z);
337
353
 
338
- function useMakeComboboxHandlers(setOpen, setSearchValue, selectedOptions, shouldScroll, selectedStateSetter, multiSelect, onClose) {
354
+ function useMakeComboboxHandlers(setOpen, setSearchValue, selectedOptions, shouldScroll, selectedStateSetter, multiSelect, onClose, onSearch) {
339
355
  const handleClose = React.useCallback(() => {
340
356
  setOpen(false);
341
357
  setSearchValue("");
358
+ onSearch && onSearch("");
342
359
  onClose && onClose();
343
360
  if (selectedOptions.length > 0) {
344
361
  shouldScroll.current = true;
345
362
  }
346
- }, [setOpen, setSearchValue, onClose, selectedOptions.length]);
363
+ }, [setOpen, setSearchValue, onClose, onSearch, selectedOptions.length]);
347
364
  const handleSelection = React.useCallback((selection) => {
348
365
  if (multiSelect) {
349
366
  handleMultiSelect(selectedStateSetter, selectedOptions, selection);
@@ -376,7 +393,7 @@ function useCombobox(selected, onSelect, options, onClose, multiSelect, onSearch
376
393
  const [open, setOpen] = React.useState(false);
377
394
  const [searchValue, setSearchValue] = React.useState("");
378
395
  const searchCallback = React.useCallback(debounce__default["default"]((value) => onSearch === null || onSearch === void 0 ? void 0 : onSearch(value), debounceTime), [onSearch, debounceTime]);
379
- const { handleClose, handleSelection } = useMakeComboboxHandlers(setOpen, setSearchValue, selected, shouldScroll, onSelect, multiSelect, onClose);
396
+ const { handleClose, handleSelection } = useMakeComboboxHandlers(setOpen, setSearchValue, selected, shouldScroll, onSelect, multiSelect, onClose, onSearch);
380
397
  const internalFilteredOptions = options.filter(option => option.label.toLowerCase().includes(searchValue.toLowerCase()));
381
398
  return {
382
399
  wrapperRef,
@@ -448,7 +465,7 @@ function Combobox(props) {
448
465
  React__default["default"].createElement("div", { ref: wrapperRef, className: styles.wrapper },
449
466
  open && (React__default["default"].createElement("div", { className: styles.overlay, onClick: () => handleClose(), "data-testid": "ATL-Combobox-Overlay" })),
450
467
  triggerElement || (React__default["default"].createElement(ComboboxTrigger, { label: props.label, selected: props.selected })),
451
- React__default["default"].createElement(ComboboxContent, { multiselect: props.multiSelect, subjectNoun: props.subjectNoun, selected: selectedOptions, actionElements: actionElements, selectedStateSetter: selectedStateSetter, handleSelection: handleSelection, searchValue: searchValue, setSearchValue: setSearchValue, wrapperRef: wrapperRef, open: open, setOpen: setOpen, options: props.onSearch ? options : internalFilteredOptions, loading: props.loading, handleSearchChange: handleSearchChange }))));
468
+ React__default["default"].createElement(ComboboxContent, { multiselect: props.multiSelect, subjectNoun: props.subjectNoun, selected: selectedOptions, actionElements: actionElements, selectedStateSetter: selectedStateSetter, handleSelection: handleSelection, searchValue: searchValue, setSearchValue: setSearchValue, wrapperRef: wrapperRef, open: open, setOpen: setOpen, options: props.onSearch ? options : internalFilteredOptions, loading: props.loading, handleSearchChange: handleSearchChange, onLoadMore: props.onLoadMore }))));
452
469
  }
453
470
  Combobox.Activator = ComboboxActivator;
454
471
  Combobox.Action = ComboboxAction;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var Card = require('../Card-426a68a8.js');
6
+ var Card = require('../Card-e3144022.js');
7
7
  var Content = require('../Content-e3f7b6fc.js');
8
8
  var Emphasis = require('../Emphasis-bda56d3b.js');
9
9
  require('classnames');
@@ -15,11 +15,11 @@ require('../Button-b73a5e01.js');
15
15
  require('react-router-dom');
16
16
  require('../Icon-405a216c.js');
17
17
  require('@jobber/design');
18
- require('../Menu-81b12936.js');
19
- require('uuid');
18
+ require('../Menu-083fc4c4.js');
20
19
  require('framer-motion');
21
20
  require('@jobber/hooks/useOnKeyDown');
22
21
  require('@jobber/hooks/useRefocusOnActivator');
22
+ require('@jobber/hooks/useSafeLayoutEffect');
23
23
 
24
24
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
25
25
 
@@ -15,6 +15,7 @@ export declare const SEARCH_DEBOUNCE_DELAY: number;
15
15
  export declare const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
16
16
  export declare const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
17
17
  export declare const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
18
+ export declare const DATA_LIST_STICKY_HEADER_TEST_ID = "ATL-DataList-stickyHeader";
18
19
  export declare const TRANSITION_DURATION_IN_SECONDS: number;
19
20
  export declare const TRANSITION_DELAY_IN_SECONDS: number;
20
21
  export {};
@@ -189,7 +189,6 @@ export interface DataListContextProps<T extends DataListObject> extends DataList
189
189
  readonly itemActionComponent?: ReactElement<DataListItemActionsProps<T>>;
190
190
  readonly bulkActionsComponent?: ReactElement<DataListItemActionsProps<T>>;
191
191
  readonly layoutBreakpoints: Breakpoints[];
192
- readonly registerLayoutBreakpoints: (breakpoint: Breakpoints) => void;
193
192
  readonly layouts: {
194
193
  readonly [Breakpoint in Breakpoints]?: LayoutRenderer<T>;
195
194
  };
@@ -1 +1,7 @@
1
- export declare function useMediaQuery(CSSMediaQuery: string): boolean;
1
+ type MediaQuery = `(${string}:${string})`;
2
+ export declare const mediaQueryStore: {
3
+ subscribe(onChange: () => void, query: MediaQuery): () => void;
4
+ getSnapshot(query: MediaQuery): () => boolean;
5
+ };
6
+ export declare function useMediaQuery(query: MediaQuery): boolean;
7
+ export {};
@@ -6,12 +6,12 @@ var tslib_es6 = require('../tslib.es6-754e2961.js');
6
6
  var React = require('react');
7
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
8
  var Text = require('../Text-259af966.js');
9
- var Glimmer = require('../Glimmer-7c317864.js');
9
+ var Glimmer = require('../Glimmer-84dee1ed.js');
10
10
  var noop = require('lodash/noop');
11
11
  var design = require('@jobber/design');
12
12
  var framerMotion = require('framer-motion');
13
13
  var classnames = require('classnames');
14
- var Tooltip = require('../Tooltip-27771182.js');
14
+ var Tooltip = require('../Tooltip-ef3d6ef4.js');
15
15
  var Button = require('../Button-b73a5e01.js');
16
16
  var useInView = require('@jobber/hooks/useInView');
17
17
  var isEmpty = require('lodash/isEmpty');
@@ -23,24 +23,25 @@ var Icon = require('../Icon-405a216c.js');
23
23
  var FormatDate = require('../FormatDate-70ea5b43.js');
24
24
  var Heading = require('../Heading-1e8e4bd3.js');
25
25
  var ReactDOM = require('react-dom');
26
- var Checkbox = require('../Checkbox-99f6297f.js');
26
+ var Checkbox = require('../Checkbox-787e2e47.js');
27
27
  var reactRouterDom = require('react-router-dom');
28
28
  var AnimatedSwitcher = require('../AnimatedSwitcher-3d45ec5d.js');
29
- var Combobox = require('../Combobox-1c91da1f.js');
30
- var Chip = require('../Chip-c91fd6c8.js');
29
+ var Combobox = require('../Combobox-df332d89.js');
30
+ var Chip = require('../Chip-3d1bfddc.js');
31
31
  var debounce = require('lodash/debounce');
32
- var InputText = require('../InputText-6e356985.js');
32
+ var InputText = require('../InputText-55b6cb65.js');
33
33
  var Spinner = require('../Spinner-9d8fc7ff.js');
34
34
  var Typography = require('../Typography-c45bf216.js');
35
35
  require('../Content-e3f7b6fc.js');
36
+ require('@jobber/hooks/useSafeLayoutEffect');
36
37
  require('react-popper');
37
38
  require('../getAtlantisConfig-0f3e8af2.js');
38
- require('uuid');
39
39
  require('react-hook-form');
40
+ require('../AnimatedPresence-20a02aaa.js');
40
41
  require('@jobber/hooks/useAssert');
41
42
  require('../Avatar-76a799fa.js');
42
43
  require('color');
43
- require('../FormField-b4e6c549.js');
44
+ require('../FormField-6ff183f8.js');
44
45
  require('@jobber/hooks/useShowClear');
45
46
  require('../InputValidation-05e839fa.js');
46
47
 
@@ -52,7 +53,7 @@ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
52
53
  var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
53
54
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
54
55
 
55
- var css_248z$g = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n --data-list--minimum-item-height: calc(var(--base-unit) * 3.5);\n\n display: -ms-flexbox;\n\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n -ms-flex: 1;\n flex: 1;\n}\n\n/*\n * Header\n */\n\n.IcAlZHoB4LI- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 1;\n z-index: var(--elevation-base);\n margin-bottom: calc(16px / 2);\n margin-bottom: var(--space-small);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.TFO76ysivmg- {\n display: grid;\n padding: calc((16px / 2) + (16px / 4)) 0;\n padding: calc(calc(16px / 2) + calc(16px / 4)) 0;\n padding: calc(var(--space-small) + var(--space-smaller)) 0;\n gap: calc(16px / 2);\n grid-gap: calc(16px / 2);\n grid-gap: var(--space-small);\n gap: var(--space-small);\n grid-template-columns: auto fit-content(calc(16px * 14));\n grid-template-columns: auto fit-content(calc(var(--base-unit) * 14));\n}\n\n.jGHZZYZm1ZY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n min-height: calc(16px * 3);\n min-height: var(--space-largest);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 8) solid rgb(217, 223, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\n}\n\n.GiD7MjZJbcw- {\n --data-list--header-actions-gap: var(--space-small);\n display: -ms-flexbox;\n display: flex;\n gap: calc(16px / 2);\n gap: var(--data-list--header-actions-gap);\n}\n\n@media (max-width: 489px) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n@media (--small-screens-and-below) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n.jMSVGIAr5tk- > p {\n font-weight: 500;\n white-space: nowrap;\n}\n\n.jMSVGIAr5tk- {\n display: -ms-flexbox;\n display: flex;\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n -ms-flex-align: center;\n align-items: center;\n gap: var(--data-list--header-actions-gap);\n}\n\n/*\n * List Item\n */\n\n.ise8kHCfhCY- {\n position: relative;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 16) solid rgb(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.ise8kHCfhCY-,\n.Tq6e0BGwcSM- {\n display: grid;\n grid-template-columns: minmax(0px, auto);\n min-height: var(--data-list--minimum-item-height);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.ise8kHCfhCY-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--hover);\n background-color: rgb(244, 246, 250);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n text-align: left;\n -webkit-text-decoration: none;\n text-decoration: none;\n background-color: transparent;\n cursor: pointer;\n}\n\n/**\n * Reset CSS properties on focus to ensure we only have the focus state on the\n * parent .listItem\n */\n\n.Tq6e0BGwcSM-:focus {\n outline: none;\n background-color: transparent;\n}\n\n/**\n * Enable a better hover and focus experience when :has() is supported.\n * This is a workaround for Firefox where the :has() selector is not supported.\n */\n\n@supports selector(*:has(*)) {\n .ise8kHCfhCY-:hover,\n .ise8kHCfhCY-:focus-within {\n background-color: transparent;\n }\n\n .ise8kHCfhCY-:has(.Tq6e0BGwcSM-:hover, .Tq6e0BGwcSM-:focus) {\n background-color: var(--data-list-item-active-color);\n }\n}\n\n/*\n * List Item Selection\n */\n\n.d-79rkMqufg- {\n display: grid;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n@media (min-width: 768px) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n.d-79rkMqufg-,\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\n -webkit-column-gap: calc(16px / 2);\n -webkit-column-gap: var(--space-small);\n -moz-column-gap: calc(16px / 2);\n -moz-column-gap: var(--space-small);\n column-gap: calc(16px / 2);\n column-gap: var(--space-small);\n}\n\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n display: grid;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.qm-SSuWTXkI- {\n display: -ms-flexbox;\n display: flex;\n visibility: hidden;\n\n /* To compensate the Checkbox's label margin that we are using for screen-readers */\n margin-right: calc((16px * 1) * -1);\n margin-right: calc(calc(16px * 1) * -1);\n margin-right: calc(var(--space-base) * -1);\n}\n\n.qm-SSuWTXkI-.VA9RnQp6nbI- {\n visibility: visible;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n -ms-flex-order: 1;\n order: 1;\n padding-top: calc(16px / 4);\n padding-top: var(--space-smaller);\n opacity: 1;\n transition: opacity 100ms ease-in-out;\n transition: opacity var(--transition-properties);\n --transition-properties: var(--timing-quick) ease-in-out;\n}\n\n@media (min-width: 768px) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n.ise8kHCfhCY-:hover .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY-:focus-within .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY- .d-79rkMqufg-._4L7iXXzLr5k- > :last-child {\n opacity: 1;\n}\n\n/*\n * Filters\n */\n\n.Kkp-IYmwq-s- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(255, 255, 255, 0.6);\n background-color: var(--color-overlay--dimmed);\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.m-eCShL7TU4- {\n position: sticky;\n top: 50vh;\n}\n\n/* This hides the text from the UI but not from the screen readers */\n\n.esUiRgWabYw- {\n position: absolute;\n top: auto;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n text-indent: -10000px;\n}\n";
56
+ var css_248z$g = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n --data-list--minimum-item-height: calc(var(--base-unit) * 3.5);\n\n display: -ms-flexbox;\n\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n -ms-flex: 1;\n flex: 1;\n}\n\n/*\n * Header\n */\n\n.IcAlZHoB4LI- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 1;\n z-index: var(--elevation-base);\n margin-bottom: calc(16px / 2);\n margin-bottom: var(--space-small);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.TFO76ysivmg- {\n display: grid;\n padding: calc((16px / 2) + (16px / 4)) 0;\n padding: calc(calc(16px / 2) + calc(16px / 4)) 0;\n padding: calc(var(--space-small) + var(--space-smaller)) 0;\n gap: calc(16px / 2);\n grid-gap: calc(16px / 2);\n grid-gap: var(--space-small);\n gap: var(--space-small);\n grid-template-columns: auto fit-content(calc(16px * 14));\n grid-template-columns: auto fit-content(calc(var(--base-unit) * 14));\n}\n\n.TFO76ysivmg-:empty {\n display: none;\n}\n\n.jGHZZYZm1ZY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n min-height: calc(16px * 3);\n min-height: var(--space-largest);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 8) solid rgb(217, 223, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\n}\n\n.GiD7MjZJbcw- {\n --data-list--header-actions-gap: var(--space-small);\n display: -ms-flexbox;\n display: flex;\n gap: calc(16px / 2);\n gap: var(--data-list--header-actions-gap);\n}\n\n@media (max-width: 489px) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n@media (--small-screens-and-below) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n.jMSVGIAr5tk- > p {\n font-weight: 500;\n white-space: nowrap;\n}\n\n.jMSVGIAr5tk- {\n display: -ms-flexbox;\n display: flex;\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n -ms-flex-align: center;\n align-items: center;\n gap: var(--data-list--header-actions-gap);\n}\n\n/*\n * List Item\n */\n\n.ise8kHCfhCY- {\n position: relative;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 16) solid rgb(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.ise8kHCfhCY-,\n.Tq6e0BGwcSM- {\n display: grid;\n grid-template-columns: minmax(0px, auto);\n min-height: var(--data-list--minimum-item-height);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.ise8kHCfhCY-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--hover);\n background-color: rgb(244, 246, 250);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n text-align: left;\n -webkit-text-decoration: none;\n text-decoration: none;\n background-color: transparent;\n cursor: pointer;\n}\n\n/**\n * Reset CSS properties on focus to ensure we only have the focus state on the\n * parent .listItem\n */\n\n.Tq6e0BGwcSM-:focus {\n outline: none;\n background-color: transparent;\n}\n\n/**\n * Enable a better hover and focus experience when :has() is supported.\n * This is a workaround for Firefox where the :has() selector is not supported.\n */\n\n@supports selector(*:has(*)) {\n .ise8kHCfhCY-:hover,\n .ise8kHCfhCY-:focus-within {\n background-color: transparent;\n }\n\n .ise8kHCfhCY-:has(.Tq6e0BGwcSM-:hover, .Tq6e0BGwcSM-:focus) {\n background-color: var(--data-list-item-active-color);\n }\n}\n\n/*\n * List Item Selection\n */\n\n.d-79rkMqufg- {\n display: grid;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n@media (min-width: 768px) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n.d-79rkMqufg-,\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\n -webkit-column-gap: calc(16px / 2);\n -webkit-column-gap: var(--space-small);\n -moz-column-gap: calc(16px / 2);\n -moz-column-gap: var(--space-small);\n column-gap: calc(16px / 2);\n column-gap: var(--space-small);\n}\n\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n display: grid;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.qm-SSuWTXkI- {\n display: -ms-flexbox;\n display: flex;\n visibility: hidden;\n\n /* To compensate the Checkbox's label margin that we are using for screen-readers */\n margin-right: calc((16px * 1) * -1);\n margin-right: calc(calc(16px * 1) * -1);\n margin-right: calc(var(--space-base) * -1);\n}\n\n.qm-SSuWTXkI-.VA9RnQp6nbI- {\n visibility: visible;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n -ms-flex-order: 1;\n order: 1;\n padding-top: calc(16px / 4);\n padding-top: var(--space-smaller);\n opacity: 1;\n transition: opacity 100ms ease-in-out;\n transition: opacity var(--transition-properties);\n --transition-properties: var(--timing-quick) ease-in-out;\n}\n\n@media (min-width: 768px) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n.ise8kHCfhCY-:hover .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY-:focus-within .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY- .d-79rkMqufg-._4L7iXXzLr5k- > :last-child {\n opacity: 1;\n}\n\n/*\n * Filters\n */\n\n.Kkp-IYmwq-s- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(255, 255, 255, 0.6);\n background-color: var(--color-overlay--dimmed);\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.m-eCShL7TU4- {\n position: sticky;\n top: 50vh;\n}\n\n/* This hides the text from the UI but not from the screen readers */\n\n.esUiRgWabYw- {\n position: absolute;\n top: auto;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n text-indent: -10000px;\n}\n";
56
57
  var styles$g = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","batchSelectContainer":"GiD7MjZJbcw-","headerBatchSelect":"jMSVGIAr5tk-","listItem":"ise8kHCfhCY-","listItemClickable":"Tq6e0BGwcSM-","active":"Pc0JGX6jCD4-","selectable":"d-79rkMqufg-","selectAllCheckbox":"qm-SSuWTXkI-","visible":"VA9RnQp6nbI-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-","srOnly":"esUiRgWabYw-"};
57
58
  styleInject_es.styleInject(css_248z$g);
58
59
 
@@ -84,7 +85,6 @@ const defaultValues$1 = {
84
85
  children: [],
85
86
  selected: [],
86
87
  layoutBreakpoints: [],
87
- registerLayoutBreakpoints: noop__default["default"],
88
88
  layouts: {
89
89
  xs: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
90
90
  sm: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
@@ -99,7 +99,19 @@ function useDataListContext() {
99
99
  return React.useContext(DataListContext);
100
100
  }
101
101
 
102
- function useMediaQuery(CSSMediaQuery) {
102
+ const mediaQueryStore = {
103
+ subscribe(onChange, query) {
104
+ const matchMedia = window.matchMedia(query);
105
+ matchMedia.addEventListener("change", onChange);
106
+ return () => {
107
+ matchMedia.removeEventListener("change", onChange);
108
+ };
109
+ },
110
+ getSnapshot(query) {
111
+ return () => window.matchMedia(query).matches;
112
+ },
113
+ };
114
+ function useMediaQuery(query) {
103
115
  /**
104
116
  * matchMedia have had full support for browsers since 2012 but jest, being a
105
117
  * lite version of a DOM, doesn't support it.
@@ -113,16 +125,8 @@ function useMediaQuery(CSSMediaQuery) {
113
125
  */
114
126
  if (window.matchMedia === undefined)
115
127
  return true;
116
- const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
117
- React.useEffect(() => {
118
- const media = window.matchMedia(CSSMediaQuery);
119
- if (media.matches !== matches) {
120
- setMatches(media.matches);
121
- }
122
- const listener = () => setMatches(media.matches);
123
- media.addEventListener("change", listener);
124
- return () => media.removeEventListener("change", listener);
125
- }, [CSSMediaQuery]);
128
+ const subscribeMediaQuery = React.useCallback((onChange) => mediaQueryStore.subscribe(onChange, query), [query]);
129
+ const matches = React.useSyncExternalStore(subscribeMediaQuery, mediaQueryStore.getSnapshot(query), () => true);
126
130
  return matches;
127
131
  }
128
132
 
@@ -144,6 +148,7 @@ const SEARCH_DEBOUNCE_DELAY = design.tokens["timing-slowest"];
144
148
  const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
145
149
  const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
146
150
  const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
151
+ const DATA_LIST_STICKY_HEADER_TEST_ID = "ATL-DataList-stickyHeader";
147
152
  const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
148
153
  const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
149
154
 
@@ -764,17 +769,14 @@ function DataListItems({ size = "xs", }) {
764
769
  }
765
770
 
766
771
  function DataListLayout({ children, size = "xs", }) {
767
- const { layoutBreakpoints, registerLayout, registerLayoutBreakpoints, loadingState, } = useDataListContext();
768
- const breakpoints = useResponsiveSizing();
769
- React.useEffect(() => {
770
- registerLayoutBreakpoints(size);
771
- }, [size]);
772
+ const { registerLayout, loadingState, layouts } = useDataListContext();
773
+ const { activeBreakpoint } = useActiveLayout();
772
774
  React.useEffect(() => {
775
+ if (layouts[size])
776
+ return;
773
777
  registerLayout(size, children);
774
778
  }, [size, children]);
775
- const sizeIndex = layoutBreakpoints.indexOf(size);
776
- const nextAvailableSize = layoutBreakpoints[sizeIndex + 1];
777
- const shouldRenderList = breakpoints[size] && !breakpoints[nextAvailableSize];
779
+ const shouldRenderList = size === activeBreakpoint;
778
780
  if (loadingState !== "initial" && shouldRenderList) {
779
781
  return React__default["default"].createElement(DataListItems, { size: size });
780
782
  }
@@ -1016,7 +1018,7 @@ function DataListStickyHeader({ children }) {
1016
1018
  ref.current && observer.unobserve(ref.current);
1017
1019
  };
1018
1020
  }, [handleObserver, ref.current]);
1019
- return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
1021
+ return (React__default["default"].createElement("div", { "data-testid": DATA_LIST_STICKY_HEADER_TEST_ID, ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
1020
1022
  }
1021
1023
 
1022
1024
  var css_248z$4 = ".tj0MOMhLEEY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smaller));\n\n position: absolute;\n top: 50%;\n right: calc((16px * 3) - (16px / 4));\n right: calc(calc(16px * 3) - calc(16px / 4));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n padding: calc(16px / 4) 0;\n padding: var(--space-smaller) 0;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n opacity: 0;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n transition: opacity 200ms ease-in-out,\n width 200ms ease-in-out, visibility 200ms ease-in-out;\n transition: opacity var(--transition-properties),\n width var(--transition-properties), visibility var(--transition-properties);\n}\n\n._3S1-91v2SYI- {\n visibility: visible;\n width: calc(100% - var(--button-offset));\n opacity: 1;\n}\n\n@media (min-width: 768px) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n padding: 0;\n background-color: transparent;\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n transition: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n padding: 0;\n background-color: transparent;\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n transition: none;\n}\n }\n\n._9GlBktsUALw- {\n display: block;\n}\n\n@media (min-width: 768px) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n/*\n * No Filters Styling\n *\n * When there are no filters, the search input is always visible.\n * ------------------------------------------------------------------------- */\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n\n@media (min-width: 768px) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n._3Pjrt42x454- ._9GlBktsUALw- {\n display: none;\n}\n";
@@ -1222,14 +1224,16 @@ function InternalDataListStatusBar() {
1222
1224
 
1223
1225
  function DataList(_a) {
1224
1226
  var { selected = [], sorting } = _a, props = tslib_es6.__rest(_a, ["selected", "sorting"]);
1225
- const [layoutBreakpoints, setLayoutBreakpoints] = React.useState([]);
1226
1227
  const [layouts, setLayouts] = React.useState({});
1228
+ const layoutBreakpoints = React.useMemo(() => sortBreakpoints(Object.keys(layouts)), [layouts]);
1227
1229
  const searchComponent = getCompoundComponent(props.children, DataListSearch);
1228
1230
  const filterComponent = getCompoundComponent(props.children, DataListFilters);
1229
1231
  const layoutComponents = getCompoundComponents(props.children, DataListLayout);
1230
1232
  const emptyStateComponents = getCompoundComponents(props.children, DataListEmptyState);
1231
1233
  const itemActionComponent = getCompoundComponent(props.children, DataListItemActions);
1232
1234
  const bulkActionsComponent = getCompoundComponent(props.children, DataListBulkActions);
1235
+ const headerCount = Object.keys(props.headers).length;
1236
+ const shouldRenderStickyHeader = !!filterComponent || !!searchComponent || headerCount > 0;
1233
1237
  return (React__default["default"].createElement(DataListContext.Provider, { value: Object.assign(Object.assign({ searchComponent,
1234
1238
  filterComponent,
1235
1239
  layoutComponents,
@@ -1237,20 +1241,16 @@ function DataList(_a) {
1237
1241
  itemActionComponent,
1238
1242
  bulkActionsComponent,
1239
1243
  layoutBreakpoints,
1240
- registerLayoutBreakpoints,
1241
1244
  layouts,
1242
1245
  registerLayout }, props), { selected,
1243
1246
  // T !== DataListObject
1244
1247
  sorting: sorting }) },
1245
- React__default["default"].createElement(InternalDataList, null)));
1246
- function registerLayoutBreakpoints(size) {
1247
- setLayoutBreakpoints(prev => sortBreakpoints([...prev, size]));
1248
- }
1248
+ React__default["default"].createElement(InternalDataList, { shouldRenderStickyHeader: shouldRenderStickyHeader })));
1249
1249
  function registerLayout(size, children) {
1250
1250
  setLayouts(prev => (Object.assign(Object.assign({}, prev), { [size]: children })));
1251
1251
  }
1252
1252
  }
1253
- function InternalDataList() {
1253
+ function InternalDataList({ shouldRenderStickyHeader, }) {
1254
1254
  const { data, title, totalCount, loadingState = "none", layoutComponents, } = useDataListContext();
1255
1255
  const backToTopRef = React.useRef(null);
1256
1256
  const initialLoading = loadingState === "initial";
@@ -1261,12 +1261,12 @@ function InternalDataList() {
1261
1261
  title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
1262
1262
  React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: initialLoading })),
1263
1263
  React__default["default"].createElement("div", { ref: backToTopRef }),
1264
- React__default["default"].createElement(DataListStickyHeader, null,
1264
+ shouldRenderStickyHeader && (React__default["default"].createElement(DataListStickyHeader, null,
1265
1265
  React__default["default"].createElement("div", { className: styles$g.headerFilters },
1266
1266
  React__default["default"].createElement(InternalDataListFilters, null),
1267
1267
  React__default["default"].createElement(InternalDataListSearch, null)),
1268
1268
  React__default["default"].createElement(InternalDataListStatusBar, null),
1269
- React__default["default"].createElement(DataListHeader, null)),
1269
+ React__default["default"].createElement(DataListHeader, null))),
1270
1270
  initialLoading && React__default["default"].createElement(DataListLoadingState, null),
1271
1271
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
1272
1272
  layoutComponents,
@@ -7,14 +7,13 @@ var classnames = require('classnames');
7
7
  var React = require('react');
8
8
  var jobberHooks = require('@jobber/hooks/useResizeObserver');
9
9
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
10
- var Glimmer = require('../Glimmer-7c317864.js');
10
+ var Glimmer = require('../Glimmer-84dee1ed.js');
11
11
  var tslib_es6 = require('../tslib.es6-754e2961.js');
12
- var Option = require('../Option-8565da71.js');
12
+ var Option = require('../Option-3c4d377e.js');
13
13
  var Button = require('../Button-b73a5e01.js');
14
14
  var Text = require('../Text-259af966.js');
15
15
  require('../Content-e3f7b6fc.js');
16
- require('../FormField-b4e6c549.js');
17
- require('uuid');
16
+ require('../FormField-6ff183f8.js');
18
17
  require('react-hook-form');
19
18
  require('@jobber/hooks/useShowClear');
20
19
  require('../Icon-405a216c.js');
@@ -2,10 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var FormField = require('../FormField-b4e6c549.js');
5
+ var FormField = require('../FormField-6ff183f8.js');
6
6
  require('../tslib.es6-754e2961.js');
7
7
  require('react');
8
- require('uuid');
9
8
  require('react-hook-form');
10
9
  require('../style-inject.es-9d2f5f4e.js');
11
10
  require('classnames');
@@ -2,7 +2,6 @@
2
2
 
3
3
  var tslib_es6 = require('./tslib.es6-754e2961.js');
4
4
  var React = require('react');
5
- var uuid = require('uuid');
6
5
  var reactHookForm = require('react-hook-form');
7
6
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
8
7
  var classnames = require('classnames');
@@ -151,8 +150,8 @@ function FormField(props) {
151
150
  ? reactHookForm.useFormContext()
152
151
  : // If there isn't a Form Context being provided, get a form for this field.
153
152
  reactHookForm.useForm({ mode: "onTouched" });
154
- const [identifier] = React.useState(uuid.v1());
155
- const [descriptionIdentifier] = React.useState(`descriptionUUID--${uuid.v1()}`);
153
+ const [identifier] = React.useState(React.useId());
154
+ const [descriptionIdentifier] = React.useState(`descriptionUUID--${React.useId()}`);
156
155
  /**
157
156
  * Generate a name if one is not supplied, this is the name
158
157
  * that will be used for react-hook-form and not neccessarily
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var FormatFile = require('../FormatFile-652edda8.js');
5
+ var FormatFile = require('../FormatFile-f10799f5.js');
6
6
  require('react');
7
7
  require('classnames');
8
8
  require('filesize');
@@ -27,7 +27,7 @@ require('../Markdown-f7c55304.js');
27
27
  require('react-markdown');
28
28
  require('../Text-259af966.js');
29
29
  require('../Emphasis-bda56d3b.js');
30
- require('../Glimmer-7c317864.js');
30
+ require('../Glimmer-84dee1ed.js');
31
31
  require('../tslib.es6-754e2961.js');
32
32
  require('../ProgressBar-b68edc8f.js');
33
33
 
@@ -6,7 +6,7 @@ var getHumanReadableFileSize = require('filesize');
6
6
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
7
  var Button = require('./Button-b73a5e01.js');
8
8
  var ConfirmationModal = require('./ConfirmationModal-f1a049fb.js');
9
- var Glimmer = require('./Glimmer-7c317864.js');
9
+ var Glimmer = require('./Glimmer-84dee1ed.js');
10
10
  var Icon = require('./Icon-405a216c.js');
11
11
  var Typography = require('./Typography-c45bf216.js');
12
12
  var Text = require('./Text-259af966.js');