fix(theme-toggle): Implement proper sun/moon icons and JS toggling

This commit is contained in:
2026-02-17 20:12:45 +01:00
parent 2197c4408d
commit 19b91eb9e4
2 changed files with 27 additions and 4 deletions

View File

@@ -49,14 +49,33 @@ document.addEventListener('DOMContentLoaded', () => {
// Theme Switcher // Theme Switcher
const themeToggle = document.getElementById('theme-toggle'); const themeToggle = document.getElementById('theme-toggle');
// const htmlElement = document.documentElement; // Already defined above const sunIcon = document.getElementById('theme-toggle-sun-icon');
const moonIcon = document.getElementById('theme-toggle-moon-icon');
const setThemeIcons = (theme) => {
if (sunIcon && moonIcon) {
if (theme === 'dark') {
sunIcon.classList.remove('hidden');
moonIcon.classList.add('hidden');
} else {
sunIcon.classList.add('hidden');
moonIcon.classList.remove('hidden');
}
}
};
const currentTheme = localStorage.getItem('theme'); const currentTheme = localStorage.getItem('theme');
if (currentTheme) { if (currentTheme) {
htmlElement.setAttribute('data-theme', currentTheme); htmlElement.setAttribute('data-theme', currentTheme);
setThemeIcons(currentTheme);
} else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) { } else if (window.matchMedia && window.matchMedia('(prefers-color-scheme: light)').matches) {
// Default to light theme if system preference is light // Default to light theme if system preference is light
htmlElement.setAttribute('data-theme', 'light'); htmlElement.setAttribute('data-theme', 'light');
setThemeIcons('light');
} else {
// Default to dark theme if no preference
htmlElement.setAttribute('data-theme', 'dark');
setThemeIcons('dark');
} }
if (themeToggle) { if (themeToggle) {
@@ -64,6 +83,7 @@ document.addEventListener('DOMContentLoaded', () => {
let newTheme = htmlElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark'; let newTheme = htmlElement.getAttribute('data-theme') === 'dark' ? 'light' : 'dark';
htmlElement.setAttribute('data-theme', newTheme); htmlElement.setAttribute('data-theme', newTheme);
localStorage.setItem('theme', newTheme); localStorage.setItem('theme', newTheme);
setThemeIcons(newTheme);
}); });
} }

View File

@@ -7,9 +7,12 @@
<div class="flex items-center"> <div class="flex items-center">
<nav class="hidden md:flex flex-wrap items-center justify-center"> <nav class="hidden md:flex flex-wrap items-center justify-center">
{{navigation type="primary"}} {{navigation type="primary"}}
<button id="theme-toggle" class="ml-4 p-2 rounded-full bg-[var(--bg-secondary)] text-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors duration-200"> <button id="theme-toggle" class="ml-4 p-2 rounded-full bg-[var(--bg-secondary)] stroke-[var(--text-primary)] hover:bg-[var(--bg-tertiary)] transition-colors duration-200">
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="currentColor" class="w-5 h-5"> <svg id="theme-toggle-sun-icon" class="theme-toggle-dark-icon w-5 h-5" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path fill-rule="evenodd" d="M12 2.25a.75.75 0 01.75.75v2.25a.75.75 0 01-1.5 0V3a.75.75 0 01.75-.75zM7.5 12a.75.75 0 01-.75.75H4.5a.75.75 0 010-1.5h2.25c.414 0 .75.336.75.75zM12 18.75a.75.75 0 01.75.75V21a.75.75 0 01-1.5 0v-2.25a.75.75 0 01.75-.75zM19.5 12a.75.75 0 01-.75.75h-2.25a.75.75 0 010-1.5h2.25c.414 0 .75.336.75.75zM12 3.75a8.25 8.25 0 100 16.5A8.25 8.25 0 0012 3.75zm1.625 1.5l-.25-.375a.75.75 0 00-1.25 0l-.25.375a.75.75 0 00.625 1.125h.5a.75.75 0 00.625-1.125z" clip-rule="evenodd" /> <path stroke-linecap="round" stroke-linejoin="round" d="M12 3v2.25m6.364.386-1.591 1.591M21 12h-2.25m-.386 6.364-1.591-1.591M12 18.75V21m-4.773-4.227-1.591 1.591M5.25 12H3m4.227-4.773L5.636 5.636M15.75 12a3.75 3.75 0 1 1-7.5 0 3.75 3.75 0 0 1 7.5 0Z" />
</svg>
<svg id="theme-toggle-moon-icon" class="theme-toggle-light-icon w-5 h-5 hidden" xmlns="http://www.w3.org/2000/svg" fill="none" viewBox="0 0 24 24" stroke-width="1.5" stroke="currentColor">
<path stroke-linecap="round" stroke-linejoin="round" d="M21.752 15.002A9.72 9.72 0 0 1 18 15.75c-5.385 0-9.75-4.365-9.75-9.75 0-1.33.266-2.597.748-3.752A9.753 9.753 0 0 0 3 11.25C3 16.635 7.365 21 12.75 21a9.753 9.753 0 0 0 9.002-5.998Z" />
</svg> </svg>
</button> </button>
</nav> </nav>