shadcn.io is not affiliated with official shadcn/ui
Shadcn Hover Card for React and Tailwind
Popover that appears on hover.
Installation
bunx --bun shadcn@latest add https://kit.dev/r/hover-card.jsonpnpm dlx shadcn@latest add https://kit.dev/r/hover-card.jsonnpx shadcn@latest add https://kit.dev/r/hover-card.jsonyarn shadcn@latest add https://kit.dev/r/hover-card.jsonInstall the following dependencies:
bun add @ark-ui/reactpnpm add @ark-ui/reactnpm install @ark-ui/reactyarn add @ark-ui/reactCopy and paste the following code into your project.
"use client";
import { Portal } from "@ark-ui/react/portal";
import {
HoverCard as ArkHoverCard,
useHoverCardContext,
} from "@ark-ui/react/hover-card";
import type React from "react";
import { cn } from "@/lib/utils";
export const useHoverCard = useHoverCardContext;
interface HoverCardProps
extends React.ComponentProps<typeof ArkHoverCard.Root> {}
export const HoverCard = (props: HoverCardProps) => {
const {
lazyMount = true,
unmountOnExit = true,
closeDelay = 100,
openDelay = 10,
positioning = { placement: "top" },
...rest
} = props;
return (
<ArkHoverCard.Root
closeDelay={closeDelay}
data-slot="hover-card"
lazyMount={lazyMount}
openDelay={openDelay}
positioning={positioning}
unmountOnExit={unmountOnExit}
{...rest}
/>
);
};
export const HoverCardTrigger = (
props: React.ComponentProps<typeof ArkHoverCard.Trigger>
) => <ArkHoverCard.Trigger data-slot="hover-card-trigger" {...props} />;
export const HoverCardContent = (
props: React.ComponentProps<typeof ArkHoverCard.Content>
) => {
const { className, children, ...rest } = props;
return (
<Portal>
<ArkHoverCard.Positioner data-slot="hover-card-positioner">
<ArkHoverCard.Content
className={cn(
"z-50",
"w-64",
"p-4",
"bg-popover",
"text-popover-foreground",
"origin-(--transform-origin)",
"rounded-xl border shadow-lg/5",
"outline-hidden",
"data-[state=closed]:zoom-out-[98%] data-[state=open]:zoom-in-[98%]",
"data-[state=open]:fade-in-0 data-[state=closed]:fade-out-0",
"data-[state=closed]:animate-out data-[state=open]:animate-in",
"data-[placement=bottom]:slide-in-from-top-2",
"data-[placement=left]:slide-in-from-end-2",
"data-[placement=right]:slide-in-from-start-2",
"data-[placement=top]:slide-in-from-bottom-2",
"motion-reduce:animate-none!",
className
)}
data-slot="hover-card-content"
{...rest}
>
{children}
<HoverCardArrow />
</ArkHoverCard.Content>
</ArkHoverCard.Positioner>
</Portal>
);
};
export const HoverCardArrow = (
props: React.ComponentProps<typeof ArkHoverCard.Arrow>
) => {
const { style, ...rest } = props;
return (
<ArkHoverCard.Arrow
data-slot="hover-card-arrow"
style={
{
"--arrow-background": "var(--popover)",
"--arrow-size": "calc(1.5 * var(--spacing))",
...style,
} as React.CSSProperties
}
{...rest}
>
<ArkHoverCard.ArrowTip className="border-s border-t" />
</ArkHoverCard.Arrow>
);
};Update the import paths to match your project setup.
Anatomy
HoverCardArrow
└── HoverCardArrowTip
HoverCardTrigger
HoverCardContent
└── HoverCardPositionerUsage
import { MapPinIcon } 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";<HoverCard>
<HoverCardTrigger asChild>
<Button variant="link">Hover here</Button>
</HoverCardTrigger>
<HoverCardContent>
<div className="flex gap-4">
<Avatar>
<AvatarImage src="https://github.com/vinihvc.png" />
<AvatarFallback>VV</AvatarFallback>
</Avatar>
<div className="flex flex-col gap-2">
<a
className="font-medium text-sm underline underline-offset-4"
href="https://github.com/vinihvc"
rel="noopener"
target="_blank"
>
@vinihvc
</a>
<p className="text-muted-foreground text-sm">Frontend Developer</p>
<p className="flex items-center gap-1 text-muted-foreground text-xs">
<MapPinIcon className="size-4" />
Joined in 2016
</p>
</div>
</div>
</HoverCardContent>
</HoverCard>Accessibility
| Key | Description |
|---|---|
Enter | Activate the focused item. |
Space | Activate the focused control. |
Demos
Controlled
Disabled
Positioning
Triggers Delays
API Reference
HoverCard
PropType
AttributeType
HoverCardArrow
div
PropType
AttributeType
CSS variableType
HoverCardArrowTip
div
PropType
CSS variableType
HoverCardTrigger
button
PropType
AttributeType
HoverCardPositioner
div
PropType
CSS variableType
HoverCardContent
div
PropType
AttributeType
CSS variableType