diff --git a/qt/aqt/webview.py b/qt/aqt/webview.py
index 250c4d68c..a977d83df 100644
--- a/qt/aqt/webview.py
+++ b/qt/aqt/webview.py
@@ -295,7 +295,7 @@ class AnkiWebView(QWebEngineView):
self.eval(
"""
document.addEventListener("keydown", function(evt) {
- if (evt.keyCode === 27) {
+ if (evt.key === "Escape") {
pycmd("close");
}
});
diff --git a/ts/components/HelpModal.svelte b/ts/components/HelpModal.svelte
index 27d0dac65..8f529271a 100644
--- a/ts/components/HelpModal.svelte
+++ b/ts/components/HelpModal.svelte
@@ -7,8 +7,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import { renderMarkdown } from "@tslib/helpers";
import Carousel from "bootstrap/js/dist/carousel";
import Modal from "bootstrap/js/dist/modal";
- import { createEventDispatcher, getContext, onMount } from "svelte";
+ import { createEventDispatcher, getContext, onDestroy, onMount } from "svelte";
+ import { registerModalClosingHandler } from "../sveltelib/modal-closing";
import { pageTheme } from "../sveltelib/theme";
import Badge from "./Badge.svelte";
import Col from "./Col.svelte";
@@ -40,8 +41,21 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
const dispatch = createEventDispatcher();
+ const { set: setModalOpen, remove: removeModalClosingHandler } =
+ registerModalClosingHandler(onOkClicked);
+
+ function onShown() {
+ setModalOpen(true);
+ }
+
+ function onHidden() {
+ setModalOpen(false);
+ }
+
onMount(() => {
- modal = new Modal(modalRef);
+ modalRef.addEventListener("shown.bs.modal", onShown);
+ modalRef.addEventListener("hidden.bs.modal", onHidden);
+ modal = new Modal(modalRef, { keyboard: false });
carousel = new Carousel(carouselRef, { interval: false, ride: false });
/* Bootstrap's Carousel.Event interface doesn't seem to work as a type here */
carouselRef.addEventListener("slide.bs.carousel", (e: any) => {
@@ -51,6 +65,12 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
modals.set(modalKey, modal);
});
+ onDestroy(() => {
+ removeModalClosingHandler();
+ modalRef.removeEventListener("shown.bs.modal", onShown);
+ modalRef.removeEventListener("hidden.bs.modal", onHidden);
+ });
+
let activeIndex = startIndex;
diff --git a/ts/components/WithFloating.svelte b/ts/components/WithFloating.svelte
index a26cdb038..3171ce601 100644
--- a/ts/components/WithFloating.svelte
+++ b/ts/components/WithFloating.svelte
@@ -18,6 +18,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
import isClosingKeyup from "../sveltelib/closing-keyup";
import type { EventPredicateResult } from "../sveltelib/event-predicate";
import { documentClick, documentKeyup } from "../sveltelib/event-store";
+ import { registerModalClosingHandler } from "../sveltelib/modal-closing";
import portal from "../sveltelib/portal";
import type { PositioningCallback } from "../sveltelib/position/auto-update";
import autoUpdate from "../sveltelib/position/auto-update";
@@ -54,6 +55,9 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
let arrow: HTMLElement;
+ const { set: setModalOpen, remove: removeModalClosingHandler } =
+ registerModalClosingHandler(() => dispatch("close", { reason: "esc" }));
+
$: positionCurried = positionFloating({
placement,
offset,
@@ -124,7 +128,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
) {
cleanup?.();
cleanup = null;
-
+ setModalOpen(isShowing);
if (!reference || !floating || !isShowing) {
return;
}
@@ -164,7 +168,11 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html
);
}
- cleanup = singleCallback(...subscribers, autoAction.destroy!);
+ cleanup = singleCallback(
+ ...subscribers,
+ autoAction.destroy!,
+ removeModalClosingHandler,
+ );
}
$: updateFloating(reference, floating, show);
diff --git a/ts/deck-options/ConfigSelector.svelte b/ts/deck-options/ConfigSelector.svelte
index 1d4dfb9b7..1dbf18f9a 100644
--- a/ts/deck-options/ConfigSelector.svelte
+++ b/ts/deck-options/ConfigSelector.svelte
@@ -86,7 +86,7 @@ License: GNU AGPL, version 3 or later; http://www.gnu.org/licenses/agpl.html