Launch Week Day 1: Socket for Jira Is Now Available.Learn More
Socket
Book a DemoSign in
Socket

bounce-keys

Package Overview
Dependencies
Maintainers
0
Versions
1
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

bounce-keys

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

latest
Source
npmnpm
Version
1.0.0
Version published
Maintainers
0
Created
Source

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.

PropTypeDocumentation
bounceWindownumberTime 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.
repeatOnlyboolean (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.
shouldEmitBlockEventsboolean (optional)If true, emits a custom event "bounce-keys:blocked" when a key press is blocked. Useful for adding custom behavior like audio cues.
ignoredKeyCodesstring[] | 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.

FAQs

Package last updated on 28 Feb 2025

Did you know?

Socket

Socket for GitHub automatically highlights issues in each pull request and monitors the health of all your open source dependencies. Discover the contents of your packages and block harmful activity before you install or update your dependencies.

Install

Related posts