@jobber/components 4.45.0 → 4.45.1-visual-upd.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (123) hide show
  1. package/Chip.d.ts +1 -0
  2. package/Chip.js +17 -0
  3. package/dist/Autocomplete/index.js +7 -7
  4. package/dist/Banner/index.js +3 -3
  5. package/dist/Button/index.js +2 -2
  6. package/dist/{Button-d89f2271.js → Button-db6114a6.js} +1 -1
  7. package/dist/ButtonDismiss/index.js +3 -3
  8. package/dist/{ButtonDismiss-250840a4.js → ButtonDismiss-1ccb84ec.js} +1 -1
  9. package/dist/Card/index.js +5 -5
  10. package/dist/{Card-69304e99.js → Card-116af709.js} +3 -3
  11. package/dist/Checkbox/index.js +3 -3
  12. package/dist/{Checkbox-eac63b7f.js → Checkbox-bc4bc968.js} +1 -1
  13. package/dist/Chip/Chip.d.ts +8 -0
  14. package/dist/Chip/components/ChipDismissible/ChipDismissible.d.ts +3 -0
  15. package/dist/Chip/components/ChipPrefix/Chip.Prefix.d.ts +2 -0
  16. package/dist/Chip/components/ChipSelectable/ChipSelectable.d.ts +3 -0
  17. package/dist/Chip/components/ChipSuffix/Chip.Suffix.d.ts +6 -0
  18. package/dist/Chip/hooks/index.d.ts +1 -0
  19. package/dist/Chip/hooks/useChildComponent.d.ts +8 -0
  20. package/dist/Chip/index.d.ts +3 -0
  21. package/dist/Chip/index.js +85 -0
  22. package/dist/{Chip-4d8e6370.js → Chip-b603ceaf.js} +5 -5
  23. package/dist/Chips/index.js +5 -5
  24. package/dist/Combobox/Combobox.d.ts +6 -0
  25. package/dist/Combobox/ComboboxProvider.d.ts +2 -0
  26. package/dist/Combobox/components/ComboboxContent/ComboboxContent.d.ts +17 -6
  27. package/dist/Combobox/components/ComboboxContent/ComboboxList.d.ts +9 -8
  28. package/dist/Combobox/hooks/useComboboxContent.d.ts +7 -3
  29. package/dist/Combobox/index.js +64 -30
  30. package/dist/ConfirmationModal/index.js +9 -9
  31. package/dist/{ConfirmationModal-92f07027.js → ConfirmationModal-285c3cbe.js} +2 -2
  32. package/dist/DataDump/index.js +6 -6
  33. package/dist/DataList/DataList.d.ts +1 -1
  34. package/dist/DataList/DataList.types.d.ts +29 -6
  35. package/dist/DataList/DataList.utils.d.ts +1 -1
  36. package/dist/DataList/components/DataListAction/DataListAction.d.ts +2 -3
  37. package/dist/DataList/components/DataListActions/DataListActions.d.ts +3 -0
  38. package/dist/DataList/components/DataListActions/index.d.ts +1 -0
  39. package/dist/DataList/components/DataListHeader/DataListHeader.d.ts +2 -0
  40. package/dist/DataList/components/DataListHeader/index.d.ts +1 -0
  41. package/dist/DataList/components/DataListItem/DataListItem.d.ts +2 -2
  42. package/dist/DataList/components/DataListItemActions/DataListItemActions.d.ts +1 -5
  43. package/dist/DataList/components/DataListItemActions/index.d.ts +0 -1
  44. package/dist/DataList/components/DataListItemActionsOverflow/DataListItemActionsOverflow.d.ts +7 -0
  45. package/dist/DataList/components/DataListItemActionsOverflow/index.d.ts +1 -0
  46. package/dist/DataList/components/DataListItems/DataListItems.d.ts +7 -0
  47. package/dist/DataList/components/DataListItems/index.d.ts +1 -0
  48. package/dist/DataList/components/DataListLayout/DataListLayout.d.ts +2 -2
  49. package/dist/DataList/components/DataListLoadingState/DataListLoadingState.d.ts +2 -9
  50. package/dist/DataList/components/DataListSearch/DataListSearch.d.ts +1 -1
  51. package/dist/DataList/context/DataListContext/DataListContext.d.ts +3 -3
  52. package/dist/DataList/hooks/useActiveLayout.d.ts +4 -0
  53. package/dist/DataList/index.js +396 -365
  54. package/dist/DataTable/index.js +6 -6
  55. package/dist/DatePicker/index.js +3 -3
  56. package/dist/{DatePicker-39d2dc8b.js → DatePicker-49213434.js} +2 -2
  57. package/dist/DescriptionList/index.js +1 -1
  58. package/dist/Disclosure/index.js +1 -1
  59. package/dist/Drawer/index.js +4 -4
  60. package/dist/Emphasis/index.js +2 -2
  61. package/dist/{Emphasis-cc3456ac.js → Emphasis-e10dde65.js} +1 -1
  62. package/dist/FeatureSwitch/index.js +7 -7
  63. package/dist/FormField/index.js +5 -5
  64. package/dist/{FormField-bef41ec9.js → FormField-fa9254dc.js} +3 -3
  65. package/dist/FormatFile/index.js +10 -10
  66. package/dist/{FormatFile-a470c0f2.js → FormatFile-6423c3b5.js} +4 -4
  67. package/dist/Gallery/index.js +11 -11
  68. package/dist/Heading/index.js +2 -2
  69. package/dist/{Heading-4562900a.js → Heading-4cde9989.js} +1 -1
  70. package/dist/InlineLabel/index.js +2 -2
  71. package/dist/{InlineLabel-3d461632.js → InlineLabel-a24706c4.js} +1 -1
  72. package/dist/InputAvatar/index.js +3 -3
  73. package/dist/InputDate/index.js +6 -6
  74. package/dist/InputEmail/index.js +5 -5
  75. package/dist/InputFile/index.js +3 -3
  76. package/dist/{InputFile-d327dee3.js → InputFile-25c3369b.js} +2 -2
  77. package/dist/InputNumber/index.js +6 -6
  78. package/dist/{InputNumber-5640fb55.js → InputNumber-ea9fcee1.js} +1 -1
  79. package/dist/InputPassword/index.js +5 -5
  80. package/dist/InputPhoneNumber/index.js +5 -5
  81. package/dist/InputText/index.js +6 -6
  82. package/dist/{InputText-5ac5cfe0.js → InputText-ab237501.js} +1 -1
  83. package/dist/InputTime/index.js +5 -5
  84. package/dist/InputValidation/index.js +3 -3
  85. package/dist/{InputValidation-4e809bdd.js → InputValidation-377d6c62.js} +1 -1
  86. package/dist/LightBox/index.js +4 -4
  87. package/dist/{LightBox-02ca409e.js → LightBox-93ef99b9.js} +2 -2
  88. package/dist/List/index.js +5 -5
  89. package/dist/Markdown/index.js +5 -5
  90. package/dist/{Markdown-b37cf9ec.js → Markdown-d53b01bf.js} +3 -3
  91. package/dist/Menu/index.js +3 -3
  92. package/dist/{Menu-cec53b50.js → Menu-2e64307a.js} +2 -2
  93. package/dist/Modal/index.js +5 -5
  94. package/dist/{Modal-dcdc0032.js → Modal-c17cc105.js} +3 -3
  95. package/dist/MultiSelect/index.js +3 -3
  96. package/dist/{Option-9f4a65da.js → Option-07a24acd.js} +1 -1
  97. package/dist/Page/index.js +7 -7
  98. package/dist/Popover/index.js +4 -4
  99. package/dist/{Popover-d401fb54.js → Popover-7c966790.js} +1 -1
  100. package/dist/RadioGroup/index.js +3 -3
  101. package/dist/{RadioGroup-46833fac.js → RadioGroup-9bdd8a59.js} +1 -1
  102. package/dist/RecurringSelect/index.js +8 -8
  103. package/dist/Select/index.js +6 -6
  104. package/dist/StatusLabel/index.js +2 -2
  105. package/dist/Switch/index.js +2 -2
  106. package/dist/{Switch-165f01e3.js → Switch-cc9b645c.js} +1 -1
  107. package/dist/Tabs/index.js +1 -1
  108. package/dist/Text/index.js +2 -2
  109. package/dist/{Text-59bde58c.js → Text-54334431.js} +1 -1
  110. package/dist/Toast/index.js +2 -2
  111. package/dist/Tooltip/index.js +1 -3
  112. package/dist/{Tooltip-59dbab5b.js → Tooltip-3f9048ce.js} +5 -6
  113. package/dist/Typography/index.js +1 -1
  114. package/dist/{Typography-9bff9c91.js → Typography-83915c54.js} +2 -2
  115. package/package.json +5 -5
  116. package/rollup.config.js +2 -5
  117. package/dist/DataList/components/DataListItemActions/DataListItemActionsOverflow.d.ts +0 -7
  118. package/dist/DataList/components/DataListLayoutInternal/DataListHeader.d.ts +0 -11
  119. package/dist/DataList/components/DataListLayoutInternal/DataListItems.d.ts +0 -10
  120. package/dist/DataList/components/DataListLayoutInternal/DataListLayoutInternal.d.ts +0 -10
  121. package/dist/DataList/components/DataListLayoutInternal/index.d.ts +0 -3
  122. package/dist/DataList/hooks/useLayoutMediaQueries.d.ts +0 -1
  123. /package/dist/DataList/components/{DataListLayoutInternal → DataListHeader}/DataListHeaderCheckbox.d.ts +0 -0
@@ -5,59 +5,56 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib_es6 = require('../tslib.es6-5b8768b7.js');
6
6
  var React = require('react');
7
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
- var Text = require('../Text-59bde58c.js');
8
+ var Text = require('../Text-54334431.js');
9
9
  var Glimmer = require('../Glimmer-cfa92a88.js');
10
- var framerMotion = require('framer-motion');
11
- var classnames = require('classnames');
12
10
  var noop = require('lodash/noop');
13
- var reactRouterDom = require('react-router-dom');
14
- var Button = require('../Button-d89f2271.js');
15
11
  var design = require('@jobber/design');
16
- var Typography = require('../Typography-9bff9c91.js');
17
- var ReactDOM = require('react-dom');
18
- var Tooltip = require('../Tooltip-59dbab5b.js');
19
- require('react-popper');
12
+ var framerMotion = require('framer-motion');
13
+ var classnames = require('classnames');
14
+ var Tooltip = require('../Tooltip-3f9048ce.js');
15
+ var Button = require('../Button-db6114a6.js');
16
+ var useInView = require('@jobber/hooks/useInView');
17
+ var isEmpty = require('lodash/isEmpty');
18
+ var InlineLabel = require('../InlineLabel-a24706c4.js');
19
+ var FormatDate = require('../FormatDate-70ea5b43.js');
20
+ var Heading = require('../Heading-4cde9989.js');
20
21
  var useFocusTrap = require('@jobber/hooks/useFocusTrap');
