@jobber/components 4.41.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 (184) 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 +10 -3
  62. package/dist/DataList/DataList.types.d.ts +80 -5
  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/DataListActionsMenu/DataListActionsMenu.d.ts +2 -2
  68. package/dist/DataList/components/DataListBulkActions/DataListBulkActions.const.d.ts +1 -0
  69. package/dist/DataList/components/DataListBulkActions/DataListBulkActions.d.ts +4 -0
  70. package/dist/DataList/components/DataListBulkActions/index.d.ts +1 -0
  71. package/dist/DataList/components/DataListHeader/DataListHeader.d.ts +2 -0
  72. package/dist/DataList/components/DataListHeader/index.d.ts +1 -0
  73. package/dist/DataList/components/DataListItem/DataListItem.d.ts +9 -0
  74. package/dist/DataList/components/{DataListLayoutInternal → DataListItem}/DataListItemInternal.d.ts +1 -1
  75. package/dist/DataList/components/DataListItem/components/DataListItemClickable/DataListItemClickable.d.ts +2 -0
  76. package/dist/DataList/components/DataListItem/components/DataListItemClickable/DataListItemClickableInternal.d.ts +3 -0
  77. package/dist/DataList/components/DataListItem/components/DataListItemClickable/index.d.ts +1 -0
  78. package/dist/DataList/components/DataListItem/index.d.ts +1 -0
  79. package/dist/DataList/components/DataListItemActions/DataListItemActions.d.ts +4 -4
  80. package/dist/DataList/components/DataListItemActionsOverflow/DataListItemActionsOverflow.d.ts +7 -0
  81. package/dist/DataList/components/DataListItemActionsOverflow/index.d.ts +1 -0
  82. package/dist/DataList/components/DataListItems/DataListItems.d.ts +7 -0
  83. package/dist/DataList/components/DataListItems/index.d.ts +1 -0
  84. package/dist/DataList/components/DataListLayout/DataListLayout.d.ts +2 -2
  85. package/dist/DataList/components/DataListLayoutActions/DataListLayoutActions.d.ts +2 -0
  86. package/dist/DataList/components/DataListLayoutActions/DataListLayoutContext/DataListLayoutContext.d.ts +4 -0
  87. package/dist/DataList/components/DataListLayoutActions/DataListLayoutContext/index.d.ts +1 -0
  88. package/dist/DataList/components/DataListLayoutActions/index.d.ts +1 -0
  89. package/dist/DataList/components/DataListLoadingState/DataListLoadingState.d.ts +2 -9
  90. package/dist/DataList/components/DataListOverflowFade/DataListOverflowFade.d.ts +6 -0
  91. package/dist/DataList/components/DataListOverflowFade/index.d.ts +2 -0
  92. package/dist/DataList/components/DataListSearch/DataListSearch.d.ts +1 -1
  93. package/dist/DataList/components/DataListStatusBar/DataListStatusBar.d.ts +10 -0
  94. package/dist/DataList/components/DataListStatusBar/index.d.ts +1 -0
  95. package/dist/DataList/context/DataListContext/DataListContext.d.ts +4 -10
  96. package/dist/DataList/context/DataListLayoutContext/DataListLayoutContext.d.ts +5 -0
  97. package/dist/DataList/context/DataListLayoutContext/index.d.ts +1 -0
  98. package/dist/DataList/hooks/useActiveLayout.d.ts +4 -0
  99. package/dist/DataList/hooks/useGetItemActions.d.ts +6 -0
  100. package/dist/DataList/index.js +626 -376
  101. package/dist/DataTable/DataTable.d.ts +10 -10
  102. package/dist/DataTable/Pagination.d.ts +6 -5
  103. package/dist/DataTable/index.js +20 -14
  104. package/dist/DatePicker/index.js +3 -3
  105. package/dist/{DatePicker-b31baae4.js → DatePicker-c18f1739.js} +3 -3
  106. package/dist/DescriptionList/index.js +2 -2
  107. package/dist/Disclosure/index.js +2 -2
  108. package/dist/Drawer/index.js +5 -5
  109. package/dist/Emphasis/index.js +2 -2
  110. package/dist/{Emphasis-76a10790.js → Emphasis-b2d1b3aa.js} +1 -1
  111. package/dist/FeatureSwitch/index.js +7 -7
  112. package/dist/Flex/Flex.d.ts +32 -0
  113. package/dist/Flex/Flex.types.d.ts +6 -0
  114. package/dist/Flex/index.d.ts +1 -0
  115. package/dist/Flex/index.js +40 -0
  116. package/dist/FormField/index.js +5 -5
  117. package/dist/{FormField-d6138b7f.js → FormField-0b529c0b.js} +4 -4
  118. package/dist/FormatFile/index.js +11 -11
  119. package/dist/{FormatFile-aa1898f9.js → FormatFile-6bc7f045.js} +6 -6
  120. package/dist/Gallery/index.js +12 -12
  121. package/dist/Heading/index.js +2 -2
  122. package/dist/{Heading-a1191b15.js → Heading-0f4ecb0c.js} +1 -1
  123. package/dist/InlineLabel/index.js +2 -2
  124. package/dist/{InlineLabel-afd5fc6f.js → InlineLabel-9a517c19.js} +2 -2
  125. package/dist/InputAvatar/index.js +5 -5
  126. package/dist/InputDate/index.js +6 -6
  127. package/dist/InputEmail/index.js +5 -5
  128. package/dist/InputFile/index.js +3 -3
  129. package/dist/{InputFile-2a06c2c0.js → InputFile-8a21a5fb.js} +3 -3
  130. package/dist/InputNumber/index.js +6 -6
  131. package/dist/{InputNumber-07b03067.js → InputNumber-6a7cefc6.js} +1 -1
  132. package/dist/InputPassword/index.js +5 -5
  133. package/dist/InputPhoneNumber/index.js +5 -5
  134. package/dist/InputText/index.js +6 -6
  135. package/dist/{InputText-d1a52550.js → InputText-dcf6c428.js} +1 -1
  136. package/dist/InputTime/index.js +5 -5
  137. package/dist/InputValidation/index.js +3 -3
  138. package/dist/{InputValidation-b5a3d92c.js → InputValidation-179f0926.js} +2 -2
  139. package/dist/LightBox/index.js +4 -4
  140. package/dist/{LightBox-437a1c8b.js → LightBox-3f4dbc33.js} +2 -2
  141. package/dist/Link/Link.d.ts +1 -2
  142. package/dist/Link/index.d.ts +1 -1
  143. package/dist/List/index.js +7 -7
  144. package/dist/Markdown/index.js +5 -5
  145. package/dist/{Markdown-f6748dcb.js → Markdown-96070121.js} +3 -3
  146. package/dist/Menu/index.js +3 -3
  147. package/dist/{Menu-51f8712f.js → Menu-d7ea093c.js} +3 -3
  148. package/dist/Modal/index.js +5 -5
  149. package/dist/{Modal-a9ab9565.js → Modal-b9d194e4.js} +4 -4
  150. package/dist/MultiSelect/index.js +5 -5
  151. package/dist/{Option-b903e7ac.js → Option-752ce1e8.js} +1 -1
  152. package/dist/Page/index.js +7 -7
  153. package/dist/Popover/index.js +50 -9
  154. package/dist/ProgressBar/index.js +1 -1
  155. package/dist/{ProgressBar-5dfc1885.js → ProgressBar-250e7b24.js} +1 -1
  156. package/dist/RadioGroup/index.js +3 -3
  157. package/dist/{RadioGroup-8e76d20b.js → RadioGroup-ebaa4f87.js} +2 -2
  158. package/dist/RecurringSelect/index.js +11 -11
  159. package/dist/Select/index.js +6 -6
  160. package/dist/StatusLabel/index.js +2 -2
  161. package/dist/Switch/index.js +2 -2
  162. package/dist/{Switch-e75145cc.js → Switch-b85272bf.js} +2 -2
  163. package/dist/Tabs/Tabs.d.ts +12 -1
  164. package/dist/Tabs/index.js +8 -4
  165. package/dist/Text/index.js +2 -2
  166. package/dist/{Text-e7ed0974.js → Text-4a2bc89f.js} +1 -1
  167. package/dist/Toast/index.js +2 -2
  168. package/dist/Tooltip/index.js +1 -3
  169. package/dist/{Tooltip-bf67fe6e.js → Tooltip-6b12f1c2.js} +6 -8
  170. package/dist/Typography/index.js +1 -1
  171. package/dist/{Typography-fd6f932a.js → Typography-973b122e.js} +3 -3
  172. package/package.json +7 -7
  173. package/rollup.config.js +3 -5
  174. package/dist/Button-fd8413b2.js +0 -57
  175. package/dist/Chip-4916a642.js +0 -514
  176. package/dist/DataList/components/DataListItemActions/DataListItemActionsOverflow.d.ts +0 -7
  177. package/dist/DataList/components/DataListLayoutInternal/DataListHeader.d.ts +0 -11
  178. package/dist/DataList/components/DataListLayoutInternal/DataListItems.d.ts +0 -10
  179. package/dist/DataList/components/DataListLayoutInternal/DataListLayoutInternal.d.ts +0 -10
  180. package/dist/DataList/components/DataListLayoutInternal/index.d.ts +0 -3
  181. package/dist/DataList/hooks/useLayoutMediaQueries.d.ts +0 -1
  182. package/dist/Popover-bbfc6aa1.js +0 -53
  183. /package/dist/DataList/components/{DataListLayoutInternal → DataListHeader}/DataListHeaderCheckbox.d.ts +0 -0
  184. /package/dist/DataList/components/{DataListFilters/DataListFilter.const.d.ts → DataListOverflowFade/DataListOverflowFade.const.d.ts} +0 -0
