react-responsive-modal 5.0.2 → 5.0.3

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.
@@ -2,15 +2,18 @@ declare const _default: {
2
2
  /**
3
3
  * Return the modals array
4
4
  */
5
- modals: () => any[];
5
+ modals: () => {
6
+ element: HTMLDivElement;
7
+ blockScroll: boolean;
8
+ }[];
6
9
  /**
7
10
  * Register a new modal
8
11
  */
9
- add: (modal: HTMLDivElement) => void;
12
+ add: (newModal: HTMLDivElement, blockScroll: boolean) => void;
10
13
  /**
11
14
  * Remove a modal
12
15
  */
13
- remove: (modal: HTMLDivElement) => void;
16
+ remove: (oldModal: HTMLDivElement) => void;
14
17
  /**
15
18
  * Check if the modal is the first one on the screen
16
19
  */
@@ -71,17 +71,24 @@ var modalManager = {
71
71
  /**
72
72
  * Register a new modal
73
73
  */
74
- add: function add(modal) {
75
- if (_modals.indexOf(modal) === -1) {
76
- _modals.push(modal);
74
+ add: function add(newModal, blockScroll) {
75
+ if (_modals.findIndex(function (modal) {
76
+ return modal.element === newModal;
77
+ }) === -1) {
78
+ _modals.push({
79
+ element: newModal,
80
+ blockScroll: blockScroll
81
+ });
77
82
  }
78
83
  },
79
84
 
80
85
  /**
81
86
  * Remove a modal
82
87
  */
83
- remove: function remove(modal) {
84
- var index = _modals.indexOf(modal);
88
+ remove: function remove(oldModal) {
89
+ var index = _modals.findIndex(function (modal) {
90
+ return modal.element === oldModal;
91
+ });
85
92
 
86
93
  if (index !== -1) {
87
94
  _modals.splice(index, 1);
@@ -92,7 +99,9 @@ var modalManager = {
92
99
  * Check if the modal is the first one on the screen
93
100
  */
94
101
  isTopModal: function isTopModal(modal) {
95
- return !!_modals.length && _modals[_modals.length - 1] === modal;
102
+ var _modals2;
103
+
104
+ return !!_modals.length && ((_modals2 = _modals[_modals.length - 1]) === null || _modals2 === void 0 ? void 0 : _modals2.element) === modal;
96
105
  }
97
106
  };
98
107
 
@@ -102,7 +111,12 @@ var blockNoScroll = function blockNoScroll() {
102
111
  };
103
112
  var unblockNoScroll = function unblockNoScroll() {
104
113
  // Restore the scroll only if there is no modal on the screen
105
- if (modalManager.modals().length === 0) {
114
+ // We filter the modals that are not affecting the scroll
115
+ var modals = modalManager.modals().filter(function (modal) {
116
+ return modal.blockScroll;
117
+ });
118
+
119
+ if (modals.length === 0) {
106
120
  noScroll.off();
107
121
  }
108
122
  };
@@ -280,7 +294,7 @@ var Modal = function Modal(_ref) {
280
294
  setShowPortal = _useState[1];
281
295
 
282
296
  var handleOpen = function handleOpen() {
283
- modalManager.add(refContainer.current);
297
+ modalManager.add(refContainer.current, blockScroll);
284
298
 
285
299
  if (blockScroll) {
286
300
  blockNoScroll();
@@ -1 +1 @@
1
- {"version":3,"file":"react-responsive-modal.cjs.development.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: any[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (modal: HTMLDivElement) => {\n if (modals.indexOf(modal) === -1) {\n modals.push(modal);\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (modal: HTMLDivElement) => {\n const index = modals.indexOf(modal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1] === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n if (modalManager.modals().length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\ninterface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classes","classNames","styles","id","closeIcon","onClickCloseIcon","React","className","cx","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","add","modal","indexOf","push","remove","index","splice","isTopModal","length","isBrowser","window","blockNoScroll","noScroll","on","unblockNoScroll","modalManager","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","tabTrappingKey","event","key","contains","process","console","warn","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","current","document","addEventListener","findIndex","selector","activeElement","matches","removeEventListener","overlay","modalCenter","animationIn","animationOut","Modal","open","center","blockScroll","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","body","appendChild","handleKeydown","handleClose","removeChild","keyCode","handleClickOverlay","handleModalEvent","handleClickCloseIcon","handleAnimationEnd","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":"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"}
1
+ {"version":3,"file":"react-responsive-modal.cjs.development.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: { element: HTMLDivElement; blockScroll: boolean }[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (newModal: HTMLDivElement, blockScroll: boolean) => {\n if (modals.findIndex((modal) => modal.element === newModal) === -1) {\n modals.push({ element: newModal, blockScroll });\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (oldModal: HTMLDivElement) => {\n const index = modals.findIndex((modal) => modal.element === oldModal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1]?.element === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n // We filter the modals that are not affecting the scroll\n const modals = modalManager.modals().filter((modal) => modal.blockScroll);\n if (modals.length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\ninterface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!, blockScroll);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classes","classNames","styles","id","closeIcon","onClickCloseIcon","React","className","cx","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","add","newModal","blockScroll","findIndex","modal","element","push","remove","oldModal","index","splice","isTopModal","length","isBrowser","window","blockNoScroll","noScroll","on","unblockNoScroll","modalManager","filter","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","tabTrappingKey","event","key","contains","process","console","warn","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","current","document","addEventListener","selector","activeElement","matches","removeEventListener","overlay","modalCenter","animationIn","animationOut","Modal","open","center","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","body","appendChild","handleKeydown","handleClose","removeChild","keyCode","handleClickOverlay","handleModalEvent","handleClickCloseIcon","handleAnimationEnd","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":"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"}
@@ -1,2 +1,2 @@
1
- "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var n=require("react"),t=e(n),o=e(require("react-dom")),r=e(require("classnames")),l=e(require("no-scroll"));function a(){return(a=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e}).apply(this,arguments)}var i=function(e){var n=e.classNames,o=e.styles,l=e.closeIcon,a=e.onClickCloseIcon;return t.createElement("button",{id:e.id,className:r(e.classes.closeButton,null==n?void 0:n.closeButton),style:null==o?void 0:o.closeButton,onClick:a,"data-testid":"close-button"},l||t.createElement("svg",{className:null==n?void 0:n.closeIcon,style:null==o?void 0:o.closeIcon,xmlns:"http://www.w3.org/2000/svg",width:28,height:28,viewBox:"0 0 36 36","data-testid":"close-icon"},t.createElement("path",{d:"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z"})))},c=[],u="undefined"!=typeof window,s=function(){0===c.length&&l.off()},d=["input","select","textarea","a[href]","button","[tabindex]","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])'];function v(e){return null===e.offsetParent||"hidden"===getComputedStyle(e).visibility}function f(e){for(var n=e.querySelectorAll(d.join(",")),t=[],o=0;o<n.length;o++){var r=n[o];!r.disabled&&m(r)>-1&&!v(r)&&t.push(r)}return t}function m(e){var n=parseInt(e.getAttribute("tabindex"),10);return isNaN(n)?function(e){return e.getAttribute("contentEditable")}(e)?0:e.tabIndex:n}var y=function(e){var t=e.container,o=n.useRef();return n.useEffect((function(){var e=function(e){(null==t?void 0:t.current)&&function(e,n){if(e&&"Tab"===e.key){if(!n||!n.contains)return process,!1;if(!n.contains(e.target))return!1;var t=f(n),o=t[0],r=t[t.length-1];e.shiftKey&&e.target===o?(r.focus(),e.preventDefault()):!e.shiftKey&&e.target===r&&(o.focus(),e.preventDefault())}}(e,t.current)};if(u&&document.addEventListener("keydown",e),u&&(null==t?void 0:t.current)){var n=f(t.current);n[0]&&(-1!==d.findIndex((function(e){var n;return null===(n=document.activeElement)||void 0===n?void 0:n.matches(e)}))&&(o.current=document.activeElement),n[0].focus())}return function(){var n;u&&(document.removeEventListener("keydown",e),null===(n=o.current)||void 0===n||n.focus())}}),[t]),null},p={overlay:"react-responsive-modal-overlay",modal:"react-responsive-modal-modal",modalCenter:"react-responsive-modal-modalCenter",closeButton:"react-responsive-modal-closeButton",animationIn:"react-responsive-modal-fadeIn",animationOut:"react-responsive-modal-fadeOut"},b=function(e){var d,v,f=e.open,m=e.center,b=e.blockScroll,h=void 0===b||b,E=e.closeOnEsc,g=void 0===E||E,C=e.closeOnOverlayClick,I=void 0===C||C,w=e.container,k=e.showCloseIcon,O=void 0===k||k,x=e.closeIconId,N=e.closeIcon,L=e.focusTrapped,B=void 0===L||L,D=e.animationDuration,j=void 0===D?500:D,q=e.classNames,A=e.styles,M=e.role,P=void 0===M?"dialog":M,R=e.ariaDescribedby,S=e.ariaLabelledby,K=e.modalId,T=e.onClose,_=e.onEscKeyDown,z=e.onOverlayClick,U=e.onAnimationEnd,F=e.children,G=n.useRef(null),H=n.useRef(null),J=n.useRef(null);null===J.current&&u&&(J.current=document.createElement("div"));var Q=n.useState(f),V=Q[0],W=Q[1],X=function(){var e;-1===c.indexOf(e=J.current)&&c.push(e),h&&l.on(),!J.current||w||document.body.contains(J.current)||document.body.appendChild(J.current),document.addEventListener("keydown",Z)},Y=function(){var e;-1!==(e=c.indexOf(J.current))&&c.splice(e,1),h&&s(),J.current&&!w&&document.body.contains(J.current)&&document.body.removeChild(J.current),document.removeEventListener("keydown",Z)},Z=function(e){27===e.keyCode&&c.length&&c[c.length-1]===J.current&&(_&&_(e),g&&T())};n.useEffect((function(){return f&&X(),function(){V&&Y()}}),[]),n.useEffect((function(){f&&!V&&(W(!0),X())}),[f]);var $=function(){H.current=!1};return V?o.createPortal(t.createElement("div",{style:a({animation:(f?null!==(d=null==q?void 0:q.animationIn)&&void 0!==d?d:p.animationIn:null!==(v=null==q?void 0:q.animationOut)&&void 0!==v?v:p.animationOut)+" "+j+"ms"},null==A?void 0:A.overlay),className:r(p.overlay,null==q?void 0:q.overlay),onClick:function(e){null===H.current&&(H.current=!0),H.current?(z&&z(e),I&&T(),H.current=null):H.current=null},onAnimationEnd:function(){f||(W(!1),Y()),h&&s(),U&&U()},"data-testid":"overlay"},t.createElement("div",{ref:G,className:r(p.modal,m&&p.modalCenter,null==q?void 0:q.modal),style:null==A?void 0:A.modal,onMouseDown:$,onMouseUp:$,onClick:$,id:K,role:P,"aria-modal":"true","aria-labelledby":S,"aria-describedby":R,"data-testid":"modal"},B&&t.createElement(y,{container:G}),F,O&&t.createElement(i,{classes:p,classNames:q,styles:A,closeIcon:N,onClickCloseIcon:function(){T()},id:x}))),w||J.current):null};exports.Modal=b,exports.default=b;
1
+ "use strict";function e(e){return e&&"object"==typeof e&&"default"in e?e.default:e}Object.defineProperty(exports,"__esModule",{value:!0});var n=require("react"),t=e(n),o=e(require("react-dom")),r=e(require("classnames")),l=e(require("no-scroll"));function a(){return(a=Object.assign||function(e){for(var n=1;n<arguments.length;n++){var t=arguments[n];for(var o in t)Object.prototype.hasOwnProperty.call(t,o)&&(e[o]=t[o])}return e}).apply(this,arguments)}var c=function(e){var n=e.classNames,o=e.styles,l=e.closeIcon,a=e.onClickCloseIcon;return t.createElement("button",{id:e.id,className:r(e.classes.closeButton,null==n?void 0:n.closeButton),style:null==o?void 0:o.closeButton,onClick:a,"data-testid":"close-button"},l||t.createElement("svg",{className:null==n?void 0:n.closeIcon,style:null==o?void 0:o.closeIcon,xmlns:"http://www.w3.org/2000/svg",width:28,height:28,viewBox:"0 0 36 36","data-testid":"close-icon"},t.createElement("path",{d:"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z"})))},i=[],u="undefined"!=typeof window,s=function(){0===i.filter((function(e){return e.blockScroll})).length&&l.off()},d=["input","select","textarea","a[href]","button","[tabindex]","audio[controls]","video[controls]",'[contenteditable]:not([contenteditable="false"])'];function v(e){return null===e.offsetParent||"hidden"===getComputedStyle(e).visibility}function f(e){for(var n=e.querySelectorAll(d.join(",")),t=[],o=0;o<n.length;o++){var r=n[o];!r.disabled&&m(r)>-1&&!v(r)&&t.push(r)}return t}function m(e){var n=parseInt(e.getAttribute("tabindex"),10);return isNaN(n)?function(e){return e.getAttribute("contentEditable")}(e)?0:e.tabIndex:n}var y=function(e){var t=e.container,o=n.useRef();return n.useEffect((function(){var e=function(e){(null==t?void 0:t.current)&&function(e,n){if(e&&"Tab"===e.key){if(!n||!n.contains)return process,!1;if(!n.contains(e.target))return!1;var t=f(n),o=t[0],r=t[t.length-1];e.shiftKey&&e.target===o?(r.focus(),e.preventDefault()):!e.shiftKey&&e.target===r&&(o.focus(),e.preventDefault())}}(e,t.current)};if(u&&document.addEventListener("keydown",e),u&&(null==t?void 0:t.current)){var n=f(t.current);n[0]&&(-1!==d.findIndex((function(e){var n;return null===(n=document.activeElement)||void 0===n?void 0:n.matches(e)}))&&(o.current=document.activeElement),n[0].focus())}return function(){var n;u&&(document.removeEventListener("keydown",e),null===(n=o.current)||void 0===n||n.focus())}}),[t]),null},p={overlay:"react-responsive-modal-overlay",modal:"react-responsive-modal-modal",modalCenter:"react-responsive-modal-modalCenter",closeButton:"react-responsive-modal-closeButton",animationIn:"react-responsive-modal-fadeIn",animationOut:"react-responsive-modal-fadeOut"},b=function(e){var d,v,f=e.open,m=e.center,b=e.blockScroll,h=void 0===b||b,E=e.closeOnEsc,I=void 0===E||E,g=e.closeOnOverlayClick,C=void 0===g||g,k=e.container,w=e.showCloseIcon,x=void 0===w||w,O=e.closeIconId,N=e.closeIcon,L=e.focusTrapped,B=void 0===L||L,D=e.animationDuration,S=void 0===D?500:D,j=e.classNames,q=e.styles,A=e.role,M=void 0===A?"dialog":A,P=e.ariaDescribedby,R=e.ariaLabelledby,K=e.modalId,T=e.onClose,_=e.onEscKeyDown,z=e.onOverlayClick,U=e.onAnimationEnd,F=e.children,G=n.useRef(null),H=n.useRef(null),J=n.useRef(null);null===J.current&&u&&(J.current=document.createElement("div"));var Q=n.useState(f),V=Q[0],W=Q[1],X=function(){(function(e,n){-1===i.findIndex((function(n){return n.element===e}))&&i.push({element:e,blockScroll:n})})(J.current,h),h&&l.on(),!J.current||k||document.body.contains(J.current)||document.body.appendChild(J.current),document.addEventListener("keydown",Z)},Y=function(){var e,n;e=J.current,-1!==(n=i.findIndex((function(n){return n.element===e})))&&i.splice(n,1),h&&s(),J.current&&!k&&document.body.contains(J.current)&&document.body.removeChild(J.current),document.removeEventListener("keydown",Z)},Z=function(e){var n;27===e.keyCode&&i.length&&(null===(n=i[i.length-1])||void 0===n?void 0:n.element)===J.current&&(_&&_(e),I&&T())};n.useEffect((function(){return f&&X(),function(){V&&Y()}}),[]),n.useEffect((function(){f&&!V&&(W(!0),X())}),[f]);var $=function(){H.current=!1};return V?o.createPortal(t.createElement("div",{style:a({animation:(f?null!==(d=null==j?void 0:j.animationIn)&&void 0!==d?d:p.animationIn:null!==(v=null==j?void 0:j.animationOut)&&void 0!==v?v:p.animationOut)+" "+S+"ms"},null==q?void 0:q.overlay),className:r(p.overlay,null==j?void 0:j.overlay),onClick:function(e){null===H.current&&(H.current=!0),H.current?(z&&z(e),C&&T(),H.current=null):H.current=null},onAnimationEnd:function(){f||(W(!1),Y()),h&&s(),U&&U()},"data-testid":"overlay"},t.createElement("div",{ref:G,className:r(p.modal,m&&p.modalCenter,null==j?void 0:j.modal),style:null==q?void 0:q.modal,onMouseDown:$,onMouseUp:$,onClick:$,id:K,role:M,"aria-modal":"true","aria-labelledby":R,"aria-describedby":P,"data-testid":"modal"},B&&t.createElement(y,{container:G}),F,x&&t.createElement(c,{classes:p,classNames:j,styles:q,closeIcon:N,onClickCloseIcon:function(){T()},id:O}))),k||J.current):null};exports.Modal=b,exports.default=b;
2
2
  //# sourceMappingURL=react-responsive-modal.cjs.production.min.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"react-responsive-modal.cjs.production.min.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: any[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (modal: HTMLDivElement) => {\n if (modals.indexOf(modal) === -1) {\n modals.push(modal);\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (modal: HTMLDivElement) => {\n const index = modals.indexOf(modal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1] === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n if (modalManager.modals().length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\ninterface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classNames","styles","closeIcon","onClickCloseIcon","React","id","className","cx","classes","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","isBrowser","window","unblockNoScroll","length","noScroll","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","push","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","event","current","key","contains","process","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabTrappingKey","document","addEventListener","findIndex","selector","activeElement","_document$activeEleme","matches","removeEventListener","overlay","modal","modalCenter","animationIn","animationOut","Modal","open","center","blockScroll","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","indexOf","on","body","appendChild","handleKeydown","handleClose","index","splice","removeChild","keyCode","handleModalEvent","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":"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"}
1
+ {"version":3,"file":"react-responsive-modal.cjs.production.min.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: { element: HTMLDivElement; blockScroll: boolean }[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (newModal: HTMLDivElement, blockScroll: boolean) => {\n if (modals.findIndex((modal) => modal.element === newModal) === -1) {\n modals.push({ element: newModal, blockScroll });\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (oldModal: HTMLDivElement) => {\n const index = modals.findIndex((modal) => modal.element === oldModal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1]?.element === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n // We filter the modals that are not affecting the scroll\n const modals = modalManager.modals().filter((modal) => modal.blockScroll);\n if (modals.length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\ninterface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!, blockScroll);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classNames","styles","closeIcon","onClickCloseIcon","React","id","className","cx","classes","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","isBrowser","window","unblockNoScroll","filter","modal","blockScroll","length","noScroll","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","push","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","event","current","key","contains","process","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabTrappingKey","document","addEventListener","findIndex","selector","activeElement","_document$activeEleme","matches","removeEventListener","overlay","modalCenter","animationIn","animationOut","Modal","open","center","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","newModal","element","modalManager","on","body","appendChild","handleKeydown","handleClose","oldModal","index","splice","removeChild","keyCode","handleModalEvent","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":"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"}
@@ -64,17 +64,24 @@ var modalManager = {
64
64
  /**
65
65
  * Register a new modal
66
66
  */
67
- add: function add(modal) {
68
- if (_modals.indexOf(modal) === -1) {
69
- _modals.push(modal);
67
+ add: function add(newModal, blockScroll) {
68
+ if (_modals.findIndex(function (modal) {
69
+ return modal.element === newModal;
70
+ }) === -1) {
71
+ _modals.push({
72
+ element: newModal,
73
+ blockScroll: blockScroll
74
+ });
70
75
  }
71
76
  },
72
77
 
73
78
  /**
74
79
  * Remove a modal
75
80
  */
76
- remove: function remove(modal) {
77
- var index = _modals.indexOf(modal);
81
+ remove: function remove(oldModal) {
82
+ var index = _modals.findIndex(function (modal) {
83
+ return modal.element === oldModal;
84
+ });
78
85
 
79
86
  if (index !== -1) {
80
87
  _modals.splice(index, 1);
@@ -85,7 +92,9 @@ var modalManager = {
85
92
  * Check if the modal is the first one on the screen
86
93
  */
87
94
  isTopModal: function isTopModal(modal) {
88
- return !!_modals.length && _modals[_modals.length - 1] === modal;
95
+ var _modals2;
96
+
97
+ return !!_modals.length && ((_modals2 = _modals[_modals.length - 1]) === null || _modals2 === void 0 ? void 0 : _modals2.element) === modal;
89
98
  }
90
99
  };
91
100
 
@@ -95,7 +104,12 @@ var blockNoScroll = function blockNoScroll() {
95
104
  };
96
105
  var unblockNoScroll = function unblockNoScroll() {
97
106
  // Restore the scroll only if there is no modal on the screen
98
- if (modalManager.modals().length === 0) {
107
+ // We filter the modals that are not affecting the scroll
108
+ var modals = modalManager.modals().filter(function (modal) {
109
+ return modal.blockScroll;
110
+ });
111
+
112
+ if (modals.length === 0) {
99
113
  noScroll.off();
100
114
  }
101
115
  };
@@ -273,7 +287,7 @@ var Modal = function Modal(_ref) {
273
287
  setShowPortal = _useState[1];
274
288
 
275
289
  var handleOpen = function handleOpen() {
276
- modalManager.add(refContainer.current);
290
+ modalManager.add(refContainer.current, blockScroll);
277
291
 
278
292
  if (blockScroll) {
279
293
  blockNoScroll();
@@ -1 +1 @@
1
- {"version":3,"file":"react-responsive-modal.esm.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: any[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (modal: HTMLDivElement) => {\n if (modals.indexOf(modal) === -1) {\n modals.push(modal);\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (modal: HTMLDivElement) => {\n const index = modals.indexOf(modal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1] === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n if (modalManager.modals().length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\ninterface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classes","classNames","styles","id","closeIcon","onClickCloseIcon","React","className","cx","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","add","modal","indexOf","push","remove","index","splice","isTopModal","length","isBrowser","window","blockNoScroll","noScroll","on","unblockNoScroll","modalManager","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","tabTrappingKey","event","key","contains","process","env","NODE_ENV","console","warn","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","current","document","addEventListener","findIndex","selector","activeElement","matches","removeEventListener","overlay","modalCenter","animationIn","animationOut","Modal","open","center","blockScroll","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","body","appendChild","handleKeydown","handleClose","removeChild","keyCode","handleClickOverlay","handleModalEvent","handleClickCloseIcon","handleAnimationEnd","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":"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"}
1
+ {"version":3,"file":"react-responsive-modal.esm.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/focusTrapJs.ts","../src/FocusTrap.tsx","../src/index.tsx"],"sourcesContent":["import React from 'react';\nimport cx from 'classnames';\n\ninterface CloseIconProps {\n id?: string;\n closeIcon?: React.ReactNode;\n styles?: {\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n classNames?: {\n closeButton?: string;\n closeIcon?: string;\n };\n classes: {\n closeButton?: string;\n };\n onClickCloseIcon: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClickCloseIcon,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClickCloseIcon}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\n xmlns=\"http://www.w3.org/2000/svg\"\n width={28}\n height={28}\n viewBox=\"0 0 36 36\"\n data-testid=\"close-icon\"\n >\n <path d=\"M28.5 9.62L26.38 7.5 18 15.88 9.62 7.5 7.5 9.62 15.88 18 7.5 26.38l2.12 2.12L18 20.12l8.38 8.38 2.12-2.12L20.12 18z\" />\n </svg>\n )}\n </button>\n);\n\nexport default CloseIcon;\n","const modals: { element: HTMLDivElement; blockScroll: boolean }[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport default {\n /**\n * Return the modals array\n */\n modals: () => modals,\n\n /**\n * Register a new modal\n */\n add: (newModal: HTMLDivElement, blockScroll: boolean) => {\n if (modals.findIndex((modal) => modal.element === newModal) === -1) {\n modals.push({ element: newModal, blockScroll });\n }\n },\n\n /**\n * Remove a modal\n */\n remove: (oldModal: HTMLDivElement) => {\n const index = modals.findIndex((modal) => modal.element === oldModal);\n if (index !== -1) {\n modals.splice(index, 1);\n }\n },\n\n /**\n * Check if the modal is the first one on the screen\n */\n isTopModal: (modal: HTMLDivElement) =>\n !!modals.length && modals[modals.length - 1]?.element === modal,\n};\n","import noScroll from 'no-scroll';\nimport modalManager from './modalManager';\n\nexport const isBrowser = typeof window !== 'undefined';\n\nexport const blockNoScroll = () => {\n noScroll.on();\n};\n\nexport const unblockNoScroll = () => {\n // Restore the scroll only if there is no modal on the screen\n // We filter the modals that are not affecting the scroll\n const modals = modalManager.modals().filter((modal) => modal.blockScroll);\n if (modals.length === 0) {\n noScroll.off();\n }\n};\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0.9\n\nexport const candidateSelectors = [\n 'input',\n 'select',\n 'textarea',\n 'a[href]',\n 'button',\n '[tabindex]',\n 'audio[controls]',\n 'video[controls]',\n '[contenteditable]:not([contenteditable=\"false\"])',\n];\n\nfunction isHidden(node: any) {\n // offsetParent being null will allow detecting cases where an element is invisible or inside an invisible element,\n // as long as the element does not use position: fixed. For them, their visibility has to be checked directly as well.\n return (\n node.offsetParent === null || getComputedStyle(node).visibility === 'hidden'\n );\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));\n var onlyTabbable = [];\n for (var i = 0; i < tabbableNodes.length; i++) {\n var node = tabbableNodes[i];\n if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {\n onlyTabbable.push(node);\n }\n }\n return onlyTabbable;\n}\n\nexport function tabTrappingKey(event: any, parentElem: any) {\n // check if current event keyCode is tab\n if (!event || event.key !== 'Tab') return;\n\n if (!parentElem || !parentElem.contains) {\n if (process && process.env.NODE_ENV === 'development') {\n console.warn('focus-trap-js: parent element is not defined');\n }\n return false;\n }\n\n if (!parentElem.contains(event.target)) {\n return false;\n }\n\n var allTabbingElements = getAllTabbingElements(parentElem);\n var firstFocusableElement = allTabbingElements[0];\n var lastFocusableElement = allTabbingElements[allTabbingElements.length - 1];\n\n if (event.shiftKey && event.target === firstFocusableElement) {\n lastFocusableElement.focus();\n event.preventDefault();\n return true;\n } else if (!event.shiftKey && event.target === lastFocusableElement) {\n firstFocusableElement.focus();\n event.preventDefault();\n return true;\n }\n return false;\n}\n\nfunction getTabindex(node: any) {\n var tabindexAttr = parseInt(node.getAttribute('tabindex'), 10);\n\n if (!isNaN(tabindexAttr)) return tabindexAttr;\n // Browsers do not return tabIndex correctly for contentEditable nodes;\n // so if they don't have a tabindex attribute specifically set, assume it's 0.\n\n if (isContentEditable(node)) return 0;\n return node.tabIndex;\n}\n\nfunction isContentEditable(node: any) {\n return node.getAttribute('contentEditable');\n}\n","import { useEffect, useRef } from 'react';\nimport { isBrowser } from './utils';\nimport {\n tabTrappingKey,\n candidateSelectors,\n getAllTabbingElements,\n} from './focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n}\n\nexport const FocusTrap = ({ container }: FocusTrapProps) => {\n const refLastFocus = useRef<HTMLElement | null>();\n /**\n * Handle focus lock on the modal\n */\n useEffect(() => {\n const handleKeyEvent = (event: KeyboardEvent) => {\n if (container?.current) {\n tabTrappingKey(event, container.current);\n }\n };\n\n if (isBrowser) {\n document.addEventListener('keydown', handleKeyEvent);\n }\n // On mount we focus on the first focusable element in the modal if there is one\n if (isBrowser && container?.current) {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n // First we save the last focused element\n // only if it's a focusable element\n if (\n candidateSelectors.findIndex((selector) =>\n document.activeElement?.matches(selector)\n ) !== -1\n ) {\n refLastFocus.current = document.activeElement as HTMLElement;\n }\n allTabbingElements[0].focus();\n }\n }\n return () => {\n if (isBrowser) {\n document.removeEventListener('keydown', handleKeyEvent);\n // On unmount we restore the focus to the last focused element\n refLastFocus.current?.focus();\n }\n };\n }, [container]);\n\n return null;\n};\n","import React, { useEffect, useState, useRef } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport modalManager from './modalManager';\nimport { isBrowser, blockNoScroll, unblockNoScroll } from './utils';\n\nconst classes = {\n overlay: 'react-responsive-modal-overlay',\n modal: 'react-responsive-modal-modal',\n modalCenter: 'react-responsive-modal-modalCenter',\n closeButton: 'react-responsive-modal-closeButton',\n animationIn: 'react-responsive-modal-fadeIn',\n animationOut: 'react-responsive-modal-fadeOut',\n};\n\ninterface ModalProps {\n /**\n * Control if the modal is open or not.\n */\n open: boolean;\n /**\n * Should the dialog be centered.\n *\n * Default to false.\n */\n center?: boolean;\n /**\n * Is the modal closable when user press esc key.\n *\n * Default to true.\n */\n closeOnEsc?: boolean;\n /**\n * Is the modal closable when user click on overlay.\n *\n * Default to true.\n */\n closeOnOverlayClick?: boolean;\n /**\n * Whether to block scrolling when dialog is open.\n *\n * Default to true.\n */\n blockScroll?: boolean;\n /**\n * Show the close icon.\n */\n showCloseIcon?: boolean;\n /**\n * id attribute for the close icon button.\n */\n closeIconId?: string;\n /**\n * Custom icon to render (svg, img, etc...).\n */\n closeIcon?: React.ReactNode;\n /**\n * When the modal is open, trap focus within it.\n *\n * Default to true.\n */\n focusTrapped?: boolean;\n /**\n * You can specify a container prop which should be of type `Element`.\n * The portal will be rendered inside that element.\n * The default behavior will create a div node and render it at the at the end of document.body.\n */\n container?: Element;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n overlay?: string;\n modal?: string;\n closeButton?: string;\n closeIcon?: string;\n animationIn?: string;\n animationOut?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n overlay?: React.CSSProperties;\n modal?: React.CSSProperties;\n closeButton?: React.CSSProperties;\n closeIcon?: React.CSSProperties;\n };\n /**\n * Animation duration in milliseconds.\n *\n * Default to 500.\n */\n animationDuration?: number;\n /**\n * ARIA role for modal\n *\n * Default to 'dialog'.\n */\n role?: string;\n /**\n * ARIA label for modal\n */\n ariaLabelledby?: string;\n /**\n * ARIA description for modal\n */\n ariaDescribedby?: string;\n /**\n * id attribute for modal\n */\n modalId?: string;\n /**\n * Callback fired when the Modal is requested to be closed by a click on the overlay or when user press esc key.\n */\n onClose: () => void;\n /**\n * Callback fired when the escape key is pressed.\n */\n onEscKeyDown?: (event: KeyboardEvent) => void;\n /**\n * Callback fired when the overlay is clicked.\n */\n onOverlayClick?: (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => void;\n /**\n * Callback fired when the Modal has exited and the animation is finished.\n */\n onAnimationEnd?: () => void;\n children?: React.ReactNode;\n}\n\nexport const Modal = ({\n open,\n center,\n blockScroll = true,\n closeOnEsc = true,\n closeOnOverlayClick = true,\n container,\n showCloseIcon = true,\n closeIconId,\n closeIcon,\n focusTrapped = true,\n animationDuration = 500,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n}: ModalProps) => {\n const refModal = useRef<HTMLDivElement>(null);\n const refShouldClose = useRef<boolean | null>(null);\n const refContainer = useRef<HTMLDivElement | null>(null);\n // Lazily create the ref instance\n // https://reactjs.org/docs/hooks-faq.html#how-to-create-expensive-objects-lazily\n if (refContainer.current === null && isBrowser) {\n refContainer.current = document.createElement('div');\n }\n\n const [showPortal, setShowPortal] = useState(open);\n\n const handleOpen = () => {\n modalManager.add(refContainer.current!, blockScroll);\n if (blockScroll) {\n blockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\n modalManager.remove(refContainer.current!);\n if (blockScroll) {\n unblockNoScroll();\n }\n if (\n refContainer.current &&\n !container &&\n document.body.contains(refContainer.current)\n ) {\n document.body.removeChild(refContainer.current);\n }\n document.removeEventListener('keydown', handleKeydown);\n };\n\n const handleKeydown = (event: KeyboardEvent) => {\n // Only the last modal need to be escaped when pressing the esc key\n if (\n event.keyCode !== 27 ||\n !modalManager.isTopModal(refContainer.current!)\n ) {\n return;\n }\n\n if (onEscKeyDown) {\n onEscKeyDown(event);\n }\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n // When the modal is rendered first time we want to block the scroll\n if (open) {\n handleOpen();\n }\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, []);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n if (open && !showPortal) {\n setShowPortal(true);\n handleOpen();\n }\n }, [open]);\n\n const handleClickOverlay = (\n event: React.MouseEvent<HTMLDivElement, MouseEvent>\n ) => {\n if (refShouldClose.current === null) {\n refShouldClose.current = true;\n }\n\n if (!refShouldClose.current) {\n refShouldClose.current = null;\n return;\n }\n\n if (onOverlayClick) {\n onOverlayClick(event);\n }\n\n if (closeOnOverlayClick) {\n onClose();\n }\n\n refShouldClose.current = null;\n };\n\n const handleModalEvent = () => {\n refShouldClose.current = false;\n };\n\n const handleClickCloseIcon = () => {\n onClose();\n };\n\n const handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n handleClose();\n }\n\n if (blockScroll) {\n unblockNoScroll();\n }\n\n if (onAnimationEnd) {\n onAnimationEnd();\n }\n };\n\n return showPortal\n ? ReactDom.createPortal(\n <div\n style={{\n animation: `${\n open\n ? classNames?.animationIn ?? classes.animationIn\n : classNames?.animationOut ?? classes.animationOut\n } ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n className={cx(classes.overlay, classNames?.overlay)}\n onClick={handleClickOverlay}\n onAnimationEnd={handleAnimationEnd}\n data-testid=\"overlay\"\n >\n <div\n ref={refModal}\n className={cx(\n classes.modal,\n center && classes.modalCenter,\n classNames?.modal\n )}\n style={styles?.modal}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n >\n {focusTrapped && <FocusTrap container={refModal} />}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClickCloseIcon={handleClickCloseIcon}\n id={closeIconId}\n />\n )}\n </div>\n </div>,\n container || refContainer.current!\n )\n : null;\n};\n\nexport default Modal;\n"],"names":["CloseIcon","classes","classNames","styles","id","closeIcon","onClickCloseIcon","React","className","cx","closeButton","style","onClick","xmlns","width","height","viewBox","d","modals","add","newModal","blockScroll","findIndex","modal","element","push","remove","oldModal","index","splice","isTopModal","length","isBrowser","window","blockNoScroll","noScroll","on","unblockNoScroll","modalManager","filter","off","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getAllTabbingElements","parentElem","tabbableNodes","querySelectorAll","join","onlyTabbable","i","disabled","getTabindex","tabTrappingKey","event","key","contains","process","env","NODE_ENV","console","warn","target","allTabbingElements","firstFocusableElement","lastFocusableElement","shiftKey","focus","preventDefault","tabindexAttr","parseInt","getAttribute","isNaN","isContentEditable","tabIndex","FocusTrap","container","refLastFocus","useRef","useEffect","handleKeyEvent","current","document","addEventListener","selector","activeElement","matches","removeEventListener","overlay","modalCenter","animationIn","animationOut","Modal","open","center","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refModal","refShouldClose","refContainer","createElement","useState","showPortal","setShowPortal","handleOpen","body","appendChild","handleKeydown","handleClose","removeChild","keyCode","handleClickOverlay","handleModalEvent","handleClickCloseIcon","handleAnimationEnd","ReactDom","createPortal","animation","ref","onMouseDown","onMouseUp"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "react-responsive-modal",
3
- "version": "5.0.2",
3
+ "version": "5.0.3",
4
4
  "description": "A simple responsive and accessible react modal compatible with React 16 and ready for React 17",
5
5
  "license": "MIT",
6
6
  "main": "dist/index.js",
@@ -63,25 +63,26 @@
63
63
  "react-dom": "^16.8.0"
64
64
  },
65
65
  "devDependencies": {
66
- "@babel/core": "7.9.0",
67
- "@size-limit/preset-small-lib": "4.4.5",
68
- "@testing-library/jest-dom": "5.3.0",
69
- "@testing-library/react": "10.0.2",
66
+ "@size-limit/preset-small-lib": "4.5.6",
67
+ "@testing-library/jest-dom": "5.11.3",
68
+ "@testing-library/react": "10.4.8",
70
69
  "@types/classnames": "2.2.10",
71
- "@types/jest": "25.2.1",
72
70
  "@types/no-scroll": "2.1.0",
73
- "@types/react": "16.9.32",
74
- "@types/react-dom": "16.9.6",
75
- "@types/react-transition-group": "4.2.4",
76
- "codecov": "3.6.5",
71
+ "@types/node": "14.0.27",
72
+ "@types/react": "16.9.39",
73
+ "@types/react-dom": "16.9.8",
74
+ "@types/react-transition-group": "4.4.0",
75
+ "codecov": "3.7.2",
77
76
  "docz": "2.3.1",
78
- "husky": "4.2.3",
79
- "prettier": "2.0.3",
77
+ "gatsby": "2.23.11",
78
+ "gatsby-theme-docz": "2.3.1",
79
+ "husky": "4.2.5",
80
+ "prettier": "2.0.5",
80
81
  "react": "16.13.1",
81
82
  "react-dom": "16.13.1",
82
- "size-limit": "4.4.5",
83
- "tsdx": "0.13.1",
84
- "tslib": "1.11.1",
85
- "typescript": "3.8.3"
83
+ "size-limit": "4.5.6",
84
+ "tsdx": "0.13.2",
85
+ "tslib": "2.0.1",
86
+ "typescript": "^3.9.7"
86
87
  }
87
- }
88
+ }
package/src/index.tsx CHANGED
@@ -169,7 +169,7 @@ export const Modal = ({
169
169
  const [showPortal, setShowPortal] = useState(open);
170
170
 
171
171
  const handleOpen = () => {
172
- modalManager.add(refContainer.current!);
172
+ modalManager.add(refContainer.current!, blockScroll);
173
173
  if (blockScroll) {
174
174
  blockNoScroll();
175
175
  }
@@ -1,4 +1,4 @@
1
- const modals: any[] = [];
1
+ const modals: { element: HTMLDivElement; blockScroll: boolean }[] = [];
2
2
 
3
3
  /**
4
4
  * Handle the order of the modals.
@@ -13,17 +13,17 @@ export default {
13
13
  /**
14
14
  * Register a new modal
15
15
  */
16
- add: (modal: HTMLDivElement) => {
17
- if (modals.indexOf(modal) === -1) {
18
- modals.push(modal);
16
+ add: (newModal: HTMLDivElement, blockScroll: boolean) => {
17
+ if (modals.findIndex((modal) => modal.element === newModal) === -1) {
18
+ modals.push({ element: newModal, blockScroll });
19
19
  }
20
20
  },
21
21
 
22
22
  /**
23
23
  * Remove a modal
24
24
  */
25
- remove: (modal: HTMLDivElement) => {
26
- const index = modals.indexOf(modal);
25
+ remove: (oldModal: HTMLDivElement) => {
26
+ const index = modals.findIndex((modal) => modal.element === oldModal);
27
27
  if (index !== -1) {
28
28
  modals.splice(index, 1);
29
29
  }
@@ -33,5 +33,5 @@ export default {
33
33
  * Check if the modal is the first one on the screen
34
34
  */
35
35
  isTopModal: (modal: HTMLDivElement) =>
36
- !!modals.length && modals[modals.length - 1] === modal,
36
+ !!modals.length && modals[modals.length - 1]?.element === modal,
37
37
  };
package/src/utils.ts CHANGED
@@ -9,7 +9,9 @@ export const blockNoScroll = () => {
9
9
 
10
10
  export const unblockNoScroll = () => {
11
11
  // Restore the scroll only if there is no modal on the screen
12
- if (modalManager.modals().length === 0) {
12
+ // We filter the modals that are not affecting the scroll
13
+ const modals = modalManager.modals().filter((modal) => modal.blockScroll);
14
+ if (modals.length === 0) {
13
15
  noScroll.off();
14
16
  }
15
17
  };