Skip to content

Commit c9de462

Browse files
committed
Improve accordion accessibility
1 parent c45aa2b commit c9de462

2 files changed

Lines changed: 46 additions & 39 deletions

File tree

‎routes/content-guidelines/components/guideline-accordion.scss‎

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,26 @@
44
.content-guidelines__accordion {
55
padding: $grid-unit-20 $grid-unit-30;
66

7+
&-trigger {
8+
display: block;
9+
width: 100%;
10+
background: none;
11+
border: none;
12+
padding: 0;
13+
margin: 0;
14+
cursor: pointer;
15+
text-align: left;
16+
height: auto;
17+
18+
&:focus {
19+
box-shadow: none !important;
20+
}
21+
22+
&:focus-visible {
23+
box-shadow: 0 0 0 var(--wp-admin-border-width-focus) var(--wp-admin-theme-color, #3858e9) !important;
24+
}
25+
}
26+
727
&-chevron-up {
828
transition: transform 0.3s ease-in-out;
929
transform: rotate(180deg);
@@ -15,9 +35,6 @@
1535
}
1636
}
1737

18-
.content-guidelines__accordion-header-container {
19-
cursor: pointer;
20-
}
2138

2239
.content-guidelines__accordion-header {
2340
color: $gray-900;

‎routes/content-guidelines/components/guideline-accordion.tsx‎

Lines changed: 26 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
* WordPress dependencies
33
*/
44
import {
5-
Button,
65
Icon,
76
__experimentalText as Text,
87
__experimentalHeading as Heading,
98
__experimentalVStack as VStack,
109
__experimentalHStack as HStack,
1110
Card,
11+
Button,
1212
} from '@wordpress/components';
1313
import { __, sprintf } from '@wordpress/i18n';
1414
import { chevronDown } from '@wordpress/icons';
@@ -32,10 +32,25 @@ export default function GuidelineAccordion( {
3232

3333
return (
3434
<Card className="content-guidelines__accordion">
35-
<VStack
36-
spacing={ 4 }
35+
<Button
36+
className="content-guidelines__accordion-trigger"
3737
onClick={ () => setIsOpen( ! isOpen ) }
38-
className="content-guidelines__accordion-header-container"
38+
aria-expanded={ isOpen }
39+
aria-controls={ contentId }
40+
aria-describedby={ descriptionId }
41+
aria-label={
42+
isOpen
43+
? sprintf(
44+
/* translators: %s: Guideline title */
45+
__( 'Collapse %s guidelines' ),
46+
title
47+
)
48+
: sprintf(
49+
/* translators: %s: Guideline title */
50+
__( 'Expand %s guidelines' ),
51+
title
52+
)
53+
}
3954
>
4055
<HStack spacing={ 4 }>
4156
<VStack spacing={ 1 }>
@@ -58,42 +73,17 @@ export default function GuidelineAccordion( {
5873
{ description }
5974
</Text>
6075
</VStack>
61-
<Button
62-
icon={
63-
<Icon
64-
icon={ chevronDown }
65-
className={
66-
isOpen
67-
? 'content-guidelines__accordion-chevron-up'
68-
: 'content-guidelines__accordion-chevron-down'
69-
}
70-
/>
71-
}
72-
onClick={ (
73-
event: React.MouseEvent< HTMLButtonElement >
74-
) => {
75-
event.stopPropagation();
76-
setIsOpen( ! isOpen );
77-
} }
78-
aria-expanded={ isOpen }
79-
aria-controls={ contentId }
80-
aria-label={
76+
<Icon
77+
icon={ chevronDown }
78+
className={
8179
isOpen
82-
? sprintf(
83-
/* translators: %s: Guideline title */
84-
__( 'Collapse %s guidelines' ),
85-
title
86-
)
87-
: sprintf(
88-
/* translators: %s: Guideline title */
89-
__( 'Expand %s guidelines' ),
90-
title
91-
)
80+
? 'content-guidelines__accordion-chevron-up'
81+
: 'content-guidelines__accordion-chevron-down'
9282
}
9383
/>
9484
</HStack>
95-
</VStack>
96-
{ isOpen && children }
85+
</Button>
86+
<div hidden={ ! isOpen }>{ children }</div>
9787
</Card>
9888
);
9989
}

0 commit comments

Comments
 (0)