@@ -5,59 +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
- 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');
24
+ var ReactDOM = require('react-dom');
25
+ var Checkbox = require('../Checkbox-ad7ec2e7.js');
26
+ var reactRouterDom = require('react-router-dom');
29
27
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
28
+ var Combobox = require('../Combobox-0044641d.js');
29
+ var Chip = require('../Chip-55e6da05.js');
30
30
  var Icon = require('../Icon-405a216c.js');
31
- var useInView = require('@jobber/hooks/useInView');
32
- var Popover = require('../Popover-bbfc6aa1.js');
33
- var Content = require('../Content-2ca1ffe1.js');
34
- var Chip = require('../Chip-4916a642.js');
35
- require('@jobber/hooks/useAssert');
36
- require('../Avatar-1aa30ee1.js');
37
- require('color');
38
31
  var debounce = require('lodash/debounce');
39
- var InputText = require('../InputText-d1a52550.js');
32
+ var InputText = require('../InputText-dcf6c428.js');
40
33
  var Spinner = require('../Spinner-9d8fc7ff.js');
41
- require('../ButtonDismiss-82680c7d.js');
42
- require('lodash/sortBy');
43
- require('@jobber/hooks/useLiveAnnounce');
44
- require('../FormField-d6138b7f.js');
45
- 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');
46
44
 
47
45
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
48
46
 
49
47
  var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
48
+ var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
50
49
  var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
51
50
  var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
52
51
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
53
52
 
54
- var css_248z$d = ".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";
55
- var styles$d = {"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-"};
56
- styleInject_es.styleInject(css_248z$d);
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);
57
56
 
58
- var css_248z$c = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
59
- var styles$c = {"results":"F56prQsXm3A-"};
60
- styleInject_es.styleInject(css_248z$c);
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);
61
60
 
62
61
  const DATALIST_TOTALCOUNT_TEST_ID = "ATL-DataList-TotalCount";
63
62
  function DataListTotalCount({ totalCount, loading, }) {
@@ -73,12 +72,57 @@ function DataListTotalCount({ totalCount, loading, }) {
73
72
  totalCount.toLocaleString(),
74
73
  " results)"));
75
74
  }
76
- return (React__default["default"].createElement("div", { className: styles$c.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));
77
76
  }
78
77
 
79
- var css_248z$b = ".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";
80
- var styles$b = {"loadingItem":"Rh--6fVpkm4-","mobileLoadingState":"zbS7UvpVoWI-"};
81
- styleInject_es.styleInject(css_248z$b);
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
+ }
82
126
 
83
127
  const EMPTY_RESULTS_MESSAGE = "List is looking empty";
84
128
  const EMPTY_FILTER_RESULTS_MESSAGE = "No results for selected filters";
@@ -101,14 +145,88 @@ const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
101
145
  const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
102
146
  const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
103
147
 
104
- var css_248z$a = ".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";
105
- var styles$a = {"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-"};
206
+ styleInject_es.styleInject(css_248z$b);
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-"};
106
223
  styleInject_es.styleInject(css_248z$a);
107
224
 
