components / 31

marked hover card

a preview should reward curiosity without stealing the page. the link stays native; the extra context arrives by focus or hover.

shadcnnpx shadcn@latest add berkantay/cheez/marked-hover-card
live

meet the names between the lines

hover or tab to a name
01ayatype designer
02noahinteraction designer
03mikacreative developer
ink
size
character
timing220ms in180ms grace out
<MarkedHoverCard tone="purple" size="medium" character="calm">
  <MarkedHoverCardTrigger href="/people/aya" delay={220}>aya</MarkedHoverCardTrigger>
  <MarkedHoverCardContent>
    <MarkedHoverCardHeader>…</MarkedHoverCardHeader>
    <MarkedHoverCardDescription>type designer</MarkedHoverCardDescription>
    <MarkedHoverCardMeta>12 marks · berlin</MarkedHoverCardMeta>
  </MarkedHoverCardContent>
</MarkedHoverCard>
timing

fast enough to answer, slow enough to mean it

focus opens without delay
00
220
hold
180

intent

open

inspect

close

reference

api

Base UI preview card, Cheez surface
partproptypedefaultpurpose
Rootopenbooleancontrolled visibility
RootonOpenChangefunctionvisibility callback with reason
RoottoneMarkedHoverCardTone"purple"frame ink
Rootsizesmall | medium | large"medium"preview width and padding
RootcharacterCheezCharacter"calm"drawing pressure
Triggerdelaynumber600open delay in milliseconds
TriggercloseDelaynumber300grace period before close
Triggerhrefstringnative destination
ContentsideSide"bottom"preferred placement
ContentalignAlign"center"anchor alignment
ContentshowArrowbooleantruedirectional bridge

behavior notes

  • the trigger renders a real link and keeps its destination
  • hover and keyboard focus both open the same preview
  • the close delay lets the pointer travel safely into interactive preview content
  • placement flips and shifts near viewport edges
  • Escape dismisses the preview without moving focus
  • open timing, dismissal, and collision handling come from Base UI
  • no Framer Motion is shipped