svelte5

Svelte 5 syntax reference. Use when writing ANY Svelte component. Svelte 5 uses runes ($state, $derived, $effect, $props) instead of Svelte 4 patterns. Training data is heavily Svelte 4—this skill prevents outdated syntax.

Safety Notice

This listing is imported from skills.sh public index metadata. Review upstream SKILL.md and repository scripts before running.

Copy this and send it to your AI assistant to learn

Install skill "svelte5" with this command: npx skills add trevors/dot-claude/trevors-dot-claude-svelte5

Svelte 5 Syntax

Always use Svelte 5 runes. Never use Svelte 4 patterns.

Svelte 4 → Svelte 5

Svelte 4 ❌Svelte 5 ✅
export let foolet { foo } = $props()
export let foo = 'default'let { foo = 'default' } = $props()
$: doubled = x * 2let doubled = $derived(x * 2)
$: { sideEffect() }$effect(() => { sideEffect() })
on:click={handler}onclick={handler}
on:input={handler}oninput={handler}
on:click|preventDefault={h}onclick={e => { e.preventDefault(); h(e) }}
<slot />{@render children()}
<slot name="x" />{@render x?.()}
$$propsUse $props() with rest: let { ...rest } = $props()
$$restPropslet { known, ...rest } = $props()
createEventDispatcher()Pass callback props: let { onchange } = $props()

Stores → Runes

Svelte 4 ❌Svelte 5 ✅
import { writable } from 'svelte/store'Remove import
const count = writable(0)let count = $state(0)
$count (auto-subscribe)count (direct access)
count.set(1)count = 1
count.update(n => n + 1)count += 1

Quick Reference

<script>
  // Props (with defaults and rest)
  let { required, optional = 'default', ...rest } = $props();

  // Two-way bindable prop
  let { value = $bindable() } = $props();

  // Reactive state
  let count = $state(0);
  let items = $state([]);      // arrays are deeply reactive
  let user = $state({ name: '' }); // objects too

  // Derived values
  let doubled = $derived(count * 2);
  let complex = $derived.by(() => {
    // multi-line logic here
    return expensiveCalc(count);
  });

  // Side effects
  $effect(() => {
    console.log(count);
    return () => cleanup(); // optional cleanup
  });
</script>

<!-- Events: native names, no colon -->
<button onclick={() => count++}>Click</button>
<input oninput={e => value = e.target.value} />

<!-- Render snippets (replaces slots) -->
{@render children?.()}

Snippets (Replace Slots)

<!-- Parent passes snippets -->
<Dialog>
  {#snippet header()}
    <h1>Title</h1>
  {/snippet}

  {#snippet footer(close)}
    <button onclick={close}>Done</button>
  {/snippet}
</Dialog>

<!-- Child renders them -->
<script>
  let { header, footer, children } = $props();
</script>
{@render header?.()}
{@render children?.()}
{@render footer?.(() => open = false)}

References

Load these when needed:

Source Transparency

This detail page is rendered from real SKILL.md content. Trust labels are metadata-based hints, not a safety guarantee.

Related Skills

Related by shared tags or category signals.

Automation

jj-workflow

No summary provided by upstream source.

Repository SourceNeeds Review
Automation

git-workflow

No summary provided by upstream source.

Repository SourceNeeds Review
General

notion-formatter

No summary provided by upstream source.

Repository SourceNeeds Review
General

book-reader

No summary provided by upstream source.

Repository SourceNeeds Review