use-kbd 0.3.0 → 0.5.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.
- package/README.md +35 -36
- package/dist/index.cjs +2145 -409
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +646 -76
- package/dist/index.d.ts +646 -76
- package/dist/index.js +2108 -405
- package/dist/index.js.map +1 -1
- package/package.json +6 -8
- package/src/styles.css +302 -67
package/dist/index.cjs.map
CHANGED
|
@@ -1 +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":["jsxs","jsx","createContext","useRef","useState","useCallback","overrides","useMemo","actions","single","isPrefix","max","useEffect","hasConflicts","useContext","display","min","Fragment","isMac","labels","descriptions","conflicts"],"mappings":"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","file":"index.cjs","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"]}
|
|
1
|
+
{"version":3,"sources":["../src/types.ts","../src/TwoColumnRenderer.tsx","../src/ActionsRegistry.ts","../src/OmnibarEndpointsRegistry.ts","../src/constants.ts","../src/utils.ts","../src/useHotkeys.ts","../src/HotkeysProvider.tsx","../src/useAction.ts","../src/useOmnibarEndpoint.ts","../src/useRecordHotkey.ts","../src/useEditableHotkeys.ts","../src/useOmnibar.ts","../src/KeyIcons.tsx","../src/ModifierIcons.tsx","../src/KeyElements.tsx","../src/Kbd.tsx","../src/KeybindingEditor.tsx","../src/LookupModal.tsx","../src/Omnibar.tsx","../src/SequenceModal.tsx","../src/ShortcutsModal.tsx"],"names":["jsxs","jsx","createContext","useRef","useState","useCallback","overrides","useMemo","actions","endpoints","single","useEffect","e","hasConflicts","useContext","display","max","baseStyle","forwardRef","Fragment","isDigit","SeqElemDisplay","BindingDisplay","labels","descriptions","conflicts","combinationsEqual"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\n * Modifier keys state\n */\nexport interface Modifiers {\n ctrl: boolean\n alt: boolean\n shift: boolean\n meta: boolean\n}\n\n/**\n * Represents a single key press (possibly with modifiers)\n */\nexport interface KeyCombination {\n /** The main key (lowercase, e.g., 'k', 'enter', 'arrowup') */\n key: string\n /** Modifier keys pressed */\n modifiers: Modifiers\n}\n\n/**\n * Represents a hotkey - either a single key or a sequence of keys.\n * Single key: [{ key: 'k', modifiers: {...} }]\n * Sequence: [{ key: '2', ... }, { key: 'w', ... }]\n */\nexport type HotkeySequence = KeyCombination[]\n\n// ============================================================================\n// New sequence types with digit placeholder support\n// ============================================================================\n\n/**\n * A single element in a key sequence (sum type).\n * - 'key': exact key match (with optional modifiers)\n * - 'digit': matches any single digit 0-9 (\\d)\n * - 'digits': matches one or more digits (\\d+)\n */\nexport type SeqElem =\n | { type: 'key'; key: string; modifiers: Modifiers }\n | { type: 'digit' }\n | { type: 'digits' }\n\n/**\n * A key sequence pattern (array of sequence elements)\n */\nexport type KeySeq = SeqElem[]\n\n/**\n * Sequence element with match state (for tracking during input).\n * - 'key': has `matched` flag\n * - 'digit': has captured `value`\n * - 'digits': has captured `value` or in-progress `partial` string\n */\nexport type SeqElemState =\n | { type: 'key'; key: string; modifiers: Modifiers; matched?: true }\n | { type: 'digit'; value?: number }\n | { type: 'digits'; value?: number; partial?: string }\n\n/**\n * Sequence match state - tracks progress through a sequence with captures\n */\nexport type SeqMatchState = SeqElemState[]\n\n/**\n * Extract captured values from a completed sequence match\n */\nexport function extractCaptures(state: SeqMatchState): number[] {\n return state\n .filter((e): e is { type: 'digit'; value: number } | { type: 'digits'; value: number } =>\n (e.type === 'digit' || e.type === 'digits') && e.value !== undefined\n )\n .map(e => e.value)\n}\n\n/**\n * Check if a SeqElem is a digit placeholder\n */\nexport function isDigitPlaceholder(elem: SeqElem): elem is { type: 'digit' } | { type: 'digits' } {\n return elem.type === 'digit' || elem.type === 'digits'\n}\n\n/**\n * Count digit placeholders in a sequence\n */\nexport function countPlaceholders(seq: KeySeq): number {\n return seq.filter(isDigitPlaceholder).length\n}\n\n/**\n * Platform-aware display format for a key combination or sequence\n */\nexport interface KeyCombinationDisplay {\n /** Human-readable string (e.g., \"⌘⇧K\" on Mac, \"Ctrl+Shift+K\" elsewhere, \"2 W\" for sequence) */\n display: string\n /** Canonical ID for storage/comparison (e.g., \"ctrl+shift+k\", \"2 w\" for sequence) */\n id: string\n /** Whether this is a sequence (multiple keys pressed in order) */\n isSequence: boolean\n}\n\n/**\n * Result from the useRecordHotkey hook\n */\nexport interface RecordHotkeyResult {\n /** Whether currently recording */\n isRecording: boolean\n /** Start recording - returns cancel function */\n startRecording: () => () => void\n /** Cancel recording */\n cancel: () => void\n /** Commit pending keys immediately (if any), otherwise cancel */\n commit: () => void\n /** The captured sequence (null until complete) */\n sequence: HotkeySequence | null\n /** Display strings for the sequence */\n display: KeyCombinationDisplay | null\n /** Keys captured so far during recording (for live UI feedback) */\n pendingKeys: HotkeySequence\n /** The key currently being held (for live UI feedback during recording) */\n activeKeys: KeyCombination | null\n /** The timeout duration for sequences (ms) */\n sequenceTimeout: number\n}\n\n/**\n * Options for useRecordHotkey\n */\nexport interface RecordHotkeyOptions {\n /** Called when a sequence is captured (timeout or Enter) */\n onCapture?: (sequence: HotkeySequence, display: KeyCombinationDisplay) => void\n /** Called when recording is cancelled */\n onCancel?: () => void\n /** Called when Tab is pressed during recording (for advancing to next field) */\n onTab?: () => void\n /** Called when Shift+Tab is pressed during recording (for going to previous field) */\n onShiftTab?: () => void\n /** Prevent default on captured keys (default: true) */\n preventDefault?: boolean\n /** Timeout in ms before sequence is submitted (default: Infinity, no timeout).\n * Set to 0 for immediate submit (no sequences - first key press is captured).\n * Set to a finite number for auto-submit after that duration. */\n sequenceTimeout?: number\n /** When true, pause the auto-submit timeout (useful for conflict warnings). Default: false */\n pauseTimeout?: boolean\n}\n\n/**\n * Definition of an action that can be triggered by hotkeys or omnibar\n */\nexport interface ActionDefinition {\n /** Display label for the action */\n label: string\n /** Longer description (shown in omnibar, tooltips) */\n description?: string\n /** Group for organizing in shortcuts modal (e.g., \"Metrics\", \"Time Range\") */\n group?: string\n /** Additional search keywords */\n keywords?: string[]\n /** Icon identifier (user provides rendering) */\n icon?: string\n /** Whether the action is currently enabled (default: true) */\n enabled?: boolean\n /** Hide from ShortcutsModal (still searchable in omnibar) */\n hideFromModal?: boolean\n}\n\n/**\n * Registry of all available actions\n */\nexport type ActionRegistry = Record<string, ActionDefinition>\n\n/**\n * An action with its current keybinding(s) and search match info\n */\nexport interface ActionSearchResult {\n /** Action ID */\n id: string\n /** Action definition */\n action: ActionDefinition\n /** Current keybindings for this action */\n bindings: string[]\n /** Fuzzy match score (higher = better match) */\n score: number\n /** Matched ranges in label for highlighting */\n labelMatches: Array<[number, number]>\n}\n\n/**\n * A possible completion for a partially-typed sequence\n */\nexport interface SequenceCompletion {\n /** The next key(s) needed to complete this sequence (empty string if complete) */\n nextKeys: string\n /** Structured next keys for rendering with icons (undefined if complete) */\n nextKeySeq?: KeySeq\n /** The full hotkey string */\n fullSequence: string\n /** Display format for the full sequence */\n display: KeyCombinationDisplay\n /** Actions triggered by this sequence */\n actions: string[]\n /** Whether the sequence is already complete (can be executed now with Enter) */\n isComplete: boolean\n /** Captured digit values from \\d and \\d+ placeholders */\n captures?: number[]\n}\n\n// ============================================================================\n// Remote omnibar endpoint types\n// ============================================================================\n\n/**\n * Base fields for all omnibar entries\n */\nexport interface OmnibarEntryBase {\n /** Unique identifier for this entry */\n id: string\n /** Display label */\n label: string\n /** Optional description (shown below label) */\n description?: string\n /** Group name for organizing results */\n group?: string\n /** Additional search keywords */\n keywords?: string[]\n}\n\n/**\n * Omnibar entry that navigates to a URL when selected\n */\nexport interface OmnibarLinkEntry extends OmnibarEntryBase {\n /** URL to navigate to */\n href: string\n handler?: never\n}\n\n/**\n * Omnibar entry that executes a handler when selected\n */\nexport interface OmnibarActionEntry extends OmnibarEntryBase {\n /** Handler to execute (can close over data) */\n handler: () => void\n href?: never\n}\n\n/**\n * An entry returned from a remote omnibar endpoint.\n * Must have either `href` (for navigation) or `handler` (for custom action).\n */\nexport type OmnibarEntry = OmnibarLinkEntry | OmnibarActionEntry\n\n/**\n * Pagination parameters passed to endpoint fetch function\n */\nexport interface EndpointPagination {\n /** Starting offset (0-indexed) */\n offset: number\n /** Maximum number of entries to return */\n limit: number\n}\n\n/**\n * Response from an endpoint fetch, including pagination metadata\n */\nexport interface EndpointResponse {\n /** Entries for this page */\n entries: OmnibarEntry[]\n /** Total count if known (enables \"X of Y\" display) */\n total?: number\n /** Whether more results exist (fallback when total is expensive to compute) */\n hasMore?: boolean\n}\n\n/**\n * Pagination mode for an endpoint\n * - 'scroll': Fetch more when scrolling near bottom (IntersectionObserver)\n * - 'buttons': Show pagination controls at bottom of endpoint's group\n * - 'none': Single page, no pagination (default)\n */\nexport type EndpointPaginationMode = 'scroll' | 'buttons' | 'none'\n\n/**\n * Configuration for a remote omnibar endpoint\n */\nexport interface OmnibarEndpointConfig {\n /** Fetch function that returns entries for a query */\n fetch: (query: string, signal: AbortSignal, pagination: EndpointPagination) => Promise<EndpointResponse>\n /** Default group for entries from this endpoint */\n group?: string\n /** Priority for result ordering (higher = shown first, default: 0, local actions: 100) */\n priority?: number\n /** Minimum query length before fetching (default: 2) */\n minQueryLength?: number\n /** Whether this endpoint is enabled (default: true) */\n enabled?: boolean\n /** Number of results per page (default: 10) */\n pageSize?: number\n /** Pagination mode (default: 'none') */\n pagination?: EndpointPaginationMode\n}\n","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, optionally with captured digit values */\n execute: (id: string, captures?: number[]) => 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 /** Get the first binding for an action (convenience for display) */\n getFirstBindingForAction: (id: string) => string | undefined\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 for a specific action */\n removeBinding: (actionId: string, 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 } 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, captures?: number[]) => {\n const action = actionsRef.current.get(id)\n if (action && (action.config.enabled ?? true)) {\n action.config.handler(undefined, captures)\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 } 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 getFirstBindingForAction = useCallback((actionId: string) => {\n return getBindingsForAction(actionId)[0]\n }, [getBindingsForAction])\n\n const setBinding = useCallback((actionId: string, key: string) => {\n // If this binding is a default for this action, just remove it from removedDefaults\n // (no need to store in overrides since it will come from defaults)\n if (isDefaultBinding(key, actionId)) {\n updateRemovedDefaults((prev) => {\n const existing = prev[actionId] ?? []\n if (existing.includes(key)) {\n const filtered = existing.filter(k => k !== key)\n if (filtered.length === 0) {\n const { [actionId]: _, ...rest } = prev\n return rest\n }\n return { ...prev, [actionId]: filtered }\n }\n return prev\n })\n } else {\n // Non-default binding - add to overrides\n updateOverrides((prev) => ({\n ...prev,\n [key]: actionId,\n }))\n }\n }, [updateOverrides, updateRemovedDefaults, isDefaultBinding])\n\n const removeBinding = useCallback((actionId: string, key: string) => {\n // Check if this is a default binding for this specific action\n const action = actionsRef.current.get(actionId)\n const isDefault = action?.config.defaultBindings?.includes(key)\n\n if (isDefault) {\n // Mark as removed for this specific action only\n updateRemovedDefaults((prev) => {\n const existing = prev[actionId] ?? []\n if (existing.includes(key)) return prev\n return { ...prev, [actionId]: [...existing, key] }\n })\n }\n\n // Also remove from overrides if this key was bound to this action\n updateOverrides((prev) => {\n const boundAction = prev[key]\n // Only remove if bound to this specific action (or array containing it)\n if (boundAction === actionId) {\n const { [key]: _, ...rest } = prev\n return rest\n }\n if (Array.isArray(boundAction) && boundAction.includes(actionId)) {\n const newActions = boundAction.filter(a => a !== actionId)\n if (newActions.length === 0) {\n const { [key]: _, ...rest } = prev\n return rest\n }\n return { ...prev, [key]: newActions.length === 1 ? newActions[0] : newActions }\n }\n return prev\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 getFirstBindingForAction,\n overrides,\n setBinding,\n removeBinding,\n resetOverrides,\n }), [\n register,\n unregister,\n execute,\n actions,\n keymap,\n actionRegistry,\n getBindingsForAction,\n getFirstBindingForAction,\n overrides,\n setBinding,\n removeBinding,\n resetOverrides,\n ])\n}\n","import { createContext, useCallback, useMemo, useRef, useState } from 'react'\nimport type { EndpointPagination, OmnibarEndpointConfig, OmnibarEntry } from './types'\n\nexport interface RegisteredEndpoint {\n id: string\n config: OmnibarEndpointConfig\n registeredAt: number\n}\n\n/**\n * Result from querying an endpoint\n */\nexport interface EndpointQueryResult {\n endpointId: string\n entries: OmnibarEntry[]\n /** Total count from endpoint (if provided) */\n total?: number\n /** Whether endpoint has more results (if provided) */\n hasMore?: boolean\n error?: Error\n}\n\nexport interface OmnibarEndpointsRegistryValue {\n /** Register an endpoint. Called by useOmnibarEndpoint on mount. */\n register: (id: string, config: OmnibarEndpointConfig) => void\n /** Unregister an endpoint. Called by useOmnibarEndpoint on unmount. */\n unregister: (id: string) => void\n /** Currently registered endpoints */\n endpoints: Map<string, RegisteredEndpoint>\n /** Query all registered endpoints (initial page) */\n queryAll: (query: string, signal: AbortSignal) => Promise<EndpointQueryResult[]>\n /** Query a single endpoint with specific pagination (for load-more) */\n queryEndpoint: (endpointId: string, query: string, pagination: EndpointPagination, signal: AbortSignal) => Promise<EndpointQueryResult | null>\n}\n\nexport const OmnibarEndpointsRegistryContext = createContext<OmnibarEndpointsRegistryValue | null>(null)\n\n/**\n * Hook to create an omnibar endpoints registry.\n * Used internally by HotkeysProvider.\n */\nexport function useOmnibarEndpointsRegistry(): OmnibarEndpointsRegistryValue {\n // Registered endpoints (mutable for perf, state for re-renders)\n const endpointsRef = useRef<Map<string, RegisteredEndpoint>>(new Map())\n const [endpointsVersion, setEndpointsVersion] = useState(0)\n\n const register = useCallback((id: string, config: OmnibarEndpointConfig) => {\n endpointsRef.current.set(id, {\n id,\n config,\n registeredAt: Date.now(),\n })\n setEndpointsVersion(v => v + 1)\n }, [])\n\n const unregister = useCallback((id: string) => {\n endpointsRef.current.delete(id)\n setEndpointsVersion(v => v + 1)\n }, [])\n\n /** Query a single endpoint */\n const queryEndpoint = useCallback(async (\n endpointId: string,\n query: string,\n pagination: EndpointPagination,\n signal: AbortSignal,\n ): Promise<EndpointQueryResult | null> => {\n const ep = endpointsRef.current.get(endpointId)\n if (!ep) return null\n if (ep.config.enabled === false) return null\n if (query.length < (ep.config.minQueryLength ?? 2)) return null\n\n try {\n const response = await ep.config.fetch(query, signal, pagination)\n // Apply default group if entries don't have one\n const entriesWithGroup = response.entries.map(entry => ({\n ...entry,\n group: entry.group ?? ep.config.group,\n }))\n return {\n endpointId: ep.id,\n entries: entriesWithGroup,\n total: response.total,\n hasMore: response.hasMore,\n }\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') {\n return { endpointId: ep.id, entries: [] }\n }\n return {\n endpointId: ep.id,\n entries: [],\n error: error instanceof Error ? error : new Error(String(error)),\n }\n }\n }, [])\n\n /** Query all endpoints (initial page for each) */\n const queryAll = useCallback(async (\n query: string,\n signal: AbortSignal,\n ): Promise<EndpointQueryResult[]> => {\n const endpoints = Array.from(endpointsRef.current.values())\n\n // Query all enabled endpoints in parallel with initial pagination\n const promises = endpoints\n .filter(ep => ep.config.enabled !== false)\n .filter(ep => query.length >= (ep.config.minQueryLength ?? 2))\n .map(async (ep): Promise<EndpointQueryResult> => {\n const pageSize = ep.config.pageSize ?? 10\n const result = await queryEndpoint(ep.id, query, { offset: 0, limit: pageSize }, signal)\n return result ?? { endpointId: ep.id, entries: [] }\n })\n\n return Promise.all(promises)\n }, [queryEndpoint])\n\n // Create a snapshot of the map for consumers\n const endpoints = useMemo(() => {\n return new Map(endpointsRef.current)\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [endpointsVersion])\n\n return useMemo(() => ({\n register,\n unregister,\n endpoints,\n queryAll,\n queryEndpoint,\n }), [register, unregister, endpoints, queryAll, queryEndpoint])\n}\n","/**\n * Default timeout for key sequences (no timeout).\n * Set to a finite number (ms) to auto-submit sequences after that duration.\n */\nexport const DEFAULT_SEQUENCE_TIMEOUT = Infinity\n\n/**\n * Reserved action IDs for built-in UI components.\n * These are registered automatically by their respective components.\n */\nexport const ACTION_MODAL = '__hotkeys:modal'\nexport const ACTION_OMNIBAR = '__hotkeys:omnibar'\nexport const ACTION_LOOKUP = '__hotkeys:lookup'\n","import type { KeyCombination, KeyCombinationDisplay, HotkeySequence, SeqElem, KeySeq, Modifiers } from './types'\n\nconst { max } = Math\n\n/**\n * Symbols that require Shift key on US keyboard layout.\n * When these are the key, we should not show/store the shift modifier\n * since it's implicit in the symbol itself.\n */\nconst SHIFTED_SYMBOLS = new Set([\n '!', '@', '#', '$', '%', '^', '&', '*', '(', ')',\n '_', '+', '{', '}', '|', ':', '\"', '<', '>', '?', '~',\n])\n\n/**\n * Check if a key is a shifted symbol (requires Shift on US keyboard).\n * For these keys, shift modifier should be implicit, not shown separately.\n */\nexport function isShiftedSymbol(key: string): boolean {\n return SHIFTED_SYMBOLS.has(key)\n}\n\n/**\n * Detect if running on macOS/iOS\n */\nexport function isMac(): boolean {\n if (typeof navigator === 'undefined') return false\n // Use userAgentData if available (modern browsers), fallback to userAgent\n const platform = (navigator as { userAgentData?: { platform?: string } }).userAgentData?.platform\n if (platform) {\n return platform === 'macOS' || platform === 'iOS'\n }\n return /Mac|iPhone|iPad|iPod/.test(navigator.userAgent)\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': '⇥',\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 * Sentinel values for digit placeholders in KeyCombination.key\n * These are used during recording to represent placeholder patterns.\n */\nexport const DIGIT_PLACEHOLDER = '__DIGIT__'\nexport const DIGITS_PLACEHOLDER = '__DIGITS__'\n\n/**\n * Check if a key string is a digit placeholder sentinel value.\n * Used during recording to identify placeholder keys.\n */\nexport function isPlaceholderSentinel(key: string): boolean {\n return key === DIGIT_PLACEHOLDER || key === DIGITS_PLACEHOLDER\n}\n\n/**\n * Format a single KeyCombination (internal helper)\n */\nfunction formatSingleCombination(combo: KeyCombination): { display: string; id: string } {\n // Handle digit placeholder sentinels\n if (combo.key === DIGIT_PLACEHOLDER) {\n return { display: '#', id: '\\\\d' }\n }\n if (combo.key === DIGITS_PLACEHOLDER) {\n return { display: '##', id: '\\\\d+' }\n }\n\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 * Format a binding string for display.\n * Takes a binding like \"meta+k\" or \"2 w\" and returns a display string like \"⌘K\" or \"2 W\".\n *\n * @example\n * formatBinding('meta+k') // \"⌘K\" on Mac, \"Ctrl+K\" on Windows\n * formatBinding('2 w') // \"2 W\"\n * formatBinding('?') // \"?\"\n */\nexport function formatBinding(binding: string): string {\n const parsed = parseHotkeyString(binding)\n return formatCombination(parsed).display\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// New KeySeq Parsing (with digit placeholder support)\n// ============================================================================\n\nconst NO_MODIFIERS: Modifiers = { ctrl: false, alt: false, shift: false, meta: false }\n\n/**\n * Parse a single sequence element string to SeqElem.\n * Handles:\n * - `\\d` → digit placeholder\n * - `\\d+` → digits placeholder (one or more)\n * - Regular keys with modifiers (e.g., \"ctrl+k\", \"J\", \"2\")\n */\nfunction parseSeqElem(str: string): SeqElem {\n // Check for digit placeholders\n if (str === '\\\\d') {\n return { type: 'digit' }\n }\n if (str === '\\\\d+') {\n return { type: 'digits' }\n }\n\n // Single uppercase letter (A-Z) is shorthand for shift+<lowercase>\n if (str.length === 1 && /^[A-Z]$/.test(str)) {\n return {\n type: 'key',\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 type: 'key',\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 KeySeq (new sequence type with digit placeholders).\n * Handles both single keys (\"ctrl+k\") and sequences (\"2 w\", \"\\\\d+ d\")\n *\n * @example\n * parseKeySeq('\\\\d+ d') // [{ type: 'digits' }, { type: 'key', key: 'd', ... }]\n * parseKeySeq('ctrl+k') // [{ type: 'key', key: 'k', modifiers: { ctrl: true, ... } }]\n */\nexport function parseKeySeq(hotkeyStr: string): KeySeq {\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(parseSeqElem)\n}\n\n/**\n * Format a single SeqElem for display\n */\nfunction formatSeqElem(elem: SeqElem): { display: string; id: string } {\n if (elem.type === 'digit') {\n return { display: '⟨#⟩', id: '\\\\d' }\n }\n if (elem.type === 'digits') {\n return { display: '⟨##⟩', id: '\\\\d+' }\n }\n\n // Regular key\n const mac = isMac()\n const parts: string[] = []\n const idParts: string[] = []\n\n if (elem.modifiers.ctrl) {\n parts.push(mac ? '⌃' : 'Ctrl')\n idParts.push('ctrl')\n }\n if (elem.modifiers.meta) {\n parts.push(mac ? '⌘' : 'Win')\n idParts.push('meta')\n }\n if (elem.modifiers.alt) {\n parts.push(mac ? '⌥' : 'Alt')\n idParts.push('alt')\n }\n if (elem.modifiers.shift) {\n parts.push(mac ? '⇧' : 'Shift')\n idParts.push('shift')\n }\n\n parts.push(formatKeyForDisplay(elem.key))\n idParts.push(elem.key)\n\n return {\n display: mac ? parts.join('') : parts.join('+'),\n id: idParts.join('+'),\n }\n}\n\n/**\n * Format a KeySeq to display format\n */\nexport function formatKeySeq(seq: KeySeq): KeyCombinationDisplay {\n if (seq.length === 0) {\n return { display: '', id: '', isSequence: false }\n }\n\n const formatted = seq.map(formatSeqElem)\n\n if (seq.length === 1) {\n return { ...formatted[0], isSequence: false }\n }\n\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/**\n * Check if a KeySeq contains any digit placeholders\n */\nexport function hasDigitPlaceholders(seq: KeySeq): boolean {\n return seq.some(elem => elem.type === 'digit' || elem.type === 'digits')\n}\n\n/**\n * Convert a KeySeq to HotkeySequence (for backwards compatibility).\n * Note: Digit placeholders become literal '\\d' or '\\d+' keys.\n * This is only useful for legacy code paths.\n */\nexport function keySeqToHotkeySequence(seq: KeySeq): HotkeySequence {\n return seq.map(elem => {\n if (elem.type === 'digit') {\n return { key: '\\\\d', modifiers: NO_MODIFIERS }\n }\n if (elem.type === 'digits') {\n return { key: '\\\\d+', modifiers: NO_MODIFIERS }\n }\n return { key: elem.key, modifiers: elem.modifiers }\n })\n}\n\n/**\n * Convert a HotkeySequence to KeySeq (for migration).\n * Note: This does NOT detect digit patterns - use parseKeySeq for that.\n */\nexport function hotkeySequenceToKeySeq(seq: HotkeySequence): KeySeq {\n return seq.map(combo => {\n // Check if it's a digit placeholder (from keySeqToHotkeySequence)\n if (combo.key === '\\\\d' && !combo.modifiers.ctrl && !combo.modifiers.alt && !combo.modifiers.shift && !combo.modifiers.meta) {\n return { type: 'digit' }\n }\n if (combo.key === '\\\\d+' && !combo.modifiers.ctrl && !combo.modifiers.alt && !combo.modifiers.shift && !combo.modifiers.meta) {\n return { type: 'digits' }\n }\n return { type: 'key', key: combo.key, modifiers: combo.modifiers }\n })\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 a pending key matches a pattern key (handles digit placeholders)\n */\nfunction keyMatchesPattern(pending: KeyCombination, pattern: KeyCombination): boolean {\n // Check modifiers first\n if (\n pending.modifiers.ctrl !== pattern.modifiers.ctrl ||\n pending.modifiers.alt !== pattern.modifiers.alt ||\n pending.modifiers.shift !== pattern.modifiers.shift ||\n pending.modifiers.meta !== pattern.modifiers.meta\n ) {\n return false\n }\n\n // Exact match\n if (pending.key === pattern.key) return true\n\n // Check if pending is a digit and pattern expects a digit placeholder\n return /^[0-9]$/.test(pending.key) && (pattern.key === DIGIT_PLACEHOLDER || pattern.key === DIGITS_PLACEHOLDER);\n}\n\n// ============================================================================\n// KeySeq Conflict Detection\n// ============================================================================\n\n/**\n * Check if a key is a digit (0-9)\n */\nfunction isDigitKey(key: string): boolean {\n return /^[0-9]$/.test(key)\n}\n\n/**\n * Check if two SeqElems could potentially match the same input.\n * - digit matches any single digit key\n * - digits matches any sequence of digit keys\n * - key matches itself exactly\n */\nfunction seqElemsCouldConflict(a: SeqElem, b: SeqElem): boolean {\n // digit matches any single digit\n if (a.type === 'digit' && b.type === 'digit') return true\n if (a.type === 'digit' && b.type === 'key' && isDigitKey(b.key)) return true\n if (a.type === 'key' && isDigitKey(a.key) && b.type === 'digit') return true\n\n // digits matches any sequence starting with digits\n if (a.type === 'digits' && b.type === 'digits') return true\n if (a.type === 'digits' && b.type === 'digit') return true\n if (a.type === 'digit' && b.type === 'digits') return true\n if (a.type === 'digits' && b.type === 'key' && isDigitKey(b.key)) return true\n if (a.type === 'key' && isDigitKey(a.key) && b.type === 'digits') return true\n\n // key vs key - exact match\n if (a.type === 'key' && b.type === 'key') {\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 return false\n}\n\n/**\n * Check if KeySeq A could be a prefix of KeySeq B (considering digit patterns)\n */\nfunction keySeqIsPrefix(a: KeySeq, b: KeySeq): boolean {\n if (a.length >= b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!seqElemsCouldConflict(a[i], b[i])) return false\n }\n return true\n}\n\n/**\n * Check if two KeySeqs could match the same input (exact match)\n */\nfunction keySeqsCouldConflict(a: KeySeq, b: KeySeq): boolean {\n if (a.length !== b.length) return false\n for (let i = 0; i < a.length; i++) {\n if (!seqElemsCouldConflict(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 * - Pattern overlap: digit patterns that could match the same input (e.g., \"\\d d\" and \"5 d\")\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 keySeq: parseKeySeq(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 pattern conflicts and 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 for exact conflict (including digit patterns)\n if (keySeqsCouldConflict(a.keySeq, b.keySeq) && a.key !== b.key) {\n // These patterns could match the same input\n const existingA = conflicts.get(a.key) ?? []\n if (!existingA.includes(`conflicts with: ${b.key}`)) {\n conflicts.set(a.key, [...existingA, ...a.actions, `conflicts with: ${b.key}`])\n }\n const existingB = conflicts.get(b.key) ?? []\n if (!existingB.includes(`conflicts with: ${a.key}`)) {\n conflicts.set(b.key, [...existingB, ...b.actions, `conflicts with: ${a.key}`])\n }\n continue\n }\n\n // Check if a is prefix of b (with digit pattern support)\n if (keySeqIsPrefix(a.keySeq, b.keySeq)) {\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 (keySeqIsPrefix(b.keySeq, a.keySeq)) {\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 } else if (isPrefix(a.sequence, b.sequence)) {\n // Legacy check for non-pattern sequences\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 // Legacy check for non-pattern sequences\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 * Returns both exact matches (isComplete: true) and continuations (isComplete: false).\n *\n * @example\n * ```tsx\n * const keymap = { 'h': 'humidity', 'h \\\\d+': 'nHours', '2 w': 'twoWeeks' }\n * const pending = parseHotkeyString('h')\n * const completions = getSequenceCompletions(pending, keymap)\n * // Returns:\n * // [\n * // { nextKeys: '', fullSequence: 'h', actions: ['humidity'], isComplete: true },\n * // { nextKeys: '⟨##⟩', fullSequence: 'h \\\\d+', actions: ['nHours'], isComplete: false },\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 keySeq = parseKeySeq(hotkeyStr)\n\n // Skip if pattern is clearly too short (but \\d+ can consume multiple keys)\n const hasDigitsPlaceholder = keySeq.some(e => e.type === 'digits')\n if (!hasDigitsPlaceholder && keySeq.length < pendingKeys.length) continue\n\n // Track how many keySeq elements we've matched and how many pending keys consumed\n let keySeqIdx = 0\n let pendingIdx = 0\n let isMatch = true\n const captures: number[] = []\n let currentDigits = '' // For accumulating \\d+ digits\n\n for (; pendingIdx < pendingKeys.length && keySeqIdx < keySeq.length; pendingIdx++) {\n const elem = keySeq[keySeqIdx]\n\n if (elem.type === 'digits') {\n // \\d+ can consume multiple pending digit keys\n if (!/^[0-9]$/.test(pendingKeys[pendingIdx].key)) {\n isMatch = false\n break\n }\n currentDigits += pendingKeys[pendingIdx].key\n // Check if next pending key is also a digit (still accumulating)\n // or if we should move to next keySeq element\n if (pendingIdx + 1 < pendingKeys.length && /^[0-9]$/.test(pendingKeys[pendingIdx + 1].key)) {\n // Next is also digit, stay on this keySeq element\n continue\n }\n // Either no more pending keys, or next pending is not a digit\n captures.push(parseInt(currentDigits, 10))\n currentDigits = ''\n keySeqIdx++\n } else if (elem.type === 'digit') {\n // \\d matches exactly one digit\n if (!/^[0-9]$/.test(pendingKeys[pendingIdx].key)) {\n isMatch = false\n break\n }\n captures.push(parseInt(pendingKeys[pendingIdx].key, 10))\n keySeqIdx++\n } else {\n // Regular key - must match exactly (with modifiers)\n const keyElem = elem as { type: 'key'; key: string; modifiers: Modifiers }\n const targetCombo: KeyCombination = { key: keyElem.key, modifiers: keyElem.modifiers }\n if (!keyMatchesPattern(pendingKeys[pendingIdx], targetCombo)) {\n isMatch = false\n break\n }\n keySeqIdx++\n }\n }\n\n // If there are unconsumed pending keys, it's not a match\n if (pendingIdx < pendingKeys.length) {\n isMatch = false\n }\n\n if (!isMatch) continue\n\n const actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions]\n\n if (keySeqIdx === keySeq.length) {\n // Exact match - pending keys fully match this pattern\n completions.push({\n nextKeys: '',\n fullSequence: hotkeyStr,\n display: formatKeySeq(keySeq),\n actions,\n isComplete: true,\n captures: captures.length > 0 ? captures : undefined,\n })\n } else {\n // Continuation - more keys needed\n const remainingKeySeq = keySeq.slice(keySeqIdx)\n const nextKeys = formatKeySeq(remainingKeySeq).display\n\n completions.push({\n nextKeys,\n nextKeySeq: remainingKeySeq,\n fullSequence: hotkeyStr,\n display: formatKeySeq(keySeq),\n actions,\n isComplete: false,\n captures: captures.length > 0 ? captures : undefined,\n })\n }\n }\n\n // Sort: complete matches first, then by fullSequence\n completions.sort((a, b) => {\n if (a.isComplete !== b.isComplete) return a.isComplete ? -1 : 1\n return a.fullSequence.localeCompare(b.fullSequence)\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 : 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 { DEFAULT_SEQUENCE_TIMEOUT } from './constants'\nimport {\n isModifierKey,\n isShiftedChar,\n normalizeKey,\n parseHotkeyString,\n parseKeySeq,\n} from './utils'\nimport type { KeyCombination, HotkeySequence, KeySeq, SeqElem, SeqElemState, SeqMatchState } 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 function type - can optionally receive captured values\n */\nexport type HotkeyHandler = (e: KeyboardEvent, captures?: number[]) => void\n\n/**\n * Handler map - maps action names to handler functions\n */\nexport type HandlerMap = Record<string, HotkeyHandler>\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: Infinity, no timeout) */\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 * 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// New KeySeq Matching (with digit placeholder support)\n// ============================================================================\n\n/**\n * Check if a key is a digit (0-9)\n */\nfunction isDigit(key: string): boolean {\n return /^[0-9]$/.test(key)\n}\n\n/**\n * Initialize match state from a KeySeq pattern\n */\nfunction initMatchState(seq: KeySeq): SeqMatchState {\n return seq.map((elem): SeqElemState => {\n if (elem.type === 'digit') return { type: 'digit' }\n if (elem.type === 'digits') return { type: 'digits' }\n return { type: 'key', key: elem.key, modifiers: elem.modifiers }\n })\n}\n\n/**\n * Check if a KeyCombination matches a SeqElem (for 'key' type)\n */\nfunction matchesKeyElem(combo: KeyCombination, elem: SeqElem & { type: 'key' }): boolean {\n const shiftMatches = isShiftedChar(combo.key)\n ? (elem.modifiers.shift ? combo.modifiers.shift : true)\n : combo.modifiers.shift === elem.modifiers.shift\n\n return (\n combo.modifiers.ctrl === elem.modifiers.ctrl &&\n combo.modifiers.alt === elem.modifiers.alt &&\n shiftMatches &&\n combo.modifiers.meta === elem.modifiers.meta &&\n combo.key === elem.key\n )\n}\n\n/**\n * Result of advancing a match state with a key press\n */\ntype AdvanceResult =\n | { status: 'matched'; state: SeqMatchState; captures: number[] }\n | { status: 'partial'; state: SeqMatchState }\n | { status: 'failed' }\n\n/**\n * Advance a match state with a key press.\n * Returns the new state (partial match), captures (complete match), or null (no match).\n */\nfunction advanceMatchState(\n state: SeqMatchState,\n pattern: KeySeq,\n combo: KeyCombination,\n): AdvanceResult {\n // Create mutable state copy\n const newState: SeqMatchState = [...state]\n\n // Find current position in match\n let pos = 0\n for (let i = 0; i < state.length; i++) {\n const elem = state[i]\n if (elem.type === 'key' && !elem.matched) break\n if (elem.type === 'digit' && elem.value === undefined) break\n if (elem.type === 'digits' && elem.value === undefined) {\n // digits can still be in-progress (partial)\n if (!elem.partial) break\n // Check if current key is a digit (continue) or not (finalize)\n if (isDigit(combo.key)) {\n // Accumulate digit\n const newPartial = (elem.partial || '') + combo.key\n newState[i] = { type: 'digits', partial: newPartial }\n // Still at same position, return partial\n return { status: 'partial', state: newState }\n } else {\n // Non-digit key: finalize the digits value and try to match next element\n const digitValue = parseInt(elem.partial, 10)\n newState[i] = { type: 'digits', value: digitValue }\n // Continue to next element with this key\n pos = i + 1\n\n // If this was the last element, the key doesn't match anything.\n // Return failed - Enter will handle execution separately.\n if (pos >= pattern.length) {\n return { status: 'failed' }\n }\n break\n }\n }\n pos++\n }\n\n if (pos >= pattern.length) {\n // Already fully matched\n return { status: 'failed' }\n }\n\n const currentPattern = pattern[pos]\n\n if (currentPattern.type === 'digit') {\n // Match single digit\n if (!isDigit(combo.key) || combo.modifiers.ctrl || combo.modifiers.alt || combo.modifiers.meta) {\n return { status: 'failed' }\n }\n newState[pos] = { type: 'digit', value: parseInt(combo.key, 10) }\n } else if (currentPattern.type === 'digits') {\n // Start or continue digits match\n if (!isDigit(combo.key) || combo.modifiers.ctrl || combo.modifiers.alt || combo.modifiers.meta) {\n return { status: 'failed' }\n }\n newState[pos] = { type: 'digits', partial: combo.key }\n } else {\n // Match key\n if (!matchesKeyElem(combo, currentPattern)) {\n return { status: 'failed' }\n }\n newState[pos] = { type: 'key', key: currentPattern.key, modifiers: currentPattern.modifiers, matched: true }\n }\n\n // Check if fully matched\n const isComplete = newState.every((elem) => {\n if (elem.type === 'key') return elem.matched === true\n if (elem.type === 'digit') return elem.value !== undefined\n if (elem.type === 'digits') return elem.value !== undefined\n return false\n })\n\n if (isComplete) {\n const captures = newState\n .filter((e): e is { type: 'digit'; value: number } | { type: 'digits'; value: number } =>\n (e.type === 'digit' || e.type === 'digits') && e.value !== undefined\n )\n .map(e => e.value)\n return { status: 'matched', state: newState, captures }\n }\n\n return { status: 'partial', state: newState }\n}\n\n/**\n * Check if a SeqMatchState is in the middle of collecting digits\n */\nfunction isCollectingDigits(state: SeqMatchState): boolean {\n return state.some(elem => elem.type === 'digits' && elem.partial !== undefined && elem.value === undefined)\n}\n\n/**\n * Finalize any in-progress digits collection in state\n */\nfunction finalizeDigits(state: SeqMatchState): SeqMatchState {\n return state.map(elem => {\n if (elem.type === 'digits' && elem.partial !== undefined && elem.value === undefined) {\n return { type: 'digits', value: parseInt(elem.partial, 10) }\n }\n return elem\n })\n}\n\n/**\n * Extract captures from a match state\n */\nfunction extractMatchCaptures(state: SeqMatchState): number[] {\n return state\n .filter((e): e is { type: 'digit'; value: number } | { type: 'digits'; value: number } =>\n (e.type === 'digit' || e.type === 'digits') && e.value !== undefined\n )\n .map(e => e.value)\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 * )\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 = DEFAULT_SEQUENCE_TIMEOUT,\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 // Track match states for patterns with digit placeholders\n const matchStatesRef = useRef<Map<string, SeqMatchState>>(new Map())\n\n // Parse keymap into sequences for matching\n const parsedKeymapRef = useRef<Array<{\n key: string\n sequence: HotkeySequence\n keySeq: KeySeq\n actions: string[]\n }>>([])\n\n useEffect(() => {\n parsedKeymapRef.current = Object.entries(keymap).map(([key, actionOrActions]) => ({\n key,\n sequence: parseHotkeyString(key),\n keySeq: parseKeySeq(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 matchStatesRef.current.clear()\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 (with optional captures)\n const tryExecute = useCallback((\n sequence: HotkeySequence,\n e: KeyboardEvent,\n captures?: number[],\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, captures)\n return true\n }\n }\n }\n }\n return false\n }, [preventDefault, stopPropagation])\n\n // Try to execute using KeySeq matching (with digit placeholders)\n const tryExecuteKeySeq = useCallback((\n matchKey: string,\n captures: number[],\n e: KeyboardEvent,\n ): boolean => {\n for (const entry of parsedKeymapRef.current) {\n if (entry.key === matchKey) {\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, captures.length > 0 ? captures : undefined)\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 text-like form element (unless enabled)\n if (!enableOnFormTags) {\n const eventTarget = e.target as HTMLElement\n // Check if it's a text-like input (not checkbox, radio, button, etc.)\n const isTextInput = eventTarget instanceof HTMLInputElement &&\n ['text', 'email', 'password', 'search', 'tel', 'url', 'number', 'date', 'datetime-local', 'month', 'time', 'week'].includes(eventTarget.type)\n if (\n isTextInput ||\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 (handled by SequenceModal when visible)\n // Note: SequenceModal captures Enter in capture phase and executes via executeAction\n if (e.key === 'Enter' && pendingKeysRef.current.length > 0) {\n e.preventDefault()\n\n // Try to execute any complete or finalizable digit patterns from current match states\n let executed = false\n for (const [key, state] of matchStatesRef.current.entries()) {\n // Finalize any in-progress digits\n const finalizedState = isCollectingDigits(state) ? finalizeDigits(state) : state\n\n // Check if state is complete\n const isComplete = finalizedState.every((elem) => {\n if (elem.type === 'key') return elem.matched === true\n if (elem.type === 'digit') return elem.value !== undefined\n if (elem.type === 'digits') return elem.value !== undefined\n return false\n })\n\n if (isComplete) {\n const captures = extractMatchCaptures(finalizedState)\n executed = tryExecuteKeySeq(key, captures, e)\n if (executed) break\n }\n }\n\n // Fall back to legacy matching\n if (!executed) {\n executed = tryExecute(pendingKeysRef.current, e)\n }\n\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\n // Backspace during sequence: check if any binding matches backspace continuation\n // If not, treat as \"delete last key\" for editing the sequence\n if (e.key === 'Backspace' && pendingKeysRef.current.length > 0) {\n // Quick check: would backspace match any pattern continuation?\n let backspaceMatches = false\n for (const entry of parsedKeymapRef.current) {\n let state = matchStatesRef.current.get(entry.key)\n if (!state) {\n state = initMatchState(entry.keySeq)\n }\n // If currently collecting digits, backspace should edit (not finalize and execute)\n // This prevents `h \\d+` from executing when typing `h 1 2 <backspace>`\n if (isCollectingDigits(state)) {\n continue\n }\n const result = advanceMatchState(state, entry.keySeq, currentCombo)\n if (result.status === 'matched' || result.status === 'partial') {\n backspaceMatches = true\n break\n }\n }\n\n if (!backspaceMatches) {\n e.preventDefault()\n const newPending = pendingKeysRef.current.slice(0, -1)\n if (newPending.length === 0) {\n clearPending()\n onSequenceCancel?.()\n } else {\n setPendingKeys(newPending)\n // Replay remaining pending keys to reconstruct match states\n matchStatesRef.current.clear()\n for (const combo of newPending) {\n for (const entry of parsedKeymapRef.current) {\n let state = matchStatesRef.current.get(entry.key)\n if (!state) {\n state = initMatchState(entry.keySeq)\n }\n const result = advanceMatchState(state, entry.keySeq, combo)\n if (result.status === 'partial') {\n matchStatesRef.current.set(entry.key, result.state)\n } else {\n matchStatesRef.current.delete(entry.key)\n }\n }\n }\n }\n return\n }\n }\n\n const newSequence = [...pendingKeysRef.current, currentCombo]\n\n // Try KeySeq matching first (handles digit placeholders)\n // Collect all matches (complete and partial) for permissive conflict resolution\n const completeMatches: Array<{\n key: string\n state: SeqMatchState\n captures: number[]\n }> = []\n let hasPartials = false\n const matchStates = matchStatesRef.current\n\n // Check if we have any partial matches in progress\n const hadPartialMatches = matchStates.size > 0\n\n for (const entry of parsedKeymapRef.current) {\n // Get existing match state for this pattern\n let state = matchStates.get(entry.key)\n\n // If we have partial matches in progress, only check patterns with existing state\n // This prevents a fresh \"j\" pattern from matching when we're trying to complete \"\\d+ j\"\n if (hadPartialMatches && !state) {\n continue\n }\n\n if (!state) {\n state = initMatchState(entry.keySeq)\n matchStates.set(entry.key, state)\n }\n\n const result = advanceMatchState(state, entry.keySeq, currentCombo)\n\n if (result.status === 'matched') {\n // Complete match - collect it\n completeMatches.push({\n key: entry.key,\n state: result.state,\n captures: result.captures,\n })\n // Also mark as failed so we don't keep stale state\n matchStates.delete(entry.key)\n } else if (result.status === 'partial') {\n // Update state and continue\n matchStates.set(entry.key, result.state)\n hasPartials = true\n } else {\n // Failed - reset this pattern's state\n matchStates.delete(entry.key)\n }\n }\n\n // Permissive conflict resolution:\n // - If exactly one complete match AND no partial matches → execute immediately\n // - Otherwise → enter sequence mode for disambiguation via SeqM\n if (completeMatches.length === 1 && !hasPartials) {\n const match = completeMatches[0]\n if (tryExecuteKeySeq(match.key, match.captures, e)) {\n clearPending()\n return\n }\n }\n\n // Multiple complete matches OR partials exist → enter sequence mode\n if (completeMatches.length > 0 || hasPartials) {\n // We have partial matches, 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 if (preventDefault) {\n e.preventDefault()\n }\n\n // Set timeout for digit sequences\n if (Number.isFinite(sequenceTimeout)) {\n setTimeoutStartedAt(Date.now())\n timeoutRef.current = setTimeout(() => {\n // On timeout, try to finalize any in-progress digits\n for (const [key, state] of matchStates.entries()) {\n if (isCollectingDigits(state)) {\n const finalizedState = finalizeDigits(state)\n // Check if finalized state is complete\n const entry = parsedKeymapRef.current.find(e => e.key === key)\n if (entry) {\n const isComplete = finalizedState.every((elem) => {\n if (elem.type === 'key') return elem.matched === true\n if (elem.type === 'digit') return elem.value !== undefined\n if (elem.type === 'digits') return elem.value !== undefined\n return false\n })\n if (isComplete) {\n // Note: We can't execute without the event, but the pattern matched\n // In practice, digit sequences should match on the terminating key\n void extractMatchCaptures(finalizedState)\n }\n }\n }\n }\n setPendingKeys([])\n setIsAwaitingSequence(false)\n setTimeoutStartedAt(null)\n matchStatesRef.current.clear()\n onSequenceCancel?.()\n timeoutRef.current = null\n }, sequenceTimeout)\n }\n\n return\n }\n\n // Fall back to legacy exact matching for non-placeholder patterns\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 (legacy)\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 (unless Infinity - then user must explicitly cancel)\n if (Number.isFinite(sequenceTimeout)) {\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\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\n if (pendingKeysRef.current.length > 0) {\n // Already in sequence mode - keep modal open with invalid key showing\n // \"No matching shortcuts\". User can backspace to fix or Escape to cancel.\n setPendingKeys(newSequence)\n if (preventDefault) {\n e.preventDefault()\n }\n return\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 (unless Infinity - then user must explicitly cancel)\n if (Number.isFinite(sequenceTimeout)) {\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\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 tryExecuteKeySeq,\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 { OmnibarEndpointsRegistryContext, useOmnibarEndpointsRegistry } from './OmnibarEndpointsRegistry'\nimport { DEFAULT_SEQUENCE_TIMEOUT } from './constants'\nimport { useHotkeys } from './useHotkeys'\nimport { findConflicts, getSequenceCompletions, searchActions } from './utils'\nimport type { ActionsRegistryValue } from './ActionsRegistry'\nimport type { OmnibarEndpointsRegistryValue } from './OmnibarEndpointsRegistry'\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: Infinity, no timeout) */\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\n/**\n * Context value for hotkeys.\n */\nexport interface HotkeysContextValue {\n /** The actions registry */\n registry: ActionsRegistryValue\n /** The omnibar endpoints registry */\n endpointsRegistry: OmnibarEndpointsRegistryValue\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 /** Whether currently editing a binding in ShortcutsModal */\n isEditingBinding: boolean\n /** Set editing state (called by ShortcutsModal) */\n setIsEditingBinding: (value: boolean) => void\n /** Lookup modal open state */\n isLookupOpen: boolean\n /** Open the lookup modal */\n openLookup: () => void\n /** Close the lookup modal */\n closeLookup: () => void\n /** Toggle the lookup modal */\n toggleLookup: () => void\n /** Execute an action by ID */\n executeAction: (id: string, captures?: number[]) => 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 /** Cancel the current sequence */\n cancelSequence: () => void\n}\n\nconst HotkeysContext = createContext<HotkeysContextValue | null>(null)\n\nconst DEFAULT_CONFIG: Required<HotkeysConfig> = {\n storageKey: 'use-kbd',\n sequenceTimeout: DEFAULT_SEQUENCE_TIMEOUT,\n disableConflicts: false, // Keep conflicting bindings active; SeqM handles disambiguation\n minViewportWidth: 768,\n enableOnTouch: false,\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 // Create the omnibar endpoints registry\n const endpointsRegistry = useOmnibarEndpointsRegistry()\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 // Lookup modal state\n const [isLookupOpen, setIsLookupOpen] = useState(false)\n const openLookup = useCallback(() => setIsLookupOpen(true), [])\n const closeLookup = useCallback(() => setIsLookupOpen(false), [])\n const toggleLookup = useCallback(() => setIsLookupOpen(prev => !prev), [])\n\n // Editing binding state (set by ShortcutsModal when recording a new binding)\n const [isEditingBinding, setIsEditingBinding] = useState(false)\n\n // Use registry keymap directly\n const keymap = registry.keymap\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 from registered actions\n const handlers = useMemo(() => {\n const map: Record<string, (e: KeyboardEvent, captures?: number[]) => void> = {}\n\n for (const [id, action] of registry.actions) {\n map[id] = action.config.handler\n }\n\n return map\n }, [registry.actions])\n\n // Register hotkeys (enabled unless editing a binding, omnibar, or lookup is open)\n const hotkeysEnabled = isEnabled && !isEditingBinding && !isOmnibarOpen && !isLookupOpen\n const {\n pendingKeys,\n isAwaitingSequence,\n cancelSequence,\n timeoutStartedAt: sequenceTimeoutStartedAt,\n sequenceTimeout,\n } = useHotkeys(effectiveKeymap, handlers, {\n enabled: hotkeysEnabled,\n sequenceTimeout: config.sequenceTimeout,\n })\n\n // Close modal when a sequence starts (so SequenceModal can show)\n useEffect(() => {\n if (isAwaitingSequence && isModalOpen) {\n closeModal()\n }\n }, [isAwaitingSequence, isModalOpen, closeModal])\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 endpointsRegistry,\n isEnabled,\n isModalOpen,\n openModal,\n closeModal,\n toggleModal,\n isOmnibarOpen,\n openOmnibar,\n closeOmnibar,\n toggleOmnibar,\n isLookupOpen,\n openLookup,\n closeLookup,\n toggleLookup,\n isEditingBinding,\n setIsEditingBinding,\n executeAction: registry.execute,\n pendingKeys,\n isAwaitingSequence,\n cancelSequence,\n sequenceTimeoutStartedAt,\n sequenceTimeout,\n conflicts,\n hasConflicts,\n searchActions: searchActionsHelper,\n getCompletions,\n }), [\n registry,\n endpointsRegistry,\n isEnabled,\n isModalOpen,\n openModal,\n closeModal,\n toggleModal,\n isOmnibarOpen,\n openOmnibar,\n closeOmnibar,\n toggleOmnibar,\n isLookupOpen,\n openLookup,\n closeLookup,\n toggleLookup,\n isEditingBinding,\n pendingKeys,\n isAwaitingSequence,\n cancelSequence,\n sequenceTimeoutStartedAt,\n sequenceTimeout,\n conflicts,\n hasConflicts,\n searchActionsHelper,\n getCompletions,\n ])\n\n return (\n <ActionsRegistryContext.Provider value={registry}>\n <OmnibarEndpointsRegistryContext.Provider value={endpointsRegistry}>\n <HotkeysContext.Provider value={value}>\n {children}\n </HotkeysContext.Provider>\n </OmnibarEndpointsRegistryContext.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\n/**\n * Handler function for actions.\n * Optionally receives captured values from digit placeholders in bindings.\n *\n * @example\n * ```tsx\n * // Simple handler (no captures)\n * handler: () => setPage(1)\n *\n * // Handler with captures (e.g., for binding \"\\d+ j\")\n * handler: (e, captures) => {\n * const n = captures?.[0] ?? 1\n * setRow(row + n)\n * }\n * ```\n */\nexport type ActionHandler = (e?: KeyboardEvent, captures?: number[]) => void\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 (optionally receives KeyboardEvent and captured values) */\n handler: ActionHandler\n /** Whether action is currently enabled (default: true) */\n enabled?: boolean\n /** Priority for conflict resolution (higher wins, default: 0) */\n priority?: number\n /** Hide from ShortcutsModal (still searchable in omnibar) */\n hideFromModal?: boolean\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: (e, captures) => {\n if (enabledRef.current) {\n handlerRef.current(e, captures)\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, ActionHandler>>({})\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: (e, captures) => {\n if (enabledRef.current[id]) {\n handlersRef.current[id]?.(e, captures)\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 { useContext, useEffect, useRef } from 'react'\nimport { OmnibarEndpointsRegistryContext } from './OmnibarEndpointsRegistry'\nimport type { OmnibarEndpointConfig } from './types'\n\n/**\n * Register a remote omnibar endpoint.\n *\n * Endpoints are automatically unregistered when the component unmounts,\n * making this ideal for colocating search providers with their data context.\n *\n * @example\n * ```tsx\n * function UsersPage() {\n * const navigate = useNavigate()\n *\n * useOmnibarEndpoint('users', {\n * fetch: async (query, signal, pagination) => {\n * const res = await fetch(`/api/users?q=${query}&offset=${pagination.offset}&limit=${pagination.limit}`, { signal })\n * const { users, total } = await res.json()\n * return {\n * entries: users.map(u => ({\n * id: `user:${u.id}`,\n * label: u.name,\n * description: u.email,\n * handler: () => navigate(`/users/${u.id}`),\n * })),\n * total,\n * hasMore: pagination.offset + users.length < total,\n * }\n * },\n * group: 'Users',\n * priority: 10,\n * pageSize: 10,\n * pagination: 'scroll',\n * })\n *\n * return <UsersList />\n * }\n * ```\n */\nexport function useOmnibarEndpoint(id: string, config: OmnibarEndpointConfig): void {\n const registry = useContext(OmnibarEndpointsRegistryContext)\n if (!registry) {\n throw new Error('useOmnibarEndpoint 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 fetch in a ref so we don't re-register on every render\n const fetchRef = useRef(config.fetch)\n fetchRef.current = config.fetch\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 fetch: async (query, signal, pagination) => {\n if (!enabledRef.current) return { entries: [] }\n return fetchRef.current(query, signal, pagination)\n },\n })\n\n return () => {\n registryRef.current.unregister(id)\n }\n }, [\n id,\n config.group,\n config.priority,\n config.minQueryLength,\n config.pageSize,\n config.pagination,\n // Note: we use refs for fetch and enabled, so they don't cause re-registration\n ])\n}\n","import { useCallback, useEffect, useRef, useState } from 'react'\nimport { DEFAULT_SEQUENCE_TIMEOUT } from './constants'\nimport { DIGIT_PLACEHOLDER, DIGITS_PLACEHOLDER, formatCombination, isModifierKey, isShiftedSymbol, 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: 800, // custom timeout\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 = DEFAULT_SEQUENCE_TIMEOUT,\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 // Track # key cycling for digit placeholder insertion\n // 0 = no hash, 1 = single (#), 2 = double (##), 3 = literal #\n const hashCycleRef = useRef<0 | 1 | 2 | 3>(0)\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 hashCycleRef.current = 0\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 hashCycleRef.current = 0\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: submit immediately if timeout is 0, otherwise start a new timeout\n const currentSequence = pendingKeysRef.current\n if (sequenceTimeout === 0) {\n submit(currentSequence)\n } else if (Number.isFinite(sequenceTimeout)) {\n timeoutRef.current = setTimeout(() => {\n submit(currentSequence)\n }, sequenceTimeout)\n }\n // If sequenceTimeout is Infinity, don't set a timeout (user must explicitly commit)\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 // Find the non-modifier key first\n let nonModifierKey = ''\n for (const k of pressedKeysRef.current) {\n if (!isModifierKey(k)) {\n nonModifierKey = normalizeKey(k)\n hasNonModifierRef.current = true\n break\n }\n }\n\n // Build current combination from pressed keys\n // Strip shift modifier for shifted symbols (e.g., # already implies shift)\n const combo: KeyCombination = {\n key: nonModifierKey,\n modifiers: {\n ctrl: e.ctrlKey,\n alt: e.altKey,\n shift: e.shiftKey && !isShiftedSymbol(nonModifierKey),\n meta: e.metaKey,\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 let 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 // Handle # key cycling for digit placeholders:\n // 1st #: single digit placeholder (#)\n // 2nd #: multi-digit placeholder (##)\n // 3rd #: literal #\n // 4th #: commit literal, start new single digit placeholder\n let newSequence: HotkeySequence\n const noModifiers = !combo.modifiers.ctrl && !combo.modifiers.alt && !combo.modifiers.meta && !combo.modifiers.shift\n\n if (combo.key === '#' && noModifiers) {\n const pending = pendingKeysRef.current\n const lastCombo = pending[pending.length - 1]\n\n if (hashCycleRef.current === 0) {\n // First #: insert single digit placeholder\n combo = { key: DIGIT_PLACEHOLDER, modifiers: { ctrl: false, alt: false, shift: false, meta: false } }\n newSequence = [...pending, combo]\n hashCycleRef.current = 1\n } else if (hashCycleRef.current === 1 && lastCombo?.key === DIGIT_PLACEHOLDER) {\n // Second #: replace with multi-digit placeholder\n newSequence = [...pending.slice(0, -1), { key: DIGITS_PLACEHOLDER, modifiers: { ctrl: false, alt: false, shift: false, meta: false } }]\n hashCycleRef.current = 2\n } else if (hashCycleRef.current === 2 && lastCombo?.key === DIGITS_PLACEHOLDER) {\n // Third #: replace with literal #\n newSequence = [...pending.slice(0, -1), { key: '#', modifiers: { ctrl: false, alt: false, shift: false, meta: false } }]\n hashCycleRef.current = 3\n } else {\n // Fourth # (or any other state): commit literal, add new single digit placeholder\n combo = { key: DIGIT_PLACEHOLDER, modifiers: { ctrl: false, alt: false, shift: false, meta: false } }\n newSequence = [...pending, combo]\n hashCycleRef.current = 1\n }\n } else {\n // Non-# key: reset hash cycle and add normally\n hashCycleRef.current = 0\n newSequence = [...pendingKeysRef.current, combo]\n }\n\n pendingKeysRef.current = newSequence\n setPendingKeys(newSequence)\n\n // Submit immediately if timeout is 0 (no sequences mode)\n // Otherwise set timeout to submit (unless paused or Infinity)\n clearTimeout_()\n if (sequenceTimeout === 0) {\n submit(newSequence)\n } else if (!pauseTimeoutRef.current && Number.isFinite(sequenceTimeout)) {\n timeoutRef.current = setTimeout(() => {\n submit(newSequence)\n }, sequenceTimeout)\n }\n // If sequenceTimeout is Infinity, don't set a timeout (user must explicitly commit)\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 return {\n isRecording,\n startRecording,\n cancel,\n commit,\n sequence,\n display,\n pendingKeys,\n activeKeys,\n sequenceTimeout,\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 = false, ...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 { useHotkeys, HotkeyMap, HandlerMap } from './useHotkeys'\n\nconst { max, min } = Math\nimport { searchActions, getSequenceCompletions, fuzzyMatch } from './utils'\nimport type { ActionRegistry, ActionSearchResult, EndpointPaginationMode, HotkeySequence, OmnibarEntry } from './types'\nimport type { SequenceCompletion } from './types'\nimport type { OmnibarEndpointsRegistryValue } from './OmnibarEndpointsRegistry'\n\n/** Default debounce time for remote queries */\nconst DEFAULT_DEBOUNCE_MS = 150\n\n/**\n * Pagination state for a single endpoint\n */\ninterface EndpointState {\n entries: OmnibarEntry[]\n offset: number\n total?: number\n hasMore?: boolean\n isLoading: boolean\n}\n\n/**\n * Result from remote endpoint, normalized for display\n */\nexport interface RemoteOmnibarResult {\n /** Unique ID (prefixed with endpoint ID) */\n id: string\n /** Entry data from endpoint */\n entry: OmnibarEntry\n /** Endpoint ID this came from */\n endpointId: string\n /** Priority from endpoint config */\n priority: number\n /** Fuzzy match score */\n score: number\n /** Matched ranges in label for highlighting */\n labelMatches: Array<[number, number]>\n}\n\n/**\n * Pagination info for an endpoint's results group\n */\nexport interface EndpointPaginationInfo {\n endpointId: string\n loaded: number\n total?: number\n hasMore: boolean\n isLoading: boolean\n mode: EndpointPaginationMode\n}\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 a remote entry is executed */\n onExecuteRemote?: (entry: OmnibarEntry) => 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 /** Remote endpoints registry (optional - enables remote search) */\n endpointsRegistry?: OmnibarEndpointsRegistryValue\n /** Debounce time for remote queries in ms (default: 150) */\n debounceMs?: 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 /** Local action search results (filtered and sorted) */\n results: ActionSearchResult[]\n /** Remote endpoint results */\n remoteResults: RemoteOmnibarResult[]\n /** Whether any remote endpoint is loading (initial or more) */\n isLoadingRemote: boolean\n /** Pagination info per endpoint */\n endpointPagination: Map<string, EndpointPaginationInfo>\n /** Load more results for a specific endpoint */\n loadMore: (endpointId: string) => void\n /** Currently selected result index (across local + remote) */\n selectedIndex: number\n /** Total number of results (local + remote) */\n totalResults: 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 onExecuteRemote,\n onOpen,\n onClose,\n maxResults = 10,\n endpointsRegistry,\n debounceMs = DEFAULT_DEBOUNCE_MS,\n } = options\n\n const [isOpen, setIsOpen] = useState(false)\n const [query, setQuery] = useState('')\n const [selectedIndex, setSelectedIndex] = useState(0)\n // Per-endpoint pagination state\n const [endpointStates, setEndpointStates] = useState<Map<string, EndpointState>>(new Map())\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 const onExecuteRemoteRef = useRef(onExecuteRemote)\n onExecuteRemoteRef.current = onExecuteRemote\n\n // Refs for abort controller, debounce timer, and current query\n const abortControllerRef = useRef<AbortController | null>(null)\n const debounceTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null)\n const currentQueryRef = useRef(query)\n currentQueryRef.current = query\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 (local actions)\n const results = useMemo(() => {\n const allResults = searchActions(query, actions, keymap)\n return allResults.slice(0, maxResults)\n }, [query, actions, keymap, maxResults])\n\n // Query remote endpoints (debounced) - initial page only\n useEffect(() => {\n // Clear any pending debounce timer\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n debounceTimerRef.current = null\n }\n\n // Abort any in-flight request\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n abortControllerRef.current = null\n }\n\n // Skip if no endpoints registry or empty query\n if (!endpointsRegistry || !query.trim()) {\n setEndpointStates(new Map())\n return\n }\n\n // Set all known endpoints to loading state\n setEndpointStates(prev => {\n const next = new Map(prev)\n for (const [id] of endpointsRegistry.endpoints) {\n next.set(id, { entries: [], offset: 0, isLoading: true })\n }\n return next\n })\n\n // Debounce the query\n debounceTimerRef.current = setTimeout(async () => {\n const controller = new AbortController()\n abortControllerRef.current = controller\n\n try {\n const endpointResults = await endpointsRegistry.queryAll(query, controller.signal)\n\n // Don't update if aborted\n if (controller.signal.aborted) return\n\n // Update state with results\n setEndpointStates(() => {\n const next = new Map<string, EndpointState>()\n for (const epResult of endpointResults) {\n const ep = endpointsRegistry.endpoints.get(epResult.endpointId)\n const pageSize = ep?.config.pageSize ?? 10\n next.set(epResult.endpointId, {\n entries: epResult.entries,\n offset: pageSize,\n total: epResult.total,\n hasMore: epResult.hasMore ?? (epResult.total !== undefined ? epResult.entries.length < epResult.total : undefined),\n isLoading: false,\n })\n }\n return next\n })\n } catch (error) {\n // Ignore abort errors\n if (error instanceof Error && error.name === 'AbortError') return\n console.error('Omnibar endpoint query failed:', error)\n setEndpointStates(prev => {\n const next = new Map(prev)\n for (const [id, state] of next) {\n next.set(id, { ...state, isLoading: false })\n }\n return next\n })\n }\n }, debounceMs)\n\n return () => {\n if (debounceTimerRef.current) {\n clearTimeout(debounceTimerRef.current)\n }\n if (abortControllerRef.current) {\n abortControllerRef.current.abort()\n }\n }\n }, [query, endpointsRegistry, debounceMs])\n\n // Load more results for a specific endpoint\n const loadMore = useCallback(async (endpointId: string) => {\n if (!endpointsRegistry) return\n\n const currentState = endpointStates.get(endpointId)\n if (!currentState || currentState.isLoading) return\n if (currentState.hasMore === false) return\n\n const ep = endpointsRegistry.endpoints.get(endpointId)\n if (!ep) return\n\n const pageSize = ep.config.pageSize ?? 10\n\n // Set loading state\n setEndpointStates(prev => {\n const next = new Map(prev)\n const state = next.get(endpointId)\n if (state) {\n next.set(endpointId, { ...state, isLoading: true })\n }\n return next\n })\n\n try {\n const controller = new AbortController()\n const result = await endpointsRegistry.queryEndpoint(\n endpointId,\n currentQueryRef.current,\n { offset: currentState.offset, limit: pageSize },\n controller.signal,\n )\n\n if (!result) return\n\n setEndpointStates(prev => {\n const next = new Map(prev)\n const state = next.get(endpointId)\n if (state) {\n next.set(endpointId, {\n entries: [...state.entries, ...result.entries],\n offset: state.offset + pageSize,\n total: result.total ?? state.total,\n hasMore: result.hasMore ?? (result.total !== undefined ? state.entries.length + result.entries.length < result.total : undefined),\n isLoading: false,\n })\n }\n return next\n })\n } catch (error) {\n if (error instanceof Error && error.name === 'AbortError') return\n console.error(`Omnibar loadMore failed for ${endpointId}:`, error)\n setEndpointStates(prev => {\n const next = new Map(prev)\n const state = next.get(endpointId)\n if (state) {\n next.set(endpointId, { ...state, isLoading: false })\n }\n return next\n })\n }\n }, [endpointsRegistry, endpointStates])\n\n // Compute flattened remote results from endpoint states\n const remoteResults = useMemo(() => {\n if (!endpointsRegistry) return []\n\n const processed: RemoteOmnibarResult[] = []\n\n for (const [endpointId, state] of endpointStates) {\n const endpoint = endpointsRegistry.endpoints.get(endpointId)\n const priority = endpoint?.config.priority ?? 0\n\n for (const entry of state.entries) {\n // Score the entry against the query\n const labelMatch = fuzzyMatch(query, entry.label)\n const descMatch = entry.description ? fuzzyMatch(query, entry.description) : null\n const keywordsMatch = entry.keywords?.map(k => fuzzyMatch(query, k)) ?? []\n\n // Calculate weighted score\n let score = 0\n let labelMatches: Array<[number, number]> = []\n if (labelMatch.matched) {\n score = Math.max(score, labelMatch.score * 3)\n labelMatches = labelMatch.ranges\n }\n if (descMatch?.matched) {\n score = Math.max(score, descMatch.score * 1.5)\n }\n for (const km of keywordsMatch) {\n if (km.matched) {\n score = Math.max(score, km.score * 2)\n }\n }\n\n processed.push({\n id: `${endpointId}:${entry.id}`,\n entry,\n endpointId,\n priority,\n score: score || 1,\n labelMatches,\n })\n }\n }\n\n // Sort by priority (desc) then score (desc)\n processed.sort((a, b) => {\n if (a.priority !== b.priority) return b.priority - a.priority\n return b.score - a.score\n })\n\n return processed\n }, [endpointStates, endpointsRegistry, query])\n\n // Compute isLoadingRemote\n const isLoadingRemote = useMemo(() => {\n for (const [, state] of endpointStates) {\n if (state.isLoading) return true\n }\n return false\n }, [endpointStates])\n\n // Compute pagination info per endpoint\n const endpointPagination = useMemo(() => {\n const info = new Map<string, EndpointPaginationInfo>()\n if (!endpointsRegistry) return info\n\n for (const [endpointId, state] of endpointStates) {\n const ep = endpointsRegistry.endpoints.get(endpointId)\n info.set(endpointId, {\n endpointId,\n loaded: state.entries.length,\n total: state.total,\n hasMore: state.hasMore ?? false,\n isLoading: state.isLoading,\n mode: ep?.config.pagination ?? 'none',\n })\n }\n\n return info\n }, [endpointStates, endpointsRegistry])\n\n // Total results count\n const totalResults = results.length + remoteResults.length\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, remoteResults])\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, totalResults - 1))\n }, [totalResults])\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 // Determine if executing a local action or remote entry\n const localCount = results.length\n\n // If actionId provided, try to find it in local or remote\n if (actionId) {\n // Check if it's a remote result ID (contains endpoint prefix)\n const remoteResult = remoteResults.find(r => r.id === actionId)\n if (remoteResult) {\n close()\n const entry = remoteResult.entry\n if ('handler' in entry && entry.handler) {\n entry.handler()\n }\n onExecuteRemoteRef.current?.(entry)\n return\n }\n\n // Otherwise treat as local action\n close()\n if (handlersRef.current?.[actionId]) {\n const event = new KeyboardEvent('keydown', { key: 'Enter' })\n handlersRef.current[actionId](event)\n }\n onExecuteRef.current?.(actionId)\n return\n }\n\n // No actionId - use selectedIndex\n if (selectedIndex < localCount) {\n // Local action\n const id = results[selectedIndex]?.id\n if (!id) return\n\n close()\n if (handlersRef.current?.[id]) {\n const event = new KeyboardEvent('keydown', { key: 'Enter' })\n handlersRef.current[id](event)\n }\n onExecuteRef.current?.(id)\n } else {\n // Remote entry\n const remoteIndex = selectedIndex - localCount\n const remoteResult = remoteResults[remoteIndex]\n if (!remoteResult) return\n\n close()\n const entry = remoteResult.entry\n if ('handler' in entry && entry.handler) {\n entry.handler()\n }\n onExecuteRemoteRef.current?.(entry)\n }\n }, [results, remoteResults, 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 remoteResults,\n isLoadingRemote,\n endpointPagination,\n loadMore,\n selectedIndex,\n totalResults,\n selectNext,\n selectPrev,\n execute,\n resetSelection,\n completions,\n pendingKeys,\n isAwaitingSequence,\n }\n}\n","import {ComponentType, type CSSProperties} from 'react'\n\nexport interface KeyIconProps {\n className?: string\n style?: CSSProperties\n}\n\nconst baseStyle: CSSProperties = {\n width: '1em',\n height: '1em',\n verticalAlign: 'middle',\n}\n\n/** Arrow Up icon (↑) */\nexport function Up({ className, style }: KeyIconProps) {\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=\"M12 19V5M5 12l7-7 7 7\"/>\n </svg>\n )\n}\n\n/** Arrow Down icon (↓) */\nexport function Down({ className, style }: KeyIconProps) {\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=\"M12 5v14M5 12l7 7 7-7\"/>\n </svg>\n )\n}\n\n/** Arrow Left icon (←) */\nexport function Left({ className, style }: KeyIconProps) {\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=\"M19 12H5M12 5l-7 7 7 7\"/>\n </svg>\n )\n}\n\n/** Arrow Right icon (→) */\nexport function Right({ className, style }: KeyIconProps) {\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=\"M5 12h14M12 5l7 7-7 7\"/>\n </svg>\n )\n}\n\n/** Enter/Return icon (↵) */\nexport function Enter({ className, style }: KeyIconProps) {\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=\"M9 10l-4 4 4 4\"/>\n <path d=\"M19 6v8a2 2 0 01-2 2H5\"/>\n </svg>\n )\n}\n\n/** Backspace icon (⌫) */\nexport function Backspace({ className, style }: KeyIconProps) {\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\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <path d=\"M21 4H8l-7 8 7 8h13a2 2 0 002-2V6a2 2 0 00-2-2z\"/>\n <line x1=\"18\" y1=\"9\" x2=\"12\" y2=\"15\"/>\n <line x1=\"12\" y1=\"9\" x2=\"18\" y2=\"15\"/>\n </svg>\n )\n}\n\n/** Tab icon (⇥) - rightward arrow to bar */\nexport function Tab({ className, style }: KeyIconProps) {\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\"\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n >\n <line x1=\"4\" y1=\"12\" x2=\"16\" y2=\"12\"/>\n <polyline points=\"12 8 16 12 12 16\"/>\n <line x1=\"20\" y1=\"6\" x2=\"20\" y2=\"18\"/>\n </svg>\n )\n}\n\nexport type KeyIconType = 'arrowup' | 'arrowdown' | 'arrowleft' | 'arrowright' | 'enter' | 'backspace' | 'tab'\n\n/** Get the icon component for a key, or null if no icon exists */\nexport function getKeyIcon(key: string): ComponentType<KeyIconProps> | null {\n switch (key.toLowerCase()) {\n case 'arrowup':\n return Up\n case 'arrowdown':\n return Down\n case 'arrowleft':\n return Left\n case 'arrowright':\n return Right\n case 'enter':\n return Enter\n case 'backspace':\n return Backspace\n case 'tab':\n return Tab\n default:\n return null\n }\n}\n","import { forwardRef, type CSSProperties, type SVGProps } from 'react'\nimport { isMac } from './utils'\n\nexport interface ModifierIconProps extends SVGProps<SVGSVGElement> {\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 const Command = forwardRef<SVGSVGElement, ModifierIconProps>(\n ({ className, style, ...props }, ref) => (\n <svg\n ref={ref}\n className={className}\n style={{ ...baseStyle, ...style }}\n viewBox=\"0 0 24 24\"\n fill=\"currentColor\"\n {...props}\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)\nCommand.displayName = 'Command'\n\n/** Control key icon (^) - chevron/caret */\nexport const Ctrl = forwardRef<SVGSVGElement, ModifierIconProps>(\n ({ className, style, ...props }, ref) => (\n <svg\n ref={ref}\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 {...props}\n >\n <path d=\"M6 15l6-6 6 6\"/>\n </svg>\n )\n)\nCtrl.displayName = 'Ctrl'\n\n/** Shift key icon (⇧) - hollow arrow */\nexport const Shift = forwardRef<SVGSVGElement, ModifierIconProps>(\n ({ className, style, ...props }, ref) => (\n <svg\n ref={ref}\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 {...props}\n >\n <path d=\"M14 3L3 14h6v7h10v-7h6L14 3z\"/>\n </svg>\n )\n)\nShift.displayName = 'Shift'\n\n/** Option key icon (⌥) - macOS style */\nexport const Option = forwardRef<SVGSVGElement, ModifierIconProps>(\n ({ className, style, ...props }, ref) => (\n <svg\n ref={ref}\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 {...props}\n >\n <path d=\"M4 6h6l8 12h6M14 6h6\"/>\n </svg>\n )\n)\nOption.displayName = 'Option'\n\n/** Alt key icon (⎇) - Windows style, though \"Alt\" text is more common on Windows */\nexport const Alt = forwardRef<SVGSVGElement, ModifierIconProps>(\n ({ className, style, ...props }, ref) => (\n <svg\n ref={ref}\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 {...props}\n >\n {/* ⎇ - branching path representing \"alternative\" */}\n <path d=\"M4 18h8M12 18l4-6M12 18l4 0M16 12l4-6h-8\"/>\n </svg>\n )\n)\nAlt.displayName = 'Alt'\n\nexport type ModifierType = 'meta' | 'ctrl' | 'shift' | 'alt' | 'opt'\n\n/** Get the appropriate icon component for a modifier key */\nexport function getModifierIcon(modifier: ModifierType): typeof Command {\n switch (modifier) {\n case 'meta':\n return Command\n case 'ctrl':\n return Ctrl\n case 'shift':\n return Shift\n case 'opt':\n return Option\n case 'alt':\n // On Mac, Alt is Option (⌥). On Windows, Alt is ⎇ (though text \"Alt\" is more common)\n return isMac() ? Option : Alt\n }\n}\n\n/** Render a modifier icon by name */\nexport const ModifierIcon = forwardRef<SVGSVGElement, ModifierIconProps & { modifier: ModifierType }>(\n ({ modifier, ...props }, ref) => {\n const Icon = getModifierIcon(modifier)\n return <Icon ref={ref} {...props} />\n }\n)\nModifierIcon.displayName = 'ModifierIcon'\n","import type { ReactElement } from 'react'\nimport { getKeyIcon } from './KeyIcons'\nimport { ModifierIcon } from './ModifierIcons'\nimport type { KeySeq, Modifiers, SeqElem } from './types'\nimport { formatKeyForDisplay } from './utils'\n\n/**\n * Render modifier icons (meta, ctrl, alt, shift) for a key combination.\n * Used consistently across all key rendering components.\n */\nexport function renderModifierIcons(modifiers: Modifiers, className = 'kbd-modifier-icon'): ReactElement[] {\n const icons: ReactElement[] = []\n if (modifiers.meta) {\n icons.push(<ModifierIcon key=\"meta\" modifier=\"meta\" className={className} />)\n }\n if (modifiers.ctrl) {\n icons.push(<ModifierIcon key=\"ctrl\" modifier=\"ctrl\" className={className} />)\n }\n if (modifiers.alt) {\n icons.push(<ModifierIcon key=\"alt\" modifier=\"alt\" className={className} />)\n }\n if (modifiers.shift) {\n icons.push(<ModifierIcon key=\"shift\" modifier=\"shift\" className={className} />)\n }\n return icons\n}\n\n/**\n * Render a single key with its icon or display text.\n * Returns the icon component if available, otherwise formatted text.\n */\nexport function renderKeyContent(key: string, iconClassName = 'kbd-key-icon'): ReactElement {\n const Icon = getKeyIcon(key)\n const displayKey = formatKeyForDisplay(key)\n return Icon ? <Icon className={iconClassName} /> : <>{displayKey}</>\n}\n\n/**\n * Render a complete SeqElem (key with modifiers, or digit placeholder).\n * Handles all element types: 'key', 'digit', 'digits'.\n */\nexport function renderSeqElem(elem: SeqElem, index: number, kbdClassName = 'kbd-kbd'): ReactElement {\n if (elem.type === 'digit') {\n return <kbd key={index} className={kbdClassName}>⟨#⟩</kbd>\n }\n if (elem.type === 'digits') {\n return <kbd key={index} className={kbdClassName}>⟨##⟩</kbd>\n }\n // It's a key with modifiers\n return (\n <kbd key={index} className={kbdClassName}>\n {renderModifierIcons(elem.modifiers)}\n {renderKeyContent(elem.key)}\n </kbd>\n )\n}\n\n/**\n * Render a complete KeySeq (array of sequence elements).\n * Used for displaying key sequences in SequenceModal, LookupModal, etc.\n */\nexport function renderKeySeq(keySeq: KeySeq, kbdClassName = 'kbd-kbd'): ReactElement[] {\n return keySeq.map((elem, i) => renderSeqElem(elem, i, kbdClassName))\n}\n","import { Fragment, useEffect, useRef } from 'react'\nimport { ACTION_LOOKUP, ACTION_MODAL, ACTION_OMNIBAR } from './constants'\nimport { useMaybeHotkeysContext } from './HotkeysProvider'\nimport { renderModifierIcons, renderKeyContent } from './KeyElements'\nimport { parseKeySeq } from './utils'\nimport type { KeyCombination, SeqElem } from './types'\n\nexport interface KbdProps {\n /** Action ID to display binding(s) for */\n action: string\n /** Separator between multiple bindings (default: \" / \") */\n separator?: string\n /** Show all bindings instead of just the first (default: false, shows only first) */\n all?: boolean\n /** Fallback content when no bindings exist */\n fallback?: React.ReactNode\n /** Additional className */\n className?: string\n /** Make the kbd clickable to trigger the action */\n clickable?: boolean\n}\n\n/**\n * Render a single key combination with SVG icons for modifiers and special keys\n */\nfunction KeyCombo({ combo }: { combo: KeyCombination }) {\n return (\n <>\n {renderModifierIcons(combo.modifiers)}\n {renderKeyContent(combo.key)}\n </>\n )\n}\n\n/**\n * Render a single sequence element (key, digit placeholder, or digits placeholder)\n */\nfunction SeqElemDisplay({ elem }: { elem: SeqElem }) {\n if (elem.type === 'digit') {\n return <span className=\"kbd-placeholder\" title=\"Any single digit (0-9)\">#</span>\n }\n if (elem.type === 'digits') {\n return <span className=\"kbd-placeholder\" title=\"One or more digits (0-9)\">##</span>\n }\n // Regular key\n return <KeyCombo combo={{ key: elem.key, modifiers: elem.modifiers }} />\n}\n\n/**\n * Render a binding string (possibly a sequence) with icons\n */\nfunction BindingDisplay({ binding }: { binding: string }) {\n const sequence = parseKeySeq(binding)\n\n return (\n <>\n {sequence.map((elem, i) => (\n <Fragment key={i}>\n {i > 0 && <span className=\"kbd-sequence-sep\"> </span>}\n <SeqElemDisplay elem={elem} />\n </Fragment>\n ))}\n </>\n )\n}\n\n/**\n * Display the current binding(s) for an action (clickable by default).\n *\n * Automatically updates when users customize their bindings.\n * Uses SVG icons for modifiers (⌘, ⌥, ⇧, ⌃) and special keys (arrows, enter, etc.)\n *\n * @example\n * ```tsx\n * // Clickable kbd that triggers the action (default)\n * <p>Press <Kbd action=\"help\" /> to see shortcuts</p>\n *\n * // Non-clickable for pure display (use Key alias or clickable={false})\n * <p>Navigate with <Key action=\"next\" /> to go to next item</p>\n *\n * // Show all bindings (not just the first)\n * <p>Navigate with <Kbd action=\"next\" all separator=\" or \" /></p>\n *\n * // With fallback when no binding exists\n * <Kbd action=\"customAction\" fallback=\"(unbound)\" />\n * ```\n */\nexport function Kbd({\n action,\n separator = ' / ',\n all = false,\n fallback = null,\n className,\n clickable = true,\n}: KbdProps) {\n const ctx = useMaybeHotkeysContext()\n const warnedRef = useRef(false)\n\n const bindings = ctx\n ? (all\n ? ctx.registry.getBindingsForAction(action)\n : [ctx.registry.getFirstBindingForAction(action)].filter(Boolean) as string[])\n : []\n\n // Warn about missing actions after mount (to allow time for registration)\n useEffect(() => {\n if (!ctx) return\n if (warnedRef.current) return\n\n const timer = setTimeout(() => {\n if (!ctx.registry.actions.has(action)) {\n console.warn(`Kbd: Action \"${action}\" not found in registry`)\n warnedRef.current = true\n }\n }, 100)\n\n return () => clearTimeout(timer)\n }, [ctx, action])\n\n if (!ctx) {\n return null\n }\n\n if (bindings.length === 0) {\n return <>{fallback}</>\n }\n\n const content = bindings.map((binding, i) => (\n <Fragment key={binding}>\n {i > 0 && separator}\n <BindingDisplay binding={binding} />\n </Fragment>\n ))\n\n if (clickable) {\n return (\n <kbd\n className={`${className || ''} kbd-clickable`.trim()}\n onClick={() => ctx.executeAction(action)}\n role=\"button\"\n tabIndex={0}\n onKeyDown={(e) => {\n if (e.key === 'Enter' || e.key === ' ') {\n e.preventDefault()\n ctx.executeAction(action)\n }\n }}\n >\n {content}\n </kbd>\n )\n }\n\n return <kbd className={className}>{content}</kbd>\n}\n\n/**\n * Non-clickable variant of Kbd for pure display/documentation purposes.\n * Alias for `<Kbd clickable={false} ... />`\n */\nexport function Key(props: Omit<KbdProps, 'clickable'>) {\n return <Kbd {...props} clickable={false} />\n}\n\n/**\n * Display all bindings for an action (shows multiple if they exist).\n * Alias for `<Kbd all ... />`\n *\n * @example\n * ```tsx\n * <p>Navigate with <Kbds action=\"next\" separator=\" or \" /></p>\n * ```\n */\nexport function Kbds(props: Omit<KbdProps, 'all'>) {\n return <Kbd {...props} all />\n}\n\ntype BuiltinKbdProps = Omit<KbdProps, 'action'>\n\n/**\n * Kbd for the ShortcutsModal trigger (default: `?`).\n * @example <KbdModal /> // Shows \"?\" or user's custom binding\n */\nexport function KbdModal(props: BuiltinKbdProps) {\n return <Kbd {...props} action={ACTION_MODAL} />\n}\n\n/**\n * Kbd for the Omnibar trigger (default: `⌘K`).\n * @example <KbdOmnibar /> // Shows \"⌘K\" or user's custom binding\n */\nexport function KbdOmnibar(props: BuiltinKbdProps) {\n return <Kbd {...props} action={ACTION_OMNIBAR} />\n}\n\n/**\n * Kbd for the LookupModal trigger (default: `⌘⇧K`).\n * @example <KbdLookup /> // Shows \"⌘⇧K\" or user's custom binding\n */\nexport function KbdLookup(props: BuiltinKbdProps) {\n return <Kbd {...props} action={ACTION_LOOKUP} />\n}\n","import { ReactNode, useCallback, useMemo, useState } from 'react'\nimport { useRecordHotkey } from './useRecordHotkey'\nimport { findConflicts, formatCombination, parseHotkeyString } 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 = parseHotkeyString(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 { useCallback, useEffect, useMemo, useState } from 'react'\nimport { ACTION_LOOKUP } from './constants'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { renderKeySeq } from './KeyElements'\nimport { useAction } from './useAction'\nimport type { HotkeySequence, KeyCombination, KeySeq } from './types'\nimport { formatCombination, formatKeySeq, parseHotkeyString, parseKeySeq, normalizeKey, isModifierKey } from './utils'\n\ninterface LookupResult {\n binding: string\n sequence: HotkeySequence\n keySeq: KeySeq\n display: string\n actions: string[]\n labels: string[]\n}\n\nexport interface LookupModalProps {\n /**\n * Default keybinding to open lookup modal (default: 'meta+shift+k').\n * Users can override this in the shortcuts modal.\n * Set to empty string to disable.\n */\n defaultBinding?: string\n}\n\n/**\n * Modal for browsing and looking up keyboard shortcuts by typing key sequences.\n *\n * Unlike SequenceModal (which auto-executes when a complete sequence is entered),\n * LookupModal lets you browse all available shortcuts and select one to execute.\n *\n * - Press keys to filter to matching sequences\n * - Use arrow keys to navigate results\n * - Press Enter to execute selected action\n * - Press Escape to close or clear filter\n * - Press Backspace to remove last key from filter\n */\nexport function LookupModal({ defaultBinding = 'meta+shift+k' }: LookupModalProps = {}) {\n const {\n isLookupOpen,\n closeLookup,\n toggleLookup,\n registry,\n executeAction,\n } = useHotkeysContext()\n\n // Register the lookup modal trigger action\n useAction(ACTION_LOOKUP, {\n label: 'Key lookup',\n group: 'Global',\n defaultBindings: defaultBinding ? [defaultBinding] : [],\n handler: useCallback(() => toggleLookup(), [toggleLookup]),\n })\n\n // Internal pending keys state (separate from global)\n const [pendingKeys, setPendingKeys] = useState<HotkeySequence>([])\n const [selectedIndex, setSelectedIndex] = useState(0)\n\n // Get all bindings from keymap\n const allBindings = useMemo((): LookupResult[] => {\n const results: LookupResult[] = []\n const keymap = registry.keymap\n\n for (const [binding, actionOrActions] of Object.entries(keymap)) {\n // Skip internal triggers\n if (binding.startsWith('__')) continue\n\n const actions = Array.isArray(actionOrActions) ? actionOrActions : [actionOrActions]\n const sequence = parseHotkeyString(binding)\n const keySeq = parseKeySeq(binding)\n // Use formatKeySeq to properly display digit placeholders and arrow keys\n const display = formatKeySeq(keySeq).display\n\n // Get labels for actions\n const labels = actions.map(actionId => {\n const action = registry.actions.get(actionId)\n return action?.config.label || actionId\n })\n\n results.push({ binding, sequence, keySeq, display, actions, labels })\n }\n\n // Sort by binding for consistent ordering\n results.sort((a, b) => a.binding.localeCompare(b.binding))\n\n return results\n }, [registry.keymap, registry.actions])\n\n // Filter bindings based on pending keys\n const filteredBindings = useMemo((): LookupResult[] => {\n if (pendingKeys.length === 0) return allBindings\n\n return allBindings.filter(result => {\n // Use keySeq for matching (has proper digit/digits types)\n const keySeq = result.keySeq\n if (keySeq.length < pendingKeys.length) return false\n\n // Track position in keySeq (may differ from pendingKeys due to \\d+ consuming multiple digits)\n let keySeqIdx = 0\n\n for (let i = 0; i < pendingKeys.length && keySeqIdx < keySeq.length; i++) {\n const pending = pendingKeys[i]\n const elem = keySeq[keySeqIdx]\n const isDigit = /^[0-9]$/.test(pending.key)\n\n if (elem.type === 'digits') {\n // \\d+ matches one or more digits\n if (!isDigit) return false\n // Check if next pending key is also a digit (still accumulating)\n if (i + 1 < pendingKeys.length && /^[0-9]$/.test(pendingKeys[i + 1].key)) {\n continue // Stay on this keySeq element\n }\n keySeqIdx++\n } else if (elem.type === 'digit') {\n // \\d matches exactly one digit\n if (!isDigit) return false\n keySeqIdx++\n } else {\n // Regular key - check exact match with modifiers\n if (pending.key !== elem.key) return false\n if (pending.modifiers.ctrl !== elem.modifiers.ctrl) return false\n if (pending.modifiers.alt !== elem.modifiers.alt) return false\n if (pending.modifiers.shift !== elem.modifiers.shift) return false\n if (pending.modifiers.meta !== elem.modifiers.meta) return false\n keySeqIdx++\n }\n }\n\n return true\n })\n }, [allBindings, pendingKeys])\n\n // Group by next key (for showing available continuations)\n const groupedByNextKey = useMemo(() => {\n const groups = new Map<string, LookupResult[]>()\n\n for (const result of filteredBindings) {\n // If this binding is longer than pending, group by next key\n if (result.sequence.length > pendingKeys.length) {\n const nextCombo = result.sequence[pendingKeys.length]\n const nextKey = formatCombination([nextCombo]).display\n\n const existing = groups.get(nextKey) || []\n existing.push(result)\n groups.set(nextKey, existing)\n } else {\n // Exact match - group under empty string\n const existing = groups.get('') || []\n existing.push(result)\n groups.set('', existing)\n }\n }\n\n return groups\n }, [filteredBindings, 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 // Reset state when modal opens/closes\n useEffect(() => {\n if (isLookupOpen) {\n setPendingKeys([])\n setSelectedIndex(0)\n }\n }, [isLookupOpen])\n\n // Reset selection when filtered results change\n useEffect(() => {\n setSelectedIndex(0)\n }, [filteredBindings.length])\n\n // Handle keyboard input\n useEffect(() => {\n if (!isLookupOpen) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n // Handle navigation keys\n if (e.key === 'Escape') {\n e.preventDefault()\n if (pendingKeys.length > 0) {\n // Clear filter first\n setPendingKeys([])\n } else {\n closeLookup()\n }\n return\n }\n\n if (e.key === 'Backspace') {\n e.preventDefault()\n setPendingKeys(prev => prev.slice(0, -1))\n return\n }\n\n if (e.key === 'ArrowDown') {\n e.preventDefault()\n setSelectedIndex(prev => Math.min(prev + 1, filteredBindings.length - 1))\n return\n }\n\n if (e.key === 'ArrowUp') {\n e.preventDefault()\n setSelectedIndex(prev => Math.max(prev - 1, 0))\n return\n }\n\n if (e.key === 'Enter') {\n e.preventDefault()\n const selected = filteredBindings[selectedIndex]\n if (selected && selected.actions.length > 0) {\n closeLookup()\n // Execute first action\n executeAction(selected.actions[0])\n }\n return\n }\n\n // Skip modifier-only keys\n if (isModifierKey(e.key)) return\n\n // Add this key to pending\n e.preventDefault()\n const newCombo: KeyCombination = {\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 setPendingKeys(prev => [...prev, newCombo])\n }\n\n window.addEventListener('keydown', handleKeyDown)\n return () => window.removeEventListener('keydown', handleKeyDown)\n }, [isLookupOpen, pendingKeys, filteredBindings, selectedIndex, closeLookup, executeAction])\n\n // Handle backdrop click\n const handleBackdropClick = useCallback(() => {\n closeLookup()\n }, [closeLookup])\n\n if (!isLookupOpen) return null\n\n return (\n <div className=\"kbd-lookup-backdrop\" onClick={handleBackdropClick}>\n <div className=\"kbd-lookup\" onClick={e => e.stopPropagation()}>\n {/* Search/filter display */}\n <div className=\"kbd-lookup-header\">\n <div className=\"kbd-lookup-search\">\n {formattedPendingKeys ? (\n <kbd className=\"kbd-sequence-keys\">{formattedPendingKeys}</kbd>\n ) : (\n <span className=\"kbd-lookup-placeholder\">Type keys to filter...</span>\n )}\n </div>\n <span className=\"kbd-lookup-hint\">\n ↑↓ navigate · Enter select · Esc {pendingKeys.length > 0 ? 'clear' : 'close'} · ⌫ back\n </span>\n </div>\n\n {/* Results list */}\n <div className=\"kbd-lookup-results\">\n {filteredBindings.length === 0 ? (\n <div className=\"kbd-lookup-empty\">No matching shortcuts</div>\n ) : (\n filteredBindings.map((result, index) => (\n <div\n key={result.binding}\n className={`kbd-lookup-result ${index === selectedIndex ? 'selected' : ''}`}\n onClick={() => {\n closeLookup()\n if (result.actions.length > 0) {\n executeAction(result.actions[0])\n }\n }}\n onMouseEnter={() => setSelectedIndex(index)}\n >\n <span className=\"kbd-lookup-binding\">{renderKeySeq(result.keySeq)}</span>\n <span className=\"kbd-lookup-labels\">\n {result.labels.join(', ')}\n </span>\n </div>\n ))\n )}\n </div>\n\n {/* Available next keys hint */}\n {pendingKeys.length > 0 && groupedByNextKey.size > 1 && (\n <div className=\"kbd-lookup-continuations\">\n <span className=\"kbd-lookup-continuations-label\">Continue with:</span>\n {Array.from(groupedByNextKey.keys())\n .filter(k => k !== '')\n .slice(0, 8)\n .map(nextKey => (\n <kbd key={nextKey} className=\"kbd-kbd kbd-small\">{nextKey}</kbd>\n ))}\n {groupedByNextKey.size > 9 && <span>...</span>}\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { Fragment, KeyboardEvent, MouseEvent, ReactNode, RefObject, useCallback, useEffect, useMemo, useRef } from 'react'\nimport { ACTION_OMNIBAR } from './constants'\nimport { useMaybeHotkeysContext } from './HotkeysProvider'\nimport { ModifierIcon } from './ModifierIcons'\nimport { useAction } from './useAction'\nimport { useOmnibar, RemoteOmnibarResult, EndpointPaginationInfo } from './useOmnibar'\nimport { parseKeySeq, formatKeyForDisplay } from './utils'\nimport type { SeqElem, OmnibarEntry } from './types'\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 /**\n * Default keybinding to open omnibar (default: 'meta+k').\n * Users can override this in the shortcuts modal.\n * Set to empty string to disable.\n */\n defaultBinding?: string\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 a local action is executed.\n * If not provided, uses executeAction from HotkeysContext.\n */\n onExecute?: (actionId: string) => void\n /**\n * Called when a remote omnibar entry is executed.\n * Use this to handle navigation for entries with `href`.\n */\n onExecuteRemote?: (entry: OmnibarEntry) => 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 /** Local action search results */\n results: ActionSearchResult[]\n /** Remote endpoint results */\n remoteResults: RemoteOmnibarResult[]\n /** Whether remote endpoints are being queried */\n isLoadingRemote: boolean\n /** Pagination info per endpoint */\n endpointPagination: Map<string, EndpointPaginationInfo>\n /** Load more results for a specific endpoint */\n loadMore: (endpointId: string) => void\n /** Currently selected index (across local + remote) */\n selectedIndex: number\n /** Total number of results (local + remote) */\n totalResults: 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 single sequence element\n */\nfunction SeqElemBadge({ elem }: { elem: SeqElem }) {\n if (elem.type === 'digit') {\n return <span className=\"kbd-placeholder\" title=\"Any single digit (0-9)\">#</span>\n }\n if (elem.type === 'digits') {\n return <span className=\"kbd-placeholder\" title=\"One or more digits (0-9)\">##</span>\n }\n // Regular key with modifiers\n return (\n <>\n {elem.modifiers.meta && <ModifierIcon modifier=\"meta\" className=\"kbd-modifier-icon\" />}\n {elem.modifiers.ctrl && <ModifierIcon modifier=\"ctrl\" className=\"kbd-modifier-icon\" />}\n {elem.modifiers.alt && <ModifierIcon modifier=\"alt\" className=\"kbd-modifier-icon\" />}\n {elem.modifiers.shift && <ModifierIcon modifier=\"shift\" className=\"kbd-modifier-icon\" />}\n <span>{formatKeyForDisplay(elem.key)}</span>\n </>\n )\n}\n\n/**\n * Render a key binding with modifier icons and digit placeholders\n */\nfunction BindingBadge({ binding }: { binding: string }) {\n const keySeq = parseKeySeq(binding)\n\n return (\n <kbd className=\"kbd-kbd\">\n {keySeq.map((elem, i) => (\n <Fragment key={i}>\n {i > 0 && <span className=\"kbd-sequence-sep\"> </span>}\n <SeqElemBadge elem={elem} />\n </Fragment>\n ))}\n </kbd>\n )\n}\n\n/**\n * Command palette for searching and executing actions by name.\n *\n * Opens by default with `⌘K` (macOS) or `Ctrl+K` (Windows/Linux). Type to search\n * across all registered actions by label, then press Enter to execute.\n *\n * Features:\n * - **Fuzzy search**: Matches action labels (e.g., \"nav tab\" finds \"Navigate to Table\")\n * - **Keyboard navigation**: Arrow keys to select, Enter to execute, Escape to close\n * - **Binding display**: Shows keyboard shortcuts next to each result\n * - **Sequence support**: Can also match and execute key sequences\n *\n * Unlike ShortcutsModal (shows all shortcuts organized by group) or LookupModal\n * (type keys to filter by binding), Omnibar is search-first by action name/label.\n *\n * Styled via CSS custom properties: --kbd-bg, --kbd-text, --kbd-accent, etc.\n *\n * @example\n * ```tsx\n * // Basic usage with HotkeysProvider (recommended)\n * <HotkeysProvider>\n * <App />\n * <Omnibar />\n * </HotkeysProvider>\n *\n * // Standalone with explicit props\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 defaultBinding = 'meta+k',\n isOpen: isOpenProp,\n onOpen: onOpenProp,\n onClose: onCloseProp,\n onExecute: onExecuteProp,\n onExecuteRemote: onExecuteRemoteProp,\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 // Register the omnibar trigger action (only works within HotkeysProvider)\n useAction(ACTION_OMNIBAR, {\n label: 'Command palette',\n group: 'Global',\n defaultBindings: defaultBinding ? [defaultBinding] : [],\n handler: useCallback(() => ctx?.toggleOmnibar(), [ctx?.toggleOmnibar]),\n })\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 // Create remote execute handler\n const handleExecuteRemote = useCallback((entry: OmnibarEntry) => {\n if (onExecuteRemoteProp) {\n onExecuteRemoteProp(entry)\n } else if ('href' in entry && entry.href) {\n // Default behavior: navigate to href using window.location\n window.location.href = entry.href\n }\n }, [onExecuteRemoteProp])\n\n const {\n isOpen: internalIsOpen,\n close,\n query,\n setQuery,\n results,\n remoteResults,\n isLoadingRemote,\n endpointPagination,\n loadMore,\n selectedIndex,\n totalResults,\n selectNext,\n selectPrev,\n execute,\n completions,\n pendingKeys,\n isAwaitingSequence,\n } = useOmnibar({\n actions,\n handlers: handlersProp,\n keymap,\n openKey: '', // Trigger is handled via useAction, not useOmnibar\n enabled: false,\n onOpen: handleOpen,\n onClose: handleClose,\n onExecute: handleExecute,\n onExecuteRemote: handleExecuteRemote,\n maxResults,\n endpointsRegistry: ctx?.endpointsRegistry,\n })\n\n // Use prop, then context, then internal state\n const isOpen = isOpenProp ?? ctx?.isOmnibarOpen ?? internalIsOpen\n\n // Ref for the results container (IntersectionObserver root)\n const resultsContainerRef = useRef<HTMLDivElement | null>(null)\n\n // Refs for sentinel elements (one per endpoint with scroll mode)\n const sentinelRefs = useRef<Map<string, HTMLDivElement | null>>(new Map())\n\n // Group remote results by endpoint for rendering sentinels\n const remoteResultsByEndpoint = useMemo(() => {\n const grouped = new Map<string, RemoteOmnibarResult[]>()\n for (const result of remoteResults) {\n const existing = grouped.get(result.endpointId) ?? []\n existing.push(result)\n grouped.set(result.endpointId, existing)\n }\n return grouped\n }, [remoteResults])\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 // IntersectionObserver for scroll-based pagination\n useEffect(() => {\n if (!isOpen) return\n\n const container = resultsContainerRef.current\n if (!container) return\n\n const observer = new IntersectionObserver(\n (entries) => {\n for (const entry of entries) {\n if (!entry.isIntersecting) continue\n\n // Get endpoint ID from data attribute\n const endpointId = (entry.target as HTMLElement).dataset.endpointId\n if (!endpointId) continue\n\n // Check if this endpoint uses scroll mode and has more results\n const paginationInfo = endpointPagination.get(endpointId)\n if (!paginationInfo) continue\n if (paginationInfo.mode !== 'scroll') continue\n if (!paginationInfo.hasMore) continue\n if (paginationInfo.isLoading) continue\n\n // Load more!\n loadMore(endpointId)\n }\n },\n {\n root: container,\n rootMargin: '100px', // Trigger slightly before sentinel is visible\n threshold: 0,\n },\n )\n\n // Observe all sentinel elements\n for (const [_endpointId, sentinel] of sentinelRefs.current) {\n if (sentinel) {\n observer.observe(sentinel)\n }\n }\n\n return () => observer.disconnect()\n }, [isOpen, endpointPagination, loadMore])\n\n // Global ESC handler to close omnibar (works even if input loses focus)\n useEffect(() => {\n if (!isOpen) return\n\n const handleGlobalKeyDown = (e: globalThis.KeyboardEvent) => {\n if (e.key === 'Escape') {\n e.preventDefault()\n e.stopPropagation()\n close()\n }\n }\n\n // Use capture phase to catch ESC before other handlers\n document.addEventListener('keydown', handleGlobalKeyDown, true)\n return () => document.removeEventListener('keydown', handleGlobalKeyDown, true)\n }, [isOpen, close])\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 remoteResults,\n isLoadingRemote,\n endpointPagination,\n loadMore,\n selectedIndex,\n totalResults,\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\" ref={resultsContainerRef}>\n {totalResults === 0 && !isLoadingRemote ? (\n <div className=\"kbd-omnibar-no-results\">\n {query ? 'No matching commands' : 'Start typing to search commands...'}\n </div>\n ) : (\n <>\n {/* Local action results */}\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 >\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 {/* Remote endpoint results grouped by endpoint */}\n {(() => {\n let remoteIndex = 0\n return Array.from(remoteResultsByEndpoint.entries()).map(([endpointId, endpointResults]) => {\n const paginationInfo = endpointPagination.get(endpointId)\n const showPagination = paginationInfo?.mode === 'scroll' && paginationInfo.total !== undefined\n\n return (\n <Fragment key={endpointId}>\n {endpointResults.map((result) => {\n const absoluteIndex = results.length + remoteIndex\n remoteIndex++\n return (\n <div\n key={result.id}\n className={`kbd-omnibar-result ${absoluteIndex === selectedIndex ? 'selected' : ''}`}\n onClick={() => execute(result.id)}\n >\n <span className=\"kbd-omnibar-result-label\">\n {result.entry.label}\n </span>\n {result.entry.group && (\n <span className=\"kbd-omnibar-result-category\">\n {result.entry.group}\n </span>\n )}\n {result.entry.description && (\n <span className=\"kbd-omnibar-result-description\">\n {result.entry.description}\n </span>\n )}\n </div>\n )\n })}\n\n {/* Pagination info and sentinel for scroll mode */}\n {paginationInfo?.mode === 'scroll' && (\n <div\n className=\"kbd-omnibar-pagination\"\n ref={(el) => sentinelRefs.current.set(endpointId, el)}\n data-endpoint-id={endpointId}\n >\n {paginationInfo.isLoading ? (\n <span className=\"kbd-omnibar-pagination-loading\">Loading more...</span>\n ) : showPagination ? (\n <span className=\"kbd-omnibar-pagination-info\">\n {paginationInfo.loaded} of {paginationInfo.total}\n </span>\n ) : paginationInfo.hasMore ? (\n <span className=\"kbd-omnibar-pagination-more\">Scroll for more...</span>\n ) : null}\n </div>\n )}\n </Fragment>\n )\n })\n })()}\n\n {/* Loading indicator for initial load */}\n {isLoadingRemote && remoteResults.length === 0 && (\n <div className=\"kbd-omnibar-loading\">\n Searching...\n </div>\n )}\n </>\n )}\n </div>\n </div>\n </div>\n )\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { renderKeySeq, renderModifierIcons, renderKeyContent } from './KeyElements'\nimport type { KeyCombination, SequenceCompletion } from './types'\n\n/**\n * Modal that appears during multi-key sequence input (e.g., `g t` for \"go to table\").\n *\n * When a user presses a key that starts a sequence, this modal appears showing:\n * - The keys pressed so far\n * - Available completions (what keys can come next)\n * - A timeout indicator (only shown when exactly one completion exists)\n *\n * Features:\n * - Arrow keys navigate between completions (cancels auto-timeout)\n * - Enter executes the selected completion (even for digit patterns - handler gets undefined captures)\n * - Escape cancels the sequence\n *\n * Unlike LookupModal (which requires explicit activation and lets you browse/search),\n * SequenceModal appears automatically when you start typing a sequence.\n *\n * @example\n * ```tsx\n * // Include in your app (no props needed - uses HotkeysContext)\n * <HotkeysProvider>\n * <App />\n * <SequenceModal />\n * </HotkeysProvider>\n * ```\n */\nexport function SequenceModal() {\n const {\n pendingKeys,\n isAwaitingSequence,\n cancelSequence,\n sequenceTimeoutStartedAt: timeoutStartedAt,\n sequenceTimeout,\n getCompletions,\n registry,\n executeAction,\n } = useHotkeysContext()\n\n const [selectedIndex, setSelectedIndex] = useState(0)\n // Track if user has interacted with arrows - cancels timeout\n const [hasInteracted, setHasInteracted] = useState(false)\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 // Flatten completions for navigation (each action gets its own row)\n // Group complete matches first, then continuations\n const flatCompletions = useMemo(() => {\n const items: Array<{\n completion: SequenceCompletion\n action: string\n displayKey: string\n isComplete: boolean\n }> = []\n\n for (const c of completions) {\n for (const action of c.actions) {\n // For complete matches, show \"↵\" as the key\n // For continuations, show the next keys needed\n const displayKey = c.isComplete ? '↵' : c.nextKeys\n items.push({\n completion: c,\n action,\n displayKey,\n isComplete: c.isComplete,\n })\n }\n }\n\n return items\n }, [completions])\n\n const itemCount = flatCompletions.length\n\n // Should show timeout? Only when exactly one completion AND no user interaction\n const shouldShowTimeout = timeoutStartedAt !== null && completions.length === 1 && !hasInteracted\n\n // Reset selection and interaction state when pending keys change\n useEffect(() => {\n setSelectedIndex(0)\n setHasInteracted(false)\n }, [pendingKeys])\n\n // Execute selected action\n const executeSelected = useCallback(() => {\n if (selectedIndex >= 0 && selectedIndex < flatCompletions.length) {\n const item = flatCompletions[selectedIndex]\n // Execute the action with any captured digit values\n executeAction(item.action, item.completion.captures)\n cancelSequence()\n }\n }, [selectedIndex, flatCompletions, executeAction, cancelSequence])\n\n // Keyboard navigation - intercept arrow keys to prevent page actions\n useEffect(() => {\n if (!isAwaitingSequence || pendingKeys.length === 0) return\n\n const handleKeyDown = (e: KeyboardEvent) => {\n switch (e.key) {\n case 'ArrowDown':\n e.preventDefault()\n e.stopPropagation()\n setSelectedIndex(prev => Math.min(prev + 1, itemCount - 1))\n setHasInteracted(true)\n break\n case 'ArrowUp':\n e.preventDefault()\n e.stopPropagation()\n setSelectedIndex(prev => Math.max(prev - 1, 0))\n setHasInteracted(true)\n break\n case 'Enter':\n e.preventDefault()\n e.stopPropagation()\n executeSelected()\n break\n // Note: Escape is handled by useHotkeys\n // Other keys continue the sequence via useHotkeys\n }\n }\n\n // Use capture phase to intercept before useHotkeys\n document.addEventListener('keydown', handleKeyDown, true)\n return () => document.removeEventListener('keydown', handleKeyDown, true)\n }, [isAwaitingSequence, pendingKeys.length, itemCount, executeSelected])\n\n // Render a single key combination with modifiers and icon if available\n const renderKey = useCallback((combo: KeyCombination, index: number) => {\n const { key, modifiers } = combo\n return (\n <kbd key={index} className=\"kbd-kbd\">\n {renderModifierIcons(modifiers)}\n {renderKeyContent(key)}\n </kbd>\n )\n }, [])\n\n // Get human-readable label for an action from registry, with captured digits interpolated\n const getActionLabel = (actionId: string, captures?: number[]) => {\n const action = registry.actions.get(actionId)\n let label = action?.config.label || actionId\n // Replace N placeholders with captured digit values\n if (captures && captures.length > 0) {\n let captureIdx = 0\n label = label.replace(/\\bN\\b/g, () => {\n if (captureIdx < captures.length) {\n return String(captures[captureIdx++])\n }\n return 'N'\n })\n }\n return label\n }\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\" onClick={cancelSequence}>\n <div className=\"kbd-sequence\" onClick={e => e.stopPropagation()}>\n {/* Current sequence at top */}\n <div className=\"kbd-sequence-current\">\n <div className=\"kbd-sequence-keys\">\n {pendingKeys.map((combo, i) => renderKey(combo, i))}\n </div>\n <span className=\"kbd-sequence-ellipsis\">…</span>\n </div>\n\n {/* Timeout progress bar - only shown when exactly one completion and no interaction */}\n {shouldShowTimeout && (\n <div\n className=\"kbd-sequence-timeout\"\n key={timeoutStartedAt}\n style={{ animationDuration: `${sequenceTimeout}ms` }}\n />\n )}\n\n {/* Completions list */}\n {flatCompletions.length > 0 && (\n <div className=\"kbd-sequence-completions\">\n {flatCompletions.map((item, index) => (\n <div\n key={`${item.completion.fullSequence}-${item.action}`}\n className={`kbd-sequence-completion ${index === selectedIndex ? 'selected' : ''} ${item.isComplete ? 'complete' : ''}`}\n >\n {item.isComplete ? (\n <kbd className=\"kbd-kbd\">↵</kbd>\n ) : item.completion.nextKeySeq ? (\n renderKeySeq(item.completion.nextKeySeq)\n ) : (\n <kbd className=\"kbd-kbd\">{item.displayKey}</kbd>\n )}\n <span className=\"kbd-sequence-arrow\">→</span>\n <span className=\"kbd-sequence-actions\">\n {getActionLabel(item.action, item.completion.captures)}\n </span>\n </div>\n ))}\n </div>\n )}\n\n {/* No completions message */}\n {flatCompletions.length === 0 && (\n <div className=\"kbd-sequence-empty\">\n No matching shortcuts\n </div>\n )}\n </div>\n </div>\n )\n}\n","import { ComponentType, createContext, Fragment, MouseEvent, ReactNode, useCallback, useContext, useEffect, useMemo, useRef, useState } from 'react'\nimport { ACTION_MODAL, DEFAULT_SEQUENCE_TIMEOUT } from './constants'\nimport { useMaybeHotkeysContext } from './HotkeysProvider'\nimport { renderModifierIcons, renderKeyContent } from './KeyElements'\nimport { useAction } from './useAction'\nimport { useHotkeys } from './useHotkeys'\nimport { useRecordHotkey } from './useRecordHotkey'\nimport { findConflicts, formatCombination, getActionBindings, parseHotkeyString, parseKeySeq } from './utils'\nimport type { ActionRegistry, HotkeySequence, KeyCombination, KeyCombinationDisplay, SeqElem } from './types'\nimport type { HotkeyMap } from './useHotkeys'\n\n/**\n * Props for a tooltip wrapper component.\n * Compatible with MUI Tooltip and similar libraries.\n */\nexport interface TooltipProps {\n title: string\n children: ReactNode\n}\n\n/**\n * A component that wraps children with a tooltip.\n * Default uses native title attribute; can be replaced with MUI Tooltip etc.\n */\nexport type TooltipComponent = ComponentType<TooltipProps>\n\n/**\n * Default tooltip renders children without any tooltip.\n * Pass a custom TooltipComponent (e.g., MUI Tooltip) to show tooltips.\n */\nconst DefaultTooltip: TooltipComponent = ({ children }) => <>{children}</>\n\n/**\n * Context for tooltip component (allows nested components to access it)\n */\nconst TooltipContext = createContext<TooltipComponent>(DefaultTooltip)\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 /**\n * Default keybinding to open shortcuts modal (default: '?').\n * Users can override this in the shortcuts modal.\n * Set to empty string to disable.\n */\n defaultBinding?: string\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 /** Whether to show actions with no bindings (default: true in editable mode, false otherwise) */\n showUnbound?: boolean\n /**\n * Custom tooltip component for digit placeholders.\n * Should accept { title: string, children: ReactNode } props.\n * Default uses native title attribute. Can be MUI Tooltip, etc.\n */\n TooltipComponent?: TooltipComponent\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 * Also includes actions with no bindings (from registry) so they can be assigned.\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 actionRegistry?: ActionRegistry,\n showUnbound = true,\n): ShortcutGroup[] {\n // Build action -> bindings map\n const actionBindings = getActionBindings(keymap)\n const groupMap = new Map<string, ShortcutGroup>()\n const includedActions = new Set<string>()\n\n // Helper to get group name for an action (consistent logic for both paths)\n const getGroupName = (actionId: string): string => {\n // First, check if action has a registered group in the registry\n const registeredGroup = actionRegistry?.[actionId]?.group\n if (registeredGroup) return registeredGroup\n\n // Fall back to parsing actionId prefix and looking up in groupNames\n const { group: groupKey } = parseActionId(actionId)\n return groupNames?.[groupKey] ?? groupKey\n }\n\n for (const [actionId, bindings] of actionBindings) {\n // Skip actions marked as hidden from modal\n if (actionRegistry?.[actionId]?.hideFromModal) continue\n\n includedActions.add(actionId)\n const { name } = parseActionId(actionId)\n const groupName = getGroupName(actionId)\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] ?? actionRegistry?.[actionId]?.label ?? name,\n description: descriptions?.[actionId],\n bindings,\n })\n }\n\n // Add actions from registry that have no bindings (if showUnbound is true)\n if (actionRegistry && showUnbound) {\n for (const [actionId, action] of Object.entries(actionRegistry)) {\n if (includedActions.has(actionId)) continue\n // Skip actions marked as hidden from modal\n if (action.hideFromModal) continue\n\n const { name } = parseActionId(actionId)\n const groupName = getGroupName(actionId)\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] ?? action.label ?? name,\n description: descriptions?.[actionId],\n bindings: [], // No bindings\n })\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 return (\n <span className={className}>\n {renderModifierIcons(combo.modifiers)}\n {renderKeyContent(combo.key)}\n </span>\n )\n}\n\n/**\n * Render a single sequence element (key, digit, or digits placeholder)\n */\nfunction SeqElemDisplay({ elem, className }: { elem: SeqElem; className?: string }) {\n const Tooltip = useContext(TooltipContext)\n\n if (elem.type === 'digit') {\n return (\n <Tooltip title=\"Any single digit (0-9)\">\n <span className={`kbd-placeholder ${className || ''}`}>#</span>\n </Tooltip>\n )\n }\n if (elem.type === 'digits') {\n return (\n <Tooltip title=\"One or more digits (0-9)\">\n <span className={`kbd-placeholder ${className || ''}`}>##</span>\n </Tooltip>\n )\n }\n // Regular key - use KeyDisplay\n return <KeyDisplay combo={{ key: elem.key, modifiers: elem.modifiers }} className={className} />\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 timeoutDuration = DEFAULT_SEQUENCE_TIMEOUT,\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 timeoutDuration?: number\n}) {\n const sequence = parseHotkeyString(binding)\n const keySeq = parseKeySeq(binding)\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 (\n <kbd className={kbdClassName} tabIndex={editable ? 0 : undefined}>\n {content}\n {pendingKeys && pendingKeys.length > 0 && Number.isFinite(timeoutDuration) && (\n <span\n key={pendingKeys.length}\n className=\"kbd-timeout-bar\"\n style={{ animationDuration: `${timeoutDuration}ms` }}\n />\n )}\n </kbd>\n )\n }\n\n // Render normal binding (using keySeq to support digit placeholders)\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 {keySeq.length > 1 ? (\n keySeq.map((elem, i) => (\n <Fragment key={i}>\n {i > 0 && <span className=\"kbd-sequence-sep\"> </span>}\n <SeqElemDisplay elem={elem} />\n </Fragment>\n ))\n ) : keySeq.length === 1 ? (\n <SeqElemDisplay elem={keySeq[0]} />\n ) : (\n // Fallback for legacy parsing\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 for displaying all keyboard shortcuts, organized by group.\n *\n * Opens by default with `?` key. Shows all registered actions and their bindings,\n * grouped by category (e.g., \"Navigation\", \"Edit\", \"Global\").\n *\n * Features:\n * - **Editable bindings**: Click any shortcut to rebind it (when `editable` is true)\n * - **Conflict detection**: Warns when a binding conflicts with existing shortcuts\n * - **Custom group renderers**: Use `groupRenderers` for custom layouts (e.g., two-column for fwd/back pairs)\n * - **Persistence**: Integrates with HotkeysProvider's localStorage persistence\n *\n * Unlike Omnibar (search-first) or LookupModal (type keys to filter), ShortcutsModal\n * shows everything at once in a browsable, organized view.\n *\n * Styled via CSS custom properties: --kbd-bg, --kbd-text, --kbd-kbd-bg, etc.\n *\n * @example\n * ```tsx\n * // Basic usage with HotkeysProvider (recommended)\n * <HotkeysProvider>\n * <App />\n * <ShortcutsModal editable />\n * </HotkeysProvider>\n *\n * // Standalone with explicit props\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 defaultBinding = '?',\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 showUnbound,\n TooltipComponent: TooltipComponentProp = DefaultTooltip,\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(action, 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(action, key)\n } : undefined)\n const handleReset = onReset ?? (ctx ? () => {\n ctx.registry.resetOverrides()\n } : undefined)\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 // Track if current pending keys have a conflict (for pausing timeout)\n const [hasPendingConflictState, setHasPendingConflictState] = useState(false)\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 const setIsEditingBindingRef = useRef(ctx?.setIsEditingBinding)\n setIsEditingBindingRef.current = ctx?.setIsEditingBinding\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 // Register the shortcuts modal trigger action\n useAction(ACTION_MODAL, {\n label: 'Show shortcuts',\n group: 'Global',\n defaultBindings: defaultBinding ? [defaultBinding] : [],\n handler: useCallback(() => {\n if (ctx) {\n ctx.toggleModal()\n } else {\n setInternalIsOpen(prev => !prev)\n }\n }, [ctx]),\n })\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 // Check if two KeyCombinations are equal\n const combinationsEqual = useCallback((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 // Check if sequence A is a prefix of sequence B\n const isSequencePrefix = useCallback((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 }, [combinationsEqual])\n\n // Check if two sequences are equal\n const sequencesEqual = useCallback((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 }, [combinationsEqual])\n\n // Recording hook - uses refs to avoid stale closures\n const { isRecording, startRecording, cancel, pendingKeys, activeKeys, sequenceTimeout } = 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 setIsEditingBindingRef.current?.(false)\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 setIsEditingBindingRef.current?.(false)\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 || hasPendingConflictState,\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 ctx?.setIsEditingBinding(true)\n startRecording()\n },\n [startRecording, ctx?.setIsEditingBinding],\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 ctx?.setIsEditingBinding(true)\n startRecording()\n },\n [startRecording, ctx?.setIsEditingBinding],\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 ctx?.setIsEditingBinding(false)\n }, [cancel, ctx?.setIsEditingBinding])\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 // Compute which existing bindings would conflict with current pendingKeys\n // A conflict occurs when:\n // 1. pendingKeys exactly matches an existing binding (and it's not the one being edited)\n // 2. pendingKeys is a prefix of an existing binding\n // 3. An existing binding is a prefix of pendingKeys\n const pendingConflictInfo = useMemo(() => {\n if (!isRecording || pendingKeys.length === 0) {\n return { hasConflict: false, conflictingKeys: new Set<string>() }\n }\n\n const conflictingKeys = new Set<string>()\n\n for (const key of Object.keys(keymap)) {\n // Skip the key we're currently editing (it will be replaced)\n if (editingKey && key.toLowerCase() === editingKey.toLowerCase()) continue\n\n const keySequence = parseHotkeyString(key)\n\n // Exact match conflict\n if (sequencesEqual(pendingKeys, keySequence)) {\n conflictingKeys.add(key)\n continue\n }\n\n // Prefix conflict: pending is a prefix of existing key\n if (isSequencePrefix(pendingKeys, keySequence)) {\n conflictingKeys.add(key)\n continue\n }\n\n // Prefix conflict: existing key is a prefix of pending\n if (isSequencePrefix(keySequence, pendingKeys)) {\n conflictingKeys.add(key)\n }\n }\n\n return { hasConflict: conflictingKeys.size > 0, conflictingKeys }\n }, [isRecording, pendingKeys, keymap, editingKey, sequencesEqual, isSequencePrefix])\n\n // Update hasPendingConflictState when pendingConflictInfo changes\n useEffect(() => {\n setHasPendingConflictState(pendingConflictInfo.hasConflict)\n }, [pendingConflictInfo.hasConflict])\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 // Check if this binding would conflict with current pending input\n const isPendingConflict = pendingConflictInfo.conflictingKeys.has(key)\n\n return (\n <BindingDisplay\n key={key}\n binding={key}\n editable={editable}\n isEditing={isEditingThis}\n isConflict={isConflict}\n isPendingConflict={isPendingConflict}\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 timeoutDuration={pendingConflictInfo.hasConflict ? Infinity : sequenceTimeout}\n />\n )\n },\n [editingAction, editingKey, addingAction, conflicts, defaults, editable, startEditingBinding, removeBinding, pendingKeys, activeKeys, isRecording, cancel, handleBindingAdd, handleBindingChange, sequenceTimeout, pendingConflictInfo],\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 isPendingConflict={pendingConflictInfo.hasConflict}\n pendingKeys={pendingKeys}\n activeKeys={activeKeys}\n timeoutDuration={pendingConflictInfo.hasConflict ? Infinity : sequenceTimeout}\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, sequenceTimeout, pendingConflictInfo],\n )\n\n // Helper: render a cell with all bindings for an action\n const renderCell = useCallback(\n (actionId: string, keys: string[]) => {\n // Show add button if: multiple bindings allowed, OR no bindings exist (need to reassign)\n const showAddButton = editable && (multipleBindings || keys.length === 0)\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 {showAddButton && 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 Escape to close modal (trigger is handled via useAction)\n useHotkeys(\n { escape: 'closeShortcuts' },\n { closeShortcuts: close },\n { enabled: 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 modal and open omnibar on meta+k\n useEffect(() => {\n if (!isOpen || !ctx) return\n\n const handleMetaK = (e: KeyboardEvent) => {\n if ((e.metaKey || e.ctrlKey) && e.key === 'k') {\n e.preventDefault()\n e.stopPropagation()\n close()\n ctx.openOmnibar()\n }\n }\n\n window.addEventListener('keydown', handleMetaK, true)\n return () => window.removeEventListener('keydown', handleMetaK, true)\n }, [isOpen, ctx, close])\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 (include actionRegistry to show actions with no bindings)\n // Default showUnbound to true in editable mode, false otherwise\n const effectiveShowUnbound = showUnbound ?? editable\n const shortcutGroups = useMemo(\n () => organizeShortcuts(keymap, labels, descriptions, groupNames, groupOrder, ctx?.registry.actionRegistry, effectiveShowUnbound),\n [keymap, labels, descriptions, groupNames, groupOrder, ctx?.registry.actionRegistry, effectiveShowUnbound],\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 <TooltipContext.Provider value={TooltipComponentProp}>\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 </TooltipContext.Provider>\n )\n}\n"]}
|