Hover Card
Painel de preview acionado por hover para conteúdo rico não crítico. Construído sobre o Radix HoverCard.
Visão geral
HoverCard mostra um preview rico quando o usuário passa o cursor sobre uma âncora (link, nome, abreviação). Use-o para conteúdo que o usuário pode abrir por completo com um clique mas que talvez queira apenas espiar antes: cards de perfil de usuário em @mentions, previews de link, teasers de documento ou imagem.
Nunca coloque informação crítica ou controles interativos dentro de um HoverCard. O hover é não confiável (usuários de touch não o têm; usuários de teclado só veem o card enquanto o foco se mantém) e o preview deveria ser não essencial. Conteúdo interativo pertence a um Popover; rótulos de texto simples pertencem a um Tooltip.
Preview
'use client';import { Button } from '@gremorie/rx-forms';import { HoverCard, HoverCardContent, HoverCardTrigger,} from '@gremorie/rx-overlays';export function HoverCardPreview() { return ( <HoverCard> <HoverCardTrigger asChild> <Button variant="link">@gremorie</Button> </HoverCardTrigger> <HoverCardContent> <div className="text-sm"> <strong>Gremorie</strong> <p className="mt-1 text-muted-foreground"> AI-native design system. Registry + MCP first. </p> </div> </HoverCardContent> </HoverCard> );}Anatomia
HoverCard raiz Radix que gerencia o timing de abrir/fechar no hover
├─ HoverCardTrigger elemento que revela o card no hover/focus
└─ HoverCardContent superfície de preview em portal (align, sideOffset)Instalação
bash npx gremorie@latest add rx-hover-card bash pnpm dlx gremorie@latest add rx-hover-card bash yarn dlx gremorie@latest add rx-hover-card bash bunx --bun gremorie@latest add rx-hover-card
Uso
import { Button } from "@gremorie/rx-forms";
import {
HoverCard,
HoverCardContent,
HoverCardTrigger,
} from "@gremorie/rx-overlays";
export function Example() {
return (
<HoverCard>
<HoverCardTrigger asChild>
<Button variant="link">@gremorie</Button>
</HoverCardTrigger>
<HoverCardContent>
<div className="text-sm">
<strong>Gremorie</strong>
<p className="mt-1 text-muted-foreground">
AI-native design system. Registry + MCP first.
</p>
</div>
</HoverCardContent>
</HoverCard>
);
}A edição Angular deste componente hoje é distribuída a partir do source (veja o workbench para o lado a lado); a entrada no registry vem a seguir.
API
<HoverCard>
Estende o Radix HoverCard.Root. Props notáveis:
| Prop | Type | Default | Description |
|---|---|---|---|
open | boolean | - | Estado de abertura controlado. |
defaultOpen | boolean | false | Estado de abertura inicial quando não controlado. |
onOpenChange | (open: boolean) => void | - | Disparado quando o estado de abertura muda. |
openDelay | number | 700 | Atraso em milissegundos antes de abrir no hover. |
closeDelay | number | 300 | Atraso em milissegundos antes de fechar após o ponteiro sair. |
<HoverCardTrigger>
Estende o Radix HoverCard.Trigger. Emparelhe com asChild para encaminhar estilos a um link, botão ou qualquer âncora inline.
<HoverCardContent>
| Prop | Type | Default | Description |
|---|---|---|---|
align | "start" | "center" | "end" | "center" | Alinhamento relativo ao eixo do trigger. |
sideOffset | number | 4 | Espaçamento em pixels entre trigger e content. |
side | "top" | "right" | "bottom" | "left" | "bottom" | Lado preferido; vira automaticamente quando não há espaço. |
A superfície padrão é w-64, com padding p-4. Envolvida em um Portal do Radix. Todas as demais props do Radix HoverCard.Content são encaminhadas.
Composição
<HoverCard>detém o estado de hover. Ajuste o timing comopenDelay/closeDelay.<HoverCardTrigger asChild>envolve o elemento âncora (tipicamente um link inline ou um nome).<HoverCardContent>monta via Portal, ancorado ao trigger, com fade e zoom in.- Dentro do content: qualquer preview não interativo - avatar + bio, teaser de imagem, snippet de doc.
Variações
Preview de perfil de usuário
O clássico hover card de @mention. Acionado ao passar o cursor sobre um link para o perfil do usuário.
<HoverCard>
<HoverCardTrigger asChild>
<a href="/users/kalvner" className="font-medium underline">
@kalvner
</a>
</HoverCardTrigger>
<HoverCardContent className="w-72">
<div className="flex gap-3">
<Avatar>
<AvatarImage src="/avatars/kalvner.png" />
<AvatarFallback>BK</AvatarFallback>
</Avatar>
<div className="space-y-1">
<h4 className="text-sm font-semibold">Bruno Kalvner</h4>
<p className="text-xs text-muted-foreground">
Designer and engineer. Maintains Gremorie.
</p>
</div>
</div>
</HoverCardContent>
</HoverCard>Preview de link
Mostre metadados de um link externo antes de o usuário clicar.
<HoverCard openDelay={400}>
<HoverCardTrigger asChild>
<a href="https://gremorie.com" className="underline">
gremorie.com
</a>
</HoverCardTrigger>
<HoverCardContent>
<h4 className="text-sm font-semibold">Gremorie</h4>
<p className="text-xs text-muted-foreground">
Registry-driven, MCP-first design system for React and Angular.
</p>
</HoverCardContent>
</HoverCard>Teaser rápido de imagem
Use para espiar media antes de comprometer-se com um visualizador em tela cheia.
<HoverCard openDelay={200} closeDelay={100}>
<HoverCardTrigger asChild>
<button>Preview thumbnail</button>
</HoverCardTrigger>
<HoverCardContent className="w-80 p-2">
<img src="/teaser.jpg" alt="Teaser" className="rounded-md" />
</HoverCardContent>
</HoverCard>Acessibilidade
- Trigger: hover do ponteiro e foco do teclado ambos abrem o card.
- Teclado: dar foco ao trigger o abre; tirar o foco o fecha;
Escfecha quando o foco está dentro. - Não para conteúdo crítico: usuários de touch podem nunca ver o card. Mantenha o conteúdo suplementar.
aria-controlsé ligado automaticamente entre trigger e content.- Sem focus trap: o ponteiro pode sair naturalmente; ao fechar nada é retornado, porque o trigger nunca perdeu o foco por padrão.
- Reduced motion: as animações de abrir/fechar respeitam
prefers-reduced-motion.
Relacionados
Dropdown Menu
Menu de ações liderado por verbos, atrelado a um trigger. Itens, grupos, separadores, itens de checkbox ou radio, submenus e dicas de shortcut alinhadas à direita.
Command
Command palette keyboard-first construída sobre cmdk. Picker inline para padrões de Combobox ou dialog flutuante Cmd+K para navegação global.