@jobber/components 6.75.2 → 6.76.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.
@@ -3,7 +3,7 @@ import React__default, { useCallback, useEffect, useState, forwardRef, useMemo,
3
3
  import { u as useDebounce_2 } from './useDebounce-es.js';
4
4
  import classnames from 'classnames';
5
5
  import { u as useIsMounted_2 } from './useIsMounted-es.js';
6
- import { b as useFloating, o as offset, i as flip, q as size, d as autoUpdate, h as FloatingPortal } from './floating-ui.react-es.js';
6
+ import { b as useFloating, o as offset, i as flip, q as size, d as autoUpdate, F as FloatingPortal } from './floating-ui.react-es.js';
7
7
  import { u as useSafeLayoutEffect_1 } from './useSafeLayoutEffect-es.js';
8
8
  import { H as Heading } from './Heading-es.js';
9
9
  import { T as Text } from './Text-es.js';
@@ -2,7 +2,7 @@ import { ChipProps } from "../Chip";
2
2
  import { ChipDismissibleProps } from "../ChipsTypes";
3
3
  export type InternalChipDismissibleProps = Omit<ChipDismissibleProps, "type">;
4
4
  export interface ChipDismissibleInputProps extends Pick<InternalChipDismissibleProps, "activator" | "isLoadingMore" | "onSearch" | "onLoadMore"> {
5
- readonly attachTo: React.RefObject<Element | null>;
5
+ readonly attachTo: HTMLElement | null;
6
6
  readonly options: ChipProps[];
7
7
  onCustomOptionSelect?(value: string): void;
8
8
  onOptionSelect(value: string): void;
@@ -17,7 +17,8 @@ require('../../../_setToString-cjs.js');
17
17
  require('../../../debounce-cjs.js');
18
18
  require('../../../Icon-cjs.js');
19
19
  require('@jobber/design');
20
- require('react-popper');
20
+ require('../../../floating-ui.react-cjs.js');
21
+ require('react-dom');
21
22
 
22
23
 
23
24
 
@@ -15,4 +15,5 @@ import '../../../_setToString-es.js';
15
15
  import '../../../debounce-es.js';
16
16
  import '../../../Icon-es.js';
17
17
  import '@jobber/design';
18
- import 'react-popper';
18
+ import '../../../floating-ui.react-es.js';
19
+ import 'react-dom';
@@ -1,7 +1,8 @@
1
1
  import { KeyboardEvent, MouseEvent } from "react";
2
2
  import { InternalChipDismissibleProps } from "../InternalChipDismissibleTypes";
3
3
  export declare function useInternalChipDismissible({ children, selected, onChange, onClick, onCustomAdd, }: InternalChipDismissibleProps): {
4
- ref: import("react").RefObject<HTMLDivElement>;
4
+ ref: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null>>;
5
+ wrapperElement: HTMLDivElement | null;
5
6
  sortedVisibleChipOptions: import("../../Chip").ChipProps[];
6
7
  availableChipOptions: import("../../Chip").ChipProps[];
7
8
  handleChipRemove: (value: string) => () => void;
@@ -1,16 +1,10 @@
1
- import { RefObject } from "react";
2
- export declare function useRepositionMenu(attachTo: RefObject<Element | null>): {
3
- setPositionedElementRef: import("react").Dispatch<import("react").SetStateAction<HTMLElement | null | undefined>>;
4
- targetWidth: number | undefined;
5
- styles: {
6
- [key: string]: React.CSSProperties;
1
+ import React from "react";
2
+ export interface UseRepositionMenu {
3
+ readonly setFloatingRef: (ref: HTMLElement | null) => void;
4
+ readonly targetWidth: number | undefined;
5
+ readonly styles: {
6
+ float: React.CSSProperties;
7
7
  };
8
- attributes: {
9
- [key: string]: {
10
- [key: string]: string;
11
- } | undefined;
12
- };
13
- state: import("@popperjs/core").State | null;
14
- update: import("@popperjs/core").Instance["update"] | null;
15
- forceUpdate: import("@popperjs/core").Instance["forceUpdate"] | null;
16
- };
8
+ readonly update: () => void;
9
+ }
10
+ export declare function useRepositionMenu(attachTo: HTMLElement | null): UseRepositionMenu;
@@ -1 +1 @@
1
- export declare function useScrollToActive(index: number): import("react").RefObject<HTMLDivElement>;
1
+ export declare function useScrollToActive(index: number): import("react").MutableRefObject<HTMLDivElement | null>;
@@ -18,7 +18,8 @@ require('../../_setToString-cjs.js');
18
18
  require('../../debounce-cjs.js');
19
19
  require('../../Icon-cjs.js');
20
20
  require('@jobber/design');
21
- require('react-popper');
21
+ require('../../floating-ui.react-cjs.js');
22
+ require('react-dom');
22
23
  require('classnames');
23
24
  require('../../useSafeLayoutEffect-cjs.js');
24
25
  require('../../Text-cjs.js');
@@ -33,9 +34,9 @@ require('../../Avatar-cjs.js');
33
34
  require('color');
34
35
  require('../../useChildComponent-cjs.js');
35
36
  require('../../Tooltip-cjs.js');
36
- require('react-dom');
37
37
  require('framer-motion');
38
38
  require('../../useIsMounted-cjs.js');
39
+ require('react-popper');
39
40
 
40
41
 
41
42
 
@@ -16,7 +16,8 @@ import '../../_setToString-es.js';
16
16
  import '../../debounce-es.js';
17
17
  import '../../Icon-es.js';
18
18
  import '@jobber/design';
19
- import 'react-popper';
19
+ import '../../floating-ui.react-es.js';
20
+ import 'react-dom';
20
21
  import 'classnames';
21
22
  import '../../useSafeLayoutEffect-es.js';
22
23
  import '../../Text-es.js';
@@ -31,6 +32,6 @@ import '../../Avatar-es.js';
31
32
  import 'color';
32
33
  import '../../useChildComponent-es.js';
33
34
  import '../../Tooltip-es.js';
34
- import 'react-dom';
35
35
  import 'framer-motion';
36
36
  import '../../useIsMounted-es.js';
37
+ import 'react-popper';
@@ -20,7 +20,8 @@ require('../_setToString-cjs.js');
20
20
  require('../debounce-cjs.js');
21
21
  require('../Icon-cjs.js');
22
22
  require('@jobber/design');
23
- require('react-popper');
23
+ require('../floating-ui.react-cjs.js');
24
+ require('react-dom');
24
25
  require('classnames');
25
26
  require('../useSafeLayoutEffect-cjs.js');
26
27
  require('../Text-cjs.js');
@@ -34,9 +35,9 @@ require('../Avatar-cjs.js');
34
35
  require('color');
35
36
  require('../useChildComponent-cjs.js');
36
37
  require('../Tooltip-cjs.js');
37
- require('react-dom');
38
38
  require('framer-motion');
39
39
  require('../useIsMounted-cjs.js');
40
+ require('react-popper');
40
41
 
41
42
  function ChipDismissible({ label, disabled, invalid, prefix, onClick, onRequestRemove, }) {
42
43
  return (React.createElement(InternalChipDismissible.InternalChip, { label: label, disabled: disabled, invalid: invalid, prefix: prefix, onClick: onClick, suffix: React.createElement(Chip$1.InternalChipButton, { icon: "remove", label: label, invalid: invalid, disabled: disabled, onClick: onRequestRemove }) }));
@@ -18,7 +18,8 @@ import '../_setToString-es.js';
18
18
  import '../debounce-es.js';
19
19
  import '../Icon-es.js';
20
20
  import '@jobber/design';
21
- import 'react-popper';
21
+ import '../floating-ui.react-es.js';
22
+ import 'react-dom';
22
23
  import 'classnames';
23
24
  import '../useSafeLayoutEffect-es.js';
24
25
  import '../Text-es.js';
@@ -32,9 +33,9 @@ import '../Avatar-es.js';
32
33
  import 'color';
33
34
  import '../useChildComponent-es.js';
34
35
  import '../Tooltip-es.js';
35
- import 'react-dom';
36
36
  import 'framer-motion';
37
37
  import '../useIsMounted-es.js';
38
+ import 'react-popper';
38
39
 
39
40
  function ChipDismissible({ label, disabled, invalid, prefix, onClick, onRequestRemove, }) {
40
41
  return (React__default.createElement(InternalChip, { label: label, disabled: disabled, invalid: invalid, prefix: prefix, onClick: onClick, suffix: React__default.createElement(InternalChipButton, { icon: "remove", label: label, invalid: invalid, disabled: disabled, onClick: onRequestRemove }) }));
@@ -1,6 +1,6 @@
1
1
  import React__default, { useContext, useRef, useEffect, useMemo } from 'react';
2
2
  import classnames from 'classnames';
3
- import { u as useFloatingParentNodeId, a as useFloatingNodeId, b as useFloating, c as autoPlacement, o as offset, s as shift, d as autoUpdate, e as useDismiss, f as useInteractions, F as FloatingTree, g as FloatingNode, h as FloatingPortal } from './floating-ui.react-es.js';
3
+ import { u as useFloatingParentNodeId, a as useFloatingNodeId, b as useFloating, c as autoPlacement, o as offset, s as shift, d as autoUpdate, e as useDismiss, f as useInteractions, g as FloatingTree, h as FloatingNode, F as FloatingPortal } from './floating-ui.react-es.js';
4
4
  import ReactDOM__default from 'react-dom';
5
5
  import { C as ComboboxContentSearch } from './ComboboxContentSearch-es.js';
6
6
  import { C as ComboboxContentList } from './ComboboxContentList-es.js';
@@ -4,9 +4,9 @@ var React = require('react');
4
4
  var useScrollToActive = require('./useScrollToActive-cjs.js');
5
5
  require('./isObjectLike-cjs.js');
6
6
  require('@jobber/design');
7
- require('react-popper');
8
7
  var classnames = require('classnames');
9
8
  var useSafeLayoutEffect = require('./useSafeLayoutEffect-cjs.js');
9
+ var floatingUi_react = require('./floating-ui.react-cjs.js');
10
10
  var Text = require('./Text-cjs.js');
11
11
  var Button = require('./Button-cjs.js');
12
12
  var Spinner = require('./Spinner-cjs.js');
@@ -19,14 +19,16 @@ function InternalChip({ label, active = false, disabled = false, invalid = false
19
19
  suffix && React.createElement(Chip.ChipNamespace.Suffix, null, suffix)));
20
20
  }
21
21
 
22
- var styles = {"wrapper":"XRnU90M2-fs-","input":"Dq-yFHd1zK0-","menu":"F7CpurjKzBI-","menuList":"J8USVG1tjPs-","menuListOption":"_9SAK31TqNDY-","loadingIndicator":"s5vFJVv0t0Q-","activeOption":"_8d0w-JzgzS4-","spinning":"hDJGLX6kE-U-"};
22
+ var styles = {"wrapper":"XRnU90M2-fs-","input":"Dq-yFHd1zK0-","menu":"F7CpurjKzBI-","menuListOption":"_9SAK31TqNDY-","loadingIndicator":"s5vFJVv0t0Q-","activeOption":"_8d0w-JzgzS4-","spinning":"hDJGLX6kE-U-"};
23
23
 
24
+ // Adding Portal moves it over the limit, but doesn't impact the readabiltiy
25
+ // eslint-disable-next-line max-statements
24
26
  function InternalChipDismissibleInput(props) {
25
27
  const { activator = React.createElement(Button.Button, { icon: "add", type: "secondary", ariaLabel: "Add" }), attachTo, isLoadingMore = false, onLoadMore, options, } = props;
26
28
  const { activeIndex, allOptions, hasAvailableOptions, inputRef, menuId, menuOpen, searchValue, showInput, generateDescendantId, handleBlur, handleFocus, handleSearchChange, handleCancelBlur, handleEnableBlur, handleSetActiveOnMouseOver, handleKeyDown, handleSelectOption, handleShowInput, handleDebouncedSearch, } = useScrollToActive.useInternalChipDismissibleInput(props);
27
- const menuRef = useScrollToActive.useScrollToActive(activeIndex);
29
+ const scrollableRef = useScrollToActive.useScrollToActive(activeIndex);
28
30
  const { ref: visibleChildRef, isInView } = useScrollToActive.useInView();
29
- const { styles: popperStyles, attributes, update, setPositionedElementRef, } = useScrollToActive.useRepositionMenu(attachTo);
31
+ const { styles: floatingStyles, update, setFloatingRef, } = useScrollToActive.useRepositionMenu(attachTo);
30
32
  useSafeLayoutEffect.useSafeLayoutEffect_1(() => {
31
33
  update === null || update === void 0 ? void 0 : update();
32
34
  }, [allOptions, menuOpen, update, options]);
@@ -41,25 +43,28 @@ function InternalChipDismissibleInput(props) {
41
43
  return React.cloneElement(activator, { onClick: handleShowInput });
42
44
  }
43
45
  const shouldShowMenu = menuOpen && (hasAvailableOptions || isLoadingMore);
46
+ const menuContent = (React.createElement("div", { ref: node => {
47
+ setFloatingRef(node);
48
+ scrollableRef.current = node;
49
+ }, role: "listbox", id: menuId, className: styles.menu, style: floatingStyles.float, "data-testid": "chip-menu" },
50
+ allOptions.map((option, i) => (React.createElement("button", { key: option.value, role: "option", type: "button", id: generateDescendantId(i), className: classnames(styles.menuListOption, {
51
+ [styles.activeOption]: activeIndex === i,
52
+ }), onClick: () => handleSelectOption(option), onMouseEnter: handleSetActiveOnMouseOver(i), onMouseDown: handleCancelBlur, onMouseUp: handleEnableBlur },
53
+ React.createElement("span", { "aria-hidden": true }, option.prefix),
54
+ React.createElement(Text.Text, null, option.label)))),
55
+ React.createElement("div", { ref: visibleChildRef }),
56
+ isLoadingMore && (React.createElement("div", { className: styles.loadingIndicator },
57
+ React.createElement(Spinner.Spinner, { size: "small", inline: true })))));
44
58
  return (React.createElement(React.Fragment, null,
45
59
  React.createElement("input", { ref: inputRef, className: styles.input, type: "text", role: "combobox", "aria-label": "Press up and down arrow to cycle through the options or type to narrow down the results", "aria-autocomplete": "list", "aria-owns": menuId, "aria-expanded": shouldShowMenu, "aria-activedescendant": generateDescendantId(activeIndex), value: searchValue, onChange: handleSearchChange, onKeyDown: handleKeyDown, onBlur: () => setTimeout(handleBlur, 200), onFocus: handleFocus, autoFocus: true }),
46
- shouldShowMenu && (React.createElement("div", Object.assign({ ref: setPositionedElementRef, className: styles.menu, style: popperStyles.popper }, attributes.popper),
47
- React.createElement("div", { ref: menuRef, role: "listbox", id: menuId, className: styles.menuList, "data-testid": "chip-menu" },
48
- allOptions.map((option, i) => (React.createElement("button", { key: option.value, role: "option", type: "button", id: generateDescendantId(i), className: classnames(styles.menuListOption, {
49
- [styles.activeOption]: activeIndex === i,
50
- }), onClick: () => handleSelectOption(option), onMouseEnter: handleSetActiveOnMouseOver(i), onMouseDown: handleCancelBlur, onMouseUp: handleEnableBlur },
51
- React.createElement("span", { "aria-hidden": true }, option.prefix),
52
- React.createElement(Text.Text, null, option.label)))),
53
- React.createElement("div", { ref: visibleChildRef }),
54
- isLoadingMore && (React.createElement("div", { className: styles.loadingIndicator },
55
- React.createElement(Spinner.Spinner, { size: "small", inline: true }))))))));
60
+ shouldShowMenu && React.createElement(floatingUi_react.FloatingPortal, null, menuContent)));
56
61
  }
57
62
 
58
63
  function InternalChipDismissible(props) {
59
- const { availableChipOptions, ref: wrapperRef, sortedVisibleChipOptions, handleChipAdd, handleChipClick, handleChipKeyDown, handleChipRemove, handleCustomAdd, handleWrapperKeyDown, } = useScrollToActive.useInternalChipDismissible(props);
64
+ const { availableChipOptions, ref: wrapperRef, wrapperElement, sortedVisibleChipOptions, handleChipAdd, handleChipClick, handleChipKeyDown, handleChipRemove, handleCustomAdd, handleWrapperKeyDown, } = useScrollToActive.useInternalChipDismissible(props);
60
65
  return (React.createElement("div", { ref: wrapperRef, className: styles.wrapper, "data-testid": "dismissible-chips", onKeyDown: handleWrapperKeyDown, role: "listbox" },
61
66
  sortedVisibleChipOptions.map(chip => (React.createElement(InternalChip, Object.assign({ key: chip.value }, chip, { onKeyDown: handleChipKeyDown(chip.value), onClick: handleChipClick(chip.value), ariaLabel: `${chip.label}. Press delete or backspace to remove ${chip.label}`, tabIndex: 0, suffix: React.createElement(Chip.InternalChipButton, { icon: "remove", invalid: chip.invalid, disabled: chip.disabled, label: chip.label, onClick: handleChipRemove(chip.value) }) })))),
62
- React.createElement(InternalChipDismissibleInput, { activator: props.activator, attachTo: wrapperRef, isLoadingMore: props.isLoadingMore, options: availableChipOptions, onOptionSelect: handleChipAdd, onCustomOptionSelect: handleCustomAdd, onSearch: props.onSearch, onLoadMore: props.onLoadMore, onlyShowMenuOnSearch: props.onlyShowMenuOnSearch, autoSelectOnClickOutside: props.autoSelectOnClickOutside })));
67
+ React.createElement(InternalChipDismissibleInput, { activator: props.activator, attachTo: wrapperElement, isLoadingMore: props.isLoadingMore, options: availableChipOptions, onOptionSelect: handleChipAdd, onCustomOptionSelect: handleCustomAdd, onSearch: props.onSearch, onLoadMore: props.onLoadMore, onlyShowMenuOnSearch: props.onlyShowMenuOnSearch, autoSelectOnClickOutside: props.autoSelectOnClickOutside })));
63
68
  }
64
69
 
65
70
  exports.InternalChip = InternalChip;
@@ -2,9 +2,9 @@ import React__default, { useEffect } from 'react';
2
2
  import { a as useInternalChipDismissibleInput, d as useScrollToActive, b as useInView, c as useRepositionMenu, u as useInternalChipDismissible } from './useScrollToActive-es.js';
3
3
  import './isObjectLike-es.js';
4
4
  import '@jobber/design';
5
- import 'react-popper';
6
5
  import classnames from 'classnames';
7
6
  import { u as useSafeLayoutEffect_1 } from './useSafeLayoutEffect-es.js';
7
+ import { F as FloatingPortal } from './floating-ui.react-es.js';
8
8
  import { T as Text } from './Text-es.js';
9
9
  import { B as Button } from './Button-es.js';
10
10
  import { S as Spinner } from './Spinner-es.js';
@@ -17,14 +17,16 @@ function InternalChip({ label, active = false, disabled = false, invalid = false
17
17
  suffix && React__default.createElement(ChipNamespace.Suffix, null, suffix)));
18
18
  }
