@jobber/components 4.77.5 → 4.77.6-JOB-84042.2

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 (34) hide show
  1. package/AnimatedPresence.d.ts +1 -0
  2. package/AnimatedPresence.js +17 -0
  3. package/dist/AnimatedPresence/AnimatedPresence.d.ts +24 -0
  4. package/dist/AnimatedPresence/AnimatedPresence.transitions.d.ts +11 -0
  5. package/dist/AnimatedPresence/hooks/usePreviousValue.d.ts +2 -0
  6. package/dist/AnimatedPresence/index.d.ts +1 -0
  7. package/dist/AnimatedPresence/index.js +12 -0
  8. package/dist/AnimatedPresence-20a02aaa.js +104 -0
  9. package/dist/Autocomplete/index.js +3 -2
  10. package/dist/Card/index.js +3 -2
  11. package/dist/{Card-426a68a8.js → Card-0a6f3a28.js} +1 -1
  12. package/dist/Chip/index.js +3 -2
  13. package/dist/{Chip-c91fd6c8.js → Chip-3d1bfddc.js} +1 -1
  14. package/dist/Chips/index.js +2 -1
  15. package/dist/Combobox/Combobox.types.d.ts +12 -0
  16. package/dist/Combobox/components/ComboboxContent/ComboboxLoadMore/ComboboxLoadMore.d.ts +6 -0
  17. package/dist/Combobox/components/ComboboxContent/ComboboxLoadMore/index.d.ts +1 -0
  18. package/dist/Combobox/hooks/useMakeComboboxHandlers.d.ts +1 -1
  19. package/dist/Combobox/index.js +8 -5
  20. package/dist/{Combobox-237caf42.js → Combobox-d24f1fec.js} +56 -39
  21. package/dist/DataDump/index.js +3 -2
  22. package/dist/DataList/DataList.const.d.ts +1 -0
  23. package/dist/DataList/DataList.types.d.ts +5 -4
  24. package/dist/DataList/index.d.ts +1 -1
  25. package/dist/DataList/index.js +27 -25
  26. package/dist/InputText/index.js +2 -1
  27. package/dist/{InputText-6e356985.js → InputText-6c71361e.js} +2 -1
  28. package/dist/Menu/Menu.d.ts +4 -4
  29. package/dist/Menu/index.js +2 -1
  30. package/dist/{Menu-81b12936.js → Menu-5fc613a1.js} +2 -1
  31. package/dist/Page/index.js +2 -1
  32. package/dist/Tooltip/index.js +2 -1
  33. package/dist/{Tooltip-27771182.js → Tooltip-ef3d6ef4.js} +2 -1
  34. package/package.json +5 -5
@@ -0,0 +1 @@
1
+ export * from "./dist/AnimatedPresence";
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true,
5
+ });
6
+
7
+ var AnimatedPresence = require("./dist/AnimatedPresence");
8
+
9
+ Object.keys(AnimatedPresence).forEach(function(key) {
10
+ if (key === "default" || key === "__esModule") return;
11
+ Object.defineProperty(exports, key, {
12
+ enumerable: true,
13
+ get: function get() {
14
+ return AnimatedPresence[key];
15
+ },
16
+ });
17
+ });
@@ -0,0 +1,24 @@
1
+ import { PropsWithChildren } from "react";
2
+ declare const transitions: {
3
+ fromBottom: import("framer-motion").Variants;
4
+ fromTop: import("framer-motion").Variants;
5
+ fromLeft: import("framer-motion").Variants;
6
+ fromRight: import("framer-motion").Variants;
7
+ popIn: import("framer-motion").Variants;
8
+ fromLeftToRight: import("framer-motion").Variants;
9
+ fromRightToLeft: import("framer-motion").Variants;
10
+ fade: import("framer-motion").Variants;
11
+ };
12
+ export type AnimatedPresenceTransitions = keyof typeof transitions;
13
+ interface AnimatedPresenceProps extends Required<PropsWithChildren> {
14
+ /**
15
+ * The type of transition you can use.
16
+ */
17
+ readonly transition?: AnimatedPresenceTransitions;
18
+ /**
19
+ * Whether or not to animate the children on mount. By default it's set to false.
20
+ */
21
+ readonly initial?: boolean;
22
+ }
23
+ export declare function AnimatedPresence(props: AnimatedPresenceProps): JSX.Element;
24
+ export {};
@@ -0,0 +1,11 @@
1
+ import { Variants } from "framer-motion";
2
+ export declare const TIMING_QUICK: number;
3
+ export declare const TIMING_BASE: number;
4
+ export declare const fade: Variants;
5
+ export declare const popIn: Variants;
6
+ export declare const fromTop: Variants;
7
+ export declare const fromBottom: Variants;
8
+ export declare const fromLeft: Variants;
9
+ export declare const fromRight: Variants;
10
+ export declare const fromLeftToRight: Variants;
11
+ export declare const fromRightToLeft: Variants;
@@ -0,0 +1,2 @@
1
+ /// <reference types="react" />
2
+ export declare function usePreviousValue<T>(value: T): readonly [T, import("react").Dispatch<import("react").SetStateAction<T>>];
@@ -0,0 +1 @@
1
+ export * from "./AnimatedPresence";
@@ -0,0 +1,12 @@
1
+ 'use strict';
2
+
3
+ Object.defineProperty(exports, '__esModule', { value: true });
4
+
5
+ var AnimatedPresence = require('../AnimatedPresence-20a02aaa.js');
6
+ require('react');
7
+ require('framer-motion');
8
+ require('@jobber/design');
9
+
10
+
11
+
12
+ exports.AnimatedPresence = AnimatedPresence.AnimatedPresence;
@@ -0,0 +1,104 @@
1
+ 'use strict';
2
+
3
+ var React = require('react');
4
+ var framerMotion = require('framer-motion');
5
+ var design = require('@jobber/design');
6
+
7
+ function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
8
+
9
+ var React__default = /*#__PURE__*/_interopDefaultLegacy(React);
10
+
11
+ const TIMING_QUICK = toSeconds(design.tokens["timing-quick"]);
12
+ const TIMING_BASE = toSeconds(design.tokens["timing-base"]);
13
+ const baseTransition = {
14
+ visible: { opacity: 1 },
15
+ hidden: { opacity: 0 },
16
+ };
17
+ const fade = {
18
+ visible: { opacity: 1 },
19
+ hidden: { opacity: 0 },
20
+ };
21
+ const popIn = {
22
+ visible: Object.assign({ scale: 1 }, baseTransition.visible),
23
+ hidden: Object.assign({ scale: 0.95 }, baseTransition.hidden),
24
+ };
25
+ const fromTop = {
26
+ visible: Object.assign({ y: 0 }, baseTransition.visible),
27
+ hidden: Object.assign({ y: -design.tokens["space-base"] }, baseTransition.hidden),
28
+ };
29
+ const fromBottom = {
30
+ visible: Object.assign({ y: 0 }, baseTransition.visible),
31
+ hidden: Object.assign({ y: design.tokens["space-base"] }, baseTransition.hidden),
32
+ };
33
+ const fromLeft = {
34
+ visible: Object.assign({ x: 0 }, baseTransition.visible),
35
+ hidden: Object.assign({ x: -design.tokens["space-base"] }, baseTransition.hidden),
36
+ };
37
+ const fromRight = {
38
+ visible: Object.assign({ x: 0 }, baseTransition.visible),
39
+ hidden: Object.assign({ x: design.tokens["space-base"] }, baseTransition.hidden),
40
+ };
41
+ const fromLeftToRight = {
42
+ initial: Object.assign({ x: -design.tokens["space-base"] }, baseTransition.hidden),
43
+ visible: Object.assign({ x: 0 }, baseTransition.visible),
44
+ hidden: Object.assign({ x: design.tokens["space-base"] }, baseTransition.hidden),
45
+ };
46
+ const fromRightToLeft = {
47
+ initial: Object.assign({ x: design.tokens["space-base"] }, baseTransition.hidden),
48
+ visible: Object.assign({ x: 0 }, baseTransition.visible),
49
+ hidden: Object.assign({ x: -design.tokens["space-base"] }, baseTransition.hidden),
50
+ };
51
+ function toSeconds(ms) {
52
+ return ms / 1000;
53
+ }
54
+
55
+ function usePreviousValue(value) {
56
+ const [previousValue, setPreviousValue] = React.useState(value);
57
+ React.useEffect(() => {
58
+ setPreviousValue(value);
59
+ }, [value]);
60
+ return [previousValue, setPreviousValue];
61
+ }
62
+
63
+ const transitions = {
64
+ fromBottom,
65
+ fromTop,
66
+ fromLeft,
67
+ fromRight,
68
+ popIn,
69
+ fromLeftToRight,
70
+ fromRightToLeft,
71
+ fade,
72
+ };
73
+ function AnimatedPresence(props) {
74
+ const shouldReduceMotion = framerMotion.useReducedMotion();
75
+ if (shouldReduceMotion) {
76
+ return React__default["default"].createElement(React__default["default"].Fragment, null, props.children);
77
+ }
78
+ return React__default["default"].createElement(InternalAnimatedPresence, Object.assign({}, props));
79
+ }
80
+ function InternalAnimatedPresence({ transition = "fromTop", initial = false, children, }) {
81
+ const transitionVariation = transitions[transition];
82
+ const hasInitialTransition = "initial" in transitionVariation;
83
+ const childCount = React.Children.count(children);
84
+ // Set the initial value to 0 so it staggers the animation on mount when
85
+ // initial is true.
86
+ const [lastChildIndex, setLastChildIndex] = usePreviousValue(0);
87
+ // Whenever the children count changes, update the last index.
88
+ React.useEffect(() => {
89
+ setLastChildIndex(childCount - 1);
90
+ }, [childCount]);
91
+ return (React__default["default"].createElement(framerMotion.AnimatePresence, { initial: initial, mode: "popLayout" }, React.Children.map(children, (child, i) => child && (React__default["default"].createElement(framerMotion.motion.div, { layout: true, variants: transitionVariation, initial: hasInitialTransition ? "initial" : "hidden", animate: "visible", exit: "hidden", transition: {
92
+ duration: TIMING_BASE,
93
+ delay: generateDelayTime(i),
94
+ } }, child)))));
95
+ function generateDelayTime(index) {
96
+ // Don't add a delay if it's already rendered.
97
+ if (lastChildIndex > index)
98
+ return 0;
99
+ // Stagger the animation starting after the previous last child index.
100
+ return (index - lastChildIndex) * TIMING_QUICK;
101
+ }
102
+ }
103
+
104
+ exports.AnimatedPresence = AnimatedPresence;
@@ -10,10 +10,11 @@ var classnames = require('classnames');
10
10
  var ReactDOM = require('react-dom');
11
11
  var reactPopper = require('react-popper');
12
12
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
13
+ var useSafeLayoutEffect = require('@jobber/hooks/useSafeLayoutEffect');
13
14
  var Text = require('../Text-259af966.js');
14
15
  var Icon = require('../Icon-405a216c.js');
15
16
  var Heading = require('../Heading-1e8e4bd3.js');
