@jobber/components 4.42.0 → 4.42.1-update-hov.11

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 (180) hide show
  1. package/Chip.d.ts +1 -0
  2. package/Chip.js +17 -0
  3. package/Combobox.d.ts +1 -0
  4. package/Combobox.js +17 -0
  5. package/Flex.d.ts +1 -0
  6. package/Flex.js +17 -0
  7. package/dist/Autocomplete/index.js +8 -8
  8. package/dist/Avatar/index.js +1 -1
  9. package/dist/{Avatar-1aa30ee1.js → Avatar-76a799fa.js} +1 -1
  10. package/dist/Banner/index.js +5 -5
  11. package/dist/Button/index.js +2 -2
  12. package/dist/Button-163a0641.js +57 -0
  13. package/dist/ButtonDismiss/index.js +3 -3
  14. package/dist/{ButtonDismiss-82680c7d.js → ButtonDismiss-2b98d075.js} +1 -1
  15. package/dist/Card/index.js +5 -5
  16. package/dist/{Card-cc2ffbaa.js → Card-3178033c.js} +4 -4
  17. package/dist/Checkbox/index.js +3 -3
  18. package/dist/{Checkbox-3bccf65c.js → Checkbox-ad7ec2e7.js} +2 -2
  19. package/dist/Chip/Chip.d.ts +8 -0
  20. package/dist/Chip/components/ChipDismissible/ChipDismissible.d.ts +3 -0
  21. package/dist/Chip/components/ChipPrefix/Chip.Prefix.d.ts +2 -0
  22. package/dist/Chip/components/ChipSelectable/ChipSelectable.d.ts +3 -0
  23. package/dist/Chip/components/ChipSuffix/Chip.Suffix.d.ts +6 -0
  24. package/dist/Chip/hooks/index.d.ts +1 -0
  25. package/dist/Chip/hooks/useChildComponent.d.ts +8 -0
  26. package/dist/Chip/index.d.ts +3 -0
  27. package/dist/Chip/index.js +40 -0
  28. package/dist/Chip-55e6da05.js +89 -0
  29. package/dist/Chips/index.js +505 -19
  30. package/dist/Combobox/Combobox.d.ts +11 -0
  31. package/dist/Combobox/Combobox.types.d.ts +189 -0
  32. package/dist/Combobox/ComboboxProvider.d.ts +20 -0
  33. package/dist/Combobox/components/ComboboxAction/ComboboxAction.d.ts +3 -0
  34. package/dist/Combobox/components/ComboboxAction/index.d.ts +1 -0
  35. package/dist/Combobox/components/ComboboxActivator/ComboboxActivator.d.ts +3 -0
  36. package/dist/Combobox/components/ComboboxActivator/index.d.ts +1 -0
  37. package/dist/Combobox/components/ComboboxContent/ComboboxContent.d.ts +3 -0
  38. package/dist/Combobox/components/ComboboxContent/ComboboxContentHeader/ComboboxContentHeader.d.ts +3 -0
  39. package/dist/Combobox/components/ComboboxContent/ComboboxContentHeader/index.d.ts +1 -0
  40. package/dist/Combobox/components/ComboboxContent/ComboboxContentList/ComboboxContentList.d.ts +3 -0
  41. package/dist/Combobox/components/ComboboxContent/ComboboxContentList/index.d.ts +1 -0
  42. package/dist/Combobox/components/ComboboxContent/ComboboxContentSearch/ComboboxContentSearch.d.ts +3 -0
  43. package/dist/Combobox/components/ComboboxContent/ComboboxContentSearch/index.d.ts +1 -0
  44. package/dist/Combobox/components/ComboboxContent/index.d.ts +1 -0
  45. package/dist/Combobox/components/ComboboxOption/ComboboxOption.d.ts +6 -0
  46. package/dist/Combobox/components/ComboboxOption/index.d.ts +1 -0
  47. package/dist/Combobox/components/ComboboxTrigger/ComboboxTrigger.d.ts +3 -0
  48. package/dist/Combobox/components/ComboboxTrigger/index.d.ts +1 -0
  49. package/dist/Combobox/hooks/useCombobox.d.ts +15 -0
  50. package/dist/Combobox/hooks/useComboboxAccessibility.d.ts +13 -0
  51. package/dist/Combobox/hooks/useComboboxContent.d.ts +8 -0
  52. package/dist/Combobox/hooks/useComboboxValidation.d.ts +12 -0
  53. package/dist/Combobox/hooks/useMakeComboboxHandlers.d.ts +7 -0
  54. package/dist/Combobox/index.d.ts +3 -0
  55. package/dist/Combobox/index.js +31 -0
  56. package/dist/Combobox-0044641d.js +403 -0
  57. package/dist/ConfirmationModal/index.js +9 -9
  58. package/dist/{ConfirmationModal-6b61ebf5.js → ConfirmationModal-f7234e44.js} +2 -2
  59. package/dist/Content/Content.d.ts +1 -1
  60. package/dist/DataDump/index.js +6 -6
  61. package/dist/DataList/DataList.d.ts +8 -3
  62. package/dist/DataList/DataList.types.d.ts +71 -7
  63. package/dist/DataList/DataList.utils.d.ts +5 -4
  64. package/dist/DataList/components/DataListAction/DataListAction.d.ts +2 -3
  65. package/dist/DataList/components/DataListActions/DataListActions.d.ts +3 -0
  66. package/dist/DataList/components/DataListActions/index.d.ts +1 -0
  67. package/dist/DataList/components/DataListBulkActions/DataListBulkActions.const.d.ts +1 -0
  68. package/dist/DataList/components/DataListBulkActions/DataListBulkActions.d.ts +4 -0
  69. package/dist/DataList/components/DataListBulkActions/index.d.ts +1 -0
  70. package/dist/DataList/components/DataListHeader/DataListHeader.d.ts +2 -0
  71. package/dist/DataList/components/DataListHeader/index.d.ts +1 -0
  72. package/dist/DataList/components/DataListItem/DataListItem.d.ts +9 -0
  73. package/dist/DataList/components/{DataListLayoutInternal → DataListItem}/DataListItemInternal.d.ts +1 -1
  74. package/dist/DataList/components/DataListItem/components/DataListItemClickable/DataListItemClickable.d.ts +2 -0
  75. package/dist/DataList/components/DataListItem/components/DataListItemClickable/DataListItemClickableInternal.d.ts +3 -0
  76. package/dist/DataList/components/DataListItem/components/DataListItemClickable/index.d.ts +1 -0
  77. package/dist/DataList/components/DataListItem/index.d.ts +1 -0
  78. package/dist/DataList/components/DataListItemActions/DataListItemActions.d.ts +4 -4
  79. package/dist/DataList/components/DataListItemActionsOverflow/DataListItemActionsOverflow.d.ts +7 -0
  80. package/dist/DataList/components/DataListItemActionsOverflow/index.d.ts +1 -0
  81. package/dist/DataList/components/DataListItems/DataListItems.d.ts +7 -0
  82. package/dist/DataList/components/DataListItems/index.d.ts +1 -0
  83. package/dist/DataList/components/DataListLayout/DataListLayout.d.ts +2 -2
  84. package/dist/DataList/components/DataListLayoutActions/DataListLayoutContext/DataListLayoutContext.d.ts +4 -0
  85. package/dist/DataList/components/DataListLayoutActions/DataListLayoutContext/index.d.ts +1 -0
  86. package/dist/DataList/components/DataListLoadingState/DataListLoadingState.d.ts +2 -9
  87. package/dist/DataList/components/DataListOverflowFade/DataListOverflowFade.d.ts +6 -0
  88. package/dist/DataList/components/DataListOverflowFade/index.d.ts +2 -0
  89. package/dist/DataList/components/DataListSearch/DataListSearch.d.ts +1 -1
  90. package/dist/DataList/components/DataListStatusBar/DataListStatusBar.d.ts +10 -0
  91. package/dist/DataList/components/DataListStatusBar/index.d.ts +1 -0
  92. package/dist/DataList/context/DataListContext/DataListContext.d.ts +3 -3
  93. package/dist/DataList/context/DataListLayoutContext/DataListLayoutContext.d.ts +4 -4
  94. package/dist/DataList/hooks/useActiveLayout.d.ts +4 -0
  95. package/dist/DataList/hooks/useGetItemActions.d.ts +6 -0
  96. package/dist/DataList/index.js +583 -417
  97. package/dist/DataTable/DataTable.d.ts +10 -10
  98. package/dist/DataTable/Pagination.d.ts +6 -5
  99. package/dist/DataTable/index.js +20 -14
  100. package/dist/DatePicker/index.js +3 -3
  101. package/dist/{DatePicker-b31baae4.js → DatePicker-c18f1739.js} +3 -3
  102. package/dist/DescriptionList/index.js +2 -2
  103. package/dist/Disclosure/index.js +2 -2
  104. package/dist/Drawer/index.js +5 -5
  105. package/dist/Emphasis/index.js +2 -2
  106. package/dist/{Emphasis-76a10790.js → Emphasis-b2d1b3aa.js} +1 -1
  107. package/dist/FeatureSwitch/index.js +7 -7
  108. package/dist/Flex/Flex.d.ts +32 -0
  109. package/dist/Flex/Flex.types.d.ts +6 -0
  110. package/dist/Flex/index.d.ts +1 -0
  111. package/dist/Flex/index.js +40 -0
  112. package/dist/FormField/index.js +5 -5
  113. package/dist/{FormField-d6138b7f.js → FormField-0b529c0b.js} +4 -4
  114. package/dist/FormatFile/index.js +11 -11
  115. package/dist/{FormatFile-aa1898f9.js → FormatFile-6bc7f045.js} +6 -6
  116. package/dist/Gallery/index.js +12 -12
  117. package/dist/Heading/index.js +2 -2
  118. package/dist/{Heading-a1191b15.js → Heading-0f4ecb0c.js} +1 -1
  119. package/dist/InlineLabel/index.js +2 -2
  120. package/dist/{InlineLabel-afd5fc6f.js → InlineLabel-9a517c19.js} +2 -2
  121. package/dist/InputAvatar/index.js +5 -5
  122. package/dist/InputDate/index.js +6 -6
  123. package/dist/InputEmail/index.js +5 -5
  124. package/dist/InputFile/index.js +3 -3
  125. package/dist/{InputFile-2a06c2c0.js → InputFile-8a21a5fb.js} +3 -3
  126. package/dist/InputNumber/index.js +6 -6
  127. package/dist/{InputNumber-07b03067.js → InputNumber-6a7cefc6.js} +1 -1
  128. package/dist/InputPassword/index.js +5 -5
  129. package/dist/InputPhoneNumber/index.js +5 -5
  130. package/dist/InputText/index.js +6 -6
  131. package/dist/{InputText-d1a52550.js → InputText-dcf6c428.js} +1 -1
  132. package/dist/InputTime/index.js +5 -5
  133. package/dist/InputValidation/index.js +3 -3
  134. package/dist/{InputValidation-b5a3d92c.js → InputValidation-179f0926.js} +2 -2
  135. package/dist/LightBox/index.js +4 -4
  136. package/dist/{LightBox-437a1c8b.js → LightBox-3f4dbc33.js} +2 -2
  137. package/dist/Link/Link.d.ts +1 -2
  138. package/dist/Link/index.d.ts +1 -1
  139. package/dist/List/index.js +7 -7
  140. package/dist/Markdown/index.js +5 -5
  141. package/dist/{Markdown-f6748dcb.js → Markdown-96070121.js} +3 -3
  142. package/dist/Menu/index.js +3 -3
  143. package/dist/{Menu-51f8712f.js → Menu-d7ea093c.js} +3 -3
  144. package/dist/Modal/index.js +5 -5
  145. package/dist/{Modal-a9ab9565.js → Modal-b9d194e4.js} +4 -4
  146. package/dist/MultiSelect/index.js +5 -5
  147. package/dist/{Option-b903e7ac.js → Option-752ce1e8.js} +1 -1
  148. package/dist/Page/index.js +7 -7
  149. package/dist/Popover/index.js +50 -9
  150. package/dist/ProgressBar/index.js +1 -1
  151. package/dist/{ProgressBar-5dfc1885.js → ProgressBar-250e7b24.js} +1 -1
  152. package/dist/RadioGroup/index.js +3 -3
  153. package/dist/{RadioGroup-8e76d20b.js → RadioGroup-ebaa4f87.js} +2 -2
  154. package/dist/RecurringSelect/index.js +11 -11
  155. package/dist/Select/index.js +6 -6
  156. package/dist/StatusLabel/index.js +2 -2
  157. package/dist/Switch/index.js +2 -2
  158. package/dist/{Switch-e75145cc.js → Switch-b85272bf.js} +2 -2
  159. package/dist/Tabs/Tabs.d.ts +12 -1
  160. package/dist/Tabs/index.js +8 -4
  161. package/dist/Text/index.js +2 -2
  162. package/dist/{Text-e7ed0974.js → Text-4a2bc89f.js} +1 -1
  163. package/dist/Toast/index.js +2 -2
  164. package/dist/Tooltip/index.js +1 -3
  165. package/dist/{Tooltip-bf67fe6e.js → Tooltip-6b12f1c2.js} +6 -8
  166. package/dist/Typography/index.js +1 -1
  167. package/dist/{Typography-fd6f932a.js → Typography-973b122e.js} +3 -3
  168. package/package.json +7 -7
  169. package/rollup.config.js +3 -5
  170. package/dist/Button-fd8413b2.js +0 -57
  171. package/dist/Chip-4916a642.js +0 -514
  172. package/dist/DataList/components/DataListItemActions/DataListItemActionsOverflow.d.ts +0 -7
  173. package/dist/DataList/components/DataListLayoutInternal/DataListHeader.d.ts +0 -11
  174. package/dist/DataList/components/DataListLayoutInternal/DataListItems.d.ts +0 -10
  175. package/dist/DataList/components/DataListLayoutInternal/DataListLayoutInternal.d.ts +0 -10
  176. package/dist/DataList/components/DataListLayoutInternal/index.d.ts +0 -3
  177. package/dist/DataList/hooks/useLayoutMediaQueries.d.ts +0 -1
  178. package/dist/Popover-bbfc6aa1.js +0 -53
  179. /package/dist/DataList/components/{DataListLayoutInternal → DataListHeader}/DataListHeaderCheckbox.d.ts +0 -0
  180. /package/dist/DataList/components/{DataListFilters/DataListFilter.const.d.ts → DataListOverflowFade/DataListOverflowFade.const.d.ts} +0 -0
