A simple and efficient dark mode manager for Svelte 5, supporting user preference persistence, system preference detection, and easy toggling.
- Automatically syncs with system preferences (
prefers-color-scheme
) - Stores user preference in
localStorage
- Provides API for getting, setting, and toggling dark mode
- Updates the DOM to apply dark mode via CSS class
npm install dark-mode-svelte
<script>
import { DarkMode, darkMode } from 'dark-mode-svelte';
</script>
To prevent flashing from light to dark, place the <DarkMode />
component as close to your
root component as possible. In Sveltekit this is usually your first +layout.svelte
.
<DarkMode />
console.log(darkMode.mode); // 'light' or 'dark'
// Explicitly set mode darkMode.mode = 'dark'; // Set to dark mode darkMode.mode = 'light'; // Set
to light mode darkMode.mode = undefined; // Reset to system preference
<button on:click={() => darkMode.toggle()}>
Toggle {darkMode.mode === 'dark' ? '🌞' : '🌙'}
</button>
- User Preference
- If the user has explicitly set a theme (light/dark), that setting is used in localStorage.
- **System Preference **
- If no user preference exists, the system's preference is used.
- Default Mode
- If neither a user preference nor a system preference exists, the default is
light
.
- If neither a user preference nor a system preference exists, the default is
- Getter: Returns the current theme mode (
'light'
or'dark'
), considering user and system preferences. - Setter: Updates the theme mode. Setting it to
undefined
resets it to follow system preference.
Toggles between light and dark mode.
The component toggles a dark
class on document.documentElement
. Use CSS to define dark mode styles:
/* Light Mode */
body {
background-color: white;
color: black;
}
/* Dark Mode */
.dark body {
background-color: black;
color: white;
}
MIT License. Feel free to use and modify it.
Pull requests and improvements are welcome! If you find any issues, feel free to open an issue or create a PR.