21
22
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
22
23
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
23
- var foundation = require('@jobber/design/foundation');
24
- var isEmpty = require('lodash/isEmpty');
25
- var InlineLabel = require('../InlineLabel-3d461632.js');
26
- var styles$f = require('@jobber/components/DataList/DataList.css');
27
- require('uuid');
28
- require('react-hook-form');
29
- var Checkbox = require('../Checkbox-eac63b7f.js');
30
- var FormatDate = require('../FormatDate-70ea5b43.js');
31
- var Heading = require('../Heading-4562900a.js');
24
+ var ReactDOM = require('react-dom');
25
+ var Checkbox = require('../Checkbox-bc4bc968.js');
26
+ var reactRouterDom = require('react-router-dom');
32
27
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
33
- var useInView = require('@jobber/hooks/useInView');
34
- var Icon = require('../Icon-405a216c.js');
35
- var Popover = require('../Popover-d401fb54.js');
28
+ var Popover = require('../Popover-7c966790.js');
36
29
  var Content = require('../Content-2ca1ffe1.js');
37
- var Chip = require('../Chip-4d8e6370.js');
30
+ var Chip = require('../Chip-b603ceaf.js');
38
31
  require('@jobber/hooks/useAssert');
39
32
  require('../Avatar-1aa30ee1.js');
40
33
  require('color');
34
+ var Typography = require('../Typography-83915c54.js');
35
+ require('react-popper');
41
36
  var debounce = require('lodash/debounce');
42
- var InputText = require('../InputText-5ac5cfe0.js');
37
+ var InputText = require('../InputText-ab237501.js');
43
38
  var Spinner = require('../Spinner-9d8fc7ff.js');
44
- require('../ButtonDismiss-250840a4.js');
39
+ var Icon = require('../Icon-405a216c.js');
40
+ require('uuid');
41
+ require('react-hook-form');
42
+ require('../ButtonDismiss-1ccb84ec.js');
45
43
  require('lodash/sortBy');
46
44
  require('@jobber/hooks/useLiveAnnounce');
47
- require('../FormField-bef41ec9.js');
48
- require('../InputValidation-4e809bdd.js');
45
+ require('../FormField-fa9254dc.js');
46
+ require('../InputValidation-377d6c62.js');
49
47
 
50
48
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
51
49
 
52
50
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
53
- var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
54
51
  var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
52
+ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
55
53
  var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
56
- var styles__default = /*#__PURE__*/_interopDefaultLegacy(styles$f);
57
54
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
58
55
 
59
- var css_248z$e = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n display: -ms-flexbox;\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) 0;\n padding: var(--space-small) 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 -webkit-max-content;\n grid-template-columns: auto max-content;\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(225, 225, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\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 width: 100%;\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: calc(16px / 4);\n gap: var(--space-smaller);\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(225, 225, 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-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--background);\n background-color: rgb(244, 244, 244);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n display: block;\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 * 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.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";
60
- var styles$e = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","headerBatchSelect":"jMSVGIAr5tk-","listItem":"ise8kHCfhCY-","active":"Pc0JGX6jCD4-","listItemClickable":"Tq6e0BGwcSM-","selectable":"d-79rkMqufg-","selectAllCheckbox":"qm-SSuWTXkI-","visible":"VA9RnQp6nbI-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-","srOnly":"esUiRgWabYw-"};
56
+ var css_248z$e = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n display: -ms-flexbox;\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) 0;\n padding: var(--space-small) 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 -webkit-max-content;\n grid-template-columns: auto max-content;\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(225, 225, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\n}\n\n.GiD7MjZJbcw- {\n display: -ms-flexbox;\n display: flex;\n}\n\n@media (max-width: 489.98px) {\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: calc(16px / 4);\n gap: var(--space-smaller);\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(225, 225, 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-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--background);\n background-color: rgb(244, 244, 244);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n display: block;\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 * 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";
57
+ var styles$e = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","batchSelectContainer":"GiD7MjZJbcw-","headerBatchSelect":"jMSVGIAr5tk-","listItem":"ise8kHCfhCY-","active":"Pc0JGX6jCD4-","listItemClickable":"Tq6e0BGwcSM-","selectable":"d-79rkMqufg-","selectAllCheckbox":"qm-SSuWTXkI-","visible":"VA9RnQp6nbI-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-","srOnly":"esUiRgWabYw-"};
61
58
  styleInject_es.styleInject(css_248z$e);
62
59
 
63
60
  var css_248z$d = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
@@ -81,65 +78,55 @@ function DataListTotalCount({ totalCount, loading, }) {
81
78
  return (React__default["default"].createElement("div", { className: styles$d.results, "data-testid": DATALIST_TOTALCOUNT_TEST_ID }, output));
82
79
  }
83
80
 
84
- var css_248z$c = ".Rh--6fVpkm4- {\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n\n.zbS7UvpVoWI- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: justify;\n justify-content: space-between;\n height: calc(16px * 3);\n height: var(--space-largest);\n padding: calc(16px * 1) 0;\n padding: var(--space-base) 0;\n}\n";
85
- var styles$c = {"loadingItem":"Rh--6fVpkm4-","mobileLoadingState":"zbS7UvpVoWI-"};
86
- styleInject_es.styleInject(css_248z$c);
87
-
88
81
  const defaultValues$1 = {
89
82
  title: "",
90
83
  data: [],
91
84
  headers: {},
92
85
  children: [],
93
86
  selected: [],
87
+ layoutBreakpoints: [],
88
+ registerLayoutBreakpoints: noop__default["default"],
89
+ layouts: {
90
+ xs: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
91
+ sm: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
92
+ md: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
93
+ lg: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
94
+ xl: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
95
+ },
96
+ registerLayout: noop__default["default"],
94
97
  };
95
98
  const DataListContext = React.createContext(defaultValues$1);
96
99
  function useDataListContext() {
97
100
  return React.useContext(DataListContext);
98
101
  }
99
102
 
100
- const defaultValues = {
101
- isInLayoutProvider: false,
102
- hasInLayoutActions: false,
103
- setHasInLayoutActions: noop__default["default"],
104
- };
105
- const DataListLayoutContext = React.createContext(defaultValues);
106
- function useDataListLayoutContext() {
107
- return React.useContext(DataListLayoutContext);
108
- }
109
-
110
- var css_248z$b = ".jHcHGQ-HDbk- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: calc((16px / 2) * -1);\n top: calc(calc(16px / 2) * -1);\n top: calc(var(--space-small) * -1);\n right: 0;\n z-index: 6;\n z-index: var(--elevation-menu);\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 padding: calc(16px / 4);\n padding: var(--space-smaller);\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 background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n";
111
- var styles$b = {"menu":"jHcHGQ-HDbk-"};
112
- styleInject_es.styleInject(css_248z$b);
113
-
114
- var css_248z$a = ".iyg43v-S9yU- {\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n min-height: 44px;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border: none;\n border-radius: 0;\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 text-align: left;\n background: none;\n cursor: pointer;\n transition: background 200ms ease;\n transition: background var(--timing-base) ease;\n -webkit-appearance: none;\n appearance: none;\n -ms-flex-align: center;\n align-items: center;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.iyg43v-S9yU-:hover,\n.iyg43v-S9yU-:focus {\n background-color: rgb(250, 246, 219);\n background-color: var(--color-surface--hover);\n}\n\n.AUJNqz93ZDA- {\n font-weight: 500;\n}\n";
115
- var styles$a = {"action":"iyg43v-S9yU-","label":"AUJNqz93ZDA-"};
116
- styleInject_es.styleInject(css_248z$a);
117
-
118
- function DataListAction(
119
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
120
- _) {
121
- return null;
122
- }
123
- function InternalDataListAction({ label, icon, destructive, onClick, item, }) {
124
- const color = destructive ? "critical" : "blue";
125
- return (React__default["default"].createElement("button", { className: styles$a.action, onClick: handleClick },
126
- icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color }),
127
- React__default["default"].createElement(Typography.Typography, { textColor: color },
128
- React__default["default"].createElement("span", { className: styles$a.label }, label))));
129
- function handleClick() {
130
- if (item) {
131
- onClick === null || onClick === void 0 ? void 0 : onClick(item);
132
- }
133
- else {
134
- onClick === null || onClick === void 0 ? void 0 : onClick();
103
+ function useMediaQuery(CSSMediaQuery) {
104
+ /**
105
+ * matchMedia have had full support for browsers since 2012 but jest, being a
106
+ * lite version of a DOM, doesn't support it.
107
+ *
108
+ * Instead of the consumers mocking matchMedia on every usage of DataList,
109
+ * we can just return true to mimic the largest screen we support.
110
+ *
111
+ * In the event that the consumer wants to test the DataList on different
112
+ * screen sizes, they can use the `mockViewportWidth` function from
113
+ * `@jobber/components/useBreakpoints`.
114
+ */
115
+ if (window.matchMedia === undefined)
116
+ return true;
117
+ const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
118
+ React.useEffect(() => {
119
+ const media = window.matchMedia(CSSMediaQuery);
120
+ if (media.matches !== matches) {
121
+ setMatches(media.matches);
135
122
  }
136
- }
123
+ const listener = () => setMatches(media.matches);
124
+ media.addEventListener("change", listener);
125
+ return () => media.removeEventListener("change", listener);
126
+ }, [CSSMediaQuery]);
127
+ return matches;
137
128
  }
138
129
 
139
- var css_248z$9 = ".aokwZU8jbWU- {\n position: fixed;\n top: 0;\n top: var(--actions-menu-y, 0);\n left: 0;\n left: var(--actions-menu-x, 0);\n z-index: 6;\n z-index: var(--elevation-menu);\n min-width: 150px;\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 padding: calc(16px / 4);\n padding: var(--space-smaller);\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 background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.XtVRP97TVSE- {\n position: fixed;\n top: 0;\n left: 0;\n z-index: calc(6 - 1);\n z-index: calc(var(--elevation-menu) - 1);\n width: 100%;\n height: 100%;\n padding: 0;\n border: none;\n background-color: transparent;\n}\n";
140
- var styles$9 = {"menu":"aokwZU8jbWU-","overlay":"XtVRP97TVSE-"};
141
- styleInject_es.styleInject(css_248z$9);
142
-
143
130
  const EMPTY_RESULTS_MESSAGE = "List is looking empty";
144
131
  const EMPTY_FILTER_RESULTS_MESSAGE = "No results for selected filters";
145
132
  const EMPTY_STATE_ACTION_BUTTON_ONLY_ERROR = "DataListEmptyState action prop must be a Button component";
@@ -161,61 +148,79 @@ const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
161
148
  const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
162
149
  const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
163
150
 
164
- const variants$1 = {
165
- hidden: { opacity: 0, y: -10 },
166
- visible: { opacity: 1, y: 0 },
151
+ function useResponsiveSizing() {
152
+ const xs = useMediaQuery(`(width > ${BREAKPOINT_SIZES.xs}px)`);
153
+ const sm = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.sm}px)`);
154
+ const md = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.md}px)`);
155
+ const lg = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.lg}px)`);
156
+ const xl = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.xl}px)`);
157
+ return { xs, sm, md, lg, xl };
158
+ }
159
+
160
+ function useActiveLayout() {
161
+ const { layoutBreakpoints, layouts } = useDataListContext();
162
+ const breakpoints = useResponsiveSizing();
163
+ const reversedLayoutBreakpoints = [...layoutBreakpoints].reverse();
164
+ const activeBreakpoint = reversedLayoutBreakpoints.find(key => breakpoints[key]) ||
165
+ layoutBreakpoints[0];
166
+ const layout = layouts[activeBreakpoint];
167
+ return { layout, activeBreakpoint };
168
+ }
169
+
170
+ var css_248z$c = "._8cMzUF8XEwY- {\n position: relative;\n}\n\n._8cMzUF8XEwY-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n bottom: 0;\n left: 0;\n height: 100px;\n background-image: linear-gradient(\n to top,\n rgba(255, 255, 255, 1) 0%,\n rgba(255, 255, 255, 0) 100%\n );\n background-image: linear-gradient(\n to top,\n var(--color-surface) 0%,\n rgba(var(--color-white--rgb), 0) 100%\n );\n}\n\n.Rh--6fVpkm4- {\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n\n.NFaWWvmxtkw- {\n width: 100%;\n min-width: calc(16px * 3);\n min-width: var(--space-largest);\n}\n";
171
+ var styles$c = {"wrapper":"_8cMzUF8XEwY-","loadingItem":"Rh--6fVpkm4-","glimmer":"NFaWWvmxtkw-"};
172
+ styleInject_es.styleInject(css_248z$c);
173
+
174
+ const LOADING_STATE_LIMIT_ITEMS = 10;
175
+ const DATALIST_LOADINGSTATE_ROW_TEST_ID = "ATL-DataList-LoadingState-Row";
176
+ function DataListLoadingState() {
177
+ const { headers } = useDataListContext();
178
+ const { layout, activeBreakpoint } = useActiveLayout();
179
+ if (!layout)
180
+ return null;
181
+ const glimmerSize = activeBreakpoint === "xs" ? "small" : "base";
182
+ const glimmersFromHeader = Object.keys(headers).reduce((data, key) => (Object.assign(Object.assign({}, data), { [key]: (React__default["default"].createElement("div", { className: styles$c.glimmer },
183
+ React__default["default"].createElement(Glimmer.Glimmer, { size: glimmerSize }))) })), {});
184
+ const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(glimmersFromHeader);
185
+ return (React__default["default"].createElement("div", { className: styles$c.wrapper }, loadingData.map((child, i) => (React__default["default"].createElement("div", { key: i, className: styles$c.loadingItem, "data-testid": DATALIST_LOADINGSTATE_ROW_TEST_ID }, layout(child))))));
186
+ }
187
+
188
+ const defaultValues = {
189
+ isInLayoutProvider: false,
190
+ hasInLayoutActions: false,
191
+ setHasInLayoutActions: noop__default["default"],
167
192
  };
