svelte-multi-theme
v1.0.0
Published
This library is a port of [next-theme](https://github.com/pacocoursey/next-themes/) for SvelteKit. All credit goes to [pacocoursey](https://github.com/pacocoursey) and all [next-themes contributors](https://github.com/pacocoursey/next-themes/graphs/contri
Downloads
9
Maintainers
Readme
This library is a port of next-theme for SvelteKit. All credit goes to pacocoursey and all next-themes contributors
While usable, this library is still in its early phase, PR are welcome.
svelte-themes
An abstraction for themes in your SvelteKit.js app.
- ✅ Perfect dark mode in 2 lines of code
- ✅ System setting with prefers-color-scheme
- ✅ Themed browser UI with color-scheme
- ✅ No flash on load
- ✅ Sync theme across tabs and windows
- ✅ Disable flashing when changing themes
- ✅ Force pages to specific themes
- ✅ Class or data attribute selector
- ✅ Theme store
Check out the Live Example to try it for yourself.
Install
$ pnpm add svelte-themes
# or
$ npm install svelte-themes
# or
$ yarn add svelte-themes
Using svelte-themes
In order to use svelte-themes you will need to add SvelteTheme
inside your __layout component
.
// pages/__layout.svelte
<script>
import SvelteTheme from 'svelte-themes/SvelteTheme.svelte';
</script>
<SvelteTheme />
<slot />
Props
storageKey = 'theme'
: Key used to store theme setting in localStoragedefaultTheme = 'system'
: Default theme name. IfenableSystem
is false, the default theme islight
forcedTheme
: Forced theme name for the current page (does not modify saved theme settings)enableSystem = true
: Whether to switch betweendark
andlight
based onprefers-color-scheme
enableColorScheme = true
: Whether to indicate to browsers which color scheme is used (dark or light) for built-in UI like inputs and buttonsdisableTransitionOnChange = false
: Optionally disable all CSS transitions when switching themesthemes = ['light', 'dark']
: List of theme namesattribute = 'data-theme'
: HTML attribute modified based on the active theme- accepts
class
anddata-*
(meaning any data attribute,data-mode
,data-color
, etc.)
- accepts
value
: Optional mapping of theme name to attribute value- value is an
object
where key is the theme name and value is the attribute value
- value is an
Reading and updating the theme
Svelte-themes exports
- a
theme
writable store as its default so you can access the theme props anywhere in you app setTheme
function so you can easily switch the theme.
<script>
import themeStore, { setTheme } from 'svelte-themes';
<script/>
<select bind:value={$themeStore.theme}>
<option value="dark">Dark</option>
<option value="light">Light</option>
<option value="system">System</option>
</select>
<button on:click={() => setTheme('dark')}> Dark mode </button>
Theme store
theme
: Active theme nameforcedTheme
: Forced page theme or falsy. IfforcedTheme
is set, you should disable any theme switching UIresolvedTheme
: IfenableSystem
is true and the active theme is "system", this returns whether the system preference resolved to "dark" or "light". Otherwise, identical totheme
systemTheme
: IfenableSystem
is true, represents the System theme preference ("dark" or "light"), regardless what the active theme isthemes
: The list of themes passed toThemeProvider
(with "system" appended, ifenableSystem
is true)
For the rest of the documentation please refer to the next-themes repo.