siesa-ui-kit 1.0.2 → 1.0.4

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 (189) hide show
  1. package/README.md +115 -115
  2. package/bin/install.cjs +502 -502
  3. package/bin/prepare-publish.cjs +28 -28
  4. package/bin/restore-folders.cjs +28 -28
  5. package/claude/agents/siesa-ui-kit-specialist.md +2445 -0
  6. package/claude/prompts/component-template.md +121 -0
  7. package/claude/prompts/siesa-ui-kit.md +28 -0
  8. package/claude/settings.local.json +67 -2
  9. package/dist/components/Button/icons.d.ts +6 -5
  10. package/dist/components/Button/icons.d.ts.map +1 -1
  11. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -1
  12. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +21 -0
  13. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -1
  14. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts +122 -0
  15. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.d.ts.map +1 -0
  16. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts +139 -0
  17. package/dist/components/NavigationRailCommercial/NavigationRailCommercial.types.d.ts.map +1 -0
  18. package/dist/components/NavigationRailCommercial/icons.d.ts +33 -0
  19. package/dist/components/NavigationRailCommercial/icons.d.ts.map +1 -0
  20. package/dist/components/NavigationRailCommercial/index.d.ts +4 -0
  21. package/dist/components/NavigationRailCommercial/index.d.ts.map +1 -0
  22. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -1
  23. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +7 -0
  24. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -1
  25. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -1
  26. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +41 -0
  27. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -1
  28. package/dist/components/NavigationRailTypes/icons.d.ts +15 -29
  29. package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -1
  30. package/dist/components/Select/Select.d.ts.map +1 -1
  31. package/dist/components/Select/icons.d.ts +6 -2
  32. package/dist/components/Select/icons.d.ts.map +1 -1
  33. package/dist/index.d.ts +32 -0
  34. package/dist/index.d.ts.map +1 -1
  35. package/dist/siesa-ui-kit.cjs +404 -190
  36. package/dist/siesa-ui-kit.cjs.map +1 -1
  37. package/dist/siesa-ui-kit.mjs +6590 -1506
  38. package/dist/siesa-ui-kit.mjs.map +1 -1
  39. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts +48 -0
  40. package/dist/views/LayoutCommercial/LayoutCommercial.d.ts.map +1 -0
  41. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts +49 -0
  42. package/dist/views/LayoutCommercial/LayoutCommercial.types.d.ts.map +1 -0
  43. package/dist/views/LayoutCommercial/index.d.ts +3 -0
  44. package/dist/views/LayoutCommercial/index.d.ts.map +1 -0
  45. package/docs/icons.md +12 -31
  46. package/package.json +111 -110
  47. package/src/components/Avatar/Avatar.stories.tsx +494 -494
  48. package/src/components/Button/Button.stories.tsx +950 -950
  49. package/src/components/Button/Button.tsx +337 -337
  50. package/src/components/Button/Button.types.ts +180 -180
  51. package/src/components/Button/icons.tsx +23 -62
  52. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -250
  53. package/src/components/Divider/Divider.stories.tsx +263 -263
  54. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -317
  55. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -287
  56. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -111
  57. package/src/components/DropdownItemCollapsible/README.md +264 -264
  58. package/src/components/DropdownItemCollapsible/icons.tsx +57 -57
  59. package/src/components/DropdownItemCollapsible/index.ts +12 -12
  60. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -386
  61. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -216
  62. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -93
  63. package/src/components/DropdownItemHeading/README.md +573 -573
  64. package/src/components/DropdownItemHeading/icons.tsx +125 -125
  65. package/src/components/DropdownItemHeading/index.ts +3 -3
  66. package/src/components/Input/Input.stories.tsx +583 -583
  67. package/src/components/LoginView/LoginView.stories.tsx +148 -148
  68. package/src/components/LoginView/LoginView.tsx +426 -426
  69. package/src/components/LoginView/LoginView.types.ts +52 -52
  70. package/src/components/LoginView/README.md +396 -396
  71. package/src/components/LoginView/icons.tsx +85 -85
  72. package/src/components/LoginView/index.ts +3 -3
  73. package/src/components/Navbar/Navbar.stories.tsx +810 -810
  74. package/src/components/Navbar/Navbar.tsx +755 -755
  75. package/src/components/Navbar/Navbar.types.ts +219 -219
  76. package/src/components/Navbar/README.md +279 -279
  77. package/src/components/Navbar/index.ts +8 -8
  78. package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
  79. package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
  80. package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
  81. package/src/components/NavigationRailCommercial/README.md +251 -0
  82. package/src/components/NavigationRailCommercial/icons.tsx +54 -0
  83. package/src/components/NavigationRailCommercial/index.ts +6 -0
  84. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -667
  85. package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -313
  86. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -167
  87. package/src/components/NavigationRailItem/README.md +476 -476
  88. package/src/components/NavigationRailItem/index.ts +2 -2
  89. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -462
  90. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -332
  91. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -178
  92. package/src/components/NavigationRailPanel/README.md +461 -461
  93. package/src/components/NavigationRailPanel/index.ts +6 -6
  94. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -528
  95. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -378
  96. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -130
  97. package/src/components/NavigationRailTypes/README.md +573 -573
  98. package/src/components/NavigationRailTypes/icons.tsx +76 -141
  99. package/src/components/NavigationRailTypes/index.ts +7 -7
  100. package/src/components/Notification/Notification.stories.tsx +513 -513
  101. package/src/components/Notification/Notification.tsx +145 -145
  102. package/src/components/Notification/Notification.types.ts +142 -142
  103. package/src/components/Notification/README.md +409 -409
  104. package/src/components/POSConvention/POSConvention.stories.tsx +235 -235
  105. package/src/components/POSConvention/POSConvention.tsx +129 -129
  106. package/src/components/POSConvention/POSConvention.types.ts +38 -38
  107. package/src/components/POSConvention/README.md +123 -123
  108. package/src/components/POSConvention/icons.tsx +45 -45
  109. package/src/components/POSConvention/index.ts +3 -3
  110. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -531
  111. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -247
  112. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -87
  113. package/src/components/POSLocationButton/README.md +253 -253
  114. package/src/components/POSLocationButton/icons.tsx +120 -120
  115. package/src/components/POSLocationButton/index.ts +14 -14
  116. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -415
  117. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -179
  118. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -51
  119. package/src/components/POSNumberButton/README.md +321 -321
  120. package/src/components/POSNumberButton/index.ts +3 -3
  121. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -318
  122. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -642
  123. package/src/components/POSProductCard/POSProductCard.tsx +208 -208
  124. package/src/components/POSProductCard/POSProductCard.types.ts +76 -76
  125. package/src/components/POSProductCard/README.md +179 -179
  126. package/src/components/POSProductCard/icons.tsx +26 -26
  127. package/src/components/POSProductCard/index.ts +2 -2
  128. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -753
  129. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -332
  130. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -119
  131. package/src/components/POSProductSidebarItems/README.md +198 -198
  132. package/src/components/POSProductSidebarItems/icons.tsx +21 -21
  133. package/src/components/POSProductSidebarItems/index.ts +3 -3
  134. package/src/components/POSTable/POSTable.stories.tsx +737 -737
  135. package/src/components/POSTable/POSTable.tsx +401 -401
  136. package/src/components/POSTable/README.md +286 -286
  137. package/src/components/Quantity/Quantity.stories.tsx +457 -457
  138. package/src/components/Radio/Radio.stories.tsx +523 -523
  139. package/src/components/Radio/Radio.tsx +1 -1
  140. package/src/components/Select/Select.stories.tsx +32 -0
  141. package/src/components/Select/Select.tsx +457 -454
  142. package/src/components/Select/icons.tsx +16 -41
  143. package/src/components/SignUpView/SignUpView.stories.tsx +129 -129
  144. package/src/components/SignUpView/SignUpView.tsx +503 -503
  145. package/src/components/SignUpView/SignUpView.types.ts +58 -58
  146. package/src/components/SignUpView/icons.tsx +71 -71
  147. package/src/components/SignUpView/index.ts +3 -3
  148. package/src/components/Switch/README.md +112 -112
  149. package/src/components/Switch/Switch.stories.tsx +550 -550
  150. package/src/components/Switch/Switch.tsx +246 -246
  151. package/src/components/Switch/Switch.types.ts +67 -67
  152. package/src/components/Table/Table.stories.tsx +805 -805
  153. package/src/components/Tabs/README.md +201 -201
  154. package/src/components/Tabs/Tabs.stories.tsx +580 -580
  155. package/src/components/Tabs/Tabs.tsx +356 -356
  156. package/src/components/Tabs/Tabs.types.ts +127 -127
  157. package/src/components/Tabs/icons.tsx +129 -129
  158. package/src/components/Tabs/index.ts +11 -11
  159. package/src/components/Textarea/Textarea.stories.tsx +535 -535
  160. package/src/index.ts +133 -102
  161. package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
  162. package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
  163. package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
  164. package/src/views/LayoutCommercial/README.md +286 -0
  165. package/src/views/LayoutCommercial/index.ts +2 -0
  166. package/src/views/ListView/ListView.stories.tsx +329 -329
  167. package/src/views/ListView/ListView.tsx +570 -570
  168. package/src/views/ListView/ListView.types.ts +211 -211
  169. package/src/views/ListView/icons.tsx +282 -282
  170. package/src/views/ListView/index.ts +11 -11
  171. package/src/views/LoginView/LoginView.tsx +426 -426
  172. package/src/views/ProductsView/ProductsView.stories.tsx +344 -344
  173. package/src/views/ProductsView/ProductsView.tsx +480 -480
  174. package/src/views/ProductsView/ProductsView.types.ts +238 -238
  175. package/src/views/ProductsView/README.md +312 -312
  176. package/src/views/ProductsView/icons.tsx +38 -38
  177. package/src/views/ProductsView/index.ts +8 -8
  178. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -376
  179. package/src/views/SignUpView/SignUpView.tsx +503 -503
  180. package/src/views/TableLayoutView/README.md +268 -268
  181. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -235
  182. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -461
  183. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -209
  184. package/src/views/TableLayoutView/icons.tsx +113 -113
  185. package/src/views/TableLayoutView/index.ts +6 -6
  186. package/storybook/main.ts +19 -19
  187. package/storybook/preview.tsx +84 -84
  188. package/storybook/vitest.setup.ts +6 -6
  189. package/tailwind.config.js +128 -128
