From c98b52275878185f3c6e975302424c8b81657fac Mon Sep 17 00:00:00 2001 From: lawsie <5183697+lawsie@users.noreply.github.com> Date: Mon, 11 May 2026 09:13:27 +0100 Subject: [PATCH 1/6] Move keyboard UI utilities --- main/accessibility.js => accessibility/keyboardui.js | 6 +++--- main/main.js | 2 +- ui/addmenu.js | 2 +- ui/gizmos.js | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) rename main/accessibility.js => accessibility/keyboardui.js (99%) diff --git a/main/accessibility.js b/accessibility/keyboardui.js similarity index 99% rename from main/accessibility.js rename to accessibility/keyboardui.js index d4f18fe3..7c526de6 100644 --- a/main/accessibility.js +++ b/accessibility/keyboardui.js @@ -1,6 +1,6 @@ -import { InputManager } from "./inputmanager.js"; -import { ContextManager } from "./context.js"; -import { translate } from "./translation.js"; +import { InputManager } from "../main/inputmanager.js"; +import { ContextManager } from "../main/context.js"; +import { translate } from "../main/translation.js"; import { SHORTCUTS_HELP_URL } from "../config.js"; // Area menu accessed with Ctrl + B to quickly skip to diff --git a/main/main.js b/main/main.js index 5b89614d..db71a7eb 100644 --- a/main/main.js +++ b/main/main.js @@ -48,7 +48,7 @@ import { initializeSavedLanguage, translate, } from "./translation.js"; -import { ShortcutsPanel } from "./accessibility.js"; +import { ShortcutsPanel } from "../accessibility/keyboardui.js"; import { InputManager } from "./inputmanager.js"; import "./context.js"; diff --git a/ui/addmenu.js b/ui/addmenu.js index 6164de63..69046315 100644 --- a/ui/addmenu.js +++ b/ui/addmenu.js @@ -20,7 +20,7 @@ import { setCrosshairCursor, setDefaultCursor, } from "./canvas-utils.js"; -import { GizmoMenuManager } from "../main/accessibility.js"; +import { GizmoMenuManager } from "../accessibility/keyboardui.js"; const colorFields = { HAIR_COLOR: "#000000", // Hair: black diff --git a/ui/gizmos.js b/ui/gizmos.js index f279f2fe..18cb88b1 100644 --- a/ui/gizmos.js +++ b/ui/gizmos.js @@ -32,7 +32,7 @@ import { } from "./canvas-utils.js"; import { createAxisKeyboardHandler } from "./axis-keyboard.js"; import { InputManager } from "../main/inputmanager.js"; -import { GizmoMenuManager } from "../main/accessibility.js"; +import { GizmoMenuManager } from "../accessibility/keyboardui.js"; export let gizmoManager; // Enable debug messages From 37a89f7901ffe3170e09660f0b100c145603578b Mon Sep 17 00:00:00 2001 From: lawsie <5183697+lawsie@users.noreply.github.com> Date: Mon, 11 May 2026 09:14:49 +0100 Subject: [PATCH 2/6] Fix table scope --- accessibility/keyboardui.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/accessibility/keyboardui.js b/accessibility/keyboardui.js index 7c526de6..4f45e225 100644 --- a/accessibility/keyboardui.js +++ b/accessibility/keyboardui.js @@ -475,7 +475,7 @@ const ShortcutsPanel = { tbody.innerHTML = Object.entries(groups) .map( ([cat, items]) => ` - ${cat} + ${cat} ${items.map(({ label, keys }) => `${label}${formatKeys(keys)}`).join("")} `, ) From a865a5e6e808d3e25b9364f3b5f4af7c8f708553 Mon Sep 17 00:00:00 2001 From: lawsie <5183697+lawsie@users.noreply.github.com> Date: Mon, 11 May 2026 09:16:35 +0100 Subject: [PATCH 3/6] Remove redundant code --- accessibility/keyboardui.js | 1 - 1 file changed, 1 deletion(-) diff --git a/accessibility/keyboardui.js b/accessibility/keyboardui.js index 4f45e225..b9144ee0 100644 --- a/accessibility/keyboardui.js +++ b/accessibility/keyboardui.js @@ -27,7 +27,6 @@ const AreaManager = { // Create the element dynamically so you don't have to edit index.html const div = document.createElement("div"); div.id = "area-menu-overlay"; - div.className = "hidden"; div.classList.add("hidden"); div.setAttribute("role", "dialog"); div.setAttribute("aria-modal", "true"); From 8d146f323447806006127ed0858646f063a624d9 Mon Sep 17 00:00:00 2001 From: lawsie <5183697+lawsie@users.noreply.github.com> Date: Mon, 11 May 2026 09:20:48 +0100 Subject: [PATCH 4/6] Make inert behind area menu --- accessibility/keyboardui.js | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/accessibility/keyboardui.js b/accessibility/keyboardui.js index b9144ee0..fdca8eb2 100644 --- a/accessibility/keyboardui.js +++ b/accessibility/keyboardui.js @@ -42,7 +42,14 @@ const AreaManager = { if (show) { GizmoMenuManager.toggle(false); // Close gizmo menu if open this.renderHighlights(); + document + .querySelectorAll("body > *:not(#area-menu-overlay)") + .forEach((el) => (el.inert = true)); setTimeout(() => this.overlay.focus(), 0); + } else { + document + .querySelectorAll("body > *:not(#area-menu-overlay)") + .forEach((el) => (el.inert = false)); } this.overlay.classList.toggle("hidden", !show); } From 9eb0fda183829f79569acfcfce2af4134db5149a Mon Sep 17 00:00:00 2001 From: lawsie <5183697+lawsie@users.noreply.github.com> Date: Mon, 11 May 2026 09:24:26 +0100 Subject: [PATCH 5/6] Restore prev focus if ctrl+b canx --- accessibility/keyboardui.js | 2 ++ 1 file changed, 2 insertions(+) diff --git a/accessibility/keyboardui.js b/accessibility/keyboardui.js index fdca8eb2..edfc0f64 100644 --- a/accessibility/keyboardui.js +++ b/accessibility/keyboardui.js @@ -45,11 +45,13 @@ const AreaManager = { document .querySelectorAll("body > *:not(#area-menu-overlay)") .forEach((el) => (el.inert = true)); + this.previousFocus = document.activeElement; setTimeout(() => this.overlay.focus(), 0); } else { document .querySelectorAll("body > *:not(#area-menu-overlay)") .forEach((el) => (el.inert = false)); + this.previousFocus?.focus(); } this.overlay.classList.toggle("hidden", !show); } From e3d66a33e6cbe297a3a5769eb045c01effb4806e Mon Sep 17 00:00:00 2001 From: lawsie <5183697+lawsie@users.noreply.github.com> Date: Mon, 11 May 2026 09:32:16 +0100 Subject: [PATCH 6/6] Check for previous inert states --- accessibility/keyboardui.js | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/accessibility/keyboardui.js b/accessibility/keyboardui.js index edfc0f64..aecda02f 100644 --- a/accessibility/keyboardui.js +++ b/accessibility/keyboardui.js @@ -42,15 +42,18 @@ const AreaManager = { if (show) { GizmoMenuManager.toggle(false); // Close gizmo menu if open this.renderHighlights(); + this._previousInertStates = new Map(); document .querySelectorAll("body > *:not(#area-menu-overlay)") - .forEach((el) => (el.inert = true)); + .forEach((el) => { + this._previousInertStates.set(el, el.inert); + el.inert = true; + }); this.previousFocus = document.activeElement; setTimeout(() => this.overlay.focus(), 0); } else { - document - .querySelectorAll("body > *:not(#area-menu-overlay)") - .forEach((el) => (el.inert = false)); + this._previousInertStates?.forEach((wasInert, el) => (el.inert = wasInert)); + this._previousInertStates = null; this.previousFocus?.focus(); } this.overlay.classList.toggle("hidden", !show);