Skip to content

v-hotkey

Bind keyboard shortcuts to elements. Supports modifier keys and multiple hotkey formats.

Since: 1.3.0

Usage

Using Argument Syntax

vue
<template>
  <!-- Ctrl+S to save -->
  <input v-hotkey:ctrl.s="save" placeholder="Press Ctrl+S to save" />

  <!-- Escape to cancel -->
  <div v-hotkey:escape="cancel">Press Escape to cancel</div>

  <!-- Multiple modifiers -->
  <div v-hotkey:ctrl.shift.s="saveAs">Ctrl+Shift+S</div>
</template>

Using Object Syntax

vue
<template>
  <div
    v-hotkey="{
      'ctrl+s': save,
      'escape': cancel,
      'ctrl+z': undo
    }"
    tabindex="0"
  >
    Press Ctrl+S to save, Escape to cancel
  </div>
</template>

Using Array Syntax

vue
<template>
  <div v-hotkey="[
    { key: 's', modifiers: ['ctrl'], handler: save },
    { key: 'escape', handler: cancel }
  ]">
    Multiple hotkeys
  </div>
</template>

API

Types

typescript
type HotkeyHandler = (event: KeyboardEvent) => void

type ModifierKey = 'ctrl' | 'alt' | 'shift' | 'meta'

interface HotkeyDefinition {
  key: string
  modifiers?: ModifierKey[]
  handler: HotkeyHandler
  prevent?: boolean // default: true
  stop?: boolean // default: true
  disabled?: boolean // default: false
}

type HotkeyBinding =
  | HotkeyHandler
  | HotkeyDefinition
  | HotkeyDefinition[]
  | Record<string, HotkeyHandler | HotkeyDefinition>

Options

OptionTypeDefaultDescription
keystring-Key to listen for (e.g., 's', 'enter', 'escape')
modifiersModifierKey[][]Required modifier keys
handler(event: KeyboardEvent) => void-Handler function (required)
preventbooleantruePrevent default behavior
stopbooleantrueStop event propagation
disabledbooleanfalseDisable this hotkey

Key Aliases

AliasKey
escescape
space (space)
uparrowup
downarrowdown
leftarrowleft
rightarrowright
enterenter
tabtab
deletedelete
backspacebackspace
f1-f12Function keys

Examples

Editor Shortcuts

vue
<template>
  <div
    v-hotkey="{
      'ctrl+s': save,
      'ctrl+z': undo,
      'ctrl+y': redo,
      'ctrl+b': bold,
      'ctrl+i': italic
    }"
    class="editor"
    tabindex="0"
  >
    <textarea v-model="content"></textarea>
  </div>
</template>

Dynamic Hotkeys

vue
<template>
  <div v-hotkey="hotkeys" tabindex="0">
    Hotkeys: {{ enabled ? 'enabled' : 'disabled' }}
  </div>
</template>

<script setup>
import { computed } from 'vue'

const enabled = ref(true)

const hotkeys = computed(() => ({
  'ctrl+e': () => enabled.value = !enabled.value,
  'ctrl+d': enabled.value ? debug : null
}))
</script>

Composable API

For programmatic use, you can use the useHotkey composable:

typescript
import { useHotkey } from 'directix'

const { enabled, enable, disable, toggle, add, remove, clear } = useHotkey({
  hotkeys: [
    { key: 'ctrl+s', handler: (e) => save() },
    { key: 'ctrl+z', handler: (e) => undo() },
  ],
  target: document,
  enabled: true
})

// Control hotkeys
enable()
disable()
toggle()

// Add/remove hotkeys dynamically
add({ key: 'esc', handler: (e) => closeModal() })
remove('esc')
clear()

UseHotkeyOptions

OptionTypeDefaultDescription
hotkeyHotkeyDefinition-Single hotkey definition
hotkeysHotkeyDefinition[][]Multiple hotkey definitions
targetHTMLElement | RefdocumentTarget element to bind events
enabledboolean | Ref<boolean>trueWhether hotkeys are enabled

UseHotkeyReturn

PropertyTypeDescription
enabledRef<boolean>Whether hotkeys are enabled
enable() => voidEnable hotkeys
disable() => voidDisable hotkeys
toggle() => voidToggle hotkeys
add(hotkey: HotkeyDefinition) => voidAdd a hotkey
remove(key: string) => voidRemove a hotkey
clear() => voidRemove all hotkeys

Example

vue
<script setup>
import { useHotkey } from 'directix'

const { enable, disable, add, remove } = useHotkey({
  hotkeys: [
    { key: 'ctrl+s', handler: (e) => save() },
    { key: 'ctrl+z', handler: (e) => undo() },
  ]
})

// Add dynamic hotkey
add({ key: 'esc', handler: (e) => closeModal() })
</script>

Code Generator

Quick Code Generator
<template>
  <div v-hotkey="{ key: 'ctrl+s', prevent: true }">
    <!-- Bind keyboard shortcuts to elements. Supports modifier keys and multiple hotkey formats. directive -->
  </div>
</template>

<script setup lang="ts">
import { ref } from 'vue'

// Configure your options here
const options = { key: 'ctrl+s', prevent: true }
</script>

Released under the MIT License.