@adamosuiteservices/ui 1.8.13 → 1.9.14
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/components/ui/icon/icon.d.ts +11 -0
- package/dist/components/ui/icon/icon.stories.d.ts +55 -0
- package/dist/components/ui/icon/index.d.ts +1 -0
- package/dist/components/ui/input-group/input-group.d.ts +1 -1
- package/dist/custom-layered-styles.css +1 -1
- package/dist/icon.cjs +6 -0
- package/dist/icon.js +36 -0
- package/dist/icons.css +1 -0
- package/dist/styles.css +1 -1
- package/docs/AI-GUIDE.md +321 -321
- package/docs/components/layout/sidebar.md +404 -404
- package/docs/components/layout/toaster.md +436 -436
- package/docs/components/ui/accordion-rounded.md +583 -583
- package/docs/components/ui/accordion.md +267 -267
- package/docs/components/ui/alert.md +671 -671
- package/docs/components/ui/avatar.md +588 -588
- package/docs/components/ui/badge.md +1024 -1024
- package/docs/components/ui/button-group.md +1002 -1002
- package/docs/components/ui/button.md +1078 -1078
- package/docs/components/ui/calendar.md +1159 -1159
- package/docs/components/ui/card.md +1265 -1265
- package/docs/components/ui/checkbox.md +292 -292
- package/docs/components/ui/collapsible.md +320 -320
- 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 +731 -731
- package/docs/components/ui/field.md +706 -706
- package/docs/components/ui/hover-card.md +446 -446
- package/docs/components/ui/icon.md +502 -0
- package/docs/components/ui/input-group.md +509 -509
- 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 +402 -402
- package/docs/components/ui/table.md +183 -183
- 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 +243 -243
- package/docs/components/ui/tooltip.md +320 -320
- package/docs/components/ui/typography.md +191 -191
- package/package.json +6 -5
- package/dist/components/icons/account-balance-icon.d.ts +0 -3
- package/dist/components/icons/account-icon.d.ts +0 -3
- package/dist/components/icons/add-circle-icon.d.ts +0 -3
- package/dist/components/icons/alarm-icon.d.ts +0 -3
- package/dist/components/icons/archive-icon.d.ts +0 -3
- package/dist/components/icons/arrow-back-icon.d.ts +0 -3
- package/dist/components/icons/arrow-circle-up-icon.d.ts +0 -3
- package/dist/components/icons/arrow-forward-icon.d.ts +0 -3
- package/dist/components/icons/arrow-outward-icon.d.ts +0 -3
- package/dist/components/icons/article-icon.d.ts +0 -3
- package/dist/components/icons/attach-file-icon.d.ts +0 -3
- package/dist/components/icons/autorenew-icon.d.ts +0 -3
- package/dist/components/icons/bookmark-icon.d.ts +0 -3
- package/dist/components/icons/calculate-icon.d.ts +0 -3
- package/dist/components/icons/calendar-today-icon.d.ts +0 -3
- package/dist/components/icons/call-split-icon.d.ts +0 -3
- package/dist/components/icons/cancel-filled-icon.d.ts +0 -3
- package/dist/components/icons/cancel-icon.d.ts +0 -3
- package/dist/components/icons/check-circle-icon.d.ts +0 -3
- package/dist/components/icons/check-icon.d.ts +0 -3
- package/dist/components/icons/chevron-back-icon.d.ts +0 -3
- package/dist/components/icons/chevron-down-icon.d.ts +0 -3
- package/dist/components/icons/chevron-forward-icon.d.ts +0 -3
- package/dist/components/icons/chevron-up-icon.d.ts +0 -3
- package/dist/components/icons/clarify-icon.d.ts +0 -3
- package/dist/components/icons/clock-icon.d.ts +0 -3
- package/dist/components/icons/close-icon.d.ts +0 -3
- package/dist/components/icons/confirmation-number-icon.d.ts +0 -3
- package/dist/components/icons/contacts-icon.d.ts +0 -3
- package/dist/components/icons/contract-delete-icon.d.ts +0 -3
- package/dist/components/icons/copy-icon.d.ts +0 -3
- package/dist/components/icons/do-not-touch-icon.d.ts +0 -3
- package/dist/components/icons/download-icon.d.ts +0 -3
- package/dist/components/icons/dragger-icon.d.ts +0 -3
- package/dist/components/icons/edit-icon.d.ts +0 -3
- package/dist/components/icons/edit-square-icon.d.ts +0 -3
- package/dist/components/icons/exclamation-icon.d.ts +0 -3
- package/dist/components/icons/expand-circle-right-icon.d.ts +0 -3
- package/dist/components/icons/feature-search-icon.d.ts +0 -3
- package/dist/components/icons/filter-icon.d.ts +0 -3
- package/dist/components/icons/folder-icon.d.ts +0 -3
- package/dist/components/icons/folder-open-icon.d.ts +0 -3
- package/dist/components/icons/format-list-bulleted-icon.d.ts +0 -3
- package/dist/components/icons/hamburger-menu-icon.d.ts +0 -3
- package/dist/components/icons/help-icon.d.ts +0 -3
- package/dist/components/icons/hide-pass-icon.d.ts +0 -3
- package/dist/components/icons/home-icon.d.ts +0 -3
- package/dist/components/icons/id-card-icon.d.ts +0 -3
- package/dist/components/icons/index.d.ts +0 -88
- package/dist/components/icons/info-icon.d.ts +0 -3
- package/dist/components/icons/kid-star-icon.d.ts +0 -3
- package/dist/components/icons/language-icon.d.ts +0 -3
- package/dist/components/icons/last-page-icon.d.ts +0 -3
- package/dist/components/icons/layers-icon.d.ts +0 -3
- package/dist/components/icons/location-icon.d.ts +0 -3
- package/dist/components/icons/mail-icon.d.ts +0 -3
- package/dist/components/icons/manage-search-icon.d.ts +0 -3
- package/dist/components/icons/menu-icon.d.ts +0 -3
- package/dist/components/icons/message-icon.d.ts +0 -3
- package/dist/components/icons/metrics-icon.d.ts +0 -3
- package/dist/components/icons/mic-icon.d.ts +0 -3
- package/dist/components/icons/minus-icon.d.ts +0 -3
- package/dist/components/icons/mode-comment-icon.d.ts +0 -3
- package/dist/components/icons/money-icon.d.ts +0 -3
- package/dist/components/icons/monitoring-icon.d.ts +0 -3
- package/dist/components/icons/more-icon.d.ts +0 -3
- package/dist/components/icons/notifications-icon.d.ts +0 -3
- package/dist/components/icons/open-in-new-icon.d.ts +0 -3
- package/dist/components/icons/palette-icon.d.ts +0 -3
- package/dist/components/icons/password-icon.d.ts +0 -3
- package/dist/components/icons/pending-icon.d.ts +0 -3
- package/dist/components/icons/person-add-icon.d.ts +0 -3
- package/dist/components/icons/person-search-icon.d.ts +0 -3
- package/dist/components/icons/photo-icon.d.ts +0 -3
- package/dist/components/icons/plus-icon.d.ts +0 -3
- package/dist/components/icons/policy-icon.d.ts +0 -3
- package/dist/components/icons/publish-icon.d.ts +0 -3
- package/dist/components/icons/ready-icon.d.ts +0 -3
- package/dist/components/icons/receipt-icon.d.ts +0 -3
- package/dist/components/icons/receive-icon.d.ts +0 -3
- package/dist/components/icons/refresh-icon.d.ts +0 -3
- package/dist/components/icons/search-icon.d.ts +0 -3
- package/dist/components/icons/see-icon.d.ts +0 -3
- package/dist/components/icons/send-icon.d.ts +0 -3
- package/dist/components/icons/settings-icon.d.ts +0 -3
- package/dist/components/icons/shield-icon.d.ts +0 -3
- package/dist/components/icons/swap-horiz-icon.d.ts +0 -3
- package/dist/components/icons/tag-icon.d.ts +0 -3
- package/dist/components/icons/trash-icon.d.ts +0 -3
- package/dist/icons.cjs +0 -1
- package/dist/icons.js +0 -1507
|
@@ -1,320 +1,320 @@
|
|
|
1
|
-
# Tooltip
|
|
2
|
-
|
|
3
|
-
Mensaje flotante informativo en hover/focus. Basado en Radix UI con arrow.
|
|
4
|
-
|
|
5
|
-
## Descripción
|
|
6
|
-
|
|
7
|
-
El componente `Tooltip` muestra información adicional al hacer hover sobre un elemento.
|
|
8
|
-
|
|
9
|
-
## Importación
|
|
10
|
-
|
|
11
|
-
```typescript
|
|
12
|
-
import {
|
|
13
|
-
Tooltip,
|
|
14
|
-
TooltipContent,
|
|
15
|
-
TooltipProvider,
|
|
16
|
-
TooltipTrigger,
|
|
17
|
-
} from "@adamosuiteservices/ui/tooltip";
|
|
18
|
-
```
|
|
19
|
-
|
|
20
|
-
## Anatomía
|
|
21
|
-
|
|
22
|
-
```tsx
|
|
23
|
-
<Tooltip>
|
|
24
|
-
<TooltipTrigger>Hover me</TooltipTrigger>
|
|
25
|
-
<TooltipContent>
|
|
26
|
-
<p>Tooltip content</p>
|
|
27
|
-
</TooltipContent>
|
|
28
|
-
</Tooltip>
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Componentes**: 4 (TooltipProvider, Tooltip, TooltipTrigger, TooltipContent)
|
|
32
|
-
|
|
33
|
-
## Props
|
|
34
|
-
|
|
35
|
-
### Tooltip (Root)
|
|
36
|
-
|
|
37
|
-
| Prop | Tipo | Descripción |
|
|
38
|
-
| --------------- | ------------------------- | --------------------------------------- |
|
|
39
|
-
| `open` | `boolean` | Estado controlado |
|
|
40
|
-
| `defaultOpen` | `boolean` | Estado inicial |
|
|
41
|
-
| `onOpenChange` | `(open: boolean) => void` | Callback al cambiar |
|
|
42
|
-
| `delayDuration` | `number` | Delay antes de mostrar (ms, default: 0) |
|
|
43
|
-
|
|
44
|
-
### TooltipTrigger
|
|
45
|
-
|
|
46
|
-
| Prop | Tipo | Descripción |
|
|
47
|
-
| --------- | --------- | ---------------------------- |
|
|
48
|
-
| `asChild` | `boolean` | Renderiza como child element |
|
|
49
|
-
|
|
50
|
-
### TooltipContent
|
|
51
|
-
|
|
52
|
-
| Prop | Tipo | Descripción |
|
|
53
|
-
| ------------ | ---------------------------------------- | ------------------------------------- |
|
|
54
|
-
| `side` | `"top" \| "right" \| "bottom" \| "left"` | Posición del tooltip |
|
|
55
|
-
| `sideOffset` | `number` | Offset desde trigger (px, default: 0) |
|
|
56
|
-
| `align` | `"start" \| "center" \| "end"` | Alineación |
|
|
57
|
-
| `className` | `string` | Clases CSS adicionales |
|
|
58
|
-
|
|
59
|
-
### TooltipProvider
|
|
60
|
-
|
|
61
|
-
| Prop | Tipo | Descripción |
|
|
62
|
-
| --------------- | -------- | ----------------------------- |
|
|
63
|
-
| `delayDuration` | `number` | Delay global (ms, default: 0) |
|
|
64
|
-
|
|
65
|
-
## Patrones de Uso
|
|
66
|
-
|
|
67
|
-
### Básico
|
|
68
|
-
|
|
69
|
-
```tsx
|
|
70
|
-
import {
|
|
71
|
-
Tooltip,
|
|
72
|
-
TooltipContent,
|
|
73
|
-
TooltipTrigger,
|
|
74
|
-
} from "@adamosuiteservices/ui/tooltip";
|
|
75
|
-
import { Button } from "@adamosuiteservices/ui/button";
|
|
76
|
-
|
|
77
|
-
<Tooltip>
|
|
78
|
-
<TooltipTrigger asChild>
|
|
79
|
-
<Button variant="outline">Hover</Button>
|
|
80
|
-
</TooltipTrigger>
|
|
81
|
-
<TooltipContent>
|
|
82
|
-
<p>Add to library</p>
|
|
83
|
-
</TooltipContent>
|
|
84
|
-
</Tooltip>;
|
|
85
|
-
```
|
|
86
|
-
|
|
87
|
-
### Con Icono
|
|
88
|
-
|
|
89
|
-
```tsx
|
|
90
|
-
import { InfoIcon } from "lucide-react";
|
|
91
|
-
|
|
92
|
-
<Tooltip>
|
|
93
|
-
<TooltipTrigger asChild>
|
|
94
|
-
<Button variant="outline" size="icon">
|
|
95
|
-
<InfoIcon className="h-4 w-4" />
|
|
96
|
-
</Button>
|
|
97
|
-
</TooltipTrigger>
|
|
98
|
-
<TooltipContent>
|
|
99
|
-
<p>More information</p>
|
|
100
|
-
</TooltipContent>
|
|
101
|
-
</Tooltip>;
|
|
102
|
-
```
|
|
103
|
-
|
|
104
|
-
### Posiciones
|
|
105
|
-
|
|
106
|
-
```tsx
|
|
107
|
-
// Top (default)
|
|
108
|
-
<Tooltip>
|
|
109
|
-
<TooltipTrigger asChild>
|
|
110
|
-
<Button>Top</Button>
|
|
111
|
-
</TooltipTrigger>
|
|
112
|
-
<TooltipContent side="top">
|
|
113
|
-
<p>Tooltip on top</p>
|
|
114
|
-
</TooltipContent>
|
|
115
|
-
</Tooltip>
|
|
116
|
-
|
|
117
|
-
// Right
|
|
118
|
-
<TooltipContent side="right"><p>Tooltip on right</p></TooltipContent>
|
|
119
|
-
|
|
120
|
-
// Bottom
|
|
121
|
-
<TooltipContent side="bottom"><p>Tooltip on bottom</p></TooltipContent>
|
|
122
|
-
|
|
123
|
-
// Left
|
|
124
|
-
<TooltipContent side="left"><p>Tooltip on left</p></TooltipContent>
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
### Con Offset
|
|
128
|
-
|
|
129
|
-
```tsx
|
|
130
|
-
<Tooltip>
|
|
131
|
-
<TooltipTrigger asChild>
|
|
132
|
-
<Button>With Offset</Button>
|
|
133
|
-
</TooltipTrigger>
|
|
134
|
-
<TooltipContent sideOffset={10}>
|
|
135
|
-
<p>10px offset from trigger</p>
|
|
136
|
-
</TooltipContent>
|
|
137
|
-
</Tooltip>
|
|
138
|
-
```
|
|
139
|
-
|
|
140
|
-
### Con Delay
|
|
141
|
-
|
|
142
|
-
```tsx
|
|
143
|
-
<TooltipProvider delayDuration={800}>
|
|
144
|
-
<Tooltip>
|
|
145
|
-
<TooltipTrigger asChild>
|
|
146
|
-
<Button>Slow Tooltip</Button>
|
|
147
|
-
</TooltipTrigger>
|
|
148
|
-
<TooltipContent>
|
|
149
|
-
<p>Appears after 800ms</p>
|
|
150
|
-
</TooltipContent>
|
|
151
|
-
</Tooltip>
|
|
152
|
-
</TooltipProvider>
|
|
153
|
-
```
|
|
154
|
-
|
|
155
|
-
### Con Provider Global
|
|
156
|
-
|
|
157
|
-
Para múltiples tooltips, usa TooltipProvider:
|
|
158
|
-
|
|
159
|
-
```tsx
|
|
160
|
-
<TooltipProvider delayDuration={300}>
|
|
161
|
-
<Tooltip>...</Tooltip>
|
|
162
|
-
<Tooltip>...</Tooltip>
|
|
163
|
-
</TooltipProvider>
|
|
164
|
-
```
|
|
165
|
-
|
|
166
|
-
### Action Buttons
|
|
167
|
-
|
|
168
|
-
```tsx
|
|
169
|
-
import { CopyIcon, EditIcon, ShareIcon, TrashIcon } from "lucide-react";
|
|
170
|
-
|
|
171
|
-
<div className="flex gap-2">
|
|
172
|
-
<Tooltip>
|
|
173
|
-
<TooltipTrigger asChild>
|
|
174
|
-
<Button size="icon" variant="outline">
|
|
175
|
-
<CopyIcon className="h-4 w-4" />
|
|
176
|
-
</Button>
|
|
177
|
-
</TooltipTrigger>
|
|
178
|
-
<TooltipContent>
|
|
179
|
-
<p>Copy to clipboard</p>
|
|
180
|
-
</TooltipContent>
|
|
181
|
-
</Tooltip>
|
|
182
|
-
|
|
183
|
-
<Tooltip>
|
|
184
|
-
<TooltipTrigger asChild>
|
|
185
|
-
<Button size="icon" variant="outline">
|
|
186
|
-
<EditIcon className="h-4 w-4" />
|
|
187
|
-
</Button>
|
|
188
|
-
</TooltipTrigger>
|
|
189
|
-
<TooltipContent>
|
|
190
|
-
<p>Edit document</p>
|
|
191
|
-
</TooltipContent>
|
|
192
|
-
</Tooltip>
|
|
193
|
-
|
|
194
|
-
<Tooltip>
|
|
195
|
-
<TooltipTrigger asChild>
|
|
196
|
-
<Button size="icon" variant="outline">
|
|
197
|
-
<ShareIcon className="h-4 w-4" />
|
|
198
|
-
</Button>
|
|
199
|
-
</TooltipTrigger>
|
|
200
|
-
<TooltipContent>
|
|
201
|
-
<p>Share with others</p>
|
|
202
|
-
</TooltipContent>
|
|
203
|
-
</Tooltip>
|
|
204
|
-
|
|
205
|
-
<Tooltip>
|
|
206
|
-
<TooltipTrigger asChild>
|
|
207
|
-
<Button size="icon" variant="destructive">
|
|
208
|
-
<TrashIcon className="h-4 w-4" />
|
|
209
|
-
</Button>
|
|
210
|
-
</TooltipTrigger>
|
|
211
|
-
<TooltipContent>
|
|
212
|
-
<p>Delete permanently</p>
|
|
213
|
-
</TooltipContent>
|
|
214
|
-
</Tooltip>
|
|
215
|
-
</div>;
|
|
216
|
-
```
|
|
217
|
-
|
|
218
|
-
### Form Help Icons
|
|
219
|
-
|
|
220
|
-
```tsx
|
|
221
|
-
import { HelpCircleIcon, InfoIcon } from "lucide-react";
|
|
222
|
-
import { Label } from "@adamosuiteservices/ui/label";
|
|
223
|
-
import { Input } from "@adamosuiteservices/ui/input";
|
|
224
|
-
|
|
225
|
-
<div className="space-y-2">
|
|
226
|
-
<div className="flex items-center gap-2">
|
|
227
|
-
<Label htmlFor="username">Username</Label>
|
|
228
|
-
<Tooltip>
|
|
229
|
-
<TooltipTrigger asChild>
|
|
230
|
-
<HelpCircleIcon className="h-4 w-4 text-muted-foreground cursor-help" />
|
|
231
|
-
</TooltipTrigger>
|
|
232
|
-
<TooltipContent>
|
|
233
|
-
<p>
|
|
234
|
-
Must be 3-20 characters long and contain only letters, numbers, and
|
|
235
|
-
underscores
|
|
236
|
-
</p>
|
|
237
|
-
</TooltipContent>
|
|
238
|
-
</Tooltip>
|
|
239
|
-
</div>
|
|
240
|
-
<Input id="username" placeholder="Enter username" />
|
|
241
|
-
</div>;
|
|
242
|
-
```
|
|
243
|
-
|
|
244
|
-
### Controlled
|
|
245
|
-
|
|
246
|
-
```tsx
|
|
247
|
-
import { useState } from "react";
|
|
248
|
-
|
|
249
|
-
function App() {
|
|
250
|
-
const [open, setOpen] = useState(false);
|
|
251
|
-
|
|
252
|
-
return (
|
|
253
|
-
<div className="flex items-center gap-4">
|
|
254
|
-
<Tooltip open={open} onOpenChange={setOpen}>
|
|
255
|
-
<TooltipTrigger asChild>
|
|
256
|
-
<Button>Controlled</Button>
|
|
257
|
-
</TooltipTrigger>
|
|
258
|
-
<TooltipContent>
|
|
259
|
-
<p>Controlled programmatically</p>
|
|
260
|
-
</TooltipContent>
|
|
261
|
-
</Tooltip>
|
|
262
|
-
|
|
263
|
-
<Button size="sm" onClick={() => setOpen(true)}>
|
|
264
|
-
Show
|
|
265
|
-
</Button>
|
|
266
|
-
<Button size="sm" variant="outline" onClick={() => setOpen(false)}>
|
|
267
|
-
Hide
|
|
268
|
-
</Button>
|
|
269
|
-
</div>
|
|
270
|
-
);
|
|
271
|
-
}
|
|
272
|
-
```
|
|
273
|
-
|
|
274
|
-
## Casos de Uso
|
|
275
|
-
|
|
276
|
-
**Icon buttons**: Descripción de acciones
|
|
277
|
-
**Form help**: Explicar campos de formulario
|
|
278
|
-
**Status indicators**: Detalles de estados
|
|
279
|
-
**Truncated text**: Mostrar texto completo
|
|
280
|
-
**Disabled elements**: Explicar por qué está deshabilitado
|
|
281
|
-
|
|
282
|
-
## Estilos Base
|
|
283
|
-
|
|
284
|
-
- **Background**: `bg-neutrals-800`
|
|
285
|
-
- **Text**: `text-white text-xs`
|
|
286
|
-
- **Padding**: `px-3 py-1.5`
|
|
287
|
-
- **Border radius**: `rounded-md`
|
|
288
|
-
- **Arrow**: `size-2.5` con `bg-neutrals-800`
|
|
289
|
-
- **Z-index**: `z-50`
|
|
290
|
-
- **Animation**: Fade + zoom in/out
|
|
291
|
-
|
|
292
|
-
## Accesibilidad
|
|
293
|
-
|
|
294
|
-
- ✅ **ARIA**: `aria-describedby` automático
|
|
295
|
-
- ✅ **Keyboard**: Visible en focus del trigger
|
|
296
|
-
- ✅ **Hover**: Aparece en hover
|
|
297
|
-
- ✅ **Focus**: Aparece en focus del trigger
|
|
298
|
-
- ✅ **Escape**: Cierra con Escape key
|
|
299
|
-
|
|
300
|
-
## Notas de Implementación
|
|
301
|
-
|
|
302
|
-
- **Radix UI**: Basado en `@radix-ui/react-tooltip`
|
|
303
|
-
- **Portal**: Content se renderiza en portal (fuera del DOM tree)
|
|
304
|
-
- **Arrow**: Incluido automáticamente en TooltipContent
|
|
305
|
-
- **Provider**: Tooltip individual ya incluye TooltipProvider interno
|
|
306
|
-
- **Global Provider**: Usa TooltipProvider para delay global
|
|
307
|
-
|
|
308
|
-
## Troubleshooting
|
|
309
|
-
|
|
310
|
-
**Tooltip no aparece**: Verifica que TooltipTrigger tenga `asChild` si es Button/componente
|
|
311
|
-
**Posición incorrecta**: Usa `side` prop en TooltipContent
|
|
312
|
-
**Delay muy largo**: Ajusta `delayDuration` en Tooltip o TooltipProvider
|
|
313
|
-
**Z-index issues**: Tooltip usa `z-50`, puede necesitar ajuste si hay overlays
|
|
314
|
-
**Arrow no visible**: Arrow incluido por default, verifica estilos no sobrescritos
|
|
315
|
-
**No se cierra**: Usa Escape key o mouseleave del trigger
|
|
316
|
-
|
|
317
|
-
## Referencias
|
|
318
|
-
|
|
319
|
-
- **Radix UI Tooltip**: <https://www.radix-ui.com/primitives/docs/components/tooltip>
|
|
320
|
-
- **shadcn/ui Tooltip**: <https://ui.shadcn.com/docs/components/tooltip>
|
|
1
|
+
# Tooltip
|
|
2
|
+
|
|
3
|
+
Mensaje flotante informativo en hover/focus. Basado en Radix UI con arrow.
|
|
4
|
+
|
|
5
|
+
## Descripción
|
|
6
|
+
|
|
7
|
+
El componente `Tooltip` muestra información adicional al hacer hover sobre un elemento.
|
|
8
|
+
|
|
9
|
+
## Importación
|
|
10
|
+
|
|
11
|
+
```typescript
|
|
12
|
+
import {
|
|
13
|
+
Tooltip,
|
|
14
|
+
TooltipContent,
|
|
15
|
+
TooltipProvider,
|
|
16
|
+
TooltipTrigger,
|
|
17
|
+
} from "@adamosuiteservices/ui/tooltip";
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Anatomía
|
|
21
|
+
|
|
22
|
+
```tsx
|
|
23
|
+
<Tooltip>
|
|
24
|
+
<TooltipTrigger>Hover me</TooltipTrigger>
|
|
25
|
+
<TooltipContent>
|
|
26
|
+
<p>Tooltip content</p>
|
|
27
|
+
</TooltipContent>
|
|
28
|
+
</Tooltip>
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
**Componentes**: 4 (TooltipProvider, Tooltip, TooltipTrigger, TooltipContent)
|
|
32
|
+
|
|
33
|
+
## Props
|
|
34
|
+
|
|
35
|
+
### Tooltip (Root)
|
|
36
|
+
|
|
37
|
+
| Prop | Tipo | Descripción |
|
|
38
|
+
| --------------- | ------------------------- | --------------------------------------- |
|
|
39
|
+
| `open` | `boolean` | Estado controlado |
|
|
40
|
+
| `defaultOpen` | `boolean` | Estado inicial |
|
|
41
|
+
| `onOpenChange` | `(open: boolean) => void` | Callback al cambiar |
|
|
42
|
+
| `delayDuration` | `number` | Delay antes de mostrar (ms, default: 0) |
|
|
43
|
+
|
|
44
|
+
### TooltipTrigger
|
|
45
|
+
|
|
46
|
+
| Prop | Tipo | Descripción |
|
|
47
|
+
| --------- | --------- | ---------------------------- |
|
|
48
|
+
| `asChild` | `boolean` | Renderiza como child element |
|
|
49
|
+
|
|
50
|
+
### TooltipContent
|
|
51
|
+
|
|
52
|
+
| Prop | Tipo | Descripción |
|
|
53
|
+
| ------------ | ---------------------------------------- | ------------------------------------- |
|
|
54
|
+
| `side` | `"top" \| "right" \| "bottom" \| "left"` | Posición del tooltip |
|
|
55
|
+
| `sideOffset` | `number` | Offset desde trigger (px, default: 0) |
|
|
56
|
+
| `align` | `"start" \| "center" \| "end"` | Alineación |
|
|
57
|
+
| `className` | `string` | Clases CSS adicionales |
|
|
58
|
+
|
|
59
|
+
### TooltipProvider
|
|
60
|
+
|
|
61
|
+
| Prop | Tipo | Descripción |
|
|
62
|
+
| --------------- | -------- | ----------------------------- |
|
|
63
|
+
| `delayDuration` | `number` | Delay global (ms, default: 0) |
|
|
64
|
+
|
|
65
|
+
## Patrones de Uso
|
|
66
|
+
|
|
67
|
+
### Básico
|
|
68
|
+
|
|
69
|
+
```tsx
|
|
70
|
+
import {
|
|
71
|
+
Tooltip,
|
|
72
|
+
TooltipContent,
|
|
73
|
+
TooltipTrigger,
|
|
74
|
+
} from "@adamosuiteservices/ui/tooltip";
|
|
75
|
+
import { Button } from "@adamosuiteservices/ui/button";
|
|
76
|
+
|
|
77
|
+
<Tooltip>
|
|
78
|
+
<TooltipTrigger asChild>
|
|
79
|
+
<Button variant="outline">Hover</Button>
|
|
80
|
+
</TooltipTrigger>
|
|
81
|
+
<TooltipContent>
|
|
82
|
+
<p>Add to library</p>
|
|
83
|
+
</TooltipContent>
|
|
84
|
+
</Tooltip>;
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Con Icono
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
import { InfoIcon } from "lucide-react";
|
|
91
|
+
|
|
92
|
+
<Tooltip>
|
|
93
|
+
<TooltipTrigger asChild>
|
|
94
|
+
<Button variant="outline" size="icon">
|
|
95
|
+
<InfoIcon className="h-4 w-4" />
|
|
96
|
+
</Button>
|
|
97
|
+
</TooltipTrigger>
|
|
98
|
+
<TooltipContent>
|
|
99
|
+
<p>More information</p>
|
|
100
|
+
</TooltipContent>
|
|
101
|
+
</Tooltip>;
|
|
102
|
+
```
|
|
103
|
+
|
|
104
|
+
### Posiciones
|
|
105
|
+
|
|
106
|
+
```tsx
|
|
107
|
+
// Top (default)
|
|
108
|
+
<Tooltip>
|
|
109
|
+
<TooltipTrigger asChild>
|
|
110
|
+
<Button>Top</Button>
|
|
111
|
+
</TooltipTrigger>
|
|
112
|
+
<TooltipContent side="top">
|
|
113
|
+
<p>Tooltip on top</p>
|
|
114
|
+
</TooltipContent>
|
|
115
|
+
</Tooltip>
|
|
116
|
+
|
|
117
|
+
// Right
|
|
118
|
+
<TooltipContent side="right"><p>Tooltip on right</p></TooltipContent>
|
|
119
|
+
|
|
120
|
+
// Bottom
|
|
121
|
+
<TooltipContent side="bottom"><p>Tooltip on bottom</p></TooltipContent>
|
|
122
|
+
|
|
123
|
+
// Left
|
|
124
|
+
<TooltipContent side="left"><p>Tooltip on left</p></TooltipContent>
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
### Con Offset
|
|
128
|
+
|
|
129
|
+
```tsx
|
|
130
|
+
<Tooltip>
|
|
131
|
+
<TooltipTrigger asChild>
|
|
132
|
+
<Button>With Offset</Button>
|
|
133
|
+
</TooltipTrigger>
|
|
134
|
+
<TooltipContent sideOffset={10}>
|
|
135
|
+
<p>10px offset from trigger</p>
|
|
136
|
+
</TooltipContent>
|
|
137
|
+
</Tooltip>
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Con Delay
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
<TooltipProvider delayDuration={800}>
|
|
144
|
+
<Tooltip>
|
|
145
|
+
<TooltipTrigger asChild>
|
|
146
|
+
<Button>Slow Tooltip</Button>
|
|
147
|
+
</TooltipTrigger>
|
|
148
|
+
<TooltipContent>
|
|
149
|
+
<p>Appears after 800ms</p>
|
|
150
|
+
</TooltipContent>
|
|
151
|
+
</Tooltip>
|
|
152
|
+
</TooltipProvider>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Con Provider Global
|
|
156
|
+
|
|
157
|
+
Para múltiples tooltips, usa TooltipProvider:
|
|
158
|
+
|
|
159
|
+
```tsx
|
|
160
|
+
<TooltipProvider delayDuration={300}>
|
|
161
|
+
<Tooltip>...</Tooltip>
|
|
162
|
+
<Tooltip>...</Tooltip>
|
|
163
|
+
</TooltipProvider>
|
|
164
|
+
```
|
|
165
|
+
|
|
166
|
+
### Action Buttons
|
|
167
|
+
|
|
168
|
+
```tsx
|
|
169
|
+
import { CopyIcon, EditIcon, ShareIcon, TrashIcon } from "lucide-react";
|
|
170
|
+
|
|
171
|
+
<div className="flex gap-2">
|
|
172
|
+
<Tooltip>
|
|
173
|
+
<TooltipTrigger asChild>
|
|
174
|
+
<Button size="icon" variant="outline">
|
|
175
|
+
<CopyIcon className="h-4 w-4" />
|
|
176
|
+
</Button>
|
|
177
|
+
</TooltipTrigger>
|
|
178
|
+
<TooltipContent>
|
|
179
|
+
<p>Copy to clipboard</p>
|
|
180
|
+
</TooltipContent>
|
|
181
|
+
</Tooltip>
|
|
182
|
+
|
|
183
|
+
<Tooltip>
|
|
184
|
+
<TooltipTrigger asChild>
|
|
185
|
+
<Button size="icon" variant="outline">
|
|
186
|
+
<EditIcon className="h-4 w-4" />
|
|
187
|
+
</Button>
|
|
188
|
+
</TooltipTrigger>
|
|
189
|
+
<TooltipContent>
|
|
190
|
+
<p>Edit document</p>
|
|
191
|
+
</TooltipContent>
|
|
192
|
+
</Tooltip>
|
|
193
|
+
|
|
194
|
+
<Tooltip>
|
|
195
|
+
<TooltipTrigger asChild>
|
|
196
|
+
<Button size="icon" variant="outline">
|
|
197
|
+
<ShareIcon className="h-4 w-4" />
|
|
198
|
+
</Button>
|
|
199
|
+
</TooltipTrigger>
|
|
200
|
+
<TooltipContent>
|
|
201
|
+
<p>Share with others</p>
|
|
202
|
+
</TooltipContent>
|
|
203
|
+
</Tooltip>
|
|
204
|
+
|
|
205
|
+
<Tooltip>
|
|
206
|
+
<TooltipTrigger asChild>
|
|
207
|
+
<Button size="icon" variant="destructive">
|
|
208
|
+
<TrashIcon className="h-4 w-4" />
|
|
209
|
+
</Button>
|
|
210
|
+
</TooltipTrigger>
|
|
211
|
+
<TooltipContent>
|
|
212
|
+
<p>Delete permanently</p>
|
|
213
|
+
</TooltipContent>
|
|
214
|
+
</Tooltip>
|
|
215
|
+
</div>;
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
### Form Help Icons
|
|
219
|
+
|
|
220
|
+
```tsx
|
|
221
|
+
import { HelpCircleIcon, InfoIcon } from "lucide-react";
|
|
222
|
+
import { Label } from "@adamosuiteservices/ui/label";
|
|
223
|
+
import { Input } from "@adamosuiteservices/ui/input";
|
|
224
|
+
|
|
225
|
+
<div className="space-y-2">
|
|
226
|
+
<div className="flex items-center gap-2">
|
|
227
|
+
<Label htmlFor="username">Username</Label>
|
|
228
|
+
<Tooltip>
|
|
229
|
+
<TooltipTrigger asChild>
|
|
230
|
+
<HelpCircleIcon className="h-4 w-4 text-muted-foreground cursor-help" />
|
|
231
|
+
</TooltipTrigger>
|
|
232
|
+
<TooltipContent>
|
|
233
|
+
<p>
|
|
234
|
+
Must be 3-20 characters long and contain only letters, numbers, and
|
|
235
|
+
underscores
|
|
236
|
+
</p>
|
|
237
|
+
</TooltipContent>
|
|
238
|
+
</Tooltip>
|
|
239
|
+
</div>
|
|
240
|
+
<Input id="username" placeholder="Enter username" />
|
|
241
|
+
</div>;
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
### Controlled
|
|
245
|
+
|
|
246
|
+
```tsx
|
|
247
|
+
import { useState } from "react";
|
|
248
|
+
|
|
249
|
+
function App() {
|
|
250
|
+
const [open, setOpen] = useState(false);
|
|
251
|
+
|
|
252
|
+
return (
|
|
253
|
+
<div className="flex items-center gap-4">
|
|
254
|
+
<Tooltip open={open} onOpenChange={setOpen}>
|
|
255
|
+
<TooltipTrigger asChild>
|
|
256
|
+
<Button>Controlled</Button>
|
|
257
|
+
</TooltipTrigger>
|
|
258
|
+
<TooltipContent>
|
|
259
|
+
<p>Controlled programmatically</p>
|
|
260
|
+
</TooltipContent>
|
|
261
|
+
</Tooltip>
|
|
262
|
+
|
|
263
|
+
<Button size="sm" onClick={() => setOpen(true)}>
|
|
264
|
+
Show
|
|
265
|
+
</Button>
|
|
266
|
+
<Button size="sm" variant="outline" onClick={() => setOpen(false)}>
|
|
267
|
+
Hide
|
|
268
|
+
</Button>
|
|
269
|
+
</div>
|
|
270
|
+
);
|
|
271
|
+
}
|
|
272
|
+
```
|
|
273
|
+
|
|
274
|
+
## Casos de Uso
|
|
275
|
+
|
|
276
|
+
**Icon buttons**: Descripción de acciones
|
|
277
|
+
**Form help**: Explicar campos de formulario
|
|
278
|
+
**Status indicators**: Detalles de estados
|
|
279
|
+
**Truncated text**: Mostrar texto completo
|
|
280
|
+
**Disabled elements**: Explicar por qué está deshabilitado
|
|
281
|
+
|
|
282
|
+
## Estilos Base
|
|
283
|
+
|
|
284
|
+
- **Background**: `bg-neutrals-800`
|
|
285
|
+
- **Text**: `text-white text-xs`
|
|
286
|
+
- **Padding**: `px-3 py-1.5`
|
|
287
|
+
- **Border radius**: `rounded-md`
|
|
288
|
+
- **Arrow**: `size-2.5` con `bg-neutrals-800`
|
|
289
|
+
- **Z-index**: `z-50`
|
|
290
|
+
- **Animation**: Fade + zoom in/out
|
|
291
|
+
|
|
292
|
+
## Accesibilidad
|
|
293
|
+
|
|
294
|
+
- ✅ **ARIA**: `aria-describedby` automático
|
|
295
|
+
- ✅ **Keyboard**: Visible en focus del trigger
|
|
296
|
+
- ✅ **Hover**: Aparece en hover
|
|
297
|
+
- ✅ **Focus**: Aparece en focus del trigger
|
|
298
|
+
- ✅ **Escape**: Cierra con Escape key
|
|
299
|
+
|
|
300
|
+
## Notas de Implementación
|
|
301
|
+
|
|
302
|
+
- **Radix UI**: Basado en `@radix-ui/react-tooltip`
|
|
303
|
+
- **Portal**: Content se renderiza en portal (fuera del DOM tree)
|
|
304
|
+
- **Arrow**: Incluido automáticamente en TooltipContent
|
|
305
|
+
- **Provider**: Tooltip individual ya incluye TooltipProvider interno
|
|
306
|
+
- **Global Provider**: Usa TooltipProvider para delay global
|
|
307
|
+
|
|
308
|
+
## Troubleshooting
|
|
309
|
+
|
|
310
|
+
**Tooltip no aparece**: Verifica que TooltipTrigger tenga `asChild` si es Button/componente
|
|
311
|
+
**Posición incorrecta**: Usa `side` prop en TooltipContent
|
|
312
|
+
**Delay muy largo**: Ajusta `delayDuration` en Tooltip o TooltipProvider
|
|
313
|
+
**Z-index issues**: Tooltip usa `z-50`, puede necesitar ajuste si hay overlays
|
|
314
|
+
**Arrow no visible**: Arrow incluido por default, verifica estilos no sobrescritos
|
|
315
|
+
**No se cierra**: Usa Escape key o mouseleave del trigger
|
|
316
|
+
|
|
317
|
+
## Referencias
|
|
318
|
+
|
|
319
|
+
- **Radix UI Tooltip**: <https://www.radix-ui.com/primitives/docs/components/tooltip>
|
|
320
|
+
- **shadcn/ui Tooltip**: <https://ui.shadcn.com/docs/components/tooltip>
|