@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.
Files changed (144) hide show
  1. package/dist/components/ui/icon/icon.d.ts +11 -0
  2. package/dist/components/ui/icon/icon.stories.d.ts +55 -0
  3. package/dist/components/ui/icon/index.d.ts +1 -0
  4. package/dist/components/ui/input-group/input-group.d.ts +1 -1
  5. package/dist/custom-layered-styles.css +1 -1
  6. package/dist/icon.cjs +6 -0
  7. package/dist/icon.js +36 -0
  8. package/dist/icons.css +1 -0
  9. package/dist/styles.css +1 -1
  10. package/docs/AI-GUIDE.md +321 -321
  11. package/docs/components/layout/sidebar.md +404 -404
  12. package/docs/components/layout/toaster.md +436 -436
  13. package/docs/components/ui/accordion-rounded.md +583 -583
  14. package/docs/components/ui/accordion.md +267 -267
  15. package/docs/components/ui/alert.md +671 -671
  16. package/docs/components/ui/avatar.md +588 -588
  17. package/docs/components/ui/badge.md +1024 -1024
  18. package/docs/components/ui/button-group.md +1002 -1002
  19. package/docs/components/ui/button.md +1078 -1078
  20. package/docs/components/ui/calendar.md +1159 -1159
  21. package/docs/components/ui/card.md +1265 -1265
  22. package/docs/components/ui/checkbox.md +292 -292
  23. package/docs/components/ui/collapsible.md +320 -320
  24. package/docs/components/ui/command.md +454 -454
  25. package/docs/components/ui/context-menu.md +540 -540
  26. package/docs/components/ui/dialog.md +628 -628
  27. package/docs/components/ui/dropdown-menu.md +731 -731
  28. package/docs/components/ui/field.md +706 -706
  29. package/docs/components/ui/hover-card.md +446 -446
  30. package/docs/components/ui/icon.md +502 -0
  31. package/docs/components/ui/input-group.md +509 -509
  32. package/docs/components/ui/input.md +362 -362
  33. package/docs/components/ui/kbd.md +434 -434
  34. package/docs/components/ui/label.md +359 -359
  35. package/docs/components/ui/pagination.md +650 -650
  36. package/docs/components/ui/popover.md +536 -536
  37. package/docs/components/ui/progress.md +182 -182
  38. package/docs/components/ui/radio-group.md +311 -311
  39. package/docs/components/ui/select.md +352 -352
  40. package/docs/components/ui/separator.md +214 -214
  41. package/docs/components/ui/sheet.md +142 -142
  42. package/docs/components/ui/skeleton.md +140 -140
  43. package/docs/components/ui/slider.md +341 -341
  44. package/docs/components/ui/spinner.md +170 -170
  45. package/docs/components/ui/switch.md +402 -402
  46. package/docs/components/ui/table.md +183 -183
  47. package/docs/components/ui/tabs-underline.md +106 -106
  48. package/docs/components/ui/tabs.md +122 -122
  49. package/docs/components/ui/textarea.md +243 -243
  50. package/docs/components/ui/toggle.md +243 -243
  51. package/docs/components/ui/tooltip.md +320 -320
  52. package/docs/components/ui/typography.md +191 -191
  53. package/package.json +6 -5
  54. package/dist/components/icons/account-balance-icon.d.ts +0 -3
  55. package/dist/components/icons/account-icon.d.ts +0 -3
  56. package/dist/components/icons/add-circle-icon.d.ts +0 -3
  57. package/dist/components/icons/alarm-icon.d.ts +0 -3
  58. package/dist/components/icons/archive-icon.d.ts +0 -3
  59. package/dist/components/icons/arrow-back-icon.d.ts +0 -3
  60. package/dist/components/icons/arrow-circle-up-icon.d.ts +0 -3
  61. package/dist/components/icons/arrow-forward-icon.d.ts +0 -3
  62. package/dist/components/icons/arrow-outward-icon.d.ts +0 -3
  63. package/dist/components/icons/article-icon.d.ts +0 -3
  64. package/dist/components/icons/attach-file-icon.d.ts +0 -3
  65. package/dist/components/icons/autorenew-icon.d.ts +0 -3
  66. package/dist/components/icons/bookmark-icon.d.ts +0 -3
  67. package/dist/components/icons/calculate-icon.d.ts +0 -3
  68. package/dist/components/icons/calendar-today-icon.d.ts +0 -3
  69. package/dist/components/icons/call-split-icon.d.ts +0 -3
  70. package/dist/components/icons/cancel-filled-icon.d.ts +0 -3
  71. package/dist/components/icons/cancel-icon.d.ts +0 -3
  72. package/dist/components/icons/check-circle-icon.d.ts +0 -3
  73. package/dist/components/icons/check-icon.d.ts +0 -3
  74. package/dist/components/icons/chevron-back-icon.d.ts +0 -3
  75. package/dist/components/icons/chevron-down-icon.d.ts +0 -3
  76. package/dist/components/icons/chevron-forward-icon.d.ts +0 -3
  77. package/dist/components/icons/chevron-up-icon.d.ts +0 -3
  78. package/dist/components/icons/clarify-icon.d.ts +0 -3
  79. package/dist/components/icons/clock-icon.d.ts +0 -3
  80. package/dist/components/icons/close-icon.d.ts +0 -3
  81. package/dist/components/icons/confirmation-number-icon.d.ts +0 -3
  82. package/dist/components/icons/contacts-icon.d.ts +0 -3
  83. package/dist/components/icons/contract-delete-icon.d.ts +0 -3
  84. package/dist/components/icons/copy-icon.d.ts +0 -3
  85. package/dist/components/icons/do-not-touch-icon.d.ts +0 -3
  86. package/dist/components/icons/download-icon.d.ts +0 -3
  87. package/dist/components/icons/dragger-icon.d.ts +0 -3
  88. package/dist/components/icons/edit-icon.d.ts +0 -3
  89. package/dist/components/icons/edit-square-icon.d.ts +0 -3
  90. package/dist/components/icons/exclamation-icon.d.ts +0 -3
  91. package/dist/components/icons/expand-circle-right-icon.d.ts +0 -3
  92. package/dist/components/icons/feature-search-icon.d.ts +0 -3
  93. package/dist/components/icons/filter-icon.d.ts +0 -3
  94. package/dist/components/icons/folder-icon.d.ts +0 -3
  95. package/dist/components/icons/folder-open-icon.d.ts +0 -3
  96. package/dist/components/icons/format-list-bulleted-icon.d.ts +0 -3
  97. package/dist/components/icons/hamburger-menu-icon.d.ts +0 -3
  98. package/dist/components/icons/help-icon.d.ts +0 -3
  99. package/dist/components/icons/hide-pass-icon.d.ts +0 -3
  100. package/dist/components/icons/home-icon.d.ts +0 -3
  101. package/dist/components/icons/id-card-icon.d.ts +0 -3
  102. package/dist/components/icons/index.d.ts +0 -88
  103. package/dist/components/icons/info-icon.d.ts +0 -3
  104. package/dist/components/icons/kid-star-icon.d.ts +0 -3
  105. package/dist/components/icons/language-icon.d.ts +0 -3
  106. package/dist/components/icons/last-page-icon.d.ts +0 -3
  107. package/dist/components/icons/layers-icon.d.ts +0 -3
  108. package/dist/components/icons/location-icon.d.ts +0 -3
  109. package/dist/components/icons/mail-icon.d.ts +0 -3
  110. package/dist/components/icons/manage-search-icon.d.ts +0 -3
  111. package/dist/components/icons/menu-icon.d.ts +0 -3
  112. package/dist/components/icons/message-icon.d.ts +0 -3
  113. package/dist/components/icons/metrics-icon.d.ts +0 -3
  114. package/dist/components/icons/mic-icon.d.ts +0 -3
  115. package/dist/components/icons/minus-icon.d.ts +0 -3
  116. package/dist/components/icons/mode-comment-icon.d.ts +0 -3
  117. package/dist/components/icons/money-icon.d.ts +0 -3
  118. package/dist/components/icons/monitoring-icon.d.ts +0 -3
  119. package/dist/components/icons/more-icon.d.ts +0 -3
  120. package/dist/components/icons/notifications-icon.d.ts +0 -3
  121. package/dist/components/icons/open-in-new-icon.d.ts +0 -3
  122. package/dist/components/icons/palette-icon.d.ts +0 -3
  123. package/dist/components/icons/password-icon.d.ts +0 -3
  124. package/dist/components/icons/pending-icon.d.ts +0 -3
  125. package/dist/components/icons/person-add-icon.d.ts +0 -3
  126. package/dist/components/icons/person-search-icon.d.ts +0 -3
  127. package/dist/components/icons/photo-icon.d.ts +0 -3
  128. package/dist/components/icons/plus-icon.d.ts +0 -3
  129. package/dist/components/icons/policy-icon.d.ts +0 -3
  130. package/dist/components/icons/publish-icon.d.ts +0 -3
  131. package/dist/components/icons/ready-icon.d.ts +0 -3
  132. package/dist/components/icons/receipt-icon.d.ts +0 -3
  133. package/dist/components/icons/receive-icon.d.ts +0 -3
  134. package/dist/components/icons/refresh-icon.d.ts +0 -3
  135. package/dist/components/icons/search-icon.d.ts +0 -3
  136. package/dist/components/icons/see-icon.d.ts +0 -3
  137. package/dist/components/icons/send-icon.d.ts +0 -3
  138. package/dist/components/icons/settings-icon.d.ts +0 -3
  139. package/dist/components/icons/shield-icon.d.ts +0 -3
  140. package/dist/components/icons/swap-horiz-icon.d.ts +0 -3
  141. package/dist/components/icons/tag-icon.d.ts +0 -3
  142. package/dist/components/icons/trash-icon.d.ts +0 -3
  143. package/dist/icons.cjs +0 -1
  144. package/dist/icons.js +0 -1507
