@adamosuiteservices/ui 2.11.15 → 2.11.17
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/colors.css +1 -1
- package/dist/styles.css +1 -1
- package/dist/themes.css +1 -1
- package/docs/AI-GUIDE.md +321 -321
- package/docs/components/layout/sidebar.md +399 -399
- package/docs/components/layout/toaster.md +436 -436
- package/docs/components/ui/accordion-rounded.md +584 -584
- package/docs/components/ui/accordion.md +269 -269
- package/docs/components/ui/button-group.md +984 -984
- package/docs/components/ui/button.md +1137 -1137
- package/docs/components/ui/calendar.md +1159 -1159
- package/docs/components/ui/card.md +1455 -1455
- package/docs/components/ui/checkbox.md +292 -292
- package/docs/components/ui/collapsible.md +323 -323
- package/docs/components/ui/command.md +454 -454
- package/docs/components/ui/context-menu.md +540 -540
- package/docs/components/ui/dialog.md +628 -628
- package/docs/components/ui/dropdown-menu.md +709 -709
- package/docs/components/ui/field.md +706 -706
- package/docs/components/ui/hover-card.md +446 -446
- package/docs/components/ui/input.md +362 -362
- package/docs/components/ui/kbd.md +434 -434
- package/docs/components/ui/label.md +359 -359
- package/docs/components/ui/pagination.md +650 -650
- package/docs/components/ui/popover.md +536 -536
- package/docs/components/ui/progress.md +182 -182
- package/docs/components/ui/radio-group.md +311 -311
- package/docs/components/ui/select.md +352 -352
- package/docs/components/ui/separator.md +214 -214
- package/docs/components/ui/sheet.md +142 -142
- package/docs/components/ui/skeleton.md +140 -140
- package/docs/components/ui/slider.md +341 -341
- package/docs/components/ui/spinner.md +170 -170
- package/docs/components/ui/switch.md +408 -408
- package/docs/components/ui/tabs-underline.md +106 -106
- package/docs/components/ui/tabs.md +122 -122
- package/docs/components/ui/textarea.md +243 -243
- package/docs/components/ui/toggle.md +237 -237
- package/docs/components/ui/tooltip.md +317 -317
- package/docs/components/ui/typography.md +280 -280
- package/package.json +1 -1
|
@@ -1,446 +1,446 @@
|
|
|
1
|
-
# Hover Card Component
|
|
2
|
-
|
|
3
|
-
Card emergente al hacer hover, basado en Radix UI. Ideal para previsualizar contenido, mostrar información adicional de usuarios, links o productos sin necesidad de click.
|
|
4
|
-
|
|
5
|
-
## Descripción
|
|
6
|
-
|
|
7
|
-
El componente `HoverCard` muestra contenido adicional al pasar el mouse sobre un elemento.
|
|
8
|
-
|
|
9
|
-
## Importación
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
import {
|
|
13
|
-
HoverCard,
|
|
14
|
-
HoverCardContent,
|
|
15
|
-
HoverCardTrigger,
|
|
16
|
-
} from "@adamosuiteservices/ui/hover-card";
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
## Uso Básico
|
|
20
|
-
|
|
21
|
-
```tsx
|
|
22
|
-
<HoverCard>
|
|
23
|
-
<HoverCardTrigger>Hover me</HoverCardTrigger>
|
|
24
|
-
<HoverCardContent>
|
|
25
|
-
<div>
|
|
26
|
-
<h4 className="font-semibold">@nextjs</h4>
|
|
27
|
-
<p className="text-sm">The React Framework for the Web</p>
|
|
28
|
-
</div>
|
|
29
|
-
</HoverCardContent>
|
|
30
|
-
</HoverCard>
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Con Avatar y Detalles
|
|
34
|
-
|
|
35
|
-
```tsx
|
|
36
|
-
<HoverCard>
|
|
37
|
-
<HoverCardTrigger asChild>
|
|
38
|
-
<a href="https://github.com/vercel" className="underline">
|
|
39
|
-
@vercel
|
|
40
|
-
</a>
|
|
41
|
-
</HoverCardTrigger>
|
|
42
|
-
<HoverCardContent className="w-80">
|
|
43
|
-
<div className="flex gap-4">
|
|
44
|
-
<Avatar>
|
|
45
|
-
<AvatarImage src="https://github.com/vercel.png" />
|
|
46
|
-
<AvatarFallback>V</AvatarFallback>
|
|
47
|
-
</Avatar>
|
|
48
|
-
<div className="space-y-1">
|
|
49
|
-
<h4 className="text-sm font-semibold">@vercel</h4>
|
|
50
|
-
<p className="text-sm">
|
|
51
|
-
Deploy web projects with the best frontend developer experience.
|
|
52
|
-
</p>
|
|
53
|
-
</div>
|
|
54
|
-
</div>
|
|
55
|
-
</HoverCardContent>
|
|
56
|
-
</HoverCard>
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
**Componentes**: 3 (HoverCard, HoverCardTrigger, HoverCardContent)
|
|
60
|
-
|
|
61
|
-
## Props
|
|
62
|
-
|
|
63
|
-
| Prop | Tipo | Default | Descripción |
|
|
64
|
-
| ---------- | -------- | ------- | -------------------------- |
|
|
65
|
-
| openDelay | `number` | `200` | Delay antes de abrir (ms) |
|
|
66
|
-
| closeDelay | `number` | `300` | Delay antes de cerrar (ms) |
|
|
67
|
-
|
|
68
|
-
## Referencias
|
|
69
|
-
|
|
70
|
-
- <https://ui.shadcn.com/docs/components/hover-card>
|
|
71
|
-
- <https://www.radix-ui.com/primitives/docs/components/hover-card>
|
|
72
|
-
|
|
73
|
-
## Patrones de Uso
|
|
74
|
-
|
|
75
|
-
### Básico
|
|
76
|
-
|
|
77
|
-
```tsx
|
|
78
|
-
<HoverCard>
|
|
79
|
-
<HoverCardTrigger asChild>
|
|
80
|
-
<Button variant="link">@nextjs</Button>
|
|
81
|
-
</HoverCardTrigger>
|
|
82
|
-
<HoverCardContent className="w-80">
|
|
83
|
-
<div className="space-y-2">
|
|
84
|
-
<h4 className="text-sm font-semibold">@nextjs</h4>
|
|
85
|
-
<p className="text-sm">
|
|
86
|
-
The React Framework – created and maintained by @vercel.
|
|
87
|
-
</p>
|
|
88
|
-
</div>
|
|
89
|
-
</HoverCardContent>
|
|
90
|
-
</HoverCard>
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Con Avatar (User Preview)
|
|
94
|
-
|
|
95
|
-
```tsx
|
|
96
|
-
import {
|
|
97
|
-
Avatar,
|
|
98
|
-
AvatarImage,
|
|
99
|
-
AvatarFallback,
|
|
100
|
-
} from "@adamosuiteservices/ui/avatar";
|
|
101
|
-
import { Icon } from "@adamosuiteservices/ui/icon";
|
|
102
|
-
|
|
103
|
-
<HoverCard>
|
|
104
|
-
<HoverCardTrigger asChild>
|
|
105
|
-
<Button variant="link">@shadcn</Button>
|
|
106
|
-
</HoverCardTrigger>
|
|
107
|
-
<HoverCardContent className="w-80">
|
|
108
|
-
<div className="flex justify-between gap-4">
|
|
109
|
-
<Avatar>
|
|
110
|
-
<AvatarImage src="https://github.com/shadcn.png" />
|
|
111
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
112
|
-
</Avatar>
|
|
113
|
-
<div className="space-y-1">
|
|
114
|
-
<h4 className="text-sm font-semibold">@shadcn</h4>
|
|
115
|
-
<p className="text-sm">
|
|
116
|
-
Building design systems and web apps. Creator of ui.shadcn.com.
|
|
117
|
-
</p>
|
|
118
|
-
<div className="flex items-center pt-2">
|
|
119
|
-
<Icon symbol="calendar_month" className="mr-2 text-lg opacity-70" />
|
|
120
|
-
<span className="text-xs text-muted-foreground">
|
|
121
|
-
Joined December 2021
|
|
122
|
-
</span>
|
|
123
|
-
</div>
|
|
124
|
-
</div>
|
|
125
|
-
</div>
|
|
126
|
-
</HoverCardContent>
|
|
127
|
-
</HoverCard>;
|
|
128
|
-
```
|
|
129
|
-
|
|
130
|
-
### Trigger con Avatar
|
|
131
|
-
|
|
132
|
-
```tsx
|
|
133
|
-
<HoverCard>
|
|
134
|
-
<HoverCardTrigger asChild>
|
|
135
|
-
<Avatar className="cursor-pointer">
|
|
136
|
-
<AvatarImage src="https://github.com/shadcn.png" />
|
|
137
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
138
|
-
</Avatar>
|
|
139
|
-
</HoverCardTrigger>
|
|
140
|
-
<HoverCardContent className="w-80">
|
|
141
|
-
<div className="space-y-3">
|
|
142
|
-
<div className="flex items-center gap-3">
|
|
143
|
-
<Avatar>
|
|
144
|
-
<AvatarImage src="https://github.com/shadcn.png" />
|
|
145
|
-
<AvatarFallback>CN</AvatarFallback>
|
|
146
|
-
</Avatar>
|
|
147
|
-
<div>
|
|
148
|
-
<h4 className="text-sm font-semibold">shadcn</h4>
|
|
149
|
-
<p className="text-sm text-muted-foreground">@shadcn</p>
|
|
150
|
-
</div>
|
|
151
|
-
</div>
|
|
152
|
-
<p className="text-sm">Building design systems and web apps.</p>
|
|
153
|
-
<div className="flex items-center gap-4 text-sm text-muted-foreground">
|
|
154
|
-
<div className="flex items-center gap-1">
|
|
155
|
-
<UsersIcon className="h-4 w-4" />
|
|
156
|
-
<span>2.1k followers</span>
|
|
157
|
-
</div>
|
|
158
|
-
<div>Following 180</div>
|
|
159
|
-
</div>
|
|
160
|
-
</div>
|
|
161
|
-
</HoverCardContent>
|
|
162
|
-
</HoverCard>
|
|
163
|
-
```
|
|
164
|
-
|
|
165
|
-
### Repository Info
|
|
166
|
-
|
|
167
|
-
```tsx
|
|
168
|
-
import { Icon } from "@adamosuiteservices/ui/icon";
|
|
169
|
-
|
|
170
|
-
<HoverCard>
|
|
171
|
-
<HoverCardTrigger asChild>
|
|
172
|
-
<Button variant="link" className="font-mono">
|
|
173
|
-
shadcn/ui
|
|
174
|
-
</Button>
|
|
175
|
-
</HoverCardTrigger>
|
|
176
|
-
<HoverCardContent className="w-80">
|
|
177
|
-
<div className="space-y-3">
|
|
178
|
-
<div>
|
|
179
|
-
<h4 className="text-sm font-semibold">shadcn/ui</h4>
|
|
180
|
-
<p className="text-sm text-muted-foreground">
|
|
181
|
-
Beautifully designed components that you can copy and paste into your
|
|
182
|
-
apps.
|
|
183
|
-
</p>
|
|
184
|
-
</div>
|
|
185
|
-
<div className="flex items-center gap-4 text-sm text-muted-foreground">
|
|
186
|
-
<div className="flex items-center gap-1">
|
|
187
|
-
<Icon symbol="star" className="text-lg" />
|
|
188
|
-
<span>45.2k</span>
|
|
189
|
-
</div>
|
|
190
|
-
<div className="flex items-center gap-1">
|
|
191
|
-
<Icon symbol="account_tree" className="text-lg" />
|
|
192
|
-
<span>4.1k</span>
|
|
193
|
-
</div>
|
|
194
|
-
<div className="flex items-center gap-1">
|
|
195
|
-
<div className="h-3 w-3 rounded-full bg-primary" />
|
|
196
|
-
<span>TypeScript</span>
|
|
197
|
-
</div>
|
|
198
|
-
</div>
|
|
199
|
-
</div>
|
|
200
|
-
</HoverCardContent>
|
|
201
|
-
</HoverCard>;
|
|
202
|
-
```
|
|
203
|
-
|
|
204
|
-
### Inline Link Preview
|
|
205
|
-
|
|
206
|
-
```tsx
|
|
207
|
-
<p className="text-sm leading-relaxed">
|
|
208
|
-
This paragraph contains an{" "}
|
|
209
|
-
<HoverCard>
|
|
210
|
-
<HoverCardTrigger asChild>
|
|
211
|
-
<a href="#" className="underline underline-offset-4">
|
|
212
|
-
inline link
|
|
213
|
-
</a>
|
|
214
|
-
</HoverCardTrigger>
|
|
215
|
-
<HoverCardContent className="w-64">
|
|
216
|
-
<div className="space-y-2">
|
|
217
|
-
<h4 className="text-sm font-semibold">Link Preview</h4>
|
|
218
|
-
<p className="text-sm text-muted-foreground">
|
|
219
|
-
This shows additional context when you hover over the link.
|
|
220
|
-
</p>
|
|
221
|
-
</div>
|
|
222
|
-
</HoverCardContent>
|
|
223
|
-
</HoverCard>{" "}
|
|
224
|
-
that shows a preview when hovered.
|
|
225
|
-
</p>
|
|
226
|
-
```
|
|
227
|
-
|
|
228
|
-
### Product Preview con Imagen
|
|
229
|
-
|
|
230
|
-
```tsx
|
|
231
|
-
<HoverCard>
|
|
232
|
-
<HoverCardTrigger asChild>
|
|
233
|
-
<Button variant="link">View product</Button>
|
|
234
|
-
</HoverCardTrigger>
|
|
235
|
-
<HoverCardContent className="w-80">
|
|
236
|
-
<div className="space-y-3">
|
|
237
|
-
<img
|
|
238
|
-
src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800"
|
|
239
|
-
alt="Product preview"
|
|
240
|
-
className="w-full h-32 object-cover rounded-md"
|
|
241
|
-
/>
|
|
242
|
-
<div>
|
|
243
|
-
<h4 className="text-sm font-semibold">Wireless Headphones</h4>
|
|
244
|
-
<p className="text-sm text-muted-foreground">
|
|
245
|
-
High-quality wireless headphones with noise cancellation.
|
|
246
|
-
</p>
|
|
247
|
-
<p className="text-lg font-bold mt-2">$299.99</p>
|
|
248
|
-
</div>
|
|
249
|
-
</div>
|
|
250
|
-
</HoverCardContent>
|
|
251
|
-
</HoverCard>
|
|
252
|
-
```
|
|
253
|
-
|
|
254
|
-
### Con Delays Custom
|
|
255
|
-
|
|
256
|
-
```tsx
|
|
257
|
-
<HoverCard openDelay={1000} closeDelay={500}>
|
|
258
|
-
<HoverCardTrigger asChild>
|
|
259
|
-
<Button variant="outline">Hover (1s delay)</Button>
|
|
260
|
-
</HoverCardTrigger>
|
|
261
|
-
<HoverCardContent className="w-64">
|
|
262
|
-
<div className="space-y-2">
|
|
263
|
-
<h4 className="text-sm font-semibold">Delayed Hover Card</h4>
|
|
264
|
-
<p className="text-sm text-muted-foreground">
|
|
265
|
-
This hover card has a 1 second open delay and 500ms close delay.
|
|
266
|
-
</p>
|
|
267
|
-
</div>
|
|
268
|
-
</HoverCardContent>
|
|
269
|
-
</HoverCard>
|
|
270
|
-
```
|
|
271
|
-
|
|
272
|
-
### Diferentes Tamaños
|
|
273
|
-
|
|
274
|
-
```tsx
|
|
275
|
-
{
|
|
276
|
-
/* Small */
|
|
277
|
-
}
|
|
278
|
-
<HoverCard>
|
|
279
|
-
<HoverCardTrigger asChild>
|
|
280
|
-
<Button variant="outline" size="sm">
|
|
281
|
-
Small
|
|
282
|
-
</Button>
|
|
283
|
-
</HoverCardTrigger>
|
|
284
|
-
<HoverCardContent className="w-48">
|
|
285
|
-
<p className="text-sm">Small hover card content.</p>
|
|
286
|
-
</HoverCardContent>
|
|
287
|
-
</HoverCard>;
|
|
288
|
-
|
|
289
|
-
{
|
|
290
|
-
/* Medium (default) */
|
|
291
|
-
}
|
|
292
|
-
<HoverCard>
|
|
293
|
-
<HoverCardTrigger asChild>
|
|
294
|
-
<Button variant="outline">Medium</Button>
|
|
295
|
-
</HoverCardTrigger>
|
|
296
|
-
<HoverCardContent className="w-64">
|
|
297
|
-
<p className="text-sm">Medium sized hover card.</p>
|
|
298
|
-
</HoverCardContent>
|
|
299
|
-
</HoverCard>;
|
|
300
|
-
|
|
301
|
-
{
|
|
302
|
-
/* Large */
|
|
303
|
-
}
|
|
304
|
-
<HoverCard>
|
|
305
|
-
<HoverCardTrigger asChild>
|
|
306
|
-
<Button variant="outline" size="lg">
|
|
307
|
-
Large
|
|
308
|
-
</Button>
|
|
309
|
-
</HoverCardTrigger>
|
|
310
|
-
<HoverCardContent className="w-96">
|
|
311
|
-
<div className="space-y-2">
|
|
312
|
-
<h4 className="text-sm font-semibold">Large Hover Card</h4>
|
|
313
|
-
<p className="text-sm">
|
|
314
|
-
This is a larger hover card with more content space.
|
|
315
|
-
</p>
|
|
316
|
-
</div>
|
|
317
|
-
</HoverCardContent>
|
|
318
|
-
</HoverCard>;
|
|
319
|
-
```
|
|
320
|
-
|
|
321
|
-
### Posicionamiento Custom
|
|
322
|
-
|
|
323
|
-
```tsx
|
|
324
|
-
{
|
|
325
|
-
/* Top */
|
|
326
|
-
}
|
|
327
|
-
<HoverCard>
|
|
328
|
-
<HoverCardTrigger asChild>
|
|
329
|
-
<Button variant="outline">Top</Button>
|
|
330
|
-
</HoverCardTrigger>
|
|
331
|
-
<HoverCardContent side="top" className="w-48">
|
|
332
|
-
<p className="text-sm">Content positioned above.</p>
|
|
333
|
-
</HoverCardContent>
|
|
334
|
-
</HoverCard>;
|
|
335
|
-
|
|
336
|
-
{
|
|
337
|
-
/* Right */
|
|
338
|
-
}
|
|
339
|
-
<HoverCard>
|
|
340
|
-
<HoverCardTrigger asChild>
|
|
341
|
-
<Button variant="outline">Right</Button>
|
|
342
|
-
</HoverCardTrigger>
|
|
343
|
-
<HoverCardContent side="right" className="w-48">
|
|
344
|
-
<p className="text-sm">Content positioned to the right.</p>
|
|
345
|
-
</HoverCardContent>
|
|
346
|
-
</HoverCard>;
|
|
347
|
-
```
|
|
348
|
-
|
|
349
|
-
### Controlado
|
|
350
|
-
|
|
351
|
-
```tsx
|
|
352
|
-
import { useState } from "react";
|
|
353
|
-
|
|
354
|
-
function App() {
|
|
355
|
-
const [open, setOpen] = useState(false);
|
|
356
|
-
|
|
357
|
-
return (
|
|
358
|
-
<HoverCard open={open} onOpenChange={setOpen}>
|
|
359
|
-
<HoverCardTrigger asChild>
|
|
360
|
-
<Button>Controlled</Button>
|
|
361
|
-
</HoverCardTrigger>
|
|
362
|
-
<HoverCardContent>
|
|
363
|
-
<p className="text-sm">Hover card content</p>
|
|
364
|
-
<Button onClick={() => setOpen(false)}>Close</Button>
|
|
365
|
-
</HoverCardContent>
|
|
366
|
-
</HoverCard>
|
|
367
|
-
);
|
|
368
|
-
}
|
|
369
|
-
```
|
|
370
|
-
|
|
371
|
-
## Casos de Uso Comunes
|
|
372
|
-
|
|
373
|
-
**User mentions**: Preview de perfil al hover sobre @username
|
|
374
|
-
**Link previews**: Información adicional sobre links externos
|
|
375
|
-
**Product cards**: Preview rápido de productos sin navegar
|
|
376
|
-
**Repository info**: Stats y detalles de repos en listas
|
|
377
|
-
**Tooltips ricos**: Información estructurada vs simple tooltip
|
|
378
|
-
**Avatar hovers**: Detalles de usuario al hover sobre avatar
|
|
379
|
-
|
|
380
|
-
## Estados y Data Attributes
|
|
381
|
-
|
|
382
|
-
### Content States
|
|
383
|
-
|
|
384
|
-
- **Open**: `data-[state=open]` → `animate-in`, `fade-in-0`, `zoom-in-95`
|
|
385
|
-
- **Closed**: `data-[state=closed]` → `animate-out`, `fade-out-0`, `zoom-out-95`
|
|
386
|
-
|
|
387
|
-
### Animations
|
|
388
|
-
|
|
389
|
-
- **Slide in**: `data-[side=top|right|bottom|left]` → direccional
|
|
390
|
-
|
|
391
|
-
## Interacción
|
|
392
|
-
|
|
393
|
-
- ✅ **Hover to open**: Abre al pasar mouse sobre trigger
|
|
394
|
-
- ✅ **Hover to close**: Cierra al sacar mouse del trigger y content
|
|
395
|
-
- ✅ **Delay**: `openDelay` y `closeDelay` configurables
|
|
396
|
-
- ✅ **Safe area**: Mouse puede moverse entre trigger y content sin cerrar
|
|
397
|
-
- ✅ **Keyboard**: No se abre con teclado (solo mouse/pointer)
|
|
398
|
-
- ✅ **Touch**: No funciona en dispositivos táctiles (solo hover)
|
|
399
|
-
|
|
400
|
-
## Accesibilidad
|
|
401
|
-
|
|
402
|
-
- ✅ **ARIA**: `role="tooltip"` o `aria-describedby` según contenido
|
|
403
|
-
- ✅ **Keyboard**: No accesible por teclado (por diseño)
|
|
404
|
-
- ✅ **Screen readers**: Contenido anunciado al abrir
|
|
405
|
-
- ✅ **Focus**: No recibe focus, solo hover
|
|
406
|
-
- ⚠️ **Mobile**: No funciona en touch devices (considerar alternativas)
|
|
407
|
-
|
|
408
|
-
**Nota**: Para contenido crítico, no uses HoverCard. Usa Dialog o incluye la info directamente.
|
|
409
|
-
|
|
410
|
-
## Notas de Implementación
|
|
411
|
-
|
|
412
|
-
- **Basado en Radix UI**: `@radix-ui/react-hover-card`
|
|
413
|
-
- **Hover only**: Solo funciona con mouse/pointer, no touch
|
|
414
|
-
- **Portal rendering**: Content se renderiza en `document.body`
|
|
415
|
-
- **Collision detection**: Auto-ajusta posición si sale del viewport
|
|
416
|
-
- **Safe area**: Permite mover mouse entre trigger y content
|
|
417
|
-
- **No keyboard**: No se puede abrir con teclado (limitación intencional)
|
|
418
|
-
- **Default delays**: 200ms open, 300ms close
|
|
419
|
-
- **Z-index**: 50 para aparecer sobre contenido
|
|
420
|
-
- **Transform origin**: CSS variables de Radix para animaciones
|
|
421
|
-
|
|
422
|
-
## Diferencias con Tooltip
|
|
423
|
-
|
|
424
|
-
| Aspecto | HoverCard | Tooltip |
|
|
425
|
-
| --------------- | ----------------------------------- | -------------------- |
|
|
426
|
-
| **Contenido** | Rico (texto, imágenes, links) | Simple (texto plano) |
|
|
427
|
-
| **Interacción** | Hoverable (puede hacer clic dentro) | No interactivo |
|
|
428
|
-
| **Tamaño** | Variable, usualmente más grande | Pequeño, compacto |
|
|
429
|
-
| **Keyboard** | No accesible | Accesible con focus |
|
|
430
|
-
| **Uso** | Previews, información adicional | Labels, ayuda breve |
|
|
431
|
-
|
|
432
|
-
## Troubleshooting
|
|
433
|
-
|
|
434
|
-
**No aparece en mobile**: HoverCard solo funciona con hover, no en touch devices
|
|
435
|
-
**Se cierra inmediatamente**: Verifica `closeDelay` o que no haya CSS interfiriendo
|
|
436
|
-
**No abre**: Verifica que `asChild` esté correcto en trigger con componentes custom
|
|
437
|
-
**Posición incorrecta**: Ajusta `side`, `align`, `sideOffset` y `alignOffset`
|
|
438
|
-
**Contenido cortado**: Asegúrate de que el portal no esté limitado por overflow
|
|
439
|
-
**Flicker al abrir**: Aumenta `openDelay` para evitar opens accidentales
|
|
440
|
-
**No se puede hacer clic en links**: Content debe ser hoverable, verifica que no se cierre muy rápido
|
|
441
|
-
**Keyboard no funciona**: HoverCard no es accesible por teclado por diseño
|
|
442
|
-
|
|
443
|
-
## Referencias
|
|
444
|
-
|
|
445
|
-
- **Radix UI Hover Card**: https://www.radix-ui.com/primitives/docs/components/hover-card
|
|
446
|
-
- **shadcn/ui Hover Card**: https://ui.shadcn.com/docs/components/hover-card
|
|
1
|
+
# Hover Card Component
|
|
2
|
+
|
|
3
|
+
Card emergente al hacer hover, basado en Radix UI. Ideal para previsualizar contenido, mostrar información adicional de usuarios, links o productos sin necesidad de click.
|
|
4
|
+
|
|
5
|
+
## Descripción
|
|
6
|
+
|
|
7
|
+
El componente `HoverCard` muestra contenido adicional al pasar el mouse sobre un elemento.
|
|
8
|
+
|
|
9
|
+
## Importación
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import {
|
|
13
|
+
HoverCard,
|
|
14
|
+
HoverCardContent,
|
|
15
|
+
HoverCardTrigger,
|
|
16
|
+
} from "@adamosuiteservices/ui/hover-card";
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Uso Básico
|
|
20
|
+
|
|
21
|
+
```tsx
|
|
22
|
+
<HoverCard>
|
|
23
|
+
<HoverCardTrigger>Hover me</HoverCardTrigger>
|
|
24
|
+
<HoverCardContent>
|
|
25
|
+
<div>
|
|
26
|
+
<h4 className="font-semibold">@nextjs</h4>
|
|
27
|
+
<p className="text-sm">The React Framework for the Web</p>
|
|
28
|
+
</div>
|
|
29
|
+
</HoverCardContent>
|
|
30
|
+
</HoverCard>
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Con Avatar y Detalles
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
<HoverCard>
|
|
37
|
+
<HoverCardTrigger asChild>
|
|
38
|
+
<a href="https://github.com/vercel" className="underline">
|
|
39
|
+
@vercel
|
|
40
|
+
</a>
|
|
41
|
+
</HoverCardTrigger>
|
|
42
|
+
<HoverCardContent className="w-80">
|
|
43
|
+
<div className="flex gap-4">
|
|
44
|
+
<Avatar>
|
|
45
|
+
<AvatarImage src="https://github.com/vercel.png" />
|
|
46
|
+
<AvatarFallback>V</AvatarFallback>
|
|
47
|
+
</Avatar>
|
|
48
|
+
<div className="space-y-1">
|
|
49
|
+
<h4 className="text-sm font-semibold">@vercel</h4>
|
|
50
|
+
<p className="text-sm">
|
|
51
|
+
Deploy web projects with the best frontend developer experience.
|
|
52
|
+
</p>
|
|
53
|
+
</div>
|
|
54
|
+
</div>
|
|
55
|
+
</HoverCardContent>
|
|
56
|
+
</HoverCard>
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
**Componentes**: 3 (HoverCard, HoverCardTrigger, HoverCardContent)
|
|
60
|
+
|
|
61
|
+
## Props
|
|
62
|
+
|
|
63
|
+
| Prop | Tipo | Default | Descripción |
|
|
64
|
+
| ---------- | -------- | ------- | -------------------------- |
|
|
65
|
+
| openDelay | `number` | `200` | Delay antes de abrir (ms) |
|
|
66
|
+
| closeDelay | `number` | `300` | Delay antes de cerrar (ms) |
|
|
67
|
+
|
|
68
|
+
## Referencias
|
|
69
|
+
|
|
70
|
+
- <https://ui.shadcn.com/docs/components/hover-card>
|
|
71
|
+
- <https://www.radix-ui.com/primitives/docs/components/hover-card>
|
|
72
|
+
|
|
73
|
+
## Patrones de Uso
|
|
74
|
+
|
|
75
|
+
### Básico
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<HoverCard>
|
|
79
|
+
<HoverCardTrigger asChild>
|
|
80
|
+
<Button variant="link">@nextjs</Button>
|
|
81
|
+
</HoverCardTrigger>
|
|
82
|
+
<HoverCardContent className="w-80">
|
|
83
|
+
<div className="space-y-2">
|
|
84
|
+
<h4 className="text-sm font-semibold">@nextjs</h4>
|
|
85
|
+
<p className="text-sm">
|
|
86
|
+
The React Framework – created and maintained by @vercel.
|
|
87
|
+
</p>
|
|
88
|
+
</div>
|
|
89
|
+
</HoverCardContent>
|
|
90
|
+
</HoverCard>
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
### Con Avatar (User Preview)
|
|
94
|
+
|
|
95
|
+
```tsx
|
|
96
|
+
import {
|
|
97
|
+
Avatar,
|
|
98
|
+
AvatarImage,
|
|
99
|
+
AvatarFallback,
|
|
100
|
+
} from "@adamosuiteservices/ui/avatar";
|
|
101
|
+
import { Icon } from "@adamosuiteservices/ui/icon";
|
|
102
|
+
|
|
103
|
+
<HoverCard>
|
|
104
|
+
<HoverCardTrigger asChild>
|
|
105
|
+
<Button variant="link">@shadcn</Button>
|
|
106
|
+
</HoverCardTrigger>
|
|
107
|
+
<HoverCardContent className="w-80">
|
|
108
|
+
<div className="flex justify-between gap-4">
|
|
109
|
+
<Avatar>
|
|
110
|
+
<AvatarImage src="https://github.com/shadcn.png" />
|
|
111
|
+
<AvatarFallback>CN</AvatarFallback>
|
|
112
|
+
</Avatar>
|
|
113
|
+
<div className="space-y-1">
|
|
114
|
+
<h4 className="text-sm font-semibold">@shadcn</h4>
|
|
115
|
+
<p className="text-sm">
|
|
116
|
+
Building design systems and web apps. Creator of ui.shadcn.com.
|
|
117
|
+
</p>
|
|
118
|
+
<div className="flex items-center pt-2">
|
|
119
|
+
<Icon symbol="calendar_month" className="mr-2 text-lg opacity-70" />
|
|
120
|
+
<span className="text-xs text-muted-foreground">
|
|
121
|
+
Joined December 2021
|
|
122
|
+
</span>
|
|
123
|
+
</div>
|
|
124
|
+
</div>
|
|
125
|
+
</div>
|
|
126
|
+
</HoverCardContent>
|
|
127
|
+
</HoverCard>;
|
|
128
|
+
```
|
|
129
|
+
|
|
130
|
+
### Trigger con Avatar
|
|
131
|
+
|
|
132
|
+
```tsx
|
|
133
|
+
<HoverCard>
|
|
134
|
+
<HoverCardTrigger asChild>
|
|
135
|
+
<Avatar className="cursor-pointer">
|
|
136
|
+
<AvatarImage src="https://github.com/shadcn.png" />
|
|
137
|
+
<AvatarFallback>CN</AvatarFallback>
|
|
138
|
+
</Avatar>
|
|
139
|
+
</HoverCardTrigger>
|
|
140
|
+
<HoverCardContent className="w-80">
|
|
141
|
+
<div className="space-y-3">
|
|
142
|
+
<div className="flex items-center gap-3">
|
|
143
|
+
<Avatar>
|
|
144
|
+
<AvatarImage src="https://github.com/shadcn.png" />
|
|
145
|
+
<AvatarFallback>CN</AvatarFallback>
|
|
146
|
+
</Avatar>
|
|
147
|
+
<div>
|
|
148
|
+
<h4 className="text-sm font-semibold">shadcn</h4>
|
|
149
|
+
<p className="text-sm text-muted-foreground">@shadcn</p>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
<p className="text-sm">Building design systems and web apps.</p>
|
|
153
|
+
<div className="flex items-center gap-4 text-sm text-muted-foreground">
|
|
154
|
+
<div className="flex items-center gap-1">
|
|
155
|
+
<UsersIcon className="h-4 w-4" />
|
|
156
|
+
<span>2.1k followers</span>
|
|
157
|
+
</div>
|
|
158
|
+
<div>Following 180</div>
|
|
159
|
+
</div>
|
|
160
|
+
</div>
|
|
161
|
+
</HoverCardContent>
|
|
162
|
+
</HoverCard>
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
### Repository Info
|
|
166
|
+
|
|
167
|
+
```tsx
|
|
168
|
+
import { Icon } from "@adamosuiteservices/ui/icon";
|
|
169
|
+
|
|
170
|
+
<HoverCard>
|
|
171
|
+
<HoverCardTrigger asChild>
|
|
172
|
+
<Button variant="link" className="font-mono">
|
|
173
|
+
shadcn/ui
|
|
174
|
+
</Button>
|
|
175
|
+
</HoverCardTrigger>
|
|
176
|
+
<HoverCardContent className="w-80">
|
|
177
|
+
<div className="space-y-3">
|
|
178
|
+
<div>
|
|
179
|
+
<h4 className="text-sm font-semibold">shadcn/ui</h4>
|
|
180
|
+
<p className="text-sm text-muted-foreground">
|
|
181
|
+
Beautifully designed components that you can copy and paste into your
|
|
182
|
+
apps.
|
|
183
|
+
</p>
|
|
184
|
+
</div>
|
|
185
|
+
<div className="flex items-center gap-4 text-sm text-muted-foreground">
|
|
186
|
+
<div className="flex items-center gap-1">
|
|
187
|
+
<Icon symbol="star" className="text-lg" />
|
|
188
|
+
<span>45.2k</span>
|
|
189
|
+
</div>
|
|
190
|
+
<div className="flex items-center gap-1">
|
|
191
|
+
<Icon symbol="account_tree" className="text-lg" />
|
|
192
|
+
<span>4.1k</span>
|
|
193
|
+
</div>
|
|
194
|
+
<div className="flex items-center gap-1">
|
|
195
|
+
<div className="h-3 w-3 rounded-full bg-primary" />
|
|
196
|
+
<span>TypeScript</span>
|
|
197
|
+
</div>
|
|
198
|
+
</div>
|
|
199
|
+
</div>
|
|
200
|
+
</HoverCardContent>
|
|
201
|
+
</HoverCard>;
|
|
202
|
+
```
|
|
203
|
+
|
|
204
|
+
### Inline Link Preview
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
<p className="text-sm leading-relaxed">
|
|
208
|
+
This paragraph contains an{" "}
|
|
209
|
+
<HoverCard>
|
|
210
|
+
<HoverCardTrigger asChild>
|
|
211
|
+
<a href="#" className="underline underline-offset-4">
|
|
212
|
+
inline link
|
|
213
|
+
</a>
|
|
214
|
+
</HoverCardTrigger>
|
|
215
|
+
<HoverCardContent className="w-64">
|
|
216
|
+
<div className="space-y-2">
|
|
217
|
+
<h4 className="text-sm font-semibold">Link Preview</h4>
|
|
218
|
+
<p className="text-sm text-muted-foreground">
|
|
219
|
+
This shows additional context when you hover over the link.
|
|
220
|
+
</p>
|
|
221
|
+
</div>
|
|
222
|
+
</HoverCardContent>
|
|
223
|
+
</HoverCard>{" "}
|
|
224
|
+
that shows a preview when hovered.
|
|
225
|
+
</p>
|
|
226
|
+
```
|
|
227
|
+
|
|
228
|
+
### Product Preview con Imagen
|
|
229
|
+
|
|
230
|
+
```tsx
|
|
231
|
+
<HoverCard>
|
|
232
|
+
<HoverCardTrigger asChild>
|
|
233
|
+
<Button variant="link">View product</Button>
|
|
234
|
+
</HoverCardTrigger>
|
|
235
|
+
<HoverCardContent className="w-80">
|
|
236
|
+
<div className="space-y-3">
|
|
237
|
+
<img
|
|
238
|
+
src="https://images.unsplash.com/photo-1588345921523-c2dcdb7f1dcd?w=800"
|
|
239
|
+
alt="Product preview"
|
|
240
|
+
className="w-full h-32 object-cover rounded-md"
|
|
241
|
+
/>
|
|
242
|
+
<div>
|
|
243
|
+
<h4 className="text-sm font-semibold">Wireless Headphones</h4>
|
|
244
|
+
<p className="text-sm text-muted-foreground">
|
|
245
|
+
High-quality wireless headphones with noise cancellation.
|
|
246
|
+
</p>
|
|
247
|
+
<p className="text-lg font-bold mt-2">$299.99</p>
|
|
248
|
+
</div>
|
|
249
|
+
</div>
|
|
250
|
+
</HoverCardContent>
|
|
251
|
+
</HoverCard>
|
|
252
|
+
```
|
|
253
|
+
|
|
254
|
+
### Con Delays Custom
|
|
255
|
+
|
|
256
|
+
```tsx
|
|
257
|
+
<HoverCard openDelay={1000} closeDelay={500}>
|
|
258
|
+
<HoverCardTrigger asChild>
|
|
259
|
+
<Button variant="outline">Hover (1s delay)</Button>
|
|
260
|
+
</HoverCardTrigger>
|
|
261
|
+
<HoverCardContent className="w-64">
|
|
262
|
+
<div className="space-y-2">
|
|
263
|
+
<h4 className="text-sm font-semibold">Delayed Hover Card</h4>
|
|
264
|
+
<p className="text-sm text-muted-foreground">
|
|
265
|
+
This hover card has a 1 second open delay and 500ms close delay.
|
|
266
|
+
</p>
|
|
267
|
+
</div>
|
|
268
|
+
</HoverCardContent>
|
|
269
|
+
</HoverCard>
|
|
270
|
+
```
|
|
271
|
+
|
|
272
|
+
### Diferentes Tamaños
|
|
273
|
+
|
|
274
|
+
```tsx
|
|
275
|
+
{
|
|
276
|
+
/* Small */
|
|
277
|
+
}
|
|
278
|
+
<HoverCard>
|
|
279
|
+
<HoverCardTrigger asChild>
|
|
280
|
+
<Button variant="outline" size="sm">
|
|
281
|
+
Small
|
|
282
|
+
</Button>
|
|
283
|
+
</HoverCardTrigger>
|
|
284
|
+
<HoverCardContent className="w-48">
|
|
285
|
+
<p className="text-sm">Small hover card content.</p>
|
|
286
|
+
</HoverCardContent>
|
|
287
|
+
</HoverCard>;
|
|
288
|
+
|
|
289
|
+
{
|
|
290
|
+
/* Medium (default) */
|
|
291
|
+
}
|
|
292
|
+
<HoverCard>
|
|
293
|
+
<HoverCardTrigger asChild>
|
|
294
|
+
<Button variant="outline">Medium</Button>
|
|
295
|
+
</HoverCardTrigger>
|
|
296
|
+
<HoverCardContent className="w-64">
|
|
297
|
+
<p className="text-sm">Medium sized hover card.</p>
|
|
298
|
+
</HoverCardContent>
|
|
299
|
+
</HoverCard>;
|
|
300
|
+
|
|
301
|
+
{
|
|
302
|
+
/* Large */
|
|
303
|
+
}
|
|
304
|
+
<HoverCard>
|
|
305
|
+
<HoverCardTrigger asChild>
|
|
306
|
+
<Button variant="outline" size="lg">
|
|
307
|
+
Large
|
|
308
|
+
</Button>
|
|
309
|
+
</HoverCardTrigger>
|
|
310
|
+
<HoverCardContent className="w-96">
|
|
311
|
+
<div className="space-y-2">
|
|
312
|
+
<h4 className="text-sm font-semibold">Large Hover Card</h4>
|
|
313
|
+
<p className="text-sm">
|
|
314
|
+
This is a larger hover card with more content space.
|
|
315
|
+
</p>
|
|
316
|
+
</div>
|
|
317
|
+
</HoverCardContent>
|
|
318
|
+
</HoverCard>;
|
|
319
|
+
```
|
|
320
|
+
|
|
321
|
+
### Posicionamiento Custom
|
|
322
|
+
|
|
323
|
+
```tsx
|
|
324
|
+
{
|
|
325
|
+
/* Top */
|
|
326
|
+
}
|
|
327
|
+
<HoverCard>
|
|
328
|
+
<HoverCardTrigger asChild>
|
|
329
|
+
<Button variant="outline">Top</Button>
|
|
330
|
+
</HoverCardTrigger>
|
|
331
|
+
<HoverCardContent side="top" className="w-48">
|
|
332
|
+
<p className="text-sm">Content positioned above.</p>
|
|
333
|
+
</HoverCardContent>
|
|
334
|
+
</HoverCard>;
|
|
335
|
+
|
|
336
|
+
{
|
|
337
|
+
/* Right */
|
|
338
|
+
}
|
|
339
|
+
<HoverCard>
|
|
340
|
+
<HoverCardTrigger asChild>
|
|
341
|
+
<Button variant="outline">Right</Button>
|
|
342
|
+
</HoverCardTrigger>
|
|
343
|
+
<HoverCardContent side="right" className="w-48">
|
|
344
|
+
<p className="text-sm">Content positioned to the right.</p>
|
|
345
|
+
</HoverCardContent>
|
|
346
|
+
</HoverCard>;
|
|
347
|
+
```
|
|
348
|
+
|
|
349
|
+
### Controlado
|
|
350
|
+
|
|
351
|
+
```tsx
|
|
352
|
+
import { useState } from "react";
|
|
353
|
+
|
|
354
|
+
function App() {
|
|
355
|
+
const [open, setOpen] = useState(false);
|
|
356
|
+
|
|
357
|
+
return (
|
|
358
|
+
<HoverCard open={open} onOpenChange={setOpen}>
|
|
359
|
+
<HoverCardTrigger asChild>
|
|
360
|
+
<Button>Controlled</Button>
|
|
361
|
+
</HoverCardTrigger>
|
|
362
|
+
<HoverCardContent>
|
|
363
|
+
<p className="text-sm">Hover card content</p>
|
|
364
|
+
<Button onClick={() => setOpen(false)}>Close</Button>
|
|
365
|
+
</HoverCardContent>
|
|
366
|
+
</HoverCard>
|
|
367
|
+
);
|
|
368
|
+
}
|
|
369
|
+
```
|
|
370
|
+
|
|
371
|
+
## Casos de Uso Comunes
|
|
372
|
+
|
|
373
|
+
**User mentions**: Preview de perfil al hover sobre @username
|
|
374
|
+
**Link previews**: Información adicional sobre links externos
|
|
375
|
+
**Product cards**: Preview rápido de productos sin navegar
|
|
376
|
+
**Repository info**: Stats y detalles de repos en listas
|
|
377
|
+
**Tooltips ricos**: Información estructurada vs simple tooltip
|
|
378
|
+
**Avatar hovers**: Detalles de usuario al hover sobre avatar
|
|
379
|
+
|
|
380
|
+
## Estados y Data Attributes
|
|
381
|
+
|
|
382
|
+
### Content States
|
|
383
|
+
|
|
384
|
+
- **Open**: `data-[state=open]` → `animate-in`, `fade-in-0`, `zoom-in-95`
|
|
385
|
+
- **Closed**: `data-[state=closed]` → `animate-out`, `fade-out-0`, `zoom-out-95`
|
|
386
|
+
|
|
387
|
+
### Animations
|
|
388
|
+
|
|
389
|
+
- **Slide in**: `data-[side=top|right|bottom|left]` → direccional
|
|
390
|
+
|
|
391
|
+
## Interacción
|
|
392
|
+
|
|
393
|
+
- ✅ **Hover to open**: Abre al pasar mouse sobre trigger
|
|
394
|
+
- ✅ **Hover to close**: Cierra al sacar mouse del trigger y content
|
|
395
|
+
- ✅ **Delay**: `openDelay` y `closeDelay` configurables
|
|
396
|
+
- ✅ **Safe area**: Mouse puede moverse entre trigger y content sin cerrar
|
|
397
|
+
- ✅ **Keyboard**: No se abre con teclado (solo mouse/pointer)
|
|
398
|
+
- ✅ **Touch**: No funciona en dispositivos táctiles (solo hover)
|
|
399
|
+
|
|
400
|
+
## Accesibilidad
|
|
401
|
+
|
|
402
|
+
- ✅ **ARIA**: `role="tooltip"` o `aria-describedby` según contenido
|
|
403
|
+
- ✅ **Keyboard**: No accesible por teclado (por diseño)
|
|
404
|
+
- ✅ **Screen readers**: Contenido anunciado al abrir
|
|
405
|
+
- ✅ **Focus**: No recibe focus, solo hover
|
|
406
|
+
- ⚠️ **Mobile**: No funciona en touch devices (considerar alternativas)
|
|
407
|
+
|
|
408
|
+
**Nota**: Para contenido crítico, no uses HoverCard. Usa Dialog o incluye la info directamente.
|
|
409
|
+
|
|
410
|
+
## Notas de Implementación
|
|
411
|
+
|
|
412
|
+
- **Basado en Radix UI**: `@radix-ui/react-hover-card`
|
|
413
|
+
- **Hover only**: Solo funciona con mouse/pointer, no touch
|
|
414
|
+
- **Portal rendering**: Content se renderiza en `document.body`
|
|
415
|
+
- **Collision detection**: Auto-ajusta posición si sale del viewport
|
|
416
|
+
- **Safe area**: Permite mover mouse entre trigger y content
|
|
417
|
+
- **No keyboard**: No se puede abrir con teclado (limitación intencional)
|
|
418
|
+
- **Default delays**: 200ms open, 300ms close
|
|
419
|
+
- **Z-index**: 50 para aparecer sobre contenido
|
|
420
|
+
- **Transform origin**: CSS variables de Radix para animaciones
|
|
421
|
+
|
|
422
|
+
## Diferencias con Tooltip
|
|
423
|
+
|
|
424
|
+
| Aspecto | HoverCard | Tooltip |
|
|
425
|
+
| --------------- | ----------------------------------- | -------------------- |
|
|
426
|
+
| **Contenido** | Rico (texto, imágenes, links) | Simple (texto plano) |
|
|
427
|
+
| **Interacción** | Hoverable (puede hacer clic dentro) | No interactivo |
|
|
428
|
+
| **Tamaño** | Variable, usualmente más grande | Pequeño, compacto |
|
|
429
|
+
| **Keyboard** | No accesible | Accesible con focus |
|
|
430
|
+
| **Uso** | Previews, información adicional | Labels, ayuda breve |
|
|
431
|
+
|
|
432
|
+
## Troubleshooting
|
|
433
|
+
|
|
434
|
+
**No aparece en mobile**: HoverCard solo funciona con hover, no en touch devices
|
|
435
|
+
**Se cierra inmediatamente**: Verifica `closeDelay` o que no haya CSS interfiriendo
|
|
436
|
+
**No abre**: Verifica que `asChild` esté correcto en trigger con componentes custom
|
|
437
|
+
**Posición incorrecta**: Ajusta `side`, `align`, `sideOffset` y `alignOffset`
|
|
438
|
+
**Contenido cortado**: Asegúrate de que el portal no esté limitado por overflow
|
|
439
|
+
**Flicker al abrir**: Aumenta `openDelay` para evitar opens accidentales
|
|
440
|
+
**No se puede hacer clic en links**: Content debe ser hoverable, verifica que no se cierre muy rápido
|
|
441
|
+
**Keyboard no funciona**: HoverCard no es accesible por teclado por diseño
|
|
442
|
+
|
|
443
|
+
## Referencias
|
|
444
|
+
|
|
445
|
+
- **Radix UI Hover Card**: https://www.radix-ui.com/primitives/docs/components/hover-card
|
|
446
|
+
- **shadcn/ui Hover Card**: https://ui.shadcn.com/docs/components/hover-card
|