import { KeyboardDownIcon } from "~/assets/icons/KeyboardDownIcon"; import { KeyboardLeftIcon } from "~/assets/icons/KeyboardLeftIcon"; import { KeyboardRightIcon } from "~/assets/icons/KeyboardRightIcon"; import { KeyboardUpIcon } from "~/assets/icons/KeyboardUpIcon"; import { KeyboardWindowsIcon } from "~/assets/icons/KeyboardWindowsIcon"; import { type Modifier, type Shortcut } from "~/hooks/useShortcutKeys"; import { cn } from "~/utils/cn"; import { useOperatingSystem } from "./OperatingSystemProvider"; import { KeyboardEnterIcon } from "~/assets/icons/KeyboardEnterIcon"; const small = "justify-center text-[0.6rem] font-mono font-medium min-w-4 min-h-4 rounded-[2px] tabular-nums px-1 ml-1 -mr-0.5 flex items-center gap-x-1 border transition uppercase"; const medium = "justify-center min-w-5 min-h-5 text-[0.65rem] font-mono font-medium rounded-[2px] tabular-nums px-1 ml-1 -mr-0.5 flex items-center gap-x-1.5 border border-dimmed/40 text-text-dimmed group-hover:text-text-bright/80 group-hover:border-dimmed/60 transition uppercase"; export const variants = { small: cn( small, "border-text-dimmed/40 text-text-dimmed group-hover:text-text-bright/80 group-hover:border-text-dimmed/60" ), "small/bright": cn(small, "bg-background-hover text-text-bright border-border-bright"), medium: cn(medium, "group-hover:border-border-brighter"), "medium/bright": cn(medium, "bg-background-hover text-text-bright border-border-bright"), }; export type ShortcutKeyVariant = keyof typeof variants; type ShortcutKey = Partial; type ShortcutKeyDefinition = | { windows: ShortcutKey; mac: ShortcutKey; } | ShortcutKey; type ShortcutKeyProps = { shortcut: ShortcutKeyDefinition; variant: ShortcutKeyVariant; className?: string; }; export function ShortcutKey({ shortcut, variant, className }: ShortcutKeyProps) { const { platform } = useOperatingSystem(); const isMac = platform === "mac"; let relevantShortcut = "mac" in shortcut ? (isMac ? shortcut.mac : shortcut.windows) : shortcut; const modifiers = relevantShortcut.modifiers ?? []; const character = relevantShortcut.key ? keyString(relevantShortcut.key, isMac, variant) : null; return ( {modifiers.map((k) => ( {modifierString(k, isMac, variant)} ))} {character && {character}} ); } function keyString(key: string, isMac: boolean, variant: ShortcutKeyVariant) { key = key.toLowerCase(); const className = variant.startsWith("small") ? "w-2.5 h-4" : "w-2.5 h-4.5"; switch (key) { case "enter": return isMac ? ( ) : ( Enter ); case "esc": return Esc; case "del": return Del; case "arrowdown": return ; case "arrowup": return ; case "arrowleft": return ; case "arrowright": return ; default: return key; } } function modifierString( modifier: Modifier, isMac: boolean, variant: ShortcutKeyVariant ): string | JSX.Element { const className = variant.startsWith("small") ? "w-2.5 h-4" : "w-3.5 h-5"; switch (modifier) { case "alt": return isMac ? "⌥" : Alt; case "ctrl": return isMac ? "⌃" : Ctrl; case "meta": return isMac ? "⌘" : ; case "shift": return "⇧"; case "mod": return isMac ? "⌘" : Ctrl; } }