Hover Card
For sighted users to preview content available behind a link.
import { Component } from '@angular/core';
import { RdxHoverCardModule } from '@radix-ng/primitives/hover-card';
import { LucideAngularModule, X } from 'lucide-angular';
@Component({
selector: 'hover-card-demo',
standalone: true,
imports: [LucideAngularModule, RdxHoverCardModule],
styleUrl: 'hover-card-demo.css',
template: `
<ng-container rdxHoverCardRoot>
<a
class="ImageTrigger"
href="https://twitter.com/radix_ui"
target="_blank"
rel="noreferrer noopener"
rdxHoverCardTrigger
>
<img
class="Image normal"
src="https://pbs.twimg.com/profile_images/1337055608613253126/r_eiMp2H_400x400.png"
alt="Radix UI"
/>
</a>
<ng-template rdxHoverCardContent>
<div class="HoverCardContent" rdxHoverCardContentAttributes>
<div style="display: flex; flex-direction: column; gap: 7px">
<img
class="Image large"
src="https://pbs.twimg.com/profile_images/1337055608613253126/r_eiMp2H_400x400.png"
alt="Radix UI"
/>
<div style="display: flex; flex-direction: column; gap: 15px;">
<div>
<div class="Text bold">Radix</div>
<div class="Text faded">{{ '@radix_ui' }}</div>
</div>
<div class="Text">
Components, icons, colors, and templates for building high-quality, accessible UI. Free
and open-source.
</div>
<div style="display: flex; gap: 15px">
<div style="display: flex; gap: 5px">
<div class="Text bold">0</div>
<div class="Text faded">Following</div>
</div>
<div style="display: flex; gap: 5px">
<div class="Text bold">2,900</div>
<div class="Text faded">Followers</div>
</div>
</div>
</div>
</div>
<div class="HoverCardArrow" rdxHoverCardArrow></div>
</div>
</ng-template>
</ng-container>
`
})
export class HoverCardDemoComponent {
protected readonly XIcon = X;
}
.HoverCardContent {
border-radius: 4px;
padding: 20px;
width: 300px;
background-color: var(--mauve-1);
box-shadow:
hsl(206 22% 7% / 35%) 0px 10px 38px -10px,
hsl(206 22% 7% / 20%) 0px 10px 20px -15px;
}
.HoverCardContent:focus {
box-shadow:
hsl(206 22% 7% / 35%) 0px 10px 38px -10px,
hsl(206 22% 7% / 20%) 0px 10px 20px -15px,
0 0 0 2px var(--violet-7);
}
.ImageTrigger {
cursor: pointer;
border-radius: 100%;
display: inline-block;
}
.ImageTrigger:focus {
box-shadow: 0 0 0 2px var(--mauve-1);
}
.Image {
display: block;
border-radius: 100%;
}
.Image.normal {
width: 45px;
height: 45px;
}
.Image.large {
width: 60px;
height: 60px;
}
.Text {
margin: 0;
color: var(--mauve-12);
font-size: 15px;
line-height: 1.5;
}
.Text.bold {
font-weight: 700;
}
.Text.faded {
color: var(--mauve-10);
}
.HoverCardArrow {
fill: var(--mauve-1);
}
Features
- Can be controlled or uncontrolled.
- Customize side, alignment, offsets, collision handling.
- Optionally render a pointing arrow.
- Supports custom open and close delays.
- Ignored by screen readers.
Import
Get started with importing the directives:
import {
RdxHoverCardModule
} from '@radix-ng/primitives/hover-card';
Anatomy
<ng-container rdxHoverCardRoot>
<button rdxHoverCardTrigger></button>
<ng-template rdxHoverCardContent>
<div rdxHoverCardContentAttributes>
<button rdxHoverCardClose></button>
Hover Card Content
<div rdxHoverCardArrow></div>
</div>
</ng-template>
</ng-container>
API Reference
Root
RdxHoverCardRootDirective
Contains all the parts of a hover-card.
Prop | Default | Type |
---|---|---|
anchor | undefined | InputSignal<undefined | RdxHoverCardAnchorDirective> The anchor directive that comes from outside the hover-card rootDirective |
defaultOpen | false | InputSignalWithTransform<boolean, BooleanInput> The open state of the hover-card when it is initially rendered. Use when you do not need to control its open state. |
open | undefined | InputSignalWithTransform<undefined | boolean, BooleanInput> The controlled state of the hover-card. `open` input takes precedence over `defaultOpen` input. |
openDelay | 500 | InputSignalWithTransform<number, NumberInput> The delay in milliseconds before the hover-card opens. |
closeDelay | 200 | InputSignalWithTransform<number, NumberInput> The delay in milliseconds before the hover-card closes. |
externalControl | undefined | InputSignalWithTransform<undefined | boolean, BooleanInput> Whether to control the state of the hover-card from outside. Use in conjunction with `open` input. |
cssAnimation | false | InputSignalWithTransform<boolean, BooleanInput> Whether to take into account CSS opening/closing animations. |
cssOpeningAnimation | false | InputSignalWithTransform<boolean, BooleanInput> Whether to take into account CSS opening animations. `cssAnimation` input must be set to 'true' |
cssClosingAnimation | false | InputSignalWithTransform<boolean, BooleanInput> Whether to take into account CSS closing animations. `cssAnimation` input must be set to 'true' |
Trigger
RdxHoverCardTriggerDirective
The button that toggles the hover-card. By default, the HoverCardContent
will position itself against the trigger.
Content
RdxHoverCardContentDirective
The component that pops out when the hover-card is open.
Prop | Default | Type |
---|---|---|
side | top | InputSignal<RdxPositionSide> The preferred side of the trigger to render against when open. Will be reversed when collisions occur and avoidCollisions is enabled. |
sideOffset | undefined | InputSignalWithTransform<number, NumberInput> The distance in pixels from the trigger. |
align | center | InputSignal<RdxPositionAlign> The preferred alignment against the trigger. May change when collisions occur. |
alignOffset | undefined | InputSignalWithTransform<number, NumberInput> An offset in pixels from the "start" or "end" alignment options. |
alternatePositionsDisabled | false | InputSignalWithTransform<boolean, BooleanInput> Whether to add some alternate positions of the content. |
onOverlayEscapeKeyDownDisabled | false | InputSignalWithTransform<boolean, BooleanInput> Whether to prevent `onOverlayEscapeKeyDown` handler from calling. |
onOverlayOutsideClickDisabled | false | InputSignalWithTransform<boolean, BooleanInput> Whether to prevent `onOverlayOutsideClick` handler from calling. |
Arrow
RdxHoverCardArrowDirective
An optional arrow element to render alongside the hover-card. This can be used to help visually link the trigger with the HoverCardContent
. Must be rendered inside HoverCardContent
.
Prop | Default | Type |
---|---|---|
width | 10 | InputSignalWithTransform<number, NumberInput> The width of the arrow in pixels. |
height | 5 | InputSignalWithTransform<number, NumberInput> The height of the arrow in pixels. |
Close
RdxHoverCardCloseDirective
An optional close button element to render alongside the hover-card. This can be used to close the HoverCardContent
. Must be rendered inside HoverCardContent
.