168
- function DataListActionsMenu({ visible = false, position, onRequestClose, children, }) {
169
- const [ref, setRef] = React.useState();
170
- useRefocusOnActivator.useRefocusOnActivator(visible);
171
- const focusTrapRef = useFocusTrap.useFocusTrap(visible);
172
- useOnKeyDown.useOnKeyDown(onRequestClose, "Escape");
173
- return ReactDOM.createPortal(React__default["default"].createElement(framerMotion.AnimatePresence, null, visible && (React__default["default"].createElement("div", { ref: focusTrapRef },
174
- React__default["default"].createElement(framerMotion.motion.div, { role: "menu", ref: setRef, variants: variants$1, initial: "hidden", animate: "visible", exit: "hidden", transition: { duration: TRANSITION_DELAY_IN_SECONDS }, className: styles$9.menu, style: getPositionCssVars(), onClick: onRequestClose }, children),
175
- React__default["default"].createElement("button", { className: styles$9.overlay, onClick: onRequestClose, "aria-label": "Close menu" })))), document.body);
176
- function getPositionCssVars() {
177
- const { posX, posY } = getPosition();
178
- return {
179
- "--actions-menu-x": `${posX}px`,
180
- "--actions-menu-y": `${posY}px`,
181
- };
182
- }
183
- function getPosition() {
184
- const rect = ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect();
185
- const { width = 0, height = 0 } = rect || {};
186
- const { x = 0, y = 0 } = position;
187
- const xIsOffScreen = x + width > window.innerWidth;
188
- const yIsOffScreen = y + height > window.innerHeight;
189
- const xOffSet = x + width - window.innerWidth + foundation.tokens["space-base"];
190
- const yOffSet = y + height - window.innerHeight;
191
- const newPosX = Math.floor(xIsOffScreen ? x - xOffSet : x);
192
- const newPosY = Math.floor(yIsOffScreen ? y - yOffSet : y);
193
- return { posX: newPosX, posY: newPosY };
194
- }
193
+ const DataListLayoutContext = React.createContext(defaultValues);
194
+ function useDataListLayoutContext() {
195
+ return React.useContext(DataListLayoutContext);
195
196
  }
196
197
 
197
- function DataListItemActionsOverflow({ item, actions, }) {
198
- const [menuPosition, setMenuPosition] = React.useState({ x: 0, y: 0 });
199
- const [showMenu, setShowMenu] = React.useState(false);
200
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
201
- React__default["default"].createElement(Tooltip.Tooltip, { message: "More actions" },
202
- React__default["default"].createElement(Button.Button, { icon: "more", ariaLabel: "More actions", type: "secondary", variation: "subtle", onClick: handleMoreClick })),
203
- actions && (React__default["default"].createElement(DataListActionsMenu, { visible: showMenu, position: menuPosition, onRequestClose: handleClose }, React.Children.map(actions, action => (React__default["default"].createElement(InternalDataListAction, Object.assign({}, action.props, { item: item }))))))));
204
- function handleMoreClick(event) {
205
- setShowMenu(true);
206
- const rect = event.currentTarget.getBoundingClientRect();
207
- const posX = rect.x;
208
- const posY = rect.y + rect.height;
209
- setMenuPosition({ x: posX, y: posY });
210
- }
211
- function handleClose() {
212
- setShowMenu(false);
213
- }
198
+ var css_248z$b = ".jHcHGQ-HDbk- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: calc((16px / 2) * -1);\n top: calc(calc(16px / 2) * -1);\n top: calc(var(--space-small) * -1);\n right: 0;\n z-index: 6;\n z-index: var(--elevation-menu);\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 padding: calc(16px / 4);\n padding: var(--space-smaller);\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 background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n";
199
+ var styles$b = {"menu":"jHcHGQ-HDbk-"};
200
+ styleInject_es.styleInject(css_248z$b);
201
+
202
+ const CONTAINER_TEST_ID = "ATL-DataListFilters-Container";
203
+
204
+ var css_248z$a = ".jbBRoxlZlNI- {\n -ms-flex-item-align: center;\n align-self: center;\n position: relative;\n min-width: 0;\n}\n\n.MnN8qbS4hw4- {\n display: grid;\n overflow-x: auto;\n grid-auto-flow: column;\n grid-auto-columns: -webkit-max-content;\n grid-auto-columns: max-content;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.MnN8qbS4hw4- > :nth-child(n + 3):not(:last-child) {\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n\n.b-5P7Z8eGO8- {\n visibility: hidden;\n}\n\n.xzaCS4slLpI-::before,\n.Jf227kC8Nu0-::after {\n content: \"\";\n position: absolute;\n top: 0;\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: 100%;\n background-image: linear-gradient(\n to right,\n rgba(255, 255, 255, 1) 0%,\n rgba(255, 255, 255, 0) 100%\n );\n background-image: linear-gradient(\n var(--data-list-overflow-shadow-angle, to right),\n var(--color-surface) 0%,\n rgba(var(--color-white--rgb), 0) 100%\n );\n pointer-events: none;\n}\n\n.xzaCS4slLpI-::before {\n left: 0;\n}\n\n.Jf227kC8Nu0-::after {\n --data-list-overflow-shadow-angle: to left;\n right: 0;\n}\n";
205
+ var styles$a = {"fadeContainer":"jbBRoxlZlNI-","overflowGrid":"MnN8qbS4hw4-","overflowTrigger":"b-5P7Z8eGO8-","overflowLeft":"xzaCS4slLpI-","overflowRight":"Jf227kC8Nu0-"};
206
+ styleInject_es.styleInject(css_248z$a);
207
+
208
+ function DataListOverflowFade({ children }) {
209
+ const [leftRef, isLeftVisible] = useInView.useInView();
210
+ const [rightRef, isRightVisible] = useInView.useInView();
211
+ return (React__default["default"].createElement("div", { "data-testid": CONTAINER_TEST_ID, className: classnames__default["default"](styles$a.fadeContainer, {
212
+ [styles$a.overflowLeft]: !isLeftVisible,
213
+ [styles$a.overflowRight]: !isRightVisible,
214
+ }) },
215
+ React__default["default"].createElement("div", { className: styles$a.overflowGrid },
216
+ React__default["default"].createElement("span", { ref: leftRef, className: styles$a.overflowTrigger }),
217
+ children,
218
+ React__default["default"].createElement("span", { ref: rightRef, className: styles$a.overflowTrigger }))));
214
219
  }
215
220
 
216
- var css_248z$8 = ".WRV-UmQmPzo- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n overflow: hidden;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.liQeWCMenD0- {\n --overflow-bg: var(--data-list-item-active-color, var(--color-surface));\n\n display: -ms-flexbox;\n\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n padding-left: calc(16px * 1);\n padding-left: var(--space-base);\n background-image: linear-gradient(\n 90deg,\n transparent 0,\n rgba(255, 255, 255, 1) calc(16px * 1),\n rgba(255, 255, 255, 1) 100%\n );\n background-image: linear-gradient(\n 90deg,\n transparent 0,\n var(--overflow-bg) var(--space-base),\n var(--overflow-bg) 100%\n );\n -ms-flex-align: center;\n align-items: center;\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n";
217
- var styles$8 = {"tags":"WRV-UmQmPzo-","tagCount":"liQeWCMenD0-"};
218
- styleInject_es.styleInject(css_248z$8);
221
+ var css_248z$9 = ".WRV-UmQmPzo- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n overflow: hidden;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.liQeWCMenD0- {\n --overflow-bg: var(--data-list-item-active-color, var(--color-surface));\n\n display: -ms-flexbox;\n\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n padding-left: calc(16px * 1);\n padding-left: var(--space-base);\n background-image: linear-gradient(\n 90deg,\n transparent 0,\n rgba(255, 255, 255, 1) calc(16px * 1),\n rgba(255, 255, 255, 1) 100%\n );\n background-image: linear-gradient(\n 90deg,\n transparent 0,\n var(--overflow-bg) var(--space-base),\n var(--overflow-bg) 100%\n );\n -ms-flex-align: center;\n align-items: center;\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n";
222
+ var styles$9 = {"tags":"WRV-UmQmPzo-","tagCount":"liQeWCMenD0-"};
223
+ styleInject_es.styleInject(css_248z$9);
219
224
 
220
225
  function DataListTags({ items }) {
221
226
  const ref = React.useRef(null);
@@ -235,10 +240,10 @@ function DataListTags({ items }) {
235
240
  elements === null || elements === void 0 ? void 0 : elements.forEach(element => observer.unobserve(element));
236
241
  };
237
242
  }, [items]);
238
- return (React__default["default"].createElement("div", { className: styles$8.tags, ref: ref },
243
+ return (React__default["default"].createElement("div", { className: styles$9.tags, ref: ref },
239
244
  items.filter(Boolean).map((tag, index) => (React__default["default"].createElement("div", { key: tag, "data-tag-element": index },
240
245
  React__default["default"].createElement(InlineLabel.InlineLabel, null, tag)))),
241
- Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$8.tagCount },
246
+ Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$9.tagCount },
242
247
  React__default["default"].createElement(Text.Text, null,
243
248
  "+",
244
249
  visibleItems)))));
@@ -267,22 +272,22 @@ function buildIntersectionThreshold(items) {
267
272
  return thresholds;
268
273
  }
269
274
 
