siesa-ui-kit 1.0.3 → 1.0.5

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 (459) hide show
  1. package/README.md +28 -54
  2. package/claude/agents/siesa-ui-kit-specialist.md +2401 -0
  3. package/claude/prompts/component-template.md +121 -0
  4. package/claude/settings.local.json +61 -0
  5. package/docs/border-radius.md +1261 -0
  6. package/docs/colors.md +832 -0
  7. package/docs/dark-mode-guide.md +1426 -0
  8. package/docs/filters.md +1243 -0
  9. package/docs/icons.md +1283 -0
  10. package/docs/shadows.md +1377 -0
  11. package/docs/spacing.md +1684 -0
  12. package/docs/typography.md +1268 -0
  13. package/package.json +14 -34
  14. package/postcss.config.cjs +6 -0
  15. package/public/,Business Logo.png +0 -0
  16. package/public/.Siesa Logo.png +0 -0
  17. package/public/bg_siesa.png +0 -0
  18. package/public/siesa_logo_mobile.png +0 -0
  19. package/public/vite.svg +1 -0
  20. package/src/App.css +42 -0
  21. package/src/App.tsx +8 -0
  22. package/src/ButtonTest.tsx +147 -0
  23. package/src/assets/fonts/README.md +261 -0
  24. package/src/assets/fonts/SiesaBT/SiesaBT-Bold.otf +0 -0
  25. package/src/assets/fonts/SiesaBT/SiesaBT-Light.otf +0 -0
  26. package/src/assets/fonts/SiesaBT/SiesaBT-Regular.otf +0 -0
  27. package/src/assets/react.svg +1 -0
  28. package/src/components/Alert/Alert.stories.tsx +332 -0
  29. package/src/components/Alert/Alert.tsx +106 -0
  30. package/src/components/Alert/Alert.types.ts +54 -0
  31. package/src/components/Avatar/Avatar.stories.tsx +494 -0
  32. package/src/components/Avatar/Avatar.tsx +143 -0
  33. package/src/components/Avatar/Avatar.types.ts +53 -0
  34. package/src/components/Badge/Badge.stories.tsx +339 -0
  35. package/src/components/Badge/Badge.tsx +278 -0
  36. package/src/components/Badge/Badge.types.ts +58 -0
  37. package/src/components/Button/Button.stories.tsx +950 -0
  38. package/src/components/Button/Button.tsx +337 -0
  39. package/src/components/Button/Button.types.ts +180 -0
  40. package/src/components/Button/icons.tsx +87 -0
  41. package/{dist/components/Button/index.d.ts → src/components/Button/index.ts} +3 -4
  42. package/src/components/Checkbox/Checkbox.stories.tsx +453 -0
  43. package/src/components/Checkbox/Checkbox.tsx +208 -0
  44. package/src/components/Checkbox/Checkbox.types.ts +61 -0
  45. package/src/components/DescriptionList/DescriptionList.stories.tsx +250 -0
  46. package/src/components/DescriptionList/DescriptionList.tsx +96 -0
  47. package/src/components/DescriptionList/DescriptionList.types.ts +29 -0
  48. package/src/components/Divider/Divider.stories.tsx +263 -0
  49. package/src/components/Divider/Divider.tsx +80 -0
  50. package/src/components/Divider/Divider.types.ts +24 -0
  51. package/src/components/Dropdown/Dropdown.stories.tsx +552 -0
  52. package/src/components/Dropdown/Dropdown.tsx +422 -0
  53. package/src/components/Dropdown/Dropdown.types.ts +146 -0
  54. package/src/components/Dropdown/README.md +266 -0
  55. package/src/components/Dropdown/icons.tsx +72 -0
  56. package/{dist/components/Dropdown/index.d.ts → src/components/Dropdown/index.ts} +8 -4
  57. package/src/components/Input/Input.stories.tsx +583 -0
  58. package/src/components/Input/Input.tsx +204 -0
  59. package/src/components/Input/Input.types.ts +80 -0
  60. package/src/components/Input/icons.tsx +145 -0
  61. package/{dist/components/Input/index.d.ts → src/components/Input/index.ts} +2 -3
  62. package/src/components/LoginView/LoginView.stories.tsx +148 -0
  63. package/src/components/LoginView/LoginView.tsx +426 -0
  64. package/src/components/LoginView/LoginView.types.ts +52 -0
  65. package/src/components/LoginView/README.md +396 -0
  66. package/src/components/LoginView/icons.tsx +85 -0
  67. package/{dist/components/LoginView/index.d.ts → src/components/LoginView/index.ts} +3 -4
  68. package/src/components/Navbar/Navbar.stories.tsx +810 -0
  69. package/src/components/Navbar/Navbar.tsx +755 -0
  70. package/src/components/Navbar/Navbar.types.ts +219 -0
  71. package/src/components/Navbar/README.md +279 -0
  72. package/src/components/Navbar/icons.tsx +102 -0
  73. package/src/components/Navbar/index.ts +8 -0
  74. package/src/components/NavigationBar/NavigationBar.stories.tsx +406 -0
  75. package/src/components/NavigationBar/NavigationBar.tsx +246 -0
  76. package/src/components/NavigationBar/NavigationBar.types.ts +74 -0
  77. package/src/components/NavigationBar/README.md +469 -0
  78. package/{dist/components/NavigationBar/index.d.ts → src/components/NavigationBar/index.ts} +2 -3
  79. package/src/components/NavigationRail/NavigationRail.stories.tsx +417 -0
  80. package/src/components/NavigationRail/NavigationRail.tsx +418 -0
  81. package/src/components/NavigationRail/NavigationRail.types.ts +109 -0
  82. package/src/components/NavigationRail/README.md +224 -0
  83. package/{dist/components/NavigationRail/index.d.ts → src/components/NavigationRail/index.ts} +2 -3
  84. package/src/components/Notification/Notification.stories.tsx +513 -0
  85. package/src/components/Notification/Notification.tsx +145 -0
  86. package/src/components/Notification/Notification.types.ts +142 -0
  87. package/src/components/Notification/README.md +409 -0
  88. package/{dist/components/Notification/index.d.ts → src/components/Notification/index.ts} +3 -3
  89. package/src/components/POSConvention/POSConvention.stories.tsx +235 -0
  90. package/src/components/POSConvention/POSConvention.tsx +129 -0
  91. package/{dist/components/POSConvention/POSConvention.types.d.ts → src/components/POSConvention/POSConvention.types.ts} +38 -37
  92. package/src/components/POSConvention/README.md +123 -0
  93. package/src/components/POSConvention/icons.tsx +45 -0
  94. package/{dist/components/POSConvention/index.d.ts → src/components/POSConvention/index.ts} +3 -4
  95. package/src/components/POSLocationButton/POSLocationButton.stories.tsx +531 -0
  96. package/src/components/POSLocationButton/POSLocationButton.tsx +247 -0
  97. package/src/components/POSLocationButton/POSLocationButton.types.ts +87 -0
  98. package/src/components/POSLocationButton/README.md +253 -0
  99. package/src/components/POSLocationButton/icons.tsx +120 -0
  100. package/src/components/POSLocationButton/index.ts +14 -0
  101. package/src/components/POSNumberButton/POSNumberButton.stories.tsx +415 -0
  102. package/src/components/POSNumberButton/POSNumberButton.tsx +179 -0
  103. package/src/components/POSNumberButton/POSNumberButton.types.ts +51 -0
  104. package/src/components/POSNumberButton/README.md +321 -0
  105. package/{dist/components/POSNumberButton/index.d.ts → src/components/POSNumberButton/index.ts} +3 -3
  106. package/src/components/POSProductButton/POSProductButton.stories.tsx +318 -0
  107. package/src/components/POSProductButton/POSProductButton.tsx +152 -0
  108. package/src/components/POSProductButton/POSProductButton.types.ts +46 -0
  109. package/src/components/POSProductButton/README.md +269 -0
  110. package/{dist/components/POSProductButton/index.d.ts → src/components/POSProductButton/index.ts} +2 -3
  111. package/src/components/POSProductCard/POSProductCard.stories.tsx +642 -0
  112. package/src/components/POSProductCard/POSProductCard.tsx +208 -0
  113. package/src/components/POSProductCard/POSProductCard.types.ts +76 -0
  114. package/src/components/POSProductCard/README.md +179 -0
  115. package/src/components/POSProductCard/icons.tsx +26 -0
  116. package/{dist/components/POSProductCard/index.d.ts → src/components/POSProductCard/index.ts} +2 -3
  117. package/src/components/POSProductSidebarItems/POSProductSidebarItems.stories.tsx +753 -0
  118. package/src/components/POSProductSidebarItems/POSProductSidebarItems.tsx +332 -0
  119. package/src/components/POSProductSidebarItems/POSProductSidebarItems.types.ts +119 -0
  120. package/src/components/POSProductSidebarItems/README.md +198 -0
  121. package/src/components/POSProductSidebarItems/icons.tsx +21 -0
  122. package/{dist/components/POSProductSidebarItems/index.d.ts → src/components/POSProductSidebarItems/index.ts} +3 -4
  123. package/src/components/POSTable/POSTable.stories.tsx +737 -0
  124. package/src/components/POSTable/POSTable.tsx +401 -0
  125. package/src/components/POSTable/POSTable.types.ts +83 -0
  126. package/src/components/POSTable/README.md +286 -0
  127. package/src/components/POSTable/index.ts +7 -0
  128. package/src/components/Pagination/Pagination.stories.tsx +555 -0
  129. package/src/components/Pagination/Pagination.tsx +286 -0
  130. package/src/components/Pagination/Pagination.types.ts +93 -0
  131. package/src/components/Pagination/README.md +298 -0
  132. package/src/components/Pagination/icons.tsx +47 -0
  133. package/{dist/components/Pagination/index.d.ts → src/components/Pagination/index.ts} +3 -4
  134. package/src/components/Quantity/Quantity.stories.tsx +457 -0
  135. package/src/components/Quantity/Quantity.tsx +289 -0
  136. package/src/components/Quantity/Quantity.types.ts +70 -0
  137. package/src/components/Radio/Radio.stories.tsx +523 -0
  138. package/src/components/Radio/Radio.tsx +170 -0
  139. package/src/components/Radio/Radio.types.ts +122 -0
  140. package/src/components/Select/README.md +299 -0
  141. package/src/components/Select/Select.stories.tsx +673 -0
  142. package/src/components/Select/Select.tsx +454 -0
  143. package/src/components/Select/Select.types.ts +148 -0
  144. package/src/components/Select/icons.tsx +50 -0
  145. package/{dist/components/Select/index.d.ts → src/components/Select/index.ts} +3 -4
  146. package/src/components/SignUpView/SignUpView.stories.tsx +129 -0
  147. package/src/components/SignUpView/SignUpView.tsx +503 -0
  148. package/src/components/SignUpView/SignUpView.types.ts +58 -0
  149. package/src/components/SignUpView/icons.tsx +71 -0
  150. package/{dist/components/SignUpView/index.d.ts → src/components/SignUpView/index.ts} +3 -4
  151. package/src/components/Switch/README.md +112 -0
  152. package/src/components/Switch/Switch.stories.tsx +550 -0
  153. package/src/components/Switch/Switch.tsx +246 -0
  154. package/src/components/Switch/Switch.types.ts +67 -0
  155. package/src/components/Table/README.md +369 -0
  156. package/src/components/Table/Table.stories.tsx +805 -0
  157. package/src/components/Table/Table.tsx +688 -0
  158. package/src/components/Table/Table.types.ts +204 -0
  159. package/src/components/Table/index.ts +9 -0
  160. package/src/components/Tabs/README.md +201 -0
  161. package/src/components/Tabs/Tabs.stories.tsx +580 -0
  162. package/src/components/Tabs/Tabs.tsx +356 -0
  163. package/src/components/Tabs/Tabs.types.ts +127 -0
  164. package/src/components/Tabs/icons.tsx +129 -0
  165. package/src/components/Tabs/index.ts +11 -0
  166. package/src/components/Textarea/Textarea.stories.tsx +535 -0
  167. package/src/components/Textarea/Textarea.tsx +188 -0
  168. package/src/components/Textarea/Textarea.types.ts +54 -0
  169. package/src/context/ThemeContext.tsx +99 -0
  170. package/{dist/context/index.d.ts → src/context/index.ts} +1 -2
  171. package/src/index.css +29 -0
  172. package/src/index.ts +39 -0
  173. package/src/main.tsx +10 -0
  174. package/src/views/ProductsView/ProductsView.stories.tsx +344 -0
  175. package/src/views/ProductsView/ProductsView.tsx +480 -0
  176. package/src/views/ProductsView/ProductsView.types.ts +238 -0
  177. package/src/views/ProductsView/README.md +312 -0
  178. package/src/views/ProductsView/icons.tsx +38 -0
  179. package/src/views/ProductsView/index.ts +8 -0
  180. package/src/views/RecoverPasswordView/README.md +269 -0
  181. package/src/views/RecoverPasswordView/RecoverPasswordView.stories.tsx +131 -0
  182. package/src/views/RecoverPasswordView/RecoverPasswordView.tsx +376 -0
  183. package/src/views/RecoverPasswordView/RecoverPasswordView.types.ts +56 -0
  184. package/src/views/RecoverPasswordView/icons.tsx +17 -0
  185. package/{dist/views/RecoverPasswordView/index.d.ts → src/views/RecoverPasswordView/index.ts} +2 -3
  186. package/src/views/TableLayoutView/README.md +268 -0
  187. package/src/views/TableLayoutView/TableLayoutView.stories.tsx +235 -0
  188. package/src/views/TableLayoutView/TableLayoutView.tsx +461 -0
  189. package/src/views/TableLayoutView/TableLayoutView.types.ts +209 -0
  190. package/src/views/TableLayoutView/icons.tsx +113 -0
  191. package/src/views/TableLayoutView/index.ts +6 -0
  192. package/storybook/main.ts +20 -0
  193. package/storybook/preview.tsx +84 -0
  194. package/storybook/vitest.setup.ts +7 -0
  195. package/tailwind.config.js +128 -0
  196. package/dist/ButtonTest.d.ts +0 -6
  197. package/dist/ButtonTest.d.ts.map +0 -1
  198. package/dist/components/Alert/Alert.d.ts +0 -23
  199. package/dist/components/Alert/Alert.d.ts.map +0 -1
  200. package/dist/components/Alert/Alert.types.d.ts +0 -46
  201. package/dist/components/Alert/Alert.types.d.ts.map +0 -1
  202. package/dist/components/Avatar/Avatar.d.ts +0 -41
  203. package/dist/components/Avatar/Avatar.d.ts.map +0 -1
  204. package/dist/components/Avatar/Avatar.types.d.ts +0 -46
  205. package/dist/components/Avatar/Avatar.types.d.ts.map +0 -1
  206. package/dist/components/Badge/Badge.d.ts +0 -42
  207. package/dist/components/Badge/Badge.d.ts.map +0 -1
  208. package/dist/components/Badge/Badge.types.d.ts +0 -32
  209. package/dist/components/Badge/Badge.types.d.ts.map +0 -1
  210. package/dist/components/Button/Button.d.ts +0 -84
  211. package/dist/components/Button/Button.d.ts.map +0 -1
  212. package/dist/components/Button/Button.types.d.ts +0 -162
  213. package/dist/components/Button/Button.types.d.ts.map +0 -1
  214. package/dist/components/Button/icons.d.ts +0 -26
  215. package/dist/components/Button/icons.d.ts.map +0 -1
  216. package/dist/components/Button/index.d.ts.map +0 -1
  217. package/dist/components/Checkbox/Checkbox.d.ts +0 -31
  218. package/dist/components/Checkbox/Checkbox.d.ts.map +0 -1
  219. package/dist/components/Checkbox/Checkbox.types.d.ts +0 -53
  220. package/dist/components/Checkbox/Checkbox.types.d.ts.map +0 -1
  221. package/dist/components/DescriptionList/DescriptionList.d.ts +0 -38
  222. package/dist/components/DescriptionList/DescriptionList.d.ts.map +0 -1
  223. package/dist/components/DescriptionList/DescriptionList.types.d.ts +0 -27
  224. package/dist/components/DescriptionList/DescriptionList.types.d.ts.map +0 -1
  225. package/dist/components/Divider/Divider.d.ts +0 -33
  226. package/dist/components/Divider/Divider.d.ts.map +0 -1
  227. package/dist/components/Divider/Divider.types.d.ts +0 -22
  228. package/dist/components/Divider/Divider.types.d.ts.map +0 -1
  229. package/dist/components/Dropdown/Dropdown.d.ts +0 -66
  230. package/dist/components/Dropdown/Dropdown.d.ts.map +0 -1
  231. package/dist/components/Dropdown/Dropdown.types.d.ts +0 -124
  232. package/dist/components/Dropdown/Dropdown.types.d.ts.map +0 -1
  233. package/dist/components/Dropdown/icons.d.ts +0 -10
  234. package/dist/components/Dropdown/icons.d.ts.map +0 -1
  235. package/dist/components/Dropdown/index.d.ts.map +0 -1
  236. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts +0 -101
  237. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.d.ts.map +0 -1
  238. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts +0 -95
  239. package/dist/components/DropdownItemCollapsible/DropdownItemCollapsible.types.d.ts.map +0 -1
  240. package/dist/components/DropdownItemCollapsible/icons.d.ts +0 -19
  241. package/dist/components/DropdownItemCollapsible/icons.d.ts.map +0 -1
  242. package/dist/components/DropdownItemCollapsible/index.d.ts +0 -9
  243. package/dist/components/DropdownItemCollapsible/index.d.ts.map +0 -1
  244. package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts +0 -75
  245. package/dist/components/DropdownItemHeading/DropdownItemHeading.d.ts.map +0 -1
  246. package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts +0 -85
  247. package/dist/components/DropdownItemHeading/DropdownItemHeading.types.d.ts.map +0 -1
  248. package/dist/components/DropdownItemHeading/icons.d.ts +0 -48
  249. package/dist/components/DropdownItemHeading/icons.d.ts.map +0 -1
  250. package/dist/components/DropdownItemHeading/index.d.ts +0 -4
  251. package/dist/components/DropdownItemHeading/index.d.ts.map +0 -1
  252. package/dist/components/Input/Input.d.ts +0 -40
  253. package/dist/components/Input/Input.d.ts.map +0 -1
  254. package/dist/components/Input/Input.types.d.ts +0 -71
  255. package/dist/components/Input/Input.types.d.ts.map +0 -1
  256. package/dist/components/Input/icons.d.ts +0 -15
  257. package/dist/components/Input/icons.d.ts.map +0 -1
  258. package/dist/components/Input/index.d.ts.map +0 -1
  259. package/dist/components/LoginView/LoginView.d.ts +0 -36
  260. package/dist/components/LoginView/LoginView.d.ts.map +0 -1
  261. package/dist/components/LoginView/LoginView.types.d.ts +0 -46
  262. package/dist/components/LoginView/LoginView.types.d.ts.map +0 -1
  263. package/dist/components/LoginView/icons.d.ts +0 -18
  264. package/dist/components/LoginView/icons.d.ts.map +0 -1
  265. package/dist/components/LoginView/index.d.ts.map +0 -1
  266. package/dist/components/Navbar/Navbar.d.ts +0 -63
  267. package/dist/components/Navbar/Navbar.d.ts.map +0 -1
  268. package/dist/components/Navbar/Navbar.types.d.ts +0 -194
  269. package/dist/components/Navbar/Navbar.types.d.ts.map +0 -1
  270. package/dist/components/Navbar/icons.d.ts +0 -12
  271. package/dist/components/Navbar/icons.d.ts.map +0 -1
  272. package/dist/components/Navbar/index.d.ts +0 -4
  273. package/dist/components/Navbar/index.d.ts.map +0 -1
  274. package/dist/components/NavigationBar/NavigationBar.d.ts +0 -75
  275. package/dist/components/NavigationBar/NavigationBar.d.ts.map +0 -1
  276. package/dist/components/NavigationBar/NavigationBar.types.d.ts +0 -63
  277. package/dist/components/NavigationBar/NavigationBar.types.d.ts.map +0 -1
  278. package/dist/components/NavigationBar/index.d.ts.map +0 -1
  279. package/dist/components/NavigationRail/NavigationRail.d.ts +0 -7
  280. package/dist/components/NavigationRail/NavigationRail.d.ts.map +0 -1
  281. package/dist/components/NavigationRail/NavigationRail.types.d.ts +0 -92
  282. package/dist/components/NavigationRail/NavigationRail.types.d.ts.map +0 -1
  283. package/dist/components/NavigationRail/index.d.ts.map +0 -1
  284. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts +0 -90
  285. package/dist/components/NavigationRailItem/NavigationRailItem.d.ts.map +0 -1
  286. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts +0 -155
  287. package/dist/components/NavigationRailItem/NavigationRailItem.types.d.ts.map +0 -1
  288. package/dist/components/NavigationRailItem/index.d.ts +0 -3
  289. package/dist/components/NavigationRailItem/index.d.ts.map +0 -1
  290. package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts +0 -124
  291. package/dist/components/NavigationRailPanel/NavigationRailPanel.d.ts.map +0 -1
  292. package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts +0 -154
  293. package/dist/components/NavigationRailPanel/NavigationRailPanel.types.d.ts.map +0 -1
  294. package/dist/components/NavigationRailPanel/index.d.ts +0 -3
  295. package/dist/components/NavigationRailPanel/index.d.ts.map +0 -1
  296. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts +0 -99
  297. package/dist/components/NavigationRailTypes/NavigationRailTypes.d.ts.map +0 -1
  298. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts +0 -111
  299. package/dist/components/NavigationRailTypes/NavigationRailTypes.types.d.ts.map +0 -1
  300. package/dist/components/NavigationRailTypes/icons.d.ts +0 -58
  301. package/dist/components/NavigationRailTypes/icons.d.ts.map +0 -1
  302. package/dist/components/NavigationRailTypes/index.d.ts +0 -4
  303. package/dist/components/NavigationRailTypes/index.d.ts.map +0 -1
  304. package/dist/components/Notification/Notification.d.ts +0 -52
  305. package/dist/components/Notification/Notification.d.ts.map +0 -1
  306. package/dist/components/Notification/Notification.types.d.ts +0 -138
  307. package/dist/components/Notification/Notification.types.d.ts.map +0 -1
  308. package/dist/components/Notification/index.d.ts.map +0 -1
  309. package/dist/components/POSConvention/POSConvention.d.ts +0 -55
  310. package/dist/components/POSConvention/POSConvention.d.ts.map +0 -1
  311. package/dist/components/POSConvention/POSConvention.types.d.ts.map +0 -1
  312. package/dist/components/POSConvention/icons.d.ts +0 -21
  313. package/dist/components/POSConvention/icons.d.ts.map +0 -1
  314. package/dist/components/POSConvention/index.d.ts.map +0 -1
  315. package/dist/components/POSLocationButton/POSLocationButton.d.ts +0 -73
  316. package/dist/components/POSLocationButton/POSLocationButton.d.ts.map +0 -1
  317. package/dist/components/POSLocationButton/POSLocationButton.types.d.ts +0 -75
  318. package/dist/components/POSLocationButton/POSLocationButton.types.d.ts.map +0 -1
  319. package/dist/components/POSLocationButton/icons.d.ts +0 -37
  320. package/dist/components/POSLocationButton/icons.d.ts.map +0 -1
  321. package/dist/components/POSLocationButton/index.d.ts +0 -4
  322. package/dist/components/POSLocationButton/index.d.ts.map +0 -1
  323. package/dist/components/POSNumberButton/POSNumberButton.d.ts +0 -61
  324. package/dist/components/POSNumberButton/POSNumberButton.d.ts.map +0 -1
  325. package/dist/components/POSNumberButton/POSNumberButton.types.d.ts +0 -43
  326. package/dist/components/POSNumberButton/POSNumberButton.types.d.ts.map +0 -1
  327. package/dist/components/POSNumberButton/index.d.ts.map +0 -1
  328. package/dist/components/POSProductButton/POSProductButton.d.ts +0 -59
  329. package/dist/components/POSProductButton/POSProductButton.d.ts.map +0 -1
  330. package/dist/components/POSProductButton/POSProductButton.types.d.ts +0 -40
  331. package/dist/components/POSProductButton/POSProductButton.types.d.ts.map +0 -1
  332. package/dist/components/POSProductButton/index.d.ts.map +0 -1
  333. package/dist/components/POSProductCard/POSProductCard.d.ts +0 -68
  334. package/dist/components/POSProductCard/POSProductCard.d.ts.map +0 -1
  335. package/dist/components/POSProductCard/POSProductCard.types.d.ts +0 -67
  336. package/dist/components/POSProductCard/POSProductCard.types.d.ts.map +0 -1
  337. package/dist/components/POSProductCard/icons.d.ts +0 -10
  338. package/dist/components/POSProductCard/icons.d.ts.map +0 -1
  339. package/dist/components/POSProductCard/index.d.ts.map +0 -1
  340. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts +0 -57
  341. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.d.ts.map +0 -1
  342. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts +0 -85
  343. package/dist/components/POSProductSidebarItems/POSProductSidebarItems.types.d.ts.map +0 -1
  344. package/dist/components/POSProductSidebarItems/icons.d.ts +0 -9
  345. package/dist/components/POSProductSidebarItems/icons.d.ts.map +0 -1
  346. package/dist/components/POSProductSidebarItems/index.d.ts.map +0 -1
  347. package/dist/components/POSTable/POSTable.d.ts +0 -75
  348. package/dist/components/POSTable/POSTable.d.ts.map +0 -1
  349. package/dist/components/POSTable/POSTable.types.d.ts +0 -71
  350. package/dist/components/POSTable/POSTable.types.d.ts.map +0 -1
  351. package/dist/components/POSTable/index.d.ts +0 -3
  352. package/dist/components/POSTable/index.d.ts.map +0 -1
  353. package/dist/components/Pagination/Pagination.d.ts +0 -29
  354. package/dist/components/Pagination/Pagination.d.ts.map +0 -1
  355. package/dist/components/Pagination/Pagination.types.d.ts +0 -79
  356. package/dist/components/Pagination/Pagination.types.d.ts.map +0 -1
  357. package/dist/components/Pagination/icons.d.ts +0 -18
  358. package/dist/components/Pagination/icons.d.ts.map +0 -1
  359. package/dist/components/Pagination/index.d.ts.map +0 -1
  360. package/dist/components/Quantity/Quantity.d.ts +0 -38
  361. package/dist/components/Quantity/Quantity.d.ts.map +0 -1
  362. package/dist/components/Quantity/Quantity.types.d.ts +0 -59
  363. package/dist/components/Quantity/Quantity.types.d.ts.map +0 -1
  364. package/dist/components/Radio/Radio.d.ts +0 -45
  365. package/dist/components/Radio/Radio.d.ts.map +0 -1
  366. package/dist/components/Radio/Radio.types.d.ts +0 -115
  367. package/dist/components/Radio/Radio.types.d.ts.map +0 -1
  368. package/dist/components/Select/Select.d.ts +0 -37
  369. package/dist/components/Select/Select.d.ts.map +0 -1
  370. package/dist/components/Select/Select.types.d.ts +0 -124
  371. package/dist/components/Select/Select.types.d.ts.map +0 -1
  372. package/dist/components/Select/icons.d.ts +0 -16
  373. package/dist/components/Select/icons.d.ts.map +0 -1
  374. package/dist/components/Select/index.d.ts.map +0 -1
  375. package/dist/components/SignUpView/SignUpView.d.ts +0 -38
  376. package/dist/components/SignUpView/SignUpView.d.ts.map +0 -1
  377. package/dist/components/SignUpView/SignUpView.types.d.ts +0 -51
  378. package/dist/components/SignUpView/SignUpView.types.d.ts.map +0 -1
  379. package/dist/components/SignUpView/icons.d.ts +0 -18
  380. package/dist/components/SignUpView/icons.d.ts.map +0 -1
  381. package/dist/components/SignUpView/index.d.ts.map +0 -1
  382. package/dist/components/Switch/Switch.d.ts +0 -46
  383. package/dist/components/Switch/Switch.d.ts.map +0 -1
  384. package/dist/components/Switch/Switch.types.d.ts +0 -58
  385. package/dist/components/Switch/Switch.types.d.ts.map +0 -1
  386. package/dist/components/Table/Table.d.ts +0 -64
  387. package/dist/components/Table/Table.d.ts.map +0 -1
  388. package/dist/components/Table/Table.types.d.ts +0 -173
  389. package/dist/components/Table/Table.types.d.ts.map +0 -1
  390. package/dist/components/Table/index.d.ts +0 -3
  391. package/dist/components/Table/index.d.ts.map +0 -1
  392. package/dist/components/Tabs/Tabs.d.ts +0 -76
  393. package/dist/components/Tabs/Tabs.d.ts.map +0 -1
  394. package/dist/components/Tabs/Tabs.types.d.ts +0 -107
  395. package/dist/components/Tabs/Tabs.types.d.ts.map +0 -1
  396. package/dist/components/Tabs/icons.d.ts +0 -45
  397. package/dist/components/Tabs/icons.d.ts.map +0 -1
  398. package/dist/components/Tabs/index.d.ts +0 -4
  399. package/dist/components/Tabs/index.d.ts.map +0 -1
  400. package/dist/components/Textarea/Textarea.d.ts +0 -38
  401. package/dist/components/Textarea/Textarea.d.ts.map +0 -1
  402. package/dist/components/Textarea/Textarea.types.d.ts +0 -46
  403. package/dist/components/Textarea/Textarea.types.d.ts.map +0 -1
  404. package/dist/context/ThemeContext.d.ts +0 -46
  405. package/dist/context/ThemeContext.d.ts.map +0 -1
  406. package/dist/context/index.d.ts.map +0 -1
  407. package/dist/index.d.ts +0 -56
  408. package/dist/index.d.ts.map +0 -1
  409. package/dist/siesa-ui-kit.cjs +0 -1260
  410. package/dist/siesa-ui-kit.cjs.map +0 -1
  411. package/dist/siesa-ui-kit.mjs +0 -4496
  412. package/dist/siesa-ui-kit.mjs.map +0 -1
  413. package/dist/views/ListView/ListView.d.ts +0 -47
  414. package/dist/views/ListView/ListView.d.ts.map +0 -1
  415. package/dist/views/ListView/ListView.types.d.ts +0 -177
  416. package/dist/views/ListView/ListView.types.d.ts.map +0 -1
  417. package/dist/views/ListView/icons.d.ts +0 -60
  418. package/dist/views/ListView/icons.d.ts.map +0 -1
  419. package/dist/views/ListView/index.d.ts +0 -3
  420. package/dist/views/ListView/index.d.ts.map +0 -1
  421. package/dist/views/LoginView/LoginView.d.ts +0 -36
  422. package/dist/views/LoginView/LoginView.d.ts.map +0 -1
  423. package/dist/views/LoginView/LoginView.types.d.ts +0 -46
  424. package/dist/views/LoginView/LoginView.types.d.ts.map +0 -1
  425. package/dist/views/LoginView/icons.d.ts +0 -18
  426. package/dist/views/LoginView/icons.d.ts.map +0 -1
  427. package/dist/views/LoginView/index.d.ts +0 -4
  428. package/dist/views/LoginView/index.d.ts.map +0 -1
  429. package/dist/views/ProductsView/ProductsView.d.ts +0 -56
  430. package/dist/views/ProductsView/ProductsView.d.ts.map +0 -1
  431. package/dist/views/ProductsView/ProductsView.types.d.ts +0 -184
  432. package/dist/views/ProductsView/ProductsView.types.d.ts.map +0 -1
  433. package/dist/views/ProductsView/icons.d.ts +0 -12
  434. package/dist/views/ProductsView/icons.d.ts.map +0 -1
  435. package/dist/views/ProductsView/index.d.ts +0 -3
  436. package/dist/views/ProductsView/index.d.ts.map +0 -1
  437. package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts +0 -34
  438. package/dist/views/RecoverPasswordView/RecoverPasswordView.d.ts.map +0 -1
  439. package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts +0 -50
  440. package/dist/views/RecoverPasswordView/RecoverPasswordView.types.d.ts.map +0 -1
  441. package/dist/views/RecoverPasswordView/icons.d.ts +0 -9
  442. package/dist/views/RecoverPasswordView/icons.d.ts.map +0 -1
  443. package/dist/views/RecoverPasswordView/index.d.ts.map +0 -1
  444. package/dist/views/SignUpView/SignUpView.d.ts +0 -38
  445. package/dist/views/SignUpView/SignUpView.d.ts.map +0 -1
  446. package/dist/views/SignUpView/SignUpView.types.d.ts +0 -51
  447. package/dist/views/SignUpView/SignUpView.types.d.ts.map +0 -1
  448. package/dist/views/SignUpView/icons.d.ts +0 -18
  449. package/dist/views/SignUpView/icons.d.ts.map +0 -1
  450. package/dist/views/SignUpView/index.d.ts +0 -4
  451. package/dist/views/SignUpView/index.d.ts.map +0 -1
  452. package/dist/views/TableLayoutView/TableLayoutView.d.ts +0 -46
  453. package/dist/views/TableLayoutView/TableLayoutView.d.ts.map +0 -1
  454. package/dist/views/TableLayoutView/TableLayoutView.types.d.ts +0 -170
  455. package/dist/views/TableLayoutView/TableLayoutView.types.d.ts.map +0 -1
  456. package/dist/views/TableLayoutView/icons.d.ts +0 -27
  457. package/dist/views/TableLayoutView/icons.d.ts.map +0 -1
  458. package/dist/views/TableLayoutView/index.d.ts +0 -3
  459. package/dist/views/TableLayoutView/index.d.ts.map +0 -1
