-
Notifications
You must be signed in to change notification settings - Fork 646
Overlay: Add role="dialog", focus trap to Overlay
#4990
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Closed
Closed
Changes from all commits
Commits
Show all changes
8 commits
Select commit
Hold shift + click to select a range
cda82a1
Add `role="dialog", focus trap to `Overlay`
TylerJDev 5d95ac9
Add conditional, new prop
TylerJDev 3fa1904
Add `role` test for `Overlay`
TylerJDev 4d4f63b
Add `role="none"` to `Overlay` in autocomplete
TylerJDev 6ad6b65
Fix ts error
TylerJDev d5b5ec9
Add test
TylerJDev 67d1e54
Update docs
TylerJDev 5627e4f
Add changeset
TylerJDev File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,7 @@ | ||
| --- | ||
| '@primer/react': minor | ||
| --- | ||
|
|
||
| Overlay: Add `role="dialog"` and `aria-modal="true"` to the `Overlay` component, and implement a focus trap. | ||
|
|
||
|
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -13,6 +13,7 @@ import {useRefObjectAsForwardedRef} from '../hooks/useRefObjectAsForwardedRef' | |
| import type {AnchorSide} from '@primer/behaviors' | ||
| import {useTheme} from '../ThemeProvider' | ||
| import type {ForwardRefComponent as PolymorphicForwardRefComponent} from '../utils/polymorphic' | ||
| import {useFocusTrap} from '../hooks/useFocusTrap' | ||
|
|
||
| type StyledOverlayProps = { | ||
| width?: keyof typeof widthMap | ||
|
|
@@ -109,6 +110,7 @@ type BaseOverlayProps = { | |
| portalContainerName?: string | ||
| preventFocusOnOpen?: boolean | ||
| role?: AriaRole | ||
| focusTrap?: boolean | ||
|
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Added a new prop in case there's an implementation that wants to be a dialog, but doesn't want the focus trap applied. This is a very specific case, and ideally won't be necessary in more than a handful of instances. |
||
| children?: React.ReactNode | ||
| } | ||
|
|
||
|
|
@@ -133,12 +135,13 @@ type OwnOverlayProps = Merge<StyledOverlayProps, BaseOverlayProps> | |
| * @param bottom Optional. Vertical bottom position of the overlay, relative to its closest positioned ancestor (often its `Portal`). | ||
| * @param position Optional. Sets how an element is positioned in a document. Defaults to `absolute` positioning. | ||
| * @param portalContainerName Optional. The name of the portal container to render the Overlay into. | ||
| * @param focusTrap Optional. Determines if the `Overlay` recieves a focus trap or not. Defaults to `true`. | ||
| */ | ||
| const Overlay = React.forwardRef<HTMLDivElement, OwnOverlayProps>( | ||
| ( | ||
| { | ||
| onClickOutside, | ||
| role = 'none', | ||
| role, | ||
| initialFocusRef, | ||
| returnFocusRef, | ||
| ignoreClickRefs, | ||
|
|
@@ -155,6 +158,7 @@ const Overlay = React.forwardRef<HTMLDivElement, OwnOverlayProps>( | |
| preventFocusOnOpen, | ||
| position, | ||
| style: styleFromProps = {}, | ||
| focusTrap = true, | ||
| ...rest | ||
| }, | ||
| forwardedRef, | ||
|
|
@@ -200,12 +204,20 @@ const Overlay = React.forwardRef<HTMLDivElement, OwnOverlayProps>( | |
| // To be backwards compatible with the old Overlay, we need to set the left prop if x-position is not specified | ||
| const leftPosition: React.CSSProperties = left === undefined && right === undefined ? {left: 0} : {left} | ||
|
|
||
| const nonDialog = role && role !== 'dialog' ? true : false | ||
|
|
||
| useFocusTrap({ | ||
| containerRef: overlayRef, | ||
| disabled: !focusTrap || nonDialog, | ||
| }) | ||
|
|
||
| return ( | ||
| <Portal containerName={portalContainerName}> | ||
| <StyledOverlay | ||
| height={height} | ||
| width={width} | ||
| role={role} | ||
| role={role || 'dialog'} | ||
| aria-modal={nonDialog ? undefined : 'true'} | ||
| {...rest} | ||
| ref={overlayRef} | ||
| style={ | ||
|
|
||
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
should this be a boolean instead?