siesa-ui-kit 1.0.3 → 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 (290) 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 +72 -0
  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/border-radius.md +1261 -0
  46. package/docs/colors.md +832 -0
  47. package/docs/dark-mode-guide.md +1426 -0
  48. package/docs/filters.md +1243 -0
  49. package/docs/icons.md +1264 -0
  50. package/docs/shadows.md +1377 -0
  51. package/docs/spacing.md +1684 -0
  52. package/docs/typography.md +1268 -0
  53. package/package.json +111 -103
  54. package/postcss.config.cjs +6 -0
  55. package/public/,Business Logo.png +0 -0
  56. package/public/.Siesa Logo.png +0 -0
  57. package/public/bg_siesa.png +0 -0
  58. package/public/siesa_logo_mobile.png +0 -0
  59. package/public/vite.svg +1 -0
  60. package/src/App.css +42 -0
  61. package/src/App.tsx +8 -0
  62. package/src/ButtonTest.tsx +147 -0
  63. package/src/assets/fonts/README.md +261 -0
  64. package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
  65. package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
  66. package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
  67. package/src/assets/react.svg +1 -0
  68. package/src/components/Alert/Alert.stories.tsx +332 -0
  69. package/src/components/Alert/Alert.tsx +106 -0
  70. package/src/components/Alert/Alert.types.ts +54 -0
  71. package/src/components/Avatar/Avatar.stories.tsx +494 -0
  72. package/src/components/Avatar/Avatar.tsx +143 -0
  73. package/src/components/Avatar/Avatar.types.ts +53 -0
  74. package/src/components/Badge/Badge.stories.tsx +339 -0
  75. package/src/components/Badge/Badge.tsx +278 -0
  76. package/src/components/Badge/Badge.types.ts +58 -0
  77. package/src/components/Button/Button.stories.tsx +950 -0
  78. package/src/components/Button/Button.tsx +337 -0
  79. package/src/components/Button/Button.types.ts +180 -0
  80. package/src/components/Button/icons.tsx +48 -0
  81. package/src/components/Button/index.ts +3 -0
  82. package/src/components/Checkbox/Checkbox.stories.tsx +453 -0
  83. package/src/components/Checkbox/Checkbox.tsx +208 -0
  84. package/src/components/Checkbox/Checkbox.types.ts +61 -0
  85. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -0
  86. package/src/components/DescriptionList/DescriptionList.tsx +96 -0
  87. package/src/components/DescriptionList/DescriptionList.types.ts +29 -0
  88. package/src/components/Divider/Divider.stories.tsx +263 -0
  89. package/src/components/Divider/Divider.tsx +80 -0
  90. package/src/components/Divider/Divider.types.ts +24 -0
  91. package/src/components/Dropdown/Dropdown.stories.tsx +552 -0
  92. package/src/components/Dropdown/Dropdown.tsx +422 -0
  93. package/src/components/Dropdown/Dropdown.types.ts +146 -0
  94. package/src/components/Dropdown/README.md +266 -0
  95. package/src/components/Dropdown/icons.tsx +72 -0
  96. package/src/components/Dropdown/index.ts +8 -0
  97. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -0
  98. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +307 -0
  99. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +136 -0
  100. package/src/components/DropdownItemCollapsible/README.md +264 -0
  101. package/src/components/DropdownItemCollapsible/icons.tsx +57 -0
  102. package/src/components/DropdownItemCollapsible/index.ts +12 -0
  103. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -0
  104. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -0
  105. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -0
  106. package/src/components/DropdownItemHeading/README.md +573 -0
  107. package/src/components/DropdownItemHeading/icons.tsx +125 -0
  108. package/src/components/DropdownItemHeading/index.ts +3 -0
  109. package/src/components/Input/Input.stories.tsx +583 -0
  110. package/src/components/Input/Input.tsx +204 -0
  111. package/src/components/Input/Input.types.ts +80 -0
  112. package/src/components/Input/icons.tsx +145 -0
  113. package/src/components/Input/index.ts +2 -0
  114. package/src/components/LoginView/LoginView.stories.tsx +148 -0
  115. package/src/components/LoginView/LoginView.tsx +426 -0
  116. package/src/components/LoginView/LoginView.types.ts +52 -0
  117. package/src/components/LoginView/README.md +396 -0
  118. package/src/components/LoginView/icons.tsx +85 -0
  119. package/src/components/LoginView/index.ts +3 -0
  120. package/src/components/Navbar/Navbar.stories.tsx +810 -0
  121. package/src/components/Navbar/Navbar.tsx +755 -0
  122. package/src/components/Navbar/Navbar.types.ts +219 -0
  123. package/src/components/Navbar/README.md +279 -0
  124. package/src/components/Navbar/icons.tsx +102 -0
  125. package/src/components/Navbar/index.ts +8 -0
  126. package/src/components/NavigationBar/NavigationBar.stories.tsx +406 -0
  127. package/src/components/NavigationBar/NavigationBar.tsx +246 -0
  128. package/src/components/NavigationBar/NavigationBar.types.ts +74 -0
  129. package/src/components/NavigationBar/README.md +469 -0
  130. package/src/components/NavigationBar/index.ts +2 -0
  131. package/src/components/NavigationRail/NavigationRail.stories.tsx +417 -0
  132. package/src/components/NavigationRail/NavigationRail.tsx +418 -0
  133. package/src/components/NavigationRail/NavigationRail.types.ts +109 -0
  134. package/src/components/NavigationRail/README.md +224 -0
  135. package/src/components/NavigationRail/index.ts +2 -0
  136. package/src/components/NavigationRailCommercial/NavigationRailCommercial.stories.tsx +464 -0
  137. package/src/components/NavigationRailCommercial/NavigationRailCommercial.tsx +301 -0
  138. package/src/components/NavigationRailCommercial/NavigationRailCommercial.types.ts +162 -0
  139. package/src/components/NavigationRailCommercial/README.md +251 -0
  140. package/src/components/NavigationRailCommercial/icons.tsx +54 -0
  141. package/src/components/NavigationRailCommercial/index.ts +6 -0
  142. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -0
  143. package/src/components/NavigationRailItem/NavigationRailItem.tsx +314 -0
  144. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +175 -0
  145. package/src/components/NavigationRailItem/README.md +476 -0
  146. package/src/components/NavigationRailItem/index.ts +2 -0
  147. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -0
  148. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -0
  149. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -0
  150. package/src/components/NavigationRailPanel/README.md +461 -0
  151. package/src/components/NavigationRailPanel/index.ts +6 -0
  152. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +682 -0
  153. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +363 -0
  154. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +178 -0
  155. package/src/components/NavigationRailTypes/README.md +573 -0
  156. package/src/components/NavigationRailTypes/icons.tsx +76 -0
  157. package/src/components/NavigationRailTypes/index.ts +7 -0
  158. package/src/components/Notification/Notification.stories.tsx +513 -0
  159. package/src/components/Notification/Notification.tsx +145 -0
  160. package/src/components/Notification/Notification.types.ts +142 -0
  161. package/src/components/Notification/README.md +409 -0
  162. package/src/components/Notification/index.ts +3 -0
  163. package/src/components/POSConvention/POSConvention.stories.tsx +235 -0
  164. package/src/components/POSConvention/POSConvention.tsx +129 -0
  165. package/src/components/POSConvention/POSConvention.types.ts +38 -0
  166. package/src/components/POSConvention/README.md +123 -0
  167. package/src/components/POSConvention/icons.tsx +45 -0
  168. package/src/components/POSConvention/index.ts +3 -0
  169. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -0
  170. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -0
  171. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -0
  172. package/src/components/POSLocationButton/README.md +253 -0
  173. package/src/components/POSLocationButton/icons.tsx +120 -0
  174. package/src/components/POSLocationButton/index.ts +14 -0
  175. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -0
  176. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -0
  177. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -0
  178. package/src/components/POSNumberButton/README.md +321 -0
  179. package/src/components/POSNumberButton/index.ts +3 -0
  180. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -0
  181. package/src/components/POSProductButton/POSProductButton.tsx +152 -0
  182. package/src/components/POSProductButton/POSProductButton.types.ts +46 -0
  183. package/src/components/POSProductButton/README.md +269 -0
  184. package/src/components/POSProductButton/index.ts +2 -0
  185. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -0
  186. package/src/components/POSProductCard/POSProductCard.tsx +208 -0
  187. package/src/components/POSProductCard/POSProductCard.types.ts +76 -0
  188. package/src/components/POSProductCard/README.md +179 -0
  189. package/src/components/POSProductCard/icons.tsx +26 -0
  190. package/src/components/POSProductCard/index.ts +2 -0
  191. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -0
  192. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -0
  193. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -0
  194. package/src/components/POSProductSidebarItems/README.md +198 -0
  195. package/src/components/POSProductSidebarItems/icons.tsx +21 -0
  196. package/src/components/POSProductSidebarItems/index.ts +3 -0
  197. package/src/components/POSTable/POSTable.stories.tsx +737 -0
  198. package/src/components/POSTable/POSTable.tsx +401 -0
  199. package/src/components/POSTable/POSTable.types.ts +83 -0
  200. package/src/components/POSTable/README.md +286 -0
  201. package/src/components/POSTable/index.ts +7 -0
  202. package/src/components/Pagination/Pagination.stories.tsx +555 -0
  203. package/src/components/Pagination/Pagination.tsx +286 -0
  204. package/src/components/Pagination/Pagination.types.ts +93 -0
  205. package/src/components/Pagination/README.md +298 -0
  206. package/src/components/Pagination/icons.tsx +47 -0
  207. package/src/components/Pagination/index.ts +3 -0
  208. package/src/components/Quantity/Quantity.stories.tsx +457 -0
  209. package/src/components/Quantity/Quantity.tsx +289 -0
  210. package/src/components/Quantity/Quantity.types.ts +70 -0
  211. package/src/components/Radio/Radio.stories.tsx +523 -0
  212. package/src/components/Radio/Radio.tsx +170 -0
  213. package/src/components/Radio/Radio.types.ts +122 -0
  214. package/src/components/Select/README.md +299 -0
  215. package/src/components/Select/Select.stories.tsx +705 -0
  216. package/src/components/Select/Select.tsx +457 -0
  217. package/src/components/Select/Select.types.ts +148 -0
  218. package/src/components/Select/icons.tsx +25 -0
  219. package/src/components/Select/index.ts +3 -0
  220. package/src/components/SignUpView/SignUpView.stories.tsx +129 -0
  221. package/src/components/SignUpView/SignUpView.tsx +503 -0
  222. package/src/components/SignUpView/SignUpView.types.ts +58 -0
  223. package/src/components/SignUpView/icons.tsx +71 -0
  224. package/src/components/SignUpView/index.ts +3 -0
  225. package/src/components/Switch/README.md +112 -0
  226. package/src/components/Switch/Switch.stories.tsx +550 -0
  227. package/src/components/Switch/Switch.tsx +246 -0
  228. package/src/components/Switch/Switch.types.ts +67 -0
  229. package/src/components/Table/README.md +369 -0
  230. package/src/components/Table/Table.stories.tsx +805 -0
  231. package/src/components/Table/Table.tsx +688 -0
  232. package/src/components/Table/Table.types.ts +204 -0
  233. package/src/components/Table/index.ts +9 -0
  234. package/src/components/Tabs/README.md +201 -0
  235. package/src/components/Tabs/Tabs.stories.tsx +580 -0
  236. package/src/components/Tabs/Tabs.tsx +356 -0
  237. package/src/components/Tabs/Tabs.types.ts +127 -0
  238. package/src/components/Tabs/icons.tsx +129 -0
  239. package/src/components/Tabs/index.ts +11 -0
  240. package/src/components/Textarea/Textarea.stories.tsx +535 -0
  241. package/src/components/Textarea/Textarea.tsx +188 -0
  242. package/src/components/Textarea/Textarea.types.ts +54 -0
  243. package/src/context/ThemeContext.tsx +99 -0
  244. package/src/context/index.ts +1 -0
  245. package/src/index.css +29 -0
  246. package/src/index.ts +133 -0
  247. package/src/main.tsx +10 -0
  248. package/src/views/LayoutCommercial/LayoutCommercial.stories.tsx +374 -0
  249. package/src/views/LayoutCommercial/LayoutCommercial.tsx +125 -0
  250. package/src/views/LayoutCommercial/LayoutCommercial.types.ts +54 -0
  251. package/src/views/LayoutCommercial/README.md +286 -0
  252. package/src/views/LayoutCommercial/index.ts +2 -0
  253. package/src/views/ListView/ListView.stories.tsx +329 -0
  254. package/src/views/ListView/ListView.tsx +570 -0
  255. package/src/views/ListView/ListView.types.ts +211 -0
  256. package/src/views/ListView/icons.tsx +282 -0
  257. package/src/views/ListView/index.ts +11 -0
  258. package/src/views/LoginView/LoginView.stories.tsx +148 -0
  259. package/src/views/LoginView/LoginView.tsx +426 -0
  260. package/src/views/LoginView/LoginView.types.ts +52 -0
  261. package/src/views/LoginView/README.md +396 -0
  262. package/src/views/LoginView/icons.tsx +85 -0
  263. package/src/views/LoginView/index.ts +3 -0
  264. package/src/views/ProductsView/ProductsView.stories.tsx +344 -0
  265. package/src/views/ProductsView/ProductsView.tsx +480 -0
  266. package/src/views/ProductsView/ProductsView.types.ts +238 -0
  267. package/src/views/ProductsView/README.md +312 -0
  268. package/src/views/ProductsView/icons.tsx +38 -0
  269. package/src/views/ProductsView/index.ts +8 -0
  270. package/src/views/RecoverPasswordView/README.md +269 -0
  271. package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +131 -0
  272. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -0
  273. package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +56 -0
  274. package/src/views/RecoverPasswordView/icons.tsx +17 -0
  275. package/src/views/RecoverPasswordView/index.ts +2 -0
  276. package/src/views/SignUpView/SignUpView.stories.tsx +129 -0
  277. package/src/views/SignUpView/SignUpView.tsx +503 -0
  278. package/src/views/SignUpView/SignUpView.types.ts +58 -0
  279. package/src/views/SignUpView/icons.tsx +71 -0
  280. package/src/views/SignUpView/index.ts +3 -0
  281. package/src/views/TableLayoutView/README.md +268 -0
  282. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -0
  283. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -0
  284. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -0
  285. package/src/views/TableLayoutView/icons.tsx +113 -0
  286. package/src/views/TableLayoutView/index.ts +6 -0
  287. package/storybook/main.ts +20 -0
  288. package/storybook/preview.tsx +84 -0
  289. package/storybook/vitest.setup.ts +7 -0
  290. package/tailwind.config.js +128 -0
