@jobber/components 4.35.0 → 4.37.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -15,4 +15,6 @@ export declare const SEARCH_DEBOUNCE_DELAY: number;
15
15
  export declare const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
16
16
  export declare const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
17
17
  export declare const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
18
+ export declare const TRANSITION_DURATION_IN_SECONDS: number;
19
+ export declare const TRANSITION_DELAY_IN_SECONDS: number;
18
20
  export {};
@@ -4,10 +4,14 @@ import { DataListFilters } from "./components/DataListFilters";
4
4
  import { DataListSearch } from "./components/DataListSearch";
5
5
  import { DataListEmptyState } from "./components/DataListEmptyState";
6
6
  import { DataListObject, DataListProps } from "./DataList.types";
7
- export declare function DataList<T extends DataListObject>(props: DataListProps<T>): JSX.Element;
7
+ import { DataListItemActions } from "./components/DataListItemActions";
8
+ import { DataListAction } from "./components/DataListAction";
9
+ export declare function DataList<T extends DataListObject>({ sorting, ...props }: DataListProps<T>): JSX.Element;
8
10
  export declare namespace DataList {
9
11
  var Layout: typeof DataListLayout;
10
12
  var EmptyState: typeof DataListEmptyState;
11
13
  var Filters: typeof DataListFilters;
12
14
  var Search: typeof DataListSearch;
15
+ var ItemActions: typeof DataListItemActions;
16
+ var Action: typeof DataListAction;
13
17
  }
@@ -1,4 +1,5 @@
1
1
  import { ReactElement, ReactNode } from "react";
2
+ import { IconNames } from "@jobber/design";
2
3
  import { Breakpoints } from "./DataList.const";
3
4
  import { ButtonProps } from "../Button";
4
5
  export { Breakpoints } from "./DataList.const";