19
19
 
20
- var styles = {"wrapper":"XRnU90M2-fs-","input":"Dq-yFHd1zK0-","menu":"F7CpurjKzBI-","menuList":"J8USVG1tjPs-","menuListOption":"_9SAK31TqNDY-","loadingIndicator":"s5vFJVv0t0Q-","activeOption":"_8d0w-JzgzS4-","spinning":"hDJGLX6kE-U-"};
20
+ var styles = {"wrapper":"XRnU90M2-fs-","input":"Dq-yFHd1zK0-","menu":"F7CpurjKzBI-","menuListOption":"_9SAK31TqNDY-","loadingIndicator":"s5vFJVv0t0Q-","activeOption":"_8d0w-JzgzS4-","spinning":"hDJGLX6kE-U-"};
21
21
 
22
+ // Adding Portal moves it over the limit, but doesn't impact the readabiltiy
23
+ // eslint-disable-next-line max-statements
22
24
  function InternalChipDismissibleInput(props) {
23
25
  const { activator = React__default.createElement(Button, { icon: "add", type: "secondary", ariaLabel: "Add" }), attachTo, isLoadingMore = false, onLoadMore, options, } = props;
24
26
  const { activeIndex, allOptions, hasAvailableOptions, inputRef, menuId, menuOpen, searchValue, showInput, generateDescendantId, handleBlur, handleFocus, handleSearchChange, handleCancelBlur, handleEnableBlur, handleSetActiveOnMouseOver, handleKeyDown, handleSelectOption, handleShowInput, handleDebouncedSearch, } = useInternalChipDismissibleInput(props);
25
- const menuRef = useScrollToActive(activeIndex);
27
+ const scrollableRef = useScrollToActive(activeIndex);
26
28
  const { ref: visibleChildRef, isInView } = useInView();
27
- const { styles: popperStyles, attributes, update, setPositionedElementRef, } = useRepositionMenu(attachTo);
29
+ const { styles: floatingStyles, update, setFloatingRef, } = useRepositionMenu(attachTo);
28
30
  useSafeLayoutEffect_1(() => {
29
31
  update === null || update === void 0 ? void 0 : update();
30
32
  }, [allOptions, menuOpen, update, options]);
@@ -39,25 +41,28 @@ function InternalChipDismissibleInput(props) {
39
41
  return React__default.cloneElement(activator, { onClick: handleShowInput });
40
42
  }
41
43
  const shouldShowMenu = menuOpen && (hasAvailableOptions || isLoadingMore);
44
+ const menuContent = (React__default.createElement("div", { ref: node => {
45
+ setFloatingRef(node);
46
+ scrollableRef.current = node;
47
+ }, role: "listbox", id: menuId, className: styles.menu, style: floatingStyles.float, "data-testid": "chip-menu" },
48
+ allOptions.map((option, i) => (React__default.createElement("button", { key: option.value, role: "option", type: "button", id: generateDescendantId(i), className: classnames(styles.menuListOption, {
49
+ [styles.activeOption]: activeIndex === i,
50
+ }), onClick: () => handleSelectOption(option), onMouseEnter: handleSetActiveOnMouseOver(i), onMouseDown: handleCancelBlur, onMouseUp: handleEnableBlur },
51
+ React__default.createElement("span", { "aria-hidden": true }, option.prefix),
52
+ React__default.createElement(Text, null, option.label)))),
53
+ React__default.createElement("div", { ref: visibleChildRef }),
54
+ isLoadingMore && (React__default.createElement("div", { className: styles.loadingIndicator },
55
+ React__default.createElement(Spinner, { size: "small", inline: true })))));
42
56
  return (React__default.createElement(React__default.Fragment, null,
43
57
  React__default.createElement("input", { ref: inputRef, className: styles.input, type: "text", role: "combobox", "aria-label": "Press up and down arrow to cycle through the options or type to narrow down the results", "aria-autocomplete": "list", "aria-owns": menuId, "aria-expanded": shouldShowMenu, "aria-activedescendant": generateDescendantId(activeIndex), value: searchValue, onChange: handleSearchChange, onKeyDown: handleKeyDown, onBlur: () => setTimeout(handleBlur, 200), onFocus: handleFocus, autoFocus: true }),
44
- shouldShowMenu && (React__default.createElement("div", Object.assign({ ref: setPositionedElementRef, className: styles.menu, style: popperStyles.popper }, attributes.popper),
45
- React__default.createElement("div", { ref: menuRef, role: "listbox", id: menuId, className: styles.menuList, "data-testid": "chip-menu" },
46
- allOptions.map((option, i) => (React__default.createElement("button", { key: option.value, role: "option", type: "button", id: generateDescendantId(i), className: classnames(styles.menuListOption, {
47
- [styles.activeOption]: activeIndex === i,
48
- }), onClick: () => handleSelectOption(option), onMouseEnter: handleSetActiveOnMouseOver(i), onMouseDown: handleCancelBlur, onMouseUp: handleEnableBlur },
49
- React__default.createElement("span", { "aria-hidden": true }, option.prefix),
50
- React__default.createElement(Text, null, option.label)))),
51
- React__default.createElement("div", { ref: visibleChildRef }),
52
- isLoadingMore && (React__default.createElement("div", { className: styles.loadingIndicator },
53
- React__default.createElement(Spinner, { size: "small", inline: true }))))))));
58
+ shouldShowMenu && React__default.createElement(FloatingPortal, null, menuContent)));
54
59
  }
