feat: enhance theme toggle functionality with auto theme support and icon updates. Fix #243

This commit is contained in:
Will Miao
2025-06-21 20:43:44 +08:00
parent ba2e42b06e
commit c3dd4da11b
4 changed files with 62 additions and 7 deletions

View File

@@ -115,7 +115,8 @@
} }
.theme-toggle .light-icon, .theme-toggle .light-icon,
.theme-toggle .dark-icon { .theme-toggle .dark-icon,
.theme-toggle .auto-icon {
position: absolute; position: absolute;
top: 50%; top: 50%;
left: 50%; left: 50%;
@@ -124,15 +125,38 @@
transition: opacity 0.3s ease; transition: opacity 0.3s ease;
} }
/* Default state shows dark icon */
.theme-toggle .dark-icon { .theme-toggle .dark-icon {
opacity: 1; opacity: 1;
} }
[data-theme="light"] .theme-toggle .light-icon { /* Light theme shows light icon */
.theme-toggle.theme-light .light-icon {
opacity: 1; opacity: 1;
} }
[data-theme="light"] .theme-toggle .dark-icon { .theme-toggle.theme-light .dark-icon,
.theme-toggle.theme-light .auto-icon {
opacity: 0;
}
/* Dark theme shows dark icon */
.theme-toggle.theme-dark .dark-icon {
opacity: 1;
}
.theme-toggle.theme-dark .light-icon,
.theme-toggle.theme-dark .auto-icon {
opacity: 0;
}
/* Auto theme shows auto icon */
.theme-toggle.theme-auto .auto-icon {
opacity: 1;
}
.theme-toggle.theme-auto .light-icon,
.theme-toggle.theme-auto .dark-icon {
opacity: 0; opacity: 0;
} }

View File

@@ -46,9 +46,21 @@ export class HeaderManager {
// Handle theme toggle // Handle theme toggle
const themeToggle = document.querySelector('.theme-toggle'); const themeToggle = document.querySelector('.theme-toggle');
if (themeToggle) { if (themeToggle) {
// Set initial state based on current theme
const currentTheme = localStorage.getItem('lm_theme') || 'auto';
themeToggle.classList.add(`theme-${currentTheme}`);
themeToggle.addEventListener('click', () => { themeToggle.addEventListener('click', () => {
if (typeof toggleTheme === 'function') { if (typeof toggleTheme === 'function') {
toggleTheme(); const newTheme = toggleTheme();
// Update tooltip based on next toggle action
if (newTheme === 'light') {
themeToggle.title = "Switch to dark theme";
} else if (newTheme === 'dark') {
themeToggle.title = "Switch to auto theme";
} else {
themeToggle.title = "Switch to light theme";
}
} }
}); });
} }

View File

@@ -118,10 +118,13 @@ export function toggleTheme() {
const currentTheme = getStorageItem('theme') || 'auto'; const currentTheme = getStorageItem('theme') || 'auto';
let newTheme; let newTheme;
if (currentTheme === 'dark') { // Cycle through themes: light → dark → auto → light
newTheme = 'light'; if (currentTheme === 'light') {
} else {
newTheme = 'dark'; newTheme = 'dark';
} else if (currentTheme === 'dark') {
newTheme = 'auto';
} else {
newTheme = 'light';
} }
setStorageItem('theme', newTheme); setStorageItem('theme', newTheme);
@@ -151,6 +154,21 @@ function applyTheme(theme) {
htmlElement.setAttribute('data-theme', 'light'); htmlElement.setAttribute('data-theme', 'light');
document.body.dataset.theme = 'light'; document.body.dataset.theme = 'light';
} }
// Update the theme-toggle icon state
updateThemeToggleIcons(theme);
}
// New function to update theme toggle icons
function updateThemeToggleIcons(theme) {
const themeToggle = document.querySelector('.theme-toggle');
if (!themeToggle) return;
// Remove any existing active classes
themeToggle.classList.remove('theme-light', 'theme-dark', 'theme-auto');
// Add the appropriate class based on current theme
themeToggle.classList.add(`theme-${theme}`);
} }
export function toggleFolder(tag) { export function toggleFolder(tag) {

View File

@@ -39,6 +39,7 @@
<div class="theme-toggle" title="Toggle theme"> <div class="theme-toggle" title="Toggle theme">
<i class="fas fa-moon dark-icon"></i> <i class="fas fa-moon dark-icon"></i>
<i class="fas fa-sun light-icon"></i> <i class="fas fa-sun light-icon"></i>
<i class="fas fa-adjust auto-icon"></i>
</div> </div>
<div class="settings-toggle" title="Settings"> <div class="settings-toggle" title="Settings">
<i class="fas fa-cog"></i> <i class="fas fa-cog"></i>