UNPKG

21 kBSource Map (JSON)View Raw
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\nexport interface 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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"}
\No newline at end of file