@@ -1,573 +1,573 @@
1
- # NavigationRailTypes
2
-
3
- Barra de navegación lateral del sistema de diseño Siesa que permite dos modos visuales distintos: **collapsed** (solo iconos) y **expanded** (con labels y búsqueda).
4
-
5
- ## 📋 Tabla de Contenidos
6
-
7
- 1. [Descripción](#descripción)
8
- 2. [Características](#características)
9
- 3. [Especificaciones de Diseño](#especificaciones-de-diseño)
10
- 4. [Uso](#uso)
11
- 5. [Props](#props)
12
- 6. [Estados](#estados)
13
- 7. [Ejemplos](#ejemplos)
14
- 8. [Accesibilidad](#accesibilidad)
15
- 9. [Dark Mode](#dark-mode)
16
- 10. [Referencias](#referencias)
17
-
18
- ---
19
-
20
- ## Descripción
21
-
22
- El componente **NavigationRailTypes** es una barra de navegación lateral responsive que proporciona navegación vertical en aplicaciones de escritorio. Soporta dos modos de visualización que se pueden cambiar dinámicamente mediante el botón de collapse/expand.
23
-
24
- ### Caso de Uso Principal
25
-
26
- - **Navegación principal en aplicaciones desktop**: Menú lateral principal
27
- - **Aplicaciones con múltiples módulos**: Agrupar opciones de navegación
28
- - **Dashboard y sistemas administrativos**: Acceso rápido a secciones
29
- - **Aplicaciones de desktop**: Similar a sidebars en VS Code, Figma, etc.
30
-
31
- ---
32
-
33
- ## Características
34
-
35
- ✅ **Dos modos de visualización:**
36
- - **Collapsed**: 80px width, solo iconos
37
- - **Expanded**: 215px width, con labels y búsqueda integrada
38
-
39
- ✅ **Items de navegación:**
40
- - Iconos personalizables (16x16px)
41
- - Labels descriptivos (solo en expanded)
42
- - Estados: default, hover, active, disabled
43
- - Badges de notificación (dot rojo o contador)
44
-
45
- ✅ **Búsqueda integrada:**
46
- - Solo visible en modo expanded
47
- - Input con icono de búsqueda
48
- - Placeholder "Buscar módulo"
49
-
50
- ✅ **Footer con acciones:**
51
- - Botón "Recientes" (clock icon)
52
- - Botón collapse/expand con animación
53
- - Divisores visuales
54
-
55
- ✅ **Dark Mode:**
56
- - Soporte completo para light/dark
57
- - Colores adaptados automáticamente
58
-
59
- ✅ **Accesibilidad:**
60
- - Focus rings adaptativos
61
- - ARIA labels en botones
62
- - Navegación por teclado
63
-
64
- ✅ **Animaciones:**
65
- - Transición suave al collapse/expand
66
- - Hover effects en items
67
- - Rotación del chevron
68
-
69
- ---
70
-
71
- ## Especificaciones de Diseño
72
-
73
- ### Dimensiones
74
-
75
- | Propiedad | Collapsed | Expanded |
76
- |-----------|-----------|----------|
77
- | **Width** | 80px | 215px |
78
- | **Height** | 900px | 900px |
79
- | **Item Height** | Automático | Automático |
80
- | **Border Radius** | N/A | 8px (items) |
81
-
82
- ### Espaciado (Spacing)
83
-
84
- | Elemento | Padding | Margin | Gap |
85
- |----------|---------|--------|-----|
86
- | **Item** (collapsed) | `px-4 py-1` | N/A | `gap-3` |
87
- | **Item** (expanded) | `px-4 py-2` | N/A | `gap-3` |
88
- | **Search** (expanded) | `px-3 py-3` | N/A | `gap-2` |
89
- | **Footer** | `px-3` | N/A | `gap-3` |
90
-
91
- ### Tipografía
92
-
93
- | Elemento | Familia | Tamaño | Peso | Line Height |
94
- |----------|---------|--------|------|-------------|
95
- | **Label Item** | SiesaBT | 14px | Regular | 20px |
96
- | **Button Label** | SiesaBT | 14px | Bold | 20px |
97
- | **Placeholder** | Inter | 14px | Regular | 20px |
98
-
99
- ### Colores (Light Mode)
100
-
101
- | Elemento | Color | Hex |
102
- |----------|-------|-----|
103
- | **Background** | background-primary | #ffffff |
104
- | **Border** | border-primary | #e4e4e7 |
105
- | **Text** | content-primary | #18181b |
106
- | **Icon** | content-secondary | #a1a1aa |
107
- | **Icon Hover** | content-custom-primary | #0e79fd |
108
- | **Active Bg** | background-custom-primary | #dbeefe |
109
-
110
- ### Colores (Dark Mode)
111
-
112
- | Elemento | Color | Hex |
113
- |----------|-------|-----|
114
- | **Background** | background-primary/dark | #09090b |
115
- | **Border** | border-primary/dark | #3f3f46 |
116
- | **Text** | content-primary/dark | #fafafa |
117
- | **Icon** | content-secondary/dark | #a1a1aa |
118
- | **Icon Hover** | content-custom-primary/dark | #bfe2fe |
119
- | **Active Bg** | background-custom-primary/dark | #0e5ab0 |
120
-
121
- ### Sombras
122
-
123
- | Elemento | Sombra |
124
- |----------|--------|
125
- | **Search Button** | `shadow-button-inset` |
126
- | **Search Input** | `shadow-sm` |
127
- | **Items** | Ninguna |
128
-
129
- ---
130
-
131
- ## Uso
132
-
133
- ### Importación
134
-
135
- ```tsx
136
- import { NavigationRailTypes } from '@/components/NavigationRailTypes';
137
- import type { NavigationRailItem } from '@/components/NavigationRailTypes';
138
- ```
139
-
140
- ### Instalación de Dependencias
141
-
142
- Este componente reutiliza:
143
- - `Button` - Botones en footer
144
- - `Input` - Input de búsqueda (input nativo mejorado)
145
- - `Divider` - Líneas divisoras
146
- - `DropdownItemCollapsible` - Items en modo expandido
147
-
148
- Asegúrate de tener estos componentes instalados.
149
-
150
- ---
151
-
152
- ## Props
153
-
154
- ### NavigationRailTypesProps
155
-
156
- ```typescript
157
- interface NavigationRailTypesProps {
158
- /**
159
- * Si el rail está colapsado (iconos solo) o expandido
160
- * @default true
161
- */
162
- collapsed?: boolean;
163
-
164
- /**
165
- * Items de navegación a mostrar
166
- * @default []
167
- */
168
- items?: NavigationRailItem[];
169
-
170
- /**
171
- * Si mostrar el botón "Recientes" en footer
172
- * @default true
173
- */
174
- showRecentButton?: boolean;
175
-
176
- /**
177
- * Callback cuando collapsed cambia
178
- */
179
- onCollapsedChange?: (collapsed: boolean) => void;
180
-
181
- /**
182
- * Callback cuando se clickea un item
183
- */
184
- onItemClick?: (index: number, item: NavigationRailItem) => void;
185
-
186
- /**
187
- * Classes CSS adicionales
188
- */
189
- className?: string;
190
- }
191
- ```
192
-
193
- ### NavigationRailItem
194
-
195
- ```typescript
196
- interface NavigationRailItem {
197
- /**
198
- * Identificador único
199
- */
200
- id: string;
201
-
202
- /**
203
- * Etiqueta del item
204
- */
205
- label: string;
206
-
207
- /**
208
- * Icono (16x16px recomendado)
209
- */
210
- icon: ReactNode;
211
-
212
- /**
213
- * Si está activo
214
- * @default false
215
- */
216
- active?: boolean;
217
-
218
- /**
219
- * Si está deshabilitado
220
- * @default false
221
- */
222
- disabled?: boolean;
223
-
224
- /**
225
- * Callback onClick
226
- */
227
- onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
228
-
229
- /**
230
- * URL para navegación
231
- */
232
- href?: string;
233
-
234
- /**
235
- * ARIA label para accesibilidad
236
- */
237
- ariaLabel?: string;
238
-
239
- /**
240
- * Badge de notificación (dot)
241
- */
242
- badge?: boolean;
243
-
244
- /**
245
- * Contador de notificaciones (99+ para >99)
246
- */
247
- badgeCount?: number;
248
-
249
- /**
250
- * Color del badge
251
- * @default 'red'
252
- */
253
- badgeColor?: 'red' | 'blue' | 'green' | 'yellow' | 'orange';
254
- }
255
- ```
256
-
257
- ---
258
-
259
- ## Estados
260
-
261
- ### Estado Default (No Interactuado)
262
-
263
- ```
264
- Collapsed:
265
- - Icon color: content-secondary (#a1a1aa)
266
- - Opacity: 100%
267
- - Cursor: pointer
268
-
269
- Expanded:
270
- - Text color: content-primary (#18181b)
271
- - Icon color: content-secondary (#a1a1aa)
272
- - Background: transparent
273
- - Opacity: 100%
274
- ```
275
-
276
- ### Estado Hover
277
-
278
- ```
279
- Collapsed:
280
- - Icon color: content-custom-primary (#0e79fd)
281
- - Opacity: 80%
282
- - Scale: 1.05
283
-
284
- Expanded:
285
- - Background: background-custom-primary (#dbeefe)
286
- - Text color: content-custom-primary (#0e79fd)
287
- - Icon color: content-custom-primary (#0e79fd)
288
- ```
289
-
290
- ### Estado Active
291
-
292
- ```
293
- Collapsed:
294
- - Icon color: content-custom-primary (#0e79fd)
295
- - Background: Subtle overlay
296
-
297
- Expanded:
298
- - Background: background-custom-primary (#dbeefe)
299
- - Text color: content-custom-primary (#0e79fd)
300
- - Icon color: content-custom-primary (#0e79fd)
301
- ```
302
-
303
- ### Estado Disabled
304
-
305
- ```
306
- Collapsed & Expanded:
307
- - Opacity: 50%
308
- - Cursor: not-allowed
309
- - Pointer events: none
310
- ```
311
-
312
- ### Estado Focus
313
-
314
- ```
315
- Collapsed & Expanded:
316
- - Ring: 4px solid primary-custom-400 (#60b6fa)
317
- - Ring offset: 2px background-primary (#ffffff)
318
- - Outline: none
319
- ```
320
-
321
- ---
322
-
323
- ## Ejemplos
324
-
325
- ### Ejemplo Básico
326
-
327
- ```tsx
328
- import { NavigationRailTypes } from '@/components/NavigationRailTypes';
329
- import { HomeIcon, UsersIcon, SettingsIcon } from '@heroicons/react/outline';
330
-
331
- export function AppLayout() {
332
- const [collapsed, setCollapsed] = useState(true);
333
-
334
- const navItems = [
335
- {
336
- id: 'home',
337
- label: 'Home',
338
- icon: <HomeIcon className="size-4" />,
339
- active: true,
340
- },
341
- {
342
- id: 'users',
343
- label: 'Users',
344
- icon: <UsersIcon className="size-4" />,
345
- },
346
- {
347
- id: 'settings',
348
- label: 'Settings',
349
- icon: <SettingsIcon className="size-4" />,
350
- },
351
- ];
352
-
353
- return (
354
- <div className="flex h-screen">
355
- <NavigationRailTypes
356
- collapsed={collapsed}
357
- items={navItems}
358
- onCollapsedChange={setCollapsed}
359
- onItemClick={(index, item) => {
360
- console.log('Navigated to:', item.id);
361
- }}
362
- />
363
- <main className="flex-1 overflow-auto">
364
- {/* Contenido principal */}
365
- </main>
366
- </div>
367
- );
368
- }
369
- ```
370
-
371
- ### Con Badges de Notificación
372
-
373
- ```tsx
374
- const navItems = [
375
- {
376
- id: 'messages',
377
- label: 'Messages',
378
- icon: <MessageIcon className="size-4" />,
379
- badge: true, // Dot rojo simple
380
- },
381
- {
382
- id: 'notifications',
383
- label: 'Notifications',
384
- icon: <BellIcon className="size-4" />,
385
- badgeCount: 12, // Contador numérico
386
- badgeColor: 'blue',
387
- },
388
- ];
389
- ```
390
-
391
- ### Con Items Deshabilitados
392
-
393
- ```tsx
394
- const navItems = [
395
- {
396
- id: 'premium',
397
- label: 'Premium Features',
398
- icon: <StarIcon className="size-4" />,
399
- disabled: true, // No clickeable
400
- },
401
- ];
402
- ```
403
-
404
- ### Con Navegación Router
405
-
406
- ```tsx
407
- import { useNavigate } from 'react-router-dom';
408
-
409
- export function Navigation() {
410
- const navigate = useNavigate();
411
-
412
- const navItems = [
413
- {
414
- id: 'dashboard',
415
- label: 'Dashboard',
416
- icon: <DashboardIcon className="size-4" />,
417
- onClick: () => navigate('/dashboard'),
418
- },
419
- {
420
- id: 'users',
421
- label: 'Manage Users',
422
- icon: <UsersIcon className="size-4" />,
423
- onClick: () => navigate('/users'),
424
- },
425
- ];
426
-
427
- return (
428
- <NavigationRailTypes
429
- items={navItems}
430
- onItemClick={(_, item) => item.onClick?.({} as any)}
431
- />
432
- );
433
- }
434
- ```
435
-
436
- ---
437
-
438
- ## Accesibilidad
439
-
440
- ### Features de Accesibilidad
441
-
442
- ✅ **Focus Management:**
443
- - Focus rings visibles (4px) en todos los items
444
- - Focus visible en botones collapse/expand
445
- - Orden tab lógico de arriba a abajo
446
-
447
- ✅ **ARIA Attributes:**
448
- - `aria-label` en botones sin texto visible (iconOnly)
449
- - `role="button"` implícito en elementos clickeables
450
- - `disabled` attribute para items deshabilitados
451
-
452
- ✅ **Navegación por Teclado:**
453
- - Tab/Shift+Tab para moverse entre items
454
- - Enter/Space para activar items
455
- - Escape para cerrar (si es popover)
456
-
457
- ✅ **Colores y Contraste:**
458
- - Ratio de contraste WCAG AA/AAA
459
- - No depender solo del color para indicar estado
460
- - Iconos con fallback a text
461
-
462
- ✅ **Semántica:**
463
- - Botones semánticos (`<button>`)
464
- - Labels asociados a inputs
465
- - Estructura lógica del DOM
466
-
467
- ---
468
-
469
- ## Dark Mode
470
-
471
- El componente soporta dark mode automáticamente. Los colores se invierten cuando se activa:
472
-
473
- ```tsx
474
- <div className="dark">
475
- <NavigationRailTypes {...props} />
476
- </div>
477
- ```
478
-
479
- ### Colores en Dark Mode
480
-
481
- | Light | Dark |
482
- |-------|------|
483
- | `#ffffff` bg | `#09090b` bg |
484
- | `#18181b` text | `#fafafa` text |
485
- | `#a1a1aa` icon | `#a1a1aa` icon |
486
- | `#0e79fd` primary | `#bfe2fe` primary |
487
- | `#e4e4e7` border | `#3f3f46` border |
488
-
489
- ### Utilidades CSS para Dark Mode
490
-
491
- El componente usa clases de dark mode nativas de Tailwind:
492
-
493
- ```tsx
494
- // Ejemplos en el código
495
- className="dark:bg-background-primary"
496
- className="dark:text-content-primary"
497
- className="dark:border-border-primary"
498
- ```
499
-
500
- ---
501
-
502
- ## Referencias
503
-
504
- - **Figma Design**: [NavigationRailTypes Node 6135-36219](https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-36219&m=dev)
505
- - **Sistema de Colores**: `docs/colors.md`
506
- - **Sistema de Tipografía**: `docs/typography.md`
507
- - **Sistema de Spacing**: `docs/spacing.md`
508
- - **Sistema de Sombras**: `docs/shadows.md`
509
- - **Componente Button**: `src/components/Button`
510
- - **Componente DropdownItemCollapsible**: `src/components/DropdownItemCollapsible`
511
- - **Componente Input**: `src/components/Input`
512
- - **Componente Divider**: `src/components/Divider`
513
-
514
- ---
515
-
516
- ## Historial de Cambios
517
-
518
- ### v1.0.0 (Inicial)
519
-
520
- - ✨ Componente NavigationRailTypes creado
521
- - ✨ Soporte para modo collapsed/expanded
522
- - ✨ Badges de notificación
523
- - ✨ Búsqueda integrada
524
- - ✨ Dark mode completo
525
- - ✨ Historias de Storybook
526
- - ✨ Documentación completa
527
-
528
- ---
529
-
530
- ## Notas de Implementación
531
-
532
- ### Reutilización de Componentes
533
-
534
- Este componente reutiliza:
535
-
536
- 1. **Button** - Para los botones en footer
537
- 2. **Divider** - Para separadores visuales
538
- 3. **DropdownItemCollapsible** - Para items en modo expandido
539
- 4. **Input** - Mejorado con input nativo para búsqueda
540
-
541
- ### Consideraciones de Performance
542
-
543
- - Los items se renderizan conmigo un array `map()`
544
- - No hay virtualization aún (500px altura para algunos browsers)
545
- - Para 100+ items, considerar virtualización
546
-
547
- ### Compatibilidad
548
-
549
- - React 18+
550
- - Tailwind CSS 3+
551
- - Navegadores modernos (Chrome, Firefox, Safari, Edge)
552
-
553
- ---
554
-
555
- ## FAQ
556
-
557
- **P: ¿Puedo personalizar el ancho del rail?**
558
- R: Actualmente, el ancho está fijo (80px collapsed, 215px expanded). Para personalizar, modifica las clases `w-[80px]` y `w-[215px]` en el componente.
559
-
560
- **P: ¿Cómo integro con React Router?**
561
- R: Usa el callback `onItemClick` para navegar:
562
- ```tsx
563
- onItemClick={(_, item) => navigate(`/${item.id}`)}
564
- ```
565
-
566
- **P: ¿Puedo agregar más iconos?**
567
- R: Sí, pasa cualquier ReactNode como prop `icon` en los items.
568
-
569
- **P: ¿El rail es responsive para mobile?**
570
- R: No actualmente. Para mobile, considera un dropdown o hamburger menu.
571
-
572
- **P: ¿Puedo cambiar los colores?**
573
- R: Sí, todos los colores usan tokens CSS del sistema. Modifica las clases Tailwind para personalizar.
1
+ # NavigationRailTypes
2
+
3
+ Barra de navegación lateral del sistema de diseño Siesa que permite dos modos visuales distintos: **collapsed** (solo iconos) y **expanded** (con labels y búsqueda).
4
+
5
+ ## 📋 Tabla de Contenidos
6
+
7
+ 1. [Descripción](#descripción)
8
+ 2. [Características](#características)
9
+ 3. [Especificaciones de Diseño](#especificaciones-de-diseño)
10
+ 4. [Uso](#uso)
11
+ 5. [Props](#props)
12
+ 6. [Estados](#estados)
13
+ 7. [Ejemplos](#ejemplos)
14
+ 8. [Accesibilidad](#accesibilidad)
15
+ 9. [Dark Mode](#dark-mode)
16
+ 10. [Referencias](#referencias)
17
+
18
+ ---
19
+
20
+ ## Descripción
21
+
22
+ El componente **NavigationRailTypes** es una barra de navegación lateral responsive que proporciona navegación vertical en aplicaciones de escritorio. Soporta dos modos de visualización que se pueden cambiar dinámicamente mediante el botón de collapse/expand.
23
+
24
+ ### Caso de Uso Principal
25
+
26
+ - **Navegación principal en aplicaciones desktop**: Menú lateral principal
27
+ - **Aplicaciones con múltiples módulos**: Agrupar opciones de navegación
28
+ - **Dashboard y sistemas administrativos**: Acceso rápido a secciones
29
+ - **Aplicaciones de desktop**: Similar a sidebars en VS Code, Figma, etc.
30
+
31
+ ---
32
+
33
+ ## Características
34
+
35
+ ✅ **Dos modos de visualización:**
36
+ - **Collapsed**: 80px width, solo iconos
37
+ - **Expanded**: 215px width, con labels y búsqueda integrada
38
+
39
+ ✅ **Items de navegación:**
40
+ - Iconos personalizables (16x16px)
41
+ - Labels descriptivos (solo en expanded)
42
+ - Estados: default, hover, active, disabled
43
+ - Badges de notificación (dot rojo o contador)
44
+
45
+ ✅ **Búsqueda integrada:**
46
+ - Solo visible en modo expanded
47
+ - Input con icono de búsqueda
48
+ - Placeholder "Buscar módulo"
49
+
50
+ ✅ **Footer con acciones:**
51
+ - Botón "Recientes" (clock icon)
52
+ - Botón collapse/expand con animación
53
+ - Divisores visuales
54
+
55
+ ✅ **Dark Mode:**
56
+ - Soporte completo para light/dark
57
+ - Colores adaptados automáticamente
58
+
59
+ ✅ **Accesibilidad:**
60
+ - Focus rings adaptativos
61
+ - ARIA labels en botones
62
+ - Navegación por teclado
63
+
64
+ ✅ **Animaciones:**
65
+ - Transición suave al collapse/expand
66
+ - Hover effects en items
67
+ - Rotación del chevron
68
+
69
+ ---
70
+
71
+ ## Especificaciones de Diseño
72
+
73
+ ### Dimensiones
74
+
75
+ | Propiedad | Collapsed | Expanded |
76
+ |-----------|-----------|----------|
77
+ | **Width** | 80px | 215px |
78
+ | **Height** | 900px | 900px |
79
+ | **Item Height** | Automático | Automático |
80
+ | **Border Radius** | N/A | 8px (items) |
81
+
82
+ ### Espaciado (Spacing)
83
+
84
+ | Elemento | Padding | Margin | Gap |
85
+ |----------|---------|--------|-----|
86
+ | **Item** (collapsed) | `px-4 py-1` | N/A | `gap-3` |
87
+ | **Item** (expanded) | `px-4 py-2` | N/A | `gap-3` |
88
+ | **Search** (expanded) | `px-3 py-3` | N/A | `gap-2` |
89
+ | **Footer** | `px-3` | N/A | `gap-3` |
90
+
91
+ ### Tipografía
92
+
93
+ | Elemento | Familia | Tamaño | Peso | Line Height |
94
+ |----------|---------|--------|------|-------------|
95
+ | **Label Item** | SiesaBT | 14px | Regular | 20px |
96
+ | **Button Label** | SiesaBT | 14px | Bold | 20px |
97
+ | **Placeholder** | Inter | 14px | Regular | 20px |
98
+
99
+ ### Colores (Light Mode)
100
+
101
+ | Elemento | Color | Hex |
102
+ |----------|-------|-----|
103
+ | **Background** | background-primary | #ffffff |
104
+ | **Border** | border-primary | #e4e4e7 |
105
+ | **Text** | content-primary | #18181b |
106
+ | **Icon** | content-secondary | #a1a1aa |
107
+ | **Icon Hover** | content-custom-primary | #0e79fd |
108
+ | **Active Bg** | background-custom-primary | #dbeefe |
109
+
110
+ ### Colores (Dark Mode)
111
+
112
+ | Elemento | Color | Hex |
113
+ |----------|-------|-----|
114
+ | **Background** | background-primary/dark | #09090b |
115
+ | **Border** | border-primary/dark | #3f3f46 |
116
+ | **Text** | content-primary/dark | #fafafa |
117
+ | **Icon** | content-secondary/dark | #a1a1aa |
118
+ | **Icon Hover** | content-custom-primary/dark | #bfe2fe |
119
+ | **Active Bg** | background-custom-primary/dark | #0e5ab0 |
120
+
121
+ ### Sombras
122
+
123
+ | Elemento | Sombra |
124
+ |----------|--------|
125
+ | **Search Button** | `shadow-button-inset` |
126
+ | **Search Input** | `shadow-sm` |
127
+ | **Items** | Ninguna |
128
+
129
+ ---
130
+
131
+ ## Uso
132
+
133
+ ### Importación
134
+
135
+ ```tsx
136
+ import { NavigationRailTypes } from '@/components/NavigationRailTypes';
137
+ import type { NavigationRailItem } from '@/components/NavigationRailTypes';
138
+ ```
139
+
140
+ ### Instalación de Dependencias
141
+
142
+ Este componente reutiliza:
143
+ - `Button` - Botones en footer
144
+ - `Input` - Input de búsqueda (input nativo mejorado)
145
+ - `Divider` - Líneas divisoras
146
+ - `DropdownItemCollapsible` - Items en modo expandido
147
+
148
+ Asegúrate de tener estos componentes instalados.
149
+
150
+ ---
151
+
152
+ ## Props
153
+
154
+ ### NavigationRailTypesProps
155
+
156
+ ```typescript
157
+ interface NavigationRailTypesProps {
158
+ /**
159
+ * Si el rail está colapsado (iconos solo) o expandido
160
+ * @default true
161
+ */
162
+ collapsed?: boolean;
163
+
164
+ /**
165
+ * Items de navegación a mostrar
166
+ * @default []
167
+ */
168
+ items?: NavigationRailItem[];
169
+
170
+ /**
171
+ * Si mostrar el botón "Recientes" en footer
172
+ * @default true
173
+ */
174
+ showRecentButton?: boolean;
175
+
176
+ /**
177
+ * Callback cuando collapsed cambia
178
+ */
179
+ onCollapsedChange?: (collapsed: boolean) => void;
180
+
181
+ /**
182
+ * Callback cuando se clickea un item
183
+ */
184
+ onItemClick?: (index: number, item: NavigationRailItem) => void;
185
+
186
+ /**
187
+ * Classes CSS adicionales
188
+ */
189
+ className?: string;
190
+ }
191
+ ```
192
+
193
+ ### NavigationRailItem
194
+
195
+ ```typescript
196
+ interface NavigationRailItem {
197
+ /**
198
+ * Identificador único
199
+ */
200
+ id: string;
201
+
202
+ /**
203
+ * Etiqueta del item
204
+ */
205
+ label: string;
206
+
207
+ /**
208
+ * Icono (16x16px recomendado)
209
+ */
210
+ icon: ReactNode;
211
+
212
+ /**
213
+ * Si está activo
214
+ * @default false
215
+ */
216
+ active?: boolean;
217
+
218
+ /**
219
+ * Si está deshabilitado
220
+ * @default false
221
+ */
222
+ disabled?: boolean;
223
+
224
+ /**
225
+ * Callback onClick
226
+ */
227
+ onClick?: (e: React.MouseEvent<HTMLButtonElement>) => void;
228
+
229
+ /**
230
+ * URL para navegación
231
+ */
232
+ href?: string;
233
+
234
+ /**
235
+ * ARIA label para accesibilidad
236
+ */
237
+ ariaLabel?: string;
238
+
239
+ /**
240
+ * Badge de notificación (dot)
241
+ */
242
+ badge?: boolean;
243
+
244
+ /**
245
+ * Contador de notificaciones (99+ para >99)
246
+ */
247
+ badgeCount?: number;
248
+
249
+ /**
250
+ * Color del badge
251
+ * @default 'red'
252
+ */
253
+ badgeColor?: 'red' | 'blue' | 'green' | 'yellow' | 'orange';
254
+ }
255
+ ```
256
+
257
+ ---
258
+
259
+ ## Estados
260
+
261
+ ### Estado Default (No Interactuado)
262
+
263
+ ```
264
+ Collapsed:
265
+ - Icon color: content-secondary (#a1a1aa)
266
+ - Opacity: 100%
267
+ - Cursor: pointer
268
+
269
+ Expanded:
270
+ - Text color: content-primary (#18181b)
271
+ - Icon color: content-secondary (#a1a1aa)
272
+ - Background: transparent
273
+ - Opacity: 100%
274
+ ```
275
+
276
+ ### Estado Hover
277
+
278
+ ```
279
+ Collapsed:
280
+ - Icon color: content-custom-primary (#0e79fd)
281
+ - Opacity: 80%
282
+ - Scale: 1.05
283
+
284
+ Expanded:
285
+ - Background: background-custom-primary (#dbeefe)
286
+ - Text color: content-custom-primary (#0e79fd)
287
+ - Icon color: content-custom-primary (#0e79fd)
288
+ ```
289
+
290
+ ### Estado Active
291
+
292
+ ```
293
+ Collapsed:
294
+ - Icon color: content-custom-primary (#0e79fd)
295
+ - Background: Subtle overlay
296
+
297
+ Expanded:
298
+ - Background: background-custom-primary (#dbeefe)
299
+ - Text color: content-custom-primary (#0e79fd)
300
+ - Icon color: content-custom-primary (#0e79fd)
301
+ ```
302
+
303
+ ### Estado Disabled
304
+
305
+ ```
306
+ Collapsed & Expanded:
307
+ - Opacity: 50%
308
+ - Cursor: not-allowed
309
+ - Pointer events: none
310
+ ```
311
+
312
+ ### Estado Focus
313
+
314
+ ```
315
+ Collapsed & Expanded:
316
+ - Ring: 4px solid primary-custom-400 (#60b6fa)
317
+ - Ring offset: 2px background-primary (#ffffff)
318
+ - Outline: none
319
+ ```
320
+
321
+ ---
322
+
323
+ ## Ejemplos
324
+
325
+ ### Ejemplo Básico
326
+
327
+ ```tsx
328
+ import { NavigationRailTypes } from '@/components/NavigationRailTypes';
329
+ import { HomeIcon, UsersIcon, SettingsIcon } from '@heroicons/react/outline';
330
+
331
+ export function AppLayout() {
332
+ const [collapsed, setCollapsed] = useState(true);
333
+
334
+ const navItems = [
335
+ {
336
+ id: 'home',
337
+ label: 'Home',
338
+ icon: <HomeIcon className="size-4" />,
339
+ active: true,
340
+ },
341
+ {
342
+ id: 'users',
343
+ label: 'Users',
344
+ icon: <UsersIcon className="size-4" />,
345
+ },
346
+ {
347
+ id: 'settings',
348
+ label: 'Settings',
349
+ icon: <SettingsIcon className="size-4" />,
350
+ },
351
+ ];
352
+
353
+ return (
354
+ <div className="flex h-screen">
355
+ <NavigationRailTypes
356
+ collapsed={collapsed}
357
+ items={navItems}
358
+ onCollapsedChange={setCollapsed}
359
+ onItemClick={(index, item) => {
360
+ console.log('Navigated to:', item.id);
361
+ }}
362
+ />
363
+ <main className="flex-1 overflow-auto">
364
+ {/* Contenido principal */}
365
+ </main>
366
+ </div>
367
+ );
368
+ }
369
+ ```
370
+
371
+ ### Con Badges de Notificación
372
+
373
+ ```tsx
374
+ const navItems = [
375
+ {
376
+ id: 'messages',
377
+ label: 'Messages',
378
+ icon: <MessageIcon className="size-4" />,
379
+ badge: true, // Dot rojo simple
380
+ },
381
+ {
382
+ id: 'notifications',
383
+ label: 'Notifications',
384
+ icon: <BellIcon className="size-4" />,
385
+ badgeCount: 12, // Contador numérico
386
+ badgeColor: 'blue',
387
+ },
388
+ ];
389
+ ```
390
+
391
+ ### Con Items Deshabilitados
392
+
393
+ ```tsx
394
+ const navItems = [
395
+ {
396
+ id: 'premium',
397
+ label: 'Premium Features',
398
+ icon: <StarIcon className="size-4" />,
399
+ disabled: true, // No clickeable
400
+ },
401
+ ];
402
+ ```
403
+
404
+ ### Con Navegación Router
405
+
406
+ ```tsx
407
+ import { useNavigate } from 'react-router-dom';
408
+
409
+ export function Navigation() {
410
+ const navigate = useNavigate();
411
+
412
+ const navItems = [
413
+ {
414
+ id: 'dashboard',
415
+ label: 'Dashboard',
416
+ icon: <DashboardIcon className="size-4" />,
417
+ onClick: () => navigate('/dashboard'),
418
+ },
419
+ {
420
+ id: 'users',
421
+ label: 'Manage Users',
422
+ icon: <UsersIcon className="size-4" />,
423
+ onClick: () => navigate('/users'),
424
+ },
425
+ ];
426
+
427
+ return (
428
+ <NavigationRailTypes
429
+ items={navItems}
430
+ onItemClick={(_, item) => item.onClick?.({} as any)}
431
+ />
432
+ );
433
+ }
434
+ ```
435
+
436
+ ---
437
+
438
+ ## Accesibilidad
439
+
440
+ ### Features de Accesibilidad
441
+
442
+ ✅ **Focus Management:**
443
+ - Focus rings visibles (4px) en todos los items
444
+ - Focus visible en botones collapse/expand
445
+ - Orden tab lógico de arriba a abajo
446
+
447
+ ✅ **ARIA Attributes:**
448
+ - `aria-label` en botones sin texto visible (iconOnly)
449
+ - `role="button"` implícito en elementos clickeables
450
+ - `disabled` attribute para items deshabilitados
451
+
452
+ ✅ **Navegación por Teclado:**
453
+ - Tab/Shift+Tab para moverse entre items
454
+ - Enter/Space para activar items
455
+ - Escape para cerrar (si es popover)
456
+
457
+ ✅ **Colores y Contraste:**
458
+ - Ratio de contraste WCAG AA/AAA
459
+ - No depender solo del color para indicar estado
460
+ - Iconos con fallback a text
461
+
462
+ ✅ **Semántica:**
463
+ - Botones semánticos (`<button>`)
464
+ - Labels asociados a inputs
465
+ - Estructura lógica del DOM
466
+
467
+ ---
468
+
469
+ ## Dark Mode
470
+
471
+ El componente soporta dark mode automáticamente. Los colores se invierten cuando se activa:
472
+
473
+ ```tsx
474
+ <div className="dark">
475
+ <NavigationRailTypes {...props} />
476
+ </div>
477
+ ```
478
+
479
+ ### Colores en Dark Mode
480
+
481
+ | Light | Dark |
482
+ |-------|------|
483
+ | `#ffffff` bg | `#09090b` bg |
484
+ | `#18181b` text | `#fafafa` text |
485
+ | `#a1a1aa` icon | `#a1a1aa` icon |
486
+ | `#0e79fd` primary | `#bfe2fe` primary |
487
+ | `#e4e4e7` border | `#3f3f46` border |
488
+
489
+ ### Utilidades CSS para Dark Mode
490
+
491
+ El componente usa clases de dark mode nativas de Tailwind:
492
+
493
+ ```tsx
494
+ // Ejemplos en el código
495
+ className="dark:bg-background-primary"
496
+ className="dark:text-content-primary"
497
+ className="dark:border-border-primary"
498
+ ```
499
+
500
+ ---
501
+
502
+ ## Referencias
503
+
504
+ - **Figma Design**: [NavigationRailTypes Node 6135-36219](https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=6135-36219&m=dev)
505
+ - **Sistema de Colores**: `docs/colors.md`
506
+ - **Sistema de Tipografía**: `docs/typography.md`
507
+ - **Sistema de Spacing**: `docs/spacing.md`
508
+ - **Sistema de Sombras**: `docs/shadows.md`
509
+ - **Componente Button**: `src/components/Button`
510
+ - **Componente DropdownItemCollapsible**: `src/components/DropdownItemCollapsible`
511
+ - **Componente Input**: `src/components/Input`
512
+ - **Componente Divider**: `src/components/Divider`
513
+
514
+ ---
515
+
516
+ ## Historial de Cambios
517
+
518
+ ### v1.0.0 (Inicial)
519
+
520
+ - ✨ Componente NavigationRailTypes creado
521
+ - ✨ Soporte para modo collapsed/expanded
522
+ - ✨ Badges de notificación
523
+ - ✨ Búsqueda integrada
524
+ - ✨ Dark mode completo
525
+ - ✨ Historias de Storybook
526
+ - ✨ Documentación completa
527
+
528
+ ---
529
+
530
+ ## Notas de Implementación
531
+
532
+ ### Reutilización de Componentes
533
+
534
+ Este componente reutiliza:
535
+
536
+ 1. **Button** - Para los botones en footer
537
+ 2. **Divider** - Para separadores visuales
538
+ 3. **DropdownItemCollapsible** - Para items en modo expandido
539
+ 4. **Input** - Mejorado con input nativo para búsqueda
540
+
541
+ ### Consideraciones de Performance
542
+
543
+ - Los items se renderizan conmigo un array `map()`
544
+ - No hay virtualization aún (500px altura para algunos browsers)
545
+ - Para 100+ items, considerar virtualización
546
+
547
+ ### Compatibilidad
548
+
549
+ - React 18+
550
+ - Tailwind CSS 3+
551
+ - Navegadores modernos (Chrome, Firefox, Safari, Edge)
552
+
553
+ ---
554
+
555
+ ## FAQ
556
+
557
+ **P: ¿Puedo personalizar el ancho del rail?**
558
+ R: Actualmente, el ancho está fijo (80px collapsed, 215px expanded). Para personalizar, modifica las clases `w-[80px]` y `w-[215px]` en el componente.
559
+
560
+ **P: ¿Cómo integro con React Router?**
561
+ R: Usa el callback `onItemClick` para navegar:
562
+ ```tsx
563
+ onItemClick={(_, item) => navigate(`/${item.id}`)}
564
+ ```
565
+
566
+ **P: ¿Puedo agregar más iconos?**
567
+ R: Sí, pasa cualquier ReactNode como prop `icon` en los items.
568
+
569
+ **P: ¿El rail es responsive para mobile?**
570
+ R: No actualmente. Para mobile, considera un dropdown o hamburger menu.
571
+
572
+ **P: ¿Puedo cambiar los colores?**
573
+ R: Sí, todos los colores usan tokens CSS del sistema. Modifica las clases Tailwind para personalizar.