2026-05-16 04:24:10 +08:00

118 lines
4.2 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

const sidebar = document.querySelector(".sidebar-content");
const menuButton = document.querySelector(".appbar-menu-button");
const displayModeMenu = document.querySelector(".appbar-display-mode");
const displayModeButtonIcon = document.querySelector(".appbar-display-mode-icon");
const BREAKPOINT = 840;
// 从localStorage读取保存的设置如果没有则使用默认值
const savedSidebarState = localStorage.getItem('sidebarOpen');
const savedDisplayMode = localStorage.getItem('displayMode');
// 初始化侧边栏状态
if (savedSidebarState !== null) {
// 如果有保存的状态,则使用保存的状态
sidebar.open = savedSidebarState === 'true';
} else {
// 如果没有保存的状态,则根据屏幕宽度决定默认状态
sidebar.open = window.innerWidth >= BREAKPOINT;
}
// 初始化显示模式
let displayMode;
if (savedDisplayMode !== null) {
// 如果有保存的模式,则使用保存的模式
displayMode = savedDisplayMode;
displayModeMenu.value = displayMode;
} else {
// 如果没有保存的模式,则使用默认值
displayMode = displayModeMenu.value;
}
displayModeButtonIcon.name = `${displayMode}_mode`;
// 应用显示模式
if (displayMode === 'dark') {
document.body.classList.add('mdui-theme-dark');
document.body.classList.remove('mdui-theme-light');
} else if (displayMode === 'light') {
document.body.classList.add('mdui-theme-light');
document.body.classList.remove('mdui-theme-dark');
} else {
// auto mode - 根据系统设置决定
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('mdui-theme-dark');
document.body.classList.remove('mdui-theme-light');
} else {
document.body.classList.add('mdui-theme-light');
document.body.classList.remove('mdui-theme-dark');
}
}
function changeSidebarState() {
sidebar.open = !sidebar.open;
// 保存侧边栏状态到localStorage
localStorage.setItem('sidebarOpen', sidebar.open);
}
function changeDisplayMode() {
displayMode = displayModeMenu.value;
displayModeButtonIcon.name = `${displayMode}_mode`;
// 移除所有主题类
document.body.classList.remove('mdui-theme-light', 'mdui-theme-dark');
// 应用新主题
if (displayMode === 'dark') {
document.body.classList.add('mdui-theme-dark');
} else if (displayMode === 'light') {
document.body.classList.add('mdui-theme-light');
} else {
// auto mode - 根据系统设置决定
if (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) {
document.body.classList.add('mdui-theme-dark');
} else {
document.body.classList.add('mdui-theme-light');
}
}
// 保存显示模式到localStorage
localStorage.setItem('displayMode', displayMode);
}
// 监听系统主题变化
window.matchMedia('(prefers-color-scheme: dark)').addEventListener('change', e => {
// 只有在auto模式下才响应系统主题变化
if (displayMode === 'auto') {
document.body.classList.remove('mdui-theme-light', 'mdui-theme-dark');
if (e.matches) {
document.body.classList.add('mdui-theme-dark');
} else {
document.body.classList.add('mdui-theme-light');
}
}
});
// 定期检查侧边栏状态并保存到localStorage
setInterval(() => {
localStorage.setItem('sidebarOpen', sidebar.open);
}, 1000);
// 监听窗口大小变化自动调整侧边栏状态但不保存到localStorage
window.addEventListener('resize', function() {
if (window.innerWidth >= BREAKPOINT) {
// 大屏幕时,恢复用户保存的侧边栏状态
const savedState = localStorage.getItem('sidebarOpen');
if (savedState !== null) {
sidebar.open = savedState === 'true';
} else {
// 如果没有保存的状态,默认打开
sidebar.open = true;
}
} else {
// 小屏幕时,关闭侧边栏(但不修改保存的状态)
sidebar.open = false;
}
});
menuButton.addEventListener("click", changeSidebarState);
displayModeMenu.addEventListener("change", changeDisplayMode);