--- name: composable-svelte-components description: UI component library reference for Composable Svelte. Use when implementing designs, choosing components, styling layouts, or working with shadcn-svelte components. Covers component props, variants, accessibility patterns, visual composition, and when to use which component. For specialized components see composable-svelte-graphics (3D), composable-svelte-code (editors/media), composable-svelte-charts (visualization), composable-svelte-maps (geospatial). --- # Composable Svelte Components This skill covers the UI component library for Composable Svelte applications, focusing on shadcn-svelte components and integration patterns. **For Specialized Components**: See dedicated skills for graphics (3D), code (editors/media), charts (data viz), and maps (geospatial). --- ## COMPONENT LIBRARY OVERVIEW Composable Svelte includes 73+ shadcn-svelte components for building modern UIs. All components integrate with the Composable Architecture via props and state management. **Integration Pattern**: - Props for configuration (labels, variants, styles) - State from `$store` for reactive data - Dispatch actions for user interactions **Package Organization**: - `@composable-svelte/core` - UI components (this skill) - `@composable-svelte/graphics` - 3D graphics (see composable-svelte-graphics skill) - `@composable-svelte/code` - Code editors, media players (see composable-svelte-code skill) - `@composable-svelte/charts` - Data visualization (see composable-svelte-charts skill) - `@composable-svelte/maps` - Interactive maps (see composable-svelte-maps skill) --- ## NAVIGATION COMPONENTS **Purpose**: Overlay-based UI elements for state-driven navigation. **Integration Pattern**: State-driven open/close via store, dismiss via PresentationAction. See **composable-svelte-navigation** skill for implementation details. This section provides REFERENCE only. ### Modal Full-screen overlay with backdrop, centered content. **When to use**: Primary actions, form submissions, important warnings. **Props**: - `open: boolean` - Whether modal is open - `onOpenChange: (open: boolean) => void` - Callback when open state changes ```typescript import { Modal } from '@composable-svelte/core/components'; {#if modalStore} !open && modalStore.dismiss()} > {/if} ``` ### Sheet Bottom drawer that slides up (mobile-first). **When to use**: Mobile-first UIs, filters, settings panels. **Props**: - `open: boolean` - `onOpenChange: (open: boolean) => void` ### Drawer Side panel that slides from left or right. **When to use**: Navigation menus, sidebars, settings. **Props**: - `side: 'left' | 'right'` - Which side to slide from - `open: boolean` - `onOpenChange: (open: boolean) => void` ### Alert Confirmation dialog, centered, smaller than Modal. **When to use**: Destructive actions, confirmations, yes/no decisions. **Props**: - `open: boolean` - `onOpenChange: (open: boolean) => void` ### Popover Contextual menu positioned near trigger element. **When to use**: Dropdown menus, tooltips, context menus. **Props**: - `open: boolean` - `onOpenChange: (open: boolean) => void` --- ## FORM COMPONENTS **Purpose**: User input elements that integrate with Composable Architecture. **Integration Pattern**: Value from $store.state, dispatch on change, validation state from store. See **composable-svelte-forms** skill for full patterns. ### Input Text input field with variants. **Types**: text, email, password, number, tel, url, search, date, time. **Props**: - `type: string` - Input type - `value: string` - Current value - `oninput: (e: Event) => void` - Change handler - `placeholder: string` - Placeholder text - `disabled: boolean` - Disabled state ```typescript import { Input } from '@composable-svelte/core/components'; store.dispatch({ type: 'nameChanged', name: e.currentTarget.value })} placeholder="Enter name" disabled={$store.isSubmitting} /> {#if $store.nameError} {$store.nameError} {/if} ``` ### Select Dropdown selector. **Props**: - `value: string` - Selected value - `onValueChange: (value: string) => void` - Selection handler ```typescript import { Select, SelectTrigger, SelectContent, SelectItem } from '@composable-svelte/core/components'; ``` ### Checkbox Boolean toggle with label. **Props**: - `checked: boolean` - Checked state - `onCheckedChange: (checked: boolean) => void` - Toggle handler ```typescript import { Checkbox } from '@composable-svelte/core/components'; store.dispatch({ type: 'toggleTerms', checked })} > I agree to the terms and conditions ``` ### RadioGroup Mutually exclusive options. **Props**: - `value: string` - Selected value - `onValueChange: (value: string) => void` - Selection handler ```typescript import { RadioGroup, RadioGroupItem } from '@composable-svelte/core/components'; store.dispatch({ type: 'planChanged', plan: value })} > Free Pro ($9/mo) Enterprise ($99/mo) ``` ### Switch Toggle switch. **Props**: - `checked: boolean` - `onCheckedChange: (checked: boolean) => void` ### Textarea Multi-line text input. **Props**: - `value: string` - `oninput: (e: Event) => void` - `rows: number` - Number of visible rows - `placeholder: string` ### Combobox Autocomplete dropdown. **Props**: - `value: string` - Selected value - `options: Array<{ label: string; value: string }>` - Available options - `onValueChange: (value: string) => void` - Selection handler - `onSearchChange: (query: string) => void` - Search handler --- ## DATA DISPLAY COMPONENTS **Purpose**: Display data from store.state, often derived/computed. **Integration Pattern**: Map from store.state arrays, use $derived for filtering/sorting. ### Table Tabular data display with sorting/filtering. **When to use**: Lists of structured data, data grids. ```typescript import { Table, TableHeader, TableRow, TableHead, TableBody, TableCell } from '@composable-svelte/core/components'; Name Email Status {#each $store.users as user (user.id)} {user.name} {user.email} {user.status} {/each}
``` ### Card Container for related content with header/footer. **When to use**: Product cards, user profiles, content previews. ```typescript import { Card, CardHeader, CardTitle, CardDescription, CardContent } from '@composable-svelte/core/components'; {#each $store.products as product (product.id)} {product.name} {product.category}

${product.price}

{/each} ``` ### Badge Small label/tag. **Variants**: default, success, secondary, destructive, outline. ```typescript import { Badge } from '@composable-svelte/core/components'; {$store.status} ``` ### Avatar User profile image with fallback. ```typescript import { Avatar, AvatarImage, AvatarFallback } from '@composable-svelte/core/components'; {$store.user?.initials} ``` --- ## FEEDBACK COMPONENTS **Purpose**: Communicate loading states, errors, and notifications. **Integration Pattern**: Render based on loading/error/success state from store. ### Toast Temporary notification. **When to use**: Success messages, errors, notifications. ```typescript import { toast } from '@composable-svelte/core/components'; // In reducer case 'itemAdded': return [ { ...state, items: [...state.items, action.item] }, Effect.fireAndForget(async () => { toast.success('Item added successfully'); }) ]; case 'itemDeleteFailed': return [ { ...state, error: action.error }, Effect.fireAndForget(async () => { toast.error('Failed to delete item'); }) ]; ``` ### Progress Linear progress indicator. **When to use**: Upload progress, loading progress. ```typescript import { Progress } from '@composable-svelte/core/components'; {#if $store.uploadProgress !== null}

{$store.uploadProgress}% uploaded

{/if} ``` ### Skeleton Loading placeholder with shimmer effect. **When to use**: Content placeholders during loading. ```typescript import { Skeleton } from '@composable-svelte/core/components'; {#if $store.isLoading} {:else}

{$store.content}

{/if} ``` ### Spinner Loading spinner. **Props**: - `size: 'small' | 'medium' | 'large'` ```typescript import { Spinner } from '@composable-svelte/core/components'; {#if $store.isLoading} {/if} ``` --- ## LAYOUT COMPONENTS **Purpose**: Organize UI with expand/collapse, tabs, resizable panels. **Integration Pattern**: Expanded/active state lives in store, dispatch on user interaction. ### Accordion Expandable/collapsible sections. **When to use**: FAQs, collapsible content sections. ```typescript import { Accordion, AccordionItem, AccordionTrigger, AccordionContent } from '@composable-svelte/core/components'; // State interface FAQState { expandedItems: string[]; // Array of expanded item IDs } // Reducer case 'toggleItem': return [ { ...state, expandedItems: state.expandedItems.includes(action.itemId) ? state.expandedItems.filter(id => id !== action.itemId) : [...state.expandedItems, action.itemId] }, Effect.none() ]; // Component {#each $store.faqItems as item (item.id)} store.dispatch({ type: 'toggleItem', itemId: item.id })} expanded={$store.expandedItems.includes(item.id)} > {item.question} {item.answer} {/each} ``` ### Tabs Tab navigation. **When to use**: Multiple views of related content. ```typescript import { Tabs, TabsList, TabsTrigger, TabsContent } from '@composable-svelte/core/components'; // State interface DashboardState { activeTab: 'overview' | 'analytics' | 'reports'; } // Component store.dispatch({ type: 'tabChanged', tab })}> Overview Analytics Reports ``` ### Collapsible Single collapsible section. **When to use**: Sidebar toggles, advanced settings. ```typescript import { Collapsible, CollapsibleTrigger, CollapsibleContent } from '@composable-svelte/core/components'; store.dispatch({ type: 'toggleSidebar', open })} > ``` --- ## SPECIALIZED COMPONENT PACKAGES For specialized components beyond standard UI, see dedicated skills: ### 3D Graphics **Skill**: `composable-svelte-graphics` **Package**: `@composable-svelte/graphics` **Components**: Scene, Camera, Light, Mesh **Use cases**: 3D visualizations, WebGPU/WebGL rendering, geometry (box, sphere, cylinder, torus, plane) ### Code & Media **Skill**: `composable-svelte-code` **Package**: `@composable-svelte/code` **Components**: CodeEditor, CodeHighlight, AudioPlayer, VideoEmbed, VoiceInput, NodeCanvas, StreamingChat **Use cases**: Code editing, syntax highlighting, media playback, voice recognition, visual programming, chat interfaces ### Charts & Data Visualization **Skill**: `composable-svelte-charts` **Package**: `@composable-svelte/charts` **Components**: Chart, ChartPrimitive, ChartTooltip **Use cases**: Data visualization, interactive charts, statistical plots ### Maps & Geospatial **Skill**: `composable-svelte-maps` **Package**: `@composable-svelte/maps` **Components**: Map, MapPrimitive, GeoJSONLayer, HeatmapLayer, Popup, TileProviderControl **Use cases**: Interactive maps, geospatial data, location-based features --- ## COMPONENT SELECTION DECISION TREE ### Navigation Components ``` What kind of overlay? │ ├─ Full-screen important action → Modal ├─ Bottom panel (mobile-first) → Sheet ├─ Side panel (navigation/settings) → Drawer ├─ Quick confirmation (yes/no) → Alert └─ Contextual menu (dropdown) → Popover ``` ### Form Components ``` What kind of input? │ ├─ Single line text → Input ├─ Multi-line text → Textarea ├─ Boolean toggle → Checkbox or Switch ├─ One from many options → RadioGroup or Select ├─ Autocomplete/search → Combobox └─ Date/time → Input type="date" or Input type="time" ``` ### Data Display ``` What kind of data? │ ├─ Tabular data → Table ├─ List of items → Cards or List ├─ Status/label → Badge ├─ User profile → Avatar └─ Metrics/stats → Card with metrics ``` ### Feedback ``` What kind of feedback? │ ├─ Loading state → Spinner or Skeleton ├─ Progress indicator → Progress ├─ Success/error notification → Toast └─ Confirmation needed → Alert ``` --- ## CUSTOM COMPONENT GUIDELINES **Principles for Building Custom Components:** 1. **No `$state` for Application State**: All state that affects behavior or can be tested must be in the store 2. **Dispatch Actions**: User interactions dispatch actions to the store 3. **Read from Store**: Render based on `$store.state` 4. **Use `$derived`**: For computed values derived from store state 5. **Props for Configuration**: Static configuration (labels, styles) can be props **Example Custom Component:** ```svelte ``` --- ## ACCESSIBILITY PATTERNS ### Keyboard Navigation All interactive components support keyboard navigation: - **Tab**: Move focus between elements - **Enter/Space**: Activate buttons, toggles - **Escape**: Close modals, popovers, dropdowns - **Arrow keys**: Navigate lists, select options ### Screen Reader Support Components include ARIA attributes: - `aria-label`: Descriptive labels - `aria-expanded`: Expanded/collapsed state - `aria-selected`: Selected state - `role`: Semantic roles ### Focus Management Components manage focus: - Modal traps focus inside dialog - Popover returns focus to trigger on close - Forms focus first invalid field on submit --- ## STYLING PATTERNS ### Tailwind Integration All components use Tailwind CSS classes: ```svelte ``` ### Custom Styles Override with custom CSS: ```svelte ... ``` --- ## SUMMARY This skill covers the component library for Composable Svelte: 1. **Navigation Components**: Modal, Sheet, Drawer, Alert, Popover 2. **Form Components**: Input, Select, Checkbox, RadioGroup, Switch, Textarea, Combobox 3. **Data Display**: Table, Card, Badge, Avatar 4. **Feedback**: Toast, Progress, Skeleton, Spinner 5. **Layout**: Accordion, Tabs, Collapsible 6. **3D Graphics**: Scene, Camera, Light, Mesh (box, sphere, cylinder, torus, plane) 7. **Component Selection**: Decision trees for choosing components 8. **Custom Components**: Guidelines for building custom components 9. **Accessibility**: Keyboard, screen reader, focus management 10. **Styling**: Tailwind integration, custom styles **Remember**: Props for config, state in store, dispatch for interactions. Use the right component for each use case. For navigation implementation, see **composable-svelte-navigation** skill. For form integration, see **composable-svelte-forms** skill. For core architecture, see **composable-svelte-core** skill. For testing components, see **composable-svelte-testing** skill.