@neo4j-ndl/react
Version:
React implementation of Neo4j Design System
121 lines (120 loc) • 3.52 kB
JavaScript
/**
*
* Copyright (c) "Neo4j"
* Neo4j Sweden AB [http://neo4j.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* Detects the operating system based on the user agent
*/
export function detectOS() {
if (typeof window === 'undefined') {
return 'linux';
}
const userAgent = window.navigator.userAgent.toLowerCase();
if (userAgent.includes('mac')) {
return 'mac';
}
else if (userAgent.includes('win')) {
return 'windows';
}
else {
return 'linux';
}
}
/**
* Returns OS-aware keyboard key symbols
*/
export function getKbdKeysMap(os = detectOS()) {
const baseMap = {
alt: os === 'mac' ? '⌥' : 'alt',
capslock: '⇪',
ctrl: os === 'mac' ? '⌃' : 'ctrl',
delete: os === 'mac' ? '⌫' : 'delete',
down: '↓',
end: 'end',
enter: '↵',
escape: '⎋',
fn: 'Fn',
home: 'home',
left: '←',
meta: os === 'mac' ? '⌘' : os === 'windows' ? '⊞' : 'meta',
pagedown: '⇟',
pageup: '⇞',
right: '→',
shift: '⇧',
space: '␣',
tab: '⇥',
up: '↑',
};
return baseMap;
}
/**
* Returns OS-aware keyboard key labels
*/
export function getKbdKeysLabelMap(os = detectOS()) {
return {
alt: 'Alt',
capslock: 'Caps Lock',
ctrl: 'Control',
delete: 'Delete',
down: 'Down',
end: 'End',
enter: 'Enter',
escape: 'Escape',
fn: 'Fn',
home: 'Home',
left: 'Left',
meta: os === 'mac' ? 'Command' : os === 'windows' ? 'Windows' : 'Meta',
pagedown: 'Page Down',
pageup: 'Page Up',
right: 'Right',
shift: 'Shift',
space: 'Space',
tab: 'Tab',
up: 'Up',
};
}
function resolveKeyLabel(key, labels) {
if (key === null || key === undefined || typeof key === 'boolean') {
return '';
}
if (typeof key === 'string') {
return key in labels ? labels[key] : key;
}
if (typeof key === 'number') {
return String(key);
}
return '';
}
export function getKbdScreenReaderFriendlyText(keys, modifierKeys, os = detectOS()) {
const labels = getKbdKeysLabelMap(os);
const modStr = (modifierKeys !== null && modifierKeys !== void 0 ? modifierKeys : []).map((k) => labels[k]).join(' + ');
const keyLabels = (keys !== null && keys !== void 0 ? keys : [])
.map((k) => resolveKeyLabel(k, labels))
.filter(Boolean);
let keyStr = '';
if (keyLabels.length === 1) {
keyStr = keyLabels[0];
}
else if (keyLabels.length > 1) {
keyStr = keyLabels.join(' then ');
}
const body = [modStr, keyStr].filter(Boolean).join(' + ');
return body ? `Shortcut: ${body}` : '';
}
//# sourceMappingURL=kbd-utils.js.map