TanStack Hotkeys supports multi-key sequences in Svelte, where keys are pressed one after another rather than simultaneously.
<script lang="ts">
import { createHotkeySequence } from '@tanstack/svelte-hotkeys'
createHotkeySequence(['G', 'G'], () => {
window.scrollTo({ top: 0, behavior: 'smooth' })
})
</script>
Use createHotkeySequenceAttachment when a sequence should only be active while a specific element owns focus.
<script lang="ts">
import { createHotkeySequenceAttachment } from '@tanstack/svelte-hotkeys'
const editorSequences = createHotkeySequenceAttachment(['G', 'G'], () => {
scrollToTop()
})
</script>
<div tabindex="0" {@attach editorSequences}>
Focus here, then press g then g
</div>
createHotkeySequence(['G', 'G'], callback, {
timeout: 1000,
enabled: true,
})
<script lang="ts">
import { createHotkeySequence } from '@tanstack/svelte-hotkeys'
let isVimMode = $state(true)
createHotkeySequence(
['G', 'G'],
() => scrollToTop(),
() => ({ enabled: isVimMode }),
)
</script>
<script lang="ts">
import { setHotkeysContext } from '@tanstack/svelte-hotkeys'
setHotkeysContext({
hotkeySequence: { timeout: 1500 },
})
</script>
createHotkeySequence(['G', 'G'], () => scrollToTop())
createHotkeySequence(['G', 'Shift+G'], () => scrollToBottom())
createHotkeySequence(['D', 'D'], () => deleteLine())
createHotkeySequence(['D', 'W'], () => deleteWord())
createHotkeySequence(['C', 'I', 'W'], () => changeInnerWord())
createHotkeySequence(
['ArrowUp', 'ArrowUp', 'ArrowDown', 'ArrowDown', 'B', 'A'],
() => enableEasterEgg(),
{ timeout: 2000 },
)
createHotkeySequence uses the singleton SequenceManager. You can also access it directly:
import {
createSequenceMatcher,
getSequenceManager,
} from '@tanstack/svelte-hotkeys'
const manager = getSequenceManager()
const matcher = createSequenceMatcher(['G', 'G'], { timeout: 1000 })