@@ -29,6 +30,10 @@ export interface DataListObject {
29
30
  export type DataListHeader<T extends DataListObject> = {
30
31
  readonly [K in keyof T]?: string;
31
32
  };
33
+ export interface DataListSorting {
34
+ readonly key: string;
35
+ readonly direction: "asc" | "desc";
36
+ }
32
37
  export interface DataListProps<T extends DataListObject> {
33
38
  /**
34
39
  * The data to render in the DataList.
@@ -76,6 +81,16 @@ export interface DataListProps<T extends DataListObject> {
76
81
  * The callback function when the user scrolls to the bottom of the list.
77
82
  */
78
83
  readonly onLoadMore?: () => void;
84
+ /**
85
+ * `sortable`: List of keys that are sortable.
86
+ * `state`: The state of the sorting.
87
+ * `onSort`: The callback function when the user sorting a column.
88
+ */
89
+ readonly sorting?: {
90
+ readonly sortable: (keyof DataListHeader<T>)[];
91
+ readonly state: DataListSorting | undefined;
92
+ readonly onSort: (sorting?: DataListSorting) => void;
93
+ };
79
94
  /**
80
95
  * Callback when an item checkbox is clicked.
81
96
  */
@@ -130,4 +145,34 @@ export interface DataListContextProps<T extends DataListObject> extends DataList
130
145
  readonly searchComponent?: ReactElement<DataListSearchProps>;
131
146
  readonly emptyStateComponents?: ReactElement<DataListEmptyStateProps>[];
132
147
  readonly layoutComponents?: ReactElement<DataListLayoutProps<T>>[];
148
+ readonly itemActionComponent?: ReactElement<DataListItemActionsProps<T>>;
149
+ }
150
+ type Fragment<T> = T | T[];
151
+ export interface DataListItemActionsProps<T extends DataListObject> {
152
+ /**
153
+ * The actions to render for each item in the DataList. This only accepts the
154
+ * DataList.Action component.
155
+ */
156
+ readonly children?: Fragment<ReactElement<DataListActionProps<T>>>;
157
+ }
158
+ export interface DataListActionProps<T extends DataListObject> {
159
+ /**
160
+ * The label of the action
161
+ */
162
+ readonly label: string;
163
+ /**
164
+ * The icon beside the label
165
+ */
166
+ readonly icon?: IconNames;
167
+ /**
168
+ * Adjust the styling of an action label and icon to be more destructive.
169
+ */
170
+ readonly destructive?: boolean;
171
+ /**
172
+ * The callback function when the action is clicked.
173
+ */
174
+ readonly onClick?: (data: T) => void;
175
+ }
176
+ export interface InternalDataListActionProps<T extends DataListObject> extends DataListActionProps<T> {
177
+ readonly item: T;
133
178
  }
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { DataListActionProps, DataListObject, InternalDataListActionProps } from "../../DataList.types";
3
+ export declare function DataListAction<T extends DataListObject>(_: DataListActionProps<T>): null;
4
+ export declare function InternalDataListAction<T extends DataListObject>({ label, icon, destructive, onClick, item, }: InternalDataListActionProps<T>): JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./DataListAction";
@@ -0,0 +1,11 @@
1
+ import { PropsWithChildren } from "react";
2
+ interface DataListActionsMenuProps {
3
+ readonly visible: boolean;
4
+ readonly position: {
5
+ readonly x: number;
6
+ readonly y: number;
7
+ };
8
+ readonly onRequestClose: () => void;
9
+ }
10
+ export declare function DataListActionsMenu({ visible, position, onRequestClose, children, }: PropsWithChildren<DataListActionsMenuProps>): JSX.Element;
11
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./DataListActionsMenu";
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { DataListHeader, DataListObject } from "../../DataList.types";
3
+ interface DataListHeaderTileProps<T extends DataListObject> {
4
+ readonly headers: DataListHeader<T>;
5
+ readonly headerKey: string;
6
+ }
7
+ export declare function DataListHeaderTile<T extends DataListObject>({ headers, headerKey, }: DataListHeaderTileProps<T>): JSX.Element;
8
+ export {};
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ export declare function SortingArrows({ order }: {
3
+ order: "asc" | "desc";
4
+ }): JSX.Element;
@@ -0,0 +1 @@
1
+ export * from "./DataListHeaderTile";
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ import { DataListItemActionsProps, DataListObject } from "../../DataList.types";
3
+ export declare function DataListItemActions<T extends DataListObject>(_: DataListItemActionsProps<T>): null;
4
+ interface InternalDataListItemActionsProps<T extends DataListObject> {
5
+ readonly item: T;
6
+ }
7
+ export declare function InternalDataListItemActions<T extends DataListObject>({ item, }: InternalDataListItemActionsProps<T>): JSX.Element | null;
8
+ export {};
@@ -0,0 +1,7 @@
1
+ import { ReactElement } from "react";
2
+ import { DataListActionProps, DataListObject, InternalDataListActionProps } from "../../DataList.types";
3
+ interface DataListItemActionsOverflowProps<T extends DataListObject> extends Pick<InternalDataListActionProps<T>, "item"> {
4
+ readonly actions: ReactElement<DataListActionProps<T>>[];
5
+ }
6
+ export declare function DataListItemActionsOverflow<T extends DataListObject>({ item, actions, }: DataListItemActionsOverflowProps<T>): JSX.Element;
7
+ export {};
@@ -0,0 +1 @@
1
+ export * from "./DataListItemActions";
@@ -1,2 +1,2 @@
1
1
  export * from "./DataList";
2
- export { DataListItemType } from "./DataList.types";
2
+ export { DataListItemType, DataListSorting } from "./DataList.types";
@@ -2,33 +2,39 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
+ var tslib_es6 = require('../tslib.es6-5b8768b7.js');
5
6
  var React = require('react');
6
7
  var styleInject_es = require('../style-inject.es-9d2f5f4e.js');
7
8
  var Text = require('../Text-e7ed0974.js');
8
9
  var Glimmer = require('../Glimmer-cfa92a88.js');
10
+ var framerMotion = require('framer-motion');
9
11
  var design = require('@jobber/design');
10
12
  var isEmpty = require('lodash/isEmpty');
11
13
  var InlineLabel = require('../InlineLabel-afd5fc6f.js');
14
+ var classnames = require('classnames');
15
+ var Icon = require('../Icon-405a216c.js');
12
16
  var FormatDate = require('../FormatDate-70ea5b43.js');
13
17
  var Heading = require('../Heading-a1191b15.js');
14
- var classnames = require('classnames');
15
18
  require('uuid');
16
19
  require('react-hook-form');
17
20
  var Checkbox = require('../Checkbox-3bccf65c.js');
18
- require('../Typography-fd6f932a.js');
21
+ var Typography = require('../Typography-fd6f932a.js');
22
+ require('react-router-dom');
23
+ var Button = require('../Button-7698424c.js');
24
+ require('react-dom');
25
+ var Tooltip = require('../Tooltip-bf67fe6e.js');
26
+ require('react-popper');
27
+ var useFocusTrap = require('@jobber/hooks/useFocusTrap');
28
+ var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
29
+ var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
19
30
  var useInView = require('@jobber/hooks/useInView');
20
31
  var debounce = require('lodash/debounce');
21
32
  var InputText = require('../InputText-bb03f6d1.js');
22
- var Button = require('../Button-7698424c.js');
23
33
  var AnimatedSwitcher = require('../AnimatedSwitcher-d1e1ddcf.js');
24
34
  var Spinner = require('../Spinner-9d8fc7ff.js');
25
- require('../tslib.es6-5b8768b7.js');
26
35
  require('../Content-2ca1ffe1.js');
27
- require('../Icon-405a216c.js');
28
36
  require('../FormField-0f880b07.js');
29
37
  require('../InputValidation-b5a3d92c.js');
30
- require('framer-motion');
31
- require('react-router-dom');
32
38
 
33
39
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
34
40
 
@@ -37,13 +43,13 @@ var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
37
43
  var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
38
44
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
39
45
 
40
- var css_248z$8 = ".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 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.Gj9kAGnfKco- > * {\n font-weight: 500;\n}\n\n.ise8kHCfhCY- {\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}\n\n.d-79rkMqufg- {\n display: grid;\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 grid-column-gap: calc(16px / 2);\n grid-column-gap: var(--space-small);\n column-gap: var(--space-small);\n -ms-flex-align: start;\n align-items: flex-start;\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\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.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";
41
- var styles$8 = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","headerLabel":"Gj9kAGnfKco-","listItem":"ise8kHCfhCY-","selectable":"d-79rkMqufg-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-"};
42
- styleInject_es.styleInject(css_248z$8);
46
+ var css_248z$d = ".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 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.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}\n\n.d-79rkMqufg- {\n display: grid;\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 grid-column-gap: calc(16px / 2);\n grid-column-gap: var(--space-small);\n column-gap: var(--space-small);\n -ms-flex-align: start;\n align-items: flex-start;\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\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.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";
47
+ var styles$d = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","listItem":"ise8kHCfhCY-","selectable":"d-79rkMqufg-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-"};
48
+ styleInject_es.styleInject(css_248z$d);
43
49
 
44
- var css_248z$7 = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
45
- var styles$7 = {"results":"F56prQsXm3A-"};
46
- styleInject_es.styleInject(css_248z$7);
50
+ var css_248z$c = ".F56prQsXm3A- {\n min-width: 80px;\n margin-left: calc(16px / 2);\n margin-left: var(--space-small);\n}\n";
51
+ var styles$c = {"results":"F56prQsXm3A-"};
52
+ styleInject_es.styleInject(css_248z$c);
47
53
 
48
54
  const DATALIST_TOTALCOUNT_TEST_ID = "ATL-DataList-TotalCount";
49
55
  function DataListTotalCount({ totalCount, loading, }) {
@@ -59,12 +65,12 @@ function DataListTotalCount({ totalCount, loading, }) {
59
65
  totalCount.toLocaleString(),
60
66
  " results)"));
61
67
  }
