<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { Button } from "$lib/components/ui/button/index.js";
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger>
{#snippet child({ props })}
<Button {...props} variant="outline">열기</Button>
{/snippet}
</DropdownMenu.Trigger>
<DropdownMenu.Content class="w-56" align="start">
<DropdownMenu.Label>내 계정</DropdownMenu.Label>
<DropdownMenu.Group>
<DropdownMenu.Item>
프로필
<DropdownMenu.Shortcut>⇧⌘P</DropdownMenu.Shortcut>
</DropdownMenu.Item>
<DropdownMenu.Item>
결제
<DropdownMenu.Shortcut>⌘B</DropdownMenu.Shortcut>
</DropdownMenu.Item>
<DropdownMenu.Item>
설정
<DropdownMenu.Shortcut>⌘S</DropdownMenu.Shortcut>
</DropdownMenu.Item>
<DropdownMenu.Item>
키보드 단축키
<DropdownMenu.Shortcut>⌘K</DropdownMenu.Shortcut>
</DropdownMenu.Item>
</DropdownMenu.Group>
<DropdownMenu.Separator />
<DropdownMenu.Group>
<DropdownMenu.Item>팀</DropdownMenu.Item>
<DropdownMenu.Sub>
<DropdownMenu.SubTrigger>사용자 초대</DropdownMenu.SubTrigger>
<DropdownMenu.SubContent>
<DropdownMenu.Item>이메일</DropdownMenu.Item>
<DropdownMenu.Item>메시지</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item>더보기...</DropdownMenu.Item>
</DropdownMenu.SubContent>
</DropdownMenu.Sub>
<DropdownMenu.Item>
새 팀
<DropdownMenu.Shortcut>⌘+T</DropdownMenu.Shortcut>
</DropdownMenu.Item>
</DropdownMenu.Group>
<DropdownMenu.Separator />
<DropdownMenu.Item>GitHub</DropdownMenu.Item>
<DropdownMenu.Item>지원</DropdownMenu.Item>
<DropdownMenu.Item disabled>API</DropdownMenu.Item>
<DropdownMenu.Separator />
<DropdownMenu.Item>
로그아웃
<DropdownMenu.Shortcut>⇧⌘Q</DropdownMenu.Shortcut>
</DropdownMenu.Item>
</DropdownMenu.Content>
</DropdownMenu.Root> 설치
Install bits-ui:
Copy and paste the following code into your project.
사용법
<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
</script> <DropdownMenu.Root>
<DropdownMenu.Trigger>열기</DropdownMenu.Trigger>
<DropdownMenu.Content>
<DropdownMenu.Group>
<DropdownMenu.Label>내 계정</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.Item>프로필</DropdownMenu.Item>
<DropdownMenu.Item>결제</DropdownMenu.Item>
<DropdownMenu.Item>팀</DropdownMenu.Item>
<DropdownMenu.Item>구독</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root> 예제
체크박스
<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { Button } from "$lib/components/ui/button/index.js";
let showStatusBar = $state(true);
let showActivityBar = $state(false);
let showPanel = $state(false);
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger>
{#snippet child({ props })}
<Button {...props} variant="outline">열기</Button>
{/snippet}
</DropdownMenu.Trigger>
<DropdownMenu.Content class="w-56">
<DropdownMenu.Group>
<DropdownMenu.Label>외관</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.CheckboxItem bind:checked={showStatusBar}>
상태 표시줄
</DropdownMenu.CheckboxItem>
<DropdownMenu.CheckboxItem bind:checked={showActivityBar} disabled>
활동 표시줄
</DropdownMenu.CheckboxItem>
<DropdownMenu.CheckboxItem bind:checked={showPanel}
>패널</DropdownMenu.CheckboxItem
>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root> 라디오 그룹
<script lang="ts">
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { Button } from "$lib/components/ui/button/index.js";
let position = $state("bottom");
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger>
{#snippet child({ props })}
<Button {...props} variant="outline">열기</Button>
{/snippet}
</DropdownMenu.Trigger>
<DropdownMenu.Content class="w-56">
<DropdownMenu.Group>
<DropdownMenu.Label>패널 위치</DropdownMenu.Label>
<DropdownMenu.Separator />
<DropdownMenu.RadioGroup bind:value={position}>
<DropdownMenu.RadioItem value="top">상단</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem value="bottom">하단</DropdownMenu.RadioItem>
<DropdownMenu.RadioItem value="right">오른쪽</DropdownMenu.RadioItem>
</DropdownMenu.RadioGroup>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root> 대화상자
드롭다운 메뉴에서 대화상자를 여는 방법을 보여주는 예제입니다.
<DropdownMenu.Root>
<DropdownMenu.Trigger class={buttonVariants({ variant: "outline" })}>
액션
</DropdownMenu.Trigger>
</DropdownMenu.Root> <script lang="ts">
import MoreHorizontal from "@lucide/svelte/icons/more-horizontal";
import { Button, buttonVariants } from "$lib/components/ui/button/index.js";
import * as Dialog from "$lib/components/ui/dialog/index.js";
import * as DropdownMenu from "$lib/components/ui/dropdown-menu/index.js";
import { Input } from "$lib/components/ui/input/index.js";
import { Label } from "$lib/components/ui/label/index.js";
import { Textarea } from "$lib/components/ui/textarea/index.js";
import * as Field from "$lib/components/ui/field/index.js";
let showNewDialog = $state(false);
let showShareDialog = $state(false);
</script>
<DropdownMenu.Root>
<DropdownMenu.Trigger
class={buttonVariants({ variant: "outline", size: "icon-sm" })}
>
<MoreHorizontal />
</DropdownMenu.Trigger>
<DropdownMenu.Content class="w-40" align="end">
<DropdownMenu.Label>파일 작업</DropdownMenu.Label>
<DropdownMenu.Group>
<DropdownMenu.Item onSelect={() => (showNewDialog = true)}>
새 파일...
</DropdownMenu.Item>
<DropdownMenu.Item onSelect={() => (showShareDialog = true)}
>공유...</DropdownMenu.Item
>
<DropdownMenu.Item disabled>다운로드</DropdownMenu.Item>
</DropdownMenu.Group>
</DropdownMenu.Content>
</DropdownMenu.Root>
<Dialog.Root bind:open={showNewDialog}>
<Dialog.Content class="sm:max-w-[425px]">
<Dialog.Header>
<Dialog.Title>새 파일 만들기</Dialog.Title>
<Dialog.Description>
새 파일의 이름을 입력하세요. 완료되면 만들기를 클릭하세요.
</Dialog.Description>
</Dialog.Header>
<Field.Group class="pb-3">
<Field.Field>
<Field.Label for="filename">파일 이름</Field.Label>
<Input id="filename" name="filename" placeholder="document.txt" />
</Field.Field>
</Field.Group>
<Dialog.Footer>
<Dialog.Close class={buttonVariants({ variant: "outline" })}
>취소</Dialog.Close
>
<Button type="submit">만들기</Button>
</Dialog.Footer>
</Dialog.Content>
</Dialog.Root>
<Dialog.Root bind:open={showShareDialog}>
<Dialog.Content class="sm:max-w-[425px]">
<Dialog.Header>
<Dialog.Title>파일 공유</Dialog.Title>
<Dialog.Description>
링크가 있는 사람은 누구나 이 파일을 볼 수 있습니다.
</Dialog.Description>
</Dialog.Header>
<Field.Group class="py-3">
<Field.Field>
<Label for="email">이메일 주소</Label>
<Input
id="email"
name="email"
type="email"
placeholder="shadcn@vercel.com"
/>
</Field.Field>
<Field.Field>
<Field.Label for="message">메시지 (선택사항)</Field.Label>
<Textarea
id="message"
name="message"
placeholder="이 파일을 확인해 보세요"
/>
</Field.Field>
</Field.Group>
<Dialog.Footer>
<Dialog.Close class={buttonVariants({ variant: "outline" })}
>취소</Dialog.Close
>
<Button type="submit">초대 보내기</Button>
</Dialog.Footer>
</Dialog.Content>
</Dialog.Root> 변경 기록
2024-10-30 DropdownMenu.SubTrigger 클래스
<DropdownMenu.SubTrigger>에gap-2 [&_svg]:pointer-events-none [&_svg]:size-4 [&_svg]:shrink-0를 추가하여 드롭다운 메뉴 서브 트리거 내부의 아이콘을 자동으로 스타일링하도록 했습니다.<DropdownMenu.SubTrigger>내부의 아이콘에서size-4를 제거했습니다. 이제 부모<DropdownMenu.SubTrigger>에서 처리합니다.