55
60
 
56
61
  function InternalChipDismissible(props) {
57
- const { availableChipOptions, ref: wrapperRef, sortedVisibleChipOptions, handleChipAdd, handleChipClick, handleChipKeyDown, handleChipRemove, handleCustomAdd, handleWrapperKeyDown, } = useInternalChipDismissible(props);
62
+ const { availableChipOptions, ref: wrapperRef, wrapperElement, sortedVisibleChipOptions, handleChipAdd, handleChipClick, handleChipKeyDown, handleChipRemove, handleCustomAdd, handleWrapperKeyDown, } = useInternalChipDismissible(props);
58
63
  return (React__default.createElement("div", { ref: wrapperRef, className: styles.wrapper, "data-testid": "dismissible-chips", onKeyDown: handleWrapperKeyDown, role: "listbox" },
59
64
  sortedVisibleChipOptions.map(chip => (React__default.createElement(InternalChip, Object.assign({ key: chip.value }, chip, { onKeyDown: handleChipKeyDown(chip.value), onClick: handleChipClick(chip.value), ariaLabel: `${chip.label}. Press delete or backspace to remove ${chip.label}`, tabIndex: 0, suffix: React__default.createElement(InternalChipButton, { icon: "remove", invalid: chip.invalid, disabled: chip.disabled, label: chip.label, onClick: handleChipRemove(chip.value) }) })))),
60
- React__default.createElement(InternalChipDismissibleInput, { activator: props.activator, attachTo: wrapperRef, isLoadingMore: props.isLoadingMore, options: availableChipOptions, onOptionSelect: handleChipAdd, onCustomOptionSelect: handleCustomAdd, onSearch: props.onSearch, onLoadMore: props.onLoadMore, onlyShowMenuOnSearch: props.onlyShowMenuOnSearch, autoSelectOnClickOutside: props.autoSelectOnClickOutside })));
65
+ React__default.createElement(InternalChipDismissibleInput, { activator: props.activator, attachTo: wrapperElement, isLoadingMore: props.isLoadingMore, options: availableChipOptions, onOptionSelect: handleChipAdd, onCustomOptionSelect: handleCustomAdd, onSearch: props.onSearch, onLoadMore: props.onLoadMore, onlyShowMenuOnSearch: props.onlyShowMenuOnSearch, autoSelectOnClickOutside: props.autoSelectOnClickOutside })));
61
66
  }