62
- return (React__default["default"].createElement("div", { className: styles$7.results, "data-testid": DATALIST_TOTALCOUNT_TEST_ID }, output));
68
+ return (React__default["default"].createElement("div", { className: styles$c.results, "data-testid": DATALIST_TOTALCOUNT_TEST_ID }, output));
63
69
  }
64
70
 
65
- var css_248z$6 = ".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";
66
- var styles$6 = {"loadingItem":"Rh--6fVpkm4-","mobileLoadingState":"zbS7UvpVoWI-"};
67
- styleInject_es.styleInject(css_248z$6);
71
+ 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";
72
+ var styles$b = {"loadingItem":"Rh--6fVpkm4-","mobileLoadingState":"zbS7UvpVoWI-"};
73
+ styleInject_es.styleInject(css_248z$b);
68
74
 
69
75
  const EMPTY_RESULTS_MESSAGE = "List is looking empty";
70
76
  const EMPTY_FILTER_RESULTS_MESSAGE = "No results for selected filters";
@@ -84,10 +90,12 @@ const SEARCH_DEBOUNCE_DELAY = design.tokens["timing-slowest"];
84
90
  const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
85
91
  const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
86
92
  const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
93
+ const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
94
+ const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
87
95
 
88
- var css_248z$5 = ".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(--color-white);\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}\n";
89
- var styles$5 = {"tags":"WRV-UmQmPzo-","tagCount":"liQeWCMenD0-"};
90
- styleInject_es.styleInject(css_248z$5);
96
+ 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(--color-white);\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}\n";
97
+ var styles$a = {"tags":"WRV-UmQmPzo-","tagCount":"liQeWCMenD0-"};
98
+ styleInject_es.styleInject(css_248z$a);
91
99
 
