"use client" import { useState, useRef, useEffect } from "react" import { createPortal } from "react-dom" import { ComponentContainer } from "@/components/ui/component-container" import { SectionHeading } from "@/components/ui/section-heading" import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar" import { CalendarDays } from "lucide-react" export function HoverCardSection() { const [isOpen, setIsOpen] = useState(false) const [position, setPosition] = useState({ top: 0, left: 0 }) const [placement, setPlacement] = useState<"top" | "bottom">("bottom") const triggerRef = useRef(null) const cardRef = useRef(null) const [portalContainer, setPortalContainer] = useState(null) // Set up portal container useEffect(() => { setPortalContainer(document.body) }, []) // Calculate position when open state changes or on window resize useEffect(() => { if (!isOpen || !triggerRef.current || !cardRef.current) return const updatePosition = () => { const triggerRect = triggerRef.current!.getBoundingClientRect() const cardRect = cardRef.current!.getBoundingClientRect() // Check if there's enough space below const spaceBelow = window.innerHeight - triggerRect.bottom const spaceNeeded = cardRect.height + 8 // 8px offset const newPlacement = spaceBelow >= spaceNeeded ? "bottom" : "top" setPlacement(newPlacement) // Calculate position const left = triggerRect.left + triggerRect.width / 2 - cardRect.width / 2 const top = newPlacement === "bottom" ? triggerRect.bottom + 8 : triggerRect.top - cardRect.height - 8 setPosition({ left: Math.max(16, Math.min(left, window.innerWidth - cardRect.width - 16)), top, }) } // Initial position calculation updatePosition() // Update position on resize window.addEventListener("resize", updatePosition) return () => window.removeEventListener("resize", updatePosition) }, [isOpen]) return (
@nextjs
VC

@nextjs

The React Framework – created and maintained by @vercel.

Joined December 2021
`} >
e.preventDefault()} onMouseEnter={() => setIsOpen(true)} onMouseLeave={() => setIsOpen(false)} > @nextjs {isOpen && portalContainer && createPortal(
setIsOpen(true)} onMouseLeave={() => setIsOpen(false)} >
VC

@nextjs

The React Framework – created and maintained by @vercel.

Joined December 2021
, portalContainer, )}

Usage

            {`import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card"`}
          
) }