1<script lang="ts">
2 import { DropdownMenu as DropdownMenuPrimitive } from 'bits-ui';
3 import CheckIcon from '@lucide/svelte/icons/check';
4 import MinusIcon from '@lucide/svelte/icons/minus';
5 import { cn, type WithoutChildrenOrChild } from '$lib/components/ui/utils.js';
6 import type { Snippet } from 'svelte';
7
8 let {
9 ref = $bindable(null),
10 checked = $bindable(false),
11 indeterminate = $bindable(false),
12 class: className,
13 children: childrenProp,
14 ...restProps
15 }: WithoutChildrenOrChild<DropdownMenuPrimitive.CheckboxItemProps> & {
16 children?: Snippet;
17 } = $props();
18</script>
19
20<DropdownMenuPrimitive.CheckboxItem
21 bind:ref
22 bind:checked
23 bind:indeterminate
24 data-slot="dropdown-menu-checkbox-item"
25 class={cn(
26 "relative flex cursor-default items-center gap-2 rounded-sm py-1.5 pr-2 pl-8 text-sm outline-hidden select-none focus:bg-accent focus:text-accent-foreground data-[disabled]:pointer-events-none data-[disabled]:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-4",
27 className
28 )}
29 {...restProps}
30>
31 {#snippet children({ checked, indeterminate })}
32 <span class="pointer-events-none absolute left-2 flex size-3.5 items-center justify-center">
33 {#if indeterminate}
34 <MinusIcon class="size-4" />
35 {:else}
36 <CheckIcon class={cn('size-4', !checked && 'text-transparent')} />
37 {/if}
38 </span>
39 {@render childrenProp?.()}
40 {/snippet}
41</DropdownMenuPrimitive.CheckboxItem>