@jobber/components 6.58.5 → 6.59.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,38 +3,48 @@
3
3
  var Autocomplete = require('../Autocomplete-cjs.js');
4
4
  require('../tslib.es6-cjs.js');
5
5
  require('react');
6
- require('classnames');
7
- require('../useIsMounted-cjs.js');
8
- require('../useSafeLayoutEffect-cjs.js');
6
+ require('../Modal/index.cjs');
9
7
  require('react-dom');
10
- require('react-popper');
8
+ require('classnames');
9
+ require('framer-motion');
10
+ require('../useRefocusOnActivator-cjs.js');
11
+ require('../useOnKeyDown-cjs.js');
12
+ require('../useFocusTrap-cjs.js');
11
13
  require('../Heading-cjs.js');
12
14
  require('../Typography-cjs.js');
13
- require('../Text-cjs.js');
15
+ require('../Button-cjs.js');
16
+ require('react-router-dom');
14
17
  require('../Icon-cjs.js');
15
18
  require('@jobber/design');
16
- require('../useOnKeyDown-cjs.js');
19
+ require('../ButtonDismiss-cjs.js');
20
+ require('../noop-cjs.js');
21
+ require('../_commonjsHelpers-cjs.js');
22
+ require('../floating-ui.react-cjs.js');
23
+ require('../AtlantisPortalContent-cjs.js');
24
+ require('../AtlantisThemeContext-cjs.js');
25
+ require('../identity-cjs.js');
26
+ require('../isTypedArray-cjs.js');
27
+ require('../isObjectLike-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');
17
37
  require('../InputText/index.cjs');
18
38
  require('../FormField-cjs.js');
19
- require('framer-motion');
20
- require('../Button-cjs.js');
21
- require('react-router-dom');
22
39
  require('../useFormFieldFocus-cjs.js');
23
40
  require('../InputValidation-cjs.js');
24
41
  require('../Spinner-cjs.js');
25
42
  require('react-hook-form');
26
43
  require('../omit-cjs.js');
27
- require('../_commonjsHelpers-cjs.js');
28
44
  require('../_baseGet-cjs.js');
29
- require('../isTypedArray-cjs.js');
30
- require('../isObjectLike-cjs.js');
31
- require('../identity-cjs.js');
32
45
  require('../_getTag-cjs.js');
33
46
  require('../isSymbol-cjs.js');
34
- require('../keysIn-cjs.js');
35
- require('../_baseAssignValue-cjs.js');
36
47
  require('../_baseFlatten-cjs.js');
37
- require('../_setToString-cjs.js');
38
48
  require('../useDebounce-cjs.js');
39
49
  require('../debounce-cjs.js');
40
50
 
@@ -1,37 +1,47 @@
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 'classnames';
5
- import '../useIsMounted-es.js';
6
- import '../useSafeLayoutEffect-es.js';
4
+ import '../Modal/index.mjs';
7
5
  import 'react-dom';
8
- import 'react-popper';
6
+ import 'classnames';
7
+ import 'framer-motion';
8
+ import '../useRefocusOnActivator-es.js';
9
+ import '../useOnKeyDown-es.js';
10
+ import '../useFocusTrap-es.js';
9
11
  import '../Heading-es.js';
10
12
  import '../Typography-es.js';
11
- import '../Text-es.js';
13
+ import '../Button-es.js';
14
+ import 'react-router-dom';
12
15
  import '../Icon-es.js';
13
16
  import '@jobber/design';
14
- import '../useOnKeyDown-es.js';
17
+ import '../ButtonDismiss-es.js';
18
+ import '../noop-es.js';
19
+ import '../_commonjsHelpers-es.js';
20
+ import '../floating-ui.react-es.js';
21
+ import '../AtlantisPortalContent-es.js';
22
+ import '../AtlantisThemeContext-es.js';
23
+ import '../identity-es.js';
24
+ import '../isTypedArray-es.js';
25
+ import '../isObjectLike-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';
15
35
  import '../InputText/index.mjs';