108
225
  function DataListTags({ items }) {
109
226
  const ref = React.useRef(null);
110
227
  const [visibleIndex, setVisibleIndex] = React.useState([]);
111
228
  const visibleItems = visibleIndex.filter(Boolean).length;
229
+ const shouldShowTagCount = Boolean(visibleItems);
112
230
  React.useEffect(() => {
113
231
  var _a;
114
232
  if (!window.IntersectionObserver)
@@ -123,10 +241,12 @@ function DataListTags({ items }) {
123
241
  elements === null || elements === void 0 ? void 0 : elements.forEach(element => observer.unobserve(element));
124
242
  };
125
243
  }, [items]);
126
- return (React__default["default"].createElement("div", { className: styles$a.tags, ref: ref },
127
- items.filter(Boolean).map((tag, index) => (React__default["default"].createElement("div", { key: tag, "data-tag-element": index },
128
- React__default["default"].createElement(InlineLabel.InlineLabel, null, tag)))),
129
- Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$a.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 },
130
250
  React__default["default"].createElement(Text.Text, null,
131
251
  "+",
132
252
  visibleItems)))));
@@ -159,7 +279,7 @@ var css_248z$9 = ".fLmJZJJqMcE- {\n display: -ms-flexbox;\n display: flex;\n
159
279
  var styles$9 = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
160
280
  styleInject_es.styleInject(css_248z$9);
161
281
 
162
- var css_248z$8 = ".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";
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";
163
283
  var styles$8 = {"sortIcon":"AN5egORYy-0-","active":"F1uTDCK0Sb0-","inactive":"_6KYeQXWXLQ8-"};
164
284
  styleInject_es.styleInject(css_248z$8);
165
285
 
@@ -174,18 +294,6 @@ function DataListSortingArrows({ order }) {
174
294
  }
175
295
  }
176
296
 
177
- const defaultValues = {
178
- title: "",
179
- data: [],
180
- headers: {},
181
- children: [],
182
- selected: [],
183
- };
184
- const DataListContext = React.createContext(defaultValues);
185
- function useDataListContext() {
186
- return React.useContext(DataListContext);
187
- }
188
-
189
297
  function DataListHeaderTile({ headers, headerKey, }) {
190
298
  const { sorting } = useDataListContext();
191
299
  const isSortable = sorting === null || sorting === void 0 ? void 0 : sorting.sortable.includes(headerKey);
@@ -197,12 +305,13 @@ function DataListHeaderTile({ headers, headerKey, }) {
197
305
  React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
198
306
  (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey && (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.order }))));
199
307
  function toggleSorting(sortingKey) {
200
- 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") {
201
310
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort(undefined);
202
311
  return;
203
312
  }
204
313
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort({
205
- 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",
206
315
  key: sortingKey,
207
316
  });
208
317
  }
@@ -231,10 +340,10 @@ function getCompoundComponents(children, type) {
231
340
  return elements;
232
341
  }
233
342
  /**
234
- * 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.
235
344
  */
236
- function generateListItemElements(data) {
237
- return data.map(item => Object.keys(item).reduce((acc, key) => {
345
+ function generateListItemElement(item) {
346
+ return Object.keys(item).reduce((acc, key) => {
238
347
  const currentItem = item[key];
239
348
  if (!currentItem) {
240
349
  return acc;
@@ -256,7 +365,7 @@ function generateListItemElements(data) {
256
365
  acc[key] = React__default["default"].createElement(Text.Text, { variation: "subdued" }, currentItem);
257
366
  }
258
367
  return acc;
259
- }, {}));
368
+ }, {});
260
369
  }
261
370
  /**
262
371
  * Generate the header elements with the default styling
@@ -265,86 +374,32 @@ function generateHeaderElements(headers) {
265
374
  const headerElements = Object.keys(headers).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: React__default["default"].createElement(DataListHeaderTile, { headers: headers, headerKey: key }) })), {});
266
375
  return isEmpty__default["default"](headerElements) ? undefined : headerElements;
267
376
  }
268
- function sortSizeProp(sizeProp) {
377
+ function sortBreakpoints(sizeProp) {
269
378
  return sizeProp.sort((a, b) => BREAKPOINTS.indexOf(a) - BREAKPOINTS.indexOf(b));
270
379
  }
271
-
272
- function DataListLayoutInternal({ layouts, renderLayout, mediaMatches, }) {
273
- const sizePropsOfLayouts = layouts === null || layouts === void 0 ? void 0 : layouts.map(layout => layout.props.size || "xs");
274
- const layoutToRender = layouts === null || layouts === void 0 ? void 0 : layouts.find(layout => {
275
- const layoutSize = layout.props.size || "xs";
276
- const isVisible = isLayoutVisible({
277
- layoutSize,
278
- mediaMatches,
279
- sizePropsOfLayouts,
280
- });
281
- return isVisible;
282
- });
283
- return (layoutToRender && renderLayout(layoutToRender)) || React__default["default"].createElement(React__default["default"].Fragment, null);
284
- }
285
- /**
286
- * Determine is layout is visible by checking a media query matches for the
287
- * visible sizes of the layout and there isn't a larger layout that should be rendered
288
- */
289
- function isLayoutVisible({ layoutSize, mediaMatches, sizePropsOfLayouts, }) {
290
- const largerBreakpointsToHide = sizePropsOfLayouts === null || sizePropsOfLayouts === void 0 ? void 0 : sizePropsOfLayouts.filter(size => BREAKPOINTS.indexOf(size) > BREAKPOINTS.indexOf(layoutSize));
291
- const sortedLargerBreakpoints = sortSizeProp(largerBreakpointsToHide || []);
292
- const visibleBreakpoints = BREAKPOINTS.slice(BREAKPOINTS.indexOf(layoutSize), sortedLargerBreakpoints[0]
293
- ? BREAKPOINTS.indexOf(sortedLargerBreakpoints[0])
294
- : undefined);
295
- const isVisibleBreakpoint = visibleBreakpoints.some(breakpoint => {
296
- return Boolean(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
297
- });
298
- const largerLayoutIsNotVisible = largerBreakpointsToHide === null || largerBreakpointsToHide === void 0 ? void 0 : largerBreakpointsToHide.reduce((acc, breakpoint) => {
299
- return acc && !(mediaMatches === null || mediaMatches === void 0 ? void 0 : mediaMatches[breakpoint]);
300
- }, true);
301
- return isVisibleBreakpoint && largerLayoutIsNotVisible;
302
- }
303
-
304
- function DataListItemInternal({ children, item, }) {
305
- const { selected, onSelect } = useDataListContext();
306
- if (selected !== undefined && onSelect) {
307
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$d.selectable, {
308
- [styles$d.selected]: selected === null || selected === void 0 ? void 0 : selected.length,
309
- }) },
310
- React__default["default"].createElement(Checkbox.Checkbox, { checked: selected === null || selected === void 0 ? void 0 : selected.includes(item.id), onChange: handleChange }),
311
- children));
312
- }
313
- return children;
314
- function handleChange() {
315
- if (selected === null || selected === void 0 ? void 0 : selected.includes(item.id)) {
316
- onSelect === null || onSelect === void 0 ? void 0 : onSelect(selected === null || selected === void 0 ? void 0 : selected.filter(id => id !== item.id));
317
- }
318
- else if (selected) {
319
- 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];
320
390
  }
