Skip to content

Commit d63f6f8

Browse files
Webui: Add color scheme switcher
Closes qbittorrent#21600
1 parent fb40275 commit d63f6f8

File tree

3 files changed

+34
-16
lines changed

3 files changed

+34
-16
lines changed

src/webui/www/private/css/style.css

+8-16
Original file line numberDiff line numberDiff line change
@@ -19,19 +19,11 @@
1919
--color-icon-hover: brightness(0) invert(100%) sepia(100%) saturate(0%)
2020
hue-rotate(108deg) brightness(104%) contrast(104%);
2121

22-
color-scheme: light dark;
23-
}
24-
25-
/* Light corrections */
26-
@media (prefers-color-scheme: light) {
27-
:root {
22+
&:has(#colorThemeCheckbox:checked) {
2823
color-scheme: light;
2924
}
30-
}
3125

32-
/* Dark corrections */
33-
@media (prefers-color-scheme: dark) {
34-
:root {
26+
&:has(#colorThemeCheckbox:not(:checked)) {
3527
--color-accent-blue: hsl(210deg 42% 48%);
3628
--color-text-blue: hsl(210deg 88.1% 73.5%);
3729
--color-text-orange: hsl(26deg 65% 70%);
@@ -43,13 +35,13 @@
4335
--color-border-default: hsl(0deg 0% 33%);
4436

4537
color-scheme: dark;
46-
}
4738

48-
#rssButtonBar img,
49-
#startSearchButton img,
50-
#manageSearchPlugins img {
51-
filter: brightness(0) saturate(100%) invert(100%) sepia(0%) saturate(1%)
39+
#rssButtonBar img,
40+
#startSearchButton img,
41+
#manageSearchPlugins img {
42+
filter: brightness(0) saturate(100%) invert(100%) sepia(0%) saturate(1%)
5243
hue-rotate(156deg) brightness(106%) contrast(101%);
44+
}
5345
}
5446
}
5547

@@ -454,7 +446,7 @@ a.propButton img {
454446
margin: 0 6px -3px -18px;
455447
}
456448

457-
#mainWindowTabs {
449+
#mainWindowTabs, label:has(> #colorThemeCheckbox) {
458450
float: right;
459451
margin: 4px 5px 0 0;
460452
}

src/webui/www/private/index.html

+1
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,7 @@ <h1 class="applicationTitle">qBittorrent Web User Interface <span class="version
105105
</ul>
106106
</li>
107107
</ul>
108+
<label><input id="colorThemeCheckbox" type="checkbox" checked> Light theme</label>
108109
</div>
109110
<div id="mochaToolbar">
110111
&nbsp;&nbsp;

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

+25
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,11 @@ let selectedStatus = LocalPreferences.get("selected_filter", "all");
152152
let setStatusFilter = function() {};
153153
let toggleFilterDisplay = function() {};
154154

155+
$("colorThemeCheckbox").addEventListener("change", (e) => {
156+
const colorScheme = e.target.checked ? "light" : "dark";
157+
LocalPreferences.set("colorScheme", colorScheme);
158+
});
159+
155160
window.addEventListener("DOMContentLoaded", () => {
156161
let isSearchPanelLoaded = false;
157162
let isLogPanelLoaded = false;
@@ -1656,6 +1661,26 @@ window.addEventListener("load", () => {
16561661
window.qBittorrent.Cache.preferences.init();
16571662
window.qBittorrent.Cache.qbtVersion.init();
16581663

1664+
// Setup color scheme switching
1665+
const firstRun = true;
1666+
const updateColorScheme = () => {
1667+
const checkbox = $("colorThemeCheckbox");
1668+
const colorScheme = LocalPreferences.get("colorScheme");
1669+
if (colorScheme != null) {
1670+
if (!firstRun)
1671+
return;
1672+
checkbox.checked = (colorScheme === "light"); // This doesn't emit the 'change' event
1673+
return;
1674+
}
1675+
const isDark = window?.matchMedia?.("(prefers-color-scheme:dark)")?.matches ?? false;
1676+
checkbox.checked = !isDark; // This doesn't emit the 'change' event
1677+
};
1678+
if(window.matchMedia) {
1679+
const colorSchemeQuery = window.matchMedia("(prefers-color-scheme: dark)");
1680+
colorSchemeQuery.addEventListener("change", updateColorScheme);
1681+
}
1682+
updateColorScheme();
1683+
16591684
// switch to previously used tab
16601685
const previouslyUsedTab = LocalPreferences.get("selected_window_tab", "transfers");
16611686
switch (previouslyUsedTab) {

0 commit comments

Comments
 (0)