62
67
 
63
68
  export { InternalChipDismissible as I, InternalChip as a };
@@ -9,7 +9,7 @@ import { H as Heading } from '../Heading-es.js';
9
9
  import { B as Button } from '../Button-es.js';
10
10
  import { B as ButtonDismiss } from '../ButtonDismiss-es.js';
11
11
  import { n as noop } from '../noop-es.js';
12
- import { a as useFloatingNodeId, b as useFloating, k as useClick, e as useDismiss, m as useRole, f as useInteractions, u as useFloatingParentNodeId, F as FloatingTree, g as FloatingNode, h as FloatingPortal, n as FloatingOverlay, p as FloatingFocusManager } from '../floating-ui.react-es.js';
12
+ import { a as useFloatingNodeId, b as useFloating, k as useClick, e as useDismiss, m as useRole, f as useInteractions, u as useFloatingParentNodeId, g as FloatingTree, h as FloatingNode, F as FloatingPortal, n as FloatingOverlay, p as FloatingFocusManager } from '../floating-ui.react-es.js';
13
13
  import { b as identity } from '../identity-es.js';
14
14
  import { A as AtlantisPortalContent } from '../AtlantisPortalContent-es.js';
15
15
  import '../Typography-es.js';
@@ -6029,4 +6029,4 @@ function useRole(context, props) {
6029
6029
  } : {}, [enabled, reference, floating, item]);
