@jobber/components 6.68.2 → 6.69.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.
@@ -67,7 +67,7 @@ export interface MenuProps<GenericOption extends AnyOption = AnyOption, GenericO
67
67
  /**
68
68
  * Element that the menu is attached to when the menu opens.
69
69
  */
70
- readonly attachTo: RefObject<Element | null>;
70
+ readonly attachTo: HTMLDivElement | null;
71
71
  /**
72
72
  * Ref to the TextInput element.
73
73
  */
@@ -1,4 +1,4 @@
1
- import React, { RefObject } from "react";
1
+ import React from "react";
2
2
  import { AnyOption, Option } from "../Autocomplete.types";
3
3
  export interface DefaultMenuProps {
4
4
  readonly options: AnyOption[];
@@ -6,9 +6,9 @@ export interface DefaultMenuProps {
6
6
  /**
7
7
  * Element that it's attached to when the menu opens.
8
8
  */
9
- readonly attachTo: RefObject<Element | null>;
9
+ readonly attachTo: HTMLDivElement | null;
10
10
  onOptionSelect(chosenOption?: Option): void;
11
- readonly visible?: boolean;
11
+ readonly visible: boolean;
12
12
  }
13
13
  /**
14
14
  * Renders the default Menu for the Autocomplete component.
@@ -2,8 +2,7 @@ import React, { PropsWithChildren } from "react";
2
2
  import { UseRepositionMenu } from "../useRepositionMenu";
3
3
  export interface BaseAutocompleteMenuWrapperInternalProps {
4
4
  readonly setMenuRef: UseRepositionMenu["setMenuRef"];
5
- readonly popperStyles: UseRepositionMenu["styles"];
6
- readonly attributes: UseRepositionMenu["attributes"];
5
+ readonly floatStyles: UseRepositionMenu["styles"];
7
6
  readonly targetWidth: UseRepositionMenu["targetWidth"];
8
7
  readonly visible?: boolean;
9
8
  }
@@ -12,7 +11,7 @@ export interface BaseAutocompleteMenuWrapperInternalProps {
12
11
  * @param attachTo - The element that the menu should be attached to.
13
12
  */
14
13
  export declare function useAutocompleteMenu({ attachTo, }: {
15
- attachTo: React.RefObject<Element | null>;
14
+ attachTo: HTMLDivElement | null;
16
15
  }): {
17
16
  MenuWrapper: ({ children, visible, }: {
18
17
  children?: React.ReactNode;
@@ -0,0 +1,2 @@
1
+ export declare const AUTOCOMPLETE_MAX_HEIGHT = 300;
2
+ export declare const AUTCOMPLETE_MIN_HEIGHT = 100;
@@ -3,48 +3,38 @@
3
3
  var Autocomplete = require('../Autocomplete-cjs.js');
4
4
  require('../tslib.es6-cjs.js');
5
5
  require('react');
6
- require('../Modal/index.cjs');
7
- require('react-dom');
8
6
  require('classnames');
9
- require('framer-motion');
10
- require('../useRefocusOnActivator-cjs.js');
11
- require('../useOnKeyDown-cjs.js');
12
- require('../useFocusTrap-cjs.js');
7
+ require('../useIsMounted-cjs.js');
8
+ require('../useSafeLayoutEffect-cjs.js');
9
+ require('../floating-ui.react-cjs.js');
10
+ require('react-dom');
13
11
  require('../Heading-cjs.js');
14
12
  require('../Typography-cjs.js');
15
- require('../Button-cjs.js');
16
- require('react-router-dom');
13
+ require('../Text-cjs.js');
17
14
  require('../Icon-cjs.js');
18
15
  require('@jobber/design');
19
- require('../ButtonDismiss-cjs.js');
20
- require('../noop-cjs.js');
21
- require('../_commonjsHelpers-cjs.js');
22
- require('../floating-ui.react-cjs.js');
23
- require('../identity-cjs.js');
24
- require('../isTypedArray-cjs.js');
25
- require('../isObjectLike-cjs.js');
26
- require('../AtlantisPortalContent-cjs.js');
27
- require('../AtlantisThemeContext-cjs.js');
28
- require('../_baseAssignValue-cjs.js');
29
- require('../_baseFor-cjs.js');
30
- require('../keysIn-cjs.js');
31
- require('../_isIterateeCall-cjs.js');
32
- require('../_setToString-cjs.js');
33
- require('../useIsMounted-cjs.js');
34
- require('../useSafeLayoutEffect-cjs.js');
35
- require('react-popper');
36
- require('../Text-cjs.js');
16
+ require('../useOnKeyDown-cjs.js');
37
17
  require('../InputText/index.cjs');
38
18
  require('../FormField-cjs.js');
19
+ require('framer-motion');
20
+ require('../Button-cjs.js');
21
+ require('react-router-dom');
39
22
  require('../useFormFieldFocus-cjs.js');
40
23
  require('../InputValidation-cjs.js');
41
24
  require('../Spinner-cjs.js');
42
25
  require('react-hook-form');
43
26
  require('../omit-cjs.js');
27
+ require('../_commonjsHelpers-cjs.js');
44
28
  require('../_baseGet-cjs.js');
29
+ require('../isTypedArray-cjs.js');
30
+ require('../isObjectLike-cjs.js');
31
+ require('../identity-cjs.js');
45
32
  require('../_getTag-cjs.js');
46
33
  require('../isSymbol-cjs.js');
34
+ require('../keysIn-cjs.js');
35
+ require('../_baseAssignValue-cjs.js');
47
36
  require('../_baseFlatten-cjs.js');
37
+ require('../_setToString-cjs.js');
48
38
  require('../useDebounce-cjs.js');
49
39
  require('../debounce-cjs.js');
50
40
 
@@ -1,47 +1,37 @@
1
1
  export { A as Autocomplete, d as BaseAutocompleteMenuWrapper, a as BaseMenuGroupOption, B as BaseMenuOption, K as KeyboardAction, M as MenuOption, g as getRequestedIndexChange, f as isOptionGroup, i as isOptionSelected, e as useAutocompleteMenu, b as useCustomKeyboardNavigation, u as useKeyboardNavigation, c as useRepositionMenu } from '../Autocomplete-es.js';
2
2
  import '../tslib.es6-es.js';
3
3
  import 'react';
4
- import '../Modal/index.mjs';
5
- import 'react-dom';
6
4
  import 'classnames';
7
- import 'framer-motion';
8
- import '../useRefocusOnActivator-es.js';
9
- import '../useOnKeyDown-es.js';
10
- import '../useFocusTrap-es.js';
5
+ import '../useIsMounted-es.js';
6
+ import '../useSafeLayoutEffect-es.js';
7
+ import '../floating-ui.react-es.js';
8
+ import 'react-dom';
11
9
  import '../Heading-es.js';
12
10
  import '../Typography-es.js';
13
- import '../Button-es.js';
14
- import 'react-router-dom';
11
+ import '../Text-es.js';
15
12
  import '../Icon-es.js';
16
13
  import '@jobber/design';
17
- import '../ButtonDismiss-es.js';
18
- import '../noop-es.js';
19
- import '../_commonjsHelpers-es.js';
20
- import '../floating-ui.react-es.js';
21
- import '../identity-es.js';
22
- import '../isTypedArray-es.js';
23
- import '../isObjectLike-es.js';
24
- import '../AtlantisPortalContent-es.js';
25
- import '../AtlantisThemeContext-es.js';
26
- import '../_baseAssignValue-es.js';
27
- import '../_baseFor-es.js';
28
- import '../keysIn-es.js';
29
- import '../_isIterateeCall-es.js';
30
- import '../_setToString-es.js';
31
- import '../useIsMounted-es.js';
32
- import '../useSafeLayoutEffect-es.js';
33
- import 'react-popper';
34
- import '../Text-es.js';
14
+ import '../useOnKeyDown-es.js';
35
15
  import '../InputText/index.mjs';
36
16
  import '../FormField-es.js';
17
+ import 'framer-motion';
18
+ import '../Button-es.js';
19
+ import 'react-router-dom';
37
20
  import '../useFormFieldFocus-es.js';
38
21
  import '../InputValidation-es.js';
39
22
  import '../Spinner-es.js';
40
23
  import 'react-hook-form';
41
24
  import '../omit-es.js';
25
+ import '../_commonjsHelpers-es.js';
42
26
  import '../_baseGet-es.js';
27
+ import '../isTypedArray-es.js';
28
+ import '../isObjectLike-es.js';
29
+ import '../identity-es.js';
43
30
  import '../_getTag-es.js';
44
31
  import '../isSymbol-es.js';
32
+ import '../keysIn-es.js';
33
+ import '../_baseAssignValue-es.js';
45
34
  import '../_baseFlatten-es.js';
35
+ import '../_setToString-es.js';
46
36
  import '../useDebounce-es.js';
47
37
  import '../debounce-es.js';
@@ -1,23 +1,10 @@
1
- import { usePopper } from "react-popper";
2
1
  import { MenuProps } from "./Autocomplete.types";
3
- export interface UseRepositionMenu extends ReturnType<typeof usePopper> {
2
+ export interface UseRepositionMenu {
4
3
  readonly menuRef: HTMLElement | null;
5
4
  readonly setMenuRef: (ref: HTMLElement | null) => void;
6
5
  readonly targetWidth: number | undefined;
7
- }
8
- export declare function useRepositionMenu(attachTo: MenuProps["attachTo"], visible?: boolean): {
9
- menuRef: HTMLElement | null;
10
- setMenuRef: import("react").Dispatch<import("react").SetStateAction<HTMLElement | null>>;
11
- targetWidth: number | undefined;
12
- styles: {
13
- [key: string]: React.CSSProperties;
14
- };
15
- attributes: {
16
- [key: string]: {
17
- [key: string]: string;
18
- } | undefined;
6
+ readonly styles: {
7
+ float: React.CSSProperties;
19
8
  };
20
- state: import("@popperjs/core").State | null;
21
- update: import("@popperjs/core").Instance["update"] | null;
22
- forceUpdate: import("@popperjs/core").Instance["forceUpdate"] | null;
23
- };
9
+ }
10
+ export declare function useRepositionMenu(attachTo: MenuProps["attachTo"], visible: boolean, cssManagedVisibility: boolean): UseRepositionMenu;
@@ -2,12 +2,10 @@
2
2
 
3
3
  var tslib_es6 = require('./tslib.es6-cjs.js');
4
4
  var React = require('react');
5
- var Modal_index = require('./Modal/index.cjs');
6
5
  var classnames = require('classnames');
7
6
  var useIsMounted = require('./useIsMounted-cjs.js');
8
- var ReactDOM = require('react-dom');
7
+ var floatingUi_react = require('./floating-ui.react-cjs.js');
9
8
  var useSafeLayoutEffect = require('./useSafeLayoutEffect-cjs.js');
10
- var reactPopper = require('react-popper');
11
9
  var Heading = require('./Heading-cjs.js');
12
10
  var Text = require('./Text-cjs.js');
13
11
  var Icon = require('./Icon-cjs.js');
@@ -18,25 +16,61 @@ var FormField = require('./FormField-cjs.js');
18
16
 
19
17
  var styles = {"autocomplete":"_7mObJiwfPh4-","options":"dL5JShAJlKM-","heading":"PWZL-94hH7k-","visible":"_2RzcnTdaPyc-","option":"y9zhi8Wr8QA-","active":"_3Xg49dtL1Q8-","separator":"LIeh390F3W8-","icon":"K2phy6IC3TY-","text":"a6-LbUm5WnY-","label":"tQNbuxcE9nU-","details":"qacStG9-XbE-","spinning":"P9cQDL4MZ-s-"};
20
18
 
21
- function useRepositionMenu(attachTo, visible = false) {
22
- var _a;
23
- const [menuRef, setMenuRef] = React.useState(null);
24
- const popper = reactPopper.usePopper(attachTo.current, menuRef, {
25
- modifiers: [
26
- { name: "offset", options: { offset: [0, 8] } },
27
- { name: "flip", options: { fallbackPlacements: ["top"] } },
28
- ],
29
- });
19
+ const AUTOCOMPLETE_MAX_HEIGHT = 300;
20
+ const AUTCOMPLETE_MIN_HEIGHT = 100;
21
+
22
+ function useRepositionMenu(attachTo, visible, cssManagedVisibility) {
23
+ const { refs, floatingStyles, update } = floatingUi_react.useFloating(Object.assign({ placement: "bottom", middleware: [
24
+ floatingUi_react.offset(8),
25
+ floatingUi_react.flip({ fallbackPlacements: ["top"] }),
26
+ floatingUi_react.size({
27
+ apply({ availableHeight, elements }) {
28
+ // Limit the height for a true maximum
29
+ // However if we have less space than that, then reduce it to allow scrolling
30
+ const maxHeight = availableHeight > AUTOCOMPLETE_MAX_HEIGHT
31
+ ? AUTOCOMPLETE_MAX_HEIGHT
32
+ : Math.max(AUTCOMPLETE_MIN_HEIGHT, availableHeight);
33
+ Object.assign(elements.floating.style, {
34
+ maxHeight: `${maxHeight}px`,
35
+ });
36
+ },
37
+ }),
38
+ ], elements: {
39
+ reference: attachTo,
40
+ } }, (!cssManagedVisibility
41
+ ? {
42
+ whileElementsMounted: floatingUi_react.autoUpdate,
43
+ }
44
+ : {})));
45
+ // While DefaultMenu leverages conditional rendering, CustomMenu is hidden with CSS
46
+ // We need to apply the correct update method to each case
30
47
  useSafeLayoutEffect.useSafeLayoutEffect_1(() => {
31
- var _a;
32
- (_a = popper === null || popper === void 0 ? void 0 : popper.update) === null || _a === void 0 ? void 0 : _a.call(popper);
33
- }, [visible]);
34
- const targetWidth = (_a = attachTo.current) === null || _a === void 0 ? void 0 : _a.clientWidth;
35
- return Object.assign(Object.assign({}, popper), { menuRef, setMenuRef, targetWidth });
48
+ if (cssManagedVisibility && visible && attachTo && refs.floating.current) {
49
+ const cleanup = floatingUi_react.autoUpdate(attachTo, refs.floating.current, update);
50
+ return cleanup;
51
+ }
52
+ return undefined;
53
+ }, [
54
+ cssManagedVisibility,
55
+ visible,
56
+ attachTo,
57
+ refs.floating.current,
58
+ update,
59
+ floatingUi_react.autoUpdate,
60
+ ]);
61
+ const targetWidth = attachTo === null || attachTo === void 0 ? void 0 : attachTo.clientWidth;
62
+ return {
63
+ menuRef: refs.floating.current,
64
+ setMenuRef: refs.setFloating,
65
+ targetWidth,
66
+ styles: {
67
+ float: floatingStyles,
68
+ },
69
+ };
36
70
  }
37
71
 
38
- function BaseAutocompleteMenuWrapperInternal({ setMenuRef, popperStyles, attributes, targetWidth, visible, children, }) {
39
- return (React.createElement("div", Object.assign({ className: classnames(styles.options, { [styles.visible]: visible }), ref: setMenuRef, style: Object.assign(Object.assign({}, popperStyles.popper), { width: targetWidth }), "data-elevation": "elevated" }, attributes.popper), children));
72
+ function BaseAutocompleteMenuWrapperInternal({ setMenuRef, floatStyles, targetWidth, visible, children, }) {
73
+ return (React.createElement("div", { className: classnames(styles.options, { [styles.visible]: visible }), ref: setMenuRef, style: Object.assign(Object.assign({}, floatStyles.float), { width: targetWidth }), "data-elevation": "elevated" }, children));
40
74
  }
41
75
  /**
42
76
  * Provides a wrapper for the Autocomplete menu that handles positioning and visibility.
@@ -45,18 +79,18 @@ function BaseAutocompleteMenuWrapperInternal({ setMenuRef, popperStyles, attribu
45
79
  function useAutocompleteMenu({ attachTo, }) {
46
80
  const [menuRef, setMenuRef] = React.useState(null);
47
81
  const AutocompleteMenuWrapper = React.useCallback(({ children, visible, }) => {
48
- const menuPopperProps = useRepositionMenu(attachTo, visible);
82
+ const menuFloatProps = useRepositionMenu(attachTo, visible, true);
49
83
  React.useEffect(() => {
50
- setMenuRef(menuPopperProps.menuRef);
51
- }, [menuPopperProps.menuRef]);
52
- return (React.createElement(BaseAutocompleteMenuWrapper, { attributes: menuPopperProps.attributes, popperStyles: menuPopperProps.styles, setMenuRef: menuPopperProps.setMenuRef, targetWidth: menuPopperProps.targetWidth, visible: visible }, children));
84
+ setMenuRef(menuFloatProps.menuRef);
85
+ }, [menuFloatProps.menuRef]);
86
+ return (React.createElement(BaseAutocompleteMenuWrapper, { floatStyles: menuFloatProps.styles, setMenuRef: menuFloatProps.setMenuRef, targetWidth: menuFloatProps.targetWidth, visible: visible }, children));
53
87
  }, [attachTo]);
54
88
  return { MenuWrapper: AutocompleteMenuWrapper, menuRef };
55
89
  }
56
90
  function BaseAutocompleteMenuWrapper(props) {
57
91
  const mounted = useIsMounted.useIsMounted_2();
58
92
  const menu = React.createElement(BaseAutocompleteMenuWrapperInternal, Object.assign({}, props));
59
- return mounted.current ? ReactDOM.createPortal(menu, document.body) : menu;
93
+ return mounted.current ? React.createElement(floatingUi_react.FloatingPortal, null, menu) : menu;
60
94
  }
61
95
 
62
96
  function isOptionSelected(selectedOption, option) {
@@ -196,7 +230,7 @@ function getRequestedIndexChange({ event, options, direction, highlightedIndex,
196
230
  * Renders the default Menu for the Autocomplete component.
197
231
  */
198
232
  function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visible, }) {
199
- const { menuRef, setMenuRef, styles: popperStyles, attributes, targetWidth, } = useRepositionMenu(attachTo, visible);
233
+ const { menuRef, setMenuRef, styles: floatStyles, targetWidth, } = useRepositionMenu(attachTo, visible, false);
200
234
  const detectSeparatorCondition = (option) => option.description || option.details;
201
235
  const addSeparators = options.some(detectSeparatorCondition);
202
236
  const { highlightedIndex } = useKeyboardNavigation({
@@ -205,30 +239,12 @@ function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visibl
205
239
  visible,
206
240
  menuRef,
207
241
  });
208
- return (React.createElement(BaseAutocompleteMenuWrapper, { setMenuRef, popperStyles, attributes, targetWidth, visible }, options === null || options === void 0 ? void 0 : options.map((option, index) => {
242
+ return (React.createElement(BaseAutocompleteMenuWrapper, { setMenuRef, floatStyles, targetWidth, visible }, options === null || options === void 0 ? void 0 : options.map((option, index) => {
209
243
  return (React.createElement(MenuOption, { key: index, option: option, isHighlighted: index === highlightedIndex, onOptionSelect: onOptionSelect, isSelected: isOptionSelected(selectedOption, option), addSeparators: addSeparators }));
210
244
  })));
211
245
  }
212
246
 
213
247
  function Menu({ options, selectedOption, onOptionSelect, inputFocused, attachTo, inputRef, customRenderMenu, }) {
214
- const { open: isWithinOpenModal } = Modal_index.useModalContext();
215
- /**
216
- * Experimental/temporary workaround for Autocompletes within Modals. This is only necessary
217
- * when an Autocomplete uses `customRenderMenu` and is rendered within the composable version
218
- * of Modal (aka Modal.Provider).
219
- *
220
- * If `customRenderMenu` contains clickable elements such as Buttons, the consumer must ALSO
221
- * replace any `onClick` handlers with `onMouseDown` handlers on those Buttons.
222
- *
223
- * The check below prevents Autocomplete from rendering the `customRenderMenu` when it's not visible
224
- * (when the input isn't focused). This prevents Modals (FloatingUI) from marking the Autocomplete's
225
- * menu as data-floating-ui-inert and aria-hidden="true". As a result, this prevents the bug where clicking
226
- * within its menu would cause FloatingUI to close the parent Modal because it determined the click was
227
- * outside of the Modal.
228
- */
229
- const specialModalWorkaround = isWithinOpenModal && customRenderMenu;
230
- if (specialModalWorkaround && !inputFocused)
231
- return null;
232
248
  if (customRenderMenu) {
233
249
  return (React.createElement(CustomMenu, { attachTo: attachTo, inputFocused: inputFocused, inputRef: inputRef, customRenderMenu: customRenderMenu, options: options, onOptionSelect: onOptionSelect, selectedOption: selectedOption }));
234
250
  }
@@ -263,7 +279,7 @@ function AutocompleteInternal(_a, ref) {
263
279
  const [options, setOptions] = React.useState(initialOptionsMemo);
264
280
  const [inputFocused, setInputFocused] = React.useState(false);
265
281
  const [inputText, setInputText] = React.useState((_b = value === null || value === void 0 ? void 0 : value.label) !== null && _b !== void 0 ? _b : "");
266
- const autocompleteRef = React.useRef(null);
282
+ const [autocompleteRef, setAutocompleteRef] = React.useState(null);
267
283
  const delayedSearch = useDebounce.useDebounce(updateSearch, debounceRate);
268
284
  const inputRef = React.useRef(null);
269
285
  React.useEffect(() => {
@@ -273,7 +289,7 @@ function AutocompleteInternal(_a, ref) {
273
289
  var _a;
274
290
  updateInput((_a = value === null || value === void 0 ? void 0 : value.label) !== null && _a !== void 0 ? _a : "");
275
291
  }, [value]);
276
- return (React.createElement("div", { className: styles.autocomplete, ref: autocompleteRef },
292
+ return (React.createElement("div", { className: styles.autocomplete, ref: setAutocompleteRef },
277
293
  React.createElement(InputText_index.InputText, Object.assign({ ref: FormField.mergeRefs([ref, inputRef]), autocomplete: false, size: size, value: inputText, onChange: handleInputChange, placeholder: placeholder, onFocus: handleInputFocus, onBlur: handleInputBlur, validations: validations }, inputProps)),
278
294
  React.createElement(Menu, { attachTo: autocompleteRef, inputRef: inputRef, inputFocused: inputFocused, options: options, customRenderMenu: customRenderMenu, selectedOption: value, onOptionSelect: handleMenuChange })));
279
295
  function updateInput(newText) {
@@ -1,11 +1,9 @@
1
1
  import { _ as __rest, a as __awaiter } from './tslib.es6-es.js';
2
- import React__default, { useState, useCallback, useEffect, forwardRef, useMemo, useRef } from 'react';
3
- import { useModalContext } from './Modal/index.mjs';
2
+ import React__default, { useCallback, useEffect, useState, forwardRef, useMemo, useRef } from 'react';
4
3
  import classnames from 'classnames';
5
4
  import { u as useIsMounted_2 } from './useIsMounted-es.js';
6
- import { createPortal } from 'react-dom';
5
+ import { b as useFloating, o as offset, i as flip, p as size, d as autoUpdate, h as FloatingPortal } from './floating-ui.react-es.js';
7
6
  import { u as useSafeLayoutEffect_1 } from './useSafeLayoutEffect-es.js';
8
- import { usePopper } from 'react-popper';
9
7
  import { H as Heading } from './Heading-es.js';
10
8
  import { T as Text } from './Text-es.js';
11
9
  import { I as Icon } from './Icon-es.js';
@@ -16,25 +14,61 @@ import { m as mergeRefs } from './FormField-es.js';
16
14
 
17
15
  var styles = {"autocomplete":"_7mObJiwfPh4-","options":"dL5JShAJlKM-","heading":"PWZL-94hH7k-","visible":"_2RzcnTdaPyc-","option":"y9zhi8Wr8QA-","active":"_3Xg49dtL1Q8-","separator":"LIeh390F3W8-","icon":"K2phy6IC3TY-","text":"a6-LbUm5WnY-","label":"tQNbuxcE9nU-","details":"qacStG9-XbE-","spinning":"P9cQDL4MZ-s-"};
18
16
 
19
- function useRepositionMenu(attachTo, visible = false) {
20
- var _a;
21
- const [menuRef, setMenuRef] = useState(null);
22
- const popper = usePopper(attachTo.current, menuRef, {
23
- modifiers: [
24
- { name: "offset", options: { offset: [0, 8] } },
25
- { name: "flip", options: { fallbackPlacements: ["top"] } },
26
- ],
27
- });
17
+ const AUTOCOMPLETE_MAX_HEIGHT = 300;
18
+ const AUTCOMPLETE_MIN_HEIGHT = 100;
19
+
20
+ function useRepositionMenu(attachTo, visible, cssManagedVisibility) {
21
+ const { refs, floatingStyles, update } = useFloating(Object.assign({ placement: "bottom", middleware: [
22
+ offset(8),
23
+ flip({ fallbackPlacements: ["top"] }),
24
+ size({
25
+ apply({ availableHeight, elements }) {
26
+ // Limit the height for a true maximum
27
+ // However if we have less space than that, then reduce it to allow scrolling
28
+ const maxHeight = availableHeight > AUTOCOMPLETE_MAX_HEIGHT
29
+ ? AUTOCOMPLETE_MAX_HEIGHT
30
+ : Math.max(AUTCOMPLETE_MIN_HEIGHT, availableHeight);
31
+ Object.assign(elements.floating.style, {
32
+ maxHeight: `${maxHeight}px`,
33
+ });
34
+ },
35
+ }),
36
+ ], elements: {
37
+ reference: attachTo,
38
+ } }, (!cssManagedVisibility
39
+ ? {
40
+ whileElementsMounted: autoUpdate,
41
+ }
42
+ : {})));
43
+ // While DefaultMenu leverages conditional rendering, CustomMenu is hidden with CSS
44
+ // We need to apply the correct update method to each case
28
45
  useSafeLayoutEffect_1(() => {
29
- var _a;
30
- (_a = popper === null || popper === void 0 ? void 0 : popper.update) === null || _a === void 0 ? void 0 : _a.call(popper);
31
- }, [visible]);
32
- const targetWidth = (_a = attachTo.current) === null || _a === void 0 ? void 0 : _a.clientWidth;
33
- return Object.assign(Object.assign({}, popper), { menuRef, setMenuRef, targetWidth });
46
+ if (cssManagedVisibility && visible && attachTo && refs.floating.current) {
47
+ const cleanup = autoUpdate(attachTo, refs.floating.current, update);
48
+ return cleanup;
49
+ }
50
+ return undefined;
51
+ }, [
52
+ cssManagedVisibility,
53
+ visible,
54
+ attachTo,
55
+ refs.floating.current,
56
+ update,
57
+ autoUpdate,
58
+ ]);
59
+ const targetWidth = attachTo === null || attachTo === void 0 ? void 0 : attachTo.clientWidth;
60
+ return {
61
+ menuRef: refs.floating.current,
62
+ setMenuRef: refs.setFloating,
63
+ targetWidth,
64
+ styles: {
65
+ float: floatingStyles,
66
+ },
67
+ };
34
68
  }
35
69
 
36
- function BaseAutocompleteMenuWrapperInternal({ setMenuRef, popperStyles, attributes, targetWidth, visible, children, }) {
37
- return (React__default.createElement("div", Object.assign({ className: classnames(styles.options, { [styles.visible]: visible }), ref: setMenuRef, style: Object.assign(Object.assign({}, popperStyles.popper), { width: targetWidth }), "data-elevation": "elevated" }, attributes.popper), children));
70
+ function BaseAutocompleteMenuWrapperInternal({ setMenuRef, floatStyles, targetWidth, visible, children, }) {
71
+ return (React__default.createElement("div", { className: classnames(styles.options, { [styles.visible]: visible }), ref: setMenuRef, style: Object.assign(Object.assign({}, floatStyles.float), { width: targetWidth }), "data-elevation": "elevated" }, children));
38
72
  }
39
73
  /**
40
74
  * Provides a wrapper for the Autocomplete menu that handles positioning and visibility.
@@ -43,18 +77,18 @@ function BaseAutocompleteMenuWrapperInternal({ setMenuRef, popperStyles, attribu
43
77
  function useAutocompleteMenu({ attachTo, }) {
44
78
  const [menuRef, setMenuRef] = React__default.useState(null);
45
79
  const AutocompleteMenuWrapper = useCallback(({ children, visible, }) => {
46
- const menuPopperProps = useRepositionMenu(attachTo, visible);
80
+ const menuFloatProps = useRepositionMenu(attachTo, visible, true);
47
81
  useEffect(() => {
48
- setMenuRef(menuPopperProps.menuRef);
49
- }, [menuPopperProps.menuRef]);
50
- return (React__default.createElement(BaseAutocompleteMenuWrapper, { attributes: menuPopperProps.attributes, popperStyles: menuPopperProps.styles, setMenuRef: menuPopperProps.setMenuRef, targetWidth: menuPopperProps.targetWidth, visible: visible }, children));
82
+ setMenuRef(menuFloatProps.menuRef);
83
+ }, [menuFloatProps.menuRef]);
84
+ return (React__default.createElement(BaseAutocompleteMenuWrapper, { floatStyles: menuFloatProps.styles, setMenuRef: menuFloatProps.setMenuRef, targetWidth: menuFloatProps.targetWidth, visible: visible }, children));
51
85
  }, [attachTo]);
52
86
  return { MenuWrapper: AutocompleteMenuWrapper, menuRef };
53
87
  }
54
88
  function BaseAutocompleteMenuWrapper(props) {
55
89
  const mounted = useIsMounted_2();
56
90
  const menu = React__default.createElement(BaseAutocompleteMenuWrapperInternal, Object.assign({}, props));
57
- return mounted.current ? createPortal(menu, document.body) : menu;
91
+ return mounted.current ? React__default.createElement(FloatingPortal, null, menu) : menu;
58
92
  }
59
93
 
60
94
  function isOptionSelected(selectedOption, option) {
@@ -194,7 +228,7 @@ function getRequestedIndexChange({ event, options, direction, highlightedIndex,
194
228
  * Renders the default Menu for the Autocomplete component.
195
229
  */
196
230
  function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visible, }) {
197
- const { menuRef, setMenuRef, styles: popperStyles, attributes, targetWidth, } = useRepositionMenu(attachTo, visible);
231
+ const { menuRef, setMenuRef, styles: floatStyles, targetWidth, } = useRepositionMenu(attachTo, visible, false);
198
232
  const detectSeparatorCondition = (option) => option.description || option.details;
199
233
  const addSeparators = options.some(detectSeparatorCondition);
200
234
  const { highlightedIndex } = useKeyboardNavigation({
@@ -203,30 +237,12 @@ function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visibl
203
237
  visible,
204
238
  menuRef,
205
239
  });
206
- return (React__default.createElement(BaseAutocompleteMenuWrapper, { setMenuRef, popperStyles, attributes, targetWidth, visible }, options === null || options === void 0 ? void 0 : options.map((option, index) => {
240
+ return (React__default.createElement(BaseAutocompleteMenuWrapper, { setMenuRef, floatStyles, targetWidth, visible }, options === null || options === void 0 ? void 0 : options.map((option, index) => {
207
241
  return (React__default.createElement(MenuOption, { key: index, option: option, isHighlighted: index === highlightedIndex, onOptionSelect: onOptionSelect, isSelected: isOptionSelected(selectedOption, option), addSeparators: addSeparators }));
208
242
  })));
209
243
  }
210
244
 
211
245
  function Menu({ options, selectedOption, onOptionSelect, inputFocused, attachTo, inputRef, customRenderMenu, }) {
212
- const { open: isWithinOpenModal } = useModalContext();
213
- /**
214
- * Experimental/temporary workaround for Autocompletes within Modals. This is only necessary
215
- * when an Autocomplete uses `customRenderMenu` and is rendered within the composable version
216
- * of Modal (aka Modal.Provider).
217
- *
218
- * If `customRenderMenu` contains clickable elements such as Buttons, the consumer must ALSO
219
- * replace any `onClick` handlers with `onMouseDown` handlers on those Buttons.
220
- *
221
- * The check below prevents Autocomplete from rendering the `customRenderMenu` when it's not visible
222
- * (when the input isn't focused). This prevents Modals (FloatingUI) from marking the Autocomplete's
223
- * menu as data-floating-ui-inert and aria-hidden="true". As a result, this prevents the bug where clicking
224
- * within its menu would cause FloatingUI to close the parent Modal because it determined the click was
225
- * outside of the Modal.
226
- */
227
- const specialModalWorkaround = isWithinOpenModal && customRenderMenu;
228
- if (specialModalWorkaround && !inputFocused)
229
- return null;
230
246
  if (customRenderMenu) {
231
247
  return (React__default.createElement(CustomMenu, { attachTo: attachTo, inputFocused: inputFocused, inputRef: inputRef, customRenderMenu: customRenderMenu, options: options, onOptionSelect: onOptionSelect, selectedOption: selectedOption }));
232
248
  }
@@ -261,7 +277,7 @@ function AutocompleteInternal(_a, ref) {
261
277
  const [options, setOptions] = useState(initialOptionsMemo);
262
278
  const [inputFocused, setInputFocused] = useState(false);
263
279
  const [inputText, setInputText] = useState((_b = value === null || value === void 0 ? void 0 : value.label) !== null && _b !== void 0 ? _b : "");
264
- const autocompleteRef = useRef(null);
280
+ const [autocompleteRef, setAutocompleteRef] = useState(null);
265
281
  const delayedSearch = useDebounce(updateSearch, debounceRate);
266
282
  const inputRef = useRef(null);
267
283
  useEffect(() => {
@@ -271,7 +287,7 @@ function AutocompleteInternal(_a, ref) {
271
287
  var _a;
272
288
  updateInput((_a = value === null || value === void 0 ? void 0 : value.label) !== null && _a !== void 0 ? _a : "");
273
289
  }, [value]);
274
- return (React__default.createElement("div", { className: styles.autocomplete, ref: autocompleteRef },
290
+ return (React__default.createElement("div", { className: styles.autocomplete, ref: setAutocompleteRef },
275
291
  React__default.createElement(InputText, Object.assign({ ref: mergeRefs([ref, inputRef]), autocomplete: false, size: size, value: inputText, onChange: handleInputChange, placeholder: placeholder, onFocus: handleInputFocus, onBlur: handleInputBlur, validations: validations }, inputProps)),
276
292
  React__default.createElement(Menu, { attachTo: autocompleteRef, inputRef: inputRef, inputFocused: inputFocused, options: options, customRenderMenu: customRenderMenu, selectedOption: value, onOptionSelect: handleMenuChange })));
277
293
  function updateInput(newText) {
@@ -2,7 +2,7 @@ import { _ as __rest } from './tslib.es6-es.js';
2
2
  import React__default, { useState, useMemo, createContext, useContext } from 'react';
3
3
  import classnames from 'classnames';
4
4
  import ReactDOM__default from 'react-dom';
5
- import { i as arrow, b as useFloating, d as autoUpdate, o as offset, s as shift, c as autoPlacement, j as flip } from './floating-ui.react-es.js';
5
+ import { o as offset, s as shift, c as autoPlacement, i as flip, j as arrow, b as useFloating, d as autoUpdate } from './floating-ui.react-es.js';
6
6
  import { u as useRefocusOnActivator_2 } from './useRefocusOnActivator-es.js';
7
7
  import { A as AtlantisPortalContent } from './AtlantisPortalContent-es.js';
8
8
  import { B as ButtonDismiss } from './ButtonDismiss-es.js';