Skip to content

Commit 84ee620

Browse files
Webui: Add color scheme switcher
Closes qbittorrent#21600
1 parent 9413626 commit 84ee620

File tree

4 files changed

+50
-18
lines changed

4 files changed

+50
-18
lines changed

src/webui/www/private/css/palette.css

+5-17
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* Adaptive color palette */
22

33
/* Default rules */
4-
* {
4+
:root {
55
--color-accent-blue: hsl(210deg 65% 55%);
66
--color-text-blue: hsl(210deg 100% 55%);
77
--color-text-orange: hsl(26deg 100% 45%);
@@ -16,26 +16,12 @@
1616
--color-background-hover: hsl(26deg 80% 60%);
1717
--color-border-blue: hsl(210deg 42% 48%);
1818
--color-border-default: hsl(0deg 0% 85%);
19-
}
20-
21-
:root {
22-
color-scheme: light dark;
23-
}
2419

25-
/* Light corrections */
26-
@media (prefers-color-scheme: light) {
27-
:root {
20+
&:not(.dark) {
2821
color-scheme: light;
2922
}
30-
}
3123

32-
/* Dark corrections */
33-
@media (prefers-color-scheme: dark) {
34-
:root {
35-
color-scheme: dark;
36-
}
37-
38-
* {
24+
&.dark {
3925
--color-accent-blue: hsl(210deg 42% 48%);
4026
--color-text-blue: hsl(210deg 88.1% 73.5%);
4127
--color-text-orange: hsl(26deg 65% 70%);
@@ -45,5 +31,7 @@
4531
--color-background-default: hsl(0deg 0% 25%);
4632
--color-background-hover: hsl(26deg 50% 55%);
4733
--color-border-default: hsl(0deg 0% 33%);
34+
35+
color-scheme: dark;
4836
}
4937
}

src/webui/www/private/index.html

+2-1
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<!DOCTYPE html>
2-
<html lang="${LANG}">
2+
<!-- Add the 'dark' class to prevent bright flash on page load -->
3+
<html lang="${LANG}" class="dark">
34

45
<head>
56
<meta charset="UTF-8" />

src/webui/www/private/scripts/client.js

+13
Original file line numberDiff line numberDiff line change
@@ -1667,6 +1667,19 @@ window.addEventListener("load", () => {
16671667
window.qBittorrent.Cache.preferences.init();
16681668
window.qBittorrent.Cache.qbtVersion.init();
16691669

1670+
// Setup color scheme switching
1671+
const colorSchemeQuery = window.matchMedia("(prefers-color-scheme: dark)");
1672+
const updateColorScheme = () => {
1673+
const root = document.documentElement;
1674+
const colorScheme = LocalPreferences.get("color_scheme");
1675+
const validScheme = (colorScheme === "light") || (colorScheme === "dark");
1676+
const isDark = colorSchemeQuery.matches;
1677+
root.classList.toggle("dark", ((!validScheme && isDark) || (colorScheme === "dark")));
1678+
};
1679+
1680+
colorSchemeQuery.addEventListener("change", updateColorScheme);
1681+
updateColorScheme();
1682+
16701683
// switch to previously used tab
16711684
const previouslyUsedTab = LocalPreferences.get("selected_window_tab", "transfers");
16721685
switch (previouslyUsedTab) {

src/webui/www/private/views/preferences.html

+30
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,16 @@
77
</select>
88
</fieldset>
99

10+
<fieldset class="settings">
11+
<legend>QBT_TR(Interface)QBT_TR[CONTEXT=OptionsDialog]</legend>
12+
<label for="colorSchemeSelect">QBT_TR(Color scheme:)QBT_TR[CONTEXT=OptionsDialog]</label>
13+
<select id="colorSchemeSelect">
14+
<option value="0">QBT_TR(Auto)QBT_TR[CONTEXT=OptionsDialog]</option>
15+
<option value="1">QBT_TR(Light)QBT_TR[CONTEXT=OptionsDialog]</option>
16+
<option value="2">QBT_TR(Dark)QBT_TR[CONTEXT=OptionsDialog]</option>
17+
</select>
18+
</fieldset>
19+
1020
<fieldset class="settings">
1121
<legend>
1222
<input type="checkbox" id="filelog_checkbox" onclick="qBittorrent.Preferences.updateFileLogEnabled();" />
@@ -2011,6 +2021,18 @@
20112021
$("locale_select").setProperty("value", selected);
20122022
};
20132023

2024+
const updateColoSchemeSelect = () => {
2025+
const combobox = document.getElementById("colorSchemeSelect");
2026+
const colorScheme = LocalPreferences.get("color_scheme");
2027+
2028+
if (colorScheme === "light")
2029+
combobox.options[1].selected = true;
2030+
else if (colorScheme === "dark")
2031+
combobox.options[2].selected = true;
2032+
else
2033+
combobox.options[0].selected = true;
2034+
};
2035+
20142036
const loadPreferences = function() {
20152037
window.parent.qBittorrent.Cache.preferences.init({
20162038
onSuccess: (pref) => {
@@ -2296,6 +2318,7 @@
22962318
// WebUI tab
22972319
// Language
22982320
updateWebuiLocaleSelect(pref.locale);
2321+
updateColoSchemeSelect();
22992322
$("performanceWarning").setProperty("checked", pref.performance_warning);
23002323

23012324
// HTTP Server
@@ -2714,6 +2737,13 @@
27142737
// WebUI tab
27152738
// Language
27162739
settings["locale"] = $("locale_select").getProperty("value");
2740+
const colorScheme = Number(document.getElementById("colorSchemeSelect").value);
2741+
if (colorScheme === 0)
2742+
LocalPreferences.remove("color_scheme");
2743+
else if (colorScheme === 1)
2744+
LocalPreferences.set("color_scheme", "light");
2745+
else
2746+
LocalPreferences.set("color_scheme", "dark");
27172747
settings["performance_warning"] = $("performanceWarning").getProperty("checked");
27182748

27192749
// HTTP Server

0 commit comments

Comments
 (0)