A lightweight, type-safe state management solution for Svelte applications with built-in storage persistence.
- 🎯 Type-safe: Full TypeScript support with automatic type inference
- 💾 Persistent Storage: Automatic state persistence in localStorage or sessionStorage
- 🪶 Lightweight: Zero dependencies beyond Svelte
- ⚡ Reactive: Seamless integration with Svelte's reactivity system
- 🔄 Auto-sync: Automatically syncs state across components
- 📦 Simple API: Just one function to manage all your state needs
npm install @friendofsvelte/state
- Define your state using
PersistentState
:
// new.svelte.ts / js
import { PersistentState } from '@friendofsvelte/state';
export const box = new PersistentState('box', {
color: '#ff3e00',
dimensions: [100, 100]
}, 'sessionStorage');
- Use in your components:
<script lang="ts">
import { box } from '$lib/new.svelte';
const listColors = ['red', 'blue', 'green', 'yellow', 'purple', 'orange', 'pink', 'brown'];
function switchNextColor() {
const currentIndex = listColors.indexOf(box.current.color);
const nextIndex = currentIndex + 1;
if (nextIndex >= listColors.length) {
box.current.color = listColors[0];
} else {
box.current.color = listColors[nextIndex];
}
}
</script>
<div
style="background-color: {box.current.color}; width: 100px; height: 100px; color: gray; text-align: center;"
class="m-2 rounded-2xl"
>
{box.current.color}
</div>
<button onclick={switchNextColor} class="bg-gray-700 m-2 px-3 rounded-2xl text-gray-200">
Change color
</button>
Creates or retrieves a persistent state container.
Parameters:
key
: Unique identifier for the state containerinitial
: (Optional) Initial state valuestorageType
: (Optional) Storage type - 'localStorage' or 'sessionStorage' (default: 'localStorage')
Returns:
- A reactive state object of type
T
Inspired by: Rich-Harris' local-storage-test
<script lang="ts">
import { PersistentState } from '@friendofsvelte/state';
const box = new PersistentState('box', {
color: '#ff3e00',
dimensions: [100, 100]
}, 'sessionStorage');
function switchNextColor() {
const colors = ['red', 'blue', 'green', 'yellow', 'purple', 'orange', 'pink', 'brown'];
const currentIndex = colors.indexOf(box.current.color);
box.current.color = colors[(currentIndex + 1) % colors.length];
}
</script>
<div style="background-color: {box.current.color}; width: 100px; height: 100px; color: gray; text-align: center;" class="m-2 rounded-2xl">
{box.current.color}
</div>
<button onclick={switchNextColor} class="bg-gray-700 m-2 px-3 rounded-2xl text-gray-200">
Change color
</button>
Contributions are welcome! Please feel free to submit a Pull Request.
MIT License - see LICENSE file for details