Skip to content

Commit 46f8ffd

Browse files
committed
The GitHub icon in the documentation footer now changes with the color mode
1 parent 906cfb2 commit 46f8ffd

4 files changed

Lines changed: 194 additions & 119 deletions

File tree

doxygen/Doxyfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1409,7 +1409,8 @@ HTML_EXTRA_STYLESHEET = stylesheets/doxygen-awesome.css \
14091409
HTML_EXTRA_FILES = assets/github-mark-white.svg \
14101410
js/doxygen-awesome-darkmode-toggle.js \
14111411
js/doxygen-awesome-fragment-copy-button.js \
1412-
js/doxygen-awesome-interactive-toc.js
1412+
js/doxygen-awesome-interactive-toc.js \
1413+
assets/github-mark.svg
14131414

14141415
# The HTML_COLORSTYLE tag can be used to specify if the generated HTML output
14151416
# should be rendered with a dark or light theme.

doxygen/html/footer.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,10 @@
44
Created by <a class="footer-text-link" href="https://github.com/basicx-StrgV">basicx-StrgV</a>
55
</div>
66
<div class="custom-footer-entry">
7-
<a href="https://github.com/basicx-StrgV/WGet.NET"><img src="$relpath^github-mark-white.svg" alt="GitHub" class="custom-footer-icon" /></a>
7+
<a href="https://github.com/basicx-StrgV/WGet.NET">
8+
<img id="github-icon-dark" src="$relpath^github-mark-white.svg" alt="GitHub" class="custom-footer-icon" style="display: none;"/>
9+
<img id="github-icon-light" src="$relpath^github-mark.svg" alt="GitHub" class="custom-footer-icon" style="display: none;"/>
10+
</a>
811
</div>
912
</ul>
1013
</div>

doxygen/html/header.html

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,28 @@
3030
DoxygenAwesomeDarkModeToggle.init();
3131
DoxygenAwesomeFragmentCopyButton.init();
3232
DoxygenAwesomeInteractiveToc.init();
33+
34+
addEventListener("DOMContentLoaded", event => {
35+
// Set the correct icon for the current mode when the site is loaded
36+
if (DoxygenAwesomeDarkModeToggle.userPreference) {
37+
document.getElementById("github-icon-dark").style.display = "block";
38+
}
39+
else {
40+
document.getElementById("github-icon-light").style.display = "block";
41+
}
42+
43+
DoxygenAwesomeDarkModeToggle.onModeChange(() => {
44+
// Update the icons when the mode is changed
45+
if (DoxygenAwesomeDarkModeToggle.userPreference) {
46+
document.getElementById("github-icon-light").style.display = "none";
47+
document.getElementById("github-icon-dark").style.display = "block";
48+
}
49+
else {
50+
document.getElementById("github-icon-dark").style.display = "none";
51+
document.getElementById("github-icon-light").style.display = "block";
52+
}
53+
});
54+
});
3355
</script>
3456
</head>
3557
<body>

doxygen/js/doxygen-awesome-darkmode-toggle.js

Lines changed: 166 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -28,130 +28,179 @@ SOFTWARE.
2828
*/
2929

