Data display
Hover Card
A preview of a link's destination, shown while the link is hovered or focused.
| Class name | Type | Description |
|---|---|---|
hover-cardplf:hover-card | Component | Wraps the link and the preview |
hover-card-triggerplf:hover-card-trigger | Part | The link |
hover-card-contentplf:hover-card-content | Part | The floating preview |
hover-card-bodyplf:hover-card-body | Part | Places media beside the details |
hover-card-mediaplf:hover-card-media | Part | A square for an icon or image |
hover-card-detailsplf:hover-card-details | Part | The text column |
hover-card-titleplf:hover-card-title | Part | The preview's title |
hover-card-descriptionplf:hover-card-description | Part | Muted text under the title |
hover-card-metaplf:hover-card-meta | Part | A small muted line, with an icon |
hover-card-iconplf:hover-card-icon | Part | An SVG icon; an icon class there doesn't need it |
Default
The preview is hidden from assistive technologies and cannot hold links or controls, so the link’s destination must show everything it does.
Pelatform
CSS and JavaScript components for plain HTML.
<div class="hover-card" data-plf-hover-card>
<a class="hover-card-trigger" href="#">@pelatform</a>
<div class="hover-card-content" hidden>
<div class="hover-card-body">
<span class="avatar"><span class="avatar-fallback">PL</span></span>
<div class="hover-card-details">
<p class="hover-card-title">Pelatform</p>
<p class="hover-card-description">CSS and JavaScript components for plain HTML.</p>
<p class="hover-card-meta">
<span class="icon icon-calendar"></span>
<span>Joined October 2026</span>
</p>
</div>
</div>
</div>
</div><div class="plf:hover-card" data-plf-hover-card>
<a class="plf:hover-card-trigger" href="#">@pelatform</a>
<div class="plf:hover-card-content" hidden>
<div class="plf:hover-card-body">
<span class="plf:avatar"><span class="plf:avatar-fallback">PL</span></span>
<div class="plf:hover-card-details">
<p class="plf:hover-card-title">Pelatform</p>
<p class="plf:hover-card-description">CSS and JavaScript components for plain HTML.</p>
<p class="plf:hover-card-meta">
<span class="plf:icon plf:icon-calendar"></span>
<span>Joined October 2026</span>
</p>
</div>
</div>
</div>
</div>import { Avatar, AvatarFallback, HoverCard, HoverCardBody, HoverCardContent, HoverCardDescription, HoverCardDetails, HoverCardMeta, HoverCardTitle, HoverCardTrigger, Icon } from '@pelatform/react';
export function Example() {
return (
<HoverCard>
<HoverCardTrigger href="#">@pelatform</HoverCardTrigger>
<HoverCardContent>
<HoverCardBody>
<Avatar>
<AvatarFallback>PL</AvatarFallback>
</Avatar>
<HoverCardDetails>
<HoverCardTitle>Pelatform</HoverCardTitle>
<HoverCardDescription>CSS and JavaScript components for plain HTML.</HoverCardDescription>
<HoverCardMeta>
<Icon name="calendar" />
<span>Joined October 2026</span>
</HoverCardMeta>
</HoverCardDetails>
</HoverCardBody>
</HoverCardContent>
</HoverCard>
);
}import { Avatar, AvatarFallback, HoverCard, HoverCardBody, HoverCardContent, HoverCardDescription, HoverCardDetails, HoverCardMeta, HoverCardTitle, HoverCardTrigger, Icon } from '@pelatform/react/prefixed';
export function Example() {
return (
<HoverCard>
<HoverCardTrigger href="#">@pelatform</HoverCardTrigger>
<HoverCardContent>
<HoverCardBody>
<Avatar>
<AvatarFallback>PL</AvatarFallback>
</Avatar>
<HoverCardDetails>
<HoverCardTitle>Pelatform</HoverCardTitle>
<HoverCardDescription>CSS and JavaScript components for plain HTML.</HoverCardDescription>
<HoverCardMeta>
<Icon name="calendar" />
<span>Joined October 2026</span>
</HoverCardMeta>
</HoverCardDetails>
</HoverCardBody>
</HoverCardContent>
</HoverCard>
);
}Design guide
Tokens, controls and patterns.
<div class="hover-card" data-plf-hover-card>
<a class="hover-card-trigger" href="#">Design guide</a>
<div class="hover-card-content" hidden>
<div class="hover-card-body">
<span class="hover-card-media"><span class="icon icon-file-text size-5"></span></span>
<div class="hover-card-details">
<p class="hover-card-title">Design guide</p>
<p class="hover-card-description">Tokens, controls and patterns.</p>
<p class="hover-card-meta"><span>12 pages · PDF</span></p>
</div>
</div>
</div>
</div><div class="plf:hover-card" data-plf-hover-card>
<a class="plf:hover-card-trigger" href="#">Design guide</a>
<div class="plf:hover-card-content" hidden>
<div class="plf:hover-card-body">
<span class="plf:hover-card-media"><span class="plf:icon plf:icon-file-text plf:size-5"></span></span>
<div class="plf:hover-card-details">
<p class="plf:hover-card-title">Design guide</p>
<p class="plf:hover-card-description">Tokens, controls and patterns.</p>
<p class="plf:hover-card-meta"><span>12 pages · PDF</span></p>
</div>
</div>
</div>
</div>import { HoverCard, HoverCardBody, HoverCardContent, HoverCardDescription, HoverCardDetails, HoverCardMedia, HoverCardMeta, HoverCardTitle, HoverCardTrigger, Icon } from '@pelatform/react';
export function Example() {
return (
<HoverCard>
<HoverCardTrigger href="#">Design guide</HoverCardTrigger>
<HoverCardContent>
<HoverCardBody>
<HoverCardMedia>
<Icon name="file-text" className="size-5" />
</HoverCardMedia>
<HoverCardDetails>
<HoverCardTitle>Design guide</HoverCardTitle>
<HoverCardDescription>Tokens, controls and patterns.</HoverCardDescription>
<HoverCardMeta>
<span>12 pages · PDF</span>
</HoverCardMeta>
</HoverCardDetails>
</HoverCardBody>
</HoverCardContent>
</HoverCard>
);
}import { HoverCard, HoverCardBody, HoverCardContent, HoverCardDescription, HoverCardDetails, HoverCardMedia, HoverCardMeta, HoverCardTitle, HoverCardTrigger, Icon } from '@pelatform/react/prefixed';
export function Example() {
return (
<HoverCard>
<HoverCardTrigger href="#">Design guide</HoverCardTrigger>
<HoverCardContent>
<HoverCardBody>
<HoverCardMedia>
<Icon name="file-text" className="plf:size-5" />
</HoverCardMedia>
<HoverCardDetails>
<HoverCardTitle>Design guide</HoverCardTitle>
<HoverCardDescription>Tokens, controls and patterns.</HoverCardDescription>
<HoverCardMeta>
<span>12 pages · PDF</span>
</HoverCardMeta>
</HoverCardDetails>
</HoverCardBody>
</HoverCardContent>
</HoverCard>
);
}<div class="hover-card" data-plf-hover-card data-plf-placement="top">
<a class="hover-card-trigger" href="#">Top</a>
<div class="hover-card-content" hidden>Opens on top.</div>
</div>
<div class="hover-card" data-plf-hover-card data-plf-placement="right">
<a class="hover-card-trigger" href="#">Right</a>
<div class="hover-card-content" hidden>Opens on the right.</div>
</div>
<div class="hover-card" data-plf-hover-card>
<a class="hover-card-trigger" href="#">Bottom</a>
<div class="hover-card-content" hidden>Opens at the bottom.</div>
</div>
<div class="hover-card" data-plf-hover-card data-plf-placement="left">
<a class="hover-card-trigger" href="#">Left</a>
<div class="hover-card-content" hidden>Opens on the left.</div>
</div>
<div class="hover-card" data-plf-hover-card data-plf-align="start">
<a class="hover-card-trigger" href="#">Bottom start</a>
<div class="hover-card-content" hidden>Aligned to the start of the link.</div>
</div>
<div class="hover-card" data-plf-hover-card data-plf-align="end">
<a class="hover-card-trigger" href="#">Bottom end</a>
<div class="hover-card-content" hidden>Aligned to the end of the link.</div>
</div><div class="plf:hover-card" data-plf-hover-card data-plf-placement="top">
<a class="plf:hover-card-trigger" href="#">Top</a>
<div class="plf:hover-card-content" hidden>Opens on top.</div>
</div>
<div class="plf:hover-card" data-plf-hover-card data-plf-placement="right">
<a class="plf:hover-card-trigger" href="#">Right</a>
<div class="plf:hover-card-content" hidden>Opens on the right.</div>
</div>
<div class="plf:hover-card" data-plf-hover-card>
<a class="plf:hover-card-trigger" href="#">Bottom</a>
<div class="plf:hover-card-content" hidden>Opens at the bottom.</div>
</div>
<div class="plf:hover-card" data-plf-hover-card data-plf-placement="left">
<a class="plf:hover-card-trigger" href="#">Left</a>
<div class="plf:hover-card-content" hidden>Opens on the left.</div>
</div>
<div class="plf:hover-card" data-plf-hover-card data-plf-align="start">
<a class="plf:hover-card-trigger" href="#">Bottom start</a>
<div class="plf:hover-card-content" hidden>Aligned to the start of the link.</div>
</div>
<div class="plf:hover-card" data-plf-hover-card data-plf-align="end">
<a class="plf:hover-card-trigger" href="#">Bottom end</a>
<div class="plf:hover-card-content" hidden>Aligned to the end of the link.</div>
</div>import { HoverCard, HoverCardContent, HoverCardTrigger } from '@pelatform/react';
export function Example() {
return (
<>
<HoverCard placement="top">
<HoverCardTrigger href="#">Top</HoverCardTrigger>
<HoverCardContent>Opens on top.</HoverCardContent>
</HoverCard>
<HoverCard placement="right">
<HoverCardTrigger href="#">Right</HoverCardTrigger>
<HoverCardContent>Opens on the right.</HoverCardContent>
</HoverCard>
<HoverCard>
<HoverCardTrigger href="#">Bottom</HoverCardTrigger>
<HoverCardContent>Opens at the bottom.</HoverCardContent>
</HoverCard>
<HoverCard placement="left">
<HoverCardTrigger href="#">Left</HoverCardTrigger>
<HoverCardContent>Opens on the left.</HoverCardContent>
</HoverCard>
<HoverCard align="start">
<HoverCardTrigger href="#">Bottom start</HoverCardTrigger>
<HoverCardContent>Aligned to the start of the link.</HoverCardContent>
</HoverCard>
<HoverCard align="end">
<HoverCardTrigger href="#">Bottom end</HoverCardTrigger>
<HoverCardContent>Aligned to the end of the link.</HoverCardContent>
</HoverCard>
</>
);
}import { HoverCard, HoverCardContent, HoverCardTrigger } from '@pelatform/react/prefixed';
export function Example() {
return (
<>
<HoverCard placement="top">
<HoverCardTrigger href="#">Top</HoverCardTrigger>
<HoverCardContent>Opens on top.</HoverCardContent>
</HoverCard>
<HoverCard placement="right">
<HoverCardTrigger href="#">Right</HoverCardTrigger>
<HoverCardContent>Opens on the right.</HoverCardContent>
</HoverCard>
<HoverCard>
<HoverCardTrigger href="#">Bottom</HoverCardTrigger>
<HoverCardContent>Opens at the bottom.</HoverCardContent>
</HoverCard>
<HoverCard placement="left">
<HoverCardTrigger href="#">Left</HoverCardTrigger>
<HoverCardContent>Opens on the left.</HoverCardContent>
</HoverCard>
<HoverCard align="start">
<HoverCardTrigger href="#">Bottom start</HoverCardTrigger>
<HoverCardContent>Aligned to the start of the link.</HoverCardContent>
</HoverCard>
<HoverCard align="end">
<HoverCardTrigger href="#">Bottom end</HoverCardTrigger>
<HoverCardContent>Aligned to the end of the link.</HoverCardContent>
</HoverCard>
</>
);
}JavaScript
Hover Card needs JavaScript to show previews; without it, the link works as usual. The Full script (pelatform-ui.min.js) starts every component on page load, with no code of your own; with ESM imports, call init() yourself, as in Installation. For markup you add later, see Dynamic content.
<link rel="stylesheet" href="pelatform-ui.min.css">
<link rel="stylesheet" href="icons/icons.min.css">
<script src="pelatform-ui.min.js" defer></script><link rel="stylesheet" href="core/pelatform-ui-core.min.css">
<link rel="stylesheet" href="components/avatar.min.css">
<link rel="stylesheet" href="components/hover-card.min.css">
<link rel="stylesheet" href="icons/icons.min.css">
<script src="core/pelatform-ui-core.min.js" defer></script>
<script src="components/hover-card.min.js" defer></script>
<script>document.addEventListener('DOMContentLoaded', () => PLF.init());</script><link rel="stylesheet" href="pelatform-ui.prefixed.min.css">
<link rel="stylesheet" href="icons/icons.prefixed.min.css">
<script src="pelatform-ui.min.js" defer></script><link rel="stylesheet" href="core/pelatform-ui-core.prefixed.min.css">
<link rel="stylesheet" href="components/avatar.prefixed.min.css">
<link rel="stylesheet" href="components/hover-card.prefixed.min.css">
<link rel="stylesheet" href="icons/icons.prefixed.min.css">
<script src="core/pelatform-ui-core.min.js" defer></script>
<script src="components/hover-card.min.js" defer></script>
<script>document.addEventListener('DOMContentLoaded', () => PLF.init());</script>| Attribute | Purpose |
|---|---|
data-plf-hover-card |
Marks the wrapper |
data-plf-hover-card-trigger |
Optional: marks the native <a href>, otherwise the wrapper’s direct child without hidden; touch follows it without a preview, and aria-disabled="true" turns the preview off |
data-plf-hover-card-content |
Optional: marks the preview, otherwise the wrapper’s direct child with hidden; text and no interactive content |
data-plf-open-delay |
Milliseconds of hover before opening, from 0 to 60000; 300 by default |
data-plf-close-delay |
Milliseconds before closing once the pointer leaves, from 0 to 60000; 150 by default |
data-plf-placement |
top, right, bottom (default) or left; flips to the opposite side when that has more room, and a left or right panel that fits on neither side opens below or above |
data-plf-align |
start, center (default) or end; start and end follow the text direction |
data-plf-side |
Set by the script on the open preview to the side it opened on |
| Method | Behavior |
|---|---|
PLF. |
Returns the instance, creating it for valid markup; options may set openDelay and closeDelay |
PLF. |
Returns the instance or null |
instance. |
Opens at once; returns false when already open, canceled, dismissed or the link is unavailable |
instance. |
Closes and cancels a pending open; returns false when nothing was open or the close was canceled |
instance. |
Returns {open, openDelay, closeDelay} |
instance. |
Closes without events, cancels timers and removes listeners |
| Event | When |
|---|---|
plf: |
Before opening; cancelable |
plf: |
After opening |
plf: |
Before closing; cancelable |
plf: |
After closing |
Each event’s detail:
| Property | Value |
|---|---|
instance |
The Hover Card instance |
reason |
api, trigger, keyboard, or pointer for a press outside |
trigger |
The link, or null from a method, Escape or a press outside |
| Key | Action |
|---|---|
| Tab, Shift+Tab | Focusing the link opens the preview; leaving it closes the preview |
| Escape | Closes the preview; focus stays on the link |
| Enter | Follows the link |
React
HoverCard from @pelatform/react renders this wrapper around its link and preview, which opens on hover and focus as the script’s does; it keeps its own state, or the application sets it with open.
| Prop | Values | Default |
|---|---|---|
placement |
top, right, bottom, left |
bottom |
align |
start, center, end |
center |
openDelay |
Milliseconds of hover before opening | 300 |
closeDelay |
Milliseconds before closing once the pointer and the focus leave | 150 |
open |
true or false, which the application changes in onOpenChange |
Its own state |
defaultOpen |
true starts open when the application does not set open |
false |
onOpenChange |
(open, reason), called when the preview opens or closes: trigger (the pointer or a click on the link), keyboard (the focus or Escape) or pointer (a press outside) |
None |
The parts:
| Part | Element |
|---|---|
HoverCardTrigger |
An a with hover-card-trigger, which takes its href |
HoverCardContent |
A div with hover-card-content and aria-hidden="true" |
HoverCardBody |
A div with hover-card-body |
HoverCardMedia |
A span with hover-card-media, in which an Icon needs no class |
HoverCardDetails |
A div with hover-card-details |
HoverCardTitle |
A p with hover-card-title |
HoverCardDescription |
A p with hover-card-description |
HoverCardMeta |
A p with hover-card-meta, in which an Icon needs no class |
Other props are the element’s own, className and ref included.
| Variable | Default |
|---|---|
--plf-hover-card-width |
20rem, capped by the viewport |
--plf-hover-card-padding |
--plf-space-4 |
--plf-hover-card-radius |
Large radius (8px) |
--plf-hover-card-bg, --plf-hover-card-color |
Elevated surface and text |
--plf-hover-card-border |
Subtle border |
--plf-hover-card-shadow |
--plf-shadow-md |
--plf-hover-card-trigger-color |
--plf-color-primary-text |
--plf-hover-card-media-size |
2. |
--plf-hover-card-icon-size |
--plf-control-icon-size |