@wordpress/keycodes
Version:
Keycodes utilities for WordPress. Used to check for keyboard events across browsers/operating systems.
183 lines (182 loc) • 5.03 kB
JavaScript
// 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