"use client"; import React, { useState, useRef, useEffect } from 'react'; import { motion, AnimatePresence } from 'motion/react'; import { Info, ExternalLink } from 'lucide-react'; import { SCIENTIFIC_TERMS } from '../lib/data/scientificTerms'; import { useSettingsStore } from '../lib/store/settingsStore'; interface TooltipProps { termKey: string; children: React.ReactNode; onWikiNavigate?: (id: string) => void; } export default function Tooltip({ termKey, children, onWikiNavigate }: TooltipProps) { const [isVisible, setIsVisible] = useState(false); const [positionClass, setPositionClass] = useState("left-1/2 -translate-x-1/2"); const [arrowClass, setArrowClass] = useState("left-1/2 -translate-x-1/2"); const containerRef = useRef(null); const tooltipRef = useRef(null); const scientificTerms = useSettingsStore(state => state.scientificTerms); const termData = scientificTerms[termKey] || SCIENTIFIC_TERMS[termKey]; // Adjust horizontal position dynamically to prevent overflowing viewport edges useEffect(() => { if (isVisible && containerRef.current) { const rect = containerRef.current.getBoundingClientRect(); const screenWidth = window.innerWidth; if (rect.left < 140) { // Too close to left edge (in LTR) or screen boundary setPositionClass("left-0 translate-x-0"); setArrowClass("left-6 translate-x-0"); } else if (screenWidth - rect.right < 140) { // Too close to right edge setPositionClass("right-0 translate-x-0"); setArrowClass("right-6 translate-x-0"); } else { setPositionClass("left-1/2 -translate-x-1/2"); setArrowClass("left-1/2 -translate-x-1/2"); } } }, [isVisible]); // Click outside listener to dismiss on mobile useEffect(() => { if (!isVisible) return; const handleClickOutside = (e: MouseEvent | TouchEvent) => { if (containerRef.current && !containerRef.current.contains(e.target as Node)) { setIsVisible(false); } }; document.addEventListener("mousedown", handleClickOutside); document.addEventListener("touchstart", handleClickOutside); return () => { document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("touchstart", handleClickOutside); }; }, [isVisible]); if (!termData) return <>{children}; const handleToggle = (e: React.MouseEvent) => { e.preventDefault(); e.stopPropagation(); setIsVisible(prev => !prev); }; return ( { if (typeof window !== "undefined" && window.matchMedia?.("(hover: hover)")?.matches !== false) { setIsVisible(true); } }} onMouseLeave={() => { if (typeof window !== "undefined" && window.matchMedia?.("(hover: hover)")?.matches !== false) { setIsVisible(false); } }} > {children} {isVisible && ( e.stopPropagation()} className={`absolute bottom-full mb-3 w-72 max-w-[calc(100vw-2rem)] p-4 sm:p-5 bg-white text-medical-gray-900 rounded-2xl shadow-2xl border-2 border-medical-gray-300/80 z-[100] text-sm ${positionClass}`} dir="rtl" >
دانشنامه علمی کنینا
{termData.term}

{termData.definition}

{termData.wikiId && ( )} {/* Arrow */}
)} ); }