wkkkis-hooks

use-keypress (use-keypress)

Tracks the user's keyboard combinations and key presses.

v0.1.0

Usage

import { use-keypress } from "@/hooks"
1"use client"; 2 3import React from "react"; 4 5import confetti from "canvas-confetti"; 6 7import { 8 Card, 9 CardContent, 10 CardDescription, 11 CardHeader, 12 CardTitle, 13} from "@/components/ui/card"; 14 15import { useKeypress } from "@/components/hooks/use-keypress"; 16 17export function UseKeypressDemo() { 18 const popStars = () => { 19 const defaults = { 20 spread: 360, 21 ticks: 50, 22 gravity: 0, 23 decay: 0.94, 24 startVelocity: 30, 25 colors: ["#FFE400", "#FFBD00", "#E89400", "#FFCA6C", "#FDFFB8"], 26 }; 27 28 const shoot = () => { 29 confetti({ 30 ...defaults, 31 particleCount: 40, 32 scalar: 1.2, 33 shapes: ["star"], 34 }); 35 36 confetti({ 37 ...defaults, 38 particleCount: 10, 39 scalar: 0.75, 40 shapes: ["circle"], 41 }); 42 }; 43 44 setTimeout(shoot, 0); 45 setTimeout(shoot, 100); 46 setTimeout(shoot, 200); 47 }; 48 49 useKeypress({ 50 combo: ["ctrl+m", "meta+m"], 51 callback: (e) => { 52 popStars(); 53 }, 54 preventDefault: true, 55 }); 56 57 return ( 58 <Card className="relative max-w-sm w-full"> 59 <CardHeader> 60 <CardTitle>useKeypress</CardTitle> 61 <CardDescription> 62 This component uses the <code>useKeypress</code> hook to detect key 63 combinations. 64 </CardDescription> 65 </CardHeader> 66 <CardContent className="space-y-2"> 67 <p>Press Ctrl+M (Windows/Linux) or Cmd+M (Mac) to see some magic.</p> 68 </CardContent> 69 </Card> 70 ); 71} 72

Install

npx wkkkis-hooks add use-keypress

Options

NameTypeDefaultDescription
combostringnullThe combination of keys to listen for
callbackfunctionnullThe callback to be called when the key or combination is pressed
preventDefaultbooleanfalseIf true, the event will be prevented from propagating
targetHTMLElementnullThe target element to listen for the key or combination

Combo Normalization & Modifiers

  • The combo string is case-insensitive and order-insensitive for modifiers.
  • Supported modifiers: ctrl , alt , shift , meta (for Command on Mac, Windows key on Windows).
  • Example: "Ctrl+Shift+S" , "shift+ctrl+s" , and "CTRL+s+SHIFT" are all equivalent.
  • Only one non-modifier key is supported per combo (e.g., "ctrl+s" is valid, "ctrl+s+d" is not).

Multiple Combos

  • The combo prop can be a string or an array of strings. If an array, the callback fires for any matching combo.
  • Example: combo: ['ctrl+s', 'meta+s'] will trigger for either combination.

Target Element

  • By default, the hook listens on window , but you can specify a target HTMLElement (e.g., an input or div).
  • For best performance, use a stable reference (e.g., from useRef ) for the target. Changing the target frequently will cause listeners to be re-attached.

Performance Notes

  • The hook memoizes normalized combos and the event handler for efficiency.
  • Listeners are automatically cleaned up when the component unmounts or the target changes.

Event Handling

  • The hook listens for the keydown event.
  • If preventDefault is true, the default browser action is prevented for the matching combo.
  • The callback receives the original KeyboardEvent .

Caveats & Best Practices

  • Only one non-modifier key is supported per combo.
  • Modifier order does not matter, but all specified modifiers must be pressed.
  • The hook is designed for keyboard shortcuts, not for general key tracking (e.g., holding multiple non-modifier keys).

Files in this hook

SourceDestination
files/use-keypress.tssrc/hooks/use-keypress.ts