6030
6030
  }
6031
6031
 
6032
- export { FloatingTree as F, useFloatingNodeId as a, useFloating as b, autoPlacement as c, autoUpdate as d, useDismiss as e, useInteractions as f, FloatingNode as g, FloatingPortal as h, flip as i, arrow as j, useClick as k, limitShift as l, useRole as m, FloatingOverlay as n, offset as o, FloatingFocusManager as p, size as q, shift as s, useFloatingParentNodeId as u };
6032
+ export { FloatingPortal as F, useFloatingNodeId as a, useFloating as b, autoPlacement as c, autoUpdate as d, useDismiss as e, useInteractions as f, FloatingTree as g, FloatingNode as h, flip as i, arrow as j, useClick as k, limitShift as l, useRole as m, FloatingOverlay as n, offset as o, FloatingFocusManager as p, size as q, shift as s, useFloatingParentNodeId as u };
package/dist/index.cjs CHANGED
@@ -128,7 +128,6 @@ require('./_getTag-cjs.js');
128
128
  require('./isSymbol-cjs.js');
129
129
  require('./_baseEach-cjs.js');
130
130
  require('./debounce-cjs.js');
131
- require('react-popper');
132
131
  require('./ComboboxContent-cjs.js');
133
132
  require('./ComboboxContentSearch-cjs.js');
