must have tailwind
// tailwind.config.mjs
export default {
...
darkMode: 'selector',
...
}
<script> | |
import { onMount } from "svelte"; | |
import { writable } from "svelte/store"; | |
const theme = writable("light"); | |
onMount(() => { | |
const storedTheme = localStorage.getItem("theme"); | |
if (storedTheme) theme.set(storedTheme); | |
theme.subscribe((value) => { | |
document.documentElement.classList.toggle("dark", value === "dark"); | |
localStorage.setItem("theme", value); | |
}); | |
}); | |
const toggleTheme = (e) => { | |
theme.update((value) => (value === "light" ? "dark" : "light")); | |
}; | |
</script> | |
<button | |
id="themeToggle" | |
on:click={(e) => { | |
toggleTheme(e); | |
}} | |
> | |
<svg width="30px" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24"> | |
<path | |
class="sun" | |
fill-rule="evenodd" | |
d="M12 17.5a5.5 5.5 0 1 0 0-11 5.5 5.5 0 0 0 0 11zm0 1.5a7 7 0 1 0 0-14 7 7 0 0 0 0 14zm12-7a.8.8 0 0 1-.8.8h-2.4a.8.8 0 0 1 0-1.6h2.4a.8.8 0 0 1 .8.8zM4 12a.8.8 0 0 1-.8.8H.8a.8.8 0 0 1 0-1.6h2.5a.8.8 0 0 1 .8.8zm16.5-8.5a.8.8 0 0 1 0 1l-1.8 1.8a.8.8 0 0 1-1-1l1.7-1.8a.8.8 0 0 1 1 0zM6.3 17.7a.8.8 0 0 1 0 1l-1.7 1.8a.8.8 0 1 1-1-1l1.7-1.8a.8.8 0 0 1 1 0zM12 0a.8.8 0 0 1 .8.8v2.5a.8.8 0 0 1-1.6 0V.8A.8.8 0 0 1 12 0zm0 20a.8.8 0 0 1 .8.8v2.4a.8.8 0 0 1-1.6 0v-2.4a.8.8 0 0 1 .8-.8zM3.5 3.5a.8.8 0 0 1 1 0l1.8 1.8a.8.8 0 1 1-1 1L3.5 4.6a.8.8 0 0 1 0-1zm14.2 14.2a.8.8 0 0 1 1 0l1.8 1.7a.8.8 0 0 1-1 1l-1.8-1.7a.8.8 0 0 1 0-1z" | |
></path> | |
<path | |
class="moon" | |
fill-rule="evenodd" | |
d="M16.5 6A10.5 10.5 0 0 1 4.7 16.4 8.5 8.5 0 1 0 16.4 4.7l.1 1.3zm-1.7-2a9 9 0 0 1 .2 2 9 9 0 0 1-11 8.8 9.4 9.4 0 0 1-.8-.3c-.4 0-.8.3-.7.7a10 10 0 0 0 .3.8 10 10 0 0 0 9.2 6 10 10 0 0 0 4-19.2 9.7 9.7 0 0 0-.9-.3c-.3-.1-.7.3-.6.7a9 9 0 0 1 .3.8z" | |
></path> | |
</svg> | |
</button> | |
<style> | |
.sun { | |
fill: black; | |
} | |
.moon { | |
fill: transparent; | |
} | |
:global(.dark) .sun { | |
fill: transparent; | |
} | |
:global(.dark) .moon { | |
fill: white; | |
} | |
</style> |