--- name: svelte description: >- You are an expert in Svelte 5 and SvelteKit 2. You help developers build web applications using runes ($state, $derived, $effect, $props, $bindable, $inspect), snippets, stores, transitions, and actions — compiling to minimal vanilla JavaScript with no virtual DOM. Use when building Svelte apps, migrating from Svelte 4, or working with SvelteKit. license: Apache-2.0 compatibility: "Svelte 5.0+, SvelteKit 2.0+ (optional)" metadata: author: terminal-skills version: "1.1.0" category: development tags: ["svelte", "frontend", "runes", "reactive", "sveltekit"] --- # Svelte — Compile-Time Reactive UI Framework ## Overview Svelte shifts work from runtime to compile time, producing minimal vanilla JavaScript with no virtual DOM. Svelte 5 introduces **runes** — explicit reactivity primitives that replace `$:` declarations and stores. SvelteKit 2 provides SSR, routing, and deployment adapters. ## Instructions ### Runes Reference **`$state`** — reactive state (deep by default): ```svelte ``` **`$state.raw`** — shallow reactive (must reassign to trigger): ```svelte ``` **`$state.snapshot`** — plain non-reactive copy: ```svelte ``` **`$derived`** and **`$derived.by`** — computed values: ```svelte ``` **`$effect`** — side effects with cleanup: ```svelte ``` **`$props`** — component props: ```svelte ``` **`$bindable`** — two-way binding: ```svelte ``` **`$inspect`** — debug reactive values (dev only): ```svelte ``` ### Snippets (Replacing Slots) Svelte 5 replaces slots with typed, reusable markup fragments: ```svelte {@render children?.()} ``` ```svelte {#snippet row(item)} {item.name} — {item.description} {/snippet} ``` ### Stores (Shared State) ```typescript // stores/cart.ts — Writable store (Svelte 4 style, still works) import { writable, derived } from "svelte/store"; export const cart = writable([]); export const cartTotal = derived(cart, ($cart) => $cart.reduce((sum, item) => sum + item.price * item.quantity, 0) ); ``` **Svelte 5 alternative** — `$state` in `.svelte.ts` modules: ```typescript // state/counter.svelte.ts let count = $state(0); let doubled = $derived(count * 2); export function getCounter() { return { get count() { return count; }, get doubled() { return doubled; }, increment() { count++; }, }; } ``` ### Transitions ```svelte {#each items as item (item)}
{item}
{/each} ``` ### Migration from Svelte 4 | Svelte 4 | Svelte 5 | |-----------|----------| | `let count = 0` | `let count = $state(0)` | | `$: doubled = count * 2` | `let doubled = $derived(count * 2)` | | `$: { sideEffect() }` | `$effect(() => { sideEffect() })` | | `export let prop` | `let { prop } = $props()` | | `` | `{@render children()}` | | `` | `{@render header?.()}` | | Svelte stores | `$state` in `.svelte.ts` files | ### SvelteKit 2 ```svelte

{data.title}

``` ```bash npx sv create my-app # SvelteKit project npm create vite@latest -- --template svelte-ts # standalone Svelte ``` ## Examples ### Example 1: Shopping cart with stores ```svelte
{#each $cart as item (item.id)}
{item.name} x {item.quantity} — ${(item.price * item.quantity).toFixed(2)}
{/each}

Total: ${$cartTotal.toFixed(2)}

``` ### Example 2: Async data fetching with $effect ```svelte {#if loading}

Loading...

{:else if user}

{user.name}

{/if} ``` ## Guidelines 1. **Runes for state** — Use `$state()`, `$derived()`, `$effect()` in Svelte 5; cleaner than Svelte 4's `$:` syntax 2. **Scoped styles** — CSS in `