View fulldotdev/ui on GitHub

Hover Card

For sighted users to preview content available behind a link.

Installation

npx shadcn@latest add @fulldev/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>

HoverCardTrigger renders a button, or an a with href. Style it as a button with buttonVariants, such as class={buttonVariants({ variant: "link" })}.

Composition

HoverCard
├── HoverCardTrigger
└── HoverCardContent

Trigger Delays

Set delay and closeDelay (in ms) on HoverCard, not on the trigger.

<HoverCard delay={100} closeDelay={200}>
  <HoverCardTrigger>Hover</HoverCardTrigger>
  <HoverCardContent>Content</HoverCardContent>
</HoverCard>

Positioning

Use the side and align props on HoverCardContent to control placement.

<HoverCard>
  <HoverCardTrigger>Hover</HoverCardTrigger>
  <HoverCardContent side="top" align="start">
    Content
  </HoverCardContent>
</HoverCard>

Basic

Sides

RTL

side takes physical sides only (top, right, bottom, left), so the example resolves inline-start and inline-end from dir.

Open state

Use defaultOpen for an initially open card that still responds to pointer and keyboard interactions. The open prop enables controlled mode: interactions request changes but do not update the state themselves. Dispatch hover-card:set with { detail: { open: false } } (or true) on the root to update it.

Content mounting

Data Slot’s recommended "lazy" strategy is the default: closed content is retained but detached from the document. Fulldev initializes nested Data Slot components inside that retained content too.

Use mountStrategy="eager" when an integration needs to query closed content through the document. Both strategies include content in server-rendered HTML; neither adds a no-JavaScript fallback.

API Reference

Source: src/components/ui/hover-card

HoverCard propTypeDefault
delaynumber700
closeDelaynumber300
skipDelayDurationnumber300
defaultOpenboolean
openboolean
side"top" | "right" | "bottom" | "left""bottom"
align"start" | "center" | "end""center"
sideOffsetnumber4
alignOffsetnumber0
avoidCollisionsbooleantrue
collisionPaddingnumber8
portalbooleantrue
closeOnClickOutsidebooleantrue
closeOnEscapebooleantrue
mountStrategy"lazy" | "eager""lazy"

HoverCardContent takes side, align, sideOffset, alignOffset, avoidCollisions and collisionPadding to override the root per content. See the Data Slot docs for events and behavior.