react-responsive-modal 5.2.6 → 6.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -7
- package/dist/CloseIcon.d.ts +2 -2
- package/dist/FocusTrap.d.ts +2 -1
- package/dist/index.d.ts +23 -5
- package/dist/modalManager.d.ts +11 -17
- package/dist/react-responsive-modal.cjs.development.js +160 -117
- package/dist/react-responsive-modal.cjs.development.js.map +1 -1
- package/dist/react-responsive-modal.cjs.production.min.js +1 -1
- package/dist/react-responsive-modal.cjs.production.min.js.map +1 -1
- package/dist/react-responsive-modal.esm.js +160 -117
- package/dist/react-responsive-modal.esm.js.map +1 -1
- package/dist/useScrollLock.d.ts +1 -0
- package/dist/utils.d.ts +0 -2
- package/package.json +18 -27
- package/src/CloseIcon.tsx +3 -4
- package/src/FocusTrap.tsx +18 -5
- package/src/index.tsx +229 -179
- package/src/lib/focusTrapJs.ts +29 -2
- package/src/modalManager.ts +22 -19
- package/src/useScrollLock.ts +25 -0
- package/src/utils.ts +0 -16
- package/styles.css +59 -17
- package/CHANGELOG.md +0 -41
- package/LICENSE +0 -21
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import React, { useRef, useEffect, useState } from 'react';
|
|
2
2
|
import ReactDom from 'react-dom';
|
|
3
3
|
import cx from 'classnames';
|
|
4
|
-
import
|
|
4
|
+
import { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock';
|
|
5
|
+
import useForwardedRef from '@bedrock-layout/use-forwarded-ref';
|
|
5
6
|
|
|
6
7
|
function _extends() {
|
|
7
8
|
_extends = Object.assign || function (target) {
|
|
@@ -27,17 +28,16 @@ var CloseIcon = function CloseIcon(_ref) {
|
|
|
27
28
|
styles = _ref.styles,
|
|
28
29
|
id = _ref.id,
|
|
29
30
|
closeIcon = _ref.closeIcon,
|
|
30
|
-
|
|
31
|
+
onClick = _ref.onClick;
|
|
31
32
|
return React.createElement("button", {
|
|
32
33
|
id: id,
|
|
33
34
|
className: cx(classes.closeButton, classNames == null ? void 0 : classNames.closeButton),
|
|
34
35
|
style: styles == null ? void 0 : styles.closeButton,
|
|
35
|
-
onClick:
|
|
36
|
+
onClick: onClick,
|
|
36
37
|
"data-testid": "close-button"
|
|
37
38
|
}, closeIcon ? closeIcon : React.createElement("svg", {
|
|
38
39
|
className: classNames == null ? void 0 : classNames.closeIcon,
|
|
39
40
|
style: styles == null ? void 0 : styles.closeIcon,
|
|
40
|
-
xmlns: "http://www.w3.org/2000/svg",
|
|
41
41
|
width: 28,
|
|
42
42
|
height: 28,
|
|
43
43
|
viewBox: "0 0 36 36",
|
|
@@ -47,74 +47,9 @@ var CloseIcon = function CloseIcon(_ref) {
|
|
|
47
47
|
})));
|
|
48
48
|
};
|
|
49
49
|
|
|
50
|
-
var _modals = [];
|
|
51
|
-
/**
|
|
52
|
-
* Handle the order of the modals.
|
|
53
|
-
* Inspired by the material-ui implementation.
|
|
54
|
-
*/
|
|
55
|
-
|
|
56
|
-
var modalManager = {
|
|
57
|
-
/**
|
|
58
|
-
* Return the modals array
|
|
59
|
-
*/
|
|
60
|
-
modals: function modals() {
|
|
61
|
-
return _modals;
|
|
62
|
-
},
|
|
63
|
-
|
|
64
|
-
/**
|
|
65
|
-
* Register a new modal
|
|
66
|
-
*/
|
|
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
|
-
});
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
/**
|
|
79
|
-
* Remove a modal
|
|
80
|
-
*/
|
|
81
|
-
remove: function remove(oldModal) {
|
|
82
|
-
var index = _modals.findIndex(function (modal) {
|
|
83
|
-
return modal.element === oldModal;
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
if (index !== -1) {
|
|
87
|
-
_modals.splice(index, 1);
|
|
88
|
-
}
|
|
89
|
-
},
|
|
90
|
-
|
|
91
|
-
/**
|
|
92
|
-
* Check if the modal is the first one on the screen
|
|
93
|
-
*/
|
|
94
|
-
isTopModal: function isTopModal(modal) {
|
|
95
|
-
var _modals2;
|
|
96
|
-
|
|
97
|
-
return !!_modals.length && ((_modals2 = _modals[_modals.length - 1]) == null ? void 0 : _modals2.element) === modal;
|
|
98
|
-
}
|
|
99
|
-
};
|
|
100
|
-
|
|
101
50
|
var isBrowser = typeof window !== 'undefined';
|
|
102
|
-
var blockNoScroll = function blockNoScroll() {
|
|
103
|
-
noScroll.on();
|
|
104
|
-
};
|
|
105
|
-
var unblockNoScroll = function unblockNoScroll() {
|
|
106
|
-
// Restore the scroll only if there is no modal on the screen
|
|
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) {
|
|
113
|
-
noScroll.off();
|
|
114
|
-
}
|
|
115
|
-
};
|
|
116
51
|
|
|
117
|
-
// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.0
|
|
52
|
+
// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.1.0
|
|
118
53
|
var candidateSelectors = ['input', 'select', 'textarea', 'a[href]', 'button', '[tabindex]', 'audio[controls]', 'video[controls]', '[contenteditable]:not([contenteditable="false"])'];
|
|
119
54
|
|
|
120
55
|
function isHidden(node) {
|
|
@@ -123,14 +58,34 @@ function isHidden(node) {
|
|
|
123
58
|
return node.offsetParent === null || getComputedStyle(node).visibility === 'hidden';
|
|
124
59
|
}
|
|
125
60
|
|
|
61
|
+
function getCheckedRadio(nodes, form) {
|
|
62
|
+
for (var i = 0; i < nodes.length; i++) {
|
|
63
|
+
if (nodes[i].checked && nodes[i].form === form) {
|
|
64
|
+
return nodes[i];
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
function isNotRadioOrTabbableRadio(node) {
|
|
70
|
+
if (node.tagName !== 'INPUT' || node.type !== 'radio' || !node.name) {
|
|
71
|
+
return true;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
var radioScope = node.form || node.ownerDocument;
|
|
75
|
+
var radioSet = radioScope.querySelectorAll('input[type="radio"][name="' + node.name + '"]');
|
|
76
|
+
var checked = getCheckedRadio(radioSet, node.form);
|
|
77
|
+
return checked === node || checked === undefined && radioSet[0] === node;
|
|
78
|
+
}
|
|
79
|
+
|
|
126
80
|
function getAllTabbingElements(parentElem) {
|
|
81
|
+
var currentActiveElement = document.activeElement;
|
|
127
82
|
var tabbableNodes = parentElem.querySelectorAll(candidateSelectors.join(','));
|
|
128
83
|
var onlyTabbable = [];
|
|
129
84
|
|
|
130
85
|
for (var i = 0; i < tabbableNodes.length; i++) {
|
|
131
86
|
var node = tabbableNodes[i];
|
|
132
87
|
|
|
133
|
-
if (!node.disabled && getTabindex(node) > -1 && !isHidden(node)) {
|
|
88
|
+
if (currentActiveElement === node || !node.disabled && getTabindex(node) > -1 && !isHidden(node) && isNotRadioOrTabbableRadio(node)) {
|
|
134
89
|
onlyTabbable.push(node);
|
|
135
90
|
}
|
|
136
91
|
}
|
|
@@ -184,7 +139,8 @@ function isContentEditable(node) {
|
|
|
184
139
|
}
|
|
185
140
|
|
|
186
141
|
var FocusTrap = function FocusTrap(_ref) {
|
|
187
|
-
var container = _ref.container
|
|
142
|
+
var container = _ref.container,
|
|
143
|
+
initialFocusRef = _ref.initialFocusRef;
|
|
188
144
|
var refLastFocus = useRef();
|
|
189
145
|
/**
|
|
190
146
|
* Handle focus lock on the modal
|
|
@@ -203,9 +159,7 @@ var FocusTrap = function FocusTrap(_ref) {
|
|
|
203
159
|
|
|
204
160
|
|
|
205
161
|
if (isBrowser && (container == null ? void 0 : container.current)) {
|
|
206
|
-
var
|
|
207
|
-
|
|
208
|
-
if (allTabbingElements[0]) {
|
|
162
|
+
var savePreviousFocus = function savePreviousFocus() {
|
|
209
163
|
// First we save the last focused element
|
|
210
164
|
// only if it's a focusable element
|
|
211
165
|
if (candidateSelectors.findIndex(function (selector) {
|
|
@@ -215,8 +169,23 @@ var FocusTrap = function FocusTrap(_ref) {
|
|
|
215
169
|
}) !== -1) {
|
|
216
170
|
refLastFocus.current = document.activeElement;
|
|
217
171
|
}
|
|
172
|
+
};
|
|
173
|
+
|
|
174
|
+
if (initialFocusRef) {
|
|
175
|
+
savePreviousFocus(); // We need to schedule focusing on a next frame - this allows to focus on the modal root
|
|
176
|
+
|
|
177
|
+
requestAnimationFrame(function () {
|
|
178
|
+
var _initialFocusRef$curr;
|
|
218
179
|
|
|
219
|
-
|
|
180
|
+
(_initialFocusRef$curr = initialFocusRef.current) == null ? void 0 : _initialFocusRef$curr.focus();
|
|
181
|
+
});
|
|
182
|
+
} else {
|
|
183
|
+
var allTabbingElements = getAllTabbingElements(container.current);
|
|
184
|
+
|
|
185
|
+
if (allTabbingElements[0]) {
|
|
186
|
+
savePreviousFocus();
|
|
187
|
+
allTabbingElements[0].focus();
|
|
188
|
+
}
|
|
220
189
|
}
|
|
221
190
|
}
|
|
222
191
|
|
|
@@ -229,20 +198,85 @@ var FocusTrap = function FocusTrap(_ref) {
|
|
|
229
198
|
(_refLastFocus$current = refLastFocus.current) == null ? void 0 : _refLastFocus$current.focus();
|
|
230
199
|
}
|
|
231
200
|
};
|
|
232
|
-
}, [container]);
|
|
201
|
+
}, [container, initialFocusRef]);
|
|
233
202
|
return null;
|
|
234
203
|
};
|
|
235
204
|
|
|
205
|
+
var modals = [];
|
|
206
|
+
/**
|
|
207
|
+
* Handle the order of the modals.
|
|
208
|
+
* Inspired by the material-ui implementation.
|
|
209
|
+
*/
|
|
210
|
+
|
|
211
|
+
var modalManager = {
|
|
212
|
+
/**
|
|
213
|
+
* Register a new modal
|
|
214
|
+
*/
|
|
215
|
+
add: function add(newModal) {
|
|
216
|
+
modals.push(newModal);
|
|
217
|
+
},
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* Remove a modal
|
|
221
|
+
*/
|
|
222
|
+
remove: function remove(oldModal) {
|
|
223
|
+
modals = modals.filter(function (modal) {
|
|
224
|
+
return modal !== oldModal;
|
|
225
|
+
});
|
|
226
|
+
},
|
|
227
|
+
|
|
228
|
+
/**
|
|
229
|
+
* When multiple modals are rendered will return true if current modal is the last one
|
|
230
|
+
*/
|
|
231
|
+
isTopModal: function isTopModal(modal) {
|
|
232
|
+
return !!modals.length && modals[modals.length - 1] === modal;
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
function useModalManager(ref, open) {
|
|
236
|
+
useEffect(function () {
|
|
237
|
+
if (open) {
|
|
238
|
+
modalManager.add(ref);
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
return function () {
|
|
242
|
+
modalManager.remove(ref);
|
|
243
|
+
};
|
|
244
|
+
}, [open, ref]);
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
var useScrollLock = function useScrollLock(refModal, open, showPortal, blockScroll, reserveScrollBarGap) {
|
|
248
|
+
var oldRef = useRef(null);
|
|
249
|
+
useEffect(function () {
|
|
250
|
+
if (open && refModal.current && blockScroll) {
|
|
251
|
+
oldRef.current = refModal.current;
|
|
252
|
+
disableBodyScroll(refModal.current, {
|
|
253
|
+
reserveScrollBarGap: reserveScrollBarGap
|
|
254
|
+
});
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
return function () {
|
|
258
|
+
if (oldRef.current) {
|
|
259
|
+
enableBodyScroll(oldRef.current);
|
|
260
|
+
oldRef.current = null;
|
|
261
|
+
}
|
|
262
|
+
};
|
|
263
|
+
}, [open, showPortal, refModal, blockScroll, reserveScrollBarGap]);
|
|
264
|
+
};
|
|
265
|
+
|
|
236
266
|
var classes = {
|
|
267
|
+
root: 'react-responsive-modal-root',
|
|
237
268
|
overlay: 'react-responsive-modal-overlay',
|
|
269
|
+
overlayAnimationIn: 'react-responsive-modal-overlay-in',
|
|
270
|
+
overlayAnimationOut: 'react-responsive-modal-overlay-out',
|
|
271
|
+
modalContainer: 'react-responsive-modal-container',
|
|
272
|
+
modalContainerCenter: 'react-responsive-modal-containerCenter',
|
|
238
273
|
modal: 'react-responsive-modal-modal',
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
animationOut: 'react-responsive-modal-fadeOut'
|
|
274
|
+
modalAnimationIn: 'react-responsive-modal-modal-in',
|
|
275
|
+
modalAnimationOut: 'react-responsive-modal-modal-out',
|
|
276
|
+
closeButton: 'react-responsive-modal-closeButton'
|
|
243
277
|
};
|
|
244
|
-
var Modal = function
|
|
245
|
-
var _classNames$
|
|
278
|
+
var Modal = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
|
|
279
|
+
var _classNames$overlayAn, _classNames$overlayAn2, _classNames$modalAnim, _classNames$modalAnim2;
|
|
246
280
|
|
|
247
281
|
var open = _ref.open,
|
|
248
282
|
center = _ref.center,
|
|
@@ -259,8 +293,10 @@ var Modal = function Modal(_ref) {
|
|
|
259
293
|
closeIcon = _ref.closeIcon,
|
|
260
294
|
_ref$focusTrapped = _ref.focusTrapped,
|
|
261
295
|
focusTrapped = _ref$focusTrapped === void 0 ? true : _ref$focusTrapped,
|
|
296
|
+
_ref$initialFocusRef = _ref.initialFocusRef,
|
|
297
|
+
initialFocusRef = _ref$initialFocusRef === void 0 ? undefined : _ref$initialFocusRef,
|
|
262
298
|
_ref$animationDuratio = _ref.animationDuration,
|
|
263
|
-
animationDuration = _ref$animationDuratio === void 0 ?
|
|
299
|
+
animationDuration = _ref$animationDuratio === void 0 ? 300 : _ref$animationDuratio,
|
|
264
300
|
classNames = _ref.classNames,
|
|
265
301
|
styles = _ref.styles,
|
|
266
302
|
_ref$role = _ref.role,
|
|
@@ -272,7 +308,9 @@ var Modal = function Modal(_ref) {
|
|
|
272
308
|
onEscKeyDown = _ref.onEscKeyDown,
|
|
273
309
|
onOverlayClick = _ref.onOverlayClick,
|
|
274
310
|
onAnimationEnd = _ref.onAnimationEnd,
|
|
275
|
-
children = _ref.children
|
|
311
|
+
children = _ref.children,
|
|
312
|
+
reserveScrollBarGap = _ref.reserveScrollBarGap;
|
|
313
|
+
var refDialog = useForwardedRef(ref);
|
|
276
314
|
var refModal = useRef(null);
|
|
277
315
|
var refShouldClose = useRef(null);
|
|
278
316
|
var refContainer = useRef(null); // Lazily create the ref instance
|
|
@@ -286,15 +324,14 @@ var Modal = function Modal(_ref) {
|
|
|
286
324
|
|
|
287
325
|
var _useState = useState(false),
|
|
288
326
|
showPortal = _useState[0],
|
|
289
|
-
setShowPortal = _useState[1];
|
|
327
|
+
setShowPortal = _useState[1]; // Hook used to manage multiple modals opened at the same time
|
|
290
328
|
|
|
291
|
-
var handleOpen = function handleOpen() {
|
|
292
|
-
modalManager.add(refContainer.current, blockScroll);
|
|
293
329
|
|
|
294
|
-
|
|
295
|
-
blockNoScroll();
|
|
296
|
-
}
|
|
330
|
+
useModalManager(refModal, open); // Hook used to manage the scroll
|
|
297
331
|
|
|
332
|
+
useScrollLock(refModal, open, showPortal, blockScroll, reserveScrollBarGap);
|
|
333
|
+
|
|
334
|
+
var handleOpen = function handleOpen() {
|
|
298
335
|
if (refContainer.current && !container && !document.body.contains(refContainer.current)) {
|
|
299
336
|
document.body.appendChild(refContainer.current);
|
|
300
337
|
}
|
|
@@ -303,12 +340,6 @@ var Modal = function Modal(_ref) {
|
|
|
303
340
|
};
|
|
304
341
|
|
|
305
342
|
var handleClose = function handleClose() {
|
|
306
|
-
modalManager.remove(refContainer.current);
|
|
307
|
-
|
|
308
|
-
if (blockScroll) {
|
|
309
|
-
unblockNoScroll();
|
|
310
|
-
}
|
|
311
|
-
|
|
312
343
|
if (refContainer.current && !container && document.body.contains(refContainer.current)) {
|
|
313
344
|
document.body.removeChild(refContainer.current);
|
|
314
345
|
}
|
|
@@ -318,7 +349,7 @@ var Modal = function Modal(_ref) {
|
|
|
318
349
|
|
|
319
350
|
var handleKeydown = function handleKeydown(event) {
|
|
320
351
|
// Only the last modal need to be escaped when pressing the esc key
|
|
321
|
-
if (event.keyCode !== 27 || !modalManager.isTopModal(
|
|
352
|
+
if (event.keyCode !== 27 || !modalManager.isTopModal(refModal)) {
|
|
322
353
|
return;
|
|
323
354
|
}
|
|
324
355
|
|
|
@@ -331,8 +362,8 @@ var Modal = function Modal(_ref) {
|
|
|
331
362
|
|
|
332
363
|
useEffect(function () {
|
|
333
364
|
return function () {
|
|
334
|
-
// When the component is unmounted directly we want to unblock the scroll
|
|
335
365
|
if (showPortal) {
|
|
366
|
+
// When the modal is closed or removed directly, cleanup the listeners
|
|
336
367
|
handleClose();
|
|
337
368
|
}
|
|
338
369
|
};
|
|
@@ -369,10 +400,6 @@ var Modal = function Modal(_ref) {
|
|
|
369
400
|
refShouldClose.current = false;
|
|
370
401
|
};
|
|
371
402
|
|
|
372
|
-
var handleClickCloseIcon = function handleClickCloseIcon() {
|
|
373
|
-
onClose();
|
|
374
|
-
};
|
|
375
|
-
|
|
376
403
|
var handleAnimationEnd = function handleAnimationEnd() {
|
|
377
404
|
if (!open) {
|
|
378
405
|
setShowPortal(false);
|
|
@@ -382,38 +409,54 @@ var Modal = function Modal(_ref) {
|
|
|
382
409
|
};
|
|
383
410
|
|
|
384
411
|
var containerModal = container || refContainer.current;
|
|
412
|
+
var overlayAnimation = open ? (_classNames$overlayAn = classNames == null ? void 0 : classNames.overlayAnimationIn) != null ? _classNames$overlayAn : classes.overlayAnimationIn : (_classNames$overlayAn2 = classNames == null ? void 0 : classNames.overlayAnimationOut) != null ? _classNames$overlayAn2 : classes.overlayAnimationOut;
|
|
413
|
+
var modalAnimation = open ? (_classNames$modalAnim = classNames == null ? void 0 : classNames.modalAnimationIn) != null ? _classNames$modalAnim : classes.modalAnimationIn : (_classNames$modalAnim2 = classNames == null ? void 0 : classNames.modalAnimationOut) != null ? _classNames$modalAnim2 : classes.modalAnimationOut;
|
|
385
414
|
return showPortal && containerModal ? ReactDom.createPortal(React.createElement("div", {
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
className: cx(classes.overlay, classNames == null ? void 0 : classNames.overlay),
|
|
390
|
-
onClick: handleClickOverlay,
|
|
391
|
-
onAnimationEnd: handleAnimationEnd,
|
|
392
|
-
"data-testid": "overlay"
|
|
415
|
+
className: cx(classes.root, classNames == null ? void 0 : classNames.root),
|
|
416
|
+
style: styles == null ? void 0 : styles.root,
|
|
417
|
+
"data-testid": "root"
|
|
393
418
|
}, React.createElement("div", {
|
|
419
|
+
className: cx(classes.overlay, classNames == null ? void 0 : classNames.overlay),
|
|
420
|
+
"data-testid": "overlay",
|
|
421
|
+
"aria-hidden": true,
|
|
422
|
+
style: _extends({
|
|
423
|
+
animation: overlayAnimation + " " + animationDuration + "ms"
|
|
424
|
+
}, styles == null ? void 0 : styles.overlay)
|
|
425
|
+
}), React.createElement("div", {
|
|
394
426
|
ref: refModal,
|
|
395
|
-
className: cx(classes.
|
|
396
|
-
style: styles == null ? void 0 : styles.
|
|
427
|
+
className: cx(classes.modalContainer, center && classes.modalContainerCenter, classNames == null ? void 0 : classNames.modalContainer),
|
|
428
|
+
style: styles == null ? void 0 : styles.modalContainer,
|
|
429
|
+
"data-testid": "modal-container",
|
|
430
|
+
onClick: handleClickOverlay
|
|
431
|
+
}, React.createElement("div", {
|
|
432
|
+
ref: refDialog,
|
|
433
|
+
className: cx(classes.modal, classNames == null ? void 0 : classNames.modal),
|
|
434
|
+
style: _extends({
|
|
435
|
+
animation: modalAnimation + " " + animationDuration + "ms"
|
|
436
|
+
}, styles == null ? void 0 : styles.modal),
|
|
397
437
|
onMouseDown: handleModalEvent,
|
|
398
438
|
onMouseUp: handleModalEvent,
|
|
399
439
|
onClick: handleModalEvent,
|
|
440
|
+
onAnimationEnd: handleAnimationEnd,
|
|
400
441
|
id: modalId,
|
|
401
442
|
role: role,
|
|
402
443
|
"aria-modal": "true",
|
|
403
444
|
"aria-labelledby": ariaLabelledby,
|
|
404
445
|
"aria-describedby": ariaDescribedby,
|
|
405
|
-
"data-testid": "modal"
|
|
446
|
+
"data-testid": "modal",
|
|
447
|
+
tabIndex: -1
|
|
406
448
|
}, focusTrapped && React.createElement(FocusTrap, {
|
|
407
|
-
container:
|
|
449
|
+
container: refDialog,
|
|
450
|
+
initialFocusRef: initialFocusRef
|
|
408
451
|
}), children, showCloseIcon && React.createElement(CloseIcon, {
|
|
409
452
|
classes: classes,
|
|
410
453
|
classNames: classNames,
|
|
411
454
|
styles: styles,
|
|
412
455
|
closeIcon: closeIcon,
|
|
413
|
-
|
|
456
|
+
onClick: onClose,
|
|
414
457
|
id: closeIconId
|
|
415
|
-
}))), containerModal) : null;
|
|
416
|
-
};
|
|
458
|
+
})))), containerModal) : null;
|
|
459
|
+
});
|
|
417
460
|
|
|
418
461
|
export default Modal;
|
|
419
462
|
export { Modal };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"react-responsive-modal.esm.js","sources":["../src/CloseIcon.tsx","../src/modalManager.ts","../src/utils.ts","../src/lib/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 './lib/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 // The value should be false for srr, that way when the component is hydrated client side,\n // it will match the server rendered content\n const [showPortal, setShowPortal] = useState(false);\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 onEscKeyDown?.(event);\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n return () => {\n // When the component is unmounted directly we want to unblock the scroll\n if (showPortal) {\n handleClose();\n }\n };\n }, [showPortal]);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n // This is also called on the first render if the open prop is true when the modal is created\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 onOverlayClick?.(event);\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 }\n\n onAnimationEnd?.();\n };\n\n const containerModal = container || refContainer.current;\n\n return showPortal && containerModal\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 containerModal\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","containerModal","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/utils.ts","../src/lib/focusTrapJs.ts","../src/FocusTrap.tsx","../src/modalManager.ts","../src/useScrollLock.ts","../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 onClick: () => void;\n}\n\nconst CloseIcon = ({\n classes,\n classNames,\n styles,\n id,\n closeIcon,\n onClick,\n}: CloseIconProps) => (\n <button\n id={id}\n className={cx(classes.closeButton, classNames?.closeButton)}\n style={styles?.closeButton}\n onClick={onClick}\n data-testid=\"close-button\"\n >\n {closeIcon ? (\n closeIcon\n ) : (\n <svg\n className={classNames?.closeIcon}\n style={styles?.closeIcon}\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","export const isBrowser = typeof window !== 'undefined';\n","// https://github.com/alexandrzavalii/focus-trap-js/blob/master/src/index.js v1.1.0\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\nfunction getCheckedRadio(nodes: any, form: any) {\n for (var i = 0; i < nodes.length; i++) {\n if (nodes[i].checked && nodes[i].form === form) {\n return nodes[i];\n }\n }\n}\n\nfunction isNotRadioOrTabbableRadio(node: any) {\n if (node.tagName !== 'INPUT' || node.type !== 'radio' || !node.name) {\n return true;\n }\n var radioScope = node.form || node.ownerDocument;\n var radioSet = radioScope.querySelectorAll(\n 'input[type=\"radio\"][name=\"' + node.name + '\"]'\n );\n var checked = getCheckedRadio(radioSet, node.form);\n return checked === node || (checked === undefined && radioSet[0] === node);\n}\n\nexport function getAllTabbingElements(parentElem: any) {\n var currentActiveElement = document.activeElement;\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 (\n currentActiveElement === node ||\n (!node.disabled &&\n getTabindex(node) > -1 &&\n !isHidden(node) &&\n isNotRadioOrTabbableRadio(node))\n ) {\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 './lib/focusTrapJs';\n\ninterface FocusTrapProps {\n container?: React.RefObject<HTMLElement> | null;\n initialFocusRef?: React.RefObject<HTMLElement>;\n}\n\nexport const FocusTrap = ({ container, initialFocusRef }: 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 savePreviousFocus = () => {\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 };\n\n if (initialFocusRef) {\n savePreviousFocus();\n // We need to schedule focusing on a next frame - this allows to focus on the modal root\n requestAnimationFrame(() => {\n initialFocusRef.current?.focus();\n });\n } else {\n const allTabbingElements = getAllTabbingElements(container.current);\n if (allTabbingElements[0]) {\n savePreviousFocus();\n allTabbingElements[0].focus();\n }\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, initialFocusRef]);\n\n return null;\n};\n","import { Ref, useEffect } from 'react';\n\nlet modals: Ref<Element>[] = [];\n\n/**\n * Handle the order of the modals.\n * Inspired by the material-ui implementation.\n */\nexport const modalManager = {\n /**\n * Register a new modal\n */\n add: (newModal: Ref<Element>) => {\n modals.push(newModal);\n },\n\n /**\n * Remove a modal\n */\n remove: (oldModal: Ref<Element>) => {\n modals = modals.filter((modal) => modal !== oldModal);\n },\n\n /**\n * When multiple modals are rendered will return true if current modal is the last one\n */\n isTopModal: (modal: Ref<Element>) =>\n !!modals.length && modals[modals.length - 1] === modal,\n};\n\nexport function useModalManager(ref: Ref<Element>, open: boolean) {\n useEffect(() => {\n if (open) {\n modalManager.add(ref);\n }\n return () => {\n modalManager.remove(ref);\n };\n }, [open, ref]);\n}\n","import { useEffect, useRef } from 'react';\nimport { disableBodyScroll, enableBodyScroll } from 'body-scroll-lock';\n\nexport const useScrollLock = (\n refModal: React.RefObject<Element>,\n open: boolean,\n showPortal: boolean,\n blockScroll: boolean,\n reserveScrollBarGap?: boolean\n) => {\n const oldRef = useRef<Element | null>(null);\n\n useEffect(() => {\n if (open && refModal.current && blockScroll) {\n oldRef.current = refModal.current;\n disableBodyScroll(refModal.current, { reserveScrollBarGap });\n }\n return () => {\n if (oldRef.current) {\n enableBodyScroll(oldRef.current);\n oldRef.current = null;\n }\n };\n }, [open, showPortal, refModal, blockScroll, reserveScrollBarGap]);\n};\n","import React, { useEffect, useRef, useState } from 'react';\nimport ReactDom from 'react-dom';\nimport cx from 'classnames';\nimport CloseIcon from './CloseIcon';\nimport { FocusTrap } from './FocusTrap';\nimport { modalManager, useModalManager } from './modalManager';\nimport { useScrollLock } from './useScrollLock';\nimport { isBrowser } from './utils';\nimport useForwardedRef from '@bedrock-layout/use-forwarded-ref';\n\nconst classes = {\n root: 'react-responsive-modal-root',\n overlay: 'react-responsive-modal-overlay',\n overlayAnimationIn: 'react-responsive-modal-overlay-in',\n overlayAnimationOut: 'react-responsive-modal-overlay-out',\n modalContainer: 'react-responsive-modal-container',\n modalContainerCenter: 'react-responsive-modal-containerCenter',\n modal: 'react-responsive-modal-modal',\n modalAnimationIn: 'react-responsive-modal-modal-in',\n modalAnimationOut: 'react-responsive-modal-modal-out',\n closeButton: 'react-responsive-modal-closeButton',\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 * Default to true.\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 * Element to focus when focus trap is used.\n *\n * Default to undefined.\n */\n initialFocusRef?: React.RefObject<HTMLElement>;\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 | null;\n /**\n * An object containing classNames to style the modal.\n */\n classNames?: {\n root?: string;\n overlay?: string;\n overlayAnimationIn?: string;\n overlayAnimationOut?: string;\n modalContainer?: string;\n modal?: string;\n modalAnimationIn?: string;\n modalAnimationOut?: string;\n closeButton?: string;\n closeIcon?: string;\n };\n /**\n * An object containing the styles objects to style the modal.\n */\n styles?: {\n root?: React.CSSProperties;\n overlay?: React.CSSProperties;\n modalContainer?: 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 300.\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 * Avoid unpleasant flickering effect when body overflow is hidden. For more information see https://www.npmjs.com/package/body-scroll-lock \n */\n reserveScrollBarGap?: boolean;\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 = React.forwardRef(\n (\n {\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 initialFocusRef = undefined,\n animationDuration = 300,\n classNames,\n styles,\n role = 'dialog',\n ariaDescribedby,\n ariaLabelledby,\n modalId,\n onClose,\n onEscKeyDown,\n onOverlayClick,\n onAnimationEnd,\n children,\n reserveScrollBarGap,\n }: ModalProps,\n ref: React.ForwardedRef<HTMLDivElement>\n ) => {\n const refDialog = useForwardedRef(ref);\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 // The value should be false for srr, that way when the component is hydrated client side,\n // it will match the server rendered content\n const [showPortal, setShowPortal] = useState(false);\n\n // Hook used to manage multiple modals opened at the same time\n useModalManager(refModal, open);\n\n // Hook used to manage the scroll\n useScrollLock(refModal, open, showPortal, blockScroll, reserveScrollBarGap);\n\n const handleOpen = () => {\n if (\n refContainer.current &&\n !container &&\n !document.body.contains(refContainer.current)\n ) {\n document.body.appendChild(refContainer.current);\n }\n\n document.addEventListener('keydown', handleKeydown);\n };\n\n const handleClose = () => {\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 (event.keyCode !== 27 || !modalManager.isTopModal(refModal)) {\n return;\n }\n\n onEscKeyDown?.(event);\n\n if (closeOnEsc) {\n onClose();\n }\n };\n\n useEffect(() => {\n return () => {\n if (showPortal) {\n // When the modal is closed or removed directly, cleanup the listeners\n handleClose();\n }\n };\n }, [showPortal]);\n\n useEffect(() => {\n // If the open prop is changing, we need to open the modal\n // This is also called on the first render if the open prop is true when the modal is created\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 onOverlayClick?.(event);\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 handleAnimationEnd = () => {\n if (!open) {\n setShowPortal(false);\n }\n\n onAnimationEnd?.();\n };\n\n const containerModal = container || refContainer.current;\n\n const overlayAnimation = open\n ? classNames?.overlayAnimationIn ?? classes.overlayAnimationIn\n : classNames?.overlayAnimationOut ?? classes.overlayAnimationOut;\n\n const modalAnimation = open\n ? classNames?.modalAnimationIn ?? classes.modalAnimationIn\n : classNames?.modalAnimationOut ?? classes.modalAnimationOut;\n\n return showPortal && containerModal\n ? ReactDom.createPortal(\n <div\n className={cx(classes.root, classNames?.root)}\n style={styles?.root}\n data-testid=\"root\"\n >\n <div\n className={cx(classes.overlay, classNames?.overlay)}\n data-testid=\"overlay\"\n aria-hidden={true}\n style={{\n animation: `${overlayAnimation} ${animationDuration}ms`,\n ...styles?.overlay,\n }}\n />\n <div\n ref={refModal}\n className={cx(\n classes.modalContainer,\n center && classes.modalContainerCenter,\n classNames?.modalContainer\n )}\n style={styles?.modalContainer}\n data-testid=\"modal-container\"\n onClick={handleClickOverlay}\n >\n <div\n ref={refDialog}\n className={cx(classes.modal, classNames?.modal)}\n style={{\n animation: `${modalAnimation} ${animationDuration}ms`,\n ...styles?.modal,\n }}\n onMouseDown={handleModalEvent}\n onMouseUp={handleModalEvent}\n onClick={handleModalEvent}\n onAnimationEnd={handleAnimationEnd}\n id={modalId}\n role={role}\n aria-modal=\"true\"\n aria-labelledby={ariaLabelledby}\n aria-describedby={ariaDescribedby}\n data-testid=\"modal\"\n tabIndex={-1}\n >\n {focusTrapped && (\n <FocusTrap\n container={refDialog}\n initialFocusRef={initialFocusRef}\n />\n )}\n {children}\n {showCloseIcon && (\n <CloseIcon\n classes={classes}\n classNames={classNames}\n styles={styles}\n closeIcon={closeIcon}\n onClick={onClose}\n id={closeIconId}\n />\n )}\n </div>\n </div>\n </div>,\n containerModal\n )\n : null;\n }\n);\n\nexport default Modal;\n"],"names":["CloseIcon","classes","classNames","styles","id","closeIcon","onClick","React","className","cx","closeButton","style","width","height","viewBox","d","isBrowser","window","candidateSelectors","isHidden","node","offsetParent","getComputedStyle","visibility","getCheckedRadio","nodes","form","i","length","checked","isNotRadioOrTabbableRadio","tagName","type","name","radioScope","ownerDocument","radioSet","querySelectorAll","undefined","getAllTabbingElements","parentElem","currentActiveElement","document","activeElement","tabbableNodes","join","onlyTabbable","disabled","getTabindex","push","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","initialFocusRef","refLastFocus","useRef","useEffect","handleKeyEvent","current","addEventListener","savePreviousFocus","findIndex","selector","matches","requestAnimationFrame","removeEventListener","modals","modalManager","add","newModal","remove","oldModal","filter","modal","isTopModal","useModalManager","ref","open","useScrollLock","refModal","showPortal","blockScroll","reserveScrollBarGap","oldRef","disableBodyScroll","enableBodyScroll","root","overlay","overlayAnimationIn","overlayAnimationOut","modalContainer","modalContainerCenter","modalAnimationIn","modalAnimationOut","Modal","forwardRef","center","closeOnEsc","closeOnOverlayClick","showCloseIcon","closeIconId","focusTrapped","animationDuration","role","ariaDescribedby","ariaLabelledby","modalId","onClose","onEscKeyDown","onOverlayClick","onAnimationEnd","children","refDialog","useForwardedRef","refShouldClose","refContainer","createElement","useState","setShowPortal","handleOpen","body","appendChild","handleKeydown","handleClose","removeChild","keyCode","handleClickOverlay","handleModalEvent","handleAnimationEnd","containerModal","overlayAnimation","modalAnimation","ReactDom","createPortal","animation","onMouseDown","onMouseUp"],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const useScrollLock: (refModal: React.RefObject<Element>, open: boolean, showPortal: boolean, blockScroll: boolean, reserveScrollBarGap?: boolean | undefined) => void;
|
package/dist/utils.d.ts
CHANGED