---
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