@adamosuiteservices/ui 2.13.2 → 2.13.3

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.
Files changed (34) hide show
  1. package/dist/components/ui/slider/slider.d.ts +5 -2
  2. package/dist/slider.cjs +6 -7
  3. package/dist/slider.js +191 -177
  4. package/docs/AI-GUIDE.md +321 -321
  5. package/docs/components/layout/sidebar.md +399 -399
  6. package/docs/components/layout/toaster.md +436 -436
  7. package/docs/components/ui/accordion-rounded.md +584 -584
  8. package/docs/components/ui/accordion.md +269 -269
  9. package/docs/components/ui/calendar.md +1159 -1159
  10. package/docs/components/ui/card.md +1455 -1455
  11. package/docs/components/ui/checkbox.md +292 -292
  12. package/docs/components/ui/collapsible.md +323 -323
  13. package/docs/components/ui/dialog.md +628 -628
  14. package/docs/components/ui/field.md +706 -706
  15. package/docs/components/ui/hover-card.md +446 -446
  16. package/docs/components/ui/kbd.md +434 -434
  17. package/docs/components/ui/label.md +359 -359
  18. package/docs/components/ui/pagination.md +650 -650
  19. package/docs/components/ui/popover.md +536 -536
  20. package/docs/components/ui/progress.md +182 -182
  21. package/docs/components/ui/radio-group.md +311 -311
  22. package/docs/components/ui/separator.md +214 -214
  23. package/docs/components/ui/sheet.md +174 -174
  24. package/docs/components/ui/skeleton.md +140 -140
  25. package/docs/components/ui/slider.md +460 -341
  26. package/docs/components/ui/spinner.md +170 -170
  27. package/docs/components/ui/switch.md +408 -408
  28. package/docs/components/ui/tabs-underline.md +106 -106
  29. package/docs/components/ui/tabs.md +122 -122
  30. package/docs/components/ui/textarea.md +243 -243
  31. package/docs/components/ui/toggle.md +237 -237
  32. package/docs/components/ui/tooltip.md +317 -317
  33. package/docs/components/ui/typography.md +320 -320
  34. 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