92
100
  function DataListTags({ items }) {
93
101
  const ref = React.useRef(null);
@@ -107,10 +115,10 @@ function DataListTags({ items }) {
107
115
  elements === null || elements === void 0 ? void 0 : elements.forEach(element => observer.unobserve(element));
108
116
  };
109
117
  }, [items]);
110
- return (React__default["default"].createElement("div", { className: styles$5.tags, ref: ref },
118
+ return (React__default["default"].createElement("div", { className: styles$a.tags, ref: ref },
111
119
  items.filter(Boolean).map((tag, index) => (React__default["default"].createElement("div", { key: tag, "data-tag-element": index },
112
120
  React__default["default"].createElement(InlineLabel.InlineLabel, null, tag)))),
113
- Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$5.tagCount },
121
+ Boolean(visibleItems) && (React__default["default"].createElement("div", { className: styles$a.tagCount },
114
122
  React__default["default"].createElement(Text.Text, null,
115
123
  "+",
116
124
  visibleItems)))));
@@ -139,6 +147,63 @@ function buildIntersectionThreshold(items) {
139
147
  return thresholds;
140
148
  }
141
149
 
150
+ var css_248z$9 = ".fLmJZJJqMcE- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n padding: 0;\n border: none;\n background-color: transparent;\n}\n\n.UG8cHUT3Hds- {\n cursor: pointer;\n}\n\n.fLmJZJJqMcE- > * {\n font-weight: 500;\n}\n";
151
+ var styles$9 = {"headerLabel":"fLmJZJJqMcE-","sortable":"UG8cHUT3Hds-"};
152
+ styleInject_es.styleInject(css_248z$9);
153
+
154
+ var css_248z$8 = ".XWu7WFLqpYw- {\n position: absolute;\n bottom: calc((16px * 1) - (16px / 8));\n bottom: calc(calc(16px * 1) - calc(16px / 8));\n bottom: calc(var(--space-base) - var(--space-smallest));\n}\n\n.bZLExYQzHAk- {\n position: absolute;\n bottom: calc(16px / 2);\n bottom: var(--space-small);\n}\n";
155
+ var styles$8 = {"arrowUp":"XWu7WFLqpYw-","arrowDown":"bZLExYQzHAk-"};
156
+ styleInject_es.styleInject(css_248z$8);
157
+
158
+ function SortingArrows({ order }) {
159
+ const activeColor = "blue";
160
+ const inactiveColor = "greyBlueLighter";
161
+ return (React__default["default"].createElement("div", null,
162
+ React__default["default"].createElement("span", { className: styles$8.arrowUp },
163
+ React__default["default"].createElement(Icon.Icon, { name: "arrowUp", color: order === "asc" ? activeColor : inactiveColor, size: "small" })),
164
+ React__default["default"].createElement("span", { className: styles$8.arrowDown },
165
+ React__default["default"].createElement(Icon.Icon, { name: "arrowDown", color: order === "desc" ? activeColor : inactiveColor, size: "small" }))));
166
+ }
167
+
168
+ const defaultValues = {
169
+ title: "",
170
+ data: [],
171
+ headers: {},
172
+ children: [],
173
+ selected: [],
174
+ };
175
+ const DataListContext = React.createContext(defaultValues);
176
+ function useDataListContext() {
177
+ return React.useContext(DataListContext);
178
+ }
179
+
180
+ function DataListHeaderTile({ headers, headerKey, }) {
181
+ const { sorting } = useDataListContext();
182
+ const isSortable = sorting === null || sorting === void 0 ? void 0 : sorting.sortable.includes(headerKey);
183
+ const sortingState = sorting === null || sorting === void 0 ? void 0 : sorting.state;
184
+ const Tag = isSortable ? "button" : "div";
185
+ return (React__default["default"].createElement(Tag, { className: classnames__default["default"](styles$9.headerLabel, {
186
+ [styles$9.sortable]: isSortable,
187
+ }), onClick: handleOnClick },
188
+ React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
189
+ (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey && (React__default["default"].createElement(SortingArrows, { order: sortingState.direction }))));
190
+ function toggleSorting(sortingKey) {
191
+ if ((sortingState === null || sortingState === void 0 ? void 0 : sortingState.direction) === "desc") {
192
+ sorting === null || sorting === void 0 ? void 0 : sorting.onSort(undefined);
193
+ return;
194
+ }
195
+ sorting === null || sorting === void 0 ? void 0 : sorting.onSort({
196
+ direction: (sortingState === null || sortingState === void 0 ? void 0 : sortingState.direction) === "asc" ? "desc" : "asc",
197
+ key: sortingKey,
198
+ });
199
+ }
200
+ function handleOnClick() {
201
+ if (!isSortable)
202
+ return;
203
+ toggleSorting(headerKey);
204
+ }
205
+ }
206
+
142
207
  /**
143
208
  * Return the child component that matches the `type` provided
144
209
  */
@@ -188,8 +253,7 @@ function generateListItemElements(data) {
188
253
  * Generate the header elements with the default styling
189
254
  */
190
255
  function generateHeaderElements(headers) {
191
- const headerElements = Object.keys(headers).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: (React__default["default"].createElement("div", { className: styles$8.headerLabel },
192
- React__default["default"].createElement(Text.Text, { variation: "subdued", maxLines: "single", size: "small" }, headers[key]))) })), {});
256
+ const headerElements = Object.keys(headers).reduce((acc, key) => (Object.assign(Object.assign({}, acc), { [key]: React__default["default"].createElement(DataListHeaderTile, { headers: headers, headerKey: key }) })), {});
193
257
  return isEmpty__default["default"](headerElements) ? undefined : headerElements;
