UNPKG

@wordpress/keycodes

Version:

Keycodes utilities for WordPress. Used to check for keyboard events across browsers/operating systems.

183 lines (182 loc) 5.03 kB
// packages/keycodes/src/index.ts import { __ } from "@wordpress/i18n"; import { isAppleOS } from "./platform"; var BACKSPACE = 8; var TAB = 9; var ENTER = 13; var ESCAPE = 27; var SPACE = 32; var PAGEUP = 33; var PAGEDOWN = 34; var END = 35; var HOME = 36; var LEFT = 37; var UP = 38; var RIGHT = 39; var DOWN = 40; var DELETE = 46; var F10 = 121; var ALT = "alt"; var CTRL = "ctrl"; var COMMAND = "meta"; var SHIFT = "shift"; var ZERO = 48; function capitaliseFirstCharacter(string) { return string.length < 2 ? string.toUpperCase() : string.charAt(0).toUpperCase() + string.slice(1); } function mapValues(object, mapFn) { return Object.fromEntries( Object.entries(object).map(([key, value]) => [ key, mapFn(value) ]) ); } var modifiers = { primary: (_isApple) => _isApple() ? [COMMAND] : [CTRL], primaryShift: (_isApple) => _isApple() ? [SHIFT, COMMAND] : [CTRL, SHIFT], primaryAlt: (_isApple) => _isApple() ? [ALT, COMMAND] : [CTRL, ALT], secondary: (_isApple) => _isApple() ? [SHIFT, ALT, COMMAND] : [CTRL, SHIFT, ALT], access: (_isApple) => _isApple() ? [CTRL, ALT] : [SHIFT, ALT], ctrl: () => [CTRL], alt: () => [ALT], ctrlShift: () => [CTRL, SHIFT], shift: () => [SHIFT], shiftAlt: () => [SHIFT, ALT], undefined: () => [] }; var rawShortcut = /* @__PURE__ */ mapValues(modifiers, (modifier) => { return (character, _isApple = isAppleOS) => { return [...modifier(_isApple), character.toLowerCase()].join( "+" ); }; }); var displayShortcutList = /* @__PURE__ */ mapValues( modifiers, (modifier) => { return (character, _isApple = isAppleOS) => { const isApple = _isApple(); const replacementKeyMap = { [ALT]: isApple ? "\u2325" : "Alt", [CTRL]: isApple ? "\u2303" : "Ctrl", // Make sure ⌃ is the U+2303 UP ARROWHEAD unicode character and not the caret character. [COMMAND]: "\u2318", [SHIFT]: isApple ? "\u21E7" : "Shift" }; const modifierKeys = modifier(_isApple).reduce( (accumulator, key) => { const replacementKey = replacementKeyMap[key] ?? key; if (isApple) { return [...accumulator, replacementKey]; } return [...accumulator, replacementKey, "+"]; }, [] ); return [ ...modifierKeys, capitaliseFirstCharacter(character) ]; }; } ); var displayShortcut = /* @__PURE__ */ mapValues( displayShortcutList, (shortcutList) => { return (character, _isApple = isAppleOS) => shortcutList(character, _isApple).join(""); } ); var shortcutAriaLabel = /* @__PURE__ */ mapValues(modifiers, (modifier) => { return (character, _isApple = isAppleOS) => { const isApple = _isApple(); const replacementKeyMap = { [SHIFT]: "Shift", [COMMAND]: isApple ? "Command" : "Control", [CTRL]: "Control", [ALT]: isApple ? "Option" : "Alt", /* translators: comma as in the character ',' */ ",": __("Comma"), /* translators: period as in the character '.' */ ".": __("Period"), /* translators: backtick as in the character '`' */ "`": __("Backtick"), /* translators: tilde as in the character '~' */ "~": __("Tilde") }; return [...modifier(_isApple), character].map( (key) => capitaliseFirstCharacter(replacementKeyMap[key] ?? key) ).join(isApple ? " " : " + "); }; }); function getEventModifiers(event) { return [ALT, CTRL, COMMAND, SHIFT].filter( (key) => event[`${key}Key`] ); } var isKeyboardEvent = /* @__PURE__ */ mapValues(modifiers, (getModifiers) => { return (event, character, _isApple = isAppleOS) => { const mods = getModifiers(_isApple); const eventMods = getEventModifiers(event); const replacementWithShiftKeyMap = { Comma: ",", Backslash: "\\", // Windows returns `\` for both IntlRo and IntlYen. IntlRo: "\\", IntlYen: "\\" }; const modsDiff = mods.filter( (mod) => !eventMods.includes(mod) ); const eventModsDiff = eventMods.filter( (mod) => !mods.includes(mod) ); if (modsDiff.length > 0 || eventModsDiff.length > 0) { return false; } let key = event.key.toLowerCase(); if (!character) { return mods.includes(key); } if (event.altKey && character.length === 1) { key = String.fromCharCode(event.keyCode).toLowerCase(); } if (event.shiftKey && character.length === 1 && replacementWithShiftKeyMap[event.code]) { key = replacementWithShiftKeyMap[event.code]; } if (character === "del") { character = "delete"; } return key === character.toLowerCase(); }; }); export { ALT, BACKSPACE, COMMAND, CTRL, DELETE, DOWN, END, ENTER, ESCAPE, F10, HOME, LEFT, PAGEDOWN, PAGEUP, RIGHT, SHIFT, SPACE, TAB, UP, ZERO, displayShortcut, displayShortcutList, isAppleOS, isKeyboardEvent, modifiers, rawShortcut, shortcutAriaLabel }; //# sourceMappingURL=index.js.map