"use client"; import React, { useState, useRef, useEffect } from "react"; import { Info } from "lucide-react"; import { cn } from "@/lib/utils/cn"; interface InfoButtonProps { content: string | React.ReactNode; title?: string; position?: "top" | "bottom" | "left" | "right"; className?: string; /** Smaller, more subtle variant for inline use next to labels */ variant?: "default" | "subtle"; } export const InfoButton: React.FC = ({ content, title, position = "top", className = "", variant = "subtle", }) => { const [isOpen, setIsOpen] = useState(false); const buttonRef = useRef(null); const tooltipRef = useRef(null); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( tooltipRef.current && buttonRef.current && !tooltipRef.current.contains(event.target as Node) && !buttonRef.current.contains(event.target as Node) ) { setIsOpen(false); } }; if (isOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => { document.removeEventListener("mousedown", handleClickOutside); }; }, [isOpen]); const positionClasses = { top: "bottom-full left-1/2 -translate-x-1/2 mb-2", bottom: "top-full left-1/2 -translate-x-1/2 mt-2", left: "right-full top-1/2 -translate-y-1/2 mr-2", right: "left-full top-1/2 -translate-y-1/2 ml-2", }; const isBottom = position === "bottom"; const isTop = position === "top"; return ( {isOpen && (
{title && (

{title}

)}
{typeof content === "string" ? (

{content}

) : ( content )}
{/* Arrow */}
)} ); }