@@ -0,0 +1,314 @@
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
+ onMouseEnter,
99
+ ariaLabel,
100
+ id,
101
+ showLabelText = true,
102
+ showIcon = true,
103
+ className = '',
104
+ }) => {
105
+ // ===== CLASES DEL ICON CONTAINER =====
106
+ // Según Figma node 4294-22931, el icon container tiene comportamiento diferente
107
+ // según el estado:
108
+ // - Enabled: bg-transparent, hover:bg-primary-custom-100
109
+ // - Hover: bg-primary-custom-100
110
+ // - Selected: bg-primary-custom-100 con overlay (rgba(0,0,0,0.024))
111
+ // - Focus: bg-primary-custom-100 con focus ring y sombras
112
+ // - Disabled: opacidad 55%
113
+ const iconContainerClasses = [
114
+ // Base layout
115
+ 'flex',
116
+ 'flex-col',
117
+ 'items-center',
118
+ 'justify-center',
119
+ 'px-4', // 16px horizontal según Figma
120
+ 'py-1', // 4px vertical según Figma
121
+ 'rounded-full',
122
+ 'overflow-hidden',
123
+ 'shrink-0',
124
+
125
+ // Estados - Background
126
+ selected
127
+ ? // Selected: bg-primary-custom-100 con overlay
128
+ 'bg-primary-custom-100 dark:bg-primary-custom-600/30'
129
+ : // Default/Hover: transparent → hover:bg-primary-custom-100
130
+ 'bg-transparent hover:bg-primary-custom-100 dark:hover:bg-primary-custom-600/20',
131
+
132
+ // Transiciones
133
+ 'transition-colors',
134
+ 'duration-150',
135
+ ].join(' ');
136
+
137
+ // ===== CLASES DEL ICONO =====
138
+ // Tamaño fijo 16x16px según Figma
139
+ // Colores según estado:
140
+ // - Default: text-content-primary
141
+ // - Hover: text-primary-custom-600
142
+ // - Selected: text-primary-custom-600
143
+ // - Disabled: text-content-tertiary
144
+ // Dark mode: invierte colores
145
+ const iconClasses = [
146
+ 'w-4', // 16px
147
+ 'h-4', // 16px
148
+ 'shrink-0',
149
+
150
+ // Colores según estado
151
+ selected
152
+ ? // Selected: primary-custom-600 (azul oscuro)
153
+ 'text-primary-custom-600 dark:text-white'
154
+ : disabled
155
+ ? // Disabled: content-tertiary
156
+ 'text-content-tertiary dark:text-content-tertiary'
157
+ : // Default/Hover: content-primary → hover:primary-custom-600
158
+ 'text-content-primary hover:text-primary-custom-600 dark:text-dark-content-primary dark:hover:text-white',
159
+
160
+ 'transition-colors',
161
+ 'duration-150',
162
+ ].join(' ');
163
+
164
+ // ===== CLASES DEL LABEL =====
165
+ // Tipografía: Label XXSmall (10px Bold, leading 12px) según Figma
166
+ // Color: text-content-primary, dark:text-dark-content-primary
167
+ const labelClasses = [
168
+ // Tipografía: Label XXSmall (10px Bold)
169
+ 'text-xs', // 12px en lugar de text-[10px]
170
+ 'leading-3', // 12px
171
+ 'font-bold',
172
+ 'text-center',
173
+ 'w-full',
174
+ 'min-w-full',
175
+
176
+ // Colores
177
+ 'text-content-primary',
178
+ 'dark:text-dark-content-primary',
179
+
180
+ // Para multiline labels, agregar truncate o text-nowrap si es necesario
181
+ 'break-words',
182
+ ].join(' ');
183
+
184
+ // ===== CLASES DEL CONTENEDOR PRINCIPAL =====
185
+ // Según Figma: ancho 56px, flex-col, gap-1, items-center
186
+ const containerClasses = [
187
+ 'relative',
188
+ 'flex',
189
+ 'flex-col',
190
+ 'items-center',
191
+ 'gap-1', // 4px según Figma
192
+ 'px-0.5', // 2px horizontal según Figma
193
+ 'py-0',
194
+ 'w-14', // 56px según Figma
195
+ 'shrink-0',
196
+
197
+ // Interactividad
198
+ disabled
199
+ ? 'cursor-not-allowed opacity-55 pointer-events-none'
200
+ : 'cursor-pointer',
201
+
202
+ // Focus visible (accesibilidad)
203
+ 'focus:outline-none',
204
+ 'focus-visible:ring-2',
205
+ 'focus-visible:ring-primary-custom-400', // 4px ring
206
+ 'focus-visible:ring-offset-2',
207
+ 'focus-visible:ring-offset-primary-custom-100', // offset #dbeefe según Figma
208
+ 'dark:focus-visible:ring-dark-border-custom',
209
+ 'dark:focus-visible:ring-offset-dark-bg-primary',
210
+
211
+ // Focus sombras adicionales según Figma:
212
+ 'focus-visible:shadow-lg',
213
+ 'dark:focus-visible:shadow-2xl',
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-8
233
+ flex
234
+ items-center
235
+ justify-center
236
+ min-w-3
237
+ h-3
238
+ px-1
239
+ rounded-full
240
+ text-xs
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-8
265
+ w-3
266
+ h-3
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
+ onMouseEnter={onMouseEnter}
286
+ aria-label={ariaLabel || label}
287
+ aria-current={selected ? 'page' : undefined}
288
+ aria-disabled={disabled}
289
+ data-item-id={id}
290
+ data-testid={`navigation-rail-item-${id}`}
291
+ >
292
+ {/* Icon Container */}
293
+ {showIcon && (
294
+ <div className={iconContainerClasses}>
295
+ <span className={iconClasses}>
296
+ {icon}
297
+ </span>
298
+ </div>
299
+ )}
300
+
301
+ {/* Label */}
302
+ {showLabelText && (
303
+ <p className={labelClasses}>
304
+ {label}
305
+ </p>
306
+ )}
307
+
308
+ {/* Badge */}
309
+ {renderBadge()}
310
+ </button>
311
+ );
312
+ };
313
+
314
+ NavigationRailItem.displayName = 'NavigationRailItem';
@@ -0,0 +1,175 @@
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
+ * Handler para evento mouse enter del item
113
+ *
114
+ * Se ejecuta cuando el cursor entra en el área del item.
115
+ * Útil para mostrar paneles o menús contextuales.
116
+ */
117
+ onMouseEnter?: () => void;
118
+
119
+ /**
120
+ * Label para accesibilidad (ARIA-label)
121
+ *
122
+ * Si no se proporciona, usa el valor de `label`
123
+ *
124
+ * @example
125
+ * <NavigationRailItem label="Inicio" ariaLabel="Ir a la página de inicio" />
126
+ */
127
+ ariaLabel?: string;
128
+
129
+ /**
130
+ * ID único del item
131
+ *
132
+ * Usado para identificar el item en callbacks y para navegación.
133
+ * Se añade como atributo data-item-id en el elemento DOM.
134
+ *
135
+ * @example
136
+ * <NavigationRailItem id="home" label="Inicio" />
137
+ */
138
+ id?: string;
139
+
140
+ /**
141
+ * Mostrar el label del texto
142
+ *
143
+ * Si es false, solo se muestra el icono
144
+ *
145
+ * @default true
146
+ */
147
+ showLabelText?: boolean;
148
+
149
+ /**
150
+ * Mostrar icono
151
+ *
152
+ * Si es false, solo se muestra el label
153
+ *
154
+ * @default true
155
+ */
156
+ showIcon?: boolean;
157
+
158
+ /**
159
+ * Clases CSS adicionales personalizadas
160
+ *
161
+ * Se aplican al contenedor principal (button)
162
+ */
163
+ className?: string;
164
+ }
165
+
166
+ /**
167
+ * Estados posibles del componente según Figma
168
+ *
169
+ * - `Enabled`: Estado normal, sin interacción
170
+ * - `Hover`: Mouse over el item
171
+ * - `Selected`: Item actualmente seleccionado
172
+ * - `Focus`: Keyboard focus (accesibilidad)
173
+ * - `Disabled`: Item deshabilitado, no interactivo
174
+ */
175
+ export type NavigationRailItemState = 'Enabled' | 'Hover' | 'Selected' | 'Focus' | 'Disabled';