use-kbd 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/TwoColumnRenderer.tsx","../src/ActionsRegistry.ts","../src/utils.ts","../src/useHotkeys.ts","../src/HotkeysProvider.tsx","../src/useAction.ts","../src/useRecordHotkey.ts","../src/useEditableHotkeys.ts","../src/useOmnibar.ts","../src/KeybindingEditor.tsx","../src/ModifierIcons.tsx","../src/Omnibar.tsx","../src/SequenceModal.tsx","../src/ShortcutsModal.tsx"],"names":["overrides","actions","single","isPrefix","useState","useRef","useCallback","createContext","useMemo","useEffect","hasConflicts","jsx","useContext","display","max","jsxs","isMac","Fragment","labels","descriptions","conflicts"],"mappings":"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","file":"index.js","sourcesContent":["import type { ReactNode } from 'react'\nimport type { GroupRendererProps, ShortcutGroup } from './ShortcutsModal'\n\n/**\n * Configuration for a row in a two-column table\n */\nexport interface TwoColumnRow {\n /** Label for the row (first column) */\n label: ReactNode\n /** Action ID for the left/first column */\n leftAction: string\n /** Action ID for the right/second column */\n rightAction: string\n}\n\n/**\n * Configuration for creating a two-column group renderer\n */\nexport interface TwoColumnConfig {\n /** Column headers: [label, left, right] */\n headers: [string, string, string]\n /**\n * Extract rows from the group's shortcuts.\n * Return array of { label, leftAction, rightAction }.\n */\n getRows: (group: ShortcutGroup) => TwoColumnRow[]\n}\n\n/**\n * Create a GroupRenderer that displays shortcuts in a two-column table.\n *\n * @example\n * ```tsx\n * // Pair actions by suffix (left:temp/right:temp)\n * const YAxisRenderer = createTwoColumnRenderer({\n * headers: ['Metric', 'Left', 'Right'],\n * getRows: (group) => {\n * const metrics = ['temp', 'co2', 'humid']\n * return metrics.map(m => ({\n * label: m,\n * leftAction: `left:${m}`,\n * rightAction: `right:${m}`,\n * }))\n * },\n * })\n *\n * // Explicit pairs\n * const NavRenderer = createTwoColumnRenderer({\n * headers: ['Navigation', 'Back', 'Forward'],\n * getRows: () => [\n * { label: 'Page', leftAction: 'nav:prev', rightAction: 'nav:next' },\n * ],\n * })\n * ```\n */\nexport function createTwoColumnRenderer(config: TwoColumnConfig) {\n const { headers, getRows } = config\n const [labelHeader, leftHeader, rightHeader] = headers\n\n return function TwoColumnRenderer({ group, renderCell }: GroupRendererProps): ReactNode {\n // Build a map of actionId -> bindings for quick lookup\n const bindingsMap = new Map(\n group.shortcuts.map(s => [s.actionId, s.bindings])\n )\n\n const rows = getRows(group)\n\n return (\n <table className=\"kbd-table\">\n <thead>\n <tr>\n <th>{labelHeader}</th>\n <th>{leftHeader}</th>\n <th>{rightHeader}</th>\n </tr>\n </thead>\n <tbody>\n {rows.map(({ label, leftAction, rightAction }, i) => {\n const leftBindings = bindingsMap.get(leftAction) ?? []\n const rightBindings = bindingsMap.get(rightAction) ?? []\n // Skip row if neither action has bindings (action doesn't exist)\n if (leftBindings.length === 0 && rightBindings.length === 0) return null\n return (\n <tr key={i}>\n <td>{label}</td>\n <td>{leftAction ? renderCell(leftAction, leftBindings) : '-'}</td>\n <td>{rightAction ? renderCell(rightAction, rightBindings) : '-'}</td>\n </tr>\n )\n })}\n </tbody>\n </table>\n )\n }\n}\n","import { createContext, useCallback, useMemo, useRef, useState } from 'react'\nimport type { ActionRegistry } from './types'\nimport type { ActionConfig } from './useAction'\nimport type { HotkeyMap } from './useHotkeys'\n\nexport interface RegisteredAction {\n config: ActionConfig\n registeredAt: number\n}\n\nexport interface ActionsRegistryValue {\n /** Register an action. Called by useAction on mount. */\n register: (id: string, config: ActionConfig) => void\n /** Unregister an action. Called by useAction on unmount. */\n unregister: (id: string) => void\n /** Execute an action by ID */\n execute: (id: string) => void\n /** Currently registered actions */\n actions: Map<string, RegisteredAction>\n /** Computed keymap from registered actions + user overrides */\n keymap: HotkeyMap\n /** Action registry for omnibar search */\n actionRegistry: ActionRegistry\n /** Get all bindings for an action (defaults + overrides) */\n getBindingsForAction: (id: string) => string[]\n /** User's binding overrides */\n overrides: Record<string, string | string[]>\n /** Set a user override for a binding */\n setBinding: (actionId: string, key: string) => void\n /** Remove a binding */\n removeBinding: (key: string) => void\n /** Reset all overrides */\n resetOverrides: () => void\n}\n\nexport const ActionsRegistryContext = createContext<ActionsRegistryValue | null>(null)\n\nexport interface UseActionsRegistryOptions {\n /** localStorage key for persisting user overrides */\n storageKey?: string\n}\n\n/**\n * Hook to create an actions registry.\n * Used internally by HotkeysProvider.\n */\nexport function useActionsRegistry(options: UseActionsRegistryOptions = {}): ActionsRegistryValue {\n const { storageKey } = options\n\n // Registered actions (mutable for perf, state for re-renders)\n const actionsRef = useRef<Map<string, RegisteredAction>>(new Map())\n const [actionsVersion, setActionsVersion] = useState(0)\n\n // User overrides (persisted)\n // Format: { bindings: { key: action }, removedDefaults: { action: [keys] } }\n const [overrides, setOverrides] = useState<Record<string, string | string[]>>(() => {\n if (!storageKey || typeof window === 'undefined') return {}\n try {\n const stored = localStorage.getItem(storageKey)\n return stored ? JSON.parse(stored) : {}\n } catch {\n return {}\n }\n })\n\n // Track which default bindings have been removed from specific actions\n const [removedDefaults, setRemovedDefaults] = useState<Record<string, string[]>>(() => {\n if (!storageKey || typeof window === 'undefined') return {}\n try {\n const stored = localStorage.getItem(`${storageKey}-removed`)\n return stored ? JSON.parse(stored) : {}\n } catch {\n return {}\n }\n })\n\n // Helper to check if a key→action matches a default binding\n const isDefaultBinding = useCallback((key: string, actionId: string): boolean => {\n const action = actionsRef.current.get(actionId)\n return action?.config.defaultBindings?.includes(key) ?? false\n }, [])\n\n // Filter overrides to remove redundant entries (entries that match defaults)\n const filterRedundantOverrides = useCallback((overrides: Record<string, string | string[]>): Record<string, string | string[]> => {\n const filtered: Record<string, string | string[]> = {}\n for (const [key, actionOrActions] of Object.entries(overrides)) {\n if (actionOrActions === '') {\n // Legacy empty marker - skip (now handled by removedDefaults)\n continue\n } else if (Array.isArray(actionOrActions)) {\n // For arrays, keep if any action is not default\n const nonDefaultActions = actionOrActions.filter(a => !isDefaultBinding(key, a))\n if (nonDefaultActions.length > 0) {\n filtered[key] = nonDefaultActions.length === 1 ? nonDefaultActions[0] : nonDefaultActions\n }\n } else {\n // Single action - keep if not default\n if (!isDefaultBinding(key, actionOrActions)) {\n filtered[key] = actionOrActions\n }\n }\n }\n return filtered\n }, [isDefaultBinding])\n\n // Persist overrides - accepts either a value or an updater function\n type OverridesUpdate = Record<string, string | string[]> | ((prev: Record<string, string | string[]>) => Record<string, string | string[]>)\n const updateOverrides = useCallback((update: OverridesUpdate) => {\n setOverrides((prev) => {\n const newOverrides = typeof update === 'function' ? update(prev) : update\n // Filter out redundant overrides before persisting\n const filteredOverrides = filterRedundantOverrides(newOverrides)\n if (storageKey && typeof window !== 'undefined') {\n try {\n if (Object.keys(filteredOverrides).length === 0) {\n localStorage.removeItem(storageKey)\n } else {\n localStorage.setItem(storageKey, JSON.stringify(filteredOverrides))\n }\n } catch {\n // Ignore storage errors\n }\n }\n return filteredOverrides\n })\n }, [storageKey, filterRedundantOverrides])\n\n // Persist removedDefaults\n type RemovedDefaultsUpdate = Record<string, string[]> | ((prev: Record<string, string[]>) => Record<string, string[]>)\n const updateRemovedDefaults = useCallback((update: RemovedDefaultsUpdate) => {\n setRemovedDefaults((prev) => {\n const newRemoved = typeof update === 'function' ? update(prev) : update\n // Filter out empty arrays\n const filtered: Record<string, string[]> = {}\n for (const [action, keys] of Object.entries(newRemoved)) {\n if (keys.length > 0) {\n filtered[action] = keys\n }\n }\n if (storageKey && typeof window !== 'undefined') {\n try {\n const key = `${storageKey}-removed`\n if (Object.keys(filtered).length === 0) {\n localStorage.removeItem(key)\n } else {\n localStorage.setItem(key, JSON.stringify(filtered))\n }\n } catch {\n // Ignore storage errors\n }\n }\n return filtered\n })\n }, [storageKey])\n\n const register = useCallback((id: string, config: ActionConfig) => {\n actionsRef.current.set(id, {\n config,\n registeredAt: Date.now(),\n })\n setActionsVersion(v => v + 1)\n }, [])\n\n const unregister = useCallback((id: string) => {\n actionsRef.current.delete(id)\n setActionsVersion(v => v + 1)\n }, [])\n\n const execute = useCallback((id: string) => {\n const action = actionsRef.current.get(id)\n if (action && (action.config.enabled ?? true)) {\n action.config.handler()\n }\n }, [])\n\n // Compute keymap from registered actions + overrides\n const keymap = useMemo(() => {\n const map: HotkeyMap = {}\n\n // Helper to add an action to a key (merging with existing)\n const addToKey = (key: string, actionId: string) => {\n const existing = map[key]\n if (existing) {\n // Multiple actions on same key - creates a conflict\n const existingArray = Array.isArray(existing) ? existing : [existing]\n if (!existingArray.includes(actionId)) {\n map[key] = [...existingArray, actionId]\n }\n } else {\n map[key] = actionId\n }\n }\n\n // First, add all default bindings from registered actions\n // (but skip if explicitly removed for this action)\n for (const [id, { config }] of actionsRef.current) {\n for (const binding of config.defaultBindings ?? []) {\n // Check if this default was explicitly removed for this action\n const removedForAction = removedDefaults[id] ?? []\n if (removedForAction.includes(binding)) continue\n\n addToKey(binding, id)\n }\n }\n\n // Then apply user overrides (merge with defaults to create conflicts)\n for (const [key, actionOrActions] of Object.entries(overrides)) {\n if (actionOrActions === '') {\n // Legacy empty marker - skip\n continue\n } else {\n // Add the override binding (may merge with existing default)\n const actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions]\n for (const actionId of actions) {\n addToKey(key, actionId)\n }\n }\n }\n\n return map\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [actionsVersion, overrides, removedDefaults])\n\n // Build action registry for omnibar\n const actionRegistry = useMemo(() => {\n const registry: ActionRegistry = {}\n for (const [id, { config }] of actionsRef.current) {\n registry[id] = {\n label: config.label,\n group: config.group,\n keywords: config.keywords,\n }\n }\n return registry\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [actionsVersion])\n\n const getBindingsForAction = useCallback((actionId: string) => {\n const bindings: string[] = []\n\n // Get from keymap (includes defaults and overrides)\n for (const [key, action] of Object.entries(keymap)) {\n const actions = Array.isArray(action) ? action : [action]\n if (actions.includes(actionId)) {\n bindings.push(key)\n }\n }\n\n return bindings\n }, [keymap])\n\n const setBinding = useCallback((actionId: string, key: string) => {\n updateOverrides((prev) => ({\n ...prev,\n [key]: actionId,\n }))\n }, [updateOverrides])\n\n const removeBinding = useCallback((key: string) => {\n // Find which actions have this as a default binding\n const actionsWithDefault: string[] = []\n for (const [id, { config }] of actionsRef.current) {\n if (config.defaultBindings?.includes(key)) {\n actionsWithDefault.push(id)\n }\n }\n\n // Mark as removed for each action that has it as a default\n if (actionsWithDefault.length > 0) {\n updateRemovedDefaults((prev) => {\n const next = { ...prev }\n for (const actionId of actionsWithDefault) {\n const existing = next[actionId] ?? []\n if (!existing.includes(key)) {\n next[actionId] = [...existing, key]\n }\n }\n return next\n })\n }\n\n // Also remove from overrides if it was a user-added binding\n updateOverrides((prev) => {\n const { [key]: _, ...rest } = prev\n return rest\n })\n }, [updateOverrides, updateRemovedDefaults])\n\n const resetOverrides = useCallback(() => {\n updateOverrides({})\n updateRemovedDefaults({})\n }, [updateOverrides, updateRemovedDefaults])\n\n // Create a snapshot of the map for consumers\n const actions = useMemo(() => {\n return new Map(actionsRef.current)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [actionsVersion])\n\n // Memoize return object to minimize context changes\n return useMemo(() => ({\n register,\n unregister,\n execute,\n actions,\n keymap,\n actionRegistry,\n getBindingsForAction,\n overrides,\n setBinding,\n removeBinding,\n resetOverrides,\n }), [\n register,\n unregister,\n execute,\n actions,\n keymap,\n actionRegistry,\n getBindingsForAction,\n overrides,\n setBinding,\n removeBinding,\n resetOverrides,\n ])\n}\n","import { max } from '@rdub/base'\nimport type { KeyCombination, KeyCombinationDisplay, HotkeySequence } from './types'\n\n/**\n * Detect if running on macOS\n */\nexport function isMac(): boolean {\n if (typeof navigator === 'undefined') return false\n return /Mac|iPod|iPhone|iPad/.test(navigator.platform)\n}\n\n/**\n * Normalize a key name to a canonical form\n */\nexport function normalizeKey(key: string): string {\n // Handle special keys\n const keyMap: Record<string, string> = {\n ' ': 'space',\n 'Escape': 'escape',\n 'Enter': 'enter',\n 'Tab': 'tab',\n 'Backspace': 'backspace',\n 'Delete': 'delete',\n 'ArrowUp': 'arrowup',\n 'ArrowDown': 'arrowdown',\n 'ArrowLeft': 'arrowleft',\n 'ArrowRight': 'arrowright',\n 'Home': 'home',\n 'End': 'end',\n 'PageUp': 'pageup',\n 'PageDown': 'pagedown',\n }\n\n if (key in keyMap) {\n return keyMap[key]\n }\n\n // Single characters to lowercase\n if (key.length === 1) {\n return key.toLowerCase()\n }\n\n // Function keys (F1-F12)\n if (/^F\\d{1,2}$/.test(key)) {\n return key.toLowerCase()\n }\n\n return key.toLowerCase()\n}\n\n/**\n * Format a key for display (platform-aware)\n */\nexport function formatKeyForDisplay(key: string): string {\n const displayMap: Record<string, string> = {\n 'space': 'Space',\n 'escape': 'Esc',\n 'enter': '↵',\n 'tab': 'Tab',\n 'backspace': '⌫',\n 'delete': 'Del',\n 'arrowup': '↑',\n 'arrowdown': '↓',\n 'arrowleft': '←',\n 'arrowright': '→',\n 'home': 'Home',\n 'end': 'End',\n 'pageup': 'PgUp',\n 'pagedown': 'PgDn',\n }\n\n if (key in displayMap) {\n return displayMap[key]\n }\n\n // Function keys\n if (/^f\\d{1,2}$/.test(key)) {\n return key.toUpperCase()\n }\n\n // Single letter - uppercase for display\n if (key.length === 1) {\n return key.toUpperCase()\n }\n\n return key\n}\n\n/**\n * Format a single KeyCombination (internal helper)\n */\nfunction formatSingleCombination(combo: KeyCombination): { display: string; id: string } {\n const mac = isMac()\n const parts: string[] = []\n const idParts: string[] = []\n\n // Order: Ctrl/Cmd, Alt/Option, Shift, Key\n if (combo.modifiers.ctrl) {\n parts.push(mac ? '⌃' : 'Ctrl')\n idParts.push('ctrl')\n }\n if (combo.modifiers.meta) {\n parts.push(mac ? '⌘' : 'Win')\n idParts.push('meta')\n }\n if (combo.modifiers.alt) {\n parts.push(mac ? '⌥' : 'Alt')\n idParts.push('alt')\n }\n if (combo.modifiers.shift) {\n parts.push(mac ? '⇧' : 'Shift')\n idParts.push('shift')\n }\n\n parts.push(formatKeyForDisplay(combo.key))\n idParts.push(combo.key)\n\n return {\n display: mac ? parts.join('') : parts.join('+'),\n id: idParts.join('+'),\n }\n}\n\n/**\n * Convert a KeyCombination or HotkeySequence to display format\n */\nexport function formatCombination(combo: KeyCombination): KeyCombinationDisplay\nexport function formatCombination(sequence: HotkeySequence): KeyCombinationDisplay\nexport function formatCombination(input: KeyCombination | HotkeySequence): KeyCombinationDisplay {\n // Handle array (sequence)\n if (Array.isArray(input)) {\n if (input.length === 0) {\n return { display: '', id: '', isSequence: false }\n }\n if (input.length === 1) {\n const single = formatSingleCombination(input[0])\n return { ...single, isSequence: false }\n }\n // Multiple keys = sequence\n const formatted = input.map(formatSingleCombination)\n return {\n display: formatted.map(f => f.display).join(' '),\n id: formatted.map(f => f.id).join(' '),\n isSequence: true,\n }\n }\n\n // Handle single KeyCombination\n const single = formatSingleCombination(input)\n return { ...single, isSequence: false }\n}\n\n/**\n * Check if a key is a modifier key\n */\nexport function isModifierKey(key: string): boolean {\n return ['Control', 'Alt', 'Shift', 'Meta'].includes(key)\n}\n\n/**\n * Characters that require shift to type (US keyboard layout)\n * When matching these keys, we should ignore shiftKey mismatch\n */\nconst SHIFTED_CHARS = new Set([\n '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')',\n '_', '+', '{', '}', '|', ':', '\"', '<', '>', '?',\n])\n\n/**\n * Check if a key is a shifted character (requires shift to type)\n */\nexport function isShiftedChar(key: string): boolean {\n return SHIFTED_CHARS.has(key)\n}\n\n/**\n * Check if a hotkey string represents a sequence (space-separated keys)\n */\nexport function isSequence(hotkeyStr: string): boolean {\n // A sequence has spaces that aren't inside a modifier combo\n // \"2 w\" is a sequence, \"ctrl+k\" is not, \"ctrl+k ctrl+c\" is a sequence\n return hotkeyStr.includes(' ')\n}\n\n/**\n * Parse a single combination string (e.g., \"ctrl+k\") to KeyCombination.\n * Supports uppercase letters as shorthand for shift+letter (e.g., \"J\" → shift+j)\n */\nfunction parseSingleCombination(str: string): KeyCombination {\n // Single uppercase letter (A-Z) is shorthand for shift+<lowercase>\n if (str.length === 1 && /^[A-Z]$/.test(str)) {\n return {\n key: str.toLowerCase(),\n modifiers: { ctrl: false, alt: false, shift: true, meta: false },\n }\n }\n\n const parts = str.toLowerCase().split('+')\n const key = parts[parts.length - 1]\n\n return {\n key,\n modifiers: {\n ctrl: parts.includes('ctrl') || parts.includes('control'),\n alt: parts.includes('alt') || parts.includes('option'),\n shift: parts.includes('shift'),\n meta: parts.includes('meta') || parts.includes('cmd') || parts.includes('command'),\n },\n }\n}\n\n/**\n * Parse a hotkey string to a HotkeySequence.\n * Handles both single keys (\"ctrl+k\") and sequences (\"2 w\", \"ctrl+k ctrl+c\")\n */\nexport function parseHotkeyString(hotkeyStr: string): HotkeySequence {\n if (!hotkeyStr.trim()) return []\n\n // Split by space to get sequence parts\n const parts = hotkeyStr.trim().split(/\\s+/)\n return parts.map(parseSingleCombination)\n}\n\n/**\n * Parse a combination ID back to a KeyCombination (single key only)\n * @deprecated Use parseHotkeyString for sequence support\n */\nexport function parseCombinationId(id: string): KeyCombination {\n // For backwards compatibility, if it's a sequence, return first key\n const sequence = parseHotkeyString(id)\n if (sequence.length === 0) {\n return { key: '', modifiers: { ctrl: false, alt: false, shift: false, meta: false } }\n }\n return sequence[0]\n}\n\n/**\n * Conflict detection result\n */\nexport interface KeyConflict {\n /** The key combination that has a conflict */\n key: string\n /** Actions bound to this key */\n actions: string[]\n /** Type of conflict */\n type: 'duplicate' | 'prefix'\n}\n\n/**\n * Check if sequence A is a prefix of sequence B\n */\nfunction isPrefix(a: HotkeySequence, b: HotkeySequence): boolean {\n if (a.length >= b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!combinationsEqual(a[i], b[i])) return false\n }\n return true\n}\n\n/**\n * Check if two KeyCombinations are equal\n */\nfunction combinationsEqual(a: KeyCombination, b: KeyCombination): boolean {\n return (\n a.key === b.key &&\n a.modifiers.ctrl === b.modifiers.ctrl &&\n a.modifiers.alt === b.modifiers.alt &&\n a.modifiers.shift === b.modifiers.shift &&\n a.modifiers.meta === b.modifiers.meta\n )\n}\n\n/**\n * Check if two HotkeySequences are equal\n */\nfunction sequencesEqual(a: HotkeySequence, b: HotkeySequence): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!combinationsEqual(a[i], b[i])) return false\n }\n return true\n}\n\n/**\n * Find conflicts in a keymap.\n * Detects:\n * - Duplicate: multiple actions bound to the exact same key/sequence\n * - Prefix: one hotkey is a prefix of another (e.g., \"2\" and \"2 w\")\n *\n * @param keymap - HotkeyMap to check for conflicts\n * @returns Map of key -> actions[] for keys with conflicts\n */\nexport function findConflicts(keymap: Record<string, string | string[]>): Map<string, string[]> {\n const conflicts = new Map<string, string[]>()\n\n // Parse all hotkeys into sequences for comparison\n const entries = Object.entries(keymap).map(([key, actionOrActions]) => ({\n key,\n sequence: parseHotkeyString(key),\n actions: Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions],\n }))\n\n // Check for duplicate keys (multiple actions on same key)\n const keyToActions = new Map<string, string[]>()\n for (const { key, actions } of entries) {\n const existing = keyToActions.get(key) ?? []\n keyToActions.set(key, [...existing, ...actions])\n }\n for (const [key, actions] of keyToActions) {\n if (actions.length > 1) {\n conflicts.set(key, actions)\n }\n }\n\n // Check for prefix conflicts\n for (let i = 0; i < entries.length; i++) {\n for (let j = i + 1; j < entries.length; j++) {\n const a = entries[i]\n const b = entries[j]\n\n // Check if a is prefix of b or b is prefix of a\n if (isPrefix(a.sequence, b.sequence)) {\n // a is a prefix of b - both are conflicted\n const existingA = conflicts.get(a.key) ?? []\n if (!existingA.includes(`prefix of: ${b.key}`)) {\n conflicts.set(a.key, [...existingA, ...a.actions, `prefix of: ${b.key}`])\n }\n const existingB = conflicts.get(b.key) ?? []\n if (!existingB.includes(`has prefix: ${a.key}`)) {\n conflicts.set(b.key, [...existingB, ...b.actions, `has prefix: ${a.key}`])\n }\n } else if (isPrefix(b.sequence, a.sequence)) {\n // b is a prefix of a\n const existingB = conflicts.get(b.key) ?? []\n if (!existingB.includes(`prefix of: ${a.key}`)) {\n conflicts.set(b.key, [...existingB, ...b.actions, `prefix of: ${a.key}`])\n }\n const existingA = conflicts.get(a.key) ?? []\n if (!existingA.includes(`has prefix: ${b.key}`)) {\n conflicts.set(a.key, [...existingA, ...a.actions, `has prefix: ${b.key}`])\n }\n }\n }\n }\n\n return conflicts\n}\n\n/**\n * Check if a keymap has any conflicts\n */\nexport function hasConflicts(keymap: Record<string, string | string[]>): boolean {\n return findConflicts(keymap).size > 0\n}\n\n/**\n * Get conflicts as an array of KeyConflict objects\n */\nexport function getConflictsArray(keymap: Record<string, string | string[]>): KeyConflict[] {\n const conflicts = findConflicts(keymap)\n return Array.from(conflicts.entries()).map(([key, actions]) => ({\n key,\n actions: actions.filter(a => !a.startsWith('prefix of:') && !a.startsWith('has prefix:')),\n type: actions.some(a => a.startsWith('prefix of:') || a.startsWith('has prefix:')) ? 'prefix' : 'duplicate',\n }))\n}\n\n// ============================================================================\n// Sequence Completion Utilities\n// ============================================================================\n\nimport type { SequenceCompletion, ActionRegistry, ActionSearchResult } from './types'\n\n/**\n * Get possible completions for a partially-typed sequence.\n *\n * @example\n * ```tsx\n * const keymap = { '2 w': 'twoWeeks', '2 d': 'twoDays', 't': 'temp' }\n * const pending = parseHotkeyString('2')\n * const completions = getSequenceCompletions(pending, keymap)\n * // Returns:\n * // [\n * // { nextKeys: 'w', fullSequence: '2 w', actions: ['twoWeeks'], ... },\n * // { nextKeys: 'd', fullSequence: '2 d', actions: ['twoDays'], ... },\n * // ]\n * ```\n */\nexport function getSequenceCompletions(\n pendingKeys: HotkeySequence,\n keymap: Record<string, string | string[]>,\n): SequenceCompletion[] {\n if (pendingKeys.length === 0) return []\n\n const completions: SequenceCompletion[] = []\n\n for (const [hotkeyStr, actionOrActions] of Object.entries(keymap)) {\n const sequence = parseHotkeyString(hotkeyStr)\n\n // Check if pending is a prefix of this sequence\n if (sequence.length <= pendingKeys.length) continue\n\n let isPrefix = true\n for (let i = 0; i < pendingKeys.length; i++) {\n if (!combinationsEqual(pendingKeys[i], sequence[i])) {\n isPrefix = false\n break\n }\n }\n\n if (isPrefix) {\n // Get remaining keys needed\n const remainingKeys = sequence.slice(pendingKeys.length)\n const nextKeys = formatCombination(remainingKeys).id\n\n const actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions]\n\n completions.push({\n nextKeys,\n fullSequence: hotkeyStr,\n display: formatCombination(sequence),\n actions,\n })\n }\n }\n\n return completions\n}\n\n/**\n * Build a map of action -> keys[] from a keymap\n */\nexport function getActionBindings(keymap: Record<string, string | string[]>): Map<string, string[]> {\n const actionToKeys = new Map<string, string[]>()\n\n for (const [key, actionOrActions] of Object.entries(keymap)) {\n const actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions]\n for (const action of actions) {\n const existing = actionToKeys.get(action) ?? []\n actionToKeys.set(action, [...existing, key])\n }\n }\n\n // Debug logging for stack:none and region:nyc\n const stackNone = actionToKeys.get('stack:none')\n const regionNyc = actionToKeys.get('region:nyc')\n if (stackNone || regionNyc) {\n console.log('getActionBindings:', { 'stack:none': stackNone, 'region:nyc': regionNyc })\n }\n\n return actionToKeys\n}\n\n// ============================================================================\n// Fuzzy Search Utilities\n// ============================================================================\n\n/**\n * Fuzzy match result\n */\nexport interface FuzzyMatchResult {\n /** Whether the pattern matched */\n matched: boolean\n /** Match score (higher = better) */\n score: number\n /** Matched character ranges for highlighting [start, end] */\n ranges: Array<[number, number]>\n}\n\n/**\n * Perform fuzzy matching of a pattern against text.\n * Returns match info including score and ranges for highlighting.\n *\n * Scoring:\n * - Consecutive matches score higher\n * - Matches at word boundaries score higher\n * - Earlier matches score higher\n */\nexport function fuzzyMatch(pattern: string, text: string): FuzzyMatchResult {\n if (!pattern) return { matched: true, score: 1, ranges: [] }\n if (!text) return { matched: false, score: 0, ranges: [] }\n\n const patternLower = pattern.toLowerCase()\n const textLower = text.toLowerCase()\n\n let patternIdx = 0\n let score = 0\n let consecutiveBonus = 0\n let lastMatchIdx = -2\n const ranges: Array<[number, number]> = []\n let rangeStart = -1\n\n for (let textIdx = 0; textIdx < textLower.length && patternIdx < patternLower.length; textIdx++) {\n if (textLower[textIdx] === patternLower[patternIdx]) {\n // Base score for match\n let matchScore = 1\n\n // Bonus for consecutive matches\n if (lastMatchIdx === textIdx - 1) {\n consecutiveBonus += 1\n matchScore += consecutiveBonus\n } else {\n consecutiveBonus = 0\n }\n\n // Bonus for word boundary match (start of word)\n if (textIdx === 0 || /[\\s\\-_./]/.test(text[textIdx - 1])) {\n matchScore += 2\n }\n\n // Bonus for matching uppercase (camelCase boundary)\n if (text[textIdx] === text[textIdx].toUpperCase() && /[a-z]/.test(text[textIdx].toLowerCase())) {\n matchScore += 1\n }\n\n // Penalty for later matches (prefer earlier matches)\n matchScore -= textIdx * 0.01\n\n score += matchScore\n lastMatchIdx = textIdx\n patternIdx++\n\n // Track ranges for highlighting\n if (rangeStart === -1) {\n rangeStart = textIdx\n }\n } else {\n // End current range\n if (rangeStart !== -1) {\n ranges.push([rangeStart, lastMatchIdx + 1])\n rangeStart = -1\n }\n }\n }\n\n // Close final range\n if (rangeStart !== -1) {\n ranges.push([rangeStart, lastMatchIdx + 1])\n }\n\n const matched = patternIdx === patternLower.length\n\n // Bonus for exact match\n if (matched && textLower === patternLower) {\n score += 10\n }\n\n // Bonus for prefix match\n if (matched && textLower.startsWith(patternLower)) {\n score += 5\n }\n\n return { matched, score, ranges }\n}\n\n/**\n * Search actions by query with fuzzy matching.\n *\n * @example\n * ```tsx\n * const results = searchActions('temp', actions, keymap)\n * // Returns ActionSearchResult[] sorted by relevance\n * ```\n */\nexport function searchActions(\n query: string,\n actions: ActionRegistry,\n keymap?: Record<string, string | string[]>,\n): ActionSearchResult[] {\n const actionBindings = keymap ? getActionBindings(keymap) : new Map<string, string[]>()\n const results: ActionSearchResult[] = []\n\n for (const [id, action] of Object.entries(actions)) {\n // Skip disabled actions\n if (action.enabled === false) continue\n\n // Match against multiple fields\n const labelMatch = fuzzyMatch(query, action.label)\n const descMatch = action.description ? fuzzyMatch(query, action.description) : { matched: false, score: 0, ranges: [] }\n const groupMatch = action.group ? fuzzyMatch(query, action.group) : { matched: false, score: 0, ranges: [] }\n const idMatch = fuzzyMatch(query, id)\n\n // Check keywords\n let keywordScore = 0\n if (action.keywords) {\n for (const keyword of action.keywords) {\n const kwMatch = fuzzyMatch(query, keyword)\n if (kwMatch.matched) {\n keywordScore = max(keywordScore, kwMatch.score)\n }\n }\n }\n\n // Calculate total score (label weighted highest)\n const matched = labelMatch.matched || descMatch.matched || groupMatch.matched || idMatch.matched || keywordScore > 0\n if (!matched && query) continue\n\n const score =\n (labelMatch.matched ? labelMatch.score * 3 : 0) +\n (descMatch.matched ? descMatch.score * 1.5 : 0) +\n (groupMatch.matched ? groupMatch.score * 1 : 0) +\n (idMatch.matched ? idMatch.score * 0.5 : 0) +\n keywordScore * 2\n\n results.push({\n id,\n action,\n bindings: actionBindings.get(id) ?? [],\n score,\n labelMatches: labelMatch.ranges,\n })\n }\n\n // Sort by score (descending)\n results.sort((a, b) => b.score - a.score)\n\n return results\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport {\n isModifierKey,\n isShiftedChar,\n normalizeKey,\n parseHotkeyString,\n} from './utils'\nimport type { KeyCombination, HotkeySequence } from './types'\n\n/**\n * Hotkey definition - maps key combinations/sequences to action names\n */\nexport type HotkeyMap = Record<string, string | string[]>\n\n/**\n * Handler map - maps action names to handler functions\n */\nexport type HandlerMap = Record<string, (e: KeyboardEvent) => void>\n\nexport interface UseHotkeysOptions {\n /** Whether hotkeys are enabled (default: true) */\n enabled?: boolean\n /** Element to attach listeners to (default: window) */\n target?: HTMLElement | Window | null\n /** Prevent default on matched hotkeys (default: true) */\n preventDefault?: boolean\n /** Stop propagation on matched hotkeys (default: true) */\n stopPropagation?: boolean\n /** Enable hotkeys even when focused on input/textarea/select (default: false) */\n enableOnFormTags?: boolean\n /** Timeout in ms for sequences (default: 1000) */\n sequenceTimeout?: number\n /** What happens on timeout: 'submit' executes current sequence, 'cancel' resets (default: 'submit') */\n onTimeout?: 'submit' | 'cancel'\n /** Called when sequence input starts */\n onSequenceStart?: (keys: HotkeySequence) => void\n /** Called when sequence progresses (new key added) */\n onSequenceProgress?: (keys: HotkeySequence) => void\n /** Called when sequence is cancelled (timeout with 'cancel' mode, or no match) */\n onSequenceCancel?: () => void\n}\n\nexport interface UseHotkeysResult {\n /** Keys pressed so far in current sequence */\n pendingKeys: HotkeySequence\n /** Whether currently awaiting more keys in a sequence */\n isAwaitingSequence: boolean\n /** Cancel the current sequence */\n cancelSequence: () => void\n /** When the current sequence timeout started (null if not awaiting) */\n timeoutStartedAt: number | null\n /** The sequence timeout duration in ms */\n sequenceTimeout: number\n}\n\n/**\n * Check if a keyboard event matches a KeyCombination\n */\nfunction matchesCombination(e: KeyboardEvent, combo: KeyCombination): boolean {\n const eventKey = normalizeKey(e.key)\n\n // For shifted characters (like ?, !, @), ignore shift key mismatch\n const shiftMatches = isShiftedChar(e.key)\n ? (combo.modifiers.shift ? e.shiftKey : true)\n : e.shiftKey === combo.modifiers.shift\n\n return (\n e.ctrlKey === combo.modifiers.ctrl &&\n e.altKey === combo.modifiers.alt &&\n shiftMatches &&\n e.metaKey === combo.modifiers.meta &&\n eventKey === combo.key\n )\n}\n\n/**\n * Create a KeyCombination from a KeyboardEvent\n */\nfunction eventToCombination(e: KeyboardEvent): KeyCombination {\n return {\n key: normalizeKey(e.key),\n modifiers: {\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n },\n }\n}\n\n/**\n * Check if a pending sequence matches the start of a hotkey sequence\n */\nfunction isPartialMatch(pending: HotkeySequence, target: HotkeySequence): boolean {\n if (pending.length >= target.length) return false\n for (let i = 0; i < pending.length; i++) {\n if (!combinationsMatch(pending[i], target[i])) {\n return false\n }\n }\n return true\n}\n\n/**\n * Check if two key combinations match (handles shifted chars like ?)\n */\nfunction combinationsMatch(event: KeyCombination, target: KeyCombination): boolean {\n // For shifted characters (like ?, !, @), ignore shift key mismatch\n const shiftMatches = isShiftedChar(event.key)\n ? (target.modifiers.shift ? event.modifiers.shift : true)\n : event.modifiers.shift === target.modifiers.shift\n\n return (\n event.modifiers.ctrl === target.modifiers.ctrl &&\n event.modifiers.alt === target.modifiers.alt &&\n shiftMatches &&\n event.modifiers.meta === target.modifiers.meta &&\n event.key === target.key\n )\n}\n\n/**\n * Check if two sequences are exactly equal\n */\nfunction sequencesMatch(a: HotkeySequence, b: HotkeySequence): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!combinationsMatch(a[i], b[i])) {\n return false\n }\n }\n return true\n}\n\n/**\n * Hook to register keyboard shortcuts with sequence support.\n *\n * @example\n * ```tsx\n * // Single keys\n * const { pendingKeys } = useHotkeys(\n * { 't': 'setTemp', 'ctrl+s': 'save' },\n * { setTemp: () => setMetric('temp'), save: handleSave }\n * )\n *\n * // Sequences\n * const { pendingKeys, isAwaitingSequence } = useHotkeys(\n * { '2 w': 'twoWeeks', '2 d': 'twoDays' },\n * { twoWeeks: () => setRange('2w'), twoDays: () => setRange('2d') },\n * { sequenceTimeout: 1000 }\n * )\n * ```\n */\nexport function useHotkeys(\n keymap: HotkeyMap,\n handlers: HandlerMap,\n options: UseHotkeysOptions = {},\n): UseHotkeysResult {\n const {\n enabled = true,\n target,\n preventDefault = true,\n stopPropagation = true,\n enableOnFormTags = false,\n sequenceTimeout = 1000,\n onTimeout = 'submit',\n onSequenceStart,\n onSequenceProgress,\n onSequenceCancel,\n } = options\n\n const [pendingKeys, setPendingKeys] = useState<HotkeySequence>([])\n const [isAwaitingSequence, setIsAwaitingSequence] = useState(false)\n const [timeoutStartedAt, setTimeoutStartedAt] = useState<number | null>(null)\n\n // Use refs for handlers to avoid re-attaching listeners\n const handlersRef = useRef(handlers)\n handlersRef.current = handlers\n\n const keymapRef = useRef(keymap)\n keymapRef.current = keymap\n\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Use ref for pendingKeys to avoid stale closure in event handlers\n const pendingKeysRef = useRef<HotkeySequence>([])\n pendingKeysRef.current = pendingKeys\n\n // Parse keymap into sequences for matching\n const parsedKeymapRef = useRef<Array<{ key: string; sequence: HotkeySequence; actions: string[] }>>([])\n\n useEffect(() => {\n parsedKeymapRef.current = Object.entries(keymap).map(([key, actionOrActions]) => ({\n key,\n sequence: parseHotkeyString(key),\n actions: Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions],\n }))\n }, [keymap])\n\n const clearPending = useCallback(() => {\n setPendingKeys([])\n setIsAwaitingSequence(false)\n setTimeoutStartedAt(null)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n }, [])\n\n const cancelSequence = useCallback(() => {\n clearPending()\n onSequenceCancel?.()\n }, [clearPending, onSequenceCancel])\n\n // Try to execute a handler for the given sequence\n const tryExecute = useCallback((\n sequence: HotkeySequence,\n e: KeyboardEvent,\n ): boolean => {\n for (const entry of parsedKeymapRef.current) {\n if (sequencesMatch(sequence, entry.sequence)) {\n for (const action of entry.actions) {\n const handler = handlersRef.current[action]\n if (handler) {\n if (preventDefault) {\n e.preventDefault()\n }\n if (stopPropagation) {\n e.stopPropagation()\n }\n handler(e)\n return true\n }\n }\n }\n }\n return false\n }, [preventDefault, stopPropagation])\n\n // Check if sequence has any potential matches (partial or full)\n const hasPotentialMatch = useCallback((sequence: HotkeySequence): boolean => {\n for (const entry of parsedKeymapRef.current) {\n if (isPartialMatch(sequence, entry.sequence) || sequencesMatch(sequence, entry.sequence)) {\n return true\n }\n }\n return false\n }, [])\n\n // Check if there are any sequences that start with current pending\n const hasSequenceExtension = useCallback((sequence: HotkeySequence): boolean => {\n for (const entry of parsedKeymapRef.current) {\n if (entry.sequence.length > sequence.length && isPartialMatch(sequence, entry.sequence)) {\n return true\n }\n }\n return false\n }, [])\n\n useEffect(() => {\n if (!enabled) return\n\n const targetElement = target ?? window\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Skip if focused on form element (unless enabled)\n if (!enableOnFormTags) {\n const eventTarget = e.target as HTMLElement\n if (\n eventTarget instanceof HTMLInputElement ||\n eventTarget instanceof HTMLTextAreaElement ||\n eventTarget instanceof HTMLSelectElement ||\n eventTarget.isContentEditable\n ) {\n return\n }\n }\n\n // Skip modifier-only keypresses\n if (isModifierKey(e.key)) {\n return\n }\n\n // Clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n\n // Enter key submits current sequence\n if (e.key === 'Enter' && pendingKeysRef.current.length > 0) {\n e.preventDefault()\n const executed = tryExecute(pendingKeysRef.current, e)\n clearPending()\n if (!executed) {\n onSequenceCancel?.()\n }\n return\n }\n\n // Escape cancels current sequence\n if (e.key === 'Escape' && pendingKeysRef.current.length > 0) {\n e.preventDefault()\n cancelSequence()\n return\n }\n\n // Add current key to sequence\n const currentCombo = eventToCombination(e)\n const newSequence = [...pendingKeysRef.current, currentCombo]\n\n // Check for exact match first\n const exactMatch = tryExecute(newSequence, e)\n if (exactMatch) {\n clearPending()\n return\n }\n\n // Check if this could be the start of a longer sequence\n if (hasPotentialMatch(newSequence)) {\n // Check if there are longer sequences this could match\n if (hasSequenceExtension(newSequence)) {\n // Wait for more keys\n setPendingKeys(newSequence)\n setIsAwaitingSequence(true)\n\n if (pendingKeysRef.current.length === 0) {\n onSequenceStart?.(newSequence)\n } else {\n onSequenceProgress?.(newSequence)\n }\n\n // Set timeout\n setTimeoutStartedAt(Date.now())\n timeoutRef.current = setTimeout(() => {\n if (onTimeout === 'submit') {\n // Try to execute whatever we have\n // Note: We need to get the current pending keys from state\n setPendingKeys(current => {\n if (current.length > 0) {\n // We can't call tryExecute here because we don't have the event\n // So we'll just clear and call onSequenceCancel\n onSequenceCancel?.()\n }\n return []\n })\n setIsAwaitingSequence(false)\n setTimeoutStartedAt(null)\n } else {\n // Cancel mode\n setPendingKeys([])\n setIsAwaitingSequence(false)\n setTimeoutStartedAt(null)\n onSequenceCancel?.()\n }\n timeoutRef.current = null\n }, sequenceTimeout)\n\n // Prevent default for potential sequence keys\n if (preventDefault) {\n e.preventDefault()\n }\n return\n }\n }\n\n // No match and no potential - reset and try single key\n if (pendingKeysRef.current.length > 0) {\n clearPending()\n onSequenceCancel?.()\n }\n\n // Try as single key (sequence of 1)\n const singleMatch = tryExecute([currentCombo], e)\n if (!singleMatch) {\n // Check if single key could start a sequence\n if (hasSequenceExtension([currentCombo])) {\n setPendingKeys([currentCombo])\n setIsAwaitingSequence(true)\n onSequenceStart?.([currentCombo])\n\n if (preventDefault) {\n e.preventDefault()\n }\n\n // Set timeout\n setTimeoutStartedAt(Date.now())\n timeoutRef.current = setTimeout(() => {\n if (onTimeout === 'submit') {\n setPendingKeys([])\n setIsAwaitingSequence(false)\n setTimeoutStartedAt(null)\n onSequenceCancel?.()\n } else {\n setPendingKeys([])\n setIsAwaitingSequence(false)\n setTimeoutStartedAt(null)\n onSequenceCancel?.()\n }\n timeoutRef.current = null\n }, sequenceTimeout)\n }\n }\n }\n\n targetElement.addEventListener('keydown', handleKeyDown as EventListener)\n\n return () => {\n targetElement.removeEventListener('keydown', handleKeyDown as EventListener)\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n }\n }\n }, [\n enabled,\n target,\n preventDefault,\n stopPropagation,\n enableOnFormTags,\n sequenceTimeout,\n onTimeout,\n clearPending,\n cancelSequence,\n tryExecute,\n hasPotentialMatch,\n hasSequenceExtension,\n onSequenceStart,\n onSequenceProgress,\n onSequenceCancel,\n ])\n\n return { pendingKeys, isAwaitingSequence, cancelSequence, timeoutStartedAt, sequenceTimeout }\n}\n","import { createContext, useCallback, useContext, useEffect, useMemo, useState, type ReactNode } from 'react'\nimport { ActionsRegistryContext, useActionsRegistry } from './ActionsRegistry'\nimport { useHotkeys } from './useHotkeys'\nimport { findConflicts, getSequenceCompletions, searchActions } from './utils'\nimport type { ActionsRegistryValue } from './ActionsRegistry'\nimport type { HotkeySequence } from './types'\n\n/**\n * Configuration for the HotkeysProvider.\n */\nexport interface HotkeysConfig {\n /** Storage key for persisting user binding overrides */\n storageKey?: string\n\n /** Timeout in ms before a sequence auto-submits (default: 1000) */\n sequenceTimeout?: number\n\n /** When true, keys with conflicts are disabled (default: true) */\n disableConflicts?: boolean\n\n /** Minimum viewport width to enable hotkeys (false = always enabled) */\n minViewportWidth?: number | false\n\n /** Whether to show hotkey UI on touch-only devices (default: false) */\n enableOnTouch?: boolean\n\n /** Key sequence to open shortcuts modal (false to disable) */\n modalTrigger?: string | false\n\n /** Key sequence to open omnibar (false to disable) */\n omnibarTrigger?: string | false\n}\n\n/**\n * Context value for hotkeys.\n */\nexport interface HotkeysContextValue {\n /** The actions registry */\n registry: ActionsRegistryValue\n /** Whether hotkeys are enabled (based on viewport/touch) */\n isEnabled: boolean\n /** Modal open state */\n isModalOpen: boolean\n /** Open the shortcuts modal */\n openModal: () => void\n /** Close the shortcuts modal */\n closeModal: () => void\n /** Toggle the shortcuts modal */\n toggleModal: () => void\n /** Omnibar open state */\n isOmnibarOpen: boolean\n /** Open the omnibar */\n openOmnibar: () => void\n /** Close the omnibar */\n closeOmnibar: () => void\n /** Toggle the omnibar */\n toggleOmnibar: () => void\n /** Execute an action by ID */\n executeAction: (id: string) => void\n /** Sequence state: pending key combinations */\n pendingKeys: HotkeySequence\n /** Sequence state: whether waiting for more keys */\n isAwaitingSequence: boolean\n /** Sequence state: when the timeout started */\n sequenceTimeoutStartedAt: number | null\n /** Sequence state: timeout duration in ms */\n sequenceTimeout: number\n /** Map of key -> actions[] for keys with multiple actions bound */\n conflicts: Map<string, string[]>\n /** Whether there are any conflicts */\n hasConflicts: boolean\n /** Search actions by query */\n searchActions: (query: string) => ReturnType<typeof searchActions>\n /** Get sequence completions for pending keys */\n getCompletions: (pendingKeys: HotkeySequence) => ReturnType<typeof getSequenceCompletions>\n}\n\nconst HotkeysContext = createContext<HotkeysContextValue | null>(null)\n\nconst DEFAULT_CONFIG: Required<HotkeysConfig> = {\n storageKey: 'use-kbd',\n sequenceTimeout: 1000,\n disableConflicts: true,\n minViewportWidth: 768,\n enableOnTouch: false,\n modalTrigger: '?',\n omnibarTrigger: 'meta+k',\n}\n\nexport interface HotkeysProviderProps {\n config?: HotkeysConfig\n children: ReactNode\n}\n\n/**\n * Provider for hotkey registration via useAction.\n *\n * Components register their own actions using the useAction hook.\n *\n * @example\n * ```tsx\n * function App() {\n * return (\n * <HotkeysProvider config={{ storageKey: 'my-app' }}>\n * <Dashboard />\n * <ShortcutsModal />\n * <Omnibar />\n * <SequenceModal />\n * </HotkeysProvider>\n * )\n * }\n *\n * function Dashboard() {\n * const { save } = useDocument()\n *\n * useAction('doc:save', {\n * label: 'Save document',\n * group: 'Document',\n * defaultBindings: ['meta+s'],\n * handler: save,\n * })\n *\n * return <Editor />\n * }\n * ```\n */\nexport function HotkeysProvider({\n config: configProp = {},\n children,\n}: HotkeysProviderProps) {\n const config = useMemo<Required<HotkeysConfig>>(() => ({\n ...DEFAULT_CONFIG,\n ...configProp,\n }), [configProp])\n\n // Create the actions registry\n const registry = useActionsRegistry({ storageKey: config.storageKey })\n\n // Check if hotkeys should be enabled\n const [isEnabled, setIsEnabled] = useState(true)\n\n useEffect(() => {\n if (typeof window === 'undefined') return\n\n const checkEnabled = () => {\n if (config.minViewportWidth !== false) {\n if (window.innerWidth < config.minViewportWidth) {\n setIsEnabled(false)\n return\n }\n }\n\n if (!config.enableOnTouch) {\n const hasHover = window.matchMedia('(hover: hover)').matches\n if (!hasHover) {\n setIsEnabled(false)\n return\n }\n }\n\n setIsEnabled(true)\n }\n\n checkEnabled()\n window.addEventListener('resize', checkEnabled)\n return () => window.removeEventListener('resize', checkEnabled)\n }, [config.minViewportWidth, config.enableOnTouch])\n\n // Modal state - persisted to sessionStorage\n const modalStorageKey = `${config.storageKey}-modal-open`\n const [isModalOpen, setIsModalOpen] = useState(() => {\n if (typeof window === 'undefined') return false\n return sessionStorage.getItem(modalStorageKey) === 'true'\n })\n useEffect(() => {\n sessionStorage.setItem(modalStorageKey, String(isModalOpen))\n }, [modalStorageKey, isModalOpen])\n const openModal = useCallback(() => setIsModalOpen(true), [])\n const closeModal = useCallback(() => setIsModalOpen(false), [])\n const toggleModal = useCallback(() => setIsModalOpen(prev => !prev), [])\n\n // Omnibar state\n const [isOmnibarOpen, setIsOmnibarOpen] = useState(false)\n const openOmnibar = useCallback(() => setIsOmnibarOpen(true), [])\n const closeOmnibar = useCallback(() => setIsOmnibarOpen(false), [])\n const toggleOmnibar = useCallback(() => setIsOmnibarOpen(prev => !prev), [])\n\n // Build keymap with built-in triggers\n const keymap = useMemo(() => {\n const map = { ...registry.keymap }\n\n if (config.modalTrigger !== false) {\n map[config.modalTrigger] = '__hotkeys:modal'\n }\n if (config.omnibarTrigger !== false) {\n map[config.omnibarTrigger] = '__hotkeys:omnibar'\n }\n\n return map\n }, [registry.keymap, config.modalTrigger, config.omnibarTrigger])\n\n // Compute conflicts\n const conflicts = useMemo(() => findConflicts(keymap), [keymap])\n const hasConflicts = conflicts.size > 0\n\n // Effective keymap (without conflicts if disabled)\n const effectiveKeymap = useMemo(() => {\n if (!config.disableConflicts || conflicts.size === 0) {\n return keymap\n }\n const filtered: typeof keymap = {}\n for (const [key, action] of Object.entries(keymap)) {\n if (!conflicts.has(key)) {\n filtered[key] = action\n }\n }\n return filtered\n }, [keymap, conflicts, config.disableConflicts])\n\n // Build handlers map\n const handlers = useMemo(() => {\n const map: Record<string, () => void> = {}\n\n for (const [id, action] of registry.actions) {\n map[id] = action.config.handler\n }\n\n // Built-in triggers\n map['__hotkeys:modal'] = toggleModal\n map['__hotkeys:omnibar'] = toggleOmnibar\n\n return map\n }, [registry.actions, toggleModal, toggleOmnibar])\n\n // Register hotkeys\n const hotkeysEnabled = isEnabled && !isModalOpen && !isOmnibarOpen\n const {\n pendingKeys,\n isAwaitingSequence,\n timeoutStartedAt: sequenceTimeoutStartedAt,\n sequenceTimeout,\n } = useHotkeys(effectiveKeymap, handlers, {\n enabled: hotkeysEnabled,\n sequenceTimeout: config.sequenceTimeout,\n })\n\n // Search helper\n const searchActionsHelper = useCallback(\n (query: string) => searchActions(query, registry.actionRegistry, keymap),\n [registry.actionRegistry, keymap]\n )\n\n // Completions helper\n const getCompletions = useCallback(\n (pending: HotkeySequence) => getSequenceCompletions(pending, keymap),\n [keymap]\n )\n\n const value = useMemo<HotkeysContextValue>(() => ({\n registry,\n isEnabled,\n isModalOpen,\n openModal,\n closeModal,\n toggleModal,\n isOmnibarOpen,\n openOmnibar,\n closeOmnibar,\n toggleOmnibar,\n executeAction: registry.execute,\n pendingKeys,\n isAwaitingSequence,\n sequenceTimeoutStartedAt,\n sequenceTimeout,\n conflicts,\n hasConflicts,\n searchActions: searchActionsHelper,\n getCompletions,\n }), [\n registry,\n isEnabled,\n isModalOpen,\n openModal,\n closeModal,\n toggleModal,\n isOmnibarOpen,\n openOmnibar,\n closeOmnibar,\n toggleOmnibar,\n pendingKeys,\n isAwaitingSequence,\n sequenceTimeoutStartedAt,\n sequenceTimeout,\n conflicts,\n hasConflicts,\n searchActionsHelper,\n getCompletions,\n ])\n\n return (\n <ActionsRegistryContext.Provider value={registry}>\n <HotkeysContext.Provider value={value}>\n {children}\n </HotkeysContext.Provider>\n </ActionsRegistryContext.Provider>\n )\n}\n\n/**\n * Hook to access the hotkeys context.\n * Must be used within a HotkeysProvider.\n */\nexport function useHotkeysContext(): HotkeysContextValue {\n const context = useContext(HotkeysContext)\n if (!context) {\n throw new Error('useHotkeysContext must be used within a HotkeysProvider')\n }\n return context\n}\n\n/**\n * Hook to optionally access hotkeys context.\n */\nexport function useMaybeHotkeysContext(): HotkeysContextValue | null {\n return useContext(HotkeysContext)\n}\n","import { useContext, useEffect, useRef } from 'react'\nimport { ActionsRegistryContext } from './ActionsRegistry'\n\nexport interface ActionConfig {\n /** Human-readable label for omnibar/modal */\n label: string\n /** Group name for organizing in modal */\n group?: string\n /** Default key bindings (user can override) */\n defaultBindings?: string[]\n /** Search keywords for omnibar */\n keywords?: string[]\n /** The action handler */\n handler: () => void\n /** Whether action is currently enabled (default: true) */\n enabled?: boolean\n /** Priority for conflict resolution (higher wins, default: 0) */\n priority?: number\n}\n\n/**\n * Register an action with the hotkeys system.\n *\n * Actions are automatically unregistered when the component unmounts,\n * making this ideal for colocating actions with their handlers.\n *\n * @example\n * ```tsx\n * function DataTable() {\n * const { prevPage, nextPage } = usePagination()\n *\n * useAction('table:prev-page', {\n * label: 'Previous page',\n * group: 'Table Navigation',\n * defaultBindings: [','],\n * handler: prevPage,\n * })\n *\n * useAction('table:next-page', {\n * label: 'Next page',\n * group: 'Table Navigation',\n * defaultBindings: ['.'],\n * handler: nextPage,\n * })\n * }\n * ```\n */\nexport function useAction(id: string, config: ActionConfig): void {\n const registry = useContext(ActionsRegistryContext)\n if (!registry) {\n throw new Error('useAction must be used within a HotkeysProvider')\n }\n\n // Keep registry in a ref to avoid re-running effect when registry object changes\n const registryRef = useRef(registry)\n registryRef.current = registry\n\n // Keep handler in a ref so we don't re-register on every render\n const handlerRef = useRef(config.handler)\n handlerRef.current = config.handler\n\n // Keep enabled state in ref too\n const enabledRef = useRef(config.enabled ?? true)\n enabledRef.current = config.enabled ?? true\n\n useEffect(() => {\n registryRef.current.register(id, {\n ...config,\n handler: () => {\n if (enabledRef.current) {\n handlerRef.current()\n }\n },\n })\n\n return () => {\n registryRef.current.unregister(id)\n }\n }, [\n id,\n config.label,\n config.group,\n // Compare bindings by value\n JSON.stringify(config.defaultBindings),\n JSON.stringify(config.keywords),\n config.priority,\n ])\n}\n\n/**\n * Register multiple actions at once.\n * Useful when you have several related actions in one component.\n *\n * @example\n * ```tsx\n * useActions({\n * 'left:temp': { label: 'Temperature', defaultBindings: ['t'], handler: () => setMetric('temp') },\n * 'left:co2': { label: 'CO₂', defaultBindings: ['c'], handler: () => setMetric('co2') },\n * })\n * ```\n */\nexport function useActions(actions: Record<string, ActionConfig>): void {\n const registry = useContext(ActionsRegistryContext)\n if (!registry) {\n throw new Error('useActions must be used within a HotkeysProvider')\n }\n\n // Keep registry in a ref to avoid re-running effect when registry object changes\n const registryRef = useRef(registry)\n registryRef.current = registry\n\n // Keep handlers in refs\n const handlersRef = useRef<Record<string, () => void>>({})\n const enabledRef = useRef<Record<string, boolean>>({})\n\n for (const [id, config] of Object.entries(actions)) {\n handlersRef.current[id] = config.handler\n enabledRef.current[id] = config.enabled ?? true\n }\n\n useEffect(() => {\n for (const [id, config] of Object.entries(actions)) {\n registryRef.current.register(id, {\n ...config,\n handler: () => {\n if (enabledRef.current[id]) {\n handlersRef.current[id]?.()\n }\n },\n })\n }\n\n return () => {\n for (const id of Object.keys(actions)) {\n registryRef.current.unregister(id)\n }\n }\n }, [\n // Re-register if action set changes\n JSON.stringify(\n Object.entries(actions).map(([id, c]) => [\n id,\n c.label,\n c.group,\n c.defaultBindings,\n c.keywords,\n c.priority,\n ])\n ),\n ])\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { formatCombination, isModifierKey, normalizeKey } from './utils'\nimport type { KeyCombination, HotkeySequence, RecordHotkeyOptions, RecordHotkeyResult } from './types'\n\n/** Store callback in ref to avoid effect re-runs when callback changes */\nfunction useEventCallback<T extends (...args: never[]) => unknown>(fn: T | undefined): T | undefined {\n const ref = useRef(fn)\n ref.current = fn\n return useCallback(((...args) => ref.current?.(...args)) as T, [])\n}\n\n/**\n * Hook to record a keyboard shortcut (single key or sequence) from user input.\n *\n * Recording behavior:\n * - Each key press (after modifiers released) adds to the sequence\n * - Enter key submits the current sequence\n * - Timeout submits the current sequence (configurable)\n * - Escape cancels recording\n *\n * @example\n * ```tsx\n * function KeybindingEditor() {\n * const { isRecording, startRecording, sequence, display, pendingKeys, activeKeys } = useRecordHotkey({\n * onCapture: (sequence, display) => {\n * console.log('Captured:', display.display) // \"2 W\" or \"⌘K\"\n * saveKeybinding(display.id) // \"2 w\" or \"meta+k\"\n * },\n * sequenceTimeout: 1000,\n * })\n *\n * return (\n * <button onClick={() => startRecording()}>\n * {isRecording\n * ? (pendingKeys.length > 0\n * ? formatCombination(pendingKeys).display + '...'\n * : 'Press keys...')\n * : (display?.display ?? 'Click to set')}\n * </button>\n * )\n * }\n * ```\n */\nexport function useRecordHotkey(options: RecordHotkeyOptions = {}): RecordHotkeyResult {\n const {\n onCapture: onCaptureProp,\n onCancel: onCancelProp,\n onTab: onTabProp,\n onShiftTab: onShiftTabProp,\n preventDefault = true,\n sequenceTimeout = 1000,\n pauseTimeout = false,\n } = options\n\n // Stabilize callbacks to avoid effect re-runs\n const onCapture = useEventCallback(onCaptureProp)\n const onCancel = useEventCallback(onCancelProp)\n const onTab = useEventCallback(onTabProp)\n const onShiftTab = useEventCallback(onShiftTabProp)\n\n const [isRecording, setIsRecording] = useState(false)\n const [sequence, setSequence] = useState<HotkeySequence | null>(null)\n const [pendingKeys, setPendingKeys] = useState<HotkeySequence>([])\n const [activeKeys, setActiveKeys] = useState<KeyCombination | null>(null)\n\n // Track pressed keys during recording\n const pressedKeysRef = useRef<Set<string>>(new Set())\n const hasNonModifierRef = useRef(false)\n const currentComboRef = useRef<KeyCombination | null>(null)\n const timeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n\n // Keep pauseTimeout in a ref for synchronous access in handlers\n const pauseTimeoutRef = useRef(pauseTimeout)\n pauseTimeoutRef.current = pauseTimeout\n\n // Keep a ref in sync with pendingKeys for synchronous access in event handlers\n // (React 18 batching can delay useState updates)\n const pendingKeysRef = useRef<HotkeySequence>([])\n\n const clearTimeout_ = useCallback(() => {\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n }, [])\n\n const submit = useCallback((seq: HotkeySequence) => {\n if (seq.length === 0) return\n\n const display = formatCombination(seq)\n\n // Clear state\n clearTimeout_()\n pressedKeysRef.current.clear()\n hasNonModifierRef.current = false\n currentComboRef.current = null\n\n setSequence(seq)\n pendingKeysRef.current = []\n setPendingKeys([])\n setIsRecording(false)\n setActiveKeys(null)\n\n onCapture?.(seq, display)\n }, [clearTimeout_, onCapture])\n\n const cancel = useCallback(() => {\n clearTimeout_()\n setIsRecording(false)\n pendingKeysRef.current = []\n setPendingKeys([])\n setActiveKeys(null)\n pressedKeysRef.current.clear()\n hasNonModifierRef.current = false\n currentComboRef.current = null\n onCancel?.()\n }, [clearTimeout_, onCancel])\n\n // Commit pending keys immediately (if any), otherwise cancel\n const commit = useCallback(() => {\n // Read from ref for synchronous access\n const current = pendingKeysRef.current\n if (current.length > 0) {\n submit(current)\n } else {\n cancel()\n }\n }, [submit, cancel])\n\n const startRecording = useCallback(() => {\n clearTimeout_()\n setIsRecording(true)\n setSequence(null)\n pendingKeysRef.current = []\n setPendingKeys([])\n setActiveKeys(null)\n pressedKeysRef.current.clear()\n hasNonModifierRef.current = false\n currentComboRef.current = null\n\n // Return cancel function\n return cancel\n }, [cancel, clearTimeout_])\n\n // Manage timeout based on pauseTimeout state\n useEffect(() => {\n if (pauseTimeout) {\n // Pause: clear any existing timeout\n if (timeoutRef.current) {\n clearTimeout(timeoutRef.current)\n timeoutRef.current = null\n }\n } else if (isRecording && pendingKeysRef.current.length > 0 && !timeoutRef.current) {\n // Resume: start a new timeout if we have pending keys and no timeout running\n const currentSequence = pendingKeysRef.current\n timeoutRef.current = setTimeout(() => {\n submit(currentSequence)\n }, sequenceTimeout)\n }\n }, [pauseTimeout, isRecording, sequenceTimeout, submit])\n\n useEffect(() => {\n if (!isRecording) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Handle Tab BEFORE preventDefault - let browser handle focus navigation\n // This enables native tab order through focusable kbd elements\n if (e.key === 'Tab') {\n clearTimeout_()\n\n // Read pending keys from ref (synchronous, unaffected by React batching)\n // Also include any key currently being held (Tab might fire before keyup)\n const pendingSeq = [...pendingKeysRef.current]\n if (hasNonModifierRef.current && currentComboRef.current) {\n pendingSeq.push(currentComboRef.current)\n }\n\n // Clear all state\n pendingKeysRef.current = []\n setPendingKeys([])\n pressedKeysRef.current.clear()\n hasNonModifierRef.current = false\n currentComboRef.current = null\n setActiveKeys(null)\n setIsRecording(false)\n\n // Call onCapture with pending keys (if any)\n if (pendingSeq.length > 0) {\n const display = formatCombination(pendingSeq)\n onCapture?.(pendingSeq, display)\n }\n\n // Call legacy onTab/onShiftTab if provided (for backwards compat)\n if (!e.shiftKey && onTab) {\n e.preventDefault()\n e.stopPropagation()\n onTab()\n } else if (e.shiftKey && onShiftTab) {\n e.preventDefault()\n e.stopPropagation()\n onShiftTab()\n }\n // Otherwise let browser handle focus navigation naturally\n return\n }\n\n if (preventDefault) {\n e.preventDefault()\n e.stopPropagation()\n }\n\n // Clear timeout on any keypress\n clearTimeout_()\n\n // Enter submits current sequence\n if (e.key === 'Enter') {\n setPendingKeys(current => {\n if (current.length > 0) {\n submit(current)\n }\n return current\n })\n return\n }\n\n // Escape cancels\n if (e.key === 'Escape') {\n cancel()\n return\n }\n\n // Use e.code when Alt is pressed (macOS transforms Alt+key into special chars)\n // e.code gives physical key like \"KeyH\", extract the letter\n let key = e.key\n if (e.altKey && e.code.startsWith('Key')) {\n key = e.code.slice(3).toLowerCase()\n } else if (e.altKey && e.code.startsWith('Digit')) {\n key = e.code.slice(5)\n }\n pressedKeysRef.current.add(key)\n\n // Build current combination from pressed keys\n const combo: KeyCombination = {\n key: '',\n modifiers: {\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey,\n meta: e.metaKey,\n },\n }\n\n // Find the non-modifier key\n for (const k of pressedKeysRef.current) {\n if (!isModifierKey(k)) {\n combo.key = normalizeKey(k)\n hasNonModifierRef.current = true\n break\n }\n }\n\n // Only update if we have a non-modifier key\n if (combo.key) {\n currentComboRef.current = combo\n setActiveKeys(combo)\n } else {\n // Show modifiers being held\n setActiveKeys({\n key: '',\n modifiers: combo.modifiers,\n })\n }\n }\n\n const handleKeyUp = (e: KeyboardEvent) => {\n if (preventDefault) {\n e.preventDefault()\n e.stopPropagation()\n }\n\n // Use same key extraction as keydown\n let key = e.key\n if (e.altKey && e.code.startsWith('Key')) {\n key = e.code.slice(3).toLowerCase()\n } else if (e.altKey && e.code.startsWith('Digit')) {\n key = e.code.slice(5)\n }\n pressedKeysRef.current.delete(key)\n\n // On Mac, releasing Meta swallows other keyup events, so check if we have a valid\n // combination when Meta is released (or when all keys are released)\n const shouldComplete =\n (pressedKeysRef.current.size === 0) ||\n (e.key === 'Meta' && hasNonModifierRef.current)\n\n if (shouldComplete && hasNonModifierRef.current && currentComboRef.current) {\n const combo = currentComboRef.current\n\n // Clear for next key in sequence\n pressedKeysRef.current.clear()\n hasNonModifierRef.current = false\n currentComboRef.current = null\n setActiveKeys(null)\n\n // Add to pending sequence (update both ref and state)\n const newSequence = [...pendingKeysRef.current, combo]\n pendingKeysRef.current = newSequence\n setPendingKeys(newSequence)\n\n // Set timeout to submit (unless paused)\n clearTimeout_()\n if (!pauseTimeoutRef.current) {\n timeoutRef.current = setTimeout(() => {\n submit(newSequence)\n }, sequenceTimeout)\n }\n }\n }\n\n // Capture phase to intercept before other handlers\n window.addEventListener('keydown', handleKeyDown, true)\n window.addEventListener('keyup', handleKeyUp, true)\n\n return () => {\n window.removeEventListener('keydown', handleKeyDown, true)\n window.removeEventListener('keyup', handleKeyUp, true)\n clearTimeout_()\n }\n }, [isRecording, preventDefault, sequenceTimeout, clearTimeout_, submit, cancel, onCapture, onTab, onShiftTab])\n\n const display = sequence ? formatCombination(sequence) : null\n\n // Backwards compatibility: return first key as combination\n const combination = sequence && sequence.length > 0 ? sequence[0] : null\n\n return {\n isRecording,\n startRecording,\n cancel,\n commit,\n sequence,\n display,\n pendingKeys,\n activeKeys,\n combination, // deprecated\n }\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useHotkeys, HotkeyMap, HandlerMap, UseHotkeysOptions } from './useHotkeys'\nimport { findConflicts } from './utils'\nimport type { HotkeySequence } from './types'\n\nexport interface UseEditableHotkeysOptions extends UseHotkeysOptions {\n /** localStorage key for persistence (omit to disable persistence) */\n storageKey?: string\n /** When true, keys with multiple actions bound are disabled (default: true) */\n disableConflicts?: boolean\n}\n\nexport interface UseEditableHotkeysResult {\n /** Current keymap (defaults merged with user overrides) */\n keymap: HotkeyMap\n /** Update a single keybinding */\n setBinding: (action: string, key: string) => void\n /** Update multiple keybindings at once */\n setKeymap: (overrides: Partial<HotkeyMap>) => void\n /** Reset all overrides to defaults */\n reset: () => void\n /** User overrides only (for inspection/export) */\n overrides: Partial<HotkeyMap>\n /** Map of key -> actions[] for keys with multiple actions bound */\n conflicts: Map<string, string[]>\n /** Whether there are any conflicts in the current keymap */\n hasConflicts: boolean\n /** Keys pressed so far in current sequence */\n pendingKeys: HotkeySequence\n /** Whether currently awaiting more keys in a sequence */\n isAwaitingSequence: boolean\n /** Cancel the current sequence */\n cancelSequence: () => void\n /** When the current sequence timeout started (null if not awaiting) */\n timeoutStartedAt: number | null\n /** The sequence timeout duration in ms */\n sequenceTimeout: number\n}\n\n/**\n * Wraps useHotkeys with editable keybindings and optional persistence.\n *\n * @example\n * ```tsx\n * const { keymap, setBinding, reset } = useEditableHotkeys(\n * { 't': 'setTemp', 'c': 'setCO2' },\n * { setTemp: () => setMetric('temp'), setCO2: () => setMetric('co2') },\n * { storageKey: 'app-hotkeys' }\n * )\n * ```\n */\nexport function useEditableHotkeys(\n defaults: HotkeyMap,\n handlers: HandlerMap,\n options: UseEditableHotkeysOptions = {},\n): UseEditableHotkeysResult {\n const { storageKey, disableConflicts = true, ...hotkeyOptions } = options\n\n // Load overrides from storage on mount\n const [overrides, setOverrides] = useState<Partial<HotkeyMap>>(() => {\n if (!storageKey || typeof window === 'undefined') return {}\n try {\n const stored = localStorage.getItem(storageKey)\n return stored ? JSON.parse(stored) : {}\n } catch {\n return {}\n }\n })\n\n // Persist overrides to storage\n useEffect(() => {\n if (!storageKey || typeof window === 'undefined') return\n try {\n if (Object.keys(overrides).length === 0) {\n localStorage.removeItem(storageKey)\n } else {\n localStorage.setItem(storageKey, JSON.stringify(overrides))\n }\n } catch {\n // Ignore storage errors\n }\n }, [storageKey, overrides])\n\n // Merge defaults with overrides (invert the map: action -> key becomes key -> action)\n const keymap = useMemo(() => {\n // Build action -> key map from defaults\n const actionToKey: Record<string, string> = {}\n for (const [key, action] of Object.entries(defaults)) {\n const actions = Array.isArray(action) ? action : [action]\n for (const a of actions) {\n actionToKey[a] = key\n }\n }\n\n // Apply overrides (key -> action)\n for (const [key, action] of Object.entries(overrides)) {\n if (action === undefined) continue\n const actions = Array.isArray(action) ? action : [action]\n for (const a of actions) {\n actionToKey[a] = key\n }\n }\n\n // Rebuild key -> action map\n const result: HotkeyMap = {}\n for (const [action, key] of Object.entries(actionToKey)) {\n if (result[key]) {\n const existing = result[key]\n result[key] = Array.isArray(existing) ? [...existing, action] : [existing, action]\n } else {\n result[key] = action\n }\n }\n\n return result\n }, [defaults, overrides])\n\n // Compute conflicts from current keymap\n const conflicts = useMemo(() => findConflicts(keymap), [keymap])\n const hasConflictsValue = conflicts.size > 0\n\n // Effective keymap for useHotkeys - removes conflicting keys if disableConflicts is true\n const effectiveKeymap = useMemo(() => {\n if (!disableConflicts || conflicts.size === 0) {\n return keymap\n }\n // Filter out keys that have conflicts\n const filtered: HotkeyMap = {}\n for (const [key, action] of Object.entries(keymap)) {\n if (!conflicts.has(key)) {\n filtered[key] = action\n }\n }\n return filtered\n }, [keymap, conflicts, disableConflicts])\n\n // Register hotkeys (using effective keymap that excludes conflicts)\n const { pendingKeys, isAwaitingSequence, cancelSequence, timeoutStartedAt, sequenceTimeout } = useHotkeys(effectiveKeymap, handlers, hotkeyOptions)\n\n const setBinding = useCallback((action: string, key: string) => {\n setOverrides((prev) => {\n // Remove any existing override that maps a different key to this action\n const cleaned: Partial<HotkeyMap> = {}\n for (const [k, v] of Object.entries(prev)) {\n // Keep the entry unless it's a different key mapping to the same action\n const actions = Array.isArray(v) ? v : [v]\n if (k === key || !actions.includes(action)) {\n cleaned[k] = v\n }\n }\n // Add the new binding\n return { ...cleaned, [key]: action }\n })\n }, [])\n\n const setKeymap = useCallback((newOverrides: Partial<HotkeyMap>) => {\n setOverrides((prev) => ({ ...prev, ...newOverrides }))\n }, [])\n\n const reset = useCallback(() => {\n setOverrides({})\n }, [])\n\n return {\n keymap,\n setBinding,\n setKeymap,\n reset,\n overrides,\n conflicts,\n hasConflicts: hasConflictsValue,\n pendingKeys,\n isAwaitingSequence,\n cancelSequence,\n timeoutStartedAt,\n sequenceTimeout,\n }\n}\n","import { useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { max, min } from '@rdub/base'\nimport { useHotkeys, HotkeyMap, HandlerMap } from './useHotkeys'\nimport { searchActions, getSequenceCompletions } from './utils'\nimport type { ActionRegistry, ActionSearchResult, HotkeySequence } from './types'\nimport type { SequenceCompletion } from './types'\n\nexport interface UseOmnibarOptions {\n /** Registry of available actions */\n actions: ActionRegistry\n /** Handlers for actions (optional - if not provided, use onExecute callback) */\n handlers?: HandlerMap\n /** Current keymap (to show bindings in results) */\n keymap?: HotkeyMap\n /** Hotkey to open omnibar (default: 'meta+k') */\n openKey?: string\n /** Whether omnibar hotkey is enabled (default: true) */\n enabled?: boolean\n /** Called when an action is executed (if handlers not provided, or in addition to) */\n onExecute?: (actionId: string) => void\n /** Called when omnibar opens */\n onOpen?: () => void\n /** Called when omnibar closes */\n onClose?: () => void\n /** Maximum number of results to show (default: 10) */\n maxResults?: number\n}\n\nexport interface UseOmnibarResult {\n /** Whether omnibar is open */\n isOpen: boolean\n /** Open the omnibar */\n open: () => void\n /** Close the omnibar */\n close: () => void\n /** Toggle the omnibar */\n toggle: () => void\n /** Current search query */\n query: string\n /** Set the search query */\n setQuery: (query: string) => void\n /** Search results (filtered and sorted) */\n results: ActionSearchResult[]\n /** Currently selected result index */\n selectedIndex: number\n /** Select the next result */\n selectNext: () => void\n /** Select the previous result */\n selectPrev: () => void\n /** Execute the selected action (or a specific action by ID) */\n execute: (actionId?: string) => void\n /** Reset selection to first result */\n resetSelection: () => void\n /** Sequence completions based on pending keys */\n completions: SequenceCompletion[]\n /** Keys pressed so far in current sequence (from useHotkeys) */\n pendingKeys: HotkeySequence\n /** Whether currently awaiting more keys in a sequence */\n isAwaitingSequence: boolean\n}\n\n/**\n * Hook for implementing an omnibar/command palette.\n *\n * @example\n * ```tsx\n * const ACTIONS: ActionRegistry = {\n * 'metric:temp': { label: 'Temperature', category: 'Metrics' },\n * 'metric:co2': { label: 'CO₂', category: 'Metrics' },\n * 'save': { label: 'Save', description: 'Save current settings' },\n * }\n *\n * function App() {\n * const {\n * isOpen, open, close,\n * query, setQuery,\n * results,\n * selectedIndex, selectNext, selectPrev,\n * execute,\n * } = useOmnibar({\n * actions: ACTIONS,\n * handlers: HANDLERS,\n * keymap: KEYMAP,\n * })\n *\n * return (\n * <>\n * {isOpen && (\n * <div className=\"omnibar\">\n * <input\n * value={query}\n * onChange={e => setQuery(e.target.value)}\n * onKeyDown={e => {\n * if (e.key === 'ArrowDown') selectNext()\n * if (e.key === 'ArrowUp') selectPrev()\n * if (e.key === 'Enter') execute()\n * if (e.key === 'Escape') close()\n * }}\n * />\n * {results.map((result, i) => (\n * <div\n * key={result.id}\n * className={i === selectedIndex ? 'selected' : ''}\n * onClick={() => execute(result.id)}\n * >\n * {result.action.label}\n * {result.bindings.length > 0 && (\n * <kbd>{result.bindings[0]}</kbd>\n * )}\n * </div>\n * ))}\n * </div>\n * )}\n * </>\n * )\n * }\n * ```\n */\nexport function useOmnibar(options: UseOmnibarOptions): UseOmnibarResult {\n const {\n actions,\n handlers,\n keymap = {},\n openKey = 'meta+k',\n enabled = true,\n onExecute,\n onOpen,\n onClose,\n maxResults = 10,\n } = options\n\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n // Refs for stable callbacks\n const handlersRef = useRef(handlers)\n handlersRef.current = handlers\n\n const onExecuteRef = useRef(onExecute)\n onExecuteRef.current = onExecute\n\n // Register omnibar hotkey\n const omnibarKeymap = useMemo(() => {\n if (!enabled) return {}\n return { [openKey]: 'omnibar:toggle' }\n }, [enabled, openKey])\n\n const { pendingKeys, isAwaitingSequence } = useHotkeys(\n omnibarKeymap,\n {\n 'omnibar:toggle': () => {\n setIsOpen(prev => {\n const next = !prev\n if (next) {\n onOpen?.()\n } else {\n onClose?.()\n }\n return next\n })\n },\n },\n { enabled },\n )\n\n // Search results\n const results = useMemo(() => {\n const allResults = searchActions(query, actions, keymap)\n return allResults.slice(0, maxResults)\n }, [query, actions, keymap, maxResults])\n\n // Sequence completions (based on pending keys from main hotkey handler, not omnibar)\n const completions = useMemo(() => {\n return getSequenceCompletions(pendingKeys, keymap)\n }, [pendingKeys, keymap])\n\n // Reset selection when results change\n useEffect(() => {\n setSelectedIndex(0)\n }, [results])\n\n const open = useCallback(() => {\n setIsOpen(true)\n setQuery('')\n setSelectedIndex(0)\n onOpen?.()\n }, [onOpen])\n\n const close = useCallback(() => {\n setIsOpen(false)\n setQuery('')\n setSelectedIndex(0)\n onClose?.()\n }, [onClose])\n\n const toggle = useCallback(() => {\n setIsOpen(prev => {\n const next = !prev\n if (next) {\n setQuery('')\n setSelectedIndex(0)\n onOpen?.()\n } else {\n onClose?.()\n }\n return next\n })\n }, [onOpen, onClose])\n\n const selectNext = useCallback(() => {\n setSelectedIndex(prev => min(prev + 1, results.length - 1))\n }, [results.length])\n\n const selectPrev = useCallback(() => {\n setSelectedIndex(prev => max(prev - 1, 0))\n }, [])\n\n const resetSelection = useCallback(() => {\n setSelectedIndex(0)\n }, [])\n\n const execute = useCallback((actionId?: string) => {\n const id = actionId ?? results[selectedIndex]?.id\n if (!id) return\n\n // Close omnibar\n close()\n\n // Call handler if available\n if (handlersRef.current?.[id]) {\n // Create a synthetic keyboard event\n const event = new KeyboardEvent('keydown', { key: 'Enter' })\n handlersRef.current[id](event)\n }\n\n // Call onExecute callback\n onExecuteRef.current?.(id)\n }, [results, selectedIndex, close])\n\n // Handle keyboard navigation when open\n useEffect(() => {\n if (!isOpen) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Don't handle if focused on an input (let the input handle it)\n const target = e.target as HTMLElement\n if (target.tagName === 'INPUT' || target.tagName === 'TEXTAREA') {\n // Still handle Escape to close\n if (e.key === 'Escape') {\n e.preventDefault()\n close()\n }\n return\n }\n\n switch (e.key) {\n case 'Escape':\n e.preventDefault()\n close()\n break\n case 'ArrowDown':\n e.preventDefault()\n selectNext()\n break\n case 'ArrowUp':\n e.preventDefault()\n selectPrev()\n break\n case 'Enter':\n e.preventDefault()\n execute()\n break\n }\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [isOpen, close, selectNext, selectPrev, execute])\n\n return {\n isOpen,\n open,\n close,\n toggle,\n query,\n setQuery,\n results,\n selectedIndex,\n selectNext,\n selectPrev,\n execute,\n resetSelection,\n completions,\n pendingKeys,\n isAwaitingSequence,\n }\n}\n","import { ReactNode, useCallback, useMemo, useState } from 'react'\nimport { useRecordHotkey } from './useRecordHotkey'\nimport { findConflicts, formatCombination, parseCombinationId } from './utils'\nimport type { HotkeySequence, KeyCombination, KeyCombinationDisplay } from './types'\nimport type { HotkeyMap } from './useHotkeys'\n\nexport interface KeybindingEditorProps {\n /** Current keymap */\n keymap: HotkeyMap\n /** Default keymap (for reset functionality) */\n defaults: HotkeyMap\n /** Descriptions for actions */\n descriptions?: Record<string, string>\n /** Called when a binding changes */\n onChange: (action: string, key: string) => void\n /** Called when reset is requested */\n onReset?: () => void\n /** CSS class for the container */\n className?: string\n /** Custom render function */\n children?: (props: KeybindingEditorRenderProps) => ReactNode\n}\n\nexport interface KeybindingEditorRenderProps {\n bindings: BindingInfo[]\n editingAction: string | null\n /** Keys already pressed and released (waiting for timeout or more keys) */\n pendingKeys: HotkeySequence\n /** Keys currently being held down */\n activeKeys: KeyCombination | null\n startEditing: (action: string) => void\n cancelEditing: () => void\n reset: () => void\n conflicts: Map<string, string[]>\n}\n\nexport interface BindingInfo {\n action: string\n key: string\n display: KeyCombinationDisplay\n description: string\n isDefault: boolean\n hasConflict: boolean\n}\n\n/**\n * Build action -> key lookup from keymap\n */\nfunction buildActionMap(keymap: HotkeyMap): Map<string, string> {\n const map = new Map<string, string>()\n for (const [key, actionOrActions] of Object.entries(keymap)) {\n const actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions]\n for (const action of actions) {\n map.set(action, key)\n }\n }\n return map\n}\n\n/**\n * UI component for editing keybindings.\n *\n * @example\n * ```tsx\n * <KeybindingEditor\n * keymap={keymap}\n * defaults={DEFAULT_KEYMAP}\n * descriptions={{ save: 'Save document' }}\n * onChange={(action, key) => setBinding(action, key)}\n * onReset={() => reset()}\n * />\n * ```\n */\nexport function KeybindingEditor({\n keymap,\n defaults,\n descriptions,\n onChange,\n onReset,\n className,\n children,\n}: KeybindingEditorProps) {\n const [editingAction, setEditingAction] = useState<string | null>(null)\n\n const actionMap = useMemo(() => buildActionMap(keymap), [keymap])\n const defaultActionMap = useMemo(() => buildActionMap(defaults), [defaults])\n const conflicts = useMemo(() => findConflicts(keymap), [keymap])\n\n const { isRecording, startRecording, cancel, pendingKeys, activeKeys } = useRecordHotkey({\n onCapture: useCallback(\n (_sequence: HotkeySequence, display: KeyCombinationDisplay) => {\n if (editingAction) {\n onChange(editingAction, display.id)\n setEditingAction(null)\n }\n },\n [editingAction, onChange],\n ),\n onCancel: useCallback(() => {\n setEditingAction(null)\n }, []),\n })\n\n const startEditing = useCallback(\n (action: string) => {\n setEditingAction(action)\n startRecording()\n },\n [startRecording],\n )\n\n const cancelEditing = useCallback(() => {\n cancel()\n setEditingAction(null)\n }, [cancel])\n\n const reset = useCallback(() => {\n onReset?.()\n }, [onReset])\n\n // Format keys for display during recording\n // Shows pendingKeys (released keys) + activeKeys (currently held)\n const getRecordingDisplay = () => {\n // Nothing pressed yet\n if (pendingKeys.length === 0 && (!activeKeys || !activeKeys.key)) {\n return 'Press keys...'\n }\n\n // Format pending keys (already pressed and released)\n let display = pendingKeys.length > 0 ? formatCombination(pendingKeys).display : ''\n\n // Add currently held keys\n if (activeKeys && activeKeys.key) {\n if (display) display += ' → '\n display += formatCombination([activeKeys]).display\n }\n\n // Ellipsis indicates we're waiting for timeout or more keys\n return display + '...'\n }\n\n // Build binding info for all actions\n const bindings: BindingInfo[] = useMemo(() => {\n const allActions = new Set([...actionMap.keys(), ...defaultActionMap.keys()])\n\n return Array.from(allActions).map((action) => {\n const key = actionMap.get(action) ?? defaultActionMap.get(action) ?? ''\n const defaultKey = defaultActionMap.get(action) ?? ''\n const combo = parseCombinationId(key)\n const display = formatCombination(combo)\n const conflictActions = conflicts.get(key)\n\n return {\n action,\n key,\n display,\n description: descriptions?.[action] ?? action,\n isDefault: key === defaultKey,\n hasConflict: conflictActions !== undefined && conflictActions.length > 1,\n }\n }).sort((a, b) => a.action.localeCompare(b.action))\n }, [actionMap, defaultActionMap, descriptions, conflicts])\n\n // Custom render\n if (children) {\n return (\n <>\n {children({\n bindings,\n editingAction,\n pendingKeys,\n activeKeys,\n startEditing,\n cancelEditing,\n reset,\n conflicts,\n })}\n </>\n )\n }\n\n // Default render\n return (\n <div className={className}>\n <div style={{ display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '16px' }}>\n <h3 style={{ margin: 0 }}>Keybindings</h3>\n {onReset && (\n <button\n onClick={reset}\n style={{\n padding: '6px 12px',\n backgroundColor: '#f5f5f5',\n border: '1px solid #ddd',\n borderRadius: '4px',\n cursor: 'pointer',\n }}\n >\n Reset to defaults\n </button>\n )}\n </div>\n\n <table style={{ width: '100%', borderCollapse: 'collapse' }}>\n <thead>\n <tr>\n <th style={{ textAlign: 'left', padding: '8px', borderBottom: '2px solid #ddd' }}>Action</th>\n <th style={{ textAlign: 'left', padding: '8px', borderBottom: '2px solid #ddd' }}>Keybinding</th>\n <th style={{ width: '80px', padding: '8px', borderBottom: '2px solid #ddd' }}></th>\n </tr>\n </thead>\n <tbody>\n {bindings.map(({ action, display, description, isDefault, hasConflict }) => {\n const isEditing = editingAction === action\n\n return (\n <tr key={action} style={{ backgroundColor: hasConflict ? '#fff3cd' : undefined }}>\n <td style={{ padding: '8px', borderBottom: '1px solid #eee' }}>\n {description}\n {!isDefault && (\n <span style={{ marginLeft: '8px', fontSize: '0.75rem', color: '#666' }}>(modified)</span>\n )}\n </td>\n <td style={{ padding: '8px', borderBottom: '1px solid #eee' }}>\n {isEditing ? (\n <kbd\n style={{\n backgroundColor: '#e3f2fd',\n padding: '4px 8px',\n borderRadius: '4px',\n border: '2px solid #2196f3',\n fontFamily: 'monospace',\n }}\n >\n {getRecordingDisplay()}\n </kbd>\n ) : (\n <kbd\n style={{\n backgroundColor: '#f5f5f5',\n padding: '4px 8px',\n borderRadius: '4px',\n border: '1px solid #ddd',\n fontFamily: 'monospace',\n }}\n >\n {display.display}\n </kbd>\n )}\n {hasConflict && !isEditing && (\n <span style={{ marginLeft: '8px', color: '#856404', fontSize: '0.75rem' }}>⚠ Conflict</span>\n )}\n </td>\n <td style={{ padding: '8px', borderBottom: '1px solid #eee', textAlign: 'center' }}>\n {isEditing ? (\n <button\n onClick={cancelEditing}\n style={{\n padding: '4px 8px',\n backgroundColor: '#f5f5f5',\n border: '1px solid #ddd',\n borderRadius: '4px',\n cursor: 'pointer',\n fontSize: '0.875rem',\n }}\n >\n Cancel\n </button>\n ) : (\n <button\n onClick={() => startEditing(action)}\n disabled={isRecording}\n style={{\n padding: '4px 8px',\n backgroundColor: '#f5f5f5',\n border: '1px solid #ddd',\n borderRadius: '4px',\n cursor: isRecording ? 'not-allowed' : 'pointer',\n fontSize: '0.875rem',\n opacity: isRecording ? 0.5 : 1,\n }}\n >\n Edit\n </button>\n )}\n </td>\n </tr>\n )\n })}\n </tbody>\n </table>\n </div>\n )\n}\n","import { type CSSProperties, type ComponentType } from 'react'\n\nexport interface ModifierIconProps {\n className?: string\n style?: CSSProperties\n}\n\nconst baseStyle: CSSProperties = {\n width: '1.2em',\n height: '1.2em',\n marginRight: '2px',\n verticalAlign: 'middle',\n}\n\nconst wideStyle: CSSProperties = {\n ...baseStyle,\n width: '1.4em',\n}\n\n/** Command/Meta key icon (⌘) */\nexport function CommandIcon({ className, style }: ModifierIconProps) {\n return (\n <svg\n className={className}\n style={{ ...baseStyle, ...style }}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n >\n <path d=\"M6 4a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h2v4H6a2 2 0 0 0-2 2v2a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2v-2h4v2a2 2 0 0 0 2 2h2a2 2 0 0 0 2-2v-2a2 2 0 0 0-2-2h-2v-4h2a2 2 0 0 0 2-2V6a2 2 0 0 0-2-2h-2a2 2 0 0 0-2 2v2h-4V6a2 2 0 0 0-2-2H6zm4 6h4v4h-4v-4z\"/>\n </svg>\n )\n}\n\n/** Control key icon (^) - chevron/caret */\nexport function CtrlIcon({ className, style }: ModifierIconProps) {\n return (\n <svg\n className={className}\n style={{ ...baseStyle, ...style }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"3\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M6 15l6-6 6 6\"/>\n </svg>\n )\n}\n\n/** Shift key icon (⇧) - hollow arrow */\nexport function ShiftIcon({ className, style }: ModifierIconProps) {\n return (\n <svg\n className={className}\n style={{ ...wideStyle, ...style }}\n viewBox=\"0 0 28 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M14 3L3 14h6v7h10v-7h6L14 3z\"/>\n </svg>\n )\n}\n\n/** Option key icon (⌥) - macOS style */\nexport function OptIcon({ className, style }: ModifierIconProps) {\n return (\n <svg\n className={className}\n style={{ ...baseStyle, ...style }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M4 6h6l8 12h6M14 6h6\"/>\n </svg>\n )\n}\n\n/** Alt key icon (⎇) - Windows style, though \"Alt\" text is more common on Windows */\nexport function AltIcon({ className, style }: ModifierIconProps) {\n return (\n <svg\n className={className}\n style={{ ...baseStyle, ...style }}\n viewBox=\"0 0 24 24\"\n fill=\"none\"\n stroke=\"currentColor\"\n strokeWidth=\"2.5\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n {/* ⎇ - branching path representing \"alternative\" */}\n <path d=\"M4 18h8M12 18l4-6M12 18l4 0M16 12l4-6h-8\"/>\n </svg>\n )\n}\n\nexport type ModifierType = 'meta' | 'ctrl' | 'shift' | 'alt' | 'opt'\n\n/** Detect if running on macOS */\nexport const isMac = typeof navigator !== 'undefined' && /Mac|iPod|iPhone|iPad/.test(navigator.platform)\n\n/** Get the appropriate icon component for a modifier key */\nexport function getModifierIcon(modifier: ModifierType): ComponentType<ModifierIconProps> {\n switch (modifier) {\n case 'meta':\n return CommandIcon\n case 'ctrl':\n return CtrlIcon\n case 'shift':\n return ShiftIcon\n case 'opt':\n return OptIcon\n case 'alt':\n // On Mac, Alt is Option (⌥). On Windows, Alt is ⎇ (though text \"Alt\" is more common)\n return isMac ? OptIcon : AltIcon\n }\n}\n\n/** Render a modifier icon by name */\nexport function ModifierIcon({ modifier, ...props }: ModifierIconProps & { modifier: ModifierType }) {\n const Icon = getModifierIcon(modifier)\n return <Icon {...props} />\n}\n","import { Fragment, KeyboardEvent, MouseEvent, ReactNode, RefObject, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { useMaybeHotkeysContext } from './HotkeysProvider'\nimport { ModifierIcon } from './ModifierIcons'\nimport { useOmnibar } from './useOmnibar'\nimport { parseHotkeyString } from './utils'\nimport type { ActionRegistry, ActionSearchResult, HotkeySequence, SequenceCompletion } from './types'\nimport type { HandlerMap, HotkeyMap } from './useHotkeys'\n\nexport interface OmnibarProps {\n /**\n * Registry of available actions.\n * If not provided, uses actions from HotkeysContext.\n */\n actions?: ActionRegistry\n /**\n * Handlers for actions.\n * If not provided, uses handlers from HotkeysContext, falling back to executeAction.\n */\n handlers?: HandlerMap\n /**\n * Current keymap (to show bindings in results).\n * If not provided, uses keymap from HotkeysContext.\n */\n keymap?: HotkeyMap\n /** Hotkey to open omnibar (default: 'meta+k'). Set to empty string to disable. */\n openKey?: string\n /**\n * Whether omnibar hotkey is enabled.\n * When using HotkeysContext, defaults to false (provider handles it).\n */\n enabled?: boolean\n /**\n * Control visibility externally.\n * If not provided, uses isOmnibarOpen from HotkeysContext.\n */\n isOpen?: boolean\n /** Called when omnibar opens */\n onOpen?: () => void\n /**\n * Called when omnibar closes.\n * If not provided, uses closeOmnibar from HotkeysContext.\n */\n onClose?: () => void\n /**\n * Called when an action is executed.\n * If not provided, uses executeAction from HotkeysContext.\n */\n onExecute?: (actionId: string) => void\n /** Maximum number of results to show (default: 10) */\n maxResults?: number\n /** Placeholder text for input (default: 'Type a command...') */\n placeholder?: string\n /** Custom render function */\n children?: (props: OmnibarRenderProps) => ReactNode\n /** CSS class for the backdrop */\n backdropClassName?: string\n /** CSS class for the omnibar container */\n omnibarClassName?: string\n}\n\nexport interface OmnibarRenderProps {\n query: string\n setQuery: (query: string) => void\n results: ActionSearchResult[]\n selectedIndex: number\n selectNext: () => void\n selectPrev: () => void\n execute: (actionId?: string) => void\n close: () => void\n completions: SequenceCompletion[]\n pendingKeys: HotkeySequence\n isAwaitingSequence: boolean\n inputRef: RefObject<HTMLInputElement | null>\n}\n\n/**\n * Render a key binding with modifier icons\n */\nfunction BindingBadge({ binding }: { binding: string }) {\n const sequence = parseHotkeyString(binding)\n\n return (\n <kbd className=\"kbd-kbd\">\n {sequence.map((combo, i) => (\n <Fragment key={i}>\n {i > 0 && <span className=\"kbd-sequence-sep\"> </span>}\n {combo.modifiers.meta && <ModifierIcon modifier=\"meta\" className=\"kbd-modifier-icon\" />}\n {combo.modifiers.ctrl && <ModifierIcon modifier=\"ctrl\" className=\"kbd-modifier-icon\" />}\n {combo.modifiers.alt && <ModifierIcon modifier=\"alt\" className=\"kbd-modifier-icon\" />}\n {combo.modifiers.shift && <ModifierIcon modifier=\"shift\" className=\"kbd-modifier-icon\" />}\n <span>{combo.key.length === 1 ? combo.key.toUpperCase() : combo.key}</span>\n </Fragment>\n ))}\n </kbd>\n )\n}\n\n/**\n * Omnibar/command palette component for searching and executing actions.\n *\n * Uses CSS classes from styles.css. Override via CSS custom properties:\n * --kbd-bg, --kbd-text, --kbd-accent, etc.\n *\n * @example\n * ```tsx\n * <Omnibar\n * actions={ACTIONS}\n * handlers={HANDLERS}\n * keymap={KEYMAP}\n * onExecute={(id) => console.log('Executed:', id)}\n * />\n * ```\n */\nexport function Omnibar({\n actions: actionsProp,\n handlers: handlersProp,\n keymap: keymapProp,\n openKey = 'meta+k',\n enabled: enabledProp,\n isOpen: isOpenProp,\n onOpen: onOpenProp,\n onClose: onCloseProp,\n onExecute: onExecuteProp,\n maxResults = 10,\n placeholder = 'Type a command...',\n children,\n backdropClassName = 'kbd-omnibar-backdrop',\n omnibarClassName = 'kbd-omnibar',\n}: OmnibarProps) {\n const inputRef = useRef<HTMLInputElement | null>(null)\n\n // Try to get context (returns null if not within HotkeysProvider)\n const ctx = useMaybeHotkeysContext()\n\n // Use context values with prop overrides\n const actions = actionsProp ?? ctx?.registry.actionRegistry ?? {}\n const keymap = keymapProp ?? ctx?.registry.keymap ?? {}\n\n // When using context, default enabled to false (HotkeysProvider handles the trigger)\n const enabled = enabledProp ?? !ctx\n\n // Create execute handler that falls back to context\n const handleExecute = useCallback((actionId: string) => {\n if (onExecuteProp) {\n onExecuteProp(actionId)\n } else if (ctx?.executeAction) {\n ctx.executeAction(actionId)\n }\n }, [onExecuteProp, ctx])\n\n // Create close handler that falls back to context\n const handleClose = useCallback(() => {\n if (onCloseProp) {\n onCloseProp()\n } else if (ctx?.closeOmnibar) {\n ctx.closeOmnibar()\n }\n }, [onCloseProp, ctx])\n\n // Create open handler that falls back to context\n const handleOpen = useCallback(() => {\n if (onOpenProp) {\n onOpenProp()\n } else if (ctx?.openOmnibar) {\n ctx.openOmnibar()\n }\n }, [onOpenProp, ctx])\n\n const {\n isOpen: internalIsOpen,\n close,\n query,\n setQuery,\n results,\n selectedIndex,\n selectNext,\n selectPrev,\n execute,\n completions,\n pendingKeys,\n isAwaitingSequence,\n } = useOmnibar({\n actions,\n handlers: handlersProp,\n keymap,\n openKey,\n enabled: isOpenProp === undefined && ctx === null ? enabled : false, // Disable hotkey if controlled or using context\n onOpen: handleOpen,\n onClose: handleClose,\n onExecute: handleExecute,\n maxResults,\n })\n\n // Use prop, then context, then internal state\n const isOpen = isOpenProp ?? ctx?.isOmnibarOpen ?? internalIsOpen\n\n // Focus input when opened\n useEffect(() => {\n if (isOpen) {\n // Slight delay to ensure DOM is ready\n requestAnimationFrame(() => {\n inputRef.current?.focus()\n })\n }\n }, [isOpen])\n\n // Handle input keydown\n const handleKeyDown = useCallback(\n (e: KeyboardEvent) => {\n switch (e.key) {\n case 'Escape':\n e.preventDefault()\n close()\n break\n case 'ArrowDown':\n e.preventDefault()\n selectNext()\n break\n case 'ArrowUp':\n e.preventDefault()\n selectPrev()\n break\n case 'Enter':\n e.preventDefault()\n execute()\n break\n }\n },\n [close, selectNext, selectPrev, execute],\n )\n\n // Close on backdrop click\n const handleBackdropClick = useCallback(\n (e: MouseEvent) => {\n if (e.target === e.currentTarget) {\n close()\n }\n },\n [close],\n )\n\n if (!isOpen) return null\n\n // Custom render\n if (children) {\n return (\n <>\n {children({\n query,\n setQuery,\n results,\n selectedIndex,\n selectNext,\n selectPrev,\n execute,\n close,\n completions,\n pendingKeys,\n isAwaitingSequence,\n inputRef,\n })}\n </>\n )\n }\n\n // Default render\n return (\n <div className={backdropClassName} onClick={handleBackdropClick}>\n <div className={omnibarClassName} role=\"dialog\" aria-modal=\"true\" aria-label=\"Command palette\">\n <input\n ref={inputRef}\n type=\"text\"\n className=\"kbd-omnibar-input\"\n value={query}\n onChange={(e) => setQuery(e.target.value)}\n onKeyDown={handleKeyDown}\n placeholder={placeholder}\n autoComplete=\"off\"\n autoCorrect=\"off\"\n autoCapitalize=\"off\"\n spellCheck={false}\n />\n\n <div className=\"kbd-omnibar-results\">\n {results.length === 0 ? (\n <div className=\"kbd-omnibar-no-results\">\n {query ? 'No matching commands' : 'Start typing to search commands...'}\n </div>\n ) : (\n results.map((result, i) => (\n <div\n key={result.id}\n className={`kbd-omnibar-result ${i === selectedIndex ? 'selected' : ''}`}\n onClick={() => execute(result.id)}\n onMouseEnter={() => {/* Could set selectedIndex here for hover selection */}}\n >\n <span className=\"kbd-omnibar-result-label\">\n {result.action.label}\n </span>\n {result.action.group && (\n <span className=\"kbd-omnibar-result-category\">\n {result.action.group}\n </span>\n )}\n {result.bindings.length > 0 && (\n <div className=\"kbd-omnibar-result-bindings\">\n {result.bindings.slice(0, 2).map((binding) => (\n <BindingBadge key={binding} binding={binding} />\n ))}\n </div>\n )}\n </div>\n ))\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { useMemo } from 'react'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport type { SequenceCompletion } from './types'\nimport { formatCombination } from './utils'\n\nexport function SequenceModal() {\n const {\n pendingKeys,\n isAwaitingSequence,\n sequenceTimeoutStartedAt: timeoutStartedAt,\n sequenceTimeout,\n getCompletions,\n registry,\n } = useHotkeysContext()\n\n // Get completions for the current pending keys\n const completions = useMemo(() => {\n if (pendingKeys.length === 0) return []\n return getCompletions(pendingKeys)\n }, [getCompletions, pendingKeys])\n\n // Format pending keys for display\n const formattedPendingKeys = useMemo(() => {\n if (pendingKeys.length === 0) return ''\n return formatCombination(pendingKeys).display\n }, [pendingKeys])\n\n // Get human-readable label for an action from registry\n const getActionLabel = (actionId: string) => {\n const action = registry.actions.get(actionId)\n return action?.config.label || actionId\n }\n\n // Group completions by what happens next\n // Each completion shows: nextKeys → actionLabel\n const groupedCompletions = useMemo(() => {\n // Create map of nextKey -> completions\n const byNextKey = new Map<string, SequenceCompletion[]>()\n for (const c of completions) {\n const existing = byNextKey.get(c.nextKeys)\n if (existing) {\n existing.push(c)\n } else {\n byNextKey.set(c.nextKeys, [c])\n }\n }\n return byNextKey\n }, [completions])\n\n // Don't render if not awaiting sequence or no pending keys\n if (!isAwaitingSequence || pendingKeys.length === 0) {\n return null\n }\n\n return (\n <div className=\"kbd-sequence-backdrop\">\n <div className=\"kbd-sequence\">\n {/* Current sequence at top */}\n <div className=\"kbd-sequence-current\">\n <kbd className=\"kbd-sequence-keys\">{formattedPendingKeys}</kbd>\n <span className=\"kbd-sequence-ellipsis\">…</span>\n </div>\n\n {/* Timeout progress bar */}\n {timeoutStartedAt && (\n <div\n className=\"kbd-sequence-timeout\"\n key={timeoutStartedAt}\n style={{ animationDuration: `${sequenceTimeout}ms` }}\n />\n )}\n\n {/* Completions list */}\n {completions.length > 0 && (\n <div className=\"kbd-sequence-completions\">\n {Array.from(groupedCompletions.entries()).map(([nextKey, comps]) => (\n <div key={nextKey} className=\"kbd-sequence-completion\">\n <kbd className=\"kbd-kbd\">{nextKey.toUpperCase()}</kbd>\n <span className=\"kbd-sequence-arrow\">→</span>\n <span className=\"kbd-sequence-actions\">\n {comps.flatMap(c => c.actions).map((action, i) => (\n <span key={action}>\n {i > 0 && ', '}\n {getActionLabel(action)}\n </span>\n ))}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* No completions message */}\n {completions.length === 0 && (\n <div className=\"kbd-sequence-empty\">\n No matching shortcuts\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { Fragment, MouseEvent, ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'\nimport { useMaybeHotkeysContext } from './HotkeysProvider'\nimport { ModifierIcon } from './ModifierIcons'\nimport { useHotkeys } from './useHotkeys'\nimport { useRecordHotkey } from './useRecordHotkey'\nimport { findConflicts, formatCombination, getActionBindings, parseHotkeyString } from './utils'\nimport type { HotkeySequence, KeyCombination, KeyCombinationDisplay } from './types'\nimport type { HotkeyMap } from './useHotkeys'\n\nexport interface ShortcutGroup {\n name: string\n shortcuts: Array<{\n actionId: string\n label: string\n description?: string\n bindings: string[]\n }>\n}\n\n/**\n * Props passed to custom group renderers\n */\nexport interface GroupRendererProps {\n /** The group being rendered */\n group: ShortcutGroup\n /** Render a cell for an action (handles editing state, kbd styling) */\n renderCell: (actionId: string, keys: string[]) => ReactNode\n /** Render a single editable kbd element */\n renderEditableKbd: (actionId: string, key: string, showRemove?: boolean) => ReactNode\n /** Render the add button for an action */\n renderAddButton: (actionId: string) => ReactNode\n /** Start editing a specific binding */\n startEditing: (actionId: string, key: string) => void\n /** Start adding a new binding to an action */\n startAdding: (actionId: string) => void\n /** Remove a binding */\n removeBinding: (actionId: string, key: string) => void\n /** Whether currently recording a hotkey */\n isRecording: boolean\n /** Action currently being edited */\n editingAction: string | null\n /** Key currently being edited */\n editingKey: string | null\n /** Action currently being added to */\n addingAction: string | null\n}\n\n/**\n * Custom renderer for a group. Return null to use default rendering.\n */\nexport type GroupRenderer = (props: GroupRendererProps) => ReactNode\n\nexport interface ShortcutsModalProps {\n /**\n * The hotkey map to display.\n * If not provided, uses keymap from HotkeysContext.\n */\n keymap?: HotkeyMap\n /**\n * Default keymap (for showing reset indicators).\n * If not provided, uses defaults from HotkeysContext.\n */\n defaults?: HotkeyMap\n /** Labels for actions (action ID -> label). Falls back to action.label from context. */\n labels?: Record<string, string>\n /** Descriptions for actions (action ID -> description). Falls back to action.description from context. */\n descriptions?: Record<string, string>\n /** Group definitions: action prefix -> display name (e.g., { metric: 'Metrics' }). Falls back to action.group from context. */\n groups?: Record<string, string>\n /** Ordered list of group names (if omitted, groups are sorted alphabetically) */\n groupOrder?: string[]\n /**\n * Custom renderers for specific groups.\n * Key is the group name, value is a render function.\n * Groups without custom renderers use the default single-column layout.\n */\n groupRenderers?: Record<string, GroupRenderer>\n /**\n * Control visibility externally.\n * If not provided, uses isModalOpen from HotkeysContext.\n */\n isOpen?: boolean\n /**\n * Called when modal should close.\n * If not provided, uses closeModal from HotkeysContext.\n */\n onClose?: () => void\n /** Hotkey to open modal (default: '?'). Set to empty string to disable. */\n openKey?: string\n /**\n * Whether to auto-register the open hotkey (default: true).\n * When using HotkeysContext, the provider already handles this, so set to false.\n */\n autoRegisterOpen?: boolean\n /** Enable editing mode */\n editable?: boolean\n /** Called when a binding changes (required if editable) */\n onBindingChange?: (action: string, oldKey: string | null, newKey: string) => void\n /** Called when a binding is added (required if editable) */\n onBindingAdd?: (action: string, key: string) => void\n /** Called when a binding is removed */\n onBindingRemove?: (action: string, key: string) => void\n /** Called when reset is requested */\n onReset?: () => void\n /** Whether to allow multiple bindings per action (default: true) */\n multipleBindings?: boolean\n /** Custom render function for the modal content */\n children?: (props: ShortcutsModalRenderProps) => ReactNode\n /** CSS class for the backdrop */\n backdropClassName?: string\n /** CSS class for the modal container */\n modalClassName?: string\n /** Modal title (default: \"Keyboard Shortcuts\") */\n title?: string\n /** Hint text shown below title (e.g., \"Click any key to customize\") */\n hint?: string\n}\n\nexport interface ShortcutsModalRenderProps {\n groups: ShortcutGroup[]\n close: () => void\n editable: boolean\n editingAction: string | null\n editingBindingIndex: number | null\n pendingKeys: HotkeySequence\n activeKeys: KeyCombination | null\n conflicts: Map<string, string[]>\n startEditing: (action: string, bindingIndex?: number) => void\n cancelEditing: () => void\n removeBinding: (action: string, key: string) => void\n reset: () => void\n}\n\n/**\n * Parse action ID to extract group prefix.\n * e.g., \"metric:temp\" -> { group: \"metric\", name: \"temp\" }\n */\nfunction parseActionId(actionId: string): { group: string; name: string } {\n const colonIndex = actionId.indexOf(':')\n if (colonIndex > 0) {\n return { group: actionId.slice(0, colonIndex), name: actionId.slice(colonIndex + 1) }\n }\n return { group: 'General', name: actionId }\n}\n\n/**\n * Organize keymap into groups for display.\n */\nfunction organizeShortcuts(\n keymap: HotkeyMap,\n labels?: Record<string, string>,\n descriptions?: Record<string, string>,\n groupNames?: Record<string, string>,\n groupOrder?: string[],\n): ShortcutGroup[] {\n // Build action -> bindings map\n const actionBindings = getActionBindings(keymap)\n const groupMap = new Map<string, ShortcutGroup>()\n\n for (const [actionId, bindings] of actionBindings) {\n const { group: groupKey, name } = parseActionId(actionId)\n const groupName = groupNames?.[groupKey] ?? groupKey\n\n if (!groupMap.has(groupName)) {\n groupMap.set(groupName, { name: groupName, shortcuts: [] })\n }\n\n groupMap.get(groupName)!.shortcuts.push({\n actionId,\n label: labels?.[actionId] ?? name,\n description: descriptions?.[actionId],\n bindings,\n })\n }\n\n // Sort shortcuts within each group by actionId\n for (const group of groupMap.values()) {\n group.shortcuts.sort((a, b) => a.actionId.localeCompare(b.actionId))\n }\n\n // Sort groups\n const groups = Array.from(groupMap.values())\n\n if (groupOrder) {\n // Use provided order\n groups.sort((a, b) => {\n const aIdx = groupOrder.indexOf(a.name)\n const bIdx = groupOrder.indexOf(b.name)\n if (aIdx === -1 && bIdx === -1) return a.name.localeCompare(b.name)\n if (aIdx === -1) return 1\n if (bIdx === -1) return -1\n return aIdx - bIdx\n })\n } else {\n // Default: \"General\" last, others alphabetically\n groups.sort((a, b) => {\n if (a.name === 'General') return 1\n if (b.name === 'General') return -1\n return a.name.localeCompare(b.name)\n })\n }\n\n return groups\n}\n\n/**\n * Render a single key combination with modifier icons\n */\nfunction KeyDisplay({\n combo,\n className,\n}: {\n combo: KeyCombination\n className?: string\n}) {\n const { key, modifiers } = combo\n const parts: ReactNode[] = []\n\n if (modifiers.meta) {\n parts.push(<ModifierIcon key=\"meta\" modifier=\"meta\" className=\"kbd-modifier-icon\" />)\n }\n if (modifiers.ctrl) {\n parts.push(<ModifierIcon key=\"ctrl\" modifier=\"ctrl\" className=\"kbd-modifier-icon\" />)\n }\n if (modifiers.alt) {\n parts.push(<ModifierIcon key=\"alt\" modifier=\"alt\" className=\"kbd-modifier-icon\" />)\n }\n if (modifiers.shift) {\n parts.push(<ModifierIcon key=\"shift\" modifier=\"shift\" className=\"kbd-modifier-icon\" />)\n }\n\n // Display key (uppercase for single chars)\n const keyDisplay = key.length === 1 ? key.toUpperCase() : key.charAt(0).toUpperCase() + key.slice(1)\n parts.push(<span key=\"key\">{keyDisplay}</span>)\n\n return <span className={className}>{parts}</span>\n}\n\n/**\n * Render a hotkey binding (single key or sequence)\n */\nfunction BindingDisplay({\n binding,\n className,\n editable,\n isEditing,\n isConflict,\n isPendingConflict,\n isDefault,\n onEdit,\n onRemove,\n pendingKeys,\n activeKeys,\n}: {\n binding: string\n className?: string\n editable?: boolean\n isEditing?: boolean\n isConflict?: boolean\n isPendingConflict?: boolean\n isDefault?: boolean\n onEdit?: () => void\n onRemove?: () => void\n pendingKeys?: HotkeySequence\n activeKeys?: KeyCombination | null\n}) {\n const sequence = parseHotkeyString(binding)\n const display = formatCombination(sequence)\n\n let kbdClassName = 'kbd-kbd'\n if (editable && !isEditing) kbdClassName += ' editable'\n if (isEditing) kbdClassName += ' editing'\n if (isConflict) kbdClassName += ' conflict'\n if (isPendingConflict) kbdClassName += ' pending-conflict'\n if (isDefault) kbdClassName += ' default-binding'\n if (className) kbdClassName += ' ' + className\n\n const handleClick = editable && onEdit ? onEdit : undefined\n\n // Render editing state\n if (isEditing) {\n let content: ReactNode\n if (pendingKeys && pendingKeys.length > 0) {\n content = (\n <>\n {pendingKeys.map((combo, i) => (\n <Fragment key={i}>\n {i > 0 && <span className=\"kbd-sequence-sep\"> </span>}\n <KeyDisplay combo={combo} />\n </Fragment>\n ))}\n {activeKeys && activeKeys.key && (\n <>\n <span className=\"kbd-sequence-sep\"> → </span>\n <KeyDisplay combo={activeKeys} />\n </>\n )}\n <span>...</span>\n </>\n )\n } else if (activeKeys && activeKeys.key) {\n content = <><KeyDisplay combo={activeKeys} /><span>...</span></>\n } else {\n content = '...'\n }\n\n return <kbd className={kbdClassName} tabIndex={editable ? 0 : undefined}>{content}</kbd>\n }\n\n // Render normal binding\n return (\n <kbd className={kbdClassName} onClick={handleClick} tabIndex={editable ? 0 : undefined} onKeyDown={editable && onEdit ? (e) => { if (e.key === 'Enter' || e.key === ' ') { e.preventDefault(); onEdit() } } : undefined}>\n {display.isSequence ? (\n sequence.map((combo, i) => (\n <Fragment key={i}>\n {i > 0 && <span className=\"kbd-sequence-sep\"> </span>}\n <KeyDisplay combo={combo} />\n </Fragment>\n ))\n ) : (\n <KeyDisplay combo={sequence[0]} />\n )}\n {editable && onRemove && (\n <button\n className=\"kbd-remove-btn\"\n onClick={(e) => { e.stopPropagation(); onRemove() }}\n aria-label=\"Remove binding\"\n >\n ×\n </button>\n )}\n </kbd>\n )\n}\n\n/**\n * Modal component for displaying and optionally editing keyboard shortcuts.\n *\n * Uses CSS classes from styles.css. Override via CSS custom properties:\n * --kbd-bg, --kbd-text, --kbd-kbd-bg, etc.\n *\n * @example\n * ```tsx\n * // Read-only display\n * <ShortcutsModal\n * keymap={HOTKEYS}\n * labels={{ 'metric:temp': 'Temperature' }}\n * />\n *\n * // Editable with callbacks\n * <ShortcutsModal\n * keymap={keymap}\n * defaults={DEFAULT_KEYMAP}\n * labels={labels}\n * editable\n * onBindingChange={(action, oldKey, newKey) => updateBinding(action, newKey)}\n * onBindingRemove={(action, key) => removeBinding(action, key)}\n * />\n * ```\n */\nexport function ShortcutsModal({\n keymap: keymapProp,\n defaults: defaultsProp,\n labels: labelsProp,\n descriptions: descriptionsProp,\n groups: groupNamesProp,\n groupOrder,\n groupRenderers,\n isOpen: isOpenProp,\n onClose: onCloseProp,\n openKey = '?',\n autoRegisterOpen,\n editable = false,\n onBindingChange,\n onBindingAdd,\n onBindingRemove,\n onReset,\n multipleBindings = true,\n children,\n backdropClassName = 'kbd-backdrop',\n modalClassName = 'kbd-modal',\n title = 'Keyboard Shortcuts',\n hint,\n}: ShortcutsModalProps) {\n // Try to get context (returns null if not within HotkeysProvider)\n const ctx = useMaybeHotkeysContext()\n\n // Derive labels/descriptions/groups from context registry if not provided as props\n const contextLabels = useMemo(() => {\n const registry = ctx?.registry.actionRegistry\n if (!registry) return undefined\n const labels: Record<string, string> = {}\n for (const [id, action] of Object.entries(registry)) {\n labels[id] = action.label\n }\n return labels\n }, [ctx?.registry.actionRegistry])\n\n const contextDescriptions = useMemo(() => {\n const registry = ctx?.registry.actionRegistry\n if (!registry) return undefined\n const descriptions: Record<string, string> = {}\n for (const [id, action] of Object.entries(registry)) {\n if (action.description) descriptions[id] = action.description\n }\n return descriptions\n }, [ctx?.registry.actionRegistry])\n\n const contextGroups = useMemo(() => {\n const registry = ctx?.registry.actionRegistry\n if (!registry) return undefined\n const groups: Record<string, string> = {}\n for (const action of Object.values(registry)) {\n if (action.group) {\n // Map action prefix to group name\n const prefix = action.group.toLowerCase().replace(/[\\s-]/g, '')\n groups[prefix] = action.group\n }\n }\n return groups\n }, [ctx?.registry.actionRegistry])\n\n // Use context values with prop overrides\n const keymap = keymapProp ?? ctx?.registry.keymap ?? {}\n const defaults = defaultsProp\n const labels = labelsProp ?? contextLabels\n const descriptions = descriptionsProp ?? contextDescriptions\n const groupNames = groupNamesProp ?? contextGroups\n\n // Editing callbacks - fall back to context registry if not provided\n const handleBindingChange = onBindingChange ?? (ctx ? (action, oldKey, newKey) => {\n if (oldKey) ctx.registry.removeBinding(oldKey)\n ctx.registry.setBinding(action, newKey)\n } : undefined)\n const handleBindingAdd = onBindingAdd ?? (ctx ? (action, key) => {\n ctx.registry.setBinding(action, key)\n } : undefined)\n const handleBindingRemove = onBindingRemove ?? (ctx ? (_action, key) => {\n ctx.registry.removeBinding(key)\n } : undefined)\n const handleReset = onReset ?? (ctx ? () => {\n ctx.registry.resetOverrides()\n } : undefined)\n\n // When using context, default autoRegisterOpen to false (HotkeysProvider handles it)\n const shouldAutoRegisterOpen = autoRegisterOpen ?? !ctx\n\n const [internalIsOpen, setInternalIsOpen] = useState(false)\n // Use prop, then context, then internal state\n const isOpen = isOpenProp ?? ctx?.isModalOpen ?? internalIsOpen\n\n // Editing state - use key-based tracking (not index-based)\n const [editingAction, setEditingAction] = useState<string | null>(null)\n const [editingKey, setEditingKey] = useState<string | null>(null)\n const [addingAction, setAddingAction] = useState<string | null>(null)\n const [pendingConflict, setPendingConflict] = useState<{\n action: string\n key: string\n conflictsWith: string[]\n } | null>(null)\n\n // Refs to avoid stale closures in onCapture callback\n const editingActionRef = useRef<string | null>(null)\n const editingKeyRef = useRef<string | null>(null)\n const addingActionRef = useRef<string | null>(null)\n\n // Compute conflicts\n const conflicts = useMemo(() => findConflicts(keymap), [keymap])\n const actionBindings = useMemo(() => getActionBindings(keymap), [keymap])\n\n const close = useCallback(() => {\n setInternalIsOpen(false)\n setEditingAction(null)\n setEditingKey(null)\n setAddingAction(null)\n editingActionRef.current = null\n editingKeyRef.current = null\n addingActionRef.current = null\n setPendingConflict(null)\n // Use prop callback, then context, then nothing\n if (onCloseProp) {\n onCloseProp()\n } else if (ctx?.closeModal) {\n ctx.closeModal()\n }\n }, [onCloseProp, ctx])\n\n const open = useCallback(() => {\n if (ctx?.openModal) {\n ctx.openModal()\n } else {\n setInternalIsOpen(true)\n }\n }, [ctx])\n\n // Check if a new binding would conflict\n const checkConflict = useCallback((newKey: string, forAction: string): string[] | null => {\n const existingActions = keymap[newKey]\n if (!existingActions) return null\n const actions = Array.isArray(existingActions) ? existingActions : [existingActions]\n const conflicts = actions.filter(a => a !== forAction)\n return conflicts.length > 0 ? conflicts : null\n }, [keymap])\n\n // Recording hook - uses refs to avoid stale closures\n const { isRecording, startRecording, cancel, pendingKeys, activeKeys } = useRecordHotkey({\n onCapture: useCallback(\n (_sequence: HotkeySequence, display: KeyCombinationDisplay) => {\n // Use refs for current values (avoids stale closure)\n const currentAddingAction = addingActionRef.current\n const currentEditingAction = editingActionRef.current\n const currentEditingKey = editingKeyRef.current\n\n const actionToUpdate = currentAddingAction || currentEditingAction\n if (!actionToUpdate) return\n\n // Check for conflicts\n const conflictActions = checkConflict(display.id, actionToUpdate)\n if (conflictActions && conflictActions.length > 0) {\n setPendingConflict({\n action: actionToUpdate,\n key: display.id,\n conflictsWith: conflictActions,\n })\n return\n }\n\n if (currentAddingAction) {\n // Adding new binding\n handleBindingAdd?.(currentAddingAction, display.id)\n } else if (currentEditingAction && currentEditingKey) {\n // Replacing existing binding\n handleBindingChange?.(currentEditingAction, currentEditingKey, display.id)\n }\n\n // Clear state\n editingActionRef.current = null\n editingKeyRef.current = null\n addingActionRef.current = null\n setEditingAction(null)\n setEditingKey(null)\n setAddingAction(null)\n },\n [checkConflict, handleBindingChange, handleBindingAdd],\n ),\n onCancel: useCallback(() => {\n editingActionRef.current = null\n editingKeyRef.current = null\n addingActionRef.current = null\n setEditingAction(null)\n setEditingKey(null)\n setAddingAction(null)\n setPendingConflict(null)\n }, []),\n // Tab to next/prev editable kbd and start editing\n onTab: useCallback(() => {\n // Find all editable kbd elements\n const editables = Array.from(document.querySelectorAll('.kbd-kbd.editable, .kbd-kbd.editing'))\n const current = document.querySelector('.kbd-kbd.editing')\n const currentIndex = current ? editables.indexOf(current) : -1\n const nextIndex = (currentIndex + 1) % editables.length\n const next = editables[nextIndex] as HTMLElement\n if (next) {\n next.focus()\n next.click()\n }\n }, []),\n onShiftTab: useCallback(() => {\n const editables = Array.from(document.querySelectorAll('.kbd-kbd.editable, .kbd-kbd.editing'))\n const current = document.querySelector('.kbd-kbd.editing')\n const currentIndex = current ? editables.indexOf(current) : -1\n const prevIndex = currentIndex <= 0 ? editables.length - 1 : currentIndex - 1\n const prev = editables[prevIndex] as HTMLElement\n if (prev) {\n prev.focus()\n prev.click()\n }\n }, []),\n pauseTimeout: pendingConflict !== null,\n })\n\n // Start editing a specific existing binding\n const startEditingBinding = useCallback(\n (action: string, key: string) => {\n // Set refs immediately (sync)\n addingActionRef.current = null\n editingActionRef.current = action\n editingKeyRef.current = key\n // Also set state for re-render\n setAddingAction(null)\n setEditingAction(action)\n setEditingKey(key)\n setPendingConflict(null)\n startRecording()\n },\n [startRecording],\n )\n\n // Start adding a new binding to an action\n const startAddingBinding = useCallback(\n (action: string) => {\n // Set refs immediately (sync)\n editingActionRef.current = null\n editingKeyRef.current = null\n addingActionRef.current = action\n // Also set state for re-render\n setEditingAction(null)\n setEditingKey(null)\n setAddingAction(action)\n setPendingConflict(null)\n startRecording()\n },\n [startRecording],\n )\n\n // Legacy startEditing for backwards compatibility\n const startEditing = useCallback(\n (action: string, bindingIndex?: number) => {\n const bindings = actionBindings.get(action) ?? []\n if (bindingIndex !== undefined && bindings[bindingIndex]) {\n startEditingBinding(action, bindings[bindingIndex])\n } else {\n startAddingBinding(action)\n }\n },\n [actionBindings, startEditingBinding, startAddingBinding],\n )\n\n const cancelEditing = useCallback(() => {\n cancel()\n editingActionRef.current = null\n editingKeyRef.current = null\n addingActionRef.current = null\n setEditingAction(null)\n setEditingKey(null)\n setAddingAction(null)\n setPendingConflict(null)\n }, [cancel])\n\n const removeBinding = useCallback(\n (action: string, key: string) => {\n handleBindingRemove?.(action, key)\n },\n [handleBindingRemove],\n )\n\n const reset = useCallback(() => {\n handleReset?.()\n }, [handleReset])\n\n // Helper: render a single editable kbd element\n const renderEditableKbd = useCallback(\n (actionId: string, key: string, showRemove = false) => {\n const isEditingThis = editingAction === actionId && editingKey === key && !addingAction\n const conflictActions = conflicts.get(key)\n const isConflict = conflictActions && conflictActions.length > 1\n const isDefault = defaults\n ? (() => {\n const defaultAction = defaults[key]\n if (!defaultAction) return false\n const defaultActions = Array.isArray(defaultAction) ? defaultAction : [defaultAction]\n return defaultActions.includes(actionId)\n })()\n : true\n\n return (\n <BindingDisplay\n key={key}\n binding={key}\n editable={editable}\n isEditing={isEditingThis}\n isConflict={isConflict}\n isDefault={isDefault}\n onEdit={() => {\n // If recording another element, commit pending keys first\n if (isRecording && !(editingAction === actionId && editingKey === key)) {\n if (pendingKeys.length > 0) {\n const display = formatCombination(pendingKeys)\n const currentAddingAction = addingActionRef.current\n const currentEditingAction = editingActionRef.current\n const currentEditingKey = editingKeyRef.current\n if (currentAddingAction) {\n handleBindingAdd?.(currentAddingAction, display.id)\n } else if (currentEditingAction && currentEditingKey) {\n handleBindingChange?.(currentEditingAction, currentEditingKey, display.id)\n }\n }\n cancel()\n }\n startEditingBinding(actionId, key)\n }}\n onRemove={editable && showRemove ? () => removeBinding(actionId, key) : undefined}\n pendingKeys={pendingKeys}\n activeKeys={activeKeys}\n />\n )\n },\n [editingAction, editingKey, addingAction, conflicts, defaults, editable, startEditingBinding, removeBinding, pendingKeys, activeKeys, isRecording, cancel, handleBindingAdd, handleBindingChange],\n )\n\n // Helper: render add button for an action\n const renderAddButton = useCallback(\n (actionId: string) => {\n const isAddingThis = addingAction === actionId\n\n if (isAddingThis) {\n return (\n <BindingDisplay\n binding=\"\"\n isEditing\n pendingKeys={pendingKeys}\n activeKeys={activeKeys}\n />\n )\n }\n\n return (\n <button\n className=\"kbd-add-btn\"\n onClick={() => {\n // If recording another element, commit pending keys first\n if (isRecording && !isAddingThis) {\n if (pendingKeys.length > 0) {\n // Commit the pending keys before switching\n const display = formatCombination(pendingKeys)\n const currentAddingAction = addingActionRef.current\n const currentEditingAction = editingActionRef.current\n const currentEditingKey = editingKeyRef.current\n if (currentAddingAction) {\n handleBindingAdd?.(currentAddingAction, display.id)\n } else if (currentEditingAction && currentEditingKey) {\n handleBindingChange?.(currentEditingAction, currentEditingKey, display.id)\n }\n }\n cancel()\n }\n startAddingBinding(actionId)\n }}\n >\n +\n </button>\n )\n },\n [addingAction, pendingKeys, activeKeys, startAddingBinding, isRecording, cancel, handleBindingAdd, handleBindingChange],\n )\n\n // Helper: render a cell with all bindings for an action\n const renderCell = useCallback(\n (actionId: string, keys: string[]) => {\n return (\n <span className=\"kbd-action-bindings\">\n {keys.map((key) => (\n <Fragment key={key}>\n {renderEditableKbd(actionId, key, true)}\n </Fragment>\n ))}\n {editable && multipleBindings && renderAddButton(actionId)}\n </span>\n )\n },\n [renderEditableKbd, renderAddButton, editable, multipleBindings],\n )\n\n // Props for custom group renderers\n const groupRendererProps: Omit<GroupRendererProps, 'group'> = useMemo(() => ({\n renderCell,\n renderEditableKbd,\n renderAddButton,\n startEditing: startEditingBinding,\n startAdding: startAddingBinding,\n removeBinding,\n isRecording,\n editingAction,\n editingKey,\n addingAction,\n }), [renderCell, renderEditableKbd, renderAddButton, startEditingBinding, startAddingBinding, removeBinding, isRecording, editingAction, editingKey, addingAction])\n\n // Register open/close hotkeys\n const modalKeymap = shouldAutoRegisterOpen ? { [openKey]: 'openShortcuts' } : {}\n useHotkeys(\n { ...modalKeymap, escape: 'closeShortcuts' },\n {\n openShortcuts: open,\n closeShortcuts: close,\n },\n { enabled: shouldAutoRegisterOpen || isOpen },\n )\n\n // Close on Escape during editing\n useEffect(() => {\n if (!isOpen || (!editingAction && !addingAction)) return\n\n const handleEscape = (e: KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n cancelEditing()\n }\n }\n\n window.addEventListener('keydown', handleEscape, true)\n return () => window.removeEventListener('keydown', handleEscape, true)\n }, [isOpen, editingAction, addingAction, cancelEditing])\n\n // Close on backdrop click\n const handleBackdropClick = useCallback(\n (e: MouseEvent) => {\n if (e.target === e.currentTarget) {\n close()\n }\n },\n [close],\n )\n\n // Cancel editing when clicking outside the editing element\n const handleModalClick = useCallback(\n (e: MouseEvent) => {\n if (!editingAction && !addingAction) return\n const target = e.target as HTMLElement\n // If click is on or inside an editing kbd, don't cancel\n if (target.closest('.kbd-kbd.editing')) return\n // If click is on another editable kbd, don't cancel (it will start its own editing)\n if (target.closest('.kbd-kbd.editable')) return\n // If click is on add button, don't cancel (it will start its own editing)\n if (target.closest('.kbd-add-btn')) return\n cancelEditing()\n },\n [editingAction, addingAction, cancelEditing],\n )\n\n // Organize shortcuts into groups\n const shortcutGroups = useMemo(\n () => organizeShortcuts(keymap, labels, descriptions, groupNames, groupOrder),\n [keymap, labels, descriptions, groupNames, groupOrder],\n )\n\n if (!isOpen) return null\n\n // Custom render (legacy - takes full control)\n if (children) {\n return (\n <>\n {children({\n groups: shortcutGroups,\n close,\n editable,\n editingAction,\n editingBindingIndex: null, // deprecated, use editingKey\n pendingKeys,\n activeKeys,\n conflicts,\n startEditing,\n cancelEditing,\n removeBinding,\n reset,\n })}\n </>\n )\n }\n\n // Render a single group (default or custom)\n const renderGroup = (group: ShortcutGroup) => {\n // Check for custom renderer\n const customRenderer = groupRenderers?.[group.name]\n if (customRenderer) {\n return customRenderer({ group, ...groupRendererProps })\n }\n\n // Default single-column rendering\n return group.shortcuts.map(({ actionId, label, description, bindings }) => (\n <div key={actionId} className=\"kbd-action\">\n <span className=\"kbd-action-label\" title={description}>\n {label}\n </span>\n {renderCell(actionId, bindings)}\n </div>\n ))\n }\n\n // Default render\n return (\n <div className={backdropClassName} onClick={handleBackdropClick}>\n <div className={modalClassName} role=\"dialog\" aria-modal=\"true\" aria-label=\"Keyboard shortcuts\" onClick={handleModalClick}>\n <div className=\"kbd-modal-header\">\n <h2 className=\"kbd-modal-title\">{title}</h2>\n <div className=\"kbd-modal-header-buttons\">\n {editable && handleReset && (\n <button className=\"kbd-reset-btn\" onClick={reset}>\n Reset\n </button>\n )}\n <button className=\"kbd-modal-close\" onClick={close} aria-label=\"Close\">\n ×\n </button>\n </div>\n </div>\n\n {hint && <p className=\"kbd-hint\">{hint}</p>}\n\n {shortcutGroups.map((group) => (\n <div key={group.name} className=\"kbd-group\">\n <h3 className=\"kbd-group-title\">{group.name}</h3>\n {renderGroup(group)}\n </div>\n ))}\n\n {/* Pending conflict warning */}\n {pendingConflict && (\n <div className=\"kbd-conflict-warning\" style={{\n padding: '12px',\n marginTop: '16px',\n backgroundColor: 'var(--kbd-warning-bg)',\n borderRadius: 'var(--kbd-radius-sm)',\n border: '1px solid var(--kbd-warning)',\n }}>\n <p style={{ margin: '0 0 8px', color: 'var(--kbd-warning)' }}>\n This key is already bound to: {pendingConflict.conflictsWith.join(', ')}\n </p>\n <div style={{ display: 'flex', gap: '8px' }}>\n <button\n onClick={() => {\n // Accept and override\n if (addingActionRef.current) {\n handleBindingAdd?.(pendingConflict.action, pendingConflict.key)\n } else if (editingKeyRef.current) {\n handleBindingChange?.(pendingConflict.action, editingKeyRef.current, pendingConflict.key)\n }\n editingActionRef.current = null\n editingKeyRef.current = null\n addingActionRef.current = null\n setEditingAction(null)\n setEditingKey(null)\n setAddingAction(null)\n setPendingConflict(null)\n }}\n style={{\n padding: '4px 12px',\n backgroundColor: 'var(--kbd-accent)',\n color: 'white',\n border: 'none',\n borderRadius: 'var(--kbd-radius-sm)',\n cursor: 'pointer',\n }}\n >\n Override\n </button>\n <button\n onClick={cancelEditing}\n style={{\n padding: '4px 12px',\n backgroundColor: 'var(--kbd-bg-secondary)',\n border: '1px solid var(--kbd-border)',\n borderRadius: 'var(--kbd-radius-sm)',\n cursor: 'pointer',\n }}\n >\n Cancel\n </button>\n </div>\n </div>\n )}\n\n </div>\n </div>\n )\n}\n"]}