194
258
  }
195
259
  function sortSizeProp(sizeProp) {
@@ -228,23 +292,11 @@ function isLayoutVisible({ layoutSize, mediaMatches, sizePropsOfLayouts, }) {
228
292
  return isVisibleBreakpoint && largerLayoutIsNotVisible;
229
293
  }
230
294
 
231
- const defaultValues = {
232
- title: "",
233
- data: [],
234
- headers: {},
235
- children: [],
236
- selected: [],
237
- };
238
- const DataListContext = React.createContext(defaultValues);
239
- function useDataListContext() {
240
- return React.useContext(DataListContext);
241
- }
242
-
243
295
  function DataListItemInternal({ children, item, }) {
244
296
  const { selected, onSelect } = useDataListContext();
245
297
  if (selected !== undefined && onSelect) {
246
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$8.selectable, {
247
- [styles$8.selected]: selected === null || selected === void 0 ? void 0 : selected.length,
298
+ return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$d.selectable, {
299
+ [styles$d.selected]: selected === null || selected === void 0 ? void 0 : selected.length,
248
300
  }) },
249
301
  React__default["default"].createElement(Checkbox.Checkbox, { checked: selected === null || selected === void 0 ? void 0 : selected.includes(item.id), onChange: handleChange }),
250
302
  children));
@@ -260,12 +312,139 @@ function DataListItemInternal({ children, item, }) {
260
312
  }
261
313
  }
262
314
 
