Skip to content
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鈥檒l occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: improve search/clear a11y #281

Merged
merged 5 commits into from Mar 12, 2019
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.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions README.md
Expand Up @@ -58,6 +58,7 @@ import { Picker } from 'emoji-mart'
#### I18n
```js
search: 'Search',
clear: 'Clear', // Accessible label on "clear" button
notfound: 'No Emoji Found',
skintext: 'Choose your default skin tone',
categories: {
Expand Down
30 changes: 27 additions & 3 deletions css/emoji-mart.css
Expand Up @@ -102,12 +102,22 @@
outline: 0;
}

.emoji-mart-search input,
.emoji-mart-search input::-webkit-search-decoration,
.emoji-mart-search input::-webkit-search-cancel-button,
.emoji-mart-search input::-webkit-search-results-button,
.emoji-mart-search input::-webkit-search-results-decoration {
/* remove webkit/blink styles for <input type="search">
* via https://stackoverflow.com/a/9422689 */
-webkit-appearance: none;
}

.emoji-mart-search-icon {
position: absolute;
top: 9px;
right: 16px;
top: 7px;
right: 11px;
z-index: 2;
padding: 0;
padding: 2px 5px 1px;
border: none;
background: none;
}
Expand Down Expand Up @@ -369,3 +379,17 @@
.emoji-mart-skin-tone-4 { background-color: #bf8f68 }
.emoji-mart-skin-tone-5 { background-color: #9b643d }
.emoji-mart-skin-tone-6 { background-color: #594539 }

/* For screenreaders only, via https://stackoverflow.com/a/19758620 */
.emoji-mart-sr-only {
position: absolute;
width: 1px;
height: 1px;
padding: 0;
margin: -1px;
overflow: hidden;
clip: rect(0, 0, 0, 0);
border: 0;
}


1 change: 1 addition & 0 deletions src/components/picker/nimble-picker.js
Expand Up @@ -18,6 +18,7 @@ import { PickerDefaultProps } from '../../utils/shared-default-props'

const I18N = {
search: 'Search',
clear: 'Clear', // Accessible label on "clear" button
notfound: 'No Emoji Found',
skintext: 'Choose your default skin tone',
categories: {
Expand Down
20 changes: 17 additions & 3 deletions src/components/search.js
Expand Up @@ -4,12 +4,15 @@ import PropTypes from 'prop-types'
import { search as icons } from '../svgs'
import NimbleEmojiIndex from '../utils/emoji-index/nimble-emoji-index'

let id = 0

export default class Search extends React.PureComponent {
constructor(props) {
super(props)
this.state = {
icon: icons.search,
isSearching: false,
id: ++id,
}

this.data = props.data
Expand Down Expand Up @@ -46,6 +49,7 @@ export default class Search extends React.PureComponent {
clear() {
if (this.input.value == '') return
this.input.value = ''
this.input.focus()
this.search('')
}

Expand All @@ -64,22 +68,32 @@ export default class Search extends React.PureComponent {
}

render() {
var { i18n, autoFocus } = this.props
var { icon, isSearching } = this.state
const { i18n, autoFocus } = this.props
const { icon, isSearching, id } = this.state
const inputId = `emoji-mart-search-${id}`

return (
<div className="emoji-mart-search">
<input
id={inputId}
ref={this.setRef}
type="text"
type="search"
onChange={this.handleChange}
placeholder={i18n.search}
autoFocus={autoFocus}
/>
{/*
* Use a <label> in addition to the placeholder for accessibility, but place it off-screen
* http://www.maxability.co.in/2016/01/placeholder-attribute-and-why-it-is-not-accessible/
*/}
<label className="emoji-mart-sr-only" htmlFor={inputId}>
{i18n.search}
</label>
<button
className="emoji-mart-search-icon"
onClick={this.clear}
onKeyUp={this.handleKeyUp}
aria-label={i18n.clear}
disabled={!isSearching}
>
{icon()}
Expand Down