From d66f1c58d8f00a60151b773b9470f01718da040b Mon Sep 17 00:00:00 2001
From: Sainan <63328889+Sainan@users.noreply.github.com>
Date: Sun, 29 Jun 2025 09:07:53 -0700
Subject: [PATCH] feat(webui): light/dark theme selection (#2343)
Closes #2093
Reviewed-on: https://onlyg.it/OpenWF/SpaceNinjaServer/pulls/2343
Co-authored-by: Sainan <63328889+Sainan@users.noreply.github.com>
Co-committed-by: Sainan <63328889+Sainan@users.noreply.github.com>
---
 static/webui/index.html         | 63 +++++++++++++++++----------------
 static/webui/script.js          | 12 +++++++
 static/webui/translations/de.js |  3 ++
 static/webui/translations/en.js |  3 ++
 static/webui/translations/es.js |  3 ++
 static/webui/translations/fr.js |  3 ++
 static/webui/translations/ru.js |  3 ++
 static/webui/translations/zh.js |  3 ++
 8 files changed, 62 insertions(+), 31 deletions(-)
diff --git a/static/webui/index.html b/static/webui/index.html
index bcca50157..9c820321b 100644
--- a/static/webui/index.html
+++ b/static/webui/index.html
@@ -13,37 +13,38 @@
                 
             
             OpenWF WebUI
-            
+            
+                
+                
+            
+            
+                
+                
+            
         
     
     
diff --git a/static/webui/script.js b/static/webui/script.js
index 417bee735..4414110dd 100644
--- a/static/webui/script.js
+++ b/static/webui/script.js
@@ -230,6 +230,18 @@ function setLanguage(lang) {
     }
 }
 
+function setActiveTheme(theme) {
+    document.documentElement.setAttribute("data-bs-theme", theme);
+    document.querySelector("[data-theme].active").classList.remove("active");
+    document.querySelector("[data-theme=" + theme + "]").classList.add("active");
+}
+setActiveTheme(localStorage.getItem("theme") ?? "dark");
+
+function setTheme(theme) {
+    setActiveTheme(theme);
+    localStorage.setItem("theme", theme);
+}
+
 const webUiModularWeapons = [
     "/Lotus/Weapons/Sentients/OperatorAmplifiers/OperatorAmpWeapon",
     "/Lotus/Weapons/Ostron/Melee/LotusModularWeapon",
diff --git a/static/webui/translations/de.js b/static/webui/translations/de.js
index 2ce0e396c..0179030c6 100644
--- a/static/webui/translations/de.js
+++ b/static/webui/translations/de.js
@@ -291,5 +291,8 @@ dict = {
     upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`,
     upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`,
 
+    theme_dark: `[UNTRANSLATED] Dark Theme`,
+    theme_light: `[UNTRANSLATED] Light Theme`,
+
     prettier_sucks_ass: ``
 };
diff --git a/static/webui/translations/en.js b/static/webui/translations/en.js
index 1443dad93..36f0645be 100644
--- a/static/webui/translations/en.js
+++ b/static/webui/translations/en.js
@@ -290,5 +290,8 @@ dict = {
     upgrade_SwiftExecute: `Speed of Mercy Kills increased by 50%`,
     upgrade_OnHackInvis: `Invisible for 15 seconds after hacking`,
 
+    theme_dark: `Dark Theme`,
+    theme_light: `Light Theme`,
+
     prettier_sucks_ass: ``
 };
diff --git a/static/webui/translations/es.js b/static/webui/translations/es.js
index f5b1a3778..d8e561b16 100644
--- a/static/webui/translations/es.js
+++ b/static/webui/translations/es.js
@@ -291,5 +291,8 @@ dict = {
     upgrade_SwiftExecute: `Velocidad de ejecuciones aumentada en un 50%`,
     upgrade_OnHackInvis: `Invisible durante 15 segundos después de hackear`,
 
+    theme_dark: `[UNTRANSLATED] Dark Theme`,
+    theme_light: `[UNTRANSLATED] Light Theme`,
+
     prettier_sucks_ass: ``
 };
diff --git a/static/webui/translations/fr.js b/static/webui/translations/fr.js
index 149af5335..43e96c0f8 100644
--- a/static/webui/translations/fr.js
+++ b/static/webui/translations/fr.js
@@ -291,5 +291,8 @@ dict = {
     upgrade_SwiftExecute: `Vitesse des miséricordes augmentée de 50%`,
     upgrade_OnHackInvis: `Invisible pendant 15 secondes après un piratage`,
 
+    theme_dark: `[UNTRANSLATED] Dark Theme`,
+    theme_light: `[UNTRANSLATED] Light Theme`,
+
     prettier_sucks_ass: ``
 };
diff --git a/static/webui/translations/ru.js b/static/webui/translations/ru.js
index 1d5b0e8c7..d2a7e36df 100644
--- a/static/webui/translations/ru.js
+++ b/static/webui/translations/ru.js
@@ -291,5 +291,8 @@ dict = {
     upgrade_SwiftExecute: `[UNTRANSLATED] Speed of Mercy Kills increased by 50%`,
     upgrade_OnHackInvis: `[UNTRANSLATED] Invisible for 15 seconds after hacking`,
 
+    theme_dark: `[UNTRANSLATED] Dark Theme`,
+    theme_light: `[UNTRANSLATED] Light Theme`,
+
     prettier_sucks_ass: ``
 };
diff --git a/static/webui/translations/zh.js b/static/webui/translations/zh.js
index ac0420d22..602431cf1 100644
--- a/static/webui/translations/zh.js
+++ b/static/webui/translations/zh.js
@@ -291,5 +291,8 @@ dict = {
     upgrade_SwiftExecute: `怜悯之击速度提升50%`,
     upgrade_OnHackInvis: `入侵后隐身15秒`,
 
+    theme_dark: `[UNTRANSLATED] Dark Theme`,
+    theme_light: `[UNTRANSLATED] Light Theme`,
+
     prettier_sucks_ass: ``
 };