Context Menu
Displays a menu to the user — such as a set of actions or functions — triggered by right click.
<script lang="ts">
import * as ContextMenu from "$lib/components/ui/context-menu/index.js";
let showBookmarks = $state(false);
let showFullURLs = $state(true);
let value = $state("pedro");
</script>
<ContextMenu.Root>
<ContextMenu.Trigger
class="flex h-[150px] w-[300px] items-center justify-center rounded-md border border-dashed text-sm"
>
Right click here
</ContextMenu.Trigger>
<ContextMenu.Content class="w-52">
<ContextMenu.Item>
Back
<ContextMenu.Shortcut>⌘[</ContextMenu.Shortcut>
</ContextMenu.Item>
<ContextMenu.Item disabled>
Forward
<ContextMenu.Shortcut>⌘]</ContextMenu.Shortcut>
</ContextMenu.Item>
<ContextMenu.Item>
Reload
<ContextMenu.Shortcut>⌘R</ContextMenu.Shortcut>
</ContextMenu.Item>
<ContextMenu.Sub>
<ContextMenu.SubTrigger>More Tools</ContextMenu.SubTrigger>
<ContextMenu.SubContent class="w-48">
<ContextMenu.Item>
Save Page As...
<ContextMenu.Shortcut>⇧⌘S</ContextMenu.Shortcut>
</ContextMenu.Item>
<ContextMenu.Item>Create Shortcut...</ContextMenu.Item>
<ContextMenu.Item>Name Window...</ContextMenu.Item>
<ContextMenu.Separator />
<ContextMenu.Item>Developer Tools</ContextMenu.Item>
</ContextMenu.SubContent>
</ContextMenu.Sub>
<ContextMenu.Separator />
<ContextMenu.CheckboxItem bind:checked={showBookmarks}
>Show Bookmarks</ContextMenu.CheckboxItem
>
<ContextMenu.CheckboxItem bind:checked={showFullURLs}
>Show Full URLs</ContextMenu.CheckboxItem
>
<ContextMenu.Separator />
<ContextMenu.RadioGroup bind:value>
<ContextMenu.Group>
<ContextMenu.GroupHeading>People</ContextMenu.GroupHeading>
<ContextMenu.RadioItem value="pedro">Pedro Duarte</ContextMenu.RadioItem
>
<ContextMenu.RadioItem value="colm">Colm Tuite</ContextMenu.RadioItem>
</ContextMenu.Group>
</ContextMenu.RadioGroup>
</ContextMenu.Content>
</ContextMenu.Root> Installation
pnpm dlx jsrepo@latest add context-menunpx jsrepo@latest add context-menuyarn dlx jsrepo@latest add context-menubunx jsrepo@latest add context-menuInstall bits-ui:
pnpm add bits-ui -Dnpm install bits-ui -Dyarn add bits-ui -Dbun add bits-ui -DCopy and paste the following code into your project.
<script lang="ts">
import { ContextMenu as ContextMenuPrimitive } from 'bits-ui';
import { cn, type WithoutChildrenOrChild } from '$lib/utils.js';
import type { Snippet } from 'svelte';
import CheckIcon from 'phosphor-svelte/lib/CheckIcon';
let {
ref = $bindable(null),
checked = $bindable(false),
indeterminate = $bindable(false),
class: className,
inset,
children: childrenProp,
...restProps
}: WithoutChildrenOrChild<ContextMenuPrimitive.CheckboxItemProps> & {
inset?: boolean;
children?: Snippet;
} = $props();
</script>
<ContextMenuPrimitive.CheckboxItem
bind:ref
bind:checked
bind:indeterminate
data-slot="context-menu-checkbox-item"
data-inset={inset}
class={cn(
"relative flex cursor-default items-center gap-2 border border-transparent py-1 pr-8 pl-2 text-xs font-medium text-muted-foreground outline-hidden rounded-item select-none focus:border-primary/50 focus:bg-muted focus:text-foreground data-[checked=true]:text-link data-inset:pl-7 data-disabled:pointer-events-none data-disabled:opacity-50 [&_svg]:pointer-events-none [&_svg]:shrink-0 [&_svg:not([class*='size-'])]:size-3.5",
className
)}
{...restProps}
>
{#snippet children({ checked })}
<span class="pointer-events-none absolute right-2 text-link">
{#if checked}
<CheckIcon />
{/if}
</span>
{@render childrenProp?.()}
{/snippet}
</ContextMenuPrimitive.CheckboxItem>
Usage
<script lang="ts">
import * as ContextMenu from '$lib/components/ui/context-menu/index.js';
</script> <ContextMenu.Root>
<ContextMenu.Trigger>Right click</ContextMenu.Trigger>
<ContextMenu.Content>
<ContextMenu.Item>Profile</ContextMenu.Item>
<ContextMenu.Item>Billing</ContextMenu.Item>
<ContextMenu.Item>Team</ContextMenu.Item>
<ContextMenu.Item>Subscription</ContextMenu.Item>
</ContextMenu.Content>
</ContextMenu.Root>