ArrowKeyNavigation
A higher-order component for arrow key navigation on a grouping of children.
ArrowKeyNavigation is designed not to care about the component types it is wrapping. Due to this, you can pass whatever HTML tag you like into props.component
or even a React component you've made elsewhere. Additional props passed to <ArrowKeyNavigation ...>
will be forwarded on to the component or HTML tag name you've supplied.
The children, similarly, can be any type of component.
Example Usage
import React from 'react';
import ArrowKeyNavigation from '../index';
export default class ArrowKeyNavigationDemo extends React.PureComponent {
state = {
items: ['lorem', 'ipsum', 'dolor'],
}
render() {
return (
<div className='spread'>
<section>
<h6>Horizontal-only</h6>
<ArrowKeyNavigation className='demo-loose-list' mode={ArrowKeyNavigation.mode.HORIZONTAL}>
{this.state.items.map((item) => <span key={item}>{item}</span>)}
</ArrowKeyNavigation>
</section>
<section>
<h6>Vertical-only</h6>
<ArrowKeyNavigation component='ul' mode={ArrowKeyNavigation.mode.VERTICAL}>
{this.state.items.map((item) => <li key={item}>{item}</li>)}
</ArrowKeyNavigation>
</section>
<section>
<h6>Both directions</h6>
<ArrowKeyNavigation component='ol' mode={ArrowKeyNavigation.mode.BOTH}>
{this.state.items.map((item) => <li key={item}>{item}</li>)}
</ArrowKeyNavigation>
</section>
<section>
<h6>Second child active by default</h6>
<ArrowKeyNavigation component='ul' mode={ArrowKeyNavigation.mode.VERTICAL} defaultActiveChildIndex={1}>
{this.state.items.map((item) => <li key={item}>{item}</li>)}
</ArrowKeyNavigation>
</section>
<section>
<h6>Ignored child (horizontal rule)</h6>
<ArrowKeyNavigation>
<div>lorem</div>
<hr tabIndex='-1' />
<div>dolor</div>
</ArrowKeyNavigation>
</section>
</div>
);
}
}
Props
Note: only top-level props are in the README, for the full list check out the website.
Required Props
There are no required props.
Optional Props
-
*
・ any React-supported attribute
Expects | Default Value
any
| n/a
-
component
・ any valid HTML tag name or a React component factory, anything that can be passed as the first argument to React.createElement
Expects | Default Value
string or function
| 'div'
-
defaultActiveChildIndex
・ allows for a particular child to be initially reachable via tabbing; only applied during first render
Expects | Default Value
number
| 0
-
mode
・ controls which arrow key events are captured to move active focus within the list:
Mode | Keys |
---|
ArrowKeyNavigation.mode.BOTH | ⬅️ ➡️ ⬆️ ⬇️ |
ArrowKeyNavigation.mode.HORIZONTAL | ⬅️ ➡️ |
ArrowKeyNavigation.mode.VERTICAL | ⬆️ ⬇️ |
Note: focus loops when arrowing past one of the boundaries; tabbing moves the user away from the list.
Expects | Default Value
ArrowKeyNavigation.mode.BOTH or ArrowKeyNavigation.mode.HORIZONTAL or ArrowKeyNavigation.mode.VERTICAL
| ArrowKeyNavigation.mode.BOTH