Docs
Dropdown Menu
Dropdown Menu
Displays a menu to the user — such as a set of actions or functions — triggered by a button.
<script lang="ts">
import CirclePlusIcon from "@lucide/svelte/icons/circle-plus";
import CloudIcon from "@lucide/svelte/icons/cloud";
import CreditCardIcon from "@lucide/svelte/icons/credit-card";
import GithubIcon from "@lucide/svelte/icons/github";
import KeyboardIcon from "@lucide/svelte/icons/keyboard";
import LifeBuoyIcon from "@lucide/svelte/icons/life-buoy";
import LogOutIcon from "@lucide/svelte/icons/log-out";
import MailIcon from "@lucide/svelte/icons/mail";
import MessageSquareIcon from "@lucide/svelte/icons/message-square";
import PlusIcon from "@lucide/svelte/icons/plus";
import SettingsIcon from "@lucide/svelte/icons/settings";
import UserIcon from "@lucide/svelte/icons/user";
import UserPlusIcon from "@lucide/svelte/icons/user-plus";
import UsersIcon from "@lucide/svelte/icons/users";
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { buttonVariants } from "$lib/components/ui/button/index.js";
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger class={buttonVariants({ variant: "outline" })}
>Open</DropdownMenu.Trigger
>
<DropdownMenu.Content class="w-56">
<DropdownMenu.Group>
<DropdownMenu.Label>My Account</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.Group>
<DropdownMenu.Item>
<UserIcon />
<span>Profile</span>
<DropdownMenu.Shortcut>⇧⌘P</DropdownMenu.Shortcut>
</DropdownMenu.Item>
<DropdownMenu.Item>
<CreditCardIcon />
<span>Billing</span>
<DropdownMenu.Shortcut>⌘B</DropdownMenu.Shortcut>
</DropdownMenu.Item>
<DropdownMenu.Item>
<SettingsIcon />
<span>Settings</span>
<DropdownMenu.Shortcut>⌘S</DropdownMenu.Shortcut>
</DropdownMenu.Item>
<DropdownMenu.Item>
<KeyboardIcon />
<span>Keyboard shortcuts</span>
<DropdownMenu.Shortcut>⌘K</DropdownMenu.Shortcut>
</DropdownMenu.Item>
</DropdownMenu.Group>
<DropdownMenu.Separator />
<DropdownMenu.Group>
<DropdownMenu.Item>
<UsersIcon />
<span>Team</span>
</DropdownMenu.Item>
<DropdownMenu.Sub>
<DropdownMenu.SubTrigger>
<UserPlusIcon />
<span>Invite users</span>
</DropdownMenu.SubTrigger>
<DropdownMenu.SubContent>
<DropdownMenu.Item>
<MailIcon />
<span>Email</span>
</DropdownMenu.Item>
<DropdownMenu.Item>
<MessageSquareIcon />
<span>Message</span>
</DropdownMenu.Item>
<DropdownMenu.Item>
<CirclePlusIcon />
<span>More...</span>
</DropdownMenu.Item>
</DropdownMenu.SubContent>
</DropdownMenu.Sub>
<DropdownMenu.Item>
<PlusIcon />
<span>New Team</span>
<DropdownMenu.Shortcut>⌘+T</DropdownMenu.Shortcut>
</DropdownMenu.Item>
</DropdownMenu.Group>
<DropdownMenu.Separator />
<DropdownMenu.Item>
<GithubIcon />
<span>GitHub</span>
</DropdownMenu.Item>
<DropdownMenu.Item>
<LifeBuoyIcon />
<span>Support</span>
</DropdownMenu.Item>
<DropdownMenu.Item>
<CloudIcon />
<span>API</span>
</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item>
<LogOutIcon />
<span>Log out</span>
<DropdownMenu.Shortcut>⇧⌘Q</DropdownMenu.Shortcut>
</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root>
Installation
Install bits-ui
:
Copy and paste the component source files linked at the top of this page into your project.
Usage
<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger>Open</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Group>
<DropdownMenu.Label>My Account</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.Item>Profile</DropdownMenu.Item>
<DropdownMenu.Item>Billing</DropdownMenu.Item>
<DropdownMenu.Item>Team</DropdownMenu.Item>
<DropdownMenu.Item>Subscription</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root>
Examples
Checkboxes
<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { buttonVariants } from "$lib/components/ui/button/index.js";
let showStatusBar = $state(true);
let showActivityBar = $state(false);
let showPanel = $state(false);
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger class={buttonVariants({ variant: "outline" })}
>Open</DropdownMenu.Trigger
>
<DropdownMenu.Content class="w-56">
<DropdownMenu.Group>
<DropdownMenu.Label>Appearance</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.CheckboxItem bind:checked={showStatusBar}>
Status Bar
</DropdownMenu.CheckboxItem>
<DropdownMenu.CheckboxItem bind:checked={showActivityBar} disabled>
Activity Bar
</DropdownMenu.CheckboxItem>
<DropdownMenu.CheckboxItem bind:checked={showPanel}
>Panel</DropdownMenu.CheckboxItem
>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root>
Radio Group
<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { buttonVariants } from "$lib/components/ui/button/index.js";
let position = $state("bottom");
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger class={buttonVariants({ variant: "outline" })}
>Open</DropdownMenu.Trigger
>
<DropdownMenu.Content class="w-56">
<DropdownMenu.Group>
<DropdownMenu.Label>Panel Position</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.RadioGroup bind:value={position}>
<DropdownMenu.RadioItem value="top">Top</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem value="bottom">Bottom</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem value="right">Right</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root>
Changelog
2024-10-30 Classes for DropdownMenu.SubTrigger
- Added
gap-2 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0
to the<DropdownMenu.SubTrigger>
to automatically style icon inside the dropdown menu sub trigger. - Removed
size-4
from the icon inside the<DropdownMenu.SubTrigger>
since it is now handled by the parent<DropdownMenu.SubTrigger>
.