@adamosuiteservices/ui 2.11.15 → 2.11.16

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 (40) hide show
  1. package/dist/colors.css +1 -1
  2. package/dist/styles.css +1 -1
  3. package/docs/AI-GUIDE.md +321 -321
  4. package/docs/components/layout/sidebar.md +399 -399
  5. package/docs/components/layout/toaster.md +436 -436
  6. package/docs/components/ui/accordion-rounded.md +584 -584
  7. package/docs/components/ui/accordion.md +269 -269
  8. package/docs/components/ui/button-group.md +984 -984
  9. package/docs/components/ui/button.md +1137 -1137
  10. package/docs/components/ui/calendar.md +1159 -1159
  11. package/docs/components/ui/card.md +1455 -1455
  12. package/docs/components/ui/checkbox.md +292 -292
  13. package/docs/components/ui/collapsible.md +323 -323
  14. package/docs/components/ui/command.md +454 -454
  15. package/docs/components/ui/context-menu.md +540 -540
  16. package/docs/components/ui/dialog.md +628 -628
  17. package/docs/components/ui/dropdown-menu.md +709 -709
  18. package/docs/components/ui/field.md +706 -706
  19. package/docs/components/ui/hover-card.md +446 -446
  20. package/docs/components/ui/input.md +362 -362
  21. package/docs/components/ui/kbd.md +434 -434
  22. package/docs/components/ui/label.md +359 -359
  23. package/docs/components/ui/pagination.md +650 -650
  24. package/docs/components/ui/popover.md +536 -536
  25. package/docs/components/ui/progress.md +182 -182
  26. package/docs/components/ui/radio-group.md +311 -311
  27. package/docs/components/ui/select.md +352 -352
  28. package/docs/components/ui/separator.md +214 -214
  29. package/docs/components/ui/sheet.md +142 -142
  30. package/docs/components/ui/skeleton.md +140 -140
  31. package/docs/components/ui/slider.md +341 -341
  32. package/docs/components/ui/spinner.md +170 -170
  33. package/docs/components/ui/switch.md +408 -408
  34. package/docs/components/ui/tabs-underline.md +106 -106
  35. package/docs/components/ui/tabs.md +122 -122
  36. package/docs/components/ui/textarea.md +243 -243
  37. package/docs/components/ui/toggle.md +237 -237
  38. package/docs/components/ui/tooltip.md +317 -317
  39. package/docs/components/ui/typography.md +280 -280
  40. 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>