An open API service indexing awesome lists of open source software.

https://github.com/luqmanoop/use-kbd-list

Add full keyboard navigation support to your list component
https://github.com/luqmanoop/use-kbd-list

Last synced: about 2 months ago
JSON representation

Add full keyboard navigation support to your list component

Awesome Lists containing this project

README

          

# use-kbd-list

> Add full keyboard navigation support to your list components

Add `ArrowDown`, `ArrowUp`, `PageDown`, `PageUp`, `Home` & `End` keyboard support w/ smooth scrolling to your list component.

Live demo https://use-kbd-list.vercel.app

use-kbd-list

## Install

```sh
npm install use-kbd-list
```

## Example

```tsx
import { useKbdList } from "use-kbd-list";

function App() {
const {
ref, // scroll container ref
activeIndex, // index of the element navigated to
activeElement, // element navigated to
handleLeave, // handler function for the scroll container onMouseLeave, onPointerLeave event
handleMove // handler function for the list item onMouseMove, onPointerMove event
} = useKbdList(myList.length, "data-index");

console.log(activeElement?.textContent);

return (


    {myList.map((item, index) => (

  • {item}

  • ))}

);
}
```

## API

`useKbdList(listLength, listItemIndexAttribute, options)`

### listLength

The length of your list e.g. `users.length`

Type: `number`

Required: `true`

### listItemIndexAttribute

The name of an attribute set on the list item. You could use anything else other `data-index` as the attribute name

NOTE: **The value of this attribute must be the index of the list item in the list** e.g.

```tsx
const App = () => {
useKbdList(items, "data-index");

...

return (


    {items.map((item, index) => (

  • {item}

  • ))}

);
};
```

### options

`react-hotkeys-hooks` [options](https://github.com/JohannesKlauss/react-hotkeys-hook#options)

Type: `object`

Required: `false`

E.g. If you want the hook to run while an input is focused, like in a ComboBox

```tsx
useKbdList(myList.length, "data-index", {
enableOnFormTags: true
});
```