Skip to content

Commit

Permalink
Inline color mode switcher code to reduce flashing
Browse files Browse the repository at this point in the history
  • Loading branch information
ColdHeat committed Aug 28, 2024
1 parent e87f42c commit 833f6cc
Show file tree
Hide file tree
Showing 4 changed files with 53 additions and 9 deletions.
1 change: 0 additions & 1 deletion static/assets/color_mode_switcher.52334129.js

This file was deleted.

5 changes: 0 additions & 5 deletions static/manifest.json
Original file line number Diff line number Diff line change
Expand Up @@ -116,11 +116,6 @@
"assets/js/index.js"
]
},
"assets/js/color_mode_switcher.js": {
"file": "assets/color_mode_switcher.52334129.js",
"src": "assets/js/color_mode_switcher.js",
"isEntry": true
},
"_echarts.128204f2.js": {
"file": "assets/echarts.128204f2.js"
},
Expand Down
55 changes: 53 additions & 2 deletions templates/base.html
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,59 @@
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="shortcut icon" href="{{ Configs.ctf_small_icon }}" type="image/x-icon">

<script>
"use strict";

/**
* Get user preferred theme from their past choice or browser
* @returns {String} User preferred theme
*/
function getPreferredTheme() {
const storedTheme = localStorage.getItem("theme");
if (storedTheme) {
return storedTheme;
}
// Firefox with 'resistFingerprint' activated always returns light
return window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light";
}

/**
* Update navbar icon to match given theme.
* @param {String} theme - 'dark' or 'light'
*/
function showActiveTheme(theme) {
const activeThemeIcon = document.querySelector(".theme-switch i.fas");
activeThemeIcon.classList.toggle("fa-moon", theme === "dark");
activeThemeIcon.classList.toggle("fa-sun", theme !== "dark");
}

// Change body theme early to prevent flash
let currentTheme = getPreferredTheme();
document.documentElement.setAttribute("data-bs-theme", currentTheme);

// On browser color-scheme change, update
window.matchMedia("(prefers-color-scheme: dark)").addEventListener("change", () => {
currentTheme = getPreferredTheme();
document.documentElement.setAttribute("data-bs-theme", currentTheme);
showActiveTheme(currentTheme);
});

window.addEventListener("load", () => {
showActiveTheme(currentTheme);

// On button click, switch
document.querySelectorAll(".theme-switch").forEach(e => {
e.addEventListener("click", ev => {
currentTheme = currentTheme === "light" ? "dark" : "light";
document.documentElement.setAttribute("data-bs-theme", currentTheme);
localStorage.setItem("theme", currentTheme);
showActiveTheme(currentTheme);
ev.preventDefault();
});
});
});
</script>

{{ meta | safe }}

{% block stylesheets %}
Expand All @@ -14,8 +67,6 @@

{{ Plugins.styles }}

{{ Assets.js("assets/js/color_mode_switcher.js", defer=False) }}

<script type="text/javascript">
window.init = {
'urlRoot': "{{ request.script_root }}",
Expand Down
1 change: 0 additions & 1 deletion vite.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,6 @@ export default defineConfig({
users_private: resolve(__dirname, "assets/js/users/private.js"),
users_list: resolve(__dirname, "assets/js/users/list.js"),
main: resolve(__dirname, "assets/scss/main.scss"),
color_mode_switcher: resolve(__dirname, "assets/js/color_mode_switcher.js"),
},
},
},
Expand Down

0 comments on commit 833f6cc

Please sign in to comment.