siesa-ui-kit 1.0.2 → 1.0.3

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 (236) hide show
  1. package/package.json +2 -9
  2. package/claude/settings.local.json +0 -7
  3. package/docs/border-radius.md +0 -1261
  4. package/docs/colors.md +0 -832
  5. package/docs/dark-mode-guide.md +0 -1426
  6. package/docs/filters.md +0 -1243
  7. package/docs/icons.md +0 -1283
  8. package/docs/shadows.md +0 -1377
  9. package/docs/spacing.md +0 -1684
  10. package/docs/typography.md +0 -1268
  11. package/postcss.config.cjs +0 -6
  12. package/public/,Business Logo.png +0 -0
  13. package/public/.Siesa Logo.png +0 -0
  14. package/public/bg_siesa.png +0 -0
  15. package/public/siesa_logo_mobile.png +0 -0
  16. package/public/vite.svg +0 -1
  17. package/src/App.css +0 -42
  18. package/src/App.tsx +0 -8
  19. package/src/ButtonTest.tsx +0 -147
  20. package/src/assets/fonts/README.md +0 -261
  21. package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
  22. package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
  23. package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
  24. package/src/assets/react.svg +0 -1
  25. package/src/components/Alert/Alert.stories.tsx +0 -332
  26. package/src/components/Alert/Alert.tsx +0 -106
  27. package/src/components/Alert/Alert.types.ts +0 -54
  28. package/src/components/Avatar/Avatar.stories.tsx +0 -494
  29. package/src/components/Avatar/Avatar.tsx +0 -143
  30. package/src/components/Avatar/Avatar.types.ts +0 -53
  31. package/src/components/Badge/Badge.stories.tsx +0 -339
  32. package/src/components/Badge/Badge.tsx +0 -278
  33. package/src/components/Badge/Badge.types.ts +0 -58
  34. package/src/components/Button/Button.stories.tsx +0 -950
  35. package/src/components/Button/Button.tsx +0 -337
  36. package/src/components/Button/Button.types.ts +0 -180
  37. package/src/components/Button/icons.tsx +0 -87
  38. package/src/components/Button/index.ts +0 -3
  39. package/src/components/Checkbox/Checkbox.stories.tsx +0 -453
  40. package/src/components/Checkbox/Checkbox.tsx +0 -208
  41. package/src/components/Checkbox/Checkbox.types.ts +0 -61
  42. package/src/components/DescriptionList/DescriptionList.stories.tsx +0 -250
  43. package/src/components/DescriptionList/DescriptionList.tsx +0 -96
  44. package/src/components/DescriptionList/DescriptionList.types.ts +0 -29
  45. package/src/components/Divider/Divider.stories.tsx +0 -263
  46. package/src/components/Divider/Divider.tsx +0 -80
  47. package/src/components/Divider/Divider.types.ts +0 -24
  48. package/src/components/Dropdown/Dropdown.stories.tsx +0 -552
  49. package/src/components/Dropdown/Dropdown.tsx +0 -422
  50. package/src/components/Dropdown/Dropdown.types.ts +0 -146
  51. package/src/components/Dropdown/README.md +0 -266
  52. package/src/components/Dropdown/icons.tsx +0 -72
  53. package/src/components/Dropdown/index.ts +0 -8
  54. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +0 -317
  55. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +0 -287
  56. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +0 -111
  57. package/src/components/DropdownItemCollapsible/README.md +0 -264
  58. package/src/components/DropdownItemCollapsible/icons.tsx +0 -57
  59. package/src/components/DropdownItemCollapsible/index.ts +0 -12
  60. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +0 -386
  61. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +0 -216
  62. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +0 -93
  63. package/src/components/DropdownItemHeading/README.md +0 -573
  64. package/src/components/DropdownItemHeading/icons.tsx +0 -125
  65. package/src/components/DropdownItemHeading/index.ts +0 -3
  66. package/src/components/Input/Input.stories.tsx +0 -583
  67. package/src/components/Input/Input.tsx +0 -204
  68. package/src/components/Input/Input.types.ts +0 -80
  69. package/src/components/Input/icons.tsx +0 -145
  70. package/src/components/Input/index.ts +0 -2
  71. package/src/components/LoginView/LoginView.stories.tsx +0 -148
  72. package/src/components/LoginView/LoginView.tsx +0 -426
  73. package/src/components/LoginView/LoginView.types.ts +0 -52
  74. package/src/components/LoginView/README.md +0 -396
  75. package/src/components/LoginView/icons.tsx +0 -85
  76. package/src/components/LoginView/index.ts +0 -3
  77. package/src/components/Navbar/Navbar.stories.tsx +0 -810
  78. package/src/components/Navbar/Navbar.tsx +0 -755
  79. package/src/components/Navbar/Navbar.types.ts +0 -219
  80. package/src/components/Navbar/README.md +0 -279
  81. package/src/components/Navbar/icons.tsx +0 -102
  82. package/src/components/Navbar/index.ts +0 -8
  83. package/src/components/NavigationBar/NavigationBar.stories.tsx +0 -406
  84. package/src/components/NavigationBar/NavigationBar.tsx +0 -246
  85. package/src/components/NavigationBar/NavigationBar.types.ts +0 -74
  86. package/src/components/NavigationBar/README.md +0 -469
  87. package/src/components/NavigationBar/index.ts +0 -2
  88. package/src/components/NavigationRail/NavigationRail.stories.tsx +0 -417
  89. package/src/components/NavigationRail/NavigationRail.tsx +0 -418
  90. package/src/components/NavigationRail/NavigationRail.types.ts +0 -109
  91. package/src/components/NavigationRail/README.md +0 -224
  92. package/src/components/NavigationRail/index.ts +0 -2
  93. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +0 -667
  94. package/src/components/NavigationRailItem/NavigationRailItem.tsx +0 -313
  95. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +0 -167
  96. package/src/components/NavigationRailItem/README.md +0 -476
  97. package/src/components/NavigationRailItem/index.ts +0 -2
  98. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +0 -462
  99. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +0 -332
  100. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +0 -178
  101. package/src/components/NavigationRailPanel/README.md +0 -461
  102. package/src/components/NavigationRailPanel/index.ts +0 -6
  103. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +0 -528
  104. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +0 -378
  105. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +0 -130
  106. package/src/components/NavigationRailTypes/README.md +0 -573
  107. package/src/components/NavigationRailTypes/icons.tsx +0 -141
  108. package/src/components/NavigationRailTypes/index.ts +0 -7
  109. package/src/components/Notification/Notification.stories.tsx +0 -513
  110. package/src/components/Notification/Notification.tsx +0 -145
  111. package/src/components/Notification/Notification.types.ts +0 -142
  112. package/src/components/Notification/README.md +0 -409
  113. package/src/components/Notification/index.ts +0 -3
  114. package/src/components/POSConvention/POSConvention.stories.tsx +0 -235
  115. package/src/components/POSConvention/POSConvention.tsx +0 -129
  116. package/src/components/POSConvention/POSConvention.types.ts +0 -38
  117. package/src/components/POSConvention/README.md +0 -123
  118. package/src/components/POSConvention/icons.tsx +0 -45
  119. package/src/components/POSConvention/index.ts +0 -3
  120. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +0 -531
  121. package/src/components/POSLocationButton/POSLocationButton.tsx +0 -247
  122. package/src/components/POSLocationButton/POSLocationButton.types.ts +0 -87
  123. package/src/components/POSLocationButton/README.md +0 -253
  124. package/src/components/POSLocationButton/icons.tsx +0 -120
  125. package/src/components/POSLocationButton/index.ts +0 -14
  126. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +0 -415
  127. package/src/components/POSNumberButton/POSNumberButton.tsx +0 -179
  128. package/src/components/POSNumberButton/POSNumberButton.types.ts +0 -51
  129. package/src/components/POSNumberButton/README.md +0 -321
  130. package/src/components/POSNumberButton/index.ts +0 -3
  131. package/src/components/POSProductButton/POSProductButton.stories.tsx +0 -318
  132. package/src/components/POSProductButton/POSProductButton.tsx +0 -152
  133. package/src/components/POSProductButton/POSProductButton.types.ts +0 -46
  134. package/src/components/POSProductButton/README.md +0 -269
  135. package/src/components/POSProductButton/index.ts +0 -2
  136. package/src/components/POSProductCard/POSProductCard.stories.tsx +0 -642
  137. package/src/components/POSProductCard/POSProductCard.tsx +0 -208
  138. package/src/components/POSProductCard/POSProductCard.types.ts +0 -76
  139. package/src/components/POSProductCard/README.md +0 -179
  140. package/src/components/POSProductCard/icons.tsx +0 -26
  141. package/src/components/POSProductCard/index.ts +0 -2
  142. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +0 -753
  143. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +0 -332
  144. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +0 -119
  145. package/src/components/POSProductSidebarItems/README.md +0 -198
  146. package/src/components/POSProductSidebarItems/icons.tsx +0 -21
  147. package/src/components/POSProductSidebarItems/index.ts +0 -3
  148. package/src/components/POSTable/POSTable.stories.tsx +0 -737
  149. package/src/components/POSTable/POSTable.tsx +0 -401
  150. package/src/components/POSTable/POSTable.types.ts +0 -83
  151. package/src/components/POSTable/README.md +0 -286
  152. package/src/components/POSTable/index.ts +0 -7
  153. package/src/components/Pagination/Pagination.stories.tsx +0 -555
  154. package/src/components/Pagination/Pagination.tsx +0 -286
  155. package/src/components/Pagination/Pagination.types.ts +0 -93
  156. package/src/components/Pagination/README.md +0 -298
  157. package/src/components/Pagination/icons.tsx +0 -47
  158. package/src/components/Pagination/index.ts +0 -3
  159. package/src/components/Quantity/Quantity.stories.tsx +0 -457
  160. package/src/components/Quantity/Quantity.tsx +0 -289
  161. package/src/components/Quantity/Quantity.types.ts +0 -70
  162. package/src/components/Radio/Radio.stories.tsx +0 -523
  163. package/src/components/Radio/Radio.tsx +0 -170
  164. package/src/components/Radio/Radio.types.ts +0 -122
  165. package/src/components/Select/README.md +0 -299
  166. package/src/components/Select/Select.stories.tsx +0 -673
  167. package/src/components/Select/Select.tsx +0 -454
  168. package/src/components/Select/Select.types.ts +0 -148
  169. package/src/components/Select/icons.tsx +0 -50
  170. package/src/components/Select/index.ts +0 -3
  171. package/src/components/SignUpView/SignUpView.stories.tsx +0 -129
  172. package/src/components/SignUpView/SignUpView.tsx +0 -503
  173. package/src/components/SignUpView/SignUpView.types.ts +0 -58
  174. package/src/components/SignUpView/icons.tsx +0 -71
  175. package/src/components/SignUpView/index.ts +0 -3
  176. package/src/components/Switch/README.md +0 -112
  177. package/src/components/Switch/Switch.stories.tsx +0 -550
  178. package/src/components/Switch/Switch.tsx +0 -246
  179. package/src/components/Switch/Switch.types.ts +0 -67
  180. package/src/components/Table/README.md +0 -369
  181. package/src/components/Table/Table.stories.tsx +0 -805
  182. package/src/components/Table/Table.tsx +0 -688
  183. package/src/components/Table/Table.types.ts +0 -204
  184. package/src/components/Table/index.ts +0 -9
  185. package/src/components/Tabs/README.md +0 -201
  186. package/src/components/Tabs/Tabs.stories.tsx +0 -580
  187. package/src/components/Tabs/Tabs.tsx +0 -356
  188. package/src/components/Tabs/Tabs.types.ts +0 -127
  189. package/src/components/Tabs/icons.tsx +0 -129
  190. package/src/components/Tabs/index.ts +0 -11
  191. package/src/components/Textarea/Textarea.stories.tsx +0 -535
  192. package/src/components/Textarea/Textarea.tsx +0 -188
  193. package/src/components/Textarea/Textarea.types.ts +0 -54
  194. package/src/context/ThemeContext.tsx +0 -99
  195. package/src/context/index.ts +0 -1
  196. package/src/index.css +0 -29
  197. package/src/index.ts +0 -102
  198. package/src/main.tsx +0 -10
  199. package/src/views/ListView/ListView.stories.tsx +0 -329
  200. package/src/views/ListView/ListView.tsx +0 -570
  201. package/src/views/ListView/ListView.types.ts +0 -211
  202. package/src/views/ListView/icons.tsx +0 -282
  203. package/src/views/ListView/index.ts +0 -11
  204. package/src/views/LoginView/LoginView.stories.tsx +0 -148
  205. package/src/views/LoginView/LoginView.tsx +0 -426
  206. package/src/views/LoginView/LoginView.types.ts +0 -52
  207. package/src/views/LoginView/README.md +0 -396
  208. package/src/views/LoginView/icons.tsx +0 -85
  209. package/src/views/LoginView/index.ts +0 -3
  210. package/src/views/ProductsView/ProductsView.stories.tsx +0 -344
  211. package/src/views/ProductsView/ProductsView.tsx +0 -480
  212. package/src/views/ProductsView/ProductsView.types.ts +0 -238
  213. package/src/views/ProductsView/README.md +0 -312
  214. package/src/views/ProductsView/icons.tsx +0 -38
  215. package/src/views/ProductsView/index.ts +0 -8
  216. package/src/views/RecoverPasswordView/README.md +0 -269
  217. package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +0 -131
  218. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +0 -376
  219. package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +0 -56
  220. package/src/views/RecoverPasswordView/icons.tsx +0 -17
  221. package/src/views/RecoverPasswordView/index.ts +0 -2
  222. package/src/views/SignUpView/SignUpView.stories.tsx +0 -129
  223. package/src/views/SignUpView/SignUpView.tsx +0 -503
  224. package/src/views/SignUpView/SignUpView.types.ts +0 -58
  225. package/src/views/SignUpView/icons.tsx +0 -71
  226. package/src/views/SignUpView/index.ts +0 -3
  227. package/src/views/TableLayoutView/README.md +0 -268
  228. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +0 -235
  229. package/src/views/TableLayoutView/TableLayoutView.tsx +0 -461
  230. package/src/views/TableLayoutView/TableLayoutView.types.ts +0 -209
  231. package/src/views/TableLayoutView/icons.tsx +0 -113
  232. package/src/views/TableLayoutView/index.ts +0 -6
  233. package/storybook/main.ts +0 -20
  234. package/storybook/preview.tsx +0 -84
  235. package/storybook/vitest.setup.ts +0 -7
  236. package/tailwind.config.js +0 -128
