import * as React from "react"; import { formatShortcut, type KeyboardShortcut } from "../../hooks/useKeyboardShortcuts"; export interface KeyboardShortcutsHelpProps { open: boolean; shortcuts: readonly KeyboardShortcut[]; onOpenChange: (open: boolean) => void; } export function KeyboardShortcutsHelp({ open, shortcuts, onOpenChange, }: KeyboardShortcutsHelpProps): JSX.Element | null { const closeButtonRef = React.useRef(null); React.useEffect(() => { if (!open) { return undefined; } closeButtonRef.current?.focus(); const handleKeyDown = (event: KeyboardEvent) => { if (event.key === "Escape") { event.preventDefault(); onOpenChange(false); } }; window.addEventListener("keydown", handleKeyDown); return () => window.removeEventListener("keydown", handleKeyDown); }, [onOpenChange, open]); if (!open) { return null; } const groupedShortcuts = shortcuts.reduce>((groups, shortcut) => { const group = shortcut.group ?? "Viewer"; groups[group] = [...(groups[group] ?? []), shortcut]; return groups; }, {}); return (
{ if (event.target === event.currentTarget) { onOpenChange(false); } }} >

Keyboard navigation

Mechanica shortcuts

All controls remain reachable with Tab. Shortcuts are disabled while typing into inputs so search, sliders, and form controls remain predictable.

{Object.entries(groupedShortcuts).map(([group, groupShortcuts]) => (

{group}

{groupShortcuts.map((shortcut) => (
{shortcut.description}
{formatShortcut(shortcut)}
))}
))}
); }