+ {isUnavailable ? (
+
Coming soon: {tool.description}
+ ) : (
+
{tool.description}
+ )}
+ {!isUnavailable && shortcut && (
+
+
+ {t('settings.hotkeys.shortcutLabel', 'Shortcut')}:
+
+
+
+ )}
+
+ );
const buttonContent = (
<>
diff --git a/frontend/src/contexts/HotkeyContext.tsx b/frontend/src/contexts/HotkeyContext.tsx
new file mode 100644
index 000000000..cf675b399
--- /dev/null
+++ b/frontend/src/contexts/HotkeyContext.tsx
@@ -0,0 +1,292 @@
+import React, {
+ createContext,
+ useCallback,
+ useContext,
+ useEffect,
+ useMemo,
+ useRef,
+ useState,
+} from 'react';
+import { ToolRegistryEntry } from '../data/toolsTaxonomy';
+import { useToolWorkflow } from './ToolWorkflowContext';
+import { ToolId, isValidToolId } from '../types/toolId';
+import {
+ KEY_SEQUENCE,
+ captureShortcut,
+ detectIsMac,
+ formatShortcutParts,
+ isEditableElement,
+ mapKeyToToken,
+ normalizeShortcutString,
+ SupportedModifier,
+} from '../utils/hotkeys';
+
+const STORAGE_KEY = 'stirling.hotkeys';
+
+type HotkeyMap = Record