@@ -1,313 +0,0 @@
1
- import React from 'react';
2
- import type { NavigationRailItemProps } from './NavigationRailItem.types';
3
-
4
- /**
5
- * NavigationRailItem - Componente independiente para items de NavigationRail
6
- *
7
- * Item individual de navegación vertical (rail) para aplicaciones. Proporciona
8
- * un punto de acceso a destinos mediante un icono, label opcional y badges.
9
- *
10
- * **Características principales:**
11
- * - Ancho fijo de 56px según Figma
12
- * - Estados completos: normal, hover, selected, focus, disabled
13
- * - Badges de notificación con contador opcional
14
- * - Tipografía Label XXSmall (10px Bold) según sistema de diseño
15
- * - Dark mode completo con estrategia 'class'
16
- * - Focus rings adaptativos para accesibilidad
17
- * - Soporte para iconos 16x16px
18
- *
19
- * **Especificaciones de Figma (node 4294-22931):**
20
- * - Ancho: 56px (w-14)
21
- * - Icon container: 32px altura, px-4 py-1, rounded-full
22
- * - Label: 10px Bold, leading 12px (Label XXSmall)
23
- * - Gap: 4px (gap-1)
24
- * - Badge: 13x13px, posición absolute
25
- *
26
- * **Estados visuales (según Figma):**
27
- * - **Enabled**: Icon transparent, label text-content-primary
28
- * - **Hover**: Icon container bg-primary-custom-100 (#dbeefe), icon text-primary-custom-600
29
- * - **Selected**: Icon container bg-primary-custom-100 con overlay, icon text-primary-custom-600
30
- * - **Focus**: Focus ring 2px (#60b6fa) con offset 2px (#dbeefe), sombras combinadas
31
- * - **Disabled**: Opacity 55%, no interactivo
32
- *
33
- * **Dark Mode:**
34
- * - Background: dark-bg-primary
35
- * - Hover icon container: dark-bg-primary/20
36
- * - Selected icon container: dark-primary-custom-600/30
37
- * - Icon colors: dark-content-primary, dark-white on selected
38
- * - Focus ring: dark-border-custom
39
- *
40
- * **Mejores prácticas implementadas:**
41
- * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
42
- * - Tokens de color consistentes con documentación
43
- * - Accesibilidad ARIA completa
44
- * - Focus visible para keyboard navigation
45
- * - Badge positioning absoluto para no afectar layout
46
- *
47
- * @see docs/colors.md - Sistema de colores (primary-custom, dark-*, content-*)
48
- * @see docs/typography.md - Tipografía (Label XXSmall)
49
- * @see docs/spacing.md - Sistema de espaciado
50
- * @see docs/shadows.md - Sistema de sombras y focus rings
51
- * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4294-22931
52
- *
53
- * @example
54
- * ```tsx
55
- * // Item básico
56
- * <NavigationRailItem
57
- * id="home"
58
- * icon={<HomeIcon />}
59
- * label="Inicio"
60
- * selected={true}
61
- * onClick={() => navigate('/')}
62
- * />
63
- *
64
- * // Con badge de notificación
65
- * <NavigationRailItem
66
- * id="notifications"
67
- * icon={<BellIcon />}
68
- * label="Notificaciones"
69
- * badgeCount={5}
70
- * onClick={() => navigate('/notifications')}
71
- * />
72
- *
73
- * // Item deshabilitado
74
- * <NavigationRailItem
75
- * id="premium"
76
- * icon={<StarIcon />}
77
- * label="Premium"
78
- * disabled={true}
79
- * />
80
- *
81
- * // Solo icono (sin label)
82
- * <NavigationRailItem
83
- * id="home"
84
- * icon={<HomeIcon />}
85
- * label="Inicio"
86
- * showLabelText={false}
87
- * />
88
- * ```
89
- */
90
- export const NavigationRailItem: React.FC<NavigationRailItemProps> = ({
91
- icon,
92
- label,
93
- selected = false,
94
- disabled = false,
95
- badge = false,
96
- badgeCount,
97
- onClick,
98
- ariaLabel,
99
- id,
100
- showLabelText = true,
101
- showIcon = true,
102
- className = '',
103
- }) => {
104
- // ===== CLASES DEL ICON CONTAINER =====
105
- // Según Figma node 4294-22931, el icon container tiene comportamiento diferente
106
- // según el estado:
107
- // - Enabled: bg-transparent, hover:bg-primary-custom-100
108
- // - Hover: bg-primary-custom-100
109
- // - Selected: bg-primary-custom-100 con overlay (rgba(0,0,0,0.024))
110
- // - Focus: bg-primary-custom-100 con focus ring y sombras
111
- // - Disabled: opacidad 55%
112
- const iconContainerClasses = [
113
- // Base layout
114
- 'flex',
115
- 'flex-col',
116
- 'items-center',
117
- 'justify-center',
118
- 'px-4', // 16px horizontal según Figma
119
- 'py-1', // 4px vertical según Figma
120
- 'rounded-full',
121
- 'overflow-hidden',
122
- 'shrink-0',
123
-
124
- // Estados - Background
125
- selected
126
- ? // Selected: bg-primary-custom-100 con overlay
127
- 'bg-primary-custom-100 dark:bg-primary-custom-600/30'
128
- : // Default/Hover: transparent → hover:bg-primary-custom-100
129
- 'bg-transparent hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20',
130
-
131
- // Transiciones
132
- 'transition-colors',
133
- 'duration-150',
134
- ].join(' ');
135
-
136
- // ===== CLASES DEL ICONO =====
137
- // Tamaño fijo 16x16px según Figma
138
- // Colores según estado:
139
- // - Default: text-content-primary
140
- // - Hover: text-primary-custom-600
141
- // - Selected: text-primary-custom-600
142
- // - Disabled: text-content-tertiary
143
- // Dark mode: invierte colores
144
- const iconClasses = [
145
- 'w-4', // 16px
146
- 'h-4', // 16px
147
- 'shrink-0',
148
-
149
- // Colores según estado
150
- selected
151
- ? // Selected: primary-custom-600 (azul oscuro)
152
- 'text-primary-custom-600 dark:text-white'
153
- : disabled
154
- ? // Disabled: content-tertiary
155
- 'text-content-tertiary dark:text-content-tertiary'
156
- : // Default/Hover: content-primary → hover:primary-custom-600
157
- 'text-content-primary hover:text-primary-custom-600 dark:text-dark-content-primary dark:hover:text-white',
158
-
159
- 'transition-colors',
160
- 'duration-150',
161
- ].join(' ');
162
-
163
- // ===== CLASES DEL LABEL =====
164
- // Tipografía: Label XXSmall (10px Bold, leading 12px) según Figma
165
- // Color: text-content-primary, dark:text-dark-content-primary
166
- const labelClasses = [
167
- // Tipografía: Label XXSmall (10px Bold)
168
- 'text-[10px]',
169
- 'leading-3', // 12px
170
- 'font-bold',
171
- 'text-center',
172
- 'w-full',
173
- 'min-w-full',
174
-
175
- // Colores
176
- 'text-content-primary',
177
- 'dark:text-dark-content-primary',
178
-
179
- // Para multiline labels, agregar truncate o text-nowrap si es necesario
180
- 'break-words',
181
- ].join(' ');
182
-
183
- // ===== CLASES DEL CONTENEDOR PRINCIPAL =====
184
- // Según Figma: ancho 56px, flex-col, gap-1, items-center
185
- const containerClasses = [
186
- 'relative',
187
- 'flex',
188
- 'flex-col',
189
- 'items-center',
190
- 'gap-1', // 4px según Figma
191
- 'px-0.5', // 2px horizontal según Figma
192
- 'py-0',
193
- 'w-14', // 56px según Figma
194
- 'shrink-0',
195
-
196
- // Interactividad
197
- disabled
198
- ? 'cursor-not-allowed opacity-55 pointer-events-none'
199
- : 'cursor-pointer',
200
-
201
- // Focus visible (accesibilidad)
202
- 'focus:outline-none',
203
- 'focus-visible:ring-2',
204
- 'focus-visible:ring-primary-custom-400', // 4px ring
205
- 'focus-visible:ring-offset-2',
206
- 'focus-visible:ring-offset-primary-custom-100', // offset #dbeefe según Figma
207
- 'dark:focus-visible:ring-dark-border-custom',
208
- 'dark:focus-visible:ring-offset-dark-bg-primary',
209
-
210
- // Focus sombras adicionales según Figma:
211
- // shadow-[0px_0px_0px_2px_var(--background\/backgroundcustomprimary,#dbeefe),0px_1px_2px_0px_rgba(0,0,0,0.05),0px_0px_0px_4px_var(--primarycustom\/400,#60b6fa)]
212
- 'focus-visible:shadow-[0px_0px_0px_2px_rgba(219,238,254,1),0px_1px_2px_0px_rgba(0,0,0,0.05),0px_0px_0px_4px_rgba(96,182,250,1)]',
213
- 'dark:focus-visible:shadow-[0px_0px_0px_2px_rgba(59,130,246,0.3),0px_1px_2px_0px_rgba(0,0,0,0.05),0px_0px_0px_4px_rgba(96,182,250,0.4)]',
214
-
215
- 'rounded-lg',
216
-
217
- // Clases personalizadas
218
- className,
219
- ].join(' ');
220
-
221
- // ===== RENDERIZAR BADGE =====
222
- const renderBadge = () => {
223
- if (!badge && badgeCount === undefined) return null;
224
-
225
- // Badge con número
226
- if (badgeCount !== undefined) {
227
- return (
228
- <span
229
- className="
230
- absolute
231
- -top-0.5
232
- left-[34px]
233
- flex
234
- items-center
235
- justify-center
236
- min-w-[13px]
237
- h-[13px]
238
- px-1
239
- rounded-full
240
- text-[10px]
241
- font-bold
242
- leading-none
243
- bg-red-700
244
- text-white
245
- dark:bg-red-700
246
- dark:text-white
247
- pointer-events-none
248
- select-none
249
- "
250
- aria-label={`${badgeCount} notificaciones`}
251
- data-badge
252
- >
253
- {badgeCount > 99 ? '99+' : badgeCount}
254
- </span>
255
- );
256
- }
257
-
258
- // Badge dot simple
259
- return (
260
- <span
261
- className="
262
- absolute
263
- -top-0.5
264
- left-[34px]
265
- w-[13px]
266
- h-[13px]
267
- rounded-full
268
- bg-red-700
269
- dark:bg-red-700
270
- pointer-events-none
271
- select-none
272
- "
273
- aria-label="Notificación"
274
- data-badge
275
- />
276
- );
277
- };
278
-
279
- return (
280
- <button
281
- type="button"
282
- className={containerClasses}
283
- disabled={disabled}
284
- onClick={onClick}
285
- aria-label={ariaLabel || label}
286
- aria-current={selected ? 'page' : undefined}
287
- aria-disabled={disabled}
288
- data-item-id={id}
289
- data-testid={`navigation-rail-item-${id}`}
290
- >
291
- {/* Icon Container */}
292
- {showIcon && (
293
- <div className={iconContainerClasses}>
294
- <span className={iconClasses}>
295
- {icon}
296
- </span>
297
- </div>
298
- )}
299
-
300
- {/* Label */}
301
- {showLabelText && (
302
- <p className={labelClasses}>
303
- {label}
304
- </p>
305
- )}
306
-
307
- {/* Badge */}
308
- {renderBadge()}
309
- </button>
310
- );
311
- };
312
-
313
- NavigationRailItem.displayName = 'NavigationRailItem';
@@ -1,167 +0,0 @@
1
- import type { ReactNode } from 'react';
2
-
3
- /**
4
- * Props para NavigationRailItem
5
- *
6
- * Componente independiente para items individuales de NavigationRail.
7
- * Implementación pixel-perfect según Figma (node 4294-22931).
8
- *
9
- * **Estados:**
10
- * - `Enabled`: Estado normal del item
11
- * - `Hover`: Overlay de color en el icon container
12
- * - `Selected`: Background con overlay según Figma
13
- * - `Focus`: Focus ring de 4px (#60b6fa) con offset de 2px (#dbeefe)
14
- * - `Disabled`: Opacity 55% con pointer-events-none
15
- *
16
- * **Especificaciones de Figma:**
17
- * - Ancho: 56px (w-14)
18
- * - Altura: auto (flex-col)
19
- * - Gap: 4px entre icon y label
20
- * - Padding: 2px horizontal, 0px vertical (px-0.5)
21
- * - Border radius: 9999px (rounded-full) en icon container
22
- * - Tipografía label: Label XXSmall (10px Bold, leading 12px)
23
- * - Icono: 16x16px
24
- *
25
- * @see https://www.figma.com/design/5XNqf2YTxvwemxwo1LMQ6j/Siesa-UI-Kit?node-id=4294-22931
26
- * @see docs/colors.md - Sistema de colores
27
- * @see docs/typography.md - Sistema tipográfico (Label XXSmall)
28
- * @see docs/spacing.md - Sistema de espaciado
29
- * @see docs/shadows.md - Sistema de sombras (focus ring)
30
- */
31
- export interface NavigationRailItemProps {
32
- /**
33
- * Icono a mostrar en el item
34
- * Tamaño recomendado: 16x16px
35
- * Tipos compatibles: ReactNode, SVG, Heroicons, etc.
36
- *
37
- * @example
38
- * ```tsx
39
- * import { HomeIcon } from '@heroicons/react/24/outline';
40
- * <NavigationRailItem icon={<HomeIcon />} />
41
- * ```
42
- */
43
- icon: ReactNode;
44
-
45
- /**
46
- * Label/texto del item de navegación
47
- * Se muestra debajo del icono en tipografía Label XXSmall
48
- *
49
- * @example
50
- * <NavigationRailItem label="Inicio" />
51
- */
52
- label: string;
53
-
54
- /**
55
- * Si el item está seleccionado actualmente
56
- *
57
- * Estado visual:
58
- * - Background: bg-primary-custom-100 (#dbeefe) con overlay rgba(0,0,0,0.024)
59
- * - Icono: text-primary-custom-600 (#0e79fd)
60
- * - Label: text-content-primary
61
- *
62
- * @default false
63
- */
64
- selected?: boolean;
65
-
66
- /**
67
- * Si el item está deshabilitado
68
- *
69
- * Estado visual:
70
- * - Opacity: 55%
71
- * - Cursor: not-allowed
72
- * - Pointer-events: none
73
- *
74
- * @default false
75
- */
76
- disabled?: boolean;
77
-
78
- /**
79
- * Mostrar badge de notificación (dot rojo)
80
- *
81
- * El badge se posiciona en la esquina superior derecha del icon container.
82
- * Tamaño: 13x13px
83
- * Color: #b91c1c (red-700)
84
- * Posición: left-[34px], top-[-3px]
85
- *
86
- * @default false
87
- */
88
- badge?: boolean;
89
-
90
- /**
91
- * Número a mostrar en el badge (reemplaza el dot simple)
92
- *
93
- * Si el número es mayor a 99, muestra "99+"
94
- * Tipografía: 10px Bold
95
- * Color: white (#ffffff)
96
- *
97
- * @example
98
- * <NavigationRailItem badgeCount={5} /> // Muestra: 5
99
- * <NavigationRailItem badgeCount={150} /> // Muestra: 99+
100
- */
101
- badgeCount?: number;
102
-
103
- /**
104
- * Handler para evento click del item
105
- *
106
- * Se ejecuta cuando el usuario hace click en el item,
107
- * incluso si está en estado selected.
108
- */
109
- onClick?: () => void;
110
-
111
- /**
112
- * Label para accesibilidad (ARIA-label)
113
- *
114
- * Si no se proporciona, usa el valor de `label`
115
- *
116
- * @example
117
- * <NavigationRailItem label="Inicio" ariaLabel="Ir a la página de inicio" />
118
- */
119
- ariaLabel?: string;
120
-
121
- /**
122
- * ID único del item
123
- *
124
- * Usado para identificar el item en callbacks y para navegación.
125
- * Se añade como atributo data-item-id en el elemento DOM.
126
- *
127
- * @example
128
- * <NavigationRailItem id="home" label="Inicio" />
129
- */
130
- id?: string;
131
-
132
- /**
133
- * Mostrar el label del texto
134
- *
135
- * Si es false, solo se muestra el icono
136
- *
137
- * @default true
138
- */
139
- showLabelText?: boolean;
140
-
141
- /**
142
- * Mostrar icono
143
- *
144
- * Si es false, solo se muestra el label
145
- *
146
- * @default true
147
- */
148
- showIcon?: boolean;
149
-
150
- /**
151
- * Clases CSS adicionales personalizadas
152
- *
153
- * Se aplican al contenedor principal (button)
154
- */
155
- className?: string;
156
- }
157
-
158
- /**
159
- * Estados posibles del componente según Figma
160
- *
161
- * - `Enabled`: Estado normal, sin interacción
162
- * - `Hover`: Mouse over el item
163
- * - `Selected`: Item actualmente seleccionado
164
- * - `Focus`: Keyboard focus (accesibilidad)
165
- * - `Disabled`: Item deshabilitado, no interactivo
166
- */
167
- export type NavigationRailItemState = 'Enabled' | 'Hover' | 'Selected' | 'Focus' | 'Disabled';