-
-
Notifications
You must be signed in to change notification settings - Fork 12
Expand file tree
/
Copy pathThemeToggle.astro
More file actions
46 lines (41 loc) · 2 KB
/
ThemeToggle.astro
File metadata and controls
46 lines (41 loc) · 2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
---
/**
* Theme toggle button — switches between dark (default) and light mode.
* Uses localStorage to persist preference across sessions.
* Renders as a React island (client:load) for interactivity.
*/
---
<button
id="theme-toggle"
class="p-2 rounded-lg text-[--text-secondary] hover:text-[--text] hover:bg-[--surface-hover] transition-colors"
aria-label="Toggle theme"
>
{/* Sun icon — shown in dark mode (click to go light) */}
<svg class="w-5 h-5 hidden" id="theme-icon-sun" 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="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>
{/* Moon icon — shown in light mode (click to go dark) */}
<svg class="w-5 h-5" id="theme-icon-moon" 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>
</button>
<script is:inline>
(function() {
const btn = document.getElementById('theme-toggle');
const sunIcon = document.getElementById('theme-icon-sun');
const moonIcon = document.getElementById('theme-icon-moon');
function updateIcons() {
const isLight = document.documentElement.classList.contains('light');
if (sunIcon && moonIcon) {
sunIcon.classList.toggle('hidden', isLight);
moonIcon.classList.toggle('hidden', !isLight);
}
}
updateIcons();
btn?.addEventListener('click', () => {
const isLight = document.documentElement.classList.toggle('light');
localStorage.setItem('theme', isLight ? 'light' : 'dark');
updateIcons();
});
})();
</script>