import { DropdownMenu as M } from "radix-ui";
import type { ComponentProps, ReactNode } from "react";
import { cn } from "./cn";
import { Icon, type IconName } from "./Icon";
export const Menu = M.Root;
export const MenuTrigger = M.Trigger;
export const MenuGroup = M.Group;
export function MenuContent({ className, sideOffset = 6, ...props }: ComponentProps<typeof M.Content>) {
return (
<M.Portal>
<M.Content
sideOffset={sideOffset}
className={cn(
"z-50 min-w-[13rem] overflow-hidden rounded-xl bg-page p-1 text-ink shadow-pop data-[state=open]:animate-[context-pop_140ms_var(--ease-out-expo)]",
className,
)}
{...props}
/>
</M.Portal>
);
}
/** A menu row: words on the left, its icon or shortcut on the right. */
export function MenuItem({
icon,
hint,
tone = "default",
className,
children,
...props
}: ComponentProps<typeof M.Item> & { icon?: IconName; hint?: ReactNode; tone?: "default" | "danger" }) {
return (
<M.Item
className={cn(
"flex h-8 cursor-default items-center gap-3 rounded-lg px-2.5 text-[13px] text-body outline-none select-none data-[disabled]:pointer-events-none data-[disabled]:opacity-50 data-[highlighted]:bg-quiet data-[highlighted]:text-ink",
tone === "danger" && "text-red-text data-[highlighted]:bg-red-fill data-[highlighted]:text-red-text",
className,
)}
{...props}
>
<span className="min-w-0 flex-1 truncate">{children}</span>
{hint && <span className="font-mono text-[11px] text-subtle">{hint}</span>}
{icon && <Icon name={icon} size={16} className={tone === "danger" ? "text-red-icon" : "text-muted"} />}
</M.Item>
);
}
export function MenuLabel({ className, ...props }: ComponentProps<typeof M.Label>) {
return <M.Label className={cn("px-2.5 pt-2 pb-1 text-[11.5px] font-medium text-subtle", className)} {...props} />;
}
export function MenuSeparator({ className, ...props }: ComponentProps<typeof M.Separator>) {
return <M.Separator className={cn("-mx-1 my-1 h-px bg-hairline", className)} {...props} />;
}