321
- }
391
+ return result;
392
+ }, []);
322
393
  }
323
394
 
324
- var css_248z$7 = ".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";
325
- var styles$7 = {"menu":"jHcHGQ-HDbk-"};
326
- styleInject_es.styleInject(css_248z$7);
327
-
328
- var css_248z$6 = ".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 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";
329
- var styles$6 = {"action":"iyg43v-S9yU-","label":"AUJNqz93ZDA-"};
330
- styleInject_es.styleInject(css_248z$6);
331
-
332
- function DataListAction(
333
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
334
- _) {
335
- return null;
336
- }
337
- function InternalDataListAction({ label, icon, destructive, onClick, item, }) {
338
- const color = destructive ? "critical" : "blue";
339
- return (React__default["default"].createElement("button", { className: styles$6.action, onClick: () => onClick === null || onClick === void 0 ? void 0 : onClick(item) },
340
- icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color }),
341
- React__default["default"].createElement(Typography.Typography, { textColor: color },
342
- React__default["default"].createElement("span", { className: styles$6.label }, label))));
395
+ const DataListLayoutActionsContext = React.createContext({ activeItem: undefined });
396
+ function useDataListLayoutActionsContext() {
397
+ return React.useContext(DataListLayoutActionsContext);
343
398
  }
344
399
 
345
- var css_248z$5 = ".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";
346
- var styles$5 = {"menu":"aokwZU8jbWU-","overlay":"XtVRP97TVSE-"};
347
- styleInject_es.styleInject(css_248z$5);
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);
348
403
 
349
404
  const variants$1 = {
350
405
  hidden: { opacity: 0, y: -10 },
@@ -355,10 +410,14 @@ function DataListActionsMenu({ visible = false, position, onRequestClose, childr
355
410
  useRefocusOnActivator.useRefocusOnActivator(visible);
356
411
  const focusTrapRef = useFocusTrap.useFocusTrap(visible);
357
412
  useOnKeyDown.useOnKeyDown(onRequestClose, "Escape");
358
- return (React__default["default"].createElement(framerMotion.AnimatePresence, null, visible && (React__default["default"].createElement(React__default["default"].Fragment, null,
359
- React__default["default"].createElement("div", { className: styles$5.overlay, onClick: onRequestClose }),
360
- 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$5.menu, style: getPositionCssVars() },
361
- React__default["default"].createElement("div", { tabIndex: 0, ref: focusTrapRef }, children))))));
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
+ }
362
421
  function getPositionCssVars() {
363
422
  const { posX, posY } = getPosition();
364
423
  return {
@@ -369,27 +428,33 @@ function DataListActionsMenu({ visible = false, position, onRequestClose, childr
369
428
  function getPosition() {
370
429
  const rect = ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect();
371
430
  const { width = 0, height = 0 } = rect || {};
372
- const { x = 0, y = 0 } = position;
431
+ const { x, y } = position;
373
432
  const xIsOffScreen = x + width > window.innerWidth;
374
433
  const yIsOffScreen = y + height > window.innerHeight;
434
+ const xOffSet = x + width - window.innerWidth + design.tokens["space-base"];
375
435
  const yOffSet = y + height - window.innerHeight;
376
- const newPosX = Math.floor(xIsOffScreen ? x - width : x);
436
+ const newPosX = Math.floor(xIsOffScreen ? x - xOffSet : x);
377
437
  const newPosY = Math.floor(yIsOffScreen ? y - yOffSet : y);
378
438
  return { posX: newPosX, posY: newPosY };
379
439
  }
380
440
  }
381
441
 
382
- function DataListItemActionsOverflow({ item, actions, }) {
442
+ function DataListItemActionsOverflow({ actions, }) {
383
443
  const [menuPosition, setMenuPosition] = React.useState({ x: 0, y: 0 });
384
444
  const [showMenu, setShowMenu] = React.useState(false);
445
+ if (actions.length === 0)
446
+ return null;
385
447
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
386
448
  React__default["default"].createElement(Tooltip.Tooltip, { message: "More actions" },
387
449
  React__default["default"].createElement(Button.Button, { icon: "more", ariaLabel: "More actions", type: "secondary", variation: "subtle", onClick: handleMoreClick })),
388
- 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)));
389
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();
390
455
  setShowMenu(true);
391
456
  const rect = event.currentTarget.getBoundingClientRect();
392
- const posX = rect.x + rect.width;
457
+ const posX = rect.x;
393
458
  const posY = rect.y + rect.height;
394
459
  setMenuPosition({ x: posX, y: posY });
395
460
  }
@@ -398,6 +463,31 @@ function DataListItemActionsOverflow({ item, actions, }) {
398
463
  }
399
464
  }
400
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
+
401
491
  // This component is meant to capture the props of the DataList.ItemActions
402
492
  function DataListItemActions(
403
493
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
@@ -408,74 +498,119 @@ const variants = {
408
498
  hidden: { opacity: 0, y: 10 },
409
499
  visible: { opacity: 1, y: 0 },
410
500
  };
411
- function InternalDataListItemActions({ item, }) {
412
- const { itemActionComponent } = useDataListContext();
413
- if (!itemActionComponent)
414
- return null;
415
- const { children } = itemActionComponent.props;
416
- const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
417
- const exposedActions = getExposedActions(childrenArray);
418
- childrenArray.splice(0, exposedActions.length);
501
+ function InternalDataListItemActions({ actions, }) {
419
502
  return (React__default["default"].createElement(framerMotion.motion.div, { variants: variants, initial: "hidden", animate: "visible", exit: "hidden", transition: {
420
503
  duration: TRANSITION_DURATION_IN_SECONDS,
421
504
  delay: TRANSITION_DELAY_IN_SECONDS,
422
- }, className: styles$7.menu, onContextMenu: handleContextMenu },
423
- exposedActions.map(({ props }) => {
424
- if (!props.icon)
425
- return null;
426
- return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
427
- 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" })));
428
- }),
429
- React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray, item: item })));
505
+ }, className: styles$c.menu, onContextMenu: handleContextMenu },
506
+ React__default["default"].createElement(DataListActions, null, actions)));
430
507
  }
431
508
  function handleContextMenu(event) {
432
509
  event.stopPropagation();
433
510
  }
