Skip to content

Commit a6c1f96

Browse files
committed
feat: Add Cmd/Ctrl + N keyboard shortcut to trigger new item creation in the sidebar.
1 parent f289f0c commit a6c1f96

File tree

1 file changed

+41
-0
lines changed

1 file changed

+41
-0
lines changed

src/components/layout/SideBar.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -164,6 +164,47 @@ export function SideBar() {
164164
addProject(projectPath);
165165
}, [addProject]);
166166

167+
useEffect(() => {
168+
const isEditableTarget = (target: EventTarget | null): boolean => {
169+
if (!(target instanceof HTMLElement)) {
170+
return false;
171+
}
172+
if (target.isContentEditable) {
173+
return true;
174+
}
175+
const tagName = target.tagName;
176+
if (tagName === 'INPUT' || tagName === 'TEXTAREA' || tagName === 'SELECT') {
177+
return true;
178+
}
179+
return Boolean(target.closest('[contenteditable="true"]'));
180+
};
181+
182+
const handleKeyDown = (event: KeyboardEvent) => {
183+
const isNewShortcut = (event.metaKey || event.ctrlKey) && event.key.toLowerCase() === 'n';
184+
185+
if (!isNewShortcut || event.shiftKey || event.altKey || event.repeat) {
186+
return;
187+
}
188+
189+
if (view !== 'codex' && view !== 'cc') {
190+
return;
191+
}
192+
193+
if (isEditableTarget(event.target)) {
194+
return;
195+
}
196+
197+
event.preventDefault();
198+
event.stopPropagation();
199+
void handleCreateNew();
200+
};
201+
202+
window.addEventListener('keydown', handleKeyDown);
203+
return () => {
204+
window.removeEventListener('keydown', handleKeyDown);
205+
};
206+
}, [handleCreateNew, view]);
207+
167208
return (
168209
<div className="flex h-full w-[var(--sidebar-width)] min-w-[var(--sidebar-width)] max-w-[var(--sidebar-width)] flex-col border-r border-sidebar-border bg-zinc-100/95 dark:bg-zinc-900/95">
169210
<div className="gap-1 p-2 flex flex-col">

0 commit comments

Comments
 (0)