270
- var css_248z$7 = ".fLmJZJJqMcE- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0;\n border: none;\n background-color: transparent;\n}\n\n.UG8cHUT3Hds- {\n cursor: pointer;\n}\n";
271
- var styles$7 = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
272
- styleInject_es.styleInject(css_248z$7);
275
+ var css_248z$8 = ".fLmJZJJqMcE- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0;\n border: none;\n background-color: transparent;\n}\n\n.UG8cHUT3Hds- {\n cursor: pointer;\n}\n";
276
+ var styles$8 = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
277
+ styleInject_es.styleInject(css_248z$8);
273
278
 
274
- var css_248z$6 = ".AN5egORYy-0- {\n padding-right: calc(16px / 2);\n padding-right: var(--space-small);\n}\n\n.AN5egORYy-0- path {\n fill: rgba(101, 120, 132, 1);\n fill: var(--color-greyBlue);\n transition: all 200ms ease;\n transition: all var(--timing-base) ease;\n}\n\n.AN5egORYy-0- path.F1uTDCK0Sb0- {\n fill: rgb(1, 41, 57);\n fill: var(--color-blue);\n}\n\n.AN5egORYy-0- path._6KYeQXWXLQ8- {\n fill: rgb(193, 201, 206);\n fill: var(--color-greyBlue--lighter);\n}\n";
275
- var styles$6 = {"sortIcon":"AN5egORYy-0-","active":"F1uTDCK0Sb0-","inactive":"_6KYeQXWXLQ8-"};
276
- styleInject_es.styleInject(css_248z$6);
279
+ var css_248z$7 = ".AN5egORYy-0- {\n padding-right: calc(16px / 2);\n padding-right: var(--space-small);\n}\n\n.AN5egORYy-0- path {\n fill: rgba(101, 120, 132, 1);\n fill: var(--color-greyBlue);\n transition: all 200ms ease;\n transition: all var(--timing-base) ease;\n}\n\n.AN5egORYy-0- path.F1uTDCK0Sb0- {\n fill: rgb(1, 41, 57);\n fill: var(--color-blue);\n}\n\n.AN5egORYy-0- path._6KYeQXWXLQ8- {\n fill: rgb(193, 201, 206);\n fill: var(--color-greyBlue--lighter);\n}\n";
280
+ var styles$7 = {"sortIcon":"AN5egORYy-0-","active":"F1uTDCK0Sb0-","inactive":"_6KYeQXWXLQ8-"};
281
+ styleInject_es.styleInject(css_248z$7);
277
282
 
278
283
  const SORTING_ICON_TEST_ID = "ATL-DataList-Sorting-Icon";
279
284
  function DataListSortingArrows({ order }) {
280
- return (React__default["default"].createElement("div", { className: styles$6.sortIcon, "data-testid": SORTING_ICON_TEST_ID },
285
+ return (React__default["default"].createElement("div", { className: styles$7.sortIcon, "data-testid": SORTING_ICON_TEST_ID },
281
286
  React__default["default"].createElement("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
282
287
  React__default["default"].createElement("path", { className: getActiveClassName("asc"), d: "M16.2929 10.6661C15.9024 11.0566 15.2692 11.0566 14.8787 10.6661L12.2891 8.14263L9.70711 10.6661C9.31658 11.0566 8.68342 11.0566 8.29289 10.6661C7.90237 10.2756 7.90237 9.64239 8.29289 9.25186L11.5858 5.95897C11.9763 5.56845 12.6095 5.56845 13 5.95897L16.2929 9.25186C16.6834 9.64239 16.6834 10.2756 16.2929 10.6661Z" }),
283
288
  React__default["default"].createElement("path", { className: getActiveClassName("desc"), d: "M8.29292 13.3339C8.68345 12.9434 9.31661 12.9434 9.70714 13.3339L12.2968 15.8573L14.8787 13.3339C15.2692 12.9434 15.9024 12.9434 16.2929 13.3339C16.6834 13.7244 16.6834 14.3576 16.2929 14.7481L13 18.041C12.6095 18.4315 11.9763 18.4315 11.5858 18.041L8.29292 14.7481C7.9024 14.3576 7.9024 13.7244 8.29292 13.3339Z" }))));
284
289
  function getActiveClassName(targetOrder) {
285
- return order === targetOrder ? styles$6.active : styles$6.inactive;
290
+ return order === targetOrder ? styles$7.active : styles$7.inactive;
286
291
  }
287
292
  }
288
293
 
@@ -291,8 +296,8 @@ function DataListHeaderTile({ headers, headerKey, }) {
291
296
  const isSortable = sorting === null || sorting === void 0 ? void 0 : sorting.sortable.includes(headerKey);
292
297
  const sortingState = sorting === null || sorting === void 0 ? void 0 : sorting.state;
293
298
  const Tag = isSortable ? "button" : "div";
294
- return (React__default["default"].createElement(Tag, { className: classnames__default["default"](styles$7.headerLabel, {
295
- [styles$7.sortable]: isSortable,
299
+ return (React__default["default"].createElement(Tag, { className: classnames__default["default"](styles$8.headerLabel, {
300
+ [styles$8.sortable]: isSortable,
296
301
  }), onClick: handleOnClick },
297
302
  React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
298
303
  (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey && (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.order }))));
@@ -365,7 +370,7 @@ function generateHeaderElements(headers) {
365
370
  const headerElements = Object.keys(headers).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: React__default["default"].createElement(DataListHeaderTile, { headers: headers, headerKey: key }) })), {});
366
371
  return isEmpty__default["default"](headerElements) ? undefined : headerElements;
367
372
  }
368
- function sortSizeProp(sizeProp) {
373
+ function sortBreakpoints(sizeProp) {
369
374
  return sizeProp.sort((a, b) => BREAKPOINTS.indexOf(a) - BREAKPOINTS.indexOf(b));
370
375
  }
371
376
  function getExposedActions(childrenArray, childCount = 2) {
@@ -383,6 +388,100 @@ function getExposedActions(childrenArray, childCount = 2) {
383
388
  }, []);
384
389
  }
385
390
 
391
+ const DataListLayoutActionsContext = React.createContext({ activeItem: undefined });
392
+ function useDataListLayoutActionsContext() {
393
+ return React.useContext(DataListLayoutActionsContext);
394
+ }
395
+
396
+ var css_248z$6 = ".aokwZU8jbWU- {\n position: fixed;\n top: 0;\n top: var(--actions-menu-y, 0);\n left: 0;\n left: var(--actions-menu-x, 0);\n z-index: 6;\n z-index: var(--elevation-menu);\n min-width: 150px;\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 padding: calc(16px / 4);\n padding: var(--space-smaller);\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 background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.XtVRP97TVSE- {\n position: fixed;\n top: 0;\n left: 0;\n z-index: calc(6 - 1);\n z-index: calc(var(--elevation-menu) - 1);\n width: 100%;\n height: 100%;\n padding: 0;\n border: none;\n background-color: transparent;\n}\n";
397
+ var styles$6 = {"menu":"aokwZU8jbWU-","overlay":"XtVRP97TVSE-"};
398
+ styleInject_es.styleInject(css_248z$6);
399
+
400
+ const variants$1 = {
401
+ hidden: { opacity: 0, y: -10 },
402
+ visible: { opacity: 1, y: 0 },
403
+ };
404
+ function DataListActionsMenu({ visible = false, position, onRequestClose, children, }) {
405
+ const [ref, setRef] = React.useState();
406
+ useRefocusOnActivator.useRefocusOnActivator(visible);
407
+ const focusTrapRef = useFocusTrap.useFocusTrap(visible);
408
+ useOnKeyDown.useOnKeyDown(onRequestClose, "Escape");
409
+ return ReactDOM.createPortal(React__default["default"].createElement(framerMotion.AnimatePresence, null, visible && (React__default["default"].createElement("div", { ref: focusTrapRef, onClick: handleClick },
410
+ React__default["default"].createElement(framerMotion.motion.div, { role: "menu", ref: setRef, variants: variants$1, initial: "hidden", animate: "visible", exit: "hidden", transition: { duration: TRANSITION_DELAY_IN_SECONDS }, className: styles$6.menu, style: getPositionCssVars(), onClick: onRequestClose }, children),
411
+ React__default["default"].createElement("button", { className: styles$6.overlay, onClick: onRequestClose, "aria-label": "Close menu" })))), document.body);
412
+ function handleClick(event) {
413
+ // Prevent menu from firing the parent's onClick event when it is nested
414
+ // within a clickable list item
415
+ event.stopPropagation();
416
+ }
417
+ function getPositionCssVars() {
418
+ const { posX, posY } = getPosition();
419
+ return {
420
+ "--actions-menu-x": `${posX}px`,
421
+ "--actions-menu-y": `${posY}px`,
422
+ };
423
+ }
424
+ function getPosition() {
425
+ const rect = ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect();
426
+ const { width = 0, height = 0 } = rect || {};
427
+ const { x, y } = position;
428
+ const xIsOffScreen = x + width > window.innerWidth;
429
+ const yIsOffScreen = y + height > window.innerHeight;
430
+ const xOffSet = x + width - window.innerWidth + design.tokens["space-base"];
431
+ const yOffSet = y + height - window.innerHeight;
432
+ const newPosX = Math.floor(xIsOffScreen ? x - xOffSet : x);
433
+ const newPosY = Math.floor(yIsOffScreen ? y - yOffSet : y);
434
+ return { posX: newPosX, posY: newPosY };
435
+ }
436
+ }
437
+
438
+ function DataListItemActionsOverflow({ actions, }) {
439
+ const [menuPosition, setMenuPosition] = React.useState({ x: 0, y: 0 });
440
+ const [showMenu, setShowMenu] = React.useState(false);
441
+ if (actions.length === 0)
442
+ return null;
443
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
444
+ React__default["default"].createElement(Tooltip.Tooltip, { message: "More actions" },
445
+ React__default["default"].createElement(Button.Button, { icon: "more", ariaLabel: "More actions", type: "secondary", variation: "subtle", onClick: handleMoreClick })),
446
+ React__default["default"].createElement(DataListActionsMenu, { visible: showMenu, position: menuPosition, onRequestClose: handleClose }, actions)));
447
+ function handleMoreClick(event) {
448
+ // Prevent firing the parent's onClick event when it is nested
449
+ // within a clickable list item
450
+ event.stopPropagation();
451
+ setShowMenu(true);
452
+ const rect = event.currentTarget.getBoundingClientRect();
453
+ const posX = rect.x;
454
+ const posY = rect.y + rect.height;
455
+ setMenuPosition({ x: posX, y: posY });
456
+ }
457
+ function handleClose() {
458
+ setShowMenu(false);
459
+ }
460
+ }
461
+
462
+ function DataListActions({ children, itemsToExpose = 2, }) {
463
+ const { activeItem } = useDataListLayoutActionsContext();
464
+ const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
465
+ const exposedActions = getExposedActions(childrenArray, itemsToExpose);
466
+ childrenArray.splice(0, exposedActions.length);
467
+ return (React__default["default"].createElement(DataListOverflowFade, null,
468
+ exposedActions.map(({ props }) => {
469
+ if (!props.icon)
470
+ return null;
471
+ return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
472
+ React__default["default"].createElement(Button.Button, { icon: props.icon, ariaLabel: props.label, onClick: () => {
473
+ var _a, _b;
474
+ if (activeItem) {
475
+ (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, activeItem);
476
+ }
477
+ else {
478
+ (_b = props.onClick) === null || _b === void 0 ? void 0 : _b.call(props);
479
+ }
480
+ }, type: "secondary", variation: "subtle" })));
481
+ }),
482
+ React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray })));
483
+ }
484
+
386
485
  // This component is meant to capture the props of the DataList.ItemActions
