@convertkit/slate-hotkeys
Version:
A set of function to detect common keypresses in a platform-agnostic way
91 lines (77 loc) • 2.22 kB
JavaScript
import { isKeyHotkey } from "is-hotkey"
import { IS_IOS, IS_MAC } from "@convertkit/slate-dev-environment"
/**
* Hotkey mappings for each platform.
*
* @type {Object}
*/
const HOTKEYS = {
bold: "mod+b",
compose: ["down", "left", "right", "up", "backspace", "enter"],
moveBackward: "left",
moveForward: "right",
moveWordBackward: "ctrl+left",
moveWordForward: "ctrl+right",
deleteBackward: "shift?+backspace",
deleteForward: "shift?+delete",
extendBackward: "shift+left",
extendForward: "shift+right",
italic: "mod+i",
splitBlock: "shift?+enter",
undo: "mod+z",
}
const APPLE_HOTKEYS = {
moveLineBackward: "opt+up",
moveLineForward: "opt+down",
moveWordBackward: "opt+left",
moveWordForward: "opt+right",
deleteBackward: ["ctrl+backspace", "ctrl+h"],
deleteForward: ["ctrl+delete", "ctrl+d"],
deleteLineBackward: "cmd+shift?+backspace",
deleteLineForward: ["cmd+shift?+delete", "ctrl+k"],
deleteWordBackward: "opt+shift?+backspace",
deleteWordForward: "opt+shift?+delete",
extendLineBackward: "opt+shift+up",
extendLineForward: "opt+shift+down",
redo: "cmd+shift+z",
transposeCharacter: "ctrl+t",
}
const WINDOWS_HOTKEYS = {
deleteWordBackward: "ctrl+shift?+backspace",
deleteWordForward: "ctrl+shift?+delete",
redo: "ctrl+y",
}
/**
* Hotkeys.
*
* @type {Object}
*/
const Hotkeys = {}
const IS_APPLE = IS_IOS || IS_MAC
const IS_WINDOWS = !IS_APPLE
const KEYS = []
.concat(Object.keys(HOTKEYS))
.concat(Object.keys(APPLE_HOTKEYS))
.concat(Object.keys(WINDOWS_HOTKEYS))
KEYS.forEach((key) => {
const method = `is${key[0].toUpperCase()}${key.slice(1)}`
if (Hotkeys[method]) return
const generic = HOTKEYS[key]
const apple = APPLE_HOTKEYS[key]
const windows = WINDOWS_HOTKEYS[key]
const isGeneric = generic && isKeyHotkey(generic)
const isApple = apple && isKeyHotkey(apple)
const isWindows = windows && isKeyHotkey(windows)
Hotkeys[method] = (event) => {
if (isGeneric && isGeneric(event)) return true
if (IS_APPLE && isApple && isApple(event)) return true
if (IS_WINDOWS && isWindows && isWindows(event)) return true
return false
}
})
/**
* Export.
*
* @type {Object}
*/
export default Hotkeys