carbon-react 123.9.1 → 123.10.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.
Files changed (37) hide show
  1. package/esm/components/alert/alert.component.d.ts +1 -1
  2. package/esm/components/alert/alert.component.js +3 -1
  3. package/esm/components/confirm/confirm.component.d.ts +1 -1
  4. package/esm/components/confirm/confirm.component.js +3 -1
  5. package/esm/components/dialog/dialog.component.js +5 -2
  6. package/esm/components/dialog-full-screen/dialog-full-screen.component.d.ts +1 -1
  7. package/esm/components/dialog-full-screen/dialog-full-screen.component.js +3 -1
  8. package/esm/components/modal/__internal__/modal-manager.d.ts +2 -1
  9. package/esm/components/modal/__internal__/modal-manager.js +8 -5
  10. package/esm/components/modal/modal.component.d.ts +3 -1
  11. package/esm/components/modal/modal.component.js +4 -1
  12. package/esm/components/modal/modal.style.d.ts +3 -1
  13. package/esm/components/modal/modal.style.js +3 -2
  14. package/esm/components/sidebar/sidebar.component.d.ts +2 -1
  15. package/esm/components/sidebar/sidebar.component.js +4 -1
  16. package/esm/components/toast/toast.component.js +2 -1
  17. package/esm/hooks/__internal__/useModalManager/useModalManager.d.ts +2 -1
  18. package/esm/hooks/__internal__/useModalManager/useModalManager.js +4 -3
  19. package/lib/components/alert/alert.component.d.ts +1 -1
  20. package/lib/components/alert/alert.component.js +3 -1
  21. package/lib/components/confirm/confirm.component.d.ts +1 -1
  22. package/lib/components/confirm/confirm.component.js +3 -1
  23. package/lib/components/dialog/dialog.component.js +5 -2
  24. package/lib/components/dialog-full-screen/dialog-full-screen.component.d.ts +1 -1
  25. package/lib/components/dialog-full-screen/dialog-full-screen.component.js +3 -1
  26. package/lib/components/modal/__internal__/modal-manager.d.ts +2 -1
  27. package/lib/components/modal/__internal__/modal-manager.js +8 -5
  28. package/lib/components/modal/modal.component.d.ts +3 -1
  29. package/lib/components/modal/modal.component.js +4 -1
  30. package/lib/components/modal/modal.style.d.ts +3 -1
  31. package/lib/components/modal/modal.style.js +3 -2
  32. package/lib/components/sidebar/sidebar.component.d.ts +2 -1
  33. package/lib/components/sidebar/sidebar.component.js +4 -1
  34. package/lib/components/toast/toast.component.js +2 -1
  35. package/lib/hooks/__internal__/useModalManager/useModalManager.d.ts +2 -1
  36. package/lib/hooks/__internal__/useModalManager/useModalManager.js +4 -3
  37. package/package.json +1 -1
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { DialogProps } from "../dialog";
3
- export declare const Alert: ({ children, size, ...rest }: DialogProps) => React.JSX.Element;
3
+ export declare const Alert: ({ children, size, topModalOverride, ...rest }: DialogProps) => React.JSX.Element;
4
4
  export default Alert;
@@ -5,10 +5,12 @@ import Dialog from "../dialog";
5
5
  export const Alert = ({
6
6
  children,
7
7
  size = "extra-small",
8
+ topModalOverride,
8
9
  ...rest
9
10
  }) => /*#__PURE__*/React.createElement(Dialog, _extends({
10
11
  "data-component": "alert",
11
12
  role: "alertdialog",
12
- size: size
13
+ size: size,
14
+ topModalOverride: topModalOverride
13
15
  }, rest), children);
14
16
  export default Alert;
@@ -38,5 +38,5 @@ export interface ConfirmProps extends Omit<DialogProps, "className" | "disableFo
38
38
  /** A custom event handler when a confirmation takes place */
39
39
  onConfirm: (ev: React.MouseEvent<HTMLButtonElement>) => void;
40
40
  }