387
486
  function DataListItemActions(
388
487
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -393,40 +492,28 @@ const variants = {
393
492
  hidden: { opacity: 0, y: 10 },
394
493
  visible: { opacity: 1, y: 0 },
395
494
  };
396
- function InternalDataListItemActions({ item, }) {
495
+ function InternalDataListItemActions() {
397
496
  const { itemActionComponent } = useDataListContext();
398
497
  if (!itemActionComponent)
399
498
  return null;
400
499
  const { children } = itemActionComponent.props;
401
- const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
402
- const exposedActions = getExposedActions(childrenArray);
403
- childrenArray.splice(0, exposedActions.length);
500
+ if (!children)
501
+ return null;
404
502
  return (React__default["default"].createElement(framerMotion.motion.div, { variants: variants, initial: "hidden", animate: "visible", exit: "hidden", transition: {
405
503
  duration: TRANSITION_DURATION_IN_SECONDS,
406
504
  delay: TRANSITION_DELAY_IN_SECONDS,
407
505
  }, className: styles$b.menu, onContextMenu: handleContextMenu },
408
- exposedActions.map(({ props }) => {
409
- if (!props.icon)
410
- return null;
411
- return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
412
- React__default["default"].createElement(Button.Button, { icon: props.icon, ariaLabel: props.label, onClick: () => { var _a; return (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, item); }, type: "secondary", variation: "subtle" })));
413
- }),
414
- React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray, item: item })));
506
+ React__default["default"].createElement(DataListActions, null, children)));
415
507
  }
416
508
  function handleContextMenu(event) {
417
509
  event.stopPropagation();
418
510
  }
419
511
 
420
- const DataListLayoutActionsContext = React.createContext({ activeItem: undefined });
421
- function useDataListLayoutActionsContext() {
422
- return React.useContext(DataListLayoutActionsContext);
423
- }
424
-
425
512
  function DataListItemInternal({ children, item, }) {
426
513
  const { selected, onSelect } = useDataListContext();
427
514
  if (selected !== undefined && onSelect) {
428
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles__default["default"].selectable, {
429
- [styles__default["default"].selected]: selected === null || selected === void 0 ? void 0 : selected.length,
515
+ return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$e.selectable, {
516
+ [styles$e.selected]: selected === null || selected === void 0 ? void 0 : selected.length,
430
517
  }) },
431
518
  children,
432
519
  React__default["default"].createElement(Checkbox.Checkbox, { checked: selected === null || selected === void 0 ? void 0 : selected.includes(item.id), onChange: handleChange })));
@@ -448,14 +535,22 @@ function DataListItemClickableInternal({ onClick, url, to, children, }) {
448
535
  return React__default["default"].createElement(React__default["default"].Fragment, null, children);
449
536
  if (to) {
450
537
  const computedTo = typeof to === "string" ? to : to(activeItem);
451
- return (React__default["default"].createElement(reactRouterDom.Link, { className: styles__default["default"].listItemClickable, to: computedTo, onClick: handleClick }, children));
538
+ return (React__default["default"].createElement(reactRouterDom.Link, { className: styles$e.listItemClickable, to: computedTo, onClick: handleClick }, children));
452
539
  }
453
540
  if (url) {
454
541
  const href = typeof url === "string" ? url : url(activeItem);
455
- return (React__default["default"].createElement("a", { className: styles__default["default"].listItemClickable, href: href, onClick: handleClick }, children));
542
+ return (React__default["default"].createElement("a", { className: styles$e.listItemClickable, href: href, onClick: handleClick }, children));
456
543
  }
457
544
  if (onClick) {
458
- return (React__default["default"].createElement("button", { className: styles__default["default"].listItemClickable, onClick: handleClick }, children));
545
+ return (
546
+ // A button can be nested within the list item. To prevent a button inside
547
+ // button error, we need to manually declare a div to be a button
548
+ React__default["default"].createElement("div", { role: "button", tabIndex: 0, className: styles$e.listItemClickable, onClick: handleClick, onKeyDown: e => {
549
+ if (e.key === "Enter" || e.key === " ") {
550
+ e.preventDefault();
551
+ handleClick();
552
+ }
553
+ } }, children));
459
554
  }
460
555
  return React__default["default"].createElement(React__default["default"].Fragment, null, children);
461
556
  function handleClick() {
@@ -482,15 +577,14 @@ function DataListItem({ item, layout, }) {
482
577
  const isContextMenuVisible = Boolean(contextPosition);
483
578
  const shouldShowContextMenu = showMenu && isContextMenuVisible && Boolean(contextMenuActions);
484
579
  return (React__default["default"].createElement(DataListLayoutActionsContext.Provider, { value: { activeItem: item } },
485
- React__default["default"].createElement("div", { onMouseEnter: handleShowMenu, onMouseLeave: handleHideMenu, onFocus: handleShowMenu, onBlur: handleHideMenu, onContextMenu: handleContextMenu, className: classnames__default["default"](styles__default["default"].listItem, {
486
- [styles__default["default"].active]: showMenu && isContextMenuVisible,
580
+ React__default["default"].createElement("div", { onMouseEnter: handleShowMenu, onMouseLeave: handleHideMenu, onFocus: handleShowMenu, onBlur: handleHideMenu, onContextMenu: handleContextMenu, className: classnames__default["default"](styles$e.listItem, {
581
+ [styles$e.active]: showMenu && isContextMenuVisible,
487
582
  }), key: item.id },
488
583
  React__default["default"].createElement(DataListItemInternal, { item: item },
489
- React__default["default"].createElement(DataListItemClickable, null, layout.props.children(generatedItem))),
584
+ React__default["default"].createElement(DataListItemClickable, null, layout(generatedItem))),
490
585
  React__default["default"].createElement(framerMotion.AnimatePresence, null,
491
- showMenu && !hasInLayoutActions && (React__default["default"].createElement(InternalDataListItemActions, { item: item })),
492
- React__default["default"].createElement(DataListActionsMenu, { key: item.id, visible: shouldShowContextMenu, position: contextPosition || { x: 0, y: 0 }, onRequestClose: () => setContextPosition(undefined) }, contextMenuActions &&
493
- React.Children.map(contextMenuActions, action => (React__default["default"].createElement(InternalDataListAction, Object.assign({ key: item.id }, action.props, { item: item })))))))));
586
+ showMenu && !hasInLayoutActions && React__default["default"].createElement(InternalDataListItemActions, null),
587
+ React__default["default"].createElement(DataListActionsMenu, { key: item.id, visible: shouldShowContextMenu, position: contextPosition || { x: 0, y: 0 }, onRequestClose: () => setContextPosition(undefined) }, contextMenuActions)))));
494
588
  function handleShowMenu() {
495
589
  setShowMenu(true);
496
590
  }
@@ -508,65 +602,35 @@ function DataListItem({ item, layout, }) {
508
602
  }
509
603
  }
510
604
 
511
- function DataListLayoutInternal({ layouts, renderLayout, mediaMatches, }) {
512
- const sizePropsOfLayouts = layouts === null || layouts === void 0 ? void 0 : layouts.map(layout => layout.props.size || "xs");
513
- const layoutToRender = layouts === null || layouts === void 0 ? void 0 : layouts.find(layout => {
514
- const layoutSize = layout.props.size || "xs";
515
- const isVisible = isLayoutVisible({
516
- layoutSize,
517
- mediaMatches,
518
- sizePropsOfLayouts,
519
- });
520
- return isVisible;
521
- });
522
- return (layoutToRender && renderLayout(layoutToRender)) || React__default["default"].createElement(React__default["default"].Fragment, null);
523
- }
524
- /**
525
- * Determine is layout is visible by checking a media query matches for the
526
- * visible sizes of the layout and there isn't a larger layout that should be rendered
527
- */
528
- function isLayoutVisible({ layoutSize, mediaMatches, sizePropsOfLayouts, }) {
529
- const largerBreakpointsToHide = sizePropsOfLayouts === null || sizePropsOfLayouts === void 0 ? void 0 : sizePropsOfLayouts.filter(size => BREAKPOINTS.indexOf(size) > BREAKPOINTS.indexOf(layoutSize));
530
- const sortedLargerBreakpoints = sortSizeProp(largerBreakpointsToHide || []);
531
- const visibleBreakpoints = BREAKPOINTS.slice(BREAKPOINTS.indexOf(layoutSize), sortedLargerBreakpoints[0]
532
- ? BREAKPOINTS.indexOf(sortedLargerBreakpoints[0])
533
- : undefined);
534
- const isVisibleBreakpoint = visibleBreakpoints.some(breakpoint => {
535
- return Boolean(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
536
- });
537
- const largerLayoutIsNotVisible = largerBreakpointsToHide === null || largerBreakpointsToHide === void 0 ? void 0 : largerBreakpointsToHide.reduce((acc, breakpoint) => {
538
- return acc && !(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
539
- }, true);
540
- return isVisibleBreakpoint && largerLayoutIsNotVisible;
541
- }
542
-
543
- function DataListItems({ layouts, mediaMatches, data, }) {
605
+ function DataListItems({ size = "xs", }) {
606
+ const { data, layouts } = useDataListContext();
544
607
  const [hasInLayoutActions, setHasInLayoutActions] = React.useState(false);
608
+ const layout = layouts[size];
609
+ if (!layout)
610
+ return null;
545
611
  return (React__default["default"].createElement(DataListLayoutContext.Provider, { value: {
546
612
  isInLayoutProvider: true,
547
613
  hasInLayoutActions,
548
614
  setHasInLayoutActions,
549
- } },
550
- React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement(React__default["default"].Fragment, null, data.map((child, i) => (React__default["default"].createElement(DataListItem, { key: data[i].id, index: i, item: child, layout: layout }))))) })));
615
+ } }, data.map((child, i) => (React__default["default"].createElement(DataListItem, { key: data[i].id, index: i, item: child, layout: layout })))));
551
616
  }
552
617
 
