2020-02-11 19:04:59 +03:00
|
|
|
|
<!--
|
|
|
|
|
Switch the mode between dark and light.
|
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
<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() {
|
2020-12-10 21:20:18 +03:00
|
|
|
|
if (this.hasMode) {
|
|
|
|
|
if (this.isDarkMode) {
|
2020-04-01 19:30:00 +03:00
|
|
|
|
if (!this.isSysDarkPrefer) {
|
2020-02-14 18:36:38 +03:00
|
|
|
|
this.setDark();
|
|
|
|
|
}
|
|
|
|
|
} else {
|
2020-04-01 19:30:00 +03:00
|
|
|
|
if (this.isSysDarkPrefer) {
|
2020-02-14 18:36:38 +03:00
|
|
|
|
this.setLight();
|
|
|
|
|
}
|
2020-02-11 19:04:59 +03:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
let self = this;
|
2020-02-11 19:04:59 +03:00
|
|
|
|
|
2020-02-14 18:36:38 +03:00
|
|
|
|
/* always follow the system prefers */
|
2021-12-01 14:51:25 +03:00
|
|
|
|
this.sysDarkPrefers.addEventListener("change", () => {
|
2020-12-09 21:42:46 +03:00
|
|
|
|
if (self.hasMode) {
|
|
|
|
|
if (self.isDarkMode) {
|
2020-04-01 19:30:00 +03:00
|
|
|
|
if (!self.isSysDarkPrefer) {
|
2020-02-14 18:36:38 +03:00
|
|
|
|
self.setDark();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
2020-04-01 19:30:00 +03:00
|
|
|
|
if (self.isSysDarkPrefer) {
|
2020-02-14 18:36:38 +03:00
|
|
|
|
self.setLight();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
self.clearMode();
|
2020-02-11 19:04:59 +03:00
|
|
|
|
}
|
2020-12-09 21:42:46 +03:00
|
|
|
|
|
|
|
|
|
self.updateMermaid();
|
2020-02-11 19:04:59 +03:00
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
} /* constructor() */
|
|
|
|
|
|
2020-04-01 19:30:00 +03:00
|
|
|
|
get sysDarkPrefers() { return window.matchMedia("(prefers-color-scheme: dark)"); }
|
2020-02-11 19:04:59 +03:00
|
|
|
|
|
2020-04-01 19:30:00 +03:00
|
|
|
|
get isSysDarkPrefer() { return this.sysDarkPrefers.matches; }
|
2020-02-11 19:04:59 +03:00
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
get isDarkMode() { return this.mode === ModeToggle.DARK_MODE; }
|
2020-04-01 19:30:00 +03:00
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
get isLightMode() { return this.mode === ModeToggle.LIGHT_MODE; }
|
2020-04-01 19:30:00 +03:00
|
|
|
|
|
|
|
|
|
get hasMode() { return this.mode != null; }
|
|
|
|
|
|
|
|
|
|
get mode() { return sessionStorage.getItem(ModeToggle.MODE_KEY); }
|
2020-02-11 19:04:59 +03:00
|
|
|
|
|
2020-12-09 21:42:46 +03:00
|
|
|
|
/* get the current mode on screen */
|
|
|
|
|
get modeStatus() {
|
|
|
|
|
if (this.isDarkMode
|
2021-12-01 14:51:25 +03:00
|
|
|
|
|| (!this.hasMode && this.isSysDarkPrefer)) {
|
2020-12-09 21:42:46 +03:00
|
|
|
|
return ModeToggle.DARK_MODE;
|
|
|
|
|
} else {
|
|
|
|
|
return ModeToggle.LIGHT_MODE;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
setDark() {
|
|
|
|
|
$('html').attr(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
|
|
|
|
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.DARK_MODE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
setLight() {
|
|
|
|
|
$('html').attr(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
|
|
|
|
sessionStorage.setItem(ModeToggle.MODE_KEY, ModeToggle.LIGHT_MODE);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
clearMode() {
|
|
|
|
|
$('html').removeAttr(ModeToggle.MODE_KEY);
|
|
|
|
|
sessionStorage.removeItem(ModeToggle.MODE_KEY);
|
|
|
|
|
}
|
|
|
|
|
|
2020-12-09 21:42:46 +03:00
|
|
|
|
updateMermaid() {
|
2020-12-10 21:20:18 +03:00
|
|
|
|
if (typeof mermaid !== "undefined") {
|
2020-12-09 21:42:46 +03:00
|
|
|
|
let expectedTheme = (this.modeStatus === ModeToggle.DARK_MODE? "dark" : "default");
|
|
|
|
|
let config = { theme: expectedTheme };
|
|
|
|
|
|
|
|
|
|
/* re-render the SVG › <https://github.com/mermaid-js/mermaid/issues/311#issuecomment-332557344> */
|
|
|
|
|
$(".mermaid").each(function() {
|
|
|
|
|
let svgCode = $(this).prev().children().html();
|
|
|
|
|
$(this).removeAttr("data-processed");
|
|
|
|
|
$(this).html(svgCode);
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
mermaid.initialize(config);
|
|
|
|
|
mermaid.init(undefined, ".mermaid");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
} /* ModeToggle */
|
|
|
|
|
|
|
|
|
|
const toggle = new ModeToggle();
|
2020-02-14 18:36:38 +03:00
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
function flipMode() {
|
|
|
|
|
if (toggle.hasMode) {
|
|
|
|
|
if (toggle.isSysDarkPrefer) {
|
|
|
|
|
if (toggle.isLightMode) {
|
|
|
|
|
toggle.clearMode();
|
2020-04-01 19:30:00 +03:00
|
|
|
|
} else {
|
2021-12-01 14:51:25 +03:00
|
|
|
|
toggle.setLight();
|
2020-04-01 19:30:00 +03:00
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
} else {
|
2021-12-01 14:51:25 +03:00
|
|
|
|
if (toggle.isDarkMode) {
|
|
|
|
|
toggle.clearMode();
|
2020-04-01 19:30:00 +03:00
|
|
|
|
} else {
|
2021-12-01 14:51:25 +03:00
|
|
|
|
toggle.setDark();
|
2020-04-01 19:30:00 +03:00
|
|
|
|
}
|
2020-02-11 19:04:59 +03:00
|
|
|
|
}
|
2020-04-01 19:30:00 +03:00
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
} else {
|
|
|
|
|
if (toggle.isSysDarkPrefer) {
|
|
|
|
|
toggle.setLight();
|
|
|
|
|
} else {
|
|
|
|
|
toggle.setDark();
|
|
|
|
|
}
|
|
|
|
|
}
|
2020-12-09 21:42:46 +03:00
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
toggle.updateMermaid();
|
2020-02-11 19:04:59 +03:00
|
|
|
|
|
2021-12-01 14:51:25 +03:00
|
|
|
|
} /* flipMode() */
|
2021-11-30 19:23:22 +03:00
|
|
|
|
|
2020-10-23 10:42:43 +03:00
|
|
|
|
</script>
|