@@ -18,12 +18,11 @@ export type DialogProps = MergeRight<
18
18
*/
19
19
closeButton ?: string | false ;
20
20
/**
21
- * Close on backdrop click.
22
- * Only works when `modal` is true.
21
+ * Light dismiss behavior, allowing to close on backdrop click by setting `closedby="any"`.
23
22
*
24
- * @default false
23
+ * @default 'closerequest'
25
24
*/
26
- backdropClose ?: boolean ;
25
+ closedby ?: 'none' | 'closerequest' | 'any' ;
27
26
/**
28
27
* Toogle modal and non-modal dialog.
29
28
*
@@ -78,10 +77,10 @@ export const Dialog = forwardRef<HTMLDialogElement, DialogProps>(
78
77
children,
79
78
className,
80
79
closeButton = 'Lukk dialogvindu' ,
80
+ closedby = 'closerequest' ,
81
81
modal = true ,
82
- open,
83
82
onClose,
84
- backdropClose = false ,
83
+ open ,
85
84
...rest
86
85
} ,
87
86
ref ,
@@ -96,13 +95,16 @@ export const Dialog = forwardRef<HTMLDialogElement, DialogProps>(
96
95
97
96
useEffect ( ( ) => {
98
97
const dialog = dialogRef . current ;
99
- const handleBackdropClick = ( {
100
- clientY : y ,
101
- clientX : x ,
102
- target,
103
- } : MouseEvent ) => {
98
+ const handleClosedby = ( event : Event ) => {
99
+ const { clientY : y , clientX : x , target } = event as MouseEvent ;
100
+ if ( event instanceof KeyboardEvent )
101
+ return (
102
+ closedby === 'none' &&
103
+ event . key === 'Escape' &&
104
+ event . preventDefault ( )
105
+ ) ; // Skip ESC-key if closedby="none"
104
106
if ( window . getSelection ( ) ?. toString ( ) ) return ; // Fix bug where if you select text spanning two divs it thinks you clicked outside
105
- if ( dialog && target === dialog && backdropClose ) {
107
+ if ( dialog && target === dialog && closedby === 'any' ) {
106
108
const { top, left, right, bottom } = dialog . getBoundingClientRect ( ) ;
107
109
const isInDialog = top <= y && y <= bottom && left <= x && x <= right ;
108
110
@@ -116,12 +118,14 @@ export const Dialog = forwardRef<HTMLDialogElement, DialogProps>(
116
118
} ;
117
119
118
120
dialog ?. addEventListener ( 'animationend' , handleAutoFocus ) ;
119
- dialog ?. addEventListener ( 'click' , handleBackdropClick ) ;
121
+ dialog ?. addEventListener ( 'click' , handleClosedby ) ;
122
+ dialog ?. addEventListener ( 'keydown' , handleClosedby ) ;
120
123
return ( ) => {
121
124
dialog ?. removeEventListener ( 'animationend' , handleAutoFocus ) ;
122
- dialog ?. removeEventListener ( 'click' , handleBackdropClick ) ;
125
+ dialog ?. removeEventListener ( 'click' , handleClosedby ) ;
126
+ dialog ?. removeEventListener ( 'keydown' , handleClosedby ) ;
123
127
} ;
124
- } , [ backdropClose ] ) ;
128
+ } , [ closedby ] ) ;
125
129
126
130
/* handle closing */
127
131
useEffect ( ( ) => {
0 commit comments