553
- const CONTAINER_TEST_ID = "ATL-DataListFilters-Container";
554
-
555
- var css_248z$5 = ".jbBRoxlZlNI- {\n -ms-flex-item-align: center;\n align-self: center;\n position: relative;\n min-width: 0;\n}\n\n.MnN8qbS4hw4- {\n display: grid;\n overflow-x: auto;\n grid-auto-flow: column;\n grid-auto-columns: -webkit-max-content;\n grid-auto-columns: max-content;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.MnN8qbS4hw4- > :nth-child(n + 3):not(:last-child) {\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n\n.b-5P7Z8eGO8- {\n visibility: hidden;\n}\n\n.xzaCS4slLpI-::before,\n.Jf227kC8Nu0-::after {\n content: \"\";\n position: absolute;\n top: 0;\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: 100%;\n background-image: linear-gradient(\n to right,\n rgba(255, 255, 255, 1) 0%,\n rgba(255, 255, 255, 0) 100%\n );\n background-image: linear-gradient(\n var(--data-list-overflow-shadow-angle, to right),\n var(--color-surface) 0%,\n rgba(var(--color-white--rgb), 0) 100%\n );\n pointer-events: none;\n}\n\n.xzaCS4slLpI-::before {\n left: 0;\n}\n\n.Jf227kC8Nu0-::after {\n --data-list-overflow-shadow-angle: to left;\n right: 0;\n}\n";
556
- var styles$5 = {"fadeContainer":"jbBRoxlZlNI-","overflowGrid":"MnN8qbS4hw4-","overflowTrigger":"b-5P7Z8eGO8-","overflowLeft":"xzaCS4slLpI-","overflowRight":"Jf227kC8Nu0-"};
557
- styleInject_es.styleInject(css_248z$5);
558
-
559
- function DataListOverflowFade({ children }) {
560
- const [leftRef, isLeftVisible] = useInView.useInView();
561
- const [rightRef, isRightVisible] = useInView.useInView();
562
- return (React__default["default"].createElement("div", { "data-testid": CONTAINER_TEST_ID, className: classnames__default["default"](styles$5.fadeContainer, {
563
- [styles$5.overflowLeft]: !isLeftVisible,
564
- [styles$5.overflowRight]: !isRightVisible,
565
- }) },
566
- React__default["default"].createElement("div", { className: styles$5.overflowGrid },
567
- React__default["default"].createElement("span", { ref: leftRef, className: styles$5.overflowTrigger }),
568
- children,
569
- React__default["default"].createElement("span", { ref: rightRef, className: styles$5.overflowTrigger }))));
618
+ function DataListLayout({ children, size = "xs", }) {
619
+ const { layoutBreakpoints, registerLayout, registerLayoutBreakpoints, loadingState, } = useDataListContext();
620
+ const breakpoints = useResponsiveSizing();
621
+ React.useEffect(() => {
622
+ registerLayoutBreakpoints(size);
623
+ }, [size]);
624
+ React.useEffect(() => {
625
+ registerLayout(size, children);
626
+ }, [size, children]);
627
+ const sizeIndex = layoutBreakpoints.indexOf(size);
628
+ const nextAvailableSize = layoutBreakpoints[sizeIndex + 1];
629
+ const shouldRenderList = breakpoints[size] && !breakpoints[nextAvailableSize];
630
+ if (loadingState !== "initial" && shouldRenderList) {
631
+ return React__default["default"].createElement(DataListItems, { size: size });
632
+ }
633
+ return null;
570
634
  }
571
635
 
572
636
  // This component is meant to capture the props of the DataList.BulkActions
@@ -580,40 +644,10 @@ function InternalDataListBulkActions() {
580
644
  if (!bulkActionsComponent)
581
645
  return null;
582
646
  const { children } = bulkActionsComponent.props;
583
- const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
584
- const exposedActions = getExposedActions(childrenArray, 3);
585
- childrenArray.splice(0, exposedActions.length);
586
- return (React__default["default"].createElement(DataListOverflowFade, null,
587
- exposedActions.map(({ props }) => {
588
- if (!props.icon)
589
- return null;
590
- return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
591
- React__default["default"].createElement(Button.Button, { icon: props.icon, ariaLabel: props.label, onClick: () => { var _a; return (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props); }, type: "secondary", variation: "subtle" })));
592
- }),
593
- React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray })));
594
- }
595
-
596
- function useMediaQuery(CSSMediaQuery) {
597
- const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
598
- React.useEffect(() => {
599
- const media = window.matchMedia(CSSMediaQuery);
600
- if (media.matches !== matches) {
601
- setMatches(media.matches);
602
- }
603
- const listener = () => setMatches(media.matches);
604
- media.addEventListener("change", listener);
605
- return () => media.removeEventListener("change", listener);
606
- }, [CSSMediaQuery]);
607
- return matches;
608
- }
609
-
610
- function useResponsiveSizing() {
611
- const xs = useMediaQuery(`(width > ${BREAKPOINT_SIZES.xs}px)`);
612
- const sm = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.sm}px)`);
613
- const md = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.md}px)`);
614
- const lg = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.lg}px)`);
615
- const xl = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.xl}px)`);
616
- return { xs, sm, md, lg, xl };
647
+ const { sm } = useResponsiveSizing();
648
+ // Collapse all actions under "More actions" when breakpoint is smaller than sm
649
+ const itemsToExpose = sm ? 3 : 0;
650
+ return (React__default["default"].createElement(DataListActions, { itemsToExpose: itemsToExpose }, children));
617
651
  }
618
652
 
619
653
  function DataListHeaderCheckbox({ children }) {
@@ -630,12 +664,12 @@ function DataListHeaderCheckbox({ children }) {
630
664
  }) },
631
665
  React__default["default"].createElement(Checkbox.Checkbox, { checked: isAllSelected(), indeterminate: selected.length > 0 && !isAllSelected(), onChange: onSelectAll },
632
666
  React__default["default"].createElement("div", { className: styles$e.srOnly }, selectedLabel))),
633
- React__default["default"].createElement(AnimatedSwitcher.AnimatedSwitcher, { switched: Boolean(selected.length), initialChild: children, switchTo: React__default["default"].createElement("div", { className: styles$e.headerBatchSelect },
634
- React__default["default"].createElement(Text.Text, null,
635
- React__default["default"].createElement("b", null,
667
+ React__default["default"].createElement(AnimatedSwitcher.AnimatedSwitcher, { switched: Boolean(selected.length), initialChild: children, switchTo: React__default["default"].createElement("div", { className: styles$e.batchSelectContainer },
668
+ React__default["default"].createElement("div", { className: styles$e.headerBatchSelect },
669
+ React__default["default"].createElement(Text.Text, null,
636
670
  selected.length,
637
- " selected")),
638
- React__default["default"].createElement(Button.Button, { label: deselectText, onClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect([]), type: "tertiary" }),
671
+ " selected"),
672
+ React__default["default"].createElement(Button.Button, { label: deselectText, onClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect([]), type: "tertiary" })),
639
673
  React__default["default"].createElement(InternalDataListBulkActions, null)) })));
640
674
  function isAllSelected() {
641
675
  // If there's a totalCount, we can use that to accurately determine if the
@@ -651,57 +685,26 @@ function DataListHeaderCheckbox({ children }) {
651
685
  }
652
686
  }
653
687
 
654
- function useShowHeader() {
655
- const { headerVisibility } = useDataListContext();
656
- if (headerVisibility === undefined)
657
- return true;
658
- const sizes = useResponsiveSizing();
659
- const sizeKeys = Object.keys(sizes);
660
- const showHeader = sizeKeys.reduce((previous, breakpoint) => {
661
- const isHeaderVisible = headerVisibility[breakpoint] || false;
662
- const isBreakpointTriggered = sizes[breakpoint];
663
- return previous || (isBreakpointTriggered && isHeaderVisible);
664
- }, false);
665
- return showHeader;
666
- }
667
-
668
- function DataListHeader({ layouts, mediaMatches, headerData, }) {
669
- const showHeader = useShowHeader();
670
- const { selected } = useDataListContext();
688
+ function DataListHeader() {
689
+ const breakpoints = useResponsiveSizing();
690
+ const { headerVisibility = { xs: true, sm: true, md: true, lg: true, xl: true }, headers, selected, layoutBreakpoints, } = useDataListContext();
691
+ const size = getVisibleSize();
692
+ const { layout } = useActiveLayout();
693
+ const visible = headerVisibility[size];
671
694
  const noItemsSelected = (selected === null || selected === void 0 ? void 0 : selected.length) === 0;
672
- if ((!showHeader && noItemsSelected) || !headerData)
695
+ if ((!visible && noItemsSelected) || !layout)
673
696
  return null;
674
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement("div", { className: classnames__default["default"](styles$e.headerTitles) },
675
- React__default["default"].createElement(DataListHeaderCheckbox, null, layout.props.children(headerData)))) }));
676
- }
677
-
678
- const LOADING_STATE_LIMIT_ITEMS = 10;
679
- const DATALIST_LOADINGSTATE_ROW_TEST_ID = "ATL-DataList-LoadingState-Row";
680
- function DataListLoadingState({ headers, layouts, mediaMatches, }) {
681
- const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(headers);
682
- const loadingElements = loadingData.map(item => Object.keys(item).reduce((acc, key) => {
683
- acc[key] = React__default["default"].createElement(Glimmer.Glimmer, null);
684
- return acc;
685
- }, {}));
686
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => {
687
- if (layout.props.size === "xs") {
688
- return React__default["default"].createElement(LoadingStateXSBreakpoint, null);
689
- }
690
- return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingElements.map((child, i) => (React__default["default"].createElement("div", { className: styles$c.loadingItem, key: i, "data-testid": DATALIST_LOADINGSTATE_ROW_TEST_ID }, layout.props.children(child))))));
691
- } }));
692
- }
693
- function LoadingStateXSBreakpoint() {
694
- const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(0);
695
- return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingData.map((_, i) => {
696
- return (React__default["default"].createElement("div", { className: styles$c.mobileLoadingState, key: i },
697
- React__default["default"].createElement(Glimmer.Glimmer.Text, null)));
698
- })));
699
- }
700
-
701
- function DataListLayout(
702
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
703
- _) {
704
- return React__default["default"].createElement(React__default["default"].Fragment, null);
697
+ const headerData = generateHeaderElements(headers);
698
+ if (!headerData)
699
+ return null;
700
+ return (React__default["default"].createElement("div", { className: styles$e.headerTitles },
701
+ React__default["default"].createElement(DataListHeaderCheckbox, null, layout(headerData))));
702
+ function getVisibleSize() {
703
+ const visibilityKeys = Object.keys(headerVisibility);
704
+ const headerBreakpoints = sortBreakpoints(visibilityKeys).reverse();
705
+ const visibleHeaderSize = headerBreakpoints.find(key => breakpoints[key]);
706
+ return visibleHeaderSize || layoutBreakpoints[0];
707
+ }
705
708
  }
706
709
 
707
710
  function DataListSort() {
@@ -757,6 +760,20 @@ function DataListSort() {
757
760
  }
758
761
  }
759
762
 
763
+ function useShowHeader() {
764
+ const { headerVisibility } = useDataListContext();
765
+ if (headerVisibility === undefined)
766
+ return true;
767
+ const sizes = useResponsiveSizing();
768
+ const sizeKeys = Object.keys(sizes);
769
+ const showHeader = sizeKeys.reduce((previous, breakpoint) => {
770
+ const isHeaderVisible = headerVisibility[breakpoint] || false;
771
+ const isBreakpointTriggered = sizes[breakpoint];
772
+ return previous || (isBreakpointTriggered && isHeaderVisible);
773
+ }, false);
774
+ return showHeader;
775
+ }
776
+
760
777
  // This component is meant to capture the props of the DataList.Filters
761
778
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
762
779
  function DataListFilters(_) {
@@ -778,9 +795,9 @@ function InternalDataListFilters() {
778
795
  showSortButton && React__default["default"].createElement(DataListSort, null)));
779
796
  }
780
797
 
