103 lines
2.7 KiB
HTML
103 lines
2.7 KiB
HTML
<div class="theme-toggle">
|
|
<input type="checkbox" id="theme-switch">
|
|
<label for="theme-switch">
|
|
<div class="toggle"></div>
|
|
<div class="names">
|
|
<p class="light">Light</p>
|
|
<p class="dark">Dark</p>
|
|
</div>
|
|
</label>
|
|
</div>
|
|
|
|
{%- assign name = 'night_mode' -%}
|
|
{%- include functions.html func='get_value' default='auto' -%}
|
|
{%- assign night_mode = return -%}
|
|
|
|
<script>
|
|
(function() {
|
|
var sw = document.getElementById('theme-switch');
|
|
var html = document.getElementsByTagName('html')[0];
|
|
var themeData = loadThemeData();
|
|
|
|
function saveThemeData(data) {
|
|
localStorage.setItem('theme', JSON.stringify(data));
|
|
}
|
|
|
|
function loadThemeData() {
|
|
var data = localStorage.getItem('theme');
|
|
try {
|
|
data = JSON.parse(data ? data : '');
|
|
} catch(e) {
|
|
data = { nightShift: false, autoToggleAt: 0 };
|
|
saveThemeData(data);
|
|
}
|
|
return data;
|
|
}
|
|
|
|
function handleThemeToggle(nightShift) {
|
|
themeData.nightShift = nightShift;
|
|
saveThemeData(themeData);
|
|
html.dataset.theme = nightShift ? 'dark' : 'light';
|
|
setTimeout(function() {
|
|
sw.checked = nightShift ? true : false;
|
|
}, 50);
|
|
}
|
|
|
|
function autoThemeToggle() {
|
|
// Next time point of theme toggle
|
|
var now = new Date();
|
|
var toggleAt = new Date();
|
|
var hours = now.getHours();
|
|
var nightShift = hours >= 19 || hours <=7;
|
|
|
|
if (nightShift) {
|
|
if (hours > 7) {
|
|
toggleAt.setDate(toggleAt.getDate() + 1);
|
|
}
|
|
toggleAt.setHours(7);
|
|
} else {
|
|
toggleAt.setHours(19);
|
|
}
|
|
|
|
toggleAt.setMinutes(0);
|
|
toggleAt.setSeconds(0);
|
|
toggleAt.setMilliseconds(0)
|
|
|
|
var delay = toggleAt.getTime() - now.getTime();
|
|
|
|
// auto toggle theme mode
|
|
setTimeout(function() {
|
|
handleThemeToggle(!nightShift);
|
|
}, delay);
|
|
|
|
return {
|
|
nightShift: nightShift,
|
|
toggleAt: toggleAt.getTime()
|
|
};
|
|
}
|
|
|
|
// Listen the theme toggle event
|
|
sw.addEventListener('change', function(event) {
|
|
handleThemeToggle(event.target.checked);
|
|
});
|
|
|
|
var nightModeOption = '{{ night_mode }}';
|
|
nightModeOption = nightModeOption.toLowerCase();
|
|
|
|
if (nightModeOption == 'auto') {
|
|
var data = autoThemeToggle();
|
|
|
|
// Toggle theme by local setting
|
|
if (data.toggleAt > themeData.autoToggleAt) {
|
|
themeData.autoToggleAt = data.toggleAt;
|
|
handleThemeToggle(data.nightShift);
|
|
} else {
|
|
handleThemeToggle(themeData.nightShift);
|
|
}
|
|
} else if (nightModeOption == 'manual') {
|
|
handleThemeToggle(themeData.nightShift);
|
|
} else {
|
|
handleThemeToggle(nightModeOption == 'on');
|
|
}
|
|
})();
|
|
</script>
|