krata/_includes/mode-toggle.html

102 lines
2.2 KiB
HTML
Raw Normal View History

<!--
Switch the mode between dark and light.
v2.1
https://github.com/cotes2020/jekyll-theme-chirpy
© 2020 Cotes Chung
MIT License
-->
2020-02-14 16:36:38 +01:00
<i class="mode-toggle fas fa-sun" light-mode-invisible></i>
<i class="mode-toggle fas fa-moon" dark-mode-invisible></i>
<script type="text/javascript">
class ModeToggle {
static get MODE_KEY() { return "mode"; }
static get DARK_MODE() { return "dark"; }
static get LIGHT_MODE() { return "light"; }
constructor() {
if (this.mode != null) {
if (this.mode == ModeToggle.DARK_MODE) {
2020-02-14 16:36:38 +01:00
if (!this.isDarkPrefer) {
this.setDark();
}
} else {
if (this.isDarkPrefer) {
this.setLight();
}
}
}
var self = this;
2020-02-14 16:36:38 +01:00
/* always follow the system prefers */
this.sysDarkPrefers.addListener(function() {
2020-02-14 16:36:38 +01:00
if (self.mode != null) {
if (self.mode == ModeToggle.DARK_MODE) {
if (!self.isDarkPrefer) {
self.setDark();
}
} else {
if (self.isDarkPrefer) {
self.setLight();
}
}
self.clearMode();
}
});
} /* constructor() */
2020-02-14 16:36:38 +01:00
setDark() {
$('html').attr(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
}
2020-02-14 16:36:38 +01:00
setLight() {
$('html').attr(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
}
2020-02-14 16:36:38 +01:00
clearMode() {
$('html').removeAttr(ModeToggle.MODE_KEY);
sessionStorage.removeItem(ModeToggle.MODE_KEY);
}
get sysDarkPrefers() {
return window.matchMedia("(prefers-color-scheme: dark)");
}
2020-02-14 16:36:38 +01:00
get isDarkPrefer() {
return this.sysDarkPrefers.matches;
}
get mode() {
return sessionStorage.getItem(ModeToggle.MODE_KEY);
}
flipMode() {
2020-02-14 16:36:38 +01:00
if ((this.mode == null && this.isDarkPrefer) ||
this.mode == ModeToggle.DARK_MODE) {
2020-02-14 16:36:38 +01:00
this.setLight();
} else { /* light mode or default-light */
2020-02-14 16:36:38 +01:00
this.setDark();
}
}
} /* ModeToggle */
let toggle = new ModeToggle();
2020-02-14 16:36:38 +01:00
$(".mode-toggle").click(function() {
toggle.flipMode();
});
</script>