diff --git a/packages/components/CHANGELOG.md b/packages/components/CHANGELOG.md index 2f211094a4a37..c903989f45628 100644 --- a/packages/components/CHANGELOG.md +++ b/packages/components/CHANGELOG.md @@ -6,6 +6,10 @@ - `ColorPalette`, `BorderControl`: Don't hyphenate hex value in `aria-label` ([#52932](https://github.com/WordPress/gutenberg/pull/52932)). +### Bug Fix + +- `Modal`: Fix loss of focus when clicking outside ([#52653](https://github.com/WordPress/gutenberg/pull/52653)). + ## 25.4.0 (2023-07-20) ### Enhancements diff --git a/packages/components/src/modal/index.tsx b/packages/components/src/modal/index.tsx index d9c7b602b8392..7667a815561a8 100644 --- a/packages/components/src/modal/index.tsx +++ b/packages/components/src/modal/index.tsx @@ -170,6 +170,15 @@ function UnforwardedModal( [ hasScrolledContent ] ); + const onOverlayPress: React.PointerEventHandler< HTMLDivElement > = ( + event + ) => { + if ( event.target === event.currentTarget ) { + event.preventDefault(); + onRequestClose( event ); + } + }; + return createPortal( // eslint-disable-next-line jsx-a11y/no-static-element-interactions
{ await user.keyboard( '[Escape]' ); expect( onRequestClose ).toHaveBeenCalled(); } ); + + it( 'should return focus when dismissed by clicking outside', async () => { + const user = userEvent.setup(); + const ReturnDemo = () => { + const [ isShown, setIsShown ] = useState( false ); + return ( +
+ + { isShown && ( + setIsShown( false ) }> +

Modal content

+
+ ) } +
+ ); + }; + render( ); + + const opener = screen.getByRole( 'button' ); + await user.click( opener ); + const modalFrame = screen.getByRole( 'dialog' ); + expect( modalFrame ).toHaveFocus(); + + // Disable reason: No semantic query can reach the overlay. + // eslint-disable-next-line testing-library/no-node-access + await user.click( modalFrame.parentElement! ); + expect( opener ).toHaveFocus(); + } ); } );