From 832dd240112ecde7269d078e9110a2e8bcfc9f45 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 20:54:51 +0200 Subject: [PATCH 01/44] Fix caps warning inverted --- frontend/src/ts/test/caps-warning.ts | 19 +++++++++++-------- 1 file changed, 11 insertions(+), 8 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 87a7ed847ac7..21bd1fa10a13 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -23,15 +23,14 @@ function hide(): void { } function update(event: KeyboardEvent): void { - if (event.key === "CapsLock" && capsState !== null) { + capsState = event?.getModifierState("CapsLock"); + + if (event.key === "CapsLock") { capsState = !capsState; - } else { - const modState = event.getModifierState?.("CapsLock"); - if (modState !== undefined) { - capsState = modState; - } } +} +function updateWarningVisibility(): void { try { if (Config.capsLockWarning && capsState) { show(); @@ -41,8 +40,12 @@ function update(event: KeyboardEvent): void { } catch {} } -document.addEventListener("keyup", update); +document.addEventListener("keyup", (event) => { + updateWarningVisibility(); + if (Misc.isMac()) update(event); +}); document.addEventListener("keydown", (event) => { - if (Misc.isMac()) update(event); + update(event); + if (Misc.isMac()) updateWarningVisibility(); }); From 24ea851c513a7481eeb48425eec85e8dae50cc0b Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:05:16 +0200 Subject: [PATCH 02/44] Change mac handling --- frontend/src/ts/test/caps-warning.ts | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 21bd1fa10a13..9715545c97cc 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -40,12 +40,23 @@ function updateWarningVisibility(): void { } catch {} } +function updateCapsForMac(eventType: "keyup" | "keydown"): void { + if (eventType === "keyup") { + capsState = false; + } else { + capsState = true; + } +} + document.addEventListener("keyup", (event) => { + if (Misc.isMac()) updateCapsForMac("keyup"); updateWarningVisibility(); - if (Misc.isMac()) update(event); }); document.addEventListener("keydown", (event) => { - update(event); - if (Misc.isMac()) updateWarningVisibility(); + if (Misc.isMac()) { + updateCapsForMac("keyup"); + } else { + update(event); + } }); From 5f3b1843fa4fe62bdaf1bd4e668a0d59403b325d Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:06:40 +0200 Subject: [PATCH 03/44] keydown --- frontend/src/ts/test/caps-warning.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 9715545c97cc..a76db0cf7c40 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -55,7 +55,7 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (Misc.isMac()) { - updateCapsForMac("keyup"); + updateCapsForMac("keydown"); } else { update(event); } From 012db8e96a90fb28a66555d2a9919bc30a05b315 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:15:36 +0200 Subject: [PATCH 04/44] Visibility --- frontend/src/ts/test/caps-warning.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index a76db0cf7c40..ebbc6ac2a113 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -56,6 +56,7 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (Misc.isMac()) { updateCapsForMac("keydown"); + updateWarningVisibility(); } else { update(event); } From 32e454fc7f168f604aaaf360546760f8a45a3c70 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 21:18:59 +0200 Subject: [PATCH 05/44] Caps check --- frontend/src/ts/test/caps-warning.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index ebbc6ac2a113..3308f5125160 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -49,12 +49,12 @@ function updateCapsForMac(eventType: "keyup" | "keydown"): void { } document.addEventListener("keyup", (event) => { - if (Misc.isMac()) updateCapsForMac("keyup"); + if (Misc.isMac() && event.key === "CapsLock") updateCapsForMac("keyup"); updateWarningVisibility(); }); document.addEventListener("keydown", (event) => { - if (Misc.isMac()) { + if (Misc.isMac() && event.key === "CapsLock") { updateCapsForMac("keydown"); updateWarningVisibility(); } else { From 998bc92ca514bccab02391fccdd6a8e60a390526 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 22:18:05 +0200 Subject: [PATCH 06/44] fehmer's implementation --- frontend/src/ts/test/caps-warning.ts | 54 ++++++++++++++++------------ frontend/src/ts/utils/misc.ts | 4 +++ 2 files changed, 36 insertions(+), 22 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 3308f5125160..a21cd568f027 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -1,10 +1,13 @@ import Config from "../config"; -import * as Misc from "../utils/misc"; import { qsr } from "../utils/dom"; +import { isMac, isLinux, isWindows } from "../utils/misc"; const el = qsr("#capsWarning"); export let capsState = false; +const isMacOs = isMac(); +const isLinuxOs = isLinux(); +const isWindowsOs = isWindows(); let visible = false; @@ -22,15 +25,7 @@ function hide(): void { } } -function update(event: KeyboardEvent): void { - capsState = event?.getModifierState("CapsLock"); - - if (event.key === "CapsLock") { - capsState = !capsState; - } -} - -function updateWarningVisibility(): void { +function updateIndicator(): void { try { if (Config.capsLockWarning && capsState) { show(); @@ -40,24 +35,39 @@ function updateWarningVisibility(): void { } catch {} } -function updateCapsForMac(eventType: "keyup" | "keydown"): void { - if (eventType === "keyup") { - capsState = false; - } else { - capsState = true; +function update(event: KeyboardEvent): void { + if (event.key !== "CapsLock") { + capsState = event.getModifierState("CapsLock"); } + updateIndicator(); } document.addEventListener("keyup", (event) => { - if (Misc.isMac() && event.key === "CapsLock") updateCapsForMac("keyup"); - updateWarningVisibility(); + if (isMacOs) { + if (event.key === "CapsLock") { + capsState = event.getModifierState("CapsLock"); + } + } else if (isWindowsOs) { + if (event.key === "CapsLock") { + capsState = event.getModifierState("CapsLock"); + } + } else { + update(event); + } + updateIndicator(); }); document.addEventListener("keydown", (event) => { - if (Misc.isMac() && event.key === "CapsLock") { - updateCapsForMac("keydown"); - updateWarningVisibility(); - } else { - update(event); + if (isMacOs) { + if (event.key === "CapsLock") { + capsState = event.getModifierState("CapsLock"); + } else { + update(event); + } + } else if (isLinuxOs) { + if (event.key === "CapsLock") { + capsState = !event.getModifierState("CapsLock"); + } } + updateIndicator(); }); diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 8666e9eece3a..fc59c59b5f3f 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -716,6 +716,10 @@ function isPlatform(searchTerm: string | RegExp): boolean { } } +export function isWindows(): boolean { + return isPlatform("Win"); +} + export function isLinux(): boolean { return isPlatform("Linux"); } From c7a63353f0743323ef2a588a4f5b30fb7807c2d5 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 22:23:07 +0200 Subject: [PATCH 07/44] Rename --- frontend/src/ts/test/caps-warning.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index a21cd568f027..6c08ec66f727 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -25,7 +25,7 @@ function hide(): void { } } -function updateIndicator(): void { +function updateCapsWarningVisibility(): void { try { if (Config.capsLockWarning && capsState) { show(); @@ -39,7 +39,7 @@ function update(event: KeyboardEvent): void { if (event.key !== "CapsLock") { capsState = event.getModifierState("CapsLock"); } - updateIndicator(); + updateCapsWarningVisibility(); } document.addEventListener("keyup", (event) => { @@ -54,7 +54,7 @@ document.addEventListener("keyup", (event) => { } else { update(event); } - updateIndicator(); + updateCapsWarningVisibility(); }); document.addEventListener("keydown", (event) => { @@ -69,5 +69,5 @@ document.addEventListener("keydown", (event) => { capsState = !event.getModifierState("CapsLock"); } } - updateIndicator(); + updateCapsWarningVisibility(); }); From eeaf210913ad3d9701a08f599f69db9876e798a0 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 22:23:54 +0200 Subject: [PATCH 08/44] Remove updateCapsLockVisibility from update --- frontend/src/ts/test/caps-warning.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 6c08ec66f727..20dd97a3b8af 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -39,7 +39,6 @@ function update(event: KeyboardEvent): void { if (event.key !== "CapsLock") { capsState = event.getModifierState("CapsLock"); } - updateCapsWarningVisibility(); } document.addEventListener("keyup", (event) => { From 70d0f6a8adda40f8ee6e3629f9b002b8ba4c4cdf Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 6 Feb 2026 22:25:33 +0200 Subject: [PATCH 09/44] Comments --- frontend/src/ts/test/caps-warning.ts | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 20dd97a3b8af..98f93f071215 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -36,7 +36,13 @@ function updateCapsWarningVisibility(): void { } function update(event: KeyboardEvent): void { + /* + CapsLock is pressed. We cannot use the modifierState for "CapsLock" in this case + because the browser implementation differs widely depending on the browser and even the + operating system. + */ if (event.key !== "CapsLock") { + /* on all other key presses we can trust the modifierState */ capsState = event.getModifierState("CapsLock"); } } @@ -47,6 +53,9 @@ document.addEventListener("keyup", (event) => { capsState = event.getModifierState("CapsLock"); } } else if (isWindowsOs) { + /** + * Windows sends the correct state on keyup + */ if (event.key === "CapsLock") { capsState = event.getModifierState("CapsLock"); } @@ -58,12 +67,16 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (isMacOs) { + /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ if (event.key === "CapsLock") { capsState = event.getModifierState("CapsLock"); } else { update(event); } } else if (isLinuxOs) { + /** + * Linux sends the correct state before the toggle only on keydown, so we invert the modifier state + */ if (event.key === "CapsLock") { capsState = !event.getModifierState("CapsLock"); } From c52510e328ffb155381502f5887690f077459fb3 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:14:48 +0200 Subject: [PATCH 10/44] Refactor --- frontend/src/ts/test/caps-warning.ts | 37 ++++++---------------------- 1 file changed, 8 insertions(+), 29 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 98f93f071215..c0a2cabe1d33 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -35,32 +35,17 @@ function updateCapsWarningVisibility(): void { } catch {} } -function update(event: KeyboardEvent): void { - /* - CapsLock is pressed. We cannot use the modifierState for "CapsLock" in this case - because the browser implementation differs widely depending on the browser and even the - operating system. - */ - if (event.key !== "CapsLock") { - /* on all other key presses we can trust the modifierState */ - capsState = event.getModifierState("CapsLock"); - } -} - document.addEventListener("keyup", (event) => { if (isMacOs) { + /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ if (event.key === "CapsLock") { capsState = event.getModifierState("CapsLock"); } } else if (isWindowsOs) { - /** - * Windows sends the correct state on keyup - */ - if (event.key === "CapsLock") { - capsState = event.getModifierState("CapsLock"); - } - } else { - update(event); + /* Windows always sends the correct state on keyup (for CapsLock and regular keys */ + capsState = event.getModifierState("CapsLock"); + } else if (event.key !== "CapsLock") { + capsState = event.getModifierState("CapsLock"); } updateCapsWarningVisibility(); }); @@ -68,18 +53,12 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (isMacOs) { /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ - if (event.key === "CapsLock") { - capsState = event.getModifierState("CapsLock"); - } else { - update(event); - } + capsState = event.getModifierState("CapsLock"); + updateCapsWarningVisibility(); } else if (isLinuxOs) { - /** - * Linux sends the correct state before the toggle only on keydown, so we invert the modifier state - */ + /* Linux sends the correct state before the toggle only on keydown, so we invert the modifier state */ if (event.key === "CapsLock") { capsState = !event.getModifierState("CapsLock"); } } - updateCapsWarningVisibility(); }); From d8318a5c6faffeaf3241035acc6ae4c88e2667b3 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:17:24 +0200 Subject: [PATCH 11/44] Refactor --- frontend/src/ts/test/caps-warning.ts | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index c0a2cabe1d33..c45d24246148 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -35,17 +35,21 @@ function updateCapsWarningVisibility(): void { } catch {} } +function isCapsLockOn(event: KeyboardEvent): boolean { + return event.getModifierState("CapsLock"); +} + document.addEventListener("keyup", (event) => { if (isMacOs) { /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ if (event.key === "CapsLock") { - capsState = event.getModifierState("CapsLock"); + capsState = isCapsLockOn(event); } } else if (isWindowsOs) { /* Windows always sends the correct state on keyup (for CapsLock and regular keys */ - capsState = event.getModifierState("CapsLock"); + capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { - capsState = event.getModifierState("CapsLock"); + capsState = isCapsLockOn(event); } updateCapsWarningVisibility(); }); @@ -53,12 +57,12 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (isMacOs) { /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ - capsState = event.getModifierState("CapsLock"); + capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (isLinuxOs) { /* Linux sends the correct state before the toggle only on keydown, so we invert the modifier state */ if (event.key === "CapsLock") { - capsState = !event.getModifierState("CapsLock"); + capsState = !isCapsLockOn(event); } } }); From 59791a4392a8b1b7878d1f239d3fff4a27f63506 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:19:44 +0200 Subject: [PATCH 12/44] Change comments --- frontend/src/ts/test/caps-warning.ts | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index c45d24246148..01fceb582e12 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -41,12 +41,12 @@ function isCapsLockOn(event: KeyboardEvent): boolean { document.addEventListener("keyup", (event) => { if (isMacOs) { - /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ + // macOs sends only keydown when enabling CapsLock and only keyup when disabling. if (event.key === "CapsLock") { capsState = isCapsLockOn(event); } } else if (isWindowsOs) { - /* Windows always sends the correct state on keyup (for CapsLock and regular keys */ + // Windows always sends the correct state on keyup (for CapsLock and regular keys capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { capsState = isCapsLockOn(event); @@ -56,11 +56,13 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (isMacOs) { - /* macOs sends only keyDown when enabling CapsLock and only keyUp when disabling. */ + // macOs sends only keydown when enabling CapsLock and only keyup when disabling. capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (isLinuxOs) { - /* Linux sends the correct state before the toggle only on keydown, so we invert the modifier state */ + /* Linux sends the correct state before the toggle only on keydown, + * so we invert the modifier state + */ if (event.key === "CapsLock") { capsState = !isCapsLockOn(event); } From 1c744fa989c36126de273dec3ca78638feda3d4a Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:28:24 +0200 Subject: [PATCH 13/44] Refactor --- frontend/src/ts/test/caps-warning.ts | 43 +++++++++++++++++++++------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 01fceb582e12..2f772dd5127b 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -5,9 +5,6 @@ import { isMac, isLinux, isWindows } from "../utils/misc"; const el = qsr("#capsWarning"); export let capsState = false; -const isMacOs = isMac(); -const isLinuxOs = isLinux(); -const isWindowsOs = isWindows(); let visible = false; @@ -39,27 +36,45 @@ function isCapsLockOn(event: KeyboardEvent): boolean { return event.getModifierState("CapsLock"); } -document.addEventListener("keyup", (event) => { - if (isMacOs) { +function getCurrentOs(): string { + if (isMac()) { + return "Mac"; + } + + if (isLinux()) { + return "Linux"; + } + + if (isWindows()) { + return "Windows"; + } + + return "Unknown"; +} + +function updateCapsKeyup(event: KeyboardEvent): void { + const os = getCurrentOs(); + if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. if (event.key === "CapsLock") { capsState = isCapsLockOn(event); } - } else if (isWindowsOs) { + } else if (os === "Windows") { // Windows always sends the correct state on keyup (for CapsLock and regular keys capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { capsState = isCapsLockOn(event); } updateCapsWarningVisibility(); -}); +} -document.addEventListener("keydown", (event) => { - if (isMacOs) { +function updateCapsKeydown(event: KeyboardEvent): void { + const os = getCurrentOs(); + if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. capsState = isCapsLockOn(event); updateCapsWarningVisibility(); - } else if (isLinuxOs) { + } else if (os === "Linux") { /* Linux sends the correct state before the toggle only on keydown, * so we invert the modifier state */ @@ -67,4 +82,12 @@ document.addEventListener("keydown", (event) => { capsState = !isCapsLockOn(event); } } +} + +document.addEventListener("keyup", (event) => { + updateCapsKeyup(event); +}); + +document.addEventListener("keydown", (event) => { + updateCapsKeydown(event); }); From 54d4bac300e9e7e978e2c78a6d0414d96b326aef Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:30:16 +0200 Subject: [PATCH 14/44] Style --- frontend/src/ts/test/caps-warning.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 2f772dd5127b..963321a007cd 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -40,15 +40,12 @@ function getCurrentOs(): string { if (isMac()) { return "Mac"; } - if (isLinux()) { return "Linux"; } - if (isWindows()) { return "Windows"; } - return "Unknown"; } From f1cfe915a9759beeb4612528bfe058ff9e7a25e0 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:34:51 +0200 Subject: [PATCH 15/44] Refactor --- frontend/src/ts/test/caps-warning.ts | 18 ++---------------- frontend/src/ts/utils/misc.ts | 13 +++++++++++++ 2 files changed, 15 insertions(+), 16 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 963321a007cd..0189741b77e3 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -1,10 +1,11 @@ import Config from "../config"; import { qsr } from "../utils/dom"; -import { isMac, isLinux, isWindows } from "../utils/misc"; +import { getCurrentOs } from "../utils/misc"; const el = qsr("#capsWarning"); export let capsState = false; +const os = getCurrentOs(); let visible = false; @@ -36,21 +37,7 @@ function isCapsLockOn(event: KeyboardEvent): boolean { return event.getModifierState("CapsLock"); } -function getCurrentOs(): string { - if (isMac()) { - return "Mac"; - } - if (isLinux()) { - return "Linux"; - } - if (isWindows()) { - return "Windows"; - } - return "Unknown"; -} - function updateCapsKeyup(event: KeyboardEvent): void { - const os = getCurrentOs(); if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. if (event.key === "CapsLock") { @@ -66,7 +53,6 @@ function updateCapsKeyup(event: KeyboardEvent): void { } function updateCapsKeydown(event: KeyboardEvent): void { - const os = getCurrentOs(); if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. capsState = isCapsLockOn(event); diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index fc59c59b5f3f..609a1788ba52 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -732,6 +732,19 @@ export function isMacLike(): boolean { return isPlatform(/Mac|iPod|iPhone|iPad/); } +export function getCurrentOs(): string { + if (isMac()) { + return "Mac"; + } + if (isLinux()) { + return "Linux"; + } + if (isWindows()) { + return "Windows"; + } + return "Unknown"; +} + export function scrollToCenterOrTop(el: HTMLElement | null): void { if (!el) return; From ad37cf4ef31313b7169411dc0831b1d538608462 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:39:30 +0200 Subject: [PATCH 16/44] Comment --- frontend/src/ts/test/caps-warning.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 0189741b77e3..5bf42d8fb96d 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -44,7 +44,7 @@ function updateCapsKeyup(event: KeyboardEvent): void { capsState = isCapsLockOn(event); } } else if (os === "Windows") { - // Windows always sends the correct state on keyup (for CapsLock and regular keys + // Windows always sends the correct state on keyup (for CapsLock and for regular keys) capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { capsState = isCapsLockOn(event); From f29ffd4dc50987b9087fd819d8852bbe8a0ee64b Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:50:57 +0200 Subject: [PATCH 17/44] Factory --- frontend/src/ts/test/caps-warning.ts | 59 ++++++++++++++++++++-------- 1 file changed, 43 insertions(+), 16 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 5bf42d8fb96d..3b6cd37855fd 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -37,38 +37,65 @@ function isCapsLockOn(event: KeyboardEvent): boolean { return event.getModifierState("CapsLock"); } -function updateCapsKeyup(event: KeyboardEvent): void { +function updateCapsKeyupFactory(os: string): (event: KeyboardEvent) => void { if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. - if (event.key === "CapsLock") { - capsState = isCapsLockOn(event); - } - } else if (os === "Windows") { + return (event: KeyboardEvent) => { + if (event.key === "CapsLock") { + capsState = isCapsLockOn(event); + } + }; + } + if (os === "Windows") { // Windows always sends the correct state on keyup (for CapsLock and for regular keys) - capsState = isCapsLockOn(event); - } else if (event.key !== "CapsLock") { - capsState = isCapsLockOn(event); + return (event: KeyboardEvent) => (capsState = isCapsLockOn(event)); } - updateCapsWarningVisibility(); + + if (os === "Linux") { + return (event: KeyboardEvent) => { + if (event.key !== "CapsLock") { + capsState = isCapsLockOn(event); + } + }; + } + + return (event: KeyboardEvent) => { + return; + }; } -function updateCapsKeydown(event: KeyboardEvent): void { +function updateCapsKeydownFactory(os: string): (event: KeyboardEvent) => void { if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. - capsState = isCapsLockOn(event); - updateCapsWarningVisibility(); - } else if (os === "Linux") { + return (event: KeyboardEvent) => { + capsState = isCapsLockOn(event); + updateCapsWarningVisibility(); + }; + } + + if (os === "Linux") { /* Linux sends the correct state before the toggle only on keydown, * so we invert the modifier state */ - if (event.key === "CapsLock") { - capsState = !isCapsLockOn(event); - } + + return (event: KeyboardEvent) => { + if (event.key === "CapsLock") { + capsState = !isCapsLockOn(event); + } + }; } + + return (event: KeyboardEvent) => { + return; + }; } +const updateCapsKeyup = updateCapsKeyupFactory(os); +const updateCapsKeydown = updateCapsKeydownFactory(os); + document.addEventListener("keyup", (event) => { updateCapsKeyup(event); + updateCapsWarningVisibility(); }); document.addEventListener("keydown", (event) => { From 370bb82d2096512c8c57a961c61fde9ea637dceb Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:52:41 +0200 Subject: [PATCH 18/44] Revert "Factory" This reverts commit f29ffd4dc50987b9087fd819d8852bbe8a0ee64b. --- frontend/src/ts/test/caps-warning.ts | 59 ++++++++-------------------- 1 file changed, 16 insertions(+), 43 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 3b6cd37855fd..5bf42d8fb96d 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -37,65 +37,38 @@ function isCapsLockOn(event: KeyboardEvent): boolean { return event.getModifierState("CapsLock"); } -function updateCapsKeyupFactory(os: string): (event: KeyboardEvent) => void { +function updateCapsKeyup(event: KeyboardEvent): void { if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. - return (event: KeyboardEvent) => { - if (event.key === "CapsLock") { - capsState = isCapsLockOn(event); - } - }; - } - if (os === "Windows") { + if (event.key === "CapsLock") { + capsState = isCapsLockOn(event); + } + } else if (os === "Windows") { // Windows always sends the correct state on keyup (for CapsLock and for regular keys) - return (event: KeyboardEvent) => (capsState = isCapsLockOn(event)); - } - - if (os === "Linux") { - return (event: KeyboardEvent) => { - if (event.key !== "CapsLock") { - capsState = isCapsLockOn(event); - } - }; + capsState = isCapsLockOn(event); + } else if (event.key !== "CapsLock") { + capsState = isCapsLockOn(event); } - - return (event: KeyboardEvent) => { - return; - }; + updateCapsWarningVisibility(); } -function updateCapsKeydownFactory(os: string): (event: KeyboardEvent) => void { +function updateCapsKeydown(event: KeyboardEvent): void { if (os === "Mac") { // macOs sends only keydown when enabling CapsLock and only keyup when disabling. - return (event: KeyboardEvent) => { - capsState = isCapsLockOn(event); - updateCapsWarningVisibility(); - }; - } - - if (os === "Linux") { + capsState = isCapsLockOn(event); + updateCapsWarningVisibility(); + } else if (os === "Linux") { /* Linux sends the correct state before the toggle only on keydown, * so we invert the modifier state */ - - return (event: KeyboardEvent) => { - if (event.key === "CapsLock") { - capsState = !isCapsLockOn(event); - } - }; + if (event.key === "CapsLock") { + capsState = !isCapsLockOn(event); + } } - - return (event: KeyboardEvent) => { - return; - }; } -const updateCapsKeyup = updateCapsKeyupFactory(os); -const updateCapsKeydown = updateCapsKeydownFactory(os); - document.addEventListener("keyup", (event) => { updateCapsKeyup(event); - updateCapsWarningVisibility(); }); document.addEventListener("keydown", (event) => { From 9e60760c100f871114a48a7ee719733f1ef758c8 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:55:32 +0200 Subject: [PATCH 19/44] Remove export for windows util --- frontend/src/ts/utils/misc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 609a1788ba52..5df1cd6701d1 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -716,7 +716,7 @@ function isPlatform(searchTerm: string | RegExp): boolean { } } -export function isWindows(): boolean { +function isWindows(): boolean { return isPlatform("Win"); } From f3055947bab4f1c96b56e0118550444378bcd2aa Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 09:56:00 +0200 Subject: [PATCH 20/44] Remove exports for all os utils --- frontend/src/ts/utils/misc.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 5df1cd6701d1..76e52d71d9e4 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -720,11 +720,11 @@ function isWindows(): boolean { return isPlatform("Win"); } -export function isLinux(): boolean { +function isLinux(): boolean { return isPlatform("Linux"); } -export function isMac(): boolean { +function isMac(): boolean { return isPlatform("Mac"); } From 7ea70ed0a9b24fb470ec0f77ed57cdb1696e03f6 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:01:32 +0200 Subject: [PATCH 21/44] Capitalization --- frontend/src/ts/test/caps-warning.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 5bf42d8fb96d..f8a0239b07d7 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -39,7 +39,7 @@ function isCapsLockOn(event: KeyboardEvent): boolean { function updateCapsKeyup(event: KeyboardEvent): void { if (os === "Mac") { - // macOs sends only keydown when enabling CapsLock and only keyup when disabling. + // macOS sends only keydown when enabling CapsLock and only keyup when disabling. if (event.key === "CapsLock") { capsState = isCapsLockOn(event); } @@ -54,7 +54,7 @@ function updateCapsKeyup(event: KeyboardEvent): void { function updateCapsKeydown(event: KeyboardEvent): void { if (os === "Mac") { - // macOs sends only keydown when enabling CapsLock and only keyup when disabling. + // macOS sends only keydown when enabling CapsLock and only keyup when disabling. capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (os === "Linux") { From baabf8e5ecd87380cffc4bea89b92c3c3647c0f5 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:04:56 +0200 Subject: [PATCH 22/44] Comment --- frontend/src/ts/test/caps-warning.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index f8a0239b07d7..163e3ec689d6 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -58,7 +58,7 @@ function updateCapsKeydown(event: KeyboardEvent): void { capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (os === "Linux") { - /* Linux sends the correct state before the toggle only on keydown, + /* Linux sends the correct state before CapsLock is toggled only on keydown, * so we invert the modifier state */ if (event.key === "CapsLock") { From 5e03fb979007f0f790d8ef9390da28ee66272aa3 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 10:05:31 +0200 Subject: [PATCH 23/44] Caps Lock style --- frontend/src/ts/test/caps-warning.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 163e3ec689d6..4ba2fe50ae39 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -39,12 +39,12 @@ function isCapsLockOn(event: KeyboardEvent): boolean { function updateCapsKeyup(event: KeyboardEvent): void { if (os === "Mac") { - // macOS sends only keydown when enabling CapsLock and only keyup when disabling. + // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = isCapsLockOn(event); } } else if (os === "Windows") { - // Windows always sends the correct state on keyup (for CapsLock and for regular keys) + // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { capsState = isCapsLockOn(event); @@ -54,11 +54,11 @@ function updateCapsKeyup(event: KeyboardEvent): void { function updateCapsKeydown(event: KeyboardEvent): void { if (os === "Mac") { - // macOS sends only keydown when enabling CapsLock and only keyup when disabling. + // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (os === "Linux") { - /* Linux sends the correct state before CapsLock is toggled only on keydown, + /* Linux sends the correct state before Caps Lock is toggled only on keydown, * so we invert the modifier state */ if (event.key === "CapsLock") { From f73769ea51f0097799f6295c460b75ac883cf457 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:22:18 +0200 Subject: [PATCH 24/44] Mac --- frontend/src/ts/test/caps-warning.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 4ba2fe50ae39..0b6e6d4275a4 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -41,7 +41,7 @@ function updateCapsKeyup(event: KeyboardEvent): void { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { - capsState = isCapsLockOn(event); + capsState = false; } } else if (os === "Windows") { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) @@ -55,7 +55,7 @@ function updateCapsKeyup(event: KeyboardEvent): void { function updateCapsKeydown(event: KeyboardEvent): void { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - capsState = isCapsLockOn(event); + capsState = true; updateCapsWarningVisibility(); } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, From 8acdb8e37048ed91e28663f41559164acaca18cb Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:23:17 +0200 Subject: [PATCH 25/44] Should still use isCapsLockOn --- frontend/src/ts/test/caps-warning.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 0b6e6d4275a4..c3e8672cc362 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -55,7 +55,7 @@ function updateCapsKeyup(event: KeyboardEvent): void { function updateCapsKeydown(event: KeyboardEvent): void { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - capsState = true; + capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, From 7d0f7221eb0877d11389d4d8ae36a22525053f1f Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:31:53 +0200 Subject: [PATCH 26/44] Change mac handling --- frontend/src/ts/test/caps-warning.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index c3e8672cc362..f2e6fa654d19 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -42,6 +42,8 @@ function updateCapsKeyup(event: KeyboardEvent): void { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = false; + } else { + capsState = isCapsLockOn(event); } } else if (os === "Windows") { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) @@ -55,8 +57,10 @@ function updateCapsKeyup(event: KeyboardEvent): void { function updateCapsKeydown(event: KeyboardEvent): void { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - capsState = isCapsLockOn(event); - updateCapsWarningVisibility(); + if (event.key === "CapsLock") { + capsState = true; + updateCapsWarningVisibility(); + } } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, * so we invert the modifier state From 764df085d78487f36533a4b7c016464ef20cd18d Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:35:13 +0200 Subject: [PATCH 27/44] Add Linux comment --- frontend/src/ts/test/caps-warning.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index f2e6fa654d19..119a3b352e31 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -49,6 +49,7 @@ function updateCapsKeyup(event: KeyboardEvent): void { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { + // Linux sends the correct state on keyup if key isn't Caps Lock capsState = isCapsLockOn(event); } updateCapsWarningVisibility(); From 9187d23151c10082fb25a7cfa03297217ec99e3d Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:51:06 +0200 Subject: [PATCH 28/44] Remove getCurrentOs --- frontend/src/ts/test/caps-warning.ts | 11 +++++------ frontend/src/ts/utils/misc.ts | 19 +++---------------- 2 files changed, 8 insertions(+), 22 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 119a3b352e31..f4241c008658 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -1,11 +1,10 @@ import Config from "../config"; import { qsr } from "../utils/dom"; -import { getCurrentOs } from "../utils/misc"; +import { isMac, isLinux, isWindows } from "../utils/misc"; const el = qsr("#capsWarning"); export let capsState = false; -const os = getCurrentOs(); let visible = false; @@ -38,14 +37,14 @@ function isCapsLockOn(event: KeyboardEvent): boolean { } function updateCapsKeyup(event: KeyboardEvent): void { - if (os === "Mac") { + if (isMac()) { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = false; } else { capsState = isCapsLockOn(event); } - } else if (os === "Windows") { + } else if (isWindows()) { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { @@ -56,13 +55,13 @@ function updateCapsKeyup(event: KeyboardEvent): void { } function updateCapsKeydown(event: KeyboardEvent): void { - if (os === "Mac") { + if (isMac()) { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = true; updateCapsWarningVisibility(); } - } else if (os === "Linux") { + } else if (isLinux()) { /* Linux sends the correct state before Caps Lock is toggled only on keydown, * so we invert the modifier state */ diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 76e52d71d9e4..fc59c59b5f3f 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -716,15 +716,15 @@ function isPlatform(searchTerm: string | RegExp): boolean { } } -function isWindows(): boolean { +export function isWindows(): boolean { return isPlatform("Win"); } -function isLinux(): boolean { +export function isLinux(): boolean { return isPlatform("Linux"); } -function isMac(): boolean { +export function isMac(): boolean { return isPlatform("Mac"); } @@ -732,19 +732,6 @@ export function isMacLike(): boolean { return isPlatform(/Mac|iPod|iPhone|iPad/); } -export function getCurrentOs(): string { - if (isMac()) { - return "Mac"; - } - if (isLinux()) { - return "Linux"; - } - if (isWindows()) { - return "Windows"; - } - return "Unknown"; -} - export function scrollToCenterOrTop(el: HTMLElement | null): void { if (!el) return; From 0468c1c5fcb3f1387f75f0117854974aa3a88365 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:53:48 +0200 Subject: [PATCH 29/44] Inline updateCapsKeyup and updateCapsKeydown --- frontend/src/ts/test/caps-warning.ts | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index f4241c008658..a1e33fd97f35 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -36,7 +36,7 @@ function isCapsLockOn(event: KeyboardEvent): boolean { return event.getModifierState("CapsLock"); } -function updateCapsKeyup(event: KeyboardEvent): void { +document.addEventListener("keyup", (event) => { if (isMac()) { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { @@ -52,9 +52,9 @@ function updateCapsKeyup(event: KeyboardEvent): void { capsState = isCapsLockOn(event); } updateCapsWarningVisibility(); -} +}); -function updateCapsKeydown(event: KeyboardEvent): void { +document.addEventListener("keydown", (event) => { if (isMac()) { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { @@ -69,12 +69,4 @@ function updateCapsKeydown(event: KeyboardEvent): void { capsState = !isCapsLockOn(event); } } -} - -document.addEventListener("keyup", (event) => { - updateCapsKeyup(event); -}); - -document.addEventListener("keydown", (event) => { - updateCapsKeydown(event); }); From 2a472ab5175b3952445d1004a443a0b8374e9b05 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 12:57:57 +0200 Subject: [PATCH 30/44] Add back getCurrentOs --- frontend/src/ts/test/caps-warning.ts | 11 ++++++----- frontend/src/ts/utils/misc.ts | 19 ++++++++++++++++--- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index a1e33fd97f35..40e8b956f477 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -1,10 +1,11 @@ import Config from "../config"; import { qsr } from "../utils/dom"; -import { isMac, isLinux, isWindows } from "../utils/misc"; +import { getCurrentOs } from "../utils/misc"; const el = qsr("#capsWarning"); export let capsState = false; +const os = getCurrentOs(); let visible = false; @@ -37,14 +38,14 @@ function isCapsLockOn(event: KeyboardEvent): boolean { } document.addEventListener("keyup", (event) => { - if (isMac()) { + if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = false; } else { capsState = isCapsLockOn(event); } - } else if (isWindows()) { + } else if (os === "Windows") { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { @@ -55,13 +56,13 @@ document.addEventListener("keyup", (event) => { }); document.addEventListener("keydown", (event) => { - if (isMac()) { + if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = true; updateCapsWarningVisibility(); } - } else if (isLinux()) { + } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, * so we invert the modifier state */ diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index fc59c59b5f3f..7b6c1b58d84d 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -716,18 +716,31 @@ function isPlatform(searchTerm: string | RegExp): boolean { } } -export function isWindows(): boolean { +function isWindows(): boolean { return isPlatform("Win"); } -export function isLinux(): boolean { +function isLinux(): boolean { return isPlatform("Linux"); } -export function isMac(): boolean { +function isMac(): boolean { return isPlatform("Mac"); } +export function getCurrentOs(): "Mac" | "Linux" | "Windows" | "Unknown" { + if (isMac()) { + return "Mac"; + } + if (isLinux()) { + return "Linux"; + } + if (isWindows()) { + return "Windows"; + } + return "Unknown"; +} + export function isMacLike(): boolean { return isPlatform(/Mac|iPod|iPhone|iPad/); } From 5f44564faf79537c2dbb93f2a59ddc226a9695c9 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:33:45 +0200 Subject: [PATCH 31/44] Hopefully fix mac --- frontend/src/ts/test/caps-warning.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 40e8b956f477..800412222603 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -42,8 +42,6 @@ document.addEventListener("keyup", (event) => { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = false; - } else { - capsState = isCapsLockOn(event); } } else if (os === "Windows") { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) @@ -60,8 +58,10 @@ document.addEventListener("keydown", (event) => { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = true; - updateCapsWarningVisibility(); + } else { + capsState = isCapsLockOn(event); } + updateCapsWarningVisibility(); } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, * so we invert the modifier state From 66bac514d3195b654ddce7864ed80eaceb2baef4 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 16:36:29 +0200 Subject: [PATCH 32/44] Revert --- frontend/src/ts/test/caps-warning.ts | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 800412222603..ab2ec75e1b27 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -41,7 +41,7 @@ document.addEventListener("keyup", (event) => { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { - capsState = false; + capsState = isCapsLockOn(event); } } else if (os === "Windows") { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) @@ -56,11 +56,7 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - if (event.key === "CapsLock") { - capsState = true; - } else { - capsState = isCapsLockOn(event); - } + capsState = isCapsLockOn(event); updateCapsWarningVisibility(); } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, From 744609cc44caae5ec49e98ff9e31a62175855c48 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Sat, 7 Feb 2026 21:43:39 +0200 Subject: [PATCH 33/44] Always false --- frontend/src/ts/test/caps-warning.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index ab2ec75e1b27..30d63daf5797 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -41,7 +41,7 @@ document.addEventListener("keyup", (event) => { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { - capsState = isCapsLockOn(event); + capsState = false; } } else if (os === "Windows") { // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) From 7c664789aee53391494ee691d4e610eefa2a2b8d Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Thu, 26 Feb 2026 21:50:20 +0200 Subject: [PATCH 34/44] Fix IPad --- frontend/src/ts/test/caps-warning.ts | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 30d63daf5797..795f9cb3c8a1 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -56,7 +56,16 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - capsState = isCapsLockOn(event); + if (navigator.maxTouchPoints > 1) { + // IPad doesn't send caps state on any keypress which isn't Caps Lock, + // So only change caps state when Caps Lock is pressed + if (event.key === "CapsLock") { + capsState = true; + } + } else { + capsState = isCapsLockOn(event); + } + updateCapsWarningVisibility(); } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, From c4d3338e85e0b60814f938dacb0b80b92b08f246 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 10:14:46 +0200 Subject: [PATCH 35/44] Please work mac --- frontend/src/ts/test/caps-warning.ts | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 795f9cb3c8a1..20c7d305a50e 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -42,12 +42,18 @@ document.addEventListener("keyup", (event) => { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. if (event.key === "CapsLock") { capsState = false; + } else { + // IPad doesn't send caps state on any keypress which isn't Caps Lock, + // So don't update caps state on any keypress which isn't Caps Lock. + if (navigator.maxTouchPoints <= 1) { + capsState = isCapsLockOn(event); + } } } else if (os === "Windows") { - // Windows always sends the correct state on keyup (for Caps Lock and for regular keys) + // Windows always sends the correct state on keyup (for Caps Lock and for regular keys). capsState = isCapsLockOn(event); } else if (event.key !== "CapsLock") { - // Linux sends the correct state on keyup if key isn't Caps Lock + // Linux sends the correct state on keyup if key isn't Caps Lock. capsState = isCapsLockOn(event); } updateCapsWarningVisibility(); @@ -56,20 +62,13 @@ document.addEventListener("keyup", (event) => { document.addEventListener("keydown", (event) => { if (os === "Mac") { // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - if (navigator.maxTouchPoints > 1) { - // IPad doesn't send caps state on any keypress which isn't Caps Lock, - // So only change caps state when Caps Lock is pressed - if (event.key === "CapsLock") { - capsState = true; - } - } else { - capsState = isCapsLockOn(event); + if (event.key === "CapsLock") { + capsState = true; + updateCapsWarningVisibility(); } - - updateCapsWarningVisibility(); } else if (os === "Linux") { /* Linux sends the correct state before Caps Lock is toggled only on keydown, - * so we invert the modifier state + * so we invert the modifier state. */ if (event.key === "CapsLock") { capsState = !isCapsLockOn(event); From 188bee9c35472fcb94a6959516509d7ae9434aa3 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:27:19 +0200 Subject: [PATCH 36/44] Use modern caps lock --- frontend/src/ts/test/caps-warning.ts | 48 +++------------------------- package.json | 3 ++ pnpm-lock.yaml | 28 +++++++++++----- 3 files changed, 27 insertions(+), 52 deletions(-) diff --git a/frontend/src/ts/test/caps-warning.ts b/frontend/src/ts/test/caps-warning.ts index 20c7d305a50e..97a329059923 100644 --- a/frontend/src/ts/test/caps-warning.ts +++ b/frontend/src/ts/test/caps-warning.ts @@ -1,13 +1,11 @@ import Config from "../config"; import { qsr } from "../utils/dom"; -import { getCurrentOs } from "../utils/misc"; +import { onCapsLockChange } from "@leonabcd123/modern-caps-lock"; const el = qsr("#capsWarning"); +let visible = false; export let capsState = false; -const os = getCurrentOs(); - -let visible = false; function show(): void { if (!visible) { @@ -33,45 +31,7 @@ function updateCapsWarningVisibility(): void { } catch {} } -function isCapsLockOn(event: KeyboardEvent): boolean { - return event.getModifierState("CapsLock"); -} - -document.addEventListener("keyup", (event) => { - if (os === "Mac") { - // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - if (event.key === "CapsLock") { - capsState = false; - } else { - // IPad doesn't send caps state on any keypress which isn't Caps Lock, - // So don't update caps state on any keypress which isn't Caps Lock. - if (navigator.maxTouchPoints <= 1) { - capsState = isCapsLockOn(event); - } - } - } else if (os === "Windows") { - // Windows always sends the correct state on keyup (for Caps Lock and for regular keys). - capsState = isCapsLockOn(event); - } else if (event.key !== "CapsLock") { - // Linux sends the correct state on keyup if key isn't Caps Lock. - capsState = isCapsLockOn(event); - } +onCapsLockChange((currentCapsState: boolean) => { + capsState = currentCapsState; updateCapsWarningVisibility(); }); - -document.addEventListener("keydown", (event) => { - if (os === "Mac") { - // macOS sends only keydown when enabling Caps Lock and only keyup when disabling. - if (event.key === "CapsLock") { - capsState = true; - updateCapsWarningVisibility(); - } - } else if (os === "Linux") { - /* Linux sends the correct state before Caps Lock is toggled only on keydown, - * so we invert the modifier state. - */ - if (event.key === "CapsLock") { - capsState = !isCapsLockOn(event); - } - } -}); diff --git a/package.json b/package.json index 4c532cd090ce..15b00987a798 100644 --- a/package.json +++ b/package.json @@ -55,6 +55,9 @@ "knip": "knip", "update-oxc": "pnpm up -D -r oxlint@latest oxfmt@latest oxlint-tsgolint@latest" }, + "dependencies": { + "@leonabcd123/modern-caps-lock": "1.0.1" + }, "devDependencies": { "@commitlint/cli": "17.7.1", "@commitlint/config-conventional": "19.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59bda0b9f6db..62464c8038e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,6 +7,10 @@ settings: importers: .: + dependencies: + '@leonabcd123/modern-caps-lock': + specifier: 1.0.1 + version: 1.0.1 devDependencies: '@commitlint/cli': specifier: 17.7.1 @@ -224,7 +228,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -429,7 +433,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.31) @@ -2518,6 +2522,9 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} + '@leonabcd123/modern-caps-lock@1.0.1': + resolution: {integrity: sha512-HhS3l+kdXlhMQU6yD4I2kt4YP4/uXrxUgh+EhCfnI1J5lyP2eE65MoBRnSGVgLIdmTthODxZZiAHMNqNifPqag==} + '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true @@ -5876,25 +5883,28 @@ packages: glob@10.4.5: resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@11.0.3: resolution: {integrity: sha512-2Nim7dha1KVkaiF4q6Dj+ngPPMdfvLJEOpZk/jKiUAkqKebpGAWQXAq9z1xu9HKu5lWfqw/FASuccEjyznjPaA==} engines: {node: 20 || >=22} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me hasBin: true glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@8.1.0: resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me glob@9.3.5: resolution: {integrity: sha512-e1LleDykUz2Iu+MTYdkSsuWX8lvAjAcs0Xef0lNIu0S2wOAzuTxCJtcd9S3cijlwYF18EsU3rzb8jPVobxDh9Q==} engines: {node: '>=16 || 14 >=14.17'} + deprecated: Old versions of glob are not supported, and contain widely publicized security vulnerabilities, which have been fixed in the current version. Please update. Support for old versions may be purchased (at exorbitant rates) by contacting i@izs.me global-dirs@0.1.1: resolution: {integrity: sha512-NknMLn7F2J7aflwFOlGdNIuCDpN3VGoSoB+aap3KABFWbHVn1TCgFC+np23J8W2BiZbjfEw3BFBycSMv1AFblg==} @@ -12326,6 +12336,8 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} + '@leonabcd123/modern-caps-lock@1.0.1': {} + '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: detect-libc: 2.0.3 @@ -13560,7 +13572,7 @@ snapshots: '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13573,11 +13585,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13590,7 +13602,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color From 51aaa35f4903c57b7b5e9ff6d5c0ba401b2f858e Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:54:49 +0200 Subject: [PATCH 37/44] Upgrade modern caps lock --- pnpm-lock.yaml | 151 +++++++++++++++++++++++++++++-------------------- 1 file changed, 89 insertions(+), 62 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 62464c8038e0..a2330af0f09e 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -505,7 +505,7 @@ importers: version: 7.1.12(@types/node@24.9.1)(jiti@2.6.1)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) vite-bundle-visualizer: specifier: 1.2.1 - version: 1.2.1(rollup@2.79.2) + version: 1.2.1(rollup@2.80.0) vite-plugin-filter-replace: specifier: 0.1.14 version: 0.1.14 @@ -781,8 +781,8 @@ packages: resolution: {integrity: sha512-3EwLFhZ38J4VyIP6WNtt2kUdW9dokXA9Cr4IVIFHuCpZ3H8/YFOl5JjZHisrn1fATPBmKKqXzDFvh9fUwHz6CQ==} engines: {node: '>=6.9.0'} - '@babel/generator@7.29.0': - resolution: {integrity: sha512-vSH118/wwM/pLR38g/Sgk05sNtro6TlTJKuiMXDaZqPUfjTFcudpCOt00IhOfj+1BFAX+UFAlzCU+6WXr3GLFQ==} + '@babel/generator@7.29.1': + resolution: {integrity: sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==} engines: {node: '>=6.9.0'} '@babel/helper-annotate-as-pure@7.27.3': @@ -3878,6 +3878,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.16.0: + resolution: {integrity: sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==} + engines: {node: '>=0.4.0'} + hasBin: true + add-stream@1.0.0: resolution: {integrity: sha512-qQLMr+8o0WC4FZGQTcJiKBVC59JylcPSrTtk6usvmIDFUOCKegapy1VHQwRbFMOFyb/inzUVqHs+eMYKDM1YeQ==} @@ -3914,6 +3919,9 @@ packages: ajv@8.17.1: resolution: {integrity: sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==} + ajv@8.18.0: + resolution: {integrity: sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==} + animejs@4.2.2: resolution: {integrity: sha512-Ys3RuvLdAeI14fsdKCQy7ytu4057QX6Bb7m4jwmfd6iKmUmLquTwk1ut0e4NtRQgCeq/s2Lv5+oMBjz6c7ZuIg==} @@ -4183,12 +4191,13 @@ packages: base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - baseline-browser-mapping@2.9.11: - resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} + baseline-browser-mapping@2.10.0: + resolution: {integrity: sha512-lIyg0szRfYbiy67j9KN8IyeD7q7hcmqnJ1ddWmNt19ItGpNN64mnllmxUNFIOdOm6by97jlL6wfpTTJrmnjWAA==} + engines: {node: '>=6.0.0'} hasBin: true - baseline-browser-mapping@2.9.19: - resolution: {integrity: sha512-ipDqC8FrAl/76p2SSWKSI+H9tFwm7vYqXQrItCuiVPt26Km0jS+NzSsBWAaBusvSbQcfJG+JitdMm+wZAgTYqg==} + baseline-browser-mapping@2.9.11: + resolution: {integrity: sha512-Sg0xJUNDU1sJNGdfGWhVHX0kkZ+HWcvmVymJbj6NSgZZmW/8S9Y2HQ5euytnIgakgxN6papOAWiwDo1ctFDcoQ==} hasBin: true basic-auth-connect@1.0.0: @@ -4397,8 +4406,8 @@ packages: caniuse-lite@1.0.30001762: resolution: {integrity: sha512-PxZwGNvH7Ak8WX5iXzoK1KPZttBXNPuaOvI2ZYU7NrlM+d9Ov+TUvlLOBNGzVXAntMSMMlJPd+jY6ovrVjSmUw==} - caniuse-lite@1.0.30001767: - resolution: {integrity: sha512-34+zUAMhSH+r+9eKmYG+k2Rpt8XttfE4yXAjoZvkAPs15xcYQhyBYdalJ65BzivAvGRMViEjy6oKr/S91loekQ==} + caniuse-lite@1.0.30001774: + resolution: {integrity: sha512-DDdwPGz99nmIEv216hKSgLD+D4ikHQHjBC/seF98N9CPqRX4M5mSxT9eTV6oyisnJcuzxtZy4n17yKKQYmYQOA==} canvas-confetti@1.5.1: resolution: {integrity: sha512-Ncz+oZJP6OvY7ti4E1slxVlyAV/3g7H7oQtcCDXgwGgARxPnwYY9PW5Oe+I8uvspYNtuHviAdgA0LfcKFWJfpg==} @@ -5235,8 +5244,8 @@ packages: electron-to-chromium@1.5.267: resolution: {integrity: sha512-0Drusm6MVRXSOJpGbaSVgcQsuB4hEkMpHXaVstcPmhu5LIedxs1xNK/nIxmQIU/RPC0+1/o0AVZfBTkTNJOdUw==} - electron-to-chromium@1.5.283: - resolution: {integrity: sha512-3vifjt1HgrGW/h76UEeny+adYApveS9dH2h3p57JYzBSXJIKUJAvtmIytDKjcSCt9xHfrNCFJ7gts6vkhuq++w==} + electron-to-chromium@1.5.302: + resolution: {integrity: sha512-sM6HAN2LyK82IyPBpznDRqlTQAtuSaO+ShzFiWTvoMJLHyZ+Y39r8VMfHzwbU8MVBzQ4Wdn85+wlZl2TLGIlwg==} electron-to-chromium@1.5.5: resolution: {integrity: sha512-QR7/A7ZkMS8tZuoftC/jfqNkZLQO779SSW3YuZHP4eXpj3EffGLFcB/Xu9AAZQzLccTiCV+EmUo3ha4mQ9wnlA==} @@ -5599,8 +5608,8 @@ packages: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} - filelist@1.0.4: - resolution: {integrity: sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q==} + filelist@1.0.6: + resolution: {integrity: sha512-5giy2PkLYY1cP39p17Ech+2xlpTRL9HLspOfEgm0L6CwBXBTgsK5ou0JtzYuepxkaQ/tvhCFIJ5uXo0OrM2DxA==} filesize@6.4.0: resolution: {integrity: sha512-mjFIpOHC4jbfcTfoh4rkWpI31mF7viw9ikj/JyLoKzqlwG/YsefKfvYlYhdYdg/9mtK2z1AzgN/0LvVQ3zdlSQ==} @@ -7227,6 +7236,10 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} + minimatch@5.1.9: + resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} + engines: {node: '>=10'} + minimatch@6.2.0: resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} engines: {node: '>=10'} @@ -8550,8 +8563,8 @@ packages: rollup: optional: true - rollup@2.79.2: - resolution: {integrity: sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==} + rollup@2.80.0: + resolution: {integrity: sha512-cIFJOD1DESzpjOBl763Kp1AH7UE/0fcdHe6rZXUdQ9c50uvgigvW97u3IcSeBwOkgqL/PXPBktBCh0KEu5L8XQ==} engines: {node: '>=10.0.0'} hasBin: true @@ -8852,8 +8865,9 @@ packages: resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} - smob@1.5.0: - resolution: {integrity: sha512-g6T+p7QO8npa+/hNx9ohv1E5pVCmWrVCUzUXJyLdMmftX6ER0oiWY/w9knEonLpnOp6b6FenKnMfR8gqwWdwig==} + smob@1.6.1: + resolution: {integrity: sha512-KAkBqZl3c2GvNgNhcoyJae1aKldDW0LO279wF9bk1PnluRTETKBq0WyzRXxEhoQLk56yHaOY4JCBEKDuJIET5g==} + engines: {node: '>=20.0.0'} socks-proxy-agent@8.0.4: resolution: {integrity: sha512-GNAq/eg8Udq2x0eNiFkr9gRg5bA7PXEWagQdeRX4cPSG+X/8V38v637gim9bjFptMk1QWsCTr0ttrJEiXbNnRw==} @@ -10227,9 +10241,9 @@ snapshots: ts-deepmerge: 6.2.1 zod: 3.23.8 - '@apideck/better-ajv-errors@0.3.6(ajv@8.17.1)': + '@apideck/better-ajv-errors@0.3.6(ajv@8.18.0)': dependencies: - ajv: 8.17.1 + ajv: 8.18.0 json-schema: 0.4.0 jsonpointer: 5.0.1 leven: 3.1.0 @@ -10320,7 +10334,7 @@ snapshots: '@babel/core@7.29.0': dependencies: '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-compilation-targets': 7.28.6 '@babel/helper-module-transforms': 7.28.6(@babel/core@7.29.0) '@babel/helpers': 7.28.6 @@ -10352,7 +10366,7 @@ snapshots: '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 - '@babel/generator@7.29.0': + '@babel/generator@7.29.1': dependencies: '@babel/parser': 7.29.0 '@babel/types': 7.29.0 @@ -11089,7 +11103,7 @@ snapshots: '@babel/traverse@7.29.0': dependencies: '@babel/code-frame': 7.29.0 - '@babel/generator': 7.29.0 + '@babel/generator': 7.29.1 '@babel/helper-globals': 7.28.0 '@babel/parser': 7.29.0 '@babel/template': 7.28.6 @@ -12770,55 +12784,55 @@ snapshots: transitivePeerDependencies: - ajv - '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2)': + '@rollup/plugin-babel@5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.80.0)': dependencies: '@babel/core': 7.29.0 '@babel/helper-module-imports': 7.28.6 - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) - rollup: 2.79.2 + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) + rollup: 2.80.0 optionalDependencies: '@types/babel__core': 7.20.5 transitivePeerDependencies: - supports-color - '@rollup/plugin-node-resolve@15.3.1(rollup@2.79.2)': + '@rollup/plugin-node-resolve@15.3.1(rollup@2.80.0)': dependencies: - '@rollup/pluginutils': 5.3.0(rollup@2.79.2) + '@rollup/pluginutils': 5.3.0(rollup@2.80.0) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.11 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/plugin-replace@2.4.2(rollup@2.79.2)': + '@rollup/plugin-replace@2.4.2(rollup@2.80.0)': dependencies: - '@rollup/pluginutils': 3.1.0(rollup@2.79.2) + '@rollup/pluginutils': 3.1.0(rollup@2.80.0) magic-string: 0.25.9 - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/plugin-terser@0.4.4(rollup@2.79.2)': + '@rollup/plugin-terser@0.4.4(rollup@2.80.0)': dependencies: serialize-javascript: 6.0.2 - smob: 1.5.0 + smob: 1.6.1 terser: 5.46.0 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/pluginutils@3.1.0(rollup@2.79.2)': + '@rollup/pluginutils@3.1.0(rollup@2.80.0)': dependencies: '@types/estree': 0.0.39 estree-walker: 1.0.1 picomatch: 2.3.1 - rollup: 2.79.2 + rollup: 2.80.0 - '@rollup/pluginutils@5.3.0(rollup@2.79.2)': + '@rollup/pluginutils@5.3.0(rollup@2.80.0)': dependencies: '@types/estree': 1.0.8 estree-walker: 2.0.2 picomatch: 4.0.3 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 '@rollup/rollup-android-arm-eabi@4.40.0': optional: true @@ -13722,6 +13736,8 @@ snapshots: acorn@8.15.0: {} + acorn@8.16.0: {} + add-stream@1.0.0: {} agent-base@6.0.2: @@ -13772,6 +13788,13 @@ snapshots: json-schema-traverse: 1.0.0 require-from-string: 2.0.2 + ajv@8.18.0: + dependencies: + fast-deep-equal: 3.1.3 + fast-uri: 3.1.0 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + animejs@4.2.2: {} ansi-align@3.0.1: @@ -14038,9 +14061,9 @@ snapshots: base64-js@1.5.1: {} - baseline-browser-mapping@2.9.11: {} + baseline-browser-mapping@2.10.0: {} - baseline-browser-mapping@2.9.19: {} + baseline-browser-mapping@2.9.11: {} basic-auth-connect@1.0.0: {} @@ -14189,9 +14212,9 @@ snapshots: browserslist@4.28.1: dependencies: - baseline-browser-mapping: 2.9.19 - caniuse-lite: 1.0.30001767 - electron-to-chromium: 1.5.283 + baseline-browser-mapping: 2.10.0 + caniuse-lite: 1.0.30001774 + electron-to-chromium: 1.5.302 node-releases: 2.0.27 update-browserslist-db: 1.2.3(browserslist@4.28.1) @@ -14320,7 +14343,7 @@ snapshots: caniuse-lite@1.0.30001762: {} - caniuse-lite@1.0.30001767: {} + caniuse-lite@1.0.30001774: {} canvas-confetti@1.5.1: {} @@ -15170,7 +15193,7 @@ snapshots: electron-to-chromium@1.5.267: {} - electron-to-chromium@1.5.283: {} + electron-to-chromium@1.5.302: {} electron-to-chromium@1.5.5: {} @@ -15758,9 +15781,9 @@ snapshots: dependencies: flat-cache: 4.0.1 - filelist@1.0.4: + filelist@1.0.6: dependencies: - minimatch: 5.1.6 + minimatch: 5.1.9 filesize@6.4.0: {} @@ -16938,7 +16961,7 @@ snapshots: jake@10.9.4: dependencies: async: 3.2.6 - filelist: 1.0.4 + filelist: 1.0.6 picocolors: 1.1.1 jest-diff@29.7.0: @@ -17617,6 +17640,10 @@ snapshots: dependencies: brace-expansion: 2.0.2 + minimatch@5.1.9: + dependencies: + brace-expansion: 2.0.2 + minimatch@6.2.0: dependencies: brace-expansion: 2.0.2 @@ -19193,16 +19220,16 @@ snapshots: dependencies: glob: 10.4.5 - rollup-plugin-visualizer@5.14.0(rollup@2.79.2): + rollup-plugin-visualizer@5.14.0(rollup@2.80.0): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.6 yargs: 17.7.2 optionalDependencies: - rollup: 2.79.2 + rollup: 2.80.0 - rollup@2.79.2: + rollup@2.80.0: optionalDependencies: fsevents: 2.3.3 @@ -19625,7 +19652,7 @@ snapshots: smart-buffer@4.2.0: {} - smob@1.5.0: {} + smob@1.6.1: {} socks-proxy-agent@8.0.4: dependencies: @@ -20120,7 +20147,7 @@ snapshots: terser@5.46.0: dependencies: '@jridgewell/source-map': 0.3.11 - acorn: 8.15.0 + acorn: 8.16.0 commander: 2.20.3 source-map-support: 0.5.21 @@ -20615,11 +20642,11 @@ snapshots: vary@1.1.2: {} - vite-bundle-visualizer@1.2.1(rollup@2.79.2): + vite-bundle-visualizer@1.2.1(rollup@2.80.0): dependencies: cac: 6.7.14 import-from-esm: 1.3.4 - rollup-plugin-visualizer: 5.14.0(rollup@2.79.2) + rollup-plugin-visualizer: 5.14.0(rollup@2.80.0) tmp: 0.2.5 transitivePeerDependencies: - rolldown @@ -20993,23 +21020,23 @@ snapshots: workbox-build@7.1.1(@types/babel__core@7.20.5): dependencies: - '@apideck/better-ajv-errors': 0.3.6(ajv@8.17.1) + '@apideck/better-ajv-errors': 0.3.6(ajv@8.18.0) '@babel/core': 7.29.0 '@babel/preset-env': 7.29.0(@babel/core@7.29.0) '@babel/runtime': 7.28.6 - '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.79.2) - '@rollup/plugin-node-resolve': 15.3.1(rollup@2.79.2) - '@rollup/plugin-replace': 2.4.2(rollup@2.79.2) - '@rollup/plugin-terser': 0.4.4(rollup@2.79.2) + '@rollup/plugin-babel': 5.3.1(@babel/core@7.29.0)(@types/babel__core@7.20.5)(rollup@2.80.0) + '@rollup/plugin-node-resolve': 15.3.1(rollup@2.80.0) + '@rollup/plugin-replace': 2.4.2(rollup@2.80.0) + '@rollup/plugin-terser': 0.4.4(rollup@2.80.0) '@surma/rollup-plugin-off-main-thread': 2.2.3 - ajv: 8.17.1 + ajv: 8.18.0 common-tags: 1.8.2 fast-json-stable-stringify: 2.1.0 fs-extra: 9.1.0 glob: 7.2.3 lodash: 4.17.23 pretty-bytes: 5.6.0 - rollup: 2.79.2 + rollup: 2.80.0 source-map: 0.8.0-beta.0 stringify-object: 3.3.0 strip-comments: 2.0.1 From 6cd068c3d8526b1841263516b2cf48f7fc49e88e Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:55:48 +0200 Subject: [PATCH 38/44] Actually upgrade --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 15b00987a798..0892e9542ea2 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,7 @@ "update-oxc": "pnpm up -D -r oxlint@latest oxfmt@latest oxlint-tsgolint@latest" }, "dependencies": { - "@leonabcd123/modern-caps-lock": "1.0.1" + "@leonabcd123/modern-caps-lock": "2.0.0" }, "devDependencies": { "@commitlint/cli": "17.7.1", From 3e3200225570221296a529e4a7f401c062a85c04 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 13:56:09 +0200 Subject: [PATCH 39/44] Update lockfile --- pnpm-lock.yaml | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a2330af0f09e..f7ffbe35f11d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@leonabcd123/modern-caps-lock': - specifier: 1.0.1 - version: 1.0.1 + specifier: 2.0.0 + version: 2.0.0 devDependencies: '@commitlint/cli': specifier: 17.7.1 @@ -177,7 +177,7 @@ importers: version: link:../packages/typescript-config '@redocly/cli': specifier: 2.0.5 - version: 2.0.5(@opentelemetry/api@1.8.0)(ajv@8.17.1)(core-js@3.37.1)(encoding@0.1.13) + version: 2.0.5(@opentelemetry/api@1.8.0)(ajv@8.18.0)(core-js@3.37.1)(encoding@0.1.13) '@types/bcrypt': specifier: 5.0.2 version: 5.0.2 @@ -228,7 +228,7 @@ importers: version: 10.0.0 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) concurrently: specifier: 8.2.2 version: 8.2.2 @@ -433,7 +433,7 @@ importers: version: 5.0.2 '@vitest/coverage-v8': specifier: 4.0.15 - version: 4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) + version: 4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1)) autoprefixer: specifier: 10.4.20 version: 10.4.20(postcss@8.4.31) @@ -2522,8 +2522,8 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@leonabcd123/modern-caps-lock@1.0.1': - resolution: {integrity: sha512-HhS3l+kdXlhMQU6yD4I2kt4YP4/uXrxUgh+EhCfnI1J5lyP2eE65MoBRnSGVgLIdmTthODxZZiAHMNqNifPqag==} + '@leonabcd123/modern-caps-lock@2.0.0': + resolution: {integrity: sha512-vFwXLRCZS9AaWRuSrkuvUNYWLe1iLRSpa+QdNZZAC4yR57V44TGBHOtMa+XYVxw3mZ1rmXHOstrWe7YhHDA2cg==} '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} @@ -12350,7 +12350,7 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@leonabcd123/modern-caps-lock@1.0.1': {} + '@leonabcd123/modern-caps-lock@2.0.0': {} '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: @@ -12695,14 +12695,14 @@ snapshots: require-from-string: 2.0.2 uri-js-replace: 1.0.1 - '@redocly/cli@2.0.5(@opentelemetry/api@1.8.0)(ajv@8.17.1)(core-js@3.37.1)(encoding@0.1.13)': + '@redocly/cli@2.0.5(@opentelemetry/api@1.8.0)(ajv@8.18.0)(core-js@3.37.1)(encoding@0.1.13)': dependencies: '@opentelemetry/exporter-trace-otlp-http': 0.202.0(@opentelemetry/api@1.8.0) '@opentelemetry/resources': 2.0.1(@opentelemetry/api@1.8.0) '@opentelemetry/sdk-trace-node': 2.0.1(@opentelemetry/api@1.8.0) '@opentelemetry/semantic-conventions': 1.34.0 - '@redocly/openapi-core': 2.0.5(ajv@8.17.1) - '@redocly/respect-core': 2.0.5(ajv@8.17.1) + '@redocly/openapi-core': 2.0.5(ajv@8.18.0) + '@redocly/respect-core': 2.0.5(ajv@8.18.0) abort-controller: 3.0.0 chokidar: 3.6.0 colorette: 1.4.0 @@ -12753,11 +12753,11 @@ snapshots: transitivePeerDependencies: - supports-color - '@redocly/openapi-core@2.0.5(ajv@8.17.1)': + '@redocly/openapi-core@2.0.5(ajv@8.18.0)': dependencies: '@redocly/ajv': 8.11.2 '@redocly/config': 0.28.0 - ajv-formats: 2.1.1(ajv@8.17.1) + ajv-formats: 2.1.1(ajv@8.18.0) colorette: 1.4.0 js-levenshtein: 1.1.6 js-yaml: 4.1.0 @@ -12767,13 +12767,13 @@ snapshots: transitivePeerDependencies: - ajv - '@redocly/respect-core@2.0.5(ajv@8.17.1)': + '@redocly/respect-core@2.0.5(ajv@8.18.0)': dependencies: '@faker-js/faker': 7.6.0 '@noble/hashes': 1.8.0 '@redocly/ajv': 8.11.2 - '@redocly/openapi-core': 2.0.5(ajv@8.17.1) - better-ajv-errors: 1.2.0(ajv@8.17.1) + '@redocly/openapi-core': 2.0.5(ajv@8.18.0) + better-ajv-errors: 1.2.0(ajv@8.18.0) colorette: 2.0.20 jest-diff: 29.7.0 jest-matcher-utils: 29.7.0 @@ -13586,7 +13586,7 @@ snapshots: '@typescript-eslint/types': 8.52.0 eslint-visitor-keys: 4.2.1 - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13599,11 +13599,11 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color - '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': + '@vitest/coverage-v8@4.0.15(vitest@4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1))': dependencies: '@bcoe/v8-coverage': 1.0.2 '@vitest/utils': 4.0.15 @@ -13616,7 +13616,7 @@ snapshots: obug: 2.1.1 std-env: 3.10.0 tinyrainbow: 3.0.3 - vitest: 4.0.15(@opentelemetry/api@1.8.0)(@types/node@24.9.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) + vitest: 4.0.15(@types/node@20.5.1)(happy-dom@20.0.10)(jiti@2.6.1)(jsdom@27.4.0)(lightningcss@1.30.2)(sass@1.70.0)(terser@5.46.0)(tsx@4.16.2)(yaml@2.8.1) transitivePeerDependencies: - supports-color @@ -13763,9 +13763,9 @@ snapshots: optionalDependencies: ajv: 8.12.0 - ajv-formats@2.1.1(ajv@8.17.1): + ajv-formats@2.1.1(ajv@8.18.0): optionalDependencies: - ajv: 8.17.1 + ajv: 8.18.0 ajv@6.12.6: dependencies: @@ -14087,11 +14087,11 @@ snapshots: before-after-hook@3.0.2: {} - better-ajv-errors@1.2.0(ajv@8.17.1): + better-ajv-errors@1.2.0(ajv@8.18.0): dependencies: '@babel/code-frame': 7.27.1 '@humanwhocodes/momoa': 2.0.4 - ajv: 8.17.1 + ajv: 8.18.0 chalk: 4.1.2 jsonpointer: 5.0.1 leven: 3.1.0 From 623d9fc11ad82bfa121adf3b84a82d6b61eebb55 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:02:14 +0200 Subject: [PATCH 40/44] Remove getCurrentOs --- frontend/src/ts/utils/misc.ts | 63 ++++++++++++++--------------------- 1 file changed, 25 insertions(+), 38 deletions(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 2a07eb05a554..30d41022cb8b 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -706,44 +706,31 @@ export function triggerResize(): void { export type RequiredProperties = Omit & Required>; -function isPlatform(searchTerm: string | RegExp): boolean { - // oxlint-disable-next-line no-deprecated - const platform = navigator.platform; - if (typeof searchTerm === "string") { - return platform.includes(searchTerm); - } else { - return searchTerm.test(platform); - } -} - -function isWindows(): boolean { - return isPlatform("Win"); -} - -function isLinux(): boolean { - return isPlatform("Linux"); -} - -function isMac(): boolean { - return isPlatform("Mac"); -} - -export function getCurrentOs(): "Mac" | "Linux" | "Windows" | "Unknown" { - if (isMac()) { - return "Mac"; - } - if (isLinux()) { - return "Linux"; - } - if (isWindows()) { - return "Windows"; - } - return "Unknown"; -} - -export function isMacLike(): boolean { - return isPlatform(/Mac|iPod|iPhone|iPad/); -} +//function isPlatform(searchTerm: string | RegExp): boolean { +// oxlint-disable-next-line no-deprecated +//const platform = navigator.platform; +//if (typeof searchTerm === "string") { +//return platform.includes(searchTerm); +//} else { +//return searchTerm.test(platform); +//} +//} + +//function isWindows(): boolean { +//return isPlatform("Win"); +//} + +//function isLinux(): boolean { +//return isPlatform("Linux"); +//} + +//function isMac(): boolean { +//return isPlatform("Mac"); +//} + +//function isMacLike(): boolean { +//return isPlatform(/Mac|iPod|iPhone|iPad/); +//} export function scrollToCenterOrTop(el: HTMLElement | null): void { if (!el) return; From 7ce204b2ff3b18d9f54f152adb17b6a55eeb1247 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:09:31 +0200 Subject: [PATCH 41/44] Add back isMacLike --- frontend/src/ts/utils/misc.ts | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 30d41022cb8b..799ffba626ce 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -706,15 +706,15 @@ export function triggerResize(): void { export type RequiredProperties = Omit & Required>; -//function isPlatform(searchTerm: string | RegExp): boolean { -// oxlint-disable-next-line no-deprecated -//const platform = navigator.platform; -//if (typeof searchTerm === "string") { -//return platform.includes(searchTerm); -//} else { -//return searchTerm.test(platform); -//} -//} +function isPlatform(searchTerm: string | RegExp): boolean { + //oxlint-disable-next-line no-deprecated + const platform = navigator.platform; + if (typeof searchTerm === "string") { + return platform.includes(searchTerm); + } else { + return searchTerm.test(platform); + } +} //function isWindows(): boolean { //return isPlatform("Win"); @@ -728,9 +728,9 @@ export type RequiredProperties = Omit & //return isPlatform("Mac"); //} -//function isMacLike(): boolean { -//return isPlatform(/Mac|iPod|iPhone|iPad/); -//} +export function isMacLike(): boolean { + return isPlatform(/Mac|iPod|iPhone|iPad/); +} export function scrollToCenterOrTop(el: HTMLElement | null): void { if (!el) return; From ef74c710aabda1855c1b17b2a8104ddef0485c8d Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:25:32 +0200 Subject: [PATCH 42/44] Upgrade modern caps lock --- package.json | 2 +- pnpm-lock.yaml | 18 +++++------------- 2 files changed, 6 insertions(+), 14 deletions(-) diff --git a/package.json b/package.json index 31950ef1f856..4e0533daad9a 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "update-oxc": "pnpm up -D -r oxlint@latest oxfmt@latest oxlint-tsgolint@latest" }, "dependencies": { - "@leonabcd123/modern-caps-lock": "2.0.0" + "@leonabcd123/modern-caps-lock": "2.0.2" }, "devDependencies": { "@commitlint/cli": "17.7.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c410057f77aa..2391465b772a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: dependencies: '@leonabcd123/modern-caps-lock': - specifier: 2.0.0 - version: 2.0.0 + specifier: 2.0.2 + version: 2.0.2 devDependencies: '@commitlint/cli': specifier: 17.7.1 @@ -2526,8 +2526,8 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@leonabcd123/modern-caps-lock@2.0.0': - resolution: {integrity: sha512-vFwXLRCZS9AaWRuSrkuvUNYWLe1iLRSpa+QdNZZAC4yR57V44TGBHOtMa+XYVxw3mZ1rmXHOstrWe7YhHDA2cg==} + '@leonabcd123/modern-caps-lock@2.0.2': + resolution: {integrity: sha512-gpCXtZGlmTn5cN3ILuALInsbVDtwqPZC36RNCzHhP2BFpHGDm+ByFGMscQblnOSGJJbfAoRA3/hFL8P0lDoNeA==} '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} @@ -7405,10 +7405,6 @@ packages: resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} engines: {node: '>=10'} - minimatch@5.1.9: - resolution: {integrity: sha512-7o1wEA2RyMP7Iu7GNba9vc0RWWGACJOCZBJX2GJWip0ikV+wcOsgVuY9uE8CPiyQhkGFSlhuSkZPavN7u1c2Fw==} - engines: {node: '>=10'} - minimatch@6.2.0: resolution: {integrity: sha512-sauLxniAmvnhhRjFwPNnJKaPFYyddAgbYdeUpHULtCT/GhzdCx/MDNy+Y40lBxTQUrMzDE8e0S43Z5uqfO0REg==} engines: {node: '>=10'} @@ -12524,7 +12520,7 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@leonabcd123/modern-caps-lock@2.0.0': {} + '@leonabcd123/modern-caps-lock@2.0.2': {} '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: @@ -17892,10 +17888,6 @@ snapshots: dependencies: brace-expansion: 2.0.2 - minimatch@5.1.9: - dependencies: - brace-expansion: 2.0.2 - minimatch@6.2.0: dependencies: brace-expansion: 2.0.2 From a45dd6fa1f38f9b46db94481eb1b6d409dc7b2c3 Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 14:26:23 +0200 Subject: [PATCH 43/44] Add back space --- frontend/src/ts/utils/misc.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/src/ts/utils/misc.ts b/frontend/src/ts/utils/misc.ts index 799ffba626ce..b5f321a51450 100644 --- a/frontend/src/ts/utils/misc.ts +++ b/frontend/src/ts/utils/misc.ts @@ -707,7 +707,7 @@ export type RequiredProperties = Omit & Required>; function isPlatform(searchTerm: string | RegExp): boolean { - //oxlint-disable-next-line no-deprecated + // oxlint-disable-next-line no-deprecated const platform = navigator.platform; if (typeof searchTerm === "string") { return platform.includes(searchTerm); From a5aa7659e8e41a9167716fb12a1a4087e2c819fe Mon Sep 17 00:00:00 2001 From: Leonabcd123 <156839416+Leonabcd123@users.noreply.github.com> Date: Fri, 27 Feb 2026 16:06:42 +0200 Subject: [PATCH 44/44] Make it a frontend only dependency --- frontend/package.json | 1 + package.json | 3 --- pnpm-lock.yaml | 15 +++++++-------- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/frontend/package.json b/frontend/package.json index 73180d0afa0f..bcda3e352565 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -23,6 +23,7 @@ }, "dependencies": { "@date-fns/utc": "1.2.0", + "@leonabcd123/modern-caps-lock": "2.0.3", "@monkeytype/contracts": "workspace:*", "@monkeytype/funbox": "workspace:*", "@monkeytype/schemas": "workspace:*", diff --git a/package.json b/package.json index 4e0533daad9a..d412191b7ab6 100644 --- a/package.json +++ b/package.json @@ -56,9 +56,6 @@ "knip": "knip", "update-oxc": "pnpm up -D -r oxlint@latest oxfmt@latest oxlint-tsgolint@latest" }, - "dependencies": { - "@leonabcd123/modern-caps-lock": "2.0.2" - }, "devDependencies": { "@commitlint/cli": "17.7.1", "@commitlint/config-conventional": "19.2.2", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2391465b772a..897e43b29117 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -7,10 +7,6 @@ settings: importers: .: - dependencies: - '@leonabcd123/modern-caps-lock': - specifier: 2.0.2 - version: 2.0.2 devDependencies: '@commitlint/cli': specifier: 17.7.1 @@ -265,6 +261,9 @@ importers: '@date-fns/utc': specifier: 1.2.0 version: 1.2.0 + '@leonabcd123/modern-caps-lock': + specifier: 2.0.3 + version: 2.0.3 '@monkeytype/contracts': specifier: workspace:* version: link:../packages/contracts @@ -2526,8 +2525,8 @@ packages: '@kwsites/promise-deferred@1.1.1': resolution: {integrity: sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==} - '@leonabcd123/modern-caps-lock@2.0.2': - resolution: {integrity: sha512-gpCXtZGlmTn5cN3ILuALInsbVDtwqPZC36RNCzHhP2BFpHGDm+ByFGMscQblnOSGJJbfAoRA3/hFL8P0lDoNeA==} + '@leonabcd123/modern-caps-lock@2.0.3': + resolution: {integrity: sha512-g4wPe1tHAR7hxOrvUwzxCrxBD+pjI1vEe+STXgsL2jQS95MXxge7h4afKXTLKguOtPc6gqK0Ljle4FLI60rWhw==} '@mapbox/node-pre-gyp@1.0.11': resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} @@ -12520,7 +12519,7 @@ snapshots: '@kwsites/promise-deferred@1.1.1': {} - '@leonabcd123/modern-caps-lock@2.0.2': {} + '@leonabcd123/modern-caps-lock@2.0.3': {} '@mapbox/node-pre-gyp@1.0.11(encoding@0.1.13)': dependencies: @@ -16774,7 +16773,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: - agent-base: 7.1.1 + agent-base: 7.1.4 debug: 4.4.3 transitivePeerDependencies: - supports-color