@adamosuiteservices/ui 1.4.5 → 1.5.6
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/combobox.js +1 -1
- package/dist/components/ui/scroll-area/index.d.ts +1 -0
- package/dist/components/ui/scroll-area/scroll-area.d.ts +5 -0
- package/dist/components/ui/scroll-area/scroll-area.stories.d.ts +11 -0
- package/dist/custom-layered-styles.css +1 -1
- package/dist/custom-scroll-bar.css +1 -0
- package/dist/dialog.js +1 -1
- package/dist/{index-DMLQL2aG.js → index-DniCthJA.js} +2 -2
- package/dist/{sheet-UZWAbdXr.js → sheet-B-9YHdR5.js} +1 -1
- package/dist/sheet.js +1 -1
- package/dist/sidebar.cjs +1 -1
- package/dist/sidebar.js +15 -15
- package/dist/styles.css +1 -1
- package/docs/components/ui/scroll-area.md +357 -0
- package/package.json +4 -2
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
# ScrollArea
|
|
2
|
+
|
|
3
|
+
Componente de área de scroll personalizada con scrollbars estilizados. Construido sobre Radix UI Scroll Area para proporcionar una experiencia de scroll consistente y accesible.
|
|
4
|
+
|
|
5
|
+
## Características Principales
|
|
6
|
+
|
|
7
|
+
- **Scrollbars personalizados**: Scrollbars estilizados que reemplazan los nativos del navegador
|
|
8
|
+
- **Orientación flexible**: Soporte para scroll vertical y horizontal
|
|
9
|
+
- **Radix UI**: Construido sobre `@radix-ui/react-scroll-area` para accesibilidad y funcionalidad robusta
|
|
10
|
+
- **Focus management**: Manejo automático de focus con ring visual
|
|
11
|
+
- **Data slots**: Atributos `data-slot` para targeting CSS específico
|
|
12
|
+
- **Responsive**: Funciona en todos los dispositivos y navegadores
|
|
13
|
+
|
|
14
|
+
## Importación
|
|
15
|
+
|
|
16
|
+
```tsx
|
|
17
|
+
import { ScrollArea, ScrollBar } from "@adamosuiteservices/ui/scroll-area";
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
## Uso Básico
|
|
21
|
+
|
|
22
|
+
### Scroll Vertical
|
|
23
|
+
|
|
24
|
+
Uso más común, scroll vertical automático.
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { ScrollArea } from "@adamosuiteservices/ui/scroll-area";
|
|
28
|
+
import { Separator } from "@adamosuiteservices/ui/separator";
|
|
29
|
+
|
|
30
|
+
<ScrollArea className="h-72 w-48 rounded-md border">
|
|
31
|
+
<div className="p-4">
|
|
32
|
+
<h4 className="mb-4 text-sm font-medium leading-none">Tags</h4>
|
|
33
|
+
{Array.from({ length: 50 }).map((_, i) => (
|
|
34
|
+
<div key={i}>
|
|
35
|
+
<div className="text-sm">Tag {i + 1}</div>
|
|
36
|
+
{i !== 49 && <Separator className="my-2" />}
|
|
37
|
+
</div>
|
|
38
|
+
))}
|
|
39
|
+
</div>
|
|
40
|
+
</ScrollArea>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
### Scroll Horizontal
|
|
44
|
+
|
|
45
|
+
Para contenido que se desplaza horizontalmente.
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
import { ScrollArea, ScrollBar } from "@adamosuiteservices/ui/scroll-area";
|
|
49
|
+
|
|
50
|
+
<ScrollArea className="w-96 whitespace-nowrap rounded-md border">
|
|
51
|
+
<div className="flex w-max space-x-4 p-4">
|
|
52
|
+
{Array.from({ length: 20 }).map((_, i) => (
|
|
53
|
+
<figure key={i} className="shrink-0">
|
|
54
|
+
<div className="overflow-hidden rounded-md">
|
|
55
|
+
<img
|
|
56
|
+
src={`/images/${i + 1}.jpg`}
|
|
57
|
+
alt={`Photo ${i + 1}`}
|
|
58
|
+
className="h-[200px] w-[300px] object-cover"
|
|
59
|
+
/>
|
|
60
|
+
</div>
|
|
61
|
+
<figcaption className="pt-2 text-xs text-muted-foreground">
|
|
62
|
+
Photo by Artist {i + 1}
|
|
63
|
+
</figcaption>
|
|
64
|
+
</figure>
|
|
65
|
+
))}
|
|
66
|
+
</div>
|
|
67
|
+
<ScrollBar orientation="horizontal" />
|
|
68
|
+
</ScrollArea>;
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Nota**: Para scroll horizontal, debes agregar explícitamente `<ScrollBar orientation="horizontal" />`.
|
|
72
|
+
|
|
73
|
+
### Ambos Scrollbars
|
|
74
|
+
|
|
75
|
+
Contenido que desborda en ambas direcciones.
|
|
76
|
+
|
|
77
|
+
```tsx
|
|
78
|
+
<ScrollArea className="h-[400px] w-[600px] rounded-md border">
|
|
79
|
+
<div className="w-[800px] p-4">
|
|
80
|
+
<h4 className="mb-4 text-sm font-medium leading-none">
|
|
81
|
+
Wide Content with Vertical Scroll
|
|
82
|
+
</h4>
|
|
83
|
+
<div className="space-y-2">
|
|
84
|
+
{Array.from({ length: 30 }).map((_, i) => (
|
|
85
|
+
<div key={i} className="text-sm p-3 bg-muted rounded">
|
|
86
|
+
Item {i + 1} - This is wide content that needs horizontal scroll.
|
|
87
|
+
</div>
|
|
88
|
+
))}
|
|
89
|
+
</div>
|
|
90
|
+
</div>
|
|
91
|
+
<ScrollBar orientation="horizontal" />
|
|
92
|
+
</ScrollArea>
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Componentes
|
|
96
|
+
|
|
97
|
+
### ScrollArea
|
|
98
|
+
|
|
99
|
+
Componente principal del área de scroll.
|
|
100
|
+
|
|
101
|
+
#### Props
|
|
102
|
+
|
|
103
|
+
| Prop | Tipo | Descripción |
|
|
104
|
+
| ----------- | -------------------------------- | ---------------------------- |
|
|
105
|
+
| `className` | `string` | Clases CSS adicionales |
|
|
106
|
+
| `children` | `ReactNode` | Contenido del área de scroll |
|
|
107
|
+
| `...props` | `ScrollAreaPrimitive.Root` props | Props de Radix UI ScrollArea |
|
|
108
|
+
|
|
109
|
+
**Estilos por defecto**: `relative`
|
|
110
|
+
|
|
111
|
+
**Data slot**: `scroll-area`
|
|
112
|
+
|
|
113
|
+
#### Características internas
|
|
114
|
+
|
|
115
|
+
- **Viewport automático**: Incluye `ScrollAreaPrimitive.Viewport` con focus management
|
|
116
|
+
- **ScrollBar vertical**: Incluye automáticamente un `ScrollBar` vertical por defecto
|
|
117
|
+
- **Corner**: Incluye `ScrollAreaPrimitive.Corner` para el espacio entre scrollbars
|
|
118
|
+
|
|
119
|
+
### ScrollBar
|
|
120
|
+
|
|
121
|
+
Componente de scrollbar personalizado.
|
|
122
|
+
|
|
123
|
+
#### Props
|
|
124
|
+
|
|
125
|
+
| Prop | Tipo | Default | Descripción |
|
|
126
|
+
| ------------- | ----------------------------------------------- | ------------ | ------------------------------------- |
|
|
127
|
+
| `orientation` | `"vertical" \| "horizontal"` | `"vertical"` | Orientación del scrollbar |
|
|
128
|
+
| `className` | `string` | - | Clases CSS adicionales |
|
|
129
|
+
| `...props` | `ScrollAreaPrimitive.ScrollAreaScrollbar` props | - | Props de Radix UI ScrollAreaScrollbar |
|
|
130
|
+
|
|
131
|
+
**Estilos por defecto**:
|
|
132
|
+
|
|
133
|
+
- Base: `flex touch-none p-px transition-colors select-none`
|
|
134
|
+
- Vertical: `h-full w-2.5 border-l border-l-transparent`
|
|
135
|
+
- Horizontal: `h-2.5 flex-col border-t border-t-transparent`
|
|
136
|
+
|
|
137
|
+
**Data slot**: `scroll-area-scrollbar`
|
|
138
|
+
|
|
139
|
+
**Thumb**: Incluye internamente un `ScrollAreaThumb` con estilo `bg-border relative flex-1 rounded-full`
|
|
140
|
+
|
|
141
|
+
## Ejemplos
|
|
142
|
+
|
|
143
|
+
### Texto Largo (Terms & Conditions)
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
<ScrollArea className="h-[400px] w-[500px] rounded-md border p-4">
|
|
147
|
+
<h3 className="mb-4 text-lg font-semibold">Terms and Conditions</h3>
|
|
148
|
+
<div className="space-y-4 text-sm">
|
|
149
|
+
<p>Lorem ipsum dolor sit amet, consectetur adipiscing elit...</p>
|
|
150
|
+
<p>Duis aute irure dolor in reprehenderit in voluptate...</p>
|
|
151
|
+
{/* More paragraphs */}
|
|
152
|
+
</div>
|
|
153
|
+
</ScrollArea>
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Con Badges/Tags
|
|
157
|
+
|
|
158
|
+
```tsx
|
|
159
|
+
import { Badge } from "@adamosuiteservices/ui/badge";
|
|
160
|
+
|
|
161
|
+
const tags = ["React", "TypeScript", "Next.js", "Tailwind"];
|
|
162
|
+
|
|
163
|
+
<ScrollArea className="h-72 w-80 rounded-md border p-4">
|
|
164
|
+
<h4 className="mb-4 text-sm font-medium leading-none">Technologies</h4>
|
|
165
|
+
<div className="flex flex-wrap gap-2">
|
|
166
|
+
{tags.map((tag) => (
|
|
167
|
+
<Badge key={tag} variant="secondary">
|
|
168
|
+
{tag}
|
|
169
|
+
</Badge>
|
|
170
|
+
))}
|
|
171
|
+
</div>
|
|
172
|
+
</ScrollArea>;
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
### Alturas Personalizadas
|
|
176
|
+
|
|
177
|
+
Controla la altura visible con clases de Tailwind.
|
|
178
|
+
|
|
179
|
+
```tsx
|
|
180
|
+
{
|
|
181
|
+
/* Small */
|
|
182
|
+
}
|
|
183
|
+
<ScrollArea className="h-32 w-64 rounded-md border p-4">
|
|
184
|
+
{/* Content */}
|
|
185
|
+
</ScrollArea>;
|
|
186
|
+
|
|
187
|
+
{
|
|
188
|
+
/* Medium */
|
|
189
|
+
}
|
|
190
|
+
<ScrollArea className="h-64 w-64 rounded-md border p-4">
|
|
191
|
+
{/* Content */}
|
|
192
|
+
</ScrollArea>;
|
|
193
|
+
|
|
194
|
+
{
|
|
195
|
+
/* Large */
|
|
196
|
+
}
|
|
197
|
+
<ScrollArea className="h-96 w-64 rounded-md border p-4">
|
|
198
|
+
{/* Content */}
|
|
199
|
+
</ScrollArea>;
|
|
200
|
+
|
|
201
|
+
{
|
|
202
|
+
/* Full viewport height */
|
|
203
|
+
}
|
|
204
|
+
<ScrollArea className="h-screen w-64 rounded-md border p-4">
|
|
205
|
+
{/* Content */}
|
|
206
|
+
</ScrollArea>;
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
## Casos de Uso
|
|
210
|
+
|
|
211
|
+
### Listas de Navegación
|
|
212
|
+
|
|
213
|
+
```tsx
|
|
214
|
+
<ScrollArea className="h-[600px] w-64 rounded-md border">
|
|
215
|
+
<nav className="p-4 space-y-1">
|
|
216
|
+
{menuItems.map((item) => (
|
|
217
|
+
<a
|
|
218
|
+
key={item.id}
|
|
219
|
+
href={item.href}
|
|
220
|
+
className="block px-3 py-2 rounded-md hover:bg-accent"
|
|
221
|
+
>
|
|
222
|
+
{item.label}
|
|
223
|
+
</a>
|
|
224
|
+
))}
|
|
225
|
+
</nav>
|
|
226
|
+
</ScrollArea>
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Chat/Messages
|
|
230
|
+
|
|
231
|
+
```tsx
|
|
232
|
+
<ScrollArea className="h-[500px] w-full rounded-md border p-4">
|
|
233
|
+
<div className="space-y-4">
|
|
234
|
+
{messages.map((message) => (
|
|
235
|
+
<div key={message.id} className="flex gap-3">
|
|
236
|
+
<Avatar />
|
|
237
|
+
<div>
|
|
238
|
+
<p className="text-sm font-medium">{message.author}</p>
|
|
239
|
+
<p className="text-sm text-muted-foreground">{message.content}</p>
|
|
240
|
+
</div>
|
|
241
|
+
</div>
|
|
242
|
+
))}
|
|
243
|
+
</div>
|
|
244
|
+
</ScrollArea>
|
|
245
|
+
```
|
|
246
|
+
|
|
247
|
+
### Galería de Imágenes (Horizontal)
|
|
248
|
+
|
|
249
|
+
```tsx
|
|
250
|
+
<ScrollArea className="w-full whitespace-nowrap rounded-md border">
|
|
251
|
+
<div className="flex gap-4 p-4">
|
|
252
|
+
{images.map((image) => (
|
|
253
|
+
<img
|
|
254
|
+
key={image.id}
|
|
255
|
+
src={image.url}
|
|
256
|
+
alt={image.alt}
|
|
257
|
+
className="h-48 w-64 object-cover rounded-md"
|
|
258
|
+
/>
|
|
259
|
+
))}
|
|
260
|
+
</div>
|
|
261
|
+
<ScrollBar orientation="horizontal" />
|
|
262
|
+
</ScrollArea>
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
### Tabla con Scroll
|
|
266
|
+
|
|
267
|
+
```tsx
|
|
268
|
+
<ScrollArea className="h-[400px] w-full rounded-md border">
|
|
269
|
+
<table className="w-full">
|
|
270
|
+
<thead>
|
|
271
|
+
<tr>
|
|
272
|
+
<th>Column 1</th>
|
|
273
|
+
<th>Column 2</th>
|
|
274
|
+
<th>Column 3</th>
|
|
275
|
+
</tr>
|
|
276
|
+
</thead>
|
|
277
|
+
<tbody>
|
|
278
|
+
{data.map((row) => (
|
|
279
|
+
<tr key={row.id}>
|
|
280
|
+
<td>{row.col1}</td>
|
|
281
|
+
<td>{row.col2}</td>
|
|
282
|
+
<td>{row.col3}</td>
|
|
283
|
+
</tr>
|
|
284
|
+
))}
|
|
285
|
+
</tbody>
|
|
286
|
+
</table>
|
|
287
|
+
</ScrollArea>
|
|
288
|
+
```
|
|
289
|
+
|
|
290
|
+
## Personalización
|
|
291
|
+
|
|
292
|
+
### Estilos del Scrollbar
|
|
293
|
+
|
|
294
|
+
Puedes personalizar el scrollbar usando las clases de Tailwind:
|
|
295
|
+
|
|
296
|
+
```tsx
|
|
297
|
+
<ScrollArea className="h-72 w-48 rounded-md border">
|
|
298
|
+
<div className="p-4">{/* Content */}</div>
|
|
299
|
+
</ScrollArea>;
|
|
300
|
+
|
|
301
|
+
{
|
|
302
|
+
/* Custom scrollbar color */
|
|
303
|
+
}
|
|
304
|
+
<ScrollBar className="[&>div]:bg-primary" />;
|
|
305
|
+
```
|
|
306
|
+
|
|
307
|
+
### Ocultar Scrollbar en Móviles
|
|
308
|
+
|
|
309
|
+
```tsx
|
|
310
|
+
<ScrollArea className="h-72 w-full rounded-md border">
|
|
311
|
+
<div className="p-4">{/* Content */}</div>
|
|
312
|
+
<ScrollBar className="hidden md:flex" />
|
|
313
|
+
</ScrollArea>
|
|
314
|
+
```
|
|
315
|
+
|
|
316
|
+
## Accesibilidad
|
|
317
|
+
|
|
318
|
+
- ✅ **Focus visible**: Ring automático al hacer focus con teclado
|
|
319
|
+
- ✅ **Keyboard navigation**: Soporte completo para navegación con teclado (flechas, Page Up/Down, Home/End)
|
|
320
|
+
- ✅ **Touch support**: `touch-none` en scrollbar para prevenir conflictos con gestos
|
|
321
|
+
- ✅ **ARIA**: Radix UI maneja automáticamente los atributos ARIA necesarios
|
|
322
|
+
|
|
323
|
+
## Data Slots
|
|
324
|
+
|
|
325
|
+
Los siguientes atributos `data-slot` están disponibles para targeting CSS:
|
|
326
|
+
|
|
327
|
+
- `scroll-area` - Contenedor principal
|
|
328
|
+
- `scroll-area-viewport` - Viewport del contenido
|
|
329
|
+
- `scroll-area-scrollbar` - Scrollbar (vertical u horizontal)
|
|
330
|
+
- `scroll-area-thumb` - Thumb del scrollbar
|
|
331
|
+
|
|
332
|
+
### Ejemplo de uso con data-slot
|
|
333
|
+
|
|
334
|
+
```css
|
|
335
|
+
[data-slot="scroll-area-scrollbar"] {
|
|
336
|
+
width: 12px;
|
|
337
|
+
}
|
|
338
|
+
|
|
339
|
+
[data-slot="scroll-area-thumb"] {
|
|
340
|
+
background: hsl(var(--primary));
|
|
341
|
+
}
|
|
342
|
+
```
|
|
343
|
+
|
|
344
|
+
## Notas de Implementación
|
|
345
|
+
|
|
346
|
+
- El componente usa internamente las clases con prefijo `adm:` para evitar conflictos de estilos
|
|
347
|
+
- `ScrollArea` incluye automáticamente un `ScrollBar` vertical por defecto
|
|
348
|
+
- Para scroll horizontal, debes agregar explícitamente `<ScrollBar orientation="horizontal" />`
|
|
349
|
+
- El viewport tiene `size-full` (width y height 100%) para ocupar todo el espacio disponible
|
|
350
|
+
- El scrollbar tiene `transition-colors` para efectos suaves
|
|
351
|
+
- El thumb del scrollbar usa `bg-border` por defecto, configurable con variables CSS de tema
|
|
352
|
+
|
|
353
|
+
## Referencias
|
|
354
|
+
|
|
355
|
+
- Basado en [Radix UI Scroll Area](https://www.radix-ui.com/docs/primitives/components/scroll-area)
|
|
356
|
+
- Inspirado en [shadcn/ui ScrollArea](https://ui.shadcn.com/docs/components/scroll-area)
|
|
357
|
+
- Compatible con todos los navegadores modernos
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adamosuiteservices/ui",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.6",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
"./styles.css": "./dist/styles.css",
|
|
12
12
|
"./custom-layered-styles.css": "./dist/custom-layered-styles.css",
|
|
13
13
|
"./colors.css": "./dist/colors.css",
|
|
14
|
+
"./custom-scroll-bar.css": "./dist/custom-scroll-bar.css",
|
|
14
15
|
"./fonts.css": "./dist/fonts.css",
|
|
15
16
|
"./radius.css": "./dist/radius.css",
|
|
16
17
|
"./space.css": "./dist/space.css",
|
|
@@ -239,6 +240,7 @@
|
|
|
239
240
|
"@radix-ui/react-portal": "^1.1.9",
|
|
240
241
|
"@radix-ui/react-progress": "^1.1.7",
|
|
241
242
|
"@radix-ui/react-radio-group": "^1.3.8",
|
|
243
|
+
"@radix-ui/react-scroll-area": "^1.2.10",
|
|
242
244
|
"@radix-ui/react-select": "^2.2.6",
|
|
243
245
|
"@radix-ui/react-separator": "^1.1.7",
|
|
244
246
|
"@radix-ui/react-slider": "^1.3.6",
|
|
@@ -282,4 +284,4 @@
|
|
|
282
284
|
"vite": "^7.1.7",
|
|
283
285
|
"vite-plugin-dts": "^4.5.4"
|
|
284
286
|
}
|
|
285
|
-
}
|
|
287
|
+
}
|