315
+ 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";
316
+ var styles$7 = {"menu":"jHcHGQ-HDbk-"};
317
+ styleInject_es.styleInject(css_248z$7);
318
+
319
+ 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";
320
+ var styles$6 = {"action":"iyg43v-S9yU-","label":"AUJNqz93ZDA-"};
321
+ styleInject_es.styleInject(css_248z$6);
322
+
323
+ function DataListAction(
324
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
325
+ _) {
326
+ return null;
327
+ }
328
+ function InternalDataListAction({ label, icon, destructive, onClick, item, }) {
329
+ const color = destructive ? "critical" : "blue";
330
+ return (React__default["default"].createElement("button", { className: styles$6.action, onClick: () => onClick === null || onClick === void 0 ? void 0 : onClick(item) },
331
+ icon && React__default["default"].createElement(Icon.Icon, { name: icon, color: color }),
332
+ React__default["default"].createElement(Typography.Typography, { textColor: color },
333
+ React__default["default"].createElement("span", { className: styles$6.label }, label))));
334
+ }
335
+
336
+ 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";
337
+ var styles$5 = {"menu":"aokwZU8jbWU-","overlay":"XtVRP97TVSE-"};
338
+ styleInject_es.styleInject(css_248z$5);
339
+
340
+ const variants$1 = {
341
+ hidden: { opacity: 0, y: -10 },
342
+ visible: { opacity: 1, y: 0 },
343
+ };
344
+ function DataListActionsMenu({ visible = false, position, onRequestClose, children, }) {
345
+ const [ref, setRef] = React.useState();
346
+ useRefocusOnActivator.useRefocusOnActivator(visible);
347
+ const focusTrapRef = useFocusTrap.useFocusTrap(visible);
348
+ useOnKeyDown.useOnKeyDown(onRequestClose, "Escape");
349
+ return (React__default["default"].createElement(framerMotion.AnimatePresence, null, visible && (React__default["default"].createElement(React__default["default"].Fragment, null,
350
+ React__default["default"].createElement("div", { className: styles$5.overlay, onClick: onRequestClose }),
351
+ React__default["default"].createElement(framerMotion.motion.div, { ref: setRef, variants: variants$1, initial: "hidden", animate: "visible", exit: "hidden", transition: { duration: TRANSITION_DELAY_IN_SECONDS }, className: styles$5.menu, style: getPositionCssVars() },
352
+ React__default["default"].createElement("div", { tabIndex: 0, ref: focusTrapRef }, children))))));
353
+ function getPositionCssVars() {
354
+ const { posX, posY } = getPosition();
355
+ return {
356
+ "--actions-menu-x": `${posX}px`,
357
+ "--actions-menu-y": `${posY}px`,
358
+ };
359
+ }
360
+ function getPosition() {
361
+ const rect = ref === null || ref === void 0 ? void 0 : ref.getBoundingClientRect();
362
+ const { width = 0, height = 0 } = rect || {};
363
+ const { x = 0, y = 0 } = position;
364
+ const xIsOffScreen = x + width > window.innerWidth;
365
+ const yIsOffScreen = y + height > window.innerHeight;
366
+ const yOffSet = y + height - window.innerHeight;
367
+ const newPosX = Math.floor(xIsOffScreen ? x - width : x);
368
+ const newPosY = Math.floor(yIsOffScreen ? y - yOffSet : y);
369
+ return { posX: newPosX, posY: newPosY };
370
+ }
371
+ }
372
+
373
+ function DataListItemActionsOverflow({ item, actions, }) {
374
+ const [menuPosition, setMenuPosition] = React.useState({ x: 0, y: 0 });
375
+ const [showMenu, setShowMenu] = React.useState(false);
376
+ return (React__default["default"].createElement(React__default["default"].Fragment, null,
377
+ React__default["default"].createElement(Tooltip.Tooltip, { message: "More actions" },
378
+ React__default["default"].createElement(Button.Button, { icon: "more", ariaLabel: "More actions", type: "secondary", variation: "subtle", onClick: handleMoreClick })),
379
+ 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 })))))));
380
+ function handleMoreClick(event) {
381
+ setShowMenu(true);
382
+ const rect = event.currentTarget.getBoundingClientRect();
383
+ const posX = rect.x + rect.width;
384
+ const posY = rect.y + rect.height;
385
+ setMenuPosition({ x: posX, y: posY });
386
+ }
387
+ function handleClose() {
388
+ setShowMenu(false);
389
+ }
390
+ }
391
+
392
+ // This component is meant to capture the props of the DataList.ItemActions
393
+ function DataListItemActions(
394
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
395
+ _) {
396
+ return null;
397
+ }
398
+ const variants = {
399
+ hidden: { opacity: 0, y: 10 },
400
+ visible: { opacity: 1, y: 0 },
401
+ };
402
+ function InternalDataListItemActions({ item, }) {
403
+ const { itemActionComponent } = useDataListContext();
404
+ if (!itemActionComponent)
405
+ return null;
406
+ const { children } = itemActionComponent.props;
407
+ const childrenArray = React.Children.toArray(children).filter(React.isValidElement);
408
+ const exposedActions = getExposedActions(childrenArray);
409
+ childrenArray.splice(0, exposedActions.length);
410
+ return (React__default["default"].createElement(framerMotion.motion.div, { variants: variants, initial: "hidden", animate: "visible", exit: "hidden", transition: {
411
+ duration: TRANSITION_DURATION_IN_SECONDS,
412
+ delay: TRANSITION_DELAY_IN_SECONDS,
413
+ }, className: styles$7.menu },
414
+ exposedActions.map(({ props }) => {
415
+ if (!props.icon)
416
+ return null;
417
+ return (React__default["default"].createElement(Tooltip.Tooltip, { key: props.label, message: props.label },
418
+ 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" })));
419
+ }),
420
+ React__default["default"].createElement(DataListItemActionsOverflow, { actions: childrenArray, item: item })));
421
+ }
422
+ function getExposedActions(childrenArray) {
423
+ const firstTwoChildren = childrenArray.slice(0, 2);
424
+ return firstTwoChildren.reduce((result, child, i) => {
425
+ const hasIcon = Boolean(child.props.icon);
426
+ const isFirstChild = i === 0;
427
+ if (isFirstChild && hasIcon) {
428
+ return [...result, child];
429
+ }
430
+ const isSecondChild = i === 1;
431
+ const hasFirstChild = result.length === 1;
432
+ if (isSecondChild && hasIcon && hasFirstChild) {
433
+ return [...result, child];
434
+ }
435
+ return result;
436
+ }, []);
437
+ }
438
+
263
439
  function DataListItems({ layouts, mediaMatches, data, }) {
264
440
  const elementData = generateListItemElements(data);
441
+ const [hover, setHover] = React.useState();
265
442
  return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, mediaMatches: mediaMatches, renderLayout: layout => {
266
443
  return (React__default["default"].createElement(React__default["default"].Fragment, null, elementData.map((child, i) => {
267
- return (React__default["default"].createElement("div", { className: styles$8.listItem, key: `${data[i].id}` },
268
- React__default["default"].createElement(DataListItemInternal, { item: data[i] }, layout.props.children(child))));
444
+ const item = data[i];
445
+ return (React__default["default"].createElement("div", { onMouseEnter: () => setHover(item.id), onMouseLeave: () => setHover(undefined), className: styles$d.listItem, key: item.id },
446
+ React__default["default"].createElement(DataListItemInternal, { item: data[i] }, layout.props.children(child)),
447
+ React__default["default"].createElement(framerMotion.AnimatePresence, null, hover === item.id && (React__default["default"].createElement(InternalDataListItemActions, { item: item })))));
269
448
  })));
270
449
  } }));
