A tiny Svelte 5 attachment for keyboard shortcuts. Bind global key combos with a single {@attach ...} and get automatic cleanup.
- Works with the new
{@attach ...}syntax - Adds/removes the window
keydownlistener automatically - Shortcut strings look like
Ctrl+Shift+K - Fully typed with helper shortcut types
npm install @akcodeworks/svelte-listen
# pnpm add @akcodeworks/svelte-listen
# yarn add @akcodeworks/svelte-listenPeer dependency: svelte@^5.0.0.
<script lang="ts">
import { listener } from '@akcodeworks/svelte-listen';
</script>
<button
{@attach listener({
Enter: (e) => {
e.preventDefault();
console.log('Pressed Enter anywhere');
},
'Ctrl+Shift+K': () => console.log('Pressed Ctrl+Shift+K')
})}
>
Press me
</button>The attachment will:
- Register a global
keydownlistener for any shortcuts you specify. - Clean everything up automatically when the element is destroyed.
Shortcut keys use the KeyboardEvent.key names and a +-separated list of modifiers:
- Single key:
"Escape","K","F2","ArrowUp" - With modifiers:
"Ctrl+K","Alt+ArrowDown","Ctrl+Shift+L"
Use uppercase letters for single-character keys; the helper normalizes casing for you.
listener<T extends HTMLElement>(shortcuts?: ShortcutHandlers): Attachment<T>
shortcuts: A map ofShortcutStringto handler.- Returns a Svelte attachment that can be used with
{@attach ...}on any element. The element reference is unused but required by Svelte's{@attach ...}contract.
Types are exported for convenience:
import type { ShortcutString, KeyboardEventKey, ShortcutHandlers } from '@akcodeworks/svelte-listen';- Install deps:
npm install - Run the demo app:
npm run dev -- --open - Tests:
npm test - Lint/format:
npm run lintandnpm run format - Build package:
npm run build(runssvelte-packageandpublint)
- Keyboard shortcuts are bound at
windowlevel onkeydown. - Call
event.preventDefault()inside your shortcut handler if you need to suppress the browser default for that key combo.