/** * @fileoverview Keyboard shortcuts help modal component * * Displays a modal with all available keyboard shortcuts including * application shortcuts and built-in editor formatting shortcuts. * Includes focus trap for accessibility compliance. * * @module @writenex/astro/client/components/KeyboardShortcuts */ import { X } from "lucide-react"; import { useEffect, useRef } from "react"; import { useFocusTrap } from "../../hooks/useFocusTrap"; import { formatShortcut, type ShortcutDefinition, } from "../../hooks/useKeyboardShortcuts"; import "./KeyboardShortcuts.css"; /** * Built-in editor shortcuts from MDXEditor/Lexical. * These are always available when editing content. */ const EDITOR_SHORTCUTS: { category: string; shortcuts: { label: string; keys: string }[]; }[] = [ { category: "Formatting", shortcuts: [ { label: "Bold", keys: "Ctrl+B" }, { label: "Italic", keys: "Ctrl+I" }, { label: "Underline", keys: "Ctrl+U" }, ], }, { category: "Actions", shortcuts: [ { label: "Undo", keys: "Ctrl+Z" }, { label: "Redo", keys: "Ctrl+Shift+Z" }, ], }, ]; /** * Props for ShortcutsHelpModal component */ interface ShortcutsHelpModalProps { /** List of application shortcuts to display */ shortcuts: ShortcutDefinition[]; /** Callback to close the modal */ onClose: () => void; } /** * Keyboard shortcuts help modal component * * @component * @example * ```tsx * {showHelp && ( * * )} * ``` */ export function ShortcutsHelpModal({ shortcuts, onClose, }: ShortcutsHelpModalProps): React.ReactElement { const triggerRef = useRef(null); // Store the trigger element when modal mounts useEffect(() => { triggerRef.current = document.activeElement as HTMLElement; }, []); // Focus trap for accessibility const { containerRef } = useFocusTrap({ enabled: true, onEscape: onClose, returnFocusTo: triggerRef.current, }); const handleOverlayClick = (e: React.MouseEvent) => { if (e.target === e.currentTarget) onClose(); }; return (
{/* Header */}

Keyboard Shortcuts

{/* Shortcuts List */}
{/* Application Shortcuts */}

Application

{shortcuts.map((shortcut) => (
{shortcut.label} {formatShortcut(shortcut)}
))}
{/* Editor Shortcuts */} {EDITOR_SHORTCUTS.map((group) => (

{group.category}

{group.shortcuts.map((shortcut) => (
{shortcut.label} {shortcut.keys}
))}
))}
{/* Footer */}
Press Ctrl+/ to toggle this help
); }