41
- export declare const Confirm: ({ "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, open, children, cancelButtonDestructive, confirmButtonDestructive, cancelButtonType, confirmButtonType, cancelButtonIconType, cancelButtonIconPosition, confirmButtonIconType, confirmButtonIconPosition, cancelButtonDataProps, confirmButtonDataProps, cancelLabel, onCancel, disableCancel, onConfirm, isLoadingConfirm, disableConfirm, confirmLabel, iconType, subtitle, title, size, showCloseIcon, ...rest }: ConfirmProps) => React.JSX.Element;
41
+ export declare const Confirm: ({ "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, open, children, cancelButtonDestructive, confirmButtonDestructive, cancelButtonType, confirmButtonType, cancelButtonIconType, cancelButtonIconPosition, confirmButtonIconType, confirmButtonIconPosition, cancelButtonDataProps, confirmButtonDataProps, cancelLabel, onCancel, disableCancel, onConfirm, isLoadingConfirm, disableConfirm, confirmLabel, iconType, subtitle, title, size, showCloseIcon, topModalOverride, ...rest }: ConfirmProps) => React.JSX.Element;
42
42
  export default Confirm;
@@ -38,6 +38,7 @@ export const Confirm = ({
38
38
  title,
39
39
  size = "extra-small",
40
40
  showCloseIcon = false,
41
+ topModalOverride,
41
42
  ...rest
42
43
  }) => {
43
44
  const l = useLocale();
@@ -114,7 +115,8 @@ export const Confirm = ({
114
115
  "data-component": "confirm",
115
116
  role: "alertdialog",
116
117
  size: size,
117
- showCloseIcon: showCloseIcon
118
+ showCloseIcon: showCloseIcon,
119
+ topModalOverride: topModalOverride
118
120
  }, ariaProps, rest), children, /*#__PURE__*/React.createElement(StyledConfirmButtons, null, renderCancelButton(), renderConfirmButton()));
119
121
  };
120
122
  export default Confirm;
@@ -34,6 +34,7 @@ const Dialog = /*#__PURE__*/forwardRef(({
34
34
  role = "dialog",
35
35
  contentPadding = {},
36
36
  focusableContainers,
37
+ topModalOverride,
37
38
  ...rest
38
39
  }, ref) => {
39
40
  const locale = useLocale();
@@ -154,7 +155,8 @@ const Dialog = /*#__PURE__*/forwardRef(({
154
155
  onCancel: onCancel,
155
156
  disableEscKey: disableEscKey,
156
157
  disableClose: disableClose,
157
- className: className ? `${className} carbon-dialog` : "carbon-dialog"
158
+ className: className ? `${className} carbon-dialog` : "carbon-dialog",
159
+ topModalOverride: topModalOverride
158
160
  }, componentTags), /*#__PURE__*/React.createElement(FocusTrap, {
159
161
  autoFocus: !disableAutoFocus,
160
162
  focusFirstElement: focusFirstElement,
@@ -234,7 +236,8 @@ Dialog.propTypes = {
234
236
  "size": PropTypes.oneOf(["auto", "extra-large", "extra-small", "large", "medium-large", "medium-small", "medium", "small"]),
235
237
  "subtitle": PropTypes.string,
236
238
  "timeout": PropTypes.number,
237
- "title": PropTypes.node
239
+ "title": PropTypes.node,
240
+ "topModalOverride": PropTypes.bool
238
241
  };
239
242
  export { Dialog };
240
243
  export default Dialog;
@@ -52,5 +52,5 @@ export interface DialogFullScreenProps extends ModalProps {
52
52
  /** A custom close event handler */
53
53
  onCancel?: (ev: React.KeyboardEvent<HTMLElement> | React.MouseEvent<HTMLButtonElement>) => void;
54
54
  }
55
- export declare const DialogFullScreen: ({ "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, disableAutoFocus, focusFirstElement, bespokeFocusTrap, open, children, title, subtitle, pagesStyling, headerChildren, showCloseIcon, disableContentPadding, disableEscKey, onCancel, contentRef, help, role, focusableContainers, focusableSelectors, ...rest }: DialogFullScreenProps) => React.JSX.Element;
55
+ export declare const DialogFullScreen: ({ "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, disableAutoFocus, focusFirstElement, bespokeFocusTrap, open, children, title, subtitle, pagesStyling, headerChildren, showCloseIcon, disableContentPadding, disableEscKey, onCancel, contentRef, help, role, focusableContainers, focusableSelectors, topModalOverride, ...rest }: DialogFullScreenProps) => React.JSX.Element;
56
56
  export default DialogFullScreen;
@@ -35,6 +35,7 @@ export const DialogFullScreen = ({
35
35
  role = "dialog",
36
36
  focusableContainers,
37
37
  focusableSelectors,
38
+ topModalOverride,
38
39
  ...rest
39
40
  }) => {
40
41
  const locale = useLocale();
@@ -83,7 +84,8 @@ export const DialogFullScreen = ({
83
84
  return /*#__PURE__*/React.createElement(Modal, _extends({
84
85
  open: open,
85
86
  onCancel: onCancel,
86
- disableEscKey: disableEscKey
87
+ disableEscKey: disableEscKey,
88
+ topModalOverride: topModalOverride
87
89
  }, componentTags), /*#__PURE__*/React.createElement(FocusTrap, {
88
90
  autoFocus: !disableAutoFocus,
89
91
  focusFirstElement: focusFirstElement,
@@ -2,12 +2,13 @@ declare type SetTriggerRefocusFlag = (boolean: boolean) => void;
2
2
  export declare type ModalList = {
3
3
  modal: HTMLElement;
4
4
  setTriggerRefocusFlag?: SetTriggerRefocusFlag;
5
+ topModalOverride?: boolean;
5
6
  }[];
6
7
  declare class ModalManagerInstance {
7
8
  private modalList;
8
9
  constructor();
9
10
  private getTopModal;
10
- addModal: (modal: HTMLElement | null, setTriggerRefocusFlag?: SetTriggerRefocusFlag) => void;
11
+ addModal: (modal: HTMLElement | null, setTriggerRefocusFlag?: SetTriggerRefocusFlag, topModalOverride?: boolean) => void;
11
12
  isTopmost(modal: HTMLElement | null): boolean;
12
13
  removeModal(modal: HTMLElement | null, triggerRefocusOnClose?: boolean): void;
13
14
  clearList(): void;
@@ -8,20 +8,22 @@ let ModalManagerInstance = /*#__PURE__*/function () {
8
8
  function ModalManagerInstance() {
9
9
  _classCallCheck(this, ModalManagerInstance);
10
10
  _defineProperty(this, "modalList", void 0);
11
- _defineProperty(this, "addModal", (modal, setTriggerRefocusFlag) => {
11
+ _defineProperty(this, "addModal", (modal, setTriggerRefocusFlag, topModalOverride) => {
12
12
  if (!modal) {
13
13
  return;
14
14
  }
15
15
  const {
16
16
  modal: topModal,
17
- setTriggerRefocusFlag: setTrapFlag
17
+ setTriggerRefocusFlag: setTrapFlag,
18
+ topModalOverride: topOverridden
18
19
  } = this.getTopModal();
19
- if (topModal && setTrapFlag) {
20
+ if (!topOverridden && topModal && setTrapFlag) {
20
21
  setTrapFlag(false);
21
22
  }
22
23
  this.modalList.push({
23
24
  modal,
24
- setTriggerRefocusFlag
25
+ setTriggerRefocusFlag,
26
+ topModalOverride
25
27
  });
26
28
  this.callTopModalSetters();
27
29
  });
@@ -38,7 +40,8 @@ let ModalManagerInstance = /*#__PURE__*/function () {
38
40
  if (!this.modalList.length) {
39
41
  return {};
40
42
  }
41
- return this.modalList[this.modalList.length - 1];
43
+ const topModalOverride = this.modalList.slice().reverse().find(modal => modal.topModalOverride);
44
+ return topModalOverride || this.modalList[this.modalList.length - 1];
42
45
  }
43
46
  }, {
44
47
  key: "isTopmost",
@@ -25,6 +25,8 @@ export interface ModalProps extends TagProps {
25
25
  open: boolean;
26
26
  /** Transition time */
27
27
  timeout?: number;
28
+ /** Manually override the internal modal stacking order to set this as top */
29
+ topModalOverride?: boolean;
28
30
  }
29
- declare const Modal: ({ children, open, onCancel, disableEscKey, disableClose, enableBackgroundUI, timeout, ...rest }: ModalProps) => React.JSX.Element;
31
+ declare const Modal: ({ children, open, onCancel, disableEscKey, disableClose, enableBackgroundUI, timeout, topModalOverride, ...rest }: ModalProps) => React.JSX.Element;
30
32
  export default Modal;
@@ -16,6 +16,7 @@ const Modal = ({
16
16
  disableClose,
17
17
  enableBackgroundUI = false,
18
18
  timeout = 300,
19
+ topModalOverride,
19
20
  ...rest
20
21
  }) => {
21
22
  const ref = useRef(null);
@@ -54,7 +55,8 @@ const Modal = ({
54
55
  open,
55
56
  closeModal,
56
57
  modalRef: ref,
57
- setTriggerRefocusFlag
58
+ setTriggerRefocusFlag,
59
+ topModalOverride
58
60
  });
59
61
  let background;
60
62
  let content;
@@ -71,6 +73,7 @@ const Modal = ({
71
73
  "data-state": open ? "open" : "closed",
72
74
  transitionName: "modal",
73
75
  transitionTime: timeout,
76
+ topModalOverride: topModalOverride,
74
77
  ref: ref
75
78
  }, rest), /*#__PURE__*/React.createElement(TransitionGroup, null, background && /*#__PURE__*/React.createElement(CSSTransition, {
76
79
  nodeRef: backgroundNodeRef,
@@ -3,5 +3,7 @@ declare type TransitionProps = {
3
3
  transitionTime: number;
4
4
  };
5
5
  declare const StyledModalBackground: import("styled-components").StyledComponent<"div", any, TransitionProps, never>;
6
- declare const StyledModal: import("styled-components").StyledComponent<"div", any, TransitionProps, never>;
6
+ declare const StyledModal: import("styled-components").StyledComponent<"div", any, TransitionProps & {
7
+ topModalOverride?: boolean | undefined;
8
+ }, never>;
7
9
  export { StyledModal, StyledModalBackground };
@@ -37,8 +37,9 @@ const StyledModalBackground = styled.div`
37
37
  const StyledModal = styled.div`
38
38
  position: absolute;
39
39
  z-index: ${({
40
- theme
41
- }) => theme.zIndex.modal};
40
+ theme,
41
+ topModalOverride
42
+ }) => `${topModalOverride ? theme.zIndex.notification : theme.zIndex.modal}`};
42
43
 
43
44
  ${({
44
45
  transitionName,
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { PaddingProps, WidthProps } from "styled-system";
3
+ import { ModalProps } from "../modal";
3
4
  import { TagProps } from "../../__internal__/utils/helpers/tags/tags";
4
5
  declare type CustomRefObject<T> = {
5
6
  current?: T | null;
@@ -8,7 +9,7 @@ export interface SidebarContextProps {
8
9
  isInSidebar?: boolean;
9
10
  }
10
11
  export declare const SidebarContext: React.Context<SidebarContextProps>;
11
- export interface SidebarProps extends PaddingProps, TagProps, WidthProps {
12
+ export interface SidebarProps extends PaddingProps, TagProps, WidthProps, Pick<ModalProps, "topModalOverride"> {
12
13
  /** Prop to specify the aria-describedby property of the component */
13
14
  "aria-describedby"?: string;
14
15
  /**
@@ -37,6 +37,7 @@ const Sidebar = /*#__PURE__*/React.forwardRef(({
37
37
  focusableSelectors,
38
38
  width,
39
39
  headerPadding = {},
40
+ topModalOverride,
40
41
  ...rest
41
42
  }, ref) => {
42
43
  const locale = useLocale();
@@ -102,7 +103,8 @@ const Sidebar = /*#__PURE__*/React.forwardRef(({
102
103
  open: open,
103
104
  onCancel: onCancel,
104
105
  disableEscKey: disableEscKey,
105
- enableBackgroundUI: enableBackgroundUI
106
+ enableBackgroundUI: enableBackgroundUI,
107
+ topModalOverride: topModalOverride
106
108
  }, componentTags), enableBackgroundUI ? sidebar : /*#__PURE__*/React.createElement(FocusTrap, {
107
109
  wrapperRef: sidebarRef,
108
110
  isOpen: open,
@@ -460,6 +462,7 @@ Sidebar.propTypes = {
460
462
  }), PropTypes.string]),
461
463
  "role": PropTypes.string,
462
464
  "size": PropTypes.oneOf(["extra-large", "extra-small", "large", "medium-large", "medium-small", "medium", "small"]),
465
+ "topModalOverride": PropTypes.bool,
463
466
  "width": PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.oneOfType([PropTypes.oneOf([null]), PropTypes.number, PropTypes.shape({
464
467
  "__@iterator": PropTypes.func.isRequired,
465
468
  "anchor": PropTypes.func.isRequired,
@@ -53,7 +53,8 @@ const Toast = /*#__PURE__*/React.forwardRef(({
53
53
  useModalManager({
54
54
  open,
55
55
  closeModal: dismissToast,
56
- modalRef: refToPass
56
+ modalRef: refToPass,
57
+ topModalOverride: true
57
58
  });
58
59
  useEffect(() => {
59
60
  /* istanbul ignore next */
@@ -5,6 +5,7 @@ declare type UseModalManagerArgs = {
5
5
  modalRef: React.RefObject<HTMLElement>;
6
6
  setTriggerRefocusFlag?: (flag: boolean) => void;
7
7
  triggerRefocusOnClose?: boolean;
8
+ topModalOverride?: boolean;
8
9
  };
9
- declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, }: UseModalManagerArgs) => void;
10
+ declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, topModalOverride, }: UseModalManagerArgs) => void;
10
11
  export default useModalManager;
@@ -5,7 +5,8 @@ const useModalManager = ({
5
5
  closeModal,
6
6
  modalRef,
7
7
  setTriggerRefocusFlag,
8
- triggerRefocusOnClose = true
8
+ triggerRefocusOnClose = true,
9
+ topModalOverride = false
9
10
  }) => {
10
11
  const listenerAdded = useRef(false);
11
12
  const modalRegistered = useRef(false);
@@ -43,10 +44,10 @@ const useModalManager = ({
43
44
  const registerModal = useCallback(ref => {
44
45
  /* istanbul ignore else */
45
46
  if (!modalRegistered.current) {
46
- ModalManager.addModal(ref, setTriggerRefocusFlag);
47
+ ModalManager.addModal(ref, setTriggerRefocusFlag, topModalOverride);
47
48
  modalRegistered.current = true;
48
49
  }
49
- }, [setTriggerRefocusFlag]);
50
+ }, [setTriggerRefocusFlag, topModalOverride]);
50
51
  const unregisterModal = useCallback(ref => {
51
52
  if (modalRegistered.current) {
52
53
  ModalManager.removeModal(ref, triggerRefocusOnClose);
@@ -1,4 +1,4 @@
1
1
  import React from "react";
2
2
  import { DialogProps } from "../dialog";
3
- export declare const Alert: ({ children, size, ...rest }: DialogProps) => React.JSX.Element;
3
+ export declare const Alert: ({ children, size, topModalOverride, ...rest }: DialogProps) => React.JSX.Element;
4
4
  export default Alert;
@@ -12,11 +12,13 @@ function _extends() { _extends = Object.assign ? Object.assign.bind() : function
12
12
  const Alert = ({
13
13
  children,
14
14
  size = "extra-small",
15
+ topModalOverride,
15
16
  ...rest
16
17
  }) => /*#__PURE__*/_react.default.createElement(_dialog.default, _extends({
17
18
  "data-component": "alert",
18
19
  role: "alertdialog",
19
- size: size
20
+ size: size,
21
+ topModalOverride: topModalOverride
20
22
  }, rest), children);
21
23
  exports.Alert = Alert;
22
24
  var _default = Alert;
@@ -38,5 +38,5 @@ export interface ConfirmProps extends Omit<DialogProps, "className" | "disableFo
38
38
  /** A custom event handler when a confirmation takes place */
39
39
  onConfirm: (ev: React.MouseEvent<HTMLButtonElement>) => void;
40
40
  }
41
- export declare const Confirm: ({ "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, open, children, cancelButtonDestructive, confirmButtonDestructive, cancelButtonType, confirmButtonType, cancelButtonIconType, cancelButtonIconPosition, confirmButtonIconType, confirmButtonIconPosition, cancelButtonDataProps, confirmButtonDataProps, cancelLabel, onCancel, disableCancel, onConfirm, isLoadingConfirm, disableConfirm, confirmLabel, iconType, subtitle, title, size, showCloseIcon, ...rest }: ConfirmProps) => React.JSX.Element;
41
+ export declare const Confirm: ({ "aria-labelledby": ariaLabelledBy, "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, open, children, cancelButtonDestructive, confirmButtonDestructive, cancelButtonType, confirmButtonType, cancelButtonIconType, cancelButtonIconPosition, confirmButtonIconType, confirmButtonIconPosition, cancelButtonDataProps, confirmButtonDataProps, cancelLabel, onCancel, disableCancel, onConfirm, isLoadingConfirm, disableConfirm, confirmLabel, iconType, subtitle, title, size, showCloseIcon, topModalOverride, ...rest }: ConfirmProps) => React.JSX.Element;
42
42
  export default Confirm;
@@ -47,6 +47,7 @@ const Confirm = ({
47
47
  title,
48
48
  size = "extra-small",
49
49
  showCloseIcon = false,
50
+ topModalOverride,
50
51
  ...rest
51
52
  }) => {
52
53
  const l = (0, _useLocale.default)();
@@ -123,7 +124,8 @@ const Confirm = ({
123
124
  "data-component": "confirm",
124
125
  role: "alertdialog",
125
126
  size: size,
126
- showCloseIcon: showCloseIcon
127
+ showCloseIcon: showCloseIcon,
128
+ topModalOverride: topModalOverride
127
129
  }, ariaProps, rest), children, /*#__PURE__*/_react.default.createElement(_confirm.StyledConfirmButtons, null, renderCancelButton(), renderConfirmButton()));
128
130
  };
129
131
  exports.Confirm = Confirm;
@@ -43,6 +43,7 @@ const Dialog = /*#__PURE__*/(0, _react.forwardRef)(({
43
43
  role = "dialog",
44
44
  contentPadding = {},
45
45
  focusableContainers,
46
+ topModalOverride,
46
47
  ...rest
47
48
  }, ref) => {
48
49
  const locale = (0, _useLocale.default)();
@@ -163,7 +164,8 @@ const Dialog = /*#__PURE__*/(0, _react.forwardRef)(({
163
164
  onCancel: onCancel,
164
165
  disableEscKey: disableEscKey,
165
166
  disableClose: disableClose,
166
- className: className ? `${className} carbon-dialog` : "carbon-dialog"
167
+ className: className ? `${className} carbon-dialog` : "carbon-dialog",
168
+ topModalOverride: topModalOverride
167
169
  }, componentTags), /*#__PURE__*/_react.default.createElement(_focusTrap.default, {
168
170
  autoFocus: !disableAutoFocus,
169
171
  focusFirstElement: focusFirstElement,
@@ -244,7 +246,8 @@ Dialog.propTypes = {
244
246
  "size": _propTypes.default.oneOf(["auto", "extra-large", "extra-small", "large", "medium-large", "medium-small", "medium", "small"]),
245
247
  "subtitle": _propTypes.default.string,
246
248
  "timeout": _propTypes.default.number,
247
- "title": _propTypes.default.node
249
+ "title": _propTypes.default.node,
250
+ "topModalOverride": _propTypes.default.bool
248
251
  };
249
252
  var _default = Dialog;
250
253
  exports.default = _default;
@@ -52,5 +52,5 @@ export interface DialogFullScreenProps extends ModalProps {
52
52
  /** A custom close event handler */
53
53
  onCancel?: (ev: React.KeyboardEvent<HTMLElement> | React.MouseEvent<HTMLButtonElement>) => void;
54
54
  }
55
- export declare const DialogFullScreen: ({ "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, disableAutoFocus, focusFirstElement, bespokeFocusTrap, open, children, title, subtitle, pagesStyling, headerChildren, showCloseIcon, disableContentPadding, disableEscKey, onCancel, contentRef, help, role, focusableContainers, focusableSelectors, ...rest }: DialogFullScreenProps) => React.JSX.Element;
55
+ export declare const DialogFullScreen: ({ "aria-describedby": ariaDescribedBy, "aria-label": ariaLabel, "aria-labelledby": ariaLabelledBy, disableAutoFocus, focusFirstElement, bespokeFocusTrap, open, children, title, subtitle, pagesStyling, headerChildren, showCloseIcon, disableContentPadding, disableEscKey, onCancel, contentRef, help, role, focusableContainers, focusableSelectors, topModalOverride, ...rest }: DialogFullScreenProps) => React.JSX.Element;
56
56
  export default DialogFullScreen;
@@ -44,6 +44,7 @@ const DialogFullScreen = ({
44
44
  role = "dialog",
45
45
  focusableContainers,
46
46
  focusableSelectors,
47
+ topModalOverride,
47
48
  ...rest
48
49
  }) => {
49
50
  const locale = (0, _useLocale.default)();
@@ -92,7 +93,8 @@ const DialogFullScreen = ({
92
93
  return /*#__PURE__*/_react.default.createElement(_modal.default, _extends({
93
94
  open: open,
94
95
  onCancel: onCancel,
95
- disableEscKey: disableEscKey
96
+ disableEscKey: disableEscKey,
97
+ topModalOverride: topModalOverride
96
98
  }, componentTags), /*#__PURE__*/_react.default.createElement(_focusTrap.default, {
97
99
  autoFocus: !disableAutoFocus,
98
100
  focusFirstElement: focusFirstElement,
@@ -2,12 +2,13 @@ declare type SetTriggerRefocusFlag = (boolean: boolean) => void;
2
2
  export declare type ModalList = {
3
3
  modal: HTMLElement;
4
4
  setTriggerRefocusFlag?: SetTriggerRefocusFlag;
5
+ topModalOverride?: boolean;
5
6
  }[];
6
7
  declare class ModalManagerInstance {
7
8
  private modalList;
8
9
  constructor();
9
10
  private getTopModal;
10
- addModal: (modal: HTMLElement | null, setTriggerRefocusFlag?: SetTriggerRefocusFlag) => void;
11
+ addModal: (modal: HTMLElement | null, setTriggerRefocusFlag?: SetTriggerRefocusFlag, topModalOverride?: boolean) => void;
11
12
  isTopmost(modal: HTMLElement | null): boolean;
12
13
  removeModal(modal: HTMLElement | null, triggerRefocusOnClose?: boolean): void;
13
14
  clearList(): void;
@@ -14,20 +14,22 @@ let ModalManagerInstance = /*#__PURE__*/function () {
14
14
  function ModalManagerInstance() {
15
15
  _classCallCheck(this, ModalManagerInstance);
16
16
  _defineProperty(this, "modalList", void 0);
17
- _defineProperty(this, "addModal", (modal, setTriggerRefocusFlag) => {
17
+ _defineProperty(this, "addModal", (modal, setTriggerRefocusFlag, topModalOverride) => {
18
18
  if (!modal) {
19
19
  return;
20
20
  }
21
21
  const {
22
22
  modal: topModal,
23
- setTriggerRefocusFlag: setTrapFlag
23
+ setTriggerRefocusFlag: setTrapFlag,
24
+ topModalOverride: topOverridden
24
25
  } = this.getTopModal();
25
- if (topModal && setTrapFlag) {
26
+ if (!topOverridden && topModal && setTrapFlag) {
26
27
  setTrapFlag(false);
27
28
  }
28
29
  this.modalList.push({
29
30
  modal,
30
- setTriggerRefocusFlag
31
+ setTriggerRefocusFlag,
32
+ topModalOverride
31
33
  });
32
34
  this.callTopModalSetters();
33
35
  });
@@ -44,7 +46,8 @@ let ModalManagerInstance = /*#__PURE__*/function () {
44
46
  if (!this.modalList.length) {
45
47
  return {};
46
48
  }
47
- return this.modalList[this.modalList.length - 1];
49
+ const topModalOverride = this.modalList.slice().reverse().find(modal => modal.topModalOverride);
50
+ return topModalOverride || this.modalList[this.modalList.length - 1];
48
51
  }
49
52
  }, {
50
53
  key: "isTopmost",
@@ -25,6 +25,8 @@ export interface ModalProps extends TagProps {
25
25
  open: boolean;
26
26
  /** Transition time */
27
27
  timeout?: number;
28
+ /** Manually override the internal modal stacking order to set this as top */
29
+ topModalOverride?: boolean;
28
30
  }
29
- declare const Modal: ({ children, open, onCancel, disableEscKey, disableClose, enableBackgroundUI, timeout, ...rest }: ModalProps) => React.JSX.Element;
31
+ declare const Modal: ({ children, open, onCancel, disableEscKey, disableClose, enableBackgroundUI, timeout, topModalOverride, ...rest }: ModalProps) => React.JSX.Element;
30
32
  export default Modal;
@@ -26,6 +26,7 @@ const Modal = ({
26
26
  disableClose,
27
27
  enableBackgroundUI = false,
28
28
  timeout = 300,
29
+ topModalOverride,
29
30
  ...rest
30
31
  }) => {
31
32
  const ref = (0, _react.useRef)(null);
@@ -64,7 +65,8 @@ const Modal = ({
64
65
  open,
65
66
  closeModal,
66
67
  modalRef: ref,
67
- setTriggerRefocusFlag
68
+ setTriggerRefocusFlag,
69
+ topModalOverride
68
70
  });
69
71
  let background;
70
72
  let content;
@@ -81,6 +83,7 @@ const Modal = ({
81
83
  "data-state": open ? "open" : "closed",
82
84
  transitionName: "modal",
83
85
  transitionTime: timeout,
86
+ topModalOverride: topModalOverride,
84
87
  ref: ref
85
88
  }, rest), /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.TransitionGroup, null, background && /*#__PURE__*/_react.default.createElement(_reactTransitionGroup.CSSTransition, {
86
89
  nodeRef: backgroundNodeRef,
@@ -3,5 +3,7 @@ declare type TransitionProps = {
3
3
  transitionTime: number;
4
4
  };
5
5
  declare const StyledModalBackground: import("styled-components").StyledComponent<"div", any, TransitionProps, never>;
6
- declare const StyledModal: import("styled-components").StyledComponent<"div", any, TransitionProps, never>;
6
+ declare const StyledModal: import("styled-components").StyledComponent<"div", any, TransitionProps & {
7
+ topModalOverride?: boolean | undefined;
8
+ }, never>;
7
9
  export { StyledModal, StyledModalBackground };
@@ -47,8 +47,9 @@ exports.StyledModalBackground = StyledModalBackground;
47
47
  const StyledModal = _styledComponents.default.div`
48
48
  position: absolute;
49
49
  z-index: ${({
50
- theme
51
- }) => theme.zIndex.modal};
50
+ theme,
51
+ topModalOverride
52
+ }) => `${topModalOverride ? theme.zIndex.notification : theme.zIndex.modal}`};
52
53
 
53
54
  ${({
54
55
  transitionName,
@@ -1,5 +1,6 @@
1
1
  import React from "react";
2
2
  import { PaddingProps, WidthProps } from "styled-system";
3
+ import { ModalProps } from "../modal";
3
4
  import { TagProps } from "../../__internal__/utils/helpers/tags/tags";
4
5
  declare type CustomRefObject<T> = {
5
6
  current?: T | null;
@@ -8,7 +9,7 @@ export interface SidebarContextProps {
8
9
  isInSidebar?: boolean;
9
10
  }
10
11
  export declare const SidebarContext: React.Context<SidebarContextProps>;
11
- export interface SidebarProps extends PaddingProps, TagProps, WidthProps {
12
+ export interface SidebarProps extends PaddingProps, TagProps, WidthProps, Pick<ModalProps, "topModalOverride"> {
12
13
  /** Prop to specify the aria-describedby property of the component */
13
14
  "aria-describedby"?: string;
14
15
  /**
@@ -46,6 +46,7 @@ const Sidebar = /*#__PURE__*/_react.default.forwardRef(({
46
46
  focusableSelectors,
47
47
  width,
48
48
  headerPadding = {},
49
+ topModalOverride,
49
50
  ...rest
50
51
  }, ref) => {
51
52
  const locale = (0, _useLocale.default)();
@@ -111,7 +112,8 @@ const Sidebar = /*#__PURE__*/_react.default.forwardRef(({
111
112
  open: open,
112
113
  onCancel: onCancel,
113
114
  disableEscKey: disableEscKey,
114
- enableBackgroundUI: enableBackgroundUI
115
+ enableBackgroundUI: enableBackgroundUI,
116
+ topModalOverride: topModalOverride
115
117
  }, componentTags), enableBackgroundUI ? sidebar : /*#__PURE__*/_react.default.createElement(_focusTrap.default, {
116
118
  wrapperRef: sidebarRef,
117
119
  isOpen: open,
@@ -470,6 +472,7 @@ Sidebar.propTypes = {
470
472
  }), _propTypes.default.string]),
471
473
  "role": _propTypes.default.string,
472
474
  "size": _propTypes.default.oneOf(["extra-large", "extra-small", "large", "medium-large", "medium-small", "medium", "small"]),
475
+ "topModalOverride": _propTypes.default.bool,
473
476
  "width": _propTypes.default.oneOfType([_propTypes.default.arrayOf(_propTypes.default.oneOfType([_propTypes.default.oneOf([null]), _propTypes.default.number, _propTypes.default.shape({
474
477
  "__@iterator": _propTypes.default.func.isRequired,
475
478
  "anchor": _propTypes.default.func.isRequired,
@@ -62,7 +62,8 @@ const Toast = /*#__PURE__*/_react.default.forwardRef(({
62
62
  (0, _useModalManager.default)({
63
63
  open,
64
64
  closeModal: dismissToast,
65
- modalRef: refToPass
65
+ modalRef: refToPass,
66
+ topModalOverride: true
66
67
  });
67
68
  (0, _react.useEffect)(() => {
68
69
  /* istanbul ignore next */
@@ -5,6 +5,7 @@ declare type UseModalManagerArgs = {
5
5
  modalRef: React.RefObject<HTMLElement>;
6
6
  setTriggerRefocusFlag?: (flag: boolean) => void;
7
7
  triggerRefocusOnClose?: boolean;
8
+ topModalOverride?: boolean;
8
9
  };
9
- declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, }: UseModalManagerArgs) => void;
10
+ declare const useModalManager: ({ open, closeModal, modalRef, setTriggerRefocusFlag, triggerRefocusOnClose, topModalOverride, }: UseModalManagerArgs) => void;
10
11
  export default useModalManager;
@@ -12,7 +12,8 @@ const useModalManager = ({
12
12
  closeModal,
13
13
  modalRef,
14
14
  setTriggerRefocusFlag,
15
- triggerRefocusOnClose = true
15
+ triggerRefocusOnClose = true,
16
+ topModalOverride = false
16
17
  }) => {
17
18
  const listenerAdded = (0, _react.useRef)(false);
18
19
  const modalRegistered = (0, _react.useRef)(false);
@@ -50,10 +51,10 @@ const useModalManager = ({
50
51
  const registerModal = (0, _react.useCallback)(ref => {
51
52
  /* istanbul ignore else */
52
53
  if (!modalRegistered.current) {
53
- _modalManager.default.addModal(ref, setTriggerRefocusFlag);
54
+ _modalManager.default.addModal(ref, setTriggerRefocusFlag, topModalOverride);
54
55
  modalRegistered.current = true;
55
56
  }
56
- }, [setTriggerRefocusFlag]);
57
+ }, [setTriggerRefocusFlag, topModalOverride]);
57
58
  const unregisterModal = (0, _react.useCallback)(ref => {
58
59
  if (modalRegistered.current) {
59
60
  _modalManager.default.removeModal(ref, triggerRefocusOnClose);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "carbon-react",
3
- "version": "123.9.1",
3
+ "version": "123.10.0",
4
4
  "description": "A library of reusable React components for easily building user interfaces.",
5
5
  "files": [
6
6
  "lib",