From 4fa5dfd3afce96007b9446085540794dbfbe1c88 Mon Sep 17 00:00:00 2001 From: Tamlyn Rhodes <tamlyn@tamlyn.org> Date: Wed, 6 Dec 2017 16:00:57 +0000 Subject: [PATCH] Improve accessibility of form controls --- packages/ui/src/atoms/Checkbox.local.scss | 4 +++- packages/ui/src/atoms/Menu.js | 14 +++++++++++++- packages/ui/src/atoms/Radio.local.scss | 3 ++- packages/ui/test/__snapshots__/Menu.test.js.snap | 1 + 4 files changed, 19 insertions(+), 3 deletions(-) diff --git a/packages/ui/src/atoms/Checkbox.local.scss b/packages/ui/src/atoms/Checkbox.local.scss index 3c66c3b3a..8349ddc71 100644 --- a/packages/ui/src/atoms/Checkbox.local.scss +++ b/packages/ui/src/atoms/Checkbox.local.scss @@ -21,8 +21,9 @@ } .root .input { - display: none; margin-right: 0.25rem; + opacity: 0; + position: absolute; } .root span::before { @@ -37,6 +38,7 @@ width: 9px; } +.root input:focus + span::before, .root:hover span::before { //background-size: 100%; background: var(--color-primary); diff --git a/packages/ui/src/atoms/Menu.js b/packages/ui/src/atoms/Menu.js index e1e23a051..ff22b84d5 100644 --- a/packages/ui/src/atoms/Menu.js +++ b/packages/ui/src/atoms/Menu.js @@ -30,6 +30,12 @@ class Menu extends React.Component { this.props.onChange(selected) } + handleKeyPress = (event, selected) => { + if (event.which === 13) { + this.handleSelect(selected) + } + } + optionLabel = value => { const { options } = this.props @@ -48,7 +54,7 @@ class Menu extends React.Component { > {label && <span className={classes.label}>{label}</span>} - <div className={classes.main}> + <div className={classes.main} role="listbox"> <div className={classes.openerContainer}> <button className={classes.opener} @@ -69,11 +75,17 @@ class Menu extends React.Component { <div className={classes.options}> {options.map(option => ( <div + aria-selected={option.value === selected} className={classnames(classes.option, { [classes.active]: option.value === selected, })} key={option.value} onClick={() => this.handleSelect(option.value)} + onKeyPress={event => + this.handleKeyPress(event, option.value) + } + role="option" + tabIndex="0" > {option.label || option.value} </div> diff --git a/packages/ui/src/atoms/Radio.local.scss b/packages/ui/src/atoms/Radio.local.scss index 49f699cb1..c0bd14541 100644 --- a/packages/ui/src/atoms/Radio.local.scss +++ b/packages/ui/src/atoms/Radio.local.scss @@ -34,7 +34,8 @@ // hide the input .input { - display: none; + opacity: 0; + position: absolute; } /* pseudo-input */ diff --git a/packages/ui/test/__snapshots__/Menu.test.js.snap b/packages/ui/test/__snapshots__/Menu.test.js.snap index dfbe9ad31..b487f640b 100644 --- a/packages/ui/test/__snapshots__/Menu.test.js.snap +++ b/packages/ui/test/__snapshots__/Menu.test.js.snap @@ -6,6 +6,7 @@ exports[`Menu Snapshot 1`] = ` > <div className="main" + role="listbox" > <div className="openerContainer" -- GitLab