781
- var css_248z$4 = ".PGOHzrMh374- {\n --offset: 1px;\n --sticky-header-transition-properties: var(--timing-base) ease-in-out;\n\n position: sticky;\n top: calc(1px * -1);\n top: calc(var(--offset) * -1);\n z-index: 1;\n z-index: var(--elevation-base);\n padding-top: 1px;\n padding-top: var(--offset);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n/**\n * Draw a border that gets covered by the column headers border when it shows up.\n *\n * Mostly to prevent us from writing some complex JS to remove the border when\n * the column headers show up.\n */\n\n.PGOHzrMh374-::before {\n content: \"\";\n display: block;\n position: absolute;\n bottom: 0;\n left: 50%;\n z-index: -1;\n width: 0;\n height: 0;\n background-color: rgb(225, 225, 225);\n background-color: var(--color-border);\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n transition: height var(--sticky-header-transition-properties)\n 100ms,\n width var(--sticky-header-transition-properties);\n transition: height var(--sticky-header-transition-properties)\n var(--timing-quick),\n width var(--sticky-header-transition-properties);\n}\n\n.PGjWc5ocjpI-::before {\n width: 100%;\n height: calc(16px / 8);\n height: var(--border-thick);\n transition: height var(--sticky-header-transition-properties),\n width var(--sticky-header-transition-properties) 100ms;\n transition: height var(--sticky-header-transition-properties),\n width var(--sticky-header-transition-properties) var(--timing-quick);\n}\n";
782
- var styles$4 = {"header":"PGOHzrMh374-","stuck":"PGjWc5ocjpI-"};
783
- styleInject_es.styleInject(css_248z$4);
798
+ var css_248z$5 = ".PGOHzrMh374- {\n --offset: 1px;\n --sticky-header-transition-properties: var(--timing-base) ease-in-out;\n\n position: sticky;\n top: calc(1px * -1);\n top: calc(var(--offset) * -1);\n z-index: 1;\n z-index: var(--elevation-base);\n padding-top: 1px;\n padding-top: var(--offset);\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n/**\n * Draw a border that gets covered by the column headers border when it shows up.\n *\n * Mostly to prevent us from writing some complex JS to remove the border when\n * the column headers show up.\n */\n\n.PGOHzrMh374-::before {\n content: \"\";\n display: block;\n position: absolute;\n bottom: 0;\n left: 50%;\n z-index: -1;\n width: 0;\n height: 0;\n background-color: rgb(225, 225, 225);\n background-color: var(--color-border);\n -webkit-transform: translateX(-50%);\n transform: translateX(-50%);\n transition: height var(--sticky-header-transition-properties)\n 100ms,\n width var(--sticky-header-transition-properties);\n transition: height var(--sticky-header-transition-properties)\n var(--timing-quick),\n width var(--sticky-header-transition-properties);\n}\n\n.PGjWc5ocjpI-::before {\n width: 100%;\n height: calc(16px / 8);\n height: var(--border-thick);\n transition: height var(--sticky-header-transition-properties),\n width var(--sticky-header-transition-properties) 100ms;\n transition: height var(--sticky-header-transition-properties),\n width var(--sticky-header-transition-properties) var(--timing-quick);\n}\n";
799
+ var styles$5 = {"header":"PGOHzrMh374-","stuck":"PGjWc5ocjpI-"};
800
+ styleInject_es.styleInject(css_248z$5);
784
801
 
785
802
  function DataListStickyHeader({ children }) {
786
803
  const [isStuck, setIsStuck] = React.useState(false);
@@ -795,12 +812,12 @@ function DataListStickyHeader({ children }) {
795
812
  ref.current && observer.unobserve(ref.current);
796
813
  };
797
814
  }, [handleObserver, ref.current]);
798
- return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$4.header, { [styles$4.stuck]: isStuck }) }, children));
815
+ return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
799
816
  }
800
817
 
801
- var css_248z$3 = ".SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smallest));\n\n position: absolute;\n /* Inputs are off by 1 when put beside a button */\n top: calc((16px / 2) + 1px);\n top: calc(calc(16px / 2) + 1px);\n top: calc(var(--space-small) + 1px);\n right: calc((16px * 3) - (16px / 8));\n right: calc(calc(16px * 3) - calc(16px / 8));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n opacity: 0;\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 opacity: 1;\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 opacity: 1;\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";
802
- var styles$3 = {"searchInput":"SaPMOnvw-3c-","searchInputVisible":"_3S1-91v2SYI-","searchButton":"_9GlBktsUALw-","withNoFilters":"_3Pjrt42x454-"};
803
- styleInject_es.styleInject(css_248z$3);
818
+ var css_248z$4 = ".SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smallest));\n\n position: absolute;\n /* Inputs are off by 1 when put beside a button */\n top: calc((16px / 2) + 1px);\n top: calc(calc(16px / 2) + 1px);\n top: calc(var(--space-small) + 1px);\n right: calc((16px * 3) - (16px / 8));\n right: calc(calc(16px * 3) - calc(16px / 8));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n opacity: 0;\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 opacity: 1;\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 opacity: 1;\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";
819
+ var styles$4 = {"searchInput":"SaPMOnvw-3c-","searchInputVisible":"_3S1-91v2SYI-","searchButton":"_9GlBktsUALw-","withNoFilters":"_3Pjrt42x454-"};
820
+ styleInject_es.styleInject(css_248z$4);
804
821
 
805
822
  const DATA_LIST_SEARCH_TEST_ID = "ATL-DataList-Search-input-wrapper";
806
823
  // This component is meant to capture the props of the DataList.Search
@@ -809,7 +826,7 @@ function DataListSearch(_) {
809
826
  return null;
810
827
  }
811
828
  /**
812
- * Renders the DataList.Search component
829
+ * Renders the DataList.Search component.
813
830
  */