3030
class DoxygenAwesomeDarkModeToggle extends HTMLElement {
31-
// SVG icons from https://fonts.google.com/icons
32-
// Licensed under the Apache 2.0 license:
33-
// https://www.apache.org/licenses/LICENSE-2.0.html
34-
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`
35-
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`
36-
static title = "Toggle Light/Dark Mode"
37-
38-
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode"
39-
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode"
40-
41-
static _staticConstructor = function() {
42-
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.userPreference)
43-
// Update the color scheme when the browsers preference changes
44-
// without user interaction on the website.
45-
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
46-
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
47-
})
48-
// Update the color scheme when the tab is made visible again.
49-
// It is possible that the appearance was changed in another tab
50-
// while this tab was in the background.
51-
document.addEventListener("visibilitychange", visibilityState => {
52-
if (document.visibilityState === 'visible') {
53-
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged()
54-
}
31+
// SVG icons from https://fonts.google.com/icons
32+
// Licensed under the Apache 2.0 license:
33+
// https://www.apache.org/licenses/LICENSE-2.0.html
34+
static lightModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FCBF00"><rect fill="none" height="24" width="24"/><circle cx="12" cy="12" opacity=".3" r="3"/><path d="M12,9c1.65,0,3,1.35,3,3s-1.35,3-3,3s-3-1.35-3-3S10.35,9,12,9 M12,7c-2.76,0-5,2.24-5,5s2.24,5,5,5s5-2.24,5-5 S14.76,7,12,7L12,7z M2,13l2,0c0.55,0,1-0.45,1-1s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S1.45,13,2,13z M20,13l2,0c0.55,0,1-0.45,1-1 s-0.45-1-1-1l-2,0c-0.55,0-1,0.45-1,1S19.45,13,20,13z M11,2v2c0,0.55,0.45,1,1,1s1-0.45,1-1V2c0-0.55-0.45-1-1-1S11,1.45,11,2z M11,20v2c0,0.55,0.45,1,1,1s1-0.45,1-1v-2c0-0.55-0.45-1-1-1C11.45,19,11,19.45,11,20z M5.99,4.58c-0.39-0.39-1.03-0.39-1.41,0 c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0s0.39-1.03,0-1.41L5.99,4.58z M18.36,16.95 c-0.39-0.39-1.03-0.39-1.41,0c-0.39,0.39-0.39,1.03,0,1.41l1.06,1.06c0.39,0.39,1.03,0.39,1.41,0c0.39-0.39,0.39-1.03,0-1.41 L18.36,16.95z M19.42,5.99c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06c-0.39,0.39-0.39,1.03,0,1.41 s1.03,0.39,1.41,0L19.42,5.99z M7.05,18.36c0.39-0.39,0.39-1.03,0-1.41c-0.39-0.39-1.03-0.39-1.41,0l-1.06,1.06 c-0.39,0.39-0.39,1.03,0,1.41s1.03,0.39,1.41,0L7.05,18.36z"/></svg>`;
35+
static darkModeIcon = `<svg xmlns="http://www.w3.org/2000/svg" enable-background="new 0 0 24 24" height="24px" viewBox="0 0 24 24" width="24px" fill="#FE9700"><rect fill="none" height="24" width="24"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27 C17.45,17.19,14.93,19,12,19c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z" opacity=".3"/><path d="M9.37,5.51C9.19,6.15,9.1,6.82,9.1,7.5c0,4.08,3.32,7.4,7.4,7.4c0.68,0,1.35-0.09,1.99-0.27C17.45,17.19,14.93,19,12,19 c-3.86,0-7-3.14-7-7C5,9.07,6.81,6.55,9.37,5.51z M12,3c-4.97,0-9,4.03-9,9s4.03,9,9,9s9-4.03,9-9c0-0.46-0.04-0.92-0.1-1.36 c-0.98,1.37-2.58,2.26-4.4,2.26c-2.98,0-5.4-2.42-5.4-5.4c0-1.81,0.89-3.42,2.26-4.4C12.92,3.04,12.46,3,12,3L12,3z"/></svg>`;
36+
static title = "Toggle Light/Dark Mode";
37+
38+
static prefersLightModeInDarkModeKey = "prefers-light-mode-in-dark-mode";
39+
static prefersDarkModeInLightModeKey = "prefers-dark-mode-in-light-mode";
40+
41+
static callbackFunctions = [];
42+
43+
static _staticConstructor = (function () {
44+
DoxygenAwesomeDarkModeToggle.enableDarkMode(
45+
DoxygenAwesomeDarkModeToggle.userPreference
46+
);
47+
// Update the color scheme when the browsers preference changes
48+
// without user interaction on the website.
49+
window
50+
.matchMedia("(prefers-color-scheme: dark)")
51+
.addEventListener("change", (event) => {
52+
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged();
53+
});
54+
// Update the color scheme when the tab is made visible again.
55+
// It is possible that the appearance was changed in another tab
56+
// while this tab was in the background.
57+
document.addEventListener("visibilitychange", (visibilityState) => {
58+
if (document.visibilityState === "visible") {
59+
DoxygenAwesomeDarkModeToggle.onSystemPreferenceChanged();
60+
}
61+
});
62+
})();
63+
64+
static init() {
65+
$(function () {
66+
$(document).ready(function () {
67+
const toggleButton = document.createElement(
68+
"doxygen-awesome-dark-mode-toggle"
69+
);
70+
toggleButton.title = DoxygenAwesomeDarkModeToggle.title;
71+
toggleButton.updateIcon();
72+
73+
window
74+
.matchMedia("(prefers-color-scheme: dark)")
75+
.addEventListener("change", (event) => {
76+
toggleButton.updateIcon();
77+
});
78+
document.addEventListener("visibilitychange", (visibilityState) => {
79+
if (document.visibilityState === "visible") {
80+
toggleButton.updateIcon();
81+
}
5582
});
56-
}()
57-
58-
static init() {
59-
$(function() {
60-
$(document).ready(function() {
61-
const toggleButton = document.createElement('doxygen-awesome-dark-mode-toggle')
62-
toggleButton.title = DoxygenAwesomeDarkModeToggle.title
63-
toggleButton.updateIcon()
64-
65-
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', event => {
66-
toggleButton.updateIcon()
67-
})
68-
document.addEventListener("visibilitychange", visibilityState => {
69-
if (document.visibilityState === 'visible') {
70-
toggleButton.updateIcon()
71-
}
72-
});
73-
74-
$(document).ready(function(){
75-
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
76-
})
77-
$(window).resize(function(){
78-
document.getElementById("MSearchBox").parentNode.appendChild(toggleButton)
79-
})
80-
})
81-
})
82-
}
83-
84-
constructor() {
85-
super();
86-
this.onclick=this.toggleDarkMode
87-
}
88-
89-
/**
90-
* @returns `true` for dark-mode, `false` for light-mode system preference
91-
*/
92-
static get systemPreference() {
93-
return window.matchMedia('(prefers-color-scheme: dark)').matches
94-
}
95-
96-
/**
97-
* @returns `true` for dark-mode, `false` for light-mode user preference
98-
*/
99-
static get userPreference() {
100-
return (!DoxygenAwesomeDarkModeToggle.systemPreference && localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)) ||
101-
(DoxygenAwesomeDarkModeToggle.systemPreference && !localStorage.getItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey))
102-
}
10383

104-
static set userPreference(userPreference) {
105-
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference
106-
if(!userPreference) {
107-
if(DoxygenAwesomeDarkModeToggle.systemPreference) {
108-
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey, true)
109-
} else {
110-
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey)
111-
}
112-
} else {
113-
if(!DoxygenAwesomeDarkModeToggle.systemPreference) {
114-
localStorage.setItem(DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey, true)
115-
} else {
116-
localStorage.removeItem(DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey)
117-
}
118-
}
119-
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged()
84+
$(document).ready(function () {
85+
document
86+
.getElementById("MSearchBox")
87+
.parentNode.appendChild(toggleButton);
88+
});
89+
$(window).resize(function () {
90+
document
91+
.getElementById("MSearchBox")
92+
.parentNode.appendChild(toggleButton);
93+
});
94+
});
95+
});
96+
}
97+
98+
constructor() {
99+
super();
100+
this.onclick = this.toggleDarkMode;
101+
}
102+
103+
/**
104+
* @returns `true` for dark-mode, `false` for light-mode system preference
105+
*/
106+
static get systemPreference() {
107+
return window.matchMedia("(prefers-color-scheme: dark)").matches;
108+
}
109+
110+
/**
111+
* @returns `true` for dark-mode, `false` for light-mode user preference
112+
*/
113+
static get userPreference() {
114+
return (
115+
(!DoxygenAwesomeDarkModeToggle.systemPreference &&
116+
localStorage.getItem(
117+
DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey
118+
)) ||
119+
(DoxygenAwesomeDarkModeToggle.systemPreference &&
120+
!localStorage.getItem(
121+
DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey
122+
))
123+
);
124+
}
125+
126+
static set userPreference(userPreference) {
127+
DoxygenAwesomeDarkModeToggle.darkModeEnabled = userPreference;
128+
if (!userPreference) {
129+
if (DoxygenAwesomeDarkModeToggle.systemPreference) {
130+
localStorage.setItem(
131+
DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey,
132+
true
133+
);
134+
} else {
135+
localStorage.removeItem(
136+
DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey
137+
);
138+
}
139+
} else {
140+
if (!DoxygenAwesomeDarkModeToggle.systemPreference) {
141+
localStorage.setItem(
142+
DoxygenAwesomeDarkModeToggle.prefersDarkModeInLightModeKey,
143+
true
144+
);
145+
} else {
146+
localStorage.removeItem(
147+
DoxygenAwesomeDarkModeToggle.prefersLightModeInDarkModeKey
148+
);
149+
}
120150
}
121-
122-
static enableDarkMode(enable) {
123-
if(enable) {
124-
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true
125-
document.documentElement.classList.add("dark-mode")
126-
document.documentElement.classList.remove("light-mode")
127-
} else {
128-
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false
129-
document.documentElement.classList.remove("dark-mode")
130-
document.documentElement.classList.add("light-mode")
131-
}
151+
DoxygenAwesomeDarkModeToggle.onUserPreferenceChanged();
152+
}
153+
154+
static enableDarkMode(enable) {
155+
if (enable) {
156+
DoxygenAwesomeDarkModeToggle.darkModeEnabled = true;
157+
document.documentElement.classList.add("dark-mode");
158+
document.documentElement.classList.remove("light-mode");
159+
} else {
160+
DoxygenAwesomeDarkModeToggle.darkModeEnabled = false;
161+
document.documentElement.classList.remove("dark-mode");
162+
document.documentElement.classList.add("light-mode");
132163
}
133164

134-
static onSystemPreferenceChanged() {
135-
DoxygenAwesomeDarkModeToggle.darkModeEnabled = DoxygenAwesomeDarkModeToggle.userPreference
136-
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
165+
for (var i = 0; i < this.callbackFunctions.length; i++) {
166+
this.callbackFunctions[i]();
137167
}
138-
139-
static onUserPreferenceChanged() {
140-
DoxygenAwesomeDarkModeToggle.enableDarkMode(DoxygenAwesomeDarkModeToggle.darkModeEnabled)
168+
}
169+
170+
static onSystemPreferenceChanged() {
171+
DoxygenAwesomeDarkModeToggle.darkModeEnabled =
172+
DoxygenAwesomeDarkModeToggle.userPreference;
173+
DoxygenAwesomeDarkModeToggle.enableDarkMode(
174+
DoxygenAwesomeDarkModeToggle.darkModeEnabled
175+
);
176+
}
177+
178+
static onUserPreferenceChanged() {
179+
DoxygenAwesomeDarkModeToggle.enableDarkMode(
180+
DoxygenAwesomeDarkModeToggle.darkModeEnabled
181+
);
182+
}
183+
184+
toggleDarkMode() {
185+
DoxygenAwesomeDarkModeToggle.userPreference =
186+
!DoxygenAwesomeDarkModeToggle.userPreference;
187+
this.updateIcon();
188+
}
189+
190+
updateIcon() {
191+
if (DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
192+
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon;
193+
} else {
194+
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon;
141195
}
196+
}
142197

143-
toggleDarkMode() {
144-
DoxygenAwesomeDarkModeToggle.userPreference = !DoxygenAwesomeDarkModeToggle.userPreference
145-
this.updateIcon()
146-
}
147-
148-
updateIcon() {
149-
if(DoxygenAwesomeDarkModeToggle.darkModeEnabled) {
150-
this.innerHTML = DoxygenAwesomeDarkModeToggle.darkModeIcon
151-
} else {
152-
this.innerHTML = DoxygenAwesomeDarkModeToggle.lightModeIcon
153-
}
154-
}
198+
static onModeChange(callback) {
199+
this.callbackFunctions.push(callback);
200+
}
155201
}
156202

157-
customElements.define("doxygen-awesome-dark-mode-toggle", DoxygenAwesomeDarkModeToggle);
203+
customElements.define(
204+
"doxygen-awesome-dark-mode-toggle",
205+
DoxygenAwesomeDarkModeToggle
206+
);

0 commit comments

Comments
 (0)