--- name: svelte-sveltekit-expert description: "Expert guide for Svelte 5 (Runes) and SvelteKit 2+ — fine-grained reactivity, snippets, server-first architecture, form actions, and SSR/SSG / Panduan ahli Svelte 5 (Runes) dan SvelteKit 2+ — reaktivitas fine-grained, snippets, arsitektur server-first, form actions, dan SSR/SSG." author: "Roedy Rustam" version: "4.4.2" --- # Svelte 5 & SvelteKit 2 Expert (Runes Standard 2026) [English](#english) | [Bahasa Indonesia](#bahasa-indonesia) --- ## English ### Orchestration & Integration - **Upstream System Design**: `brainstorming`, `zero-to-prod-orchestrator` (Phase 3 & Phase 4). - **Styling & Web Standards**: `modern-web-guidance`, `tailwind-expert`, `modern-css-native-expert`, `design-system-architect`. - **Quality & Performance**: `performance-web-vitals`, `e2e-testing-expert`, `anti-slop`, `visual-ui-auditor`. - **Backend & APIs**: `js-backend-expert`, `database-orm-expert`, `typescript-expert`. ### Description Production-grade guide for building high-performance web applications using **Svelte 5** and **SvelteKit 2+**. Covers the complete Runes reactivity paradigm (`$state`, `$derived`, `$derived.by`, `$effect`, `$props`, `$bindable`), snippet composition replacing legacy slots, progressive enhancement form actions (`use:enhance`), streaming server promises in `+page.server.ts`, and shallow routing (`pushState`) for modal overlays. ### Trigger Conditions - Scaffolding new applications with Svelte 5 and SvelteKit 2. - Refactoring legacy Svelte 3/4 reactive declarations (`let x = 0; $: doubled = x * 2;`) to Svelte 5 Runes. - Composing modular UI components using Svelte 5 Snippets instead of legacy ``. - Implementing form submissions with atomic server actions and zero-JS progressive enhancement. - Streaming large asynchronous datasets to the client without blocking the initial SSR HTML payload. --- ### Core Architectural Patterns #### 1. Complete Svelte 5 Runes Reference | Rune | Purpose | Svelte 4 Legacy Syntax | |---|---|---| | `$state(val)` | Deeply reactive state proxy | `let val = ...` | | `$state.raw(val)` | Shallow reactive state (ideal for immutable/large payloads) | N/A | | `$derived(expr)` | Cached reactive derivation | `$: val = expr` | | `$derived.by(() => {})` | Complex multi-line derived computation | `$: { ... }` | | `$effect(() => {})` | Post-DOM mount & update side-effect with cleanup | `onMount`, `afterUpdate`, `$: { ... }` | | `$effect.pre(() => {})` | Pre-DOM update effect (e.g. scroll position capture) | `beforeUpdate` | | `$props()` | Type-safe destructured component props | `export let prop` | | `$bindable()` | Explicit two-way prop binding allowance | Direct two-way binding | | `$inspect(val)` | Automatic dev-mode deep state inspector | `console.log(val)` in `$:` | #### 2. Component Composition with Svelte 5 Snippets (No Slots) In Svelte 5, `` is deprecated. Components accept Snippets as typed functions: ```svelte
{@render header()} {#each items as item} {@render row(item)} {:else} {#if empty} {/if} {/each}
{@render empty()}
``` ```svelte {#snippet tableHeader()} Name Email Role {/snippet} {#snippet tableRow(user: User)} {user.name} {user.email} {user.role} {/snippet} ``` #### 3. Two-Way Binding with `$bindable()` ```svelte ``` #### 4. SvelteKit 2 Server Actions with Progressive Enhancement Atomic server mutation with optimistic state and zero-JS fallback: ```typescript // src/routes/tasks/+page.server.ts import { fail } from '@sveltejs/kit'; import type { Actions, PageServerLoad } from './$types'; import { db } from '$lib/server/db'; export const load: PageServerLoad = async ({ locals }) => { // Non-blocking streaming promise: do not await slow telemetry data return { tasks: await db.tasks.findMany({ orderBy: { createdAt: 'desc' } }), streamedMetrics: fetchLiveMetrics(), // Streamed as Promise without blocking HTML }; }; export const actions: Actions = { createTask: async ({ request }) => { const data = await request.formData(); const title = data.get('title')?.toString().trim(); if (!title || title.length < 3) { return fail(400, { title, error: 'Title must contain at least 3 characters.' }); } const newTask = await db.tasks.create({ data: { title, completed: false } }); return { success: true, task: newTask }; }, }; async function fetchLiveMetrics() { await new Promise((r) => setTimeout(r, 400)); return { activeNodes: 12, uptime: '99.99%' }; } ``` ```svelte

Project Tasks

{ const title = formData.get('title')?.toString().trim(); if (!title) { cancel(); return; } isSubmitting = true; // Optimistic update optimisticTasks = [{ id: `temp-${Date.now()}`, title, completed: false }, ...optimisticTasks]; return async ({ update }) => { isSubmitting = false; await update(); }; }} class="flex gap-2" >
{#if form?.error}

{form.error}

{/if}
    {#each optimisticTasks as task (task.id)}
  • {task.title} {#if task.id.startsWith('temp-')} Syncing... {/if}
  • {/each}
{#await data.streamedMetrics}
Loading cluster metrics...
{:then metrics}
Active Nodes: {metrics.activeNodes} Uptime: {metrics.uptime}
{/await}
``` ### Sovereign Execution, Token Efficiency & Invariants | Dimension | Sovereign Mandate & Deterministic Contract | | :--- | :--- | | **Frontier Model Cascade** | Medium / High (`Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Muse Wonder High`, `Composer 2.5 Fast`) | | **Availability Fallback** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Zero unhandled missing-model errors) | | **KV-Cache & Token Protocol** | Pin static instructions & schemas at prompt prefix (`kv-cache-prefix-optimizer`); pass surgical `CONTEXT_MAP.md` slices (<250 tokens/call) during Swarm Fan-Out | | **SaaT CLI & MCP Dispatch** | CLI: `vibes skill exec svelte-sveltekit-expert ` / MCP: `vibes_skill_dispatch`, `vibes_visual_audit`, `vibes_ast_query`, `vibes_verify_gate` | | **NFR & Anti-Slop Invariants** | LCP < 1.8s, INP < 100ms, CLS < 0.05, 1px crisp borders, 3-tier radius (6px/8px/12px), `tabular-nums`, 5-state interactive contract; 100% complete zero-placeholder output verified via `node scripts/check-anti-slop.js --strict` | --- --- ## Bahasa Indonesia ### Integrasi Orkestrasi - **Ideasi & Desain Sistem**: `brainstorming`, `zero-to-prod-orchestrator` (Fase 3 & Fase 4). - **Styling & Standar Web**: `modern-web-guidance`, `tailwind-expert`, `modern-css-native-expert`, `design-system-architect`. - **Kualitas & Performa**: `performance-web-vitals`, `e2e-testing-expert`, `anti-slop`, `visual-ui-auditor`. - **Backend & APIs**: `js-backend-expert`, `database-orm-expert`, `typescript-expert`. ### Deskripsi Panduan produksi untuk membangun aplikasi web performa tinggi menggunakan **Svelte 5** dan **SvelteKit 2+**. Berfokus pada paradigma reaktivitas Runes secara menyeluruh (`$state`, `$derived`, `$derived.by`, `$effect`, `$props`, `$bindable`), komposisi Snippets pengganti slot lawas, progressive enhancement form actions (`use:enhance`), streaming promise server pada `+page.server.ts`, dan routing shallow (`pushState`) untuk modal URL-preserving. ### Kondisi Pemicu - Membangun aplikasi baru menggunakan Svelte 5 dan SvelteKit 2. - Merefaktor kode lama Svelte 3/4 (`let x = 0; $: doubled = x * 2;`) ke sistem Runes Svelte 5. - Menggubah komponen UI modular menggunakan Snippets Svelte 5 alih-alih `` lawas. - Mengimplementasikan pengiriman data formulir atomik via Server Actions dengan fallback zero-JS. - Mengalirkan (*streaming*) data asinkron lambat ke klien tanpa memblokir rendering HTML SSR awal. --- ### Implementasi Pola Kunci #### 1. Referensi Lengkap Runes Svelte 5 | Rune | Fungsi & Tujuan | Sintaks Lama Svelte 4 | |---|---|---| | `$state(nilai)` | State reaktif mendalam (*deep reactive proxy*) | `let nilai = ...` | | `$state.raw(nilai)` | State reaktif dangkal (*shallow* untuk objek besar/imutable) | Tidak tersedia | | `$derived(ekspresi)` | Nilai turunan ter-cache otomatis | `$: nilai = ekspresi` | | `$derived.by(() => {})` | Kalkulasi turunan kompleks multi-baris | `$: { ... }` | | `$effect(() => {})` | Efek samping pasca render DOM dengan siklus cleanup | `onMount`, `afterUpdate`, `$: { ... }` | | `$effect.pre(() => {})` | Efek samping sebelum DOM di-update | `beforeUpdate` | | `$props()` | Menerima props komponen secara terstruktur & type-safe | `export let prop` | | `$bindable()` | Memberi izin binding dua arah eksplisit | Binding dua arah otomatis | | `$inspect(nilai)` | Inspeksi state mendalam saat mode pengembangan | `console.log(nilai)` di `$:` | #### 2. Komposisi Komponen dengan Svelte 5 Snippets (Tanpa Slot) Pada Svelte 5, `` digantikan oleh Snippets bertipe (*typed snippets*): ```svelte
{@render kepala()} {#each data as item} {@render baris(item)} {:else} {#if kosong} {/if} {/each}
{@render kosong()}
``` #### 3. Form Action SvelteKit 2 dengan Progressive Enhancement & State Optimistik ```typescript // src/routes/tugas/+page.server.ts import { fail } from '@sveltejs/kit'; import type { Actions, PageServerLoad } from './$types'; import { db } from '$lib/server/db'; export const load: PageServerLoad = async () => { return { daftarTugas: await db.tasks.findMany({ orderBy: { createdAt: 'desc' } }), metrikServer: ambilMetrikServer(), // Streamed Promise tanpa menunda payload HTML awal }; }; export const actions: Actions = { tambahTugas: async ({ request }) => { const data = await request.formData(); const judul = data.get('judul')?.toString().trim(); if (!judul || judul.length < 3) { return fail(400, { judul, error: 'Judul tugas minimal terdiri dari 3 karakter.' }); } const tugasBaru = await db.tasks.create({ data: { title: judul, completed: false } }); return { success: true, tugas: tugasBaru }; }, }; async function ambilMetrikServer() { await new Promise((r) => setTimeout(r, 400)); return { nodeAktif: 12, uptime: '99.99%' }; } ``` ```svelte

Daftar Tugas Proyek

{ const judul = formData.get('judul')?.toString().trim(); if (!judul) { cancel(); return; } sedangMenyimpan = true; // Pembaruan UI Optimistik instan daftarTugasOptimistik = [{ id: `temp-${Date.now()}`, title: judul, completed: false }, ...daftarTugasOptimistik]; return async ({ update }) => { sedangMenyimpan = false; await update(); }; }} class="flex gap-2" >
{#if form?.error}

{form.error}

{/if}
    {#each daftarTugasOptimistik as tugas (tugas.id)}
  • {tugas.title} {#if tugas.id.startsWith('temp-')} Menyinkronkan... {/if}
  • {/each}
{#await data.metrikServer}
Memuat telemetri klaster server...
{:then metrik}
Node Aktif: {metrik.nodeAktif} Tingkat Uptime: {metrik.uptime}
{/await}
``` ### Matriks Eksekusi Berdaulat, Efisiensi Token & Invarian | Dimensi | Mandat Berdaulat & Kontrak Deterministik | | :--- | :--- | | **Kaskade Model Frontier** | Medium / High (`Gemini 4 Argon`, `Claude Sonnet 5.5 High`, `Muse Wonder High`, `Composer 2.5 Fast`) | | **Invarian Fallback Ketersediaan** | `Gemini 4 Argon/Pro` -> `Gemini 3.8 Flash`; `Claude Opus 5.5` -> `Claude Opus 4.6` (Bebas gagal saat model belum tersedia/kuota penuh) | | **Protokol Hemat Token & KV-Cache** | Kunci instruksi & skema statis di prefix awal (`kv-cache-prefix-optimizer`); kirim potongan `CONTEXT_MAP.md` (<250 token/panggilan) saat Fan-Out | | **Eksekusi SaaT CLI & MCP** | CLI: `vibes skill exec svelte-sveltekit-expert ` / MCP: `vibes_skill_dispatch`, `vibes_visual_audit`, `vibes_ast_query`, `vibes_verify_gate` | | **Invarian NFR & Anti-Slop** | LCP < 1.8s, INP < 100ms, CLS < 0.05, border tegas 1px, radius 3-tier (6px/8px/12px), `tabular-nums`, kontrak interaktif 5-state; kode 100% tuntas tanpa placeholder diverifikasi melalui `node scripts/check-anti-slop.js --strict` |