@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.
@@ -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.4.5",
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
+ }