siesa-ui-kit 1.0.1 → 1.0.2

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 (297) hide show
  1. package/bin/install.cjs +502 -0
  2. package/bin/prepare-publish.cjs +28 -0
  3. package/bin/restore-folders.cjs +28 -0
  4. package/claude/settings.local.json +7 -0
  5. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts +101 -0
  6. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +1 -0
  7. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +95 -0
  8. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +1 -0
  9. package/dist/components/DropdownItemCollapsible/icons.d.ts +19 -0
  10. package/dist/components/DropdownItemCollapsible/icons.d.ts.map +1 -0
  11. package/dist/components/DropdownItemCollapsible/index.d.ts +9 -0
  12. package/dist/components/DropdownItemCollapsible/index.d.ts.map +1 -0
  13. package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts +75 -0
  14. package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts.map +1 -0
  15. package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts +85 -0
  16. package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts.map +1 -0
  17. package/dist/components/DropdownItemHeading/icons.d.ts +48 -0
  18. package/dist/components/DropdownItemHeading/icons.d.ts.map +1 -0
  19. package/dist/components/DropdownItemHeading/index.d.ts +4 -0
  20. package/dist/components/DropdownItemHeading/index.d.ts.map +1 -0
  21. package/dist/components/LoginView/LoginView.d.ts +36 -0
  22. package/dist/components/LoginView/LoginView.d.ts.map +1 -0
  23. package/dist/components/LoginView/LoginView.types.d.ts +46 -0
  24. package/dist/components/LoginView/LoginView.types.d.ts.map +1 -0
  25. package/dist/components/LoginView/icons.d.ts +18 -0
  26. package/dist/components/LoginView/icons.d.ts.map +1 -0
  27. package/dist/components/LoginView/index.d.ts +4 -0
  28. package/dist/components/LoginView/index.d.ts.map +1 -0
  29. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts +90 -0
  30. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +1 -0
  31. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +155 -0
  32. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +1 -0
  33. package/dist/components/NavigationRailItem/index.d.ts +3 -0
  34. package/dist/components/NavigationRailItem/index.d.ts.map +1 -0
  35. package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts +124 -0
  36. package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts.map +1 -0
  37. package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts +154 -0
  38. package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts.map +1 -0
  39. package/dist/components/NavigationRailPanel/index.d.ts +3 -0
  40. package/dist/components/NavigationRailPanel/index.d.ts.map +1 -0
  41. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts +99 -0
  42. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +1 -0
  43. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +111 -0
  44. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +1 -0
  45. package/dist/components/NavigationRailTypes/icons.d.ts +58 -0
  46. package/dist/components/NavigationRailTypes/icons.d.ts.map +1 -0
  47. package/dist/components/NavigationRailTypes/index.d.ts +4 -0
  48. package/dist/components/NavigationRailTypes/index.d.ts.map +1 -0
  49. package/dist/components/SignUpView/SignUpView.d.ts +38 -0
  50. package/dist/components/SignUpView/SignUpView.d.ts.map +1 -0
  51. package/dist/components/SignUpView/SignUpView.types.d.ts +51 -0
  52. package/dist/components/SignUpView/SignUpView.types.d.ts.map +1 -0
  53. package/dist/components/SignUpView/icons.d.ts +18 -0
  54. package/dist/components/SignUpView/icons.d.ts.map +1 -0
  55. package/dist/components/SignUpView/index.d.ts +4 -0
  56. package/dist/components/SignUpView/index.d.ts.map +1 -0
  57. package/dist/index.d.ts +30 -0
  58. package/dist/index.d.ts.map +1 -1
  59. package/dist/siesa-ui-kit.cjs +906 -66
  60. package/dist/siesa-ui-kit.cjs.map +1 -1
  61. package/dist/siesa-ui-kit.mjs +3547 -411
  62. package/dist/siesa-ui-kit.mjs.map +1 -1
  63. package/docs/border-radius.md +1261 -0
  64. package/docs/colors.md +832 -0
  65. package/docs/dark-mode-guide.md +1426 -0
  66. package/docs/filters.md +1243 -0
  67. package/docs/icons.md +1283 -0
  68. package/docs/shadows.md +1377 -0
  69. package/docs/spacing.md +1684 -0
  70. package/docs/typography.md +1268 -0
  71. package/package.json +21 -3
  72. package/postcss.config.cjs +6 -0
  73. package/public/,Business Logo.png +0 -0
  74. package/public/.Siesa Logo.png +0 -0
  75. package/public/bg_siesa.png +0 -0
  76. package/public/siesa_logo_mobile.png +0 -0
  77. package/public/vite.svg +1 -0
  78. package/src/App.css +42 -0
  79. package/src/App.tsx +8 -0
  80. package/src/ButtonTest.tsx +147 -0
  81. package/src/assets/fonts/README.md +261 -0
  82. package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
  83. package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
  84. package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
  85. package/src/assets/react.svg +1 -0
  86. package/src/components/Alert/Alert.stories.tsx +332 -0
  87. package/src/components/Alert/Alert.tsx +106 -0
  88. package/src/components/Alert/Alert.types.ts +54 -0
  89. package/src/components/Avatar/Avatar.stories.tsx +494 -0
  90. package/src/components/Avatar/Avatar.tsx +143 -0
  91. package/src/components/Avatar/Avatar.types.ts +53 -0
  92. package/src/components/Badge/Badge.stories.tsx +339 -0
  93. package/src/components/Badge/Badge.tsx +278 -0
  94. package/src/components/Badge/Badge.types.ts +58 -0
  95. package/src/components/Button/Button.stories.tsx +950 -0
  96. package/src/components/Button/Button.tsx +337 -0
  97. package/src/components/Button/Button.types.ts +180 -0
  98. package/src/components/Button/icons.tsx +87 -0
  99. package/src/components/Button/index.ts +3 -0
  100. package/src/components/Checkbox/Checkbox.stories.tsx +453 -0
  101. package/src/components/Checkbox/Checkbox.tsx +208 -0
  102. package/src/components/Checkbox/Checkbox.types.ts +61 -0
  103. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -0
  104. package/src/components/DescriptionList/DescriptionList.tsx +96 -0
  105. package/src/components/DescriptionList/DescriptionList.types.ts +29 -0
  106. package/src/components/Divider/Divider.stories.tsx +263 -0
  107. package/src/components/Divider/Divider.tsx +80 -0
  108. package/src/components/Divider/Divider.types.ts +24 -0
  109. package/src/components/Dropdown/Dropdown.stories.tsx +552 -0
  110. package/src/components/Dropdown/Dropdown.tsx +422 -0
  111. package/src/components/Dropdown/Dropdown.types.ts +146 -0
  112. package/src/components/Dropdown/README.md +266 -0
  113. package/src/components/Dropdown/icons.tsx +72 -0
  114. package/src/components/Dropdown/index.ts +8 -0
  115. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.stories.tsx +317 -0
  116. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.tsx +287 -0
  117. package/src/components/DropdownItemCollapsible/DropdownItemCollapsible.types.ts +111 -0
  118. package/src/components/DropdownItemCollapsible/README.md +264 -0
  119. package/src/components/DropdownItemCollapsible/icons.tsx +57 -0
  120. package/src/components/DropdownItemCollapsible/index.ts +12 -0
  121. package/src/components/DropdownItemHeading/DropdownItemHeading.stories.tsx +386 -0
  122. package/src/components/DropdownItemHeading/DropdownItemHeading.tsx +216 -0
  123. package/src/components/DropdownItemHeading/DropdownItemHeading.types.ts +93 -0
  124. package/src/components/DropdownItemHeading/README.md +573 -0
  125. package/src/components/DropdownItemHeading/icons.tsx +125 -0
  126. package/src/components/DropdownItemHeading/index.ts +3 -0
  127. package/src/components/Input/Input.stories.tsx +583 -0
  128. package/src/components/Input/Input.tsx +204 -0
  129. package/src/components/Input/Input.types.ts +80 -0
  130. package/src/components/Input/icons.tsx +145 -0
  131. package/src/components/Input/index.ts +2 -0
  132. package/src/components/LoginView/LoginView.stories.tsx +148 -0
  133. package/src/components/LoginView/LoginView.tsx +426 -0
  134. package/src/components/LoginView/LoginView.types.ts +52 -0
  135. package/src/components/LoginView/README.md +396 -0
  136. package/src/components/LoginView/icons.tsx +85 -0
  137. package/src/components/LoginView/index.ts +3 -0
  138. package/src/components/Navbar/Navbar.stories.tsx +810 -0
  139. package/src/components/Navbar/Navbar.tsx +755 -0
  140. package/src/components/Navbar/Navbar.types.ts +219 -0
  141. package/src/components/Navbar/README.md +279 -0
  142. package/src/components/Navbar/icons.tsx +102 -0
  143. package/src/components/Navbar/index.ts +8 -0
  144. package/src/components/NavigationBar/NavigationBar.stories.tsx +406 -0
  145. package/src/components/NavigationBar/NavigationBar.tsx +246 -0
  146. package/src/components/NavigationBar/NavigationBar.types.ts +74 -0
  147. package/src/components/NavigationBar/README.md +469 -0
  148. package/src/components/NavigationBar/index.ts +2 -0
  149. package/src/components/NavigationRail/NavigationRail.stories.tsx +417 -0
  150. package/src/components/NavigationRail/NavigationRail.tsx +418 -0
  151. package/src/components/NavigationRail/NavigationRail.types.ts +109 -0
  152. package/src/components/NavigationRail/README.md +224 -0
  153. package/src/components/NavigationRail/index.ts +2 -0
  154. package/src/components/NavigationRailItem/NavigationRailItem.stories.tsx +667 -0
  155. package/src/components/NavigationRailItem/NavigationRailItem.tsx +313 -0
  156. package/src/components/NavigationRailItem/NavigationRailItem.types.ts +167 -0
  157. package/src/components/NavigationRailItem/README.md +476 -0
  158. package/src/components/NavigationRailItem/index.ts +2 -0
  159. package/src/components/NavigationRailPanel/NavigationRailPanel.stories.tsx +462 -0
  160. package/src/components/NavigationRailPanel/NavigationRailPanel.tsx +332 -0
  161. package/src/components/NavigationRailPanel/NavigationRailPanel.types.ts +178 -0
  162. package/src/components/NavigationRailPanel/README.md +461 -0
  163. package/src/components/NavigationRailPanel/index.ts +6 -0
  164. package/src/components/NavigationRailTypes/NavigationRailTypes.stories.tsx +528 -0
  165. package/src/components/NavigationRailTypes/NavigationRailTypes.tsx +378 -0
  166. package/src/components/NavigationRailTypes/NavigationRailTypes.types.ts +130 -0
  167. package/src/components/NavigationRailTypes/README.md +573 -0
  168. package/src/components/NavigationRailTypes/icons.tsx +141 -0
  169. package/src/components/NavigationRailTypes/index.ts +7 -0
  170. package/src/components/Notification/Notification.stories.tsx +513 -0
  171. package/src/components/Notification/Notification.tsx +145 -0
  172. package/src/components/Notification/Notification.types.ts +142 -0
  173. package/src/components/Notification/README.md +409 -0
  174. package/src/components/Notification/index.ts +3 -0
  175. package/src/components/POSConvention/POSConvention.stories.tsx +235 -0
  176. package/src/components/POSConvention/POSConvention.tsx +129 -0
  177. package/src/components/POSConvention/POSConvention.types.ts +38 -0
  178. package/src/components/POSConvention/README.md +123 -0
  179. package/src/components/POSConvention/icons.tsx +45 -0
  180. package/src/components/POSConvention/index.ts +3 -0
  181. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -0
  182. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -0
  183. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -0
  184. package/src/components/POSLocationButton/README.md +253 -0
  185. package/src/components/POSLocationButton/icons.tsx +120 -0
  186. package/src/components/POSLocationButton/index.ts +14 -0
  187. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -0
  188. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -0
  189. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -0
  190. package/src/components/POSNumberButton/README.md +321 -0
  191. package/src/components/POSNumberButton/index.ts +3 -0
  192. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -0
  193. package/src/components/POSProductButton/POSProductButton.tsx +152 -0
  194. package/src/components/POSProductButton/POSProductButton.types.ts +46 -0
  195. package/src/components/POSProductButton/README.md +269 -0
  196. package/src/components/POSProductButton/index.ts +2 -0
  197. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -0
  198. package/src/components/POSProductCard/POSProductCard.tsx +208 -0
  199. package/src/components/POSProductCard/POSProductCard.types.ts +76 -0
  200. package/src/components/POSProductCard/README.md +179 -0
  201. package/src/components/POSProductCard/icons.tsx +26 -0
  202. package/src/components/POSProductCard/index.ts +2 -0
  203. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -0
  204. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -0
  205. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -0
  206. package/src/components/POSProductSidebarItems/README.md +198 -0
  207. package/src/components/POSProductSidebarItems/icons.tsx +21 -0
  208. package/src/components/POSProductSidebarItems/index.ts +3 -0
  209. package/src/components/POSTable/POSTable.stories.tsx +737 -0
  210. package/src/components/POSTable/POSTable.tsx +401 -0
  211. package/src/components/POSTable/POSTable.types.ts +83 -0
  212. package/src/components/POSTable/README.md +286 -0
  213. package/src/components/POSTable/index.ts +7 -0
  214. package/src/components/Pagination/Pagination.stories.tsx +555 -0
  215. package/src/components/Pagination/Pagination.tsx +286 -0
  216. package/src/components/Pagination/Pagination.types.ts +93 -0
  217. package/src/components/Pagination/README.md +298 -0
  218. package/src/components/Pagination/icons.tsx +47 -0
  219. package/src/components/Pagination/index.ts +3 -0
  220. package/src/components/Quantity/Quantity.stories.tsx +457 -0
  221. package/src/components/Quantity/Quantity.tsx +289 -0
  222. package/src/components/Quantity/Quantity.types.ts +70 -0
  223. package/src/components/Radio/Radio.stories.tsx +523 -0
  224. package/src/components/Radio/Radio.tsx +170 -0
  225. package/src/components/Radio/Radio.types.ts +122 -0
  226. package/src/components/Select/README.md +299 -0
  227. package/src/components/Select/Select.stories.tsx +673 -0
  228. package/src/components/Select/Select.tsx +454 -0
  229. package/src/components/Select/Select.types.ts +148 -0
  230. package/src/components/Select/icons.tsx +50 -0
  231. package/src/components/Select/index.ts +3 -0
  232. package/src/components/SignUpView/SignUpView.stories.tsx +129 -0
  233. package/src/components/SignUpView/SignUpView.tsx +503 -0
  234. package/src/components/SignUpView/SignUpView.types.ts +58 -0
  235. package/src/components/SignUpView/icons.tsx +71 -0
  236. package/src/components/SignUpView/index.ts +3 -0
  237. package/src/components/Switch/README.md +112 -0
  238. package/src/components/Switch/Switch.stories.tsx +550 -0
  239. package/src/components/Switch/Switch.tsx +246 -0
  240. package/src/components/Switch/Switch.types.ts +67 -0
  241. package/src/components/Table/README.md +369 -0
  242. package/src/components/Table/Table.stories.tsx +805 -0
  243. package/src/components/Table/Table.tsx +688 -0
  244. package/src/components/Table/Table.types.ts +204 -0
  245. package/src/components/Table/index.ts +9 -0
  246. package/src/components/Tabs/README.md +201 -0
  247. package/src/components/Tabs/Tabs.stories.tsx +580 -0
  248. package/src/components/Tabs/Tabs.tsx +356 -0
  249. package/src/components/Tabs/Tabs.types.ts +127 -0
  250. package/src/components/Tabs/icons.tsx +129 -0
  251. package/src/components/Tabs/index.ts +11 -0
  252. package/src/components/Textarea/Textarea.stories.tsx +535 -0
  253. package/src/components/Textarea/Textarea.tsx +188 -0
  254. package/src/components/Textarea/Textarea.types.ts +54 -0
  255. package/src/context/ThemeContext.tsx +99 -0
  256. package/src/context/index.ts +1 -0
  257. package/src/index.css +29 -0
  258. package/src/index.ts +102 -0
  259. package/src/main.tsx +10 -0
  260. package/src/views/ListView/ListView.stories.tsx +329 -0
  261. package/src/views/ListView/ListView.tsx +570 -0
  262. package/src/views/ListView/ListView.types.ts +211 -0
  263. package/src/views/ListView/icons.tsx +282 -0
  264. package/src/views/ListView/index.ts +11 -0
  265. package/src/views/LoginView/LoginView.stories.tsx +148 -0
  266. package/src/views/LoginView/LoginView.tsx +426 -0
  267. package/src/views/LoginView/LoginView.types.ts +52 -0
  268. package/src/views/LoginView/README.md +396 -0
  269. package/src/views/LoginView/icons.tsx +85 -0
  270. package/src/views/LoginView/index.ts +3 -0
  271. package/src/views/ProductsView/ProductsView.stories.tsx +344 -0
  272. package/src/views/ProductsView/ProductsView.tsx +480 -0
  273. package/src/views/ProductsView/ProductsView.types.ts +238 -0
  274. package/src/views/ProductsView/README.md +312 -0
  275. package/src/views/ProductsView/icons.tsx +38 -0
  276. package/src/views/ProductsView/index.ts +8 -0
  277. package/src/views/RecoverPasswordView/README.md +269 -0
  278. package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +131 -0
  279. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -0
  280. package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +56 -0
  281. package/src/views/RecoverPasswordView/icons.tsx +17 -0
  282. package/src/views/RecoverPasswordView/index.ts +2 -0
  283. package/src/views/SignUpView/SignUpView.stories.tsx +129 -0
  284. package/src/views/SignUpView/SignUpView.tsx +503 -0
  285. package/src/views/SignUpView/SignUpView.types.ts +58 -0
  286. package/src/views/SignUpView/icons.tsx +71 -0
  287. package/src/views/SignUpView/index.ts +3 -0
  288. package/src/views/TableLayoutView/README.md +268 -0
  289. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -0
  290. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -0
  291. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -0
  292. package/src/views/TableLayoutView/icons.tsx +113 -0
  293. package/src/views/TableLayoutView/index.ts +6 -0
  294. package/storybook/main.ts +20 -0
  295. package/storybook/preview.tsx +84 -0
  296. package/storybook/vitest.setup.ts +7 -0
  297. package/tailwind.config.js +128 -0
@@ -0,0 +1,313 @@
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';
@@ -0,0 +1,167 @@
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';