import { createPortal } from 'react-dom';
import { useState, useRef, useEffect } from 'react';
function Tooltip({ children, content }) {
const [isVisible, setIsVisible] = useState(false);
const [position, setPosition] = useState({ x: 0, y: 0 });
const triggerRef = useRef(null);
const updatePosition = () => {
if (triggerRef.current) {
const rect = triggerRef.current.getBoundingClientRect();
setPosition({
x: rect.left + rect.width / 2,
y: rect.top - 10
});
}
};
useEffect(() => {
if (isVisible) {
updatePosition();
window.addEventListener('scroll', updatePosition);
window.addEventListener('resize', updatePosition);
return () => {
window.removeEventListener('scroll', updatePosition);
window.removeEventListener('resize', updatePosition);
};
}
}, [isVisible]);
return (
<>
<span
ref={triggerRef}
onMouseEnter={() => setIsVisible(true)}
onMouseLeave={() => setIsVisible(false)}
>
{children}
</span>
{isVisible && createPortal(
<div
className="tooltip"
style={{
position: 'fixed',
left: position.x,
top: position.y,
transform: 'translate(-50%, -100%)'
}}
>
{content}
</div>,
document.getElementById('tooltip-root')
)}
</>
);
}
// Usage
function App() {
return (
<div>
<Tooltip content="This is a helpful tooltip">
<button>Hover me</button>
</Tooltip>
</div>
);
}