Bloom Logo

Hover Card

For sighted users to preview content available behind a link or trigger when hovered over.

importimport { HoverCard } from "@/components/ui/hoverCard/hoverCard";
$npx @bloomui-react/cli add hoverCard
hoverCard.tsx
"use client";

import * as HoverCardPrimitive from "@radix-ui/react-hover-card";
import * as React from "react";
import { cn } from "@/lib/utils";

export interface HoverCardProps
  extends React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Root> {
  openDelay?: number;
  closeDelay?: number;
}

const HoverCard = ({
  openDelay = 200,
  closeDelay = 150,
  ...props
}: HoverCardProps) => (
  <HoverCardPrimitive.Root
    openDelay={openDelay}
    closeDelay={closeDelay}
    {...props}
  />
);
HoverCard.displayName = "HoverCard";

const HoverCardTrigger = HoverCardPrimitive.Trigger;

const HoverCardContent = React.forwardRef<
  React.ComponentRef<typeof HoverCardPrimitive.Content>,
  React.ComponentPropsWithoutRef<typeof HoverCardPrimitive.Content>
>(
  (
    {
      className,
      align = "center",
      sideOffset = 6,
      avoidCollisions = true,
      ...props
    },
    ref,
  ) => (
    <HoverCardPrimitive.Content
      ref={ref}
      align={align}
      sideOffset={sideOffset}
      avoidCollisions={avoidCollisions}
      className={cn(
        "z-50 w-72 rounded-2xl border border-zinc-200 dark:border-zinc-800 bg-white dark:bg-zinc-900 p-4 text-zinc-900 dark:text-zinc-100 shadow-xl outline-none duration-200 data-[state=open]:animate-in data-[state=closed]:animate-out data-[state=closed]:fade-out-0 data-[state=open]:fade-in-0 data-[state=closed]:zoom-out-95 data-[state=open]:zoom-in-95 data-[side=bottom]:slide-in-from-top-2 data-[side=left]:slide-in-from-right-2 data-[side=right]:slide-in-from-left-2 data-[side=top]:slide-in-from-bottom-2",
        className,
      )}
      {...props}
    />
  ),
);
HoverCardContent.displayName = HoverCardPrimitive.Content.displayName;

export { HoverCard, HoverCardContent, HoverCardTrigger };

Default

User profile hover preview trigger.

Alignments

Control popover alignment using the align prop: start, center, or end.

align: start | center | end

Configurable Delays & Automatic Collision Flip

Configure hover open and close timing with openDelay and closeDelay, while automatic collision detection flips placement at viewport boundaries.

openDelay: numbercloseDelay: numberavoidCollisions: boolean
API Reference

Props — HoverCardContent

Supported properties for HoverCardContent primitive.

PropTypeDefaultDescription
openDelaynumber200Duration in ms to wait before opening on hover.
closeDelaynumber150Duration in ms to wait before closing on mouse leave.
avoidCollisionsbooleantruePrevents card overflow by flipping placement dynamically.