{"version":3,"file":"useKeyboardShortcuts.mjs","sources":["../../../src/lib/hooks/useKeyboardShortcuts.tsx"],"sourcesContent":["/**\n * @file Keyboard Shortcuts Hook\n * @description Hook for managing and documenting keyboard shortcuts\n *\n * WCAG 2.1 Reference:\n * - 2.1.1 Keyboard (Level A)\n * - 2.1.4 Character Key Shortcuts (Level A)\n * - 3.3.5 Help (Level AAA)\n */\n\n/* @refresh reset */\n/* eslint-disable react-refresh/only-export-components */\n\nimport React, { useCallback, useEffect, useMemo, useRef, useState } from 'react';\nimport { useFeatureFlag } from '../flags/useFeatureFlag';\nimport { flagKeys } from '../flags/flag-keys';\n\n/**\n * Keyboard shortcut definition\n */\nexport interface KeyboardShortcut {\n  /** Unique identifier for the shortcut */\n  id: string;\n  /** Human-readable description of what the shortcut does */\n  description: string;\n  /** Key combination (e.g., 'Ctrl+S', 'Escape', 'Alt+N') */\n  keys: string;\n  /** Category for grouping shortcuts */\n  category?: string;\n  /** Whether the shortcut is enabled */\n  enabled?: boolean;\n  /** The handler function to execute */\n  handler: (event: KeyboardEvent) => void;\n}\n\n/**\n * Parsed key combination\n */\ninterface ParsedKeys {\n  ctrlKey: boolean;\n  shiftKey: boolean;\n  altKey: boolean;\n  metaKey: boolean;\n  key: string;\n}\n\n/**\n * Options for the keyboard shortcuts hook\n */\nexport interface UseKeyboardShortcutsOptions {\n  /** Whether to prevent default behavior when a shortcut is triggered */\n  preventDefault?: boolean;\n  /** Whether to stop propagation when a shortcut is triggered */\n  stopPropagation?: boolean;\n  /** Scope element (defaults to document) */\n  scope?: HTMLElement | null;\n  /** Whether shortcuts are globally enabled */\n  enabled?: boolean;\n}\n\n/**\n * Parse a key combination string into modifier flags and key\n */\nfunction parseKeyCombo(keys: string): ParsedKeys {\n  const parts = keys.toLowerCase().split('+');\n  const key = parts.pop() ?? '';\n\n  return {\n    ctrlKey: parts.includes('ctrl') || parts.includes('control'),\n    shiftKey: parts.includes('shift'),\n    altKey: parts.includes('alt'),\n    metaKey: parts.includes('meta') || parts.includes('cmd') || parts.includes('command'),\n    key: key === 'space' ? ' ' : key,\n  };\n}\n\n/**\n * Check if an event matches a parsed key combination\n */\nfunction matchesKeyCombo(event: KeyboardEvent, parsed: ParsedKeys): boolean {\n  const eventKey = event.key.toLowerCase();\n\n  return (\n    event.ctrlKey === parsed.ctrlKey &&\n    event.shiftKey === parsed.shiftKey &&\n    event.altKey === parsed.altKey &&\n    event.metaKey === parsed.metaKey &&\n    (eventKey === parsed.key || event.code.toLowerCase() === parsed.key)\n  );\n}\n\n/**\n * Format a key combination for display\n */\nexport function formatKeyCombo(keys: string): string {\n  const isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform);\n\n  return keys\n    .split('+')\n    .map((key) => {\n      const k = key.trim().toLowerCase();\n      switch (k) {\n        case 'ctrl':\n        case 'control':\n          return isMac ? '^' : 'Ctrl';\n        case 'alt':\n          return isMac ? '?' : 'Alt';\n        case 'shift':\n          return isMac ? '?' : 'Shift';\n        case 'meta':\n        case 'cmd':\n        case 'command':\n          return isMac ? '?' : 'Win';\n        case 'space':\n          return 'Space';\n        case 'escape':\n        case 'esc':\n          return 'Esc';\n        case 'enter':\n        case 'return':\n          return isMac ? '?' : 'Enter';\n        case 'backspace':\n          return isMac ? '?' : 'Backspace';\n        case 'delete':\n          return isMac ? '?' : 'Delete';\n        case 'arrowup':\n          return isMac ? '?' : 'Up';\n        case 'arrowdown':\n          return isMac ? '?' : 'Down';\n        case 'arrowleft':\n          return isMac ? '?' : 'Left';\n        case 'arrowright':\n          return isMac ? '?' : 'Right';\n        default:\n          return key.toUpperCase();\n      }\n    })\n    .join(isMac ? '' : ' + ');\n}\n\n/**\n * Hook for managing keyboard shortcuts with documentation\n *\n * @example\n * ```tsx\n * function MyComponent() {\n *   const { shortcuts } = useKeyboardShortcuts([\n *     {\n *       id: 'save',\n *       description: 'Save changes',\n *       keys: 'Ctrl+S',\n *       category: 'Actions',\n *       handler: () => saveDocument(),\n *     },\n *     {\n *       id: 'close',\n *       description: 'Close panel',\n *       keys: 'Escape',\n *       category: 'Navigation',\n *       handler: () => closePanel(),\n *     },\n *   ]);\n *\n *   return (\n *     <div>\n *       <KeyboardShortcutsHelp shortcuts={shortcuts} />\n *     </div>\n *   );\n * }\n * ```\n */\nexport function useKeyboardShortcuts(\n  shortcuts: KeyboardShortcut[],\n  options: UseKeyboardShortcutsOptions = {}\n): {\n  shortcuts: KeyboardShortcut[];\n  shortcutsByCategory: Record<string, KeyboardShortcut[]>;\n  enableShortcut: (id: string) => void;\n  disableShortcut: (id: string) => void;\n  toggleShortcut: (id: string) => void;\n  /** Whether keyboard shortcuts are globally enabled via feature flag */\n  isFeatureEnabled: boolean;\n} {\n  // Check if keyboard shortcuts are enabled via feature flag\n  const keyboardShortcutsFeatureEnabled = useFeatureFlag(flagKeys.KEYBOARD_SHORTCUTS);\n\n  const { preventDefault = true, stopPropagation = false, scope = null, enabled = true } = options;\n\n  // Combine feature flag with options.enabled\n  const effectivelyEnabled = enabled && keyboardShortcutsFeatureEnabled;\n\n  const [enabledShortcuts, setEnabledShortcuts] = useState<Record<string, boolean>>(() => {\n    const initial: Record<string, boolean> = {};\n    shortcuts.forEach((s) => {\n      initial[s.id] = s.enabled !== false;\n    });\n    return initial;\n  });\n\n  const shortcutsRef = useRef(shortcuts);\n  shortcutsRef.current = shortcuts;\n\n  // Parse all key combinations once\n  const parsedShortcuts = useMemo(() => {\n    return shortcuts.map((shortcut) => ({\n      ...shortcut,\n      parsed: parseKeyCombo(shortcut.keys),\n    }));\n  }, [shortcuts]);\n\n  // Group shortcuts by category\n  const shortcutsByCategory = useMemo(() => {\n    const grouped: Record<string, KeyboardShortcut[]> = {};\n    shortcuts.forEach((shortcut) => {\n      const category = shortcut.category ?? 'General';\n      grouped[category] ??= [];\n      grouped[category].push(shortcut);\n    });\n    return grouped;\n  }, [shortcuts]);\n\n  // Handle keydown events\n  useEffect(() => {\n    if (!effectivelyEnabled) return;\n\n    const handleKeyDown = (event: KeyboardEvent): void => {\n      // Don't trigger shortcuts when typing in inputs\n      const target = event.target as HTMLElement;\n      if (\n        target.tagName === 'INPUT' ||\n        target.tagName === 'TEXTAREA' ||\n        target.tagName === 'SELECT' ||\n        target.isContentEditable\n      ) {\n        // Allow Escape to work in inputs\n        if (event.key !== 'Escape') {\n          return;\n        }\n      }\n\n      for (const shortcut of parsedShortcuts) {\n        if (!enabledShortcuts[shortcut.id]) continue;\n\n        if (matchesKeyCombo(event, shortcut.parsed)) {\n          if (preventDefault) {\n            event.preventDefault();\n          }\n          if (stopPropagation) {\n            event.stopPropagation();\n          }\n          shortcut.handler(event);\n          return;\n        }\n      }\n    };\n\n    const element = scope ?? document;\n    element.addEventListener('keydown', handleKeyDown as EventListener);\n\n    return () => {\n      element.removeEventListener('keydown', handleKeyDown as EventListener);\n    };\n  }, [\n    effectivelyEnabled,\n    parsedShortcuts,\n    enabledShortcuts,\n    preventDefault,\n    stopPropagation,\n    scope,\n  ]);\n\n  const enableShortcut = useCallback((id: string) => {\n    setEnabledShortcuts((prev) => ({ ...prev, [id]: true }));\n  }, []);\n\n  const disableShortcut = useCallback((id: string) => {\n    setEnabledShortcuts((prev) => ({ ...prev, [id]: false }));\n  }, []);\n\n  const toggleShortcut = useCallback((id: string) => {\n    setEnabledShortcuts((prev) => ({ ...prev, [id]: !prev[id] }));\n  }, []);\n\n  return {\n    shortcuts,\n    shortcutsByCategory,\n    enableShortcut,\n    disableShortcut,\n    toggleShortcut,\n    isFeatureEnabled: keyboardShortcutsFeatureEnabled,\n  };\n}\n\n/**\n * Component to display keyboard shortcuts help\n *\n * @example\n * ```tsx\n * <KeyboardShortcutsHelp\n *   shortcuts={shortcuts}\n *   title=\"Keyboard Shortcuts\"\n * />\n * ```\n */\nexport interface KeyboardShortcutsHelpProps {\n  shortcuts: KeyboardShortcut[];\n  title?: string;\n  className?: string;\n  style?: React.CSSProperties;\n}\n\nexport function KeyboardShortcutsHelp({\n  shortcuts,\n  title = 'Keyboard Shortcuts',\n  className,\n  style,\n}: KeyboardShortcutsHelpProps): React.ReactElement {\n  // Group by category\n  const grouped = useMemo(() => {\n    const result: Record<string, KeyboardShortcut[]> = {};\n    shortcuts.forEach((s) => {\n      const cat = s.category ?? 'General';\n      result[cat] ??= [];\n      result[cat].push(s);\n    });\n    return result;\n  }, [shortcuts]);\n\n  return (\n    <div\n      className={className}\n      style={{\n        padding: '1rem',\n        backgroundColor: '#fff',\n        border: '1px solid #e5e7eb',\n        borderRadius: '0.5rem',\n        ...style,\n      }}\n      role=\"region\"\n      aria-label={title}\n    >\n      <h2\n        style={{\n          fontSize: '1.125rem',\n          fontWeight: '600',\n          marginBottom: '1rem',\n          color: '#111827',\n        }}\n      >\n        {title}\n      </h2>\n\n      {Object.entries(grouped).map(([category, categoryShortcuts]) => (\n        <div key={category} style={{ marginBottom: '1rem' }}>\n          <h3\n            style={{\n              fontSize: '0.875rem',\n              fontWeight: '500',\n              color: '#6b7280',\n              marginBottom: '0.5rem',\n            }}\n          >\n            {category}\n          </h3>\n          <dl style={{ margin: 0 }}>\n            {categoryShortcuts.map((shortcut) => (\n              <div\n                key={shortcut.id}\n                style={{\n                  display: 'flex',\n                  justifyContent: 'space-between',\n                  alignItems: 'center',\n                  padding: '0.375rem 0',\n                  borderBottom: '1px solid #f3f4f6',\n                }}\n              >\n                <dt style={{ fontSize: '0.875rem', color: '#374151' }}>{shortcut.description}</dt>\n                <dd style={{ margin: 0 }}>\n                  <kbd\n                    className=\"keyboard-hint\"\n                    style={{\n                      display: 'inline-block',\n                      padding: '0.125rem 0.375rem',\n                      fontSize: '0.75rem',\n                      fontFamily: 'monospace',\n                      backgroundColor: '#f3f4f6',\n                      border: '1px solid #d1d5db',\n                      borderRadius: '0.25rem',\n                      color: '#374151',\n                    }}\n                  >\n                    {formatKeyCombo(shortcut.keys)}\n                  </kbd>\n                </dd>\n              </div>\n            ))}\n          </dl>\n        </div>\n      ))}\n    </div>\n  );\n}\n"],"names":["parseKeyCombo","keys","parts","key","matchesKeyCombo","event","parsed","eventKey","formatKeyCombo","isMac","useKeyboardShortcuts","shortcuts","options","keyboardShortcutsFeatureEnabled","useFeatureFlag","flagKeys","preventDefault","stopPropagation","scope","enabled","effectivelyEnabled","enabledShortcuts","setEnabledShortcuts","useState","initial","s","shortcutsRef","useRef","parsedShortcuts","useMemo","shortcut","shortcutsByCategory","grouped","category","useEffect","handleKeyDown","target","element","enableShortcut","useCallback","id","prev","disableShortcut","toggleShortcut","KeyboardShortcutsHelp","title","className","style","result","cat","jsxs","jsx","categoryShortcuts"],"mappings":"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"}