@@ -0,0 +1,688 @@
1
+ import React, { useState } from 'react';
2
+ import type {
3
+ TableProps,
4
+ TableHeaderProps,
5
+ TableCellProps,
6
+ SortDirection,
7
+ PaginationProps,
8
+ } from './Table.types';
9
+
10
+ /**
11
+ * Iconos para sort
12
+ */
13
+ const ChevronUpIcon = () => (
14
+ <svg
15
+ width="16"
16
+ height="16"
17
+ viewBox="0 0 16 16"
18
+ fill="none"
19
+ xmlns="http://www.w3.org/2000/svg"
20
+ className="transition-transform"
21
+ >
22
+ <path
23
+ d="M12 10L8 6L4 10"
24
+ stroke="currentColor"
25
+ strokeWidth="2"
26
+ strokeLinecap="round"
27
+ strokeLinejoin="round"
28
+ />
29
+ </svg>
30
+ );
31
+
32
+ const ChevronDownIcon = () => (
33
+ <svg
34
+ width="16"
35
+ height="16"
36
+ viewBox="0 0 16 16"
37
+ fill="none"
38
+ xmlns="http://www.w3.org/2000/svg"
39
+ className="transition-transform"
40
+ >
41
+ <path
42
+ d="M4 6L8 10L12 6"
43
+ stroke="currentColor"
44
+ strokeWidth="2"
45
+ strokeLinecap="round"
46
+ strokeLinejoin="round"
47
+ />
48
+ </svg>
49
+ );
50
+
51
+ /**
52
+ * Iconos para paginación
53
+ */
54
+ const ArrowLeftIcon = () => (
55
+ <svg
56
+ width="16"
57
+ height="16"
58
+ viewBox="0 0 16 16"
59
+ fill="none"
60
+ xmlns="http://www.w3.org/2000/svg"
61
+ >
62
+ <path
63
+ d="M14 8H2M2 8L6.5 3.5M2 8L6.5 12.5"
64
+ stroke="currentColor"
65
+ strokeWidth="1.5"
66
+ strokeLinecap="round"
67
+ strokeLinejoin="round"
68
+ />
69
+ </svg>
70
+ );
71
+
72
+ const ArrowRightIcon = () => (
73
+ <svg
74
+ width="16"
75
+ height="16"
76
+ viewBox="0 0 16 16"
77
+ fill="none"
78
+ xmlns="http://www.w3.org/2000/svg"
79
+ >
80
+ <path
81
+ d="M2 8H14M14 8L9.5 3.5M14 8L9.5 12.5"
82
+ stroke="currentColor"
83
+ strokeWidth="1.5"
84
+ strokeLinecap="round"
85
+ strokeLinejoin="round"
86
+ />
87
+ </svg>
88
+ );
89
+
90
+ /**
91
+ * TableHeader - Componente para el header de una columna
92
+ */
93
+ const TableHeader = <T,>({
94
+ column,
95
+ sortable,
96
+ sorted,
97
+ sortDirection,
98
+ onSort,
99
+ }: TableHeaderProps<T>) => {
100
+ // Clases base del header
101
+ const baseClasses = `
102
+ flex
103
+ items-center
104
+ gap-3
105
+ px-6
106
+ py-2.5
107
+ min-h-[40px]
108
+ border-b
109
+ border-border-primary
110
+ dark:border-dark-border-primary
111
+ transition-colors
112
+ duration-150
113
+ `;
114
+
115
+ // Clases según sortable
116
+ const sortableClasses = sortable
117
+ ? `
118
+ cursor-pointer
119
+ hover:bg-background-secondary
120
+ dark:hover:bg-dark-bg-primary/50
121
+ select-none
122
+ `
123
+ : '';
124
+
125
+ // Clases de alineación
126
+ const alignClasses = {
127
+ left: 'justify-start',
128
+ center: 'justify-center',
129
+ right: 'justify-end',
130
+ };
131
+
132
+ const combinedClasses = [baseClasses, sortableClasses, alignClasses[column.align || 'left']]
133
+ .join(' ')
134
+ .replace(/\s+/g, ' ')
135
+ .trim();
136
+
137
+ return (
138
+ <div
139
+ className={combinedClasses}
140
+ onClick={sortable ? onSort : undefined}
141
+ role={sortable ? 'button' : undefined}
142
+ tabIndex={sortable ? 0 : undefined}
143
+ onKeyDown={
144
+ sortable
145
+ ? (e) => {
146
+ if (e.key === 'Enter' || e.key === ' ') {
147
+ e.preventDefault();
148
+ onSort();
149
+ }
150
+ }
151
+ : undefined
152
+ }
153
+ style={{ width: column.width }}
154
+ >
155
+ {/* Texto del header */}
156
+ <span
157
+ className="
158
+ text-sm
159
+ font-bold
160
+ text-content-secondary
161
+ dark:text-content-secondary
162
+ overflow-ellipsis
163
+ overflow-hidden
164
+ whitespace-nowrap
165
+ "
166
+ >
167
+ {column.header}
168
+ </span>
169
+
170
+ {/* Iconos de sort */}
171
+ {sortable && (
172
+ <span className="flex-shrink-0 text-content-secondary dark:text-content-secondary">
173
+ {sorted && sortDirection === 'asc' && <ChevronUpIcon />}
174
+ {sorted && sortDirection === 'desc' && <ChevronDownIcon />}
175
+ {!sorted && (
176
+ <div className="w-4 h-4" />
177
+ )}
178
+ </span>
179
+ )}
180
+ </div>
181
+ );
182
+ };
183
+
184
+ /**
185
+ * TableCell - Componente para una celda de datos
186
+ */
187
+ const TableCell: React.FC<TableCellProps & { isStriped?: boolean; rowIndex?: number }> = ({
188
+ children,
189
+ align = 'left',
190
+ width,
191
+ isStriped = false,
192
+ rowIndex = 0,
193
+ }) => {
194
+ // Clases de alineación
195
+ const alignClasses = {
196
+ left: 'justify-start text-left',
197
+ center: 'justify-center text-center',
198
+ right: 'justify-end text-right',
199
+ };
200
+
201
+ // Fondo zebra striping (filas pares tienen fondo)
202
+ const stripedBg = isStriped && rowIndex % 2 === 1
203
+ ? 'bg-background-secondary dark:bg-dark-bg-primary/30'
204
+ : '';
205
+
206
+ return (
207
+ <div
208
+ className={`
209
+ flex
210
+ flex-col
211
+ ${alignClasses[align]}
212
+ px-6
213
+ py-4
214
+ min-h-[56px]
215
+ border-b
216
+ border-border-secondary
217
+ dark:border-dark-border-primary
218
+ ${stripedBg}
219
+ `}
220
+ style={{ width }}
221
+ >
222
+ <span
223
+ className="
224
+ text-sm
225
+ text-content-primary
226
+ dark:text-dark-content-primary
227
+ overflow-ellipsis
228
+ overflow-hidden
229
+ w-full
230
+ "
231
+ >
232
+ {children}
233
+ </span>
234
+ </div>
235
+ );
236
+ };
237
+
238
+
239
+ /**
240
+ * Pagination - Componente de paginación
241
+ */
242
+ const Pagination: React.FC<PaginationProps> = ({
243
+ currentPage,
244
+ totalPages,
245
+ onPageChange,
246
+ previousLabel = 'Anterior',
247
+ nextLabel = 'Siguiente',
248
+ }) => {
249
+ // Generar array de números de página para mostrar
250
+ const getPageNumbers = () => {
251
+ const pages: (number | string)[] = [];
252
+ const maxVisible = 7; // Máximo de botones visibles
253
+
254
+ if (totalPages <= maxVisible) {
255
+ // Si hay pocas páginas, mostrar todas
256
+ for (let i = 1; i <= totalPages; i++) {
257
+ pages.push(i);
258
+ }
259
+ } else {
260
+ // Lógica para mostrar: 1 2 3 ... 65 66
261
+ pages.push(1);
262
+
263
+ if (currentPage <= 3) {
264
+ pages.push(2, 3);
265
+ } else if (currentPage >= totalPages - 2) {
266
+ pages.push('...');
267
+ pages.push(totalPages - 2, totalPages - 1);
268
+ } else {
269
+ pages.push('...');
270
+ pages.push(currentPage);
271
+ pages.push('...');
272
+ }
273
+
274
+ if (totalPages > 1) {
275
+ pages.push(totalPages);
276
+ }
277
+ }
278
+
279
+ return pages;
280
+ };
281
+
282
+ const pageNumbers = getPageNumbers();
283
+
284
+ return (
285
+ <div className="flex items-center justify-between w-full h-9">
286
+ {/* Botón Anterior */}
287
+ <button
288
+ onClick={() => currentPage > 1 && onPageChange(currentPage - 1)}
289
+ disabled={currentPage === 1}
290
+ className="
291
+ flex
292
+ items-center
293
+ gap-3
294
+ px-3
295
+ py-2
296
+ rounded-md
297
+ text-sm
298
+ font-bold
299
+ text-primary-custom-600
300
+ dark:text-primary-custom-600
301
+ hover:bg-blue-50
302
+ dark:hover:bg-blue-900/20
303
+ disabled:opacity-50
304
+ disabled:cursor-not-allowed
305
+ transition-colors
306
+ duration-150
307
+ "
308
+ >
309
+ <ArrowLeftIcon />
310
+ <span>{previousLabel}</span>
311
+ </button>
312
+
313
+ {/* Números de página */}
314
+ <div className="flex items-center gap-0">
315
+ {pageNumbers.map((page, index) => {
316
+ if (page === '...') {
317
+ return (
318
+ <div
319
+ key={`ellipsis-${index}`}
320
+ className="
321
+ flex
322
+ items-center
323
+ justify-center
324
+ px-3
325
+ py-2
326
+ text-sm
327
+ font-bold
328
+ text-primary-custom-600
329
+ dark:text-primary-custom-600
330
+ "
331
+ >
332
+ {page}
333
+ </div>
334
+ );
335
+ }
336
+
337
+ const isActive = page === currentPage;
338
+
339
+ return (
340
+ <button
341
+ key={page}
342
+ onClick={() => onPageChange(page as number)}
343
+ className={`
344
+ flex
345
+ items-center
346
+ justify-center
347
+ px-3
348
+ py-2
349
+ rounded-md
350
+ text-sm
351
+ font-bold
352
+ text-primary-custom-600
353
+ dark:text-primary-custom-600
354
+ transition-colors
355
+ duration-150
356
+ ${
357
+ isActive
358
+ ? 'bg-blue-100 dark:bg-blue-900/30'
359
+ : 'hover:bg-blue-50 dark:hover:bg-blue-900/20'
360
+ }
361
+ `}
362
+ >
363
+ {page}
364
+ </button>
365
+ );
366
+ })}
367
+ </div>
368
+
369
+ {/* Botón Siguiente */}
370
+ <button
371
+ onClick={() => currentPage < totalPages && onPageChange(currentPage + 1)}
372
+ disabled={currentPage === totalPages}
373
+ className="
374
+ flex
375
+ items-center
376
+ gap-3
377
+ px-3
378
+ py-2
379
+ rounded-md
380
+ text-sm
381
+ font-bold
382
+ text-primary-custom-600
383
+ dark:text-primary-custom-600
384
+ hover:bg-blue-50
385
+ dark:hover:bg-blue-900/20
386
+ disabled:opacity-50
387
+ disabled:cursor-not-allowed
388
+ transition-colors
389
+ duration-150
390
+ "
391
+ >
392
+ <span>{nextLabel}</span>
393
+ <ArrowRightIcon />
394
+ </button>
395
+ </div>
396
+ );
397
+ };
398
+
399
+ /**
400
+ * Table - Componente principal de tabla
401
+ *
402
+ * Características implementadas:
403
+ * - Definición de columnas flexible con accessor y render custom
404
+ * - Sorting en columnas (controlado o no controlado)
405
+ * - Variantes: basic, fullWidth, striped, grid
406
+ * - Dark mode completo en todos los estados
407
+ * - Estados de loading y empty
408
+ * - Filas clickeables
409
+ * - Accesibilidad con roles y keyboard navigation
410
+ *
411
+ * Mejores prácticas implementadas:
412
+ * - Orden de modificadores: {responsive}:{dark}:{state}:{utility}
413
+ * - Dark mode con estrategia 'class' (darkMode: 'class')
414
+ * - Tokens de color consistentes con la documentación
415
+ * - Type safety con TypeScript estricto y generics
416
+ * - Accesibilidad con ARIA labels y keyboard support
417
+ *
418
+ * @see docs/colors.md - Sistema de colores
419
+ * @see docs/typography.md - Sistema tipográfico (Label/Small para headers, Paragraph/Small para cells)
420
+ * @see docs/spacing.md - Sistema de espaciado
421
+ * @see docs/shadows.md - Sistema de sombras
422
+ *
423
+ * @example
424
+ * ```tsx
425
+ * // Uso básico
426
+ * <Table
427
+ * title="Usuarios"
428
+ * columns={[
429
+ * { header: 'Nombre', accessor: 'name' },
430
+ * { header: 'Email', accessor: 'email' },
431
+ * { header: 'Rol', accessor: 'role', sortable: true },
432
+ * ]}
433
+ * data={users}
434
+ * />
435
+ *
436
+ * // Con render custom
437
+ * <Table
438
+ * columns={[
439
+ * {
440
+ * header: 'Estado',
441
+ * accessor: 'status',
442
+ * render: (value) => (
443
+ * <Badge color={value === 'active' ? 'green' : 'red'}>
444
+ * {value}
445
+ * </Badge>
446
+ * ),
447
+ * },
448
+ * ]}
449
+ * data={data}
450
+ * />
451
+ *
452
+ * // Variante striped
453
+ * <Table
454
+ * variant="striped"
455
+ * columns={columns}
456
+ * data={data}
457
+ * />
458
+ * ```
459
+ */
460
+ export const Table = <T extends Record<string, any>>({
461
+ title,
462
+ columns,
463
+ data,
464
+ variant = 'basic',
465
+ showBorder = true,
466
+ showShadow = true,
467
+ // onRowClick, // TODO: Implement row click functionality
468
+ onSort,
469
+ sortColumn: externalSortColumn,
470
+ sortDirection: externalSortDirection,
471
+ fullWidth = false,
472
+ emptyMessage = 'No hay datos disponibles',
473
+ loading = false,
474
+ loadingRows = 5,
475
+ pagination,
476
+ className = '',
477
+ id,
478
+ }: TableProps<T>) => {
479
+ // ===== ESTADO INTERNO DE SORT =====
480
+ const [internalSortColumn, setInternalSortColumn] = useState<keyof T | string | null>(null);
481
+ const [internalSortDirection, setInternalSortDirection] = useState<SortDirection>(null);
482
+
483
+ // Usar sort externo si está controlado, sino usar interno
484
+ const sortColumn = externalSortColumn !== undefined ? externalSortColumn : internalSortColumn;
485
+ const sortDirection = externalSortDirection !== undefined ? externalSortDirection : internalSortDirection;
486
+
487
+ // ===== MANEJAR SORT =====
488
+ const handleSort = (columnAccessor: keyof T | string) => {
489
+ let newDirection: SortDirection = 'asc';
490
+
491
+ // Si ya está ordenado por esta columna, cambiar dirección
492
+ if (sortColumn === columnAccessor) {
493
+ if (sortDirection === 'asc') {
494
+ newDirection = 'desc';
495
+ } else if (sortDirection === 'desc') {
496
+ newDirection = null;
497
+ }
498
+ }
499
+
500
+ // Si sort es controlado, llamar callback
501
+ if (onSort) {
502
+ onSort(columnAccessor, newDirection);
503
+ } else {
504
+ // Sino, actualizar estado interno
505
+ setInternalSortColumn(newDirection ? columnAccessor : null);
506
+ setInternalSortDirection(newDirection);
507
+ }
508
+ };
509
+
510
+ // ===== OBTENER VALOR DE CELDA =====
511
+ const getCellValue = (row: T, accessor: keyof T | ((row: T) => any)) => {
512
+ if (typeof accessor === 'function') {
513
+ return accessor(row);
514
+ }
515
+ return row[accessor];
516
+ };
517
+
518
+ // ===== CLASES DEL CONTAINER =====
519
+ const containerBaseClasses = `
520
+ flex
521
+ flex-col
522
+ gap-4
523
+ bg-white
524
+ dark:bg-dark-bg-primary
525
+ rounded-xl
526
+ transition-all
527
+ duration-150
528
+ `;
529
+
530
+ const containerBorderClasses = showBorder
531
+ ? 'border border-border-primary dark:border-dark-border-primary'
532
+ : '';
533
+
534
+ const containerShadowClasses = showShadow ? 'shadow-base' : '';
535
+
536
+ const containerPaddingClasses = 'p-8';
537
+
538
+ const containerWidthClasses = fullWidth || variant === 'fullWidth' ? 'w-full' : '';
539
+
540
+ const containerClasses = [
541
+ containerBaseClasses,
542
+ containerBorderClasses,
543
+ containerShadowClasses,
544
+ containerPaddingClasses,
545
+ containerWidthClasses,
546
+ className,
547
+ ]
548
+ .join(' ')
549
+ .replace(/\s+/g, ' ')
550
+ .trim();
551
+
552
+ // ===== CLASES DE LA TABLA =====
553
+ const tableGridClasses = variant === 'grid'
554
+ ? `
555
+ border
556
+ border-border-primary
557
+ dark:border-dark-border-primary
558
+ rounded-lg
559
+ overflow-hidden
560
+ `
561
+ : '';
562
+
563
+ // ===== RENDER =====
564
+ return (
565
+ <div className={containerClasses} id={id}>
566
+ {/* Título opcional */}
567
+ {title && (
568
+ <div className="flex items-center justify-center w-full">
569
+ <h3
570
+ className="
571
+ text-base
572
+ font-bold
573
+ text-content-primary
574
+ dark:text-dark-content-primary
575
+ overflow-ellipsis
576
+ overflow-hidden
577
+ whitespace-nowrap
578
+ "
579
+ >
580
+ {title}
581
+ </h3>
582
+ </div>
583
+ )}
584
+
585
+ {/* Tabla */}
586
+ <div className={`flex w-full overflow-x-auto ${tableGridClasses}`}>
587
+ {/* Columnas */}
588
+ {columns.map((column, colIndex) => {
589
+ const accessor = typeof column.accessor === 'function'
590
+ ? `column_${colIndex}`
591
+ : String(column.accessor);
592
+
593
+ return (
594
+ <div key={accessor} className="flex flex-col flex-1 min-w-0">
595
+ {/* Header de la columna */}
596
+ <TableHeader
597
+ column={column}
598
+ sortable={column.sortable || false}
599
+ sorted={sortColumn === accessor}
600
+ sortDirection={sortColumn === accessor ? sortDirection : null}
601
+ onSort={() => handleSort(accessor)}
602
+ />
603
+
604
+ {/* Loading skeleton */}
605
+ {loading && (
606
+ <>
607
+ {Array.from({ length: loadingRows }).map((_, rowIndex) => (
608
+ <TableCell
609
+ key={`loading-${rowIndex}`}
610
+ align={column.align}
611
+ width={column.width}
612
+ isStriped={variant === 'striped'}
613
+ rowIndex={rowIndex}
614
+ >
615
+ <div
616
+ className="
617
+ h-4
618
+ bg-background-secondary
619
+ dark:bg-dark-border-primary
620
+ rounded
621
+ animate-pulse
622
+ "
623
+ />
624
+ </TableCell>
625
+ ))}
626
+ </>
627
+ )}
628
+
629
+ {/* Datos reales */}
630
+ {!loading && data.length > 0 && (
631
+ <>
632
+ {data.map((row, rowIndex) => {
633
+ const value = getCellValue(row, column.accessor);
634
+ const content = column.render
635
+ ? column.render(value, row, rowIndex)
636
+ : value;
637
+
638
+ return (
639
+ <TableCell
640
+ key={rowIndex}
641
+ align={column.align}
642
+ width={column.width}
643
+ isStriped={variant === 'striped'}
644
+ rowIndex={rowIndex}
645
+ >
646
+ {content}
647
+ </TableCell>
648
+ );
649
+ })}
650
+ </>
651
+ )}
652
+
653
+ {/* Estado empty */}
654
+ {!loading && data.length === 0 && colIndex === 0 && (
655
+ <div
656
+ className="
657
+ flex
658
+ items-center
659
+ justify-center
660
+ px-6
661
+ py-12
662
+ text-sm
663
+ text-content-secondary
664
+ dark:text-content-secondary
665
+ "
666
+ style={{ gridColumn: `1 / ${columns.length + 1}` }}
667
+ >
668
+ {emptyMessage}
669
+ </div>
670
+ )}
671
+ </div>
672
+ );
673
+ })}
674
+ </div>
675
+
676
+ {/* Paginación */}
677
+ {pagination && (
678
+ <Pagination
679
+ currentPage={pagination.currentPage}
680
+ totalPages={pagination.totalPages}
681
+ onPageChange={pagination.onPageChange}
682
+ previousLabel={pagination.previousLabel}
683
+ nextLabel={pagination.nextLabel}
684
+ />
685
+ )}
686
+ </div>
687
+ );
688
+ };