let isMac: boolean | undefined interface Navigator { userAgentData?: { brands: { brand: string; version: string }[] mobile: boolean platform: string getHighEntropyValues: (hints: string[]) => Promise<{ platform: string platformVersion: string uaFullVersion: string }> } } function getPlatform(): string { const nav = navigator as Navigator if (nav.userAgentData) { if (nav.userAgentData.platform) { return nav.userAgentData.platform } nav.userAgentData.getHighEntropyValues(["platform"]).then(highEntropyValues => { if (highEntropyValues.platform) { return highEntropyValues.platform } }) } if (typeof navigator.platform === "string") { return navigator.platform } return "" } export function isMacOS() { if (isMac === undefined) { isMac = getPlatform().toLowerCase().includes("mac") } return isMac } interface ShortcutKeyResult { symbol: string readable: string } export function getShortcutKey(key: string): ShortcutKeyResult { const lowercaseKey = key.toLowerCase() if (lowercaseKey === "mod") { return isMacOS() ? { symbol: "⌘", readable: "Command" } : { symbol: "Ctrl", readable: "Control" } } else if (lowercaseKey === "alt") { return isMacOS() ? { symbol: "⌥", readable: "Option" } : { symbol: "Alt", readable: "Alt" } } else if (lowercaseKey === "shift") { return isMacOS() ? { symbol: "⇧", readable: "Shift" } : { symbol: "Shift", readable: "Shift" } } else { return { symbol: key.toUpperCase(), readable: key } } } export function getShortcutKeys(keys: string[]): ShortcutKeyResult[] { return keys.map(key => getShortcutKey(key)) }