Skilllibrary svelte
install
source · Clone the upstream repo
git clone https://github.com/merceralex397-collab/skilllibrary
Claude Code · Install into ~/.claude/skills/
T=$(mktemp -d) && git clone --depth=1 https://github.com/merceralex397-collab/skilllibrary "$T" && mkdir -p ~/.claude/skills && cp -r "$T/08-web-frontend-and-design/svelte" ~/.claude/skills/merceralex397-collab-skilllibrary-svelte && rm -rf "$T"
manifest:
08-web-frontend-and-design/svelte/SKILL.mdsource content
Purpose
Build Svelte 5 applications using runes ($state, $derived, $effect) for reactivity and SvelteKit for routing, SSR, and form actions.
When to use this skill
- creating Svelte 5 components with runes-based reactivity
- setting up SvelteKit routes with
,+page.svelte
, and load functions+layout.svelte - migrating from Svelte 4 stores to Svelte 5 runes
- implementing SvelteKit form actions for mutations
Do not use this skill when
- building React apps — prefer
react-typescript - building Vue apps — prefer
vue - the task is state management patterns (React-specific) — prefer
state-management
Procedure
- Create component —
block with runes for state, HTML template, optional<script>
block.<style> - Use
— declare reactive state:$state
. Replaces Svelte 4'slet count = $state(0)
reactive declarations.let count = 0 - Use
— computed values:$derived
. Replaceslet doubled = $derived(count * 2)
reactive statements.$: - Use
— side effects:$effect
. Runs when dependencies change.$effect(() => { console.log(count); }) - Set up SvelteKit routes —
(page),src/routes/+page.svelte
(server load),+page.server.ts
(layout).+layout.svelte - Load data — export
function fromload
. Returns data accessible via+page.server.ts
prop in page.data - Handle forms — export
fromactions
. Use+page.server.ts
.<form method="POST" use:enhance> - Deploy — choose adapter:
,adapter-auto
,adapter-node
,adapter-static
.adapter-vercel
Svelte 5 runes
<script> let count = $state(0); let doubled = $derived(count * 2); $effect(() => { document.title = `Count: ${count}`; }); function increment() { count++; } </script> <button onclick={increment}> Count: {count} (doubled: {doubled}) </button>
SvelteKit routing
src/routes/ +layout.svelte # root layout +page.svelte # / blog/ +page.svelte # /blog +page.server.ts # server load function [slug]/ +page.svelte # /blog/:slug +page.server.ts # dynamic load
SvelteKit form actions
// +page.server.ts export const actions = { create: async ({ request }) => { const data = await request.formData(); const title = data.get('title'); await db.post.create({ data: { title } }); return { success: true }; }, };
<!-- +page.svelte --> <script> import { enhance } from '$app/forms'; </script> <form method="POST" action="?/create" use:enhance> <input name="title" required /> <button type="submit">Create</button> </form>
Decision rules
- Use
for mutable reactive values — not bare$state
(Svelte 5 requires explicit runes).let - Use
over$derived
for computed values — effects are for side effects only.$effect - Keep load functions in
for data that needs secrets or DB access.+page.server.ts - Use
on forms — enables progressive enhancement without full page reload.use:enhance - Prefer SvelteKit form actions over API routes for mutations — built-in CSRF protection.
References
Related skills
— alternative frontend frameworkvue
— React patterns for comparisonreact-typescript
— styling Svelte components with Tailwindtailwind-shadcn