--- name: shadcn-svelte Components description: | UI components with shadcn-svelte and bits-ui. Component patterns, trigger snippets, dialog handling, and accessibility. Keywords: shadcn-svelte, bits-ui, Button, Dialog, Sheet, Popover, DropdownMenu, Tooltip, Form, Input, Select, child snippet, trigger pattern, cn utility --- # shadcn-svelte Components > **Documentation:** [shadcn-svelte.com](https://www.shadcn-svelte.com/) | Use `context7` for API reference Use shadcn-svelte components (bits-ui) for UI. Import with namespace pattern. ## Import Pattern ```svelte ``` ## Trigger Components - Child Snippet Pattern When using trigger components with custom elements like Button, **always use the `child` snippet pattern**: ```svelte {#snippet child({ props })} {/snippet} Tooltip text ``` ### Why This Pattern? - **Single Tab Stop**: Creates only one focusable element - **Proper Props Delegation**: ARIA attributes pass through correctly - **Accessibility**: Maintains keyboard navigation - **Official Pattern**: Documented shadcn-svelte/bits-ui pattern ### Wrong Patterns ```svelte ``` ### Apply to All Triggers ```svelte {#snippet child({ props })} {/snippet} {#snippet child({ props })} {/snippet} {#snippet child({ props })} {/snippet} ``` ## Dialog Pattern ```svelte {#if openCreateDialog} Create Organization Add a new organization to your account. {/if} ``` ## Dialog Naming Convention - Use `open[ComponentName]Dialog` pattern - Avoid generic names like `showDialog` or `isOpen` ```svelte ``` ## DropdownMenu with Options ```svelte {#snippet child({ props })} {/snippet} {#each statusOptions as option} handleSelect(option.value)}> {option.label} {/each} ``` ## Options File Pattern ```typescript // options.ts import type { DropdownItem } from '$shared/types'; export enum Status { Active = 'active', Inactive = 'inactive', Pending = 'pending' } export const statusOptions: DropdownItem[] = [ { value: Status.Active, label: 'Active' }, { value: Status.Inactive, label: 'Inactive' }, { value: Status.Pending, label: 'Pending' } ]; ``` ## Sheet (Slide-out Panel) ```svelte Filters ``` ## Class Merging with Array Syntax Use Svelte array syntax for conditional classes (NOT cn utility): ```svelte
Content
```