16
- var InputText = require('../InputText-6e356985.js');
17
+ var InputText = require('../InputText-6c71361e.js');
17
18
  require('../Typography-c45bf216.js');
18
19
  require('@jobber/design');
19
20
  require('../getAtlantisConfig-0f3e8af2.js');
@@ -127,7 +128,7 @@ function useRepositionMenu(attachTo, visible = false) {
127
128
  { name: "flip", options: { fallbackPlacements: ["top"] } },
128
129
  ],
129
130
  });
130
- React.useLayoutEffect(() => {
131
+ useSafeLayoutEffect.useSafeLayoutEffect(() => {
131
132
  var _a;
132
133
  (_a = popper === null || popper === void 0 ? void 0 : popper.update) === null || _a === void 0 ? void 0 : _a.call(popper);
133
134
  }, [visible]);
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Card = require('../Card-426a68a8.js');
5
+ var Card = require('../Card-0a6f3a28.js');
6
6
  require('react');
7
7
  require('classnames');
8
8
  require('../style-inject.es-9d2f5f4e.js');
@@ -13,11 +13,12 @@ require('../Button-b73a5e01.js');
13
13
  require('react-router-dom');
14
14
  require('../Icon-405a216c.js');
15
15
  require('@jobber/design');
16
- require('../Menu-81b12936.js');
16
+ require('../Menu-5fc613a1.js');
17
17
  require('uuid');
18
18
  require('framer-motion');
19
19
  require('@jobber/hooks/useOnKeyDown');
20
20
  require('@jobber/hooks/useRefocusOnActivator');
21
+ require('@jobber/hooks/useSafeLayoutEffect');
21
22
 
22
23
 
23
24
 
@@ -5,7 +5,7 @@ var classnames = require('classnames');
5
5
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
6
6
  var Heading = require('./Heading-1e8e4bd3.js');
7
7
  var Button = require('./Button-b73a5e01.js');
8
- var Menu = require('./Menu-81b12936.js');
8
+ var Menu = require('./Menu-5fc613a1.js');
9
9
 
10
10
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
11
11
 
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Chip = require('../Chip-c91fd6c8.js');
5
+ var Chip = require('../Chip-3d1bfddc.js');
6
6
  var tslib_es6 = require('../tslib.es6-754e2961.js');
7
7
  var React = require('react');
8
8
  var Icon = require('../Icon-405a216c.js');
@@ -12,9 +12,10 @@ require('../style-inject.es-9d2f5f4e.js');
12
12
  require('../Avatar-76a799fa.js');
13
13
  require('color');
14
14
  require('../Typography-c45bf216.js');
15
- require('../Tooltip-27771182.js');
15
+ require('../Tooltip-ef3d6ef4.js');
16
16
  require('react-dom');
17
17
  require('framer-motion');
18
+ require('@jobber/hooks/useSafeLayoutEffect');
18
19
  require('react-popper');
19
20
  require('@jobber/design');
20
21
 
@@ -7,7 +7,7 @@ var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
7
  var Avatar = require('./Avatar-76a799fa.js');
8
8
  var Icon = require('./Icon-405a216c.js');
9
9
  var Typography = require('./Typography-c45bf216.js');
10
- var Tooltip = require('./Tooltip-27771182.js');
10
+ var Tooltip = require('./Tooltip-ef3d6ef4.js');
11
11
 
12
12
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
13
13
 
@@ -9,7 +9,7 @@ var useAssert = require('@jobber/hooks/useAssert');
9
9
  var Icon = require('../Icon-405a216c.js');
10
10
  var Avatar = require('../Avatar-76a799fa.js');
11
11
  var Typography = require('../Typography-c45bf216.js');
12
- var Tooltip = require('../Tooltip-27771182.js');
12
+ var Tooltip = require('../Tooltip-ef3d6ef4.js');
13
13
  var uuid = require('uuid');
14
14
  var sortBy = require('lodash/sortBy');
15
15
  var useLiveAnnounce = require('@jobber/hooks/useLiveAnnounce');
@@ -22,6 +22,7 @@ require('@jobber/design');
22
22
  require('color');
23
23
  require('react-dom');
24
24
  require('framer-motion');
25
+ require('@jobber/hooks/useSafeLayoutEffect');
25
26
  require('react-router-dom');
26
27
 
27
28
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -34,6 +34,10 @@ export interface ComboboxProps {
34
34
  * The amount of time in ms to debounce the onSearch callback. Defaults to 300ms.
35
35
  */
36
36
  readonly onSearchDebounce?: number;
37
+ /**
38
+ * Callback to load more options, this is called when the user scrolls to the bottom of the list.
39
+ */
40
+ readonly onLoadMore?: () => void;
37
41
  /**
38
42
  * The Chip heading for the trigger
39
43
  */
@@ -97,6 +101,10 @@ export interface ComboboxContentProps {
97
101
  * Function called when search input changes.
98
102
  */
99
103
  readonly handleSearchChange: (value: string) => void;
104
+ /**
105
+ * Callback to load more options, this is called when the user scrolls to the bottom of the list.
106
+ */
107
+ readonly onLoadMore?: () => void;
100
108
  /**
101
109
  * Reference to the wrapping div element of all the Combobox pieces
102
110
  */
@@ -191,6 +199,10 @@ export interface ComboboxListProps {
191
199
  * Should loading state be shown.
192
200
  */
193
201
  readonly loading?: boolean;
202
+ /**
203
+ * Callback to load more options, this is called when the user scrolls to the bottom of the list.
204
+ */
205
+ readonly onLoadMore?: () => void;
194
206
  }
195
207
  export interface ComboboxActionProps {
196
208
  /**
@@ -0,0 +1,6 @@
1
+ /// <reference types="react" />
2
+ interface ComboboxLoadMoreProps {
3
+ readonly onLoadMore: () => void;
4
+ }
5
+ export declare function ComboboxLoadMore({ onLoadMore }: ComboboxLoadMoreProps): JSX.Element;
6
+ export {};
@@ -0,0 +1 @@
1
+ export { ComboboxLoadMore } from "./ComboboxLoadMore";
@@ -4,4 +4,4 @@ export interface UseMakeComboboxHandlersReturn {
4
4
  handleClose: () => void;
5
5
  handleSelection: (selection: ComboboxOption) => void;
6
6
  }
7
- export declare function useMakeComboboxHandlers(setOpen: (open: boolean) => void, setSearchValue: (searchValue: string) => void, selectedOptions: ComboboxOption[], shouldScroll: React.MutableRefObject<boolean>, selectedStateSetter: (selected: ComboboxOption[]) => void, multiSelect?: boolean, onClose?: () => void): UseMakeComboboxHandlersReturn;
7
+ export declare function useMakeComboboxHandlers(setOpen: (open: boolean) => void, setSearchValue: (searchValue: string) => void, selectedOptions: ComboboxOption[], shouldScroll: React.MutableRefObject<boolean>, selectedStateSetter: (selected: ComboboxOption[]) => void, multiSelect?: boolean, onClose?: () => void, onSearch?: (searchValue: string) => void): UseMakeComboboxHandlersReturn;
@@ -2,7 +2,7 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Combobox = require('../Combobox-237caf42.js');
5
+ var Combobox = require('../Combobox-d24f1fec.js');
6
6
  require('react');
7
7
  require('classnames');
8
8
  require('react-dom');
@@ -14,18 +14,21 @@ require('../Typography-c45bf216.js');
14
14
  require('../Glimmer-7c317864.js');
15
15
  require('../tslib.es6-754e2961.js');
16
16
  require('../Content-e3f7b6fc.js');
17
+ require('../Spinner-9d8fc7ff.js');
18
+ require('../AnimatedPresence-20a02aaa.js');
19
+ require('framer-motion');
20
+ require('@jobber/hooks/useInView');
17
21
  require('../Button-b73a5e01.js');
18
22
  require('react-router-dom');
19
23
  require('@jobber/hooks/useRefocusOnActivator');
20
24
  require('@jobber/hooks/useFocusTrap');
21
25
  require('react-popper');
22
26
  require('@jobber/hooks/useOnKeyDown');
23
- require('../Chip-c91fd6c8.js');
24
- require('@jobber/hooks/useInView');
27
+ require('../Chip-3d1bfddc.js');
25
28
  require('../Avatar-76a799fa.js');
26
29
  require('color');
27
- require('../Tooltip-27771182.js');
28
- require('framer-motion');
30
+ require('../Tooltip-ef3d6ef4.js');
31
+ require('@jobber/hooks/useSafeLayoutEffect');
29
32
  require('lodash/debounce');
30
33
  require('lodash/noop');
31
34
  require('@jobber/hooks/useAssert');
@@ -7,14 +7,17 @@ var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
7
7
  var Icon = require('./Icon-405a216c.js');
8
8
  var Text = require('./Text-259af966.js');
9
9
  var Glimmer = require('./Glimmer-7c317864.js');
10
+ var Spinner = require('./Spinner-9d8fc7ff.js');
11
+ var AnimatedPresence = require('./AnimatedPresence-20a02aaa.js');
10
12
  var tslib_es6 = require('./tslib.es6-754e2961.js');
13
+ var useInView = require('@jobber/hooks/useInView');
11
14
  var Typography = require('./Typography-c45bf216.js');
12
15
  var Button = require('./Button-b73a5e01.js');
13
16
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
14
17
  var useFocusTrap = require('@jobber/hooks/useFocusTrap');
15
18
  var reactPopper = require('react-popper');
16
19
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
17
- var Chip = require('./Chip-c91fd6c8.js');
20
+ var Chip = require('./Chip-3d1bfddc.js');
18
21
  var debounce = require('lodash/debounce');
19
22
  var noop = require('lodash/noop');
20
23
  require('@jobber/design');
@@ -28,13 +31,13 @@ var ReactDOM__default = /*#__PURE__*/_interopDefaultLegacy(ReactDOM);
28
31
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
29
32
  var noop__default = /*#__PURE__*/_interopDefaultLegacy(noop);
30
33
 
31
- var css_248z$6 = ".m1w5vdUZ6rQ- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc((16px * 4) * 3.75);\n width: calc(calc(16px * 4) * 3.75);\n width: calc(var(--space-extravagant) * 3.75);\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n margin-top: calc(16px / 2);\n margin-top: var(--space-small);\n border: calc(16px / 16) solid rgb(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n overflow: auto;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n.jobber-retheme .m1w5vdUZ6rQ- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n}\n\n/* CAUTION: Tests for content visibility assume this class' presence hides the content\n* so please be careful if you change this class name, or the css rules within.\n*/\n\n.m1w5vdUZ6rQ-.Zlkv2HA096A- {\n display: none;\n visibility: hidden;\n}\n\n.m1w5vdUZ6rQ-:focus,\n.m1w5vdUZ6rQ-:focus-visible {\n outline: none;\n}\n\n.m1w5vdUZ6rQ-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n\n.YQry-Rd6zfQ- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: sticky;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n bottom: 0;\n width: 100%;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.TcpqL34s4lI- {\n padding-bottom: calc(16px / 2);\n padding-bottom: var(--space-small);\n}\n";
32
- var styles$6 = {"content":"m1w5vdUZ6rQ-","hidden":"Zlkv2HA096A-","actions":"YQry-Rd6zfQ-","actionPadding":"TcpqL34s4lI-"};
33
- styleInject_es.styleInject(css_248z$6);
34
+ var css_248z$7 = ".m1w5vdUZ6rQ- {\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc((16px * 4) * 3.75);\n width: calc(calc(16px * 4) * 3.75);\n width: calc(var(--space-extravagant) * 3.75);\n box-shadow: 0px calc(16px / 16) calc(16px / 4) 0px\n rgba(0, 0, 0, 0.1),\n 0px calc(16px / 4) 12px 0px rgba(0, 0, 0, 0.05);\n box-shadow: var(--shadow-base);\n margin-top: calc(16px / 2);\n margin-top: var(--space-small);\n border: calc(16px / 16) solid rgb(217, 223, 225);\n border: var(--border-base) solid var(--color-border);\n border-radius: calc(16px / 2);\n border-radius: var(--radius-larger);\n overflow: auto;\n background: rgba(255, 255, 255, 1);\n background: var(--color-surface);\n}\n\n.jobber-retheme .m1w5vdUZ6rQ- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n}\n\n/* CAUTION: Tests for content visibility assume this class' presence hides the content\n* so please be careful if you change this class name, or the css rules within.\n*/\n\n.m1w5vdUZ6rQ-.Zlkv2HA096A- {\n display: none;\n visibility: hidden;\n}\n\n.m1w5vdUZ6rQ-:focus,\n.m1w5vdUZ6rQ-:focus-visible {\n outline: none;\n}\n\n.m1w5vdUZ6rQ-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n\n.YQry-Rd6zfQ- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: sticky;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n bottom: 0;\n width: 100%;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n}\n\n.TcpqL34s4lI- {\n padding-bottom: calc(16px / 2);\n padding-bottom: var(--space-small);\n}\n";
35
+ var styles$7 = {"content":"m1w5vdUZ6rQ-","hidden":"Zlkv2HA096A-","actions":"YQry-Rd6zfQ-","actionPadding":"TcpqL34s4lI-"};
36
+ styleInject_es.styleInject(css_248z$7);
34
37
 
35
- var css_248z$5 = ".MIyb-oFZg9w- {\n position: relative;\n}\n\n.WZPK91I4aJs- {\n width: 100%;\n padding: calc(16px * 1);\n padding: var(--space-base);\n padding-right: calc((16px * 1.5) * 2.25);\n padding-right: calc(calc(16px * 1.5) * 2.25);\n padding-right: calc(var(--space-large) * 2.25);\n border: none;\n border-bottom: calc(16px / 16) solid rgb(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n font-family: \"Inter\", Helvetica, Arial, sans-serif;\n font-family: var(--typography--fontFamily-normal);\n font-size: calc((16px * 1) * 0.875);\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n}\n\n.WZPK91I4aJs-::-webkit-search-decoration,\n.WZPK91I4aJs-::-webkit-search-cancel-button,\n.WZPK91I4aJs-::-webkit-search-results-button,\n.WZPK91I4aJs-::-webkit-search-results-decoration {\n -webkit-appearance: none;\n}\n\n.WZPK91I4aJs-:focus {\n outline: none;\n}\n\n._7loHrVUe-Rk- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 50%;\n right: calc(16px * 1);\n right: var(--space-base);\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n padding: 0;\n border: none;\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgb(238, 240, 242);\n background-color: var(--color-surface--background);\n cursor: pointer;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n._7loHrVUe-Rk-:focus {\n outline: transparent;\n}\n\n._7loHrVUe-Rk-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
36
- var styles$5 = {"search":"MIyb-oFZg9w-","searchInput":"WZPK91I4aJs-","clearSearch":"_7loHrVUe-Rk-"};
37
- styleInject_es.styleInject(css_248z$5);
38
+ var css_248z$6 = ".MIyb-oFZg9w- {\n position: relative;\n}\n\n.WZPK91I4aJs- {\n width: 100%;\n padding: calc(16px * 1);\n padding: var(--space-base);\n padding-right: calc((16px * 1.5) * 2.25);\n padding-right: calc(calc(16px * 1.5) * 2.25);\n padding-right: calc(var(--space-large) * 2.25);\n border: none;\n border-bottom: calc(16px / 16) solid rgb(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n font-family: \"Inter\", Helvetica, Arial, sans-serif;\n font-family: var(--typography--fontFamily-normal);\n font-size: calc((16px * 1) * 0.875);\n font-size: calc(calc(16px * 1) * 0.875);\n font-size: var(--typography--fontSize-base);\n}\n\n.WZPK91I4aJs-::-webkit-search-decoration,\n.WZPK91I4aJs-::-webkit-search-cancel-button,\n.WZPK91I4aJs-::-webkit-search-results-button,\n.WZPK91I4aJs-::-webkit-search-results-decoration {\n -webkit-appearance: none;\n}\n\n.WZPK91I4aJs-:focus {\n outline: none;\n}\n\n._7loHrVUe-Rk- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 50%;\n right: calc(16px * 1);\n right: var(--space-base);\n z-index: 1002;\n z-index: var(--elevation-tooltip);\n width: calc(16px * 1.5);\n width: var(--space-large);\n height: calc(16px * 1.5);\n height: var(--space-large);\n padding: 0;\n border: none;\n border-radius: 100%;\n border-radius: var(--radius-circle);\n background-color: rgb(238, 240, 242);\n background-color: var(--color-surface--background);\n cursor: pointer;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n -ms-flex-pack: center;\n justify-content: center;\n -ms-flex-align: center;\n align-items: center;\n}\n\n._7loHrVUe-Rk-:focus {\n outline: transparent;\n}\n\n._7loHrVUe-Rk-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
39
+ var styles$6 = {"search":"MIyb-oFZg9w-","searchInput":"WZPK91I4aJs-","clearSearch":"_7loHrVUe-Rk-"};
40
+ styleInject_es.styleInject(css_248z$6);
38
41
 
39
42
  function ComboboxContentSearch(props) {
40
43
  const searchRef = React.useRef(null);
@@ -46,9 +49,9 @@ function ComboboxContentSearch(props) {
46
49
  }, 0);
47
50
  }
48
51
  }, [props.open]);
49
- return (React__default["default"].createElement("div", { className: styles$5.search },
50
- React__default["default"].createElement("input", { type: "search", ref: searchRef, className: styles$5.searchInput, placeholder: props.placeholder ? `Search ${props.placeholder}` : "Search", onChange: (event) => handleSearch(event), value: props.searchValue }),
51
- props.searchValue && (React__default["default"].createElement("button", { className: styles$5.clearSearch, onClick: clearSearch, type: "button", "data-testid": "ATL-Combobox-Content-Search-Clear", "aria-label": "Clear search" },
52
+ return (React__default["default"].createElement("div", { className: styles$6.search },
53
+ React__default["default"].createElement("input", { type: "search", ref: searchRef, className: styles$6.searchInput, placeholder: props.placeholder ? `Search ${props.placeholder}` : "Search", onChange: (event) => handleSearch(event), value: props.searchValue }),
54
+ props.searchValue && (React__default["default"].createElement("button", { className: styles$6.clearSearch, onClick: clearSearch, type: "button", "data-testid": "ATL-Combobox-Content-Search-Clear", "aria-label": "Clear search" },
52
55
  React__default["default"].createElement(Icon.Icon, { name: "remove", size: "small" })))));
53
56
  function clearSearch() {
54
57
  var _a;
@@ -62,13 +65,13 @@ function ComboboxContentSearch(props) {
62
65
  }
63
66
  }
64
67
 
65
- var css_248z$4 = ".SgMzjOcdE-E- {\n position: relative;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n}\n\n.TwoTCjgcssc- {\n display: -ms-flexbox;\n display: flex;\n max-height: calc((16px / 2) * 33.33);\n max-height: calc(calc(16px / 2) * 33.33);\n max-height: calc(var(--space-small) * 33.33);\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n -ms-flex-direction: column;\n flex-direction: column;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n\n._8T5M7MGwCRE-,\n._4y5NXkNeIQM- {\n padding: calc(16px / 2) calc(16px * 1);\n padding: var(--space-small) var(--space-base);\n}\n\n.SgMzjOcdE-E-::before,\n.SgMzjOcdE-E-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n pointer-events: none;\n transition: opacity 0.3s ease-in-out;\n}\n\n.SgMzjOcdE-E-::after {\n bottom: calc(16px / 2);\n bottom: var(--space-small);\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0) 0%,\n rgb(255, 255, 255) 100%\n );\n}\n\n.SgMzjOcdE-E-::before {\n top: calc(16px / 2);\n top: var(--space-small);\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n\n.T6E3VwBGoQM-::before,\n._6HQzxMQkXnE-::before {\n opacity: 0;\n}\n\n._5YsJZyMDkbA-::after,\n._6HQzxMQkXnE-::after {\n opacity: 0;\n}\n\n.A6z4OI58xoE- {\n padding: calc(16px * 1) calc(16px * 1);\n padding: var(--space-base) var(--space-base);\n}\n";
66
- var styles$4 = {"container":"SgMzjOcdE-E-","optionsList":"TwoTCjgcssc-","filterMessage":"_8T5M7MGwCRE-","emptyStateMessage":"_4y5NXkNeIQM-","scrollTop":"T6E3VwBGoQM-","scrollNone":"_6HQzxMQkXnE-","scrollBottom":"_5YsJZyMDkbA-","loadingContainer":"A6z4OI58xoE-"};
67
- styleInject_es.styleInject(css_248z$4);
68
+ var css_248z$5 = ".SgMzjOcdE-E- {\n position: relative;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n}\n\n.TwoTCjgcssc- {\n display: -ms-flexbox;\n display: flex;\n\n max-height: calc((16px / 2) * 33.33);\n\n max-height: calc(calc(16px / 2) * 33.33);\n\n max-height: calc(var(--space-small) * 33.33);\n margin: 0;\n padding: 0;\n overflow: auto;\n list-style: none;\n -ms-flex-direction: column;\n flex-direction: column;\n gap: calc(16px / 4);\n gap: var(--space-smaller);\n}\n\n._8T5M7MGwCRE-,\n._4y5NXkNeIQM- {\n padding: calc(16px / 2) calc(16px * 1);\n padding: var(--space-small) var(--space-base);\n}\n\n.SgMzjOcdE-E-::before,\n.SgMzjOcdE-E-::after {\n content: \"\";\n display: block;\n position: absolute;\n right: 0;\n left: 0;\n height: calc(16px * 1);\n height: var(--space-base);\n pointer-events: none;\n transition: opacity 0.3s ease-in-out;\n}\n\n.SgMzjOcdE-E-::after {\n bottom: calc(16px / 2);\n bottom: var(--space-small);\n background: linear-gradient(\n 180deg,\n rgba(255, 255, 255, 0) 0%,\n rgb(255, 255, 255) 100%\n );\n}\n\n.SgMzjOcdE-E-::before {\n top: calc(16px / 2);\n top: var(--space-small);\n background: linear-gradient(\n to bottom,\n rgba(255, 255, 255, 1),\n rgba(255, 255, 255, 0)\n );\n}\n\n.T6E3VwBGoQM-::before,\n._6HQzxMQkXnE-::before {\n opacity: 0;\n}\n\n._5YsJZyMDkbA-::after,\n._6HQzxMQkXnE-::after {\n opacity: 0;\n}\n\n.A6z4OI58xoE- {\n padding: calc(16px * 1) calc(16px * 1);\n padding: var(--space-base) var(--space-base);\n}\n\n.A6z4OI58xoE-.QqHBSf52fPk- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-pack: center;\n justify-content: center;\n position: sticky;\n bottom: 0;\n padding: calc(16px * 1) 0;\n padding: var(--space-base) 0;\n}\n\n.A6z4OI58xoE-.QqHBSf52fPk-:empty {\n display: none;\n}\n";
69
+ var styles$5 = {"container":"SgMzjOcdE-E-","optionsList":"TwoTCjgcssc-","filterMessage":"_8T5M7MGwCRE-","emptyStateMessage":"_4y5NXkNeIQM-","scrollTop":"T6E3VwBGoQM-","scrollNone":"_6HQzxMQkXnE-","scrollBottom":"_5YsJZyMDkbA-","loadingContainer":"A6z4OI58xoE-","hasOptions":"QqHBSf52fPk-"};
70
+ styleInject_es.styleInject(css_248z$5);
68
71
 
69
- var css_248z$3 = "._5QdRGmaNHvc- {\n display: -ms-flexbox;\n display: flex;\n min-height: calc((calc(16px * 3) - calc(16px / 4)));\n min-height: calc((var(--space-largest) - var(--space-smaller)));\n box-sizing: border-box;\n margin: 0 calc(16px / 2);\n margin: 0 var(--space-small);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-radius: calc(16px / 4);\n border-radius: var(--radius-large);\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n font-weight: 500;\n cursor: pointer;\n transition: all 200ms;\n transition: all var(--timing-base);\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.jobber-retheme ._5QdRGmaNHvc- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n}\n\n._5QdRGmaNHvc-:hover,\n._5QdRGmaNHvc-:focus-visible {\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n._5QdRGmaNHvc-:focus,\n._5QdRGmaNHvc-:focus-visible {\n outline: none;\n}\n\n._5QdRGmaNHvc-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
70
- var styles$3 = {"option":"_5QdRGmaNHvc-"};
71
- styleInject_es.styleInject(css_248z$3);
72
+ var css_248z$4 = "._5QdRGmaNHvc- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-negative: 0;\n flex-shrink: 0;\n min-height: calc((calc(16px * 3) - calc(16px / 4)));\n min-height: calc((var(--space-largest) - var(--space-smaller)));\n box-sizing: border-box;\n margin: 0 calc(16px / 2);\n margin: 0 var(--space-small);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-radius: calc(16px / 4);\n border-radius: var(--radius-large);\n color: rgb(1, 41, 57);\n color: var(--color-heading);\n font-weight: 500;\n cursor: pointer;\n transition: all 200ms;\n transition: all var(--timing-base);\n -ms-flex-pack: justify;\n justify-content: space-between;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.jobber-retheme ._5QdRGmaNHvc- {\n border-radius: calc(16px / 8);\n border-radius: var(--radius-base);\n}\n\n._5QdRGmaNHvc-:hover,\n._5QdRGmaNHvc-:focus-visible {\n background-color: rgb(244, 246, 250);\n background-color: var(--color-surface--hover);\n}\n\n._5QdRGmaNHvc-:focus,\n._5QdRGmaNHvc-:focus-visible {\n outline: none;\n}\n\n._5QdRGmaNHvc-:focus-visible {\n box-shadow: 0px 0px 0px calc(16px / 8) rgba(255, 255, 255, 1),\n 0px 0px 0px calc(16px / 4) rgb(147, 161, 169);\n box-shadow: var(--shadow-focus);\n}\n";
73
+ var styles$4 = {"option":"_5QdRGmaNHvc-"};
74
+ styleInject_es.styleInject(css_248z$4);
72
75
 
73
76
  const ComboboxContext = React__default["default"].createContext({});
74
77
  function ComboboxContextProvider(_a) {
@@ -80,29 +83,42 @@ function ComboboxOption(props) {
80
83
  const { selected, selectionHandler } = React.useContext(ComboboxContext);
81
84
  const isSelected = selected.some(selection => selection.id.toString() === props.id.toString());
82
85
  return (React__default["default"].createElement("li", { key: props.id, tabIndex: -1, "data-selected": isSelected, role: "option", "aria-selected": isSelected, onClick: () => selectionHandler &&
83
- selectionHandler({ id: props.id, label: props.label }), className: classnames__default["default"](styles$3.option) },
86
+ selectionHandler({ id: props.id, label: props.label }), className: classnames__default["default"](styles$4.option) },
84
87
  props.label,
85
- isSelected && React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" })));
88
+ React__default["default"].createElement("div", null, isSelected && React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" }))));
89
+ }
90
+
91
+ var css_248z$3 = "._3s8-RC5Ky3s- {\n -webkit-transform: translateY(calc((16px * 3) * -1));\n -webkit-transform: translateY(calc(calc(16px * 3) * -1));\n -webkit-transform: translateY(calc(var(--space-largest) * -1));\n transform: translateY(calc((16px * 3) * -1));\n transform: translateY(calc(calc(16px * 3) * -1));\n transform: translateY(calc(var(--space-largest) * -1));\n}\n";
92
+ var styles$3 = {"trigger":"_3s8-RC5Ky3s-"};
93
+ styleInject_es.styleInject(css_248z$3);
94
+
95
+ function ComboboxLoadMore({ onLoadMore }) {
96
+ const [inViewRef, isInView] = useInView.useInView();
97
+ React.useEffect(() => {
98
+ isInView && onLoadMore();
99
+ }, [isInView]);
100
+ return (React__default["default"].createElement("div", { "data-testid": "ATL-Combobox-Loadmore-Trigger", ref: inViewRef, className: styles$3.trigger }));
86
101
  }
87
102
 
88
103
  function ComboboxContentList(props) {
89
104
  const optionsExist = props.options.length > 0;
90
- const showOptions = optionsExist && !props.loading;
91
105
  const hasSearchTerm = props.searchValue.length > 0;
92
106
  const { listScrollState } = useScrollState(props.optionsListRef, props.options);
93
- return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$4.container, styles$4[listScrollState]) },
94
- optionsExist && (React__default["default"].createElement("ul", { className: styles$4.optionsList, role: "listbox", "aria-multiselectable": props.multiselect, ref: props.optionsListRef },
95
- showOptions &&
96
- props.options.map(option => {
97
- return (React__default["default"].createElement(ComboboxOption, { key: option.id, id: option.id, label: option.label }));
98
- }),
99
- props.loading && (React__default["default"].createElement(React__default["default"].Fragment, null, Array.from({ length: 5 }).map((_, index) => (React__default["default"].createElement("div", { className: styles$4.loadingContainer, key: index },
100
- React__default["default"].createElement(Glimmer.Glimmer, { shape: "rectangle", size: "small" })))))))),
101
- hasSearchTerm && !optionsExist && (React__default["default"].createElement("div", { className: styles$4.filterMessage },
107
+ return (React__default["default"].createElement("div", { className: classnames__default["default"](styles$5.container, styles$5[listScrollState]) },
108
+ optionsExist && (React__default["default"].createElement("ul", { className: styles$5.optionsList, role: "listbox", "aria-multiselectable": props.multiselect, ref: props.optionsListRef },
109
+ props.options.map(option => {
110
+ return (React__default["default"].createElement(ComboboxOption, { key: option.id, id: option.id, label: option.label }));
111
+ }),
112
+ React__default["default"].createElement("div", { className: classnames__default["default"]([styles$5.loadingContainer, styles$5.hasOptions]) },
113
+ React__default["default"].createElement(AnimatedPresence.AnimatedPresence, { transition: "fromBottom" }, Boolean(props.loading && optionsExist) && (React__default["default"].createElement(Spinner.Spinner, { size: "small" })))),
114
+ props.onLoadMore && (React__default["default"].createElement(ComboboxLoadMore, { onLoadMore: props.onLoadMore })))),
115
+ props.loading && !optionsExist && (React__default["default"].createElement(React__default["default"].Fragment, null, Array.from({ length: 5 }).map((_, index) => (React__default["default"].createElement("div", { className: styles$5.loadingContainer, key: index },
116
+ React__default["default"].createElement(Glimmer.Glimmer, { shape: "rectangle", size: "small" })))))),
117
+ hasSearchTerm && !props.loading && !optionsExist && (React__default["default"].createElement("div", { className: styles$5.filterMessage },
102
118
  React__default["default"].createElement(Text.Text, { variation: "subdued" },
103
119
  "No results for ",
104
120
  `“${props.searchValue}”`))),
105
- !hasSearchTerm && !optionsExist && (React__default["default"].createElement("div", { className: styles$4.emptyStateMessage },
121
+ !hasSearchTerm && !props.loading && !optionsExist && (React__default["default"].createElement("div", { className: styles$5.emptyStateMessage },
106
122
  React__default["default"].createElement(Text.Text, { variation: "subdued" }, getZeroIndexStateText(props.subjectNoun))))));
107
123
  }
108
124
  function getZeroIndexStateText(subjectNoun) {
@@ -123,7 +139,7 @@ function useScrollState(optionsListRef, options) {
123
139
  else if (scrollTop === 0) {
124
140
  setlistScrollState("scrollTop");
125
141
  }
126
- else if (scrollTop + clientHeight === scrollHeight) {
142
+ else if (scrollTop + clientHeight >= scrollHeight) {
127
143
  setlistScrollState("scrollBottom");
128
144
  }
129
145
  else {
@@ -283,16 +299,16 @@ function ComboboxContent(props) {
283
299
  const optionsExist = props.options.length > 0;
284
300
  const { optionsListRef } = useComboboxContent(props.open, props.selected);
285
301
  const { popperRef, popperStyles, attributes } = useComboboxAccessibility(props.handleSelection, props.options, optionsListRef, props.open, props.wrapperRef);
286
- const template = (React__default["default"].createElement("div", Object.assign({ ref: popperRef, id: "ATL-Combobox-Content", "data-testid": "ATL-Combobox-Content", tabIndex: 0, className: classnames__default["default"](styles$6.content, { [styles$6.hidden]: !props.open }), style: popperStyles.popper }, attributes.popper),
302
+ const template = (React__default["default"].createElement("div", Object.assign({ ref: popperRef, id: "ATL-Combobox-Content", "data-testid": "ATL-Combobox-Content", tabIndex: 0, className: classnames__default["default"](styles$7.content, { [styles$7.hidden]: !props.open }), style: popperStyles.popper }, attributes.popper),
287
303
  React__default["default"].createElement(ComboboxContentSearch, { open: props.open, placeholder: props.subjectNoun, searchValue: props.searchValue, setSearchValue: props.setSearchValue, handleSearchChange: props.handleSearchChange }),
288
- props.multiselect && optionsExist && (React__default["default"].createElement(ComboboxContentHeader, { hasOptionsVisible: optionsExist, subjectNoun: props.subjectNoun, selectedCount: props.selected.length, onClearAll: () => {
304
+ props.multiselect && (optionsExist || props.selected.length > 0) && (React__default["default"].createElement(ComboboxContentHeader, { hasOptionsVisible: optionsExist, subjectNoun: props.subjectNoun, selectedCount: props.selected.length, onClearAll: () => {
289
305
  props.selectedStateSetter([]);
290
306
  }, onSelectAll: () => {
291
307
  props.selectedStateSetter(props.options);
292
308
  } })),
293
- React__default["default"].createElement(ComboboxContentList, { multiselect: props.multiselect, options: props.options, selected: props.selected, optionsListRef: optionsListRef, searchValue: props.searchValue, subjectNoun: props.subjectNoun, loading: props.loading }),
294
- props.actionElements && (React__default["default"].createElement("div", { className: styles$6.actions, role: "group" }, props.actionElements.map((child, index, childrenArray) => (React__default["default"].createElement("div", { key: index, className: classnames__default["default"]({
295
- [styles$6.actionPadding]: index === childrenArray.length - 1,
309
+ React__default["default"].createElement(ComboboxContentList, { multiselect: props.multiselect, options: props.options, selected: props.selected, optionsListRef: optionsListRef, searchValue: props.searchValue, subjectNoun: props.subjectNoun, loading: props.loading, onLoadMore: props.onLoadMore }),
310
+ props.actionElements && (React__default["default"].createElement("div", { className: styles$7.actions, role: "group" }, props.actionElements.map((child, index, childrenArray) => (React__default["default"].createElement("div", { key: index, className: classnames__default["default"]({
311
+ [styles$7.actionPadding]: index === childrenArray.length - 1,
296
312
  }) }, child)))))));
297
313
  return ReactDOM__default["default"].createPortal(template, document.body);
298
314
  }
@@ -335,15 +351,16 @@ var css_248z = ".W8qMZnORYxI- {\n position: fixed;\n top: 0;\n right: 0;\n b
335
351
  var styles = {"overlay":"W8qMZnORYxI-","wrapper":"_-0dkolvLF-Y-"};
336
352
  styleInject_es.styleInject(css_248z);
337
353
 
338
- function useMakeComboboxHandlers(setOpen, setSearchValue, selectedOptions, shouldScroll, selectedStateSetter, multiSelect, onClose) {
354
+ function useMakeComboboxHandlers(setOpen, setSearchValue, selectedOptions, shouldScroll, selectedStateSetter, multiSelect, onClose, onSearch) {
339
355
  const handleClose = React.useCallback(() => {
340
356
  setOpen(false);
341
357
  setSearchValue("");
358
+ onSearch && onSearch("");
342
359
  onClose && onClose();
343
360
  if (selectedOptions.length > 0) {
344
361
  shouldScroll.current = true;
345
362
  }
346
- }, [setOpen, setSearchValue, onClose, selectedOptions.length]);
363
+ }, [setOpen, setSearchValue, onClose, onSearch, selectedOptions.length]);
347
364
  const handleSelection = React.useCallback((selection) => {
348
365
  if (multiSelect) {
349
366
  handleMultiSelect(selectedStateSetter, selectedOptions, selection);
@@ -376,7 +393,7 @@ function useCombobox(selected, onSelect, options, onClose, multiSelect, onSearch
376
393
  const [open, setOpen] = React.useState(false);
377
394
  const [searchValue, setSearchValue] = React.useState("");
378
395
  const searchCallback = React.useCallback(debounce__default["default"]((value) => onSearch === null || onSearch === void 0 ? void 0 : onSearch(value), debounceTime), [onSearch, debounceTime]);
379
- const { handleClose, handleSelection } = useMakeComboboxHandlers(setOpen, setSearchValue, selected, shouldScroll, onSelect, multiSelect, onClose);
396
+ const { handleClose, handleSelection } = useMakeComboboxHandlers(setOpen, setSearchValue, selected, shouldScroll, onSelect, multiSelect, onClose, onSearch);
380
397
  const internalFilteredOptions = options.filter(option => option.label.toLowerCase().includes(searchValue.toLowerCase()));
381
398
  return {
382
399
  wrapperRef,
@@ -448,7 +465,7 @@ function Combobox(props) {
448
465
  React__default["default"].createElement("div", { ref: wrapperRef, className: styles.wrapper },
449
466
  open && (React__default["default"].createElement("div", { className: styles.overlay, onClick: () => handleClose(), "data-testid": "ATL-Combobox-Overlay" })),
450
467
  triggerElement || (React__default["default"].createElement(ComboboxTrigger, { label: props.label, selected: props.selected })),
451
- React__default["default"].createElement(ComboboxContent, { multiselect: props.multiSelect, subjectNoun: props.subjectNoun, selected: selectedOptions, actionElements: actionElements, selectedStateSetter: selectedStateSetter, handleSelection: handleSelection, searchValue: searchValue, setSearchValue: setSearchValue, wrapperRef: wrapperRef, open: open, setOpen: setOpen, options: props.onSearch ? options : internalFilteredOptions, loading: props.loading, handleSearchChange: handleSearchChange }))));
468
+ React__default["default"].createElement(ComboboxContent, { multiselect: props.multiSelect, subjectNoun: props.subjectNoun, selected: selectedOptions, actionElements: actionElements, selectedStateSetter: selectedStateSetter, handleSelection: handleSelection, searchValue: searchValue, setSearchValue: setSearchValue, wrapperRef: wrapperRef, open: open, setOpen: setOpen, options: props.onSearch ? options : internalFilteredOptions, loading: props.loading, handleSearchChange: handleSearchChange, onLoadMore: props.onLoadMore }))));
452
469
  }
453
470
  Combobox.Activator = ComboboxActivator;
454
471
  Combobox.Action = ComboboxAction;
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
5
  var React = require('react');
6
- var Card = require('../Card-426a68a8.js');
6
+ var Card = require('../Card-0a6f3a28.js');
7
7
  var Content = require('../Content-e3f7b6fc.js');
8
8
  var Emphasis = require('../Emphasis-bda56d3b.js');
9
9
  require('classnames');
@@ -15,11 +15,12 @@ require('../Button-b73a5e01.js');
15
15
  require('react-router-dom');
16
16
  require('../Icon-405a216c.js');
17
17
  require('@jobber/design');
18
- require('../Menu-81b12936.js');
18
+ require('../Menu-5fc613a1.js');
19
19
  require('uuid');
20
20
  require('framer-motion');
21
21
  require('@jobber/hooks/useOnKeyDown');
22
22
  require('@jobber/hooks/useRefocusOnActivator');
23
+ require('@jobber/hooks/useSafeLayoutEffect');
23
24
 
24
25
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
25
26
 
@@ -15,6 +15,7 @@ export declare const SEARCH_DEBOUNCE_DELAY: number;
15
15
  export declare const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
16
16
  export declare const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
17
17
  export declare const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
18
+ export declare const DATA_LIST_STICKY_HEADER_TEST_ID = "ATL-DataList-stickyHeader";
18
19
  export declare const TRANSITION_DURATION_IN_SECONDS: number;
19
20
  export declare const TRANSITION_DELAY_IN_SECONDS: number;
20
21
  export {};
@@ -39,6 +39,10 @@ export interface SortableOptions {
39
39
  readonly label: string;
40
40
  readonly order: "asc" | "desc";
41
41
  }
42
+ export interface DataListSortable {
43
+ readonly key: string;
44
+ readonly options?: SortableOptions[];
45
+ }
42
46
  export interface DataListProps<T extends DataListObject> {
43
47
  /**
44
48
  * The data to render in the DataList.
@@ -92,10 +96,7 @@ export interface DataListProps<T extends DataListObject> {
92
96
  * `onSort`: The callback function when the user sorting a column.
93
97
  */
94
98
  readonly sorting?: {
95
- readonly sortable: {
96
- key: string;
97
- options?: SortableOptions[];
98
- }[];
99
+ readonly sortable: DataListSortable[];
99
100
  readonly state: DataListSorting | undefined;
100
101
  readonly onSort: (sorting?: DataListSorting) => void;
101
102
  };
@@ -1,2 +1,2 @@
1
1
  export * from "./DataList";
2
- export { DataListItemType, DataListSorting, DataListSelectedType, DataListSelectedAllType, } from "./DataList.types";
2
+ export { DataListItemType, DataListSorting, DataListSortable, DataListSelectedType, DataListSelectedAllType, } from "./DataList.types";
@@ -11,7 +11,7 @@ var noop = require('lodash/noop');
11
11
  var design = require('@jobber/design');
12
12
  var framerMotion = require('framer-motion');
13
13
  var classnames = require('classnames');
14
- var Tooltip = require('../Tooltip-27771182.js');
14
+ var Tooltip = require('../Tooltip-ef3d6ef4.js');
15
15
  var Button = require('../Button-b73a5e01.js');
16
16
  var useInView = require('@jobber/hooks/useInView');
17
17
  var isEmpty = require('lodash/isEmpty');
@@ -26,17 +26,19 @@ var ReactDOM = require('react-dom');
26
26
  var Checkbox = require('../Checkbox-99f6297f.js');
27
27
  var reactRouterDom = require('react-router-dom');
28
28
  var AnimatedSwitcher = require('../AnimatedSwitcher-3d45ec5d.js');
29
- var Combobox = require('../Combobox-237caf42.js');
30
- var Chip = require('../Chip-c91fd6c8.js');
29
+ var Combobox = require('../Combobox-d24f1fec.js');
30
+ var Chip = require('../Chip-3d1bfddc.js');
31
31
  var debounce = require('lodash/debounce');
32
- var InputText = require('../InputText-6e356985.js');
32
+ var InputText = require('../InputText-6c71361e.js');
33
33
  var Spinner = require('../Spinner-9d8fc7ff.js');
34
34
  var Typography = require('../Typography-c45bf216.js');
35
35
  require('../Content-e3f7b6fc.js');
36
+ require('@jobber/hooks/useSafeLayoutEffect');
36
37
  require('react-popper');
37
38
  require('../getAtlantisConfig-0f3e8af2.js');
38
39
  require('uuid');
39
40
  require('react-hook-form');
41
+ require('../AnimatedPresence-20a02aaa.js');
40
42
  require('@jobber/hooks/useAssert');
41
43
  require('../Avatar-76a799fa.js');
42
44
  require('color');
@@ -52,7 +54,7 @@ var classnames__default = /*#__PURE__*/_interopDefaultLegacy(classnames);
52
54
  var isEmpty__default = /*#__PURE__*/_interopDefaultLegacy(isEmpty);
53
55
  var debounce__default = /*#__PURE__*/_interopDefaultLegacy(debounce);
54
56
 
55
- var css_248z$g = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n --data-list--minimum-item-height: calc(var(--base-unit) * 3.5);\n\n display: -ms-flexbox;\n\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n -ms-flex: 1;\n flex: 1;\n}\n\n/*\n * Header\n */\n\n.IcAlZHoB4LI- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 1;\n z-index: var(--elevation-base);\n margin-bottom: calc(16px / 2);\n margin-bottom: var(--space-small);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.TFO76ysivmg- {\n display: grid;\n padding: calc((16px / 2) + (16px / 4)) 0;\n padding: calc(calc(16px / 2) + calc(16px / 4)) 0;\n padding: calc(var(--space-small) + var(--space-smaller)) 0;\n gap: calc(16px / 2);\n grid-gap: calc(16px / 2);\n grid-gap: var(--space-small);\n gap: var(--space-small);\n grid-template-columns: auto fit-content(calc(16px * 14));\n grid-template-columns: auto fit-content(calc(var(--base-unit) * 14));\n}\n\n.jGHZZYZm1ZY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n min-height: calc(16px * 3);\n min-height: var(--space-largest);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 8) solid rgb(217, 223, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\n}\n\n.GiD7MjZJbcw- {\n --data-list--header-actions-gap: var(--space-small);\n display: -ms-flexbox;\n display: flex;\n gap: calc(16px / 2);\n gap: var(--data-list--header-actions-gap);\n}\n\n@media (max-width: 489px) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n@media (--small-screens-and-below) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n.jMSVGIAr5tk- > p {\n font-weight: 500;\n white-space: nowrap;\n}\n\n.jMSVGIAr5tk- {\n display: -ms-flexbox;\n display: flex;\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n -ms-flex-align: center;\n align-items: center;\n gap: var(--data-list--header-actions-gap);\n}\n\n/*\n * List Item\n */\n\n.ise8kHCfhCY- {\n position: relative;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 16) solid rgb(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.ise8kHCfhCY-,\n.Tq6e0BGwcSM- {\n display: grid;\n grid-template-columns: minmax(0px, auto);\n min-height: var(--data-list--minimum-item-height);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.ise8kHCfhCY-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--hover);\n background-color: rgb(244, 246, 250);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n text-align: left;\n -webkit-text-decoration: none;\n text-decoration: none;\n background-color: transparent;\n cursor: pointer;\n}\n\n/**\n * Reset CSS properties on focus to ensure we only have the focus state on the\n * parent .listItem\n */\n\n.Tq6e0BGwcSM-:focus {\n outline: none;\n background-color: transparent;\n}\n\n/**\n * Enable a better hover and focus experience when :has() is supported.\n * This is a workaround for Firefox where the :has() selector is not supported.\n */\n\n@supports selector(*:has(*)) {\n .ise8kHCfhCY-:hover,\n .ise8kHCfhCY-:focus-within {\n background-color: transparent;\n }\n\n .ise8kHCfhCY-:has(.Tq6e0BGwcSM-:hover, .Tq6e0BGwcSM-:focus) {\n background-color: var(--data-list-item-active-color);\n }\n}\n\n/*\n * List Item Selection\n */\n\n.d-79rkMqufg- {\n display: grid;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n@media (min-width: 768px) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n.d-79rkMqufg-,\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\n -webkit-column-gap: calc(16px / 2);\n -webkit-column-gap: var(--space-small);\n -moz-column-gap: calc(16px / 2);\n -moz-column-gap: var(--space-small);\n column-gap: calc(16px / 2);\n column-gap: var(--space-small);\n}\n\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n display: grid;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.qm-SSuWTXkI- {\n display: -ms-flexbox;\n display: flex;\n visibility: hidden;\n\n /* To compensate the Checkbox's label margin that we are using for screen-readers */\n margin-right: calc((16px * 1) * -1);\n margin-right: calc(calc(16px * 1) * -1);\n margin-right: calc(var(--space-base) * -1);\n}\n\n.qm-SSuWTXkI-.VA9RnQp6nbI- {\n visibility: visible;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n -ms-flex-order: 1;\n order: 1;\n padding-top: calc(16px / 4);\n padding-top: var(--space-smaller);\n opacity: 1;\n transition: opacity 100ms ease-in-out;\n transition: opacity var(--transition-properties);\n --transition-properties: var(--timing-quick) ease-in-out;\n}\n\n@media (min-width: 768px) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n.ise8kHCfhCY-:hover .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY-:focus-within .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY- .d-79rkMqufg-._4L7iXXzLr5k- > :last-child {\n opacity: 1;\n}\n\n/*\n * Filters\n */\n\n.Kkp-IYmwq-s- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(255, 255, 255, 0.6);\n background-color: var(--color-overlay--dimmed);\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.m-eCShL7TU4- {\n position: sticky;\n top: 50vh;\n}\n\n/* This hides the text from the UI but not from the screen readers */\n\n.esUiRgWabYw- {\n position: absolute;\n top: auto;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n text-indent: -10000px;\n}\n";
57
+ var css_248z$g = ".TkdrExYnvcY-,\n.TkdrExYnvcY- * {\n box-sizing: border-box;\n}\n\n.TkdrExYnvcY- {\n --data-list--minimum-item-height: calc(var(--base-unit) * 3.5);\n\n display: -ms-flexbox;\n\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n position: relative;\n z-index: 0;\n z-index: var(--elevation-default);\n -ms-flex: 1;\n flex: 1;\n}\n\n/*\n * Header\n */\n\n.IcAlZHoB4LI- {\n display: -ms-flexbox;\n display: flex;\n position: relative;\n z-index: 1;\n z-index: var(--elevation-base);\n margin-bottom: calc(16px / 2);\n margin-bottom: var(--space-small);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.TFO76ysivmg- {\n display: grid;\n padding: calc((16px / 2) + (16px / 4)) 0;\n padding: calc(calc(16px / 2) + calc(16px / 4)) 0;\n padding: calc(var(--space-small) + var(--space-smaller)) 0;\n gap: calc(16px / 2);\n grid-gap: calc(16px / 2);\n grid-gap: var(--space-small);\n gap: var(--space-small);\n grid-template-columns: auto fit-content(calc(16px * 14));\n grid-template-columns: auto fit-content(calc(var(--base-unit) * 14));\n}\n\n.TFO76ysivmg-:empty {\n display: none;\n}\n\n.jGHZZYZm1ZY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-direction: column;\n flex-direction: column;\n -ms-flex-pack: center;\n justify-content: center;\n min-height: calc(16px * 3);\n min-height: var(--space-largest);\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 8) solid rgb(217, 223, 225);\n border-bottom: var(--border-thick) solid var(--color-border);\n}\n\n.GiD7MjZJbcw- {\n --data-list--header-actions-gap: var(--space-small);\n display: -ms-flexbox;\n display: flex;\n gap: calc(16px / 2);\n gap: var(--data-list--header-actions-gap);\n}\n\n@media (max-width: 489px) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n@media (--small-screens-and-below) {\n\n.GiD7MjZJbcw- {\n -ms-flex-pack: justify;\n justify-content: space-between;\n width: 100%;\n}\n }\n\n.jMSVGIAr5tk- > p {\n font-weight: 500;\n white-space: nowrap;\n}\n\n.jMSVGIAr5tk- {\n display: -ms-flexbox;\n display: flex;\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n -ms-flex-align: center;\n align-items: center;\n gap: var(--data-list--header-actions-gap);\n}\n\n/*\n * List Item\n */\n\n.ise8kHCfhCY- {\n position: relative;\n padding: calc(16px / 2);\n padding: var(--space-small);\n border-bottom: calc(16px / 16) solid rgb(217, 223, 225);\n border-bottom: var(--border-base) solid var(--color-border);\n transition: all 200ms;\n transition: all var(--timing-base);\n}\n\n.ise8kHCfhCY-,\n.Tq6e0BGwcSM- {\n display: grid;\n grid-template-columns: minmax(0px, auto);\n min-height: var(--data-list--minimum-item-height);\n -ms-flex-align: center;\n align-items: center;\n}\n\n.ise8kHCfhCY-.Pc0JGX6jCD4-,\n.ise8kHCfhCY-:hover,\n.ise8kHCfhCY-:focus-within {\n --data-list-item-active-color: var(--color-surface--hover);\n background-color: rgb(244, 246, 250);\n background-color: var(--data-list-item-active-color);\n}\n\n.Tq6e0BGwcSM- {\n margin: calc((16px / 2) * -1) 0;\n margin: calc(calc(16px / 2) * -1) 0;\n margin: calc(var(--space-small) * -1) 0;\n padding: calc(16px / 2) 0;\n padding: var(--space-small) 0;\n border: none;\n text-align: left;\n -webkit-text-decoration: none;\n text-decoration: none;\n background-color: transparent;\n cursor: pointer;\n}\n\n/**\n * Reset CSS properties on focus to ensure we only have the focus state on the\n * parent .listItem\n */\n\n.Tq6e0BGwcSM-:focus {\n outline: none;\n background-color: transparent;\n}\n\n/**\n * Enable a better hover and focus experience when :has() is supported.\n * This is a workaround for Firefox where the :has() selector is not supported.\n */\n\n@supports selector(*:has(*)) {\n .ise8kHCfhCY-:hover,\n .ise8kHCfhCY-:focus-within {\n background-color: transparent;\n }\n\n .ise8kHCfhCY-:has(.Tq6e0BGwcSM-:hover, .Tq6e0BGwcSM-:focus) {\n background-color: var(--data-list-item-active-color);\n }\n}\n\n/*\n * List Item Selection\n */\n\n.d-79rkMqufg- {\n display: grid;\n -ms-flex-align: start;\n align-items: flex-start;\n}\n\n@media (min-width: 768px) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.d-79rkMqufg- {\n -ms-flex-align: center;\n align-items: center;\n}\n }\n\n.d-79rkMqufg-,\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n grid-template-columns: -webkit-max-content minmax(0px, auto);\n grid-template-columns: max-content minmax(0px, auto);\n -webkit-column-gap: calc(16px / 2);\n -webkit-column-gap: var(--space-small);\n -moz-column-gap: calc(16px / 2);\n -moz-column-gap: var(--space-small);\n column-gap: calc(16px / 2);\n column-gap: var(--space-small);\n}\n\n.jGHZZYZm1ZY- .d-79rkMqufg- {\n display: grid;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.qm-SSuWTXkI- {\n display: -ms-flexbox;\n display: flex;\n visibility: hidden;\n\n /* To compensate the Checkbox's label margin that we are using for screen-readers */\n margin-right: calc((16px * 1) * -1);\n margin-right: calc(calc(16px * 1) * -1);\n margin-right: calc(var(--space-base) * -1);\n}\n\n.qm-SSuWTXkI-.VA9RnQp6nbI- {\n visibility: visible;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :first-child {\n -ms-flex-order: 2;\n order: 2;\n}\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n -ms-flex-order: 1;\n order: 1;\n padding-top: calc(16px / 4);\n padding-top: var(--space-smaller);\n opacity: 1;\n transition: opacity 100ms ease-in-out;\n transition: opacity var(--transition-properties);\n --transition-properties: var(--timing-quick) ease-in-out;\n}\n\n@media (min-width: 768px) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.ise8kHCfhCY- .d-79rkMqufg- > :last-child {\n padding-top: 0;\n opacity: 0;\n}\n }\n\n.ise8kHCfhCY-:hover .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY-:focus-within .d-79rkMqufg- > :last-child,\n.ise8kHCfhCY- .d-79rkMqufg-._4L7iXXzLr5k- > :last-child {\n opacity: 1;\n}\n\n/*\n * Filters\n */\n\n.Kkp-IYmwq-s- {\n display: -ms-flexbox;\n display: flex;\n position: absolute;\n top: 0;\n right: 0;\n bottom: 0;\n left: 0;\n background-color: rgba(255, 255, 255, 0.6);\n background-color: var(--color-overlay--dimmed);\n -ms-flex-align: start;\n align-items: flex-start;\n -ms-flex-pack: center;\n justify-content: center;\n}\n\n.m-eCShL7TU4- {\n position: sticky;\n top: 50vh;\n}\n\n/* This hides the text from the UI but not from the screen readers */\n\n.esUiRgWabYw- {\n position: absolute;\n top: auto;\n left: -10000px;\n width: 1px;\n height: 1px;\n overflow: hidden;\n text-indent: -10000px;\n}\n";
56
58
  var styles$g = {"wrapper":"TkdrExYnvcY-","titleContainer":"IcAlZHoB4LI-","headerFilters":"TFO76ysivmg-","headerTitles":"jGHZZYZm1ZY-","batchSelectContainer":"GiD7MjZJbcw-","headerBatchSelect":"jMSVGIAr5tk-","listItem":"ise8kHCfhCY-","listItemClickable":"Tq6e0BGwcSM-","active":"Pc0JGX6jCD4-","selectable":"d-79rkMqufg-","selectAllCheckbox":"qm-SSuWTXkI-","visible":"VA9RnQp6nbI-","selected":"_4L7iXXzLr5k-","filtering":"Kkp-IYmwq-s-","filteringSpinner":"m-eCShL7TU4-","srOnly":"esUiRgWabYw-"};
57
59
  styleInject_es.styleInject(css_248z$g);
58
60
 
@@ -144,6 +146,7 @@ const SEARCH_DEBOUNCE_DELAY = design.tokens["timing-slowest"];
144
146
  const DATA_LIST_FILTERING_SPINNER_TEST_ID = "ATL-DataList-filteringSpinner";
145
147
  const DATA_LIST_LOADING_MORE_SPINNER_TEST_ID = "ATL-DataList-loadingMoreSpinner";
146
148
  const DATA_LOAD_MORE_TEST_ID = "ATL-DataList-LoadMore-trigger";
149
+ const DATA_LIST_STICKY_HEADER_TEST_ID = "ATL-DataList-stickyHeader";
147
150
  const TRANSITION_DURATION_IN_SECONDS = design.tokens["timing-base"] / 1000;
148
151
  const TRANSITION_DELAY_IN_SECONDS = design.tokens["timing-quick"] / 1000;
149
152
 
@@ -304,13 +307,13 @@ styleInject_es.styleInject(css_248z$8);
304
307
  function DataListSortingOptions({ options, selectedOption, onSelectChange, onClose, optionsListRef, dataListHeaderTileRef, }) {
305
308
  useRefocusOnActivator.useRefocusOnActivator(!optionsListRef.current);
306
309
  useOnKeyDown.useOnKeyDown(() => onClose(), "Escape");
307
- React__default["default"].useEffect(() => {
310
+ React.useEffect(() => {
308
311
  document.addEventListener("mousedown", handleClickOutside);
309
312
  return () => {
310
313
  document.removeEventListener("mousedown", handleClickOutside);
311
314
  };
312
315
  }, [optionsListRef, dataListHeaderTileRef, onClose]);
313
- return (React__default["default"].createElement("ul", { className: styles$8.optionsList, ref: optionsListRef }, options.map((option, index) => (React__default["default"].createElement("li", { className: styles$8.option, key: index, onClick: () => onSelectChange(option), onKeyDown: event => handleKeyDown(event, option), tabIndex: 0, "data-value": option.id },
316
+ return (React__default["default"].createElement("ul", { className: styles$8.optionsList, ref: optionsListRef }, options.map(option => (React__default["default"].createElement("li", { className: styles$8.option, key: option.id, onClick: () => onSelectChange(option), onKeyDown: event => handleKeyDown(event, option), tabIndex: 0, "data-value": option.id },
314
317
  option.label,
315
318
  option.label === (selectedOption === null || selectedOption === void 0 ? void 0 : selectedOption.label) && (React__default["default"].createElement(Icon.Icon, { name: "checkmark", color: "blue" })))))));
316
319
  function handleKeyDown(event, option) {
@@ -320,9 +323,9 @@ function DataListSortingOptions({ options, selectedOption, onSelectChange, onClo
320
323
  }
321
324
  function handleClickOutside(event) {
322
325
  var _a, _b;
323
- const isClickInsideOptions = (_a = optionsListRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target);
324
- const isClickInsideHeader = (_b = dataListHeaderTileRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target);
325
- if (!isClickInsideOptions && !isClickInsideHeader) {
326
+ const isClickInside = ((_a = optionsListRef.current) === null || _a === void 0 ? void 0 : _a.contains(event.target)) ||
327
+ ((_b = dataListHeaderTileRef.current) === null || _b === void 0 ? void 0 : _b.contains(event.target));
328
+ if (!isClickInside) {
326
329
  onClose();
327
330
  }
328
331
  }
@@ -332,9 +335,9 @@ function DataListSortingOptions({ options, selectedOption, onSelectChange, onClo
332
335
  function DataListHeaderTile({ headers, headerKey, visible = false, }) {
333
336
  useRefocusOnActivator.useRefocusOnActivator(visible);
334
337
  const { sorting } = useDataListContext();
335
- const [isDropDownOpen, setIsDropDownOpen] = React__default["default"].useState(false);
338
+ const [isDropDownOpen, setIsDropDownOpen] = React.useState(false);
336
339
  const optionsListRef = useFocusTrap.useFocusTrap(isDropDownOpen);
337
- const dataListHeaderTileRef = React__default["default"].useRef(null);
340
+ const dataListHeaderTileRef = React.useRef(null);
338
341
  const sortableItem = sorting === null || sorting === void 0 ? void 0 : sorting.sortable.find(item => item.key === headerKey);
339
342
  const isSortable = Boolean(sortableItem);
340
343
  const sortingState = sorting === null || sorting === void 0 ? void 0 : sorting.state;
@@ -344,15 +347,15 @@ function DataListHeaderTile({ headers, headerKey, visible = false, }) {
344
347
  }), onClick: handleOnClick, ref: dataListHeaderTileRef },
345
348
  React__default["default"].createElement(Text.Text, { maxLines: "single" }, headers[headerKey]),
346
349
  isSortable && (sortableItem === null || sortableItem === void 0 ? void 0 : sortableItem.options) && isDropDownOpen && (React__default["default"].createElement(DataListSortingOptions, { options: sortableItem.options, selectedOption: (sorting === null || sorting === void 0 ? void 0 : sorting.state) || null, onSelectChange: handleSelectChange, onClose: () => setIsDropDownOpen(false), optionsListRef: optionsListRef, dataListHeaderTileRef: dataListHeaderTileRef })),
347
- (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey ? (React__default["default"].createElement(DataListSortingArrows, { order: sortingState.order })) : (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) !== headerKey && isSortable ? (React__default["default"].createElement(DataListSortingArrows, { order: "none" })) : null));
348
- function toggleSorting(newSortingKey, newId, newLabel, newOrder) {
350
+ isSortable && (React__default["default"].createElement(DataListSortingArrows, { order: (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key) === headerKey ? sortingState.order : "none" }))));
351
+ function toggleSorting(newSortingKey, newId, newLabel) {
349
352
  const isSameKey = newSortingKey === (sortingState === null || sortingState === void 0 ? void 0 : sortingState.key);
350
353
  const isDescending = (sortingState === null || sortingState === void 0 ? void 0 : sortingState.order) === "desc";
351
- if (isSameKey && isDescending && newOrder === undefined) {
354
+ if (isSameKey && isDescending) {
352
355
  sorting === null || sorting === void 0 ? void 0 : sorting.onSort(undefined);
353
356
  return;
354
357
  }
355
- const sortingOrder = newOrder || (isSameKey && !isDescending ? "desc" : "asc");
358
+ const sortingOrder = isSameKey ? "desc" : "asc";
356
359
  setSorting(newSortingKey, newId, newLabel, sortingOrder);
357
360
  }
358
361
  function setSorting(newSortingKey, newId, newLabel, newOrder) {
@@ -371,11 +374,8 @@ function DataListHeaderTile({ headers, headerKey, visible = false, }) {
371
374
  setIsDropDownOpen(!isDropDownOpen);
372
375
  }
373
376
  else {
374
- const headerValue = headers[headerKey];
375
377
  const id = ((_b = (_a = sortableItem === null || sortableItem === void 0 ? void 0 : sortableItem.options) === null || _a === void 0 ? void 0 : _a[0]) === null || _b === void 0 ? void 0 : _b.id) || headerKey;
376
- if (headerValue !== undefined) {
377
- toggleSorting(id, headerKey, headerValue);
378
- }
378
+ toggleSorting(id, headerKey, headers[headerKey]);
379
379
  }
380
380
  }
381
381
  function handleSelectChange(newSortOption) {
@@ -1019,7 +1019,7 @@ function DataListStickyHeader({ children }) {
1019
1019
  ref.current && observer.unobserve(ref.current);
1020
1020
  };
1021
1021
  }, [handleObserver, ref.current]);
1022
- return (React__default["default"].createElement("div", { ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
1022
+ return (React__default["default"].createElement("div", { "data-testid": DATA_LIST_STICKY_HEADER_TEST_ID, ref: ref, className: classnames__default["default"](styles$5.header, { [styles$5.stuck]: isStuck }) }, children));
1023
1023
  }
1024
1024
 
1025
1025
  var css_248z$4 = ".tj0MOMhLEEY- {\n display: -ms-flexbox;\n display: flex;\n -ms-flex-align: center;\n align-items: center;\n}\n\n.SaPMOnvw-3c- {\n --transition-properties: var(--timing-base) ease-in-out;\n --button-offset: calc(var(--space-largest) - var(--space-smaller));\n\n position: absolute;\n top: 50%;\n right: calc((16px * 3) - (16px / 4));\n right: calc(calc(16px * 3) - calc(16px / 4));\n right: var(--button-offset);\n visibility: hidden;\n width: 0;\n padding: calc(16px / 4) 0;\n padding: var(--space-smaller) 0;\n background-color: rgba(255, 255, 255, 1);\n background-color: var(--color-surface);\n opacity: 0;\n -webkit-transform: translateY(-50%);\n transform: translateY(-50%);\n transition: opacity 200ms ease-in-out,\n width 200ms ease-in-out, visibility 200ms ease-in-out;\n transition: opacity var(--transition-properties),\n width var(--transition-properties), visibility var(--transition-properties);\n}\n\n._3S1-91v2SYI- {\n visibility: visible;\n width: calc(100% - var(--button-offset));\n opacity: 1;\n}\n\n@media (min-width: 768px) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n padding: 0;\n background-color: transparent;\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n transition: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n.SaPMOnvw-3c-,\n._3S1-91v2SYI- {\n position: static;\n visibility: visible;\n width: auto;\n padding: 0;\n background-color: transparent;\n opacity: 1;\n -webkit-transform: none;\n transform: none;\n transition: none;\n}\n }\n\n._9GlBktsUALw- {\n display: block;\n}\n\n@media (min-width: 768px) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._9GlBktsUALw- {\n display: none;\n}\n }\n\n/*\n * No Filters Styling\n *\n * When there are no filters, the search input is always visible.\n * ------------------------------------------------------------------------- */\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n position: static;\n visibility: visible;\n width: auto;\n opacity: 1;\n transition: none;\n}\n\n@media (min-width: 768px) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n@media (--medium-screens-and-up) {\n\n._3Pjrt42x454- .SaPMOnvw-3c- {\n max-width: 30%;\n}\n }\n\n._3Pjrt42x454- ._9GlBktsUALw- {\n display: none;\n}\n";
@@ -1233,6 +1233,8 @@ function DataList(_a) {
1233
1233
  const emptyStateComponents = getCompoundComponents(props.children, DataListEmptyState);
1234
1234
  const itemActionComponent = getCompoundComponent(props.children, DataListItemActions);
1235
1235
  const bulkActionsComponent = getCompoundComponent(props.children, DataListBulkActions);
1236
+ const headerCount = Object.keys(props.headers).length;
1237
+ const shouldRenderStickyHeader = !!filterComponent || !!searchComponent || headerCount > 0;
1236
1238
  return (React__default["default"].createElement(DataListContext.Provider, { value: Object.assign(Object.assign({ searchComponent,
1237
1239
  filterComponent,
1238
1240
  layoutComponents,
@@ -1245,7 +1247,7 @@ function DataList(_a) {
1245
1247
  registerLayout }, props), { selected,
1246
1248
  // T !== DataListObject
1247
1249
  sorting: sorting }) },
1248
- React__default["default"].createElement(InternalDataList, null)));
1250
+ React__default["default"].createElement(InternalDataList, { shouldRenderStickyHeader: shouldRenderStickyHeader })));
1249
1251
  function registerLayoutBreakpoints(size) {
1250
1252
  setLayoutBreakpoints(prev => sortBreakpoints([...prev, size]));
1251
1253
  }
@@ -1253,7 +1255,7 @@ function DataList(_a) {
1253
1255
  setLayouts(prev => (Object.assign(Object.assign({}, prev), { [size]: children })));
1254
1256
  }
1255
1257
  }
1256
- function InternalDataList() {
1258
+ function InternalDataList({ shouldRenderStickyHeader, }) {
1257
1259
  const { data, title, totalCount, loadingState = "none", layoutComponents, } = useDataListContext();
1258
1260
  const backToTopRef = React.useRef(null);
1259
1261
  const initialLoading = loadingState === "initial";
@@ -1264,12 +1266,12 @@ function InternalDataList() {
1264
1266
  title && React__default["default"].createElement(Heading.Heading, { level: 3 }, title),
1265
1267
  React__default["default"].createElement(DataListTotalCount, { totalCount: totalCount, loading: initialLoading })),
1266
1268
  React__default["default"].createElement("div", { ref: backToTopRef }),
1267
- React__default["default"].createElement(DataListStickyHeader, null,
1269
+ shouldRenderStickyHeader && (React__default["default"].createElement(DataListStickyHeader, null,
1268
1270
  React__default["default"].createElement("div", { className: styles$g.headerFilters },
1269
1271
  React__default["default"].createElement(InternalDataListFilters, null),
1270
1272
  React__default["default"].createElement(InternalDataListSearch, null)),
1271
1273
  React__default["default"].createElement(InternalDataListStatusBar, null),
1272
- React__default["default"].createElement(DataListHeader, null)),
1274
+ React__default["default"].createElement(DataListHeader, null))),
1273
1275
  initialLoading && React__default["default"].createElement(DataListLoadingState, null),
1274
1276
  showEmptyState && React__default["default"].createElement(InternalDataListEmptyState, null),
1275
1277
  layoutComponents,
@@ -2,8 +2,9 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var InputText = require('../InputText-6e356985.js');
5
+ var InputText = require('../InputText-6c71361e.js');
6
6
  require('react');
7
+ require('@jobber/hooks/useSafeLayoutEffect');
7
8
  require('../FormField-b4e6c549.js');
8
9
  require('../tslib.es6-754e2961.js');
9
10
  require('uuid');
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
3
  var React = require('react');
4
+ var useSafeLayoutEffect = require('@jobber/hooks/useSafeLayoutEffect');
4
5
  var FormField = require('./FormField-b4e6c549.js');
5
6
 
6
7
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
@@ -34,7 +35,7 @@ function InputTextInternal(props, ref) {
34
35
  }
35
36
  },
36
37
  }));
37
- React.useLayoutEffect(() => {
38
+ useSafeLayoutEffect.useSafeLayoutEffect(() => {
38
39
  if (inputRef && inputRef.current instanceof HTMLTextAreaElement) {
39
40
  resize(inputRef.current);
40
41
  }
@@ -25,15 +25,15 @@ export interface ActionProps {
25
25
  /**
26
26
  * Action label
27
27
  */
28
- label: string;
28
+ readonly label: string;
29
29
  /**
30
30
  * Parent Section Label
31
31
  */
32
- sectionLabel?: string;
32
+ readonly sectionLabel?: string;
33
33
  /**
34
34
  * Visual cue for the action label
35
35
  */
36
- icon?: IconNames;
36
+ readonly icon?: IconNames;
37
37
  /**
38
38
  * Callback when an action gets clicked
39
39
  */
@@ -41,5 +41,5 @@ export interface ActionProps {
41
41
  /**
42
42
  * Focus on the action when rendered
43
43
  */
44
- shouldFocus?: boolean;
44
+ readonly shouldFocus?: boolean;
45
45
  }
@@ -2,13 +2,14 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Menu = require('../Menu-81b12936.js');
5
+ var Menu = require('../Menu-5fc613a1.js');
6
6
  require('react');
7
7
  require('uuid');
8
8
  require('classnames');
9
9
  require('framer-motion');
10
10
  require('@jobber/hooks/useOnKeyDown');
11
11
  require('@jobber/hooks/useRefocusOnActivator');
12
+ require('@jobber/hooks/useSafeLayoutEffect');
12
13
  require('../style-inject.es-9d2f5f4e.js');
13
14
  require('../Button-b73a5e01.js');
14
15
  require('react-router-dom');
@@ -6,6 +6,7 @@ var classnames = require('classnames');
6
6
  var framerMotion = require('framer-motion');
7
7
  var useOnKeyDown = require('@jobber/hooks/useOnKeyDown');
8
8
  var useRefocusOnActivator = require('@jobber/hooks/useRefocusOnActivator');
9
+ var useSafeLayoutEffect = require('@jobber/hooks/useSafeLayoutEffect');
9
10
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
10
11
  var Button = require('./Button-b73a5e01.js');
11
12
  var Typography = require('./Typography-c45bf216.js');
@@ -45,7 +46,7 @@ function Menu({ activator, items }) {
45
46
  const buttonID = uuid.v1();
46
47
  const menuID = uuid.v1();
47
48
  useOnKeyDown.useOnKeyDown(handleKeyboardShortcut, ["Escape"]);
48
- React.useLayoutEffect(() => {
49
+ useSafeLayoutEffect.useSafeLayoutEffect(() => {
49
50
  if (wrapperRef.current) {
50
51
  const bounds = wrapperRef.current.getBoundingClientRect();
51
52
  const newPosition = Object.assign({}, position);
@@ -11,7 +11,7 @@ var Text = require('../Text-259af966.js');
11
11
  var Content = require('../Content-e3f7b6fc.js');
12
12
  var Markdown = require('../Markdown-f7c55304.js');
13
13
  var Button = require('../Button-b73a5e01.js');
14
- var Menu = require('../Menu-81b12936.js');
14
+ var Menu = require('../Menu-5fc613a1.js');
15
15
  var Emphasis = require('../Emphasis-bda56d3b.js');
16
16
  require('../Typography-c45bf216.js');
17
17
  require('../getAtlantisConfig-0f3e8af2.js');
@@ -23,6 +23,7 @@ require('uuid');
23
23
  require('framer-motion');
24
24
  require('@jobber/hooks/useOnKeyDown');
25
25
  require('@jobber/hooks/useRefocusOnActivator');
26
+ require('@jobber/hooks/useSafeLayoutEffect');
26
27
 
27
28
  function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
28
29
 
@@ -2,11 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- var Tooltip = require('../Tooltip-27771182.js');
5
+ var Tooltip = require('../Tooltip-ef3d6ef4.js');
6
6
  require('react');
7
7
  require('classnames');
8
8
  require('react-dom');
9
9
  require('framer-motion');
10
+ require('@jobber/hooks/useSafeLayoutEffect');
10
11
  require('../style-inject.es-9d2f5f4e.js');
11
12
  require('react-popper');
12
13
 
@@ -4,6 +4,7 @@ var React = require('react');
4
4
  var classnames = require('classnames');
5
5
  var ReactDOM = require('react-dom');
6
6
  var framerMotion = require('framer-motion');
7
+ var useSafeLayoutEffect = require('@jobber/hooks/useSafeLayoutEffect');
7
8
  var styleInject_es = require('./style-inject.es-9d2f5f4e.js');
8
9
  var reactPopper = require('react-popper');
9
10
 
@@ -95,7 +96,7 @@ function Tooltip({ message, children }) {
95
96
  activator.removeEventListener("blur", hideTooltip);
96
97
  }
97
98
  };
98
- React.useLayoutEffect(() => {
99
+ useSafeLayoutEffect.useSafeLayoutEffect(() => {
99
100
  injectAttributes();
100
101
  addListeners();
101
102
  return () => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "4.77.5",
3
+ "version": "4.77.6-JOB-84042.2+a50b038f",
4
4
  "license": "MIT",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -20,8 +20,8 @@
20
20
  ],
21
21
  "dependencies": {
22
22
  "@jobber/design": "^0.53.0",
23
- "@jobber/formatters": "*",
24
- "@jobber/hooks": "^2.8.1",
23
+ "@jobber/formatters": "^0.2.2",
24
+ "@jobber/hooks": "^2.8.2-JOB-84042.26+a50b038f",
25
25
  "@popperjs/core": "^2.0.6",
26
26
  "@std-proposal/temporal": "0.0.1",
27
27
  "@tanstack/react-table": "8.5.13",
@@ -31,7 +31,7 @@
31
31
  "@types/react-router": "5.1.7",
32
32
  "@types/react-router-dom": "^5.3.3",
33
33
  "@types/uuid": "^8.3.3",
34
- "axios": "^0.21.2",
34
+ "axios": "^1.6.0",
35
35
  "classnames": "^2.3.2",
36
36
  "color": "^3.1.2",
37
37
  "filesize": "^6.1.0",
@@ -84,5 +84,5 @@
84
84
  "> 1%",
85
85
  "IE 10"
86
86
  ],
87
- "gitHead": "3f1d6b70deb0ca76a8d1b818cb857151b371a598"
87
+ "gitHead": "a50b038fd5abd4f90eec3d8cd47d4cc70dca2c87"
88
88
  }