434
- function getExposedActions(childrenArray) {
435
- const firstTwoChildren = childrenArray.slice(0, 2);
436
- return firstTwoChildren.reduce((result, child, i) => {
437
- const hasIcon = Boolean(child.props.icon);
438
- const isFirstChild = i === 0;
439
- if (isFirstChild && hasIcon) {
440
- 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));
441
525
  }
442
- const isSecondChild = i === 1;
443
- const hasFirstChild = result.length === 1;
444
- if (isSecondChild && hasIcon && hasFirstChild) {
445
- return [...result, child];
526
+ else if (selected) {
527
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect([...selected, item.id]);
446
528
  }
447
- return result;
448
- }, []);
529
+ }
530
+ }
531
+
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
+ }
559
+ }
560
+
561
+ function DataListItemClickable({ children }) {
562
+ const { itemActionComponent } = useDataListContext();
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);
449
568
  }
450
569
 
451
- function DataListItems({ layouts, mediaMatches, data, }) {
570
+ function useGetItemActions(item) {
452
571
  const { itemActionComponent } = useDataListContext();
453
- const elementData = React.useMemo(() => generateListItemElements(data), [data]);
454
- const [activeID, setActiveID] = React.useState();
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);
455
592
  const [contextPosition, setContextPosition] = React.useState();
456
- 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);
457
595
  const isContextMenuVisible = Boolean(contextPosition);
458
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement(React__default["default"].Fragment, null, elementData.map((child, i) => {
459
- const item = data[i];
460
- const isActive = activeID === item.id;
461
- const shouldShowContextMenu = isActive && isContextMenuVisible && Boolean(contextMenuActions);
462
- return (React__default["default"].createElement("div", { onMouseEnter: handleMouseEnter(item), onMouseLeave: handleMouseLeave, onContextMenu: handleContextMenu, className: classnames__default["default"](styles$d.listItem, {
463
- [styles$d.active]: isActive && isContextMenuVisible,
464
- }), key: item.id },
465
- React__default["default"].createElement(DataListItemInternal, { item: data[i] }, layout.props.children(child)),
466
- React__default["default"].createElement(framerMotion.AnimatePresence, null,
467
- isActive && React__default["default"].createElement(InternalDataListItemActions, { item: item }),
468
- React__default["default"].createElement(DataListActionsMenu, { key: item.id, visible: shouldShowContextMenu, position: contextPosition || { x: 0, y: 0 }, onRequestClose: () => setContextPosition(undefined) }, contextMenuActions &&
469
- React.Children.map(contextMenuActions, action => (React__default["default"].createElement(InternalDataListAction, Object.assign({ key: item.id }, action.props, { item: item }))))))));
470
- }))) }));
471
- function handleMouseEnter(item) {
472
- return () => setActiveID(item.id);
473
- }
474
- function handleMouseLeave() {
475
- !isContextMenuVisible && setActiveID(undefined);
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);
608
+ }
609
+ function handleHideMenu() {
610
+ setShowMenu(false);
476
611
  }
477
612
  function handleContextMenu(event) {
478
- if (!contextMenuActions || isContextMenuVisible)
613
+ if (!hasActions || isContextMenuVisible)
479
614
  return;
480
615
  event.preventDefault();
481
616
  setContextPosition({
@@ -485,21 +620,80 @@ function DataListItems({ layouts, mediaMatches, data, }) {
485
620
  }
486
621
  }
487
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
+
488
676
  function DataListHeaderCheckbox({ children }) {
489
677
  const { data, totalCount, selected = [], onSelectAll, onSelect, } = useDataListContext();
490
678
  if (!onSelectAll && !onSelect)
491
679
  return children;
492
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$d.selectable) },
493
- React__default["default"].createElement("div", { className: classnames__default["default"](styles$d.selectAllCheckbox, {
494
- [styles$d.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),
495
687
  }) },
496
- React__default["default"].createElement(Checkbox.Checkbox, { checked: isAllSelected(), indeterminate: selected.length > 0 && !isAllSelected(), onChange: onSelectAll })),
497
- React__default["default"].createElement(AnimatedSwitcher.AnimatedSwitcher, { switched: Boolean(selected.length), initialChild: children, switchTo: React__default["default"].createElement("div", { className: styles$d.headerBatchSelect },
498
- React__default["default"].createElement(Text.Text, null,
499
- 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,
500
693
  selected.length,
501
- " selected")),
502
- 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)) })));
503
697
  function isAllSelected() {
504
698
  // If there's a totalCount, we can use that to accurately determine if the
505
699
  // user have "selected all".
@@ -514,112 +708,62 @@ function DataListHeaderCheckbox({ children }) {
514
708
  }
515
709
  }
516
710
 