814
831
  function InternalDataListSearch() {
815
832
  const inputRef = React.useRef(null);
@@ -818,15 +835,19 @@ function InternalDataListSearch() {
818
835
  const debouncedSearch = React.useCallback(debounce__default["default"]((value) => { var _a; return (_a = searchComponent === null || searchComponent === void 0 ? void 0 : searchComponent.props) === null || _a === void 0 ? void 0 : _a.onSearch(value); }, SEARCH_DEBOUNCE_DELAY), [searchComponent === null || searchComponent === void 0 ? void 0 : searchComponent.props.onSearch]);
819
836
  if (!searchComponent)
820
837
  return null;
821
- const { placeholder } = searchComponent.props;
838
+ const { placeholder, initialValue } = searchComponent.props;
822
839
  return (React__default["default"].createElement("div", { className: classnames__default["default"]({
823
- [styles$3.withNoFilters]: !filterComponent && !sorting,
840
+ [styles$4.withNoFilters]: !filterComponent && !sorting,
824
841
  }) },
825
- React__default["default"].createElement("div", { "data-testid": DATA_LIST_SEARCH_TEST_ID, className: classnames__default["default"](styles$3.searchInput, {
826
- [styles$3.searchInputVisible]: visible,
842
+ React__default["default"].createElement("div", { "data-testid": DATA_LIST_SEARCH_TEST_ID, className: classnames__default["default"](styles$4.searchInput, {
843
+ [styles$4.searchInputVisible]: visible,
827
844
  }) },
828
- React__default["default"].createElement(InputText.InputText, { ref: inputRef, placeholder: getPlaceholder(), onChange: debouncedSearch, prefix: { icon: "search" }, size: "small" })),
829
- React__default["default"].createElement("div", { className: styles$3.searchButton },
845
+ React__default["default"].createElement(InputText.InputText
846
+ // If the initial value changes, reset the input.
847
+ , {
848
+ // If the initial value changes, reset the input.
849
+ key: initialValue, defaultValue: initialValue, ref: inputRef, placeholder: getPlaceholder(), onChange: debouncedSearch, prefix: { icon: "search" }, size: "small" })),
850
+ React__default["default"].createElement("div", { className: styles$4.searchButton },
830
851
  React__default["default"].createElement(AnimatedSwitcher.AnimatedSwitcher, { switched: visible, initialChild: React__default["default"].createElement(Button.Button, { variation: "subtle", icon: "search", ariaLabel: "Search", onClick: toggleSearch }), switchTo: React__default["default"].createElement(Button.Button, { variation: "subtle", icon: "remove", ariaLabel: "Close search bar", onClick: toggleSearch }) }))));
831
852
  function getPlaceholder() {
832
853
  if (placeholder)
@@ -844,9 +865,9 @@ function InternalDataListSearch() {
844
865
  }
845
866
  }
846
867
 
847
- var css_248z$2 = ".zg3w9nQga-M- {\n display: -ms-flexbox;\n display: flex;\n box-sizing: border-box;\n padding: calc(16px * 1);\n padding: var(--space-base);\n -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-direction: column;\n flex-direction: column;\n row-gap: calc(16px * 1);\n row-gap: var(--space-base);\n -ms-flex-align: center;\n align-items: center;\n -ms-flex: 1;\n flex: 1;\n}\n";
848
- var styles$2 = {"emptyStateWrapper":"zg3w9nQga-M-"};
849
- styleInject_es.styleInject(css_248z$2);
868
+ var css_248z$3 = ".zg3w9nQga-M- {\n display: -ms-flexbox;\n display: flex;\n box-sizing: border-box;\n padding: calc(16px * 1);\n padding: var(--space-base);\n -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-direction: column;\n flex-direction: column;\n row-gap: calc(16px * 1);\n row-gap: var(--space-base);\n -ms-flex-align: center;\n align-items: center;\n -ms-flex: 1;\n flex: 1;\n}\n";
869
+ var styles$3 = {"emptyStateWrapper":"zg3w9nQga-M-"};
870
+ styleInject_es.styleInject(css_248z$3);
850
871
 
851
872
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
852
873
  function DataListEmptyState(_) {
@@ -855,7 +876,7 @@ function DataListEmptyState(_) {
855
876
  function InternalDataListEmptyState() {
856
877
  const { emptyStateComponents: components, filtered } = React.useContext(DataListContext);
857
878
  const { message, action } = getMessages();
858
- return (React__default["default"].createElement("div", { className: styles$2.emptyStateWrapper },
879
+ return (React__default["default"].createElement("div", { className: styles$3.emptyStateWrapper },
859
880
  React__default["default"].createElement(Text.Text, { align: "center" }, message),
860
881
  renderButton(action)));
861
882
  function getMessages() {
@@ -889,9 +910,9 @@ function getEmptyStates(components) {
889
910
  return { defaultEmptyState, filteredEmptyState };
890
911
  }
891
912
 
892
- var css_248z$1 = ".IC-Y9bTIVFo- {\n position: relative;\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\n.PbZLGpbI6ZM-,\n._6zA6B-jmz6o- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n\n._6zA6B-jmz6o- {\n opacity: 0;\n -webkit-animation: gZ4DUv82g5I- 200ms ease 200ms forwards;\n -webkit-animation: gZ4DUv82g5I- var(--timing-base) ease var(--timing-base) forwards;\n animation: gZ4DUv82g5I- 200ms ease 200ms forwards;\n animation: gZ4DUv82g5I- var(--timing-base) ease var(--timing-base) forwards;\n}\n\n@-webkit-keyframes gZ4DUv82g5I- {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes gZ4DUv82g5I- {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n";
893
- var styles$1 = {"trigger":"IC-Y9bTIVFo-","loadingMore":"PbZLGpbI6ZM-","backToTop":"_6zA6B-jmz6o-","fadeIn":"gZ4DUv82g5I-"};
894
- styleInject_es.styleInject(css_248z$1);
913
+ var css_248z$2 = ".IC-Y9bTIVFo- {\n position: relative;\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\n.PbZLGpbI6ZM-,\n._6zA6B-jmz6o- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n padding: calc(16px / 2);\n padding: var(--space-small);\n}\n\n._6zA6B-jmz6o- {\n opacity: 0;\n -webkit-animation: gZ4DUv82g5I- 200ms ease 200ms forwards;\n -webkit-animation: gZ4DUv82g5I- var(--timing-base) ease var(--timing-base) forwards;\n animation: gZ4DUv82g5I- 200ms ease 200ms forwards;\n animation: gZ4DUv82g5I- var(--timing-base) ease var(--timing-base) forwards;\n}\n\n@-webkit-keyframes gZ4DUv82g5I- {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n\n@keyframes gZ4DUv82g5I- {\n from {\n opacity: 0;\n }\n\n to {\n opacity: 1;\n }\n}\n";
914
+ var styles$2 = {"trigger":"IC-Y9bTIVFo-","loadingMore":"PbZLGpbI6ZM-","backToTop":"_6zA6B-jmz6o-","fadeIn":"gZ4DUv82g5I-"};
915
+ styleInject_es.styleInject(css_248z$2);
895
916
 
896
917
  function DataListLoadMoreTrigger() {
897
918
  const { onLoadMore } = useDataListContext();
@@ -899,7 +920,7 @@ function DataListLoadMoreTrigger() {
899
920
  React.useEffect(() => {
900
921
  isInView && (onLoadMore === null || onLoadMore === void 0 ? void 0 : onLoadMore());
901
922
  }, [isInView]);
902
- return (React__default["default"].createElement("div", { ref: inViewRef, className: styles$1.trigger, "data-testid": DATA_LOAD_MORE_TEST_ID }));
923
+ return (React__default["default"].createElement("div", { ref: inViewRef, className: styles$2.trigger, "data-testid": DATA_LOAD_MORE_TEST_ID }));
903
924
  }
904
925
 
905
926
  const MAX_DATA_COUNT = 50;
@@ -908,20 +929,40 @@ function DataListLoadMore({ onBackToTop }) {
908
929
  const showBackToTop = data.length > MAX_DATA_COUNT && loadingState !== "loadingMore";
909
930
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
910
931
  React__default["default"].createElement(DataListLoadMoreTrigger, { key: data.length }),
911
- loadingState === "loadingMore" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_LOADING_MORE_SPINNER_TEST_ID, className: styles$1.loadingMore },
932
+ loadingState === "loadingMore" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_LOADING_MORE_SPINNER_TEST_ID, className: styles$2.loadingMore },
912
933
  React__default["default"].createElement(Spinner.Spinner, { size: "small" }))),
913
- showBackToTop && (React__default["default"].createElement("div", { className: styles$1.backToTop },
934
+ showBackToTop && (React__default["default"].createElement("div", { className: styles$2.backToTop },
914
935
  React__default["default"].createElement(Button.Button, { label: "Back to top", onClick: onBackToTop, size: "small", variation: "subtle" })))));
915
936
  }
916
937
 
938
+ var css_248z$1 = ".iyg43v-S9yU- {\n display: -ms-flexbox;\n display: flex;\n width: 100%;\n min-height: 44px;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border: none;\n border-radius: 0;\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 text-align: left;\n background: none;\n cursor: pointer;\n transition: background 200ms ease;\n transition: background var(--timing-base) ease;\n -webkit-appearance: none;\n appearance: none;\n -ms-flex-align: center;\n align-items: center;\n gap: calc(16px / 2);\n gap: var(--space-small);\n}\n\n.iyg43v-S9yU-:hover,\n.iyg43v-S9yU-:focus {\n background-color: rgb(250, 246, 219);\n background-color: var(--color-surface--hover);\n}\n\n.AUJNqz93ZDA- {\n font-weight: 500;\n}\n";
939
+ var styles$1 = {"action":"iyg43v-S9yU-","label":"AUJNqz93ZDA-"};
940
+ styleInject_es.styleInject(css_248z$1);
941
+
942
+ function DataListAction({ label, icon, destructive, onClick, }) {
943
+ const { activeItem } = useDataListLayoutActionsContext();
944
+ const color = destructive ? "critical" : "blue";
945
+ return (React__default["default"].createElement("button", { className: styles$1.action, onClick: handleClick },
946
+ icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color }),
947
+ React__default["default"].createElement(Typography.Typography, { textColor: color },
948
+ React__default["default"].createElement("span", { className: styles$1.label }, label))));
949
+ function handleClick() {
950
+ if (activeItem) {
951
+ onClick === null || onClick === void 0 ? void 0 : onClick(activeItem);
952
+ }
953
+ else {
954
+ onClick === null || onClick === void 0 ? void 0 : onClick();
955
+ }
956
+ }
957
+ }
958
+
917
959
  var css_248z = "._0m75bgCVBhk- {\n visibility: hidden;\n}\n";
918
960
  var styles = {"hidden":"_0m75bgCVBhk-"};
919
961
  styleInject_es.styleInject(css_248z);
920
962
 
921
963
  function DataListLayoutActions() {
922
- const { itemActionComponent } = useDataListContext();
964
+ const { itemActionComponent, loadingState } = useDataListContext();
923
965
  const { setHasInLayoutActions } = useDataListLayoutContext();
924
- const { activeItem } = useDataListLayoutActionsContext();
925
966
  const { children: actionsChildren } = (itemActionComponent === null || itemActionComponent === void 0 ? void 0 : itemActionComponent.props) || {};
926
967
  const actions = React.Children.toArray(actionsChildren);
927
968
  const hasActions = actions.length > 0;
@@ -931,10 +972,13 @@ function DataListLayoutActions() {
931
972
  setHasInLayoutActions(false);
932
973
  };
933
974
  }, []);
975
+ if (loadingState === "initial") {
976
+ return React__default["default"].createElement(Glimmer.Glimmer, { shape: "square", size: "large" });
977
+ }
934
978
  if (!hasActions)
935
979
  return null;
936
980
  return (React__default["default"].createElement(DataListLayoutActionsWrapper, null,
937
- React__default["default"].createElement(DataListItemActionsOverflow, { actions: actions, item: activeItem })));
981
+ React__default["default"].createElement(DataListItemActionsOverflow, { actions: actions })));
938
982
  }
939
983
  function DataListLayoutActionsWrapper({ children }) {
940
984
  const { isInLayoutProvider } = useDataListLayoutContext();
@@ -943,34 +987,10 @@ function DataListLayoutActionsWrapper({ children }) {
943
987
  return React__default["default"].createElement("div", { className: styles.hidden }, children);
944
988
  }
945
989
 
946
- function useLayoutMediaQueries() {
947
- const mediaQueries = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: window.matchMedia(breakpointToMediaQuery(breakpoint)) })), {});
948
- const initialMatches = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: mediaQueries[breakpoint].matches })), {});
949
- const [matches, setMatches] = React.useState(initialMatches);
950
- const handlers = BREAKPOINTS.reduce((previous, breakpoint) => {
951
- const handler = (e) => setMatches(previousMatches => (Object.assign(Object.assign({}, previousMatches), { [breakpoint]: e.matches })));
952
- return Object.assign(Object.assign({}, previous), { [breakpoint]: handler });
953
- }, {});
954
- // Set up mediaQuery event handlers
955
- React.useEffect(() => {
956
- BREAKPOINTS.forEach(breakpoint => {
957
- mediaQueries[breakpoint].addEventListener("change", handlers[breakpoint]);
958
- });
959
- return () => {
960
- BREAKPOINTS.forEach(breakpoint => {
961
- mediaQueries[breakpoint].removeEventListener("change", handlers[breakpoint]);
962
- });
963
- };
964
- }, [mediaQueries]);
965
- return matches;
966
- }
967
- function breakpointToMediaQuery(breakpoint) {
968
- return `(min-width: ${BREAKPOINT_SIZES[breakpoint]}px)`;
969
- }
970
-
971
990
  function DataList(_a) {
972
- var _b;
973
- var { sorting } = _a, props = tslib_es6.__rest(_a, ["sorting"]);
991
+ var { selected = [], sorting } = _a, props = tslib_es6.__rest(_a, ["selected", "sorting"]);
992
+ const [layoutBreakpoints, setLayoutBreakpoints] = React.useState([]);
993
+ const [layouts, setLayouts] = React.useState({});
974
994
  const searchComponent = getCompoundComponent(props.children, DataListSearch);
975
995
  const filterComponent = getCompoundComponent(props.children, DataListFilters);
976
996
  const layoutComponents = getCompoundComponents(props.children, DataListLayout);
@@ -982,16 +1002,24 @@ function DataList(_a) {
982
1002
  layoutComponents,
983
1003
  emptyStateComponents,
984
1004
  itemActionComponent,
985
- bulkActionsComponent }, props), { selected: (_b = props.selected) !== null && _b !== void 0 ? _b : [],
1005
+ bulkActionsComponent,
1006
+ layoutBreakpoints,
1007
+ registerLayoutBreakpoints,
1008
+ layouts,
1009
+ registerLayout }, props), { selected,
986
1010
  // T !== DataListObject
987
1011
  sorting: sorting }) },
988
1012
  React__default["default"].createElement(InternalDataList, null)));
1013
+ function registerLayoutBreakpoints(size) {
1014
+ setLayoutBreakpoints(prev => sortBreakpoints([...prev, size]));
1015
+ }
1016
+ function registerLayout(size, children) {
1017
+ setLayouts(prev => (Object.assign(Object.assign({}, prev), { [size]: children })));
1018
+ }
989
1019
  }
990
1020
  function InternalDataList() {
991
- const { data, headers, title, totalCount, headerVisibility = { xs: true, sm: true, md: true, lg: true, xl: true }, loadingState = "none", layoutComponents, } = useDataListContext();
1021
+ const { data, title, totalCount, loadingState = "none", layoutComponents, } = useDataListContext();
992
1022
  const backToTopRef = React.useRef(null);
993
- const headerData = generateHeaderElements(headers);
994
- const mediaMatches = useLayoutMediaQueries();
995
1023
  const initialLoading = loadingState === "initial";
996
1024
  const showEmptyState = !initialLoading && data.length === 0;
997
1025
  const shouldRenderLoadMoreTrigger = !initialLoading && !showEmptyState;
@@ -1004,10 +1032,10 @@ function InternalDataList() {
1004
1032
  React__default["default"].createElement("div", { className: styles$e.headerFilters },
1005
1033
  React__default["default"].createElement(InternalDataListFilters, null),
1006
1034
  React__default["default"].createElement(InternalDataListSearch, null)),
1007
- headerData && (React__default["default"].createElement(DataListHeader, { layouts: layoutComponents, headerData: headerData, headerVisibility: headerVisibility, mediaMatches: mediaMatches }))),
1008
- initialLoading && (React__default["default"].createElement(DataListLoadingState, { headers: headers, layouts: layoutComponents, mediaMatches: mediaMatches })),
1035
+ React__default["default"].createElement(DataListHeader, null)),
1036
+ initialLoading && React__default["default"].createElement(DataListLoadingState, null),
1009
1037
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
1010
- !initialLoading && (React__default["default"].createElement(DataListItems, { data: data, layouts: layoutComponents, mediaMatches: mediaMatches })),
1038
+ layoutComponents,
1011
1039
  loadingState === "filtering" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_FILTERING_SPINNER_TEST_ID, className: styles$e.filtering },
1012
1040
  React__default["default"].createElement("div", { className: styles$e.filteringSpinner },
1013
1041
  React__default["default"].createElement(Spinner.Spinner, { size: "small" })))),
@@ -1045,6 +1073,9 @@ DataList.EmptyState = DataListEmptyState;
1045
1073
  DataList.Filters = DataListFilters;
1046
1074
  /**
1047
1075
  * Enables the search functionality of the DataList.
1076
+ *
1077
+ * Since the debounce is implemented within the component, it can only be an
1078
+ * uncontrolled component. Thus the lack of a `value` prop.
1048
1079
  */
1049
1080
  DataList.Search = DataListSearch;
1050
1081
  /**