diff --git a/pygitweb/src/pygitweb/static/board-popout.js b/pygitweb/src/pygitweb/static/board-popout.js
index 188369c..175f3ee 100644
--- a/pygitweb/src/pygitweb/static/board-popout.js
+++ b/pygitweb/src/pygitweb/static/board-popout.js
@@ -407,8 +407,14 @@ export function showCardPopout(card) {
   var overlay = document.createElement('div');
   overlay.className = 'board-card-popout-overlay';
   overlay.appendChild(card);
+  var closed = false;
   function close() {
+    if (closed) return;
+    closed = true;
+    document.removeEventListener('keydown', onEscape);
     overlay.removeEventListener('click', closeOnBackdrop);
+    var active = document.activeElement;
+    if (active && overlay.contains(active)) active.blur();
     document.body.removeChild(overlay);
     card.classList.remove('board-card-popout');
     card.setAttribute('draggable', 'true');
@@ -424,8 +430,14 @@ export function showCardPopout(card) {
   function closeOnBackdrop(e) {
     if (e.target === overlay) close();
   }
+  function onEscape(e) {
+    if (e.key !== 'Escape') return;
+    e.preventDefault();
+    close();
+  }
   setupPopoutActions(card, close, cardsContainer);
   overlay.addEventListener('click', closeOnBackdrop);
+  document.addEventListener('keydown', onEscape);
   document.body.appendChild(overlay);
   updateColumnBadge(cardsContainer.closest('.board-column'));
 }
diff --git a/pygitweb/src/pygitweb/static/board-refs.js b/pygitweb/src/pygitweb/static/board-refs.js
index b6a3b04..d312521 100644
--- a/pygitweb/src/pygitweb/static/board-refs.js
+++ b/pygitweb/src/pygitweb/static/board-refs.js
@@ -272,7 +272,10 @@ var REF_TOKEN =
       window.setTimeout(hideMenu, 150);
     });
     textarea.addEventListener("keydown", function (e) {
-      if (e.key === "Escape") hideMenu();
+      if (e.key !== "Escape" || menu.classList.contains("d-none")) return;
+      e.preventDefault();
+      e.stopPropagation();
+      hideMenu();
     });
 
     document.addEventListener("mousedown", function (e) {
diff --git a/pygitweb/src/pygitweb/static_tests/test_board-popout.py b/pygitweb/src/pygitweb/static_tests/test_board-popout.py
index 03983f4..b073e8b 100644
--- a/pygitweb/src/pygitweb/static_tests/test_board-popout.py
+++ b/pygitweb/src/pygitweb/static_tests/test_board-popout.py
@@ -93,6 +93,34 @@ def test_backdrop_restores_the_card_ahead_of_its_sibling(js: JsPage) -> None:
 	assert js.attr(".board-card", "draggable") == "true"
 
 
+def test_escape_closes_the_popout(js: JsPage) -> None:
+	_open(js, cards=card_html(ref="t1", title="A") + card_html(ref="t2", title="B"))
+	js.click(".board-card-popout .board-card-title")
+	js.set_prop(".board-card-title-edit", "value", "Renamed")
+	js.dispatch(".board-card-title-edit", "keydown", key="Escape")
+	assert js.count(".board-card-popout-overlay") == 0
+	assert js.count(".board-card-title-edit") == 0
+	assert js.texts(".board-column-cards .board-card-title") == ["Renamed", "B"]
+	assert "d-none" in js.classes(".board-card-details")
+	assert js.attr(".board-card", "draggable") == "true"
+	js.dispatch("body", "keydown", key="Escape")
+	assert js.count(".board-card") == 2
+
+
+def test_escape_closes_suggestions_before_the_popout(js: JsPage) -> None:
+	_open(js)
+	js.click(".board-card-description-full")
+	js.set_prop(".board-card-description-edit", "value", "@")
+	js.set_prop(".board-card-description-edit", "selectionStart", 1)
+	js.dispatch(".board-card-description-edit", "input")
+	assert js.count(".board-ref-suggest:not(.d-none)") == 1
+	js.dispatch(".board-card-description-edit", "keydown", key="Escape")
+	assert js.count(".board-ref-suggest:not(.d-none)") == 0
+	assert js.count(".board-card-popout-overlay") == 1
+	js.dispatch(".board-card-description-edit", "keydown", key="Escape")
+	assert js.count(".board-card-popout-overlay") == 0
+
+
 def test_closing_the_last_card_appends_it(js: JsPage) -> None:
 	_open(js, cards=card_html(ref="t1", title="Only"))
 	js.click(".board-card-popout-overlay")
