From a73244c4a3a5eb3890616ecc4a3c1a626c7e43c4 Mon Sep 17 00:00:00 2001 From: Ramil Muratov Date: Sat, 11 Jul 2026 22:13:53 +0200 Subject: [PATCH] Activate the file upload button on Space and NumpadEnter --- src/__tests__/app.test.tsx | 17 ++++++++++++----- src/app.tsx | 6 +++++- 2 files changed, 17 insertions(+), 6 deletions(-) diff --git a/src/__tests__/app.test.tsx b/src/__tests__/app.test.tsx index 46c100d..aca8694 100644 --- a/src/__tests__/app.test.tsx +++ b/src/__tests__/app.test.tsx @@ -223,14 +223,21 @@ describe('source maps', () => { const clickSpy = vi.spyOn(fileUploadButton, 'click') // Other keys must not open the file selector - fireEvent.keyDown(fileUploadButton, { code: 'KeyA' }) + fireEvent.keyDown(fileUploadButton, { code: 'KeyA', key: 'a' }) expect(clickSpy).not.toHaveBeenCalled() - // Fire the keydown event with Enter - fireEvent.keyDown(fileUploadButton, { code: 'Enter' }) + // Buttons activate on Enter, NumpadEnter, and Space + fireEvent.keyDown(fileUploadButton, { code: 'Enter', key: 'Enter' }) + expect(clickSpy).toHaveBeenCalledTimes(1) - // Verify that the keydown handler called click() on the current target - expect(clickSpy).toHaveBeenCalledOnce() + fireEvent.keyDown(fileUploadButton, { code: 'NumpadEnter', key: 'Enter' }) + expect(clickSpy).toHaveBeenCalledTimes(2) + + // Space must activate the button and not scroll the page, + // so the default must be prevented. + const spaceNotPrevented = fireEvent.keyDown(fileUploadButton, { code: 'Space', key: ' ' }) + expect(clickSpy).toHaveBeenCalledTimes(3) + expect(spaceNotPrevented).toBe(false) clickSpy.mockRestore() }) diff --git a/src/app.tsx b/src/app.tsx index 13cdf86..96f59db 100644 --- a/src/app.tsx +++ b/src/app.tsx @@ -185,7 +185,11 @@ export default function App() { htmlFor="sourcemap-file-input" id="file-upload-button" onKeyDown={event => { - if (event.code === 'Enter') { + // Buttons activate on Enter and Space; `key` (unlike + // `code`) also matches NumpadEnter. + if (event.key === 'Enter' || event.key === ' ') { + // Space must not scroll the page. + event.preventDefault() event.currentTarget.click() } }}