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);