134
133
  require('./ComboboxContentList-cjs.js');
@@ -178,6 +177,7 @@ require('./DataListAction-cjs.js');
178
177
  require('./DataListLayoutActions-cjs.js');
179
178
  require('./DataListStatusBar-cjs.js');
180
179
  require('./throttle-cjs.js');
180
+ require('react-popper');
181
181
  require('./omit-cjs.js');
182
182
  require('./useFormFieldFocus-cjs.js');
183
183
  require('filesize');
package/dist/index.mjs CHANGED
@@ -126,7 +126,6 @@ import './_getTag-es.js';
126
126
  import './isSymbol-es.js';
127
127
  import './_baseEach-es.js';
128
128
  import './debounce-es.js';
129
- import 'react-popper';
130
129
  import './ComboboxContent-es.js';
131
130
  import './ComboboxContentSearch-es.js';
132
131
  import './ComboboxContentList-es.js';
@@ -176,6 +175,7 @@ import './DataListAction-es.js';
176
175
  import './DataListLayoutActions-es.js';
177
176
  import './DataListStatusBar-es.js';
178
177
  import './throttle-es.js';
178
+ import 'react-popper';
179
179
  import './omit-es.js';
180
180
  import './useFormFieldFocus-es.js';
181
181
  import 'filesize';
