import React, { createContext, useContext, useState, useRef, useEffect } from 'react'; import { Slot } from './Slot'; const PopoverContext = createContext(null); export const PopoverRoot = ({ children }: any) => { const [open, setOpen] = useState(false); const ref = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if (ref.current && !ref.current.contains(event.target as Node)) { setOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); return (
{children}
); }; PopoverRoot.displayName = "Popover"; export const PopoverTrigger = React.forwardRef(({ asChild, onClick, ...props }, ref) => { const { setOpen, open } = useContext(PopoverContext); const Comp = asChild ? Slot : "button"; return { setOpen(!open); onClick?.(e); }} {...props} />; }); PopoverTrigger.displayName = "PopoverTrigger"; export const PopoverContent = React.forwardRef(({ className = '', children, align = "center", sideOffset = 4, ...props }, ref) => { const { open } = useContext(PopoverContext); if (!open) return null; let alignClass = "left-1/2 -translate-x-1/2"; if (align === "start") alignClass = "left-0"; if (align === "end") alignClass = "right-0"; return (
{children}
); }); PopoverContent.displayName = "PopoverContent";