@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,317 +1,317 @@
|
|
|
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 { Icon } from "@adamosuiteservices/ui/icon";
|
|
91
|
-
|
|
92
|
-
<Tooltip>
|
|
93
|
-
<TooltipTrigger asChild>
|
|
94
|
-
<Button variant="outline" size="icon">
|
|
95
|
-
<Icon symbol="info" className="text-lg" />
|
|
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
|
-
<div className="flex gap-2">
|
|
170
|
-
<Tooltip>
|
|
171
|
-
<TooltipTrigger asChild>
|
|
172
|
-
<Button size="icon" variant="outline">
|
|
173
|
-
<Icon symbol="content_copy" className="text-lg" />
|
|
174
|
-
</Button>
|
|
175
|
-
</TooltipTrigger>
|
|
176
|
-
<TooltipContent>
|
|
177
|
-
<p>Copy to clipboard</p>
|
|
178
|
-
</TooltipContent>
|
|
179
|
-
</Tooltip>
|
|
180
|
-
|
|
181
|
-
<Tooltip>
|
|
182
|
-
<TooltipTrigger asChild>
|
|
183
|
-
<Button size="icon" variant="outline">
|
|
184
|
-
<Icon symbol="edit" className="text-lg" />
|
|
185
|
-
</Button>
|
|
186
|
-
</TooltipTrigger>
|
|
187
|
-
<TooltipContent>
|
|
188
|
-
<p>Edit document</p>
|
|
189
|
-
</TooltipContent>
|
|
190
|
-
</Tooltip>
|
|
191
|
-
|
|
192
|
-
<Tooltip>
|
|
193
|
-
<TooltipTrigger asChild>
|
|
194
|
-
<Button size="icon" variant="outline">
|
|
195
|
-
<Icon symbol="share" className="text-lg" />
|
|
196
|
-
</Button>
|
|
197
|
-
</TooltipTrigger>
|
|
198
|
-
<TooltipContent>
|
|
199
|
-
<p>Share with others</p>
|
|
200
|
-
</TooltipContent>
|
|
201
|
-
</Tooltip>
|
|
202
|
-
|
|
203
|
-
<Tooltip>
|
|
204
|
-
<TooltipTrigger asChild>
|
|
205
|
-
<Button size="icon" variant="destructive">
|
|
206
|
-
<Icon symbol="delete" className="text-lg" />
|
|
207
|
-
</Button>
|
|
208
|
-
</TooltipTrigger>
|
|
209
|
-
<TooltipContent>
|
|
210
|
-
<p>Delete permanently</p>
|
|
211
|
-
</TooltipContent>
|
|
212
|
-
</Tooltip>
|
|
213
|
-
</div>;
|
|
214
|
-
```
|
|
215
|
-
|
|
216
|
-
### Form Help Icons
|
|
217
|
-
|
|
218
|
-
```tsx
|
|
219
|
-
import { Label } from "@adamosuiteservices/ui/label";
|
|
220
|
-
import { Input } from "@adamosuiteservices/ui/input";
|
|
221
|
-
|
|
222
|
-
<div className="space-y-2">
|
|
223
|
-
<div className="flex items-center gap-2">
|
|
224
|
-
<Label htmlFor="username">Username</Label>
|
|
225
|
-
<Tooltip>
|
|
226
|
-
<TooltipTrigger asChild>
|
|
227
|
-
<Icon symbol="help" className="cursor-help text-lg text-muted-foreground" />
|
|
228
|
-
</TooltipTrigger>
|
|
229
|
-
<TooltipContent>
|
|
230
|
-
<p>
|
|
231
|
-
Must be 3-20 characters long and contain only letters, numbers, and
|
|
232
|
-
underscores
|
|
233
|
-
</p>
|
|
234
|
-
</TooltipContent>
|
|
235
|
-
</Tooltip>
|
|
236
|
-
</div>
|
|
237
|
-
<Input id="username" placeholder="Enter username" />
|
|
238
|
-
</div>;
|
|
239
|
-
```
|
|
240
|
-
|
|
241
|
-
### Controlled
|
|
242
|
-
|
|
243
|
-
```tsx
|
|
244
|
-
import { useState } from "react";
|
|
245
|
-
|
|
246
|
-
function App() {
|
|
247
|
-
const [open, setOpen] = useState(false);
|
|
248
|
-
|
|
249
|
-
return (
|
|
250
|
-
<div className="flex items-center gap-4">
|
|
251
|
-
<Tooltip open={open} onOpenChange={setOpen}>
|
|
252
|
-
<TooltipTrigger asChild>
|
|
253
|
-
<Button>Controlled</Button>
|
|
254
|
-
</TooltipTrigger>
|
|
255
|
-
<TooltipContent>
|
|
256
|
-
<p>Controlled programmatically</p>
|
|
257
|
-
</TooltipContent>
|
|
258
|
-
</Tooltip>
|
|
259
|
-
|
|
260
|
-
<Button size="sm" onClick={() => setOpen(true)}>
|
|
261
|
-
Show
|
|
262
|
-
</Button>
|
|
263
|
-
<Button size="sm" variant="outline" onClick={() => setOpen(false)}>
|
|
264
|
-
Hide
|
|
265
|
-
</Button>
|
|
266
|
-
</div>
|
|
267
|
-
);
|
|
268
|
-
}
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
## Casos de Uso
|
|
272
|
-
|
|
273
|
-
**Icon buttons**: Descripción de acciones
|
|
274
|
-
**Form help**: Explicar campos de formulario
|
|
275
|
-
**Status indicators**: Detalles de estados
|
|
276
|
-
**Truncated text**: Mostrar texto completo
|
|
277
|
-
**Disabled elements**: Explicar por qué está deshabilitado
|
|
278
|
-
|
|
279
|
-
## Estilos Base
|
|
280
|
-
|
|
281
|
-
- **Background**: `bg-primary`
|
|
282
|
-
- **Text**: `text-primary-foreground text-xs`
|
|
283
|
-
- **Padding**: `px-3 py-1.5`
|
|
284
|
-
- **Border radius**: `rounded-md`
|
|
285
|
-
- **Arrow**: `size-2.5` con `bg-primary`
|
|
286
|
-
- **Z-index**: `z-50`
|
|
287
|
-
- **Animation**: Fade + zoom in/out
|
|
288
|
-
|
|
289
|
-
## Accesibilidad
|
|
290
|
-
|
|
291
|
-
- ✅ **ARIA**: `aria-describedby` automático
|
|
292
|
-
- ✅ **Keyboard**: Visible en focus del trigger
|
|
293
|
-
- ✅ **Hover**: Aparece en hover
|
|
294
|
-
- ✅ **Focus**: Aparece en focus del trigger
|
|
295
|
-
- ✅ **Escape**: Cierra con Escape key
|
|
296
|
-
|
|
297
|
-
## Notas de Implementación
|
|
298
|
-
|
|
299
|
-
- **Radix UI**: Basado en `@radix-ui/react-tooltip`
|
|
300
|
-
- **Portal**: Content se renderiza en portal (fuera del DOM tree)
|
|
301
|
-
- **Arrow**: Incluido automáticamente en TooltipContent
|
|
302
|
-
- **Provider**: Tooltip individual ya incluye TooltipProvider interno
|
|
303
|
-
- **Global Provider**: Usa TooltipProvider para delay global
|
|
304
|
-
|
|
305
|
-
## Troubleshooting
|
|
306
|
-
|
|
307
|
-
**Tooltip no aparece**: Verifica que TooltipTrigger tenga `asChild` si es Button/componente
|
|
308
|
-
**Posición incorrecta**: Usa `side` prop en TooltipContent
|
|
309
|
-
**Delay muy largo**: Ajusta `delayDuration` en Tooltip o TooltipProvider
|
|
310
|
-
**Z-index issues**: Tooltip usa `z-50`, puede necesitar ajuste si hay overlays
|
|
311
|
-
**Arrow no visible**: Arrow incluido por default, verifica estilos no sobrescritos
|
|
312
|
-
**No se cierra**: Usa Escape key o mouseleave del trigger
|
|
313
|
-
|
|
314
|
-
## Referencias
|
|
315
|
-
|
|
316
|
-
- **Radix UI Tooltip**: <https://www.radix-ui.com/primitives/docs/components/tooltip>
|
|
317
|
-
- **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 { Icon } from "@adamosuiteservices/ui/icon";
|
|
91
|
+
|
|
92
|
+
<Tooltip>
|
|
93
|
+
<TooltipTrigger asChild>
|
|
94
|
+
<Button variant="outline" size="icon">
|
|
95
|
+
<Icon symbol="info" className="text-lg" />
|
|
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
|
+
<div className="flex gap-2">
|
|
170
|
+
<Tooltip>
|
|
171
|
+
<TooltipTrigger asChild>
|
|
172
|
+
<Button size="icon" variant="outline">
|
|
173
|
+
<Icon symbol="content_copy" className="text-lg" />
|
|
174
|
+
</Button>
|
|
175
|
+
</TooltipTrigger>
|
|
176
|
+
<TooltipContent>
|
|
177
|
+
<p>Copy to clipboard</p>
|
|
178
|
+
</TooltipContent>
|
|
179
|
+
</Tooltip>
|
|
180
|
+
|
|
181
|
+
<Tooltip>
|
|
182
|
+
<TooltipTrigger asChild>
|
|
183
|
+
<Button size="icon" variant="outline">
|
|
184
|
+
<Icon symbol="edit" className="text-lg" />
|
|
185
|
+
</Button>
|
|
186
|
+
</TooltipTrigger>
|
|
187
|
+
<TooltipContent>
|
|
188
|
+
<p>Edit document</p>
|
|
189
|
+
</TooltipContent>
|
|
190
|
+
</Tooltip>
|
|
191
|
+
|
|
192
|
+
<Tooltip>
|
|
193
|
+
<TooltipTrigger asChild>
|
|
194
|
+
<Button size="icon" variant="outline">
|
|
195
|
+
<Icon symbol="share" className="text-lg" />
|
|
196
|
+
</Button>
|
|
197
|
+
</TooltipTrigger>
|
|
198
|
+
<TooltipContent>
|
|
199
|
+
<p>Share with others</p>
|
|
200
|
+
</TooltipContent>
|
|
201
|
+
</Tooltip>
|
|
202
|
+
|
|
203
|
+
<Tooltip>
|
|
204
|
+
<TooltipTrigger asChild>
|
|
205
|
+
<Button size="icon" variant="destructive">
|
|
206
|
+
<Icon symbol="delete" className="text-lg" />
|
|
207
|
+
</Button>
|
|
208
|
+
</TooltipTrigger>
|
|
209
|
+
<TooltipContent>
|
|
210
|
+
<p>Delete permanently</p>
|
|
211
|
+
</TooltipContent>
|
|
212
|
+
</Tooltip>
|
|
213
|
+
</div>;
|
|
214
|
+
```
|
|
215
|
+
|
|
216
|
+
### Form Help Icons
|
|
217
|
+
|
|
218
|
+
```tsx
|
|
219
|
+
import { Label } from "@adamosuiteservices/ui/label";
|
|
220
|
+
import { Input } from "@adamosuiteservices/ui/input";
|
|
221
|
+
|
|
222
|
+
<div className="space-y-2">
|
|
223
|
+
<div className="flex items-center gap-2">
|
|
224
|
+
<Label htmlFor="username">Username</Label>
|
|
225
|
+
<Tooltip>
|
|
226
|
+
<TooltipTrigger asChild>
|
|
227
|
+
<Icon symbol="help" className="cursor-help text-lg text-muted-foreground" />
|
|
228
|
+
</TooltipTrigger>
|
|
229
|
+
<TooltipContent>
|
|
230
|
+
<p>
|
|
231
|
+
Must be 3-20 characters long and contain only letters, numbers, and
|
|
232
|
+
underscores
|
|
233
|
+
</p>
|
|
234
|
+
</TooltipContent>
|
|
235
|
+
</Tooltip>
|
|
236
|
+
</div>
|
|
237
|
+
<Input id="username" placeholder="Enter username" />
|
|
238
|
+
</div>;
|
|
239
|
+
```
|
|
240
|
+
|
|
241
|
+
### Controlled
|
|
242
|
+
|
|
243
|
+
```tsx
|
|
244
|
+
import { useState } from "react";
|
|
245
|
+
|
|
246
|
+
function App() {
|
|
247
|
+
const [open, setOpen] = useState(false);
|
|
248
|
+
|
|
249
|
+
return (
|
|
250
|
+
<div className="flex items-center gap-4">
|
|
251
|
+
<Tooltip open={open} onOpenChange={setOpen}>
|
|
252
|
+
<TooltipTrigger asChild>
|
|
253
|
+
<Button>Controlled</Button>
|
|
254
|
+
</TooltipTrigger>
|
|
255
|
+
<TooltipContent>
|
|
256
|
+
<p>Controlled programmatically</p>
|
|
257
|
+
</TooltipContent>
|
|
258
|
+
</Tooltip>
|
|
259
|
+
|
|
260
|
+
<Button size="sm" onClick={() => setOpen(true)}>
|
|
261
|
+
Show
|
|
262
|
+
</Button>
|
|
263
|
+
<Button size="sm" variant="outline" onClick={() => setOpen(false)}>
|
|
264
|
+
Hide
|
|
265
|
+
</Button>
|
|
266
|
+
</div>
|
|
267
|
+
);
|
|
268
|
+
}
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
## Casos de Uso
|
|
272
|
+
|
|
273
|
+
**Icon buttons**: Descripción de acciones
|
|
274
|
+
**Form help**: Explicar campos de formulario
|
|
275
|
+
**Status indicators**: Detalles de estados
|
|
276
|
+
**Truncated text**: Mostrar texto completo
|
|
277
|
+
**Disabled elements**: Explicar por qué está deshabilitado
|
|
278
|
+
|
|
279
|
+
## Estilos Base
|
|
280
|
+
|
|
281
|
+
- **Background**: `bg-primary`
|
|
282
|
+
- **Text**: `text-primary-foreground text-xs`
|
|
283
|
+
- **Padding**: `px-3 py-1.5`
|
|
284
|
+
- **Border radius**: `rounded-md`
|
|
285
|
+
- **Arrow**: `size-2.5` con `bg-primary`
|
|
286
|
+
- **Z-index**: `z-50`
|
|
287
|
+
- **Animation**: Fade + zoom in/out
|
|
288
|
+
|
|
289
|
+
## Accesibilidad
|
|
290
|
+
|
|
291
|
+
- ✅ **ARIA**: `aria-describedby` automático
|
|
292
|
+
- ✅ **Keyboard**: Visible en focus del trigger
|
|
293
|
+
- ✅ **Hover**: Aparece en hover
|
|
294
|
+
- ✅ **Focus**: Aparece en focus del trigger
|
|
295
|
+
- ✅ **Escape**: Cierra con Escape key
|
|
296
|
+
|
|
297
|
+
## Notas de Implementación
|
|
298
|
+
|
|
299
|
+
- **Radix UI**: Basado en `@radix-ui/react-tooltip`
|
|
300
|
+
- **Portal**: Content se renderiza en portal (fuera del DOM tree)
|
|
301
|
+
- **Arrow**: Incluido automáticamente en TooltipContent
|
|
302
|
+
- **Provider**: Tooltip individual ya incluye TooltipProvider interno
|
|
303
|
+
- **Global Provider**: Usa TooltipProvider para delay global
|
|
304
|
+
|
|
305
|
+
## Troubleshooting
|
|
306
|
+
|
|
307
|
+
**Tooltip no aparece**: Verifica que TooltipTrigger tenga `asChild` si es Button/componente
|
|
308
|
+
**Posición incorrecta**: Usa `side` prop en TooltipContent
|
|
309
|
+
**Delay muy largo**: Ajusta `delayDuration` en Tooltip o TooltipProvider
|
|
310
|
+
**Z-index issues**: Tooltip usa `z-50`, puede necesitar ajuste si hay overlays
|
|
311
|
+
**Arrow no visible**: Arrow incluido por default, verifica estilos no sobrescritos
|
|
312
|
+
**No se cierra**: Usa Escape key o mouseleave del trigger
|
|
313
|
+
|
|
314
|
+
## Referencias
|
|
315
|
+
|
|
316
|
+
- **Radix UI Tooltip**: <https://www.radix-ui.com/primitives/docs/components/tooltip>
|
|
317
|
+
- **shadcn/ui Tooltip**: <https://ui.shadcn.com/docs/components/tooltip>
|