diff --git a/frontend/src/components/modal/ImageViewer.vue b/frontend/src/components/modal/ImageViewer.vue
index 0ea01bc..84cb495 100644
--- a/frontend/src/components/modal/ImageViewer.vue
+++ b/frontend/src/components/modal/ImageViewer.vue
@@ -92,7 +92,16 @@ let prevBodyOverflow = null
// own keystrokes.
function onKeyDown(ev) {
if (ev.key === 'Escape') {
- if (isTextEntry(ev.target)) return
+ // Escape closes the modal even from inside a text input — that's
+ // the universal "get me out of here" expectation, and the
+ // autofocused tag-entry field would otherwise trap focus with no
+ // visible escape (operator-flagged 2026-06-01). EXCEPTION: when a
+ // nested Vuetify overlay is open (v-menu autocomplete dropdown,
+ // FandomPicker v-dialog, per-suggestion 3-dot menu), let that
+ // overlay's own Esc handling fire instead of closing the whole
+ // modal mid-interaction. Vuetify marks open overlays with
+ // `.v-overlay--active`.
+ if (document.querySelector('.v-overlay--active')) return
ev.preventDefault()
emit('close')
} else if (ev.key === 'ArrowLeft') {
diff --git a/frontend/src/components/modal/ProvenancePanel.vue b/frontend/src/components/modal/ProvenancePanel.vue
index 1d8e5ee..5c36fd4 100644
--- a/frontend/src/components/modal/ProvenancePanel.vue
+++ b/frontend/src/components/modal/ProvenancePanel.vue
@@ -10,7 +10,11 @@
density="compact"
>{{ state.error }}
-
+
+