Skip to main content

Installation

npm install @base-ui/react
Or use the CLI:
npx shadcn@latest add hover-card

Usage

import {
  HoverCard,
  HoverCardContent,
  HoverCardTrigger,
} from "@/components/ui/hover-card"
<HoverCard>
  <HoverCardTrigger>Hover</HoverCardTrigger>
  <HoverCardContent>
    The React Framework – created and maintained by @vercel.
  </HoverCardContent>
</HoverCard>

Component API

HoverCard

The root hover card component built on Radix UI. Props:
  • open - Control hover card open state
  • onOpenChange - Callback when open state changes
  • defaultOpen - Initial open state
  • openDelay - Delay before opening (default: 700ms)
  • closeDelay - Delay before closing (default: 300ms)

HoverCardTrigger

The element that triggers the hover card. Props:
  • asChild - Compose with child element

HoverCardContent

The hover card content container. Props:
  • side - Placement side (default: "bottom")
    • Options: "top", "right", "bottom", "left"
  • align - Alignment (default: "center")
    • Options: "start", "center", "end"
  • sideOffset - Offset from trigger (default: 4)
  • alignOffset - Alignment offset

Examples

Basic

A simple hover card with user information:
import { CalendarDays } from "lucide-react"
import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"
import { Button } from "@/components/ui/button"
import {
  HoverCard,
  HoverCardContent,
  HoverCardTrigger,
} from "@/components/ui/hover-card"

export function HoverCardDemo() {
  return (
    <HoverCard>
      <HoverCardTrigger asChild>
        <Button variant="link">@nextjs</Button>
      </HoverCardTrigger>
      <HoverCardContent className="w-80">
        <div className="flex justify-between space-x-4">
          <Avatar>
            <AvatarImage src="https://github.com/vercel.png" />
            <AvatarFallback>VC</AvatarFallback>
          </Avatar>
          <div className="space-y-1">
            <h4 className="text-sm font-semibold">@nextjs</h4>
            <p className="text-sm">
              The React Framework – created and maintained by @vercel.
            </p>
            <div className="flex items-center pt-2">
              <CalendarDays className="mr-2 h-4 w-4 opacity-70" />
              <span className="text-xs text-muted-foreground">
                Joined December 2021
              </span>
            </div>
          </div>
        </div>
      </HoverCardContent>
    </HoverCard>
  )
}

With Custom Delays

Control when the card opens and closes:
<HoverCard openDelay={300} closeDelay={100}>
  <HoverCardTrigger asChild>
    <Button variant="link">Quick preview</Button>
  </HoverCardTrigger>
  <HoverCardContent>
    This opens faster and closes quicker.
  </HoverCardContent>
</HoverCard>

Different Sides

Control the placement side:

    Different Alignments

    Control the alignment:
    <HoverCard>
      <HoverCardTrigger>Hover</HoverCardTrigger>
      <HoverCardContent side="top" align="start">
        Content aligned to start
      </HoverCardContent>
    </HoverCard>
    

    Controlled

    Control the hover card open state:
    import * as React from "react"
    import { Button } from "@/components/ui/button"
    import {
      HoverCard,
      HoverCardContent,
      HoverCardTrigger,
    } from "@/components/ui/hover-card"
    
    export function ControlledHoverCard() {
      const [open, setOpen] = React.useState(false)
    
      return (
        <div className="space-x-2">
          <HoverCard open={open} onOpenChange={setOpen}>
            <HoverCardTrigger asChild>
              <Button variant="outline">Hover or click</Button>
            </HoverCardTrigger>
            <HoverCardContent>
              This hover card's state is controlled.
            </HoverCardContent>
          </HoverCard>
          <Button onClick={() => setOpen(!open)}>
            {open ? "Close" : "Open"}
          </Button>
        </div>
      )
    }
    

    Rich Content

    Display rich content in the hover card:
    import { HoverCard, HoverCardContent, HoverCardTrigger } from "@/components/ui/hover-card"
    import { Button } from "@/components/ui/button"
    
    export function RichContentHoverCard() {
      return (
        <HoverCard>
          <HoverCardTrigger asChild>
            <Button variant="link">View details</Button>
          </HoverCardTrigger>
          <HoverCardContent className="w-96">
            <div className="space-y-2">
              <div>
                <h4 className="text-sm font-semibold">Feature Preview</h4>
                <p className="text-sm text-muted-foreground">
                  Get a sneak peek at our upcoming features.
                </p>
              </div>
              <div className="grid gap-2">
                <div className="flex items-center space-x-2">
                  <div className="h-2 w-2 rounded-full bg-green-500" />
                  <span className="text-xs">AI-powered search</span>
                </div>
                <div className="flex items-center space-x-2">
                  <div className="h-2 w-2 rounded-full bg-blue-500" />
                  <span className="text-xs">Real-time collaboration</span>
                </div>
                <div className="flex items-center space-x-2">
                  <div className="h-2 w-2 rounded-full bg-purple-500" />
                  <span className="text-xs">Advanced analytics</span>
                </div>
              </div>
            </div>
          </HoverCardContent>
        </HoverCard>
      )
    }
    

    Accessibility

    • Built on Radix UI for full accessibility
    • Can be triggered via keyboard focus
    • Screen reader compatible
    • ARIA attributes automatically applied
    • Focus management

    API Reference

    See the Base UI Hover Card documentation for complete API details.

    Build docs developers (and LLMs) love