Installation
Theme
Mode

Overlays & feedback

Hover card

A rich preview that appears when you hover a reference — a teammate’s name, a project link, a URL. Where a tooltip gives a word, a hover card gives a card: avatar, stats, actions. It waits a beat before opening and bridges the gap so you can move into it.

$npx shadcn@latest add @orbit/hover-card

Overview

Live — hover the highlighted references

The onboarding redesign was shipped by SCSam Chen as part of the OOrbit launch — read more in the orbit.app/changelog.

Presets

Each preset composes existing pieces — avatar, badge, progress, member stack — into a glanceable card. Hover any trigger below.

User
Avatar, presence, bio, stats, and quick actions for a person mention.
Project
Icon, status, progress bar, and member stack for a project link.
Link
A banner, favicon, title, and description for a URL preview.

Behavior

The timing is what separates a hover card from a flickery mess.

Open delay
A short wait (~300ms) before opening means passing over a name doesn’t flash the card.
Close delay
A brief grace period on leave lets you cross the gap without it vanishing.
Hover bridge
The card listens for hover too, so moving from trigger into the card keeps it open.
Arrow & placement
A small arrow points back to the trigger; flip above or below with one prop.
Placement — side='bottom' (default) or side='top'
Opens below (default): SCSam ChenOpens above: OOrbit
Open delay — default 300ms vs. openDelay={0}
Waits a beat (300ms): orbit.appOpens instantly (0ms): orbit.app

Hover card vs. tooltip

They look similar but do different jobs.

TooltipHover card
ContentA short text labelA rich card with media & actions
TriggerAny control or iconA meaningful reference (name, link)
InteractionRead-only, dismisses fastYou can move in and click inside

Props

PropTypeDefaultDescription
HoverCardRoot. Pairs one trigger with one card and owns the timing.
· openDelaynumber300Wait before opening on hover, in ms.
· closeDelaynumber140Grace period before closing, in ms — lets the pointer cross into the card.
· open / defaultOpenbooleanControlled / uncontrolled open state.
· onOpenChange(open: boolean) => voidCalled when the card opens or closes.
HoverCardTriggerAnchorHTMLAttributesThe reference being previewed — renders a real <a> so it works for keyboard and touch users. Forwards ref.
· renderReactElementReplace the default link with any element; handlers and ARIA merge onto it.
HoverCardContentHTMLAttributesThe card — a 288px surface panel. Override width/padding via className. Forwards ref.
· side"top" | "bottom""bottom"Which side of the trigger the card opens on. Flips to avoid collisions.
· align"start" | "center" | "end""center"Alignment along the trigger.
· sideOffsetnumber9Distance from the trigger in px.
· showArrowbooleantrueSmall surface-colored arrow pointing back at the trigger.

Usage

A hover card is a convenience, never the only way to get information.

Do

Preview, don’t replace

A hover card is a shortcut to detail that also lives on a real, clickable page.

Don’t

Put critical-only info inside

Touch users and keyboard users may never trigger hover — never hide essentials here.

Do

Delay before opening

An open delay keeps the card from flashing as the pointer sweeps across text.

Don’t

Pack in a dozen actions

One or two primary actions; the full set belongs on the destination page.

Keyboard & accessibility

Built on Base UI PreviewCard: the trigger is a real link, keyboard focus opens the card, Escape dismisses it, and the preview never holds information that isn’t on the destination page.

hoverOpens after a short delay
focusKeyboard focus can open it too
EscDismisses while open
linkTrigger is a real link/control