16
36
  import '../FormField-es.js';
17
- import 'framer-motion';
18
- import '../Button-es.js';
19
- import 'react-router-dom';
20
37
  import '../useFormFieldFocus-es.js';
21
38
  import '../InputValidation-es.js';
22
39
  import '../Spinner-es.js';
23
40
  import 'react-hook-form';
24
41
  import '../omit-es.js';
25
- import '../_commonjsHelpers-es.js';
26
42
  import '../_baseGet-es.js';
27
- import '../isTypedArray-es.js';
28
- import '../isObjectLike-es.js';
29
- import '../identity-es.js';
30
43
  import '../_getTag-es.js';
31
44
  import '../isSymbol-es.js';
32
- import '../keysIn-es.js';
33
- import '../_baseAssignValue-es.js';
34
45
  import '../_baseFlatten-es.js';
35
- import '../_setToString-es.js';
36
46
  import '../useDebounce-es.js';
37
47
  import '../debounce-es.js';
@@ -2,6 +2,7 @@
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');
5
6
  var classnames = require('classnames');
6
7
  var useIsMounted = require('./useIsMounted-cjs.js');
7
8
  var ReactDOM = require('react-dom');
@@ -210,6 +211,24 @@ function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visibl
210
211
  }
211
212
 
212
213
  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;
213
232
  if (customRenderMenu) {
214
233
  return (React.createElement(CustomMenu, { attachTo: attachTo, inputFocused: inputFocused, inputRef: inputRef, customRenderMenu: customRenderMenu, options: options, onOptionSelect: onOptionSelect, selectedOption: selectedOption }));
215
234
  }
@@ -1,5 +1,6 @@
1
1
  import { _ as __rest, a as __awaiter } from './tslib.es6-es.js';
2
2
  import React__default, { useState, useCallback, useEffect, forwardRef, useMemo, useRef } from 'react';
3
+ import { useModalContext } from './Modal/index.mjs';
3
4
  import classnames from 'classnames';
4
5
  import { u as useIsMounted_2 } from './useIsMounted-es.js';
5
6
  import { createPortal } from 'react-dom';
