npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

onkey-event-manager

v1.0.0

Published

Easily map onKey functions to keyboard events

Downloads

7

Readme

onkey-event-manager

npm npm bundle size (minified) npm A project badge feature text "PRs Welcome"

🗝 Easily map onKey functions to keyboard events

Basics

onkey-event-manager simplifies the process of listening for and acting on key changes.

import onKey from 'onkey-event-manager'

const OpenButton = ({ open }) => (
  <button onKeyDown={onKey({ ArrowDown: open })}>Open</button>
)

Install

Add onkey-event-manager to your project:

npm install --save onkey-event-manager
# or
yarn add onkey-event-manager

Use

Import the default onKey function from onkey-event-manager and add it to your code:

...
import onKey from 'onkey-event-manager'

function Button({ onClick }) {
    return (
        <button
            onClick={onClick}
            onKeyDown={onKey({ ArrowDown: onClick })}
        >
            <code>onClick</code> will fire when I am clicked
            or when I'm focused and you press the down arrow.
        </button>
    )
}

Why?

JavaScript provides three keyboard events to trigger actions: keydown, keyup, and keypress. In order to listen to specific keys, you need to pass a function that takes an event and compares the event.key to the desired key like so:

Traditional React example

function Accordion(props) {
  const [isOpen, setIsOpen] = React.useState(false)

  function open() {
    setIsOpen(true)
  }

  function openOnArrowDown(event) {
    if (event.key === 'ArrowDown') {
      open()
    }
  }

  return (
    <div>
      <h2>{props.title}</h2>
      <button
        aria-label={'Toggle accordion'}
        onClick={open}
        onKeyDown={openOnArrowDown}
      >
        ▾
      </button>
      {isOpen && <div>{props.children}</div>}
    </div>
  )
}

This is fine but becomes cumbersome when trying to make complex user interfaces accessible with multiple keyboard interactions.

onkey-event-manager abstracts the event key filtering logic, simplifying the process of listening for keys.

API

Version 1+ of onkey-event-manager comprises a single default export: onKey.

onKey()

onKey is a simple function that listens for an event, compares it to a set of selected keys, then calls the action and passes the event object if there is a match.

onKey(Object<String, Function>)

If there is a single key you want to listen for, pass an object inline with computed property names:

<button onKeyDown={onKey({ ArrowDown: openMenu })} >

For more complex listening, consider calling the function outside of the return to keep your JSX clean:

function SelectOption(props) {
  const handleKeyDown = onKey({
    ArrowUp: props.decrementIndex,
    ArrowDown: props.incrementIndex
  })
  return <li onKeyDown={handleKeyDown}>{props.children}</li>
}

Author

Sean McPherson

License

MIT