@@ -7,12 +7,16 @@ import { modalManager, useModalManager } from './modalManager';
7
7
import { isBrowser , blockNoScroll , unblockNoScroll } from './utils' ;
8
8
9
9
const classes = {
10
+ root : 'react-responsive-modal-root' ,
10
11
overlay : 'react-responsive-modal-overlay' ,
12
+ overlayAnimationIn : 'react-responsive-modal-overlay-in' ,
13
+ overlayAnimationOut : 'react-responsive-modal-overlay-out' ,
14
+ modalContainer : 'react-responsive-modal-container' ,
15
+ modalContainerCenter : 'react-responsive-modal-containerCenter' ,
11
16
modal : 'react-responsive-modal-modal' ,
12
- modalCenter : 'react-responsive-modal-modalCenter' ,
17
+ modalAnimationIn : 'react-responsive-modal-modal-in' ,
18
+ modalAnimationOut : 'react-responsive-modal-modal-out' ,
13
19
closeButton : 'react-responsive-modal-closeButton' ,
14
- animationIn : 'react-responsive-modal-fadeIn' ,
15
- animationOut : 'react-responsive-modal-fadeOut' ,
16
20
} ;
17
21
18
22
export interface ModalProps {
@@ -74,18 +78,24 @@ export interface ModalProps {
74
78
* An object containing classNames to style the modal.
75
79
*/
76
80
classNames ?: {
81
+ root ?: string ;
77
82
overlay ?: string ;
83
+ overlayAnimationIn ?: string ;
84
+ overlayAnimationOut ?: string ;
85
+ modalContainer ?: string ;
78
86
modal ?: string ;
87
+ modalAnimationIn ?: string ;
88
+ modalAnimationOut ?: string ;
79
89
closeButton ?: string ;
80
90
closeIcon ?: string ;
81
- animationIn ?: string ;
82
- animationOut ?: string ;
83
91
} ;
84
92
/**
85
93
* An object containing the styles objects to style the modal.
86
94
*/
87
95
styles ?: {
96
+ root ?: React . CSSProperties ;
88
97
overlay ?: React . CSSProperties ;
98
+ modalContainer ?: React . CSSProperties ;
89
99
modal ?: React . CSSProperties ;
90
100
closeButton ?: React . CSSProperties ;
91
101
closeIcon ?: React . CSSProperties ;
@@ -146,7 +156,7 @@ export const Modal = ({
146
156
closeIconId,
147
157
closeIcon,
148
158
focusTrapped = true ,
149
- animationDuration = 500 ,
159
+ animationDuration = 300 ,
150
160
classNames,
151
161
styles,
152
162
role = 'dialog' ,
@@ -179,6 +189,7 @@ export const Modal = ({
179
189
if ( blockScroll ) {
180
190
blockNoScroll ( ) ;
181
191
}
192
+
182
193
if (
183
194
refContainer . current &&
184
195
! container &&
@@ -198,6 +209,7 @@ export const Modal = ({
198
209
) {
199
210
unblockNoScroll ( ) ;
200
211
}
212
+
201
213
if (
202
214
refContainer . current &&
203
215
! container &&
@@ -264,10 +276,6 @@ export const Modal = ({
264
276
refShouldClose . current = false ;
265
277
} ;
266
278
267
- const handleClickCloseIcon = ( ) => {
268
- onClose ( ) ;
269
- } ;
270
-
271
279
const handleAnimationEnd = ( ) => {
272
280
if ( ! open ) {
273
281
setShowPortal ( false ) ;
@@ -278,52 +286,71 @@ export const Modal = ({
278
286
279
287
const containerModal = container || refContainer . current ;
280
288
289
+ const overlayAnimation = open
290
+ ? classNames ?. overlayAnimationIn ?? classes . overlayAnimationIn
291
+ : classNames ?. overlayAnimationOut ?? classes . overlayAnimationOut ;
292
+
293
+ const modalAnimation = open
294
+ ? classNames ?. modalAnimationIn ?? classes . modalAnimationIn
295
+ : classNames ?. modalAnimationOut ?? classes . modalAnimationOut ;
296
+
281
297
return showPortal && containerModal
282
298
? ReactDom . createPortal (
283
299
< div
284
- style = { {
285
- animation : `${
286
- open
287
- ? classNames ?. animationIn ?? classes . animationIn
288
- : classNames ?. animationOut ?? classes . animationOut
289
- } ${ animationDuration } ms`,
290
- ...styles ?. overlay ,
291
- } }
292
- className = { cx ( classes . overlay , classNames ?. overlay ) }
293
- onClick = { handleClickOverlay }
294
- onAnimationEnd = { handleAnimationEnd }
295
- data-testid = "overlay"
300
+ className = { cx ( classes . root , classNames ?. root ) }
301
+ style = { styles ?. root }
302
+ data-testid = "root"
296
303
>
297
304
< div
298
- ref = { refModal }
305
+ className = { cx ( classes . overlay , classNames ?. overlay ) }
306
+ data-testid = "overlay"
307
+ aria-hidden = { true }
308
+ style = { {
309
+ animation : `${ overlayAnimation } ${ animationDuration } ms` ,
310
+ ...styles ?. overlay ,
311
+ } }
312
+ />
313
+ < div
299
314
className = { cx (
300
- classes . modal ,
301
- center && classes . modalCenter ,
302
- classNames ?. modal
315
+ classes . modalContainer ,
316
+ center && classes . modalContainerCenter ,
317
+ classNames ?. modalContainer
303
318
) }
304
- style = { styles ?. modal }
305
- onMouseDown = { handleModalEvent }
306
- onMouseUp = { handleModalEvent }
307
- onClick = { handleModalEvent }
308
- id = { modalId }
309
- role = { role }
310
- aria-modal = "true"
311
- aria-labelledby = { ariaLabelledby }
312
- aria-describedby = { ariaDescribedby }
313
- data-testid = "modal"
319
+ style = { styles ?. modalContainer }
320
+ data-testid = "modal-container"
321
+ onClick = { handleClickOverlay }
314
322
>
315
- { focusTrapped && < FocusTrap container = { refModal } /> }
316
- { children }
317
- { showCloseIcon && (
318
- < CloseIcon
319
- classes = { classes }
320
- classNames = { classNames }
321
- styles = { styles }
322
- closeIcon = { closeIcon }
323
- onClickCloseIcon = { handleClickCloseIcon }
324
- id = { closeIconId }
325
- />
326
- ) }
323
+ < div
324
+ ref = { refModal }
325
+ className = { cx ( classes . modal , classNames ?. modal ) }
326
+ style = { {
327
+ animation : `${ modalAnimation } ${ animationDuration } ms` ,
328
+ ...styles ?. modal ,
329
+ } }
330
+ onMouseDown = { handleModalEvent }
331
+ onMouseUp = { handleModalEvent }
332
+ onClick = { handleModalEvent }
333
+ onAnimationEnd = { handleAnimationEnd }
334
+ id = { modalId }
335
+ role = { role }
336
+ aria-modal = "true"
337
+ aria-labelledby = { ariaLabelledby }
338
+ aria-describedby = { ariaDescribedby }
339
+ data-testid = "modal"
340
+ >
341
+ { focusTrapped && < FocusTrap container = { refModal } /> }
342
+ { children }
343
+ { showCloseIcon && (
344
+ < CloseIcon
345
+ classes = { classes }
346
+ classNames = { classNames }
347
+ styles = { styles }
348
+ closeIcon = { closeIcon }
349
+ onClick = { onClose }
350
+ id = { closeIconId }
351
+ />
352
+ ) }
353
+ </ div >
327
354
</ div >
328
355
</ div > ,
329
356
containerModal
0 commit comments