From 7f7c97d6a991b21c219dd1304fd8da550ee2b646 Mon Sep 17 00:00:00 2001
From: "@daniel-lxs" <57051444+daniel-lxs@users.noreply.github.com>
Date: Thu, 15 Oct 2026 05:36:48 +0000
Subject: [PATCH] fix: ignore keyless events in the new session shortcut
---
.../layout/side-nav/SideNav.client.test.tsx | 33 +++++++++++++++----
.../components/layout/side-nav/SideNav.tsx | 2 +-
2 files changed, 27 insertions(+), 8 deletions(-)
diff --git a/apps/web/src/components/layout/side-nav/SideNav.client.test.tsx b/apps/web/src/components/layout/side-nav/SideNav.client.test.tsx
index 3a0794701a..54ca20ff45 100644
--- a/apps/web/src/components/layout/side-nav/SideNav.client.test.tsx
+++ b/apps/web/src/components/layout/side-nav/SideNav.client.test.tsx
@@ -493,15 +493,34 @@ describe('SideNav recent sessions', () => {
);
});
- it('opens the new session dialog with the desktop N shortcut', () => {
- render();
+ it.each(['n', 'N'])(
+ 'opens the new session dialog with the desktop %s shortcut',
+ (key) => {
+ render();
- fireEvent.keyDown(document, { key: 'n' });
+ fireEvent.keyDown(document, { key });
- expect(screen.getByTestId('new-task-dialog')).toHaveAttribute(
- 'data-open',
- 'true',
- );
+ expect(screen.getByTestId('new-task-dialog')).toHaveAttribute(
+ 'data-open',
+ 'true',
+ );
+ },
+ );
+
+ it('ignores compatibility keydown events that do not carry a key', () => {
+ render();
+ const onError = vi.fn((event: ErrorEvent) => event.preventDefault());
+ window.addEventListener('error', onError);
+ try {
+ fireEvent(document, new Event('keydown', { bubbles: true }));
+ expect(onError).not.toHaveBeenCalled();
+ expect(screen.getByTestId('new-task-dialog')).toHaveAttribute(
+ 'data-open',
+ 'false',
+ );
+ } finally {
+ window.removeEventListener('error', onError);
+ }
});
it('does not handle the N shortcut while a text field is focused', () => {
diff --git a/apps/web/src/components/layout/side-nav/SideNav.tsx b/apps/web/src/components/layout/side-nav/SideNav.tsx
index f6f8338513..49d410374a 100644
--- a/apps/web/src/components/layout/side-nav/SideNav.tsx
+++ b/apps/web/src/components/layout/side-nav/SideNav.tsx
@@ -125,7 +125,7 @@ export const SideNav = () => {
event.metaKey ||
event.ctrlKey ||
event.altKey ||
- event.key.toLowerCase() !== 'n' ||
+ (event.key !== 'n' && event.key !== 'N') ||
!window.matchMedia('(min-width: 768px)').matches ||
isEditingText
) {