package/dist/styles.css CHANGED
@@ -3548,12 +3548,9 @@ a._7BLGtYNuJOU-.zgRx3ehZ2z8-:hover {
3548
3548
  z-index: 6;
3549
3549
  z-index: var(--elevation-menu);
3550
3550
  width: 100%;
3551
- }
3552
-
3553
- .J8USVG1tjPs- {
3554
- max-height: 320px;
3555
3551
  box-shadow: 0px 1px 4px 0px rgba(0, 0, 0, 0.1), 0px 4px 12px 0px rgba(0, 0, 0, 0.05);
3556
3552
  box-shadow: var(--shadow-base);
3553
+ box-sizing: border-box;
3557
3554
  padding: 8px 0;
3558
3555
  padding: var(--space-small) 0;
3559
3556
  border-radius: 8px;
@@ -11,7 +11,7 @@ var identity$1 = require('./identity-cjs.js');
11
11
  var _isIterateeCall = require('./_isIterateeCall-cjs.js');
12
12
  var debounce = require('./debounce-cjs.js');
13
13
  var Icon = require('./Icon-cjs.js');
14
- var reactPopper = require('react-popper');
14
+ var floatingUi_react = require('./floating-ui.react-cjs.js');
15
15
 
16
16
  var baseEach = _baseEach._baseEach,
17
17
  isArrayLike = isTypedArray.isArrayLike_1;
@@ -310,7 +310,7 @@ function findFocusableElement(element, direction) {
310
310
  return findFocusableElement(nextElement, direction);
311
311
  }
312
312
  function useInternalChipDismissible({ children, selected, onChange, onClick, onCustomAdd, }) {
313
- const ref = React.useRef(null);
313
+ const [wrapperElement, setWrapperElement] = React.useState(null);
314
314
  const chipOptions = children.map(chip => chip.props);
315
315
  const visibleChipOptions = chipOptions.filter(chip => selected.includes(chip.value));
316
316
  const sortedVisibleChipOptions = sortBy$1(visibleChipOptions, chip => selected.indexOf(chip.value));
@@ -367,7 +367,7 @@ function useInternalChipDismissible({ children, selected, onChange, onClick, onC
367
367
  };
368
368
  },
369
369
  };
370
- return Object.assign(Object.assign({}, actions), { ref,
370
+ return Object.assign(Object.assign({}, actions), { ref: setWrapperElement, wrapperElement,
371
371
  sortedVisibleChipOptions,
372
372
  availableChipOptions });
373
373
  }
@@ -573,17 +573,37 @@ function useInView() {
573
573
  return { ref, isInView };
574
574
  }
575
575
 
576
+ const ROUNDED_BORDER_ARROW_EDGE_OFFSET = 8;
577
+ const PREFERRED_MAX_HEIGHT = 320;
576
578
  function useRepositionMenu(attachTo) {
577
- var _a;
578
- const [positionElement, setPositionedElementRef] = React.useState();
579
- const popper = reactPopper.usePopper(attachTo.current, positionElement, {
580
- modifiers: [
581
- { name: "offset", options: { offset: [0, 8] } },
582
- { name: "flip", options: { fallbackPlacements: ["top"] } },
579
+ const { refs, floatingStyles, update } = floatingUi_react.useFloating({
580
+ placement: "bottom",
581
+ middleware: [
582
+ floatingUi_react.offset(ROUNDED_BORDER_ARROW_EDGE_OFFSET),
583
+ floatingUi_react.flip({ fallbackPlacements: ["top"] }),
584
+ floatingUi_react.size({
585
+ apply({ availableHeight, elements }) {
586
+ const maxHeight = Math.min(PREFERRED_MAX_HEIGHT, availableHeight);
587
+ Object.assign(elements.floating.style, {
588
+ maxHeight: `${maxHeight}px`,
589
+ });
590
+ },
591
+ }),
583
592
  ],
593
+ elements: {
594
+ reference: attachTo,
595
+ },
596
+ whileElementsMounted: floatingUi_react.autoUpdate,
584
597
  });
585
- const targetWidth = (_a = attachTo.current) === null || _a === void 0 ? void 0 : _a.clientWidth;
586
- return Object.assign(Object.assign({}, popper), { setPositionedElementRef, targetWidth });
598
+ const targetWidth = attachTo === null || attachTo === void 0 ? void 0 : attachTo.clientWidth;
599
+ return {
600
+ setFloatingRef: refs.setFloating,
601
+ targetWidth,
602
+ styles: {
603
+ float: floatingStyles,
604
+ },
605
+ update,
606
+ };
587
607
  }
588
608
 
589
609
  function useScrollToActive(index) {
@@ -1,4 +1,4 @@
1
- import React__default, { useRef, useId, useState, useEffect } from 'react';
1
+ import React__default, { useState, useId, useEffect, useRef } from 'react';
2
2
  import { g as getDefaultExportFromCjs } from './_commonjsHelpers-es.js';
3
3
  import { _ as _baseFlatten } from './_baseFlatten-es.js';
4
4
  import { a as _arrayMap, b as _baseGet } from './_baseGet-es.js';
@@ -9,7 +9,7 @@ import { i as identity_1 } from './identity-es.js';
9
9
  import { _ as _baseRest, a as _isIterateeCall } from './_isIterateeCall-es.js';
10
10
  import { a as debounce } from './debounce-es.js';
11
11
  import { I as Icon } from './Icon-es.js';
12
- import { usePopper } from 'react-popper';
12
+ import { b as useFloating, o as offset, i as flip, q as size, d as autoUpdate } from './floating-ui.react-es.js';
13
13
 
14
14
  var baseEach = _baseEach,
15
15
  isArrayLike = isArrayLike_1;
@@ -308,7 +308,7 @@ function findFocusableElement(element, direction) {
308
308
  return findFocusableElement(nextElement, direction);
309
309
  }
310
310
  function useInternalChipDismissible({ children, selected, onChange, onClick, onCustomAdd, }) {
311
- const ref = useRef(null);
311
+ const [wrapperElement, setWrapperElement] = useState(null);
312
312
  const chipOptions = children.map(chip => chip.props);
313
313
  const visibleChipOptions = chipOptions.filter(chip => selected.includes(chip.value));
314
314
  const sortedVisibleChipOptions = sortBy$1(visibleChipOptions, chip => selected.indexOf(chip.value));
@@ -365,7 +365,7 @@ function useInternalChipDismissible({ children, selected, onChange, onClick, onC
365
365
  };
366
366
  },
367
367
  };
368
- return Object.assign(Object.assign({}, actions), { ref,
368
+ return Object.assign(Object.assign({}, actions), { ref: setWrapperElement, wrapperElement,
369
369
  sortedVisibleChipOptions,
370
370
  availableChipOptions });
371
371
  }
@@ -571,17 +571,37 @@ function useInView() {
571
571
  return { ref, isInView };
572
572
  }
573
573
 
574
+ const ROUNDED_BORDER_ARROW_EDGE_OFFSET = 8;
575
+ const PREFERRED_MAX_HEIGHT = 320;
574
576
  function useRepositionMenu(attachTo) {
575
- var _a;
576
- const [positionElement, setPositionedElementRef] = useState();
577
- const popper = usePopper(attachTo.current, positionElement, {
578
- modifiers: [
579
- { name: "offset", options: { offset: [0, 8] } },
580
- { name: "flip", options: { fallbackPlacements: ["top"] } },
577
+ const { refs, floatingStyles, update } = useFloating({
578
+ placement: "bottom",
579
+ middleware: [
580
+ offset(ROUNDED_BORDER_ARROW_EDGE_OFFSET),
581
+ flip({ fallbackPlacements: ["top"] }),
582
+ size({
583
+ apply({ availableHeight, elements }) {
584
+ const maxHeight = Math.min(PREFERRED_MAX_HEIGHT, availableHeight);
585
+ Object.assign(elements.floating.style, {
586
+ maxHeight: `${maxHeight}px`,
587
+ });
588
+ },
589
+ }),
581
590
  ],
591
+ elements: {
592
+ reference: attachTo,
593
+ },
594
+ whileElementsMounted: autoUpdate,
582
595
  });
583
- const targetWidth = (_a = attachTo.current) === null || _a === void 0 ? void 0 : _a.clientWidth;
584
- return Object.assign(Object.assign({}, popper), { setPositionedElementRef, targetWidth });
596
+ const targetWidth = attachTo === null || attachTo === void 0 ? void 0 : attachTo.clientWidth;
597
+ return {
598
+ setFloatingRef: refs.setFloating,
599
+ targetWidth,
600
+ styles: {
601
+ float: floatingStyles,
602
+ },
603
+ update,
604
+ };
585
605
  }
586
606
 
587
607
  function useScrollToActive(index) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jobber/components",
3
- "version": "6.75.2",
3
+ "version": "6.76.0",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "main": "dist/index.cjs",
@@ -542,5 +542,5 @@
542
542
  "> 1%",
543
543
  "IE 10"
544
544
  ],
545
- "gitHead": "bb84b11ab06015d9d2b114dd459478572be3baa2"
545
+ "gitHead": "662d5d1d30f55231de5d9a0754d21f1829cd594e"
546
546
  }