Hover Card

A popup card that displays additional information when hovering over a trigger element.

Usage

<script>
  import { 
    HoverCard, 
    HoverCardContent, 
    HoverCardTrigger 
  } from "$lib/components/ui/hover-card";
</script>

<HoverCard>
  <HoverCardTrigger>Hover over me</HoverCardTrigger>
  <HoverCardContent>
    <div class="p-4">
      <p>Card content</p>
    </div>
  </HoverCardContent>
</HoverCard>

Examples

Basic Hover Card

Displays additional information when hovering over a trigger.

Link Preview

Preview links with rich content on hover.

API Reference

HoverCard

The main container component that manages the hover state.

PropTypeDefaultDescription
openboolean-Whether the hover card is open
onOpenChange(open: boolean) => void-Function called when open state changes

HoverCardTrigger

The element that triggers the hover card to open.

PropTypeDefaultDescription
asChildbooleanfalseWhether to extend the component as a child

HoverCardContent

The content displayed when the trigger is hovered.

PropTypeDefaultDescription
align'start' \| 'center' \| 'end''center'Alignment relative to the trigger
sideOffsetnumber4Distance from the trigger (in pixels)
classNamestring''Additional CSS class names

Implementation

The HoverCard component is built on top of the Bits UI library, which provides accessible primitives for building UI components:

<!-- HoverCardContent.svelte -->
<script lang="ts">
	import { LinkPreview } from "bits-ui";
	import type { LinkPreviewContentProps } from "bits-ui";
	import { cn } from "$lib/utils";

	type $$Props = LinkPreviewContentProps;

	let className: $$Props["className"] = undefined;
	export { className as class };
	export let ref: $$Props["ref"] = undefined;
	export let align: $$Props["align"] = "center";
	export let sideOffset: $$Props["sideOffset"] = 4;

	export let width: $$Props["style"]["width"] = undefined;
	export let side: $$Props["side"] = "bottom";
	export let transitionConfig: $$Props["transitionConfig"] = {
		duration: 100
	};
</script>

<LinkPreview.Portal>
	<LinkPreview.Content
		{ref}
		{align}
		{sideOffset}
		{side}
		style:width
		{transitionConfig}
		class={cn(
			"z-50 w-64 rounded-md border bg-popover p-4 text-popover-foreground shadow-md outline-none",
			"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",
			className
		)}
		{...$$restProps}
	>
		<slot />
	</LinkPreview.Content>
</LinkPreview.Portal>

In the implementation above:

  • The component uses Bits UI’s LinkPreview as a base
  • It provides customizable props for alignment, offset, and transition effects
  • Default styling includes animations for smooth open/close transitions
  • The component respects accessibility best practices inherited from Bits UI