@@ -5,62 +5,58 @@ Object.defineProperty(exports, '__esModule', { value: true });
5
5
  var tslib_es6 = require('../tslib.es6-5b8768b7.js');
6
6
  var React = require('react');
7
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
8
- var Text = require('../Text-e7ed0974.js');
8
+ var Text = require('../Text-4a2bc89f.js');
9
9
  var Glimmer = require('../Glimmer-cfa92a88.js');
10
+ var noop = require('lodash/noop');
11
+ var design = require('@jobber/design');
10
12
  var framerMotion = require('framer-motion');
11
13
  var classnames = require('classnames');
12
- var design = require('@jobber/design');
14
+ var Tooltip = require('../Tooltip-6b12f1c2.js');
15
+ var Button = require('../Button-163a0641.js');
16
+ var useInView = require('@jobber/hooks/useInView');
13
17
  var isEmpty = require('lodash/isEmpty');
14
- var InlineLabel = require('../InlineLabel-afd5fc6f.js');
18
+ var InlineLabel = require('../InlineLabel-9a517c19.js');
15
19
  var FormatDate = require('../FormatDate-70ea5b43.js');
16
- var Heading = require('../Heading-a1191b15.js');
17
- require('uuid');
18
- require('react-hook-form');
19
- var Checkbox = require('../Checkbox-3bccf65c.js');
20
- var Typography = require('../Typography-fd6f932a.js');
21
- require('react-router-dom');
22
- var Button = require('../Button-fd8413b2.js');
23
- var ReactDOM = require('react-dom');
24
- var Tooltip = require('../Tooltip-bf67fe6e.js');
25
- require('react-popper');
20
+ var Heading = require('../Heading-0f4ecb0c.js');
26
21
  var useFocusTrap = require('@jobber/hooks/useFocusTrap');
27
22
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
28
23
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
29
- var foundation = require('@jobber/design/foundation');
30
- var noop = require('lodash/noop');
24
+ var ReactDOM = require('react-dom');
25
+ var Checkbox = require('../Checkbox-ad7ec2e7.js');
26
+ var reactRouterDom = require('react-router-dom');
31
27
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
28
+ var Combobox = require('../Combobox-0044641d.js');
29
+ var Chip = require('../Chip-55e6da05.js');
32
30
  var Icon = require('../Icon-405a216c.js');
33
- var useInView = require('@jobber/hooks/useInView');
34
- var Popover = require('../Popover-bbfc6aa1.js');
35
- var Content = require('../Content-2ca1ffe1.js');
36
- var Chip = require('../Chip-4916a642.js');
37
- require('@jobber/hooks/useAssert');
38
- require('../Avatar-1aa30ee1.js');
39
- require('color');
40
31
  var debounce = require('lodash/debounce');
41
- var InputText = require('../InputText-d1a52550.js');
32
+ var InputText = require('../InputText-dcf6c428.js');
42
33
  var Spinner = require('../Spinner-9d8fc7ff.js');
43
- require('../ButtonDismiss-82680c7d.js');
44
- require('lodash/sortBy');
45
- require('@jobber/hooks/useLiveAnnounce');
46
- require('../FormField-d6138b7f.js');
47
- require('../InputValidation-b5a3d92c.js');
34
+ var Typography = require('../Typography-973b122e.js');
35
+ require('../Content-2ca1ffe1.js');
36
+ require('react-popper');
37
+ require('uuid');
38
+ require('react-hook-form');
39
+ require('@jobber/hooks/useAssert');
40
+ require('../Avatar-76a799fa.js');
41
+ require('color');
42
+ require('../FormField-0b529c0b.js');
43
+ require('../InputValidation-179f0926.js');
48
44
 
49
45
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
50
46
 
51
47
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
48
+ var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
52
49
  var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
53
50
  var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
54
- var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
55
51
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
56
52
 
