Browse Source

Improve a11y of docs

* Add placeholder/label to input on homepage demo
* Mark sections with aria-expanded

![screenshot of markup with aria-expanded for sections](https://user-images.githubusercontent.com/6820/36941651-2f851bee-1f15-11e8-8090-e93e596b3d11.png)
main
Sophie Alpert 7 years ago
parent
commit
96010b5d97
  1. 4
      content/home/examples/an-application.js
  2. 178
      src/templates/components/Sidebar/Section.js

4
content/home/examples/an-application.js

@ -13,6 +13,8 @@ class TodoApp extends React.Component {
<TodoList items={this.state.items} /> <TodoList items={this.state.items} />
<form onSubmit={this.handleSubmit}> <form onSubmit={this.handleSubmit}>
<input <input
aria-label="Add a new to-do item"
placeholder="Add a to-do..."
onChange={this.handleChange} onChange={this.handleChange}
value={this.state.text} value={this.state.text}
/> />
@ -56,4 +58,4 @@ class TodoList extends React.Component {
} }
} }
ReactDOM.render(<TodoApp />, mountNode); ReactDOM.render(<TodoApp />, mountNode);

178
src/templates/components/Sidebar/Section.js

@ -10,94 +10,104 @@ import isItemActive from 'utils/isItemActive';
import MetaTitle from '../MetaTitle'; import MetaTitle from '../MetaTitle';
import ChevronSvg from '../ChevronSvg'; import ChevronSvg from '../ChevronSvg';
const Section = ({ class Section extends React.Component {
activeItemId, state = {uid: ('' + Math.random()).replace(/\D/g, '')};
createLink, render() {
isActive, const {
isScrollSync, activeItemId,
location, createLink,
onLinkClick, isActive,
onSectionTitleClick, isScrollSync,
section, location,
}) => ( onLinkClick,
<div> onSectionTitleClick,
<button section,
css={{ } = this.props;
cursor: 'pointer', const uid = 'section_' + this.state.uid;
backgroundColor: 'transparent', return (
border: 0, <div>
marginTop: 10, <button
}} aria-expanded={isActive}
onClick={onSectionTitleClick}> aria-controls={uid}
<MetaTitle css={{
cssProps={{ cursor: 'pointer',
[media.greaterThan('small')]: { backgroundColor: 'transparent',
color: isActive ? colors.text : colors.subtle, border: 0,
marginTop: 10,
':hover': {
color: colors.text,
},
},
}}>
{section.title}
<ChevronSvg
cssProps={{
marginLeft: 7,
transform: isActive ? 'rotateX(180deg)' : 'rotateX(0deg)',
transition: 'transform 0.2s ease',
[media.lessThan('small')]: {
display: 'none',
},
}} }}
/> onClick={onSectionTitleClick}>
</MetaTitle> <MetaTitle
</button> cssProps={{
<ul [media.greaterThan('small')]: {
css={{ color: isActive ? colors.text : colors.subtle,
marginBottom: 10,
':hover': {
color: colors.text,
},
},
}}>
{section.title}
<ChevronSvg
cssProps={{
marginLeft: 7,
transform: isActive ? 'rotateX(180deg)' : 'rotateX(0deg)',
transition: 'transform 0.2s ease',
[media.greaterThan('small')]: { [media.lessThan('small')]: {
display: isActive ? 'block' : 'none', display: 'none',
}, },
}}> }}
{section.items.map(item => ( />
<li </MetaTitle>
key={item.id} </button>
<ul
id={uid}
css={{ css={{
marginTop: 5, marginBottom: 10,
[media.greaterThan('small')]: {
display: isActive ? 'block' : 'none',
},
}}> }}>
{createLink({ {section.items.map(item => (
isActive: isScrollSync <li
? activeItemId === item.id key={item.id}
: isItemActive(location, item), css={{
item, marginTop: 5,
location, }}>
onLinkClick, {createLink({
section, isActive: isScrollSync
})} ? activeItemId === item.id
: isItemActive(location, item),
item,
location,
onLinkClick,
section,
})}
{item.subitems && ( {item.subitems && (
<ul css={{marginLeft: 20}}> <ul css={{marginLeft: 20}}>
{item.subitems.map(subitem => ( {item.subitems.map(subitem => (
<li key={subitem.id}> <li key={subitem.id}>
{createLink({ {createLink({
isActive: isScrollSync isActive: isScrollSync
? activeItemId === subitem.id ? activeItemId === subitem.id
: isItemActive(location, subitem), : isItemActive(location, subitem),
item: subitem, item: subitem,
location, location,
onLinkClick, onLinkClick,
section, section,
})} })}
</li> </li>
))} ))}
</ul> </ul>
)} )}
</li> </li>
))} ))}
</ul> </ul>
</div> </div>
); );
}
}
export default Section; export default Section;

Loading…
Cancel
Save