From 27183cfd7b984403922e79dc6d4f38f795762c3d Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Feb 2026 17:18:08 +0000 Subject: [PATCH 1/2] fix: prevent default on Escape key when closing overlay On macOS, pressing Escape in a fullscreened browser window causes the browser to exit fullscreen mode. When an overlay (e.g., dialog) closes on Escape, the key event should be consumed by calling preventDefault() to prevent the browser from also handling it. https://claude.ai/code/session_01CsvF5ewbUGirKySHMfzdRp --- packages/overlay/src/vaadin-overlay-mixin.js | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/overlay/src/vaadin-overlay-mixin.js b/packages/overlay/src/vaadin-overlay-mixin.js index ace0b77506d..32c639815db 100644 --- a/packages/overlay/src/vaadin-overlay-mixin.js +++ b/packages/overlay/src/vaadin-overlay-mixin.js @@ -583,6 +583,7 @@ export const OverlayMixin = (superClass) => this.dispatchEvent(evt); if (this.opened && !evt.defaultPrevented) { + event.preventDefault(); this.close(event); } } From 4147f550ed8b950b9404816f05e6646d658a95cb Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 9 Feb 2026 17:23:12 +0000 Subject: [PATCH 2/2] test: add tests for preventDefault on Escape key in overlay Verify that the Escape keydown event has its default prevented when the overlay closes, and that it is not prevented when the vaadin-overlay-escape-press event is cancelled. https://claude.ai/code/session_01CsvF5ewbUGirKySHMfzdRp --- packages/overlay/test/interactions.test.js | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/packages/overlay/test/interactions.test.js b/packages/overlay/test/interactions.test.js index 3a3a69f5a50..77ecccb759f 100644 --- a/packages/overlay/test/interactions.test.js +++ b/packages/overlay/test/interactions.test.js @@ -61,6 +61,28 @@ describe('interactions', () => { expect(overlay.opened).to.be.true; }); + it('should prevent default on the Escape keydown event when closing', () => { + const spy = sinon.spy(); + document.addEventListener('keydown', spy, { once: true }); + + escKeyDown(document.body); + + expect(overlay.opened).to.be.false; + expect(spy.firstCall.args[0].defaultPrevented).to.be.true; + }); + + it('should not prevent default on the Escape keydown event if overlay-escape-press is cancelled', () => { + overlay.addEventListener('vaadin-overlay-escape-press', (e) => e.preventDefault()); + + const spy = sinon.spy(); + document.addEventListener('keydown', spy, { once: true }); + + escKeyDown(document.body); + + expect(overlay.opened).to.be.true; + expect(spy.firstCall.args[0].defaultPrevented).to.be.false; + }); + it('should not close on Esc if the keydown event was prevented', () => { overlay.addEventListener('keydown', (e) => e.preventDefault());