57
- 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.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}\n\n.jMSVGIAr5tk- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\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 --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.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\n.qm-SSuWTXkI-.VA9RnQp6nbI- {\n visibility: visible;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\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- > :first-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n.ise8kHCfhCY-:hover .d-79rkMqufg- > :first-child,\n.ise8kHCfhCY-:focus-within .d-79rkMqufg- > :first-child,\n.ise8kHCfhCY- .d-79rkMqufg-._4L7iXXzLr5k- > :first-child {\n opacity: 1;\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";
58
- var styles$e = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","headerBatchSelect":"jMSVGIAr5tk-","listItem":"ise8kHCfhCY-","active":"Pc0JGX6jCD4-","selectable":"d-79rkMqufg-","selectAllCheckbox":"qm-SSuWTXkI-","visible":"VA9RnQp6nbI-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-"};
59
- styleInject_es.styleInject(css_248z$e);
53
+ var css_248z$f = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n --data-list--minimum-item-height: calc(var(--base-unit) * 3.5);\n\n display: -ms-flexbox;\n\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n -ms-flex: 1;\n flex: 1;\n}\n\n/*\n * Header\n */\n\n.IcAlZHoB4LI- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 1;\n z-index: var(--elevation-base);\n margin-bottom: calc(16px / 2);\n margin-bottom: var(--space-small);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.TFO76ysivmg- {\n display: grid;\n padding: calc(16px / 2) 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(217, 223, 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(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.ise8kHCfhCY-,\n.Tq6e0BGwcSM- {\n display: grid;\n grid-template-columns: minmax(0px, auto);\n min-height: var(--data-list--minimum-item-height);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.ise8kHCfhCY-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--hover);\n background-color: rgb(244, 246, 250);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n text-align: left;\n -webkit-text-decoration: none;\n text-decoration: none;\n background-color: transparent;\n cursor: pointer;\n}\n\n/**\n * Reset CSS properties on focus to ensure we only have the focus state on the\n * parent .listItem\n */\n\n.Tq6e0BGwcSM-:focus {\n outline: none;\n background-color: transparent;\n}\n\n/**\n * Enable a better hover and focus experience when :has() is supported.\n * This is a workaround for Firefox where the :has() selector is not supported.\n */\n\n@supports selector(*:has(*)) {\n .ise8kHCfhCY-:hover,\n .ise8kHCfhCY-:focus-within {\n background-color: transparent;\n }\n\n .ise8kHCfhCY-:has(.Tq6e0BGwcSM-:hover, .Tq6e0BGwcSM-:focus) {\n background-color: var(--data-list-item-active-color);\n }\n}\n\n/*\n * List Item Selection\n */\n\n.d-79rkMqufg- {\n display: grid;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n@media (min-width: 768px) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n.d-79rkMqufg-,\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\n -webkit-column-gap: calc(16px / 2);\n -webkit-column-gap: var(--space-small);\n -moz-column-gap: calc(16px / 2);\n -moz-column-gap: var(--space-small);\n column-gap: calc(16px / 2);\n column-gap: var(--space-small);\n}\n\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n display: grid;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.qm-SSuWTXkI- {\n display: -ms-flexbox;\n display: flex;\n visibility: hidden;\n\n /* To compensate the Checkbox's label margin that we are using for screen-readers */\n margin-right: calc((16px * 1) * -1);\n margin-right: calc(calc(16px * 1) * -1);\n margin-right: calc(var(--space-base) * -1);\n}\n\n.qm-SSuWTXkI-.VA9RnQp6nbI- {\n visibility: visible;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n -ms-flex-order: 1;\n order: 1;\n padding-top: calc(16px / 4);\n padding-top: var(--space-smaller);\n opacity: 1;\n transition: opacity 100ms ease-in-out;\n transition: opacity var(--transition-properties);\n --transition-properties: var(--timing-quick) ease-in-out;\n}\n\n@media (min-width: 768px) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n.ise8kHCfhCY-:hover .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY-:focus-within .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY- .d-79rkMqufg-._4L7iXXzLr5k- > :last-child {\n opacity: 1;\n}\n\n/*\n * Filters\n */\n\n.Kkp-IYmwq-s- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(255, 255, 255, 0.6);\n background-color: var(--color-overlay--dimmed);\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.m-eCShL7TU4- {\n position: sticky;\n top: 50vh;\n}\n\n/* This hides the text from the UI but not from the screen readers */\n\n.esUiRgWabYw- {\n position: absolute;\n top: auto;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n text-indent: -10000px;\n}\n";
54
+ var styles$f = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","batchSelectContainer":"GiD7MjZJbcw-","headerBatchSelect":"jMSVGIAr5tk-","listItem":"ise8kHCfhCY-","listItemClickable":"Tq6e0BGwcSM-","active":"Pc0JGX6jCD4-","selectable":"d-79rkMqufg-","selectAllCheckbox":"qm-SSuWTXkI-","visible":"VA9RnQp6nbI-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-","srOnly":"esUiRgWabYw-"};
55
+ styleInject_es.styleInject(css_248z$f);
60
56
 
61
- var css_248z$d = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
62
- var styles$d = {"results":"F56prQsXm3A-"};
63
- styleInject_es.styleInject(css_248z$d);
57
+ var css_248z$e = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
58
+ var styles$e = {"results":"F56prQsXm3A-"};
59
+ styleInject_es.styleInject(css_248z$e);
64
60
 
65
61
  const DATALIST_TOTALCOUNT_TEST_ID = "ATL-DataList-TotalCount";
66
62
  function DataListTotalCount({ totalCount, loading, }) {
@@ -76,12 +72,57 @@ function DataListTotalCount({ totalCount, loading, }) {
76
72
  totalCount.toLocaleString(),
77
73
  " results)"));
78
74
  }
79
- return (React__default["default"].createElement("div", { className: styles$d.results, "data-testid": DATALIST_TOTALCOUNT_TEST_ID }, output));
75
+ return (React__default["default"].createElement("div", { className: styles$e.results, "data-testid": DATALIST_TOTALCOUNT_TEST_ID }, output));
80
76
  }
81
77
 
82
- 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";
83
- var styles$c = {"loadingItem":"Rh--6fVpkm4-","mobileLoadingState":"zbS7UvpVoWI-"};
84
- styleInject_es.styleInject(css_248z$c);
78
+ const defaultValues$1 = {
79
+ title: "",
80
+ data: [],
81
+ headers: {},
82
+ children: [],
83
+ selected: [],
84
+ layoutBreakpoints: [],
85
+ registerLayoutBreakpoints: noop__default["default"],
86
+ layouts: {
87
+ xs: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
88
+ sm: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
89
+ md: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
90
+ lg: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
91
+ xl: children => React__default["default"].createElement(React__default["default"].Fragment, null, children),
92
+ },
93
+ registerLayout: noop__default["default"],
94
+ };
95
+ const DataListContext = React.createContext(defaultValues$1);
96
+ function useDataListContext() {
97
+ return React.useContext(DataListContext);
98
+ }
99
+
100
+ function useMediaQuery(CSSMediaQuery) {
101
+ /**
102
+ * matchMedia have had full support for browsers since 2012 but jest, being a
103
+ * lite version of a DOM, doesn't support it.
104
+ *
105
+ * Instead of the consumers mocking matchMedia on every usage of DataList,
106
+ * we can just return true to mimic the largest screen we support.
107
+ *
108
+ * In the event that the consumer wants to test the DataList on different
109
+ * screen sizes, they can use the `mockViewportWidth` function from
110
+ * `@jobber/components/useBreakpoints`.
111
+ */
112
+ if (window.matchMedia === undefined)
113
+ return true;
114
+ const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
115
+ React.useEffect(() => {
116
+ const media = window.matchMedia(CSSMediaQuery);
117
+ if (media.matches !== matches) {
118
+ setMatches(media.matches);
119
+ }
120
+ const listener = () => setMatches(media.matches);
121
+ media.addEventListener("change", listener);
122
+ return () => media.removeEventListener("change", listener);
123
+ }, [CSSMediaQuery]);
124
+ return matches;
125
+ }
85
126
 
86
127
  const EMPTY_RESULTS_MESSAGE = "List is looking empty";
87
128
  const EMPTY_FILTER_RESULTS_MESSAGE = "No results for selected filters";
@@ -104,14 +145,88 @@ const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
104
145
  const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
105
146
  const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
106
147
 
107
- var css_248z$b = ".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";
108
- var styles$b = {"tags":"WRV-UmQmPzo-","tagCount":"liQeWCMenD0-"};
148
+ function useResponsiveSizing() {
149
+ // This was originally written to look for "min-width: 0" which would always
150
+ // return true no matter what.
151
+ // So, instead of running media query on it, just set it to true.
152
+ const xs = true;
153
+ const sm = useMediaQuery(`(min-width: ${BREAKPOINT_SIZES.sm}px)`);
154
+ const md = useMediaQuery(`(min-width: ${BREAKPOINT_SIZES.md}px)`);
155
+ const lg = useMediaQuery(`(min-width: ${BREAKPOINT_SIZES.lg}px)`);
156
+ const xl = useMediaQuery(`(min-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$d = "._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 * 1) calc(16px / 2);\n padding: var(--space-base) 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$d = {"wrapper":"_8cMzUF8XEwY-","loadingItem":"Rh--6fVpkm4-","glimmer":"NFaWWvmxtkw-"};
172
+ styleInject_es.styleInject(css_248z$d);
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" : "large";
182
+ const glimmersFromHeader = Object.keys(headers).reduce((data, key) => (Object.assign(Object.assign({}, data), { [key]: (React__default["default"].createElement("div", { className: styles$d.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$d.wrapper }, loadingData.map((child, i) => (React__default["default"].createElement("div", { key: i, className: styles$d.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"],
192
+ };
193
+ const DataListLayoutContext = React.createContext(defaultValues);
194
+ function useDataListLayoutContext() {
195
+ return React.useContext(DataListLayoutContext);
196
+ }
197
+
198
+ var css_248z$c = ".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(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n 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$c = {"menu":"jHcHGQ-HDbk-"};
200
+ styleInject_es.styleInject(css_248z$c);
201
+
202
+ const CONTAINER_TEST_ID = "ATL-DataListFilters-Container";
203
+
204
+ var css_248z$b = ".jbBRoxlZlNI- {\n --overflow-fade--offset: var(--space-smaller);\n --overflow-fade--negative-offset: calc(var(--overflow-fade--offset) * -1);\n\n -ms-flex-item-align: center;\n\n align-self: center;\n position: relative;\n min-width: 0;\n}\n\n.MnN8qbS4hw4- {\n display: grid;\n margin: var(--overflow-fade--negative-offset);\n padding: var(--overflow-fade--offset);\n overflow-x: auto;\n overflow-y: visible;\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- > :not(:nth-last-child(2)):not(.b-5P7Z8eGO8-) {\n margin-right: calc(16px / 2);\n margin-right: 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: var(--overflow-fade--negative-offset);\n}\n\n.Jf227kC8Nu0-::after {\n --data-list-overflow-shadow-angle: to left;\n right: var(--overflow-fade--negative-offset);\n}\n";
205
+ var styles$b = {"fadeContainer":"jbBRoxlZlNI-","overflowGrid":"MnN8qbS4hw4-","overflowTrigger":"b-5P7Z8eGO8-","overflowLeft":"xzaCS4slLpI-","overflowRight":"Jf227kC8Nu0-"};
109
206
  styleInject_es.styleInject(css_248z$b);
110
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$b.fadeContainer, {
212
+ [styles$b.overflowLeft]: !isLeftVisible,
213
+ [styles$b.overflowRight]: !isRightVisible,
214
+ }) },
215
+ React__default["default"].createElement("div", { className: styles$b.overflowGrid },
216
+ React__default["default"].createElement("span", { ref: leftRef, className: styles$b.overflowTrigger }),
217
+ children,
218
+ React__default["default"].createElement("span", { ref: rightRef, className: styles$b.overflowTrigger }))));
219
+ }
220
+
221
+ var css_248z$a = "._8MYxAQYdZzM- {\n position: relative;\n}\n\n.WRV-UmQmPzo- {\n display: -ms-flexbox;\n display: flex;\n z-index: 0;\n z-index: var(--elevation-default);\n overflow: hidden;\n gap: calc(16px / 2);\n gap: var(--space-small);\n white-space: nowrap;\n}\n\n.ND-cN-mX5-c- {\n -webkit-mask-image: linear-gradient(\n to left,\n transparent,\n transparent calc(16px * 1.5),\n rgba(0, 0, 0, 1) calc(16px * 3),\n rgba(0, 0, 0, 1)\n );\n -webkit-mask-image: linear-gradient(\n to left,\n transparent,\n transparent var(--space-large),\n rgba(0, 0, 0, 1) var(--space-largest),\n rgba(0, 0, 0, 1)\n );\n mask-image: linear-gradient(\n to left,\n transparent,\n transparent calc(16px * 1.5),\n rgba(0, 0, 0, 1) calc(16px * 3),\n rgba(0, 0, 0, 1)\n );\n mask-image: linear-gradient(\n to left,\n transparent,\n transparent var(--space-large),\n rgba(0, 0, 0, 1) var(--space-largest),\n rgba(0, 0, 0, 1)\n );\n}\n\n.liQeWCMenD0- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n height: 100%;\n -ms-flex-align: center;\n align-items: center;\n}\n";
222
+ var styles$a = {"tagWrapper":"_8MYxAQYdZzM-","tags":"WRV-UmQmPzo-","tagsMask":"ND-cN-mX5-c-","tagCount":"liQeWCMenD0-"};
223
+ styleInject_es.styleInject(css_248z$a);
224
+
111
225
  function DataListTags({ items }) {
112
226
  const ref = React.useRef(null);
113
227
  const [visibleIndex, setVisibleIndex] = React.useState([]);
114
228
  const visibleItems = visibleIndex.filter(Boolean).length;
229
+ const shouldShowTagCount = Boolean(visibleItems);
115
230
  React.useEffect(() => {
116
231
  var _a;
117
232
  if (!window.IntersectionObserver)
@@ -126,10 +241,12 @@ function DataListTags({ items }) {
126
241
  elements === null || elements === void 0 ? void 0 : elements.forEach(element => observer.unobserve(element));
127
242
  };
128
243
  }, [items]);
129
- return (React__default["default"].createElement("div", { className: styles$b.tags, ref: ref },
130
- items.filter(Boolean).map((tag, index) => (React__default["default"].createElement("div", { key: tag, "data-tag-element": index },
131
- React__default["default"].createElement(InlineLabel.InlineLabel, null, tag)))),
132
- Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$b.tagCount },
244
+ return (React__default["default"].createElement("div", { className: styles$a.tagWrapper, ref: ref },
245
+ React__default["default"].createElement("div", { className: classnames__default["default"](styles$a.tags, {
246
+ [styles$a.tagsMask]: shouldShowTagCount,
247
+ }) }, items.filter(Boolean).map((tag, index) => (React__default["default"].createElement("div", { key: tag, "data-tag-element": index },
248
+ React__default["default"].createElement(InlineLabel.InlineLabel, null, tag))))),
249
+ shouldShowTagCount && (React__default["default"].createElement("div", { className: styles$a.tagCount },
133
250
  React__default["default"].createElement(Text.Text, null,
134
251
  "+",
135
252
  visibleItems)))));
@@ -158,54 +275,43 @@ function buildIntersectionThreshold(items) {
158
275
  return thresholds;
159
276
  }
160
277
 
161
- var css_248z$a = ".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";
162
- var styles$a = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
163
- styleInject_es.styleInject(css_248z$a);
164
-
165
- var css_248z$9 = ".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";
166
- var styles$9 = {"sortIcon":"AN5egORYy-0-","active":"F1uTDCK0Sb0-","inactive":"_6KYeQXWXLQ8-"};
278
+ var css_248z$9 = ".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";
279
+ var styles$9 = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
167
280
  styleInject_es.styleInject(css_248z$9);
168
281
 
282
+ var css_248z$8 = ".AN5egORYy-0- {\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n margin-right: calc(16px / 2);\n margin-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";
283
+ var styles$8 = {"sortIcon":"AN5egORYy-0-","active":"F1uTDCK0Sb0-","inactive":"_6KYeQXWXLQ8-"};
284
+ styleInject_es.styleInject(css_248z$8);
285
+
169
286
  const SORTING_ICON_TEST_ID = "ATL-DataList-Sorting-Icon";
170
287
  function DataListSortingArrows({ order }) {
171
- return (React__default["default"].createElement("div", { className: styles$9.sortIcon, "data-testid": SORTING_ICON_TEST_ID },
288
+ return (React__default["default"].createElement("div", { className: styles$8.sortIcon, "data-testid": SORTING_ICON_TEST_ID },
172
289
  React__default["default"].createElement("svg", { width: "24", height: "24", viewBox: "0 0 24 24", fill: "none", xmlns: "http://www.w3.org/2000/svg" },
173
290
  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" }),
174
291
  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" }))));
175
292
  function getActiveClassName(targetOrder) {
176
- return order === targetOrder ? styles$9.active : styles$9.inactive;
293
+ return order === targetOrder ? styles$8.active : styles$8.inactive;
177
294
  }
178
295
  }
179
296
 
180
- const defaultValues$1 = {
181
- title: "",
182
- data: [],
183
- headers: {},
184
- children: [],
185
- selected: [],
186
- };
187
- const DataListContext = React.createContext(defaultValues$1);
188
- function useDataListContext() {
189
- return React.useContext(DataListContext);
190
- }
191
-
192
297
  function DataListHeaderTile({ headers, headerKey, }) {
193
298
  const { sorting } = useDataListContext();
194
299
  const isSortable = sorting === null || sorting === void 0 ? void 0 : sorting.sortable.includes(headerKey);
195
300
  const sortingState = sorting === null || sorting === void 0 ? void 0 : sorting.state;
196
301
  const Tag = isSortable ? "button" : "div";
197
- return (React__default["default"].createElement(Tag, { className: classnames__default["default"](styles$a.headerLabel, {
198
- [styles$a.sortable]: isSortable,
302
+ return (React__default["default"].createElement(Tag, { className: classnames__default["default"](styles$9.headerLabel, {
303
+ [styles$9.sortable]: isSortable,
199
304
  }), onClick: handleOnClick },
200
305
  React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
201
306
  (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey && (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.order }))));
202
307
  function toggleSorting(sortingKey) {
203
- if ((sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "desc") {
308
+ const isSameKey = sortingKey === (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key);
309
+ if (isSameKey && (sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "desc") {
204
310
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort(undefined);
205
311
  return;
206
312
  }
207
313
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort({
208
- order: (sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "asc" ? "desc" : "asc",
314
+ order: isSameKey && (sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "asc" ? "desc" : "asc",
209
315
  key: sortingKey,
210
316
  });
211
317
  }
@@ -234,10 +340,10 @@ function getCompoundComponents(children, type) {
234
340
  return elements;
235
341
  }
236
342
  /**
237
- * Generate the default elements the DataList would use on the data provided.
343
+ * Generate the default element the DataList would use on the data provided.
238
344
  */
239
- function generateListItemElements(data) {
240
- return data.map(item => Object.keys(item).reduce((acc, key) => {
345
+ function generateListItemElement(item) {
346
+ return Object.keys(item).reduce((acc, key) => {
241
347
  const currentItem = item[key];
242
348
  if (!currentItem) {
243
349
  return acc;
@@ -259,7 +365,7 @@ function generateListItemElements(data) {
259
365
  acc[key] = React__default["default"].createElement(Text.Text, { variation: "subdued" }, currentItem);
260
366
  }
261
367
  return acc;
262
- }, {}));
368
+ }, {});
263
369
  }
264
370
  /**
265
371
  * Generate the header elements with the default styling
@@ -268,86 +374,32 @@ function generateHeaderElements(headers) {
268
374
  const headerElements = Object.keys(headers).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: React__default["default"].createElement(DataListHeaderTile, { headers: headers, headerKey: key }) })), {});
269
375
  return isEmpty__default["default"](headerElements) ? undefined : headerElements;
270
376
  }
271
- function sortSizeProp(sizeProp) {
377
+ function sortBreakpoints(sizeProp) {
272
378
  return sizeProp.sort((a, b) => BREAKPOINTS.indexOf(a) - BREAKPOINTS.indexOf(b));
273
379
  }
274
-
275
- function DataListLayoutInternal({ layouts, renderLayout, mediaMatches, }) {
276
- const sizePropsOfLayouts = layouts === null || layouts === void 0 ? void 0 : layouts.map(layout => layout.props.size || "xs");
277
- const layoutToRender = layouts === null || layouts === void 0 ? void 0 : layouts.find(layout => {
278
- const layoutSize = layout.props.size || "xs";
279
- const isVisible = isLayoutVisible({
280
- layoutSize,
281
- mediaMatches,
282
- sizePropsOfLayouts,
283
- });
284
- return isVisible;
285
- });
286
- return (layoutToRender && renderLayout(layoutToRender)) || React__default["default"].createElement(React__default["default"].Fragment, null);
287
- }
288
- /**
289
- * Determine is layout is visible by checking a media query matches for the
290
- * visible sizes of the layout and there isn't a larger layout that should be rendered
291
- */
292
- function isLayoutVisible({ layoutSize, mediaMatches, sizePropsOfLayouts, }) {
293
- const largerBreakpointsToHide = sizePropsOfLayouts === null || sizePropsOfLayouts === void 0 ? void 0 : sizePropsOfLayouts.filter(size => BREAKPOINTS.indexOf(size) > BREAKPOINTS.indexOf(layoutSize));
294
- const sortedLargerBreakpoints = sortSizeProp(largerBreakpointsToHide || []);
295
- const visibleBreakpoints = BREAKPOINTS.slice(BREAKPOINTS.indexOf(layoutSize), sortedLargerBreakpoints[0]
296
- ? BREAKPOINTS.indexOf(sortedLargerBreakpoints[0])
297
- : undefined);
298
- const isVisibleBreakpoint = visibleBreakpoints.some(breakpoint => {
299
- return Boolean(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
300
- });
301
- const largerLayoutIsNotVisible = largerBreakpointsToHide === null || largerBreakpointsToHide === void 0 ? void 0 : largerBreakpointsToHide.reduce((acc, breakpoint) => {
302
- return acc && !(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
303
- }, true);
304
- return isVisibleBreakpoint && largerLayoutIsNotVisible;
305
- }
306
-
307
- function DataListItemInternal({ children, item, }) {
308
- const { selected, onSelect } = useDataListContext();
309
- if (selected !== undefined && onSelect) {
310
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$e.selectable, {
311
- [styles$e.selected]: selected === null || selected === void 0 ? void 0 : selected.length,
312
- }) },
313
- React__default["default"].createElement(Checkbox.Checkbox, { checked: selected === null || selected === void 0 ? void 0 : selected.includes(item.id), onChange: handleChange }),
314
- children));
315
- }
316
- return children;
317
- function handleChange() {
318
- if (selected === null || selected === void 0 ? void 0 : selected.includes(item.id)) {
319
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(selected === null || selected === void 0 ? void 0 : selected.filter(id => id !== item.id));
320
- }
321
- else if (selected) {
322
- onSelect === null || onSelect === void 0 ? void 0 : onSelect([...selected, item.id]);
380
+ function getExposedActions(childrenArray, childCount = 2) {
381
+ const firstNChildren = childrenArray.slice(0, childCount);
382
+ return firstNChildren.reduce((result, child, i) => {
383
+ const hasIcon = Boolean(child.props.icon);
384
+ if (!hasIcon)
385
+ return result; // If the child does not have an icon, continue.
386
+ const isLastChildAdded = result.length === i;
387
+ // If it's the first child or if the previous child was added, then add this child.
388
+ if (i === 0 || (i < childCount && isLastChildAdded)) {
389
+ return [...result, child];
323
390
  }
324
- }
391
+ return result;
392
+ }, []);
325
393
  }
326
394
 
327
- var css_248z$8 = ".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";
328
- var styles$8 = {"menu":"jHcHGQ-HDbk-"};
329
- styleInject_es.styleInject(css_248z$8);
330
-
331
- var css_248z$7 = ".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";
332
- var styles$7 = {"action":"iyg43v-S9yU-","label":"AUJNqz93ZDA-"};
333
- styleInject_es.styleInject(css_248z$7);
334
-
335
- function DataListAction(
336
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
337
- _) {
338
- return null;
339
- }
340
- function InternalDataListAction({ label, icon, destructive, onClick, item, }) {
341
- const color = destructive ? "critical" : "blue";
342
- return (React__default["default"].createElement("button", { className: styles$7.action, onClick: () => onClick === null || onClick === void 0 ? void 0 : onClick(item) },
343
- icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color }),
344
- React__default["default"].createElement(Typography.Typography, { textColor: color },
345
- React__default["default"].createElement("span", { className: styles$7.label }, label))));
395
+ const DataListLayoutActionsContext = React.createContext({ activeItem: undefined });
396
+ function useDataListLayoutActionsContext() {
397
+ return React.useContext(DataListLayoutActionsContext);
346
398
  }
347
399
 
348
- 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: 6;\n z-index: var(--elevation-menu);\n width: 100%;\n height: 100%;\n}\n";
349
- var styles$6 = {"menu":"aokwZU8jbWU-","overlay":"XtVRP97TVSE-"};
350
- styleInject_es.styleInject(css_248z$6);
400
+ var css_248z$7 = ".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(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n 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";
401
+ var styles$7 = {"menu":"aokwZU8jbWU-","overlay":"XtVRP97TVSE-"};
402
+ styleInject_es.styleInject(css_248z$7);
351
403
 
352
404
  const variants$1 = {
353
405
  hidden: { opacity: 0, y: -10 },
@@ -358,10 +410,14 @@ function DataListActionsMenu({ visible = false, position, onRequestClose, childr
358
410
  useRefocusOnActivator.useRefocusOnActivator(visible);
359
411
  const focusTrapRef = useFocusTrap.useFocusTrap(visible);
360
412
  useOnKeyDown.useOnKeyDown(onRequestClose, "Escape");
361
- return ReactDOM.createPortal(React__default["default"].createElement(framerMotion.AnimatePresence, null, visible && (React__default["default"].createElement(React__default["default"].Fragment, null,
362
- React__default["default"].createElement("div", { className: styles$6.overlay, onClick: onRequestClose }),
363
- 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 },
364
- React__default["default"].createElement("div", { tabIndex: 0, ref: focusTrapRef }, children))))), document.body);
413
+ return ReactDOM.createPortal(React__default["default"].createElement(framerMotion.AnimatePresence, null, visible && (React__default["default"].createElement("div", { ref: focusTrapRef, onClick: handleClick },
414
+ 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$7.menu, style: getPositionCssVars(), onClick: onRequestClose }, children),
415
+ React__default["default"].createElement("button", { type: "button", className: styles$7.overlay, onClick: onRequestClose, "aria-label": "Close menu" })))), document.body);
416
+ function handleClick(event) {
417
+ // Prevent menu from firing the parent's onClick event when it is nested
418
+ // within a clickable list item
419
+ event.stopPropagation();
420
+ }
365
421
  function getPositionCssVars() {
366
422
  const { posX, posY } = getPosition();
367
423
  return {
@@ -372,10 +428,10 @@ function DataListActionsMenu({ visible = false, position, onRequestClose, childr
372
428
  function getPosition() {
373
429
  const rect = ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect();
374
430
  const { width = 0, height = 0 } = rect || {};
375
- const { x = 0, y = 0 } = position;
431
+ const { x, y } = position;
376
432
  const xIsOffScreen = x + width > window.innerWidth;
377
433
  const yIsOffScreen = y + height > window.innerHeight;
378
- const xOffSet = x + width - window.innerWidth + foundation.tokens["space-base"];
434
+ const xOffSet = x + width - window.innerWidth + design.tokens["space-base"];
379
435
  const yOffSet = y + height - window.innerHeight;
380
436
  const newPosX = Math.floor(xIsOffScreen ? x - xOffSet : x);
381
437
  const newPosY = Math.floor(yIsOffScreen ? y - yOffSet : y);
@@ -383,14 +439,19 @@ function DataListActionsMenu({ visible = false, position, onRequestClose, childr
383
439
  }
384
440
  }
385
441
 
386
- function DataListItemActionsOverflow({ item, actions, }) {
442
+ function DataListItemActionsOverflow({ actions, }) {
387
443
  const [menuPosition, setMenuPosition] = React.useState({ x: 0, y: 0 });
388
444
  const [showMenu, setShowMenu] = React.useState(false);
445
+ if (actions.length === 0)
446
+ return null;
389
447
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
390
448
  React__default["default"].createElement(Tooltip.Tooltip, { message: "More actions" },
391
449
  React__default["default"].createElement(Button.Button, { icon: "more", ariaLabel: "More actions", type: "secondary", variation: "subtle", onClick: handleMoreClick })),
392
- item && (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 }))))))));
450
+ React__default["default"].createElement(DataListActionsMenu, { visible: showMenu, position: menuPosition, onRequestClose: handleClose }, actions)));
393
451
  function handleMoreClick(event) {
452
+ // Prevent firing the parent's onClick event when it is nested
453
+ // within a clickable list item
454
+ event.stopPropagation();
394
455
  setShowMenu(true);
395
456
  const rect = event.currentTarget.getBoundingClientRect();
396
457
  const posX = rect.x;
@@ -402,6 +463,31 @@ function DataListItemActionsOverflow({ item, actions, }) {
402
463
  }
403
464
  }
404
465
 
466
+ function DataListActions({ children, itemsToExpose = 2, }) {
467
+ const { activeItem } = useDataListLayoutActionsContext();
468
+ const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
469
+ const exposedActions = getExposedActions(childrenArray, itemsToExpose);
470
+ childrenArray.splice(0, exposedActions.length);
471
+ return (React__default["default"].createElement(DataListOverflowFade, null,
472
+ exposedActions.map(({ props }) => {
473
+ if (props.visible && !props.visible(activeItem))
474
+ return null;
475
+ if (!props.icon)
476
+ return null;
477
+ return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
478
+ React__default["default"].createElement(Button.Button, { icon: props.icon, ariaLabel: props.label, onClick: () => {
479
+ var _a, _b;
480
+ if (activeItem) {
481
+ (_a = props.onClick) === null || _a === void 0 ? void 0 : _a.call(props, activeItem);
482
+ }
483
+ else {
484
+ (_b = props.onClick) === null || _b === void 0 ? void 0 : _b.call(props);
485
+ }
486
+ }, type: "secondary", variation: "subtle" })));
487
+ }),
488
+ React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray })));
489
+ }
490
+
405
491
  // This component is meant to capture the props of the DataList.ItemActions
406
492
  function DataListItemActions(
407
493
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -412,101 +498,119 @@ const variants = {
412
498
  hidden: { opacity: 0, y: 10 },
413
499
  visible: { opacity: 1, y: 0 },
414
500
  };
415
- function InternalDataListItemActions({ item, }) {
416
- const { itemActionComponent } = useDataListContext();
417
- if (!itemActionComponent)
418
- return null;
419
- const { children } = itemActionComponent.props;
420
- const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
421
- const exposedActions = getExposedActions(childrenArray);
422
- childrenArray.splice(0, exposedActions.length);
501
+ function InternalDataListItemActions({ actions, }) {
423
502
  return (React__default["default"].createElement(framerMotion.motion.div, { variants: variants, initial: "hidden", animate: "visible", exit: "hidden", transition: {
424
503
  duration: TRANSITION_DURATION_IN_SECONDS,
425
504
  delay: TRANSITION_DELAY_IN_SECONDS,
426
- }, className: styles$8.menu, onContextMenu: handleContextMenu },
427
- exposedActions.map(({ props }) => {
428
- if (!props.icon)
429
- return null;
430
- return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
431
- 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" })));
432
- }),
433
- React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray, item: item })));
505
+ }, className: styles$c.menu, onContextMenu: handleContextMenu },
506
+ React__default["default"].createElement(DataListActions, null, actions)));
434
507
  }
435
508
  function handleContextMenu(event) {
436
509
  event.stopPropagation();
437
510
  }
438
- function getExposedActions(childrenArray) {
439
- const firstTwoChildren = childrenArray.slice(0, 2);
440
- return firstTwoChildren.reduce((result, child, i) => {
441
- const hasIcon = Boolean(child.props.icon);
442
- const isFirstChild = i === 0;
443
- if (isFirstChild && hasIcon) {
444
- return [...result, child];
511
+
512
+ function DataListItemInternal({ children, item, }) {
513
+ const { selected, onSelect } = useDataListContext();
514
+ if (selected !== undefined && onSelect) {
515
+ return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$f.selectable, {
516
+ [styles$f.selected]: selected === null || selected === void 0 ? void 0 : selected.length,
517
+ }) },
518
+ children,
519
+ React__default["default"].createElement(Checkbox.Checkbox, { checked: selected === null || selected === void 0 ? void 0 : selected.includes(item.id), onChange: handleChange })));
520
+ }
521
+ return children;
522
+ function handleChange() {
523
+ if (selected === null || selected === void 0 ? void 0 : selected.includes(item.id)) {
524
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(selected === null || selected === void 0 ? void 0 : selected.filter(id => id !== item.id));
445
525
  }
446
- const isSecondChild = i === 1;
447
- const hasFirstChild = result.length === 1;
448
- if (isSecondChild && hasIcon && hasFirstChild) {
449
- return [...result, child];
526
+ else if (selected) {
527
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect([...selected, item.id]);
450
528
  }
451
- return result;
452
- }, []);
529
+ }
453
530
  }
454
531
 
455
- const defaultValues = {
456
- isInLayoutProvider: false,
457
- hasInLayoutActions: false,
458
- setHasInLayoutActions: noop__default["default"],
459
- };
460
- const DataListLayoutContext = React.createContext(defaultValues);
461
- function useDataListLayoutContext() {
462
- return React.useContext(DataListLayoutContext);
532
+ function DataListItemClickableInternal({ onClick, url, to, children, }) {
533
+ const { activeItem } = useDataListLayoutActionsContext();
534
+ if (!activeItem)
535
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
536
+ if (to) {
537
+ const computedTo = typeof to === "string" ? to : to(activeItem);
538
+ return (React__default["default"].createElement(reactRouterDom.Link, { className: styles$f.listItemClickable, to: computedTo, onClick: handleClick }, children));
539
+ }
540
+ if (url) {
541
+ const href = typeof url === "string" ? url : url(activeItem);
542
+ return (React__default["default"].createElement("a", { className: styles$f.listItemClickable, href: href, onClick: handleClick }, children));
543
+ }
544
+ if (onClick) {
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$f.listItemClickable, onClick: handleClick, onKeyDown: e => {
549
+ if (e.key === "Enter" || e.key === " ") {
550
+ e.preventDefault();
551
+ handleClick();
552
+ }
553
+ } }, children));
554
+ }
555
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
556
+ function handleClick() {
557
+ activeItem && (onClick === null || onClick === void 0 ? void 0 : onClick(activeItem));
558
+ }
463
559
  }
464
560
 
465
- function DataListItems({ layouts, mediaMatches, data, }) {
561
+ function DataListItemClickable({ children }) {
466
562
  const { itemActionComponent } = useDataListContext();
467
- const elementData = React.useMemo(() => generateListItemElements(data), [data]);
468
- const [hasInLayoutActions, setHasInLayoutActions] = React.useState(false);
469
- const [activeID, setActiveID] = React.useState();
470
- const [activeItem, setActiveItem] = React.useState();
563
+ if (itemActionComponent) {
564
+ const props = itemActionComponent.props;
565
+ return (React__default["default"].createElement(DataListItemClickableInternal, Object.assign({}, props), children));
566
+ }
567
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
568
+ }
569
+
570
+ function useGetItemActions(item) {
571
+ const { itemActionComponent } = useDataListContext();
572
+ const itemActions = (itemActionComponent === null || itemActionComponent === void 0 ? void 0 : itemActionComponent.props.children) || [];
573
+ const actionsArray = React.Children.toArray(itemActions);
574
+ const actions = React.useMemo(() => {
575
+ return actionsArray.filter(action => {
576
+ if (React.isValidElement(action) && action.props.visible) {
577
+ return action.props.visible(item);
578
+ }
579
+ return true;
580
+ });
581
+ }, [itemActionComponent === null || itemActionComponent === void 0 ? void 0 : itemActionComponent.props.children, item]);
582
+ return {
583
+ actions: actions,
584
+ hasActions: Boolean(actions.length),
585
+ };
586
+ }
587
+
588
+ // eslint-disable-next-line max-statements
589
+ function DataListItem({ item, layout, }) {
590
+ const { hasInLayoutActions } = useDataListLayoutContext();
591
+ const [showMenu, setShowMenu] = React.useState(false);
471
592
  const [contextPosition, setContextPosition] = React.useState();
472
- const contextMenuActions = itemActionComponent === null || itemActionComponent === void 0 ? void 0 : itemActionComponent.props.children;
593
+ const generatedItem = React.useMemo(() => generateListItemElement(item), [item]);
594
+ const { actions, hasActions } = useGetItemActions(item);
473
595
  const isContextMenuVisible = Boolean(contextPosition);
474
- return (React__default["default"].createElement(DataListLayoutContext.Provider, { value: {
475
- isInLayoutProvider: true,
476
- hasInLayoutActions,
477
- setHasInLayoutActions,
478
- activeItem,
479
- } },
480
- React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement(React__default["default"].Fragment, null, elementData.map((child, i) => {
481
- const item = data[i];
482
- const isActive = activeID === item.id;
483
- const shouldShowContextMenu = isActive && isContextMenuVisible && Boolean(contextMenuActions);
484
- return (React__default["default"].createElement("div", {
485
- // Set the active item whenever the element or any of its
486
- // children are clicked
487
- onClick: handleSetActiveItem(item), onMouseEnter: handleSetActiveItem(item), onMouseLeave: handleUnsetActiveItem, onContextMenu: handleContextMenu, className: classnames__default["default"](styles$e.listItem, {
488
- [styles$e.active]: isActive && isContextMenuVisible,
489
- }), key: item.id },
490
- React__default["default"].createElement(DataListItemInternal, { item: data[i] }, layout.props.children(child)),
491
- React__default["default"].createElement(framerMotion.AnimatePresence, null,
492
- activeID === item.id && !hasInLayoutActions && (React__default["default"].createElement(InternalDataListItemActions, { item: item })),
493
- React__default["default"].createElement(DataListActionsMenu, { key: item.id, visible: shouldShowContextMenu, position: contextPosition || { x: 0, y: 0 }, onRequestClose: () => setContextPosition(undefined) }, contextMenuActions &&
494
- React.Children.map(contextMenuActions, action => (React__default["default"].createElement(InternalDataListAction, Object.assign({ key: item.id }, action.props, { item: item }))))))));
495
- }))) })));
496
- function handleSetActiveItem(item) {
497
- return () => {
498
- setActiveID(item.id);
499
- setActiveItem(item);
500
- };
596
+ const shouldShowContextMenu = showMenu && isContextMenuVisible && hasActions;
597
+ return (React__default["default"].createElement(DataListLayoutActionsContext.Provider, { value: { activeItem: item } },
598
+ React__default["default"].createElement("div", { onMouseEnter: handleShowMenu, onMouseLeave: handleHideMenu, onFocus: handleShowMenu, onBlur: handleHideMenu, onContextMenu: handleContextMenu, className: classnames__default["default"](styles$f.listItem, {
599
+ [styles$f.active]: showMenu && isContextMenuVisible,
600
+ }), key: item.id },
601
+ React__default["default"].createElement(DataListItemInternal, { item: item },
602
+ React__default["default"].createElement(DataListItemClickable, null, layout(generatedItem))),
603
+ React__default["default"].createElement(framerMotion.AnimatePresence, null,
604
+ showMenu && hasActions && !hasInLayoutActions && (React__default["default"].createElement(InternalDataListItemActions, { actions: actions })),
605
+ React__default["default"].createElement(DataListActionsMenu, { key: item.id, visible: shouldShowContextMenu, position: contextPosition || { x: 0, y: 0 }, onRequestClose: () => setContextPosition(undefined) }, actions)))));
606
+ function handleShowMenu() {
607
+ setShowMenu(true);
501
608
  }
502
- function handleUnsetActiveItem() {
503
- if (isContextMenuVisible)
504
- return;
505
- setActiveID(undefined);
506
- setActiveItem(undefined);
609
+ function handleHideMenu() {
610
+ setShowMenu(false);
507
611
  }
508
612
  function handleContextMenu(event) {
509
- if (!contextMenuActions || isContextMenuVisible)
613
+ if (!hasActions || isContextMenuVisible)
510
614
  return;
511
615
  event.preventDefault();
512
616
  setContextPosition({
@@ -516,21 +620,80 @@ function DataListItems({ layouts, mediaMatches, data, }) {
516
620
  }
517
621
  }
518
622
 
623
+ function DataListItems({ size = "xs", }) {
624
+ const { data, layouts } = useDataListContext();
625
+ const [hasInLayoutActions, setHasInLayoutActions] = React.useState(false);
626
+ const layout = layouts[size];
627
+ if (!layout)
628
+ return null;
629
+ return (React__default["default"].createElement(DataListLayoutContext.Provider, { value: {
630
+ isInLayoutProvider: true,
631
+ hasInLayoutActions,
632
+ setHasInLayoutActions,
633
+ } }, data.map((child, i) => (React__default["default"].createElement(DataListItem, { key: data[i].id, index: i, item: child, layout: layout })))));
634
+ }
635
+
636
+ function DataListLayout({ children, size = "xs", }) {
637
+ const { layoutBreakpoints, registerLayout, registerLayoutBreakpoints, loadingState, } = useDataListContext();
638
+ const breakpoints = useResponsiveSizing();
639
+ React.useEffect(() => {
640
+ registerLayoutBreakpoints(size);
641
+ }, [size]);
642
+ React.useEffect(() => {
643
+ registerLayout(size, children);
644
+ }, [size, children]);
645
+ const sizeIndex = layoutBreakpoints.indexOf(size);
646
+ const nextAvailableSize = layoutBreakpoints[sizeIndex + 1];
647
+ const shouldRenderList = breakpoints[size] && !breakpoints[nextAvailableSize];
648
+ if (loadingState !== "initial" && shouldRenderList) {
649
+ return React__default["default"].createElement(DataListItems, { size: size });
650
+ }
651
+ return null;
652
+ }
653
+
654
+ var css_248z$6 = ".v-GrdlFpBLk- {\n /* Offset the button's padding so the height of the header bar doesn't change */\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n}\n";
655
+ var styles$6 = {"bulkActions":"v-GrdlFpBLk-"};
656
+ styleInject_es.styleInject(css_248z$6);
657
+
658
+ // This component is meant to capture the props of the DataList.BulkActions
659
+ function DataListBulkActions(
660
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
661
+ _) {
662
+ return null;
663
+ }
664
+ function InternalDataListBulkActions() {
665
+ const { bulkActionsComponent } = useDataListContext();
666
+ if (!bulkActionsComponent)
667
+ return null;
668
+ const { children } = bulkActionsComponent.props;
669
+ const { sm } = useResponsiveSizing();
670
+ // Collapse all actions under "More actions" when breakpoint is smaller than sm
671
+ const itemsToExpose = sm ? 3 : 0;
672
+ return (React__default["default"].createElement("div", { className: styles$6.bulkActions },
673
+ React__default["default"].createElement(DataListActions, { itemsToExpose: itemsToExpose }, children)));
674
+ }
675
+
519
676
  function DataListHeaderCheckbox({ children }) {
520
677
  const { data, totalCount, selected = [], onSelectAll, onSelect, } = useDataListContext();
521
678
  if (!onSelectAll && !onSelect)
522
679
  return children;
523
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$e.selectable) },
524
- React__default["default"].createElement("div", { className: classnames__default["default"](styles$e.selectAllCheckbox, {
525
- [styles$e.visible]: Boolean(onSelectAll),
680
+ const { sm } = useResponsiveSizing();
681
+ // Show "Deselect All" if breakpoint is sm or higher
682
+ const deselectText = sm ? "Deselect All" : "Deselect";
683
+ const selectedLabel = selected.length ? `${selected.length} selected` : "";
684
+ return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$f.selectable) },
685
+ React__default["default"].createElement("div", { className: classnames__default["default"](styles$f.selectAllCheckbox, {
686
+ [styles$f.visible]: Boolean(onSelectAll),
526
687
  }) },
527
- React__default["default"].createElement(Checkbox.Checkbox, { checked: isAllSelected(), indeterminate: selected.length > 0 && !isAllSelected(), onChange: onSelectAll })),
528
- React__default["default"].createElement(AnimatedSwitcher.AnimatedSwitcher, { switched: Boolean(selected.length), initialChild: children, switchTo: React__default["default"].createElement("div", { className: styles$e.headerBatchSelect },
529
- React__default["default"].createElement(Text.Text, null,
530
- React__default["default"].createElement("b", null,
688
+ React__default["default"].createElement(Checkbox.Checkbox, { checked: isAllSelected(), indeterminate: selected.length > 0 && !isAllSelected(), onChange: onSelectAll },
689
+ React__default["default"].createElement("div", { className: styles$f.srOnly }, selectedLabel))),
690
+ React__default["default"].createElement(AnimatedSwitcher.AnimatedSwitcher, { switched: Boolean(selected.length), initialChild: children, switchTo: React__default["default"].createElement("div", { className: styles$f.batchSelectContainer },
691
+ React__default["default"].createElement("div", { className: styles$f.headerBatchSelect },
692
+ React__default["default"].createElement(Text.Text, null,
531
693
  selected.length,
532
- " selected")),
533
- React__default["default"].createElement(Button.Button, { label: "Deselect All", onClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect([]), type: "tertiary" })) })));
694
+ " selected"),
695
+ React__default["default"].createElement(Button.Button, { label: deselectText, onClick: () => onSelect === null || onSelect === void 0 ? void 0 : onSelect([]), type: "tertiary" })),
696
+ React__default["default"].createElement(InternalDataListBulkActions, null)) })));
534
697
  function isAllSelected() {
535
698
  // If there's a totalCount, we can use that to accurately determine if the
536
699
  // user have "selected all".
@@ -545,112 +708,62 @@ function DataListHeaderCheckbox({ children }) {
545
708
  }
546
709
  }
547
710
 
548
- function useMediaQuery(CSSMediaQuery) {
549
- const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
550
- React.useEffect(() => {
551
- const media = window.matchMedia(CSSMediaQuery);
552
- if (media.matches !== matches) {
553
- setMatches(media.matches);
554
- }
555
- const listener = () => setMatches(media.matches);
556
- media.addEventListener("change", listener);
557
- return () => media.removeEventListener("change", listener);
558
- }, [CSSMediaQuery]);
559
- return matches;
560
- }
561
-
562
- function useResponsiveSizing() {
563
- const xs = useMediaQuery(`(width > ${BREAKPOINT_SIZES.xs}px)`);
564
- const sm = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.sm}px)`);
565
- const md = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.md}px)`);
566
- const lg = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.lg}px)`);
567
- const xl = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.xl}px)`);
568
- return { xs, sm, md, lg, xl };
569
- }
570
-
571
- function useShowHeader() {
572
- const { headerVisibility } = useDataListContext();
573
- if (headerVisibility === undefined)
574
- return true;
575
- const sizes = useResponsiveSizing();
576
- const sizeKeys = Object.keys(sizes);
577
- const showHeader = sizeKeys.reduce((previous, breakpoint) => {
578
- const isHeaderVisible = headerVisibility[breakpoint] || false;
579
- const isBreakpointTriggered = sizes[breakpoint];
580
- return previous || (isBreakpointTriggered && isHeaderVisible);
581
- }, false);
582
- return showHeader;
583
- }
584
-
585
- function DataListHeader({ layouts, mediaMatches, headerData, }) {
586
- const showHeader = useShowHeader();
587
- if (!showHeader || !headerData)
711
+ function DataListHeader() {
712
+ const breakpoints = useResponsiveSizing();
713
+ const { headerVisibility = { xs: true, sm: true, md: true, lg: true, xl: true }, headers, selected, layoutBreakpoints, } = useDataListContext();
714
+ const size = getVisibleSize();
715
+ const { layout } = useActiveLayout();
716
+ const visible = headerVisibility[size];
717
+ const noItemsSelected = (selected === null || selected === void 0 ? void 0 : selected.length) === 0;
718
+ if ((!visible && noItemsSelected) || !layout)
588
719
  return null;
589
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement("div", { className: classnames__default["default"](styles$e.headerTitles) },
590
- React__default["default"].createElement(DataListHeaderCheckbox, null, layout.props.children(headerData)))) }));
591
- }
592
-
593
- const LOADING_STATE_LIMIT_ITEMS = 10;
594
- const DATALIST_LOADINGSTATE_ROW_TEST_ID = "ATL-DataList-LoadingState-Row";
595
- function DataListLoadingState({ headers, layouts, mediaMatches, }) {
596
- const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(headers);
597
- const loadingElements = loadingData.map(item => Object.keys(item).reduce((acc, key) => {
598
- acc[key] = React__default["default"].createElement(Glimmer.Glimmer, null);
599
- return acc;
600
- }, {}));
601
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => {
602
- if (layout.props.size === "xs") {
603
- return React__default["default"].createElement(LoadingStateXSBreakpoint, null);
604
- }
605
- 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))))));
606
- } }));
607
- }
608
- function LoadingStateXSBreakpoint() {
609
- const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(0);
610
- return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingData.map((_, i) => {
611
- return (React__default["default"].createElement("div", { className: styles$c.mobileLoadingState, key: i },
612
- React__default["default"].createElement(Glimmer.Glimmer.Text, null)));
613
- })));
614
- }
615
-
616
- function DataListLayout(
617
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
618
- _) {
619
- return React__default["default"].createElement(React__default["default"].Fragment, null);
720
+ const headerData = generateHeaderElements(headers);
721
+ if (!headerData)
722
+ return null;
723
+ return (React__default["default"].createElement("div", { className: styles$f.headerTitles },
724
+ React__default["default"].createElement(DataListHeaderCheckbox, null, layout(headerData))));
725
+ function getVisibleSize() {
726
+ const visibilityKeys = Object.keys(headerVisibility);
727
+ const headerBreakpoints = sortBreakpoints(visibilityKeys).reverse();
728
+ const visibleHeaderSize = headerBreakpoints.find(key => breakpoints[key]);
729
+ return visibleHeaderSize || layoutBreakpoints[0];
730
+ }
620
731
  }
621
732
 
622
- var css_248z$5 = ".E-mG3prPSN8- {\n -ms-flex-item-align: center;\n align-self: center;\n position: relative;\n min-width: 0;\n}\n\n._0LGNoZxtqSE- {\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._0LGNoZxtqSE- > :nth-child(n + 3):not(:last-child) {\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n\n.LA3-gtgehrE- {\n visibility: hidden;\n}\n\n.fSPvawYWzZ8-::before,\n.ChfEJMPPVTk-::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-filters-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.fSPvawYWzZ8-::before {\n left: 0;\n}\n\n.ChfEJMPPVTk-::after {\n --data-list-filters-overflow-shadow-angle: to left;\n right: 0;\n}\n";
623
- var styles$5 = {"filters":"E-mG3prPSN8-","filterActions":"_0LGNoZxtqSE-","overflowTrigger":"LA3-gtgehrE-","overflowLeft":"fSPvawYWzZ8-","overflowRight":"ChfEJMPPVTk-"};
624
- styleInject_es.styleInject(css_248z$5);
625
-
626
- const CONTAINER_TEST_ID = "ATL-DataListFilters-Container";
627
-
628
733
  function DataListSort() {
629
734
  const { sorting, headers } = useDataListContext();
630
- const divRef = React.useRef(null);
631
- const [showPopover, setShowPopover] = React.useState(false);
632
735
  if (!sorting)
633
736
  return null;
634
737
  const { sortable, state, onSort } = sorting;
635
738
  const sortByOptions = getSortByOptions();
636
- const canChangeOrder = !(state === null || state === void 0 ? void 0 : state.key);
637
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
638
- React__default["default"].createElement("span", { ref: divRef },
639
- React__default["default"].createElement(Button.Button, Object.assign({}, (!state && { icon: "add", iconOnRight: true }), { label: getButtonLabel(), variation: "subtle", onClick: () => setShowPopover(!showPopover) }))),
640
- React__default["default"].createElement(Popover.Popover, { attachTo: divRef, open: showPopover, onRequestClose: () => setShowPopover(false) },
641
- React__default["default"].createElement(Content.Content, null,
642
- React__default["default"].createElement(Heading.Heading, { level: 5 }, "Sort by"),
643
- React__default["default"].createElement(Chip.Chips, { selected: (state === null || state === void 0 ? void 0 : state.key) || "none", onChange: handleKeyChange }, sortByOptions.map(({ label, value }) => (React__default["default"].createElement(Chip.Chip, { key: label, label: label, value: value })))),
644
- React__default["default"].createElement(Heading.Heading, { level: 5 }, "Ordered by"),
645
- React__default["default"].createElement(Chip.Chips, { selected: state === null || state === void 0 ? void 0 : state.order, onChange: handleSortingChange },
646
- React__default["default"].createElement(Chip.Chip, { label: "Ascending", value: "asc", disabled: canChangeOrder }),
647
- React__default["default"].createElement(Chip.Chip, { label: "Descending", value: "desc", disabled: canChangeOrder }))))));
739
+ console.log({ state });
740
+ return (React__default["default"].createElement(Combobox.Combobox, { onSelect: selection => {
741
+ handleKeyChange(selection[0].id.toString());
742
+ }, selected: [
743
+ {
744
+ id: `${state === null || state === void 0 ? void 0 : state.key},${state === null || state === void 0 ? void 0 : state.order}`,
745
+ label: (state === null || state === void 0 ? void 0 : state.order) || "",
746
+ },
747
+ ] },
748
+ React__default["default"].createElement(Combobox.Combobox.Activator, null,
749
+ React__default["default"].createElement(Chip.Chip, { heading: "Sort", label: getButtonLabel(), variation: state ? "base" : "subtle" }, !state && (React__default["default"].createElement(Chip.Chip.Suffix, null,
750
+ React__default["default"].createElement(Icon.Icon, { name: "arrowDown", size: "small" }))))),
751
+ sortByOptions.map(({ label, value }) => {
752
+ return React__default["default"].createElement(Combobox.Combobox.Option, { key: value, id: value, label: label });
753
+ })));
648
754
  function getSortByOptions() {
649
755
  const options = sortable.reduce((acc, sort) => {
650
756
  const label = headers[sort];
651
757
  if (!label)
652
758
  return acc;
653
- acc.push({ label, value: sort.toString() });
759
+ if (label === "Last activity") {
760
+ acc.push({ label: "Last Activity (Newest)", value: `${sort},desc` });
761
+ acc.push({ label: "Last Activity (Oldest)", value: `${sort},asc` });
762
+ }
763
+ else {
764
+ acc.push({ label: `${label} (A-Z)`, value: `${sort},asc` });
765
+ acc.push({ label: `${label} (Z-A)`, value: `${sort},desc` });
766
+ }
654
767
  return acc;
655
768
  }, []);
656
769
  // Inject a none option as the first option
@@ -658,24 +771,31 @@ function DataListSort() {
658
771
  return options;
659
772
  }
660
773
  function getButtonLabel() {
661
- const label = state && headers[state.key];
662
- if (!label)
663
- return "Sort by";
664
- return `Sort by: ${label}, ${state.order}`;
774
+ const selectedOption = sortByOptions.find(option => option.value === `${state === null || state === void 0 ? void 0 : state.key},${state === null || state === void 0 ? void 0 : state.order}`);
775
+ return (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) || "";
665
776
  }
666
777
  function handleKeyChange(value) {
667
778
  if (value && value !== "none") {
668
- onSort({ key: value, order: (state === null || state === void 0 ? void 0 : state.order) || "asc" });
779
+ const [key, order] = value.split(",");
780
+ onSort({ key, order: order });
669
781
  return;
670
782
  }
671
783
  onSort(undefined);
672
784
  }
673
- function handleSortingChange(value) {
674
- if ((state === null || state === void 0 ? void 0 : state.key) && value) {
675
- onSort({ key: state.key, order: value });
676
- return;
677
- }
678
- }
785
+ }
786
+
787
+ function useShowHeader() {
788
+ const { headerVisibility } = useDataListContext();
789
+ if (headerVisibility === undefined)
790
+ return true;
791
+ const sizes = useResponsiveSizing();
792
+ const sizeKeys = Object.keys(sizes);
793
+ const showHeader = sizeKeys.reduce((previous, breakpoint) => {
794
+ const isHeaderVisible = headerVisibility[breakpoint] || false;
795
+ const isBreakpointTriggered = sizes[breakpoint];
796
+ return previous || (isBreakpointTriggered && isHeaderVisible);
797
+ }, false);
798
+ return showHeader;
679
799
  }
680
800
 
681
801
  // This component is meant to capture the props of the DataList.Filters
@@ -691,25 +811,17 @@ function InternalDataListFilters() {
691
811
  const showHeader = useShowHeader();
692
812
  const showSortButton = !showHeader;
693
813
  const component = getCompoundComponent(parentChildren, DataListFilters);
694
- const [leftRef, isLeftVisible] = useInView.useInView();
695
- const [rightRef, isRightVisible] = useInView.useInView();
696
814
  if (!showSortButton && !component)
697
815
  return null;
698
816
  const children = component === null || component === void 0 ? void 0 : component.props.children;
699
- return (React__default["default"].createElement("div", { "data-testid": CONTAINER_TEST_ID, className: classnames__default["default"](styles$5.filters, {
700
- [styles$5.overflowLeft]: !isLeftVisible,
701
- [styles$5.overflowRight]: !isRightVisible,
702
- }) },
703
- React__default["default"].createElement("div", { className: styles$5.filterActions },
704
- React__default["default"].createElement("span", { ref: leftRef, className: styles$5.overflowTrigger }),
705
- children && children,
706
- showSortButton && React__default["default"].createElement(DataListSort, null),
707
- React__default["default"].createElement("span", { ref: rightRef, className: styles$5.overflowTrigger }))));
817
+ return (React__default["default"].createElement(DataListOverflowFade, null,
818
+ children && children,
819
+ showSortButton && React__default["default"].createElement(DataListSort, null)));
708
820
  }
709
821
 
710
- 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";
711
- var styles$4 = {"header":"PGOHzrMh374-","stuck":"PGjWc5ocjpI-"};
712
- styleInject_es.styleInject(css_248z$4);
822
+ 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(217, 223, 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";
823
+ var styles$5 = {"header":"PGOHzrMh374-","stuck":"PGjWc5ocjpI-"};
824
+ styleInject_es.styleInject(css_248z$5);
713
825
 
714
826
  function DataListStickyHeader({ children }) {
715
827
  const [isStuck, setIsStuck] = React.useState(false);
@@ -724,12 +836,12 @@ function DataListStickyHeader({ children }) {
724
836
  ref.current && observer.unobserve(ref.current);
725
837
  };
726
838
  }, [handleObserver, ref.current]);
727
- return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$4.header, { [styles$4.stuck]: isStuck }) }, children));
839
+ return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
728
840
  }
729
841
 
730
- 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";
731
- var styles$3 = {"searchInput":"SaPMOnvw-3c-","searchInputVisible":"_3S1-91v2SYI-","searchButton":"_9GlBktsUALw-","withNoFilters":"_3Pjrt42x454-"};
732
- styleInject_es.styleInject(css_248z$3);
842
+ 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";
843
+ var styles$4 = {"searchInput":"SaPMOnvw-3c-","searchInputVisible":"_3S1-91v2SYI-","searchButton":"_9GlBktsUALw-","withNoFilters":"_3Pjrt42x454-"};
844
+ styleInject_es.styleInject(css_248z$4);
733
845
 
734
846
  const DATA_LIST_SEARCH_TEST_ID = "ATL-DataList-Search-input-wrapper";
735
847
  // This component is meant to capture the props of the DataList.Search
@@ -738,7 +850,7 @@ function DataListSearch(_) {
738
850
  return null;
739
851
  }
740
852
  /**
741
- * Renders the DataList.Search component
853
+ * Renders the DataList.Search component.
742
854
  */
743
855
  function InternalDataListSearch() {
744
856
  const inputRef = React.useRef(null);
@@ -747,15 +859,19 @@ function InternalDataListSearch() {
747
859
  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]);
748
860
  if (!searchComponent)
749
861
  return null;
750
- const { placeholder } = searchComponent.props;
862
+ const { placeholder, initialValue } = searchComponent.props;
751
863
  return (React__default["default"].createElement("div", { className: classnames__default["default"]({
752
- [styles$3.withNoFilters]: !filterComponent && !sorting,
864
+ [styles$4.withNoFilters]: !filterComponent && !sorting,
753
865
  }) },
754
- React__default["default"].createElement("div", { "data-testid": DATA_LIST_SEARCH_TEST_ID, className: classnames__default["default"](styles$3.searchInput, {
755
- [styles$3.searchInputVisible]: visible,
866
+ React__default["default"].createElement("div", { "data-testid": DATA_LIST_SEARCH_TEST_ID, className: classnames__default["default"](styles$4.searchInput, {
867
+ [styles$4.searchInputVisible]: visible,
756
868
  }) },
757
- React__default["default"].createElement(InputText.InputText, { ref: inputRef, placeholder: getPlaceholder(), onChange: debouncedSearch, prefix: { icon: "search" }, size: "small" })),
758
- React__default["default"].createElement("div", { className: styles$3.searchButton },
869
+ React__default["default"].createElement(InputText.InputText
870
+ // If the initial value changes, reset the input.
871
+ , {
872
+ // If the initial value changes, reset the input.
873
+ key: initialValue, defaultValue: initialValue, ref: inputRef, placeholder: getPlaceholder(), onChange: debouncedSearch, prefix: { icon: "search" }, size: "small" })),
874
+ React__default["default"].createElement("div", { className: styles$4.searchButton },
759
875
  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 }) }))));
760
876
  function getPlaceholder() {
761
877
  if (placeholder)
@@ -773,9 +889,9 @@ function InternalDataListSearch() {
773
889
  }
774
890
  }
775
891
 
776
- 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";
777
- var styles$2 = {"emptyStateWrapper":"zg3w9nQga-M-"};
778
- styleInject_es.styleInject(css_248z$2);
892
+ 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";
893
+ var styles$3 = {"emptyStateWrapper":"zg3w9nQga-M-"};
894
+ styleInject_es.styleInject(css_248z$3);
779
895
 
780
896
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
781
897
  function DataListEmptyState(_) {
@@ -784,7 +900,7 @@ function DataListEmptyState(_) {
784
900
  function InternalDataListEmptyState() {
785
901
  const { emptyStateComponents: components, filtered } = React.useContext(DataListContext);
786
902
  const { message, action } = getMessages();
787
- return (React__default["default"].createElement("div", { className: styles$2.emptyStateWrapper },
903
+ return (React__default["default"].createElement("div", { className: styles$3.emptyStateWrapper },
788
904
  React__default["default"].createElement(Text.Text, { align: "center" }, message),
789
905
  renderButton(action)));
790
906
  function getMessages() {
@@ -818,9 +934,9 @@ function getEmptyStates(components) {
818
934
  return { defaultEmptyState, filteredEmptyState };
819
935
  }
820
936
 
821
- 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";
822
- var styles$1 = {"trigger":"IC-Y9bTIVFo-","loadingMore":"PbZLGpbI6ZM-","backToTop":"_6zA6B-jmz6o-","fadeIn":"gZ4DUv82g5I-"};
823
- styleInject_es.styleInject(css_248z$1);
937
+ 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";
938
+ var styles$2 = {"trigger":"IC-Y9bTIVFo-","loadingMore":"PbZLGpbI6ZM-","backToTop":"_6zA6B-jmz6o-","fadeIn":"gZ4DUv82g5I-"};
939
+ styleInject_es.styleInject(css_248z$2);
824
940
 
825
941
  function DataListLoadMoreTrigger() {
826
942
  const { onLoadMore } = useDataListContext();
@@ -828,7 +944,7 @@ function DataListLoadMoreTrigger() {
828
944
  React.useEffect(() => {
829
945
  isInView && (onLoadMore === null || onLoadMore === void 0 ? void 0 : onLoadMore());
830
946
  }, [isInView]);
831
- return (React__default["default"].createElement("div", { ref: inViewRef, className: styles$1.trigger, "data-testid": DATA_LOAD_MORE_TEST_ID }));
947
+ return (React__default["default"].createElement("div", { ref: inViewRef, className: styles$2.trigger, "data-testid": DATA_LOAD_MORE_TEST_ID }));
832
948
  }
833
949
 
834
950
  const MAX_DATA_COUNT = 50;
@@ -837,19 +953,44 @@ function DataListLoadMore({ onBackToTop }) {
837
953
  const showBackToTop = data.length > MAX_DATA_COUNT && loadingState !== "loadingMore";
838
954
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
839
955
  React__default["default"].createElement(DataListLoadMoreTrigger, { key: data.length }),
840
- loadingState === "loadingMore" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_LOADING_MORE_SPINNER_TEST_ID, className: styles$1.loadingMore },
956
+ loadingState === "loadingMore" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_LOADING_MORE_SPINNER_TEST_ID, className: styles$2.loadingMore },
841
957
  React__default["default"].createElement(Spinner.Spinner, { size: "small" }))),
842
- showBackToTop && (React__default["default"].createElement("div", { className: styles$1.backToTop },
958
+ showBackToTop && (React__default["default"].createElement("div", { className: styles$2.backToTop },
843
959
  React__default["default"].createElement(Button.Button, { label: "Back to top", onClick: onBackToTop, size: "small", variation: "subtle" })))));
844
960
  }
845
961
 
962
+ 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(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n.AUJNqz93ZDA- {\n font-weight: 500;\n}\n";
963
+ var styles$1 = {"action":"iyg43v-S9yU-","label":"AUJNqz93ZDA-"};
964
+ styleInject_es.styleInject(css_248z$1);
965
+
966
+ function DataListAction({ label, icon, destructive, visible = () => true, onClick, }) {
967
+ const { activeItem } = useDataListLayoutActionsContext();
968
+ // Don't render if the item is not visible
969
+ if (activeItem && !visible(activeItem)) {
970
+ return null;
971
+ }
972
+ const color = destructive ? "critical" : "blue";
973
+ return (React__default["default"].createElement("button", { type: "button", className: styles$1.action, onClick: handleClick },
974
+ icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color }),
975
+ React__default["default"].createElement(Typography.Typography, { textColor: color },
976
+ React__default["default"].createElement("span", { className: styles$1.label }, label))));
977
+ function handleClick() {
978
+ if (activeItem) {
979
+ onClick === null || onClick === void 0 ? void 0 : onClick(activeItem);
980
+ }
981
+ else {
982
+ onClick === null || onClick === void 0 ? void 0 : onClick();
983
+ }
984
+ }
985
+ }
986
+
846
987
  var css_248z = "._0m75bgCVBhk- {\n visibility: hidden;\n}\n";
847
988
  var styles = {"hidden":"_0m75bgCVBhk-"};
848
989
  styleInject_es.styleInject(css_248z);
849
990
 
850
991
  function DataListLayoutActions() {
851
- const { itemActionComponent } = useDataListContext();
852
- const { setHasInLayoutActions, activeItem } = useDataListLayoutContext();
992
+ const { itemActionComponent, loadingState } = useDataListContext();
993
+ const { setHasInLayoutActions } = useDataListLayoutContext();
853
994
  const { children: actionsChildren } = (itemActionComponent === null || itemActionComponent === void 0 ? void 0 : itemActionComponent.props) || {};
854
995
  const actions = React.Children.toArray(actionsChildren);
855
996
  const hasActions = actions.length > 0;
@@ -859,10 +1000,13 @@ function DataListLayoutActions() {
859
1000
  setHasInLayoutActions(false);
860
1001
  };
861
1002
  }, []);
1003
+ if (loadingState === "initial") {
1004
+ return React__default["default"].createElement(Glimmer.Glimmer, { shape: "square", size: "large" });
1005
+ }
862
1006
  if (!hasActions)
863
1007
  return null;
864
1008
  return (React__default["default"].createElement(DataListLayoutActionsWrapper, null,
865
- React__default["default"].createElement(DataListItemActionsOverflow, { actions: actions, item: activeItem })));
1009
+ React__default["default"].createElement(DataListItemActionsOverflow, { actions: actions })));
866
1010
  }
867
1011
  function DataListLayoutActionsWrapper({ children }) {
868
1012
  const { isInLayoutProvider } = useDataListLayoutContext();
@@ -871,71 +1015,75 @@ function DataListLayoutActionsWrapper({ children }) {
871
1015
  return React__default["default"].createElement("div", { className: styles.hidden }, children);
872
1016
  }
873
1017
 
874
- function useLayoutMediaQueries() {
875
- const mediaQueries = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: window.matchMedia(breakpointToMediaQuery(breakpoint)) })), {});
876
- const initialMatches = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: mediaQueries[breakpoint].matches })), {});
877
- const [matches, setMatches] = React.useState(initialMatches);
878
- const handlers = BREAKPOINTS.reduce((previous, breakpoint) => {
879
- const handler = (e) => setMatches(previousMatches => (Object.assign(Object.assign({}, previousMatches), { [breakpoint]: e.matches })));
880
- return Object.assign(Object.assign({}, previous), { [breakpoint]: handler });
881
- }, {});
882
- // Set up mediaQuery event handlers
883
- React.useEffect(() => {
884
- BREAKPOINTS.forEach(breakpoint => {
885
- mediaQueries[breakpoint].addEventListener("change", handlers[breakpoint]);
886
- });
887
- return () => {
888
- BREAKPOINTS.forEach(breakpoint => {
889
- mediaQueries[breakpoint].removeEventListener("change", handlers[breakpoint]);
890
- });
891
- };
892
- }, [mediaQueries]);
893
- return matches;
1018
+ // This component is meant to capture the props of the DataList.Filters
1019
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
1020
+ function DataListStatusBar(_) {
1021
+ return null;
894
1022
  }
895
- function breakpointToMediaQuery(breakpoint) {
896
- return `(min-width: ${BREAKPOINT_SIZES[breakpoint]}px)`;
1023
+ /**
1024
+ * Renders the DataList.StatusBar component
1025
+ */
1026
+ function InternalDataListStatusBar() {
1027
+ const { children: parentChildren } = useDataListContext();
1028
+ const component = getCompoundComponent(parentChildren, DataListStatusBar);
1029
+ if (!component)
1030
+ return null;
1031
+ const children = component === null || component === void 0 ? void 0 : component.props.children;
1032
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
897
1033
  }
898
1034
 
899
1035
  function DataList(_a) {
900
- var _b;
901
- var { sorting } = _a, props = tslib_es6.__rest(_a, ["sorting"]);
1036
+ var { selected = [], sorting } = _a, props = tslib_es6.__rest(_a, ["selected", "sorting"]);
1037
+ const [layoutBreakpoints, setLayoutBreakpoints] = React.useState([]);
1038
+ const [layouts, setLayouts] = React.useState({});
902
1039
  const searchComponent = getCompoundComponent(props.children, DataListSearch);
903
1040
  const filterComponent = getCompoundComponent(props.children, DataListFilters);
904
1041
  const layoutComponents = getCompoundComponents(props.children, DataListLayout);
905
1042
  const emptyStateComponents = getCompoundComponents(props.children, DataListEmptyState);
906
1043
  const itemActionComponent = getCompoundComponent(props.children, DataListItemActions);
1044
+ const bulkActionsComponent = getCompoundComponent(props.children, DataListBulkActions);
907
1045
  return (React__default["default"].createElement(DataListContext.Provider, { value: Object.assign(Object.assign({ searchComponent,
908
1046
  filterComponent,
909
1047
  layoutComponents,
910
1048
  emptyStateComponents,
911
- itemActionComponent }, props), { selected: (_b = props.selected) !== null && _b !== void 0 ? _b : [],
1049
+ itemActionComponent,
1050
+ bulkActionsComponent,
1051
+ layoutBreakpoints,
1052
+ registerLayoutBreakpoints,
1053
+ layouts,
1054
+ registerLayout }, props), { selected,
912
1055
  // T !== DataListObject
913
1056
  sorting: sorting }) },
914
1057
  React__default["default"].createElement(InternalDataList, null)));
1058
+ function registerLayoutBreakpoints(size) {
1059
+ setLayoutBreakpoints(prev => sortBreakpoints([...prev, size]));
1060
+ }
1061
+ function registerLayout(size, children) {
1062
+ setLayouts(prev => (Object.assign(Object.assign({}, prev), { [size]: children })));
1063
+ }
915
1064
  }
916
1065
  function InternalDataList() {
917
- const { data, headers, title, totalCount, headerVisibility = { xs: true, sm: true, md: true, lg: true, xl: true }, loadingState = "none", layoutComponents, } = useDataListContext();
1066
+ const { data, title, totalCount, loadingState = "none", layoutComponents, } = useDataListContext();
918
1067
  const backToTopRef = React.useRef(null);
919
- const headerData = generateHeaderElements(headers);
920
- const mediaMatches = useLayoutMediaQueries();
921
1068
  const initialLoading = loadingState === "initial";
922
1069
  const showEmptyState = !initialLoading && data.length === 0;
923
1070
  const shouldRenderLoadMoreTrigger = !initialLoading && !showEmptyState;
924
- return (React__default["default"].createElement("div", { className: styles$e.wrapper },
925
- React__default["default"].createElement("div", { className: styles$e.titleContainer },
1071
+ return (React__default["default"].createElement("div", { className: styles$f.wrapper },
1072
+ React__default["default"].createElement("div", { className: styles$f.titleContainer },
926
1073
  title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
927
1074
  React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: initialLoading })),
928
1075
  React__default["default"].createElement("div", { ref: backToTopRef }),
929
1076
  React__default["default"].createElement(DataListStickyHeader, null,
930
- React__default["default"].createElement("div", { className: styles$e.headerFilters },
1077
+ React__default["default"].createElement("div", { className: styles$f.headerFilters },
931
1078
  React__default["default"].createElement(InternalDataListFilters, null),
932
1079
  React__default["default"].createElement(InternalDataListSearch, null)),
933
- headerData && (React__default["default"].createElement(DataListHeader, { layouts: layoutComponents, headerData: headerData, headerVisibility: headerVisibility, mediaMatches: mediaMatches }))),
934
- initialLoading && (React__default["default"].createElement(DataListLoadingState, { headers: headers, layouts: layoutComponents, mediaMatches: mediaMatches })),
1080
+ React__default["default"].createElement(InternalDataListStatusBar, null),
1081
+ React__default["default"].createElement(DataListHeader, null)),
1082
+ initialLoading && React__default["default"].createElement(DataListLoadingState, null),
935
1083
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
936
- !initialLoading && (React__default["default"].createElement(DataListItems, { data: data, layouts: layoutComponents, mediaMatches: mediaMatches })),
937
- loadingState === "filtering" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_FILTERING_SPINNER_TEST_ID, className: styles$e.filtering },
938
- React__default["default"].createElement("div", { className: styles$e.filteringSpinner },
1084
+ layoutComponents,
1085
+ loadingState === "filtering" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_FILTERING_SPINNER_TEST_ID, className: styles$f.filtering },
1086
+ React__default["default"].createElement("div", { className: styles$f.filteringSpinner },
939
1087
  React__default["default"].createElement(Spinner.Spinner, { size: "small" })))),
940
1088
  shouldRenderLoadMoreTrigger && (React__default["default"].createElement(DataListLoadMore, { onBackToTop: handleBackToTop }))));
941
1089
  function handleBackToTop() {
@@ -971,16 +1119,34 @@ DataList.EmptyState = DataListEmptyState;
971
1119
  DataList.Filters = DataListFilters;
972
1120
  /**
973
1121
  * Enables the search functionality of the DataList.
1122
+ *
1123
+ * Since the debounce is implemented within the component, it can only be an
1124
+ * uncontrolled component. Thus the lack of a `value` prop.
974
1125
  */
975
1126
  DataList.Search = DataListSearch;
976
1127
  /**
977
1128
  * Defines the group actions you could do on a single DataList item.
978
1129
  */
979
1130
  DataList.ItemActions = DataListItemActions;
1131
+ /**
1132
+ * Defines the group actions you could do on multiple DataList items.
1133
+ */
1134
+ DataList.BulkActions = DataListBulkActions;
980
1135
  /**
981
1136
  * Defines the action in a DataList. This should be used inside the
982
1137
  * DataListItemActions component.
983
1138
  */
984
- DataList.Action = DataListAction;
1139
+ DataList.ItemAction = DataListAction;
1140
+ /**
1141
+ * Defines the batch action in a DataList. This should be used inside the
1142
+ * DataListBulkActions component.
1143
+ */
1144
+ DataList.BatchAction = function DataListBatchAction(props) {
1145
+ return React__default["default"].createElement(DataListAction, Object.assign({}, props));
1146
+ };
1147
+ /**
1148
+ * Defines a status bar that is rendered between the filters and the header.
1149
+ */
1150
+ DataList.StatusBar = DataListStatusBar;
985
1151
 
986
1152
  exports.DataList = DataList;