@@ -208,6 +209,24 @@ function DefaultMenu({ options, selectedOption, onOptionSelect, attachTo, visibl
208
209
  }
209
210
 
210
211
  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;
211
230
  if (customRenderMenu) {
212
231
  return (React__default.createElement(CustomMenu, { attachTo: attachTo, inputFocused: inputFocused, inputRef: inputRef, customRenderMenu: customRenderMenu, options: options, onOptionSelect: onOptionSelect, selectedOption: selectedOption }));
213
232
  }
@@ -1,5 +1,5 @@
1
1
  import React, { ReactElement } from "react";
2
- import { IconNames } from "@jobber/design";
2
+ import { IconColorNames, IconNames } from "@jobber/design";
3
3
  export interface MenuProps {
4
4
  /**
5
5
  * Custom menu activator. If this is not provided a default [… More] will be used.
@@ -34,6 +34,10 @@ export interface ActionProps {
34
34
  * Visual cue for the action label
35
35
  */
36
36
  readonly icon?: IconNames;
37
+ /**
38
+ * Color for the icon. Defaults to "icon".
39
+ */
40
+ readonly iconColor?: IconColorNames;
37
41
  /**
38
42
  * Visual style for the action button
39
43
  */
package/dist/Menu-cjs.js CHANGED
@@ -149,14 +149,14 @@ function SectionHeader({ text }) {
149
149
  return (React.createElement("div", { className: styles.sectionHeader, "aria-hidden": true },
150
150
  React.createElement(Typography.Typography, { element: "h6", size: "base", textColor: "textSecondary", fontWeight: "regular", textCase: "none" }, text)));
151
151
  }
152
- function Action({ label, sectionLabel, icon, destructive, onClick, }) {
152
+ function Action({ label, sectionLabel, icon, iconColor, destructive, onClick, }) {
153
153
  const actionButtonRef = React.useRef();
154
154
  const buttonClasses = classnames(styles.action, {
155
155
  [styles.destructive]: destructive,
156
156
  });
157
157
  return (React.createElement("button", { role: "menuitem", type: "button", className: buttonClasses, key: label, onClick: onClick, ref: actionButtonRef },
158
158
  icon && (React.createElement("div", null,
159
- React.createElement(Icon.Icon, { color: destructive ? "destructive" : undefined, name: icon }))),
159
+ React.createElement(Icon.Icon, { color: destructive ? "destructive" : iconColor, name: icon }))),
160
160
  React.createElement(Typography.Typography, { element: "span", fontWeight: "semiBold", textColor: "text" },
161
161
  sectionLabel && (React.createElement("span", { className: styles.screenReaderOnly }, sectionLabel)),
162
162
  label)));
package/dist/Menu-es.js CHANGED
@@ -147,14 +147,14 @@ function SectionHeader({ text }) {
147
147
  return (React__default.createElement("div", { className: styles.sectionHeader, "aria-hidden": true },
148
148
  React__default.createElement(Typography, { element: "h6", size: "base", textColor: "textSecondary", fontWeight: "regular", textCase: "none" }, text)));
149
149
  }
150
- function Action({ label, sectionLabel, icon, destructive, onClick, }) {
150
+ function Action({ label, sectionLabel, icon, iconColor, destructive, onClick, }) {
151
151
  const actionButtonRef = useRef();
152
152
  const buttonClasses = classnames(styles.action, {
153
153
  [styles.destructive]: destructive,
154
154
  });
155
155
  return (React__default.createElement("button", { role: "menuitem", type: "button", className: buttonClasses, key: label, onClick: onClick, ref: actionButtonRef },
156
156
  icon && (React__default.createElement("div", null,
157
- React__default.createElement(Icon, { color: destructive ? "destructive" : undefined, name: icon }))),
157
+ React__default.createElement(Icon, { color: destructive ? "destructive" : iconColor, name: icon }))),
158
158
  React__default.createElement(Typography, { element: "span", fontWeight: "semiBold", textColor: "text" },
159
159
  sectionLabel && (React__default.createElement("span", { className: styles.screenReaderOnly }, sectionLabel)),
160
160
  label)));
@@ -15,9 +15,9 @@ export declare function useModal({ open, activatorRef: refProp, onRequestClose,
15
15
  y: number;
16
16
  placement: import("@floating-ui/utils").Placement;
17
17
  strategy: import("@floating-ui/utils").Strategy;
18
- update: () => void;
19
18
  middlewareData: import("@floating-ui/core").MiddlewareData;
20
19
  isPositioned: boolean;
20
+ update: () => void;
21
21
  floatingStyles: React.CSSProperties;
22
22
  open: boolean;
23
23
  onOpenChange: (open: boolean, event?: Event, reason?: import("@floating-ui/react").OpenChangeReason) => void;
@@ -3,7 +3,7 @@ interface ToolTipPositionOptions {
3
3
  readonly preferredPlacement?: Placement;
4
4
  }
5
5
  export declare function useTooltipPositioning({ preferredPlacement, }: ToolTipPositionOptions): {
6
- placement: "bottom" | "left" | "right" | "top" | "auto" | "auto-start" | "auto-end" | "top-start" | "top-end" | "bottom-start" | "bottom-end" | "right-start" | "right-end" | "left-start" | "left-end";
6
+ placement: "bottom" | "left" | "right" | "top" | "auto" | "bottom-end" | "bottom-start" | "left-end" | "left-start" | "right-end" | "right-start" | "top-end" | "top-start" | "auto-start" | "auto-end";
7
7
  shadowRef: import("react").RefObject<HTMLSpanElement>;
8
8
  setArrowRef: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null | undefined>>;
9
9
  setTooltipRef: import("react").Dispatch<import("react").SetStateAction<HTMLDivElement | null | undefined>>;