517
- function useMediaQuery(CSSMediaQuery) {
518
- const [matches, setMatches] = React.useState(window.matchMedia(CSSMediaQuery).matches);
519
- React.useEffect(() => {
520
- const media = window.matchMedia(CSSMediaQuery);
521
- if (media.matches !== matches) {
522
- setMatches(media.matches);
523
- }
524
- const listener = () => setMatches(media.matches);
525
- media.addEventListener("change", listener);
526
- return () => media.removeEventListener("change", listener);
527
- }, [CSSMediaQuery]);
528
- return matches;
529
- }
530
-
531
- function useResponsiveSizing() {
532
- const xs = useMediaQuery(`(width > ${BREAKPOINT_SIZES.xs}px)`);
533
- const sm = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.sm}px)`);
534
- const md = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.md}px)`);
535
- const lg = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.lg}px)`);
536
- const xl = useMediaQuery(`(width >= ${BREAKPOINT_SIZES.xl}px)`);
537
- return { xs, sm, md, lg, xl };
538
- }
539
-
540
- function useShowHeader() {
541
- const { headerVisibility } = useDataListContext();
542
- if (headerVisibility === undefined)
543
- return true;
544
- const sizes = useResponsiveSizing();
545
- const sizeKeys = Object.keys(sizes);
546
- const showHeader = sizeKeys.reduce((previous, breakpoint) => {
547
- const isHeaderVisible = headerVisibility[breakpoint] || false;
548
- const isBreakpointTriggered = sizes[breakpoint];
549
- return previous || (isBreakpointTriggered && isHeaderVisible);
550
- }, false);
551
- return showHeader;
552
- }
553
-
554
- function DataListHeader({ layouts, mediaMatches, headerData, }) {
555
- const showHeader = useShowHeader();
556
- 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)
557
719
  return null;
558
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => (React__default["default"].createElement("div", { className: classnames__default["default"](styles$d.headerTitles) },
559
- React__default["default"].createElement(DataListHeaderCheckbox, null, layout.props.children(headerData)))) }));
560
- }
561
-
562
- const LOADING_STATE_LIMIT_ITEMS = 10;
563
- const DATALIST_LOADINGSTATE_ROW_TEST_ID = "ATL-DataList-LoadingState-Row";
564
- function DataListLoadingState({ headers, layouts, mediaMatches, }) {
565
- const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(headers);
566
- const loadingElements = loadingData.map(item => Object.keys(item).reduce((acc, key) => {
567
- acc[key] = React__default["default"].createElement(Glimmer.Glimmer, null);
568
- return acc;
569
- }, {}));
570
- return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => {
571
- if (layout.props.size === "xs") {
572
- return React__default["default"].createElement(LoadingStateXSBreakpoint, null);
573
- }
574
- return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingElements.map((child, i) => (React__default["default"].createElement("div", { className: styles$b.loadingItem, key: i, "data-testid": DATALIST_LOADINGSTATE_ROW_TEST_ID }, layout.props.children(child))))));
575
- } }));
576
- }
577
- function LoadingStateXSBreakpoint() {
578
- const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(0);
579
- return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingData.map((_, i) => {
580
- return (React__default["default"].createElement("div", { className: styles$b.mobileLoadingState, key: i },
581
- React__default["default"].createElement(Glimmer.Glimmer.Text, null)));
582
- })));
583
- }
584
-
585
- function DataListLayout(
586
- // eslint-disable-next-line @typescript-eslint/no-unused-vars
587
- _) {
588
- 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
+ }
589
731
  }
590
732
 
591
- var css_248z$4 = ".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";
592
- var styles$4 = {"filters":"E-mG3prPSN8-","filterActions":"_0LGNoZxtqSE-","overflowTrigger":"LA3-gtgehrE-","overflowLeft":"fSPvawYWzZ8-","overflowRight":"ChfEJMPPVTk-"};
593
- styleInject_es.styleInject(css_248z$4);
594
-
595
- const CONTAINER_TEST_ID = "ATL-DataListFilters-Container";
596
-
597
733
  function DataListSort() {
598
734
  const { sorting, headers } = useDataListContext();
599
- const divRef = React.useRef(null);
600
- const [showPopover, setShowPopover] = React.useState(false);
601
735
  if (!sorting)
602
736
  return null;
603
737
  const { sortable, state, onSort } = sorting;
604
738
  const sortByOptions = getSortByOptions();
605
- const canChangeOrder = !(state === null || state === void 0 ? void 0 : state.key);
606
- return (React__default["default"].createElement(React__default["default"].Fragment, null,
607
- React__default["default"].createElement("span", { ref: divRef },
608
- React__default["default"].createElement(Button.Button, Object.assign({}, (!state && { icon: "add", iconOnRight: true }), { label: getButtonLabel(), variation: "subtle", onClick: () => setShowPopover(!showPopover) }))),
609
- React__default["default"].createElement(Popover.Popover, { attachTo: divRef, open: showPopover, onRequestClose: () => setShowPopover(false) },
610
- React__default["default"].createElement(Content.Content, null,
611
- React__default["default"].createElement(Heading.Heading, { level: 5 }, "Sort by"),
612
- 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 })))),
613
- React__default["default"].createElement(Heading.Heading, { level: 5 }, "Ordered by"),
614
- React__default["default"].createElement(Chip.Chips, { selected: state === null || state === void 0 ? void 0 : state.order, onChange: handleSortingChange },
615
- React__default["default"].createElement(Chip.Chip, { label: "Ascending", value: "asc", disabled: canChangeOrder }),
616
- 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
+ })));
617
754
  function getSortByOptions() {
618
755
  const options = sortable.reduce((acc, sort) => {
619
756
  const label = headers[sort];
620
757
  if (!label)
621
758
  return acc;
622
- 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
+ }
623
767
  return acc;
624
768
  }, []);
625
769
  // Inject a none option as the first option
@@ -627,24 +771,31 @@ function DataListSort() {
627
771
  return options;
628
772
  }
629
773
  function getButtonLabel() {
630
- const label = state && headers[state.key];
631
- if (!label)
632
- return "Sort by";
633
- 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) || "";
634
776
  }
635
777
  function handleKeyChange(value) {
636
778
  if (value && value !== "none") {
637
- 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 });
638
781
  return;
639
782
  }
640
783
  onSort(undefined);
641
784
  }
642
- function handleSortingChange(value) {
643
- if ((state === null || state === void 0 ? void 0 : state.key) && value) {
644
- onSort({ key: state.key, order: value });
645
- return;
646
- }
647
- }
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;
648
799
  }
649
800
 
650
801
  // This component is meant to capture the props of the DataList.Filters
@@ -660,25 +811,17 @@ function InternalDataListFilters() {
660
811
  const showHeader = useShowHeader();
661
812
  const showSortButton = !showHeader;
662
813
  const component = getCompoundComponent(parentChildren, DataListFilters);
663
- const [leftRef, isLeftVisible] = useInView.useInView();
664
- const [rightRef, isRightVisible] = useInView.useInView();
665
814
  if (!showSortButton && !component)
666
815
  return null;
667
816
  const children = component === null || component === void 0 ? void 0 : component.props.children;
668
- return (React__default["default"].createElement("div", { "data-testid": CONTAINER_TEST_ID, className: classnames__default["default"](styles$4.filters, {
669
- [styles$4.overflowLeft]: !isLeftVisible,
670
- [styles$4.overflowRight]: !isRightVisible,
671
- }) },
672
- React__default["default"].createElement("div", { className: styles$4.filterActions },
673
- React__default["default"].createElement("span", { ref: leftRef, className: styles$4.overflowTrigger }),
674
- children && children,
675
- showSortButton && React__default["default"].createElement(DataListSort, null),
676
- React__default["default"].createElement("span", { ref: rightRef, className: styles$4.overflowTrigger }))));
817
+ return (React__default["default"].createElement(DataListOverflowFade, null,
818
+ children && children,
819
+ showSortButton && React__default["default"].createElement(DataListSort, null)));
677
820
  }
678
821
 
679
- var css_248z$3 = ".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";
680
- var styles$3 = {"header":"PGOHzrMh374-","stuck":"PGjWc5ocjpI-"};
681
- styleInject_es.styleInject(css_248z$3);
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);
682
825
 
683
826
  function DataListStickyHeader({ children }) {
684
827
  const [isStuck, setIsStuck] = React.useState(false);
@@ -693,12 +836,12 @@ function DataListStickyHeader({ children }) {
693
836
  ref.current && observer.unobserve(ref.current);
694
837
  };
695
838
  }, [handleObserver, ref.current]);
696
- return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$3.header, { [styles$3.stuck]: isStuck }) }, children));
839
+ return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
697
840
  }
698
841
 
699
- var css_248z$2 = ".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";
700
- var styles$2 = {"searchInput":"SaPMOnvw-3c-","searchInputVisible":"_3S1-91v2SYI-","searchButton":"_9GlBktsUALw-","withNoFilters":"_3Pjrt42x454-"};
701
- styleInject_es.styleInject(css_248z$2);
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);
702
845
 
703
846
  const DATA_LIST_SEARCH_TEST_ID = "ATL-DataList-Search-input-wrapper";
704
847
  // This component is meant to capture the props of the DataList.Search
@@ -707,7 +850,7 @@ function DataListSearch(_) {
707
850
  return null;
708
851
  }
709
852
  /**
710
- * Renders the DataList.Search component
853
+ * Renders the DataList.Search component.
711
854
  */
712
855
  function InternalDataListSearch() {
713
856
  const inputRef = React.useRef(null);
@@ -716,15 +859,19 @@ function InternalDataListSearch() {
716
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]);
717
860
  if (!searchComponent)
718
861
  return null;
719
- const { placeholder } = searchComponent.props;
862
+ const { placeholder, initialValue } = searchComponent.props;
720
863
  return (React__default["default"].createElement("div", { className: classnames__default["default"]({
721
- [styles$2.withNoFilters]: !filterComponent && !sorting,
864
+ [styles$4.withNoFilters]: !filterComponent && !sorting,
722
865
  }) },
723
- React__default["default"].createElement("div", { "data-testid": DATA_LIST_SEARCH_TEST_ID, className: classnames__default["default"](styles$2.searchInput, {
724
- [styles$2.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,
725
868
  }) },
726
- React__default["default"].createElement(InputText.InputText, { ref: inputRef, placeholder: getPlaceholder(), onChange: debouncedSearch, prefix: { icon: "search" }, size: "small" })),
727
- React__default["default"].createElement("div", { className: styles$2.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 },
728
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 }) }))));
729
876
  function getPlaceholder() {
730
877
  if (placeholder)
@@ -742,9 +889,9 @@ function InternalDataListSearch() {
742
889
  }
743
890
  }
744
891
 
745
- var css_248z$1 = ".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";
746
- var styles$1 = {"emptyStateWrapper":"zg3w9nQga-M-"};
747
- styleInject_es.styleInject(css_248z$1);
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);
748
895
 
749
896
  // eslint-disable-next-line @typescript-eslint/no-unused-vars
750
897
  function DataListEmptyState(_) {
@@ -753,7 +900,7 @@ function DataListEmptyState(_) {
753
900
  function InternalDataListEmptyState() {
754
901
  const { emptyStateComponents: components, filtered } = React.useContext(DataListContext);
755
902
  const { message, action } = getMessages();
756
- return (React__default["default"].createElement("div", { className: styles$1.emptyStateWrapper },
903
+ return (React__default["default"].createElement("div", { className: styles$3.emptyStateWrapper },
757
904
  React__default["default"].createElement(Text.Text, { align: "center" }, message),
758
905
  renderButton(action)));
759
906
  function getMessages() {
@@ -787,9 +934,9 @@ function getEmptyStates(components) {
787
934
  return { defaultEmptyState, filteredEmptyState };
788
935
  }
789
936
 
790
- var css_248z = ".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";
791
- var styles = {"trigger":"IC-Y9bTIVFo-","loadingMore":"PbZLGpbI6ZM-","backToTop":"_6zA6B-jmz6o-","fadeIn":"gZ4DUv82g5I-"};
792
- styleInject_es.styleInject(css_248z);
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);
793
940
 
794
941
  function DataListLoadMoreTrigger() {
795
942
  const { onLoadMore } = useDataListContext();
@@ -797,7 +944,7 @@ function DataListLoadMoreTrigger() {
797
944
  React.useEffect(() => {
798
945
  isInView && (onLoadMore === null || onLoadMore === void 0 ? void 0 : onLoadMore());
799
946
  }, [isInView]);
800
- return (React__default["default"].createElement("div", { ref: inViewRef, className: styles.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 }));
801
948
  }
802
949
 
803
950
  const MAX_DATA_COUNT = 50;
@@ -806,77 +953,137 @@ function DataListLoadMore({ onBackToTop }) {
806
953
  const showBackToTop = data.length > MAX_DATA_COUNT && loadingState !== "loadingMore";
807
954
  return (React__default["default"].createElement(React__default["default"].Fragment, null,
808
955
  React__default["default"].createElement(DataListLoadMoreTrigger, { key: data.length }),
809
- loadingState === "loadingMore" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_LOADING_MORE_SPINNER_TEST_ID, className: styles.loadingMore },
956
+ loadingState === "loadingMore" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_LOADING_MORE_SPINNER_TEST_ID, className: styles$2.loadingMore },
810
957
  React__default["default"].createElement(Spinner.Spinner, { size: "small" }))),
811
- showBackToTop && (React__default["default"].createElement("div", { className: styles.backToTop },
958
+ showBackToTop && (React__default["default"].createElement("div", { className: styles$2.backToTop },
812
959
  React__default["default"].createElement(Button.Button, { label: "Back to top", onClick: onBackToTop, size: "small", variation: "subtle" })))));
813
960
  }
814
961
 
815
- function useLayoutMediaQueries() {
816
- const mediaQueries = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: window.matchMedia(breakpointToMediaQuery(breakpoint)) })), {});
817
- const initialMatches = BREAKPOINTS.reduce((previous, breakpoint) => (Object.assign(Object.assign({}, previous), { [breakpoint]: mediaQueries[breakpoint].matches })), {});
818
- const [matches, setMatches] = React.useState(initialMatches);
819
- const handlers = BREAKPOINTS.reduce((previous, breakpoint) => {
820
- const handler = (e) => setMatches(previousMatches => (Object.assign(Object.assign({}, previousMatches), { [breakpoint]: e.matches })));
821
- return Object.assign(Object.assign({}, previous), { [breakpoint]: handler });
822
- }, {});
823
- // Set up mediaQuery event handlers
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
+
987
+ var css_248z = "._0m75bgCVBhk- {\n visibility: hidden;\n}\n";
988
+ var styles = {"hidden":"_0m75bgCVBhk-"};
989
+ styleInject_es.styleInject(css_248z);
990
+
991
+ function DataListLayoutActions() {
992
+ const { itemActionComponent, loadingState } = useDataListContext();
993
+ const { setHasInLayoutActions } = useDataListLayoutContext();
994
+ const { children: actionsChildren } = (itemActionComponent === null || itemActionComponent === void 0 ? void 0 : itemActionComponent.props) || {};
995
+ const actions = React.Children.toArray(actionsChildren);
996
+ const hasActions = actions.length > 0;
824
997
  React.useEffect(() => {
825
- BREAKPOINTS.forEach(breakpoint => {
826
- mediaQueries[breakpoint].addEventListener("change", handlers[breakpoint]);
827
- });
998
+ setHasInLayoutActions(hasActions);
828
999
  return () => {
829
- BREAKPOINTS.forEach(breakpoint => {
830
- mediaQueries[breakpoint].removeEventListener("change", handlers[breakpoint]);
831
- });
1000
+ setHasInLayoutActions(false);
832
1001
  };
833
- }, [mediaQueries]);
834
- return matches;
1002
+ }, []);
1003
+ if (loadingState === "initial") {
1004
+ return React__default["default"].createElement(Glimmer.Glimmer, { shape: "square", size: "large" });
1005
+ }
1006
+ if (!hasActions)
1007
+ return null;
1008
+ return (React__default["default"].createElement(DataListLayoutActionsWrapper, null,
1009
+ React__default["default"].createElement(DataListItemActionsOverflow, { actions: actions })));
835
1010
  }
836
- function breakpointToMediaQuery(breakpoint) {
837
- return `(min-width: ${BREAKPOINT_SIZES[breakpoint]}px)`;
1011
+ function DataListLayoutActionsWrapper({ children }) {
1012
+ const { isInLayoutProvider } = useDataListLayoutContext();
1013
+ if (isInLayoutProvider)
1014
+ return React__default["default"].createElement(React__default["default"].Fragment, null, children);
1015
+ return React__default["default"].createElement("div", { className: styles.hidden }, children);
1016
+ }
1017
+
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;
1022
+ }
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);
838
1033
  }
839
1034
 
840
1035
  function DataList(_a) {
841
- var _b;
842
- 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({});
843
1039
  const searchComponent = getCompoundComponent(props.children, DataListSearch);
844
1040
  const filterComponent = getCompoundComponent(props.children, DataListFilters);
845
1041
  const layoutComponents = getCompoundComponents(props.children, DataListLayout);
846
1042
  const emptyStateComponents = getCompoundComponents(props.children, DataListEmptyState);
847
1043
  const itemActionComponent = getCompoundComponent(props.children, DataListItemActions);
1044
+ const bulkActionsComponent = getCompoundComponent(props.children, DataListBulkActions);
848
1045
  return (React__default["default"].createElement(DataListContext.Provider, { value: Object.assign(Object.assign({ searchComponent,
849
1046
  filterComponent,
850
1047
  layoutComponents,
851
1048
  emptyStateComponents,
852
- 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,
853
1055
  // T !== DataListObject
854
1056
  sorting: sorting }) },
855
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
+ }
856
1064
  }
857
1065
  function InternalDataList() {
858
- 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();
859
1067
  const backToTopRef = React.useRef(null);
860
- const headerData = generateHeaderElements(headers);
861
- const mediaMatches = useLayoutMediaQueries();
862
1068
  const initialLoading = loadingState === "initial";
863
1069
  const showEmptyState = !initialLoading && data.length === 0;
864
1070
  const shouldRenderLoadMoreTrigger = !initialLoading && !showEmptyState;
865
- return (React__default["default"].createElement("div", { className: styles$d.wrapper },
866
- React__default["default"].createElement("div", { className: styles$d.titleContainer },
1071
+ return (React__default["default"].createElement("div", { className: styles$f.wrapper },
1072
+ React__default["default"].createElement("div", { className: styles$f.titleContainer },
867
1073
  title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
868
1074
  React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: initialLoading })),
869
1075
  React__default["default"].createElement("div", { ref: backToTopRef }),
870
1076
  React__default["default"].createElement(DataListStickyHeader, null,
871
- React__default["default"].createElement("div", { className: styles$d.headerFilters },
1077
+ React__default["default"].createElement("div", { className: styles$f.headerFilters },
872
1078
  React__default["default"].createElement(InternalDataListFilters, null),
873
1079
  React__default["default"].createElement(InternalDataListSearch, null)),
874
- headerData && (React__default["default"].createElement(DataListHeader, { layouts: layoutComponents, headerData: headerData, headerVisibility: headerVisibility, mediaMatches: mediaMatches }))),
875
- 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),
876
1083
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
877
- !initialLoading && (React__default["default"].createElement(DataListItems, { data: data, layouts: layoutComponents, mediaMatches: mediaMatches })),
878
- loadingState === "filtering" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_FILTERING_SPINNER_TEST_ID, className: styles$d.filtering },
879
- React__default["default"].createElement("div", { className: styles$d.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 },
880
1087
  React__default["default"].createElement(Spinner.Spinner, { size: "small" })))),
881
1088
  shouldRenderLoadMoreTrigger && (React__default["default"].createElement(DataListLoadMore, { onBackToTop: handleBackToTop }))));
882
1089
  function handleBackToTop() {
@@ -892,11 +1099,54 @@ function InternalDataList() {
892
1099
  });
893
1100
  }
894
1101
  }
1102
+ /**
1103
+ * Sets the layout that the DataList item and header will use.
1104
+ */
895
1105
  DataList.Layout = DataListLayout;
1106
+ /**
1107
+ * By using this component, we can render the actions anywhere in the layout
1108
+ * instead of being added automatically on hover.
1109
+ */
1110
+ DataList.LayoutActions = DataListLayoutActions;
1111
+ /**
1112
+ * When the DataList is either empty and/or filtered, this component will be
1113
+ * rendered.
1114
+ */
896
1115
  DataList.EmptyState = DataListEmptyState;
1116
+ /**
1117
+ * Adds the filter components of your choosing to the DataList.
1118
+ */
897
1119
  DataList.Filters = DataListFilters;
1120
+ /**
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.
1125
+ */
898
1126
  DataList.Search = DataListSearch;
1127
+ /**
1128
+ * Defines the group actions you could do on a single DataList item.
1129
+ */
899
1130
  DataList.ItemActions = DataListItemActions;
900
- DataList.Action = DataListAction;
1131
+ /**
1132
+ * Defines the group actions you could do on multiple DataList items.
1133
+ */
1134
+ DataList.BulkActions = DataListBulkActions;
1135
+ /**
1136
+ * Defines the action in a DataList. This should be used inside the
1137
+ * DataListItemActions component.
1138
+ */
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;
901
1151
 
902
1152
  exports.DataList = DataList;