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 🙏

© 2025 – Pkg Stats / Ryan Hefner

bounce-keys

v1.0.0

Published

Library to add support for the bounce keys accessibility feature on web elements like text input fields.

Readme

bounce-keys

A JavaScript/TypeScript implementation of the Bounce Keys accessibility feature (see Wikipedia).

Inspired by the OS-level accessibility feature called Bounce Keys in GNOME and Chrome OS, and FilterKeys on Windows, this is a platform-agnostic implementation for the web.

bounce-keys is headless. It's unopinionated about design, and does not affect your design visually.

Use Cases

bounce-keys is primarily designed for developers who:

  • manage a website or application that runs on web standards (ex. Electron app)
  • are aware that a significant portion of their user base have impaired motor skills and would benefit from debounced key presses when entering text.

What bounce-keys can do, on a technical level:

  • Debounce keyboard input on any DOM element in your website or application that you can attach a keydown event listener to.
  • Accept configuration - bounce window (milliseconds, provided or configured in your application), whether interleaving keys interrupts debounce, and an ignore list of key codes.
  • Be initialized multiple times to be used on different DOM elements, if your design benefits from this somehow.
  • Optionally, emit events on block, if your application can benefit from them.

What bounce-keys cannot or does not do:

  • Decorate your UI visually in any way, including any indicators to the user that debounce is active.
  • Accept user preferences of any sort, such as allowing the end user to configure bounce window. This is best handled by your application and supplied to this library.

Usage

Import

If importing into a package built using Node, first import like this.

const { BounceKeys } = require("bounce-keys");  // From a CommonJS project
import { BounceKeys } from "bounce-keys";  // From an ES Modules project

Vanilla JS/TS

See docs/ for a basic demo of a vanilla JS implementation.

JavaScript

// Can vary based on your development environment
import { BounceKeys } from "bounce-keys";

const bk = new BounceKeys({ bounceWindow: 750, repeatOnly: true });
const el = document.querySelector("input#my-text-box");

// keydown preferred, but any event that fires KeyboardEvent should work
el.addEventListener("keydown", bk);

HTML

<input type="text" id="my-text-box"/>

Svelte

bounce-keys does not have idiomatic support for Svelte, but can be used via the use directive. Here's an example of basic usage on a single input, in TypeScript.

<script lang="ts">
  import { BounceKeys } from "bounce-keys";

	const bk = new BounceKeys({ bounceWindow: 750, repeatOnly: true });
	function enableBounceKeys(inputEl: HTMLElement) {  // HTMLElement type only required in TypeScript
		inputEl.addEventListener("keydown", bk);
	}
</script>

<input type="text" use:enableBounceKeys/>

React

bounce-keys does not have idiomatic support for React, but can be used via refs. Here's an example of basic usage on a single input.

import { BounceKeys } from "bounce-keys"
import { useRef } from "react";

function MyComponent() {
  const bk = new BounceKeys({ bounceWindow: 750, repeatOnly: true });

  const inputRef = useRef(null);
  if (inputRef.current) {
    inputRef.current.addEventListener("keydown", bk);
  }

  return (
    <div className="my-component">
      <input type="text" ref={inputRef}/>
    </div>
  );
}

Block Events

Optionally, you can ask bounce-keys to emit events when keys are blocked, in case this is helpful to your application. One use would be to play custom audio cues.

Listen for the "bounce-keys:blocked" event on your input element. In vanilla JS/TS, this would look like:

const bk = new BounceKeys({ bounceWindow: 750, shouldEmitBlockEvents: true });
const el = document.querySelector("input#my-text-box");
el.addEventListener("keydown", bk);
el.addEventListener("bounce-keys:blocked", event => { doWhatYouWant(event); });

The event contains info about which keypress was blocked. Read it by accessing event.detail.code. Values will be string values of the code attribute in KeyboardEvents dispatched by the user's input.

Parameters

bounce-keys supports up to four props, one of which is required.

| Prop | Type | Documentation | |---|---|---| | bounceWindow | number | Time window in milliseconds to run the bounce check in. For ex. if set to 1000, the same key won't register if it was pressed in the last 1 second. The window is reset on each press. | | repeatOnly | boolean (optional) | If true, only successive repeats are blocked. For ex. typing "aaaaa" successively will register only one press, but typing "ababa" will register five times. | | shouldEmitBlockEvents | boolean (optional) | If true, emits a custom event "bounce-keys:blocked" when a key press is blocked. Useful for adding custom behavior like audio cues. | | ignoredKeyCodes | string[] \| Set<string> (optional) | Array or set of key code strings that this library will ignore in its block logic. bounce-type relies on the code property of KeyboardEvents. See on MDN. |