Skip to content

Commit 6bd86b8

Browse files
eirikbackerBarsnesmimarz
authored
fix(Dialog): used closedby prop to align with upcoming browser standards (#3281)
* fix(Dialog): used closedby prop to align with upcoming browser standards * Create cool-dancers-prove.md * docs: update closedby story content * chore: lint and format * Update .changeset/cool-dancers-prove.md Co-authored-by: Tobias Barsnes <[email protected]> * fix missed story rename --------- Co-authored-by: Tobias Barsnes <[email protected]> Co-authored-by: Michael Marszalek <[email protected]>
1 parent 9ac2ce7 commit 6bd86b8

File tree

6 files changed

+35
-24
lines changed

6 files changed

+35
-24
lines changed

.changeset/cool-dancers-prove.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@digdir/designsystemet-react": patch
3+
---
4+
5+
**Dialog**: Remove `backdropClose`, and replace with `closedby="none | closerequest | any"` to align with [upcoming browser standard](https://chromestatus.com/feature/5097714453577728)

apps/_components/src/ColorModal/ColorModal.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -45,10 +45,10 @@ export const ColorModal = ({
4545
return (
4646
<Dialog
4747
ref={colorModalRef}
48+
closedby='any'
4849
style={{
4950
maxWidth: '1100px',
5051
}}
51-
backdropClose
5252
>
5353
<Dialog.Block>
5454
<Heading data-size='xs'>

apps/theme/components/TokenModal/TokenModal.tsx

+1-1
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ export const TokenModal = () => {
6565
className={classes.modal}
6666
style={{ maxWidth: 1000 }}
6767
ref={modalRef}
68-
backdropClose={true}
68+
closedby='any'
6969
>
7070
<Dialog.Block>
7171
<Heading className={classes.modalHeader} data-size='2xs'>

packages/react/src/components/Dialog/Dialog.mdx

+3-3
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ const dialogRef = useRef<HTMLDialogElement>(null);
5959

6060
### Close on backdrop click
6161

62-
Vi bruker `backdropClose={true}` proppen for å lukke dialogen når brukeren klikker utenfor.
63-
Dette funker kun dersom du har `modal={true}`, fordi en non-modla har ikke et backdrop.
62+
Vi bruker `closedby="any"` proppen for å lukke dialogen når brukeren klikker utenfor.
63+
Dette funker kun dersom du har `modal={true}`, fordi en non-modal har ikke et backdrop.
6464

65-
<Canvas of={DialogStories.BackdropClose} />
65+
<Canvas of={DialogStories.BackdropClosedbyAny} />
6666

6767
### Med `Block`
6868

packages/react/src/components/Dialog/Dialog.stories.tsx

+6-4
Original file line numberDiff line numberDiff line change
@@ -127,14 +127,16 @@ export const DialogWithOpenProp: StoryFn<typeof Dialog> = (args) => {
127127
);
128128
};
129129

130-
export const BackdropClose: StoryFn<typeof Dialog> = () => {
130+
export const BackdropClosedbyAny: StoryFn<typeof Dialog> = () => {
131131
const dialogRef = useRef<HTMLDialogElement>(null);
132132

133133
return (
134134
<Dialog.TriggerContext>
135135
<Dialog.Trigger>Open Dialog</Dialog.Trigger>
136-
<Dialog ref={dialogRef} backdropClose>
137-
<Heading>Dialog med backdropClose og en veldig lang tittel</Heading>
136+
<Dialog ref={dialogRef} closedby='any'>
137+
<Heading>
138+
Dialog med <code>closedby="any"</code> og en veldig lang tittel
139+
</Heading>
138140
<Paragraph>
139141
Lorem ipsum dolor sit, amet consectetur adipisicing elit. Blanditiis
140142
doloremque obcaecati assumenda odio ducimus sunt et.
@@ -189,7 +191,7 @@ export const DialogWithForm: StoryFn<typeof Dialog> = () => {
189191
return (
190192
<Dialog.TriggerContext>
191193
<Dialog.Trigger>Open Dialog</Dialog.Trigger>
192-
<Dialog ref={dialogRef} onClose={() => setInput('')} backdropClose>
194+
<Dialog ref={dialogRef} onClose={() => setInput('')} closedby='any'>
193195
<Heading style={{ marginBottom: 'var(--ds-size-2)' }}>
194196
Dialog med skjema
195197
</Heading>

packages/react/src/components/Dialog/Dialog.tsx

+19-15
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,11 @@ export type DialogProps = MergeRight<
1818
*/
1919
closeButton?: string | false;
2020
/**
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"`.
2322
*
24-
* @default false
23+
* @default 'closerequest'
2524
*/
26-
backdropClose?: boolean;
25+
closedby?: 'none' | 'closerequest' | 'any';
2726
/**
2827
* Toogle modal and non-modal dialog.
2928
*
@@ -78,10 +77,10 @@ export const Dialog = forwardRef<HTMLDialogElement, DialogProps>(
7877
children,
7978
className,
8079
closeButton = 'Lukk dialogvindu',
80+
closedby = 'closerequest',
8181
modal = true,
82-
open,
8382
onClose,
84-
backdropClose = false,
83+
open,
8584
...rest
8685
},
8786
ref,
@@ -96,13 +95,16 @@ export const Dialog = forwardRef<HTMLDialogElement, DialogProps>(
9695

9796
useEffect(() => {
9897
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"
104106
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') {
106108
const { top, left, right, bottom } = dialog.getBoundingClientRect();
107109
const isInDialog = top <= y && y <= bottom && left <= x && x <= right;
108110

@@ -116,12 +118,14 @@ export const Dialog = forwardRef<HTMLDialogElement, DialogProps>(
116118
};
117119

118120
dialog?.addEventListener('animationend', handleAutoFocus);
119-
dialog?.addEventListener('click', handleBackdropClick);
121+
dialog?.addEventListener('click', handleClosedby);
122+
dialog?.addEventListener('keydown', handleClosedby);
120123
return () => {
121124
dialog?.removeEventListener('animationend', handleAutoFocus);
122-
dialog?.removeEventListener('click', handleBackdropClick);
125+
dialog?.removeEventListener('click', handleClosedby);
126+
dialog?.removeEventListener('keydown', handleClosedby);
123127
};
124-
}, [backdropClose]);
128+
}, [closedby]);
125129

126130
/* handle closing */
127131
useEffect(() => {

0 commit comments

Comments
 (0)