diff --git a/src/components/ui/dropdown-menu.tsx b/src/components/ui/dropdown-menu.tsx new file mode 100644 index 0000000..a765a5b --- /dev/null +++ b/src/components/ui/dropdown-menu.tsx @@ -0,0 +1,59 @@ +import * as React from "react"; +import { cn } from "@/lib/utils"; + +const MenuContext = React.createContext<{ open: boolean; setOpen: (o: boolean) => void }>({ open: false, setOpen: () => {} }); + +export function DropdownMenu({ children }: { children?: React.ReactNode }) { + const [open, setOpen] = React.useState(false); + return ( + +
{children}
+
+ ); +} + +export function DropdownMenuTrigger({ asChild, children, ...props }: React.ButtonHTMLAttributes & { asChild?: boolean }) { + const ctx = React.useContext(MenuContext); + if (asChild && React.isValidElement(children)) { + return React.cloneElement(children as React.ReactElement, { onClick: () => ctx.setOpen(!ctx.open) }); + } + return ; +} + +export function DropdownMenuContent({ align = "end", className, children, ...props }: React.HTMLAttributes & { align?: "start" | "end" | "center" }) { + const ctx = React.useContext(MenuContext); + if (!ctx.open) return null; + return ( +
+ {children} +
+ ); +} + +export function DropdownMenuItem({ className, onClick, ...props }: React.HTMLAttributes) { + const ctx = React.useContext(MenuContext); + return ( +
{ onClick?.(e); ctx.setOpen(false); }} + className={cn("cursor-pointer px-3 py-2 text-sm hover:bg-slate-100", className)} + {...props} + /> + ); +} + +export function DropdownMenuLabel({ className, ...props }: React.HTMLAttributes) { + return
; +} +export function DropdownMenuSeparator({ className, ...props }: React.HTMLAttributes) { + return
; +} +export function DropdownMenuGroup({ children }: { children?: React.ReactNode }) { return
{children}
; } + +export default DropdownMenu;