From 152f0e8c1e036cd232afd65cd161f4312b5b1e66 Mon Sep 17 00:00:00 2001 From: NineKey Date: Sat, 12 Sep 2026 22:36:54 +0800 Subject: [PATCH] Dismiss tag menu outside editor --- web/dynamic_loader.js | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/web/dynamic_loader.js b/web/dynamic_loader.js index d38832c..fec4c3e 100644 --- a/web/dynamic_loader.js +++ b/web/dynamic_loader.js @@ -183,6 +183,16 @@ app.registerExtension({ let menuEntries = []; let menuIndex = 0; const closeMenu = () => { menu.hidden = true; menu.replaceChildren(); }; + const closeMenuOutside = event => { + if (!menu.hidden && !composer.contains(event.target) && !menu.contains(event.target)) closeMenu(); + }; + const closeMenuForCanvasChange = () => closeMenu(); + const canvasElement = app.canvas?.canvas; + document.addEventListener("pointerdown", closeMenuOutside, true); + window.addEventListener("blur", closeMenuForCanvasChange); + window.addEventListener("resize", closeMenuForCanvasChange); + window.addEventListener("scroll", closeMenuForCanvasChange, true); + canvasElement?.addEventListener("wheel", closeMenuForCanvasChange, { passive: true }); const insertTagFromMenu = (entry) => { const trigger = getTrigger(); if (!trigger) return closeMenu(); @@ -447,6 +457,7 @@ app.registerExtension({ node.inlineComposerSelectedChip?.classList.remove("selected"); node.inlineComposerSelectedChip = null; } + if (!getTrigger()) closeMenu(); }); // LiteGraph assigns single-letter shortcuts (including F) to // the canvas. A contenteditable element is not treated like a @@ -718,6 +729,11 @@ app.registerExtension({ composerDisposed = true; closeMenu(); menu.remove(); + document.removeEventListener("pointerdown", closeMenuOutside, true); + window.removeEventListener("blur", closeMenuForCanvasChange); + window.removeEventListener("resize", closeMenuForCanvasChange); + window.removeEventListener("scroll", closeMenuForCanvasChange, true); + canvasElement?.removeEventListener("wheel", closeMenuForCanvasChange); try { exTagCompleter?.destroy?.(); } catch { /* optional integration */ } exTagCompleter = null; delete composer.__dynamicTagClipboard;