mirror of
https://github.com/github/awesome-copilot.git
synced 2026-02-20 18:35:14 +00:00
- Added latest Svelte 5 runes best practices (.by, .pre, untrack) - Added type-safe context with createContext() pattern - Added transitions and animations section - Emphasized effect best practices (prefer over ) - Added function bindings for two-way binding - Restructured document for better readability with logical groupings - Organized into clear sections: Core Concepts, Reactivity, SvelteKit, UI, TypeScript, Production - Consolidated related topics (data loading, forms, tooling) - Updated to align with official Svelte 5 and SvelteKit documentation
9.9 KiB
9.9 KiB
description, applyTo
| description | applyTo |
|---|---|
| Svelte 5 and SvelteKit development standards and best practices for component-based user interfaces and full-stack applications | **/*.svelte, **/*.ts, **/*.js, **/*.css, **/*.scss, **/*.json |
Svelte 5 and SvelteKit Development Instructions
Instructions for building high-quality Svelte 5 and SvelteKit applications with modern runes-based reactivity, TypeScript, and performance optimization.
Project Context
- Svelte 5.x with runes system ($state, $derived, $effect, $props, $bindable)
- SvelteKit for full-stack applications with file-based routing
- TypeScript for type safety and better developer experience
- Component-scoped styling with CSS custom properties
- Progressive enhancement and performance-first approach
- Modern build tooling (Vite) with optimizations
Core Concepts
Architecture
- Use Svelte 5 runes system for all reactivity instead of legacy stores
- Organize components by feature or domain for scalability
- Separate presentation components from logic-heavy components
- Extract reusable logic into composable functions
- Implement proper component composition with slots and snippets
- Use SvelteKit's file-based routing with proper load functions
Component Design
- Follow single responsibility principle for components
- Use
<script lang="ts">with runes syntax as default - Keep components small and focused on one concern
- Implement proper prop validation with TypeScript annotations
- Use
{#snippet}blocks for reusable template logic within components - Use slots for component composition and content projection
- Pass
childrensnippet for flexible parent-child composition - Design components to be testable and reusable
Reactivity and State
Svelte 5 Runes System
- Use
$state()for reactive local state management - Implement
$derived()for computed values and expensive calculations - Use
$derived.by()for complex computations beyond simple expressions - Use
$effect()sparingly - prefer$derivedor function bindings for state sync - Implement
$effect.pre()for running code before DOM updates - Use
untrack()to prevent infinite loops when reading/writing same state in effects - Define component props with
$props()and destructuring with TypeScript annotations - Use
$bindable()for two-way data binding between components - Migrate from legacy stores to runes for better performance
- Override derived values directly for optimistic UI patterns (Svelte 5.25+)
State Management
- Use
$state()for local component state - Implement type-safe context with
createContext()helper over rawsetContext/getContext - Use context API for sharing reactive state down component trees
- Avoid global
$statemodules for SSR - use context to prevent cross-request data leaks - Use SvelteKit stores for global application state when needed
- Keep state normalized for complex data structures
- Prefer
$derived()over$effect()for computed values - Implement proper state persistence for client-side data
Effect Best Practices
- Avoid using
$effect()to synchronize state - use$derived()instead - Do use
$effect()for side effects: analytics, logging, DOM manipulation - Do return cleanup functions from effects for proper teardown
- Use
$effect.pre()when code must run before DOM updates (e.g., scroll position) - Use
$effect.root()for manually controlled effects outside component lifecycle - Use
untrack()to read state without creating dependencies in effects - Remember: async code in effects doesn't track dependencies after
await
SvelteKit Patterns
Routing and Layouts
- Use
+page.sveltefor page components with proper SEO - Implement
+layout.sveltefor shared layouts and navigation - Handle routing with SvelteKit's file-based system
Data Loading and Mutations
- Use
+page.server.tsfor server-side data loading and API calls - Implement form actions in
+page.server.tsfor data mutations - Use
+server.tsfor API endpoints and server-side logic - Use SvelteKit's load functions for server-side and universal data fetching
- Implement proper loading, error, and success states
- Handle streaming data with promises in server load functions
- Use
invalidate()andinvalidateAll()for cache management - Implement optimistic updates for better user experience
- Handle offline scenarios and network errors gracefully
Forms and Validation
- Use SvelteKit's form actions for server-side form handling
- Implement progressive enhancement with
use:enhance - Use
bind:valuefor controlled form inputs - Validate data both client-side and server-side
- Handle file uploads and complex form scenarios
- Implement proper accessibility with labels and ARIA attributes
UI and Styling
Styling
- Use component-scoped styles with
<style>blocks - Implement CSS custom properties for theming and design systems
- Use
class:directive for conditional styling - Follow BEM or utility-first CSS conventions
- Implement responsive design with mobile-first approach
- Use
:global()sparingly for truly global styles
Transitions and Animations
- Use
transition:directive for enter/exit animations (fade, slide, scale, fly) - Use
in:andout:for separate enter/exit transitions - Implement
animate:directive withflipfor smooth list reordering - Create custom transitions for branded motion design
- Use
|localmodifier to trigger transitions only on direct changes - Combine transitions with keyed
{#each}blocks for list animations
TypeScript and Tooling
TypeScript Integration
- Enable strict mode in
tsconfig.jsonfor maximum type safety - Annotate props with TypeScript:
let { name }: { name: string } = $props() - Type event handlers, refs, and SvelteKit's generated types
- Use generic types for reusable components
- Leverage
$types.tsfiles generated by SvelteKit - Implement proper type checking with
svelte-check - Use type inference where possible to reduce boilerplate
Development Tools
- Use ESLint with eslint-plugin-svelte and Prettier for code consistency
- Use Svelte DevTools for debugging and performance analysis
- Keep dependencies up to date and audit for security vulnerabilities
- Document complex components and logic with JSDoc
- Follow Svelte's naming conventions (PascalCase for components, camelCase for functions)
Production Readiness
Performance Optimization
- Use keyed
{#each}blocks for efficient list rendering - Implement lazy loading with dynamic imports and
<svelte:component> - Use
$derived()for expensive computations to avoid unnecessary recalculations - Use
$derived.by()for complex derived values that require multiple statements - Avoid
$effect()for derived state - it's less efficient than$derived() - Leverage SvelteKit's automatic code splitting and preloading
- Optimize bundle size with tree shaking and proper imports
- Profile with Svelte DevTools to identify performance bottlenecks
- Use
$effect.tracking()in abstractions to conditionally create reactive listeners
Error Handling
- Implement
+error.sveltepages for route-level error boundaries - Use try/catch blocks in load functions and form actions
- Provide meaningful error messages and fallback UI
- Log errors appropriately for debugging and monitoring
- Handle validation errors in forms with proper user feedback
- Use SvelteKit's
error()andredirect()helpers for proper responses - Track pending promises with
$effect.pending()for loading states
Testing
- Write unit tests for components using Vitest and Testing Library
- Test component behavior, not implementation details
- Use Playwright for end-to-end testing of user workflows
- Mock SvelteKit's load functions and stores appropriately
- Test form actions and API endpoints thoroughly
- Implement accessibility testing with axe-core
Security
- Sanitize user inputs to prevent XSS attacks
- Use
@htmldirective carefully and validate HTML content - Implement proper CSRF protection with SvelteKit
- Validate and sanitize data in load functions and form actions
- Use HTTPS for all external API calls and production deployments
- Store sensitive data securely with proper session management
Accessibility
- Use semantic HTML elements and proper heading hierarchy
- Implement keyboard navigation for all interactive elements
- Provide proper ARIA labels and descriptions
- Ensure color contrast meets WCAG guidelines
- Test with screen readers and accessibility tools
- Implement focus management for dynamic content
Deployment
- Use environment variables for configuration across different deployment stages
- Implement proper SEO with SvelteKit's meta tags and structured data
- Deploy with appropriate SvelteKit adapter based on hosting platform
Implementation Process
- Initialize SvelteKit project with TypeScript and desired adapters
- Set up project structure with proper folder organization
- Define TypeScript interfaces and component props
- Implement core components with Svelte 5 runes
- Add routing, layouts, and navigation with SvelteKit
- Implement data loading and form handling
- Add styling system with custom properties and responsive design
- Implement error handling and loading states
- Add comprehensive testing coverage
- Optimize performance and bundle size
- Ensure accessibility compliance
- Deploy with appropriate SvelteKit adapter
Common Patterns
- Renderless components with slots for flexible UI composition
- Custom actions (
use:directives) for cross-cutting concerns and DOM manipulation {#snippet}blocks for reusable template logic within components- Type-safe context with
createContext()for component tree state sharing - Progressive enhancement for forms and interactive features with
use:enhance - Server-side rendering with client-side hydration for optimal performance
- Function bindings (
bind:value={() => value, setValue}) for two-way binding - Avoid
$effect()for state synchronization - use$derived()or callbacks instead