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

stimulus-hotkeys

v2.3.0

Published

A Stimulus controller for mapping keystrokes to behaviors

Downloads

3,196

Readme

  • Simple: with only one parameter, this is a drop-in, code-free solution
  • Backend Agnostic: 100% client-side
  • Flexible: built on the amazing HotKeys.js library
  • Idempotent: compatible with Turbolinks by design
  • MIT Licensed: free for personal and commercial use

Built for StimulusJS

This Stimulus controller allows you to map keystrokes to methods in your Stimulus controllers using a simple JSON object. This is an easy way to create shortcut keys for your applications or capture input for games. Once registered in your Stimulus application, you can use it anywhere you like.

Here is a simple example, in which the user hits the "p" key and will see "PONG" on the console.

<div
  data-controller="hotkeys example"
  data-hotkeys-bindings-value='{"p": "example#ping"}'
></div>
// example_controller.js
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
  ping() {
    console.log('PONG')
  }
}

Yes, that's really it.

Passing parameters

As of version 2.1, you can now pass String, Number and Boolean arguments to your Stimulus controller method. Note that it is not possible to pass Objects at this time.

<body
  data-controller="hotkeys example"
  data-hotkeys-bindings-value='{"ctrl+y, command+y": "example#redo(hero, 666, true, \"false\", \"/path/to\")"}'
></body>
// example_controller.js
import { Controller } from '@hotwired/stimulus'
export default class extends Controller {
  redo() {
    console.log(arguments) // ['hero', 666, true, false, '/path/to']
  }
}

Preventing default actions

As of version 2.3, you can now use :prevent in your mapping to ensure that your key capture doesn't conflict with native browser behaviour.

<div
  data-controller="hotkeys example"
  data-hotkeys-bindings-value='{"ctrl+k": "example#ping"}'
></div>

Now, instead of jumping to the browser search bar, you can capture the key event.

Thanks to @norkunas for the suggestion.

Targeting Stimulus controllers on other elements

As of version 2.2, specifying a CSS selector to target an element containing a Stimulus controller is optional. It now defaults to assuming the hotkeys controller is on the same element as the controller receiving the mapping calls.

However, you can still use the -> syntax to send mapping calls to controllers on other elements:

<div
  data-controller="hotkeys"
  data-hotkeys-bindings-value='{"p": "#foo->example#ping"}'
></div>
<div id="foo" data-controller="example"></div>

Credit where credit is due

This package would be nothing without Hotkeys. Thank you, Kenny Wong!

Setup

Add stimulus-hotkeys to your main JS entry point or Stimulus controllers root folder:

import { Application } from '@hotwired/stimulus'
import Hotkeys from 'stimulus-hotkeys'

import { definitionsFromContext } from '@hotwired/stimulus-webpack-helpers'
const application = Application.start()
const context = require.context('../controllers', true, /\.js$/)
application.load(definitionsFromContext(context))

// Manually register Hotkeys as a Stimulus controller
application.register('hotkeys', Hotkeys)

HTML Markup

The data-hotkeys-bindings-value attribute accepts an object in valid JSON notation. This string will be parsed using JSON.parse() so make sure to validate everything going into the expression. I usually forget that you must use " characters in JSON. 🤡

Each key/value pair corresponds to a mapping. The key is the keystroke(s) you want to capture, and the value contains a path to the function you want to call when your user hits the key.

You will want to learn about possible key combinations on the Hotkeys project page.

The value borrows syntax from the Stimulus action system, with important differences:

selector->identifier#method(params)

selector performs a CSS selector lookup and must return an element which holds a Stimulus controller. (As of v2.2, this segment is optional.)

identifier is the Stimulus controller identifier, in kebab-case.

method is the function in the target Stimulus controller.

params is optional, and supports string, numeric and boolean parameters.

Note: this library is not raising events. If you want to receive events, you'll have to emit them yourself... but at some point, it'll probably be less complicated to just include hotkeys-js in your controller directly. This library is cool because the mapping is potentially dynamic.

Obtaining a reference to the Stimulus controller instance

I'm usually a huge fan of putting a reference to the controller on the element holding the controller, but this library literally has no functions which can be called from outside. If you're trying to do this, you're doing something very wrong.

Contributing

Bug reports and pull requests are welcome.

License

This package is available as open source under the terms of the MIT License.