--- name: frontend-svelte description: Technical knowledge for SvelteKit 5 development. Build reactive applications with Svelte's compile-time magic. Expert in SvelteKit, stores, and reactive patterns. Activate for Svelte development, performance optimization, or modern web apps. This skill provides MCP usage patterns and Svelte 5 conventions. Use when implementing Svelte components or SvelteKit routes. --- # Frontend-Svelte Technical reference for SvelteKit 5 development. ## MCP Usage Priority 1. **svelte** - Official Svelte 5 and SvelteKit documentation (ALWAYS CHECK FIRST) 2. **context7** - Third-party libraries: - shadcn-svelte: `/huntabyte/shadcn-svelte` - Other Svelte ecosystem packages 3. **web_search** - For cases not covered by MCPs ## Svelte 5 Conventions - **Runes**: `$state`, `$derived`, `$effect`, `$props` - **Components**: Single-file `.svelte` components - **Events**: Use `onclick={handler}` syntax ## SvelteKit Conventions - **Routes**: `+page.svelte`, `+page.server.ts`, `+layout.svelte` - **Data Loading**: Use `load` functions in `+page.server.ts` - **Form Actions**: `+page.server.ts` actions # Svelte 5 Standards ## Runes (Svelte 5) - Use $state() for reactive state - Use $derived() for computed values - Use $effect() for side effects (sparingly) - Use $props() for component props ```svelte ``` ## Component Structure - Script (setup code) → Markup → Styles - TypeScript by default - Export props explicitly with $props() - Keep components small (<200 lines) ## State Management - Local state: $state() - Derived values: $derived() - Cross-component: Svelte stores or context - Avoid global stores when local state works ## Stores (when needed) ```typescript // stores.ts import { writable, derived } from "svelte/store"; export const user = writable(null); export const isLoggedIn = derived(user, ($user) => $user !== null); ``` ## Reactivity Best Practices - Keep $effect() minimal and focused - Avoid side effects in $derived() - Use event handlers over watchers when possible - Don't mutate props ## Forms & Validation - Use bind:value for two-way binding - Validate on blur, not on every keystroke - Use form actions for submissions (SvelteKit) - Show errors after user interaction ## SvelteKit Specific - Use load functions for data fetching - +page.svelte for routes - +page.server.ts for server-side logic - +layout.svelte for shared layouts - Form actions in +page.server.ts ```typescript // +page.server.ts export const load = async ({ params, locals }) => { const property = await db.property.findUnique({ where: { id: params.id }, }); return { property }; }; export const actions = { default: async ({ request, locals }) => { const data = await request.formData(); // handle form submission }, }; ``` ## Component Props Pattern ```svelte ``` ## Styling - Scoped styles by default - Use CSS variables for theming - Tailwind for utility classes (if using) - Keep critical CSS inline - Avoid deep selectors (:global() sparingly) ## Performance - Use {#key} to force recreation when needed - Lazy load heavy components - Virtual lists for long lists - Debounce expensive operations ## Anti-Patterns to Avoid - Don't use $effect() for derived state (use $derived()) - Don't create stores for everything (local state first) - Don't mutate props directly - Avoid nested reactive statements - Don't use bind: for one-way data flow ## Component Documentation Standard (Bestays) Every component should have a header comment block: ```svelte ```