Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions .changeset/anchored-overlay-clever-mails-roll.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
---
"@primer/react": patch
---

AnchoredOverlay accessibility fixes
- `aria-expanded` attribute is removed from anchor when overlay is not open
- `tabIndex=0` is removed from anchor because it should only be used with interactive elements

3 changes: 1 addition & 2 deletions src/AnchoredOverlay/AnchoredOverlay.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -165,8 +165,7 @@ export const AnchoredOverlay: React.FC<AnchoredOverlayProps> = ({
ref: anchorRef,
id: anchorId,
'aria-haspopup': 'true',
'aria-expanded': open,
tabIndex: 0,
'aria-expanded': open ? 'true' : undefined,
onClick: onAnchorClick,
onKeyDown: onAnchorKeyDown
})}
Expand Down
4 changes: 2 additions & 2 deletions src/__tests__/ActionMenu.test.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -108,7 +108,7 @@ describe('ActionMenu', () => {
<SingleSelection />
</ThemeProvider>
)
const button = component.getByLabelText('Select field type')
const button = component.getByLabelText('Field type')
fireEvent.click(button)

// select first item by role, that would close the menu
Expand All @@ -127,7 +127,7 @@ describe('ActionMenu', () => {
<MixedSelection />
</ThemeProvider>
)
const button = component.getByLabelText('Select field type to group by')
const button = component.getByLabelText('Group by')
fireEvent.click(button)

expect(component.getByLabelText('Status')).toHaveAttribute('role', 'menuitemradio')
Expand Down
2 changes: 0 additions & 2 deletions src/__tests__/__snapshots__/ActionMenu.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -125,13 +125,11 @@ exports[`ActionMenu renders consistently 1`] = `
fontFamily="normal"
>
<button
aria-expanded={false}
aria-haspopup="true"
className="c1"
id="react-aria-1"
onClick={[Function]}
onKeyDown={[Function]}
tabIndex={0}
type="button"
>
<span
Expand Down
3 changes: 0 additions & 3 deletions src/__tests__/__snapshots__/AnchoredOverlay.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -80,13 +80,11 @@ exports[`AnchoredOverlay renders consistently 1`] = `
fontFamily="normal"
>
<button
aria-expanded={false}
aria-haspopup="true"
className="c1"
id="react-aria-1"
onClick={[Function]}
onKeyDown={[Function]}
tabIndex={0}
>
Anchor Button
</button>
Expand Down Expand Up @@ -203,7 +201,6 @@ exports[`AnchoredOverlay should render consistently when open 1`] = `
aria-haspopup="true"
class="c1"
id="react-aria-1"
tabindex="0"
>
Anchor Button
</button>
Expand Down
2 changes: 0 additions & 2 deletions src/__tests__/__snapshots__/SelectPanel.test.tsx.snap
Original file line number Diff line number Diff line change
Expand Up @@ -84,13 +84,11 @@ exports[`SelectPanel renders consistently 1`] = `
fontFamily="normal"
>
<button
aria-expanded={false}
aria-haspopup="true"
className="c1"
id="react-aria-1"
onClick={[Function]}
onKeyDown={[Function]}
tabIndex={0}
type="button"
>
Select Items
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -68,13 +68,11 @@ exports[`ActionMenu renders consistently 1`] = `
}

<button
aria-expanded={false}
aria-haspopup="true"
aria-label="menu"
className="c0"
id="react-aria-1"
onClick={[Function]}
onKeyDown={[Function]}
tabIndex={0}
/>
`;
Original file line number Diff line number Diff line change
Expand Up @@ -72,13 +72,11 @@ exports[`DropdownMenu renders consistently 1`] = `
}

<button
aria-expanded={false}
aria-haspopup="true"
className="c0"
id="react-aria-1"
onClick={[Function]}
onKeyDown={[Function]}
tabIndex={0}
type="button"
>
<svg
Expand Down
11 changes: 3 additions & 8 deletions src/stories/ActionList/examples.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ export function MultipleSelection(): JSX.Element {

<p>This pattern appears in issues and pull requests to pick multiple assignees</p>

<ActionList selectionVariant="multiple" showDividers role="listbox" aria-label="Select assignees">
<ActionList selectionVariant="multiple" showDividers role="listbox" aria-label="Assignees">
{users.map(user => (
<ActionList.Item
role="option"
Expand Down Expand Up @@ -192,7 +192,7 @@ export function Groups(): JSX.Element {

<p>Grouped content with labels and description. This patterns appears in pull requests to pick a reviewer.</p>

<ActionList selectionVariant="multiple" role="menu" showDividers aria-label="Select reviewers">
<ActionList selectionVariant="multiple" role="menu" showDividers aria-label="Reviewers">
<ActionList.Group title="Suggestions">
{users.slice(0, 2).map(user => (
<ActionList.Item
Expand Down Expand Up @@ -328,12 +328,7 @@ export function AsyncListWithSpinner(): JSX.Element {
{results.length === 0 ? (
<Text sx={{display: 'block', fontSize: 1, m: 2}}>No branches match that query</Text>
) : null}
<ActionList
selectionVariant="single"
role="listbox"
aria-label="Select a branch"
sx={{height: 208, overflow: 'auto'}}
>
<ActionList selectionVariant="single" role="listbox" aria-label="Branch" sx={{height: 208, overflow: 'auto'}}>
{loading ? (
<Box sx={{display: 'flex', justifyContent: 'center', pt: 2}}>
<Spinner />
Expand Down
4 changes: 2 additions & 2 deletions src/stories/ActionList/fixtures.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ export function DisabledStory(): JSX.Element {
<>
<h1>Disabled Items</h1>
<ErsatzOverlay>
<ActionList selectionVariant="single" showDividers role="menu" aria-label="Select a project">
<ActionList selectionVariant="single" showDividers role="menu" aria-label="Project">
{projects.map((project, index) => (
<ActionList.Item
key={index}
Expand Down Expand Up @@ -836,7 +836,7 @@ export function ChildWithSideEffects(): JSX.Element {
<>
<h1>Child with side effects</h1>
<ErsatzOverlay>
<ActionList selectionVariant="multiple" role="listbox" aria-label="Select assignees">
<ActionList selectionVariant="multiple" role="listbox" aria-label="Assignees">
<ActionList.Item selected={selected} onSelect={() => setSelected(!selected)} role="option">
<ActionList.LeadingVisual>
<Avatar src={`https://avatars.githubusercontent.com/${user.login}`} />
Expand Down
18 changes: 8 additions & 10 deletions src/stories/ActionMenu/examples.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,7 @@ export function SingleSelection(): JSX.Element {
<p>This pattern has a single section with the selected value shown in the button</p>

<ActionMenu>
<ActionMenu.Button aria-label="Select field type" leadingIcon={selectedType.icon}>
<ActionMenu.Button aria-label="Field type" leadingIcon={selectedType.icon}>
{selectedType.name}
</ActionMenu.Button>
<ActionMenu.Overlay width="medium">
Expand Down Expand Up @@ -122,7 +122,7 @@ export function SingleSelectionWithPlaceholder(): JSX.Element {
<p>This pattern has a placeholder in menu button when no value is selected yet</p>

<ActionMenu>
<ActionMenu.Button aria-label="Select field type" leadingIcon={selectedType.icon}>
<ActionMenu.Button aria-label="Field type" leadingIcon={selectedType.icon}>
{selectedType.name || 'Pick a field type'}
</ActionMenu.Button>
<ActionMenu.Overlay width="medium">
Expand Down Expand Up @@ -155,7 +155,8 @@ export function GroupsAndDescription(): JSX.Element {
<Box sx={{width: 200}}>
<ActionMenu>
<ActionMenu.Button
aria-label="Select a milestone"
aria-label="Milestone"
aria-describedby="selected-milestone"
variant="invisible"
trailingIcon={GearIcon}
sx={{
Expand Down Expand Up @@ -209,11 +210,11 @@ export function GroupsAndDescription(): JSX.Element {
</ActionMenu.Overlay>
</ActionMenu>
{selectedMilestone ? (
<Text as="div" color="fg.muted" sx={{fontSize: 1, mt: 2}}>
<Text as="div" id="selected-milestone" color="fg.muted" sx={{fontSize: 1, mt: 2}}>
{selectedMilestone.name}
</Text>
) : (
<Text as="div" color="fg.muted" sx={{fontSize: 1, mt: 2}}>
<Text as="div" id="selected-milestone" color="fg.muted" sx={{fontSize: 1, mt: 2}}>
No milestone
</Text>
)}
Expand Down Expand Up @@ -251,7 +252,7 @@ export function MultipleSelection(): JSX.Element {
<Box sx={{width: 200}}>
<ActionMenu>
<ActionMenu.Button
aria-label="Select assignees"
aria-label="Assignees"
variant="invisible"
trailingIcon={GearIcon}
sx={{
Expand Down Expand Up @@ -312,10 +313,7 @@ export function MixedSelection(): JSX.Element {
</p>

<ActionMenu>
<ActionMenu.Button
aria-label="Select field type to group by"
leadingIcon={selectedOption && selectedOption.icon}
>
<ActionMenu.Button aria-label="Group by" leadingIcon={selectedOption && selectedOption.icon}>
{selectedOption ? `Group by ${selectedOption.text}` : 'Group items by'}
</ActionMenu.Button>
<ActionMenu.Overlay width="medium">
Expand Down
10 changes: 5 additions & 5 deletions src/stories/ActionMenu/fixtures.stories.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -207,9 +207,9 @@ export function CustomAnchor(): JSX.Element {
<h2>Last option activated: {actionFired}</h2>
<ActionMenu>
<ActionMenu.Anchor>
<summary style={{cursor: 'pointer'}} aria-label="Open column options">
<button aria-label="Open column options">
<KebabHorizontalIcon />
</summary>
</button>
</ActionMenu.Anchor>
<ActionMenu.Overlay>
<ActionList>
Expand Down Expand Up @@ -505,7 +505,7 @@ export function MemexIteration(): JSX.Element {
color: 'fg.muted',
':hover, :focus': {background: 'none !important', color: 'accent.fg'}
}}
aria-label="Select iteration duration"
aria-label="Iteration duration"
>
{duration} {duration > 1 ? 'weeks' : 'week'}
</ActionMenu.Button>
Expand Down Expand Up @@ -548,7 +548,7 @@ export function MemexAddColumn(): JSX.Element {
</FormControl>
<ActionMenu>
<ActionMenu.Button
aria-label="Select field type"
aria-label="Field type"
leadingIcon={selectedType.icon}
sx={{
gridTemplateColumns: 'min-content 1fr min-content',
Expand Down Expand Up @@ -582,7 +582,7 @@ export function MemexAddColumn(): JSX.Element {
<ActionMenu>
<ActionMenu.Button
id="duration"
aria-label="Select field type"
aria-label="Field type"
sx={{
textAlign: 'left',
ml: 2,
Expand Down