271
450
  }
@@ -281,7 +460,7 @@ function DataListHeader({ layouts, mediaMatches, headerData, headerVisibility, }
281
460
  if (!showHeader || !headerData)
282
461
  return React__default["default"].createElement(React__default["default"].Fragment, null);
283
462
  return (React__default["default"].createElement(DataListLayoutInternal, { layouts: layouts, renderLayout: layout => {
284
- return (React__default["default"].createElement("div", { className: styles$8.headerTitles }, layout.props.children(headerData)));
463
+ return (React__default["default"].createElement("div", { className: styles$d.headerTitles }, layout.props.children(headerData)));
285
464
  }, mediaMatches: mediaMatches }));
286
465
  }
287
466
 
@@ -297,13 +476,13 @@ function DataListLoadingState({ headers, layouts, mediaMatches, }) {
297
476
  if (layout.props.size === "xs") {
298
477
  return React__default["default"].createElement(LoadingStateXSBreakpoint, null);
299
478
  }
300
- return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingElements.map((child, i) => (React__default["default"].createElement("div", { className: styles$6.loadingItem, key: i, "data-testid": DATALIST_LOADINGSTATE_ROW_TEST_ID }, layout.props.children(child))))));
479
+ 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))))));
301
480
  } }));
302
481
  }
303
482
  function LoadingStateXSBreakpoint() {
304
483
  const loadingData = new Array(LOADING_STATE_LIMIT_ITEMS).fill(0);
305
484
  return (React__default["default"].createElement(React__default["default"].Fragment, null, loadingData.map((_, i) => {
306
- return (React__default["default"].createElement("div", { className: styles$6.mobileLoadingState, key: i },
485
+ return (React__default["default"].createElement("div", { className: styles$b.mobileLoadingState, key: i },
307
486
  React__default["default"].createElement(Glimmer.Glimmer.Text, null)));
308
487
  })));
309
488
  }
@@ -505,16 +684,21 @@ function breakpointToMediaQuery(breakpoint) {
505
684
  return `(min-width: ${BREAKPOINT_SIZES[breakpoint]}px)`;
506
685
  }
507
686
 
508
- function DataList(props) {
509
- var _a;
687
+ function DataList(_a) {
688
+ var _b;
689
+ var { sorting } = _a, props = tslib_es6.__rest(_a, ["sorting"]);
510
690
  const searchComponent = getCompoundComponent(props.children, DataListSearch);
511
691
  const filterComponent = getCompoundComponent(props.children, DataListFilters);
512
692
  const layoutComponents = getCompoundComponents(props.children, DataListLayout);
513
693
  const emptyStateComponents = getCompoundComponents(props.children, DataListEmptyState);
694
+ const itemActionComponent = getCompoundComponent(props.children, DataListItemActions);
514
695
  return (React__default["default"].createElement(DataListContext.Provider, { value: Object.assign(Object.assign({ searchComponent,
515
696
  filterComponent,
516
697
  layoutComponents,
517
- emptyStateComponents }, props), { selected: (_a = props.selected) !== null && _a !== void 0 ? _a : [] }) },
698
+ emptyStateComponents,
699
+ itemActionComponent }, props), { selected: (_b = props.selected) !== null && _b !== void 0 ? _b : [],
700
+ // T !== DataListObject
701
+ sorting: sorting }) },
518
702
  React__default["default"].createElement(InternalDataList, null)));