@@ -1,404 +1,404 @@
1
- # Sidebar Component
2
-
3
- ## Descripción
4
-
5
- El componente `Sidebar` es un layout component que proporciona navegación lateral responsive. En desktop muestra un sidebar fijo lateral, mientras que en mobile se convierte automáticamente en un menú Sheet desplegable con icono hamburguesa.
6
-
7
- ## Importación
8
-
9
- ```typescript
10
- import {
11
- Sidebar,
12
- SidebarContent,
13
- SidebarInset,
14
- SidebarTopBar,
15
- SidebarTrigger,
16
- SidebarHeader,
17
- SidebarFooter,
18
- SidebarMenu,
19
- SidebarMenuItem,
20
- } from "@adamosuiteservices/ui/sidebar";
21
- ```
22
-
23
- **Nota**: Si usas `SidebarMenuItem` con `asChild`, también puedes importar componentes de navegación:
24
-
25
- ```typescript
26
- import { Link } from "react-router-dom"; // o Next.js Link
27
- ```
28
-
29
- ## Uso Básico
30
-
31
- ```tsx
32
- <Sidebar>
33
- <SidebarContent>
34
- <SidebarHeader className="adm:items-center">
35
- {/* Logo o título */}
36
- </SidebarHeader>
37
-
38
- <SidebarMenu>
39
- <SidebarMenuItem>
40
- <HomeIcon /> Dashboard
41
- </SidebarMenuItem>
42
- <SidebarMenuItem>
43
- <FolderIcon /> Projects
44
- </SidebarMenuItem>
45
- <SidebarMenuItem>
46
- <SettingsIcon /> Settings
47
- </SidebarMenuItem>
48
- </SidebarMenu>
49
-
50
- <SidebarFooter>
51
- <SidebarMenuItem>
52
- <CircleUserRoundIcon /> Profile
53
- </SidebarMenuItem>
54
- </SidebarFooter>
55
- </SidebarContent>
56
-
57
- <SidebarInset>
58
- <SidebarTopBar>
59
- <h1 className="adm:text-lg adm:font-semibold">Dashboard</h1>
60
- <SidebarTrigger />
61
- </SidebarTopBar>
62
- {/* Contenido principal */}
63
- </SidebarInset>
64
- </Sidebar>
65
- ```
66
-
67
- ## Componentes
68
-
69
- ### Sidebar (Root)
70
-
71
- Contenedor principal con context provider.
72
-
73
- ### SidebarContent
74
-
75
- Contenido del sidebar con Portal para posicionamiento fijo.
76
-
77
- ### SidebarInset
78
-
79
- Contenedor para el contenido principal que se ajusta al sidebar.
80
-
81
- ### SidebarTopBar
82
-
83
- Barra superior sticky para el contenido principal, ideal para incluir el trigger del sidebar y el título de la página.
84
-
85
- ### SidebarTrigger
86
-
87
- Botón hamburguesa que abre/cierra el sidebar en mobile. Automáticamente oculto en desktop (xl+).
88
-
89
- ### SidebarHeader
90
-
91
- Sección superior del sidebar.
92
-
93
- ### SidebarFooter
94
-
95
- Sección inferior del sidebar.
96
-
97
- ### SidebarMenu
98
-
99
- Contenedor para items de menú con scroll.
100
-
101
- ### SidebarMenuItem
102
-
103
- Item individual del menú con hover effects.
104
-
105
- ## Responsive
106
-
107
- - **Desktop (xl+)**: Sidebar fijo lateral (256px de ancho)
108
- - **Mobile**: Sidebar en Sheet (modal lateral)
109
- - Incluye icono hamburguesa automático en mobile
110
-
111
- ## Props
112
-
113
- ### Sidebar
114
-
115
- | Prop | Tipo | Descripción |
116
- | -------- | ----------- | --------------------------------------------------- |
117
- | children | `ReactNode` | Contenido del sidebar (debe incluir SidebarContent) |
118
-
119
- ### SidebarContent
120
-
121
- | Prop | Tipo | Descripción |
122
- | --------- | ----------------------- | ------------------------------------- |
123
- | className | `string` | Clases adicionales para el contenedor |
124
- | children | `ReactNode` | Contenido del sidebar |
125
- | ...props | `ComponentProps<"div">` | Props nativas de div |
126
-
127
- ### SidebarInset
128
-
129
- | Prop | Tipo | Descripción |
130
- | --------- | ----------------------- | ------------------------------------ |
131
- | className | `string` | Clases adicionales |
132
- | children | `ReactNode` | Contenido principal de la aplicación |
133
- | ...props | `ComponentProps<"div">` | Props nativas de div |
134
-
135
- ### SidebarTopBar
136
-
137
- | Prop | Tipo | Descripción |
138
- | --------- | ----------------------- | ------------------------------------------------- |
139
- | className | `string` | Clases adicionales |
140
- | children | `ReactNode` | Contenido de la barra (trigger, título, acciones) |
141
- | ...props | `ComponentProps<"div">` | Props nativas de div |
142
-
143
- **Estilos por defecto**: sticky, top-0, flex, gap-2, items-center, justify-between, bg-background, p-4, border-b
144
-
145
- ### SidebarTrigger
146
-
147
- | Prop | Tipo | Descripción |
148
- | --------- | -------------------------- | ----------------------- |
149
- | className | `string` | Clases adicionales |
150
- | ...props | `ComponentProps<"button">` | Props nativas de button |
151
-
152
- **Comportamiento**: Oculto automáticamente en desktop (xl:hidden). Incluye icono MenuIcon de lucide-react.
153
-
154
- ### SidebarHeader
155
-
156
- | Prop | Tipo | Descripción |
157
- | --------- | -------------------------- | ----------------------------------- |
158
- | className | `string` | Clases adicionales |
159
- | children | `ReactNode` | Contenido del header (logo, título) |
160
- | ...props | `ComponentProps<"header">` | Props nativas de header |
161
-
162
- ### SidebarFooter
163
-
164
- | Prop | Tipo | Descripción |
165
- | --------- | -------------------------- | -------------------------------------- |
166
- | className | `string` | Clases adicionales |
167
- | children | `ReactNode` | Contenido del footer (usuario, logout) |
168
- | ...props | `ComponentProps<"footer">` | Props nativas de footer |
169
-
170
- ### SidebarMenu
171
-
172
- | Prop | Tipo | Descripción |
173
- | --------- | ----------------------- | -------------------------------- |
174
- | className | `string` | Clases adicionales |
175
- | children | `ReactNode` | Items del menú (SidebarMenuItem) |
176
- | ...props | `ComponentProps<"div">` | Props nativas de div |
177
-
178
- ### SidebarMenuItem
179
-
180
- | Prop | Tipo | Default | Descripción |
181
- | --------- | -------------------------- | ------- | ----------------------------------------------------------- |
182
- | asChild | `boolean` | `false` | Si es true, renderiza el hijo directo en lugar de un button |
183
- | className | `string` | - | Clases adicionales |
184
- | ...props | `ComponentProps<"button">` | - | Props nativas de button |
185
-
186
- ## Características Principales
187
-
188
- - **Responsive automático**: Desktop muestra sidebar fijo, mobile usa Sheet con hamburger
189
- - **Auto-manejo del height**: Previene layout shifts al calcular altura automáticamente
190
- - **Breakpoint xl (1280px)**: Usa `useMediaQuery` para detectar el cambio
191
- - **Portal rendering**: Usa Radix Portal para z-index correcto
192
- - **Sheet integration**: Integración nativa con componente Sheet para mobile
193
- - **Accesibilidad**: Incluye VisuallyHidden para screen readers
194
- - **Sticky positioning**: Sidebar fijo en desktop con scroll independiente del contenido
195
-
196
- ## Ejemplo Completo
197
-
198
- ```tsx
199
- import {
200
- Sidebar,
201
- SidebarContent,
202
- SidebarFooter,
203
- SidebarHeader,
204
- SidebarInset,
205
- SidebarMenu,
206
- SidebarMenuItem,
207
- SidebarTopBar,
208
- SidebarTrigger,
209
- } from "@adamosuiteservices/ui/sidebar";
210
- import {
211
- CircleUserRoundIcon,
212
- HomeIcon,
213
- SettingsIcon,
214
- FolderIcon,
215
- } from "lucide-react";
216
-
217
- export default function AppLayout() {
218
- return (
219
- <Sidebar>
220
- <SidebarContent>
221
- <SidebarHeader className="adm:items-center">
222
- <Logo />
223
- </SidebarHeader>
224
-
225
- <SidebarMenu>
226
- <SidebarMenuItem>
227
- <HomeIcon /> Dashboard
228
- </SidebarMenuItem>
229
- <SidebarMenuItem>
230
- <FolderIcon /> Projects
231
- </SidebarMenuItem>
232
- <SidebarMenuItem>
233
- <SettingsIcon /> Settings
234
- </SidebarMenuItem>
235
- </SidebarMenu>
236
-
237
- <SidebarFooter>
238
- <SidebarMenuItem>
239
- <CircleUserRoundIcon /> Profile
240
- </SidebarMenuItem>
241
- </SidebarFooter>
242
- </SidebarContent>
243
-
244
- <SidebarInset>
245
- <SidebarTopBar>
246
- <h1 className="adm:text-lg adm:font-semibold">Dashboard</h1>
247
- <SidebarTrigger />
248
- </SidebarTopBar>
249
- <main className="adm:p-6">{/* Tu contenido aquí */}</main>
250
- </SidebarInset>
251
- </Sidebar>
252
- );
253
- }
254
- ```
255
-
256
- ## Hook Personalizado
257
-
258
- ### useSidebarContext()
259
-
260
- Hook para acceder al contexto del Sidebar desde componentes hijos.
261
-
262
- ```tsx
263
- import { useSidebarContext } from "@adamosuiteservices/ui/sidebar";
264
-
265
- function CustomSidebarComponent() {
266
- const { isXl, sidebarHeight, sheetOpen, setSheetOpen } = useSidebarContext();
267
-
268
- return (
269
- <div>
270
- {isXl ? "Desktop" : "Mobile"}
271
- <span>Height: {sidebarHeight}</span>
272
- <button onClick={() => setSheetOpen(!sheetOpen)}>Toggle Sidebar</button>
273
- </div>
274
- );
275
- }
276
- ```
277
-
278
- **Retorna**:
279
- | Propiedad | Tipo | Descripción |
280
- |-----------|------|-------------|
281
- | isXl | `boolean` | True si el viewport es >= 1280px |
282
- | sidebarHeight | `string` | Altura calculada del sidebar ("auto" en desktop, px en mobile) |
283
- | setSidebarHeight | `Dispatch<SetStateAction<string>>` | Setter para actualizar la altura |
284
- | sheetOpen | `boolean` | Estado del Sheet en mobile (abierto/cerrado) |
285
- | setSheetOpen | `Dispatch<SetStateAction<boolean>>` | Setter para controlar el estado del Sheet |
286
-
287
- **Nota**: Este hook debe usarse dentro de un componente que sea hijo de `<Sidebar>`.
288
-
289
- ## Ejemplos Adicionales
290
-
291
- ### Items Básicos con Iconos
292
-
293
- El ejemplo principal muestra el uso más simple - items como buttons con iconos:
294
-
295
- ```tsx
296
- <SidebarMenu>
297
- <SidebarMenuItem>
298
- <HomeIcon /> Dashboard
299
- </SidebarMenuItem>
300
- <SidebarMenuItem>
301
- <FolderIcon /> Projects
302
- </SidebarMenuItem>
303
- <SidebarMenuItem>
304
- <SettingsIcon /> Settings
305
- </SidebarMenuItem>
306
- </SidebarMenu>
307
- ```
308
-
309
- ### Con React Router (usando asChild)
310
-
311
- ```tsx
312
- import { Link } from "react-router-dom";
313
-
314
- <SidebarMenu>
315
- <SidebarMenuItem asChild>
316
- <Link to="/dashboard">
317
- <HomeIcon /> Dashboard
318
- </Link>
319
- </SidebarMenuItem>
320
- <SidebarMenuItem asChild>
321
- <Link to="/settings">
322
- <SettingsIcon /> Settings
323
- </Link>
324
- </SidebarMenuItem>
325
- </SidebarMenu>;
326
- ```
327
-
328
- ### Con Next.js (usando asChild)
329
-
330
- ```tsx
331
- import Link from "next/link";
332
-
333
- <SidebarMenu>
334
- <SidebarMenuItem asChild>
335
- <Link href="/dashboard">
336
- <HomeIcon /> Dashboard
337
- </Link>
338
- </SidebarMenuItem>
339
- </SidebarMenu>;
340
- ```
341
-
342
- ### Estados Activos
343
-
344
- ```tsx
345
- const pathname = usePathname(); // Next.js o similar
346
-
347
- <SidebarMenu>
348
- <SidebarMenuItem
349
- className={pathname === "/dashboard" ? "adm:bg-white/20" : ""}
350
- >
351
- <HomeIcon /> Dashboard
352
- </SidebarMenuItem>
353
- <SidebarMenuItem
354
- className={pathname === "/settings" ? "adm:bg-white/20" : ""}
355
- >
356
- <SettingsIcon /> Settings
357
- </SidebarMenuItem>
358
- </SidebarMenu>;
359
- ```
360
-
361
- ### Personalización de Colores
362
-
363
- El sidebar usa variables CSS de tema. Puedes personalizarlas:
364
-
365
- ```css
366
- :root {
367
- --sidebar-primary: 220 13% 18%;
368
- --sidebar-primary-foreground: 210 20% 98%;
369
- }
370
- ```
371
-
372
- ## Notas de Implementación
373
-
374
- - El componente usa internamente las clases con prefijo `adm:` para evitar conflictos de estilos
375
- - `SidebarContent` usa Portal de Radix para renderizar en el top level del DOM
376
- - El cambio responsive ocurre automáticamente en el breakpoint xl (1280px)
377
- - En mobile, el Sheet se abre desde la izquierda
378
- - `SidebarMenuItem` tiene hover effects y padding predefinidos
379
- - `SidebarMenu` incluye scroll automático si el contenido excede la altura
380
- - Los componentes usan `data-slot` attributes para debugging y testing:
381
- - `sidebar` - Contenedor root
382
- - `sidebar-content` - Contenido principal del sidebar
383
- - `sidebar-trigger` - Botón hamburguesa para mobile
384
- - `sidebar-inset` - Contenedor del contenido principal
385
- - `sidebar-top-bar` - Barra superior (si se usa)
386
- - `sidebar-header` - Header del sidebar
387
- - `sidebar-footer` - Footer del sidebar
388
- - `sidebar-menu` - Contenedor de items del menú
389
- - `sidebar-menu-item` - Item individual del menú
390
-
391
- ## Accesibilidad
392
-
393
- - ✅ El Sheet en mobile incluye SheetTitle y SheetDescription (ocultos visualmente)
394
- - ✅ Navegación por teclado soportada en todos los items
395
- - ✅ Focus visible en items del menú
396
- - ✅ Semántica HTML correcta (nav, header, footer)
397
- - ✅ ARIA labels automáticos en el Sheet trigger
398
-
399
- ## Referencias
400
-
401
- - Similar a shadcn/ui Sidebar pattern
402
- - Usa Radix UI Portal para rendering
403
- - Usa Radix UI Sheet para modal mobile
404
- - Implementa useMediaQuery de @uidotdev/usehooks
1
+ # Sidebar Component
2
+
3
+ ## Descripción
4
+
5
+ El componente `Sidebar` es un layout component que proporciona navegación lateral responsive. En desktop muestra un sidebar fijo lateral, mientras que en mobile se convierte automáticamente en un menú Sheet desplegable con icono hamburguesa.
6
+
7
+ ## Importación
8
+
9
+ ```typescript
10
+ import {
11
+ Sidebar,
12
+ SidebarContent,
13
+ SidebarInset,
14
+ SidebarTopBar,
15
+ SidebarTrigger,
16
+ SidebarHeader,
17
+ SidebarFooter,
18
+ SidebarMenu,
19
+ SidebarMenuItem,
20
+ } from "@adamosuiteservices/ui/sidebar";
21
+ ```
22
+
23
+ **Nota**: Si usas `SidebarMenuItem` con `asChild`, también puedes importar componentes de navegación:
24
+
25
+ ```typescript
26
+ import { Link } from "react-router-dom"; // o Next.js Link
27
+ ```
28
+
29
+ ## Uso Básico
30
+
31
+ ```tsx
32
+ <Sidebar>
33
+ <SidebarContent>
34
+ <SidebarHeader className="adm:items-center">
35
+ {/* Logo o título */}
36
+ </SidebarHeader>
37
+
38
+ <SidebarMenu>
39
+ <SidebarMenuItem>
40
+ <HomeIcon /> Dashboard
41
+ </SidebarMenuItem>
42
+ <SidebarMenuItem>
43
+ <FolderIcon /> Projects
44
+ </SidebarMenuItem>
45
+ <SidebarMenuItem>
46
+ <SettingsIcon /> Settings
47
+ </SidebarMenuItem>
48
+ </SidebarMenu>
49
+
50
+ <SidebarFooter>
51
+ <SidebarMenuItem>
52
+ <CircleUserRoundIcon /> Profile
53
+ </SidebarMenuItem>
54
+ </SidebarFooter>
55
+ </SidebarContent>
56
+
57
+ <SidebarInset>
58
+ <SidebarTopBar>
59
+ <h1 className="adm:text-lg adm:font-semibold">Dashboard</h1>
60
+ <SidebarTrigger />
61
+ </SidebarTopBar>
62
+ {/* Contenido principal */}
63
+ </SidebarInset>
64
+ </Sidebar>
65
+ ```
66
+
67
+ ## Componentes
68
+
69
+ ### Sidebar (Root)
70
+
71
+ Contenedor principal con context provider.
72
+
73
+ ### SidebarContent
74
+
75
+ Contenido del sidebar con Portal para posicionamiento fijo.
76
+
77
+ ### SidebarInset
78
+
79
+ Contenedor para el contenido principal que se ajusta al sidebar.
80
+
81
+ ### SidebarTopBar
82
+
83
+ Barra superior sticky para el contenido principal, ideal para incluir el trigger del sidebar y el título de la página.
84
+
85
+ ### SidebarTrigger
86
+
87
+ Botón hamburguesa que abre/cierra el sidebar en mobile. Automáticamente oculto en desktop (xl+).
88
+
89
+ ### SidebarHeader
90
+
91
+ Sección superior del sidebar.
92
+
93
+ ### SidebarFooter
94
+
95
+ Sección inferior del sidebar.
96
+
97
+ ### SidebarMenu
98
+
99
+ Contenedor para items de menú con scroll.
100
+
101
+ ### SidebarMenuItem
102
+
103
+ Item individual del menú con hover effects.
104
+
105
+ ## Responsive
106
+
107
+ - **Desktop (xl+)**: Sidebar fijo lateral (256px de ancho)
108
+ - **Mobile**: Sidebar en Sheet (modal lateral)
109
+ - Incluye icono hamburguesa automático en mobile
110
+
111
+ ## Props
112
+
113
+ ### Sidebar
114
+
115
+ | Prop | Tipo | Descripción |
116
+ | -------- | ----------- | --------------------------------------------------- |
117
+ | children | `ReactNode` | Contenido del sidebar (debe incluir SidebarContent) |
118
+
119
+ ### SidebarContent
120
+
121
+ | Prop | Tipo | Descripción |
122
+ | --------- | ----------------------- | ------------------------------------- |
123
+ | className | `string` | Clases adicionales para el contenedor |
124
+ | children | `ReactNode` | Contenido del sidebar |
125
+ | ...props | `ComponentProps<"div">` | Props nativas de div |
126
+
127
+ ### SidebarInset
128
+
129
+ | Prop | Tipo | Descripción |
130
+ | --------- | ----------------------- | ------------------------------------ |
131
+ | className | `string` | Clases adicionales |
132
+ | children | `ReactNode` | Contenido principal de la aplicación |
133
+ | ...props | `ComponentProps<"div">` | Props nativas de div |
134
+
135
+ ### SidebarTopBar
136
+
137
+ | Prop | Tipo | Descripción |
138
+ | --------- | ----------------------- | ------------------------------------------------- |
139
+ | className | `string` | Clases adicionales |
140
+ | children | `ReactNode` | Contenido de la barra (trigger, título, acciones) |
141
+ | ...props | `ComponentProps<"div">` | Props nativas de div |
142
+
143
+ **Estilos por defecto**: sticky, top-0, flex, gap-2, items-center, justify-between, bg-background, p-4, border-b
144
+
145
+ ### SidebarTrigger
146
+
147
+ | Prop | Tipo | Descripción |
148
+ | --------- | -------------------------- | ----------------------- |
149
+ | className | `string` | Clases adicionales |
150
+ | ...props | `ComponentProps<"button">` | Props nativas de button |
151
+
152
+ **Comportamiento**: Oculto automáticamente en desktop (xl:hidden). Incluye icono MenuIcon de lucide-react.
153
+
154
+ ### SidebarHeader
155
+
156
+ | Prop | Tipo | Descripción |
157
+ | --------- | -------------------------- | ----------------------------------- |
158
+ | className | `string` | Clases adicionales |
159
+ | children | `ReactNode` | Contenido del header (logo, título) |
160
+ | ...props | `ComponentProps<"header">` | Props nativas de header |
161
+
162
+ ### SidebarFooter
163
+
164
+ | Prop | Tipo | Descripción |
165
+ | --------- | -------------------------- | -------------------------------------- |
166
+ | className | `string` | Clases adicionales |
167
+ | children | `ReactNode` | Contenido del footer (usuario, logout) |
168
+ | ...props | `ComponentProps<"footer">` | Props nativas de footer |
169
+
170
+ ### SidebarMenu
171
+
172
+ | Prop | Tipo | Descripción |
173
+ | --------- | ----------------------- | -------------------------------- |
174
+ | className | `string` | Clases adicionales |
175
+ | children | `ReactNode` | Items del menú (SidebarMenuItem) |
176
+ | ...props | `ComponentProps<"div">` | Props nativas de div |
177
+
178
+ ### SidebarMenuItem
179
+
180
+ | Prop | Tipo | Default | Descripción |
181
+ | --------- | -------------------------- | ------- | ----------------------------------------------------------- |
182
+ | asChild | `boolean` | `false` | Si es true, renderiza el hijo directo en lugar de un button |
183
+ | className | `string` | - | Clases adicionales |
184
+ | ...props | `ComponentProps<"button">` | - | Props nativas de button |
185
+
186
+ ## Características Principales
187
+
188
+ - **Responsive automático**: Desktop muestra sidebar fijo, mobile usa Sheet con hamburger
189
+ - **Auto-manejo del height**: Previene layout shifts al calcular altura automáticamente
190
+ - **Breakpoint xl (1280px)**: Usa `useMediaQuery` para detectar el cambio
191
+ - **Portal rendering**: Usa Radix Portal para z-index correcto
192
+ - **Sheet integration**: Integración nativa con componente Sheet para mobile
193
+ - **Accesibilidad**: Incluye VisuallyHidden para screen readers
194
+ - **Sticky positioning**: Sidebar fijo en desktop con scroll independiente del contenido
195
+
196
+ ## Ejemplo Completo
197
+
198
+ ```tsx
199
+ import {
200
+ Sidebar,
201
+ SidebarContent,
202
+ SidebarFooter,
203
+ SidebarHeader,
204
+ SidebarInset,
205
+ SidebarMenu,
206
+ SidebarMenuItem,
207
+ SidebarTopBar,
208
+ SidebarTrigger,
209
+ } from "@adamosuiteservices/ui/sidebar";
210
+ import {
211
+ CircleUserRoundIcon,
212
+ HomeIcon,
213
+ SettingsIcon,
214
+ FolderIcon,
215
+ } from "lucide-react";
216
+
217
+ export default function AppLayout() {
218
+ return (
219
+ <Sidebar>
220
+ <SidebarContent>
221
+ <SidebarHeader className="adm:items-center">
222
+ <Logo />
223
+ </SidebarHeader>
224
+
225
+ <SidebarMenu>
226
+ <SidebarMenuItem>
227
+ <HomeIcon /> Dashboard
228
+ </SidebarMenuItem>
229
+ <SidebarMenuItem>
230
+ <FolderIcon /> Projects
231
+ </SidebarMenuItem>
232
+ <SidebarMenuItem>
233
+ <SettingsIcon /> Settings
234
+ </SidebarMenuItem>
235
+ </SidebarMenu>
236
+
237
+ <SidebarFooter>
238
+ <SidebarMenuItem>
239
+ <CircleUserRoundIcon /> Profile
240
+ </SidebarMenuItem>
241
+ </SidebarFooter>
242
+ </SidebarContent>
243
+
244
+ <SidebarInset>
245
+ <SidebarTopBar>
246
+ <h1 className="adm:text-lg adm:font-semibold">Dashboard</h1>
247
+ <SidebarTrigger />
248
+ </SidebarTopBar>
249
+ <main className="adm:p-6">{/* Tu contenido aquí */}</main>
250
+ </SidebarInset>
251
+ </Sidebar>
252
+ );
253
+ }
254
+ ```
255
+
256
+ ## Hook Personalizado
257
+
258
+ ### useSidebarContext()
259
+
260
+ Hook para acceder al contexto del Sidebar desde componentes hijos.
261
+
262
+ ```tsx
263
+ import { useSidebarContext } from "@adamosuiteservices/ui/sidebar";
264
+
265
+ function CustomSidebarComponent() {
266
+ const { isXl, sidebarHeight, sheetOpen, setSheetOpen } = useSidebarContext();
267
+
268
+ return (
269
+ <div>
270
+ {isXl ? "Desktop" : "Mobile"}
271
+ <span>Height: {sidebarHeight}</span>
272
+ <button onClick={() => setSheetOpen(!sheetOpen)}>Toggle Sidebar</button>
273
+ </div>
274
+ );
275
+ }
276
+ ```
277
+
278
+ **Retorna**:
279
+ | Propiedad | Tipo | Descripción |
280
+ |-----------|------|-------------|
281
+ | isXl | `boolean` | True si el viewport es >= 1280px |
282
+ | sidebarHeight | `string` | Altura calculada del sidebar ("auto" en desktop, px en mobile) |
283
+ | setSidebarHeight | `Dispatch<SetStateAction<string>>` | Setter para actualizar la altura |
284
+ | sheetOpen | `boolean` | Estado del Sheet en mobile (abierto/cerrado) |
285
+ | setSheetOpen | `Dispatch<SetStateAction<boolean>>` | Setter para controlar el estado del Sheet |
286
+
287
+ **Nota**: Este hook debe usarse dentro de un componente que sea hijo de `<Sidebar>`.
288
+
289
+ ## Ejemplos Adicionales
290
+
291
+ ### Items Básicos con Iconos
292
+
293
+ El ejemplo principal muestra el uso más simple - items como buttons con iconos:
294
+
295
+ ```tsx
296
+ <SidebarMenu>
297
+ <SidebarMenuItem>
298
+ <HomeIcon /> Dashboard
299
+ </SidebarMenuItem>
300
+ <SidebarMenuItem>
301
+ <FolderIcon /> Projects
302
+ </SidebarMenuItem>
303
+ <SidebarMenuItem>
304
+ <SettingsIcon /> Settings
305
+ </SidebarMenuItem>
306
+ </SidebarMenu>
307
+ ```
308
+
309
+ ### Con React Router (usando asChild)
310
+
311
+ ```tsx
312
+ import { Link } from "react-router-dom";
313
+
314
+ <SidebarMenu>
315
+ <SidebarMenuItem asChild>
316
+ <Link to="/dashboard">
317
+ <HomeIcon /> Dashboard
318
+ </Link>
319
+ </SidebarMenuItem>
320
+ <SidebarMenuItem asChild>
321
+ <Link to="/settings">
322
+ <SettingsIcon /> Settings
323
+ </Link>
324
+ </SidebarMenuItem>
325
+ </SidebarMenu>;
326
+ ```
327
+
328
+ ### Con Next.js (usando asChild)
329
+
330
+ ```tsx
331
+ import Link from "next/link";
332
+
333
+ <SidebarMenu>
334
+ <SidebarMenuItem asChild>
335
+ <Link href="/dashboard">
336
+ <HomeIcon /> Dashboard
337
+ </Link>
338
+ </SidebarMenuItem>
339
+ </SidebarMenu>;
340
+ ```
341
+
342
+ ### Estados Activos
343
+
344
+ ```tsx
345
+ const pathname = usePathname(); // Next.js o similar
346
+
347
+ <SidebarMenu>
348
+ <SidebarMenuItem
349
+ className={pathname === "/dashboard" ? "adm:bg-white/20" : ""}
350
+ >
351
+ <HomeIcon /> Dashboard
352
+ </SidebarMenuItem>
353
+ <SidebarMenuItem
354
+ className={pathname === "/settings" ? "adm:bg-white/20" : ""}
355
+ >
356
+ <SettingsIcon /> Settings
357
+ </SidebarMenuItem>
358
+ </SidebarMenu>;
359
+ ```
360
+
361
+ ### Personalización de Colores
362
+
363
+ El sidebar usa variables CSS de tema. Puedes personalizarlas:
364
+
365
+ ```css
366
+ :root {
367
+ --sidebar-primary: 220 13% 18%;
368
+ --sidebar-primary-foreground: 210 20% 98%;
369
+ }
370
+ ```
371
+
372
+ ## Notas de Implementación
373
+
374
+ - El componente usa internamente las clases con prefijo `adm:` para evitar conflictos de estilos
375
+ - `SidebarContent` usa Portal de Radix para renderizar en el top level del DOM
376
+ - El cambio responsive ocurre automáticamente en el breakpoint xl (1280px)
377
+ - En mobile, el Sheet se abre desde la izquierda
378
+ - `SidebarMenuItem` tiene hover effects y padding predefinidos
379
+ - `SidebarMenu` incluye scroll automático si el contenido excede la altura
380
+ - Los componentes usan `data-slot` attributes para debugging y testing:
381
+ - `sidebar` - Contenedor root
382
+ - `sidebar-content` - Contenido principal del sidebar
383
+ - `sidebar-trigger` - Botón hamburguesa para mobile
384
+ - `sidebar-inset` - Contenedor del contenido principal
385
+ - `sidebar-top-bar` - Barra superior (si se usa)
386
+ - `sidebar-header` - Header del sidebar
387
+ - `sidebar-footer` - Footer del sidebar
388
+ - `sidebar-menu` - Contenedor de items del menú
389
+ - `sidebar-menu-item` - Item individual del menú
390
+
391
+ ## Accesibilidad
392
+
393
+ - ✅ El Sheet en mobile incluye SheetTitle y SheetDescription (ocultos visualmente)
394
+ - ✅ Navegación por teclado soportada en todos los items
395
+ - ✅ Focus visible en items del menú
396
+ - ✅ Semántica HTML correcta (nav, header, footer)
397
+ - ✅ ARIA labels automáticos en el Sheet trigger
398
+
399
+ ## Referencias
400
+
401
+ - Similar a shadcn/ui Sidebar pattern
402
+ - Usa Radix UI Portal para rendering
403
+ - Usa Radix UI Sheet para modal mobile
404
+ - Implementa useMediaQuery de @uidotdev/usehooks