From 94be72ccdf599a9b1855b462b8212a28b8fa04be Mon Sep 17 00:00:00 2001 From: Anna Wen <54281166+annawen1@users.noreply.github.com> Date: Tue, 17 May 2022 17:08:26 -0400 Subject: [PATCH] fix(ComposedModal): fix focus trap and refocus to trigger element when closed (#11418) * fix(ComposedModal): fix focus trap and refocus to trigger when closed * fix(ComposedModal): add style and updated snapshot --- .../src/components/modal/_modal.scss | 4 ++ .../ComposedModal/ComposedModal-story.js | 16 ++++++-- .../components/ComposedModal/ComposedModal.js | 38 ++++++++++--------- .../__snapshots__/ComposedModal-test.js.snap | 31 ++++++++------- .../styles/scss/components/modal/_modal.scss | 4 ++ 5 files changed, 58 insertions(+), 35 deletions(-) diff --git a/packages/components/src/components/modal/_modal.scss b/packages/components/src/components/modal/_modal.scss index 818e131c8dcc..eb3ffaa1ea76 100644 --- a/packages/components/src/components/modal/_modal.scss +++ b/packages/components/src/components/modal/_modal.scss @@ -106,6 +106,10 @@ @include carbon--breakpoint(xlg) { width: 48%; } + + .#{$prefix}--modal-container-body { + display: contents; + } } // ----------------------------- diff --git a/packages/react/src/components/ComposedModal/ComposedModal-story.js b/packages/react/src/components/ComposedModal/ComposedModal-story.js index 2765668f831a..601143729f90 100644 --- a/packages/react/src/components/ComposedModal/ComposedModal-story.js +++ b/packages/react/src/components/ComposedModal/ComposedModal-story.js @@ -5,7 +5,7 @@ * LICENSE file in the root directory of this source tree. */ -import React, { useState } from 'react'; +import React, { useState, useRef } from 'react'; import ReactDOM from 'react-dom'; import { action } from '@storybook/addon-actions'; import { @@ -275,6 +275,7 @@ export const PassiveModal = () => { }; export const WithStateManager = () => { + const closeButton = useRef(); /** * Simple state manager for modals. */ @@ -298,10 +299,19 @@ export const WithStateManager = () => { return ( ( - + )}> {({ open, setOpen }) => ( - setOpen(false)}> + { + setOpen(false); + setTimeout(() => { + closeButton.current.focus(); + }); + }}>

diff --git a/packages/react/src/components/ComposedModal/ComposedModal.js b/packages/react/src/components/ComposedModal/ComposedModal.js index 3ab738fc3d07..3830d66372db 100644 --- a/packages/react/src/components/ComposedModal/ComposedModal.js +++ b/packages/react/src/components/ComposedModal/ComposedModal.js @@ -286,36 +286,38 @@ export default class ComposedModal extends Component { } } }} + aria-hidden={!open} onBlur={this.handleBlur} onClick={this.handleClick} onKeyDown={this.handleKeyDown} onTransitionEnd={open ? this.handleTransitionEnd : undefined} className={modalClass}> - {/* Non-translatable: Focus-wrap code makes this `` not actually read by screen readers */} - - Focus sentinel -

- {childrenWithProps} + {/* Non-translatable: Focus-wrap code makes this `` not actually read by screen readers */} + +
+ {childrenWithProps} +
+ {/* Non-translatable: Focus-wrap code makes this `
- {/* Non-translatable: Focus-wrap code makes this `` not actually read by screen readers */} - - Focus sentinel - ); } diff --git a/packages/react/src/components/ComposedModal/__snapshots__/ComposedModal-test.js.snap b/packages/react/src/components/ComposedModal/__snapshots__/ComposedModal-test.js.snap index df472ab51e85..a6dd382ca45e 100644 --- a/packages/react/src/components/ComposedModal/__snapshots__/ComposedModal-test.js.snap +++ b/packages/react/src/components/ComposedModal/__snapshots__/ComposedModal-test.js.snap @@ -7,6 +7,7 @@ exports[` renders 1`] = ` selectorPrimaryFocus="[data-modal-primary-focus]" >
renders 1`] = ` open={true} role="presentation" > - - Focus sentinel -
- - Focus sentinel - + +
+ +
`; diff --git a/packages/styles/scss/components/modal/_modal.scss b/packages/styles/scss/components/modal/_modal.scss index bd722a0fb445..70c3e817f899 100644 --- a/packages/styles/scss/components/modal/_modal.scss +++ b/packages/styles/scss/components/modal/_modal.scss @@ -108,6 +108,10 @@ @include breakpoint(xlg) { width: 48%; } + + .#{$prefix}--modal-container-body { + display: contents; + } } // -----------------------------