519
703
  }
520
704
  function InternalDataList() {
@@ -525,21 +709,21 @@ function InternalDataList() {
525
709
  const initialLoading = loadingState === "initial";
526
710
  const showEmptyState = !initialLoading && data.length === 0;
527
711
  const shouldRenderLoadMoreTrigger = !initialLoading && !showEmptyState;
528
- return (React__default["default"].createElement("div", { className: styles$8.wrapper },
529
- React__default["default"].createElement("div", { className: styles$8.titleContainer },
712
+ return (React__default["default"].createElement("div", { className: styles$d.wrapper },
713
+ React__default["default"].createElement("div", { className: styles$d.titleContainer },
530
714
  title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
531
715
  React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: initialLoading })),
532
716
  React__default["default"].createElement("div", { ref: backToTopRef }),
533
717
  React__default["default"].createElement(DataListStickyHeader, null,
534
- React__default["default"].createElement("div", { className: styles$8.headerFilters },
718
+ React__default["default"].createElement("div", { className: styles$d.headerFilters },
535
719
  React__default["default"].createElement(InternalDataListFilters, null),
536
720
  React__default["default"].createElement(InternalDataListSearch, null)),
537
721
  headerData && (React__default["default"].createElement(DataListHeader, { layouts: layoutComponents, headerData: headerData, headerVisibility: headerVisibility, mediaMatches: mediaMatches }))),
538
722
  initialLoading && (React__default["default"].createElement(DataListLoadingState, { headers: headers, layouts: layoutComponents, mediaMatches: mediaMatches })),
539
723
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
540
724
  !initialLoading && (React__default["default"].createElement(DataListItems, { data: data, layouts: layoutComponents, mediaMatches: mediaMatches })),
541
- loadingState === "filtering" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_FILTERING_SPINNER_TEST_ID, className: styles$8.filtering },
542
- React__default["default"].createElement("div", { className: styles$8.filteringSpinner },
725
+ loadingState === "filtering" && (React__default["default"].createElement("div", { "data-testid": DATA_LIST_FILTERING_SPINNER_TEST_ID, className: styles$d.filtering },
726
+ React__default["default"].createElement("div", { className: styles$d.filteringSpinner },
543
727
  React__default["default"].createElement(Spinner.Spinner, { size: "small" })))),
544
728
  shouldRenderLoadMoreTrigger && (React__default["default"].createElement(DataListLoadMore, { onBackToTop: handleBackToTop }))));
545
729
  function handleBackToTop() {
@@ -559,5 +743,7 @@ DataList.Layout = DataListLayout;
559
743
  DataList.EmptyState = DataListEmptyState;
560
744
  DataList.Filters = DataListFilters;
561
745
  DataList.Search = DataListSearch;
746
+ DataList.ItemActions = DataListItemActions;
747
+ DataList.Action = DataListAction;
562
748
 
563
749
  exports.DataList = DataList;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.35.0",
3
+ "version": "4.37.0",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -19,7 +19,7 @@
19
19
  "dist/*"
20
20
  ],
21
21
  "dependencies": {
22
- "@jobber/design": "^0.44.4",
22
+ "@jobber/design": "^0.45.0",
23
23
  "@jobber/formatters": "*",
24
24
  "@jobber/hooks": "^2.3.0",
25
25
  "@popperjs/core": "^2.0.6",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "616c498cc1bfeedcc752700c6bcbc64f4f914350"
87
+ "gitHead": "dda25792fbf293e140e1e07367dccbbe0f2d022e"
88
88
  }