import { ComponentPropsWithRef, ElementType, forwardRef, ReactNode, Ref } from "react"; import * as DropdownMenuPrimitive from "@radix-ui/react-dropdown-menu"; import { twMerge } from "tailwind-merge"; // Main menu or parent container export type DropdownMenuProps = DropdownMenuPrimitive.DropdownMenuProps; export const DropdownMenu = DropdownMenuPrimitive.Root; export type DropdownSubMenuProps = DropdownMenuPrimitive.DropdownMenuSubProps; export const DropdownSubMenu = DropdownMenuPrimitive.Sub; // trigger export type DropdownMenuTriggerProps = DropdownMenuPrimitive.DropdownMenuTriggerProps; export const DropdownMenuTrigger = DropdownMenuPrimitive.Trigger; // item container export type DropdownMenuContentProps = DropdownMenuPrimitive.DropdownMenuContentProps; export const DropdownMenuContent = forwardRef( ({ children, className, ...props }, forwardedRef) => { return ( {children} ); } ); DropdownMenuContent.displayName = "DropdownMenuContent"; // item container export type DropdownSubMenuContentProps = DropdownMenuPrimitive.DropdownMenuSubContentProps; export const DropdownSubMenuContent = forwardRef( ({ children, className, ...props }, forwardedRef) => { return ( {children} ); } ); DropdownSubMenuContent.displayName = "DropdownMenuContent"; // item label component export type DropdownLabelProps = DropdownMenuPrimitive.DropdownMenuLabelProps; export const DropdownMenuLabel = ({ className, ...props }: DropdownLabelProps) => ( ); // dropdown items export type DropdownMenuItemProps = DropdownMenuPrimitive.DropdownMenuContentProps & { icon?: ReactNode; as?: T; inputRef?: Ref; iconPos?: "left" | "right"; }; export const DropdownMenuItem = ({ children, inputRef, className, icon, as: Item = "button", iconPos = "left", isDisabled = false, ...props }: DropdownMenuItemProps & ComponentPropsWithRef & { isDisabled?: boolean }) => ( {icon && iconPos === "left" && {icon}} {children} {icon && iconPos === "right" && {icon}} ); // trigger export type DropdownSubMenuTriggerProps = DropdownMenuPrimitive.DropdownMenuSubTriggerProps & { icon?: ReactNode; as?: T; inputRef?: Ref; iconPos?: "left" | "right"; }; export const DropdownSubMenuTrigger = ({ children, inputRef, className, icon, as: Item = "button", iconPos = "left", ...props }: DropdownMenuItemProps & ComponentPropsWithRef) => ( {icon && iconPos === "left" && {icon}} {children} {icon && iconPos === "right" && {icon}} ); // grouping items into 1 export type DropdownMenuGroupProps = DropdownMenuPrimitive.DropdownMenuGroupProps; export const DropdownMenuGroup = forwardRef( ({ ...props }, ref) => ( ) ); DropdownMenuGroup.displayName = "DropdownMenuGroup"; // Divider export const DropdownMenuSeparator = forwardRef< HTMLDivElement, DropdownMenuPrimitive.DropdownMenuSeparatorProps >(({ className, ...props }, ref) => ( )); DropdownMenuSeparator.displayName = "DropdownMenuSeperator"; DropdownMenuSeparator.displayName = "DropdownMenuSeperator";