Events triggered on complex mouse and keyboard interactions.
Inspired by mousetrap
, hyper-interactive
is more flexible - It allows any key to act as a modifier, has parentheses and not operations, and allows to combine your event formulas in an almost infinite number of ways.
npm install hyper-interactive
import HyperInteractive from "hyper-interactive";
const hyper = new HyperInteractive();
You can add events using .addInteractions()
or a single event using .addInteraction()
.
hyper.addInteraction({
formula: "a",
reaction: () => alert("a key was pressed!")
});
Additionally you can check the latest event with .check()
hyper.check("space", "keydown);
You can get quite complex with you interaction codes, allowing you to enter sequences and combinations of keys
hyper.addInteractions([
{
formula: "space+b",
reaction: () => alert("spacebar and b keys were both pressed!")
},
{
formula: "[|]",
reaction: () => alert("[ or ] key was pressed!")
},
{
formula: "k o n a m i",
reaction: () => alert("konami was typed!")
},
{
formula: "esc+(k o n a m i)",
reaction: () => alert("konami was typed whilst holding the escape key!")
}
]);
Using a +
symbol you can create an event when a combination of keys are pressed. This is not just limited to the standard modifier keys but can be any key combination. The following are all valid formulas.
shift+a
a+b
space+F10
Using the |
you can create an or operator. The formula a|b
will trigger an event if either a
or b
is pressed.
You can create an event based on a sequence of key presses using a space inbetween codes. You can even combine it with the syntax above. Try the following.
h e l l o
space+(h e l l o)
a b+c d|e f g
You can use brackets to control the order of evaluation.
For example a+(b|c|d)
will check a
is pressed and any of b
, c
, or d
is pressed.
(a+b)|c|d
will check if a
and b
are pressed together or c
or c
are pressed on their own.
An !
can be used to exclude keys. !(a|b)
will fire any time a key is pressed that is not a
or b
. You could use this in combination, a+b+!c+!d
will be triggered if a
and b
are down but only if c
and d
are not.
You can use any KeyEvent.code
value as a key, along with the following aliases, all case insensitive. A KeyEvent.keyCode
fallback has been provided for older browsers.
KeyCode | Description |
---|---|
* , any | Any |
shift | ShiftLeft or ShiftRight |
ctrl , control | ControlLeft or ControlRight |
alt , opt , option | AltLeft or AltRight |
meta , cmd , command | MetaLeft or MetaRight |
mod , modifier | Meta for Apple devices, Control for others |
esc , escape | Escape |
_ , space | Space |
del | Backspace or Delete |
up | ArrowUp |
down | ArrowDown |
left | ArrowLeft |
right | ArrowRight |
- | Minus |
= | Equal |
[ | BracketLeft |
] | BracketRight |
; | Semicolon |
' | Quote |
\ | Backslash |
, | Comma |
. | Period |
/ | Slash |
0-9 | Digit0-Digit9 |
a-z | KeyA-KeyZ |
While we patiently wait for Keyboard.getLayoutMap()
you can pass different keyboard maps via the third argument of the HyperInteractive
constructor.
new HyperInteractive({target, interactions, keyboardMap, getTarget})
Additionally you can use .addKeyCodes()
to create additional key codes. These can use any formula value. For example.
hyper.addKeyCodes({
"?": "shift+/",
"save": "mod+s"
})
You can use getTarget
in the constructor to define custom target for events. This can allow you to select your own elements when using Canvas / WebGL.
const getTarget = event => (event.target === canvas ? getCanvasTarget() : event.target);
new HyperInteractive({target, interactions, keyboardMap, getTarget})
- add mouse / pointer events
- provide additional keyboard layouts