g1t/apps/web/app/components/ui/dropdown-menu.tsx
import { DropdownMenu as Primitive } from "radix-ui";
import type { ComponentProps } from "react";
import { cn } from "../../lib/cn";
// shadcn/ui's dropdown menu, styled with g1t's tokens.
export const DropdownMenu = Primitive.Root;
export const DropdownMenuTrigger = Primitive.Trigger;
export const DropdownMenuGroup = Primitive.Group;
export function DropdownMenuContent({
className,
sideOffset = 6,
...props
}: ComponentProps<typeof Primitive.Content>) {
return (
<Primitive.Portal>
<Primitive.Content
sideOffset={sideOffset}
className={cn(
"z-50 min-w-48 origin-(--radix-dropdown-menu-content-transform-origin) overflow-hidden rounded-lg border border-line-strong bg-raised p-1 text-sm shadow-xl shadow-black/40",
className,
)}
{...props}
/>
</Primitive.Portal>
);
}
export function DropdownMenuItem({
className,
...props
}: ComponentProps<typeof Primitive.Item>) {
return (
<Primitive.Item
className={cn(
"flex cursor-default items-center gap-2 rounded-md px-2 py-1.5 text-fg/90 outline-none select-none",
"data-highlighted:bg-line data-highlighted:text-fg data-disabled:opacity-50",
"[&_svg]:size-4 [&_svg]:shrink-0 [&_svg]:text-faint",
className,
)}
{...props}
/>
);
}
export function DropdownMenuLabel({
className,
...props
}: ComponentProps<typeof Primitive.Label>) {
return (
<Primitive.Label
className={cn("px-2 py-1.5 text-xs text-faint", className)}
{...props}
/>
);
}
export function DropdownMenuSeparator({
className,
...props
}: ComponentProps<typeof Primitive.Separator>) {
return (
<Primitive.Separator
className={cn("-mx-1 my-1 h-px bg-line", className)}
{...props}
/>
);
}