Skip to main content

hover card

For sighted users to preview content available behind a link.

Philosophy

Hover cards provide progressive disclosure without commitment. They let users preview content before clicking, reducing unnecessary navigation. We build on Popover primitives because hover cards are fundamentally popovers with mouse-enter triggers — shared internals mean consistent behavior and smaller bundle size.

How It's Built

Loading diagram...

Installation


npx @gentleduck/cli add hover-card

npx @gentleduck/cli add hover-card

Usage

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

API Reference

HoverCard

Root wrapper that provides hover-card state and context. Wraps HoverCardPrimitive.Root internally.

PropTypeDefaultDescription
openboolean--Controlled open state
onOpenChange(open: boolean) => void--Callback when open state changes
defaultOpenboolean--Initial open state for uncontrolled usage
openDelaynumber700Delay before opening on hover/focus
closeDelaynumber300Delay before closing on pointer leave/blur
delayDurationnumber--Alias for openDelay. If both are provided, openDelay takes precedence
skipDelayDurationnumber--Reserved for future use (currently ignored)
placement'top' | 'right' | 'bottom' | 'left''top'Default side for HoverCardContent positioning
dir'ltr' | 'rtl'--Text direction. Resolved by primitives useDirection (dir prop -> DirectionProvider -> 'ltr').
childrenReact.ReactNode--HoverCard sub-components
...propsReact.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Root>--Additional props inherited from HoverCard.Root.

HoverCardTrigger

The element that triggers the hover card on hover. Applies buttonVariants styling.

PropTypeDefaultDescription
variantButtonVariant'outline'Button variant style
sizeButtonSize'default'Button size
borderButtonBorder'default'Button border style
asChildbooleanfalseWhether to use the child as the trigger element directly
childrenReact.ReactNode--Content rendered inside the trigger button
...propsReact.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Trigger> & React.ComponentPropsWithoutRef<typeof Button>--Additional props inherited from HoverCard.Trigger and Button.

HoverCardContent

The content displayed when the hover card is open. Wraps HoverCardPrimitive.Content with animation and styling.

PropTypeDefaultDescription
classNamestring--Additional CSS classes to apply to the content container
childrenReact.ReactNode--Content rendered inside the hover card
forceMountboolean--Keep content mounted for animation control
side'top' | 'right' | 'bottom' | 'left''top'Preferred side relative to the trigger. Defaults to the placement value from HoverCard
align'start' | 'center' | 'end''center'Alignment on the chosen side
sideOffsetnumber4Main-axis offset from trigger
alignOffsetnumber0Cross-axis offset from trigger
...propsReact.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content> & React.HTMLProps<HTMLDivElement>--Additional props inherited from HoverCard.Content and standard content div props.

RTL Support

Set dir="rtl" on HoverCard for a local override, or set DirectionProvider once at app/root level for global direction. This mirrors hover-card positioning for right-to-left layouts.

<HoverCard dir="rtl">
  <HoverCardTrigger>مرر الماوس</HoverCardTrigger>
  <HoverCardContent>
    محتوى البطاقة هنا.
  </HoverCardContent>
</HoverCard>
<HoverCard dir="rtl">
  <HoverCardTrigger>مرر الماوس</HoverCardTrigger>
  <HoverCardContent>
    محتوى البطاقة هنا.
  </HoverCardContent>
</HoverCard>