import React, { useState, useRef, useEffect } from 'react'; interface DropdownMenuProps { children: React.ReactNode; } export function DropdownMenu({ children }: DropdownMenuProps) { return <>{children}; } interface DropdownMenuTriggerProps { children: React.ReactNode; asChild?: boolean; } export function DropdownMenuTrigger({ children }: DropdownMenuTriggerProps) { return <>{children}; } interface DropdownMenuContentProps { children: React.ReactNode; align?: 'start' | 'center' | 'end'; } export function DropdownMenuContent({ children, align = 'end' }: DropdownMenuContentProps) { const [isOpen, setIsOpen] = useState(false); const triggerRef = useRef(null); const contentRef = useRef(null); useEffect(() => { const trigger = triggerRef.current; if (!trigger) return; const handleClick = () => setIsOpen(!isOpen); trigger.addEventListener('click', handleClick); return () => { trigger.removeEventListener('click', handleClick); }; }, [isOpen]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( contentRef.current && !contentRef.current.contains(event.target as Node) && triggerRef.current && !triggerRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; document.addEventListener('mousedown', handleClickOutside); return () => { document.removeEventListener('mousedown', handleClickOutside); }; }, []); return (
{React.Children.map(children, (child) => { if (React.isValidElement(child)) { return React.cloneElement(child, { ...child.props, children: ( <> {child.props.children} {isOpen && (
{children}
)} ) }); } return child; })}
); } interface DropdownMenuItemProps { children: React.ReactNode; onClick?: () => void; disabled?: boolean; } export function DropdownMenuItem({ children, onClick, disabled = false }: DropdownMenuItemProps) { return ( ); }