HoverCard
FeedbackSupplementary entity details displayed on hover or focus.
Responsive viewport — resize the window to explore. Direction and density apply only to this preview. Theme applies to the docs too.
"use client";
import {
HoverCard,
HoverCardTrigger,
HoverCardContent,
} from "@/components/ui/hover-card";
import {
Avatar,
AvatarFallback,
} from "@dashboardpack/core/components/ui/avatar";
export default function HoverCardExample() {
return (
<div className="text-sm">
<span className="text-muted-foreground">Project created by </span>
<HoverCard openDelay={150}>
<HoverCardTrigger
href="#member"
className="rounded font-medium text-primary underline underline-offset-4 outline-none focus-visible:ring-2 focus-visible:ring-ring"
>
Alex Morgan
</HoverCardTrigger>
<HoverCardContent>
<div className="flex gap-3">
<Avatar>
<AvatarFallback>AM</AvatarFallback>
</Avatar>
<div>
<h3 className="text-sm font-semibold">Alex Morgan</h3>
<p className="text-xs text-muted-foreground">
Product designer · Apex Studio
</p>
<p className="mt-3 text-xs leading-relaxed">
Building thoughtful experiences with the design systems team.
</p>
</div>
</div>
</HoverCardContent>
</HoverCard>
<p id="member" className="mt-4 text-xs text-muted-foreground">
Hover or focus the name for supplementary details.
</p>
</div>
);
}Usage
Use a real link as HoverCardTrigger. Put supplementary identity or contextual content in HoverCardContent. Essential details and actions must remain reachable without opening the card.
import {
HoverCard,
HoverCardTrigger,
HoverCardContent,
} from "@/components/ui/hover-card";Shipped as editable source in src/components/ui/hover-card.tsx in both apps. Copy the implementation below when moving it to another project. Copy the complete example from Source code for all imports and state. Add "use client" when using hooks or event handlers. See installation and theming for project setup.
Component source
The complete implementation is included in both apps. It uses the React, Radix, Lucide, and shared-core dependencies already installed in Apex. Keep your project’s semantic theme tokens when reusing it.
src/components/ui/hover-card.tsx
"use client";
import type { ComponentProps } from "react";
import { cn } from "@dashboardpack/core/lib/utils";
import { HoverCard as Primitive } from "radix-ui";
export const HoverCard = Primitive.Root;
export const HoverCardTrigger = Primitive.Trigger;
export function HoverCardContent({
className,
align = "center",
sideOffset = 6,
...props
}: ComponentProps<typeof Primitive.Content>) {
return (
<Primitive.Portal>
<Primitive.Content
align={align}
sideOffset={sideOffset}
className={cn(
"z-50 w-72 max-w-[calc(100vw-2rem)] rounded-xl border bg-popover p-4 text-popover-foreground shadow-lg outline-none",
className,
)}
{...props}
/>
</Primitive.Portal>
);
}API reference
Common props and defaults. Slot-specific props are named below; native elements also accept their standard HTML attributes. The component TypeScript definitions are the complete type reference.
| Prop | Type / Default | Description |
|---|---|---|
| open / defaultOpen | booleanDefault: false | Optional controlled or initial visibility. |
| openDelay / closeDelay | numberDefault: 700 / 300 | Delay in milliseconds. |
| side / align (HoverCardContent) | physical side / start | center | endDefault: bottom / center | Placement relative to the trigger. |
| sideOffset (HoverCardContent) | numberDefault: 6 | Distance from the trigger. |