diff --git a/src/App.vue b/src/App.vue index 8ce5e03..e9fd891 100644 --- a/src/App.vue +++ b/src/App.vue @@ -28,6 +28,21 @@ const appVersion = __APP_VERSION__; let displayModeMedia = null; let prefersColorSchemeMedia = null; +const onKeyDownGlobal = (e) => { + if (e.key !== 'Escape') return; + if (showSimulation.value) { + showSimulation.value = false; + return; + } + if (showCustomModal.value) { + showCustomModal.value = false; + return; + } + if (store.isGameWon) { + store.closeWinModal(); + } +}; + const installLabel = computed(() => { return isCoarsePointer.value ? t('pwa.installMobile') : t('pwa.installDesktop'); }); @@ -114,6 +129,7 @@ onMounted(() => { } else if (displayModeMedia?.addListener) { displayModeMedia.addListener(updateStandalone); } + window.addEventListener('keydown', onKeyDownGlobal); } }); @@ -131,6 +147,7 @@ onUnmounted(() => { } else if (displayModeMedia?.removeListener) { displayModeMedia.removeListener(updateStandalone); } + window.removeEventListener('keydown', onKeyDownGlobal); }); @@ -279,4 +296,4 @@ onUnmounted(() => { border-top: 1px solid var(--panel-border); z-index: 90; } - \ No newline at end of file + diff --git a/src/components/CustomGameModal.vue b/src/components/CustomGameModal.vue index 91e1e63..77fd2aa 100644 --- a/src/components/CustomGameModal.vue +++ b/src/components/CustomGameModal.vue @@ -156,7 +156,6 @@ const stopDrag = () => { onUnmounted(() => { window.removeEventListener('mousemove', onDrag); window.removeEventListener('mouseup', stopDrag); - window.removeEventListener('keydown', onKeyDown); }); const showAdvanced = ref(false); @@ -170,16 +169,6 @@ const toggleAdvanced = () => { } }; -const handleClose = () => { - emit('close'); -}; - -const onKeyDown = (e) => { - if (e.key === 'Escape') { - handleClose(); - } -}; - onMounted(() => { const savedSize = localStorage.getItem('nonograms_custom_size'); if (savedSize && !isNaN(savedSize)) { @@ -192,7 +181,6 @@ onMounted(() => { } // Don't draw map initially if hidden - window.addEventListener('keydown', onKeyDown); }); watch([customSize, fillRate], () => { diff --git a/src/components/SimulationView.vue b/src/components/SimulationView.vue index 956bcd9..7565f1a 100644 --- a/src/components/SimulationView.vue +++ b/src/components/SimulationView.vue @@ -23,6 +23,8 @@ let stopRequested = false; const onKeyDown = (e) => { if (e.key === 'Escape') { + e.stopImmediatePropagation?.(); + e.preventDefault?.(); emit('close'); } }; diff --git a/src/components/WinModal.vue b/src/components/WinModal.vue index 471dca3..9436719 100644 --- a/src/components/WinModal.vue +++ b/src/components/WinModal.vue @@ -28,6 +28,8 @@ const handleClose = () => { const handleKeyDown = (e) => { if (e.key === 'Escape') { + e.stopImmediatePropagation?.(); + e.preventDefault?.(); handleClose(); } };